41 : dry_thermal_conductivity_(dry_thermal_conductivity),
42 wet_thermal_conductivity_(wet_thermal_conductivity),
43 local_coordinate_system_(local_coordinate_system)
48 double const t = std::numeric_limits<double>::quiet_NaN();
53 if (lambda_try > lambda_wet)
56 "In 'SoilThermalConductivitySomerton', "
57 "dry_thermal_conductivity of '{:g}' is larger than "
58 "wet_thermal_conductivity of '{:g}'.",
59 lambda_try, lambda_wet);
68 double const S_L = std::get<double>(
73 return dry_thermal_conductivity_(t, pos)[0];
78 return wet_thermal_conductivity_(t, pos)[0];
81 double const lambda_dry = dry_thermal_conductivity_(t, pos)[0];
84 std::sqrt(S_L) * (wet_thermal_conductivity_(t, pos)[0] - lambda_dry);
96 "SoilThermalConductivitySomerton::dValue is implemented for "
97 "derivatives with respect to liquid saturation only.");
100 double const S_L = std::get<double>(
103 if (S_L <= 0.0 || S_L > 1.0)
108 double const lambda_dry = dry_thermal_conductivity_(t, pos)[0];
109 double const lambda_wet = wet_thermal_conductivity_(t, pos)[0];
111 return 0.5 * (lambda_wet - lambda_dry) / std::sqrt(S_L);
117 template <
int GlobalDimension>
124 : dry_thermal_conductivity_(dry_thermal_conductivity),
125 wet_thermal_conductivity_(wet_thermal_conductivity),
126 local_coordinate_system_(local_coordinate_system)
131 double const t = std::numeric_limits<double>::quiet_NaN();
136 if (lambda_try.size() != lambda_wet.size())
139 "In 'SoilThermalConductivitySomerton' input data, the data size of "
140 "dry_thermal_conductivity of '{:d}' is different from that of "
141 "dry_thermal_conductivity of '{:d}'.",
142 lambda_try.size(), lambda_wet.size());
145 for (std::size_t i = 0; i < lambda_try.size(); i++)
147 if (lambda_try[i] > lambda_wet[i])
150 "In 'SoilThermalConductivitySomerton', "
151 "dry_thermal_conductivity of '{:g}' is larger than "
152 "wet_thermal_conductivity of '{:g}'.",
153 lambda_try[i], lambda_wet[i]);
158 template <
int GlobalDimension>
164 double const S_L = std::get<double>(
168 std::vector<double> lambda_data = dry_thermal_conductivity_(t, pos);
172 lambda_data = wet_thermal_conductivity_(t, pos);
175 if (S_L > 0.0 && S_L <= 1.0)
177 auto const lambda_wet_data = wet_thermal_conductivity_(t, pos);
179 for (std::size_t i = 0; i < lambda_data.size(); i++)
182 std::sqrt(S_L) * (lambda_wet_data[i] - lambda_data[i]);
188 if (local_coordinate_system_ && (lambda_data.size() == GlobalDimension))
190 Eigen::Matrix<double, GlobalDimension, GlobalDimension>
const e =
191 local_coordinate_system_->transformation<GlobalDimension>(pos);
192 Eigen::Matrix<double, GlobalDimension, GlobalDimension> k =
193 Eigen::Matrix<double, GlobalDimension, GlobalDimension>::Zero();
195 for (
int i = 0; i < GlobalDimension; ++i)
197 Eigen::Matrix<double, GlobalDimension, GlobalDimension>
const
198 ei_otimes_ei = e.col(i) * e.col(i).transpose();
200 k += lambda_data[i] * ei_otimes_ei;
208 template <
int GlobalDimension>
217 "SoilThermalConductivitySomerton::dValue is implemented for "
218 "derivatives with respect to liquid saturation only.");
221 double const S_L = std::get<double>(
224 if (S_L <= 0.0 || S_L > 1.0)
226 Eigen::Matrix<double, GlobalDimension, GlobalDimension> zero =
227 Eigen::Matrix<double, GlobalDimension, GlobalDimension>::Zero();
231 auto const lambda_dry_data = dry_thermal_conductivity_(t, pos);
232 auto const lambda_wet_data = wet_thermal_conductivity_(t, pos);
234 std::vector<double> derivative_data;
235 derivative_data.reserve(lambda_dry_data.size());
236 for (std::size_t i = 0; i < lambda_dry_data.size(); i++)
238 derivative_data.emplace_back(
239 0.5 * (lambda_wet_data[i] - lambda_dry_data[i]) / std::sqrt(S_L));
244 if (local_coordinate_system_ && (derivative_data.size() == GlobalDimension))
246 Eigen::Matrix<double, GlobalDimension, GlobalDimension>
const e =
247 local_coordinate_system_->transformation<GlobalDimension>(pos);
248 Eigen::Matrix<double, GlobalDimension, GlobalDimension> k =
249 Eigen::Matrix<double, GlobalDimension, GlobalDimension>::Zero();
251 for (
int i = 0; i < GlobalDimension; ++i)
253 Eigen::Matrix<double, GlobalDimension, GlobalDimension>
const
254 ei_otimes_ei = e.col(i) * e.col(i).transpose();
256 k += derivative_data[i] * ei_otimes_ei;
virtual PropertyDataType value() const
A saturation dependent thermal conductivity model for soil.
ParameterLib::Parameter< double > const & dry_thermal_conductivity_
Thermal conductivity of soil at the dry state.
ParameterLib::Parameter< double > const & wet_thermal_conductivity_
Thermal conductivity of soil at the fully water saturated state.
SoilThermalConductivitySomerton(std::string name, ParameterLib::Parameter< double > const &dry_thermal_conductivity, ParameterLib::Parameter< double > const &wet_thermal_conductivity, ParameterLib::CoordinateSystem const *const local_coordinate_system)
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
PropertyDataType fromVector(std::vector< double > const &values)
std::variant< double, Eigen::Matrix< double, 2, 1 >, Eigen::Matrix< double, 3, 1 >, Eigen::Matrix< double, 2, 2 >, Eigen::Matrix< double, 3, 3 >, Eigen::Matrix< double, 4, 1 >, Eigen::Matrix< double, 6, 1 > > PropertyDataType
std::array< VariableType, static_cast< int >(Variable::number_of_variables)> VariableArray