6#include <Eigen/Geometry>
12template <
int DisplacementDim>
16 std::vector<double>
const& mean_fracture_distances,
17 std::vector<double>
const& threshold_strains,
18 Eigen::Matrix<double, 3, 3>
const fracture_normals,
22 double const jacobian_factor)
23 :
_a(mean_fracture_distances),
24 _e0(threshold_strains),
26 _k(intrinsic_permeability),
34template <
int DisplacementDim>
38 if (!std::holds_alternative<Medium*>(
scale_))
41 "The property 'OrthotropicEmbeddedFracturePermeability' is "
42 "implemented on the 'media' scale only.");
46template <
int DisplacementDim>
56 double const k = std::get<double>(
fromVector(
_k(t, pos)));
57 double const _b0 = std::sqrt(12.0 * k);
61 auto const rotMat_xy = Eigen::AngleAxisd(phi_xy, Eigen::Vector3d::UnitZ());
62 auto const rotMat_yz = Eigen::AngleAxisd(phi_yz, Eigen::Vector3d::UnitX());
64 Eigen::Matrix3d result = Eigen::Vector3d::Constant(k).asDiagonal();
66 for (
int i = 0; i < 3; i++)
68 Eigen::Vector3d
const n_i = rotMat_yz * (rotMat_xy *
_n.col(i));
69 double const e_n = (eps * n_i).dot(n_i.transpose());
70 double const H_de = (e_n >
_e0[i]) ? 1.0 : 0.0;
71 double const b_f = _b0 + H_de *
_a[i] * (e_n -
_e0[i]);
75 result += H_de * (b_f /
_a[i]) * ((b_f * b_f / 12.0) - k) *
76 (Eigen::Matrix3d::Identity() - n_i * n_i.transpose());
79 return result.template topLeftCorner<DisplacementDim, DisplacementDim>()
82template <
int DisplacementDim>
92 "OrthotropicEmbeddedFracturePermeability::dValue is implemented "
93 "for derivatives with respect to strain only.");
99 double const k = std::get<double>(
fromVector(
_k(t, pos)));
100 double const _b0 = std::sqrt(12.0 * k);
104 auto const rotMat_xy = Eigen::AngleAxisd(phi_xy, Eigen::Vector3d::UnitZ());
105 auto const rotMat_yz = Eigen::AngleAxisd(phi_yz, Eigen::Vector3d::UnitX());
110 for (
int i = 0; i < 3; i++)
112 Eigen::Vector3d
const n_i = rotMat_yz * (rotMat_xy *
_n.col(i));
113 Eigen::Matrix3d
const M = n_i * n_i.transpose();
114 double const e_n = (eps * n_i).dot(n_i.transpose());
115 double const H_de = (e_n >
_e0[i]) ? 1.0 : 0.0;
116 double const b_f = _b0 + H_de *
_a[i] * (e_n -
_e0[i]);
118 result += H_de * (b_f * b_f / 4.0 - k) *
120 Eigen::Matrix3d::Identity() - M) *
124 return Eigen::MatrixXd(
_jf * result);
Extended Permeability model based on Olivella&Alonso.
ParameterLib::Parameter< double > const & _phi_xy
void checkScale() const override
Eigen::Matrix< double, 3, 3 > const _n
std::vector< double > const _a
ParameterLib::Parameter< double > const & _k
OrthotropicEmbeddedFracturePermeability(std::string name, std::vector< double > const &mean_fracture_distances, std::vector< double > const &threshold_strains, Eigen::Matrix< double, 3, 3 > const fracture_normals, ParameterLib::Parameter< double > const &intrinsic_permeability, ParameterLib::Parameter< double > const &fracture_rotation_xy, ParameterLib::Parameter< double > const &fracture_rotation_yz, double const jacobian_factor)
std::vector< double > const _e0
ParameterLib::Parameter< double > const & _phi_yz
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
virtual PropertyDataType value() const
std::variant< Medium *, Phase *, Component * > scale_
KelvinVector mechanical_strain
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 >, Eigen::MatrixXd > PropertyDataType
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
Eigen::Matrix< double, 3, 3 > kelvinVectorToTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
KelvinVectorType< DisplacementDim > tensorToKelvin(Eigen::Matrix< double, 3, 3 > const &m)
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType