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;
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_rho = floor((p_f->
rho[i] - dist->
min_rho)
118 int i_phi = floor((phi - dist->
min_phi)
125 int i_theta = floor((theta - dist->
min_theta)
129 int i_pr = floor((p_f->
p_r[i] - dist->
min_pr)
136 int i_pz = floor((p_f->
p_z[i] - dist->
min_pz)
145 if(i_rho >= 0 && i_rho <= dist->n_rho - 1 &&
146 i_theta >=0 && i_theta <= dist->n_theta -1 &&
147 i_phi >=0 && i_phi <= dist->n_phi - 1 &&
148 i_pr >= 0 && i_pr <= dist->n_pr - 1 &&
149 i_pphi >= 0 && i_pphi <= dist->n_pphi - 1 &&
150 i_pz >= 0 && i_pz <= dist->n_pz - 1 &&
151 i_time >= 0 && i_time <= dist->n_time - 1 &&
152 i_q >= 0 && i_q <= dist->n_q - 1 ) {
155 i_rho, i_theta, i_phi, i_pr, i_pphi, i_pz,
163 i_rho, i_theta, i_phi, i_pr, i_pphi, i_pz,
173 for(
int i = 0; i < p_f->
n_mrk; i++) {
174 if(p_f->
running[i] && valid[i] == 1) {
196 GPU_PARALLEL_LOOP_ALL_LEVELS
197 for(
int i = 0; i < p_f->
n_mrk; i++) {
218 int i_rho = floor((p_f->
rho[i] - dist->
min_rho)
225 int i_phi = floor((phi - dist->
min_phi)
232 int i_theta = floor((theta - dist->
min_theta)
236 int i_pr = floor((pr - dist->
min_pr)
239 int i_pphi = floor((pphi - dist->
min_pphi)
243 int i_pz = floor((pz - dist->
min_pz)
252 if(i_rho >= 0 && i_rho <= dist->n_rho - 1 &&
253 i_theta >= 0 && i_theta <= dist->n_theta -1 &&
254 i_phi >= 0 && i_phi <= dist->n_phi - 1 &&
255 i_pr >= 0 && i_pr <= dist->n_pr - 1 &&
256 i_pphi >= 0 && i_pphi <= dist->n_pphi - 1 &&
257 i_pz >= 0 && i_pz <= dist->n_pz - 1 &&
258 i_time >= 0 && i_time <= dist->n_time - 1 &&
259 i_q >= 0 && i_q <= dist->n_q - 1 ) {
262 i_rho, i_theta, i_phi, 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_rho6D_onload(dist_rho6D_data *data)
Onload data back to the host.
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.