1 //=============================================================================
4 // contains all the magic math
6 //=============================================================================
9 //== INCLUDES =================================================================
11 #include "calculator.h"
14 //== IMPLEMENTATION ===========================================================
17 Calculator::Calculator(QuPlot
*parent
) :
25 Calculator::~Calculator()
30 //-----------------------------------------------------------------------------
31 void Calculator::derive_init()
33 file_rk_bif
= "../rk_bifurcate.dat";
34 file_rk_avg
= "../rk_bif_avg_velo.dat";
35 file_rk_out
= "../rk_out.dat";
36 file_rk_pt1
= "../rk_point1.dat";
37 file_rk_pt2
= "../rk_point2.dat";
38 file_rk_biv
= "../rk_bif_velo.dat";
40 file_eu_bif
= "../eu_bifurcate.dat";
41 file_eu_avg
= "../eu_bif_avg_velo.dat";
42 file_eu_out
= "../eu_out.dat";
43 file_eu_pt1
= "../eu_point1.dat";
44 file_eu_pt2
= "../eu_point2.dat";
45 file_eu_biv
= "../eu_bif_velo.dat";
47 file_rk_conv
= "../rk_conv.dat";
48 file_eu_conv
= "../eu_conv.dat";
50 file_rk_variance
= "../rk_variance.dat";
51 file_rk_distance
= "../rk_msd.dat";
52 file_rk_defangle
= "../rk_defangle.dat";
54 file_rk_dualbif
= "../rk_dualbif.dat";
56 v
= c
->valuesMap
.value(1);
60 void Calculator::derivs(const Doub x
, VecDoub_I
&y
, VecDoub_O
&dydx
,
61 const Doub params
[], Normaldev
&gauss
)
82 //static Doub G, xi, xi1, xi2, c, s, st, ax, ay, e0, e1, e2, e3, eta, l1, l2;
83 static Doub xi
, G
, s
, c
, st
, ax
, ay
, cp
, sp
, m1
, m2
, p1
, p2
;
84 static Doub x1
, y1
, x2
, y2
, F1x
, F1y
, F2x
, F2y
, stx
, sty
, xix1
, xix2
, xiy1
, xiy2
;
85 //for (Int i = 0;i<10;i++)
86 // qDebug() << "params["<<i<<"] :" << params[i];
91 G
= sqrt(2.0*params
[5]*params
[9])*xi
;
93 dydx
[1] = -params
[5]*y
[1]-sin(y
[0])+params
[1]*sin(params
[4]*x
)+params
[2]+G
;
97 dydx
[1] = -params
[5]*y
[1]-y
[0];
111 eta = params[5]+params[6];
113 e1 = 1.0/(params[5]*params[3]);
114 e2 = 1.0/(params[6]*params[3]);
115 e3 = 1.0/params[3]*((1.0/params[5])-(1.0/params[6]));
117 l1 = params[3]*e0*params[5];
118 l2 = params[3]*e0*params[6];
122 //qDebug() << eta << "=" << params[5] << "+" << params[6];
123 //qDebug() << e0 << "=" << "1.0/"<< eta;
124 //qDebug() << e1 << "=" << "1.0/"<<params[5]<<"*"<<params[3];
125 //qDebug() << e2 << "=" << "1.0/"<<params[6]<<"*"<<params[3];
126 //qDebug() << e3 << "=" << "1.0/"<<params[5]<<"-"<<"1.0/"<<params[6];
128 //G = sqrt(2.0*eta*params[9]);
134 x1
= y
[0] + params
[7]*c
;
135 y1
= y
[1] + params
[7]*s
;
136 x2
= y
[0] - params
[8]*c
;
137 y2
= y
[1] - params
[8]*s
;
139 st
= sin(params
[4]*x
);
141 //qDebug() << st << "=" << "sin("<<params[4]<<"*"<<x<<")";
143 ax
= cos(params
[1])*params
[0]*st
;
144 ay
= sin(params
[1])*params
[0]*st
;
146 //fx = cos(params[10])*params[2];
147 //fy = sin(params[10])*params[2];
152 //qDebug() << "ax =" << ax << "=" << params[0] << "*" << "cos("<<params[1]<<")";
153 //qDebug() << "ay =" << ay << "=" << params[0] << "*" << "sin("<<params[1]<<")";
154 //qDebug() << "fx =" << fx << "=" << "cos("<<params[10]<<")*"<<params[2];
155 //qDebug() << "fy =" << fy << "=" << "sin("<<params[10]<<")*"<<params[2];
156 //qDebug() << "stx =" << stx <<"="<< ax << "*" << st << "+"<< fx;
157 //qDebug() << "sty =" << sty <<"="<< ay << "*" << st << "+" << fy;
161 //qDebug() << y[0] + params[7]*c << "=" << y[0] << "+" << params[7] << "*" << c;
162 //qDebug() << y[1] + params[7]*c << "=" << y[1] << "+" << params[7] << "*" << s;
163 //qDebug() << y[0] - params[8]*c << "=" << y[0] << "-" << params[8] << "*" << c;
164 //qDebug() << y[1] - params[8]*c << "=" << y[1] << "-" << params[8] << "*" << s;
166 cp
= cos(params
[17]);
167 sp
= sin(params
[17]);
174 F1x
= params
[18]*(sin(m1
)*cos(p1
)*cp
+cos(m1
)*sin(p1
)*sp
+sin(m1
)*cp
+sin(p1
)*sp
);//+1.6*sin(x1)+1.0*cos(y1);
175 F1y
= params
[18]*(-sin(m1
)*cos(p1
)*sp
+cos(m1
)*sin(p1
)*cp
-sin(m1
)*sp
+sin(p1
)*cp
);//+1.6*cos(x1)+1.0*sin(y1);
176 F2x
= params
[18]*(sin(m2
)*cos(p2
)*cp
+cos(m2
)*sin(p2
)*sp
+sin(m2
)*cp
+sin(p2
)*sp
);//+1.6*sin(x2)+1.0*cos(y2);
177 F2y
= params
[18]*(-sin(m2
)*cos(p2
)*sp
+cos(m2
)*sin(p2
)*cp
-sin(m2
)*sp
+sin(p2
)*cp
);//+1.6*cos(x2)+1.0*sin(y2);
179 dydx
[0] = (F1x
+F2x
+2.0*stx
+sqrt(2*params
[9])*(xix1
+xix2
))*params
[11];
180 dydx
[1] = (F1y
+F2y
+2.0*sty
+sqrt(2*params
[9])*(xiy1
+xiy2
))*params
[11];
181 dydx
[2] = params
[12]*(c
*F1y
-s
*F1x
)-params
[13]*(c
*F2y
-s
*F2x
)+params
[14]*(c
*sty
-s
*stx
)+sqrt(2*params
[9])*(params
[12]*(-s
*xix1
+c
*xiy1
)-params
[13]*(-s
*xix2
+c
*xiy2
));
187 eta = params[5]+params[6];
188 l1 = params[3]*params[5]/eta;
189 l2 = params[3]*params[6]/eta;
192 F1x = sin(x1)*cos(y1);//+1.6*sin(x1)+1.0*cos(y1);
193 F1y = cos(x1)*sin(y1);//+1.6*cos(x1)+1.0*sin(y1);
194 F2x = sin(x2)*cos(y2);//+1.6*sin(x2)+1.0*cos(y1);
195 F2y = cos(x2)*sin(y2);//+1.6*cos(x2)+1.0*sin(y2);
197 dydx[0] = (F1x+F2x+2.0*(params[0]*cos(params[1])*sin(params[4]*x)+params[10]*params[2])/eta;
198 dydx[1] = (F1y+F2y+2.0*(params[0]*sin(params[1])*sin(params[4]*x)+params[10]*params[2])/eta;
199 dydx[2] = (-s*F1x+c*F1y)/(params[5]*params[3]) - (-s*F2x+c*F2y)/(params[6]*params[3])
200 + (1.0/params[5] - 1.0/params[6])*params[0]*( (-s*cos(params[1])+c*sin(params[1])+sin(params[4]*x))+(- );
207 //-----------------------------------------------------------------------------
210 void Calculator::rk4(VecDoub_I
&y
, VecDoub_I
&dydx
, const Doub x
, const Doub h
,
211 VecDoub_O
&yout
, const Doub params
[], Normaldev
&gauss
)
214 VecDoub
dym(n
),dyt(n
),yt(n
);
218 for (Int i
=0;i
<n
;i
++) yt
[i
] = y
[i
]+hh
*dydx
[i
];
219 derivs(xh
,yt
,dyt
,params
,gauss
);
220 for (Int i
=0;i
<n
;i
++) yt
[i
] = y
[i
]+hh
*dyt
[i
];
221 derivs(xh
,yt
,dym
,params
,gauss
);
222 for (Int i
=0;i
<n
;i
++) {
223 yt
[i
] = y
[i
]+h
*dym
[i
];
226 derivs(x
+h
,yt
,dyt
,params
,gauss
);
227 for (Int i
=0;i
<n
;i
++) {
228 yout
[i
] = y
[i
]+h6
*(dydx
[i
]+dyt
[i
]+2.0*dym
[i
]);
233 void Calculator::euler(VecDoub_I
&y
, VecDoub_I
&dydx
, const Doub x
,
234 const Doub h
, VecDoub_O
&yout
)
237 for (Int i
=0;i
<n
;i
++) {
238 yout
[i
] = y
[i
]+h
*dydx
[i
];
241 //-----------------------------------------------------------------------------
245 * returns a random number between 0 and 2*pi
247 double Calculator::randpi(Ran
&r
)
249 Doub s
= 2.0*M_PI
*r
.doub();
253 //-----------------------------------------------------------------------------
256 * Writes the of two maps into a tab-separated file
257 * The second map *must* be specified.
259 void Calculator::write_to_file(const QString
& name
,
260 const QMap
<double, double> & map_x
,
261 const QMap
<double, double> & map_y
,
262 const QMap
<double, double> & map_phi
,
265 qDebug() << "writing to file" << name
;
269 QTextStream
out(&file
);
270 file
.open(QIODevice::WriteOnly
);
272 for (Int i
=0;i
<10;i
++)
273 out
<< "params["<<i
<<"] = " << params
[i
] << " ";
275 out
<< "r\tx\ty\tphi" << endl
;
276 QMapIterator
<double,double> x(map_x
);
277 QMapIterator
<double,double> y(map_y
);
278 QMapIterator
<double,double> phi(map_phi
);
281 while (x
.hasNext()) {
283 out
<< x
.key() << "\t" << x
.value() << endl
;
287 if (map_x
.size() > 0 && map_y
.size() == 0 && map_phi
.size() == 0) {
288 while (x
.hasNext()) {
290 out
<< x
.key() << "\t" << x
.value() << endl
;
293 else if (map_x
.size() > 0 && map_y
.size() > 0 && map_phi
.size() > 0) {
294 while (x
.hasNext() && y
.hasNext() && phi
.hasNext()) {
298 out
<< x
.key() << "\t" << x
.value() << "\t" << y
.value() << "\t" << phi
.value() << endl
;
304 qDebug () << "done.";
308 //-----------------------------------------------------------------------------
311 Doub
Calculator::mean(VecDoub_I
&msd
, const Int
& samples
)
314 VecDoub
var(samples
,0.0);
317 for(Int i
=0;i
<samples
;i
++) {
322 for(Int i
=0;i
<samples
;i
++) {
323 var
[i
] = SQR(msd
[i
])-SQR(mu
);
327 for(Int j
=0;j
<samples
;j
++) {
338 * This function is kinda redundant right now, but will be needed later
340 void Calculator::gen_gnuplot(const QString
& name
)
343 qDebug() << "generating gnuplot file";
346 QTextStream
out(&file
);
347 file
.open(QIODevice::WriteOnly
);
351 out
<< "set lmargin 10;";
352 out
<< "set rmargin 3;";
353 out
<< "set multiplot;";
354 out
<< "set tmargin = 3;";
355 out
<< "set bmargin = 0;";
356 out
<< "set border 2+4+8;";
357 out
<< "set size 1,0.66667;";
358 out
<< "set origin 0.0,0.33333;";
360 out
<< "set format x \"\";";
361 out
<< "unset xlabel;";
362 out
<< "set ylabel \"x(kT) mod L \";";
363 out
<< "set ytics (\"0\" 0, \"L/2\", \"L\" L);";
364 out
<< "set yrange [0:L];";
365 out
<< "plot \""<<file_rk_bif
<<"\" w dots 1;";
366 out
<< "unset title;";
367 out
<< "set tmargin 0;";
368 out
<< "set bmargin 3;";
369 out
<< "unset format;";
370 out
<< "set size 1,0.33333;";
371 out
<< "set border 1+2+4+8;";
372 out
<< "set origin 0.0,0.0;";
373 out
<< "set xtics 0,0.1;";
374 out
<< "set xlabel \"a\";";
375 out
<< "set ylabel \"v\";";
376 out
<< "set yrange [-0.75:0.75];";
377 out
<< "set ytics -0.5,0.5;";
378 out
<< "plot \""<<file_rk_avg
<<"\" w dots 3;";
379 out
<< "unset multiplot;";
383 void Calculator::filter(QMap
<double, double> & map
, const Doub
& eps
)
385 qDebug() << "filter crap smaller than " << eps
;
388 QList
<double> values
, list
;
389 list
= map
.uniqueKeys();
392 //qDebug() << "size of map:" << size;
393 for(Int i
= 0; i
< size
; i
++) {
395 //qDebug() << "["<<key<<"]" << "writing values into list";
396 values
= map
.values(key
);
397 //qDebug() << "["<<key<<"]" << values.size() << "values for" << key;
399 for(Int k
=0;k
<values
.size()-1;k
++) {
400 diff
= abs(values
.at(k
+1) - values
.at(k
));
401 //qDebug() << values.at(k+1) <<"-"<< values.at(k) << "=" << diff;
403 //qDebug() << diff << "<=" << eps;
404 //qDebug() << "["<<k<<"]" << "removing" << values.at(k) << "from list";
405 values
.replace(k
+1,values
.at(k
));
408 for (int j
= 0; j
< values
.size(); j
++)
409 //qDebug() << "["<<j<<"]" << values.at(j);
410 //qDebug() << "removing" << key << "from map";
412 for (int j
= 0; j
< values
.size(); j
++) {
413 //qDebug() << "inserting" << values.at(j) << "into map at" << key;
414 map
.insertMulti(key
,values
.at(j
));
416 //qDebug() << map.values(key);
417 //qDebug() << endl << "end while" << endl;
421 void Calculator::IC_setup(VecDoub
&y
, Doub x0
, Doub y0
, Doub xdot0
, Doub ydot0
,
422 Doub phi0
, Doub params
[])
425 const Int sys
= c
->valuesMap
.value(1);
428 qDebug() << "using " << "\tx0 = " << x0 << "\ty0 = " << y0
429 << "\txdot0 = " << xdot0 << "\tydot0 = " << ydot0
430 << "\tphi0 = " << fmod(phi0,360) << endl;
435 params
[0] = c
->valuesMap
.value(2); // a;
436 params
[1] = c
->valuesMap
.value(3); // A;
437 params
[2] = c
->valuesMap
.value(4); // F;
438 params
[3] = c
->valuesMap
.value(5); // l;
439 params
[4] = c
->valuesMap
.value(6); // w;
440 params
[5] = c
->valuesMap
.value(25); // eta1;
442 params
[9] = c
->valuesMap
.value(32); // T;
444 y
[0] = x0
, y
[1] = xdot0
;
447 params
[0] = c
->valuesMap
.value(2); // a;
448 params
[1] = fmod(c
->valuesMap
.value(3),360)*PI
/180; // alpha;
449 params
[2] = c
->valuesMap
.value(4); // F;
450 params
[3] = c
->valuesMap
.value(5); // l;
451 params
[4] = c
->valuesMap
.value(6); // w;
452 params
[5] = c
->valuesMap
.value(25); // eta1;
453 params
[6] = c
->valuesMap
.value(26); // eta2;
454 params
[9] = c
->valuesMap
.value(32); // T;
455 params
[10] = fmod(c
->valuesMap
.value(40),360)*PI
/180; // theta;
456 params
[17] = fmod(c
->valuesMap
.value(41),360)*PI
/180; // psi;
457 params
[18] = c
->valuesMap
.value(42); // U;
458 Doub e0
= 1.0/(params
[5]+params
[6]);
459 Doub e1
= 1.0/(params
[5]*params
[3]);
460 Doub e2
= 1.0/(params
[6]*params
[3]);
461 Doub e3
= 1.0/params
[3]*((1.0/params
[5])-(1.0/params
[6]));
462 Doub fx
= cos(params
[10])*params
[2];
463 Doub fy
= sin(params
[10])*params
[2];
464 params
[11] = e0
; // 1/eta
470 params
[7] = params
[3]*params
[11]*params
[5]; // l1;
471 params
[8] = params
[3]*params
[11]*params
[6]; // l2;
472 y
[0] = x0
, y
[1] = y0
, y
[2] = phi0
;
476 for (Int i = 0; i<n;i++)
477 qDebug() << "y("<<i<<") =" << y[i];
478 qDebug() << "eta1 = " << eta1 << "\teta2 = " << eta2 << "\tA = " << A << "\tF = " << F;
482 void Calculator::bifparam(const int &v
, const QString
¶m
, const Doub
&r
,
489 else if (param
== "F")
491 else if (param
== "A")
494 throw ("Fatal error!");
498 params
[1] = fmod(r
,360)*PI
/180;
499 else if (param
== "F") {
501 params
[15] = cos(params
[10])*params
[2];
502 params
[16] = sin(params
[10])*params
[2];
504 else if (param
== "a")
506 else if (param
== "w")
508 else if (param
== "l") {
510 params
[11] = 1.0/(params
[5]+params
[6]);
511 params
[12] = 1.0/(params
[5]*params
[3]);
512 params
[13] = 1.0/(params
[6]*params
[3]);
513 params
[14] = 1.0/params
[3]*((1.0/params
[5])-(1.0/params
[6]));
514 params
[7] = params
[3]*params
[11]*params
[5]; // l1;
515 params
[8] = params
[3]*params
[11]*params
[6]; // l2;
517 else if (param
== "e") {
519 params
[11] = 1.0/(params
[5]+params
[6]);
520 params
[12] = 1.0/(params
[5]*params
[3]);
521 params
[13] = 1.0/(params
[6]*params
[3]);
522 params
[14] = 1.0/params
[3]*((1.0/params
[5])-(1.0/params
[6]));
523 params
[7] = params
[3]*params
[11]*params
[5]; // l1;
524 params
[8] = params
[3]*params
[11]*params
[6]; // l2;
526 else if (param
== "t")
527 params
[10] = fmod(r
,360)*PI
/180;
529 throw("Fatal error!");
531 qDebug() << "Bifurcation parameter is " << param
;
535 void Calculator::set_color(const Doub vel
, QString
& color
)
538 if (vel
> 1.0-ctol
&& vel
< 1.0+ctol
)
540 else if (vel
> 0.5-ctol
&& vel
< 0.5+ctol
)
542 else if (vel
> 0.0-ctol
&& vel
< 0.0+ctol
)
544 else if (vel
> -0.5-ctol
&& vel
< -0.5+ctol
)
546 else if (vel
> -1.0-ctol
&& vel
< -1.0+ctol
)
548 else color
= "black";
551 void Calculator::calc2(const Int n
)
553 // setting up a few start values
554 qDebug() << "calc2 has been called: " << "calc2("<<n
<<")";
555 Normaldev
gauss(0,1,time(NULL
));
557 Doub x1
,x2
,y1
,y2
,xtest
;
559 Doub x0
, xdot0
, y0
, ydot0
, phi0
;
560 x0
= c
->valuesMap
.value(8);
561 xdot0
= c
->valuesMap
.value(10);
562 ydot0
= c
->valuesMap
.value(24);
563 y0
= c
->valuesMap
.value(23);
564 phi0
= c
->valuesMap
.value(27);
565 const Int samples
= c
->valuesMap
.value(35);
566 const Int v
= c
->valuesMap
.value(1);
567 const Int M
= c
->valuesMap
.value(11);
568 const Doub fromt
= c
->valuesMap
.value(22);
569 const Int s
= c
->valuesMap
.value(14);
570 const Doub h
= c
->valuesMap
.value(13);
571 const Doub t0
= c
->valuesMap
.value(7);
572 const Doub fromr1
= c
->valuesMap
.value(17);
573 const Doub fromr2
= c
->valuesMap
.value(37);
574 const Doub tor1
= c
->valuesMap
.value(18);
575 const Doub tor2
= c
->valuesMap
.value(38);
576 const Doub stepr1
= c
->valuesMap
.value(19);
577 const Doub stepr2
= c
->valuesMap
.value(39);
578 const Doub eps
= c
->valuesMap
.value(36);
579 const Doub from
= c
->valuesMap
.value(15);
580 const Doub to
= c
->valuesMap
.value(16);
583 const bool ruk
= c
->ruk
;
584 const bool eul
= c
->eul
;
585 QString param1
= c
->str1
;
586 QString param2
= c
->str2
;
587 qDebug() << "System" << v
;
590 Doub trajectory_length
, deflection
;
593 Doub xpi
[samples
][s
];
594 Doub ypi
[samples
][s
];
595 Doub phipi
[samples
][s
];
604 qDebug() << "standard mode";
605 qDebug() << "stepsize:" << h
;
606 qDebug() << "number of steps:" << s
;
608 IC_setup(y
,x0
,xdot0
,y0
,ydot0
,phi0
,params
);
611 tau
= 2*PI
/params
[4];
614 if (xtest
>= k
*tau
) {
617 derivs(x
,y
,dydx
,params
,gauss
); // sets first dydx[] for rk4()
618 rk4(y
,dydx
,x
,h
,yout
,params
,gauss
);
622 rkValues_x
.insert(x
,y
[0]);
625 //xpi = ABS(fmod(yout[0],(2*PI)));
626 //ypi = ABS(fmod(yout[1],(2*PI)));
627 rkValues_x
.insert(x
,y
[0]);
628 rkValues_y
.insert(x
,y
[1]);
629 //rkValues_x.insert(x,xpi);
630 //rkValues_y.insert(x,ypi);
631 rkValues_phi
.insert(x
,(180/PI
)*ABS(fmod(y
[2],(2*PI
))));
632 x1
= y
[0] + params
[7]*cos(y
[2]);
633 y1
= y
[1] + params
[7]*sin(y
[2]);
634 x2
= y
[0] - params
[8]*cos(y
[2]);
635 y2
= y
[1] - params
[8]*sin(y
[2]);
636 rkValues_p1x
.insert(x
,x1
);
637 rkValues_p1y
.insert(x
,y1
);
638 rkValues_p2x
.insert(x
,x2
);
639 rkValues_p2y
.insert(x
,y2
);
643 for (Int j
=0;j
<n
;j
++)
647 qDebug() << "sizeof(rkValues_x) =" << rkValues_x
.size();
648 qDebug() << "sizeof(rkValues_y) =" << rkValues_y
.size();
649 qDebug() << "sizeof(rkValues_phi) =" << rkValues_phi
.size();
650 write_to_file(file_rk_out
, rkValues_x
, rkValues_y
, rkValues_phi
, params
);
651 write_to_file(file_rk_pt1
, rkValues_p1x
, rkValues_p1y
, rkValues_phi
, params
);
652 write_to_file(file_rk_pt2
, rkValues_p2x
, rkValues_p2y
, rkValues_phi
, params
);
655 qDebug() << "converge mode";
658 for (iter
=1;(iter
*from
)<=to
;iter
++) {
659 for (Int z
=0;z
<samples
;z
++) {
660 qDebug() << "at step" << z
<< "of" << samples
;
664 qDebug() << "stepsize is" << hh
<< "with" << ss
<< "total steps.";
665 //x0 = randpi(ran), xdot0 = randpi(ran), y0 = randpi(ran), ydot0 = randpi(ran), phi0 = randpi(ran);
666 IC_setup(y
,x0
,xdot0
,y0
,ydot0
,phi0
,params
);
669 tau
= 2*PI
/params
[4];
671 //qDebug() << k << "<" << s;
672 //qDebug() << k << tau << k*tau;
674 if (xtest
>= k
*tau
) {
675 //qDebug() << xtest << ">=" << k << "*" << tau << "("<<k*tau<<")";
677 derivs(x
,y
,dydx
,params
,gauss
);
678 rk4(y
,dydx
,x
,hnew
,yout
,params
,gauss
);
683 //qDebug() << xtest << "=" << x<<"+"<<hh;
684 derivs(x
,y
,dydx
,params
,gauss
);
685 rk4(y
,dydx
,x
,hh
,yout
,params
,gauss
); // xold
688 for (Int j
=0;j
<n
;j
++)
693 rkValues_x
.insert(hh
,yout
[0]);
696 rkValues_x
.insert(hh
,yout
[0]);
697 rkValues_y
.insert(hh
,yout
[1]);
698 rkValues_phi
.insert(hh
,yout
[2]);
702 //x0 = randpi(ran), xdot0 = randpi(ran), y0 = randpi(ran), ydot0 = randpi(ran), phi0 = randpi(ran);
703 IC_setup(y
,x0
,xdot0
,y0
,ydot0
,phi0
,params
);
706 tau
= 2*PI
/params
[4];
709 if (xtest
>= k
*tau
) {
711 derivs(x
,y
,dydx
,params
,gauss
);
712 euler(y
,dydx
,x
,hnew
,yout
);
716 derivs(x
,y
,dydx
,params
,gauss
);
717 euler(y
,dydx
,x
,hh
,yout
);
720 for (Int j
=0;j
<n
;j
++)
725 euValues_x
.insert(hh
,yout
[0]);
728 euValues_x
.insert(hh
,yout
[0]);
729 euValues_y
.insert(hh
,yout
[1]);
730 euValues_phi
.insert(hh
,yout
[2]);
735 qDebug() << "sizeof(rkValues_x) =" << rkValues_x
.size();
736 write_to_file(file_rk_conv
, rkValues_x
, rkValues_y
, rkValues_phi
, params
);
737 write_to_file(file_eu_conv
, euValues_x
, euValues_y
, euValues_phi
, params
);
740 qDebug() << "bifurcation mode";
741 qDebug() << "bifurcation parameter: " << param1
;
742 qDebug() << "Number of samples : " << samples
;
744 for (Int j
=0;(j
*stepr1
)<=(tor1
-fromr1
);j
++) {
746 qDebug() << "at step" << j
<< "of" << (tor1
-fromr1
)/stepr1
;
747 for (Int z
=0;z
<samples
;z
++) {
749 x0
= randpi(ran
), xdot0
= randpi(ran
), y0
= randpi(ran
), ydot0
= randpi(ran
), phi0
= randpi(ran
);
750 //qDebug() << "sample" << z << "using" << x0 << xdot0 << y0 << ydot0 << phi0;
751 IC_setup(y
,x0
,xdot0
,y0
,ydot0
,phi0
,params
);
752 bifparam(v
,param1
,r
,params
);
753 //qDebug() << x << y[0] << y[1] << y[2];
754 //for(Int i = 0;i<=10;i++)
755 // qDebug() << params[i];
756 // inner for: iterate over runge-kutta
760 tau
= 2*PI
/params
[4];
761 //qDebug() << "tau: " << tau << "\tL: " << L;
763 xtest
= x
+h
; // test next x increment
764 //if (xtest < k*tau) { qDebug() << "["<<k<<"]" << xtest << "<" << k*tau << "..."; }
765 if (xtest
>= k
*tau
) {
766 //qDebug() << "["<<k<<"]" << xtest << ">" << k*tau << "!";
767 //qDebug() << "new h is" << k << "*" << tau << "-" << x << "=" << hnew;
769 //qDebug() << "making rk4() with stepsize"<<hnew<<"at"<<r;
770 derivs(x
,y
,dydx
,params
,gauss
);
771 rk4(y
,dydx
,x
,hnew
,yout
,params
,gauss
);
774 xpi
[z
][k
] = ABS(fmod(yout
[0],(2*PI
)));
775 //qDebug() << "xpi["<<z<<"]["<<k<<"]:" << xpi[z][k];
777 rkValues_x
.insert(r
,xpi
[z
][k
]);
778 rkValues_xdot
.insert(r
,dydx
[0]);
782 xpi
[z
][k
] = ABS(fmod(yout
[0],(2*PI
)));
783 //qDebug() << "xpi["<<z<<"]["<<k<<"]:" << xpi[z][k];
784 ypi
[z
][k
] = ABS(fmod(yout
[1],(2*PI
)));
785 phipi
[z
][k
] = ABS(fmod(yout
[2],(2*PI
)));
786 rkDist_x
.insert(r
,SQR(yout
[0]-x0
));
787 rkDist_y
.insert(r
,SQR(yout
[1]-y0
));
788 rkDist_phi
.insert(r
,SQR(yout
[2]-phi0
));
790 rkValues_x
.insert(r
,xpi
[z
][k
]);
791 rkValues_y
.insert(r
,ypi
[z
][k
]);
792 rkValues_phi
.insert(r
,yout
[2]);
793 rkValues_xdot
.insert(r
,dydx
[0]);
794 rkValues_ydot
.insert(r
,dydx
[1]);
795 rkValues_phidot
.insert(r
,dydx
[2]);
801 derivs(x
,y
,dydx
,params
,gauss
);
802 rk4(y
,dydx
,x
,h
,yout
,params
,gauss
); // xold
803 for (Int j
=0;j
<n
;j
++)
804 y
[j
] = yout
[j
]; // y[x+h] !!!!!!!
805 x
+= h
; // do it for real
807 //qDebug() << "at" << x << "in time for k = " << k;
812 avg
[0] = (Doub
) m_x
/k
;
813 rkAvgvelo_x
.insert(r
,avg
[0]);
816 m_x
= yout
[0]/L
; m_y
= yout
[1]/L
; m_phi
= yout
[2]/L
;
817 // makes only sense with r = params[10]
818 trajectory_length
= sqrt(SQR(abs(yout
[0]-x0
))+SQR(abs(yout
[1]-y0
)));
819 deflection
= ABS(fmod(acos(abs(yout
[0]-x0
)/trajectory_length
)-params
[10],(2*PI
)));
820 avg
[0] = (Doub
) m_x
/k
; avg
[1] = (Doub
) m_y
/k
; avg
[2] = (Doub
) m_phi
/k
;
821 rkAvgvelo_x
.insert(r
,avg
[0]);
822 rkAvgvelo_y
.insert(r
,avg
[1]);
823 rkAvgvelo_phi
.insert(r
,avg
[2]);
824 rkDefAngle
.insert(r
,(180/PI
)*deflection
);
828 VecDoub
msd_x(samples
,0.0);
829 VecDoub
msd_y(samples
,0.0);
830 VecDoub
msd_phi(samples
,0.0);
831 VecDoub
sigma_x(s
,0.0);
832 VecDoub
sigma_y(s
,0.0);
833 VecDoub
sigma_phi(s
,0.0);
834 //qDebug() << "samples:" << samples << "steps:" << s;
835 for(Int i
=0;i
<s
;i
++) {
836 //qDebug() << "["<<i<<"]:---------------------------------";
837 for(Int j
=0;j
<samples
;j
++) {
838 //qDebug() << "xpi["<<j<<"]["<<i<<"]:" << xpi[j][i];
839 msd_x
[j
] = xpi
[j
][i
];
840 //qDebug() << "["<<j<<"]:" << sper_x[j];
841 msd_y
[j
] = ypi
[j
][i
];
842 msd_phi
[j
] = phipi
[j
][i
];
844 sigma_x
[i
] = mean(msd_x
,samples
);
845 sigma_y
[i
] = mean(msd_y
,samples
);
846 sigma_phi
[i
] = mean(msd_phi
,samples
);
847 //qDebug() << "sigma_x["<<i<<"]:" << sigma_x[i];
849 for(Int k
=0;k
<s
;k
++) {
850 rkVariance_x
.insert(r
,sigma_x
[k
]);
851 rkVariance_y
.insert(r
,sigma_y
[k
]);
852 rkVariance_phi
.insert(r
,sigma_phi
[k
]);
854 //qDebug() << rkVariance_x;
857 * we need to do something about this
860 filter(rkValues_x,eps);
861 filter(rkValues_y,eps);
862 filter(rkValues_xdot,eps);
863 filter(rkValues_ydot,eps);
864 filter(rkAvgvelo_x, eps);
865 filter(rkAvgvelo_y, eps);
866 filter(rkAvgvelo_phi,eps);*/
867 qDebug() << "sizeof(rkValues_x) =" << rkValues_x
.size();
868 qDebug() << "sizeof(rkValues_y) =" << rkValues_y
.size();
869 qDebug() << "sizeof(rkValues_xdot) =" << rkValues_xdot
.size();
870 qDebug() << "sizeof(rkValues_ydot) =" << rkValues_ydot
.size();
871 write_to_file(file_rk_bif
, rkValues_x
, rkValues_y
, rkValues_phi
, params
);
872 write_to_file(file_rk_biv
, rkValues_xdot
, rkValues_ydot
, rkValues_phidot
, params
);
873 write_to_file(file_rk_avg
, rkAvgvelo_x
, rkAvgvelo_y
, rkAvgvelo_phi
, params
);
874 write_to_file(file_rk_variance
, rkVariance_x
, rkVariance_y
, rkVariance_phi
,params
);
875 write_to_file(file_rk_distance
, rkDist_x
, rkDist_y
, rkDist_phi
, params
);
876 write_to_file(file_rk_defangle
, rkDefAngle
, NullMap
, NullMap
, params
);
879 qDebug() << "dual bifurcation mode";
880 qDebug() << "bifurcation parameters: " << param1
<<"\t"<<param2
;
881 qDebug() << "Number of samples : " << samples
;
883 QString vx_color
, vy_color
;
884 QString name
= "tmp.dat";
886 QTextStream
out(&file
);
887 file
.open(QIODevice::WriteOnly
);
888 out
<< "x\ty\tvx\tvx_color\tvy\tvy_color\tvphi" << endl
;
889 for(Int it1
=0;(it1
*stepr1
)<=(tor1
-fromr1
);it1
++) {
890 for(Int it2
=0;(it2
*stepr2
)<=(tor2
-fromr2
);it2
++) {
891 stp1
= fromr1
+it1
*stepr1
;
892 stp2
= fromr2
+it2
*stepr2
;
893 qDebug() << stp1
<< "("<<tor1
<<")" << stp2
<< "("<<tor2
<<")";
894 for (Int z
=0;z
<samples
;z
++) {
896 x0
= randpi(ran
), xdot0
= randpi(ran
), y0
= randpi(ran
), ydot0
= randpi(ran
), phi0
= randpi(ran
);
897 IC_setup(y
,x0
,xdot0
,y0
,ydot0
,phi0
,params
);
898 bifparam(v
,param1
,stp1
,params
);
899 bifparam(v
,param2
,stp2
,params
);
902 for (Int i=0;i<10;i++)
903 out << "params["<<i<<"] = " << params[i] << " ";
906 // inner for: iterate over runge-kutta
910 tau
= 2*PI
/params
[4];
911 //qDebug() << "tau: " << tau << "\tL: " << L;
913 xtest
= x
+h
; // test next x increment
914 //if (xtest < k*tau) { qDebug() << "["<<k<<"]" << xtest << "<" << k*tau << "..."; }
915 if (xtest
>= k
*tau
) {
916 //qDebug() << "["<<k<<"]" << xtest << ">" << k*tau << "!";
917 //qDebug() << "new h is" << k << "*" << tau << "-" << x << "=" << hnew;
919 //qDebug() << "making rk4() with stepsize"<<hnew<<"at"<<r;
920 derivs(x
,y
,dydx
,params
,gauss
);
921 rk4(y
,dydx
,x
,hnew
,yout
,params
,gauss
);
924 derivs(x
,y
,dydx
,params
,gauss
);
925 rk4(y
,dydx
,x
,h
,yout
,params
,gauss
); // xold
926 for (Int j
=0;j
<n
;j
++)
927 y
[j
] = yout
[j
]; // y[x+h] !!!!!!!
928 x
+= h
; // do it for real
931 m_x
= yout
[0]/L
; m_y
= yout
[1]/L
; m_phi
= yout
[2]/L
;
932 avg
[0] = (Doub
) m_x
/k
; avg
[1] = (Doub
) m_y
/k
;
933 avg
[2] = (Doub
) m_phi
/k
;
934 set_color(avg
[0], vx_color
);
935 set_color(avg
[1], vy_color
);
936 out
<< stp1
<< "\t" << stp2
<< "\t"
937 << avg
[0] << "\t" << vx_color
<< "\t" << avg
[1]
938 << "\t" << vy_color
<< "\t" << avg
[2] << endl
;
940 } // end 2. outer for
941 } // end 1. outer for
943 qDebug() << "moving" << name
<< "to safety";
944 file
.copy(name
, file_rk_dualbif
);
953 qDebug() << "(euler) standard mode";
954 qDebug() << "stepsize:" << eu_h
;
955 qDebug() << "number of steps:" << s
;
957 IC_setup(y
,x0
,xdot0
,y0
,ydot0
,phi0
,params
);
965 if (xtest
>= k
*tau
) {
968 derivs(x
,y
,dydx
,params
,gauss
); // sets first dydx[] for rk4()
969 euler(y
,dydx
,x
,hnew
,yout
);
973 euValues_x
.insert(xnew
,yout
[0]);
976 //xpi = ABS(fmod(yout[0],(2*PI)));
977 //ypi = ABS(fmod(yout[1],(2*PI)));
978 euValues_x
.insert(xnew
,yout
[0]);
979 euValues_y
.insert(xnew
,yout
[1]);
980 //rkValues_x.insert(x,xpi);
981 //rkValues_y.insert(x,ypi);
982 euValues_phi
.insert(xnew
,yout
[2]);
983 x1
= yout
[0] + params
[7]*cos(yout
[2]);
984 y1
= yout
[1] + params
[7]*sin(yout
[2]);
985 x2
= yout
[0] - params
[8]*cos(yout
[2]);
986 y2
= yout
[1] - params
[8]*sin(yout
[2]);
987 euValues_p1x
.insert(xnew
,x1
);
988 euValues_p1y
.insert(xnew
,y1
);
989 euValues_p2x
.insert(xnew
,x2
);
990 euValues_p2y
.insert(xnew
,y2
);
996 derivs(x
,y
,dydx
,params
,gauss
);
997 euler(y
,dydx
,x
,eu_h
,yout
); // xold
998 for (Int j
=0;j
<n
;j
++)
1002 qDebug() << "sizeof(euValues_x) =" << euValues_x
.size();
1003 qDebug() << "sizeof(euValues_y) =" << euValues_y
.size();
1004 qDebug() << "sizeof(euValues_phi) =" << euValues_phi
.size();
1005 write_to_file(file_eu_out
, euValues_x
, euValues_y
, euValues_phi
, params
);
1006 write_to_file(file_eu_pt1
, euValues_p1x
, euValues_p1y
, euValues_phi
, params
);
1007 write_to_file(file_eu_pt2
, euValues_p2x
, euValues_p2y
, euValues_phi
, params
);
1010 qDebug() << "bifurcation mode";
1011 qDebug() << "bifurcation parameter: " << param1
;
1012 qDebug() << "Number of samples : " << samples
;
1014 for (Int j
=0;(j
*stepr1
)<=(tor1
-fromr1
);j
++) {
1015 r
= fromr1
+j
*stepr1
;
1016 qDebug() << "at step" << j
<< "of" << (tor1
-fromr1
)/stepr1
;
1017 for (Int z
=0;z
<samples
;z
++) {
1019 x0
= randpi(ran
), xdot0
= randpi(ran
), y0
= randpi(ran
), ydot0
= randpi(ran
), phi0
= randpi(ran
);
1020 //qDebug() << "sample" << z << "using" << x0 << xdot0 << y0 << ydot0 << phi0;
1021 IC_setup(y
,x0
,xdot0
,y0
,ydot0
,phi0
,params
);
1022 bifparam(v
,param1
,r
,params
);
1023 // inner for: iterate over runge-kutta
1027 tau
= 2*PI
/params
[4];
1028 //qDebug() << "tau: " << tau << "\tL: " << L;
1030 xtest
= x
+eu_h
; // test next x increment
1031 //if (xtest < k*tau) { qDebug() << "["<<k<<"]" << xtest << "<" << k*tau << "..."; }
1032 if (xtest
>= k
*tau
) {
1033 //qDebug() << "["<<k<<"]" << xtest << ">" << k*tau << "!";
1034 //qDebug() << "new eu_h is" << k << "*" << tau << "-" << x << "=" << hnew;
1036 //qDebug() << "making euler() with stepsize"<<hnew<<"at"<<r;
1037 derivs(x
,y
,dydx
,params
,gauss
);
1038 euler(y
,dydx
,x
,hnew
,yout
);
1042 xpi
[z
][k
] = ABS(fmod(yout
[0],(2*PI
)));
1043 euValues_x
.insert(r
,xpi
[z
][k
]);
1044 euValues_xdot
.insert(r
,dydx
[0]);
1047 xpi
[z
][k
] = ABS(fmod(yout
[0],(2*PI
)));
1048 ypi
[z
][k
] = ABS(fmod(yout
[1],(2*PI
)));
1049 euValues_x
.insert(r
,xpi
[z
][k
]);
1050 euValues_y
.insert(r
,ypi
[z
][k
]);
1051 euValues_phi
.insert(r
,yout
[2]);
1052 euValues_xdot
.insert(r
,dydx
[0]);
1053 euValues_ydot
.insert(r
,dydx
[1]);
1054 euValues_phidot
.insert(r
,dydx
[2]);
1060 derivs(x
,y
,dydx
,params
,gauss
);
1061 euler(y
,dydx
,x
,eu_h
,yout
); // xold
1062 for (Int j
=0;j
<n
;j
++)
1063 y
[j
] = yout
[j
]; // y[x+eu_h] !!!!!!!
1064 x
+= eu_h
; // do it for real
1066 //qDebug() << "at" << x << "in time for k = " << k;
1068 Int m_x
, m_y
, m_phi
;
1071 avg
[0] = (Doub
) m_x
/k
;
1072 euAvgvelo_x
.insert(r
,avg
[0]);
1075 m_x
= yout
[0]/L
; m_y
= yout
[1]/L
; m_phi
= yout
[2]/L
;
1076 avg
[0] = (Doub
) m_x
/k
; avg
[1] = (Doub
) m_y
/k
; avg
[2] = (Doub
) m_phi
/k
;
1077 euAvgvelo_x
.insert(r
,avg
[0]);
1078 euAvgvelo_y
.insert(r
,avg
[1]);
1079 euAvgvelo_phi
.insert(r
,avg
[2]);
1085 * we need to do something about this
1087 qDebug() << "sizeof(euValues_x) =" << euValues_x
.size();
1088 qDebug() << "sizeof(euValues_y) =" << euValues_y
.size();
1089 qDebug() << "sizeof(euValues_xdot) =" << euValues_xdot
.size();
1090 qDebug() << "sizeof(euValues_ydot) =" << euValues_ydot
.size();
1091 write_to_file(file_eu_bif
, euValues_x
, euValues_y
, euValues_phi
, params
);
1092 write_to_file(file_eu_biv
, euValues_xdot
, euValues_ydot
, euValues_phidot
, params
);
1093 write_to_file(file_eu_avg
, euAvgvelo_x
, euAvgvelo_y
, euAvgvelo_phi
, params
);
1096 qDebug() << "dual bifurcation mode";
1097 qDebug() << "bifurcation parameters: " << param1
<<"\t"<<param2
;
1098 qDebug() << "Number of samples : " << samples
;
1100 QString name
= "dual_bif.dat";
1102 QTextStream
out(&file
);
1103 file
.open(QIODevice::WriteOnly
);
1104 for (Int it1
=0;(it1
*stepr1
)<=(tor1
-fromr1
);it1
++) {
1105 for (Int it2
=0;(it2
*stepr2
)<=(tor2
-fromr1
);it2
++) {
1106 stp1
= fromr1
+it1
*stepr1
;
1107 stp2
= fromr2
+it2
*stepr2
;
1108 qDebug() << stp1
<< "("<<tor1
<<")" << stp2
<< "("<<tor2
<<")";
1109 for (Int z
=0;z
<samples
;z
++) {
1111 x0
= randpi(ran
), xdot0
= randpi(ran
), y0
= randpi(ran
), ydot0
= randpi(ran
), phi0
= randpi(ran
);
1112 IC_setup(y
,x0
,xdot0
,y0
,ydot0
,phi0
,params
);
1113 bifparam(v
,param1
,stp1
,params
);
1114 bifparam(v
,param2
,stp2
,params
);
1115 // inner for: iterate over runge-kutta
1119 tau
= 2*PI
/params
[4];
1120 //qDebug() << "tau: " << tau << "\tL: " << L;
1122 xtest
= x
+eu_h
; // test next x increment
1123 //if (xtest < k*tau) { qDebug() << "["<<k<<"]" << xtest << "<" << k*tau << "..."; }
1124 if (xtest
>= k
*tau
) {
1125 //qDebug() << "["<<k<<"]" << xtest << ">" << k*tau << "!";
1126 //qDebug() << "new eu_h is" << k << "*" << tau << "-" << x << "=" << hnew;
1128 //qDebug() << "making euler() with stepsize"<<hnew<<"at"<<r;
1129 derivs(x
,y
,dydx
,params
,gauss
);
1130 euler(y
,dydx
,x
,hnew
,yout
);
1133 derivs(x
,y
,dydx
,params
,gauss
);
1134 euler(y
,dydx
,x
,eu_h
,yout
); // xold
1135 for (Int j
=0;j
<n
;j
++)
1136 y
[j
] = yout
[j
]; // y[x+eu_h] !!!!!!!
1137 x
+= eu_h
; // do it for real
1139 Int m_x
, m_y
, m_phi
;
1140 m_x
= yout
[0]/L
; m_y
= yout
[1]/L
; m_phi
= yout
[2]/L
;
1141 avg
[0] = (Doub
) m_x
/k
; avg
[1] = (Doub
) m_y
/k
; avg
[2] = (Doub
) m_phi
/k
;
1142 out
<< scientific
<< stp1
<< "\t" << stp2
<< "\t" << avg
[0] << "\t" << avg
[1] << "\t" << avg
[2] << endl
;
1144 } // end 2. outer for
1145 } // end 1. outer for
1152 throw("No method specified!");
1155 rkValues_xdot
.clear();
1157 rkValues_ydot
.clear();
1158 rkValues_phi
.clear();
1159 rkValues_phidot
.clear();
1160 rkAvgvelo_x
.clear();
1161 rkAvgvelo_y
.clear();
1162 rkAvgvelo_phi
.clear();
1165 euValues_xdot
.clear();
1167 euValues_ydot
.clear();
1168 euValues_phi
.clear();
1169 euValues_phidot
.clear();
1170 euAvgvelo_x
.clear();
1171 euAvgvelo_y
.clear();
1172 euAvgvelo_phi
.clear();
1176 //=============================================================================