448 Print() <<
"Asking for index " <<
idx <<
" but m_in_timesteps only has size " <<
m_in_timesteps.size() << std::endl;
452 const std::string chkname1 =
m_filename + Concatenate(
"/bndry_output", t_step);
454 const std::string level_prefix =
"Level_";
457 const Box& domain =
m_geom.Domain();
459 DistributionMapping dm{ba};
461 GpuArray<GpuArray<Real, AMREX_SPACEDIM*2>, AMREX_SPACEDIM+
NBCVAR_max> l_bc_extdir_vals_d;
465 for (OrientationIter oit; oit !=
nullptr; ++oit) {
467 l_bc_extdir_vals_d[i][ori] = m_bc_extdir_vals[i][ori];
471 int n_for_density = -1;
474 if (
m_var_names[i] ==
"density") n_for_density = i;
480 for (OrientationIter oit; oit !=
nullptr; ++oit) {
482 if (ori.coordDir() < 2) {
483 FArrayBox& d = (*data_to_fill[ori])[lev];
484 const auto& bx = d.box();
485 Array4<Real> d_arr = d.array();
487 bx, ncomp_for_bc, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k,
int n) noexcept {
488 d_arr(i,j,k,n) =
zero;
494 std::string filenamer = MultiFabFileFullPrefix(lev, chkname1, level_prefix,
"density");
497 for (OrientationIter oit; oit !=
nullptr; ++oit) {
499 if (ori.coordDir() < 2) {
500 std::string facenamer = Concatenate(filenamer +
'_', ori, 1);
501 bndry_r[ori].read(facenamer);
509 bndry_qv.setVal(
zero);
511 std::string filenameqv = MultiFabFileFullPrefix(lev, chkname1, level_prefix,
"qv");
512 for (OrientationIter oit; oit !=
nullptr; ++oit) {
514 if (ori.coordDir() < 2) {
515 std::string facenameqv = Concatenate(filenameqv +
'_', ori, 1);
516 bndry_qv[ori].read(facenameqv);
523 const std::string qv_header = Concatenate(MultiFabFileFullPrefix(lev, chkname1, level_prefix,
"qv") +
'_',
524 Orientation(0, Orientation::low), 1) +
"_H";
525 if (FileExists(qv_header)) {
526 Abort(
"erf.bndry_input_var_names reads temperature but not qv, and " +
m_filename +
527 " holds qv planes: the writer was moist, so its temperature includes qv. Add qv to"
528 " erf.bndry_input_var_names, or write and read theta instead of temperature");
535 for (
int ivar = 0; ivar <
m_var_names.size(); ivar++)
539 std::string filename1 = MultiFabFileFullPrefix(lev, chkname1, level_prefix, var_name);
542 if (var_name ==
"velocity") {
543 ncomp = AMREX_SPACEDIM;
560 for (OrientationIter oit; oit !=
nullptr; ++oit) {
562 if (ori.coordDir() < 2) {
564 std::string facename1 = Concatenate(filename1 +
'_', ori, 1);
565 bndry[ori].read(facename1);
567 int normal = ori.coordDir();
568 IntVect v_offset =
offset(ori.faceDir(), normal);
569 if (real_bcs) { v_offset = IntVect(0); }
571 const auto& bbx = (*data_to_fill[ori])[lev].box();
578 bndry[ori].boxArray(), bndry[ori].DistributionMap(),
581 for (MFIter mfi(bndryMF); mfi.isValid(); ++mfi) {
583 const auto& vbx = mfi.validbox();
584 const auto& bndry_read_arr = bndry[ori].array(mfi);
585 const auto& bndry_read_r_arr = bndry_r[ori].array(mfi);
586 const auto& bndry_read_qv_arr = bndry_qv[ori].array(mfi);
587 const auto& bndry_mf_arr = bndryMF.array(mfi);
589 const auto& bx = bbx & vbx;
601 bx_ghost.setBig (normal, domain.smallEnd(normal) - 1);
602 bx_int .setSmall(normal, domain.smallEnd(normal));
604 bx_ghost.setSmall(normal, domain.bigEnd(normal) + 1);
605 bx_int .setBig (normal, domain.bigEnd(normal));
607 const IntVect v_offset_int = -v_offset;
615 if (n_for_density >= 0) {
616 if (var_name ==
"temperature") {
618 bx_ghost, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
619 Real R1 = bndry_read_r_arr(i, j, k, 0);
620 Real R2 = bndry_read_r_arr(i+v_offset[0],j+v_offset[1],k+v_offset[2],0);
621 Real T1 = bndry_read_arr(i, j, k, 0);
622 Real T2 = bndry_read_arr(i+v_offset[0],j+v_offset[1],k+v_offset[2],0);
623 Real Q1 = bndry_read_qv_arr(i, j, k, 0);
624 Real Q2 = bndry_read_qv_arr(i+v_offset[0],j+v_offset[1],k+v_offset[2],0);
627 bndry_mf_arr(i, j, k, 0) = (real_bcs) ? bndry_read_arr(i, j, k, 0) :
628 myhalf * (R1*Th1 + R2*Th2);
630 }
else if (var_name ==
"theta" || var_name ==
"ke" || var_name ==
"scalar" ||
631 var_name ==
"qv" || var_name ==
"qc") {
633 bx_ghost, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
634 Real R1 = bndry_read_r_arr(i, j, k, 0);
635 Real R2 = bndry_read_r_arr(i+v_offset[0],j+v_offset[1],k+v_offset[2],0);
636 bndry_mf_arr(i, j, k, 0) = (real_bcs) ? bndry_read_arr(i, j, k, 0) :
637 myhalf * ( R1 * bndry_read_arr(i, j, k, 0) +
638 R2 * bndry_read_arr(i+v_offset[0],j+v_offset[1],k+v_offset[2], 0));
640 }
else if (var_name ==
"density") {
642 bx_ghost, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
643 bndry_mf_arr(i, j, k, 0) = (real_bcs) ? bndry_read_arr(i, j, k, 0) :
644 myhalf * ( bndry_read_arr(i, j, k, 0) +
645 bndry_read_arr(i+v_offset[0],j+v_offset[1],k+v_offset[2], 0));
649 if (var_name ==
"temperature") {
651 bx_ghost, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
654 Real T1 = bndry_read_arr(i, j, k, 0);
655 Real T2 = bndry_read_arr(i+v_offset[0],j+v_offset[1],k+v_offset[2], 0);
656 Real Q1 = bndry_read_qv_arr(i, j, k, 0);
657 Real Q2 = bndry_read_qv_arr(i+v_offset[0],j+v_offset[1],k+v_offset[2],0);
660 bndry_mf_arr(i, j, k, 0) = (real_bcs) ? bndry_read_arr(i, j, k, 0) :
661 myhalf * (R1*Th1 + R2*Th2);
663 }
else if (var_name ==
"theta" || var_name ==
"ke" || var_name ==
"scalar" ||
664 var_name ==
"qv" || var_name ==
"qc") {
666 bx_ghost, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
669 bndry_mf_arr(i, j, k, 0) = (real_bcs) ? bndry_read_arr(i, j, k, 0) :
670 myhalf * (R1 * bndry_read_arr(i, j, k, 0) +
671 R2 * bndry_read_arr(i+v_offset[0],j+v_offset[1],k+v_offset[2], 0));
677 if (var_name ==
"velocity") {
679 bx_ghost, ncomp, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k,
int n) noexcept {
680 bndry_mf_arr(i, j, k, n) = (real_bcs) ? bndry_read_arr(i, j, k, n) :
681 myhalf * (bndry_read_arr(i, j, k, n) +
682 bndry_read_arr(i+v_offset[0],j+v_offset[1],k+v_offset[2], n));
689 if (n_for_density >= 0) {
690 if (var_name ==
"temperature") {
692 bx_int, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
693 Real R1 = bndry_read_r_arr(i, j, k, 0);
694 Real R2 = bndry_read_r_arr(i+v_offset_int[0],j+v_offset_int[1],k+v_offset_int[2],0);
695 Real T1 = bndry_read_arr(i, j, k, 0);
696 Real T2 = bndry_read_arr(i+v_offset_int[0],j+v_offset_int[1],k+v_offset_int[2],0);
697 Real Q1 = bndry_read_qv_arr(i, j, k, 0);
698 Real Q2 = bndry_read_qv_arr(i+v_offset_int[0],j+v_offset_int[1],k+v_offset_int[2],0);
701 bndry_mf_arr(i, j, k, 0) = (real_bcs) ? bndry_read_arr(i, j, k, 0) :
702 myhalf * (R1*Th1 + R2*Th2);
704 }
else if (var_name ==
"theta" || var_name ==
"ke" || var_name ==
"scalar" ||
705 var_name ==
"qv" || var_name ==
"qc") {
707 bx_int, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
708 Real R1 = bndry_read_r_arr(i, j, k, 0);
709 Real R2 = bndry_read_r_arr(i+v_offset_int[0],j+v_offset_int[1],k+v_offset_int[2],0);
710 bndry_mf_arr(i, j, k, 0) = (real_bcs) ? bndry_read_arr(i, j, k, 0) :
711 myhalf * ( R1 * bndry_read_arr(i, j, k, 0) +
712 R2 * bndry_read_arr(i+v_offset_int[0],j+v_offset_int[1],k+v_offset_int[2], 0));
714 }
else if (var_name ==
"density") {
716 bx_int, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
717 bndry_mf_arr(i, j, k, 0) = (real_bcs) ? bndry_read_arr(i, j, k, 0) :
718 myhalf * ( bndry_read_arr(i, j, k, 0) +
719 bndry_read_arr(i+v_offset_int[0],j+v_offset_int[1],k+v_offset_int[2], 0));
723 if (var_name ==
"temperature") {
725 bx_int, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
728 Real T1 = bndry_read_arr(i, j, k, 0);
729 Real T2 = bndry_read_arr(i+v_offset_int[0],j+v_offset_int[1],k+v_offset_int[2], 0);
730 Real Q1 = bndry_read_qv_arr(i, j, k, 0);
731 Real Q2 = bndry_read_qv_arr(i+v_offset_int[0],j+v_offset_int[1],k+v_offset_int[2],0);
734 bndry_mf_arr(i, j, k, 0) = (real_bcs) ? bndry_read_arr(i, j, k, 0) :
735 myhalf * (R1*Th1 + R2*Th2);
737 }
else if (var_name ==
"theta" || var_name ==
"ke" || var_name ==
"scalar" ||
738 var_name ==
"qv" || var_name ==
"qc") {
740 bx_int, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
743 bndry_mf_arr(i, j, k, 0) = (real_bcs) ? bndry_read_arr(i, j, k, 0) :
744 myhalf * (R1 * bndry_read_arr(i, j, k, 0) +
745 R2 * bndry_read_arr(i+v_offset_int[0],j+v_offset_int[1],k+v_offset_int[2], 0));
750 if (var_name ==
"velocity") {
752 bx_int, ncomp, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k,
int n) noexcept {
753 bndry_mf_arr(i, j, k, n) = (real_bcs) ? bndry_read_arr(i, j, k, n) :
754 myhalf * (bndry_read_arr(i, j, k, n) +
755 bndry_read_arr(i+v_offset_int[0],j+v_offset_int[1],k+v_offset_int[2], n));
760 bndryMF.copyTo((*data_to_fill[ori])[lev], 0, n_offset, ncomp);
constexpr amrex::Real bogus_large_value
Definition: ERF_Constants.H:19
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getThgivenRandT(const amrex::Real rho, const amrex::Real T, const amrex::Real rdOcp, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:64
#define NBCVAR_max
Definition: ERF_IndexDefines.H:42
const Real rdOcp
Definition: ERF_InitCustomPert_ABL.H:72
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int idx(int i, int j, int k, int nx, int ny)
Definition: ERF_InitForEnsemble.cpp:404
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41
AMREX_FORCE_INLINE IntVect offset(const int face_dir, const int normal)
Definition: ERF_ReadBndryPlanes.cpp:36
amrex::Vector< int > m_in_timesteps
Definition: ERF_ReadBndryPlanes.H:109
int ingested_density() const
Definition: ERF_ReadBndryPlanes.H:67
const int m_extent_rad
Definition: ERF_ReadBndryPlanes.H:117