diff options
-rw-r--r-- | Source/WarpX.H | 2 | ||||
-rw-r--r-- | Source/WarpXIO.cpp | 195 | ||||
-rw-r--r-- | Source/WarpXInitData.cpp | 9 | ||||
-rw-r--r-- | Source/WarpXPML.H | 3 | ||||
-rw-r--r-- | Source/WarpXPML.cpp | 49 |
5 files changed, 173 insertions, 85 deletions
diff --git a/Source/WarpX.H b/Source/WarpX.H index add505568..d46196214 100644 --- a/Source/WarpX.H +++ b/Source/WarpX.H @@ -172,6 +172,8 @@ private: void InitOpenbc (); + void InitPML (); + void InjectPlasma(int num_shift, int dir); void WriteWarpXHeader(const std::string& name) const; diff --git a/Source/WarpXIO.cpp b/Source/WarpXIO.cpp index dff28c683..9c09d136d 100644 --- a/Source/WarpXIO.cpp +++ b/Source/WarpXIO.cpp @@ -95,8 +95,6 @@ WarpX::WriteWarpXHeader(const std::string& name) const void WarpX::WriteCheckPointFile() const { -// xxxxx -#if 0 BL_PROFILE("WarpX::WriteCheckPointFile()"); const std::string& checkpointname = amrex::Concatenate(check_file,istep[0]); @@ -115,59 +113,65 @@ WarpX::WriteCheckPointFile() const for (int lev = 0; lev < nlevels; ++lev) { - VisMF::Write(*Efield[lev][0], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Ex")); - VisMF::Write(*Efield[lev][1], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Ey")); - VisMF::Write(*Efield[lev][2], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Ez")); - VisMF::Write(*Bfield[lev][0], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Bx")); - VisMF::Write(*Bfield[lev][1], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "By")); - VisMF::Write(*Bfield[lev][2], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Bz")); + VisMF::Write(*Efield_fp[lev][0], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Ex_fp")); + VisMF::Write(*Efield_fp[lev][1], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Ey_fp")); + VisMF::Write(*Efield_fp[lev][2], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Ez_fp")); + VisMF::Write(*Bfield_fp[lev][0], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Bx_fp")); + VisMF::Write(*Bfield_fp[lev][1], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "By_fp")); + VisMF::Write(*Bfield_fp[lev][2], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Bz_fp")); if (is_synchronized) { // Need to save j if synchronized because after restart we need j to evolve E by dt/2. - VisMF::Write(*current[lev][0], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "jx")); - VisMF::Write(*current[lev][1], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "jy")); - VisMF::Write(*current[lev][2], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "jz")); + VisMF::Write(*current_fp[lev][0], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "jx_fp")); + VisMF::Write(*current_fp[lev][1], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "jy_fp")); + VisMF::Write(*current_fp[lev][2], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "jz_fp")); } -//xxxxx -#if 0 - if (do_pml) { - const int lev = 0; - VisMF::Write(*pml_E[0], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "pml_Ex")); - VisMF::Write(*pml_E[1], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "pml_Ey")); - VisMF::Write(*pml_E[2], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "pml_Ez")); - VisMF::Write(*pml_B[0], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "pml_Bx")); - VisMF::Write(*pml_B[1], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "pml_By")); - VisMF::Write(*pml_B[2], - amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "pml_Bz")); + if (lev > 0) + { + VisMF::Write(*Efield_cp[lev][0], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Ex_cp")); + VisMF::Write(*Efield_cp[lev][1], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Ey_cp")); + VisMF::Write(*Efield_cp[lev][2], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Ez_cp")); + VisMF::Write(*Bfield_cp[lev][0], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Bx_cp")); + VisMF::Write(*Bfield_cp[lev][1], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "By_cp")); + VisMF::Write(*Bfield_cp[lev][2], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "Bz_cp")); + if (is_synchronized) { + // Need to save j if synchronized because after restart we need j to evolve E by dt/2. + VisMF::Write(*current_cp[lev][0], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "jx_cp")); + VisMF::Write(*current_cp[lev][1], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "jy_cp")); + VisMF::Write(*current_cp[lev][2], + amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "jz_cp")); + } + } + + if (do_pml && pml[lev]) { + pml[lev]->CheckPoint(amrex::MultiFabFileFullPrefix(lev, checkpointname, level_prefix, "pml")); } -#endif } mypc->Checkpoint(checkpointname, "particle", true); -#endif } void WarpX::InitFromCheckpoint () { -// xxxxx -#if 0 - BL_PROFILE("WarpX::InitFromCheckpoint()"); amrex::Print() << " Restart from checkpoint " << restart_chkfile << "\n"; @@ -281,66 +285,89 @@ WarpX::InitFromCheckpoint () mypc->ReadHeader(is); } + const int nlevs = finestLevel()+1; + // Initialize the field data - for (int lev = 0, nlevs=finestLevel()+1; lev < nlevs; ++lev) + for (int lev = 0; lev < nlevs; ++lev) { - for (int i = 0; i < 3; ++i) { - Efield[lev][i]->setVal(0.0); - Bfield[lev][i]->setVal(0.0); - current[lev][i]->setVal(0.0); - } + 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); + } + + if (lev > 0) { + for (int i = 0; i < 3; ++i) { + Efield_aux[lev][i]->setVal(0.0); + Bfield_aux[lev][i]->setVal(0.0); + + current_cp[lev][i]->setVal(0.0); + Efield_cp[lev][i]->setVal(0.0); + Bfield_cp[lev][i]->setVal(0.0); + } + } - VisMF::Read(*Efield[lev][0], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Ex")); - VisMF::Read(*Efield[lev][1], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Ey")); - VisMF::Read(*Efield[lev][2], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Ez")); + VisMF::Read(*Efield_fp[lev][0], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Ex_fp")); + VisMF::Read(*Efield_fp[lev][1], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Ey_fp")); + VisMF::Read(*Efield_fp[lev][2], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Ez_fp")); - VisMF::Read(*Bfield[lev][0], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Bx")); - VisMF::Read(*Bfield[lev][1], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "By")); - VisMF::Read(*Bfield[lev][2], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Bz")); + VisMF::Read(*Bfield_fp[lev][0], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Bx_fp")); + VisMF::Read(*Bfield_fp[lev][1], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "By_fp")); + VisMF::Read(*Bfield_fp[lev][2], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Bz_fp")); if (is_synchronized) { - VisMF::Read(*current[lev][0], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jx")); - VisMF::Read(*current[lev][1], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jy")); - VisMF::Read(*current[lev][2], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jz")); + VisMF::Read(*current_fp[lev][0], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jx_fp")); + VisMF::Read(*current_fp[lev][1], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jy_fp")); + VisMF::Read(*current_fp[lev][2], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jz_fp")); + } + + if (lev > 0) + { + VisMF::Read(*Efield_cp[lev][0], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Ex_cp")); + VisMF::Read(*Efield_cp[lev][1], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Ey_cp")); + VisMF::Read(*Efield_cp[lev][2], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Ez_cp")); + + VisMF::Read(*Bfield_cp[lev][0], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Bx_cp")); + VisMF::Read(*Bfield_cp[lev][1], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "By_cp")); + VisMF::Read(*Bfield_cp[lev][2], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "Bz_cp")); + + if (is_synchronized) { + VisMF::Read(*current_cp[lev][0], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jx_cp")); + VisMF::Read(*current_cp[lev][1], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jy_cp")); + VisMF::Read(*current_cp[lev][2], + amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jz_cp")); + } } } -// xxxxx -#if 0 if (do_pml) { InitPML(); - - const int lev = 0; - VisMF::Read(*pml_E[0], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "pml_Ex")); - VisMF::Read(*pml_E[1], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "pml_Ey")); - VisMF::Read(*pml_E[2], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "pml_Ez")); - - VisMF::Read(*pml_B[0], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "pml_Bx")); - VisMF::Read(*pml_B[1], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "pml_By")); - VisMF::Read(*pml_B[2], - amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "pml_Bz")); + for (int lev = 0; lev < nlevs; ++lev) { + pml[lev]->Restart(amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "pml")); + } } -#endif // Initilize particles mypc->AllocData(); mypc->Restart(restart_chkfile, "particle"); -#endif } diff --git a/Source/WarpXInitData.cpp b/Source/WarpXInitData.cpp index 8660cdaec..03242f034 100644 --- a/Source/WarpXInitData.cpp +++ b/Source/WarpXInitData.cpp @@ -57,7 +57,14 @@ WarpX::InitFromScratch () InitOpenbc(); #endif - if (do_pml) { + InitPML(); +} + +void +WarpX::InitPML () +{ + if (do_pml) + { pml[0].reset(new PML(boxArray(0), DistributionMap(0), &Geom(0), nullptr, pml_ncell, 0)); for (int lev = 1; lev <= finest_level; ++lev) { diff --git a/Source/WarpXPML.H b/Source/WarpXPML.H index 3768ba770..a89a7b492 100644 --- a/Source/WarpXPML.H +++ b/Source/WarpXPML.H @@ -123,6 +123,9 @@ public: bool ok () const { return m_ok; } + void CheckPoint (const std::string& dir) const; + void Restart (const std::string& dir); + private: bool m_ok; diff --git a/Source/WarpXPML.cpp b/Source/WarpXPML.cpp index 7f005eb70..949a44a89 100644 --- a/Source/WarpXPML.cpp +++ b/Source/WarpXPML.cpp @@ -4,6 +4,7 @@ #include <WarpXConst.H> #include <AMReX_Print.H> +#include <AMReX_VisMF.H> #include <algorithm> @@ -602,3 +603,51 @@ PML::FillBoundaryB () pml_B_cp[2]->FillBoundary(period); } } + +void +PML::CheckPoint (const std::string& dir) const +{ + if (pml_E_fp[0]) + { + VisMF::Write(*pml_E_fp[0], dir+"_Ex_fp"); + VisMF::Write(*pml_E_fp[1], dir+"_Ey_fp"); + VisMF::Write(*pml_E_fp[2], dir+"_Ez_fp"); + VisMF::Write(*pml_B_fp[0], dir+"_Bx_fp"); + VisMF::Write(*pml_B_fp[1], dir+"_By_fp"); + VisMF::Write(*pml_B_fp[2], dir+"_Bz_fp"); + } + + if (pml_E_cp[0]) + { + VisMF::Write(*pml_E_cp[0], dir+"_Ex_cp"); + VisMF::Write(*pml_E_cp[1], dir+"_Ey_cp"); + VisMF::Write(*pml_E_cp[2], dir+"_Ez_cp"); + VisMF::Write(*pml_B_cp[0], dir+"_Bx_cp"); + VisMF::Write(*pml_B_cp[1], dir+"_By_cp"); + VisMF::Write(*pml_B_cp[2], dir+"_Bz_cp"); + } +} + +void +PML::Restart (const std::string& dir) +{ + if (pml_E_fp[0]) + { + VisMF::Read(*pml_E_fp[0], dir+"_Ex_fp"); + VisMF::Read(*pml_E_fp[1], dir+"_Ey_fp"); + VisMF::Read(*pml_E_fp[2], dir+"_Ez_fp"); + VisMF::Read(*pml_B_fp[0], dir+"_Bx_fp"); + VisMF::Read(*pml_B_fp[1], dir+"_By_fp"); + VisMF::Read(*pml_B_fp[2], dir+"_Bz_fp"); + } + + if (pml_E_cp[0]) + { + VisMF::Read(*pml_E_cp[0], dir+"_Ex_cp"); + VisMF::Read(*pml_E_cp[1], dir+"_Ey_cp"); + VisMF::Read(*pml_E_cp[2], dir+"_Ez_cp"); + VisMF::Read(*pml_B_cp[0], dir+"_Bx_cp"); + VisMF::Read(*pml_B_cp[1], dir+"_By_cp"); + VisMF::Read(*pml_B_cp[2], dir+"_Bz_cp"); + } +} |