1 #ifndef ERF_FIRE_GRID_H
2 #define ERF_FIRE_GRID_H
4 #include <AMReX_BoxArray.H>
5 #include <AMReX_DistributionMapping.H>
6 #include <AMReX_Geometry.H>
31 amrex::DistributionMapping
dm;
64 const amrex::DistributionMapping& dm_atm,
65 const amrex::Geometry& geom_atm,
68 #include <AMReX_MultiFab.H>
69 #include <AMReX_MFIter.H>
84 mf.FillBoundary(geom.periodicity());
85 const auto ng = mf.nGrowVect();
86 const bool px = geom.isPeriodic(0) ||
ng[0] == 0;
87 const bool py = geom.isPeriodic(1) ||
ng[1] == 0;
88 const bool pz = geom.isPeriodic(2) ||
ng[2] == 0;
89 if (px && py && pz) {
return; }
90 const amrex::Box& dom = geom.Domain();
91 const auto dlo = dom.smallEnd();
92 const auto dhi = dom.bigEnd();
93 const int ncomp = mf.nComp();
94 for (amrex::MFIter mfi(mf); mfi.isValid(); ++mfi) {
95 const amrex::Box& gbx = mfi.fabbox();
96 if (dom.contains(gbx)) {
continue; }
97 auto a = mf.array(mfi);
98 amrex::ParallelFor(gbx, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) noexcept
100 int ic = i, jc = j, kc = k;
101 if (!px) { ic = amrex::min(amrex::max(i, dlo[0]), dhi[0]); }
102 if (!py) { jc = amrex::min(amrex::max(j, dlo[1]), dhi[1]); }
103 if (!pz) { kc = amrex::min(amrex::max(k, dlo[2]), dhi[2]); }
104 if (ic != i || jc != j || kc != k) { a(i, j, k, n) = a(ic, jc, kc, n); }
119 const int lo_x =
fg.atm_lo[0];
120 const int lo_y =
fg.atm_lo[1];
121 for (amrex::MFIter mfi(fire_mf,
false); mfi.isValid(); ++mfi) {
122 auto f = fire_mf.array(mfi);
123 auto a = atm_k0.const_array(mfi);
124 amrex::ParallelFor(mfi.tilebox(), [=] AMREX_GPU_DEVICE (
const amrex::IntVect& iv) noexcept
126 f(iv[0], iv[1], 0) = a(iv[0] / C + lo_x, iv[1] / C + lo_y, 0);
void fire_fill_boundary(amrex::MultiFab &mf, const amrex::Geometry &geom)
Definition: ERF_FireGrid.H:82
FireGrid create_fire_grid(const amrex::BoxArray &ba_atm, const amrex::DistributionMapping &dm_atm, const amrex::Geometry &geom_atm, int C)
Construct a refined 2D fire grid over one atmospheric level's boxes.
void fill_fire_from_atm_k0(amrex::MultiFab &fire_mf, const amrex::MultiFab &atm_k0, const FireGrid &fg)
Definition: ERF_FireGrid.H:115
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);})
@ fg
Definition: ERF_AdvanceMorrison.cpp:111
@ ng
Definition: ERF_Morrison.H:51
2D horizontal fire computational grid
Definition: ERF_FireGrid.H:29
int lev
The atmospheric level (erf.fire.anchor_level, resolved)
Definition: ERF_FireGrid.H:39
amrex::BoxArray ba
2D BoxArray (C*nx × C*ny × 1)
Definition: ERF_FireGrid.H:30
amrex::IntVect atm_lo
Definition: ERF_FireGrid.H:38
amrex::Geometry geom
2D Geometry in physical coordinates [m]
Definition: ERF_FireGrid.H:32
amrex::DistributionMapping dm
Distribution map (x-y decomposition aligned with atm)
Definition: ERF_FireGrid.H:31
int C
Definition: ERF_FireGrid.H:33