1 #ifndef ERF_SURFACEMODEL_H
2 #define ERF_SURFACEMODEL_H
4 #include "AMReX_Geometry.H"
5 #include "AMReX_ParmParse.H"
6 #include "AMReX_FArrayBox.H"
7 #include "AMReX_IntVect.H"
8 #include "AMReX_MFIter.H"
9 #include "AMReX_MultiFab.H"
10 #include "AMReX_FillPatchUtil.H"
11 #include "AMReX_GpuLaunch.H"
23 amrex::Array4<const amrex::Real>
tau13;
24 amrex::Array4<const amrex::Real>
tau23;
25 amrex::Array4<const amrex::Real>
t_flux;
26 amrex::Array4<const amrex::Real>
q_flux;
61 const amrex::Vector<amrex::BoxArray> &ba,
62 const amrex::Vector<amrex::Geometry> &geom,
63 const amrex::Vector<amrex::DistributionMapping> &dm,
65 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::iMultiFab>>>& )
90 void initialize_for_level (
int lev,
const amrex::BoxArray &ba,
const amrex::Geometry &geom,
const amrex::DistributionMapping &dm,
const amrex::Vector<std::unique_ptr<amrex::iMultiFab>>& lmask_lev,
const amrex::Vector <amrex::BCRec> &domain_bcs_type,
const amrex::Vector<amrex::IntVect> &refRatio)
99 amrex::BoxList bl2d = ba.boxList();
100 for (
auto& b : bl2d) {
103 m_ba2d[lev] = amrex::BoxArray(std::move(bl2d));
105 amrex::RealBox dom2d = geom.ProbDomain();
106 dom2d.setHi(2, geom.CellSize(2));
107 m_geom2d[lev].define(makeSlab(
m_geom[lev].Domain(), 2, 0), dom2d, geom.Coord(), geom.isPeriodic());
109 m_lmask[lev] = lmask_lev[0].get();
126 for (
int field = 0; field < static_cast<int>(
fields.size()); ++field) {
127 fields[field][lev].reset();
131 for (
const auto& entry :
fieldmap) {
132 if (entry.second.active) {
137 entry.second.weighted[lev].reset();
148 amrex::Vector<amrex::Real> ftime = {time_for_fp, time_for_fp};
149 amrex::Vector<amrex::Real> ctime = {time_for_fp, time_for_fp};
150 amrex::IntVect ng_od(0, 0, 0);
151 amrex::Interpolater* mapper = &amrex::cell_cons_interp;
152 amrex::Vector<amrex::MultiFab*> fmf;
153 amrex::Vector<amrex::MultiFab*> cmf;
154 if (
u_star[lev] !=
nullptr &&
u_star[lev-1] !=
nullptr) {
155 amrex::InterpFromCoarseLevel(*
u_star[lev],
u_star[lev-1]->nGrowVect(), ng_od,
158 refRatio[lev-1], &amrex::cell_cons_interp,
160 amrex::InterpFromCoarseLevel(*
t_star[lev],
t_star[lev-1]->nGrowVect(), ng_od,
163 refRatio[lev-1], &amrex::cell_cons_interp,
165 amrex::InterpFromCoarseLevel(*
q_star[lev],
q_star[lev-1]->nGrowVect(), ng_od,
168 refRatio[lev-1], &amrex::cell_cons_interp,
170 amrex::InterpFromCoarseLevel(*
t_surf[lev],
t_surf[lev-1]->nGrowVect(), ng_od,
173 refRatio[lev-1], &amrex::cell_cons_interp,
178 amrex::FillPatchTwoLevels(*
u_star[lev].
get(),
u_star[lev]->nGrowVect(), ng_od,
179 time_for_fp, cmf, ctime, fmf, ftime,
181 refRatio[lev-1], mapper, domain_bcs_type,
185 amrex::FillPatchTwoLevels(*
t_star[lev].
get(),
t_star[lev]->nGrowVect(), ng_od,
186 time_for_fp, cmf, ctime, fmf, ftime,
188 refRatio[lev-1], mapper, domain_bcs_type,
192 amrex::FillPatchTwoLevels(*
q_star[lev].
get(),
q_star[lev]->nGrowVect(), ng_od,
193 time_for_fp, cmf, ctime, fmf, ftime,
195 refRatio[lev-1], mapper, domain_bcs_type,
199 amrex::FillPatchTwoLevels(*
t_surf[lev].
get(),
t_surf[lev]->nGrowVect(), ng_od,
200 time_for_fp, cmf, ctime, fmf, ftime,
202 refRatio[lev-1], mapper, domain_bcs_type,
206 for (
int field = 0; field < static_cast<int>(
fields.size()); ++field) {
207 if (
fields[field][lev] ==
nullptr ||
fields[field][lev-1] ==
nullptr) {
continue; }
208 amrex::IntVect ngv =
fields[field][lev-1]->nGrowVect(); ngv[2] = 0;
209 amrex::InterpFromCoarseLevel(*
fields[field][lev], ngv, ng_od,
210 *
fields[field][lev-1], 0, 0, 1,
212 refRatio[lev-1], &amrex::cell_cons_interp,
214 fmf = {
fields[field][lev ].get(),
fields[field][lev ].get()};
215 cmf = {
fields[field][lev-1].get(),
fields[field][lev-1].get()};
216 amrex::FillPatchTwoLevels(*
fields[field][lev].
get(), ngv, ng_od,
217 time_for_fp, cmf, ctime, fmf, ftime,
219 refRatio[lev-1], mapper, domain_bcs_type,
236 if (lev < 0 || lev >=
m_nlevs) {
return; }
258 for (
int i = 0; i < static_cast<int>(data_names.size()); ++i) {
263 for (
int i = 0; i < static_cast<int>(
lsm_data_lev[lev].size()); ++i) {
269 for (
auto& fields_at_level :
rad_fields) { fields_at_level.clear(); }
272 if (lev <
static_cast<int>(entry.second.weighted.size())) {
273 entry.second.weighted[lev].reset();
284 for (
int i = 0; i < static_cast<int>(data_names.size()); ++i) {
288 for (
int i = 0; i < static_cast<int>(
urban_data_lev[lev].size()); ++i) {
294 for (
auto& fields_at_level :
rad_fields) { fields_at_level.clear(); }
297 if (lev <
static_cast<int>(entry.second.weighted.size())) {
298 entry.second.weighted[lev].reset();
315 amrex::Vector<amrex::MultiFab*>* model_data =
nullptr;
316 amrex::Vector<std::string>* model_names =
nullptr;
330 const int data_size =
static_cast<int>(model_data->size());
331 model_data->resize(data_size +
static_cast<int>(model_fluxes.size()));
333 model_names->resize(data_size +
static_cast<int>(model_fluxes.size()));
336 for (
int i = 0; i < static_cast<int>(model_fluxes.size()); ++i) {
338 (*model_data)[data_size + i] = model_fluxes[i];
340 (*model_names)[data_size + i] = flux_names[i];
359 const int nfields =
static_cast<int>(field_indices.size());
375 "All registered surface models must export either fluxes or u*/t*/q*, not a mix");
380 for (
const int field : field_indices) {
382 field == -1 || (field >= 0 && field < nregistered),
383 "Model field index must be -1 or within the registered provider data range");
387 lsm_fields = amrex::Vector<int>(field_indices);
390 fields_at_level.clear();
396 fields_at_level.clear();
415 amrex::MultiFab *lsm_weighted,
416 const amrex::MultiFab *urban_data,
417 amrex::MultiFab *urban_weighted);
426 bool update_derived =
true);
440 for (
int lev = 0; lev <
m_nlevs; ++lev) {
452 for (
int lev = 0; lev <
m_nlevs; ++lev) {
523 return {
u_star[lev]->const_array(mfi, 0),
524 u_star[lev]->const_array(mfi, 1),
525 t_star[lev]->const_array(mfi),
526 q_star[lev]->const_array(mfi)};
533 auto get_provider_field = [&] (
const int field) -> amrex::Array4<const amrex::Real> {
534 if (field >=
static_cast<int>(provider_fields.size())) {
537 const int index = provider_fields[field];
538 if (index < 0 || index >=
static_cast<int>(provider_data.size()) ||
539 provider_data[index] ==
nullptr) {
542 return provider_data[index]->const_array(mfi);
545 return {get_provider_field(0), get_provider_field(1),
546 get_provider_field(2), get_provider_field(3)};
558 const int field_idx)
const {
560 const bool single_provider =
563 if (single_provider) {
567 bool is_weighted_field =
false;
568 for (
int field = first_output_field;
569 field < static_cast<int>(selected.size()); ++field) {
570 if (selected[field] == field_idx) {
571 is_weighted_field =
true;
575 if (!is_weighted_field) {
581 if (field_idx < 0 || field_idx >=
static_cast<int>(source.size())) {
584 return source[field_idx];
589 if (field_idx < 0 || field_idx >=
static_cast<int>(weighted.size())) {
592 return weighted[field_idx].get();
602 return wavg[lev].get();
618 void write_output (
const int &finest_lev,
const amrex::Real &time,
const std::string &plot_prefix,
const amrex::Vector<int> &level_steps,
const amrex::Vector<amrex::IntVect> &ref_ratio);
626 void register_field_map (std::string
name,
const std::pair<int, int> &lsm_urb_map,
bool fill_boundary=
false);
635 void register_field_map (std::string
name, amrex::Vector<amrex::MultiFab*> &lsm_lev_mf, amrex::Vector<amrex::MultiFab*> &urb_lev_mf,
bool fill_boundary=
false);
645 amrex::MultiFab* lsm_mf, amrex::MultiFab* urban_mf);
653 const std::pair<int, int>& lsm_urb_map);
660 const std::unordered_map<std::string, std::pair<int, int>>& input_map);
668 const std::pair<int, int>& lsm_urb_map);
675 const std::unordered_map<std::string, std::pair<int, int>>& output_map);
686 return fields[field->second.mf_ind][lev].get();
778 amrex::Print() <<
" --- building radiation field list" << std::endl;
781 for (
int li = 0; li < static_cast<int>(
radnames.size()); ++li) {
782 amrex::Print() <<
" - Checking for radiation variable '" <<
radnames[li] <<
"'" << std::endl;
784 amrex::MultiFab* mf =
nullptr;
787 const int land_idx = rad_it->second.map.first;
788 const int urban_idx = rad_it->second.map.second;
794 const bool valid_land = use_land && land_idx >= 0 &&
796 land_idx < static_cast<int>(
lsm_data_lev[lev].size()) &&
798 const bool valid_urban = use_urban && urban_idx >= 0 &&
802 if (valid_land && valid_urban) {
803 if (!rad_it->second.weighted[lev]) {
804 rad_it->second.weighted[lev] = std::make_unique<amrex::MultiFab>(
807 auto& weighted = *rad_it->second.weighted[lev];
810 for (amrex::MFIter mfi(weighted); mfi.isValid(); ++mfi) {
811 const amrex::Box bx = mfi.tilebox();
812 const auto weights =
wavg[lev]->const_array(mfi);
813 const auto land_arr = land.const_array(mfi);
814 const auto urban_arr = urban.const_array(mfi);
818 const int land_k = land.box(mfi.index()).bigEnd(2);
819 const int urban_k = urban.box(mfi.index()).smallEnd(2);
820 auto output = weighted.array(mfi);
822 output(i,j,k) = land_arr(i,j,land_k) *
824 urban_arr(i,j,urban_k) *
828 weighted.FillBoundary(
m_geom[lev].periodicity());
829 mf = rad_it->second.weighted[lev].get();
830 }
else if (valid_land) {
832 }
else if (valid_urban) {
839 amrex::Print() <<
" - WARNING: did not find radiation variable, setting to null to use default RRTMGP value!" << std::endl;
845 "Did not find all radiation fields");
875 const amrex::MultiFab* mf)
const;
927 for (
auto& field_lev :
fields) { field_lev.resize(
m_nlevs); }
929 entry.second.lsm_ptr.resize(
m_nlevs,
nullptr);
930 entry.second.urb_ptr.resize(
m_nlevs,
nullptr);
943 if (has_land && has_urban) {
950 }
else if (has_land) {
953 }
else if (has_urban) {
967 if (
wavg[lev] !=
nullptr) {
return; }
969 const amrex::IntVect
ng(1,1,0);
984 if (
u_star[lev] !=
nullptr) {
return; }
986 const amrex::IntVect
ng(1,1,0);
994 t_surf[lev]->setVal(300.0);
1003 for (
int lev = 0; lev <
m_nlevs; ++lev) {
1034 amrex::Vector<amrex::BoxArray>
m_ba;
1037 amrex::Vector<amrex::DistributionMapping>
m_dmap;
1051 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
u_star;
1052 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
t_star;
1053 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
q_star;
1054 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
t_surf;
1062 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
wavg;
1071 inline static const std::vector<std::string>
radnames = {
"tskin",
"emiss",
"albedo_vis",
"albedo_nir",
"albedo_vis_diff",
"albedo_nir_diff"};
1097 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>
fields;
1107 "cos_zenith_angle",
"sw_flux_dn",
"sw_flux_dn_dir_vis",
1108 "sw_flux_dn_dir_nir",
"sw_flux_dn_dif_vis",
"sw_flux_dn_dif_nir",
1113 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
weighted;
pp_for_pert_vels get("prob_type", prob_type)
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(axis >=0 &&axis< AMREX_SPACEDIM, "prob.axis must be 0, 1 or 2")
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
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);})
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
std::string name
Definition: ERF_Plotfile2DCatalog.cpp:116
amrex::Real Real
Definition: ERF_ShocInterface.H:19
SurfaceProviderMode
Definition: ERF_SurfaceModel.H:17
SurfaceModelType
Definition: ERF_SurfaceModel.H:15
@ LAND
Definition: ERF_SurfaceModel.H:15
@ URBAN
Definition: ERF_SurfaceModel.H:15
Interface between ERF and land-surface and urban models.
Definition: ERF_SurfaceModel.H:47
amrex::MultiFab * get_tsurf(const int &lev)
Returns the weighted surface-temperature output for a level.
Definition: ERF_SurfaceModel.H:504
void clear_level(int lev)
Removes an AMR level, and every level above it, from the surface model.
Definition: ERF_SurfaceModel.H:234
amrex::Vector< amrex::MultiFab * > urban_frac_lev
Definition: ERF_SurfaceModel.H:1043
std::unordered_map< std::string, RadiationField > radiation_input_map
Definition: ERF_SurfaceModel.H:1115
void resize_levels(int nlevs)
Sets the number of AMR levels and resizes all per-level storage to match.
Definition: ERF_SurfaceModel.H:897
void apply_weight_average(int lev, const amrex::MultiFab *lsm_data, amrex::MultiFab *lsm_weighted, const amrex::MultiFab *urban_data, amrex::MultiFab *urban_weighted)
Applies land and urban weights into separate output fields.
Definition: ERF_SurfaceModel.cpp:12
std::unordered_map< std::string, RadiationField > radiation_output_map
Definition: ERF_SurfaceModel.H:1116
void register_radiation_output(const std::string &name, const std::pair< int, int > &lsm_urb_map)
Registers a canonical radiation output mapping.
Definition: ERF_SurfaceModel.cpp:340
amrex::Vector< std::string > m_lsm_names
Definition: ERF_SurfaceModel.H:1100
int m_nlevs
Definition: ERF_SurfaceModel.H:1016
amrex::MultiFab * get_radiation_output_field(int lev, const std::string &name)
Returns the destination of one canonical radiation output by name.
Definition: ERF_SurfaceModel.cpp:411
amrex::Vector< amrex::BoxArray > m_ba2d
Definition: ERF_SurfaceModel.H:1035
bool m_weights_updated
Definition: ERF_SurfaceModel.H:1030
void set_field_map_pointers(const std::string &name, int lev, amrex::MultiFab *lsm_mf, amrex::MultiFab *urban_mf)
Updates a pointer-based field mapping for one level.
Definition: ERF_SurfaceModel.cpp:619
bool is_field_mapped(int lev, SurfaceModelType type, int field_idx, const amrex::MultiFab *mf) const
Checks whether a model field participates in a registered mapping.
Definition: ERF_SurfaceModel.cpp:492
void write_output(const int &finest_lev, const amrex::Real &time, const std::string &plot_prefix, const amrex::Vector< int > &level_steps, const amrex::Vector< amrex::IntVect > &ref_ratio)
Writes registered surface-model fields to plotfile output.
Definition: ERF_SurfaceModel.cpp:758
amrex::Vector< amrex::Geometry > m_geom
Definition: ERF_SurfaceModel.H:1036
bool m_export_fluxes
Definition: ERF_SurfaceModel.H:1021
static const std::vector< std::string > rad_output_names
Definition: ERF_SurfaceModel.H:1106
void activate_field_map(const std::string &name, const bool persistent=true)
Activates a mapped field and allocates its storage on all levels.
Definition: ERF_SurfaceModel.cpp:637
amrex::Vector< amrex::Vector< amrex::MultiFab * > > rad_output_fields
Definition: ERF_SurfaceModel.H:1104
void weight_model_field(int lev, const amrex::MultiFab *source, amrex::MultiFab *weighted, SurfaceModelType type)
Writes a weighted copy of a model field.
Definition: ERF_SurfaceModel.cpp:43
amrex::Vector< amrex::MultiFab * > m_last_urban_frac
Definition: ERF_SurfaceModel.H:1059
void register_radiation_outputs(const std::unordered_map< std::string, std::pair< int, int >> &output_map)
Registers canonical radiation output mappings.
Definition: ERF_SurfaceModel.cpp:370
const amrex::Vector< const amrex::MultiFab * > get_radiation_fields(int lev=0)
Returns fields registered under the RRTMGP radiation names.
Definition: ERF_SurfaceModel.H:702
void distribute_radiation_outputs(int lev)
Distributes updated canonical radiation outputs to other providers.
Definition: ERF_SurfaceModel.cpp:439
amrex::MultiFab * get_ustar(const int &lev)
Returns the weighted horizontal momentum output for a level.
Definition: ERF_SurfaceModel.H:477
void register_field_map(std::string name, const std::pair< int, int > &lsm_urb_map, bool fill_boundary=false)
Registers a field map using land and urban field indices.
Definition: ERF_SurfaceModel.cpp:565
bool m_surface_layer_outputs_enabled
Definition: ERF_SurfaceModel.H:1058
amrex::MultiFab * get_tstar(const int &lev)
Returns the weighted thermal output for a level.
Definition: ERF_SurfaceModel.H:486
static void GotoNextLine(std::istream &is)
Advances an input stream to the next line.
Definition: ERF_SurfaceModel.cpp:824
amrex::Vector< std::unique_ptr< amrex::MultiFab > > q_star
Definition: ERF_SurfaceModel.H:1053
amrex::Vector< std::string > m_urban_names
Definition: ERF_SurfaceModel.H:1101
amrex::Vector< amrex::BoxArray > m_ba
Definition: ERF_SurfaceModel.H:1034
bool m_fields_are_valid
Definition: ERF_SurfaceModel.H:1027
amrex::Vector< int > lsm_fields
Definition: ERF_SurfaceModel.H:1067
void release_transient_surface_outputs()
Releases surface outputs that have no persistent consumer.
Definition: ERF_SurfaceModel.H:1000
std::unordered_map< std::string, Field > fieldmap
Definition: ERF_SurfaceModel.H:1098
void ensure_surface_outputs(const int lev)
Allocates surface-output fields for one level.
Definition: ERF_SurfaceModel.H:982
amrex::Vector< std::unique_ptr< amrex::MultiFab > > t_surf
Definition: ERF_SurfaceModel.H:1054
void ReadCheckpoint(const std::string &checkpointname)
Restores surface-model state from a checkpoint file.
Definition: ERF_SurfaceModel.cpp:947
SurfaceFluxView get_surface_flux_view(const int lev, const amrex::MFIter &mfi) const
Returns provider or blended surface-flux views for one tile.
Definition: ERF_SurfaceModel.H:514
SurfaceModel(int nlevs, const amrex::Vector< amrex::BoxArray > &ba, const amrex::Vector< amrex::Geometry > &geom, const amrex::Vector< amrex::DistributionMapping > &dm, const SolverChoice &, amrex::Vector< amrex::Vector< std::unique_ptr< amrex::iMultiFab >>> &)
Constructs a surface-model interface for the supplied AMR levels.
Definition: ERF_SurfaceModel.H:60
amrex::Vector< SurfaceProviderMode > m_provider_mode
Definition: ERF_SurfaceModel.H:1032
bool m_use_urban
Definition: ERF_SurfaceModel.H:1018
void set_model_fields(SurfaceModelType type, const amrex::Vector< int > &field_indices, const bool use_fluxes=true)
Selects the model fields that participate in weighted averaging.
Definition: ERF_SurfaceModel.H:357
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > weighted_urban_data_lev
Definition: ERF_SurfaceModel.H:1047
void distribute_radiation_output(int lev, int output_index)
Distributes one updated canonical radiation output to other providers.
Definition: ERF_SurfaceModel.cpp:446
static const std::vector< std::string > radnames
Definition: ERF_SurfaceModel.H:1071
const amrex::Vector< amrex::MultiFab * > get_radiation_output_fields(int lev=0)
Returns canonical radiation output destinations for one level.
Definition: ERF_SurfaceModel.cpp:378
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > weighted_lsm_data_lev
Definition: ERF_SurfaceModel.H:1046
amrex::GpuArray< bool, 2 > m_output_fields_registered
Definition: ERF_SurfaceModel.H:1023
void calculate_simple_average(int lev, amrex::MultiFab *const urban_frac)
Computes simple land and urban weights from the urban fraction.
Definition: ERF_SurfaceModel.cpp:527
amrex::MultiFab * get_wavg_factors(const int &lev)
Returns the land and urban weighting factors for a level.
Definition: ERF_SurfaceModel.H:600
amrex::Vector< std::unique_ptr< amrex::MultiFab > > u_star
Definition: ERF_SurfaceModel.H:1051
const amrex::MultiFab * get_weighted_model_data(const int lev, SurfaceModelType type, const int field_idx) const
Returns weighted data for a selected model field.
Definition: ERF_SurfaceModel.H:556
void register_radiation_input(const std::string &name, const std::pair< int, int > &lsm_urb_map)
Registers a canonical radiation input mapping.
Definition: ERF_SurfaceModel.cpp:309
void validate_radiation_output_layout(int lev, const amrex::MultiFab *mf) const
Validates the layout contract for a canonical radiation output.
Definition: ERF_SurfaceModel.cpp:419
void calculate_weight_average(int lev, amrex::MultiFab *const urban_frac, bool update_derived=true)
Computes land and urban weights and applies them to registered fields.
Definition: ERF_SurfaceModel.cpp:71
amrex::Vector< std::unique_ptr< amrex::MultiFab > > t_star
Definition: ERF_SurfaceModel.H:1052
void build_radiation_fieldlist(int lev)
Builds the ordered radiation-field list for one AMR level.
Definition: ERF_SurfaceModel.H:777
void update_provider_mode(const int lev)
Updates the provider mode after model data are registered.
Definition: ERF_SurfaceModel.H:939
void register_radiation_inputs(const std::unordered_map< std::string, std::pair< int, int >> &input_map)
Registers canonical radiation input mappings.
Definition: ERF_SurfaceModel.cpp:332
void weight_average_fields(int lev, amrex::MultiFab *const)
Applies the current land and urban weights to selected model fields.
Definition: ERF_SurfaceModel.cpp:679
void set_model_data(const int lev, const amrex::Vector< amrex::MultiFab * > model_data, const amrex::Vector< std::string > &data_names, SurfaceModelType type)
Registers model variables used in weighted averaging.
Definition: ERF_SurfaceModel.H:248
static const std::vector< std::string > field_names
Definition: ERF_SurfaceModel.H:1119
amrex::Vector< amrex::Geometry > m_geom2d
Definition: ERF_SurfaceModel.H:1039
void mark_fields_valid()
Marks the registered surface fields as filled by an actual model advance.
Definition: ERF_SurfaceModel.H:463
amrex::Vector< int > urban_fields
Definition: ERF_SurfaceModel.H:1068
void ensure_weight_factors(const int lev)
Creates weighting factors when an external caller requests them.
Definition: ERF_SurfaceModel.H:965
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > fields
Definition: ERF_SurfaceModel.H:1097
amrex::Vector< amrex::Vector< amrex::MultiFab * > > lsm_data_lev
Definition: ERF_SurfaceModel.H:1044
void activate_all_field_maps(const bool persistent=true)
Activates all registered mapped fields for an output consumer.
Definition: ERF_SurfaceModel.cpp:659
bool are_fluxes()
Returns whether the interface exports fluxes rather than MOST variables.
Definition: ERF_SurfaceModel.H:432
void WriteCheckpoint(const std::string &checkpointname)
Writes surface-model state to a checkpoint file.
Definition: ERF_SurfaceModel.cpp:830
amrex::Vector< int > m_surface_outputs_requested
Definition: ERF_SurfaceModel.H:1056
amrex::Vector< amrex::Vector< const amrex::MultiFab * > > rad_fields
Definition: ERF_SurfaceModel.H:1103
amrex::Vector< std::unique_ptr< amrex::MultiFab > > wavg
Definition: ERF_SurfaceModel.H:1062
bool fields_are_valid() const
Returns whether the surface models have advanced at least once.
Definition: ERF_SurfaceModel.H:470
void request_surface_outputs(const bool persistent=true)
Enables and materializes the surface outputs consumed by ERF.
Definition: ERF_SurfaceModel.H:437
amrex::Vector< amrex::iMultiFab * > m_lmask
Definition: ERF_SurfaceModel.H:1040
amrex::Vector< amrex::Vector< amrex::MultiFab * > > urban_data_lev
Definition: ERF_SurfaceModel.H:1045
amrex::MultiFab * get_qstar(const int &lev)
Returns the weighted moisture output for a level.
Definition: ERF_SurfaceModel.H:495
void set_model_fluxes(const int lev, const amrex::Vector< amrex::MultiFab * > model_fluxes, const amrex::Vector< std::string > &flux_names, SurfaceModelType type)
Registers model fluxes as additional weighted-average inputs.
Definition: ERF_SurfaceModel.H:312
bool m_export_fluxes_set
Definition: ERF_SurfaceModel.H:1022
amrex::MultiFab * get_field(const std::string &name, int lev=0)
Retrieves a registered field by its common name.
Definition: ERF_SurfaceModel.H:683
void initialize_for_level(int lev, const amrex::BoxArray &ba, const amrex::Geometry &geom, const amrex::DistributionMapping &dm, const amrex::Vector< std::unique_ptr< amrex::iMultiFab >> &lmask_lev, const amrex::Vector< amrex::BCRec > &domain_bcs_type, const amrex::Vector< amrex::IntVect > &refRatio)
Initializes storage and boundary data for an AMR level.
Definition: ERF_SurfaceModel.H:90
bool m_surface_outputs_enabled
Definition: ERF_SurfaceModel.H:1057
void deactivate_transient_field_maps()
Disables and releases mapped fields used only by the last output.
Definition: ERF_SurfaceModel.cpp:666
amrex::Vector< amrex::DistributionMapping > m_dmap
Definition: ERF_SurfaceModel.H:1037
bool m_use_land
Definition: ERF_SurfaceModel.H:1019
void request_surface_layer_outputs()
Enables blended surface outputs needed by the SurfaceLayer.
Definition: ERF_SurfaceModel.H:449
@ cons_bc
Definition: ERF_IndexDefines.H:110
@ ng
Definition: ERF_Morrison.H:51
Definition: ERF_DataStruct.H:715
Non-owning views of surface fluxes for one tile.
Definition: ERF_SurfaceModel.H:22
amrex::Array4< const amrex::Real > q_flux
Definition: ERF_SurfaceModel.H:26
amrex::Array4< const amrex::Real > tau23
Definition: ERF_SurfaceModel.H:24
amrex::Array4< const amrex::Real > tau13
Definition: ERF_SurfaceModel.H:23
amrex::Array4< const amrex::Real > t_flux
Definition: ERF_SurfaceModel.H:25
Describes a registered land/urban field mapping.
Definition: ERF_SurfaceModel.H:1081
bool fill_bound
Whether boundaries are filled after mapping the field.
Definition: ERF_SurfaceModel.H:1091
bool persistent_consumer
Whether the field must be updated on every timestep.
Definition: ERF_SurfaceModel.H:1095
amrex::Vector< amrex::MultiFab * > urb_ptr
Per-level urban-model field pointers.
Definition: ERF_SurfaceModel.H:1087
std::pair< int, int > map
Land and urban model field indices, respectively.
Definition: ERF_SurfaceModel.H:1083
int mf_ind
Index of the mapped field in the SurfaceModel field array.
Definition: ERF_SurfaceModel.H:1089
bool active
Whether a consumer currently requires this mapped field.
Definition: ERF_SurfaceModel.H:1093
amrex::Vector< amrex::MultiFab * > lsm_ptr
Per-level land-model field pointers.
Definition: ERF_SurfaceModel.H:1085
Definition: ERF_SurfaceModel.H:1111
std::pair< int, int > map
Definition: ERF_SurfaceModel.H:1112
amrex::Vector< std::unique_ptr< amrex::MultiFab > > weighted
Definition: ERF_SurfaceModel.H:1113