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,
size_t step_3,
20 size_t step_2,
size_t step_1) {
21 return (
size_t)(i_r) * step_7
22 + (
size_t)(i_phi) * step_6
23 + (
size_t)(i_z) * 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_z = (size_t)(data->
n_z);
42 size_t n_phi = (size_t)(data->
n_phi);
43 data->
step_7 = n_q * n_time * n_pz * n_pphi * n_pr * n_z * n_phi;
44 data->
step_6 = n_q * n_time * n_pz * n_pphi * n_pr * n_z;
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;
79 GPU_UPDATE_FROM_DEVICE(
104 int valid[
NSIMD] = {0};
107 GPU_PARALLEL_LOOP_ALL_LEVELS
108 for(
int i = 0; i < p_f->
n_mrk; i++) {
111 int i_r = floor((p_f->
r[i] - dist->
min_r)
118 int i_phi = floor((phi - dist->
min_phi)
121 int i_z = floor((p_f->
z[i] - dist->
min_z)
124 int i_pr = floor((p_f->
p_r[i] - dist->
min_pr)
130 int i_pz = floor((p_f->
p_z[i] - dist->
min_pz)
139 if(i_r >= 0 && i_r <= dist->n_r - 1 &&
140 i_phi >= 0 && i_phi <= dist->n_phi - 1 &&
141 i_z >= 0 && i_z <= dist->n_z - 1 &&
142 i_pr >= 0 && i_pr <= dist->n_pr - 1 &&
143 i_pphi >= 0 && i_pphi <= dist->n_pphi - 1 &&
144 i_pz >= 0 && i_pz <= dist->n_pz - 1 &&
145 i_time >= 0 && i_time <= dist->n_time - 1 &&
146 i_q >= 0 && i_q <= dist->n_q - 1 ) {
149 i_r, i_phi, i_z, i_pr, i_pphi, i_pz,
157 i_r, i_phi, i_z, i_pr, i_pphi, i_pz,
167 for(
int i = 0; i < p_f->
n_mrk; i++) {
168 if(p_f->
running[i] && valid[i] == 1) {
190 GPU_PARALLEL_LOOP_ALL_LEVELS
191 for(
int i = 0; i < p_f->
n_mrk; i++) {
205 int i_r = floor((p_f->
r[i] - dist->
min_r)
212 int i_phi = floor((phi - dist->
min_phi)
215 int i_z = floor((p_f->
z[i] - dist->
min_z)
218 int i_pr = floor((pr - dist->
min_pr)
221 int i_pphi = floor((pphi - dist->
min_pphi)
224 int i_pz = floor((pz - dist->
min_pz)
233 if(i_r >= 0 && i_r <= dist->n_r - 1 &&
234 i_phi >= 0 && i_phi <= dist->n_phi - 1 &&
235 i_z >= 0 && i_z <= dist->n_z - 1 &&
236 i_pr >= 0 && i_pr <= dist->n_pr - 1 &&
237 i_pphi >= 0 && i_pphi <= dist->n_pphi - 1 &&
238 i_pz >= 0 && i_pz <= dist->n_pz - 1 &&
239 i_time >= 0 && i_time <= dist->n_time - 1 &&
240 i_q >= 0 && i_q <= dist->n_q - 1 ) {
243 i_r, i_phi, i_z, i_pr, i_pphi, i_pz,
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].
void dist_6D_update_fo(dist_6D_data *dist, particle_simd_fo *p_f, particle_simd_fo *p_i)
Update the histogram from full-orbit particles.
void dist_6D_update_gc(dist_6D_data *dist, particle_simd_gc *p_f, particle_simd_gc *p_i)
Update the histogram from guiding-center particles.
void dist_6D_onload(dist_6D_data *data)
Onload data back to the host.
int dist_6D_init(dist_6D_data *data)
Initializes distribution data.
size_t dist_6D_index(int i_r, int i_phi, int i_z, 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_6D_free(dist_6D_data *data)
Free allocated resources.
void dist_6D_offload(dist_6D_data *data)
Offload data to the accelerator.
Header file for dist_6D.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.