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;
95 GPU_PARALLEL_LOOP_ALL_LEVELS
96 for(
int i = 0; i < p_f->
n_mrk; i++) {
99 int i_rho = floor((p_f->
rho[i] - dist->
min_rho)
106 int i_phi = floor((phi - dist->
min_phi)
113 int i_theta = floor((theta - dist->
min_theta)
117 int i_pr = floor((p_f->
p_r[i] - dist->
min_pr)
124 int i_pz = floor((p_f->
p_z[i] - dist->
min_pz)
133 if(i_rho >= 0 && i_rho <= dist->n_rho - 1 &&
134 i_theta >=0 && i_theta <= dist->n_theta -1 &&
135 i_phi >=0 && i_phi <= dist->n_phi - 1 &&
136 i_pr >= 0 && i_pr <= dist->n_pr - 1 &&
137 i_pphi >= 0 && i_pphi <= dist->n_pphi - 1 &&
138 i_pz >= 0 && i_pz <= dist->n_pz - 1 &&
139 i_time >= 0 && i_time <= dist->n_time - 1 &&
140 i_q >= 0 && i_q <= dist->n_q - 1 ) {
143 i_rho, i_theta, i_phi, i_pr, i_pphi, i_pz,
151 i_rho, i_theta, i_phi, i_pr, i_pphi, i_pz,
160 for(
int i = 0; i < p_f->
n_mrk; i++) {
161 if(p_f->
running[i] && index[i] >= 0 &&
199 for(
int i = 0; i <
NSIMD; i++) {
200 if(p_f->running[i]) {
203 real B_dB[12] = {p_f->B_r[i],
216 p_f->phi[i], p_f->ppar[i],
217 p_f->mu[i], p_f->zeta[i],
220 i_rho[i] = floor((p_f->rho[i] - dist->
min_rho)
227 i_phi[i] = floor((phi[i] - dist->
min_phi)
234 i_theta[i] = floor((theta[i] - dist->
min_theta)
238 i_pr[i] = floor((pr - dist->
min_pr)
241 i_pphi[i] = floor((pphi - dist->
min_pphi)
245 i_pz[i] = floor((pz - dist->
min_pz)
248 i_time[i] = floor((p_f->time[i] - dist->
min_time)
254 if(i_rho[i] >= 0 && i_rho[i] <= dist->
n_rho - 1 &&
255 i_theta[i] >= 0 && i_theta[i] <= dist->
n_theta -1 &&
256 i_phi[i] >= 0 && i_phi[i] <= dist->
n_phi - 1 &&
257 i_pr[i] >= 0 && i_pr[i] <= dist->
n_pr - 1 &&
258 i_pphi[i] >= 0 && i_pphi[i] <= dist->
n_pphi - 1 &&
259 i_pz[i] >= 0 && i_pz[i] <= dist->
n_pz - 1 &&
260 i_time[i] >= 0 && i_time[i] <= dist->
n_time - 1 &&
261 i_q[i] >= 0 && i_q[i] <= dist->
n_q - 1 ) {
263 weight[i] = p_f->weight[i] * (p_f->time[i] - p_i->time[i]);
271 for(
int i = 0; i <
NSIMD; i++) {
272 if(p_f->running[i] && ok[i]) {
274 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.