OGS
PermeabilityOrthotropicPowerLaw.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
6#include <algorithm>
7#include <cmath>
8
12
13namespace MaterialPropertyLib
14{
15template <int DisplacementDim>
18 std::string name,
19 std::array<double, DisplacementDim>
20 intrinsic_permeabilities,
21 std::array<double, DisplacementDim>
22 exponents,
23 ParameterLib::CoordinateSystem const* const local_coordinate_system)
24 : k_(std::move(intrinsic_permeabilities)),
25 lambda_(std::move(exponents)),
26 local_coordinate_system_(local_coordinate_system)
27{
28 name_ = std::move(name);
29}
30
31template <int DisplacementDim>
33{
34 if (!std::holds_alternative<Medium*>(scale_))
35 {
37 "The property 'PermeabilityOrthotropicPowerLaw' is implemented on "
38 "the 'medium' scales only.");
39 }
40}
41template <int DisplacementDim>
43 VariableArray const& variable_array,
44 ParameterLib::SpatialPosition const& pos, double const /*t*/,
45 double const /*dt*/) const
46{
47 auto const phi = variable_array.transport_porosity;
48 // TODO (naumov) The phi0 must be evaluated once upon
49 // creation/initialization and be stored in a local state.
50 // For now assume porosity's initial value does not change with time.
51 auto const medium = std::get<Medium*>(scale_);
52 auto const phi_0 =
53 medium->hasProperty(PropertyType::transport_porosity)
54 ? medium->property(PropertyType::transport_porosity)
55 .template initialValue<double>(
56 pos, std::numeric_limits<double>::quiet_NaN())
57 : medium->property(PropertyType::porosity)
58 .template initialValue<double>(
59 pos, std::numeric_limits<double>::quiet_NaN());
60
61 Eigen::Matrix<double, DisplacementDim, DisplacementDim> k =
62 Eigen::Matrix<double, DisplacementDim, DisplacementDim>::Zero();
63
64 Eigen::Matrix<double, DisplacementDim, DisplacementDim> const e =
66 ? Eigen::Matrix<double, DisplacementDim,
67 DisplacementDim>::Identity()
68 : local_coordinate_system_->transformation<DisplacementDim>(pos);
69
70 // k = \sum_i k_i (\phi / \phi_0)^{\lambda_i} e_i \otimes e_i
71 // e_i \otimes e_i = square matrix e_i,0^2 e_i,0*e_i,1 etc.
72 for (int i = 0; i < DisplacementDim; ++i)
73 {
74 Eigen::Matrix<double, DisplacementDim, DisplacementDim> const
75 ei_otimes_ei = e.col(i) * e.col(i).transpose();
76
77 k += k_[i] * std::pow(phi / phi_0, lambda_[i]) * ei_otimes_ei;
78 }
79 return k;
80}
81template <int DisplacementDim>
83 VariableArray const& /*variable_array*/, Variable const /*variable*/,
84 ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
85 double const /*dt*/) const
86{
87 OGS_FATAL("PermeabilityOrthotropicPowerLaw::dValue is not implemented.");
88}
89
92} // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition Error.h:19
PermeabilityOrthotropicPowerLaw(std::string name, std::array< double, DisplacementDim > intrinsic_permeabilities, std::array< double, DisplacementDim > exponents, ParameterLib::CoordinateSystem const *const local_coordinate_system)
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
std::array< double, DisplacementDim > const lambda_
Exponents, one for each spatial dimension.
std::array< double, DisplacementDim > const k_
Intrinsic permeabilities, one for each spatial dimension.
virtual PropertyDataType value() const
std::variant< Medium *, Phase *, Component * > scale_
virtual PropertyDataType initialValue(ParameterLib::SpatialPosition const &pos, double const t) const
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 >, Eigen::MatrixXd > PropertyDataType
A local coordinate system used for tensor transformations.