diff options
Diffstat (limited to 'Source/Python/WarpXWrappers.cpp')
-rw-r--r-- | Source/Python/WarpXWrappers.cpp | 626 |
1 files changed, 2 insertions, 624 deletions
diff --git a/Source/Python/WarpXWrappers.cpp b/Source/Python/WarpXWrappers.cpp index 02cee52e0..44820dd1f 100644 --- a/Source/Python/WarpXWrappers.cpp +++ b/Source/Python/WarpXWrappers.cpp @@ -39,71 +39,6 @@ #include <array> #include <cstdlib> -namespace -{ - amrex::Real** getMultiFabPointers (amrex::MultiFab& mf, int *num_boxes, int *ncomps, int **ngrowvect, int **shapes) - { - *ncomps = mf.nComp(); - *num_boxes = mf.local_size(); - int shapesize = AMREX_SPACEDIM; - *ngrowvect = static_cast<int*>(malloc(sizeof(int)*shapesize)); - for (int j = 0; j < AMREX_SPACEDIM; ++j) { - (*ngrowvect)[j] = mf.nGrow(j); - } - if (mf.nComp() > 1) shapesize += 1; - *shapes = static_cast<int*>(malloc(sizeof(int)*shapesize * (*num_boxes))); - auto data = - static_cast<amrex::Real**>(malloc((*num_boxes) * sizeof(amrex::Real*))); - -#ifdef AMREX_USE_OMP -#pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) -#endif - for ( amrex::MFIter mfi(mf, false); mfi.isValid(); ++mfi ) { - const int i = mfi.LocalIndex(); - data[i] = mf[mfi].dataPtr(); - for (int j = 0; j < AMREX_SPACEDIM; ++j) { - (*shapes)[shapesize*i+j] = mf[mfi].box().length(j); - } - if (mf.nComp() > 1) (*shapes)[shapesize*i+AMREX_SPACEDIM] = mf.nComp(); - } - return data; - } - int* getMultiFabLoVects (const amrex::MultiFab& mf, int *num_boxes, int **ngrowvect) - { - const int shapesize = AMREX_SPACEDIM; - *ngrowvect = static_cast<int*>(malloc(sizeof(int)*shapesize)); - for (int j = 0; j < AMREX_SPACEDIM; ++j) { - (*ngrowvect)[j] = mf.nGrow(j); - } - *num_boxes = mf.local_size(); - auto loVects = static_cast<int*>(malloc((*num_boxes)*AMREX_SPACEDIM * sizeof(int))); - - int i = 0; - for ( amrex::MFIter mfi(mf, false); mfi.isValid(); ++mfi, ++i ) { - const int* loVect = mf[mfi].loVect(); - for (int j = 0; j < AMREX_SPACEDIM; ++j) { - loVects[AMREX_SPACEDIM*i+j] = loVect[j]; - } - } - return loVects; - } - // Copy the nodal flag data and return the copy: - // the nodal flag data should not be modifiable from Python. - int* getFieldNodalFlagData ( const amrex::MultiFab* mf ) - { - if (mf == nullptr) return nullptr; - const amrex::IntVect nodal_flag( mf->ixType().toIntVect() ); - auto *nodal_flag_data = static_cast<int*>(malloc(AMREX_SPACEDIM * sizeof(int))); - - constexpr int NODE = amrex::IndexType::NODE; - - for (int i=0 ; i < AMREX_SPACEDIM ; i++) { - nodal_flag_data[i] = (nodal_flag[i] == NODE ? 1 : 0); - } - return nodal_flag_data; - } -} - int warpx_Real_size() { return (int)sizeof(amrex::Real); @@ -130,85 +65,9 @@ namespace return WarpX::galerkin_interpolation; } - int warpx_nComps() - { - return PIdx::nattribs; - } - - int warpx_nCompsSpecies(const char* char_species_name) - { - auto & mypc = WarpX::GetInstance().GetPartContainer(); - const std::string species_name(char_species_name); - auto & myspc = mypc.GetParticleContainerFromName(species_name); - return myspc.NumRealComps(); - } - - int warpx_SpaceDim() - { - return AMREX_SPACEDIM; - } - - void amrex_init (int argc, char* argv[]) - { - warpx::initialization::amrex_init(argc, argv); - } - - void amrex_init_with_inited_mpi (int argc, char* argv[], MPI_Comm mpicomm) - { - warpx::initialization::amrex_init(argc, argv, true, mpicomm); - } - - void amrex_finalize (int /*finalize_mpi*/) - { - amrex::Finalize(); - } - - void warpx_init () - { - WarpX& warpx = WarpX::GetInstance(); - warpx.InitData(); - ExecutePythonCallback("afterinit"); - ExecutePythonCallback("particleloader"); - } - - void warpx_finalize () + void amrex_init_with_inited_mpi (int argc, char* argv[], MPI_Comm /* mpicomm */) { - WarpX::Finalize(); - } - - void warpx_set_callback_py ( - const char* char_callback_name, WARPX_CALLBACK_PY_FUNC_0 callback) - { - const std::string callback_name(char_callback_name); - warpx_callback_py_map[callback_name] = callback; - } - - void warpx_clear_callback_py (const char* char_callback_name) - { - const std::string callback_name(char_callback_name); - warpx_callback_py_map.erase(callback_name); - } - - void warpx_evolve (int numsteps) - { - WarpX& warpx = WarpX::GetInstance(); - warpx.Evolve(numsteps); - } - - void warpx_addNParticles( - const char* char_species_name, int lenx, amrex::ParticleReal const * x, - amrex::ParticleReal const * y, amrex::ParticleReal const * z, - amrex::ParticleReal const * vx, amrex::ParticleReal const * vy, - amrex::ParticleReal const * vz, const int nattr_real, - amrex::ParticleReal const * attr_real, const int nattr_int, - int const * attr_int, int uniqueparticles) - { - auto & mypc = WarpX::GetInstance().GetPartContainer(); - const std::string species_name(char_species_name); - auto & myspc = mypc.GetParticleContainerFromName(species_name); - const int lev = 0; - myspc.AddNParticles(lev, lenx, x, y, z, vx, vy, vz, nattr_real, attr_real, - nattr_int, attr_int, uniqueparticles); + warpx::initialization::amrex_init(argc, argv, true); } void warpx_ConvertLabParamsToBoost() @@ -226,340 +85,11 @@ namespace CheckGriddingForRZSpectral(); } - amrex::Real warpx_getProbLo(int dir) - { - WarpX& warpx = WarpX::GetInstance(); - const amrex::Geometry& geom = warpx.Geom(0); - return geom.ProbLo(dir); - } - - amrex::Real warpx_getProbHi(int dir) - { - WarpX& warpx = WarpX::GetInstance(); - const amrex::Geometry& geom = warpx.Geom(0); - return geom.ProbHi(dir); - } - amrex::Real warpx_getCellSize(int dir, int lev) { const std::array<amrex::Real,3>& dx = WarpX::CellSize(lev); return dx[dir]; } - long warpx_getNumParticles(const char* char_species_name, const bool local) { - const auto & mypc = WarpX::GetInstance().GetPartContainer(); - const std::string species_name(char_species_name); - auto & myspc = mypc.GetParticleContainerFromName(species_name); - // the first argument below is to only count valid particles - return myspc.TotalNumberOfParticles(true, local); - } - -#define WARPX_GET_FIELD(FIELD, GETTER) \ - amrex::Real** FIELD(int lev, int direction, \ - int *return_size, int *ncomps, int **ngrowvect, int **shapes) { \ - auto * mf = GETTER(lev, direction); \ - if (mf != nullptr) { \ - return getMultiFabPointers(*mf, return_size, ncomps, ngrowvect, shapes); \ - } else { \ - return nullptr; \ - } \ - } - -#define WARPX_GET_LOVECTS(FIELD, GETTER) \ - int* FIELD(int lev, int direction, \ - int *return_size, int **ngrowvect) { \ - auto * mf = GETTER(lev, direction); \ - if (mf != nullptr) { \ - return getMultiFabLoVects(*mf, return_size, ngrowvect); \ - } else { \ - return nullptr; \ - } \ - } - - WARPX_GET_FIELD(warpx_getEfield, WarpX::GetInstance().get_pointer_Efield_aux) - WARPX_GET_FIELD(warpx_getEfieldCP, WarpX::GetInstance().get_pointer_Efield_cp) - WARPX_GET_FIELD(warpx_getEfieldFP, WarpX::GetInstance().get_pointer_Efield_fp) - - WARPX_GET_FIELD(warpx_getBfield, WarpX::GetInstance().get_pointer_Bfield_aux) - WARPX_GET_FIELD(warpx_getBfieldCP, WarpX::GetInstance().get_pointer_Bfield_cp) - WARPX_GET_FIELD(warpx_getBfieldFP, WarpX::GetInstance().get_pointer_Bfield_fp) - - WARPX_GET_FIELD(warpx_getEdgeLengths, WarpX::GetInstance().get_pointer_edge_lengths) - WARPX_GET_FIELD(warpx_getFaceAreas, WarpX::GetInstance().get_pointer_face_areas) - - WARPX_GET_FIELD(warpx_getCurrentDensity, WarpX::GetInstance().get_pointer_current_fp) - WARPX_GET_FIELD(warpx_getCurrentDensityCP, WarpX::GetInstance().get_pointer_current_cp) - WARPX_GET_FIELD(warpx_getCurrentDensityFP, WarpX::GetInstance().get_pointer_current_fp) - - WARPX_GET_FIELD(warpx_getCurrentDensityFP_Ampere, WarpX::GetInstance().GetHybridPICModel().get_pointer_current_fp_ampere) - - WARPX_GET_FIELD(warpx_getVectorPotentialFP, WarpX::GetInstance().get_pointer_vector_potential_fp) - - WARPX_GET_LOVECTS(warpx_getEfieldLoVects, WarpX::GetInstance().get_pointer_Efield_aux) - WARPX_GET_LOVECTS(warpx_getEfieldCPLoVects, WarpX::GetInstance().get_pointer_Efield_cp) - WARPX_GET_LOVECTS(warpx_getEfieldFPLoVects, WarpX::GetInstance().get_pointer_Efield_fp) - - WARPX_GET_LOVECTS(warpx_getBfieldLoVects, WarpX::GetInstance().get_pointer_Bfield_aux) - WARPX_GET_LOVECTS(warpx_getBfieldCPLoVects, WarpX::GetInstance().get_pointer_Bfield_cp) - WARPX_GET_LOVECTS(warpx_getBfieldFPLoVects, WarpX::GetInstance().get_pointer_Bfield_fp) - - WARPX_GET_LOVECTS(warpx_getCurrentDensityLoVects, WarpX::GetInstance().get_pointer_current_fp) - WARPX_GET_LOVECTS(warpx_getCurrentDensityCPLoVects, WarpX::GetInstance().get_pointer_current_cp) - WARPX_GET_LOVECTS(warpx_getCurrentDensityFPLoVects, WarpX::GetInstance().get_pointer_current_fp) - WARPX_GET_LOVECTS(warpx_getVectorPotentialFPLoVects, WarpX::GetInstance().get_pointer_vector_potential_fp) - - WARPX_GET_LOVECTS(warpx_getEdgeLengthsLoVects, WarpX::GetInstance().get_pointer_edge_lengths) - WARPX_GET_LOVECTS(warpx_getFaceAreasLoVects, WarpX::GetInstance().get_pointer_face_areas) - - int* warpx_getEx_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_Efield_aux(0,0) );} - int* warpx_getEy_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_Efield_aux(0,1) );} - int* warpx_getEz_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_Efield_aux(0,2) );} - int* warpx_getBx_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_Bfield_aux(0,0) );} - int* warpx_getBy_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_Bfield_aux(0,1) );} - int* warpx_getBz_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_Bfield_aux(0,2) );} - int* warpx_getJx_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_current_fp(0,0) );} - int* warpx_getJy_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_current_fp(0,1) );} - int* warpx_getJz_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_current_fp(0,2) );} - int* warpx_getAx_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_vector_potential_fp(0,0) );} - int* warpx_getAy_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_vector_potential_fp(0,1) );} - int* warpx_getAz_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_vector_potential_fp(0,2) );} - int* warpx_getRho_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_rho_fp(0) );} - int* warpx_getPhi_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_phi_fp(0) );} - int* warpx_getF_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_F_fp(0) );} - int* warpx_getG_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_G_fp(0) );} - int* warpx_get_edge_lengths_x_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_edge_lengths(0, 0) );} - int* warpx_get_edge_lengths_y_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_edge_lengths(0, 1) );} - int* warpx_get_edge_lengths_z_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_edge_lengths(0, 2) );} - int* warpx_get_face_areas_x_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_face_areas(0, 0) );} - int* warpx_get_face_areas_y_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_face_areas(0, 1) );} - int* warpx_get_face_areas_z_nodal_flag() {return getFieldNodalFlagData( WarpX::GetInstance().get_pointer_face_areas(0, 2) );} - -#define WARPX_GET_SCALAR(SCALAR, GETTER) \ - amrex::Real** SCALAR(int lev, \ - int *return_size, int *ncomps, int **ngrowvect, int **shapes) { \ - auto * mf = GETTER(lev); \ - if (mf != nullptr) { \ - return getMultiFabPointers(*mf, return_size, ncomps, ngrowvect, shapes); \ - } else { \ - return nullptr; \ - } \ - } - -#define WARPX_GET_LOVECTS_SCALAR(SCALAR, GETTER) \ - int* SCALAR(int lev, \ - int *return_size, int **ngrowvect) { \ - auto * mf = GETTER(lev); \ - if (mf != nullptr) { \ - return getMultiFabLoVects(*mf, return_size, ngrowvect); \ - } else { \ - return nullptr; \ - } \ - } - - WARPX_GET_SCALAR(warpx_getChargeDensityCP, WarpX::GetInstance().get_pointer_rho_cp) - WARPX_GET_SCALAR(warpx_getChargeDensityFP, WarpX::GetInstance().get_pointer_rho_fp) - - WARPX_GET_LOVECTS_SCALAR(warpx_getChargeDensityCPLoVects, WarpX::GetInstance().get_pointer_rho_cp) - WARPX_GET_LOVECTS_SCALAR(warpx_getChargeDensityFPLoVects, WarpX::GetInstance().get_pointer_rho_fp) - - WARPX_GET_SCALAR(warpx_getPhiFP, WarpX::GetInstance().get_pointer_phi_fp) - - WARPX_GET_LOVECTS_SCALAR(warpx_getPhiFPLoVects, WarpX::GetInstance().get_pointer_phi_fp) - - // F and G - WARPX_GET_SCALAR(warpx_getFfieldCP, WarpX::GetInstance().get_pointer_F_cp) - WARPX_GET_SCALAR(warpx_getFfieldFP, WarpX::GetInstance().get_pointer_F_fp) - WARPX_GET_LOVECTS_SCALAR(warpx_getFfieldCPLoVects, WarpX::GetInstance().get_pointer_F_cp) - WARPX_GET_LOVECTS_SCALAR(warpx_getFfieldFPLoVects, WarpX::GetInstance().get_pointer_F_fp) - WARPX_GET_SCALAR(warpx_getGfieldCP, WarpX::GetInstance().get_pointer_G_cp) - WARPX_GET_SCALAR(warpx_getGfieldFP, WarpX::GetInstance().get_pointer_G_fp) - WARPX_GET_LOVECTS_SCALAR(warpx_getGfieldCPLoVects, WarpX::GetInstance().get_pointer_G_cp) - WARPX_GET_LOVECTS_SCALAR(warpx_getGfieldFPLoVects, WarpX::GetInstance().get_pointer_G_fp) - -#define WARPX_GET_FIELD_PML(FIELD, GETTER) \ - amrex::Real** FIELD(int lev, int direction, \ - int *return_size, int *ncomps, int **ngrowvect, int **shapes) { \ - auto * pml = WarpX::GetInstance().GetPML(lev); \ - if (!pml) return nullptr; \ - auto * mf = (pml->GETTER()[direction]); \ - if (!mf) return nullptr; \ - return getMultiFabPointers(*mf, return_size, ncomps, ngrowvect, shapes); \ - } - -#define WARPX_GET_LOVECTS_PML(FIELD, GETTER) \ - int* FIELD(int lev, int direction, \ - int *return_size, int **ngrowvect) { \ - auto * pml = WarpX::GetInstance().GetPML(lev); \ - if (!pml) return nullptr; \ - auto * mf = (pml->GETTER()[direction]); \ - if (!mf) return nullptr; \ - return getMultiFabLoVects(*mf, return_size, ngrowvect); \ - } - - WARPX_GET_FIELD_PML(warpx_getEfieldCP_PML, GetE_cp) - WARPX_GET_FIELD_PML(warpx_getEfieldFP_PML, GetE_fp) - WARPX_GET_FIELD_PML(warpx_getBfieldCP_PML, GetB_cp) - WARPX_GET_FIELD_PML(warpx_getBfieldFP_PML, GetB_fp) - WARPX_GET_FIELD_PML(warpx_getCurrentDensityCP_PML, Getj_cp) - WARPX_GET_FIELD_PML(warpx_getCurrentDensityFP_PML, Getj_fp) - WARPX_GET_LOVECTS_PML(warpx_getEfieldCPLoVects_PML, GetE_cp) - WARPX_GET_LOVECTS_PML(warpx_getEfieldFPLoVects_PML, GetE_fp) - WARPX_GET_LOVECTS_PML(warpx_getBfieldCPLoVects_PML, GetB_cp) - WARPX_GET_LOVECTS_PML(warpx_getBfieldFPLoVects_PML, GetB_fp) - WARPX_GET_LOVECTS_PML(warpx_getCurrentDensityCPLoVects_PML, Getj_cp) - WARPX_GET_LOVECTS_PML(warpx_getCurrentDensityFPLoVects_PML, Getj_fp) - -#define WARPX_GET_SCALAR_PML(SCALAR, GETTER) \ - amrex::Real** SCALAR(int lev, \ - int *return_size, int *ncomps, int **ngrowvect, int **shapes) { \ - auto * pml = WarpX::GetInstance().GetPML(lev); \ - if (!pml) return nullptr; \ - auto * mf = pml->GETTER(); \ - if (!mf) return nullptr; \ - return getMultiFabPointers(*mf, return_size, ncomps, ngrowvect, shapes); \ - } - -#define WARPX_GET_LOVECTS_PML_SCALAR(SCALAR, GETTER) \ - int* SCALAR(int lev, \ - int *return_size, int **ngrowvect) { \ - auto * pml = WarpX::GetInstance().GetPML(lev); \ - if (!pml) return nullptr; \ - auto * mf = pml->GETTER(); \ - if (!mf) return nullptr; \ - return getMultiFabLoVects(*mf, return_size, ngrowvect); \ - } - - // F and G - WARPX_GET_SCALAR_PML(warpx_getFfieldCP_PML, GetF_cp) - WARPX_GET_SCALAR_PML(warpx_getFfieldFP_PML, GetF_fp) - WARPX_GET_LOVECTS_PML_SCALAR(warpx_getFfieldCPLoVects_PML, GetF_cp) - WARPX_GET_LOVECTS_PML_SCALAR(warpx_getFfieldFPLoVects_PML, GetF_fp) - WARPX_GET_SCALAR_PML(warpx_getGfieldCP_PML, GetG_cp) - WARPX_GET_SCALAR_PML(warpx_getGfieldFP_PML, GetG_fp) - WARPX_GET_LOVECTS_PML_SCALAR(warpx_getGfieldCPLoVects_PML, GetG_cp) - WARPX_GET_LOVECTS_PML_SCALAR(warpx_getGfieldFPLoVects_PML, GetG_fp) - - int* warpx_getF_pml_nodal_flag () - { - auto * pml = WarpX::GetInstance().GetPML(0); - if (!pml) return nullptr; - return getFieldNodalFlagData(pml->GetF_fp()); - } - - int* warpx_getG_pml_nodal_flag () - { - auto * pml = WarpX::GetInstance().GetPML(0); - if (!pml) return nullptr; - return getFieldNodalFlagData(pml->GetG_fp()); - } - - amrex::ParticleReal** warpx_getParticleStructs( - const char* char_species_name, int lev, - int* num_tiles, int** particles_per_tile) { - const auto & mypc = WarpX::GetInstance().GetPartContainer(); - const std::string species_name(char_species_name); - auto & myspc = mypc.GetParticleContainerFromName(species_name); - - *num_tiles = myspc.numLocalTilesAtLevel(lev); - *particles_per_tile = static_cast<int*>(malloc(*num_tiles*sizeof(int))); - memset(*particles_per_tile, 0, *num_tiles*sizeof(int)); - - auto data = static_cast<amrex::ParticleReal**>(malloc(*num_tiles*sizeof(typename WarpXParticleContainer::ParticleType*))); - int i = 0; - for (WarpXParIter pti(myspc, lev); pti.isValid(); ++pti, ++i) { - auto& aos = pti.GetArrayOfStructs(); - data[i] = (amrex::ParticleReal*) aos.data(); - (*particles_per_tile)[i] = pti.numParticles(); - } - return data; - } - - amrex::ParticleReal** warpx_getParticleArrays ( - const char* char_species_name, const char* char_comp_name, - int lev, int* num_tiles, int** particles_per_tile ) { - - const auto & mypc = WarpX::GetInstance().GetPartContainer(); - const std::string species_name(char_species_name); - auto & myspc = mypc.GetParticleContainerFromName(species_name); - - const int comp = warpx_getParticleCompIndex(char_species_name, char_comp_name); - - *num_tiles = myspc.numLocalTilesAtLevel(lev); - *particles_per_tile = static_cast<int*>(malloc(*num_tiles*sizeof(int))); - memset(*particles_per_tile, 0, *num_tiles*sizeof(int)); - - auto data = static_cast<amrex::ParticleReal**>(malloc(*num_tiles*sizeof(amrex::ParticleReal*))); - int i = 0; - for (WarpXParIter pti(myspc, lev); pti.isValid(); ++pti, ++i) { - auto& soa = pti.GetStructOfArrays(); - data[i] = (amrex::ParticleReal*) soa.GetRealData(comp).dataPtr(); - (*particles_per_tile)[i] = pti.numParticles(); - } - return data; - } - - void warpx_convert_id_to_long (amrex::Long* ids, const WarpXParticleContainer::ParticleType* pstructs, int size) - { - amrex::Long* d_ptr = nullptr; -#ifdef AMREX_USE_GPU - amrex::Gpu::DeviceVector<amrex::Long> d_ids(size); - d_ptr = d_ids.data(); -#else - d_ptr = ids; -#endif - amrex::ParallelFor(size, [=] AMREX_GPU_DEVICE (int i) noexcept - { - d_ptr[i] = pstructs[i].id(); - }); -#ifdef AMREX_USE_GPU - amrex::Gpu::dtoh_memcpy(ids, d_ptr, size*sizeof(amrex::Long)); -#endif - } - - void warpx_convert_cpu_to_int (int* cpus, const WarpXParticleContainer::ParticleType* pstructs, int size) - { - int* d_ptr = nullptr; -#ifdef AMREX_USE_GPU - amrex::Gpu::DeviceVector<int> d_cpus(size); - d_ptr = d_cpus.data(); -#else - d_ptr = cpus; -#endif - amrex::ParallelFor(size, [=] AMREX_GPU_DEVICE (int i) noexcept - { - d_ptr[i] = pstructs[i].cpu(); - }); -#ifdef AMREX_USE_GPU - amrex::Gpu::dtoh_memcpy(cpus, d_ptr, size*sizeof(int)); -#endif - } - - int warpx_getParticleCompIndex ( - const char* char_species_name, const char* char_comp_name ) - { - const auto & mypc = WarpX::GetInstance().GetPartContainer(); - - const std::string species_name(char_species_name); - auto & myspc = mypc.GetParticleContainerFromName(species_name); - - const std::string comp_name(char_comp_name); - auto particle_comps = myspc.getParticleComps(); - - return particle_comps.at(comp_name); - } - - void warpx_addRealComp(const char* char_species_name, - const char* char_comp_name, bool comm=true) - { - auto & mypc = WarpX::GetInstance().GetPartContainer(); - const std::string species_name(char_species_name); - auto & myspc = mypc.GetParticleContainerFromName(species_name); - - const std::string comp_name(char_comp_name); - myspc.AddRealComp(comp_name, comm); - - mypc.defineAllParticleTiles(); - } - amrex::Real warpx_sumParticleCharge(const char* char_species_name, const bool local) { auto & mypc = WarpX::GetInstance().GetPartContainer(); @@ -568,117 +98,6 @@ namespace return myspc.sumParticleCharge(local); } - int warpx_getParticleBoundaryBufferSize(const char* species_name, int boundary, bool local) - { - const std::string name(species_name); - auto& particle_buffers = WarpX::GetInstance().GetParticleBoundaryBuffer(); - return particle_buffers.getNumParticlesInContainer(species_name, boundary, local); - } - - int** warpx_getParticleBoundaryBufferScrapedSteps(const char* species_name, int boundary, int lev, - int* num_tiles, int** particles_per_tile) - { - const std::string name(species_name); - auto& particle_buffers = WarpX::GetInstance().GetParticleBoundaryBuffer(); - auto& particle_buffer = particle_buffers.getParticleBuffer(species_name, boundary); - - const int comp = particle_buffer.NumIntComps() - 1; - - *num_tiles = particle_buffer.numLocalTilesAtLevel(lev); - *particles_per_tile = static_cast<int*>(malloc(*num_tiles*sizeof(int))); - memset(*particles_per_tile, 0, *num_tiles*sizeof(int)); - - auto data = static_cast<int**>(malloc(*num_tiles*sizeof(int*))); - int i = 0; - for (amrex::ParIter<0,0,PIdx::nattribs, 0, amrex::PinnedArenaAllocator> pti(particle_buffer, lev); pti.isValid(); ++pti, ++i) { - auto& soa = pti.GetStructOfArrays(); - data[i] = (int*) soa.GetIntData(comp).dataPtr(); - (*particles_per_tile)[i] = pti.numParticles(); - } - - return data; - } - - amrex::ParticleReal** warpx_getParticleBoundaryBuffer(const char* species_name, int boundary, int lev, - int* num_tiles, int** particles_per_tile, const char* comp_name) - { - const std::string name(species_name); - auto& particle_buffers = WarpX::GetInstance().GetParticleBoundaryBuffer(); - auto& particle_buffer = particle_buffers.getParticleBuffer(species_name, boundary); - - const int comp = warpx_getParticleCompIndex(species_name, comp_name); - - *num_tiles = particle_buffer.numLocalTilesAtLevel(lev); - *particles_per_tile = static_cast<int*>(malloc(*num_tiles*sizeof(int))); - memset(*particles_per_tile, 0, *num_tiles*sizeof(int)); - - auto data = static_cast<amrex::ParticleReal**>(malloc(*num_tiles*sizeof(amrex::ParticleReal*))); - int i = 0; - for (amrex::ParIter<0,0,PIdx::nattribs, 0, amrex::PinnedArenaAllocator> pti(particle_buffer, lev); pti.isValid(); ++pti, ++i) { - auto& soa = pti.GetStructOfArrays(); - data[i] = (amrex::ParticleReal*) soa.GetRealData(comp).dataPtr(); - (*particles_per_tile)[i] = pti.numParticles(); - } - - return data; - } - - amrex::ParticleReal** warpx_getParticleBoundaryBufferStructs(const char* species_name, int boundary, int lev, - int* num_tiles, int** particles_per_tile) - { - const std::string name(species_name); - auto& particle_buffers = WarpX::GetInstance().GetParticleBoundaryBuffer(); - auto& particle_buffer = particle_buffers.getParticleBuffer(species_name, boundary); - - *num_tiles = particle_buffer.numLocalTilesAtLevel(lev); - *particles_per_tile = static_cast<int*>(malloc(*num_tiles*sizeof(int))); - memset(*particles_per_tile, 0, *num_tiles*sizeof(int)); - - auto data = static_cast<amrex::ParticleReal**>(malloc(*num_tiles*sizeof(typename WarpXParticleContainer::ParticleType*))); - int i = 0; - for (amrex::ParIter<0,0,PIdx::nattribs, 0, amrex::PinnedArenaAllocator> pti(particle_buffer, lev); pti.isValid(); ++pti, ++i) { - auto& aos = pti.GetArrayOfStructs(); - data[i] = (amrex::ParticleReal*) aos.data(); - (*particles_per_tile)[i] = pti.numParticles(); - } - return data; - } - - void warpx_clearParticleBoundaryBuffer () { - auto& particle_buffers = WarpX::GetInstance().GetParticleBoundaryBuffer(); - particle_buffers.clearParticles(); - } - - void warpx_depositChargeDensity (const char* char_species_name, int lev) { - // this function is used to deposit a given species' charge density - // in the rho_fp multifab which can then be accessed from python via - // pywarpx.fields.RhoFPWrapper() - WarpX& warpx = WarpX::GetInstance(); - const auto & mypc = warpx.GetPartContainer(); - const std::string species_name(char_species_name); - auto & myspc = mypc.GetParticleContainerFromName(species_name); - auto * rho_fp = warpx.get_pointer_rho_fp(lev); - - if (rho_fp == nullptr) { - ablastr::warn_manager::WMRecordWarning( - "WarpXWrappers", "rho_fp is not allocated", - ablastr::warn_manager::WarnPriority::low - ); - return; - } - - for (WarpXParIter pti(myspc, lev); pti.isValid(); ++pti) - { - const long np = pti.numParticles(); - auto& wp = pti.GetAttribs(PIdx::w); - // Do this unconditionally, ignoring myspc.do_not_deposit, to support diagnostic uses - myspc.DepositCharge(pti, wp, nullptr, rho_fp, 0, 0, np, 0, lev, lev); - } -#ifdef WARPX_DIM_RZ - warpx.ApplyInverseVolumeScalingToChargeDensity(rho_fp, lev); -#endif - } - void warpx_ComputeDt () { WarpX& warpx = WarpX::GetInstance(); warpx.ComputeDt(); @@ -704,10 +123,6 @@ namespace WarpX& warpx = WarpX::GetInstance(); warpx.FillBoundaryB(warpx.getngEB()); } - void warpx_SyncRho () { - WarpX& warpx = WarpX::GetInstance(); - warpx.SyncRho(); - } void warpx_SyncCurrent ( const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp, const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp, @@ -724,18 +139,10 @@ namespace warpx.PushParticlesandDepose(cur_time); } - int warpx_getistep (int lev) { - const WarpX& warpx = WarpX::GetInstance(); - return warpx.getistep(lev); - } void warpx_setistep (int lev, int ii) { WarpX& warpx = WarpX::GetInstance(); warpx.setistep(lev, ii); } - amrex::Real warpx_gett_new (int lev) { - const WarpX& warpx = WarpX::GetInstance(); - return warpx.gett_new(lev); - } void warpx_sett_new (int lev, amrex::Real time) { WarpX& warpx = WarpX::GetInstance(); warpx.sett_new(lev, time); @@ -759,35 +166,6 @@ namespace return warpx.finestLevel(); } - int warpx_getMyProc () { - return amrex::ParallelDescriptor::MyProc(); - } - - int warpx_getNProcs () { - return amrex::ParallelDescriptor::NProcs(); - } - - void warpx_setPotentialEB (const char * char_potential) { - WarpX& warpx = WarpX::GetInstance(); - const std::string potential(char_potential); - warpx.m_poisson_boundary_handler.setPotentialEB(potential); - } - - void warpx_setPlasmaLensStrength (const int i_lens, const amrex::Real strength_E, const amrex::Real strength_B ) { - auto & mypc = WarpX::GetInstance().GetPartContainer(); - WARPX_ALWAYS_ASSERT_WITH_MESSAGE( i_lens >= mypc.h_repeated_plasma_lens_strengths_E.size(), - "i_lens is larger than the number of plasma lenses."); - mypc.h_repeated_plasma_lens_strengths_E[i_lens] = strength_E; - mypc.h_repeated_plasma_lens_strengths_B[i_lens] = strength_B; - amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, - mypc.h_repeated_plasma_lens_strengths_E.begin(), mypc.h_repeated_plasma_lens_strengths_E.end(), - mypc.d_repeated_plasma_lens_strengths_E.begin()); - amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, - mypc.h_repeated_plasma_lens_strengths_B.begin(), mypc.h_repeated_plasma_lens_strengths_B.end(), - mypc.d_repeated_plasma_lens_strengths_B.begin()); - amrex::Gpu::synchronize(); - } - void mypc_Redistribute () { auto & mypc = WarpX::GetInstance().GetPartContainer(); mypc.Redistribute(); |