41 GPU_DATA_IS_MAPPED(h[0:p->
n_mrk],hnext[0:p->
n_mrk])
42 GPU_PARALLEL_LOOP_ALL_LEVELS
43 for(i = 0; i < p->
n_mrk; i++) {
47 real k1[6], k2[6], k3[6], k4[6], k5[6], k6[6];
66 yprev[3] = p->
ppar[i];
68 yprev[5] = p->
zeta[i];
76 B_dB[4] = p->
B_phi[i];
91 step_gceom(k1, yprev, mass, charge, B_dB, E, aldforce);
93 for(
int j = 0; j < 6; j++) {
102 t0 + (1.0/5)*h[i], Bdata);
106 t0 + (1.0/5)*h[i], Edata, Bdata);
109 step_gceom(k2, tempy, mass, charge, B_dB, E, aldforce);
111 for(
int j = 0; j < 6; j++) {
115 + (9.0/40) * k2[j] );
121 t0 + (3.0/10)*h[i], Bdata);
125 t0 + (3.0/10)*h[i], Edata, Bdata);
128 step_gceom(k3, tempy, mass, charge, B_dB, E, aldforce);
130 for(
int j = 0; j < 6; j++) {
135 + ( 6.0/5 ) * k3[j] );
141 t0 + (3.0/5)*h[i], Bdata);
145 t0 + (3.0/5)*h[i], Edata, Bdata);
148 step_gceom(k4, tempy, mass, charge, B_dB, E, aldforce);
150 for(
int j = 0; j < 6; j++) {
156 + ( 35.0/27) * k4[j] );
166 t0 + h[i], Edata, Bdata);
169 step_gceom(k5, tempy, mass, charge, B_dB, E, aldforce);
171 for(
int j = 0; j < 6; j++) {
174 ( 1631.0/55296 ) * k1[j]
175 + ( 175.0/512 ) * k2[j]
176 + ( 575.0/13824 ) * k3[j]
177 + (44275.0/110592) * k4[j]
178 + ( 253.0/4096 ) * k5[j] );
184 t0 + (7.0/8)*h[i], Bdata);
188 t0 + (7.0/8)*h[i], Edata, Bdata);
191 step_gceom(k6, tempy, mass, charge, B_dB, E, aldforce);
200 for(
int j = 0; j < 6; j++) {
204 + (250.0/621 ) * k3[j]
205 + (125.0/594 ) * k4[j]
206 + (512.0/1771) * k6[j] );
210 ( 2825.0/27648) * k1[j]
211 + (18575.0/48384) * k3[j]
212 + (13525.0/55296) * k4[j]
213 + ( 277.0/14336) * k5[j]
214 + ( 1.0/4 ) * k6[j] );
216 real yerr = fabs(rk5[j] - rk4[j]);
217 real ytol = fabs(yprev[j]) + fabs(k1[j]*h[i])
219 err = fmax( err, yerr/ytol );
222 real rk1[3] = {k1[0]*h[i], k1[1]*h[i], k1[2]*h[i]};
224 rk5[0] * rk5[0] + rk4[0] * rk4[0]
225 - 2 * rk5[0] * rk4[0] * cos(rk5[1] - rk4[1])
226 + ( rk5[2] - rk4[2] ) * ( rk5[2] - rk4[2] );
228 yprev[0] * yprev[0] + rk1[0] * rk1[0]
229 - 2 * yprev[0] * rk1[0] * cos(yprev[1] - rk1[1])
230 + ( yprev[2] - rk1[2] ) * ( yprev[2] - rk1[2] )
232 err = fmax( err, sqrt(yerr/ytol) );
239 hnext[i] = 0.85*h[i]*pow(err,-0.2);
242 if(hnext[i] > 1.5*h[i]) {
248 hnext[i] = -0.85*h[i]*pow(err,-0.25);
254 errflag = error_raise(
257 else if(!errflag && rk5[0] <= 0) {
258 errflag = error_raise(
261 else if(!errflag && rk5[4] < 0) {
262 errflag = error_raise(
284 p->
time[i] + h[i], Bdata);
288 p->
time[i] + h[i], Bdata);
300 p->
B_phi[i] = B_dB[4];
314 p->
theta[i] += atan2( (R0-axisrz[0]) * (p->
z[i]-axisrz[1])
315 - (z0-axisrz[1]) * (p->
r[i]-axisrz[0]),
316 (R0-axisrz[0]) * (p->
r[i]-axisrz[0])
317 + (z0-axisrz[1]) * (p->
z[i]-axisrz[1]) );
353 GPU_DATA_IS_MAPPED(h[0:p->
n_mrk],hnext[0:p->
n_mrk])
354 GPU_PARALLEL_LOOP_ALL_LEVELS
355 for(i = 0; i < p->
n_mrk; i++) {
359 real k1[6], k2[6], k3[6], k4[6], k5[6], k6[6];
377 yprev[1] = p->
phi[i];
379 yprev[3] = p->
ppar[i];
381 yprev[5] = p->
zeta[i];
389 B_dB[4] = p->
B_phi[i];
404 errflag =
mhd_eval(mhd_dmhd, yprev[0], yprev[1], yprev[2],
409 k1, yprev, mass, charge, B_dB, E, mhd_dmhd, aldforce);
411 for(
int j = 0; j < 6; j++) {
420 t0 + (1.0/5)*h[i], Bdata);
424 t0 + (1.0/5)*h[i], Edata, Bdata);
427 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
433 k2, tempy, mass, charge, B_dB, E, mhd_dmhd, aldforce);
435 for(
int j = 0; j < 6; j++) {
439 + (9.0/40) * k2[j] );
445 t0 + (3.0/10)*h[i], Bdata);
449 t0 + (3.0/10)*h[i], Edata, Bdata);
452 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
458 k3, tempy, mass, charge, B_dB, E, mhd_dmhd, aldforce);
460 for(
int j = 0; j < 6; j++) {
465 + ( 6.0/5 ) * k3[j] );
471 t0 + (3.0/5)*h[i], Bdata);
475 t0 + (3.0/5)*h[i], Edata, Bdata);
478 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
484 k4, tempy, mass, charge, B_dB, E, mhd_dmhd, aldforce);
486 for(
int j = 0; j < 6; j++) {
492 + ( 35.0/27) * k4[j] );
502 t0 + h[i], Edata, Bdata);
505 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
511 k5, tempy, mass, charge, B_dB, E, mhd_dmhd, aldforce);
513 for(
int j = 0; j < 6; j++) {
516 ( 1631.0/55296 ) * k1[j]
517 + ( 175.0/512 ) * k2[j]
518 + ( 575.0/13824 ) * k3[j]
519 + (44275.0/110592) * k4[j]
520 + ( 253.0/4096 ) * k5[j] );
526 t0 + (7.0/8)*h[i], Bdata);
530 t0 + (7.0/8)*h[i], Edata, Bdata);
533 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
539 k6, tempy, mass, charge, B_dB, E, mhd_dmhd, aldforce);
548 for(
int j = 0; j < 5; j++) {
552 + (250.0/621 ) * k3[j]
553 + (125.0/594 ) * k4[j]
554 + (512.0/1771) * k6[j] );
558 ( 2825.0/27648) * k1[j]
559 + (18575.0/48384) * k3[j]
560 + (13525.0/55296) * k4[j]
561 + ( 277.0/14336) * k5[j]
562 + ( 1.0/4 ) * k6[j] );
564 real yerr = fabs(rk5[j] - rk4[j]);
565 real ytol = fabs(yprev[j]) + fabs(k1[j]*h[i])
567 err = fmax( err, yerr/ytol );
570 real rk1[3] = {k1[0]*h[i], k1[1]*h[i], k1[2]*h[i]};
572 rk5[0] * rk5[0] + rk4[0] * rk4[0]
573 - 2 * rk5[0] * rk4[0] * cos(rk5[1] - rk4[1])
574 + ( rk5[2] - rk4[2] ) * ( rk5[2] - rk4[2] );
576 yprev[0] * yprev[0] + rk1[0] * rk1[0]
577 - 2 * yprev[0] * rk1[0] * cos(yprev[1] - rk1[1])
578 + ( yprev[2] - rk1[2] ) * ( yprev[2] - rk1[2] )
580 err = fmax( err, sqrt(yerr/ytol) );
587 hnext[i] = 0.85*h[i]*pow(err,-0.2);
590 if(hnext[i] > 1.5*h[i]) {
596 hnext[i] = -0.85*h[i]*pow(err,-0.25);
618 p->
time[i] + h[i], Bdata);
622 p->
time[i] + h[i], Bdata);
634 p->
B_phi[i] = B_dB[4];
648 p->
theta[i] += atan2( (R0-axisrz[0]) * (p->
z[i]-axisrz[1])
649 - (z0-axisrz[1]) * (p->
r[i]-axisrz[0]),
650 (R0-axisrz[0]) * (p->
r[i]-axisrz[0])
651 + (z0-axisrz[1]) * (p->
z[i]-axisrz[1]) );