41 #pragma omp simd aligned(h, hnext : 64)
42 for(i = 0; i <
NSIMD; i++) {
46 real k1[6], k2[6], k3[6], k4[6], k5[6], k6[6];
50 real mass = p->mass[i];;
51 real charge = p->charge[i];
65 yprev[3] = p->ppar[i];
67 yprev[5] = p->zeta[i];
71 B_dB[1] = p->B_r_dr[i];
72 B_dB[2] = p->B_r_dphi[i];
73 B_dB[3] = p->B_r_dz[i];
75 B_dB[4] = p->B_phi[i];
76 B_dB[5] = p->B_phi_dr[i];
77 B_dB[6] = p->B_phi_dphi[i];
78 B_dB[7] = p->B_phi_dz[i];
81 B_dB[9] = p->B_z_dr[i];
82 B_dB[10] = p->B_z_dphi[i];
83 B_dB[11] = p->B_z_dz[i];
90 step_gceom(k1, yprev, mass, charge, B_dB, E, aldforce);
92 for(
int j = 0; j < 6; j++) {
101 t0 + (1.0/5)*h[i], Bdata);
105 t0 + (1.0/5)*h[i], Edata, Bdata);
108 step_gceom(k2, tempy, mass, charge, B_dB, E, aldforce);
110 for(
int j = 0; j < 6; j++) {
114 + (9.0/40) * k2[j] );
120 t0 + (3.0/10)*h[i], Bdata);
124 t0 + (3.0/10)*h[i], Edata, Bdata);
127 step_gceom(k3, tempy, mass, charge, B_dB, E, aldforce);
129 for(
int j = 0; j < 6; j++) {
134 + ( 6.0/5 ) * k3[j] );
140 t0 + (3.0/5)*h[i], Bdata);
144 t0 + (3.0/5)*h[i], Edata, Bdata);
147 step_gceom(k4, tempy, mass, charge, B_dB, E, aldforce);
149 for(
int j = 0; j < 6; j++) {
155 + ( 35.0/27) * k4[j] );
165 t0 + h[i], Edata, Bdata);
168 step_gceom(k5, tempy, mass, charge, B_dB, E, aldforce);
170 for(
int j = 0; j < 6; j++) {
173 ( 1631.0/55296 ) * k1[j]
174 + ( 175.0/512 ) * k2[j]
175 + ( 575.0/13824 ) * k3[j]
176 + (44275.0/110592) * k4[j]
177 + ( 253.0/4096 ) * k5[j] );
183 t0 + (7.0/8)*h[i], Bdata);
187 t0 + (7.0/8)*h[i], Edata, Bdata);
190 step_gceom(k6, tempy, mass, charge, B_dB, E, aldforce);
199 for(
int j = 0; j < 6; j++) {
203 + (250.0/621 ) * k3[j]
204 + (125.0/594 ) * k4[j]
205 + (512.0/1771) * k6[j] );
209 ( 2825.0/27648) * k1[j]
210 + (18575.0/48384) * k3[j]
211 + (13525.0/55296) * k4[j]
212 + ( 277.0/14336) * k5[j]
213 + ( 1.0/4 ) * k6[j] );
215 real yerr = fabs(rk5[j] - rk4[j]);
216 real ytol = fabs(yprev[j]) + fabs(k1[j]*h[i])
218 err = fmax( err, yerr/ytol );
221 real rk1[3] = {k1[0]*h[i], k1[1]*h[i], k1[2]*h[i]};
223 rk5[0] * rk5[0] + rk4[0] * rk4[0]
224 - 2 * rk5[0] * rk4[0] * cos(rk5[1] - rk4[1])
225 + ( rk5[2] - rk4[2] ) * ( rk5[2] - rk4[2] );
227 yprev[0] * yprev[0] + rk1[0] * rk1[0]
228 - 2 * yprev[0] * rk1[0] * cos(yprev[1] - rk1[1])
229 + ( yprev[2] - rk1[2] ) * ( yprev[2] - rk1[2] )
231 err = fmax( err, sqrt(yerr/ytol) );
238 hnext[i] = 0.85*h[i]*pow(err,-0.2);
241 if(hnext[i] > 1.5*h[i]) {
247 hnext[i] = -0.85*h[i]*pow(err,-0.25);
256 else if(!errflag && rk5[0] <= 0) {
260 else if(!errflag && rk5[4] < 0) {
283 p->time[i] + h[i], Bdata);
287 p->time[i] + h[i], Bdata);
295 p->B_r_dr[i] = B_dB[1];
296 p->B_r_dphi[i] = B_dB[2];
297 p->B_r_dz[i] = B_dB[3];
299 p->B_phi[i] = B_dB[4];
300 p->B_phi_dr[i] = B_dB[5];
301 p->B_phi_dphi[i] = B_dB[6];
302 p->B_phi_dz[i] = B_dB[7];
305 p->B_z_dr[i] = B_dB[9];
306 p->B_z_dphi[i] = B_dB[10];
307 p->B_z_dz[i] = B_dB[11];
313 p->theta[i] += atan2( (R0-axisrz[0]) * (p->z[i]-axisrz[1])
314 - (z0-axisrz[1]) * (p->r[i]-axisrz[0]),
315 (R0-axisrz[0]) * (p->r[i]-axisrz[0])
316 + (z0-axisrz[1]) * (p->z[i]-axisrz[1]) );
352#pragma omp simd aligned(h, hnext : 64)
353 for(i = 0; i <
NSIMD; i++) {
357 real k1[6], k2[6], k3[6], k4[6], k5[6], k6[6];
361 real mass = p->mass[i];;
362 real charge = p->charge[i];
370 real t0 = p->time[i];
375 yprev[1] = p->phi[i];
377 yprev[3] = p->ppar[i];
379 yprev[5] = p->zeta[i];
383 B_dB[1] = p->B_r_dr[i];
384 B_dB[2] = p->B_r_dphi[i];
385 B_dB[3] = p->B_r_dz[i];
387 B_dB[4] = p->B_phi[i];
388 B_dB[5] = p->B_phi_dr[i];
389 B_dB[6] = p->B_phi_dphi[i];
390 B_dB[7] = p->B_phi_dz[i];
393 B_dB[9] = p->B_z_dr[i];
394 B_dB[10] = p->B_z_dphi[i];
395 B_dB[11] = p->B_z_dz[i];
402 errflag =
mhd_eval(mhd_dmhd, yprev[0], yprev[1], yprev[2],
407 k1, yprev, mass, charge, B_dB, E, mhd_dmhd, aldforce);
409 for(
int j = 0; j < 6; j++) {
418 t0 + (1.0/5)*h[i], Bdata);
422 t0 + (1.0/5)*h[i], Edata, Bdata);
425 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
431 k2, tempy, mass, charge, B_dB, E, mhd_dmhd, aldforce);
433 for(
int j = 0; j < 6; j++) {
437 + (9.0/40) * k2[j] );
443 t0 + (3.0/10)*h[i], Bdata);
447 t0 + (3.0/10)*h[i], Edata, Bdata);
450 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
456 k3, tempy, mass, charge, B_dB, E, mhd_dmhd, aldforce);
458 for(
int j = 0; j < 6; j++) {
463 + ( 6.0/5 ) * k3[j] );
469 t0 + (3.0/5)*h[i], Bdata);
473 t0 + (3.0/5)*h[i], Edata, Bdata);
476 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
482 k4, tempy, mass, charge, B_dB, E, mhd_dmhd, aldforce);
484 for(
int j = 0; j < 6; j++) {
490 + ( 35.0/27) * k4[j] );
500 t0 + h[i], Edata, Bdata);
503 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
509 k5, tempy, mass, charge, B_dB, E, mhd_dmhd, aldforce);
511 for(
int j = 0; j < 6; j++) {
514 ( 1631.0/55296 ) * k1[j]
515 + ( 175.0/512 ) * k2[j]
516 + ( 575.0/13824 ) * k3[j]
517 + (44275.0/110592) * k4[j]
518 + ( 253.0/4096 ) * k5[j] );
524 t0 + (7.0/8)*h[i], Bdata);
528 t0 + (7.0/8)*h[i], Edata, Bdata);
531 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
537 k6, tempy, mass, charge, B_dB, E, mhd_dmhd, aldforce);
546 for(
int j = 0; j < 5; j++) {
550 + (250.0/621 ) * k3[j]
551 + (125.0/594 ) * k4[j]
552 + (512.0/1771) * k6[j] );
556 ( 2825.0/27648) * k1[j]
557 + (18575.0/48384) * k3[j]
558 + (13525.0/55296) * k4[j]
559 + ( 277.0/14336) * k5[j]
560 + ( 1.0/4 ) * k6[j] );
562 real yerr = fabs(rk5[j] - rk4[j]);
563 real ytol = fabs(yprev[j]) + fabs(k1[j]*h[i])
565 err = fmax( err, yerr/ytol );
568 real rk1[3] = {k1[0]*h[i], k1[1]*h[i], k1[2]*h[i]};
570 rk5[0] * rk5[0] + rk4[0] * rk4[0]
571 - 2 * rk5[0] * rk4[0] * cos(rk5[1] - rk4[1])
572 + ( rk5[2] - rk4[2] ) * ( rk5[2] - rk4[2] );
574 yprev[0] * yprev[0] + rk1[0] * rk1[0]
575 - 2 * yprev[0] * rk1[0] * cos(yprev[1] - rk1[1])
576 + ( yprev[2] - rk1[2] ) * ( yprev[2] - rk1[2] )
578 err = fmax( err, sqrt(yerr/ytol) );
585 hnext[i] = 0.85*h[i]*pow(err,-0.2);
588 if(hnext[i] > 1.5*h[i]) {
594 hnext[i] = -0.85*h[i]*pow(err,-0.25);
616 p->time[i] + h[i], Bdata);
620 p->time[i] + h[i], Bdata);
628 p->B_r_dr[i] = B_dB[1];
629 p->B_r_dphi[i] = B_dB[2];
630 p->B_r_dz[i] = B_dB[3];
632 p->B_phi[i] = B_dB[4];
633 p->B_phi_dr[i] = B_dB[5];
634 p->B_phi_dphi[i] = B_dB[6];
635 p->B_phi_dz[i] = B_dB[7];
638 p->B_z_dr[i] = B_dB[9];
639 p->B_z_dphi[i] = B_dB[10];
640 p->B_z_dz[i] = B_dB[11];
646 p->theta[i] += atan2( (R0-axisrz[0]) * (p->z[i]-axisrz[1])
647 - (z0-axisrz[1]) * (p->r[i]-axisrz[0]),
648 (R0-axisrz[0]) * (p->r[i]-axisrz[0])
649 + (z0-axisrz[1]) * (p->z[i]-axisrz[1]) );