diff --git a/src/pks/surface_balance/constitutive_relations/land_cover/albedo_threecomponent_evaluator.cc b/src/pks/surface_balance/constitutive_relations/land_cover/albedo_threecomponent_evaluator.cc index 20a54a87d..6089f2e25 100644 --- a/src/pks/surface_balance/constitutive_relations/land_cover/albedo_threecomponent_evaluator.cc +++ b/src/pks/surface_balance/constitutive_relations/land_cover/albedo_threecomponent_evaluator.cc @@ -20,6 +20,16 @@ namespace Relations { AlbedoThreeComponentEvaluator::AlbedoThreeComponentEvaluator(Teuchos::ParameterList& plist) : EvaluatorSecondaryMonotypeCV(plist) { + // parameters + a_ice_ = plist_.get("albedo ice [-]", 0.44); + a_water_ = plist_.get("albedo water [-]", 0.1168); + is_constant_snow_albedo_ = plist_.isParameter("albedo snow [-]"); + if (is_constant_snow_albedo_) { a_snow_ = plist_.get("albedo snow [-]"); } + + e_ice_ = plist_.get("emissivity ice [-]", 0.98); + e_water_ = plist_.get("emissivity water [-]", 0.995); + e_snow_ = plist_.get("emissivity snow [-]", 0.98); + // determine the domain Key akey = my_keys_.front().first; domain_ = Keys::getDomain(akey); @@ -40,22 +50,14 @@ AlbedoThreeComponentEvaluator::AlbedoThreeComponentEvaluator(Teuchos::ParameterL // dependencies // -- snow properties - snow_dens_key_ = Keys::readKey(plist, domain_snow_, "snow density", "density"); - dependencies_.insert(KeyTag{ snow_dens_key_, tag }); + if (!is_constant_snow_albedo_) { + snow_dens_key_ = Keys::readKey(plist, domain_snow_, "snow density", "density"); + dependencies_.insert(KeyTag{ snow_dens_key_, tag }); + } // -- skin properties unfrozen_fraction_key_ = Keys::readKey(plist, domain_, "unfrozen fraction", "unfrozen_fraction"); dependencies_.insert(KeyTag{ unfrozen_fraction_key_, tag }); - - // parameters - a_ice_ = plist_.get("albedo ice [-]", 0.44); - a_water_ = plist_.get("albedo water [-]", 0.1168); - is_constant_snow_albedo_ = plist_.isParameter("albedo snow [-]"); - if (is_constant_snow_albedo_) { a_snow_ = plist_.get("albedo snow [-]"); } - - e_ice_ = plist_.get("emissivity ice [-]", 0.98); - e_water_ = plist_.get("emissivity water [-]", 0.995); - e_snow_ = plist_.get("emissivity snow [-]", 0.98); } // Required methods from EvaluatorSecondaryMonotypeCV @@ -113,7 +115,10 @@ AlbedoThreeComponentEvaluator::EvaluatePartialDerivative_( void AlbedoThreeComponentEvaluator::EnsureCompatibility_Structure_(State& S) { - S.GetRecordSetW(my_keys_.front().first).set_subfieldnames({ "bare", "water", "snow" }); + EnsureCompatibility_StructureSame_(S); + for (const auto& key : my_keys_) { + S.GetRecordSetW(key.first).set_subfieldnames({ "bare", "water", "snow" }); + } } diff --git a/src/pks/surface_balance/constitutive_relations/land_cover/albedo_twocomponent_evaluator.cc b/src/pks/surface_balance/constitutive_relations/land_cover/albedo_twocomponent_evaluator.cc index a44a01cd6..7cf9878e2 100644 --- a/src/pks/surface_balance/constitutive_relations/land_cover/albedo_twocomponent_evaluator.cc +++ b/src/pks/surface_balance/constitutive_relations/land_cover/albedo_twocomponent_evaluator.cc @@ -20,6 +20,16 @@ namespace Relations { AlbedoTwoComponentEvaluator::AlbedoTwoComponentEvaluator(Teuchos::ParameterList& plist) : EvaluatorSecondaryMonotypeCV(plist) { + // parameters + a_ice_ = plist_.get("albedo ice [-]", 0.44); + a_water_ = plist_.get("albedo water [-]", 0.1168); + is_constant_snow_albedo_ = plist_.isParameter("albedo snow [-]"); + if (is_constant_snow_albedo_) { a_snow_ = plist_.get("albedo snow [-]"); } + + e_ice_ = plist_.get("emissivity ice [-]", 0.98); + e_water_ = plist_.get("emissivity water [-]", 0.995); + e_snow_ = plist_.get("emissivity snow [-]", 0.98); + // determine the domain Key akey = my_keys_.front().first; domain_ = Keys::getDomain(akey); @@ -40,8 +50,10 @@ AlbedoTwoComponentEvaluator::AlbedoTwoComponentEvaluator(Teuchos::ParameterList& // dependencies // -- snow properties - snow_dens_key_ = Keys::readKey(plist, domain_snow_, "snow density", "density"); - dependencies_.insert(KeyTag{ snow_dens_key_, tag }); + if (!is_constant_snow_albedo_) { + snow_dens_key_ = Keys::readKey(plist, domain_snow_, "snow density", "density"); + dependencies_.insert(KeyTag{ snow_dens_key_, tag }); + } // -- skin properties unfrozen_fraction_key_ = Keys::readKey(plist, domain_, "unfrozen fraction", "unfrozen_fraction"); @@ -50,16 +62,6 @@ AlbedoTwoComponentEvaluator::AlbedoTwoComponentEvaluator(Teuchos::ParameterList& // -- skin properties ponded_depth_key_ = Keys::readKey(plist, domain_, "ponded depth", "ponded_depth"); dependencies_.insert(KeyTag{ ponded_depth_key_, tag }); - - // parameters - a_ice_ = plist_.get("albedo ice [-]", 0.44); - a_water_ = plist_.get("albedo water [-]", 0.1168); - is_constant_snow_albedo_ = plist_.isParameter("albedo snow [-]"); - if (is_constant_snow_albedo_) { a_snow_ = plist_.get("albedo snow [-]"); } - - e_ice_ = plist_.get("emissivity ice [-]", 0.98); - e_water_ = plist_.get("emissivity water [-]", 0.995); - e_snow_ = plist_.get("emissivity snow [-]", 0.98); } // Required methods from EvaluatorSecondaryMonotypeCV @@ -127,7 +129,10 @@ AlbedoTwoComponentEvaluator::EvaluatePartialDerivative_( void AlbedoTwoComponentEvaluator::EnsureCompatibility_Structure_(State& S) { - S.GetRecordSetW(my_keys_.front().first).set_subfieldnames({ "bare_or_water", "snow" }); + EnsureCompatibility_StructureSame_(S); + for (const auto& key : my_keys_) { + S.GetRecordSetW(key.first).set_subfieldnames({ "bare_or_water", "snow" }); + } } void diff --git a/src/pks/surface_balance/constitutive_relations/land_cover/canopy_radiation_evaluator.hh b/src/pks/surface_balance/constitutive_relations/land_cover/canopy_radiation_evaluator.hh index 754763a29..471ddbaf3 100644 --- a/src/pks/surface_balance/constitutive_relations/land_cover/canopy_radiation_evaluator.hh +++ b/src/pks/surface_balance/constitutive_relations/land_cover/canopy_radiation_evaluator.hh @@ -85,6 +85,9 @@ class CanopyRadiationEvaluator : public EvaluatorSecondaryMonotypeCV { protected: virtual void EnsureCompatibility_ToDeps_(State& S) override; + virtual void EnsureCompatibility_Structure_(State& S) { + EnsureCompatibility_StructureSame_(S); + } // Required methods from EvaluatorSecondaryMonotypeCV virtual void Evaluate_(const State& S, const std::vector& results) override; diff --git a/src/pks/surface_balance/constitutive_relations/land_cover/drainage_evaluator.hh b/src/pks/surface_balance/constitutive_relations/land_cover/drainage_evaluator.hh index 5baff7c99..064407af7 100644 --- a/src/pks/surface_balance/constitutive_relations/land_cover/drainage_evaluator.hh +++ b/src/pks/surface_balance/constitutive_relations/land_cover/drainage_evaluator.hh @@ -72,6 +72,10 @@ class DrainageEvaluator : public EvaluatorSecondaryMonotypeCV { const Tag& wrt_tag, const std::vector& results) override; + virtual void EnsureCompatibility_Structure_(State& S) { + EnsureCompatibility_StructureSame_(S); + } + protected: Key drainage_key_; Key fracwet_key_; diff --git a/src/pks/surface_balance/constitutive_relations/land_cover/interception_fraction_evaluator.hh b/src/pks/surface_balance/constitutive_relations/land_cover/interception_fraction_evaluator.hh index a5b0e813d..bc4d54713 100644 --- a/src/pks/surface_balance/constitutive_relations/land_cover/interception_fraction_evaluator.hh +++ b/src/pks/surface_balance/constitutive_relations/land_cover/interception_fraction_evaluator.hh @@ -74,6 +74,9 @@ class InterceptionFractionEvaluator : public EvaluatorSecondaryMonotypeCV { const Key& wrt_key, const Tag& wrt_tag, const std::vector& results) override; + virtual void EnsureCompatibility_Structure_(State& S) { + EnsureCompatibility_StructureSame_(S); + } void InitializeFromPlist_(); diff --git a/src/pks/surface_balance/constitutive_relations/land_cover/radiation_balance_evaluator.hh b/src/pks/surface_balance/constitutive_relations/land_cover/radiation_balance_evaluator.hh index d939cdee5..67d3ce92b 100644 --- a/src/pks/surface_balance/constitutive_relations/land_cover/radiation_balance_evaluator.hh +++ b/src/pks/surface_balance/constitutive_relations/land_cover/radiation_balance_evaluator.hh @@ -14,6 +14,9 @@ Here the net radiation is positive for energy inputs to the layer. Note that ground is based on the two-channel (land + snow) while canopy is assumed to be a simple, single layer. +This evaluator requires that the surface temperature, snow temperature, and +canopy temperature are known, or at least being solved for. + Requires the use of LandCover types, for albedo and Beer's law coefficients. This is combination of CLM v4.5 Tech Note and Beer's law for attenuation of @@ -90,6 +93,9 @@ class RadiationBalanceEvaluator : public EvaluatorSecondaryMonotypeCV { protected: virtual void EnsureCompatibility_ToDeps_(State& S) override; + virtual void EnsureCompatibility_Structure_(State& S) { + EnsureCompatibility_StructureSame_(S); + } // Required methods from EvaluatorSecondaryMonotypeCV virtual void Evaluate_(const State& S, const std::vector& results) override; diff --git a/src/pks/surface_balance/surface_balance_base.cc b/src/pks/surface_balance/surface_balance_base.cc index f74b92544..51fb2952d 100644 --- a/src/pks/surface_balance/surface_balance_base.cc +++ b/src/pks/surface_balance/surface_balance_base.cc @@ -96,7 +96,13 @@ SurfaceBalanceBase::Setup() .SetMesh(mesh_) ->AddComponent("cell", AmanziMesh::Entity_kind::CELL, 1); S_->RequireDerivative( - conserved_key_, tag_next_, key_, tag_next_); + conserved_key_, tag_next_, key_, tag_next_) + .SetMesh(mesh_) + ->AddComponent("cell", AmanziMesh::Entity_kind::CELL, 1); + // NOTE, remove SetMesh/AddComponent lines after fixing amanzi/ats#167. + // The mesh should get set by the evaluator, but when + // the evaluator isn't actually differentiable, it + // doesn't get done. // and at the current time, where it is a copy evaluator requireAtCurrent(conserved_key_, tag_current_, *S_, name_);