17size_t dist_5D_index(
int i_r,
int i_phi,
int i_z,
int i_ppara,
int i_pperp,
18 int i_time,
int i_q,
size_t step_6,
size_t step_5,
19 size_t step_4,
size_t step_3,
size_t step_2,
21 return (
size_t)(i_r) * step_6
22 + (
size_t)(i_phi) * step_5
23 + (
size_t)(i_z) * step_4
24 + (
size_t)(i_ppara) * step_3
25 + (
size_t)(i_pperp) * step_2
26 + (
size_t)(i_time) * step_1
36 offload_data->
n_r = 0;
37 offload_data->
min_r = 0;
38 offload_data->
max_r = 0;
39 offload_data->
n_phi = 0;
42 offload_data->
n_z = 0;
43 offload_data->
min_z = 0;
44 offload_data->
max_z = 0;
61 real* offload_array) {
62 dist_data->
n_r = offload_data->
n_r;
70 dist_data->
n_z = offload_data->
n_z;
86 dist_data->
n_q = offload_data->
n_q;
90 size_t n_q = (size_t)(dist_data->
n_q);
91 size_t n_time = (size_t)(dist_data->
n_time);
92 size_t n_pperp = (size_t)(dist_data->
n_pperp);
93 size_t n_ppara = (size_t)(dist_data->
n_ppara);
94 size_t n_z = (size_t)(dist_data->
n_z);
95 size_t n_phi = (size_t)(dist_data->
n_phi);
96 dist_data->
step_6 = n_q * n_time * n_pperp * n_ppara * n_z * n_phi;
97 dist_data->
step_5 = n_q * n_time * n_pperp * n_ppara * n_z;
98 dist_data->
step_4 = n_q * n_time * n_pperp * n_ppara;
99 dist_data->
step_3 = n_q * n_time * n_pperp;
100 dist_data->
step_2 = n_q * n_time;
103 dist_data->
histogram = &offload_array[0];
120 GPU_PARALLEL_LOOP_ALL_LEVELS
121 for(
int i = 0; i < p_f->
n_mrk; i++) {
130 int i_phi = floor((phi - dist->
min_phi)
133 int i_z = floor((p_f->
z[i] - dist->
min_z)
138 + p_f->
p_z[i] * p_f->
B_z[i])
139 / sqrt( p_f->
B_r[i] * p_f->
B_r[i]
141 + p_f->
B_z[i] * p_f->
B_z[i]);
142 int i_ppara = floor((ppara - dist->
min_ppara)
148 + p_f->
p_z[i] * p_f->
p_z[i]
150 int i_pperp = floor((pperp - dist->
min_pperp)
159 if(i_r >= 0 && i_r <= dist->n_r - 1 &&
160 i_phi >= 0 && i_phi <= dist->n_phi - 1 &&
161 i_z >= 0 && i_z <= dist->n_z - 1 &&
162 i_ppara >= 0 && i_ppara <= dist->n_ppara - 1 &&
163 i_pperp >= 0 && i_pperp <= dist->n_pperp - 1 &&
164 i_time >= 0 && i_time <= dist->n_time - 1 &&
165 i_q >= 0 && i_q <= dist->n_q - 1 ) {
169 i_r, i_phi, i_z, i_ppara, i_pperp, i_time,
207 for(
int i = 0; i <
NSIMD; i++) {
208 if(p_f->running[i]) {
209 i_r[i] = floor((p_f->r[i] - dist->
min_r)
216 i_phi[i] = floor((phi[i] - dist->
min_phi)
219 i_z[i] = floor((p_f->z[i] - dist->
min_z)
222 i_ppara[i] = floor((p_f->ppar[i] - dist->
min_ppara)
225 pperp[i] = sqrt(2 * sqrt( p_f->B_r[i] * p_f->B_r[i]
226 + p_f->B_phi[i] * p_f->B_phi[i]
227 + p_f->B_z[i] * p_f->B_z[i] )
228 * p_f->mu[i] * p_f->mass[i]);
229 i_pperp[i] = floor((pperp[i] - dist->
min_pperp)
232 i_time[i] = floor((p_f->time[i] - dist->
min_time)
238 if(i_r[i] >= 0 && i_r[i] <= dist->
n_r - 1 &&
239 i_phi[i] >= 0 && i_phi[i] <= dist->
n_phi - 1 &&
240 i_z[i] >= 0 && i_z[i] <= dist->
n_z - 1 &&
241 i_ppara[i] >= 0 && i_ppara[i] <= dist->
n_ppara - 1 &&
242 i_pperp[i] >= 0 && i_pperp[i] <= dist->
n_pperp - 1 &&
243 i_time[i] >= 0 && i_time[i] <= dist->
n_time - 1 &&
244 i_q[i] >= 0 && i_q[i] <= dist->
n_q - 1 ) {
246 weight[i] = p_f->weight[i] * (p_f->time[i] - p_i->time[i]);
254 for(
int i = 0; i <
NSIMD; i++) {
255 if(p_f->running[i] && ok[i]) {
257 i_r[i], i_phi[i], i_z[i], i_ppara[i], i_pperp[i], i_time[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]
void dist_5D_update_gc(dist_5D_data *dist, particle_simd_gc *p_f, particle_simd_gc *p_i)
Update the histogram from guiding center markers.
void dist_5D_init(dist_5D_data *dist_data, dist_5D_offload_data *offload_data, real *offload_array)
Initializes distribution from offload data.
size_t dist_5D_index(int i_r, int i_phi, int i_z, int i_ppara, int i_pperp, int i_time, int i_q, size_t step_6, size_t step_5, size_t step_4, size_t step_3, size_t step_2, size_t step_1)
Function for calculating the index in the histogram array.
void dist_5D_free_offload(dist_5D_offload_data *offload_data)
Frees the offload data.
void dist_5D_update_fo(dist_5D_data *dist, particle_simd_fo *p_f, particle_simd_fo *p_i)
Update the histogram from full-orbit particles.
Header file for dist_5D.c.
real fmod(real x, real y)
Compute the modulus of two real numbers.
Header file for particle.c.
Methods to evaluate elementary physical quantities.
Histogram parameters on target.
Histogram parameters that will be offloaded to target.
Struct representing NSIMD particle markers.
Struct representing NSIMD guiding center markers.