39 #pragma omp simd aligned(h : 64)
40 for(i = 0; i <
NSIMD; i++) {
44 real k1[6], k2[6], k3[6], k4[6];
49 real mass = p->mass[i];
50 real charge = p->charge[i];
64 yprev[3] = p->ppar[i];
66 yprev[5] = p->zeta[i];
70 B_dB[1] = p->B_r_dr[i];
71 B_dB[2] = p->B_r_dphi[i];
72 B_dB[3] = p->B_r_dz[i];
74 B_dB[4] = p->B_phi[i];
75 B_dB[5] = p->B_phi_dr[i];
76 B_dB[6] = p->B_phi_dphi[i];
77 B_dB[7] = p->B_phi_dz[i];
80 B_dB[9] = p->B_z_dr[i];
81 B_dB[10] = p->B_z_dphi[i];
82 B_dB[11] = p->B_z_dz[i];
89 step_gceom(k1, yprev, mass, charge, B_dB, E, aldforce);
95 for(
int j = 0; j < 6; j++) {
96 tempy[j] = yprev[j] + h[i]*k1[j]/2.0;
102 t0 + h[i]/2.0, Bdata);
106 t0 + h[i]/2.0, Edata, Bdata);
109 step_gceom(k2, tempy, mass, charge, B_dB, E, aldforce);
111 for(
int j = 0; j < 6; j++) {
112 tempy[j] = yprev[j] + h[i]*k2[j]/2.0;
118 t0 + h[i]/2.0, Bdata);
122 t0 + h[i]/2.0, Edata, Bdata);
125 step_gceom(k3, tempy, mass, charge, B_dB, E, aldforce);
127 for(
int j = 0; j < 6; j++) {
128 tempy[j] = yprev[j] + h[i]*k3[j];
138 t0 + h[i], Edata, Bdata);}
140 step_gceom(k4, tempy, mass, charge, B_dB, E, aldforce);
142 for(
int j = 0; j < 6; j++) {
144 + h[i]/6.0 * (k1[j] + 2*k2[j] + 2*k3[j] + k4[j]);
149 if(!errflag && y[0] <= 0) {
152 if(!errflag && y[4] < 0) {
186 p->B_r_dr[i] = B_dB[1];
187 p->B_r_dphi[i] = B_dB[2];
188 p->B_r_dz[i] = B_dB[3];
190 p->B_phi[i] = B_dB[4];
191 p->B_phi_dr[i] = B_dB[5];
192 p->B_phi_dphi[i] = B_dB[6];
193 p->B_phi_dz[i] = B_dB[7];
196 p->B_z_dr[i] = B_dB[9];
197 p->B_z_dphi[i] = B_dB[10];
198 p->B_z_dz[i] = B_dB[11];
205 p->theta[i] += atan2( (R0-axisrz[0]) * (p->z[i]-axisrz[1])
206 - (z0-axisrz[1]) * (p->r[i]-axisrz[0]),
207 (R0-axisrz[0]) * (p->r[i]-axisrz[0])
208 + (z0-axisrz[1]) * (p->z[i]-axisrz[1]) );
239 #pragma omp simd aligned(h : 64)
240 for(i = 0; i <
NSIMD; i++) {
244 real k1[6], k2[6], k3[6], k4[6];
249 real mass = p->mass[i];
250 real charge = p->charge[i];
258 real t0 = p->time[i];
263 yprev[1] = p->phi[i];
265 yprev[3] = p->ppar[i];
267 yprev[5] = p->zeta[i];
271 B_dB[1] = p->B_r_dr[i];
272 B_dB[2] = p->B_r_dphi[i];
273 B_dB[3] = p->B_r_dz[i];
275 B_dB[4] = p->B_phi[i];
276 B_dB[5] = p->B_phi_dr[i];
277 B_dB[6] = p->B_phi_dphi[i];
278 B_dB[7] = p->B_phi_dz[i];
281 B_dB[9] = p->B_z_dr[i];
282 B_dB[10] = p->B_z_dphi[i];
283 B_dB[11] = p->B_z_dz[i];
290 errflag =
mhd_eval(mhd_dmhd, yprev[0], yprev[1], yprev[2], t0,
300 for(
int j = 0; j < 6; j++) {
301 tempy[j] = yprev[j] + h[i]/2.0*k1[j];
306 t0 + h[i]/2.0, Bdata);
310 t0 + h[i]/2.0, Edata, Bdata);
313 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
321 for(
int j = 0; j < 6; j++) {
322 tempy[j] = yprev[j] + h[i]/2.0*k2[j];
327 t0 + h[i]/2.0, Bdata);
331 t0 + h[i]/2.0, Edata, Bdata);
334 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
342 for(
int j = 0; j < 6; j++) {
343 tempy[j] = yprev[j] + h[i]*k3[j];
352 t0 + h[i], Edata, Bdata);
355 errflag =
mhd_eval(mhd_dmhd, tempy[0], tempy[1], tempy[2],
363 for(
int j = 0; j < 6; j++) {
365 + h[i]/6.0 * (k1[j] + 2*k2[j] + 2*k3[j] + k4[j]);
369 if(!errflag && y[0] <= 0) {
372 else if(!errflag && fabs(y[4]) >=
CONST_C) {
375 else if(!errflag && y[4] < 0) {
409 p->B_r_dr[i] = B_dB[1];
410 p->B_r_dphi[i] = B_dB[2];
411 p->B_r_dz[i] = B_dB[3];
413 p->B_phi[i] = B_dB[4];
414 p->B_phi_dr[i] = B_dB[5];
415 p->B_phi_dphi[i] = B_dB[6];
416 p->B_phi_dz[i] = B_dB[7];
419 p->B_z_dr[i] = B_dB[9];
420 p->B_z_dphi[i] = B_dB[10];
421 p->B_z_dz[i] = B_dB[11];
428 p->theta[i] += atan2( (R0-axisrz[0]) * (p->z[i]-axisrz[1])
429 - (z0-axisrz[1]) * (p->r[i]-axisrz[0]),
430 (R0-axisrz[0]) * (p->r[i]-axisrz[0])
431 + (z0-axisrz[1]) * (p->z[i]-axisrz[1]) );
a5err mhd_eval(real mhd_dmhd[10], real r, real phi, real z, real t, int includemode, boozer_data *boozerdata, mhd_data *mhddata, B_field_data *Bdata)
Evaluate the needed quantities from MHD mode for orbit following.
Header file for particle.c.
Struct representing NSIMD guiding center markers.