XGC1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
grid_field.hpp
Go to the documentation of this file.
1 #ifndef GRID_FIELD_HPP
2 #define GRID_FIELD_HPP
3 #include "space_settings.hpp"
4 #include "NamelistReader.hpp"
5 
6 #include "globals.hpp"
7 #include "grid.hpp"
8 #include "linear_weights.hpp"
9 #include "local_fields.hpp"
10 #include "push_controls.hpp"
11 #include "field_weights.hpp"
12 #include "gyro_radius.hpp"
13 #include "field.hpp"
14 
15 /* TorType specifies whether the field is a single plane or needs a plane dimension
16  * */
17 enum class TorType{
18  OnePlane,
20 };
21 
22 // General declaration
23 // 2x2 = 4 types of GridField available: With and without gyroaverage dimension, with and without plane dimension
24 template<class Device, VarType VT, PhiInterpType PIT, TorType TT, KinType KT, ScatterType ST = ScatterType::Atomic>
25 struct GridField;
26 
27 // "ScalarGridField"
28 template<class Device, VarType VT, PhiInterpType PIT>
31  using device_type = Device;
32  static constexpr KinType KT = KinType::DriftKin;
33 
34  Kokkos::View<field_type*,Kokkos::LayoutRight,Device> f;
35 
37  GridField(std::string name, int nphi, int nrho, int nnode) : f(name,nnode) {}
38  GridField(std::string name, int nnode) : f(name,nnode) {}
39  field_type* data() const {return f.data();}
40  int size() const {return f.size();}
41  int nnode() const {return f.extent(0);}
42  int nrhop1() const {return 1;}
43  int nphi() const {return 1;}
44 
45  KOKKOS_INLINE_FUNCTION bool is_allocated() const {return f.is_allocated();}
46  KOKKOS_INLINE_FUNCTION field_type& operator ()(int inode) const {return f(inode);}
47 
48  // Scatter to a node
49  KOKKOS_INLINE_FUNCTION void scatter(int node, const FieldWeights<DriftKin, PIT>& wts, double particle_weight) const{
50  f(node).scatter(wts, particle_weight);
51  }
52 
53  // Scatter to a triangle
54  KOKKOS_INLINE_FUNCTION void scatter(const Grid<DeviceType>& grid, int ithread, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, int i_simd, const FieldWeights<DriftKin, PIT>& wts, double particle_weight) const{
55  for (int j = 0; j<3; j++){
56  // Find triangle's nodes
57  int node=grid.get_node_index(grid_wts.itr[i_simd], j);
58  double wp=grid_wts.p[j][i_simd];
59 
60  // Scatter to node
61  scatter(node, wts, wp*particle_weight);
62  }
63  }
64 
65  // Gather from a triangle
66  KOKKOS_INLINE_FUNCTION void gather(const Grid<Device> &grid, const SimdGridWeights<Order::One, PhiInterpType::None>& grid_wts, const Simd<double>& phi, Simd<double>& fld) const{
67  // Initialize local field to 0
68  fld = 0.0;
69 
70  for (int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
71  if(grid_wts.is_invalid(i_simd)) continue;
72 
73  // Loop over the 3 vertices of the grid triangle and add up the contributions from each
74  for (int ip = 0; ip<3; ip++){
75  int node = grid.get_node_index(grid_wts.itr[i_simd], ip);
76  double wp = grid_wts.p[ip][i_simd];
77  f(node).gather(fld,i_simd,wp);
78  }
79  }
80  }
81 
82  // Gather from a triangle
83  KOKKOS_INLINE_FUNCTION void gather(const Grid<Device> &grid, const SimdGridWeights<Order::One, PhiInterpType::Planes>& grid_wts, const Simd<double>& phi, Simd<double>& fld) const{
84  // Initialize local field to 0
85  fld = 0.0;
86 
87  for (int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
88  if(grid_wts.is_invalid(i_simd)) continue;
89  LinearWeights phi_wts(phi[i_simd],grid.inv_delta_phi,grid.nplanes);
90 
91  // Loop over the 3 vertices of the grid triangle and add up the contributions from each
92  for (int ip = 0; ip<3; ip++){
93  int node = grid.get_node_index(grid_wts.itr[i_simd], ip);
94  double wp = grid_wts.p[ip][i_simd];
95  f(node).gather(fld,i_simd,wp,phi_wts.w);
96  }
97  }
98  }
99 
101  int ndoubles_in_grid_field = f.size()*field_type::SIZE();
102  Kokkos::View<double*,Kokkos::LayoutRight,Device,Kokkos::MemoryTraits<Kokkos::Unmanaged>> view_1d_double((double*)(data()), ndoubles_in_grid_field);
103  Kokkos::deep_copy(view_1d_double, 0.0);
104  }
105 
106  // TODO: Generalize this copy and these transposes for ndim etc
107  // Fill View with transposed data where inode is the contiguous index
108  // Ultimately, there should probably be an implementation GridField that has the transposed indices
109  void copy_to_double_view(const View<double*,CLayout,Device>& dest_view) const{
110  // Make an unmanaged view around the input field
111  View<double*,CLayout,Device,Kokkos::MemoryTraits<Kokkos::Unmanaged>> f_unmanaged((double*)data(),nnode());
112 
113  Kokkos::deep_copy(dest_view, f_unmanaged);
114  }
115 
116  // Fill View with transposed data where inode is the contiguous index
117  // Ultimately, there should probably be an implementation GridField that has the transposed indices
118  void transpose_copy_to_double_view(const View<double**,CLayout,Device>& dest_view) const{
119  // Retrieve nphi from the Field of this GridField
120  constexpr int n_phi = field_type::NPHI();
121 
122  // Make an unmanaged view around the input field
123  View<double**,CLayout,Device,Kokkos::MemoryTraits<Kokkos::Unmanaged>> f_unmanaged((double*)data(),nnode(), n_phi);
124 
125  // Copy f_unmanaged into iphi = 0 and iphi = 1 of dest_view
126  Kokkos::parallel_for("var_transpose_copy", Kokkos::RangePolicy<ExSpace>( 0, nnode()), KOKKOS_LAMBDA(const int inode){
127  for(int iphi=0; iphi<n_phi; iphi++){
128  dest_view(iphi, inode) = f_unmanaged(inode, iphi);
129  }
130  });
131  Kokkos::fence();
132  }
133 
134  // Transpose and copy data from a view where inode is the contiguous index
135  void transpose_copy_from_double_view(const View<double**,CLayout,Device>& src_view) const{
136  // Retrieve nphi from the Field of this GridField
137  constexpr int n_phi = field_type::NPHI();
138 
139  // Make an unmanaged view of the data
140  View<double**,CLayout,Device,Kokkos::MemoryTraits<Kokkos::Unmanaged>> f_unmanaged((double*)data(),nnode(), n_phi);
141 
142  // Transpose from src_view into this gridfield
143  Kokkos::parallel_for("var_transpose_copy", Kokkos::RangePolicy<ExSpace>( 0, nnode()), KOKKOS_LAMBDA(const int inode){
144  for(int iphi=0; iphi<n_phi; iphi++){
145  f_unmanaged(inode, iphi) = src_view(iphi, inode);
146  }
147  });
148  Kokkos::fence();
149  }
150 
153  static KOKKOS_INLINE_FUNCTION void view_gather3(const Grid<DeviceType>& grid, const View<double*,CLayout,Device>& view1, const View<double*,CLayout,Device>& view2, const View<double*,CLayout,Device>& view3, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, double& val1, double& val2, double& val3, int i_simd){
154  val1=0.0;
155  val2=0.0;
156  val3=0.0;
157  for (int ip=0; ip<3; ip++){
158  int nd = grid.get_node_index(grid_wts.itr[i_simd], ip);
159  val1 += view1(nd)*grid_wts.p[ip][i_simd];
160  val2 += view2(nd)*grid_wts.p[ip][i_simd];
161  val3 += view3(nd)*grid_wts.p[ip][i_simd];
162  }
163  }
164 
165  static KOKKOS_INLINE_FUNCTION void view_gather(const Grid<DeviceType>& grid, const View<double*,CLayout,Device>& view, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, Simd<double>& val){
166  val = 0.0;
167  for (int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
168  if(grid_wts.itr[i_simd]<=0) continue;
169  for (int ip = 0; ip < 3; ip++){
170  int node = grid.get_node_index(grid_wts.itr[i_simd], ip);
171  val[i_simd] += grid_wts.p[ip][i_simd]*view(node);
172  }
173  }
174  }
175 
176  static KOKKOS_INLINE_FUNCTION void view_vec_odim_gather(const Grid<DeviceType>& grid, const View<Field<VarType::Vector,PhiInterpType::None>**,CLayout,Device>& view, int ind, const SimdGridWeights<Order::One, PhiInterpType::None>& grid_wts, SimdVector& val, int i_simd){
177  val.r[i_simd] = 0.0;
178  val.z[i_simd] = 0.0;
179  val.phi[i_simd] = 0.0;
180  for (int ip = 0; ip<3; ip++){
181  int node = grid.get_node_index(grid_wts.itr[i_simd], ip);
182  double wp = grid_wts.p[ip][i_simd];
183  view(ind,node).gather(val, i_simd, wp);
184  }
185  }
186 
187  static KOKKOS_INLINE_FUNCTION void view_gyro_scatter3(const Grid<DeviceType>& grid, const View<double**,CLayout,Device>& view1, const View<double**,CLayout,Device>& view2, const View<double**,CLayout,Device>& view3, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, double val1, double val2, double val3, int i_simd, const LinearWeights& rho_wts, bool is_gyro){
188  // Scatter moments into grid array
189  for (int ip = 0; ip < 3; ip++){
190  int node = grid.get_node_index(grid_wts.itr[i_simd], ip);
191  Kokkos::atomic_add(&(view1(rho_wts.i, node)), grid_wts.p[ip][i_simd]*rho_wts.w[0]*val1);
192  Kokkos::atomic_add(&(view2(rho_wts.i, node)), grid_wts.p[ip][i_simd]*rho_wts.w[0]*val2);
193  Kokkos::atomic_add(&(view3(rho_wts.i, node)), grid_wts.p[ip][i_simd]*rho_wts.w[0]*val3);
194  if(is_gyro){
195  Kokkos::atomic_add(&(view1(rho_wts.i+1, node)), grid_wts.p[ip][i_simd]*rho_wts.w[1]*val1);
196  Kokkos::atomic_add(&(view2(rho_wts.i+1, node)), grid_wts.p[ip][i_simd]*rho_wts.w[1]*val2);
197  Kokkos::atomic_add(&(view3(rho_wts.i+1, node)), grid_wts.p[ip][i_simd]*rho_wts.w[1]*val3);
198  }
199  }
200  }
201 
202  // view with outer dimension
203  static KOKKOS_INLINE_FUNCTION void view_odim_scatter(const Grid<DeviceType>& grid, const View<double**,CLayout,Device>& view, int ind, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, double val, int i_simd){
204  for (int j = 0; j<3; j++){
205  int node=grid.get_node_index(grid_wts.itr[i_simd], j);
206  double wp=grid_wts.p[j][i_simd];
207 
208  Kokkos::atomic_add(&(view(ind,node)), wp*val);
209  }
210  }
211 
212  static KOKKOS_INLINE_FUNCTION void view_scatter(const Grid<DeviceType>& grid, const View<double*,CLayout,Device>& view, const SimdGridWeights<Order::One, PhiInterpType::None>& grid_wts, double val, int i_simd){
213  for (int j = 0; j<3; j++){
214  int node=grid.get_node_index(grid_wts.itr[i_simd], j);
215  double wp=grid_wts.p[j][i_simd];
216 
217  Kokkos::atomic_add(&(view(node)), wp*val);
218  }
219  }
220 
221  static KOKKOS_INLINE_FUNCTION void view_ff_scatter(const Grid<DeviceType>& grid, const View<double**,CLayout,Device>& view, const SimdGridWeights<Order::One, PhiInterpType::Planes>& grid_wts, double wphi, double val, int i_simd){
222  for (int j = 0; j<3; j++){
223  int node=grid.get_node_index(grid_wts.itr[i_simd], j);
224  double wp=grid_wts.p[j][i_simd];
225 
226  Kokkos::atomic_add(&(view(0,node)), wp*wphi*val);
227  Kokkos::atomic_add(&(view(1,node)), wp*(1.0-wphi)*val);
228  }
229  }
230 
231  static KOKKOS_INLINE_FUNCTION void view_odim_variance(const Grid<DeviceType>& grid, const View<double**,CLayout,Device>& view, const View<double**,CLayout,Device>& variance, int ind, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, double val, int i_simd){
232  for (int j = 0; j<3; j++){
233  int node=grid.get_node_index(grid_wts.itr[i_simd], j);
234  double wp=grid_wts.p[j][i_simd];
235 
236  double tmp = view(ind,node) - wp*val;
237  Kokkos::atomic_add(&(variance(ind,node)), tmp*tmp);
238  }
239  }
240 
241  static KOKKOS_INLINE_FUNCTION void view_rep_scatter3(const Grid<DeviceType>& grid, const View<double***,CLayout,Device>& view, int ind1, int ind2, int ind3, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, double val1, double val2, double val3, int ithread, int i_simd){
242  // Scatter moments into grid array
243  for (int ip = 0; ip < 3; ip++){
244  int node = grid.get_node_index(grid_wts.itr[i_simd], ip);
245  double wp = grid_wts.p[ip][i_simd];
246 
247  access_add(&(view(ithread,node,ind1)),wp*val1);
248  access_add(&(view(ithread,node,ind2)),wp*val2);
249  access_add(&(view(ithread,node,ind3)),wp*val3);
250  }
251  }
252 };
253 
254 template<class Device, VarType VT, PhiInterpType PIT>
257  using device_type = Device;
258  static constexpr KinType KT = KinType::GyroKin;
259 
260  Kokkos::View<field_type**,Kokkos::LayoutRight,Device> f;
261 
263  GridField(std::string name, int nphi, int nrho, int nnode) : f(name,nnode, nrho+1) {}
264  GridField(std::string name, int nrho, int nnode) : f(name,nnode, nrho+1) {}
265  field_type* data() const {return f.data();}
266  int size() const {return f.size();}
267  int nnode() const {return f.extent(0);}
268  int nrhop1() const {return f.extent(1);}
269  int nphi() const {return 1;}
270  KOKKOS_INLINE_FUNCTION bool is_allocated() const {return f.is_allocated();}
271  KOKKOS_INLINE_FUNCTION field_type& operator ()(int inode, int irho) const {return f(inode, irho);}
272 
273  // Scatter to a node
274  KOKKOS_INLINE_FUNCTION void scatter(int node, const FieldWeights<GyroKin, PIT>& wts, double particle_weight) const{
275 #ifdef NEWGYROMATRIX
276  // If NEWGYROMATRIX, there are 2 rho wts so must specify (even though the i indices are identical)
277  int irho = wts.rho[0].i;
278 #else
279  int irho = wts.rho.i;
280 #endif
281  f(node,irho).scatter(wts, particle_weight, f(node,irho+1));
282  }
283 
284  // Scatter to a triangle (same as for DriftKin - consolidate)
285  KOKKOS_INLINE_FUNCTION void scatter(const Grid<DeviceType>& grid, int ithread, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, int i_simd, const FieldWeights<GyroKin, PIT>& wts, double particle_weight) const{
286  for (int j = 0; j<3; j++){
287  // Find triangle's nodes
288  int node=grid.get_node_index(grid_wts.itr[i_simd], j);
289  double wp=grid_wts.p[j][i_simd];
290 
291  // Scatter to node
292  scatter(node, wts, wp*particle_weight);
293  }
294  }
295 
297  int ndoubles_in_grid_field = f.size()*field_type::SIZE();
298  Kokkos::View<double*,Kokkos::LayoutRight,Device,Kokkos::MemoryTraits<Kokkos::Unmanaged>> view_1d_double((double*)(f.data()), ndoubles_in_grid_field);
299  Kokkos::deep_copy(view_1d_double, 0.0);
300  }
301 };
302 
303 /******** GridField with array replication ********/
304 template<class Device, VarType VT, PhiInterpType PIT>
307  using device_type = Device;
308  static constexpr KinType KT = KinType::DriftKin;
309 
310  Kokkos::View<field_type**,Kokkos::LayoutRight,Device> f;
311 
313  GridField(std::string name, int nphi, int nrho, int nnode) : f(name,get_num_cpu_threads(), nnode) {}
314  GridField(std::string name, int nnode) : f(name,get_num_cpu_threads(), nnode) {}
315  field_type* data() const {return f.data();}
316  int size() const {return f.size();}
317  int nnode() const {return f.extent(1);}
318  int nrhop1() const {return 1;}
319  int nphi() const {return 1;}
320  KOKKOS_INLINE_FUNCTION bool is_allocated() const {return f.is_allocated();}
321  KOKKOS_INLINE_FUNCTION field_type& operator ()(int ithread, int inode) const {return f(ithread, inode);}
322 
323  // Scatter to a node
324  KOKKOS_INLINE_FUNCTION void scatter(int ithread, int node, const FieldWeights<DriftKin, PIT>& wts, double particle_weight) const{
325  f(ithread,node).scatter(wts, particle_weight);
326  }
327 
328  // Scatter to a triangle
329  KOKKOS_INLINE_FUNCTION void scatter(const Grid<DeviceType>& grid, int ithread, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, int i_simd, const FieldWeights<DriftKin, PIT>& wts, double particle_weight) const{
330  for (int j = 0; j<3; j++){
331  // Find triangle's nodes
332  int node=grid.get_node_index(grid_wts.itr[i_simd], j);
333  double wp=grid_wts.p[j][i_simd];
334 
335  // Scatter to node
336  scatter(ithread, node, wts, wp*particle_weight);
337  }
338  }
339 
341  int ndoubles_in_grid_field = f.size()*field_type::SIZE();
342  Kokkos::View<double*,Kokkos::LayoutRight,Device,Kokkos::MemoryTraits<Kokkos::Unmanaged>> view_1d_double((double*)(f.data()), ndoubles_in_grid_field);
343  Kokkos::deep_copy(view_1d_double, 0.0);
344  }
345 };
346 
347 template<class Device, VarType VT, PhiInterpType PIT>
350  using device_type = Device;
351  static constexpr KinType KT = KinType::GyroKin;
352 
353  Kokkos::View<field_type***,Kokkos::LayoutRight,Device> f;
354 
356  GridField(std::string name, int nphi, int nrho, int nnode) : f(name,get_num_cpu_threads(),nnode, nrho+1) {}
357  GridField(std::string name, int nrho, int nnode) : f(name,get_num_cpu_threads(),nnode, nrho+1) {}
358  field_type* data() const {return f.data();}
359  int size() const {return f.size();}
360  int nnode() const {return f.extent(1);}
361  int nrhop1() const {return f.extent(2);}
362  int nphi() const {return 1;}
363  KOKKOS_INLINE_FUNCTION bool is_allocated() const {return f.is_allocated();}
364  KOKKOS_INLINE_FUNCTION field_type& operator ()(int ithread, int inode, int irho) const {return f(ithread,inode, irho);}
365 
366  // Scatter to a node
367  KOKKOS_INLINE_FUNCTION void scatter(int ithread, int node, const FieldWeights<GyroKin, PIT>& wts, double particle_weight) const{
368 #ifdef NEWGYROMATRIX
369  // If NEWGYROMATRIX, there are 2 rho wts so must specify (even though the i indices are identical)
370  int irho = wts.rho[0].i;
371 #else
372  int irho = wts.rho.i;
373 #endif
374  f(ithread,node,irho).scatter(wts, particle_weight, f(ithread,node,irho+1));
375  }
376 
377  // Scatter to a triangle (same as for DriftKin - consolidate)
378  KOKKOS_INLINE_FUNCTION void scatter(const Grid<DeviceType>& grid, int ithread, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, int i_simd, const FieldWeights<GyroKin, PIT>& wts, double particle_weight) const{
379  for (int j = 0; j<3; j++){
380  // Find triangle's nodes
381  int node=grid.get_node_index(grid_wts.itr[i_simd], j);
382  double wp=grid_wts.p[j][i_simd];
383 
384  // Scatter to node
385  scatter(ithread, node, wts, wp*particle_weight);
386  }
387  }
388 
390  int ndoubles_in_grid_field = f.size()*field_type::SIZE();
391  Kokkos::View<double*,Kokkos::LayoutRight,Device,Kokkos::MemoryTraits<Kokkos::Unmanaged>> view_1d_double((double*)(f.data()), ndoubles_in_grid_field);
392  Kokkos::deep_copy(view_1d_double, 0.0);
393  }
394 };
395 /************/
396 
397 template<class Device, VarType VT, PhiInterpType PIT>
400  using device_type = Device;
401  static constexpr KinType KT = KinType::DriftKin;
402 
403  Kokkos::View<field_type**,Kokkos::LayoutRight,Device> f;
404 
406  GridField(std::string name, int nphi, int nrho, int nnode) : f(name,nphi, nnode) {}
407  GridField(std::string name, int nphi, int nnode) : f(name,nphi, nnode) {}
408  field_type* data() const {return f.data();}
409  int size() const {return f.size();}
410  int nnode() const {return f.extent(1);}
411  int nrhop1() const {return 1;}
412  int nphi() const {return f.extent(0);}
413  KOKKOS_INLINE_FUNCTION bool is_allocated() const {return f.is_allocated();}
414  KOKKOS_INLINE_FUNCTION field_type& operator ()(int iphi, int inode) const {return f(iphi, inode);}
415 
418  new_field.f = my_subview(f, subfield_idx);
419  return new_field;
420  }
421 
422  Kokkos::View<double**,Kokkos::LayoutRight,Device,Kokkos::MemoryTraits<Kokkos::Unmanaged>> unmanaged() const{
423  return Kokkos::View<double**,Kokkos::LayoutRight,Device,Kokkos::MemoryTraits<Kokkos::Unmanaged>>((double*)(f.data()), f.layout());
424  }
425 };
426 
427 template<class Device, VarType VT, PhiInterpType PIT>
430  using device_type = Device;
431  static constexpr KinType KT = KinType::GyroKin;
432 
433  Kokkos::View<field_type***,Kokkos::LayoutRight,Device> f;
434 
436  GridField(std::string name, int nphi, int nrho, int nnode) : f(name,nphi, nnode, nrho+1) {}
437  field_type* data() const {return f.data();}
438  int size() const {return f.size();}
439  int nnode() const {return f.extent(1);}
440  int nrhop1() const {return f.extent(2);}
441  int nphi() const {return f.extent(0);}
442  KOKKOS_INLINE_FUNCTION bool is_allocated() const {return f.is_allocated();}
443  KOKKOS_INLINE_FUNCTION field_type& operator ()(int iphi, int inode, int irho) const {return f(iphi, inode, irho);}
444 };
445 
446 // For convenience
448 
449 
450 // Shallow copy if types are the same
451 template<typename T>
452 inline void grid_field_copy(T& dest, const T& src){
453  dest = src;
454 }
455 
456 // Allocate dest grid_field and copy data from src
457 template<typename T1, typename T2>
458 inline void grid_field_copy(T1& dest, const T2& src){
459  // Allocate device array
460  dest = T1("grid_field",src.nphi(), src.nrhop1()-1, src.nnode());
461  // Deep copy from host to device
462  Kokkos::deep_copy(dest.f, src.f);
463 }
464 
465 #endif
static KOKKOS_INLINE_FUNCTION void view_odim_scatter(const Grid< DeviceType > &grid, const View< double **, CLayout, Device > &view, int ind, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, double val, int i_simd)
Definition: grid_field.hpp:203
double inv_delta_phi
1/delta_phi
Definition: grid.hpp:275
Simd< double > r
Definition: simd.hpp:150
GridField(std::string name, int nphi, int nrho, int nnode)
Definition: grid_field.hpp:37
static KOKKOS_INLINE_FUNCTION void view_gather3(const Grid< DeviceType > &grid, const View< double *, CLayout, Device > &view1, const View< double *, CLayout, Device > &view2, const View< double *, CLayout, Device > &view3, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, double &val1, double &val2, double &val3, int i_simd)
Definition: grid_field.hpp:153
Definition: simd.hpp:149
GridField(std::string name, int nphi, int nrho, int nnode)
Definition: grid_field.hpp:406
KOKKOS_INLINE_FUNCTION bool is_allocated() const
Definition: grid_field.hpp:45
GridField(std::string name, int nrho, int nnode)
Definition: grid_field.hpp:264
void transpose_copy_to_double_view(const View< double **, CLayout, Device > &dest_view) const
Definition: grid_field.hpp:118
KOKKOS_INLINE_FUNCTION bool is_allocated() const
Definition: grid_field.hpp:270
static KOKKOS_INLINE_FUNCTION void view_gyro_scatter3(const Grid< DeviceType > &grid, const View< double **, CLayout, Device > &view1, const View< double **, CLayout, Device > &view2, const View< double **, CLayout, Device > &view3, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, double val1, double val2, double val3, int i_simd, const LinearWeights &rho_wts, bool is_gyro)
Definition: grid_field.hpp:187
GridField(std::string name, int nrho, int nnode)
Definition: grid_field.hpp:357
KOKKOS_INLINE_FUNCTION void scatter(int node, const FieldWeights< GyroKin, PIT > &wts, double particle_weight) const
Definition: grid_field.hpp:274
void copy_to_double_view(const View< double *, CLayout, Device > &dest_view) const
Definition: grid_field.hpp:109
static KOKKOS_INLINE_FUNCTION void view_ff_scatter(const Grid< DeviceType > &grid, const View< double **, CLayout, Device > &view, const SimdGridWeights< Order::One, PhiInterpType::Planes > &grid_wts, double wphi, double val, int i_simd)
Definition: grid_field.hpp:221
Definition: linear_weights.hpp:7
Definition: field_weights.hpp:13
Kokkos::View< field_type **, Kokkos::LayoutRight, Device > f
Definition: grid_field.hpp:260
Definition: globals.hpp:89
Definition: grid_weights.hpp:51
KOKKOS_INLINE_FUNCTION bool is_allocated() const
Definition: grid_field.hpp:413
GridField(std::string name, int nphi, int nnode)
Definition: grid_field.hpp:407
GridField(std::string name, int nnode)
Definition: grid_field.hpp:38
Kokkos::View< double **, Kokkos::LayoutRight, Device, Kokkos::MemoryTraits< Kokkos::Unmanaged > > unmanaged() const
Definition: grid_field.hpp:422
KOKKOS_INLINE_FUNCTION void scatter(const Grid< DeviceType > &grid, int ithread, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, int i_simd, const FieldWeights< GyroKin, PIT > &wts, double particle_weight) const
Definition: grid_field.hpp:378
void scatter(const Simulation< DeviceType > &sml, const Grid< DeviceType > &grid, const MagneticField< DeviceType > &magnetic_field, const GridFieldPack< DeviceType, PIT > &gfpack, const Species< DeviceType > &species, const Charge< DeviceType, KT > &charge)
Definition: scatter.cpp:239
int nplanes
Number of planes.
Definition: grid.hpp:272
KOKKOS_INLINE_FUNCTION bool is_allocated() const
Definition: grid_field.hpp:320
KOKKOS_INLINE_FUNCTION void scatter(int node, const FieldWeights< DriftKin, PIT > &wts, double particle_weight) const
Definition: grid_field.hpp:49
Kokkos::LayoutRight CLayout
Definition: space_settings.hpp:67
KOKKOS_INLINE_FUNCTION bool is_allocated() const
Definition: grid_field.hpp:442
GridField(std::string name, int nphi, int nrho, int nnode)
Definition: grid_field.hpp:313
Definition: grid_field.hpp:25
KOKKOS_INLINE_FUNCTION void gather(const Grid< Device > &grid, const SimdGridWeights< Order::One, PhiInterpType::Planes > &grid_wts, const Simd< double > &phi, Simd< double > &fld) const
Definition: grid_field.hpp:83
TorType
Definition: grid_field.hpp:17
KOKKOS_INLINE_FUNCTION void scatter(const Grid< DeviceType > &grid, int ithread, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, int i_simd, const FieldWeights< DriftKin, PIT > &wts, double particle_weight) const
Definition: grid_field.hpp:329
Kokkos::View< field_type *, Kokkos::LayoutRight, Device > f
Definition: grid_field.hpp:34
KOKKOS_INLINE_FUNCTION void access_add(T *addr, T val)
Definition: access_add.hpp:30
static KOKKOS_INLINE_FUNCTION void view_odim_variance(const Grid< DeviceType > &grid, const View< double **, CLayout, Device > &view, const View< double **, CLayout, Device > &variance, int ind, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, double val, int i_simd)
Definition: grid_field.hpp:231
void grid_field_copy(T &dest, const T &src)
Definition: grid_field.hpp:452
void transpose_copy_from_double_view(const View< double **, CLayout, Device > &src_view) const
Definition: grid_field.hpp:135
KOKKOS_INLINE_FUNCTION int get_node_index(int triangle_index, int tri_vertex_index) const
Definition: grid.tpp:891
GridField(std::string name, int nphi, int nrho, int nnode)
Definition: grid_field.hpp:263
double w[2]
Definition: linear_weights.hpp:9
Definition: globals.hpp:90
GridField< DeviceType, VarType::Scalar, PhiInterpType::None, TorType::OnePlane, KinType::DriftKin > ScalarGridField
Definition: grid_field.hpp:447
GridField< Device, VT, PIT, TorType::OnePlane, KinType::DriftKin > subfield(int subfield_idx) const
Definition: grid_field.hpp:416
static KOKKOS_INLINE_FUNCTION void view_vec_odim_gather(const Grid< DeviceType > &grid, const View< Field< VarType::Vector, PhiInterpType::None > **, CLayout, Device > &view, int ind, const SimdGridWeights< Order::One, PhiInterpType::None > &grid_wts, SimdVector &val, int i_simd)
Definition: grid_field.hpp:176
static KOKKOS_INLINE_FUNCTION void view_scatter(const Grid< DeviceType > &grid, const View< double *, CLayout, Device > &view, const SimdGridWeights< Order::One, PhiInterpType::None > &grid_wts, double val, int i_simd)
Definition: grid_field.hpp:212
Simd< double > phi
Definition: simd.hpp:152
KOKKOS_INLINE_FUNCTION void gather(const Grid< Device > &grid, const SimdGridWeights< Order::One, PhiInterpType::None > &grid_wts, const Simd< double > &phi, Simd< double > &fld) const
Definition: grid_field.hpp:66
Simd< double > z
Definition: simd.hpp:151
int i
Definition: linear_weights.hpp:8
KinType
Definition: globals.hpp:88
Definition: field.hpp:50
Kokkos::View< field_type ***, Kokkos::LayoutRight, Device > f
Definition: grid_field.hpp:433
KOKKOS_INLINE_FUNCTION void scatter(const Grid< DeviceType > &grid, int ithread, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, int i_simd, const FieldWeights< GyroKin, PIT > &wts, double particle_weight) const
Definition: grid_field.hpp:285
Kokkos::View< field_type **, Kokkos::LayoutRight, Device > f
Definition: grid_field.hpp:310
Kokkos::View< T *, Kokkos::LayoutRight, Device > my_subview(const Kokkos::View< T ****, Kokkos::LayoutRight, Device > &view, int i, int j, int k)
Definition: my_subview.hpp:8
KOKKOS_INLINE_FUNCTION void scatter(const Grid< DeviceType > &grid, int ithread, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, int i_simd, const FieldWeights< DriftKin, PIT > &wts, double particle_weight) const
Definition: grid_field.hpp:54
KOKKOS_INLINE_FUNCTION bool is_allocated() const
Definition: grid_field.hpp:363
int get_num_cpu_threads()
Definition: globals.hpp:17
Kokkos::View< field_type ***, Kokkos::LayoutRight, Device > f
Definition: grid_field.hpp:353
GridField(std::string name, int nphi, int nrho, int nnode)
Definition: grid_field.hpp:436
static KOKKOS_INLINE_FUNCTION void view_gather(const Grid< DeviceType > &grid, const View< double *, CLayout, Device > &view, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, Simd< double > &val)
Definition: grid_field.hpp:165
void parallel_for(const std::string name, int n_ptl, Function func, Option option, HostAoSoA aosoa_h, DeviceAoSoA aosoa_d)
Definition: streamed_parallel_for.hpp:252
KOKKOS_INLINE_FUNCTION void scatter(int ithread, int node, const FieldWeights< DriftKin, PIT > &wts, double particle_weight) const
Definition: grid_field.hpp:324
Kokkos::View< field_type **, Kokkos::LayoutRight, Device > f
Definition: grid_field.hpp:403
GridField(std::string name, int nphi, int nrho, int nnode)
Definition: grid_field.hpp:356
static KOKKOS_INLINE_FUNCTION void view_rep_scatter3(const Grid< DeviceType > &grid, const View< double ***, CLayout, Device > &view, int ind1, int ind2, int ind3, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, double val1, double val2, double val3, int ithread, int i_simd)
Definition: grid_field.hpp:241
KOKKOS_INLINE_FUNCTION void scatter(int ithread, int node, const FieldWeights< GyroKin, PIT > &wts, double particle_weight) const
Definition: grid_field.hpp:367