4 #ifndef ERF_SAMPLEDATA_H
5 #define ERF_SAMPLEDATA_H
9 #include <AMReX_ParmParse.H>
10 #include <AMReX_MultiFab.H>
11 #include <AMReX_MultiFabUtil.H>
12 #include <AMReX_PlotFileUtil.H>
24 amrex::ParmParse
pp(
"erf");
26 bool has_line_idx =
pp.contains(
"sample_line_lo") ||
pp.contains(
"sample_line_hi");
27 bool has_line_real =
pp.contains(
"sample_line_lo_real") ||
pp.contains(
"sample_line_hi_real");
28 if (has_line_idx && has_line_real) {
29 amrex::Abort(
"Specify only one of erf.sample_line_lo/hi or erf.sample_line_lo_real/hi_real");
33 int n_line_lo =
pp.countval(
"sample_line_lo") / AMREX_SPACEDIM;
34 int n_line_hi =
pp.countval(
"sample_line_hi") / AMREX_SPACEDIM;
35 int n_line_lo_real =
pp.countval(
"sample_line_lo_real") / AMREX_SPACEDIM;
36 int n_line_hi_real =
pp.countval(
"sample_line_hi_real") / AMREX_SPACEDIM;
37 int n_line_dir =
pp.countval(
"sample_line_dir");
40 (n_line_lo==n_line_dir) );
41 }
else if (has_line_real) {
43 (n_line_lo_real==n_line_dir) );
52 amrex::Vector<int> idx_lo; idx_lo.resize(nline*AMREX_SPACEDIM);
53 amrex::Vector<amrex::IntVect> iv_lo; iv_lo.resize(nline);
54 pp.queryarr(
"sample_line_lo",idx_lo,0,nline*AMREX_SPACEDIM);
55 for (
int i(0); i < nline; i++) {
56 amrex::IntVect iv(idx_lo[AMREX_SPACEDIM*i+0],
57 idx_lo[AMREX_SPACEDIM*i+1],
58 idx_lo[AMREX_SPACEDIM*i+2]);
63 amrex::Vector<int> idx_hi; idx_hi.resize(nline*AMREX_SPACEDIM);
64 amrex::Vector<amrex::IntVect> iv_hi; iv_hi.resize(nline);
65 pp.queryarr(
"sample_line_hi",idx_hi,0,nline*AMREX_SPACEDIM);
66 for (
int i(0); i < nline; i++) {
67 amrex::IntVect iv(idx_hi[AMREX_SPACEDIM*i+0],
68 idx_hi[AMREX_SPACEDIM*i+1],
69 idx_hi[AMREX_SPACEDIM*i+2]);
75 for (
int i = 0; i < nline; i++){
76 amrex::Box lbx(iv_lo[i],iv_hi[i]);
80 }
else if (has_line_real) {
82 nline = n_line_lo_real;
85 amrex::Vector<amrex::Real> real_lo; real_lo.resize(nline*AMREX_SPACEDIM);
86 amrex::Vector<amrex::Vector<amrex::Real>> rv_lo;
87 pp.queryarr(
"sample_line_lo_real",real_lo,0,nline*AMREX_SPACEDIM);
88 for (
int i(0); i < nline; i++) {
89 amrex::Vector<amrex::Real> rv = {real_lo[AMREX_SPACEDIM*i+0],
90 real_lo[AMREX_SPACEDIM*i+1],
91 real_lo[AMREX_SPACEDIM*i+2]};
96 amrex::Vector<amrex::Real> real_hi; real_hi.resize(nline*AMREX_SPACEDIM);
97 amrex::Vector<amrex::Vector<amrex::Real>> rv_hi;
98 pp.queryarr(
"sample_line_hi_real",real_hi,0,nline*AMREX_SPACEDIM);
99 for (
int i(0); i < nline; i++) {
100 amrex::Vector<amrex::Real> rv = {real_hi[AMREX_SPACEDIM*i+0],
101 real_hi[AMREX_SPACEDIM*i+1],
102 real_hi[AMREX_SPACEDIM*i+2]};
108 for (
int i = 0; i < nline; i++){
109 amrex::RealBox rbx(rv_lo[i].data(),rv_hi[i].data());
120 m_dir.resize(n_line_dir);
121 pp.queryarr(
"sample_line_dir",
m_dir,0,n_line_dir);
124 std::string name_base =
"plt_line_";
126 int n_names =
pp.countval(
"sample_line_name");
129 pp.queryarr(
"sample_line_name",
m_name,0,n_names);
131 for (
int iline(0); iline<nline; ++iline) {
132 m_name[iline] = amrex::Concatenate(name_base, iline , 5);
137 m_lev.resize(n_line_dir,0);
143 if (
pp.countval(
"line_sampling_vars") > 0) {
145 amrex::Vector<std::string> requested_vars;
146 pp.queryarr(
"line_sampling_vars",requested_vars);
147 amrex::Print() <<
"Selected line sampling vars :";
150 amrex::Print() <<
" " <<
"density";
154 amrex::Print() <<
" " <<
"x_velocity";
158 amrex::Print() <<
" " <<
"y_velocity";
162 amrex::Print() <<
" " <<
"z_velocity";
166 amrex::Print() <<
" " <<
"magvel";
170 amrex::Print() <<
" " <<
"theta";
174 amrex::Print() <<
" " <<
"qv";
178 amrex::Print() <<
" " <<
"qc";
182 amrex::Print() <<
" " <<
"pressure";
186 amrex::Print() <<
" " <<
"sgs_tke";
190 amrex::Print() <<
" " <<
"sgs_tau13";
194 amrex::Print() <<
" " <<
"sgs_tau23";
198 amrex::Print() <<
" " <<
"sgs_hfx3";
200 amrex::Print() << std::endl;
206 if (
m_write_ascii && amrex::ParallelDescriptor::IOProcessor()) {
207 int nvar =
static_cast<int>(
m_varnames.size());
210 for (
int iline(0); iline<nline; ++iline) {
211 for (
int ivar(0); ivar<nvar; ++ivar) {
214 m_datastream[i]->open(filename.c_str(),std::ios::out|std::ios::app);
216 amrex::FileOpenFailed(filename);
227 const amrex::Geometry& geom) {
228 amrex::IntVect slice_lo, slice_hi;
230 AMREX_D_TERM(slice_lo[0]=
static_cast<int>(std::floor((real_box.lo(0) - geom.ProbLo(0))/geom.CellSize(0)));,
231 slice_lo[1]=
static_cast<int>(std::floor((real_box.lo(1) - geom.ProbLo(1))/geom.CellSize(1)));,
232 slice_lo[2]=
static_cast<int>(std::floor((real_box.lo(2) - geom.ProbLo(2))/geom.CellSize(2))););
234 AMREX_D_TERM(slice_hi[0]=
static_cast<int>(std::floor((real_box.hi(0) - geom.ProbLo(0))/geom.CellSize(0)));,
235 slice_hi[1]=
static_cast<int>(std::floor((real_box.hi(1) - geom.ProbLo(1))/geom.CellSize(1)));,
236 slice_hi[2]=
static_cast<int>(std::floor((real_box.hi(2) - geom.ProbLo(2))/geom.CellSize(2))););
238 return amrex::Box(slice_lo, slice_hi) & geom.Domain();
242 write_coords (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& z_phys_cc,
243 amrex::Vector<amrex::Geometry>& geom)
247 amrex::Print() <<
"Writing out line coordinates to text" << std::endl;
249 for (
int lev(0); lev < z_phys_cc.size(); ++lev) {
251 std::ofstream outfile;
252 if (amrex::ParallelDescriptor::IOProcessor()) {
253 std::string fname = amrex::Concatenate(
"plt_line_lev", lev, 1);
257 if (!outfile.is_open()) {
258 amrex::AllPrint() <<
"Could not open " << fname << std::endl;
263 int nline =
static_cast<int>(
m_ls_mf.size());
264 for (
int iline(0); iline<nline; ++iline) {
265 int dir =
m_dir[iline];
269 amrex::IntVect first_cell = bnd_bx.smallEnd();
272 amrex::MultiFab line_coords_mf = get_line_data(
273 *z_phys_cc[lev], dir, first_cell, bnd_bx
277 amrex::Gpu::HostVector<amrex::Real> vec = sumToLine(
278 line_coords_mf, 0, 1, bnd_bx, dir
282 if (amrex::ParallelDescriptor::IOProcessor()) {
283 for (
const auto& zval : vec) {
284 outfile <<
" " << zval;
286 outfile << std::endl;
296 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars_new,
297 const amrex::Vector<amrex::MultiFab*>& tau13_lev = {},
298 const amrex::Vector<amrex::MultiFab*>& tau23_lev = {},
299 const amrex::Vector<amrex::MultiFab*>& hfx3_lev = {},
300 const amrex::Vector<int>& prognostic_tke_available = {})
302 int nlev =
static_cast<int>(vars_new.size());
303 int nline =
static_cast<int>(
m_bnd_bx.size());
304 int ncomp =
static_cast<int>(
m_varnames.size());
309 for (
int iline(0); iline<nline; ++iline) {
310 int dir =
m_dir[iline];
313 for (
int ilev(nlev-1); ilev>=0; --ilev) {
317 amrex::IntVect cell = bnd_bx.smallEnd();
320 amrex::MultiFab mf_cc_vel;
321 auto ba = vars_new[ilev][
Vars::cons].boxArray();
322 auto dm = vars_new[ilev][
Vars::cons].DistributionMap();
323 mf_cc_vel.define(ba, dm, AMREX_SPACEDIM, amrex::IntVect(1,1,1));
324 average_face_to_cellcenter(mf_cc_vel,0,
325 amrex::Array<const amrex::MultiFab*,3>{&vars_new[ilev][
Vars::xvel],
330 amrex::MultiFab mf_cc_data;
331 mf_cc_data.define(ba, dm, ncomp, 1);
336 amrex::MultiFab::Copy(mf_cc_data, vars_new[ilev][
Vars::cons],
Rho_comp, mf_comp, 1, 0);
341 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 0, mf_comp, 1, 0);
345 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 1, mf_comp, 1, 0);
349 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 2, mf_comp, 1, 0);
355 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
357 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
358 const amrex::Box& tbx = mfi.tilebox();
359 auto const& dfab = mf_cc_data.array(mfi);
360 auto const& vfab = mf_cc_vel.array(mfi);
364 dfab(i,j,k,mf_comp) = std::sqrt(vfab(i,j,k,0)*vfab(i,j,k,0)
365 + vfab(i,j,k,1)*vfab(i,j,k,1)
366 + vfab(i,j,k,2)*vfab(i,j,k,2)) ;
374 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
376 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
377 const amrex::Box& tbx = mfi.tilebox();
378 auto const& dfab = mf_cc_data.array(mfi);
379 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
391 "qv sampling requested but moisture components not present in state");
395 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
397 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
398 const amrex::Box& tbx = mfi.tilebox();
399 auto const& dfab = mf_cc_data.array(mfi);
400 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
411 "qc sampling requested but moisture components not present in state");
413 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
415 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
416 const amrex::Box& tbx = mfi.tilebox();
417 auto const& dfab = mf_cc_data.array(mfi);
418 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
432 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
434 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
435 const amrex::Box& tbx = mfi.tilebox();
436 auto const& dfab = mf_cc_data.array(mfi);
437 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
441 amrex::Real qv_val = (qv_comp >= 0) ? dfab(i,j,k,qv_comp)
449 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
451 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
452 const amrex::Box& tbx = mfi.tilebox();
453 auto const& dfab = mf_cc_data.array(mfi);
454 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
466 const bool tke_available =
467 ilev < static_cast<int>(prognostic_tke_available.size()) &&
468 prognostic_tke_available[ilev] != 0;
469 if (!tke_available) {
470 mf_cc_data.setVal(
amrex::Real(0.0), mf_comp, 1, 0);
473 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
475 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
476 const amrex::Box& tbx = mfi.tilebox();
477 const auto& out = mf_cc_data.array(mfi);
478 const auto& state = vars_new[ilev][
Vars::cons].const_array(mfi);
488 amrex::MultiFab*
tau13 = ilev < static_cast<int>(tau13_lev.size())
489 ? tau13_lev[ilev] :
nullptr;
490 if (
tau13 !=
nullptr) {
492 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
494 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
495 const amrex::Box& tbx = mfi.tilebox();
496 const auto& out = mf_cc_data.array(mfi);
497 const auto& tau =
tau13->const_array(mfi);
500 (tau(i,j,k) + tau(i+1,j,k) +
501 tau(i,j,k+1) + tau(i+1,j,k+1));
505 mf_cc_data.setVal(0.0, mf_comp, 1, 0);
511 amrex::MultiFab*
tau23 = ilev < static_cast<int>(tau23_lev.size())
512 ? tau23_lev[ilev] :
nullptr;
513 if (
tau23 !=
nullptr) {
515 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
517 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
518 const amrex::Box& tbx = mfi.tilebox();
519 const auto& out = mf_cc_data.array(mfi);
520 const auto& tau =
tau23->const_array(mfi);
523 (tau(i,j,k) + tau(i,j+1,k) +
524 tau(i,j,k+1) + tau(i,j+1,k+1));
528 mf_cc_data.setVal(0.0, mf_comp, 1, 0);
534 amrex::MultiFab* hfx3 = ilev < static_cast<int>(hfx3_lev.size())
535 ? hfx3_lev[ilev] :
nullptr;
536 if (hfx3 !=
nullptr) {
538 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
540 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
541 const amrex::Box& tbx = mfi.tilebox();
542 const auto& out = mf_cc_data.array(mfi);
543 const auto& hfx = hfx3->const_array(mfi);
545 out(i,j,k,mf_comp) =
amrex::Real(0.5) * (hfx(i,j,k) + hfx(i,j,k+1));
549 mf_cc_data.setVal(0.0, mf_comp, 1, 0);
555 m_ls_mf[iline] = get_line_data(mf_cc_data, dir, cell, bnd_bx);
558 auto min_bnd_bx =
m_ls_mf[iline].boxArray().minimalBox();
559 if (bnd_bx == min_bnd_bx) {
break; }
573 amrex::Vector<int>& level_steps,
574 amrex::Vector<amrex::IntVect>& ref_ratio,
575 amrex::Vector<amrex::Geometry>& geom)
588 constexpr
int datwidth = 14;
589 constexpr
int datprecision = 6;
590 constexpr
int timeprecision = 13;
592 int nline =
static_cast<int>(
m_ls_mf.size());
593 int nvar =
static_cast<int>(
m_varnames.size());
594 for (
int iline(0); iline<nline; ++iline) {
595 int dir =
m_dir[iline];
596 int lev =
m_lev[iline];
597 double m_time = time[lev];
600 for (
int ivar(0); ivar<nvar; ++ivar) {
602 amrex::Gpu::HostVector<amrex::Real> vec = sumToLine(
m_ls_mf[iline], ivar, 1, m_dom, dir);
604 if (amrex::ParallelDescriptor::IOProcessor()) {
605 int ifile = iline*nvar + ivar;
607 fs << std::setw(datwidth) << std::setprecision(timeprecision) << m_time
608 << std::setw(datwidth) << std::setprecision(datprecision);
609 for (
const auto& val : vec) {
620 amrex::Vector<int>& level_steps,
621 amrex::Vector<amrex::IntVect>& ref_ratio,
622 amrex::Vector<amrex::Geometry>& geom)
624 int nline =
static_cast<int>(
m_ls_mf.size());
625 for (
int iline(0); iline<nline; ++iline) {
627 int dir =
m_dir[iline];
628 int lev =
m_lev[iline];
629 double m_time = time[lev];
630 amrex::Vector<int> m_level_steps = {level_steps[lev]};
631 amrex::Vector<amrex::IntVect> m_ref_ratio = {ref_ratio[lev]};
634 auto plo = geom[lev].ProbLo();
635 auto dx = geom[lev].CellSize();
636 amrex::Vector<amrex::Geometry> m_geom; m_geom.resize(1);
637 amrex::Vector<int> is_per(AMREX_SPACEDIM,0);
640 for (
int d(0); d<AMREX_SPACEDIM; ++d) {
648 is_per[d] = geom[lev].isPeriodic(d);
650 m_geom[0].define(m_dom, &m_rb, geom[lev].
Coord(), is_per.data());
653 std::string name_line =
m_name[iline];
654 name_line +=
"_step_";
655 std::string plotfilename = amrex::Concatenate(name_line, m_level_steps[0], 5);
658 amrex::Vector<const amrex::MultiFab*> mf = {&(
m_ls_mf[iline])};
661 WriteMultiLevelPlotfile(plotfilename, 1, mf,
663 m_level_steps, m_ref_ratio);
685 amrex::ParmParse
pp(
"erf");
688 int n_plane_lo =
pp.countval(
"sample_plane_lo") / AMREX_SPACEDIM;
689 int n_plane_hi =
pp.countval(
"sample_plane_hi") / AMREX_SPACEDIM;
690 int n_plane_dir =
pp.countval(
"sample_plane_dir");
692 (n_plane_lo==n_plane_dir) );
695 if (n_plane_lo > 0) {
697 amrex::Vector<amrex::Real> r_lo; r_lo.resize(n_plane_lo*AMREX_SPACEDIM);
698 amrex::Vector<amrex::Vector<amrex::Real>> rv_lo;
699 pp.queryarr(
"sample_plane_lo",r_lo,0,n_plane_lo*AMREX_SPACEDIM);
700 for (
int i(0); i < n_plane_lo; i++) {
701 amrex::Vector<amrex::Real> rv = {r_lo[AMREX_SPACEDIM*i+0],
702 r_lo[AMREX_SPACEDIM*i+1],
703 r_lo[AMREX_SPACEDIM*i+2]};
708 amrex::Vector<amrex::Real> r_hi; r_hi.resize(n_plane_hi*AMREX_SPACEDIM);
709 amrex::Vector<amrex::Vector<amrex::Real>> rv_hi;
710 pp.queryarr(
"sample_plane_hi",r_hi,0,n_plane_hi*AMREX_SPACEDIM);
711 for (
int i(0); i < n_plane_hi; i++) {
712 amrex::Vector<amrex::Real> rv = {r_hi[AMREX_SPACEDIM*i+0],
713 r_hi[AMREX_SPACEDIM*i+1],
714 r_hi[AMREX_SPACEDIM*i+2]};
720 for (
int i(0); i < n_plane_hi; i++){
721 amrex::RealBox rbx(rv_lo[i].data(),rv_hi[i].data());
726 m_dir.resize(n_plane_dir);
727 pp.queryarr(
"sample_plane_dir",
m_dir,0,n_plane_dir);
730 std::string name_base =
"plt_plane_";
731 m_name.resize(n_plane_lo);
732 int n_names =
pp.countval(
"sample_plane_name");
735 pp.queryarr(
"sample_plane_name",
m_name,0,n_names);
737 for (
int iplane(0); iplane<n_plane_lo; ++iplane) {
738 m_name[iplane] = amrex::Concatenate(name_base, iplane , 5);
749 if (
pp.countval(
"plane_sampling_vars") > 0) {
751 amrex::Vector<std::string> requested_vars;
752 pp.queryarr(
"plane_sampling_vars",requested_vars);
753 amrex::Print() <<
"Selected plane sampling vars :";
756 amrex::Print() <<
" " <<
"density";
760 amrex::Print() <<
" " <<
"x_velocity";
764 amrex::Print() <<
" " <<
"y_velocity";
768 amrex::Print() <<
" " <<
"z_velocity";
772 amrex::Print() <<
" " <<
"magvel";
776 amrex::Print() <<
" " <<
"theta";
780 amrex::Print() <<
" " <<
"qv";
784 amrex::Print() <<
" " <<
"qc";
788 amrex::Print() <<
" " <<
"pressure";
790 amrex::Print() << std::endl;
798 const amrex::Geometry& geom) {
799 amrex::IntVect slice_lo, slice_hi;
801 AMREX_D_TERM(slice_lo[0]=
static_cast<int>(std::floor((real_box.lo(0) - geom.ProbLo(0))/geom.CellSize(0)));,
802 slice_lo[1]=
static_cast<int>(std::floor((real_box.lo(1) - geom.ProbLo(1))/geom.CellSize(1)));,
803 slice_lo[2]=
static_cast<int>(std::floor((real_box.lo(2) - geom.ProbLo(2))/geom.CellSize(2))););
805 AMREX_D_TERM(slice_hi[0]=
static_cast<int>(std::floor((real_box.hi(0) - geom.ProbLo(0))/geom.CellSize(0)));,
806 slice_hi[1]=
static_cast<int>(std::floor((real_box.hi(1) - geom.ProbLo(1))/geom.CellSize(1)));,
807 slice_hi[2]=
static_cast<int>(std::floor((real_box.hi(2) - geom.ProbLo(2))/geom.CellSize(2))););
809 return amrex::Box(slice_lo, slice_hi) & geom.Domain();
814 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars_new)
816 int nlev =
static_cast<int>(vars_new.size());
817 int nplane =
static_cast<int>(
m_bnd_rbx.size());
818 int ncomp =
static_cast<int>(
m_varnames.size());
819 bool interpolate =
true;
824 for (
int iplane(0); iplane<nplane; ++iplane) {
825 int dir =
m_dir[iplane];
826 amrex::RealBox bnd_rbx =
m_bnd_rbx[iplane];
833 for (
int ilev(0); ilev<=lev_cap; ++ilev) {
837 amrex::Box plane_bx =
getIndexBox(bnd_rbx, geom[ilev]);
838 int k_l =
static_cast<int>(std::floor((point - geom[ilev].ProbLo(dir))
839 / geom[ilev].CellSize(dir)));
840 plane_bx.setSmall(dir, k_l); plane_bx.setBig(dir, k_l);
841 if (!vars_new[ilev][
Vars::cons].boxArray().intersects(plane_bx)) {
break; }
845 amrex::MultiFab mf_cc_vel;
846 auto ba = vars_new[ilev][
Vars::cons].boxArray();
847 auto dm = vars_new[ilev][
Vars::cons].DistributionMap();
848 mf_cc_vel.define(ba, dm, AMREX_SPACEDIM, amrex::IntVect(1,1,1));
849 average_face_to_cellcenter(mf_cc_vel,0,
850 amrex::Array<const amrex::MultiFab*,3>{&vars_new[ilev][
Vars::xvel],
855 amrex::MultiFab mf_cc_data;
856 mf_cc_data.define(ba, dm, ncomp, 1);
861 amrex::MultiFab::Copy(mf_cc_data, vars_new[ilev][
Vars::cons],
Rho_comp, mf_comp, 1, 0);
866 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 0, mf_comp, 1, 0);
870 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 1, mf_comp, 1, 0);
874 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 2, mf_comp, 1, 0);
880 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
882 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
883 const amrex::Box& tbx = mfi.tilebox();
884 auto const& dfab = mf_cc_data.array(mfi);
885 auto const& vfab = mf_cc_vel.array(mfi);
889 dfab(i,j,k,mf_comp) = std::sqrt(vfab(i,j,k,0)*vfab(i,j,k,0)
890 + vfab(i,j,k,1)*vfab(i,j,k,1)
891 + vfab(i,j,k,2)*vfab(i,j,k,2));
899 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
901 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
902 const amrex::Box& tbx = mfi.tilebox();
903 auto const& dfab = mf_cc_data.array(mfi);
904 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
916 "qv sampling requested but moisture components not present in state");
920 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
922 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
923 const amrex::Box& tbx = mfi.tilebox();
924 auto const& dfab = mf_cc_data.array(mfi);
925 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
936 "qc sampling requested but moisture components not present in state");
938 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
940 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
941 const amrex::Box& tbx = mfi.tilebox();
942 auto const& dfab = mf_cc_data.array(mfi);
943 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
957 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
959 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
960 const amrex::Box& tbx = mfi.tilebox();
961 auto const& dfab = mf_cc_data.array(mfi);
962 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
966 amrex::Real qv_val = (qv_comp >= 0) ? dfab(i,j,k,qv_comp)
974 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
976 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
977 const amrex::Box& tbx = mfi.tilebox();
978 auto const& dfab = mf_cc_data.array(mfi);
979 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
990 auto slice = get_slice_data(dir, point, mf_cc_data, geom[ilev],
991 0, ncomp, interpolate, bnd_rbx);
994 if (!slice || slice->boxArray().size() == 0) {
break; }
1000 const int rr_l = 1 << ilev;
1001 const int k_slice = slice->boxArray().minimalBox().smallEnd(dir);
1002 const int l_dir = dir;
1005 const amrex::BoxArray& slice_ba = slice->boxArray();
1006 for (
int ib(0); ib<static_cast<int>(slice_ba.size()); ++ib) {
1007 amrex::Box b = slice_ba[ib];
1009 b.setBig(dir, rr_l - 1);
1012 amrex::BoxArray out_ba(std::move(bl));
1013 auto out_mf = std::make_unique<amrex::MultiFab>(out_ba, slice->DistributionMap(),
1016 for (amrex::MFIter mfi(*out_mf); mfi.isValid(); ++mfi) {
1017 const amrex::Box& obx = mfi.validbox();
1018 auto const& ofab = out_mf->array(mfi);
1019 auto const& sfab = slice->array(mfi);
1020 amrex::ParallelFor(obx, ncomp, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k,
int n) noexcept
1022 int si = i, sj = j, sk = k;
1023 if (l_dir == 0) { si = k_slice; }
1024 else if (l_dir == 1) { sj = k_slice; }
1025 else { sk = k_slice; }
1026 ofab(i,j,k,n) = sfab(si,sj,sk,n);
1030 m_ps_mf[iplane].push_back(std::move(out_mf));
1038 amrex::Vector<int>& level_steps,
1039 amrex::Vector<amrex::IntVect>& ref_ratio,
1040 amrex::Vector<amrex::Geometry>& geom)
1042 amrex::ignore_unused(ref_ratio);
1044 for (
int iplane(0); iplane<nplane; ++iplane) {
1045 int nlev_c =
static_cast<int>(
m_ps_mf[iplane].size());
1046 if (nlev_c == 0) {
continue; }
1048 int dir =
m_dir[iplane];
1049 amrex::RealBox bnd_rbx =
m_bnd_rbx[iplane];
1056 amrex::RealBox shared_rbx = bnd_rbx;
1057 shared_rbx.setLo(dir, point -
myhalf*dx0);
1058 shared_rbx.setHi(dir, point +
myhalf*dx0);
1060 amrex::Vector<int> is_per(AMREX_SPACEDIM,0);
1061 for (
int d(0); d<AMREX_SPACEDIM; ++d) { is_per[d] = geom[0].isPeriodic(d); }
1067 amrex::Vector<const amrex::MultiFab*> mf(nlev_c);
1068 amrex::Vector<amrex::Geometry> m_geom(nlev_c);
1069 amrex::Vector<int> m_level_steps(nlev_c);
1070 amrex::Vector<amrex::IntVect> m_ref_ratio(nlev_c-1, amrex::IntVect(2));
1072 for (
int l(0); l<nlev_c; ++l) {
1073 const int rr_l = 1 << l;
1078 for (
int d(0); d<AMREX_SPACEDIM; ++d) {
1079 amrex::Real ratio = geom[0].CellSize(d) / geom[l].CellSize(d);
1082 "PlaneSampler multi-level output requires factor-2 isotropic refinement (amr.ref_ratio = 2 2 2)");
1085 amrex::Box domain_l = amrex::refine(B0, rr_l);
1086 domain_l.setSmall(dir, 0);
1087 domain_l.setBig(dir, rr_l - 1);
1089 mf[l] =
m_ps_mf[iplane][l].get();
1090 m_geom[l].define(domain_l, &shared_rbx, geom[l].
Coord(), is_per.data());
1091 m_level_steps[l] = level_steps[l];
1092 AMREX_ASSERT(domain_l.contains(mf[l]->boxArray().minimalBox()));
1096 std::string name_plane =
m_name[iplane];
1097 name_plane +=
"_step_";
1098 std::string plotfilename = amrex::Concatenate(name_plane, m_level_steps[0], 5);
1101 WriteMultiLevelPlotfile(plotfilename, nlev_c, mf,
1103 m_level_steps, m_ref_ratio);
1110 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>
m_ps_mf;
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
bool containerHasElement(const V &iterable, const T &query)
Definition: ERF_Container.H:5
@ tau23
Definition: ERF_DataStruct.H:39
@ tau13
Definition: ERF_DataStruct.H:39
Coord
Coordinate-axis selector.
Definition: ERF_DataStruct.H:144
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getPgivenRTh(const amrex::Real rhotheta, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:81
#define Rho_comp
Definition: ERF_IndexDefines.H:39
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:40
#define RhoQ2_comp
Definition: ERF_IndexDefines.H:46
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:45
#define RhoKE_comp
Definition: ERF_IndexDefines.H:41
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
AMREX_FORCE_INLINE IntVect offset(const int face_dir, const int normal)
Definition: ERF_ReadBndryPlanes.cpp:31
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ fs
Definition: ERF_AdvanceMorrison.cpp:122
@ xvel
Definition: ERF_IndexDefines.H:215
@ cons
Definition: ERF_IndexDefines.H:214
@ zvel
Definition: ERF_IndexDefines.H:217
@ yvel
Definition: ERF_IndexDefines.H:216
Definition: ERF_SampleData.H:21
void write_line_plotfile(amrex::Vector< double > &time, amrex::Vector< int > &level_steps, amrex::Vector< amrex::IntVect > &ref_ratio, amrex::Vector< amrex::Geometry > &geom)
Definition: ERF_SampleData.H:619
amrex::Vector< std::string > m_varnames
Definition: ERF_SampleData.H:676
amrex::Vector< amrex::MultiFab > m_ls_mf
Definition: ERF_SampleData.H:671
void get_sample_data(amrex::Vector< amrex::Geometry > &geom, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars_new, const amrex::Vector< amrex::MultiFab * > &tau13_lev={}, const amrex::Vector< amrex::MultiFab * > &tau23_lev={}, const amrex::Vector< amrex::MultiFab * > &hfx3_lev={}, const amrex::Vector< int > &prognostic_tke_available={})
Definition: ERF_SampleData.H:295
void write_coords(amrex::Vector< std::unique_ptr< amrex::MultiFab > > &z_phys_cc, amrex::Vector< amrex::Geometry > &geom)
Definition: ERF_SampleData.H:242
void write_sample_data(amrex::Vector< double > &time, amrex::Vector< int > &level_steps, amrex::Vector< amrex::IntVect > &ref_ratio, amrex::Vector< amrex::Geometry > &geom)
Definition: ERF_SampleData.H:572
amrex::Vector< std::unique_ptr< std::fstream > > m_datastream
Definition: ERF_SampleData.H:677
bool m_use_real_bx
Definition: ERF_SampleData.H:674
void write_line_ascii(amrex::Vector< double > &time)
Definition: ERF_SampleData.H:585
amrex::Vector< int > m_dir
Definition: ERF_SampleData.H:667
amrex::Vector< std::string > m_name
Definition: ERF_SampleData.H:672
LineSampler()
Definition: ERF_SampleData.H:22
amrex::Vector< amrex::Box > m_bnd_bx
Definition: ERF_SampleData.H:669
amrex::Box getIndexBox(const amrex::RealBox &real_box, const amrex::Geometry &geom)
Definition: ERF_SampleData.H:226
bool m_write_ascii
Definition: ERF_SampleData.H:675
amrex::Vector< amrex::RealBox > m_bnd_rbx
Definition: ERF_SampleData.H:670
amrex::Vector< int > m_lev
Definition: ERF_SampleData.H:668
Definition: ERF_SampleData.H:682
amrex::Vector< int > m_dir
Definition: ERF_SampleData.H:1108
amrex::Box getIndexBox(const amrex::RealBox &real_box, const amrex::Geometry &geom)
Definition: ERF_SampleData.H:797
void write_sample_data(amrex::Vector< double > &time, amrex::Vector< int > &level_steps, amrex::Vector< amrex::IntVect > &ref_ratio, amrex::Vector< amrex::Geometry > &geom)
Definition: ERF_SampleData.H:1037
int m_max_level
Definition: ERF_SampleData.H:1107
amrex::Vector< std::string > m_name
Definition: ERF_SampleData.H:1111
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > m_ps_mf
Definition: ERF_SampleData.H:1110
amrex::Vector< amrex::RealBox > m_bnd_rbx
Definition: ERF_SampleData.H:1109
PlaneSampler()
Definition: ERF_SampleData.H:683
amrex::Vector< std::string > m_varnames
Definition: ERF_SampleData.H:1113
void get_sample_data(amrex::Vector< amrex::Geometry > &geom, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars_new)
Definition: ERF_SampleData.H:813