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";
184 amrex::Print() << std::endl;
190 if (
m_write_ascii && amrex::ParallelDescriptor::IOProcessor()) {
191 int nvar =
static_cast<int>(
m_varnames.size());
194 for (
int iline(0); iline<nline; ++iline) {
195 for (
int ivar(0); ivar<nvar; ++ivar) {
200 amrex::FileOpenFailed(filename);
211 const amrex::Geometry& geom) {
212 amrex::IntVect slice_lo, slice_hi;
214 AMREX_D_TERM(slice_lo[0]=
static_cast<int>(std::floor((real_box.lo(0) - geom.ProbLo(0))/geom.CellSize(0)));,
215 slice_lo[1]=
static_cast<int>(std::floor((real_box.lo(1) - geom.ProbLo(1))/geom.CellSize(1)));,
216 slice_lo[2]=
static_cast<int>(std::floor((real_box.lo(2) - geom.ProbLo(2))/geom.CellSize(2))););
218 AMREX_D_TERM(slice_hi[0]=
static_cast<int>(std::floor((real_box.hi(0) - geom.ProbLo(0))/geom.CellSize(0)));,
219 slice_hi[1]=
static_cast<int>(std::floor((real_box.hi(1) - geom.ProbLo(1))/geom.CellSize(1)));,
220 slice_hi[2]=
static_cast<int>(std::floor((real_box.hi(2) - geom.ProbLo(2))/geom.CellSize(2))););
222 return amrex::Box(slice_lo, slice_hi) & geom.Domain();
226 write_coords (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& z_phys_cc,
227 amrex::Vector<amrex::Geometry>& geom)
231 amrex::Print() <<
"Writing out line coordinates to text" << std::endl;
233 for (
int lev(0); lev < z_phys_cc.size(); ++lev) {
235 std::ofstream outfile;
236 if (amrex::ParallelDescriptor::IOProcessor()) {
237 std::string fname = amrex::Concatenate(
"plt_line_lev", lev, 1);
241 if (!outfile.is_open()) {
242 amrex::AllPrint() <<
"Could not open " << fname << std::endl;
247 int nline =
static_cast<int>(
m_ls_mf.size());
248 for (
int iline(0); iline<nline; ++iline) {
249 int dir =
m_dir[iline];
253 amrex::IntVect first_cell = bnd_bx.smallEnd();
256 amrex::MultiFab line_coords_mf = get_line_data(
257 *z_phys_cc[lev], dir, first_cell, bnd_bx
261 amrex::Gpu::HostVector<amrex::Real> vec = sumToLine(
262 line_coords_mf, 0, 1, bnd_bx, dir
266 if (amrex::ParallelDescriptor::IOProcessor()) {
267 for (
const auto& zval : vec) {
268 outfile <<
" " << zval;
270 outfile << std::endl;
280 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars_new)
282 int nlev =
static_cast<int>(vars_new.size());
283 int nline =
static_cast<int>(
m_bnd_bx.size());
284 int ncomp =
static_cast<int>(
m_varnames.size());
289 for (
int iline(0); iline<nline; ++iline) {
290 int dir =
m_dir[iline];
293 for (
int ilev(nlev-1); ilev>=0; --ilev) {
297 amrex::IntVect cell = bnd_bx.smallEnd();
300 amrex::MultiFab mf_cc_vel;
301 auto ba = vars_new[ilev][
Vars::cons].boxArray();
302 auto dm = vars_new[ilev][
Vars::cons].DistributionMap();
303 mf_cc_vel.define(ba, dm, AMREX_SPACEDIM, amrex::IntVect(1,1,1));
304 average_face_to_cellcenter(mf_cc_vel,0,
305 amrex::Array<const amrex::MultiFab*,3>{&vars_new[ilev][
Vars::xvel],
310 amrex::MultiFab mf_cc_data;
311 mf_cc_data.define(ba, dm, ncomp, 1);
316 amrex::MultiFab::Copy(mf_cc_data, vars_new[ilev][
Vars::cons],
Rho_comp, mf_comp, 1, 0);
321 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 0, mf_comp, 1, 0);
325 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 1, mf_comp, 1, 0);
329 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 2, mf_comp, 1, 0);
335 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
337 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
338 const amrex::Box& tbx = mfi.tilebox();
339 auto const& dfab = mf_cc_data.array(mfi);
340 auto const& vfab = mf_cc_vel.array(mfi);
344 dfab(i,j,k,mf_comp) = std::sqrt(vfab(i,j,k,0)*vfab(i,j,k,0)
345 + vfab(i,j,k,1)*vfab(i,j,k,1)
346 + vfab(i,j,k,2)*vfab(i,j,k,2)) ;
354 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
356 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
357 const amrex::Box& tbx = mfi.tilebox();
358 auto const& dfab = mf_cc_data.array(mfi);
359 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
371 "qv sampling requested but moisture components not present in state");
375 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
377 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
378 const amrex::Box& tbx = mfi.tilebox();
379 auto const& dfab = mf_cc_data.array(mfi);
380 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
391 "qc sampling requested but moisture components not present in state");
393 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
395 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
396 const amrex::Box& tbx = mfi.tilebox();
397 auto const& dfab = mf_cc_data.array(mfi);
398 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
412 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
414 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
415 const amrex::Box& tbx = mfi.tilebox();
416 auto const& dfab = mf_cc_data.array(mfi);
417 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
421 amrex::Real qv_val = (qv_comp >= 0) ? dfab(i,j,k,qv_comp)
429 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
431 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
432 const amrex::Box& tbx = mfi.tilebox();
433 auto const& dfab = mf_cc_data.array(mfi);
434 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
446 m_ls_mf[iline] = get_line_data(mf_cc_data, dir, cell, bnd_bx);
449 auto min_bnd_bx =
m_ls_mf[iline].boxArray().minimalBox();
450 if (bnd_bx == min_bnd_bx) {
break; }
464 amrex::Vector<int>& level_steps,
465 amrex::Vector<amrex::IntVect>& ref_ratio,
466 amrex::Vector<amrex::Geometry>& geom)
479 constexpr
int datwidth = 14;
480 constexpr
int datprecision = 6;
481 constexpr
int timeprecision = 13;
483 int nline =
static_cast<int>(
m_ls_mf.size());
484 int nvar =
static_cast<int>(
m_varnames.size());
485 for (
int iline(0); iline<nline; ++iline) {
486 int dir =
m_dir[iline];
487 int lev =
m_lev[iline];
488 double m_time = time[lev];
491 for (
int ivar(0); ivar<nvar; ++ivar) {
493 amrex::Gpu::HostVector<amrex::Real> vec = sumToLine(
m_ls_mf[iline], ivar, 1, m_dom, dir);
495 if (amrex::ParallelDescriptor::IOProcessor()) {
496 int ifile = iline*nvar + ivar;
498 fs << std::setw(datwidth) << std::setprecision(timeprecision) << m_time
499 << std::setw(datwidth) << std::setprecision(datprecision);
500 for (
const auto& val : vec) {
511 amrex::Vector<int>& level_steps,
512 amrex::Vector<amrex::IntVect>& ref_ratio,
513 amrex::Vector<amrex::Geometry>& geom)
515 int nline =
static_cast<int>(
m_ls_mf.size());
516 for (
int iline(0); iline<nline; ++iline) {
518 int dir =
m_dir[iline];
519 int lev =
m_lev[iline];
520 double m_time = time[lev];
521 amrex::Vector<int> m_level_steps = {level_steps[lev]};
522 amrex::Vector<amrex::IntVect> m_ref_ratio = {ref_ratio[lev]};
525 auto plo = geom[lev].ProbLo();
526 auto dx = geom[lev].CellSize();
527 amrex::Vector<amrex::Geometry> m_geom; m_geom.resize(1);
528 amrex::Vector<int> is_per(AMREX_SPACEDIM,0);
531 for (
int d(0); d<AMREX_SPACEDIM; ++d) {
539 is_per[d] = geom[lev].isPeriodic(d);
541 m_geom[0].define(m_dom, &m_rb, geom[lev].
Coord(), is_per.data());
544 std::string name_line =
m_name[iline];
545 name_line +=
"_step_";
546 std::string plotfilename = amrex::Concatenate(name_line, m_level_steps[0], 5);
549 amrex::Vector<const amrex::MultiFab*> mf = {&(
m_ls_mf[iline])};
552 WriteMultiLevelPlotfile(plotfilename, 1, mf,
554 m_level_steps, m_ref_ratio);
576 amrex::ParmParse
pp(
"erf");
579 int n_plane_lo =
pp.countval(
"sample_plane_lo") / AMREX_SPACEDIM;
580 int n_plane_hi =
pp.countval(
"sample_plane_hi") / AMREX_SPACEDIM;
581 int n_plane_dir =
pp.countval(
"sample_plane_dir");
583 (n_plane_lo==n_plane_dir) );
586 if (n_plane_lo > 0) {
588 amrex::Vector<amrex::Real> r_lo; r_lo.resize(n_plane_lo*AMREX_SPACEDIM);
589 amrex::Vector<amrex::Vector<amrex::Real>> rv_lo;
590 pp.queryarr(
"sample_plane_lo",r_lo,0,n_plane_lo*AMREX_SPACEDIM);
591 for (
int i(0); i < n_plane_lo; i++) {
592 amrex::Vector<amrex::Real> rv = {r_lo[AMREX_SPACEDIM*i+0],
593 r_lo[AMREX_SPACEDIM*i+1],
594 r_lo[AMREX_SPACEDIM*i+2]};
599 amrex::Vector<amrex::Real> r_hi; r_hi.resize(n_plane_hi*AMREX_SPACEDIM);
600 amrex::Vector<amrex::Vector<amrex::Real>> rv_hi;
601 pp.queryarr(
"sample_plane_hi",r_hi,0,n_plane_hi*AMREX_SPACEDIM);
602 for (
int i(0); i < n_plane_hi; i++) {
603 amrex::Vector<amrex::Real> rv = {r_hi[AMREX_SPACEDIM*i+0],
604 r_hi[AMREX_SPACEDIM*i+1],
605 r_hi[AMREX_SPACEDIM*i+2]};
611 for (
int i(0); i < n_plane_hi; i++){
612 amrex::RealBox rbx(rv_lo[i].data(),rv_hi[i].data());
617 m_dir.resize(n_plane_dir);
618 pp.queryarr(
"sample_plane_dir",
m_dir,0,n_plane_dir);
621 std::string name_base =
"plt_plane_";
622 m_name.resize(n_plane_lo);
623 int n_names =
pp.countval(
"sample_plane_name");
626 pp.queryarr(
"sample_plane_name",
m_name,0,n_names);
628 for (
int iplane(0); iplane<n_plane_lo; ++iplane) {
629 m_name[iplane] = amrex::Concatenate(name_base, iplane , 5);
640 if (
pp.countval(
"plane_sampling_vars") > 0) {
642 amrex::Vector<std::string> requested_vars;
643 pp.queryarr(
"plane_sampling_vars",requested_vars);
644 amrex::Print() <<
"Selected plane sampling vars :";
647 amrex::Print() <<
" " <<
"density";
651 amrex::Print() <<
" " <<
"x_velocity";
655 amrex::Print() <<
" " <<
"y_velocity";
659 amrex::Print() <<
" " <<
"z_velocity";
663 amrex::Print() <<
" " <<
"magvel";
667 amrex::Print() <<
" " <<
"theta";
671 amrex::Print() <<
" " <<
"qv";
675 amrex::Print() <<
" " <<
"qc";
679 amrex::Print() <<
" " <<
"pressure";
681 amrex::Print() << std::endl;
689 const amrex::Geometry& geom) {
690 amrex::IntVect slice_lo, slice_hi;
692 AMREX_D_TERM(slice_lo[0]=
static_cast<int>(std::floor((real_box.lo(0) - geom.ProbLo(0))/geom.CellSize(0)));,
693 slice_lo[1]=
static_cast<int>(std::floor((real_box.lo(1) - geom.ProbLo(1))/geom.CellSize(1)));,
694 slice_lo[2]=
static_cast<int>(std::floor((real_box.lo(2) - geom.ProbLo(2))/geom.CellSize(2))););
696 AMREX_D_TERM(slice_hi[0]=
static_cast<int>(std::floor((real_box.hi(0) - geom.ProbLo(0))/geom.CellSize(0)));,
697 slice_hi[1]=
static_cast<int>(std::floor((real_box.hi(1) - geom.ProbLo(1))/geom.CellSize(1)));,
698 slice_hi[2]=
static_cast<int>(std::floor((real_box.hi(2) - geom.ProbLo(2))/geom.CellSize(2))););
700 return amrex::Box(slice_lo, slice_hi) & geom.Domain();
705 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars_new)
707 int nlev =
static_cast<int>(vars_new.size());
708 int nplane =
static_cast<int>(
m_bnd_rbx.size());
709 int ncomp =
static_cast<int>(
m_varnames.size());
710 bool interpolate =
true;
715 for (
int iplane(0); iplane<nplane; ++iplane) {
716 int dir =
m_dir[iplane];
717 amrex::RealBox bnd_rbx =
m_bnd_rbx[iplane];
724 for (
int ilev(0); ilev<=lev_cap; ++ilev) {
728 amrex::Box plane_bx =
getIndexBox(bnd_rbx, geom[ilev]);
729 int k_l =
static_cast<int>(std::floor((point - geom[ilev].ProbLo(dir))
730 / geom[ilev].CellSize(dir)));
731 plane_bx.setSmall(dir, k_l); plane_bx.setBig(dir, k_l);
732 if (!vars_new[ilev][
Vars::cons].boxArray().intersects(plane_bx)) {
break; }
736 amrex::MultiFab mf_cc_vel;
737 auto ba = vars_new[ilev][
Vars::cons].boxArray();
738 auto dm = vars_new[ilev][
Vars::cons].DistributionMap();
739 mf_cc_vel.define(ba, dm, AMREX_SPACEDIM, amrex::IntVect(1,1,1));
740 average_face_to_cellcenter(mf_cc_vel,0,
741 amrex::Array<const amrex::MultiFab*,3>{&vars_new[ilev][
Vars::xvel],
746 amrex::MultiFab mf_cc_data;
747 mf_cc_data.define(ba, dm, ncomp, 1);
752 amrex::MultiFab::Copy(mf_cc_data, vars_new[ilev][
Vars::cons],
Rho_comp, mf_comp, 1, 0);
757 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 0, mf_comp, 1, 0);
761 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 1, mf_comp, 1, 0);
765 amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 2, mf_comp, 1, 0);
771 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
773 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
774 const amrex::Box& tbx = mfi.tilebox();
775 auto const& dfab = mf_cc_data.array(mfi);
776 auto const& vfab = mf_cc_vel.array(mfi);
780 dfab(i,j,k,mf_comp) = std::sqrt(vfab(i,j,k,0)*vfab(i,j,k,0)
781 + vfab(i,j,k,1)*vfab(i,j,k,1)
782 + vfab(i,j,k,2)*vfab(i,j,k,2));
790 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
792 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
793 const amrex::Box& tbx = mfi.tilebox();
794 auto const& dfab = mf_cc_data.array(mfi);
795 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
807 "qv sampling requested but moisture components not present in state");
811 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
813 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
814 const amrex::Box& tbx = mfi.tilebox();
815 auto const& dfab = mf_cc_data.array(mfi);
816 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
827 "qc sampling requested but moisture components not present in state");
829 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
831 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
832 const amrex::Box& tbx = mfi.tilebox();
833 auto const& dfab = mf_cc_data.array(mfi);
834 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
848 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
850 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
851 const amrex::Box& tbx = mfi.tilebox();
852 auto const& dfab = mf_cc_data.array(mfi);
853 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
857 amrex::Real qv_val = (qv_comp >= 0) ? dfab(i,j,k,qv_comp)
865 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
867 for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
868 const amrex::Box& tbx = mfi.tilebox();
869 auto const& dfab = mf_cc_data.array(mfi);
870 auto const& cfab = vars_new[ilev][
Vars::cons].array(mfi);
881 auto slice = get_slice_data(dir, point, mf_cc_data, geom[ilev],
882 0, ncomp, interpolate, bnd_rbx);
885 if (!slice || slice->boxArray().size() == 0) {
break; }
891 const int rr_l = 1 << ilev;
892 const int k_slice = slice->boxArray().minimalBox().smallEnd(dir);
893 const int l_dir = dir;
896 const amrex::BoxArray& slice_ba = slice->boxArray();
897 for (
int ib(0); ib<static_cast<int>(slice_ba.size()); ++ib) {
898 amrex::Box b = slice_ba[ib];
900 b.setBig(dir, rr_l - 1);
903 amrex::BoxArray out_ba(std::move(bl));
904 auto out_mf = std::make_unique<amrex::MultiFab>(out_ba, slice->DistributionMap(),
907 for (amrex::MFIter mfi(*out_mf); mfi.isValid(); ++mfi) {
908 const amrex::Box& obx = mfi.validbox();
909 auto const& ofab = out_mf->array(mfi);
910 auto const& sfab = slice->array(mfi);
911 amrex::ParallelFor(obx, ncomp, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k,
int n) noexcept
913 int si = i, sj = j, sk = k;
914 if (l_dir == 0) { si = k_slice; }
915 else if (l_dir == 1) { sj = k_slice; }
916 else { sk = k_slice; }
917 ofab(i,j,k,n) = sfab(si,sj,sk,n);
921 m_ps_mf[iplane].push_back(std::move(out_mf));
929 amrex::Vector<int>& level_steps,
930 amrex::Vector<amrex::IntVect>& ref_ratio,
931 amrex::Vector<amrex::Geometry>& geom)
933 amrex::ignore_unused(ref_ratio);
935 for (
int iplane(0); iplane<nplane; ++iplane) {
936 int nlev_c =
static_cast<int>(
m_ps_mf[iplane].size());
937 if (nlev_c == 0) {
continue; }
939 int dir =
m_dir[iplane];
940 amrex::RealBox bnd_rbx =
m_bnd_rbx[iplane];
947 amrex::RealBox shared_rbx = bnd_rbx;
948 shared_rbx.setLo(dir, point -
myhalf*dx0);
949 shared_rbx.setHi(dir, point +
myhalf*dx0);
951 amrex::Vector<int> is_per(AMREX_SPACEDIM,0);
952 for (
int d(0); d<AMREX_SPACEDIM; ++d) { is_per[d] = geom[0].isPeriodic(d); }
958 amrex::Vector<const amrex::MultiFab*> mf(nlev_c);
959 amrex::Vector<amrex::Geometry> m_geom(nlev_c);
960 amrex::Vector<int> m_level_steps(nlev_c);
961 amrex::Vector<amrex::IntVect> m_ref_ratio(nlev_c-1, amrex::IntVect(2));
963 for (
int l(0); l<nlev_c; ++l) {
964 const int rr_l = 1 << l;
969 for (
int d(0); d<AMREX_SPACEDIM; ++d) {
970 amrex::Real ratio = geom[0].CellSize(d) / geom[l].CellSize(d);
973 "PlaneSampler multi-level output requires factor-2 isotropic refinement (amr.ref_ratio = 2 2 2)");
976 amrex::Box domain_l = amrex::refine(B0, rr_l);
977 domain_l.setSmall(dir, 0);
978 domain_l.setBig(dir, rr_l - 1);
980 mf[l] =
m_ps_mf[iplane][l].get();
981 m_geom[l].define(domain_l, &shared_rbx, geom[l].
Coord(), is_per.data());
982 m_level_steps[l] = level_steps[l];
983 AMREX_ASSERT(domain_l.contains(mf[l]->boxArray().minimalBox()));
987 std::string name_plane =
m_name[iplane];
988 name_plane +=
"_step_";
989 std::string plotfilename = amrex::Concatenate(name_plane, m_level_steps[0], 5);
992 WriteMultiLevelPlotfile(plotfilename, nlev_c, mf,
994 m_level_steps, m_ref_ratio);
1001 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
Coord
Coordinate-axis selector.
Definition: ERF_DataStruct.H:143
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:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
#define RhoQ2_comp
Definition: ERF_IndexDefines.H:43
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
const Real dx
Definition: ERF_InitCustomPert_ABL.H:23
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:177
@ cons
Definition: ERF_IndexDefines.H:176
@ zvel
Definition: ERF_IndexDefines.H:179
@ yvel
Definition: ERF_IndexDefines.H:178
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:510
amrex::Vector< std::string > m_varnames
Definition: ERF_SampleData.H:567
amrex::Vector< amrex::MultiFab > m_ls_mf
Definition: ERF_SampleData.H:562
void write_coords(amrex::Vector< std::unique_ptr< amrex::MultiFab > > &z_phys_cc, amrex::Vector< amrex::Geometry > &geom)
Definition: ERF_SampleData.H:226
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:463
amrex::Vector< std::unique_ptr< std::fstream > > m_datastream
Definition: ERF_SampleData.H:568
bool m_use_real_bx
Definition: ERF_SampleData.H:565
void write_line_ascii(amrex::Vector< double > &time)
Definition: ERF_SampleData.H:476
amrex::Vector< int > m_dir
Definition: ERF_SampleData.H:558
amrex::Vector< std::string > m_name
Definition: ERF_SampleData.H:563
LineSampler()
Definition: ERF_SampleData.H:22
amrex::Vector< amrex::Box > m_bnd_bx
Definition: ERF_SampleData.H:560
void get_sample_data(amrex::Vector< amrex::Geometry > &geom, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars_new)
Definition: ERF_SampleData.H:279
amrex::Box getIndexBox(const amrex::RealBox &real_box, const amrex::Geometry &geom)
Definition: ERF_SampleData.H:210
bool m_write_ascii
Definition: ERF_SampleData.H:566
amrex::Vector< amrex::RealBox > m_bnd_rbx
Definition: ERF_SampleData.H:561
amrex::Vector< int > m_lev
Definition: ERF_SampleData.H:559
Definition: ERF_SampleData.H:573
amrex::Vector< int > m_dir
Definition: ERF_SampleData.H:999
amrex::Box getIndexBox(const amrex::RealBox &real_box, const amrex::Geometry &geom)
Definition: ERF_SampleData.H:688
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:928
int m_max_level
Definition: ERF_SampleData.H:998
amrex::Vector< std::string > m_name
Definition: ERF_SampleData.H:1002
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > m_ps_mf
Definition: ERF_SampleData.H:1001
amrex::Vector< amrex::RealBox > m_bnd_rbx
Definition: ERF_SampleData.H:1000
PlaneSampler()
Definition: ERF_SampleData.H:574
amrex::Vector< std::string > m_varnames
Definition: ERF_SampleData.H:1004
void get_sample_data(amrex::Vector< amrex::Geometry > &geom, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars_new)
Definition: ERF_SampleData.H:704