60 Tensor<2, dim> &F,
double &alpha_n, SymmetricTensor<2,dim> &eps_p_n, void (*func_pointer)(
auto),
103 void pre_ln ( Tensor<2, dim> &F,
104 SymmetricTensor<2,dim> &hencky_strain, Vector<double> &ea, Vector<double> &da, Vector<double> &fa,
105 std::vector<Tensor<1,dim> > &eigenvector, Vector<double> &eigenvalues, std::vector< SymmetricTensor<2,dim> > &eigenbasis )
108 Following
"Algorithms for computation of stresses and elasticity moduli in terms of Seth–Hill’s family of generalized strain tensors" by Miehe&Lambrecht \n
116 Get the symmetric right cauchy green tensor
118 SymmetricTensor<2, dim> right_cauchy_green_sym =
symmetrize( transpose(F) * F);
121 Compute Eigenvalues, Eigenvectors and Eigenbasis
125 Get Eigenvalues and Eigenvectors from the deal.ii function \a eigenvectors(*)
127 for (
unsigned int i = 0; i < dim; ++i) {
128 eigenvalues[i] = eigenvectors(right_cauchy_green_sym)[i].first;
129 eigenvector[i] = eigenvectors(right_cauchy_green_sym)[i].second;
133 Check
if the found eigenvectors are perpendicular to each other
135 if ((std::fabs(eigenvalues(0) - 1) > 1e-10)
136 && (std::fabs(eigenvalues(1) - 1) > 1e-10)
137 && (std::fabs(eigenvalues(2) - 1) > 1e-10)) {
138 for (
unsigned int i = 0; i < dim; ++i) {
139 for (
unsigned int j = i + 1; j < dim; ++j) {
140 AssertThrow( (std::fabs(eigenvector[i] * eigenvector[j]) < 1e-12),
141 ExcMessage(
"ln-space<< Eigenvectors are not perpendicular to each other.") );
147 Compute eigenbasis Ma: eigenbasis = eigenvector \otimes eigenvector
149 for (
unsigned int i = 0; i < dim; ++i) {
150 eigenbasis[i] =
symmetrize( outer_product(eigenvector[i], eigenvector[i]) );
151 AssertThrow( eigenvalues(i) >= 0.0,
152 ExcMessage(
"ln-space<< Eigenvalue is negativ. Check update_qph.") );
157 Compute diagonal function \a ea and its first and second derivate \a da and \a fa \n
159 for (
unsigned int i = 0; i < dim; ++i)
161 ea(i) = 0.5 * std::log( std::abs(eigenvalues(i)) );
162 da(i) = std::pow(eigenvalues(i), -1.0);
163 fa(i) = -2.0 * std::pow(eigenvalues(i), -2.0);
164 AssertThrow( ea(i) == ea(i),
165 ExcMessage(
"ln-space<< Ea is nan due to logarithm of negativ eigenvalue. Check update_qph.") );
166 AssertThrow( da(i) > 0.0,
167 ExcMessage(
"ln-space<< First derivative da of diagonal function is "+std::to_string(da(i))+
" < 0.0 . Check update_qph.") );
171 Compute the Hencky strain
173 for (
unsigned int a = 0; a < dim; ++a)
174 hencky_strain += ea(a) * eigenbasis[a];
177 Output-> SymmetricTensor<2, dim> hencky_strain, Vector<double> ea, da, fa,
184 void post_ln ( Vector<double> &ea, Vector<double> &da, Vector<double> &fa,
185 Vector<double> &eigenvalues, std::vector< SymmetricTensor<2,dim> > &eigenbasis,
186 SymmetricTensor<2,dim> &second_piola_stress_S, SymmetricTensor<4,dim> &elasto_plastic_tangent )
188 const double comp_tolerance = 1e-8;
189 SymmetricTensor<2,dim> stress_measure_T_sym = second_piola_stress_S;
196 Compute the coefficients based on the eigenvalues, eigenvectors and ea,da,fa
198 Tensor<2, dim> theta;
200 double eta = 999999999.0;
203 For three different eigenvalues \f$ \lambda_a \neq \lambda_b \neq \lambda_c \f$
206 ( !(std::fabs(eigenvalues(0) - eigenvalues(1)) < comp_tolerance) )
208 ( !(std::fabs(eigenvalues(0) - eigenvalues(2)) < comp_tolerance) )
210 ( !(std::fabs(eigenvalues(1) - eigenvalues(2)) < comp_tolerance) )
214 for (
unsigned int a = 0; a < dim; ++a)
215 for (
unsigned int b = 0; b < dim; ++b)
218 theta[a][b] = (ea(a) - ea(b))
219 / (eigenvalues(a) - eigenvalues(b));
220 xi[a][b] = (theta[a][b] - 0.5 * da(b))
221 / (eigenvalues(a) - eigenvalues(b));
223 for (
unsigned int c = 0; c < dim; ++c)
224 if ((c != a) && (c != b))
237 else if ( (std::fabs(eigenvalues(0) - eigenvalues(1)) < comp_tolerance)
239 (std::fabs(eigenvalues(1) - eigenvalues(2)) < comp_tolerance) )
242 for (
unsigned int a = 0; a < dim; ++a)
244 for (
unsigned int b = 0; b < dim; ++b)
247 theta[a][b] = 0.5 * da(0);
248 xi[a][b] = (1.0 / 8.0) * fa(0);
251 eta = (1.0 / 8.0) * fa(0);
255 For two equal eigenvalues a and b: \f$ \lambda_a = \lambda_b \neq \lambda_c \f$
257 else if ( (std::fabs(eigenvalues(0) - eigenvalues(1)) < comp_tolerance)
259 ( !(std::fabs(eigenvalues(1) - eigenvalues(2)) < comp_tolerance) ) )
262 for (
unsigned int a = 0; a < dim; ++a)
263 for (
unsigned int b = 0; b < dim; ++b)
264 if ((a != b) && ((a == 2) || (b == 2)))
266 theta[a][b] = (ea(a) - ea(b))
267 / (eigenvalues(a) - eigenvalues(b));
268 xi[a][b] = (theta[a][b] - 0.5 * da(b))
269 / (eigenvalues(a) - eigenvalues(b));
272 theta[0][1] = 0.5 * da(0);
273 theta[1][0] = theta[0][1];
274 xi[0][1] = (1.0 / 8.0) * fa(0);
279 For two equal eigenvalues a and c: \f$ \lambda_a = \lambda_c \neq \lambda_b \f$
281 else if ( (std::fabs(eigenvalues(0) - eigenvalues(2)) < comp_tolerance)
283 (!(std::fabs(eigenvalues(1) - eigenvalues(2)) < comp_tolerance)) )
286 for (
unsigned int a = 0; a < dim; ++a)
287 for (
unsigned int b = 0; b < dim; ++b)
288 if ( (a != b) && ((a == 1) || (b == 1)) )
290 theta[a][b] = (ea(a) - ea(b))
291 / (eigenvalues(a) - eigenvalues(b));
292 xi[a][b] = (theta[a][b] - 0.5 * da(b))
293 / (eigenvalues(a) - eigenvalues(b));
296 theta[0][2] = 0.5 * da(0);
297 theta[2][0] = theta[0][2];
298 xi[0][2] = (1.0 / 8.0) * fa(0);
303 For two equal eigenvalues b and c: \f$ \lambda_b = \lambda_c \neq \lambda_a \f$
305 else if ( (std::fabs(eigenvalues(1) - eigenvalues(2)) < comp_tolerance)
307 (!(std::fabs(eigenvalues(0) - eigenvalues(1)) < comp_tolerance)) )
310 for (
unsigned int a = 0; a < dim; ++a)
311 for (
unsigned int b = 0; b < dim; ++b)
312 if ( (a != b) && ((a == 0) || (b == 0)) )
314 theta[a][b] = (ea(a) - ea(b))
315 / (eigenvalues(a) - eigenvalues(b));
316 xi[a][b] = (theta[a][b] - 0.5 * da(b))
317 / (eigenvalues(a) - eigenvalues(b));
320 theta[1][2] = 0.5 * da(1);
321 theta[2][1] = theta[1][2];
322 xi[1][2] = (1.0 / 8.0) * fa(1);
328 deallog <<
"ln-space<< eigenvalues:0: " << eigenvalues[0] << std::endl;
329 deallog <<
"ln-space<< eigenvalues:1: " << eigenvalues[1] << std::endl;
330 deallog <<
"ln-space<< eigenvalues:2: " << eigenvalues[2] << std::endl;
332 ExcMessage(
"ln-space<< Eigenvalue case not possible, check update_qph!") );
336 Ensure that \a eta was initialised in one of the cases
338 AssertThrow( (eta < 9999999), ExcMessage(
"Eta in update_qph not initialised") );
346 Compute projection tensor P
348 Tensor<4, dim> projection_tensor_P;
349 for (
unsigned int a = 0; a < dim; ++a)
351 projection_tensor_P += da(a) * (Tensor<4,dim> ) outer_product(eigenbasis[a],eigenbasis[a]);
352 for (
unsigned int b = 0; b < dim; ++b)
358 Check whether the projecton tensor is symmetric and store it into a \a SymmetricTensor
360 AssertThrow(
symmetry_check(projection_tensor_P), ExcMessage(
"ln-space<< Projection tensor P is not symmetric") );
361 SymmetricTensor<4,dim> projection_tensor_P_sym =
symmetrize(projection_tensor_P);
364 Compute the
double contraction of T and L
366 Tensor<4, dim> projection_tensor_T_doublecon_L;
367 for (
unsigned int a = 0; a < dim; ++a)
369 projection_tensor_T_doublecon_L += fa(a)
370 * (stress_measure_T_sym * eigenbasis[a])
371 * (Tensor<4, dim> ) (outer_product(eigenbasis[a], eigenbasis[a]));
372 for (
unsigned int b = 0; b < dim; ++b)
375 projection_tensor_T_doublecon_L += 2.0 * xi[a][b]
385 for (
unsigned int c = 0; c < dim; ++c)
386 if ( (c != a) && (c != b) )
388 projection_tensor_T_doublecon_L += 2.0 * eta
398 Check whether the tensor is symmetric and store it into a \a SymmetricTensor
401 ExcMessage(
"ln-space<< Projection tensor T:L is not symmetric") );
402 SymmetricTensor<4,dim> projection_tensor_T_doublecon_L_sym =
symmetrize(projection_tensor_T_doublecon_L);
405 Compute the retransformed values
407 second_piola_stress_S = stress_measure_T_sym * projection_tensor_P_sym;
409 elasto_plastic_tangent = projection_tensor_P_sym * elasto_plastic_tangent * projection_tensor_P_sym
410 + projection_tensor_T_doublecon_L_sym;
420 Hosted via GitHub according to https:
421 Design of the documentation inspired by the deal.ii tutorial programs.
bool symmetry_check(Tensor< 2, dim > &tensor)
Definition: functions.h:163
Tensor< 4, dim > get_tensor_operator_F_right(const SymmetricTensor< 2, dim > &Ma, const SymmetricTensor< 2, dim > &Mb, const SymmetricTensor< 2, dim > &Mc, const SymmetricTensor< 2, dim > &T)
Definition: functions.h:53
Tensor< 4, dim > get_tensor_operator_G(const SymmetricTensor< 2, dim > &Ma, const SymmetricTensor< 2, dim > &Mb)
Definition: functions.h:33
Tensor< 4, dim > get_tensor_operator_F_left(const SymmetricTensor< 2, dim > &Ma, const SymmetricTensor< 2, dim > &Mb, const SymmetricTensor< 2, dim > &Mc, const SymmetricTensor< 2, dim > &T)
Definition: functions.h:79
SymmetricTensor< 4, dim > symmetrize(const Tensor< 4, dim > &tensor)
Definition: functions.h:209