OGS
PhaseFieldProcessData.h
Go to the documentation of this file.
1
11#pragma once
12
13#include <Eigen/Core>
14#include <memory>
15#include <utility>
16
19
20namespace MaterialLib
21{
22namespace Solids
23{
24template <int DisplacementDim>
25struct MechanicsBase;
26}
27} // namespace MaterialLib
28namespace ProcessLib
29{
30template <typename T>
31struct Parameter;
32
33namespace PhaseField
34{
36{
37 AT1,
38 AT2,
40};
41
43{
44 Linear,
46};
47
56
58{
59public:
60 virtual ~DegradationDerivative() = default;
61 virtual double degradation(double const d_ip,
62 double const k,
63 double const ls) = 0; /* degradation_df0 */
64 virtual double degradation_df1(double const d_ip, double const ls) = 0;
65 virtual double degradation_df2(double const d_ip, double const ls) = 0;
66};
67
69{
70public:
71 double degradation(double const d_ip,
72 double const k,
73 double const /* ls */) override
74 {
75 return d_ip * d_ip * (1. - k) + k;
76 };
77 double degradation_df1(double const d_ip, double const /* ls */) override
78 {
79 return 2. * d_ip;
80 };
81 double degradation_df2(double const /* d_ip */,
82 double const /* ls */) override
83 {
84 return 2.;
85 };
86};
87
89{
90private:
91 double const lch;
93
94public:
95 COHESIVE_DegradationDerivative(double const Parameter_lch,
96 SofteningCurve Parameter_softening_curve)
97 : lch(Parameter_lch), softening_curve(Parameter_softening_curve){};
98 double degradation(double const d_ip,
99 double const k,
100 double const ls) override
101 {
102 double const m1 = 4.0 * lch / acos(-1.) / ls;
103 switch (softening_curve)
104 {
106 {
107 double const m2 = std::pow(2., 5. / 3.) - 3.;
108 double const n = 2.5;
109 return std::pow(d_ip, n) /
110 (std::pow(d_ip, n) +
111 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip))) *
112 (1.0 - k) +
113 k;
114 }
115 default:
116 {
117 double const m2 = -0.5;
118 double const n = 2.;
119 return std::pow(d_ip, n) /
120 (std::pow(d_ip, n) +
121 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip))) *
122 (1. - k) +
123 k;
124 }
125 }
126 };
127 double degradation_df1(double const d_ip, double const ls) override
128 {
129 double const m1 = 4.0 * lch / acos(-1.) / ls;
130 switch (softening_curve)
131 {
133 {
134 double const m2 = std::pow(2., 5. / 3.) - 3.;
135 double const n = 2.5;
136 double const a1 = std::pow(d_ip, n) +
137 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip));
138 double const a2 = n * std::pow(d_ip, n - 1.) -
139 2. * m1 * m2 * (1. - d_ip) - m1;
140 return (n * std::pow(d_ip, n - 1.) * a1 -
141 std::pow(d_ip, n) * a2) /
142 (a1 * a1);
143 }
144 default:
145 {
146 double const m2 = -0.5;
147 double const n = 2.;
148 double const a1 = std::pow(d_ip, n) +
149 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip));
150 double const a2 = n * std::pow(d_ip, n - 1.) -
151 2. * m1 * m2 * (1. - d_ip) - m1;
152 return (n * std::pow(d_ip, n - 1.) * a1 -
153 std::pow(d_ip, n) * a2) /
154 (a1 * a1);
155 }
156 }
157 };
158 double degradation_df2(double const d_ip, double const ls) override
159 {
160 double const m1 = 4.0 * lch / acos(-1.) / ls;
161 switch (softening_curve)
162 {
164 {
165 double const m2 = std::pow(2., 5. / 3.) - 3.;
166 double const n = 2.5;
167 double a1 = std::pow(d_ip, n) +
168 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip));
169 double a2 = n * std::pow(d_ip, n - 1.) -
170 2. * m1 * m2 * (1. - d_ip) - m1;
171 return (2. * a2 * a2 * std::pow(d_ip, n) -
172 a1 * std::pow(d_ip, n) *
173 (2. * m1 * m2 +
174 n * std::pow(d_ip, n - 2.) * (n - 1.)) -
175 2. * a1 * a2 * n * std::pow(d_ip, n - 1.) +
176 a1 * a1 * n * std::pow(d_ip, n - 2.) * (n - 1.)) /
177 (std::pow(a1, 3));
178 }
179 default:
180 {
181 double const m2 = -0.5;
182 double const n = 2.;
183 double const a1 = std::pow(d_ip, n) +
184 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip));
185 double const a2 = n * std::pow(d_ip, n - 1.) -
186 2. * m1 * m2 * (1. - d_ip) - m1;
187 return (2. * a2 * a2 * std::pow(d_ip, n) -
188 a1 * std::pow(d_ip, n) *
189 (2. * m1 * m2 +
190 n * std::pow(d_ip, n - 2.) * (n - 1.)) -
191 2. * a1 * a2 * n * std::pow(d_ip, n - 1.) +
192 a1 * a1 * n * std::pow(d_ip, n - 2.) * (n - 1.)) /
193 (std::pow(a1, 3));
194 }
195 }
196 };
197};
198
199template <int DisplacementDim>
201{
203
204 std::map<
205 int,
206 std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>>>
212 Eigen::Matrix<double, DisplacementDim, 1> const specific_body_force;
213 bool pressurized_crack = false;
221 std::unique_ptr<DegradationDerivative> degradation_derivative;
222
223 double const unity_pressure = 1.0;
224 double pressure = 0.0;
225 double pressure_old = 0.0;
226 double pressure_error = 0.0;
227 double injected_volume = 0.0;
228 double crack_volume = 0.0;
229 double elastic_energy = 0.0;
230 double surface_energy = 0.0;
231 double pressure_work = 0.0;
232};
233
234} // namespace PhaseField
235} // namespace ProcessLib
double degradation_df2(double const, double const) override
double degradation_df1(double const d_ip, double const) override
double degradation(double const d_ip, double const k, double const) override
double degradation(double const d_ip, double const k, double const ls) override
double degradation_df2(double const d_ip, double const ls) override
COHESIVE_DegradationDerivative(double const Parameter_lch, SofteningCurve Parameter_softening_curve)
double degradation_df1(double const d_ip, double const ls) override
virtual double degradation(double const d_ip, double const k, double const ls)=0
virtual double degradation_df1(double const d_ip, double const ls)=0
virtual double degradation_df2(double const d_ip, double const ls)=0
ParameterLib::Parameter< double > const & solid_density
ParameterLib::Parameter< double > const & crack_resistance
ParameterLib::Parameter< double > const & crack_length_scale
ParameterLib::Parameter< double > const & residual_stiffness
Eigen::Matrix< double, DisplacementDim, 1 > const specific_body_force
MeshLib::PropertyVector< int > const *const material_ids
std::map< int, std::unique_ptr< MaterialLib::Solids::MechanicsBase< DisplacementDim > > > solid_materials
std::unique_ptr< DegradationDerivative > degradation_derivative