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");
416 ncf.
var(
"u").
put_attr(
"long_name",
"u-momentum component");
421 ncf.
var(
"u").
put_attr(
"coordinates",
"x_u y_u s_rho ocean_time");
422 ncf.
var(
"u").
put_attr(
"field",
"u-velocity, scalar, series");
425 ncf.
var(
"v").
put_attr(
"long_name",
"v-momentum component");
430 ncf.
var(
"v").
put_attr(
"coordinates",
"x_v y_v s_rho ocean_time");
431 ncf.
var(
"v").
put_attr(
"field",
"v-velocity, scalar, series");
434 ncf.
var(
"ubar").
put_attr(
"long_name",
"vertically integrated u-momentum component");
435 ncf.
var(
"ubar").
put_attr(
"units",
"meter second-1");
439 ncf.
var(
"ubar").
put_attr(
"coordinates",
"x_u y_u ocean_time");
440 ncf.
var(
"ubar").
put_attr(
"field",
"ubar-velocity, scalar, series");
443 ncf.
var(
"vbar").
put_attr(
"long_name",
"vertically integrated v-momentum component");
444 ncf.
var(
"vbar").
put_attr(
"units",
"meter second-1");
448 ncf.
var(
"vbar").
put_attr(
"coordinates",
"x_v y_v ocean_time");
449 ncf.
var(
"vbar").
put_attr(
"field",
"vbar-velocity, scalar, series");
452 ncf.
var(
"sustr").
put_attr(
"long_name",
"surface u-momentum stress");
453 ncf.
var(
"sustr").
put_attr(
"units",
"newton meter-2");
457 ncf.
var(
"sustr").
put_attr(
"coordinates",
"x_u y_u ocean_time");
458 ncf.
var(
"sustr").
put_attr(
"field",
"surface u-momentum stress, scalar, series");
461 ncf.
var(
"svstr").
put_attr(
"long_name",
"surface v-momentum stress");
462 ncf.
var(
"svstr").
put_attr(
"units",
"newton meter-2");
466 ncf.
var(
"svstr").
put_attr(
"coordinates",
"x_v y_v ocean_time");
467 ncf.
var(
"svstr").
put_attr(
"field",
"surface v-momentum stress, scalar, series");
472 ncf.
var(
"Tair").
put_attr(
"long_name",
"surface air temperature");
477 ncf.
var(
"Tair").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
478 ncf.
var(
"Tair").
put_attr(
"field",
"Tair, scalar, series");
482 ncf.
var(
"Pair").
put_attr(
"long_name",
"surface air pressure");
487 ncf.
var(
"Pair").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
488 ncf.
var(
"Pair").
put_attr(
"field",
"Pair, scalar, series");
492 ncf.
var(
"qnet").
put_attr(
"long_name",
"surface net heat flux");
497 ncf.
var(
"qnet").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
498 ncf.
var(
"qnet").
put_attr(
"field",
"surface heat flux, scalar, series");
502 ncf.
var(
"ssflux").
put_attr(
"long_name",
"kinematic surface net salt flux, SALT*(E-P)/rhow");
503 ncf.
var(
"ssflux").
put_attr(
"units",
"meter second-1");
507 ncf.
var(
"ssflux").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
508 ncf.
var(
"ssflux").
put_attr(
"field",
"surface net salt flux, scalar, series");
512 ncf.
var(
"latent").
put_attr(
"long_name",
"net latent heat flux");
513 ncf.
var(
"latent").
put_attr(
"units",
"watt meter-2");
517 ncf.
var(
"latent").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
518 ncf.
var(
"latent").
put_attr(
"field",
"latent heat flux, scalar, series");
522 ncf.
var(
"sensible").
put_attr(
"long_name",
"net sensible heat flux");
523 ncf.
var(
"sensible").
put_attr(
"units",
"watt meter-2");
527 ncf.
var(
"sensible").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
528 ncf.
var(
"sensible").
put_attr(
"field",
"sensible heat flux, scalar, series");
532 ncf.
var(
"lwrad").
put_attr(
"long_name",
"net longwave radiation flux");
537 ncf.
var(
"lwrad").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
538 ncf.
var(
"lwrad").
put_attr(
"field",
"longwave radiation, scalar, series");
542 ncf.
var(
"swrad").
put_attr(
"long_name",
"solar shortwave radiation flux");
547 ncf.
var(
"swrad").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
548 ncf.
var(
"swrad").
put_attr(
"field",
"shortwave radiation, scalar, series");
552 ncf.
var(
"evaporation").
put_attr(
"long_name",
"evaporation rate");
553 ncf.
var(
"evaporation").
put_attr(
"units",
"kilogram meter-2 second-1");
554 ncf.
var(
"evaporation").
put_attr(
"time",
"ocean_time");
556 ncf.
var(
"evaporation").
put_attr(
"location",
"face");
557 ncf.
var(
"evaporation").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
558 ncf.
var(
"evaporation").
put_attr(
"field",
"evaporation, scalar, series");
562 ncf.
var(
"rain").
put_attr(
"long_name",
"rain fall rate");
563 ncf.
var(
"rain").
put_attr(
"units",
"kilogram meter-2 second-1");
567 ncf.
var(
"rain").
put_attr(
"coordinates",
"x_rho y_rho ocean_time");
568 ncf.
var(
"rain").
put_attr(
"field",
"rain, scalar, series");
571 ncf.
put_attr(
"space_dimension", std::vector<int> { AMREX_SPACEDIM });
574 ncf.
put_attr(
"CurrentLevel", std::vector<int> { flev });
575 ncf.
put_attr(
"DefaultGeometry", std::vector<int> { amrex::DefaultGeometry().Coord() });
584 Real dx[AMREX_SPACEDIM];
585 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
586 dx[i] = geom[lev].CellSize()[i];
588 const auto *base = geom[lev].ProbLo();
589 RealBox rb(subdomain, dx, base);
591 amrex::Vector<Real> probLo;
592 amrex::Vector<Real> probHi;
593 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
594 probLo.push_back(rb.lo(i));
595 probHi.push_back(rb.hi(i));
600 ncmpi_begin_indep_data(ncf.
ncid);
601 if (amrex::ParallelDescriptor::IOProcessor())
603 auto nc_probLo = ncf.
var(
"probLo");
605 nc_probLo.
put(probLo.data(), { 0 }, { AMREX_SPACEDIM });
607 auto nc_probHi = ncf.
var(
"probHi");
609 nc_probHi.
put(probHi.data(), { 0 }, { AMREX_SPACEDIM });
611 amrex::Vector<int> smallend;
612 amrex::Vector<int> bigend;
613 for (
int i = lev; i < flev; i++) {
616 for (
int j = 0; j < AMREX_SPACEDIM; j++) {
617 smallend.push_back(subdomain.smallEnd(j));
618 bigend.push_back(subdomain.bigEnd(j));
620 auto nc_Geom_smallend = ncf.
var(
"Geom.smallend");
622 nc_Geom_smallend.
put(smallend.data(), { static_cast<long long int>(i - lev), 0 }, { 1,
625 auto nc_Geom_bigend = ncf.
var(
"Geom.bigend");
627 nc_Geom_bigend.
put(bigend.data(), { static_cast<long long int>(i - lev), 0 }, { 1,
631 amrex::Vector<Real> CellSize;
632 for (
int i = lev; i < flev; i++) {
635 CellSize.push_back(amrex::Real(j));
637 auto nc_CellSize = ncf.
var(
"CellSize");
639 nc_CellSize.
put(CellSize.data(), {
static_cast<long long int>(i - lev), 0 }, { 1,
646 ncf.
var(
"theta_s").
put(&theta_s);
647 ncf.
var(
"theta_b").
put(&theta_b);
650 ncmpi_end_indep_data(ncf.
ncid);
654 ncmpi_begin_indep_data(ncf.
ncid);
659 long long local_start_nt = (is_history ?
static_cast<long long>(adjusted_history_count) :
static_cast<long long>(0));
660 long long local_nt = 1;
663 auto nc_plot_var = ncf.
var(
"ocean_time");
665 nc_plot_var.
put(&
t_new[lev], { local_start_nt }, { local_nt });
674 amrex::Abort(
"Found while writing output: zeta contains nan or inf");
677 amrex::Abort(
"Found while writing output: Temperature contains nan or inf");
680 amrex::Abort(
"Found while writing output: Salinity contains nan or inf");
683 amrex::Abort(
"Found while writing output: Passive tracer contains nan or inf");
686 amrex::Abort(
"Found while writing output: velocity u contains nan or inf");
689 amrex::Abort(
"Found while writing output: velocity ubar contains nan or inf");
692 amrex::Abort(
"Found while writing output: velocity v contains nan or inf");
695 amrex::Abort(
"Found while writing output: velocity vbar contains nan or inf");
698 for (MFIter mfi(*plotMF,
false); mfi.isValid(); ++mfi) {
699 auto bx = mfi.validbox();
700 if (subdomain.contains(bx)) {
705 if (tmp_bx.smallEnd()[0] == subdomain.smallEnd()[0])
707 if (tmp_bx.smallEnd()[1] == subdomain.smallEnd()[1])
709 if (tmp_bx.bigEnd()[0] == subdomain.bigEnd()[0])
711 if (tmp_bx.bigEnd()[1] == subdomain.bigEnd()[1])
716 Box tmp_bx_2d(tmp_bx);
717 tmp_bx_2d.makeSlab(2, 0);
719 Box tmp_bx_1d(tmp_bx);
720 tmp_bx_1d.makeSlab(0, 0);
721 tmp_bx_1d.makeSlab(1, 0);
726 long long local_nx = tmp_bx.length()[0];
727 long long local_ny = tmp_bx.length()[1];
728 long long local_nz = tmp_bx.length()[2];
731 long long local_start_x =
static_cast<long long>(tmp_bx.smallEnd()[0] + 1);
732 long long local_start_y =
static_cast<long long>(tmp_bx.smallEnd()[1] + 1);
733 long long local_start_z =
static_cast<long long>(tmp_bx.smallEnd()[2]);
737 if (bx.contains(IntVect(0,0,0)))
740 amrex::Vector<amrex::Real> tmp_srho(local_nz);
743 Gpu::dtoh_memcpy(tmp_srho.data(),
s_r.data(),
sizeof(amrex::Real)*local_nz);
745 std::memcpy(tmp_srho.data(),
s_r.data(),
sizeof(amrex::Real)*local_nz);
747 Gpu::streamSynchronize();
749 auto nc_plot_var = ncf.
var(
"s_rho");
751 nc_plot_var.
put(tmp_srho.data(), { local_start_z }, { local_nz });
754 amrex::Vector<amrex::Real> tmp_sw(local_nz+1);
757 Gpu::dtoh_memcpy(tmp_sw.data(),
s_w.data(),
sizeof(amrex::Real)*(local_nz+1));
759 std::memcpy(tmp_sw.data(),
s_w.data(),
sizeof(amrex::Real)*(local_nz+1));
761 Gpu::streamSynchronize();
763 auto nc_plot_var = ncf.
var(
"s_w");
765 nc_plot_var.
put(tmp_sw.data(), { local_start_z }, { local_nz + 1});
768 amrex::Vector<amrex::Real> tmp_Csrho(local_nz);
771 Gpu::dtoh_memcpy(tmp_Csrho.data(),
Cs_r.data(),
sizeof(amrex::Real)*(local_nz));
773 std::memcpy(tmp_Csrho.data(),
Cs_r.data(),
sizeof(amrex::Real)*(local_nz));
775 Gpu::streamSynchronize();
777 auto nc_plot_var = ncf.
var(
"Cs_r");
779 nc_plot_var.
put(tmp_Csrho.data(), { local_start_z }, { local_nz });
782 amrex::Vector<amrex::Real> tmp_Csw(local_nz+1);
785 Gpu::dtoh_memcpy(tmp_Csw.data(),
Cs_w.data(),
sizeof(amrex::Real)*(local_nz+1));
787 std::memcpy(tmp_Csw.data(),
Cs_w.data(),
sizeof(amrex::Real)*(local_nz+1));
790 Gpu::streamSynchronize();
792 auto nc_plot_var = ncf.
var(
"Cs_w");
794 nc_plot_var.
put(tmp_Csw.data(), { local_start_z }, { local_nz + 1});
800 tmp_bathy.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
802 tmp_bathy.template copy<RunOn::Device>((*
vec_h[lev])[mfi.index()], 0, 0, 1);
803 Gpu::streamSynchronize();
805 auto nc_plot_var = ncf.
var(
"h");
807 nc_plot_var.
put(tmp_bathy.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
812 tmp_pm.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
814 tmp_pm.template copy<RunOn::Device>((*
vec_pm[lev])[mfi.index()], 0, 0, 1);
815 Gpu::streamSynchronize();
817 auto nc_plot_var = ncf.
var(
"pm");
820 nc_plot_var.
put(tmp_pm.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
825 tmp_pn.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
827 tmp_pn.template copy<RunOn::Device>((*
vec_pn[lev])[mfi.index()], 0, 0, 1);
828 Gpu::streamSynchronize();
830 auto nc_plot_var = ncf.
var(
"pn");
832 nc_plot_var.
put(tmp_pn.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
837 tmp_f.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
839 tmp_f.template copy<RunOn::Device>((*
vec_fcor[lev])[mfi.index()], 0, 0, 1);
840 Gpu::streamSynchronize();
842 auto nc_plot_var = ncf.
var(
"f");
844 nc_plot_var.
put(tmp_f.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
849 tmp_xr.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
851 tmp_xr.template copy<RunOn::Device>((*
vec_xr[lev])[mfi.index()], 0, 0, 1);
852 Gpu::streamSynchronize();
854 auto nc_plot_var = ncf.
var(
"x_rho");
857 nc_plot_var.
put(tmp_xr.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
862 tmp_yr.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
864 tmp_yr.template copy<RunOn::Device>((*
vec_yr[lev])[mfi.index()], 0, 0, 1);
865 Gpu::streamSynchronize();
867 auto nc_plot_var = ncf.
var(
"y_rho");
869 nc_plot_var.
put(tmp_yr.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
875 tmp_zeta.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
876 tmp_zeta.template copy<RunOn::Device>((*
vec_Zt_avg1[lev])[mfi.index()], 0, 0, 1);
877 Gpu::streamSynchronize();
879 auto nc_plot_var = ncf.
var(
"zeta");
880 nc_plot_var.
put(tmp_zeta.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny,
890 tmp_Tair.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
891 tmp_Tair.template copy<RunOn::Device>((*
vec_Tair[lev])[mfi.index()], 0, 0, 1);
892 Gpu::streamSynchronize();
894 auto nc_plot_var = ncf.
var(
"Tair");
895 nc_plot_var.
put(tmp_Tair.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
900 tmp_Pair.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
901 tmp_Pair.template copy<RunOn::Device>((*
vec_Pair[lev])[mfi.index()], 0, 0, 1);
902 Gpu::streamSynchronize();
904 auto nc_plot_var = ncf.
var(
"Pair");
905 nc_plot_var.
put(tmp_Pair.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
910 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
913 tmp.template copy<RunOn::Device>(
920 Gpu::streamSynchronize();
923 tmp.mult<RunOn::Device>(Hscale);
925 auto nc_var = ncf.
var(
"qnet");
926 nc_var.
put(tmp.dataPtr(),
927 { local_start_nt, local_start_y, local_start_x },
928 { local_nt, local_ny, local_nx });
933 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
936 tmp.template copy<RunOn::Device>(
943 Gpu::streamSynchronize();
945 auto nc_var = ncf.
var(
"ssflux");
946 nc_var.
put(tmp.dataPtr(),
947 { local_start_nt, local_start_y, local_start_x },
948 { local_nt, local_ny, local_nx });
953 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
954 tmp.template copy<RunOn::Device>((*
vec_lhflx[lev])[mfi.index()], 0, 0, 1);
955 Gpu::streamSynchronize();
958 tmp.mult<RunOn::Device>(Hscale);
960 auto nc_var = ncf.
var(
"latent");
961 nc_var.
put(tmp.dataPtr(),
962 { local_start_nt, local_start_y, local_start_x },
963 { local_nt, local_ny, local_nx });
968 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
969 tmp.template copy<RunOn::Device>((*
vec_shflx[lev])[mfi.index()], 0, 0, 1);
970 Gpu::streamSynchronize();
973 tmp.mult<RunOn::Device>(Hscale);
975 auto nc_var = ncf.
var(
"sensible");
976 nc_var.
put(tmp.dataPtr(),
977 { local_start_nt, local_start_y, local_start_x },
978 { local_nt, local_ny, local_nx });
983 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
984 tmp.template copy<RunOn::Device>((*
vec_lrflx[lev])[mfi.index()], 0, 0, 1);
985 Gpu::streamSynchronize();
988 tmp.mult<RunOn::Device>(Hscale);
990 auto nc_var = ncf.
var(
"lwrad");
991 nc_var.
put(tmp.dataPtr(),
992 { local_start_nt, local_start_y, local_start_x },
993 { local_nt, local_ny, local_nx });
998 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
999 tmp.template copy<RunOn::Device>((*
vec_srflx[lev])[mfi.index()], 0, 0, 1);
1000 Gpu::streamSynchronize();
1002 auto nc_var = ncf.
var(
"swrad");
1003 nc_var.
put(tmp.dataPtr(),
1004 { local_start_nt, local_start_y, local_start_x },
1005 { local_nt, local_ny, local_nx });
1010 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1011 tmp.template copy<RunOn::Device>((*
vec_evap[lev])[mfi.index()], 0, 0, 1);
1012 Gpu::streamSynchronize();
1014 auto nc_var = ncf.
var(
"evaporation");
1015 nc_var.
put(tmp.dataPtr(),
1016 { local_start_nt, local_start_y, local_start_x },
1017 { local_nt, local_ny, local_nx });
1022 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1023 tmp.template copy<RunOn::Device>((*
vec_rain[lev])[mfi.index()], 0, 0, 1);
1024 Gpu::streamSynchronize();
1026 auto nc_var = ncf.
var(
"rain");
1027 nc_var.
put(tmp.dataPtr(),
1028 { local_start_nt, local_start_y, local_start_x },
1029 { local_nt, local_ny, local_nx });
1041 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1042 tmp.template copy<RunOn::Device>((*plotMF)[mfi.index()], comp, 0, 1);
1043 Gpu::streamSynchronize();
1046 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1047 local_nz, local_ny, local_nx });
1060 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1061 tmp.template copy<RunOn::Device>((*plotMF)[mfi.index()], comp, 0, 1);
1062 Gpu::streamSynchronize();
1065 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1066 local_nz, local_ny, local_nx });
1079 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1080 tmp.template copy<RunOn::Device>((*plotMF)[mfi.index()], comp, 0, 1);
1081 Gpu::streamSynchronize();
1084 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1085 local_nz, local_ny, local_nx });
1098 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1099 tmp.template copy<RunOn::Device>((*plotMF)[mfi.index()], comp, 0, 1);
1100 Gpu::streamSynchronize();
1103 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1104 local_nz, local_ny, local_nx });
1116 for (MFIter mfi(*plotMF,
false); mfi.isValid(); ++mfi) {
1117 Box bx = mfi.validbox();
1119 if (subdomain.contains(bx)) {
1124 tmp_bx.surroundingNodes(0);
1125 if (tmp_bx.smallEnd()[1] == subdomain.smallEnd()[1])
1126 tmp_bx.growLo(1, 1);
1127 if (tmp_bx.bigEnd()[1] == subdomain.bigEnd()[1])
1128 tmp_bx.growHi(1, 1);
1129 Box tmp_bx_2d(tmp_bx);
1130 tmp_bx_2d.makeSlab(2, 0);
1135 long long local_nx = tmp_bx.length()[0];
1136 long long local_ny = tmp_bx.length()[1];
1137 long long local_nz = tmp_bx.length()[2];
1140 long long local_start_x =
static_cast<long long>(tmp_bx.smallEnd()[0]);
1141 long long local_start_y =
static_cast<long long>(tmp_bx.smallEnd()[1] + 1);
1142 long long local_start_z =
static_cast<long long>(tmp_bx.smallEnd()[2]);
1147 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1148 tmp.template copy<RunOn::Device>((*
vec_xu[lev])[mfi.index()], 0, 0, 1);
1149 Gpu::streamSynchronize();
1151 auto nc_plot_var = ncf.
var(
"x_u");
1153 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1157 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1158 tmp.template copy<RunOn::Device>((*
vec_yu[lev])[mfi.index()], 0, 0, 1);
1159 Gpu::streamSynchronize();
1161 auto nc_plot_var = ncf.
var(
"y_u");
1163 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1169 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1170 tmp.template copy<RunOn::Device>((*
xvel_new[lev])[mfi.index()], 0, 0, 1);
1171 Gpu::streamSynchronize();
1173 auto nc_plot_var = ncf.
var(
"u");
1174 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1175 local_nz, local_ny, local_nx });
1180 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1181 tmp.template copy<RunOn::Device>((*
vec_ubar[lev])[mfi.index()], 0, 0, 1);
1182 Gpu::streamSynchronize();
1184 auto nc_plot_var = ncf.
var(
"ubar");
1185 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
1189 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1190 tmp.template copy<RunOn::Device>((*
vec_sustr[lev])[mfi.index()], 0, 0, 1);
1191 Gpu::streamSynchronize();
1193 auto nc_plot_var = ncf.
var(
"sustr");
1194 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
1200 for (MFIter mfi(*plotMF,
false); mfi.isValid(); ++mfi) {
1201 Box bx = mfi.validbox();
1203 if (subdomain.contains(bx)) {
1208 tmp_bx.surroundingNodes(1);
1209 if (tmp_bx.smallEnd()[0] == subdomain.smallEnd()[0])
1210 tmp_bx.growLo(0, 1);
1211 if (tmp_bx.bigEnd()[0] == subdomain.bigEnd()[0])
1212 tmp_bx.growHi(0, 1);
1216 Box tmp_bx_2d(tmp_bx);
1217 tmp_bx_2d.makeSlab(2, 0);
1222 long long local_nx = tmp_bx.length()[0];
1223 long long local_ny = tmp_bx.length()[1];
1224 long long local_nz = tmp_bx.length()[2];
1227 long long local_start_x =
static_cast<long long>(tmp_bx.smallEnd()[0] + 1);
1228 long long local_start_y =
static_cast<long long>(tmp_bx.smallEnd()[1]);
1229 long long local_start_z =
static_cast<long long>(tmp_bx.smallEnd()[2]);
1234 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1235 tmp.template copy<RunOn::Device>((*
vec_xv[lev])[mfi.index()], 0, 0, 1);
1236 Gpu::streamSynchronize();
1238 auto nc_plot_var = ncf.
var(
"x_v");
1240 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1244 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1245 tmp.template copy<RunOn::Device>((*
vec_yv[lev])[mfi.index()], 0, 0, 1);
1246 Gpu::streamSynchronize();
1248 auto nc_plot_var = ncf.
var(
"y_v");
1250 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1256 tmp.resize(tmp_bx, 1, amrex::The_Pinned_Arena());
1257 tmp.template copy<RunOn::Device>((*
yvel_new[lev])[mfi.index()], 0, 0, 1);
1258 Gpu::streamSynchronize();
1260 auto nc_plot_var = ncf.
var(
"v");
1261 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_z, local_start_y, local_start_x }, { local_nt,
1262 local_nz, local_ny, local_nx });
1267 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1268 tmp.template copy<RunOn::Device>((*
vec_vbar[lev])[mfi.index()], 0, 0, 1);
1269 Gpu::streamSynchronize();
1271 auto nc_plot_var = ncf.
var(
"vbar");
1272 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
1277 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1278 tmp.template copy<RunOn::Device>((*
vec_svstr[lev])[mfi.index()], 0, 0, 1);
1279 Gpu::streamSynchronize();
1281 auto nc_plot_var = ncf.
var(
"svstr");
1282 nc_plot_var.
put(tmp.dataPtr(), { local_start_nt, local_start_y, local_start_x }, { local_nt, local_ny, local_nx });
1288 for (MFIter mfi(*plotMF,
false); mfi.isValid(); ++mfi) {
1289 Box bx = mfi.validbox();
1291 if (subdomain.contains(bx)) {
1296 tmp_bx.surroundingNodes(0);
1297 tmp_bx.surroundingNodes(1);
1299 Box tmp_bx_2d(tmp_bx);
1300 tmp_bx_2d.makeSlab(2, 0);
1305 long long local_nx = tmp_bx.length()[0];
1306 long long local_ny = tmp_bx.length()[1];
1309 long long local_start_x =
static_cast<long long>(tmp_bx.smallEnd()[0]);
1310 long long local_start_y =
static_cast<long long>(tmp_bx.smallEnd()[1]);
1315 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1316 tmp.template copy<RunOn::Device>((*
vec_xp[lev])[mfi.index()], 0, 0, 1);
1317 Gpu::streamSynchronize();
1319 auto nc_plot_var = ncf.
var(
"x_psi");
1321 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });
1325 tmp.resize(tmp_bx_2d, 1, amrex::The_Pinned_Arena());
1326 tmp.template copy<RunOn::Device>((*
vec_yp[lev])[mfi.index()], 0, 0, 1);
1327 Gpu::streamSynchronize();
1329 auto nc_plot_var = ncf.
var(
"y_psi");
1331 nc_plot_var.
put(tmp.dataPtr(), { local_start_y, local_start_x }, { local_ny, local_nx });