34 static const bool noahmp_fatal_installed = []() {
35 NoahmpIO_set_fatal_handler([](
const char* msg){
36 amrex::Abort(msg ? msg :
"Noah-MP fatal error");
40 amrex::ignore_unused(noahmp_fatal_installed);
49 Box domain = geom.Domain();
50 khi_lsm = domain.smallEnd(2) - 1;
62 const std::vector<std::string> fixed_names = {
70 const char* group[3] = {
"smois",
"sh2o",
"tslb"};
71 for (
int g(0);
g < 3; ++
g) {
72 for (
int k(0); k <
m_nsoil; ++k) {
95 BoxArray ba = cons_in.boxArray();
96 DistributionMapping dm = cons_in.DistributionMap();
97 BoxList bl_lsm = ba.boxList();
98 for (
auto& b : bl_lsm) { b.setRange(2,0); }
99 BoxArray ba_lsm(std::move(bl_lsm));
102 const RealBox& dom_rb =
m_geom.ProbDomain();
104 RealBox lsm_rb = dom_rb;
105 Real lsm_dx[AMREX_SPACEDIM] = {AMREX_D_DECL(dom_dx[0],dom_dx[1],
m_dz_lsm)};
106 Real lsm_z_hi = dom_rb.lo(2);
108 lsm_rb.setHi(2,lsm_z_hi); lsm_rb.setLo(2,lsm_z_lo);
116 lsm_fab_data[ivar] = std::make_shared<MultiFab>(ba_lsm, dm, 1,
ng);
122 lsm_fab_flux[ivar] = std::make_shared<MultiFab>(ba_lsm, dm, 1, IntVect(1,1,0));
128 Print() <<
"Noah-MP initialization started" << std::endl;
132 if (cons_in.local_size() > 0) {
140 int klo = domain.smallEnd(2);
145 for (MFIter mfi(cons_in); mfi.isValid(); ++mfi, ++idb) {
147 Box bx = mfi.tilebox();
150 if (bx.smallEnd(2) != klo) {
continue; }
160 noahmpio->blkid = idb;
161 noahmpio->level = lev;
162 noahmpio->ScalarInitDefault();
163 noahmpio->rank = ParallelDescriptor::MyProc();
164 noahmpio->comm = MPI_Comm_c2f(ParallelDescriptor::Communicator());
167 noahmpio->ReadNamelist();
171 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(noahmpio->nsoil ==
m_nsoil,
172 "namelist.erf NSOIL does not match erf.lsm_nsoil (default 4); "
173 "set erf.lsm_nsoil to the Noah-MP soil-layer count");
176 noahmpio->ReadLandHeader();
180 noahmpio->xstart = bx.smallEnd(0);
181 noahmpio->xend = bx.bigEnd(0);
182 noahmpio->ystart = bx.smallEnd(1);
183 noahmpio->yend = bx.bigEnd(1);
186 noahmpio->ids = noahmpio->xstart;
187 noahmpio->ide = noahmpio->xend;
188 noahmpio->jds = noahmpio->ystart;
189 noahmpio->jde = noahmpio->yend;
194 noahmpio->its = noahmpio->xstart;
195 noahmpio->ite = noahmpio->xend;
196 noahmpio->jts = noahmpio->ystart;
197 noahmpio->jte = noahmpio->yend;
202 noahmpio->ims = noahmpio->xstart;
203 noahmpio->ime = noahmpio->xend;
204 noahmpio->jms = noahmpio->ystart;
205 noahmpio->jme = noahmpio->yend;
210 noahmpio->VarInitDefault();
213 noahmpio->ReadTable();
216 noahmpio->ReadLandMain();
219 noahmpio->InitMain();
222 Print() <<
"Noah-MP writing lnd.nc file at lev: " << lev << std::endl;
223 noahmpio->WriteLand(0);
232 ParallelDescriptor::ReduceRealMax(
m_dtbl);
239 Print() <<
"Noah-MP initialization completed" << std::endl;
constexpr amrex::Real lsm_undefined
Definition: ERF_Constants.H:35
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int idx(int i, int j, int k, int nx, int ny)
Definition: ERF_InitForEnsemble.cpp:287
#define NOAHMP_LSMDATA_FIELDS(X)
Definition: ERF_NOAHMP_Fields.H:19
#define NOAHMP_QUOTE(comp)
Definition: ERF_NOAHMP_Fields.H:110
amrex::Real Real
Definition: ERF_ShocInterface.H:19
int khi_lsm
Definition: ERF_NOAHMP.H:356
amrex::Vector< amrex::BCRec > m_domain_bcs_type
Definition: ERF_NOAHMP.H:342
int m_plot_int_1
Definition: ERF_NOAHMP.H:401
amrex::Vector< std::string > LsmDataName
Definition: ERF_NOAHMP.H:324
amrex::Vector< int > LsmDataMap
Definition: ERF_NOAHMP.H:318
int soil_data_idx(int g, int k) const
Definition: ERF_NOAHMP.H:285
int m_nsoil
Definition: ERF_NOAHMP.H:379
amrex::IntVect m_refRatio
Definition: ERF_NOAHMP.H:339
amrex::Vector< FabPtr > lsm_fab_data
Definition: ERF_NOAHMP.H:366
int m_lsm_data_size
Definition: ERF_NOAHMP.H:312
int m_lev
Definition: ERF_NOAHMP.H:398
amrex::Geometry m_lsm_geom
Definition: ERF_NOAHMP.H:336
amrex::Geometry m_geom0
Definition: ERF_NOAHMP.H:333
int m_nz_lsm
Definition: ERF_NOAHMP.H:359
amrex::Vector< amrex::MultiFab * > lsm_lev0_data
Definition: ERF_NOAHMP.H:372
int m_lsm_flux_size
Definition: ERF_NOAHMP.H:315
amrex::Real m_dtbl
Definition: ERF_NOAHMP.H:353
amrex::Vector< int > LsmFluxMap
Definition: ERF_NOAHMP.H:321
void m_ensure_nsoil_resolved()
Definition: ERF_NOAHMP.H:292
amrex::Vector< std::string > LsmFluxName
Definition: ERF_NOAHMP.H:327
amrex::Real m_dz_lsm
Definition: ERF_NOAHMP.H:362
amrex::Real m_dt
Definition: ERF_NOAHMP.H:345
@ NumVars
Definition: ERF_NOAHMP_Fields.H:120
@ t_flux
Definition: ERF_NOAHMP_Fields.H:129
@ tau13
Definition: ERF_NOAHMP_Fields.H:131
@ q_flux
Definition: ERF_NOAHMP_Fields.H:130
@ tau23
Definition: ERF_NOAHMP_Fields.H:132
@ ng
Definition: ERF_Morrison.H:49
@ NumComps
Definition: ERF_NOAHMP_Fields.H:176
real(c_double), parameter g
Definition: ERF_module_model_constants.F90:19