aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/WarpX.H9
-rw-r--r--Source/WarpX.cpp42
-rw-r--r--Source/WarpXIO.cpp95
-rw-r--r--Source/WarpXInitData.cpp1
-rw-r--r--Source/WarpXUtil.cpp5
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);