113 std::vector<int> n_cells;
120 subdomain = geom[lev].Domain();
125 int nx = subdomain.length(0);
126 int ny = subdomain.length(1);
127 int nz = subdomain.length(2);
130 amrex::Abort(
"Need to know max_step if writing history file");
148 nt = nt - last_file_index;
154 n_cells.push_back(nx);
155 n_cells.push_back(ny);
156 n_cells.push_back(nz);
158 const std::string nt_name =
"ocean_time";
159 const std::string ndim_name =
"num_geo_dimensions";
161 const std::string flev_name =
"FINEST_LEVEL";
163 const std::string nx_name =
"NX";
164 const std::string ny_name =
"NY";
165 const std::string nz_name =
"NZ";
167 const std::string nx_r_name =
"xi_rho";
168 const std::string ny_r_name =
"eta_rho";
169 const std::string nz_r_name =
"s_rho";
171 const std::string nx_u_name =
"xi_u";
172 const std::string ny_u_name =
"eta_u";
174 const std::string nx_v_name =
"xi_v";
175 const std::string ny_v_name =
"eta_v";
177 const std::string nx_p_name =
"xi_psi";
178 const std::string ny_p_name =
"eta_psi";
179 const std::string nz_w_name =
"s_w";
183 ncf.
put_attr(
"title",
"REMORA data ");
185 ncf.
def_dim(ndim_name, AMREX_SPACEDIM);
187 ncf.
def_dim(nx_r_name, nx + 2);
188 ncf.
def_dim(ny_r_name, ny + 2);
191 ncf.
def_dim(nx_u_name, nx + 1);
192 ncf.
def_dim(ny_u_name, ny + 2);
194 ncf.
def_dim(nx_v_name, nx + 2);
195 ncf.
def_dim(ny_v_name, ny + 1);
197 ncf.
def_dim(nx_p_name, nx + 1);
198 ncf.
def_dim(ny_p_name, ny + 1);
200 ncf.
def_dim(nz_w_name, nz + 1);
204 ncf.
def_dim(nx_name, n_cells[0]);
205 ncf.
def_dim(ny_name, n_cells[1]);
206 ncf.
def_dim(nz_name, n_cells[2]);
209 ncf.
var(
"probLo").
put_attr(
"long_name",
"Low side of problem domain in internal AMReX grid");
212 ncf.
var(
"probHi").
put_attr(
"long_name",
"High side of problem domain in internal AMReX grid");
215 ncf.
def_var(
"Geom.smallend", NC_INT, { flev_name, ndim_name });
216 ncf.
var(
"Geom.smallend").
put_attr(
"long_name",
"Low side of problem domain in index space");
217 ncf.
def_var(
"Geom.bigend", NC_INT, { flev_name, ndim_name });
218 ncf.
var(
"Geom.bigend").
put_attr(
"long_name",
"High side of problem domain in index space");
220 ncf.
var(
"CellSize").
put_attr(
"long_name",
"Cell size on internal AMReX grid");
224 ncf.
var(
"theta_s").
put_attr(
"long_name",
"S-coordinate surface control parameter");
226 ncf.
var(
"theta_b").
put_attr(
"long_name",
"S-coordinate bottom control parameter");
228 ncf.
var(
"hc").
put_attr(
"long_name",
"S-coordinate parameter, critical depth");
231 ncf.
def_var(
"grid",NC_INT, {});
232 ncf.
var(
"grid").
put_attr(
"cf_role",
"grid_topology");
233 ncf.
var(
"grid").
put_attr(
"topology_dimension",std::vector({2}));
234 ncf.
var(
"grid").
put_attr(
"node_dimensions",
"xi_psi eta_psi");
235 ncf.
var(
"grid").
put_attr(
"face_dimensions",
"xi_rho: xi_psi (padding: both) eta_rho: eta_psi (padding: both)");
236 ncf.
var(
"grid").
put_attr(
"edge1_dimensions",
"xi_u: xi_psi eta_u: eta_psi (padding: both)");
237 ncf.
var(
"grid").
put_attr(
"edge2_dimensions",
"xi_v: xi_psi (padding: both) eta_v: eta_psi");
238 ncf.
var(
"grid").
put_attr(
"node_coordinates",
"x_psi y_psi");
239 ncf.
var(
"grid").
put_attr(
"face_coordinates",
"x_rho y_rho");
240 ncf.
var(
"grid").
put_attr(
"edge1_coordinates",
"x_u y_u");
241 ncf.
var(
"grid").
put_attr(
"edge2_coordinates",
"x_v y_v");
242 ncf.
var(
"grid").
put_attr(
"vertical_dimensions",
"s_rho: s_w (padding: none)");
245 ncf.
var(
"s_rho").
put_attr(
"long_name",
"S-coordinate at RHO-points");
246 ncf.
var(
"s_rho").
put_attr(
"field",
"s_rho, scalar");
249 ncf.
var(
"s_w").
put_attr(
"long_name",
"S-coordinate at W-points");
253 ncf.
var(
"pm").
put_attr(
"long_name",
"curvilinear coordinate metric in XI");
257 ncf.
var(
"pm").
put_attr(
"coordinates",
"x_rho y_rho");
261 ncf.
var(
"pn").
put_attr(
"long_name",
"curvilinear coordinate metric in ETA");
265 ncf.
var(
"pn").
put_attr(
"coordinates",
"x_rho y_rho");
269 ncf.
var(
"f").
put_attr(
"long_name",
"Coriolis parameter at RHO-points");
273 ncf.
var(
"f").
put_attr(
"coordinates",
"x_rho y_rho");
277 ncf.
var(
"x_rho").
put_attr(
"long_name",
"x-locations of RHO-points");
279 ncf.
var(
"x_rho").
put_attr(
"field",
"x_rho, scalar");
282 ncf.
var(
"y_rho").
put_attr(
"long_name",
"y-locations of RHO-points");
284 ncf.
var(
"y_rho").
put_attr(
"field",
"y_rho, scalar");
287 ncf.
var(
"x_u").
put_attr(
"long_name",
"x-locations of U-points");
292 ncf.
var(
"y_u").
put_attr(
"long_name",
"y-locations of U-points");
297 ncf.
var(
"x_v").
put_attr(
"long_name",
"x-locations of V-points");
302 ncf.
var(
"y_v").
put_attr(
"long_name",
"y-locations of V-points");
307 ncf.
var(
"x_psi").
put_attr(
"long_name",
"x-locations of PSI-points");
309 ncf.
var(
"x_psi").
put_attr(
"field",
"x_psi, scalar");
312 ncf.
var(
"y_psi").
put_attr(
"long_name",
"y-locations of PSI-points");
314 ncf.
var(
"y_psi").
put_attr(
"field",
"y_psi, scalar");
317 ncf.
var(
"ocean_time").
put_attr(
"long_name",
"time since initialization");
318 ncf.
var(
"ocean_time").
put_attr(
"units",
"seconds since 0001-01-01 00:00:00");
319 ncf.
var(
"ocean_time").
put_attr(
"field",
"time, scalar, series");
322 ncf.
var(
"Cs_r").
put_attr(
"long_name",
"S-coordinate stretching curves at RHO points");
323 ncf.
var(
"Cs_r").
put_attr(
"valid_min",std::vector({-1.}));
324 ncf.
var(
"Cs_r").
put_attr(
"valid_max",std::vector({0.}));
328 ncf.
var(
"Cs_w").
put_attr(
"long_name",
"S-coordinate stretching curves at W points");
329 ncf.
var(
"Cs_w").
put_attr(
"valid_min",std::vector({-1.}));
330 ncf.
var(
"Cs_w").
put_attr(
"valid_max",std::vector({0.}));
334 ncf.
var(
"h").
put_attr(
"long_name",
"bathymetry at RHO-points");
338 ncf.
var(
"h").
put_attr(
"coordinates",
"x_rho y_rho");
342 ncf.
var(
"zeta").
put_attr(
"long_name",
"free-surface");
347 ncf.
var(
"zeta").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
348 ncf.
var(
"zeta").
put_attr(
"field",
"free-surface, scalar, series");
357 ncf.
var(
"temp").
put_attr(
"long_name",
"potential temperature");
362 ncf.
var(
"temp").
put_attr(
"coordinates",
"x_rho y_rho s_rho ocean_time");
363 ncf.
var(
"temp").
put_attr(
"field",
"temperature, scalar, series");
378 ncf.
var(
"salt").
put_attr(
"coordinates",
"x_rho y_rho s_rho ocean_time");
379 ncf.
var(
"salt").
put_attr(
"field",
"salinity, scalar, series");
390 ncf.
var(
"tracer").
put_attr(
"long_name",
"passive tracer");
394 ncf.
var(
"tracer").
put_attr(
"coordinates",
"x_rho y_rho s_rho ocean_time");
395 ncf.
var(
"tracer").
put_attr(
"field",
"tracer, scalar, series");
406 ncf.
var(
"vorticity").
put_attr(
"long_name",
"vorticity");
407 ncf.
var(
"vorticity").
put_attr(
"time",
"ocean_time");
410 ncf.
var(
"vorticity").
put_attr(
"coordinates",
"x_rho y_rho s_rho ocean_time");
411 ncf.
var(
"vorticity").
put_attr(
"field",
"vorticity, scalar, series");
418 ncf.
var(
"visc2").
put_attr(
"long_name",
"horizontal harmonic viscosity coefficient at RHO-points");
419 ncf.
var(
"visc2").
put_attr(
"units",
"meter2 second-1");
422 ncf.
var(
"visc2").
put_attr(
"coordinates",
"x_rho y_rho");
423 ncf.
var(
"visc2").
put_attr(
"field",
"visc2, scalar");
426 const std::string nm = std::string(
"diff2_") +
cons_names[n];
428 ncf.
var(nm).
put_attr(
"long_name", std::string(
"horizontal harmonic diffusivity coefficient for ") +
cons_names[n] +
" at RHO-points");
438 ncf.
var(
"u").
put_attr(
"long_name",
"u-momentum component");
443 ncf.
var(
"u").
put_attr(
"coordinates",
"x_u y_u s_rho ocean_time");
444 ncf.
var(
"u").
put_attr(
"field",
"u-velocity, scalar, series");
447 ncf.
var(
"v").
put_attr(
"long_name",
"v-momentum component");
452 ncf.
var(
"v").
put_attr(
"coordinates",
"x_v y_v s_rho ocean_time");
453 ncf.
var(
"v").
put_attr(
"field",
"v-velocity, scalar, series");
456 ncf.
var(
"ubar").
put_attr(
"long_name",
"vertically integrated u-momentum component");
457 ncf.
var(
"ubar").
put_attr(
"units",
"meter second-1");
461 ncf.
var(
"ubar").
put_attr(
"coordinates",
"x_u y_u ocean_time");
462 ncf.
var(
"ubar").
put_attr(
"field",
"ubar-velocity, scalar, series");
465 ncf.
var(
"vbar").
put_attr(
"long_name",
"vertically integrated v-momentum component");
466 ncf.
var(
"vbar").
put_attr(
"units",
"meter second-1");
470 ncf.
var(
"vbar").
put_attr(
"coordinates",
"x_v y_v ocean_time");
471 ncf.
var(
"vbar").
put_attr(
"field",
"vbar-velocity, scalar, series");
474 ncf.
var(
"sustr").
put_attr(
"long_name",
"surface u-momentum stress");
475 ncf.
var(
"sustr").
put_attr(
"units",
"newton meter-2");
479 ncf.
var(
"sustr").
put_attr(
"coordinates",
"x_u y_u ocean_time");
480 ncf.
var(
"sustr").
put_attr(
"field",
"surface u-momentum stress, scalar, series");
483 ncf.
var(
"svstr").
put_attr(
"long_name",
"surface v-momentum stress");
484 ncf.
var(
"svstr").
put_attr(
"units",
"newton meter-2");
488 ncf.
var(
"svstr").
put_attr(
"coordinates",
"x_v y_v ocean_time");
489 ncf.
var(
"svstr").
put_attr(
"field",
"surface v-momentum stress, scalar, series");
494 ncf.
var(
"Tair").
put_attr(
"long_name",
"surface air temperature");
499 ncf.
var(
"Tair").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
500 ncf.
var(
"Tair").
put_attr(
"field",
"Tair, scalar, series");
504 ncf.
var(
"Pair").
put_attr(
"long_name",
"surface air pressure");
509 ncf.
var(
"Pair").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
510 ncf.
var(
"Pair").
put_attr(
"field",
"Pair, scalar, series");
514 ncf.
var(
"qnet").
put_attr(
"long_name",
"surface net heat flux");
519 ncf.
var(
"qnet").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
520 ncf.
var(
"qnet").
put_attr(
"field",
"surface heat flux, scalar, series");
524 ncf.
var(
"ssflux").
put_attr(
"long_name",
"kinematic surface net salt flux, SALT*(E-P)/rhow");
525 ncf.
var(
"ssflux").
put_attr(
"units",
"meter second-1");
529 ncf.
var(
"ssflux").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
530 ncf.
var(
"ssflux").
put_attr(
"field",
"surface net salt flux, scalar, series");
534 ncf.
var(
"latent").
put_attr(
"long_name",
"net latent heat flux");
535 ncf.
var(
"latent").
put_attr(
"units",
"watt meter-2");
539 ncf.
var(
"latent").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
540 ncf.
var(
"latent").
put_attr(
"field",
"latent heat flux, scalar, series");
544 ncf.
var(
"sensible").
put_attr(
"long_name",
"net sensible heat flux");
545 ncf.
var(
"sensible").
put_attr(
"units",
"watt meter-2");
549 ncf.
var(
"sensible").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
550 ncf.
var(
"sensible").
put_attr(
"field",
"sensible heat flux, scalar, series");
554 ncf.
var(
"lwrad").
put_attr(
"long_name",
"net longwave radiation flux");
559 ncf.
var(
"lwrad").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
560 ncf.
var(
"lwrad").
put_attr(
"field",
"longwave radiation, scalar, series");
564 ncf.
var(
"swrad").
put_attr(
"long_name",
"solar shortwave radiation flux");
569 ncf.
var(
"swrad").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
570 ncf.
var(
"swrad").
put_attr(
"field",
"shortwave radiation, scalar, series");
574 ncf.
var(
"evaporation").
put_attr(
"long_name",
"evaporation rate");
575 ncf.
var(
"evaporation").
put_attr(
"units",
"kilogram meter-2 second-1");
576 ncf.
var(
"evaporation").
put_attr(
"time",
"ocean_time");
578 ncf.
var(
"evaporation").
put_attr(
"location",
"face");
579 ncf.
var(
"evaporation").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
580 ncf.
var(
"evaporation").
put_attr(
"field",
"evaporation, scalar, series");
584 ncf.
var(
"rain").
put_attr(
"long_name",
"rain fall rate");
585 ncf.
var(
"rain").
put_attr(
"units",
"kilogram meter-2 second-1");
589 ncf.
var(
"rain").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
590 ncf.
var(
"rain").
put_attr(
"field",
"rain, scalar, series");
593 ncf.
put_attr(
"space_dimension", std::vector<int> { AMREX_SPACEDIM });
596 ncf.
put_attr(
"CurrentLevel", std::vector<int> { flev });
597 ncf.
put_attr(
"DefaultGeometry", std::vector<int> { amrex::DefaultGeometry().Coord() });
606 Real dx[AMREX_SPACEDIM];
607 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
608 dx[i] = geom[lev].CellSize()[i];
610 const auto *base = geom[lev].ProbLo();
611 RealBox rb(subdomain, dx, base);
613 amrex::Vector<Real> probLo;
614 amrex::Vector<Real> probHi;
615 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
616 probLo.push_back(rb.lo(i));
617 probHi.push_back(rb.hi(i));
622 ncmpi_begin_indep_data(ncf.
ncid);
623 if (amrex::ParallelDescriptor::IOProcessor())
625 auto nc_probLo = ncf.
var(
"probLo");
627 nc_probLo.
put(probLo.data(), { 0 }, { AMREX_SPACEDIM });
629 auto nc_probHi = ncf.
var(
"probHi");
631 nc_probHi.
put(probHi.data(), { 0 }, { AMREX_SPACEDIM });
633 amrex::Vector<int> smallend;
634 amrex::Vector<int> bigend;
635 for (
int i = lev; i < flev; i++) {
638 for (
int j = 0; j < AMREX_SPACEDIM; j++) {
639 smallend.push_back(subdomain.smallEnd(j));
640 bigend.push_back(subdomain.bigEnd(j));
642 auto nc_Geom_smallend = ncf.
var(
"Geom.smallend");
644 nc_Geom_smallend.
put(smallend.data(), { static_cast<long long int>(i - lev), 0 }, { 1,
647 auto nc_Geom_bigend = ncf.
var(
"Geom.bigend");
649 nc_Geom_bigend.
put(bigend.data(), { static_cast<long long int>(i - lev), 0 }, { 1,
653 amrex::Vector<Real> CellSize;
654 for (
int i = lev; i < flev; i++) {
657 CellSize.push_back(amrex::Real(j));
659 auto nc_CellSize = ncf.
var(
"CellSize");
661 nc_CellSize.
put(CellSize.data(), {
static_cast<long long int>(i - lev), 0 }, { 1,
668 ncf.
var(
"theta_s").
put(&theta_s);
669 ncf.
var(
"theta_b").
put(&theta_b);
672 ncmpi_end_indep_data(ncf.
ncid);
676 ncmpi_begin_indep_data(ncf.
ncid);
681 long long local_start_nt = (is_history ?
static_cast<long long>(adjusted_history_count) :
static_cast<long long>(0));
682 long long local_nt = 1;
685 auto nc_plot_var = ncf.
var(
"ocean_time");
687 nc_plot_var.
put(&
t_new[lev], { local_start_nt }, { local_nt });
696 amrex::Abort(
"Found while writing output: zeta contains nan or inf");
699 amrex::Abort(
"Found while writing output: Temperature contains nan or inf");
702 amrex::Abort(
"Found while writing output: Salinity contains nan or inf");
705 amrex::Abort(
"Found while writing output: Passive tracer contains nan or inf");
708 amrex::Abort(
"Found while writing output: velocity u contains nan or inf");
711 amrex::Abort(
"Found while writing output: velocity ubar contains nan or inf");
714 amrex::Abort(
"Found while writing output: velocity v contains nan or inf");
717 amrex::Abort(
"Found while writing output: velocity vbar contains nan or inf");
720 for (MFIter mfi(*plotMF,
false); mfi.isValid(); ++mfi) {
721 auto bx = mfi.validbox();
722 if (subdomain.contains(bx)) {
727 if (tmp_bx.smallEnd()[0] == subdomain.smallEnd()[0])
729 if (tmp_bx.smallEnd()[1] == subdomain.smallEnd()[1])
731 if (tmp_bx.bigEnd()[0] == subdomain.bigEnd()[0])
733 if (tmp_bx.bigEnd()[1] == subdomain.bigEnd()[1])
738 Box tmp_bx_2d(tmp_bx);
739 tmp_bx_2d.makeSlab(2, 0);
741 Box tmp_bx_1d(tmp_bx);
742 tmp_bx_1d.makeSlab(0, 0);
743 tmp_bx_1d.makeSlab(1, 0);
748 long long local_nx = tmp_bx.length()[0];
749 long long local_ny = tmp_bx.length()[1];
750 long long local_nz = tmp_bx.length()[2];
753 long long local_start_x =
static_cast<long long>(tmp_bx.smallEnd()[0] + 1);
754 long long local_start_y =
static_cast<long long>(tmp_bx.smallEnd()[1] + 1);
755 long long local_start_z =
static_cast<long long>(tmp_bx.smallEnd()[2]);
759 if (bx.contains(IntVect(0,0,0)))
762 amrex::Vector<amrex::Real> tmp_srho(local_nz);
765 Gpu::dtoh_memcpy(tmp_srho.data(),
s_r.data(),
sizeof(amrex::Real)*local_nz);
767 std::memcpy(tmp_srho.data(),
s_r.data(),
sizeof(amrex::Real)*local_nz);
769 Gpu::streamSynchronize();
771 auto nc_plot_var = ncf.
var(
"s_rho");
773 nc_plot_var.
put(tmp_srho.data(), { local_start_z }, { local_nz });
776 amrex::Vector<amrex::Real> tmp_sw(local_nz+1);
779 Gpu::dtoh_memcpy(tmp_sw.data(),
s_w.data(),
sizeof(amrex::Real)*(local_nz+1));
781 std::memcpy(tmp_sw.data(),
s_w.data(),
sizeof(amrex::Real)*(local_nz+1));
783 Gpu::streamSynchronize();
785 auto nc_plot_var = ncf.
var(
"s_w");
787 nc_plot_var.
put(tmp_sw.data(), { local_start_z }, { local_nz + 1});
790 amrex::Vector<amrex::Real> tmp_Csrho(local_nz);
793 Gpu::dtoh_memcpy(tmp_Csrho.data(),
Cs_r.data(),
sizeof(amrex::Real)*(local_nz));
795 std::memcpy(tmp_Csrho.data(),
Cs_r.data(),
sizeof(amrex::Real)*(local_nz));
797 Gpu::streamSynchronize();
799 auto nc_plot_var = ncf.
var(
"Cs_r");
801 nc_plot_var.
put(tmp_Csrho.data(), { local_start_z }, { local_nz });
804 amrex::Vector<amrex::Real> tmp_Csw(local_nz+1);
807 Gpu::dtoh_memcpy(tmp_Csw.data(),
Cs_w.data(),
sizeof(amrex::Real)*(local_nz+1));
809 std::memcpy(tmp_Csw.data(),
Cs_w.data(),
sizeof(amrex::Real)*(local_nz+1));
812 Gpu::streamSynchronize();
814 auto nc_plot_var = ncf.
var(
"Cs_w");
816 nc_plot_var.
put(tmp_Csw.data(), { local_start_z }, { local_nz + 1});
822 tmp_bathy.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
824 tmp_bathy.template copy<RunOn::Device>((*
vec_h[lev])[mfi.index()], 0, 0, 1);
825 Gpu::streamSynchronize();
827 auto nc_plot_var = ncf.
var(
"h");
829 nc_plot_var.
put(tmp_bathy.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
834 tmp_pm.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
836 tmp_pm.template copy<RunOn::Device>((*
vec_pm[lev])[mfi.index()], 0, 0, 1);
837 Gpu::streamSynchronize();
839 auto nc_plot_var = ncf.
var(
"pm");
842 nc_plot_var.
put(tmp_pm.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
847 tmp_pn.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
849 tmp_pn.template copy<RunOn::Device>((*
vec_pn[lev])[mfi.index()], 0, 0, 1);
850 Gpu::streamSynchronize();
852 auto nc_plot_var = ncf.
var(
"pn");
854 nc_plot_var.
put(tmp_pn.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
859 tmp_f.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
861 tmp_f.template copy<RunOn::Device>((*
vec_fcor[lev])[mfi.index()], 0, 0, 1);
862 Gpu::streamSynchronize();
864 auto nc_plot_var = ncf.
var(
"f");
866 nc_plot_var.
put(tmp_f.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
871 tmp_xr.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
873 tmp_xr.template copy<RunOn::Device>((*
vec_xr[lev])[mfi.index()], 0, 0, 1);
874 Gpu::streamSynchronize();
876 auto nc_plot_var = ncf.
var(
"x_rho");
879 nc_plot_var.
put(tmp_xr.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
884 tmp_yr.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
886 tmp_yr.template copy<RunOn::Device>((*
vec_yr[lev])[mfi.index()], 0, 0, 1);
887 Gpu::streamSynchronize();
889 auto nc_plot_var = ncf.
var(
"y_rho");
891 nc_plot_var.
put(tmp_yr.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
897 tmp_zeta.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
898 tmp_zeta.template copy<RunOn::Device>((*
vec_Zt_avg1[lev])[mfi.index()], 0, 0, 1);
899 Gpu::streamSynchronize();
901 auto nc_plot_var = ncf.
var(
"zeta");
902 nc_plot_var.
put(tmp_zeta.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny,
912 tmp_Tair.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
913 tmp_Tair.template copy<RunOn::Device>((*
vec_Tair[lev])[mfi.index()], 0, 0, 1);
914 Gpu::streamSynchronize();
916 auto nc_plot_var = ncf.
var(
"Tair");
917 nc_plot_var.
put(tmp_Tair.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
922 tmp_Pair.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
923 tmp_Pair.template copy<RunOn::Device>((*
vec_Pair[lev])[mfi.index()], 0, 0, 1);
924 Gpu::streamSynchronize();
926 auto nc_plot_var = ncf.
var(
"Pair");
927 nc_plot_var.
put(tmp_Pair.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
932 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
935 tmp.template copy<RunOn::Device>(
942 Gpu::streamSynchronize();
945 tmp.mult<RunOn::Device>(Hscale);
947 auto nc_var = ncf.
var(
"qnet");
948 nc_var.
put(tmp.dataPtr(),
949 { local_start_nt, local_start_y, local_start_x },
950 { local_nt, local_ny, local_nx });
955 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
958 tmp.template copy<RunOn::Device>(
965 Gpu::streamSynchronize();
967 auto nc_var = ncf.
var(
"ssflux");
968 nc_var.
put(tmp.dataPtr(),
969 { local_start_nt, local_start_y, local_start_x },
970 { local_nt, local_ny, local_nx });
975 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
976 tmp.template copy<RunOn::Device>((*
vec_lhflx[lev])[mfi.index()], 0, 0, 1);
977 Gpu::streamSynchronize();
980 tmp.mult<RunOn::Device>(Hscale);
982 auto nc_var = ncf.
var(
"latent");
983 nc_var.
put(tmp.dataPtr(),
984 { local_start_nt, local_start_y, local_start_x },
985 { local_nt, local_ny, local_nx });
990 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
991 tmp.template copy<RunOn::Device>((*
vec_shflx[lev])[mfi.index()], 0, 0, 1);
992 Gpu::streamSynchronize();
995 tmp.mult<RunOn::Device>(Hscale);
997 auto nc_var = ncf.
var(
"sensible");
998 nc_var.
put(tmp.dataPtr(),
999 { local_start_nt, local_start_y, local_start_x },
1000 { local_nt, local_ny, local_nx });
1005 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1006 tmp.template copy<RunOn::Device>((*
vec_lrflx[lev])[mfi.index()], 0, 0, 1);
1007 Gpu::streamSynchronize();
1010 tmp.mult<RunOn::Device>(Hscale);
1012 auto nc_var = ncf.
var(
"lwrad");
1013 nc_var.
put(tmp.dataPtr(),
1014 { local_start_nt, local_start_y, local_start_x },
1015 { local_nt, local_ny, local_nx });
1020 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1021 tmp.template copy<RunOn::Device>((*
vec_srflx[lev])[mfi.index()], 0, 0, 1);
1022 Gpu::streamSynchronize();
1024 auto nc_var = ncf.
var(
"swrad");
1025 nc_var.
put(tmp.dataPtr(),
1026 { local_start_nt, local_start_y, local_start_x },
1027 { local_nt, local_ny, local_nx });
1032 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1033 tmp.template copy<RunOn::Device>((*
vec_evap[lev])[mfi.index()], 0, 0, 1);
1034 Gpu::streamSynchronize();
1036 auto nc_var = ncf.
var(
"evaporation");
1037 nc_var.
put(tmp.dataPtr(),
1038 { local_start_nt, local_start_y, local_start_x },
1039 { local_nt, local_ny, local_nx });
1044 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1045 tmp.template copy<RunOn::Device>((*
vec_rain[lev])[mfi.index()], 0, 0, 1);
1046 Gpu::streamSynchronize();
1048 auto nc_var = ncf.
var(
"rain");
1049 nc_var.
put(tmp.dataPtr(),
1050 { local_start_nt, local_start_y, local_start_x },
1051 { local_nt, local_ny, local_nx });
1063 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1064 tmp.template copy<RunOn::Device>((*plotMF)[mfi.index()], comp, 0, 1);
1065 Gpu::streamSynchronize();
1068 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1069 local_nz, local_ny, local_nx });
1082 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1083 tmp.template copy<RunOn::Device>((*plotMF)[mfi.index()], comp, 0, 1);
1084 Gpu::streamSynchronize();
1087 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1088 local_nz, local_ny, local_nx });
1101 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1102 tmp.template copy<RunOn::Device>((*plotMF)[mfi.index()], comp, 0, 1);
1103 Gpu::streamSynchronize();
1106 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1107 local_nz, local_ny, local_nx });
1120 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1121 tmp.template copy<RunOn::Device>((*plotMF)[mfi.index()], comp, 0, 1);
1122 Gpu::streamSynchronize();
1125 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1126 local_nz, local_ny, local_nx });
1138 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1139 tmp.template copy<RunOn::Device>((*
vec_visc2_r[lev])[mfi.index()], 0, 0, 1);
1140 Gpu::streamSynchronize();
1142 auto nc_var = ncf.
var(
"visc2");
1143 nc_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1148 const std::string nm = std::string(
"diff2_") +
cons_names[n];
1150 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1151 tmp.template copy<RunOn::Device>((*
vec_diff2[lev])[mfi.index()], n, 0, 1);
1152 Gpu::streamSynchronize();
1154 auto nc_var = ncf.
var(nm);
1155 nc_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1166 for (MFIter mfi(*plotMF,
false); mfi.isValid(); ++mfi) {
1167 Box bx = mfi.validbox();
1169 if (subdomain.contains(bx)) {
1174 tmp_bx.surroundingNodes(0);
1175 if (tmp_bx.smallEnd()[1] == subdomain.smallEnd()[1])
1176 tmp_bx.growLo(1, 1);
1177 if (tmp_bx.bigEnd()[1] == subdomain.bigEnd()[1])
1178 tmp_bx.growHi(1, 1);
1179 Box tmp_bx_2d(tmp_bx);
1180 tmp_bx_2d.makeSlab(2, 0);
1185 long long local_nx = tmp_bx.length()[0];
1186 long long local_ny = tmp_bx.length()[1];
1187 long long local_nz = tmp_bx.length()[2];
1190 long long local_start_x =
static_cast<long long>(tmp_bx.smallEnd()[0]);
1191 long long local_start_y =
static_cast<long long>(tmp_bx.smallEnd()[1] + 1);
1192 long long local_start_z =
static_cast<long long>(tmp_bx.smallEnd()[2]);
1197 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1198 tmp.template copy<RunOn::Device>((*
vec_xu[lev])[mfi.index()], 0, 0, 1);
1199 Gpu::streamSynchronize();
1201 auto nc_plot_var = ncf.
var(
"x_u");
1203 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1207 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1208 tmp.template copy<RunOn::Device>((*
vec_yu[lev])[mfi.index()], 0, 0, 1);
1209 Gpu::streamSynchronize();
1211 auto nc_plot_var = ncf.
var(
"y_u");
1213 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1219 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1220 tmp.template copy<RunOn::Device>((*
xvel_new[lev])[mfi.index()], 0, 0, 1);
1221 Gpu::streamSynchronize();
1223 auto nc_plot_var = ncf.
var(
"u");
1224 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1225 local_nz, local_ny, local_nx });
1230 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1231 tmp.template copy<RunOn::Device>((*
vec_ubar[lev])[mfi.index()], 0, 0, 1);
1232 Gpu::streamSynchronize();
1234 auto nc_plot_var = ncf.
var(
"ubar");
1235 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
1239 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1240 tmp.template copy<RunOn::Device>((*
vec_sustr[lev])[mfi.index()], 0, 0, 1);
1241 Gpu::streamSynchronize();
1243 auto nc_plot_var = ncf.
var(
"sustr");
1244 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
1250 for (MFIter mfi(*plotMF,
false); mfi.isValid(); ++mfi) {
1251 Box bx = mfi.validbox();
1253 if (subdomain.contains(bx)) {
1258 tmp_bx.surroundingNodes(1);
1259 if (tmp_bx.smallEnd()[0] == subdomain.smallEnd()[0])
1260 tmp_bx.growLo(0, 1);
1261 if (tmp_bx.bigEnd()[0] == subdomain.bigEnd()[0])
1262 tmp_bx.growHi(0, 1);
1266 Box tmp_bx_2d(tmp_bx);
1267 tmp_bx_2d.makeSlab(2, 0);
1272 long long local_nx = tmp_bx.length()[0];
1273 long long local_ny = tmp_bx.length()[1];
1274 long long local_nz = tmp_bx.length()[2];
1277 long long local_start_x =
static_cast<long long>(tmp_bx.smallEnd()[0] + 1);
1278 long long local_start_y =
static_cast<long long>(tmp_bx.smallEnd()[1]);
1279 long long local_start_z =
static_cast<long long>(tmp_bx.smallEnd()[2]);
1284 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1285 tmp.template copy<RunOn::Device>((*
vec_xv[lev])[mfi.index()], 0, 0, 1);
1286 Gpu::streamSynchronize();
1288 auto nc_plot_var = ncf.
var(
"x_v");
1290 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1294 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1295 tmp.template copy<RunOn::Device>((*
vec_yv[lev])[mfi.index()], 0, 0, 1);
1296 Gpu::streamSynchronize();
1298 auto nc_plot_var = ncf.
var(
"y_v");
1300 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1306 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1307 tmp.template copy<RunOn::Device>((*
yvel_new[lev])[mfi.index()], 0, 0, 1);
1308 Gpu::streamSynchronize();
1310 auto nc_plot_var = ncf.
var(
"v");
1311 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1312 local_nz, local_ny, local_nx });
1317 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1318 tmp.template copy<RunOn::Device>((*
vec_vbar[lev])[mfi.index()], 0, 0, 1);
1319 Gpu::streamSynchronize();
1321 auto nc_plot_var = ncf.
var(
"vbar");
1322 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
1327 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1328 tmp.template copy<RunOn::Device>((*
vec_svstr[lev])[mfi.index()], 0, 0, 1);
1329 Gpu::streamSynchronize();
1331 auto nc_plot_var = ncf.
var(
"svstr");
1332 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
1338 for (MFIter mfi(*plotMF,
false); mfi.isValid(); ++mfi) {
1339 Box bx = mfi.validbox();
1341 if (subdomain.contains(bx)) {
1346 tmp_bx.surroundingNodes(0);
1347 tmp_bx.surroundingNodes(1);
1349 Box tmp_bx_2d(tmp_bx);
1350 tmp_bx_2d.makeSlab(2, 0);
1355 long long local_nx = tmp_bx.length()[0];
1356 long long local_ny = tmp_bx.length()[1];
1359 long long local_start_x =
static_cast<long long>(tmp_bx.smallEnd()[0]);
1360 long long local_start_y =
static_cast<long long>(tmp_bx.smallEnd()[1]);
1365 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1366 tmp.template copy<RunOn::Device>((*
vec_xp[lev])[mfi.index()], 0, 0, 1);
1367 Gpu::streamSynchronize();
1369 auto nc_plot_var = ncf.
var(
"x_psi");
1371 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1375 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1376 tmp.template copy<RunOn::Device>((*
vec_yp[lev])[mfi.index()], 0, 0, 1);
1377 Gpu::streamSynchronize();
1379 auto nc_plot_var = ncf.
var(
"y_psi");
1381 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });