15 #ifndef VELOCITY_INTERPOLATE_HPP
16 #define VELOCITY_INTERPOLATE_HPP
17 #include <Kokkos_Core.hpp>
24 #include <petscversion.h>
26 #include <petscdmplex.h>
27 #if PETSC_VERSION_GE(3,14,0)
29 #include "petscdmswarm.h"
45 template<
class Device>
52 Kokkos::View<PseudoInversePetscObjects*, Kokkos::LayoutRight, HostType>
obj;
56 Kokkos::View<double***, Kokkos::LayoutRight, Device>
ptl_coords;
57 Kokkos::View<double***, Kokkos::LayoutRight, Kokkos::HostSpace>
ptl_coords_h;
59 Kokkos::View<double***, Kokkos::LayoutRight, Device>
ptl_weights;
60 Kokkos::View<double***, Kokkos::LayoutRight, Kokkos::HostSpace>
ptl_weights_h;
65 Kokkos::View<int***, Kokkos::LayoutRight, Device>
ptl_indices;
66 Kokkos::View<int***, Kokkos::LayoutRight, Kokkos::HostSpace>
ptl_indices_h;
68 Kokkos::View<int**, Kokkos::LayoutRight, Device>
n_ptl;
69 Kokkos::View<int**, Kokkos::LayoutRight, Kokkos::HostSpace>
n_ptl_h;
71 Kokkos::View<double***, Kokkos::LayoutRight, Device>
grid_coords;
72 Kokkos::View<double***, Kokkos::LayoutRight, Kokkos::HostSpace>
grid_coords_h;
75 Kokkos::View<double***, Kokkos::LayoutRight, Kokkos::HostSpace>
grid_weights_h;
113 Kokkos::resize(
obj, 0);
122 Kokkos::resize(
obj, nthreads);
124 Kokkos::resize(
ptl_coords, n_non_ad, nnode, 2*max_n_ptl_on_node);
125 Kokkos::resize(
ptl_coords_h, n_non_ad, nnode, 2*max_n_ptl_on_node);
126 Kokkos::resize(
ptl_weights, n_non_ad, nnode, max_n_ptl_on_node);
127 Kokkos::resize(
ptl_weights_h, n_non_ad, nnode, max_n_ptl_on_node);
130 Kokkos::resize(
ptl_indices, n_non_ad, nnode, max_n_ptl_on_node);
131 Kokkos::resize(
ptl_indices_h, n_non_ad, nnode, max_n_ptl_on_node);
132 Kokkos::resize(
n_ptl, n_non_ad, nnode);
133 Kokkos::resize(
n_ptl_h, n_non_ad, nnode);
134 Kokkos::resize(
grid_coords, n_non_ad, nnode, 2*n_grid_points);
135 Kokkos::resize(
grid_coords_h, n_non_ad, nnode, 2*n_grid_points);
136 Kokkos::resize(
grid_weights, n_non_ad, nnode, n_grid_points);
147 Kokkos::resize(
obj, 0);
157 Kokkos::resize(
n_ptl, 0, 0);
217 void set_vgrid_filled(Kokkos::View<bool**,Kokkos::LayoutRight,DeviceType> vgrid_filled_in){
231 Kokkos::View<PetscReal*, Kokkos::LayoutRight, Kokkos::HostSpace> particle_coords,
232 Kokkos::View<PetscReal*, Kokkos::LayoutRight, Kokkos::HostSpace> particle_weights,
233 const PetscInt Nparticles,
const PetscInt Nspecies,
234 Kokkos::View<PetscReal*, Kokkos::LayoutRight, Kokkos::HostSpace> grid_coords,
235 Kokkos::View<PetscReal*, Kokkos::LayoutRight, Kokkos::HostSpace> grid_weights);
242 const PetscInt thread_id,
const PetscInt target_id,
243 Kokkos::View<PetscReal*, Kokkos::LayoutRight, Kokkos::HostSpace> particle_coords,
244 Kokkos::View<PetscReal*, Kokkos::LayoutRight, Kokkos::HostSpace> particle_weights,
245 const PetscInt Nparticles,
246 Vec rho, Mat *Mp_out);
250 Kokkos::View<PetscReal*, Kokkos::LayoutRight, Kokkos::HostSpace> grid_weights,
251 const PetscInt Ngrid, Vec rho, Vec rhs);
255 Vec rhs, Mat M_p, Mat PM_p,
256 const PetscInt Ngrid,
257 const PetscInt Nparticles,
258 const PetscInt order,
259 Kokkos::View<PetscReal*, Kokkos::LayoutRight, Kokkos::HostSpace> particle_weights,
260 bool &ksp_converged);
291 const std::string &msg,
292 Kokkos::View<bool**,Kokkos::LayoutRight,DeviceType> vgrid_filled);
295 return (pseudo_inv.
n_ptl(isp_non_ad, node) > 0 && (pseudo_inv.
vgrid_filled(isp_non_ad, node) || pseudo_inv.
force));
void send_host_to_device()
Definition: velocity_interpolate.hpp:190
Kokkos::View< double ***, Kokkos::LayoutRight, Device > grid_weights
Stores velocity grid weights: weight(non-adiabatic species, node, grid point index) ...
Definition: velocity_interpolate.hpp:74
Kokkos::View< double ***, Kokkos::LayoutRight, Kokkos::HostSpace > ptl_weights_h
host version of ptl_weights
Definition: velocity_interpolate.hpp:60
For description see source file.
Definition: velocity_interpolate.hpp:46
Kokkos::View< int **, Kokkos::LayoutRight, Device > n_ptl
Stores number of particles (non-adiabatic species, node)
Definition: velocity_interpolate.hpp:68
Definition: velocity_grid.hpp:7
subroutine plasma(grid, itr, p, dene_out, deni_out, Te_out, Ti_out, Vparai_out)
Calculate the plasma density, temperature, and parallel velocity for a point in triangle itr using pl...
Definition: neutral_totalf.F90:1235
Kokkos::View< int ***, Kokkos::LayoutRight, Kokkos::HostSpace > ptl_indices_h
host version of ptl_indices
Definition: velocity_interpolate.hpp:66
bool use_delta_grid
Whether to only map delta-grid weights.
Definition: velocity_interpolate.hpp:86
PetscErrorCode pseudo_inv_create_projection(const DM dm, DM sw, const PetscInt thread_id, const PetscInt target_id, Kokkos::View< PetscReal *, Kokkos::LayoutRight, Kokkos::HostSpace > particle_coords, Kokkos::View< PetscReal *, Kokkos::LayoutRight, Kokkos::HostSpace > particle_weights, const PetscInt Nparticles, Vec rho, Mat *Mp_out)
For description see source file.
Definition: velocity_interpolate.cpp:344
Definition: DM_wrapper.hpp:38
Kokkos::View< int **, Kokkos::LayoutRight, Kokkos::HostSpace > n_ptl_h
host version of n_ptl
Definition: velocity_interpolate.hpp:69
Definition: magnetic_field.hpp:12
void pseudo_inv_allocate(const Simulation< DeviceType > &sml, const Grid< DeviceType > &grid, const MagneticField< DeviceType > &magnetic_field, Plasma &plasma, const VelocityGrid &vgrid, const DomainDecomposition< DeviceType > &pol_decomp, Pseudo_inverse< DeviceType > &pseudo_inv)
< For description see source file
Definition: velocity_interpolate.cpp:715
Vec rho
PETSc helper vector.
Definition: velocity_interpolate.hpp:39
void resize_to_zero()
Definition: velocity_interpolate.hpp:145
Mat M_p
PETSc projection matrix.
Definition: velocity_interpolate.hpp:41
Kokkos::View< double ***, Kokkos::LayoutRight, Device > grid_alpha_weights
Stores velocity grid alpha (see sml_f0_grid_alpha) weights: weight(non-adiabatic species, node, grid point index)
Definition: velocity_interpolate.hpp:77
Kokkos::View< bool **, Kokkos::LayoutRight, Device > vgrid_filled
Stores whether a node has no empty velocity cells (non-adiabatic species, node)
Definition: velocity_interpolate.hpp:80
Kokkos::View< double ***, Kokkos::LayoutRight, Device > grid_coords
Stores velocity grid coordinates: v_para(non-adiabatic species, node, 2*(grid point index)); v_perp(n...
Definition: velocity_interpolate.hpp:71
Kokkos::View< double ***, Kokkos::LayoutRight, Device > ptl_alpha_weights
Stores particle alpha (see sml_f0_grid_alpha) weights: weight(non-adiabatic species, node, particle index on node)
Definition: velocity_interpolate.hpp:62
void resize_on_device_and_host(int nthreads, int n_non_ad, int nnode, int max_n_ptl_on_node, int n_grid_points)
Definition: velocity_interpolate.hpp:120
Kokkos::View< double ***, Kokkos::LayoutRight, Device > ptl_weights
Stores particle weights: weight(non-adiabatic species, node, particle index on node) ...
Definition: velocity_interpolate.hpp:59
Kokkos::View< int ***, Kokkos::LayoutRight, Device > ptl_indices
Stores particle indices: index(non-adiabatic species, node, particle index on node) ...
Definition: velocity_interpolate.hpp:65
bool force
Whether to force pseudo-inverse even if a node has empty velocity cells.
Definition: velocity_interpolate.hpp:84
PetscErrorCode pseudo_inv_set_rhs(const DM dm, Mat MM, Kokkos::View< PetscReal *, Kokkos::LayoutRight, Kokkos::HostSpace > grid_weights, const PetscInt Ngrid, Vec rho, Vec rhs)
For description see source file.
Definition: velocity_interpolate.cpp:432
bool do_particles_to_grid_petsc
Whether the particles -> velocity grid interpolation should be done without or with (probably slower)...
Definition: velocity_interpolate.hpp:85
void resize_alpha_weights_to_zero()
Definition: velocity_interpolate.hpp:170
bool pseudo_inv_do_node_h(Pseudo_inverse< DeviceType > &pseudo_inv, int isp_non_ad, int node)
Definition: velocity_interpolate.hpp:298
Kokkos::View< double ***, Kokkos::LayoutRight, Kokkos::HostSpace > ptl_coords_h
host version of ptl_coords
Definition: velocity_interpolate.hpp:57
DM swarm
PETSc particle swarm object.
Definition: velocity_interpolate.hpp:38
Kokkos::View< double ***, Kokkos::LayoutRight, Kokkos::HostSpace > grid_alpha_weights_h
host version of grid_alpha_weights
Definition: velocity_interpolate.hpp:78
Pseudo_inverse()
Definition: velocity_interpolate.hpp:89
Kokkos::View< bool **, Kokkos::LayoutRight, Kokkos::HostSpace > vgrid_filled_h
host version of vgrid_filled
Definition: velocity_interpolate.hpp:81
void send_grid_host_to_device()
Definition: velocity_interpolate.hpp:211
Definition: velocity_interpolate.hpp:37
void zero_out_grid_weights()
Definition: velocity_interpolate.hpp:222
Kokkos::View< double ***, Kokkos::LayoutRight, Device > ptl_coords
Stores particle velocity coordinates: v_para(non-adiabatic species, node, 2*(particle index on node))...
Definition: velocity_interpolate.hpp:56
PetscInt pseudo_inverse_interpolate_particles_to_velocity_grid(const DM &dm, Kokkos::View< PetscReal *, Kokkos::LayoutRight, Kokkos::HostSpace > particle_coords, Kokkos::View< PetscReal *, Kokkos::LayoutRight, Kokkos::HostSpace > particle_weights, const PetscInt Nparticles, const PetscInt Nspecies, Kokkos::View< PetscReal *, Kokkos::LayoutRight, Kokkos::HostSpace > grid_coords, Kokkos::View< PetscReal *, Kokkos::LayoutRight, Kokkos::HostSpace > grid_weights)
For description see source file.
Definition: velocity_interpolate.cpp:161
Definition: magnetic_field.F90:1
PetscErrorCode pseudo_inv_create_Swarm(const DM dm, DM *sw)
For description see source file.
Definition: velocity_interpolate.cpp:301
PetscErrorCode pseudo_inv_grid_to_particles(const DM dm, DM sw, Vec rhs, Mat M_p, Mat PM_p, const PetscInt Ngrid, const PetscInt Nparticles, const PetscInt order, Kokkos::View< PetscReal *, Kokkos::LayoutRight, Kokkos::HostSpace > particle_weights, bool &ksp_converged)
Definition: velocity_interpolate.cpp:504
Definition: plasma.hpp:15
Vec rhs
PETSc right-hand side vector.
Definition: velocity_interpolate.hpp:40
int expected_n_grid_points
Expected number of grid points returned from PETSc.
Definition: velocity_interpolate.hpp:83
void all_species_update_pseudo_inv_weights(const Simulation< DeviceType > &sml, const Grid< DeviceType > &grid, const MagneticField< DeviceType > &magnetic_field, Plasma &plasma, const VelocityGrid &vgrid, const DomainDecomposition< DeviceType > &pol_decomp, DMWrapper &pseudo_inv_dm, Pseudo_inverse< DeviceType > &pseudo_inv)
For description see source file.
Definition: velocity_interpolate.cpp:761
Kokkos::View< double ***, Kokkos::LayoutRight, Kokkos::HostSpace > grid_weights_h
host version of grid_weights
Definition: velocity_interpolate.hpp:75
void set_vgrid_filled(Kokkos::View< bool **, Kokkos::LayoutRight, DeviceType > vgrid_filled_in)
Definition: velocity_interpolate.hpp:217
void send_device_to_host()
Definition: velocity_interpolate.hpp:178
KOKKOS_INLINE_FUNCTION bool pseudo_inv_do_node(const Pseudo_inverse< Device > &pseudo_inv, int isp_non_ad, int node)
Definition: velocity_interpolate.hpp:294
void send_ptl_device_to_host()
Definition: velocity_interpolate.hpp:202
Kokkos::View< PseudoInversePetscObjects *, Kokkos::LayoutRight, HostType > obj
Stores #threads PseudoInversePetscObjects.
Definition: velocity_interpolate.hpp:52
int max_n_ptl_on_node_and_vgrid_filled(const Simulation< DeviceType > &sml, const Grid< DeviceType > &grid, const MagneticField< DeviceType > &magnetic_field, Plasma &plasma, const VelocityGrid &vgrid, const DomainDecomposition< DeviceType > &pol_decomp, const std::string &msg, Kokkos::View< bool **, Kokkos::LayoutRight, DeviceType > vgrid_filled)
Definition: velocity_interpolate.cpp:963
Kokkos::View< double ***, Kokkos::LayoutRight, Kokkos::HostSpace > ptl_alpha_weights_h
host version of ptl_alpha_weights
Definition: velocity_interpolate.hpp:63
Kokkos::View< double ***, Kokkos::LayoutRight, Kokkos::HostSpace > grid_coords_h
host version of grid_coords
Definition: velocity_interpolate.hpp:72