18 int i_pz,
int i_time,
int i_q,
size_t step_7,
19 size_t step_6,
size_t step_5,
size_t step_4,
20 size_t step_3,
size_t step_2,
size_t step_1) {
21 return (
size_t)(i_rho) * step_7
22 + (
size_t)(i_theta) * step_6
23 + (
size_t)(i_phi) * step_5
24 + (
size_t)(i_pr) * step_4
25 + (
size_t)(i_pphi) * step_3
26 + (
size_t)(i_pz) * step_2
27 + (
size_t)(i_time) * step_1
36 size_t n_q = (size_t)(data->
n_q);
37 size_t n_time = (size_t)(data->
n_time);
38 size_t n_pz = (size_t)(data->
n_pz);
39 size_t n_pphi = (size_t)(data->
n_pphi);
40 size_t n_pr = (size_t)(data->
n_pr);
41 size_t n_phi = (size_t)(data->
n_phi);
42 size_t n_theta = (size_t)(data->
n_theta);
43 data->
step_7 = n_q * n_time * n_pz * n_pphi * n_pr * n_phi * n_theta;
44 data->
step_6 = n_q * n_time * n_pz * n_pphi * n_pr * n_phi;
45 data->
step_5 = n_q * n_time * n_pz * n_pphi * n_pr;
46 data->
step_4 = n_q * n_time * n_pz * n_pphi;
47 data->
step_3 = n_q * n_time * n_pz;
48 data->
step_2 = n_q * n_time;
87 GPU_PARALLEL_LOOP_ALL_LEVELS
88 for(
int i = 0; i < p_f->
n_mrk; i++) {
91 int i_rho = floor((p_f->
rho[i] - dist->
min_rho)
98 int i_phi = floor((phi - dist->
min_phi)
105 int i_theta = floor((theta - dist->
min_theta)
109 int i_pr = floor((p_f->
p_r[i] - dist->
min_pr)
116 int i_pz = floor((p_f->
p_z[i] - dist->
min_pz)
125 if(i_rho >= 0 && i_rho <= dist->n_rho - 1 &&
126 i_theta >=0 && i_theta <= dist->n_theta -1 &&
127 i_phi >=0 && i_phi <= dist->n_phi - 1 &&
128 i_pr >= 0 && i_pr <= dist->n_pr - 1 &&
129 i_pphi >= 0 && i_pphi <= dist->n_pphi - 1 &&
130 i_pz >= 0 && i_pz <= dist->n_pz - 1 &&
131 i_time >= 0 && i_time <= dist->n_time - 1 &&
132 i_q >= 0 && i_q <= dist->n_q - 1 ) {
135 i_rho, i_theta, i_phi, i_pr, i_pphi, i_pz,
175 for(
int i = 0; i <
NSIMD; i++) {
176 if(p_f->running[i]) {
179 real B_dB[12] = {p_f->B_r[i],
192 p_f->phi[i], p_f->ppar[i],
193 p_f->mu[i], p_f->zeta[i],
196 i_rho[i] = floor((p_f->rho[i] - dist->
min_rho)
203 i_phi[i] = floor((phi[i] - dist->
min_phi)
210 i_theta[i] = floor((theta[i] - dist->
min_theta)
214 i_pr[i] = floor((pr - dist->
min_pr)
217 i_pphi[i] = floor((pphi - dist->
min_pphi)
221 i_pz[i] = floor((pz - dist->
min_pz)
224 i_time[i] = floor((p_f->time[i] - dist->
min_time)
230 if(i_rho[i] >= 0 && i_rho[i] <= dist->
n_rho - 1 &&
231 i_theta[i] >= 0 && i_theta[i] <= dist->
n_theta -1 &&
232 i_phi[i] >= 0 && i_phi[i] <= dist->
n_phi - 1 &&
233 i_pr[i] >= 0 && i_pr[i] <= dist->
n_pr - 1 &&
234 i_pphi[i] >= 0 && i_pphi[i] <= dist->
n_pphi - 1 &&
235 i_pz[i] >= 0 && i_pz[i] <= dist->
n_pz - 1 &&
236 i_time[i] >= 0 && i_time[i] <= dist->
n_time - 1 &&
237 i_q[i] >= 0 && i_q[i] <= dist->
n_q - 1 ) {
239 weight[i] = p_f->weight[i] * (p_f->time[i] - p_i->time[i]);
247 for(
int i = 0; i <
NSIMD; i++) {
248 if(p_f->running[i] && ok[i]) {
250 i_rho[i], i_theta[i], i_phi[i], i_pr[i], i_pphi[i], i_pz[i],
Main header file for ASCOT5.
#define NSIMD
Number of particles simulated simultaneously in a particle group operations.
Header file containing physical and mathematical constants.
#define CONST_E
Elementary charge [C].
int dist_rho6D_init(dist_rho6D_data *data)
Initializes distribution data.
void dist_rho6D_update_gc(dist_rho6D_data *dist, particle_simd_gc *p_f, particle_simd_gc *p_i)
Update the histogram from guiding-center particles.
size_t dist_rho6D_index(int i_rho, int i_theta, int i_phi, int i_pr, int i_pphi, int i_pz, int i_time, int i_q, size_t step_7, size_t step_6, size_t step_5, size_t step_4, size_t step_3, size_t step_2, size_t step_1)
Internal function calculating the index in the histogram array.
void dist_rho6D_free(dist_rho6D_data *data)
Free allocated resources.
void dist_rho6D_update_fo(dist_rho6D_data *dist, particle_simd_fo *p_f, particle_simd_fo *p_i)
Update the histogram from full-orbit particles.
void dist_rho6D_offload(dist_rho6D_data *data)
Offload data to the accelerator.
Header file for dist_rho6D.c.
real fmod(real x, real y)
Compute the modulus of two real numbers.
Methods to evaluate elementary physical quantities.
Histogram parameters on target.
Struct representing NSIMD particle markers.
Struct representing NSIMD guiding center markers.