1 #ifndef VGRID_DISTRIBUTION_HPP 
    2 #define VGRID_DISTRIBUTION_HPP 
   17 template<
class Device>
 
   23     View<double****,CLayout, Device> 
f;
 
   26     View<double*,CLayout, Device, Kokkos::MemoryTraits<Kokkos::Unmanaged>> 
f_1D;
 
   41       : 
f(
"f", maxwellians.
size(), vgrid.nvr, pol_decomp.nnodes, vgrid.nvz),
 
   49         for (
int i=0; i<
f.extent(0); i++){
 
   50             for (
int imu=0; imu<
f.extent(1); imu++){
 
   51                 double vperp = imu*
dsmu;
 
   52                 for (
int inode=0; inode<
f.extent(2); inode++){
 
   53                     for (
int ivp=0; ivp<
f.extent(3); ivp++){
 
   55                         f(i,imu,inode,ivp) = maxwellians[i].get_f(vpara, vperp);
 
   64       : 
f(
NoInit(
"f"), nsp, vgrid.nvr, pol_decomp.nnodes, vgrid.nvz),
 
   76     template<
class Device2>
 
   90     template<
class Device2>
 
  104     KOKKOS_INLINE_FUNCTION 
double& 
operator()(
int isp, 
int ivr, 
int inode, 
int ivz)
 const { 
return f(isp, ivr, inode, ivz);}
 
  109     double* 
data()
 const {
return f.data();}
 
  128         Kokkos::parallel_for(label, Kokkos::MDRangePolicy<Kokkos::Rank<4>, 
execution_space>({0, 0, 0, 0}, {
f.extent(0), 
f.extent(1), 
f.extent(2), 
f.extent(3)}), lambda_func);
 
  134         constexpr 
int ISP_ZERO = 0;
 
  135         Kokkos::atomic_add(&(
f(ISP_ZERO, wt.
i_vr+0,i_node,wt.
i_vz+0)),value*wt.
w_00);
 
  136         Kokkos::atomic_add(&(
f(ISP_ZERO, wt.
i_vr+0,i_node,wt.
i_vz+1)),value*wt.
w_01);
 
  137         Kokkos::atomic_add(&(
f(ISP_ZERO, wt.
i_vr+1,i_node,wt.
i_vz+0)),value*wt.
w_10);
 
  138         Kokkos::atomic_add(&(
f(ISP_ZERO, wt.
i_vr+1,i_node,wt.
i_vz+1)),value*wt.
w_11);
 
  142     KOKKOS_INLINE_FUNCTION 
static void scatter(
const View<double***,CLayout,Device>& view, 
int i_node, 
const VGridWeights& wt, 
double value){
 
  143         Kokkos::atomic_add(&(view(wt.
i_vr+0,i_node,wt.
i_vz+0)),value*wt.
w_00);
 
  144         Kokkos::atomic_add(&(view(wt.
i_vr+0,i_node,wt.
i_vz+1)),value*wt.
w_01);
 
  145         Kokkos::atomic_add(&(view(wt.
i_vr+1,i_node,wt.
i_vz+0)),value*wt.
w_10);
 
  146         Kokkos::atomic_add(&(view(wt.
i_vr+1,i_node,wt.
i_vz+1)),value*wt.
w_11);
 
  150     KOKKOS_INLINE_FUNCTION 
static void scatter(
const View<double****,CLayout,Device>& view, 
int i_node, 
const VGridWeights& wt, 
double value){
 
  151         constexpr 
int ISP_ZERO = 0;
 
  152         Kokkos::atomic_add(&(view(ISP_ZERO,wt.
i_vr+0,i_node,wt.
i_vz+0)),value*wt.
w_00);
 
  153         Kokkos::atomic_add(&(view(ISP_ZERO,wt.
i_vr+0,i_node,wt.
i_vz+1)),value*wt.
w_01);
 
  154         Kokkos::atomic_add(&(view(ISP_ZERO,wt.
i_vr+1,i_node,wt.
i_vz+0)),value*wt.
w_10);
 
  155         Kokkos::atomic_add(&(view(ISP_ZERO,wt.
i_vr+1,i_node,wt.
i_vz+1)),value*wt.
w_11);
 
  160         constexpr 
int ISP_ZERO = 0;
 
  191     KOKKOS_INLINE_FUNCTION 
int n_vr()
 const {
 
  199     KOKKOS_INLINE_FUNCTION 
int n_vz()
 const{
 
  203     KOKKOS_INLINE_FUNCTION 
int size()
 const{
 
  214         return (ivr==0 || ivr==
n_vr()-1) ? 0.5 : 1.0;
 
  219         return (ivz==0 || ivz==
n_vz()-1) ? 0.5 : 1.0;
 
  234         int itmp = ip/
n_vz();
 
  235         int imu = itmp%
n_vr();
 
  236         int isp = itmp/
n_vr(); 
 
  237         return f(isp,imu,inode,ivp);
 
  243         f_1D = View<double*,CLayout, Device, Kokkos::MemoryTraits<Kokkos::Unmanaged>>(
f.data(), 
f.size());
 
Definition: vgrid_distribution.hpp:18
 
KOKKOS_INLINE_FUNCTION int n_species() const
Definition: vgrid_distribution.hpp:187
 
VGridDistribution(int nsp, const VelocityGrid &vgrid, const DomainDecomposition< DeviceType > &pol_decomp, VGridDistributionOption option=VGridDistributionOption::ViewInit)
Definition: vgrid_distribution.hpp:63
 
double * data() const
Definition: vgrid_distribution.hpp:109
 
void resize_n_vertices(int new_n_nodes)
Definition: vgrid_distribution.hpp:241
 
KOKKOS_INLINE_FUNCTION double mu_vol_fac(int ivr) const
Definition: vgrid_distribution.hpp:213
 
void for_all_elements(const std::string label, F lambda_func) const
Definition: vgrid_distribution.hpp:117
 
VGridDistribution(const VelocityGrid &vgrid, const DomainDecomposition< DeviceType > &pol_decomp, const std::vector< Maxwellian > &maxwellians)
Definition: vgrid_distribution.hpp:40
 
KOKKOS_INLINE_FUNCTION void scatter(int i_node, const VGridWeights &wt, double value) const
Definition: vgrid_distribution.hpp:133
 
VGridDistribution()
Definition: vgrid_distribution.hpp:37
 
double get_smu_n(int imu) const
Definition: vgrid_distribution.hpp:208
 
double vp_max
max parallel velocity
Definition: vgrid_distribution.hpp:31
 
static KOKKOS_INLINE_FUNCTION void scatter(const View< double ***, CLayout, Device > &view, int i_node, const VGridWeights &wt, double value)
Definition: vgrid_distribution.hpp:142
 
UniformRange vz_range() const
Definition: vgrid_distribution.hpp:226
 
KOKKOS_INLINE_FUNCTION double vp_vol_fac(int ivz) const
Definition: vgrid_distribution.hpp:218
 
KOKKOS_INLINE_FUNCTION int size() const
Definition: vgrid_distribution.hpp:203
 
View< double ****, CLayout, Device > f
Definition: vgrid_distribution.hpp:23
 
KOKKOS_INLINE_FUNCTION double gather(int i_node, const VGridWeights &wt) const
Definition: vgrid_distribution.hpp:159
 
View< double *, CLayout, Device, Kokkos::MemoryTraits< Kokkos::Unmanaged > > f_1D
Definition: vgrid_distribution.hpp:26
 
static KOKKOS_INLINE_FUNCTION double gather(const T &view, int i_node, const VGridWeights &wt)
Definition: vgrid_distribution.hpp:169
 
double dsmu
grid spacing in mu
Definition: vgrid_distribution.hpp:34
 
VGridDistribution(int nsp, const VGridDistribution< Device2 > &dist_in, VGridDistributionOption option=VGridDistributionOption::ViewInit)
Definition: vgrid_distribution.hpp:77
 
void for_each_element(const std::string label, F lambda_func) const
Definition: vgrid_distribution.hpp:127
 
KOKKOS_INLINE_FUNCTION double & operator[](int i) const
Definition: vgrid_distribution.hpp:107
 
static KOKKOS_INLINE_FUNCTION void scatter(const View< double ****, CLayout, Device > &view, int i_node, const VGridWeights &wt, double value)
Definition: vgrid_distribution.hpp:150
 
UniformRange vr_range() const
Definition: vgrid_distribution.hpp:222
 
KOKKOS_INLINE_FUNCTION double & operator()(int isp, int ivr, int inode, int ivz) const
Definition: vgrid_distribution.hpp:104
 
KOKKOS_INLINE_FUNCTION double & pull_node_index(int inode, int ip) const
Definition: vgrid_distribution.hpp:232
 
double dvp
grid spacing in parallel velocity
Definition: vgrid_distribution.hpp:32
 
double inv_mu0_factor
Definition: vgrid_distribution.hpp:35
 
VGridDistribution(int nsp, int nnode, const VGridDistribution< Device2 > &dist_in, VGridDistributionOption option=VGridDistributionOption::ViewInit)
Definition: vgrid_distribution.hpp:91
 
static KOKKOS_INLINE_FUNCTION double normed_gather(const T &view, int i_node, const VGridWeights &wt, const T &norm_view)
Definition: vgrid_distribution.hpp:179
 
KOKKOS_INLINE_FUNCTION int n_vr() const
Definition: vgrid_distribution.hpp:191
 
typename Device::execution_space execution_space
Definition: vgrid_distribution.hpp:21
 
KOKKOS_INLINE_FUNCTION int n_nodes() const
Definition: vgrid_distribution.hpp:195
 
double smu_max
max mu
Definition: vgrid_distribution.hpp:33
 
KOKKOS_INLINE_FUNCTION int n_vz() const
Definition: vgrid_distribution.hpp:199
 
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::ViewAllocateWithoutInitializing NoInit
Definition: space_settings.hpp:69
 
Definition: vgrid_weights.hpp:7
 
double w_00
Definition: vgrid_weights.hpp:10
 
double w_10
Definition: vgrid_weights.hpp:12
 
double w_11
Definition: vgrid_weights.hpp:13
 
int i_vr
Definition: vgrid_weights.hpp:8
 
double w_01
Definition: vgrid_weights.hpp:11
 
int i_vz
Definition: vgrid_weights.hpp:9
 
Definition: velocity_grid.hpp:8
 
VGridDistributionOption
Definition: vgrid_distribution.hpp:12