6#include <Eigen/Eigenvalues>
7#include <Eigen/Geometry>
14template <
int DisplacementDim>
17 Eigen::Matrix<double, 3, 1>
const fracture_normal,
18 bool const fracture_normal_is_constant,
19 double const intrinsic_permeability,
20 double const initial_aperture,
21 double const mean_fracture_distance,
22 double const threshold_strain,
25 double const jacobian_factor)
26 :
_n(fracture_normal),
27 _n_const(fracture_normal_is_constant),
28 _k(intrinsic_permeability),
29 _b0(initial_aperture),
30 _a(mean_fracture_distance),
31 _e0(threshold_strain),
39template <
int DisplacementDim>
42 if (!std::holds_alternative<Medium*>(
scale_))
45 "The property 'EmbeddedFracturePermeability' is "
46 "implemented on the 'medium' scale only.");
50template <
int DisplacementDim>
56 Eigen::Matrix<double, 3, 1>
const n = [&]
64 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<double, 3, 3>> e_s(sigma);
65 return (Eigen::Matrix<double, 3, 1>)e_s.eigenvectors().col(2);
68 auto const rotMat_xy =
69 Eigen::AngleAxisd(
_phi_xy(t, pos)[0], Eigen::Vector3d::UnitZ());
70 auto const rotMat_yz =
71 Eigen::AngleAxisd(
_phi_yz(t, pos)[0], Eigen::Vector3d::UnitX());
73 Eigen::Matrix<double, 3, 1>
const n_r = rotMat_yz * (rotMat_xy * n);
78 double const e_n = (eps * n_r).dot(n_r.transpose());
79 double const H_de = (e_n >
_e0) ? 1.0 : 0.0;
80 double const b_f =
_b0 + H_de *
_a * (e_n -
_e0);
81 double const coeff = H_de * (b_f /
_a) * ((b_f * b_f / 12.0) -
_k);
83 Eigen::Matrix3d I = Eigen::Matrix3d::Identity();
84 return (coeff * (I - n_r * n_r.transpose()) +
_k * I)
85 .template topLeftCorner<DisplacementDim, DisplacementDim>()
89template <
int DisplacementDim>
98 "EmbeddedFracturePermeability::dValue is implemented for "
99 "derivatives with respect to strain only.");
102 Eigen::Matrix<double, 3, 1>
const n = [&]
109 std::get<SymmetricTensor>(variable_array.
total_stress));
110 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<double, 3, 3>> e_s(sigma);
111 return (Eigen::Matrix<double, 3, 1>)e_s.eigenvectors().col(2);
114 auto const rotMat_xy =
115 Eigen::AngleAxisd(
_phi_xy(t, pos)[0], Eigen::Vector3d::UnitZ());
116 auto const rotMat_yz =
117 Eigen::AngleAxisd(
_phi_yz(t, pos)[0], Eigen::Vector3d::UnitX());
119 Eigen::Matrix<double, 3, 1>
const n_r = rotMat_yz * (rotMat_xy * n);
124 double const e_n = (eps * n_r).dot(n_r.transpose());
125 double const H_de = (e_n >
_e0) ? 1.0 : 0.0;
126 double const b_f =
_b0 + H_de *
_a * (e_n -
_e0);
128 Eigen::Matrix3d
const M = n_r * n_r.transpose();
129 return Eigen::MatrixXd(
130 _jf * H_de * (b_f * b_f / 4 -
_k) *
132 Eigen::Matrix3d::Identity() - M) *
Permeability model as proposed by Olivella&Alonso.
EmbeddedFracturePermeability(std::string name, Eigen::Matrix< double, 3, 1 > const fracture_normal, bool const fracture_normal_is_constant, double const intrinsic_permeability, double const initial_aperture, double const mean_fracture_distance, double const threshold_strain, ParameterLib::Parameter< double > const &fracture_rotation_xy, ParameterLib::Parameter< double > const &fracture_rotation_yz, double const jacobian_factor)
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
ParameterLib::Parameter< double > const & _phi_yz
ParameterLib::Parameter< double > const & _phi_xy
void checkScale() const override
Eigen::Matrix< double, 3, 1 > const _n
virtual PropertyDataType value() const
std::variant< Medium *, Phase *, Component * > scale_
KelvinVector mechanical_strain
KelvinVector total_stress
template Eigen::Matrix< double, 3, 3 > formEigenTensor< 3 >(MaterialPropertyLib::PropertyDataType 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)