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;
89 GPU_PARALLEL_LOOP_ALL_LEVELS
90 for(
int i = 0; i < p_f->
n_mrk; i++) {
93 int i_rho = floor((p_f->
rho[i] - dist->
min_rho)
100 int i_phi = floor((phi - dist->
min_phi)
107 int i_theta = floor((theta - dist->
min_theta)
111 int i_pr = floor((p_f->
p_r[i] - dist->
min_pr)
118 int i_pz = floor((p_f->
p_z[i] - dist->
min_pz)
127 if(i_rho >= 0 && i_rho <= dist->n_rho - 1 &&
128 i_theta >=0 && i_theta <= dist->n_theta -1 &&
129 i_phi >=0 && i_phi <= dist->n_phi - 1 &&
130 i_pr >= 0 && i_pr <= dist->n_pr - 1 &&
131 i_pphi >= 0 && i_pphi <= dist->n_pphi - 1 &&
132 i_pz >= 0 && i_pz <= dist->n_pz - 1 &&
133 i_time >= 0 && i_time <= dist->n_time - 1 &&
134 i_q >= 0 && i_q <= dist->n_q - 1 ) {
137 i_rho, i_theta, i_phi, i_pr, i_pphi, i_pz,
177 for(
int i = 0; i <
NSIMD; i++) {
178 if(p_f->running[i]) {
181 real B_dB[12] = {p_f->B_r[i],
194 p_f->phi[i], p_f->ppar[i],
195 p_f->mu[i], p_f->zeta[i],
198 i_rho[i] = floor((p_f->rho[i] - dist->
min_rho)
205 i_phi[i] = floor((phi[i] - dist->
min_phi)
212 i_theta[i] = floor((theta[i] - dist->
min_theta)
216 i_pr[i] = floor((pr - dist->
min_pr)
219 i_pphi[i] = floor((pphi - dist->
min_pphi)
223 i_pz[i] = floor((pz - dist->
min_pz)
226 i_time[i] = floor((p_f->time[i] - dist->
min_time)
232 if(i_rho[i] >= 0 && i_rho[i] <= dist->
n_rho - 1 &&
233 i_theta[i] >= 0 && i_theta[i] <= dist->
n_theta -1 &&
234 i_phi[i] >= 0 && i_phi[i] <= dist->
n_phi - 1 &&
235 i_pr[i] >= 0 && i_pr[i] <= dist->
n_pr - 1 &&
236 i_pphi[i] >= 0 && i_pphi[i] <= dist->
n_pphi - 1 &&
237 i_pz[i] >= 0 && i_pz[i] <= dist->
n_pz - 1 &&
238 i_time[i] >= 0 && i_time[i] <= dist->
n_time - 1 &&
239 i_q[i] >= 0 && i_q[i] <= dist->
n_q - 1 ) {
241 weight[i] = p_f->weight[i] * (p_f->time[i] - p_i->time[i]);
249 for(
int i = 0; i <
NSIMD; i++) {
250 if(p_f->running[i] && ok[i]) {
252 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.