ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
PlaneSampler Struct Reference

#include <ERF_SampleData.H>

Collaboration diagram for PlaneSampler:

Public Member Functions

 PlaneSampler ()
 
amrex::Box getIndexBox (const amrex::RealBox &real_box, const amrex::Geometry &geom)
 
void get_sample_data (amrex::Vector< amrex::Geometry > &geom, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars_new)
 
void write_sample_data (amrex::Vector< double > &time, amrex::Vector< int > &level_steps, amrex::Vector< amrex::IntVect > &ref_ratio, amrex::Vector< amrex::Geometry > &geom)
 

Public Attributes

int m_max_level = -1
 
amrex::Vector< int > m_dir
 
amrex::Vector< amrex::RealBox > m_bnd_rbx
 
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > m_ps_mf
 
amrex::Vector< std::string > m_name
 
amrex::Vector< std::string > m_varnames {"magvel","theta"}
 

Constructor & Destructor Documentation

◆ PlaneSampler()

PlaneSampler::PlaneSampler ( )
inline
575  {
576  amrex::ParmParse pp("erf");
577 
578  // Count number of lo and hi points define the plane
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");
582  AMREX_ALWAYS_ASSERT( (n_plane_lo==n_plane_hi ) &&
583  (n_plane_lo==n_plane_dir) );
584 
585  // Parse the data
586  if (n_plane_lo > 0) {
587  // Parse lo
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]};
595  rv_lo.push_back(rv);
596  }
597 
598  // Parse hi
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]};
606  rv_hi.push_back(rv);
607  }
608 
609  // Construct vector of bounding real boxes
610  m_bnd_rbx.resize(n_plane_lo);
611  for (int i(0); i < n_plane_hi; i++){
612  amrex::RealBox rbx(rv_lo[i].data(),rv_hi[i].data());
613  m_bnd_rbx[i] = rbx;
614  }
615 
616  // Parse directionality
617  m_dir.resize(n_plane_dir);
618  pp.queryarr("sample_plane_dir",m_dir,0,n_plane_dir);
619 
620  // Parse names
621  std::string name_base = "plt_plane_";
622  m_name.resize(n_plane_lo);
623  int n_names = pp.countval("sample_plane_name");
624  if (n_names > 0) {
625  AMREX_ALWAYS_ASSERT( n_names==n_plane_lo );
626  pp.queryarr("sample_plane_name",m_name,0,n_names);
627  } else {
628  for (int iplane(0); iplane<n_plane_lo; ++iplane) {
629  m_name[iplane] = amrex::Concatenate(name_base, iplane , 5);
630  }
631  }
632 
633  // Optional cap on the finest level written (-1 => all intersecting levels)
634  pp.query("plane_sampling_max_level", m_max_level);
635 
636  // Allocate per-plane vectors of per-level MF pointers
637  m_ps_mf.resize(n_plane_lo);
638 
639  // Get requested vars
640  if (pp.countval("plane_sampling_vars") > 0) {
641  m_varnames.clear();
642  amrex::Vector<std::string> requested_vars;
643  pp.queryarr("plane_sampling_vars",requested_vars);
644  amrex::Print() << "Selected plane sampling vars :";
645  if (containerHasElement(requested_vars, "density")) {
646  m_varnames.push_back("density");
647  amrex::Print() << " " << "density";
648  }
649  if (containerHasElement(requested_vars, "x_velocity")) {
650  m_varnames.push_back("x_velocity");
651  amrex::Print() << " " << "x_velocity";
652  }
653  if (containerHasElement(requested_vars, "y_velocity")) {
654  m_varnames.push_back("y_velocity");
655  amrex::Print() << " " << "y_velocity";
656  }
657  if (containerHasElement(requested_vars, "z_velocity")) {
658  m_varnames.push_back("z_velocity");
659  amrex::Print() << " " << "z_velocity";
660  }
661  if (containerHasElement(requested_vars, "magvel")) {
662  m_varnames.push_back("magvel");
663  amrex::Print() << " " << "magvel";
664  }
665  if (containerHasElement(requested_vars, "theta")) {
666  m_varnames.push_back("theta");
667  amrex::Print() << " " << "theta";
668  }
669  if (containerHasElement(requested_vars, "qv")) {
670  m_varnames.push_back("qv");
671  amrex::Print() << " " << "qv";
672  }
673  if (containerHasElement(requested_vars, "qc")) {
674  m_varnames.push_back("qc");
675  amrex::Print() << " " << "qc";
676  }
677  if (containerHasElement(requested_vars, "pressure")) {
678  m_varnames.push_back("pressure");
679  amrex::Print() << " " << "pressure";
680  }
681  amrex::Print() << std::endl;
682  }
683  }
684  }
bool containerHasElement(const V &iterable, const T &query)
Definition: ERF_Container.H:5
ParmParse pp("prob")
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
amrex::Vector< int > m_dir
Definition: ERF_SampleData.H:999
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
amrex::Vector< std::string > m_varnames
Definition: ERF_SampleData.H:1004
Here is the call graph for this function:

Member Function Documentation

◆ get_sample_data()

void PlaneSampler::get_sample_data ( amrex::Vector< amrex::Geometry > &  geom,
amrex::Vector< amrex::Vector< amrex::MultiFab >> &  vars_new 
)
inline
706  {
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;
711 
712  int qv_comp = -1;
713 
714  // Loop over each plane
715  for (int iplane(0); iplane<nplane; ++iplane) {
716  int dir = m_dir[iplane];
717  amrex::RealBox bnd_rbx = m_bnd_rbx[iplane];
718  amrex::Real point = bnd_rbx.lo(dir);
719 
720  // Collect every level 0..lev_cap whose grids intersect the plane.
721  int lev_cap = (m_max_level >= 0 && m_max_level < nlev-1) ? m_max_level : nlev-1;
722  m_ps_mf[iplane].clear();
723 
724  for (int ilev(0); ilev<=lev_cap; ++ilev) {
725 
726  // Stop ascending once a level's grids no longer touch the flattened plane
727  {
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; }
733  }
734 
735  // Construct CC velocities
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],
742  &vars_new[ilev][Vars::yvel],
743  &vars_new[ilev][Vars::zvel]});
744 
745  // Construct MultiFab holding requested variables
746  amrex::MultiFab mf_cc_data;
747  mf_cc_data.define(ba, dm, ncomp, 1);
748 
749  int mf_comp = 0;
750 
751  if (containerHasElement(m_varnames, "density")) {
752  amrex::MultiFab::Copy(mf_cc_data, vars_new[ilev][Vars::cons], Rho_comp, mf_comp, 1, 0);
753  mf_comp += 1;
754  }
755 
756  if (containerHasElement(m_varnames, "x_velocity")) {
757  amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 0, mf_comp, 1, 0);
758  mf_comp += 1;
759  }
760  if (containerHasElement(m_varnames, "y_velocity")) {
761  amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 1, mf_comp, 1, 0);
762  mf_comp += 1;
763  }
764  if (containerHasElement(m_varnames, "z_velocity")) {
765  amrex::MultiFab::Copy(mf_cc_data, mf_cc_vel, 2, mf_comp, 1, 0);
766  mf_comp += 1;
767  }
768 
769  if (containerHasElement(m_varnames, "magvel")) {
770 #ifdef _OPENMP
771 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
772 #endif
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);
777 
778  amrex::ParallelFor(tbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept
779  {
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));
783  });
784  }
785  mf_comp += 1;
786  }
787 
788  if (containerHasElement(m_varnames, "theta")) {
789 #ifdef _OPENMP
790 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
791 #endif
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);
796 
797  amrex::ParallelFor(tbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept
798  {
799  dfab(i,j,k,mf_comp) = cfab(i,j,k,RhoTheta_comp) / cfab(i,j,k,Rho_comp);
800  });
801  }
802  mf_comp += 1;
803  }
804 
805  if (containerHasElement(m_varnames, "qv")) {
806  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(vars_new[ilev][Vars::cons].nComp() > RhoQ1_comp,
807  "qv sampling requested but moisture components not present in state");
808  if (qv_comp >= 0) AMREX_ALWAYS_ASSERT(qv_comp == mf_comp);
809  qv_comp = mf_comp;
810 #ifdef _OPENMP
811 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
812 #endif
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);
817 
818  amrex::ParallelFor(tbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept
819  {
820  dfab(i,j,k,mf_comp) = cfab(i,j,k,RhoQ1_comp) / cfab(i,j,k,Rho_comp);
821  });
822  }
823  mf_comp += 1;
824  }
825  if (containerHasElement(m_varnames, "qc")) {
826  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(vars_new[ilev][Vars::cons].nComp() > RhoQ2_comp,
827  "qc sampling requested but moisture components not present in state");
828 #ifdef _OPENMP
829 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
830 #endif
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);
835 
836  amrex::ParallelFor(tbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept
837  {
838  dfab(i,j,k,mf_comp) = cfab(i,j,k,RhoQ2_comp) / cfab(i,j,k,Rho_comp);
839  });
840  }
841  mf_comp += 1;
842  }
843 
844  if (containerHasElement(m_varnames, "pressure")) {
845  if (vars_new[ilev][Vars::cons].nComp() > RhoQ1_comp) {
846  // moist pressure: use qv from dfab if already sampled, else compute inline
847 #ifdef _OPENMP
848 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
849 #endif
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);
854 
855  amrex::ParallelFor(tbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept
856  {
857  amrex::Real qv_val = (qv_comp >= 0) ? dfab(i,j,k,qv_comp)
858  : cfab(i,j,k,RhoQ1_comp) / cfab(i,j,k,Rho_comp);
859  dfab(i,j,k,mf_comp) = getPgivenRTh(cfab(i,j,k,RhoTheta_comp), qv_val);
860  });
861  }
862  } else {
863  // dry pressure
864 #ifdef _OPENMP
865 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
866 #endif
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);
871 
872  amrex::ParallelFor(tbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept
873  {
874  dfab(i,j,k,mf_comp) = getPgivenRTh(cfab(i,j,k,RhoTheta_comp));
875  });
876  }
877  }
878  mf_comp += 1;
879  }
880 
881  auto slice = get_slice_data(dir, point, mf_cc_data, geom[ilev],
882  0, ncomp, interpolate, bnd_rbx);
883 
884  // Defensive: an empty return means nothing was actually sampled.
885  if (!slice || slice->boxArray().size() == 0) { break; }
886 
887  // Broadcast the single sampled plane across 2^ilev cells in dir so
888  // every level shares an isotropic refinement ratio. The dir extent
889  // becomes [0, 2^ilev-1]; each cell holds the interpolated plane value
890  // replicated across the shared level-0 slab thickness.
891  const int rr_l = 1 << ilev;
892  const int k_slice = slice->boxArray().minimalBox().smallEnd(dir);
893  const int l_dir = dir;
894 
895  amrex::BoxList bl;
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];
899  b.setSmall(dir, 0);
900  b.setBig(dir, rr_l - 1);
901  bl.push_back(b);
902  }
903  amrex::BoxArray out_ba(std::move(bl));
904  auto out_mf = std::make_unique<amrex::MultiFab>(out_ba, slice->DistributionMap(),
905  ncomp, 0);
906 
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
912  {
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);
918  });
919  }
920 
921  m_ps_mf[iplane].push_back(std::move(out_mf));
922 
923  } // ilev
924  }// iplane
925  }
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
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::Real Real
Definition: ERF_ShocInterface.H:19
@ xvel
Definition: ERF_IndexDefines.H:177
@ cons
Definition: ERF_IndexDefines.H:176
@ zvel
Definition: ERF_IndexDefines.H:179
@ yvel
Definition: ERF_IndexDefines.H:178
amrex::Box getIndexBox(const amrex::RealBox &real_box, const amrex::Geometry &geom)
Definition: ERF_SampleData.H:688
Here is the call graph for this function:

◆ getIndexBox()

amrex::Box PlaneSampler::getIndexBox ( const amrex::RealBox &  real_box,
const amrex::Geometry &  geom 
)
inline
689  {
690  amrex::IntVect slice_lo, slice_hi;
691 
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))););
695 
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))););
699 
700  return amrex::Box(slice_lo, slice_hi) & geom.Domain();
701  }

Referenced by get_sample_data(), and write_sample_data().

Here is the caller graph for this function:

◆ write_sample_data()

void PlaneSampler::write_sample_data ( amrex::Vector< double > &  time,
amrex::Vector< int > &  level_steps,
amrex::Vector< amrex::IntVect > &  ref_ratio,
amrex::Vector< amrex::Geometry > &  geom 
)
inline
932  {
933  amrex::ignore_unused(ref_ratio);
934  int nplane = m_ps_mf.size();
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; }
938 
939  int dir = m_dir[iplane];
940  amrex::RealBox bnd_rbx = m_bnd_rbx[iplane];
941  amrex::Real point = bnd_rbx.lo(dir);
942 
943  // One shared physical RealBox for every level: full in-plane extent of the
944  // requested plane, and a dir-slab of level-0 thickness centered on the plane.
945  // Level 0 supplies prob_lo/hi to the writer, so this object must be shared.
946  amrex::Real dx0 = geom[0].CellSize(dir);
947  amrex::RealBox shared_rbx = bnd_rbx;
948  shared_rbx.setLo(dir, point - myhalf*dx0);
949  shared_rbx.setHi(dir, point + myhalf*dx0);
950 
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); }
953 
954  // Build the index chain by refining the level-0 plane box so that
955  // Domain_l == refine(Domain_{l-1},2) holds exactly in every axis.
956  amrex::Box B0 = getIndexBox(bnd_rbx, geom[0]);
957 
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));
962 
963  for (int l(0); l<nlev_c; ++l) {
964  const int rr_l = 1 << l;
965 
966  // The nested plane plotfile stores a single scalar refinement
967  // ratio per level, so multi-level output requires factor-2
968  // isotropic refinement.
969  for (int d(0); d<AMREX_SPACEDIM; ++d) {
970  amrex::Real ratio = geom[0].CellSize(d) / geom[l].CellSize(d);
972  std::abs(ratio - static_cast<amrex::Real>(rr_l)) < amrex::Real(1.e-6) * rr_l,
973  "PlaneSampler multi-level output requires factor-2 isotropic refinement (amr.ref_ratio = 2 2 2)");
974  }
975 
976  amrex::Box domain_l = amrex::refine(B0, rr_l);
977  domain_l.setSmall(dir, 0);
978  domain_l.setBig(dir, rr_l - 1);
979 
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()));
984  }
985 
986  // Create plotfile name
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);
990 
991  // Write the nested multi-level plane plotfile
992  WriteMultiLevelPlotfile(plotfilename, nlev_c, mf,
993  m_varnames, m_geom, static_cast<amrex::Real>(time[0]),
994  m_level_steps, m_ref_ratio);
995  } // iplane
996  }
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
Coord
Coordinate-axis selector.
Definition: ERF_DataStruct.H:143
Here is the call graph for this function:

Member Data Documentation

◆ m_bnd_rbx

amrex::Vector<amrex::RealBox> PlaneSampler::m_bnd_rbx

◆ m_dir

amrex::Vector<int> PlaneSampler::m_dir

◆ m_max_level

int PlaneSampler::m_max_level = -1

Referenced by get_sample_data(), and PlaneSampler().

◆ m_name

amrex::Vector<std::string> PlaneSampler::m_name

Referenced by PlaneSampler(), and write_sample_data().

◆ m_ps_mf

amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab> > > PlaneSampler::m_ps_mf

◆ m_varnames

amrex::Vector<std::string> PlaneSampler::m_varnames {"magvel","theta"}

The documentation for this struct was generated from the following file: