diff options
Diffstat (limited to 'Source/Initialization/WarpXInitData.cpp')
-rw-r--r-- | Source/Initialization/WarpXInitData.cpp | 111 |
1 files changed, 22 insertions, 89 deletions
diff --git a/Source/Initialization/WarpXInitData.cpp b/Source/Initialization/WarpXInitData.cpp index 385993f78..29c9a8955 100644 --- a/Source/Initialization/WarpXInitData.cpp +++ b/Source/Initialization/WarpXInitData.cpp @@ -82,21 +82,23 @@ WarpX::InitData () void WarpX::InitDiagnostics () { - if (do_boosted_frame_diagnostic) { + if (do_back_transformed_diagnostics) { const Real* current_lo = geom[0].ProbLo(); const Real* current_hi = geom[0].ProbHi(); Real dt_boost = dt[0]; - // Find the positions of the lab-frame box that corresponds to the boosted-frame box at t=0 Real zmin_lab = current_lo[moving_window_dir]/( (1.+beta_boost)*gamma_boost ); Real zmax_lab = current_hi[moving_window_dir]/( (1.+beta_boost)*gamma_boost ); - - myBFD.reset(new BoostedFrameDiagnostic(zmin_lab, + myBFD.reset(new BackTransformedDiagnostic(zmin_lab, zmax_lab, moving_window_v, dt_snapshots_lab, - num_snapshots_lab, gamma_boost, - t_new[0], dt_boost, - moving_window_dir, geom[0])); + num_snapshots_lab, + dt_slice_snapshots_lab, + num_slice_snapshots_lab, + gamma_boost, t_new[0], dt_boost, + moving_window_dir, geom[0], + slice_realbox, + particle_slice_width_lab)); } } @@ -110,9 +112,13 @@ WarpX::InitFromScratch () mypc->AllocData(); mypc->InitData(); -#ifdef USE_OPENBC_POISSON - InitOpenbc(); -#endif + // Loop through species and calculate their space-charge field + for (int ispecies=0; ispecies<mypc->nSpecies(); ispecies++){ + WarpXParticleContainer& species = mypc->GetParticleContainer(ispecies); + if (species.initialize_self_fields) { + InitSpaceChargeField(species); + } + } InitPML(); @@ -225,96 +231,23 @@ WarpX::PostRestart () mypc->PostRestart(); } -#ifdef USE_OPENBC_POISSON -void -WarpX::InitOpenbc () -{ -#ifndef BL_USE_MPI - static_assert(false, "must use MPI"); -#endif - - static_assert(AMREX_SPACEDIM == 3, "Openbc is 3D only"); - BL_ASSERT(finestLevel() == 0); - - const int lev = 0; - - const Geometry& gm = Geom(lev); - const Box& gbox = gm.Domain(); - int lohi[6]; - warpx_openbc_decompose(gbox.loVect(), gbox.hiVect(), lohi, lohi+3); - - int nprocs = ParallelDescriptor::NProcs(); - int myproc = ParallelDescriptor::MyProc(); - Vector<int> alllohi(6*nprocs,100000); - - MPI_Allgather(lohi, 6, MPI_INT, alllohi.data(), 6, MPI_INT, ParallelDescriptor::Communicator()); - - BoxList bl{IndexType::TheNodeType()}; - for (int i = 0; i < nprocs; ++i) - { - bl.push_back(Box(IntVect(alllohi[6*i ],alllohi[6*i+1],alllohi[6*i+2]), - IntVect(alllohi[6*i+3],alllohi[6*i+4],alllohi[6*i+5]), - IndexType::TheNodeType())); - } - BoxArray ba{bl}; - - Vector<int> iprocmap(nprocs+1); - std::iota(iprocmap.begin(), iprocmap.end(), 0); - iprocmap.back() = myproc; - - DistributionMapping dm{iprocmap}; - - MultiFab rho_openbc(ba, dm, 1, 0); - MultiFab phi_openbc(ba, dm, 1, 0); - - bool local = true; - const std::unique_ptr<MultiFab>& rho = mypc->GetChargeDensity(lev, local); - - rho_openbc.setVal(0.0); - rho_openbc.copy(*rho, 0, 0, 1, rho->nGrow(), 0, gm.periodicity(), FabArrayBase::ADD); - - const Real* dx = gm.CellSize(); - - warpx_openbc_potential(rho_openbc[myproc].dataPtr(), phi_openbc[myproc].dataPtr(), dx); - - BoxArray nba = boxArray(lev); - nba.surroundingNodes(); - MultiFab phi(nba, DistributionMap(lev), 1, 0); - phi.copy(phi_openbc, gm.periodicity()); - -#ifdef _OPENMP -#pragma omp parallel -#endif - for (MFIter mfi(phi); mfi.isValid(); ++mfi) - { - const Box& bx = mfi.validbox(); - warpx_compute_E(bx.loVect(), bx.hiVect(), - BL_TO_FORTRAN_3D(phi[mfi]), - BL_TO_FORTRAN_3D((*Efield[lev][0])[mfi]), - BL_TO_FORTRAN_3D((*Efield[lev][1])[mfi]), - BL_TO_FORTRAN_3D((*Efield[lev][2])[mfi]), - dx); - } -} -#endif - void WarpX::InitLevelData (int lev, Real time) { for (int i = 0; i < 3; ++i) { current_fp[lev][i]->setVal(0.0); - Efield_fp[lev][i]->setVal(0.0); - Bfield_fp[lev][i]->setVal(0.0); + Efield_fp[lev][i]->setVal(E_external_grid[i]); + Bfield_fp[lev][i]->setVal(B_external_grid[i]); } if (lev > 0) { for (int i = 0; i < 3; ++i) { - Efield_aux[lev][i]->setVal(0.0); - Bfield_aux[lev][i]->setVal(0.0); + Efield_aux[lev][i]->setVal(E_external_grid[i]); + Bfield_aux[lev][i]->setVal(B_external_grid[i]); current_cp[lev][i]->setVal(0.0); - Efield_cp[lev][i]->setVal(0.0); - Bfield_cp[lev][i]->setVal(0.0); + Efield_cp[lev][i]->setVal(E_external_grid[i]); + Bfield_cp[lev][i]->setVal(B_external_grid[i]); } } |