37 std::string FullPath = dir;
39 const std::string& extension = amrex::Concatenate(
"_d",lev+1,2);
40 FullPath += extension +
".nc";
42 const std::string& extension = amrex::Concatenate(
"_d",lev+1+which_subdomain,2);
43 FullPath += extension +
".nc";
46 Print() <<
"Writing level " << lev <<
" NetCDF plot file " << FullPath << std::endl;
51 auto ncf = ncutils::NCFile::create_par(FullPath, NC_NETCDF4 | NC_MPIIO,
52 amrex::ParallelContext::CommunicatorSub(), MPI_INFO_NULL);
54 auto ba = plotMF[lev]->boxArray();
55 auto dm = plotMF[lev]->DistributionMap();
57 int nblocks = ba.size();
59 int nx = subdomain.length(0);
60 int ny = subdomain.length(1);
61 int nz = subdomain.length(2);
63 int num_pts =
nx*
ny*nz;
65 int n_data_items = plotMF[lev]->nComp();
72 const std::string nt_name =
"num_time_steps";
73 const std::string nb_name =
"num_blocks";
74 const std::string np_name =
"num_pts";
75 const std::string nx_name =
"nx";
76 const std::string ny_name =
"ny";
77 const std::string nz_name =
"nz";
79 const std::string ndim_name =
"num_geo_dims";
81 ncf.put_attr(
"title",
"ERF NetCDF Plot data output");
86 if (!provenance.erf_git_hash.empty()) {
87 ncf.put_attr(
"erf_git_hash", provenance.erf_git_hash);
89 if (!provenance.amrex_git_hash.empty()) {
90 ncf.put_attr(
"amrex_git_hash", provenance.amrex_git_hash);
92 if (!provenance.noahmp_git_hash.empty()) {
93 ncf.put_attr(
"noahmp_git_hash", provenance.noahmp_git_hash);
96 ncf.def_dim(ndim_name, AMREX_SPACEDIM);
97 ncf.def_dim(np_name , num_pts);
98 ncf.def_dim(nb_name , nblocks);
100 ncf.def_dim(nt_name, NC_UNLIMITED);
101 ncf.def_dim(nx_name,
nx);
102 ncf.def_dim(ny_name,
ny);
103 ncf.def_dim(nz_name, nz);
105 ncf.def_var(
"probLo" , NC_FLOAT, {ndim_name});
106 ncf.def_var(
"probHi" , NC_FLOAT, {ndim_name});
108 ncf.def_var(
"Geom.smallend", NC_INT, {ndim_name});
109 ncf.def_var(
"Geom.bigend" , NC_INT, {ndim_name});
110 ncf.def_var(
"CellSize" , NC_FLOAT, {ndim_name});
112 ncf.def_var(
"x_grid", NC_DOUBLE, {np_name});
113 ncf.def_var(
"y_grid", NC_DOUBLE, {np_name});
114 ncf.def_var(
"z_grid", NC_DOUBLE, {np_name});
116 for (
int i = 0; i < plot_var_names.size(); i++) {
117 ncf.def_var(plot_var_names[i], NC_DOUBLE, {nz_name, ny_name, nx_name});
129 if (n_data_items == 0) {
130 amrex::Error(
"Must specify at least one valid data item to plot");
133 ncf.put_attr(
"number_variables", std::vector<int>{n_data_items});
134 ncf.put_attr(
"space_dimension", std::vector<int>{AMREX_SPACEDIM});
135 ncf.put_attr(
"current_time", std::vector<double>{time});
136 ncf.put_attr(
"start_time", std::vector<double>{start_bdy_time});
137 ncf.put_attr(
"CurrentLevel", std::vector<int>{lev});
140 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
144 amrex::Vector<Real> probLo;
145 amrex::Vector<Real> probHi;
146 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
151 auto nc_probLo = ncf.var(
"probLo");
152 nc_probLo.par_access(NC_COLLECTIVE);
153 nc_probLo.put(probLo.data(), {0}, {AMREX_SPACEDIM});
155 auto nc_probHi = ncf.var(
"probHi");
156 nc_probHi.par_access(NC_COLLECTIVE);
157 nc_probHi.put(probHi.data(), {0}, {AMREX_SPACEDIM});
159 amrex::Vector<int> smallend;
160 amrex::Vector<int> bigend;
161 smallend.clear(); bigend.clear();
162 for (
int j = 0; j < AMREX_SPACEDIM; j++) {
163 smallend.push_back(subdomain.smallEnd(j));
164 bigend.push_back(subdomain.bigEnd(j));
167 auto nc_Geom_smallend = ncf.var(
"Geom.smallend");
168 nc_Geom_smallend.par_access(NC_COLLECTIVE);
169 nc_Geom_smallend.put(smallend.data(), {0}, {AMREX_SPACEDIM});
171 auto nc_Geom_bigend = ncf.var(
"Geom.bigend");
172 nc_Geom_bigend.par_access(NC_COLLECTIVE);
173 nc_Geom_bigend.put(bigend.data(), {0}, {AMREX_SPACEDIM});
175 amrex::Vector<Real> CellSize;
178 CellSize.push_back(j);
180 auto nc_CellSize = ncf.var(
"CellSize");
181 nc_CellSize.par_access(NC_COLLECTIVE);
182 nc_CellSize.put(CellSize.data(), {0}, {AMREX_SPACEDIM});
184 ncf.put_attr(
"DefaultGeometry", std::vector<int>{amrex::DefaultGeometry().Coord()});
186 std::vector<Real> x_grid;
187 std::vector<Real> y_grid;
188 std::vector<Real> z_grid;
189 long unsigned goffset = 0;
190 long unsigned glen = 0;
195 if (solverChoice.
mesh_type == MeshType::ConstantDz) {
196 for (
int i = 0; i < ba.size(); ++i) {
198 if (subdomain.contains(bx)) {
201 const auto bx_lo = bx.smallEnd();
202 x_grid.clear(); y_grid.clear(); z_grid.clear();
203 for (
auto k3 = 0; k3 < bx.length(2); ++k3) {
204 for (
auto k2 = 0; k2 < bx.length(1); ++k2) {
205 for (
auto k1 = 0;
k1 < bx.length(0); ++
k1) {
216 auto nc_x_grid = ncf.var(
"x_grid");
217 auto nc_y_grid = ncf.var(
"y_grid");
218 auto nc_z_grid = ncf.var(
"z_grid");
220 nc_x_grid.par_access(NC_COLLECTIVE);
221 nc_y_grid.par_access(NC_COLLECTIVE);
222 nc_z_grid.par_access(NC_COLLECTIVE);
224 nc_x_grid.put(x_grid.data(), {goffset}, {glen});
225 nc_y_grid.put(y_grid.data(), {goffset}, {glen});
226 nc_z_grid.put(z_grid.data(), {goffset}, {glen});
230 else if (solverChoice.
mesh_type == MeshType::StretchedDz)
232 for (
int i = 0; i < ba.size(); ++i) {
234 if (subdomain.contains(bx)) {
238 const auto bx_lo = bx.smallEnd();
239 x_grid.clear(); y_grid.clear(); z_grid.clear();
240 for (
auto k3 = 0; k3 < bx.length(2); ++k3) {
241 for (
auto k2 = 0; k2 < bx.length(1); ++k2) {
242 for (
auto k1 = 0;
k1 < bx.length(0); ++
k1) {
245 z_grid.push_back(
myhalf * (zlevels_stag[bx_lo[2]+k3] + zlevels_stag[bx_lo[2]+k3+1]));
253 auto nc_x_grid = ncf.var(
"x_grid");
254 auto nc_y_grid = ncf.var(
"y_grid");
255 auto nc_z_grid = ncf.var(
"z_grid");
257 nc_x_grid.par_access(NC_COLLECTIVE);
258 nc_y_grid.par_access(NC_COLLECTIVE);
259 nc_z_grid.par_access(NC_COLLECTIVE);
261 nc_x_grid.put(x_grid.data(), {goffset}, {glen});
262 nc_y_grid.put(y_grid.data(), {goffset}, {glen});
263 nc_z_grid.put(z_grid.data(), {goffset}, {glen});
268 const int ncomp = plotMF[lev]->nComp();
280 for (
int k(0); k < ncomp; ++k) {
281 ncf.var(plot_var_names[k]).par_access(NC_INDEPENDENT);
284 for (MFIter mfi(*plotMF[lev]); mfi.isValid(); ++mfi)
286 auto bx = mfi.validbox();
288 if (subdomain.contains(bx))
294 long unsigned local_nx = bx.length()[0];
295 long unsigned local_ny = bx.length()[1];
296 long unsigned local_nz = bx.length()[2];
298 long unsigned local_start_x =
static_cast<long unsigned>(bx.smallEnd()[0]-subdomain.smallEnd()[0]);
299 long unsigned local_start_y =
static_cast<long unsigned>(bx.smallEnd()[1]-subdomain.smallEnd()[1]);
300 long unsigned local_start_z =
static_cast<long unsigned>(bx.smallEnd()[2]-subdomain.smallEnd()[2]);
302 for (
int k(0); k < ncomp; ++k) {
304 tmp.resize(bx, 1, amrex::The_Pinned_Arena());
305 tmp.template copy<RunOn::Device>((*plotMF[lev])[mfi.index()], k, 0, 1);
306 Gpu::streamSynchronize();
308 auto nc_plot_var = ncf.var(plot_var_names[k]);
309 nc_plot_var.put(
tmp.dataPtr(), {local_start_z,local_start_y,local_start_x},
310 {local_nz, local_ny, local_nx});
const int nx
Definition: ERF_InitCustomPertVels_CloudChamber.H:14
const int ny
Definition: ERF_InitCustomPertVels_CloudChamber.H:15
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
const GpuArray< Real, AMREX_SPACEDIM > prob_lo
Definition: ERF_InitCustomPert_CloudChamber.H:33
const amrex::Real * prob_hi
Definition: ERF_InitCustomPert_DataAssimilation_ISV.H:17
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ tmp
Definition: ERF_AdvanceWSM6.cpp:116
real(c_double), private k1
Definition: ERF_module_mp_morr_two_moment.F90:213
static MeshType mesh_type
Vertical mesh representation.
Definition: ERF_DataStruct.H:2236