13 #include <deal.II/base/symmetric_tensor.h> 14 #include <deal.II/base/exceptions.h> 23 #include "../MA-Code/auxiliary_functions/StandardTensors.h" 24 #include "../MA-Code/auxiliary_functions/tensor_operators.h" 25 #include "../MA-Code/auxiliary_functions/auxiliary_functions.h" 26 #include "../2D_axial-symmetry_plane-strain_dealii/handling_2D.h" 41 SymmetricTensor<4,dim>
C;
44 void pre_ln ( Tensor<2,3> &F
47 void post_ln ( SymmetricTensor<2,3> &stress_measure_T_sym, SymmetricTensor<4,3> &elasto_plastic_tangent
50 SymmetricTensor<2,3> post_transform ( SymmetricTensor<2,3> &ln_tensor);
52 SymmetricTensor<2,3> plastic_right_cauchy_green_AS (SymmetricTensor<2,dim> plastic_hencky_strain);
64 const double comp_tolerance = 1e-8;
99 SymmetricTensor<2,3> right_cauchy_green_sym =
symmetrize( transpose(F) * F);
104 for (
unsigned int i = 0; i < 3; ++i) {
105 eigenvalues[i] = eigenvectors(right_cauchy_green_sym)[i].first;
106 eigenvector[i] = eigenvectors(right_cauchy_green_sym)[i].second;
115 for (
unsigned int i = 0; i < 3; ++i)
140 for (
unsigned int i = 0; i < 3; ++i)
144 ExcMessage(
"ln-space<< Eigenvalue is negativ. Check update_qph.") );
149 for (
unsigned int i = 0; i < 3; ++i)
154 Assert(
ea(i) ==
ea(i),
155 ExcMessage(
"ln-space<< Ea is nan due to logarithm of negativ eigenvalue. Check update_qph.") );
157 ExcMessage(
"ln-space<< First derivative da of diagonal function is "+std::to_string(
da(i))+
" < 0.0 ." 158 "Check update_qph.") );
162 for (
unsigned int a = 0; a < 3; ++a)
176 void ln_space<3>::post_ln ( SymmetricTensor<2,3> &stress_measure_T_sym, SymmetricTensor<4,3> &elasto_plastic_tangent )
185 double eta = 999999999.0;
197 for (
unsigned int a = 0; a < 3; ++a)
198 for (
unsigned int b = 0; b < 3; ++b)
201 theta[a][b] = (
ea(a) -
ea(b))
203 xi[a][b] = (theta[a][b] - 0.5 *
da(b))
206 for (
unsigned int c = 0; c < 3; ++c)
207 if ((c != a) && (c != b))
225 for (
unsigned int a = 0; a < 3; ++a)
227 for (
unsigned int b = 0; b < 3; ++b)
230 theta[a][b] = 0.5 *
da(0);
231 xi[a][b] = (1.0 / 8.0) *
fa(0);
234 eta = (1.0 / 8.0) *
fa(0);
243 for (
unsigned int a = 0; a < 3; ++a)
244 for (
unsigned int b = 0; b < 3; ++b)
245 if ((a != b) && ((a == 2) || (b == 2)))
247 theta[a][b] = (
ea(a) -
ea(b))
249 xi[a][b] = (theta[a][b] - 0.5 *
da(b))
253 theta[0][1] = 0.5 *
da(0);
254 theta[1][0] = theta[0][1];
255 xi[0][1] = (1.0 / 8.0) *
fa(0);
265 for (
unsigned int a = 0; a < 3; ++a)
266 for (
unsigned int b = 0; b < 3; ++b)
267 if ( (a != b) && ((a == 1) || (b == 1)) )
269 theta[a][b] = (
ea(a) -
ea(b))
271 xi[a][b] = (theta[a][b] - 0.5 *
da(b))
275 theta[0][2] = 0.5 *
da(0);
276 theta[2][0] = theta[0][2];
277 xi[0][2] = (1.0 / 8.0) *
fa(0);
287 for (
unsigned int a = 0; a < 3; ++a)
288 for (
unsigned int b = 0; b < 3; ++b)
289 if ( (a != b) && ((a == 0) || (b == 0)) )
291 theta[a][b] = (
ea(a) -
ea(b))
293 xi[a][b] = (theta[a][b] - 0.5 *
da(b))
297 theta[1][2] = 0.5 *
da(1);
298 theta[2][1] = theta[1][2];
299 xi[1][2] = (1.0 / 8.0) *
fa(1);
305 deallog <<
"ln-space<< eigenvalues:0: " <<
eigenvalues[0] << std::endl;
306 deallog <<
"ln-space<< eigenvalues:1: " <<
eigenvalues[1] << std::endl;
307 deallog <<
"ln-space<< eigenvalues:2: " <<
eigenvalues[2] << std::endl;
309 ExcMessage(
"ln-space<< Eigenvalue case not possible, check update_qph!") );
320 std::vector< SymmetricTensor<4,3> > Ma_x_Ma (3);
322 Tensor<4,3> projection_tensor_P;
323 for (
unsigned int a = 0; a < 3; ++a)
326 projection_tensor_P +=
da(a) * (Tensor<4,3> ) Ma_x_Ma[a];
327 for (
unsigned int b = 0; b < 3; ++b)
333 Assert(
symmetry_check(projection_tensor_P), ExcMessage(
"ln-space<< Projection tensor P is not symmetric") );
337 Tensor<4,3> projection_tensor_T_doublecon_L;
338 for (
unsigned int a = 0; a < 3; ++a)
340 projection_tensor_T_doublecon_L +=
fa(a)
342 * (Tensor<4,3> ) Ma_x_Ma[a];
343 for (
unsigned int b = 0; b < 3; ++b)
346 projection_tensor_T_doublecon_L += 2.0 * xi[a][b]
356 for (
unsigned int c = 0; c < 3; ++c)
357 if ( (c != a) && (c != b) )
359 projection_tensor_T_doublecon_L += 2.0 * eta
370 ExcMessage(
"ln-space<< Projection tensor T:L is not symmetric") );
371 SymmetricTensor<4,3> projection_tensor_T_doublecon_L_sym =
symmetrize(projection_tensor_T_doublecon_L);
376 C = projection_tensor_P_sym * elasto_plastic_tangent * projection_tensor_P_sym
377 + projection_tensor_T_doublecon_L_sym;
392 void ln_space<2>::post_ln ( SymmetricTensor<2,3> &stress_measure_T_sym, SymmetricTensor<4,3> &elasto_plastic_tangent )
399 Vector<double> gamma (3);
400 Vector<double> kappa (2);
401 double beta = 999999999.0;
407 for (
unsigned int a = 0; a < 3; ++a)
408 gamma[a] =
da[a] - beta;
409 for (
unsigned int alpha = 0; alpha < 2; ++alpha)
416 for (
unsigned int a = 0; a < 3; ++a)
417 gamma[a] =
da[a] -
da[0];
418 for (
unsigned int alpha = 0; alpha < 2; ++alpha)
419 kappa[alpha] = (1.5 - (alpha+1)) *
fa[0];
423 deallog <<
"ln-space<< eigenvalues:0: " <<
eigenvalues[0] << std::endl;
424 deallog <<
"ln-space<< eigenvalues:1: " <<
eigenvalues[1] << std::endl;
425 deallog <<
"ln-space<< eigenvalues:2: " <<
eigenvalues[2] << std::endl;
427 ExcMessage(
"ln-space<< Eigenvalue case not possible, check update_qph!") );
431 Assert( (beta < 9999999), ExcMessage(
"Beta in update_qph not initialised") );
439 Vector<double> zeta_a (3);
440 for (
unsigned int a=0; a<3; ++a )
441 zeta_a(a) = stress_measure_T_sym *
eigenbasis[a];
444 Tensor<4,3> projection_tensor_P = beta * Tensor<4,3> (StandardTensors::II<3>());
446 std::vector< SymmetricTensor<4,3> > Ma_x_Ma (3);
448 for (
unsigned int a = 0; a < 3; ++a)
451 projection_tensor_P += gamma[a] * (Tensor<4,3>) Ma_x_Ma[a];
458 Tensor<4,3> projection_tensor_T_doublecon_L;
459 for (
unsigned int a = 0; a < 3; ++a)
461 projection_tensor_T_doublecon_L +=
fa(a)
463 * (Tensor<4,3>) Ma_x_Ma[a];
465 for (
unsigned int alpha = 0; alpha < 2; ++alpha)
467 projection_tensor_T_doublecon_L += std::pow(-1, (alpha+1)+1)
470 zeta_a[alpha] * Tensor<4,3> (StandardTensors::II<3>())
474 for (
unsigned int a = 0; a < 3; ++a)
475 for (
unsigned int alpha = 0; alpha < 2; ++alpha)
477 projection_tensor_T_doublecon_L
478 += std::pow(-1,alpha+1) * kappa[alpha]
480 zeta_a[alpha] * Tensor<4,3> (Ma_x_Ma[a])
487 ExcMessage(
"ln-space<< Projection tensor T:L is not symmetric") );
488 SymmetricTensor<4,3> projection_tensor_T_doublecon_L_sym =
symmetrize(projection_tensor_T_doublecon_L);
496 C_3D = projection_tensor_P_sym * elasto_plastic_tangent * projection_tensor_P_sym
497 + projection_tensor_T_doublecon_L_sym;
499 C = extract_dim<2> (
C_3D );
517 AssertThrow(
false, ExcMessage(
"plastic_right_cauchy_green_AS<< Sorry. Even though the algorithm " 518 "to compute the plastic RCG tensor was tested, the implementation into this " 519 "ln-space class has not been tested at all. So either you have enough faith to " 520 "simply remove this AssertThrow in the code or you do some testing to validate the function yourself."));
523 Vector<double> eigenvalues_pl(3);
524 std::vector< Tensor<1,3> > eigenvector_pl(3);
525 for (
unsigned int i = 0; i < 3; ++i)
527 eigenvalues_pl[i] = eigenvectors(plastic_hencky_strain)[i].first;
528 eigenvector_pl[i] = eigenvectors(plastic_hencky_strain)[i].second;
535 if ((fabs(eigenvalues_pl(0) - 1) > 1e-10)
536 && (fabs(eigenvalues_pl(1) - 1) > 1e-10)
537 && (fabs(eigenvalues_pl(2) - 1) > 1e-10))
538 for (
unsigned int i = 0; i < 3; ++i)
539 for (
unsigned int j = i + 1; j < 3; ++j)
541 ExcMessage(
"Eigenvectors are not perpendicular to each other") );
545 std::vector< SymmetricTensor<2,3> > eigenbasis_pl(3);
546 for (
unsigned int i = 0; i < 3; ++i)
550 Vector<double>
ea(3);
551 for (
unsigned int i = 0; i < 3; ++i)
552 ea(i) = exp(2.0* eigenvalues_pl(i));
555 SymmetricTensor<2,3> plastic_right_cauchy_green;
556 for (
unsigned int a = 0; a < 3; ++a)
557 plastic_right_cauchy_green +=
ea(a) * eigenbasis_pl[a];
559 return plastic_right_cauchy_green;
std::vector< Tensor< 1, 3 > > eigenvector
Definition: ln_space.h:56
bool symmetry_check(Tensor< 2, dim > &tensor)
Definition: functions.h:163
SymmetricTensor< 2, dim > second_piola_stress_S
Definition: ln_space.h:40
std::vector< SymmetricTensor< 2, 3 > > eigenbasis
Definition: ln_space.h:57
SymmetricTensor< 2, 3 > post_transform(SymmetricTensor< 2, 3 > &ln_tensor)
Definition: ln_space.h:508
const double comp_tolerance
Definition: ln_space.h:64
Vector< double > eigenvalues
Definition: ln_space.h:55
void pre_ln(Tensor< 2, 3 > &F)
Definition: ln_space.h:88
SymmetricTensor< 4, dim > C
Definition: ln_space.h:41
SymmetricTensor< 2, 3 > hencky_strain_3D
Definition: ln_space.h:37
SymmetricTensor< 4, 3 > C_3D
Definition: ln_space.h:42
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
Vector< double > da
Definition: ln_space.h:59
SymmetricTensor< 4, dim > outer_product_sym(const SymmetricTensor< 2, dim > &A, const SymmetricTensor< 2, dim > &B)
Definition: functions.h:110
SymmetricTensor< 4, 3 > projection_tensor_P_sym
Definition: ln_space.h:62
SymmetricTensor< 2, dim > hencky_strain
Definition: ln_space.h:36
ln_space()
Definition: ln_space.h:69
Tensor< 4, dim > get_tensor_operator_G(const SymmetricTensor< 2, dim > &Ma, const SymmetricTensor< 2, dim > &Mb)
Definition: functions.h:33
Vector< double > fa
Definition: ln_space.h:60
void post_ln(SymmetricTensor< 2, 3 > &stress_measure_T_sym, SymmetricTensor< 4, 3 > &elasto_plastic_tangent)
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< 2, 3 > plastic_right_cauchy_green_AS(SymmetricTensor< 2, dim > plastic_hencky_strain)
Definition: ln_space.h:515
Vector< double > ea
Definition: ln_space.h:58
SymmetricTensor< 4, dim > symmetrize(const Tensor< 4, dim > &tensor)
Definition: functions.h:209
Definition: ln_space.h:31