Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion GNUmakefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
AMREX_HOME ?= ../amrex
AMREX_HOME = ../../amrex

DEBUG = FALSE
#DEBUG = TRUE
Expand Down
13 changes: 11 additions & 2 deletions Source/Diagnostics/FlushFormats/FlushFormatCheckpoint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,10 @@ FlushFormatCheckpoint::WriteToFile (

if (warpx.getis_synchronized()
|| WarpX::yee_coupled_solver_algo == CoupledYeeSolver::MaxwellLondon
|| warpx.use_lumped_inductor == 1) {
|| warpx.use_lumped_inductor == 1
|| warpx.use_josephson_junction == 1) {
// Need to save j if synchronized because after restart we need j to evolve E by dt/2.
// London / lumped inductor / Josephson junction all treat j as persistent state.
VisMF::Write(warpx.getcurrent_fp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jx_fp"));
VisMF::Write(warpx.getcurrent_fp(lev, 1),
Expand Down Expand Up @@ -180,7 +182,8 @@ FlushFormatCheckpoint::WriteToFile (

if (warpx.getis_synchronized()
|| WarpX::yee_coupled_solver_algo == CoupledYeeSolver::MaxwellLondon
|| warpx.use_lumped_inductor == 1) {
|| warpx.use_lumped_inductor == 1
|| warpx.use_josephson_junction == 1) {
// Need to save j if synchronized because after restart we need j to evolve E by dt/2.
VisMF::Write(warpx.getcurrent_cp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jx_cp"));
Expand All @@ -205,6 +208,12 @@ FlushFormatCheckpoint::WriteToFile (
}
}

// Josephson junction state (phi, Js). phi is the junction's only real state and
// is NOT reconstructible from the fields, so without this a restart resets it to 0.
if (warpx.use_josephson_junction == 1) {
warpx.getJosephsonJunction().WriteCheckpoint(checkpointname);
}

CheckpointParticles(checkpointname, particle_diags);

WriteDMaps(checkpointname, nlev);
Expand Down
281 changes: 281 additions & 0 deletions Source/Diagnostics/FlushFormats/FlushFormatCheckpoint.cpp.orig
Original file line number Diff line number Diff line change
@@ -0,0 +1,281 @@
#include "FlushFormatCheckpoint.H"

#include "BoundaryConditions/PML.H"
#if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
# include "BoundaryConditions/PML_RZ.H"
#endif
#include "Diagnostics/ParticleDiag/ParticleDiag.H"
#include "Particles/WarpXParticleContainer.H"
#include "Utils/TextMsg.H"
#include "Utils/WarpXProfilerWrapper.H"
#include "WarpX.H"

#include <AMReX_MultiFab.H>
#include <AMReX_ParticleIO.H>
#include <AMReX_PlotFileUtil.H>
#include <AMReX_Print.H>
#include <AMReX_REAL.H>
#include <AMReX_Utility.H>
#include <AMReX_VisMF.H>

using namespace amrex;

namespace
{
const std::string default_level_prefix {"Level_"};
}

void
FlushFormatCheckpoint::WriteToFile (
const amrex::Vector<std::string> /*varnames*/,
const amrex::Vector<amrex::MultiFab>& /*mf*/,
amrex::Vector<amrex::Geometry>& geom,
const amrex::Vector<int> iteration, const double /*time*/,
const amrex::Vector<ParticleDiag>& particle_diags, int nlev,
const std::string prefix, int file_min_digits,
bool /*plot_raw_fields*/,
bool /*plot_raw_fields_guards*/,
const bool /*use_pinned_pc*/,
bool /*isBTD*/, int /*snapshotID*/,
int /*bufferID*/, int /*numBuffers*/,
const amrex::Geometry& /*full_BTD_snapshot*/,
bool /*isLastBTDFlush*/, const amrex::Vector<int>& /* totalParticlesFlushedAlready*/) const
{
WARPX_PROFILE("FlushFormatCheckpoint::WriteToFile()");

auto & warpx = WarpX::GetInstance();

VisMF::Header::Version current_version = VisMF::GetHeaderVersion();
VisMF::SetHeaderVersion(amrex::VisMF::Header::NoFabHeader_v1);

const std::string& checkpointname = amrex::Concatenate(prefix, iteration[0], file_min_digits);

amrex::Print() << Utils::TextMsg::Info(
"Writing checkpoint " + checkpointname);

// const int nlevels = finestLevel()+1;
amrex::PreBuildDirectorHierarchy(checkpointname, default_level_prefix, nlev, true);

WriteWarpXHeader(checkpointname, geom);

WriteJobInfo(checkpointname);

for (int lev = 0; lev < nlev; ++lev)
{
VisMF::Write(warpx.getEfield_fp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ex_fp"));
VisMF::Write(warpx.getEfield_fp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ey_fp"));
VisMF::Write(warpx.getEfield_fp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ez_fp"));
VisMF::Write(warpx.getBfield_fp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bx_fp"));
VisMF::Write(warpx.getBfield_fp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "By_fp"));
VisMF::Write(warpx.getBfield_fp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bz_fp"));

#ifdef WARPX_MAG_LLG
VisMF::Write(warpx.getHfield_fp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hx_fp"));
VisMF::Write(warpx.getHfield_fp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hy_fp"));
VisMF::Write(warpx.getHfield_fp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hz_fp"));
VisMF::Write(warpx.getMfield_fp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Mx_fp"));
VisMF::Write(warpx.getMfield_fp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "My_fp"));
VisMF::Write(warpx.getMfield_fp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Mz_fp"));
VisMF::Write(warpx.getH_biasfield_fp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hxbias_fp"));
VisMF::Write(warpx.getH_biasfield_fp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hybias_fp"));
VisMF::Write(warpx.getH_biasfield_fp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hzbias_fp"));
#endif

if (WarpX::fft_do_time_averaging)
{
VisMF::Write(warpx.getEfield_avg_fp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ex_avg_fp"));
VisMF::Write(warpx.getEfield_avg_fp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ey_avg_fp"));
VisMF::Write(warpx.getEfield_avg_fp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ez_avg_fp"));

VisMF::Write(warpx.getBfield_avg_fp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bx_avg_fp"));
VisMF::Write(warpx.getBfield_avg_fp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "By_avg_fp"));
VisMF::Write(warpx.getBfield_avg_fp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bz_avg_fp"));
}

if (warpx.getis_synchronized()
|| WarpX::yee_coupled_solver_algo == CoupledYeeSolver::MaxwellLondon
|| warpx.use_lumped_inductor == 1) {
// Need to save j if synchronized because after restart we need j to evolve E by dt/2.
VisMF::Write(warpx.getcurrent_fp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jx_fp"));
VisMF::Write(warpx.getcurrent_fp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jy_fp"));
VisMF::Write(warpx.getcurrent_fp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jz_fp"));
}

if (lev > 0)
{
VisMF::Write(warpx.getEfield_cp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ex_cp"));
VisMF::Write(warpx.getEfield_cp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ey_cp"));
VisMF::Write(warpx.getEfield_cp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ez_cp"));
VisMF::Write(warpx.getBfield_cp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bx_cp"));
VisMF::Write(warpx.getBfield_cp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "By_cp"));
VisMF::Write(warpx.getBfield_cp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bz_cp"));

#ifdef WARPX_MAG_LLG
VisMF::Write(warpx.getHfield_cp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hx_cp"));
VisMF::Write(warpx.getHfield_cp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hy_cp"));
VisMF::Write(warpx.getHfield_cp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hz_cp"));
VisMF::Write(warpx.getMfield_cp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Mx_cp"));
VisMF::Write(warpx.getMfield_cp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "My_cp"));
VisMF::Write(warpx.getMfield_cp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Mz_cp"));
VisMF::Write(warpx.getH_biasfield_cp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hxbias_fp"));
VisMF::Write(warpx.getH_biasfield_cp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hybias_fp"));
VisMF::Write(warpx.getH_biasfield_cp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Hzbias_fp"));
#endif

if (WarpX::fft_do_time_averaging)
{
VisMF::Write(warpx.getEfield_avg_cp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ex_avg_cp"));
VisMF::Write(warpx.getEfield_avg_cp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ey_avg_cp"));
VisMF::Write(warpx.getEfield_avg_cp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ez_avg_cp"));

VisMF::Write(warpx.getBfield_avg_cp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bx_avg_cp"));
VisMF::Write(warpx.getBfield_avg_cp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "By_avg_cp"));
VisMF::Write(warpx.getBfield_avg_cp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bz_avg_cp"));
}

if (warpx.getis_synchronized()
|| WarpX::yee_coupled_solver_algo == CoupledYeeSolver::MaxwellLondon
|| warpx.use_lumped_inductor == 1) {
// Need to save j if synchronized because after restart we need j to evolve E by dt/2.
VisMF::Write(warpx.getcurrent_cp(lev, 0),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jx_cp"));
VisMF::Write(warpx.getcurrent_cp(lev, 1),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jy_cp"));
VisMF::Write(warpx.getcurrent_cp(lev, 2),
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jz_cp"));
}
}

if (warpx.DoPML()) {
if (warpx.GetPML(lev)) {
warpx.GetPML(lev)->CheckPoint(
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "pml"));
}
#if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
if (warpx.GetPML_RZ(lev)) {
warpx.GetPML_RZ(lev)->CheckPoint(
amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "pml_rz"));
}
#endif
}
}

CheckpointParticles(checkpointname, particle_diags);

WriteDMaps(checkpointname, nlev);

VisMF::SetHeaderVersion(current_version);

}

void
FlushFormatCheckpoint::CheckpointParticles (
const std::string& dir,
const amrex::Vector<ParticleDiag>& particle_diags) const
{
for (auto& part_diag: particle_diags) {
WarpXParticleContainer* pc = part_diag.getParticleContainer();

Vector<std::string> real_names;
Vector<std::string> int_names;
Vector<int> int_flags;
Vector<int> real_flags;

real_names.push_back("weight");

real_names.push_back("momentum_x");
real_names.push_back("momentum_y");
real_names.push_back("momentum_z");

#ifdef WARPX_DIM_RZ
real_names.push_back("theta");
#endif

// get the names of the real comps
real_names.resize(pc->NumRealComps());
auto runtime_rnames = pc->getParticleRuntimeComps();
for (auto const& x : runtime_rnames) { real_names[x.second+PIdx::nattribs] = x.first; }

// and the int comps
int_names.resize(pc->NumIntComps());
auto runtime_inames = pc->getParticleRuntimeiComps();
for (auto const& x : runtime_inames) { int_names[x.second+0] = x.first; }

pc->Checkpoint(dir, part_diag.getSpeciesName(), true,
real_names, int_names);
}
}

void
FlushFormatCheckpoint::WriteDMaps (const std::string& dir, int nlev) const
{
if (ParallelDescriptor::IOProcessor()) {
auto & warpx = WarpX::GetInstance();
for (int lev = 0; lev < nlev; ++lev) {
std::string DMFileName = dir;
if (!DMFileName.empty() && DMFileName[DMFileName.size()-1] != '/') {DMFileName += '/';}
DMFileName = amrex::Concatenate(DMFileName + "Level_", lev, 1);
DMFileName += "/DM";

std::ofstream DMFile;
DMFile.open(DMFileName.c_str(), std::ios::out|std::ios::trunc);

if (!DMFile.good()) { amrex::FileOpenFailed(DMFileName); }

DMFile << ParallelDescriptor::NProcs() << "\n";
warpx.DistributionMap(lev).writeOn(DMFile);

DMFile.flush();
DMFile.close();
WARPX_ALWAYS_ASSERT_WITH_MESSAGE(
DMFile.good(),
"FlushFormatCheckpoint::WriteDMaps: problem writing DMFile"
);
}
}
}
12 changes: 12 additions & 0 deletions Source/Diagnostics/FullDiagnostics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -716,6 +716,18 @@ FullDiagnostics::InitializeFieldFunctors (int lev)
m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.getInductor().m_inductor_y_mf.get(), lev, m_crse_ratio);
} else if ( m_varnames[comp] == "inductorz" ){
m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.getInductor().m_inductor_z_mf.get(), lev, m_crse_ratio);
} else if ( m_varnames[comp] == "josephson_phi_x" ){
m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.getJosephsonJunction().m_phi_x_mf.get(), lev, m_crse_ratio);
} else if ( m_varnames[comp] == "josephson_phi_y" ){
m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.getJosephsonJunction().m_phi_y_mf.get(), lev, m_crse_ratio);
} else if ( m_varnames[comp] == "josephson_phi_z" ){
m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.getJosephsonJunction().m_phi_z_mf.get(), lev, m_crse_ratio);
} else if ( m_varnames[comp] == "josephson_Ic_x" ){
m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.getJosephsonJunction().m_Ic_x_mf.get(), lev, m_crse_ratio);
} else if ( m_varnames[comp] == "josephson_Ic_y" ){
m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.getJosephsonJunction().m_Ic_y_mf.get(), lev, m_crse_ratio);
} else if ( m_varnames[comp] == "josephson_Ic_z" ){
m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.getJosephsonJunction().m_Ic_z_mf.get(), lev, m_crse_ratio);
}
else {

Expand Down
6 changes: 4 additions & 2 deletions Source/Diagnostics/WarpXIO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,8 @@ WarpX::InitFromCheckpoint ()

if (is_synchronized
|| WarpX::yee_coupled_solver_algo == CoupledYeeSolver::MaxwellLondon
|| use_lumped_inductor == 1)
|| use_lumped_inductor == 1
|| use_josephson_junction == 1)
{
VisMF::Read(*current_fp[lev][0],
amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jx_fp"));
Expand Down Expand Up @@ -426,7 +427,8 @@ WarpX::InitFromCheckpoint ()

if (is_synchronized
|| WarpX::yee_coupled_solver_algo == CoupledYeeSolver::MaxwellLondon
|| use_lumped_inductor == 1) {
|| use_lumped_inductor == 1
|| use_josephson_junction == 1) {
VisMF::Read(*current_cp[lev][0],
amrex::MultiFabFileFullPrefix(lev, restart_chkfile, level_prefix, "jx_cp"));
VisMF::Read(*current_cp[lev][1],
Expand Down
Loading