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>>>& )
112 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)
149 amrex::BoxList bl2d = ba.boxList();
150 for (
auto& b : bl2d) {
153 m_ba2d[lev] = amrex::BoxArray(std::move(bl2d));
155 amrex::RealBox dom2d = geom.ProbDomain();
156 dom2d.setHi(2, geom.CellSize(2));
157 m_geom2d[lev].define(makeSlab(
m_geom[lev].Domain(), 2, 0), dom2d, geom.Coord(), geom.isPeriodic());
159 m_lmask[lev] = lmask_lev[0].get();
176 for (
int field = 0; field < static_cast<int>(
fields.size()); ++field) {
180 fields[field][lev].reset();
182 for (
const auto& entry :
fieldmap) {
183 if (entry.second.active) {
188 if (
static_cast<int>(entry.second.weighted.size()) <
m_nlevs) {
189 entry.second.weighted.resize(
m_nlevs);
191 entry.second.weighted[lev].reset();
202 amrex::Vector<amrex::Real> ftime = {time_for_fp, time_for_fp};
203 amrex::Vector<amrex::Real> ctime = {time_for_fp, time_for_fp};
204 amrex::IntVect ng_od(0, 0, 0);
205 amrex::Interpolater* mapper = &amrex::cell_cons_interp;
206 amrex::Vector<amrex::MultiFab*> fmf;
207 amrex::Vector<amrex::MultiFab*> cmf;
208 if (
u_star[lev] !=
nullptr &&
u_star[lev-1] !=
nullptr) {
209 amrex::InterpFromCoarseLevel(*
u_star[lev],
u_star[lev-1]->nGrowVect(), ng_od,
212 refRatio[lev-1], &amrex::cell_cons_interp,
214 amrex::InterpFromCoarseLevel(*
t_star[lev],
t_star[lev-1]->nGrowVect(), ng_od,
217 refRatio[lev-1], &amrex::cell_cons_interp,
219 amrex::InterpFromCoarseLevel(*
q_star[lev],
q_star[lev-1]->nGrowVect(), ng_od,
222 refRatio[lev-1], &amrex::cell_cons_interp,
224 amrex::InterpFromCoarseLevel(*
t_surf[lev],
t_surf[lev-1]->nGrowVect(), ng_od,
227 refRatio[lev-1], &amrex::cell_cons_interp,
232 amrex::FillPatchTwoLevels(*
u_star[lev].
get(),
u_star[lev]->nGrowVect(), ng_od,
233 time_for_fp, cmf, ctime, fmf, ftime,
235 refRatio[lev-1], mapper, domain_bcs_type,
239 amrex::FillPatchTwoLevels(*
t_star[lev].
get(),
t_star[lev]->nGrowVect(), ng_od,
240 time_for_fp, cmf, ctime, fmf, ftime,
242 refRatio[lev-1], mapper, domain_bcs_type,
246 amrex::FillPatchTwoLevels(*
q_star[lev].
get(),
q_star[lev]->nGrowVect(), ng_od,
247 time_for_fp, cmf, ctime, fmf, ftime,
249 refRatio[lev-1], mapper, domain_bcs_type,
253 amrex::FillPatchTwoLevels(*
t_surf[lev].
get(),
t_surf[lev]->nGrowVect(), ng_od,
254 time_for_fp, cmf, ctime, fmf, ftime,
256 refRatio[lev-1], mapper, domain_bcs_type,
260 for (
int field = 0; field < static_cast<int>(
fields.size()); ++field) {
261 if (
fields[field][lev] ==
nullptr ||
fields[field][lev-1] ==
nullptr) {
continue; }
262 amrex::IntVect ngv =
fields[field][lev-1]->nGrowVect(); ngv[2] = 0;
263 amrex::InterpFromCoarseLevel(*
fields[field][lev], ngv, ng_od,
264 *
fields[field][lev-1], 0, 0, 1,
266 refRatio[lev-1], &amrex::cell_cons_interp,
268 fmf = {
fields[field][lev ].get(),
fields[field][lev ].get()};
269 cmf = {
fields[field][lev-1].get(),
fields[field][lev-1].get()};
270 amrex::FillPatchTwoLevels(*
fields[field][lev].
get(), ngv, ng_od,
271 time_for_fp, cmf, ctime, fmf, ftime,
273 refRatio[lev-1], mapper, domain_bcs_type,
297 for (
int i = 0; i < static_cast<int>(data_names.size()); ++i) {
302 for (
int i = 0; i < static_cast<int>(
lsm_data_lev[lev].size()); ++i) {
308 for (
auto& fields_at_level :
rad_fields) { fields_at_level.clear(); }
311 if (lev <
static_cast<int>(entry.second.weighted.size())) {
312 entry.second.weighted[lev].reset();
323 for (
int i = 0; i < static_cast<int>(data_names.size()); ++i) {
327 for (
int i = 0; i < static_cast<int>(
urban_data_lev[lev].size()); ++i) {
333 for (
auto& fields_at_level :
rad_fields) { fields_at_level.clear(); }
336 if (lev <
static_cast<int>(entry.second.weighted.size())) {
337 entry.second.weighted[lev].reset();
354 amrex::Vector<amrex::MultiFab*>* model_data =
nullptr;
355 amrex::Vector<std::string>* model_names =
nullptr;
369 const int data_size =
static_cast<int>(model_data->size());
370 model_data->resize(data_size +
static_cast<int>(model_fluxes.size()));
372 model_names->resize(data_size +
static_cast<int>(model_fluxes.size()));
375 for (
int i = 0; i < static_cast<int>(model_fluxes.size()); ++i) {
377 (*model_data)[data_size + i] = model_fluxes[i];
379 (*model_names)[data_size + i] = flux_names[i];
398 const int nfields =
static_cast<int>(field_indices.size());
414 "All registered surface models must export either fluxes or u*/t*/q*, not a mix");
419 for (
const int field : field_indices) {
421 field == -1 || (field >= 0 && field < nregistered),
422 "Model field index must be -1 or within the registered provider data range");
426 lsm_fields = amrex::Vector<int>(field_indices);
429 fields_at_level.clear();
435 fields_at_level.clear();
454 amrex::MultiFab *lsm_weighted,
455 const amrex::MultiFab *urban_data,
456 amrex::MultiFab *urban_weighted);
465 bool update_derived =
true);
479 for (
int lev = 0; lev <
m_nlevs; ++lev) {
491 for (
int lev = 0; lev <
m_nlevs; ++lev) {
562 return {
u_star[lev]->const_array(mfi, 0),
563 u_star[lev]->const_array(mfi, 1),
564 t_star[lev]->const_array(mfi),
565 q_star[lev]->const_array(mfi)};
572 auto get_provider_field = [&] (
const int field) -> amrex::Array4<const amrex::Real> {
573 if (field >=
static_cast<int>(provider_fields.size())) {
576 const int index = provider_fields[field];
577 if (index < 0 || index >=
static_cast<int>(provider_data.size()) ||
578 provider_data[index] ==
nullptr) {
581 return provider_data[index]->const_array(mfi);
584 return {get_provider_field(0), get_provider_field(1),
585 get_provider_field(2), get_provider_field(3)};
597 const int field_idx)
const {
599 const bool single_provider =
602 if (single_provider) {
606 bool is_weighted_field =
false;
607 for (
int field = first_output_field;
608 field < static_cast<int>(selected.size()); ++field) {
609 if (selected[field] == field_idx) {
610 is_weighted_field =
true;
614 if (!is_weighted_field) {
620 if (field_idx < 0 || field_idx >=
static_cast<int>(source.size())) {
623 return source[field_idx];
628 if (field_idx < 0 || field_idx >=
static_cast<int>(weighted.size())) {
631 return weighted[field_idx].get();
641 return wavg[lev].get();
657 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);
665 void register_field_map (std::string
name,
const std::pair<int, int> &lsm_urb_map,
bool fill_boundary=
false);
674 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);
684 amrex::MultiFab* lsm_mf, amrex::MultiFab* urban_mf);
692 const std::pair<int, int>& lsm_urb_map);
699 const std::unordered_map<std::string, std::pair<int, int>>& input_map);
707 const std::pair<int, int>& lsm_urb_map);
714 const std::unordered_map<std::string, std::pair<int, int>>& output_map);
725 return fields[field->second.mf_ind][lev].get();
817 amrex::Print() <<
" --- building radiation field list" << std::endl;
820 for (
int li = 0; li < static_cast<int>(
radnames.size()); ++li) {
821 amrex::Print() <<
" - Checking for radiation variable '" <<
radnames[li] <<
"'" << std::endl;
823 amrex::MultiFab* mf =
nullptr;
826 const int land_idx = rad_it->second.map.first;
827 const int urban_idx = rad_it->second.map.second;
833 const bool valid_land = use_land && land_idx >= 0 &&
835 land_idx < static_cast<int>(
lsm_data_lev[lev].size()) &&
837 const bool valid_urban = use_urban && urban_idx >= 0 &&
841 if (valid_land && valid_urban) {
842 if (!rad_it->second.weighted[lev]) {
843 rad_it->second.weighted[lev] = std::make_unique<amrex::MultiFab>(
846 auto& weighted = *rad_it->second.weighted[lev];
849 for (amrex::MFIter mfi(weighted); mfi.isValid(); ++mfi) {
850 const amrex::Box bx = mfi.tilebox();
851 const auto weights =
wavg[lev]->const_array(mfi);
852 const auto land_arr = land.const_array(mfi);
853 const auto urban_arr = urban.const_array(mfi);
857 const int land_k = land.box(mfi.index()).bigEnd(2);
858 const int urban_k = urban.box(mfi.index()).smallEnd(2);
859 auto output = weighted.array(mfi);
861 output(i,j,k) = land_arr(i,j,land_k) *
863 urban_arr(i,j,urban_k) *
867 weighted.FillBoundary(
m_geom[lev].periodicity());
868 mf = rad_it->second.weighted[lev].get();
869 }
else if (valid_land) {
871 }
else if (valid_urban) {
878 amrex::Print() <<
" - WARNING: did not find radiation variable, setting to null to use default RRTMGP value!" << std::endl;
884 "Did not find all radiation fields");
914 const amrex::MultiFab* mf)
const;
936 if (has_land && has_urban) {
943 }
else if (has_land) {
946 }
else if (has_urban) {
960 if (
wavg[lev] !=
nullptr) {
return; }
962 const amrex::IntVect
ng(1,1,0);
977 if (
u_star[lev] !=
nullptr) {
return; }
979 const amrex::IntVect
ng(1,1,0);
987 t_surf[lev]->setVal(300.0);
996 for (
int lev = 0; lev <
m_nlevs; ++lev) {
1027 amrex::Vector<amrex::BoxArray>
m_ba;
1030 amrex::Vector<amrex::DistributionMapping>
m_dmap;
1044 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
u_star;
1045 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
t_star;
1046 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
q_star;
1047 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
t_surf;
1055 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
wavg;
1064 inline static const std::vector<std::string>
radnames = {
"tskin",
"emiss",
"albedo_vis",
"albedo_nir",
"albedo_vis_diff",
"albedo_nir_diff"};
1090 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>
fields;
1100 "cos_zenith_angle",
"sw_flux_dn",
"sw_flux_dn_dir_vis",
1101 "sw_flux_dn_dir_nir",
"sw_flux_dn_dif_vis",
"sw_flux_dn_dif_nir",
1106 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
weighted;
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
pp get("wavelength", wavelength)
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:105
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:543
amrex::Vector< amrex::MultiFab * > urban_frac_lev
Definition: ERF_SurfaceModel.H:1036
std::unordered_map< std::string, RadiationField > radiation_input_map
Definition: ERF_SurfaceModel.H:1108
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:1109
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:1093
int m_nlevs
Definition: ERF_SurfaceModel.H:1009
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:1028
bool m_weights_updated
Definition: ERF_SurfaceModel.H:1023
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:1029
bool m_export_fluxes
Definition: ERF_SurfaceModel.H:1014
static const std::vector< std::string > rad_output_names
Definition: ERF_SurfaceModel.H:1099
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:1097
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:1052
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:741
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:516
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:1051
amrex::MultiFab * get_tstar(const int &lev)
Returns the weighted thermal output for a level.
Definition: ERF_SurfaceModel.H:525
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:1046
amrex::Vector< std::string > m_urban_names
Definition: ERF_SurfaceModel.H:1094
amrex::Vector< amrex::BoxArray > m_ba
Definition: ERF_SurfaceModel.H:1027
bool m_fields_are_valid
Definition: ERF_SurfaceModel.H:1020
amrex::Vector< int > lsm_fields
Definition: ERF_SurfaceModel.H:1060
void release_transient_surface_outputs()
Releases surface outputs that have no persistent consumer.
Definition: ERF_SurfaceModel.H:993
std::unordered_map< std::string, Field > fieldmap
Definition: ERF_SurfaceModel.H:1091
void ensure_surface_outputs(const int lev)
Allocates surface-output fields for one level.
Definition: ERF_SurfaceModel.H:975
amrex::Vector< std::unique_ptr< amrex::MultiFab > > t_surf
Definition: ERF_SurfaceModel.H:1047
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:553
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:1025
bool m_use_urban
Definition: ERF_SurfaceModel.H:1011
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:396
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > weighted_urban_data_lev
Definition: ERF_SurfaceModel.H:1040
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:1064
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:1039
amrex::GpuArray< bool, 2 > m_output_fields_registered
Definition: ERF_SurfaceModel.H:1016
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:639
amrex::Vector< std::unique_ptr< amrex::MultiFab > > u_star
Definition: ERF_SurfaceModel.H:1044
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:595
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:1045
void build_radiation_fieldlist(int lev)
Builds the ordered radiation-field list for one AMR level.
Definition: ERF_SurfaceModel.H:816
void update_provider_mode(const int lev)
Updates the provider mode after model data are registered.
Definition: ERF_SurfaceModel.H:932
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:287
static const std::vector< std::string > field_names
Definition: ERF_SurfaceModel.H:1112
amrex::Vector< amrex::Geometry > m_geom2d
Definition: ERF_SurfaceModel.H:1032
void mark_fields_valid()
Marks the registered surface fields as filled by an actual model advance.
Definition: ERF_SurfaceModel.H:502
amrex::Vector< int > urban_fields
Definition: ERF_SurfaceModel.H:1061
void ensure_weight_factors(const int lev)
Creates weighting factors when an external caller requests them.
Definition: ERF_SurfaceModel.H:958
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > fields
Definition: ERF_SurfaceModel.H:1090
amrex::Vector< amrex::Vector< amrex::MultiFab * > > lsm_data_lev
Definition: ERF_SurfaceModel.H:1037
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:471
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:1049
amrex::Vector< amrex::Vector< const amrex::MultiFab * > > rad_fields
Definition: ERF_SurfaceModel.H:1096
amrex::Vector< std::unique_ptr< amrex::MultiFab > > wavg
Definition: ERF_SurfaceModel.H:1055
bool fields_are_valid() const
Returns whether the surface models have advanced at least once.
Definition: ERF_SurfaceModel.H:509
void request_surface_outputs(const bool persistent=true)
Enables and materializes the surface outputs consumed by ERF.
Definition: ERF_SurfaceModel.H:476
amrex::Vector< amrex::iMultiFab * > m_lmask
Definition: ERF_SurfaceModel.H:1033
amrex::Vector< amrex::Vector< amrex::MultiFab * > > urban_data_lev
Definition: ERF_SurfaceModel.H:1038
amrex::MultiFab * get_qstar(const int &lev)
Returns the weighted moisture output for a level.
Definition: ERF_SurfaceModel.H:534
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:351
bool m_export_fluxes_set
Definition: ERF_SurfaceModel.H:1015
amrex::MultiFab * get_field(const std::string &name, int lev=0)
Retrieves a registered field by its common name.
Definition: ERF_SurfaceModel.H:722
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:112
bool m_surface_outputs_enabled
Definition: ERF_SurfaceModel.H:1050
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:1030
bool m_use_land
Definition: ERF_SurfaceModel.H:1012
void request_surface_layer_outputs()
Enables blended surface outputs needed by the SurfaceLayer.
Definition: ERF_SurfaceModel.H:488
@ cons_bc
Definition: ERF_IndexDefines.H:92
@ ng
Definition: ERF_Morrison.H:50
Definition: ERF_DataStruct.H:685
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:1074
bool fill_bound
Whether boundaries are filled after mapping the field.
Definition: ERF_SurfaceModel.H:1084
bool persistent_consumer
Whether the field must be updated on every timestep.
Definition: ERF_SurfaceModel.H:1088
amrex::Vector< amrex::MultiFab * > urb_ptr
Per-level urban-model field pointers.
Definition: ERF_SurfaceModel.H:1080
std::pair< int, int > map
Land and urban model field indices, respectively.
Definition: ERF_SurfaceModel.H:1076
int mf_ind
Index of the mapped field in the SurfaceModel field array.
Definition: ERF_SurfaceModel.H:1082
bool active
Whether a consumer currently requires this mapped field.
Definition: ERF_SurfaceModel.H:1086
amrex::Vector< amrex::MultiFab * > lsm_ptr
Per-level land-model field pointers.
Definition: ERF_SurfaceModel.H:1078
Definition: ERF_SurfaceModel.H:1104
std::pair< int, int > map
Definition: ERF_SurfaceModel.H:1105
amrex::Vector< std::unique_ptr< amrex::MultiFab > > weighted
Definition: ERF_SurfaceModel.H:1106