forked from BLAST-WarpX/warpx
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFlushFormatAscent.cpp
126 lines (105 loc) · 4.93 KB
/
FlushFormatAscent.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "FlushFormatAscent.H"
#include "WarpX.H"
#include "Utils/TextMsg.H"
#include "Utils/WarpXProfilerWrapper.H"
#include <AMReX.H>
#include <AMReX_REAL.H>
using namespace amrex;
void
FlushFormatAscent::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
{
#ifdef AMREX_USE_ASCENT
WARPX_PROFILE("FlushFormatAscent::WriteToFile()");
auto & warpx = WarpX::GetInstance();
WARPX_ALWAYS_ASSERT_WITH_MESSAGE(
!isBTD,
"In-situ visualization is not currently supported for back-transformed diagnostics.");
const std::string& filename = amrex::Concatenate(prefix, iteration[0], file_min_digits);
amrex::Print() << Utils::TextMsg::Info("Writing Ascent file " + filename);
// wrap mesh data
WARPX_PROFILE_VAR("FlushFormatAscent::WriteToFile::MultiLevelToBlueprint", prof_ascent_mesh_blueprint);
conduit::Node bp_mesh;
amrex::MultiLevelToBlueprint(
nlev, amrex::GetVecOfConstPtrs(mf), varnames, geom, time, iteration, warpx.refRatio(), bp_mesh);
WARPX_PROFILE_VAR_STOP(prof_ascent_mesh_blueprint);
WARPX_PROFILE_VAR("FlushFormatAscent::WriteToFile::WriteParticles", prof_ascent_particles);
WriteParticles(particle_diags, bp_mesh);
WARPX_PROFILE_VAR_STOP(prof_ascent_particles);
// If you want to save blueprint HDF5 files w/o using an Ascent
// extract, you can call the following AMReX helper:
// const auto step = istep[0];
// WriteBlueprintFiles(bp_mesh,"bp_export",step,"hdf5");
WARPX_PROFILE_VAR("FlushFormatAscent::WriteToFile::publish", prof_ascent_publish);
ascent::Ascent ascent;
conduit::Node opts;
opts["exceptions"] = "catch";
opts["mpi_comm"] = MPI_Comm_c2f(ParallelDescriptor::Communicator());
ascent.open(opts);
ascent.publish(bp_mesh);
WARPX_PROFILE_VAR_STOP(prof_ascent_publish);
WARPX_PROFILE_VAR("FlushFormatAscent::WriteToFile::execute", prof_ascent_execute);
conduit::Node actions;
ascent.execute(actions);
ascent.close();
WARPX_PROFILE_VAR_STOP(prof_ascent_execute);
#else
amrex::ignore_unused(varnames, mf, geom, iteration, time,
particle_diags, nlev, file_min_digits, isBTD);
#endif // AMREX_USE_ASCENT
amrex::ignore_unused(prefix, plot_raw_fields, plot_raw_fields_guards);
}
#ifdef AMREX_USE_ASCENT
void
FlushFormatAscent::WriteParticles(const amrex::Vector<ParticleDiag>& particle_diags, conduit::Node& a_bp_mesh) const
{
WARPX_PROFILE("FlushFormatAscent::WriteParticles()");
// wrap particle data for each species
// we prefix the fields with "particle_{species_name}" b/c we
// want to to uniquely name all the fields that can be plotted
for (unsigned i = 0, n = particle_diags.size(); i < n; ++i) {
Vector<std::string> particle_varnames;
Vector<std::string> particle_int_varnames;
std::string prefix = "particle_" + particle_diags[i].getSpeciesName();
// Get pc for species
// auto& pc = mypc->GetParticleContainer(i);
WarpXParticleContainer* pc = particle_diags[i].getParticleContainer();
// get names of real comps
std::map<std::string, int> real_comps_map = pc->getParticleComps();
// WarpXParticleContainer compile-time extra AoS attributes (Real): 0
// WarpXParticleContainer compile-time extra AoS attributes (int): 0
// WarpXParticleContainer compile-time extra SoA attributes (Real): PIdx::nattribs
// not an efficient search, but N is small...
for(int j = 0; j < PIdx::nattribs; ++j)
{
auto rvn_it = real_comps_map.begin();
for (; rvn_it != real_comps_map.end(); ++rvn_it)
if (rvn_it->second == j)
break;
WARPX_ALWAYS_ASSERT_WITH_MESSAGE(
rvn_it != real_comps_map.end(),
"Ascent: SoA real attribute not found");
std::string varname = rvn_it->first;
particle_varnames.push_back(prefix + "_" + varname);
}
// WarpXParticleContainer compile-time extra SoA attributes (int): 0
// WarpXParticleContainer "runtime" SoA attributes (Real), e.g QED: to do
// wrap pc for current species into a blueprint topology
amrex::ParticleContainerToBlueprint(*pc,
particle_varnames,
particle_int_varnames,
a_bp_mesh,
prefix);
}
}
#endif // AMREX_USE_ASCENT