diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/WarpX.H | 9 | ||||
-rw-r--r-- | Source/WarpX.cpp | 42 | ||||
-rw-r--r-- | Source/WarpXIO.cpp | 95 | ||||
-rw-r--r-- | Source/WarpXInitData.cpp | 1 | ||||
-rw-r--r-- | Source/WarpXUtil.cpp | 5 |
5 files changed, 100 insertions, 52 deletions
diff --git a/Source/WarpX.H b/Source/WarpX.H index 5678ac79f..08fe657b4 100644 --- a/Source/WarpX.H +++ b/Source/WarpX.H @@ -354,10 +354,18 @@ private: const std::array<const amrex::MultiFab*, 3>& B, const std::array<amrex::Real,3>& dx); + static void ComputeDivB (amrex::MultiFab& divB, int dcomp, + const std::array<const amrex::MultiFab*, 3>& B, + const std::array<amrex::Real,3>& dx, int ngrow); + static void ComputeDivE (amrex::MultiFab& divE, int dcomp, const std::array<const amrex::MultiFab*, 3>& B, const std::array<amrex::Real,3>& dx); + static void ComputeDivE (amrex::MultiFab& divE, int dcomp, + const std::array<const amrex::MultiFab*, 3>& B, + const std::array<amrex::Real,3>& dx, int ngrow); + void SyncCurrent (const std::array<const amrex::MultiFab*,3>& fine, const std::array< amrex::MultiFab*,3>& crse, int ref_ratio); @@ -593,6 +601,7 @@ private: int insitu_int; int insitu_start; std::string insitu_config; + int insitu_pin_mesh; }; #endif diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp index 181da6360..1828ebcec 100644 --- a/Source/WarpX.cpp +++ b/Source/WarpX.cpp @@ -463,11 +463,13 @@ WarpX::ReadParameters () insitu_start = 0; insitu_int = 0; insitu_config = ""; + insitu_pin_mesh = 0; ParmParse pp("insitu"); pp.query("int", insitu_int); pp.query("start", insitu_start); pp.query("config", insitu_config); + pp.query("pin_mesh", insitu_pin_mesh); } } @@ -843,6 +845,26 @@ WarpX::ComputeDivB (MultiFab& divB, int dcomp, } void +WarpX::ComputeDivB (MultiFab& divB, int dcomp, + const std::array<const MultiFab*, 3>& B, + const std::array<Real,3>& dx, int ngrow) +{ +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(divB, true); mfi.isValid(); ++mfi) + { + Box bx = mfi.growntilebox(ngrow); + WRPX_COMPUTE_DIVB(bx.loVect(), bx.hiVect(), + BL_TO_FORTRAN_N_ANYD(divB[mfi],dcomp), + BL_TO_FORTRAN_ANYD((*B[0])[mfi]), + BL_TO_FORTRAN_ANYD((*B[1])[mfi]), + BL_TO_FORTRAN_ANYD((*B[2])[mfi]), + dx.data()); + } +} + +void WarpX::ComputeDivE (MultiFab& divE, int dcomp, const std::array<const MultiFab*, 3>& E, const std::array<Real,3>& dx) @@ -863,6 +885,26 @@ WarpX::ComputeDivE (MultiFab& divE, int dcomp, } void +WarpX::ComputeDivE (MultiFab& divE, int dcomp, + const std::array<const MultiFab*, 3>& E, + const std::array<Real,3>& dx, int ngrow) +{ +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(divE, true); mfi.isValid(); ++mfi) + { + Box bx = mfi.growntilebox(ngrow); + WRPX_COMPUTE_DIVE(bx.loVect(), bx.hiVect(), + BL_TO_FORTRAN_N_ANYD(divE[mfi],dcomp), + BL_TO_FORTRAN_ANYD((*E[0])[mfi]), + BL_TO_FORTRAN_ANYD((*E[1])[mfi]), + BL_TO_FORTRAN_ANYD((*E[2])[mfi]), + dx.data()); + } +} + +void WarpX::applyFilter (MultiFab& dstmf, const MultiFab& srcmf, int scomp, int dcomp, int ncomp) { ncomp = std::min(ncomp, srcmf.nComp()); diff --git a/Source/WarpXIO.cpp b/Source/WarpXIO.cpp index 70985ac7e..93a359d7c 100644 --- a/Source/WarpXIO.cpp +++ b/Source/WarpXIO.cpp @@ -488,11 +488,11 @@ WarpX::UpdateInSitu () const Vector<const MultiFab*> srcmf(AMREX_SPACEDIM); PackPlotDataPtrs(srcmf, current_fp[lev]); int dcomp = 0; - amrex::average_edge_to_cellcenter(mf[lev], dcomp, srcmf); + amrex::average_edge_to_cellcenter(mf[lev], dcomp, srcmf, ngrow); #if (AMREX_SPACEDIM == 2) MultiFab::Copy(mf[lev], mf[lev], dcomp+1, dcomp+2, 1, ngrow); - amrex::average_node_to_cellcenter(mf[lev], dcomp+1, *current_fp[lev][1], 0, 1); + amrex::average_node_to_cellcenter(mf[lev], dcomp+1, *current_fp[lev][1], 0, 1, ngrow); #endif if (lev == 0) { @@ -503,10 +503,10 @@ WarpX::UpdateInSitu () const dcomp += 3; PackPlotDataPtrs(srcmf, Efield_aux[lev]); - amrex::average_edge_to_cellcenter(mf[lev], dcomp, srcmf); + amrex::average_edge_to_cellcenter(mf[lev], dcomp, srcmf, ngrow); #if (AMREX_SPACEDIM == 2) MultiFab::Copy(mf[lev], mf[lev], dcomp+1, dcomp+2, 1, ngrow); - amrex::average_node_to_cellcenter(mf[lev], dcomp+1, *Efield_aux[lev][1], 0, 1); + amrex::average_node_to_cellcenter(mf[lev], dcomp+1, *Efield_aux[lev][1], 0, 1, ngrow); #endif if (lev == 0) { @@ -517,10 +517,10 @@ WarpX::UpdateInSitu () const dcomp += 3; PackPlotDataPtrs(srcmf, Bfield_aux[lev]); - amrex::average_face_to_cellcenter(mf[lev], dcomp, srcmf); + amrex::average_face_to_cellcenter(mf[lev], dcomp, srcmf, ngrow); #if (AMREX_SPACEDIM == 2) MultiFab::Copy(mf[lev], mf[lev], dcomp+1, dcomp+2, 1, ngrow); - MultiFab::Copy(mf[lev], *Bfield_aux[lev][1], 0, dcomp+1, 1, ngrow); + MultiFab::Copy(mf[lev], *Bfield_aux[lev][1], 0, dcomp+1, 1, ngrow); #endif if (lev == 0) { @@ -532,16 +532,14 @@ WarpX::UpdateInSitu () const if (plot_part_per_cell) { - MultiFab temp_dat(grids[lev],mf[lev].DistributionMap(),1,0); - temp_dat.setVal(0); + MultiFab temp_dat(grids[lev], mf[lev].DistributionMap(), 1, ngrow); + temp_dat.setVal(0, ngrow); // MultiFab containing number of particles in each cell mypc->Increment(temp_dat, lev); - MultiFab::Copy(mf[lev], temp_dat, 0, dcomp, 1, 0); + MultiFab::Copy(mf[lev], temp_dat, 0, dcomp, 1, ngrow); if (lev == 0) - { varnames.push_back("part_per_cell"); - } dcomp += 1; } @@ -554,14 +552,13 @@ WarpX::UpdateInSitu () const #ifdef _OPENMP #pragma omp parallel #endif - for (MFIter mfi(mf[lev]); mfi.isValid(); ++mfi) { - (mf[lev])[mfi].setVal(static_cast<Real>(npart_in_grid[mfi.index()]), dcomp); - } - if (lev == 0) - { - varnames.push_back("part_per_grid"); - } - dcomp += 1; + for (MFIter mfi(mf[lev]); mfi.isValid(); ++mfi) + (mf[lev])[mfi].setVal(static_cast<Real>(npart_in_grid[mfi.index()]), dcomp); + + if (lev == 0) + varnames.push_back("part_per_grid"); + + dcomp += 1; } if (plot_part_per_proc) @@ -570,30 +567,30 @@ WarpX::UpdateInSitu () const #ifdef _OPENMP #pragma omp parallel reduction(+:n_per_proc) #endif - for (MFIter mfi(mf[lev]); mfi.isValid(); ++mfi) { + for (MFIter mfi(mf[lev]); mfi.isValid(); ++mfi) n_per_proc += npart_in_grid[mfi.index()]; - } - mf[lev].setVal(static_cast<Real>(n_per_proc), dcomp,1); + + mf[lev].setVal(static_cast<Real>(n_per_proc), dcomp, ngrow); + if (lev == 0) - { varnames.push_back("part_per_proc"); - } + dcomp += 1; } } if (plot_proc_number) { + Real procid = static_cast<Real>(ParallelDescriptor::MyProc()); #ifdef _OPENMP #pragma omp parallel #endif - for (MFIter mfi(mf[lev]); mfi.isValid(); ++mfi) { - (mf[lev])[mfi].setVal(static_cast<Real>(ParallelDescriptor::MyProc()), dcomp); - } + for (MFIter mfi(mf[lev]); mfi.isValid(); ++mfi) + (mf[lev])[mfi].setVal(procid, dcomp); + if (lev == 0) - { varnames.push_back("proc_number"); - } + dcomp += 1; } @@ -601,56 +598,56 @@ WarpX::UpdateInSitu () const { ComputeDivB(mf[lev], dcomp, {Bfield_aux[lev][0].get(),Bfield_aux[lev][1].get(),Bfield_aux[lev][2].get()}, - WarpX::CellSize(lev)); + WarpX::CellSize(lev), ngrow); if (lev == 0) - { varnames.push_back("divB"); - } + dcomp += 1; } if (plot_dive) { const BoxArray& ba = amrex::convert(boxArray(lev),IntVect::TheUnitVector()); - MultiFab dive(ba,DistributionMap(lev),1,0); + MultiFab dive(ba, DistributionMap(lev), 1, ngrow); + ComputeDivE(dive, 0, {Efield_aux[lev][0].get(), Efield_aux[lev][1].get(), Efield_aux[lev][2].get()}, - WarpX::CellSize(lev)); - amrex::average_node_to_cellcenter(mf[lev], dcomp, dive, 0, 1); + WarpX::CellSize(lev), ngrow); + + amrex::average_node_to_cellcenter(mf[lev], dcomp, dive, 0, 1, ngrow); + if (lev == 0) - { varnames.push_back("divE"); - } + dcomp += 1; } if (plot_rho) { - amrex::average_node_to_cellcenter(mf[lev], dcomp, *rho_fp[lev], 0, 1); + amrex::average_node_to_cellcenter(mf[lev], dcomp, *rho_fp[lev], 0, 1, ngrow); if (lev == 0) - { varnames.push_back("rho"); - } + dcomp += 1; } if (plot_F) { - amrex::average_node_to_cellcenter(mf[lev], dcomp, *F_fp[lev], 0, 1); + amrex::average_node_to_cellcenter(mf[lev], dcomp, *F_fp[lev], 0, 1, ngrow); + if (lev == 0) - { varnames.push_back("F"); - } + dcomp += 1; } if (plot_finepatch) { PackPlotDataPtrs(srcmf, Efield_fp[lev]); - amrex::average_edge_to_cellcenter(mf[lev], dcomp, srcmf); + amrex::average_edge_to_cellcenter(mf[lev], dcomp, srcmf, ngrow); #if (AMREX_SPACEDIM == 2) MultiFab::Copy(mf[lev], mf[lev], dcomp+1, dcomp+2, 1, ngrow); - amrex::average_node_to_cellcenter(mf[lev], dcomp+1, *Efield_fp[lev][1], 0, 1); + amrex::average_node_to_cellcenter(mf[lev], dcomp+1, *Efield_fp[lev][1], 0, 1, ngrow); #endif if (lev == 0) { @@ -661,7 +658,7 @@ WarpX::UpdateInSitu () const dcomp += 3; PackPlotDataPtrs(srcmf, Bfield_fp[lev]); - amrex::average_face_to_cellcenter(mf[lev], dcomp, srcmf); + amrex::average_face_to_cellcenter(mf[lev], dcomp, srcmf, ngrow); #if (AMREX_SPACEDIM == 2) MultiFab::Copy(mf[lev], mf[lev], dcomp+1, dcomp+2, 1, ngrow); MultiFab::Copy(mf[lev], *Bfield_fp[lev][1], 0, dcomp+1, 1, ngrow); @@ -686,10 +683,10 @@ WarpX::UpdateInSitu () const { std::array<std::unique_ptr<MultiFab>, 3> E = getInterpolatedE(lev); PackPlotDataPtrs(srcmf, E); - amrex::average_edge_to_cellcenter(mf[lev], dcomp, srcmf); + amrex::average_edge_to_cellcenter(mf[lev], dcomp, srcmf, ngrow); #if (AMREX_SPACEDIM == 2) MultiFab::Copy(mf[lev], mf[lev], dcomp+1, dcomp+2, 1, ngrow); - amrex::average_node_to_cellcenter(mf[lev], dcomp+1, *E[1], 0, 1); + amrex::average_node_to_cellcenter(mf[lev], dcomp+1, *E[1], 0, 1, ngrow); #endif } if (lev == 0) @@ -709,7 +706,7 @@ WarpX::UpdateInSitu () const { std::array<std::unique_ptr<MultiFab>, 3> B = getInterpolatedB(lev); PackPlotDataPtrs(srcmf, B); - amrex::average_face_to_cellcenter(mf[lev], dcomp, srcmf); + amrex::average_face_to_cellcenter(mf[lev], dcomp, srcmf, ngrow); #if (AMREX_SPACEDIM == 2) MultiFab::Copy(mf[lev], mf[lev], dcomp+1, dcomp+2, 1, ngrow); MultiFab::Copy(mf[lev], *B[1], 0, dcomp+1, 1, ngrow); diff --git a/Source/WarpXInitData.cpp b/Source/WarpXInitData.cpp index 101331e38..496b14e7a 100644 --- a/Source/WarpXInitData.cpp +++ b/Source/WarpXInitData.cpp @@ -50,6 +50,7 @@ WarpX::InitData () insitu_bridge = new amrex::AmrMeshInSituBridge; insitu_bridge->setEnabled(insitu_int > 0 ? 1 : 0); insitu_bridge->setConfig(insitu_config); + insitu_bridge->setPinMesh(insitu_pin_mesh); if (insitu_bridge->initialize()) { amrex::ErrorStream() diff --git a/Source/WarpXUtil.cpp b/Source/WarpXUtil.cpp index eb0eec92b..4a884330a 100644 --- a/Source/WarpXUtil.cpp +++ b/Source/WarpXUtil.cpp @@ -38,9 +38,8 @@ void ReadBoostedFrameParameters(Real& gamma_boost, Real& beta_boost, void ConvertLabParamsToBoost() { - - Real gamma_boost, beta_boost; - int max_level; + Real gamma_boost = 1., beta_boost = 0.; + int max_level = 0; Vector<int> boost_direction {0,0,0}; ReadBoostedFrameParameters(gamma_boost, beta_boost, boost_direction); |