v0.16.0
Loading...
Searching...
No Matches
HenckyOps.hpp
Go to the documentation of this file.
1/**
2 * \file HenckyOps.hpp
3 * \example HenckyOps.hpp
4 *
5 * @copyright Copyright (c) 2023
6 */
7
8#ifndef __HENCKY_OPS_HPP__
9#define __HENCKY_OPS_HPP__
10
11namespace HenckyOps {
12
13constexpr double eps = std::numeric_limits<float>::epsilon();
14
15auto f = [](double v) { return 0.5 * std::log(v); };
16auto d_f = [](double v) { return 0.5 / v; };
17auto dd_f = [](double v) { return -0.5 / (v * v); };
18
19struct isEq {
20 static inline auto check(const double &a, const double &b) {
21 return std::abs(a - b) / absMax < eps;
22 }
23 static double absMax;
24};
25
26double isEq::absMax = 1;
27
28inline auto is_eq(const double &a, const double &b) {
29 return isEq::check(a, b);
30};
31
32template <int DIM> inline auto get_uniq_nb(double *ptr) {
33 std::array<double, DIM> tmp;
34 std::copy(ptr, &ptr[DIM], tmp.begin());
35 std::sort(tmp.begin(), tmp.end());
36 isEq::absMax = std::max(std::abs(tmp[0]), std::abs(tmp[DIM - 1]));
37 return std::distance(tmp.begin(), std::unique(tmp.begin(), tmp.end(), is_eq));
38};
39
40template <int S>
42 std::conditional_t<S == 1, DataLayoutTraits<DataLayout::CoeffsByGauss>,
43 DataLayoutTraits<DataLayout::GaussByCoeffs>>;
44
45template <int DIM>
48
50 std::max(std::max(std::abs(eig(0)), std::abs(eig(1))), std::abs(eig(2)));
51
52 int i = 0, j = 1, k = 2;
53
54 if (is_eq(eig(0), eig(1))) {
55 i = 0;
56 j = 2;
57 k = 1;
58 } else if (is_eq(eig(0), eig(2))) {
59 i = 0;
60 j = 1;
61 k = 2;
62 } else if (is_eq(eig(1), eig(2))) {
63 i = 1;
64 j = 0;
65 k = 2;
66 }
67
69 eigen_vec(i, 0), eigen_vec(i, 1), eigen_vec(i, 2),
70
71 eigen_vec(j, 0), eigen_vec(j, 1), eigen_vec(j, 2),
72
73 eigen_vec(k, 0), eigen_vec(k, 1), eigen_vec(k, 2)};
74
75 FTensor::Tensor1<double, 3> eig_c{eig(i), eig(j), eig(k)};
76
77 {
78 FTensor::Index<'i', DIM> i;
79 FTensor::Index<'j', DIM> j;
80 eig(i) = eig_c(i);
81 eigen_vec(i, j) = eigen_vec_c(i, j);
82 }
83};
84
85struct CommonData : public boost::enable_shared_from_this<CommonData> {
86 boost::shared_ptr<MatrixDouble> matGradPtr;
87 boost::shared_ptr<MatrixDouble> matDPtr;
88 boost::shared_ptr<MatrixDouble> matLogCPlastic;
89
90 MatrixDouble matEigVal;
91 MatrixDouble matEigVec;
92 MatrixDouble matLogC;
93 MatrixDouble matLogCdC;
94 MatrixDouble matCdF;
95 MatrixDouble matFirstPiolaStress;
96 MatrixDouble matSecondPiolaStress;
97 MatrixDouble matHenckyStress;
98 MatrixDouble matTangent;
99
101 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
103 }
104
105 inline auto getMatHenckyStress() {
106 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
108 }
109
110 inline auto getMatLogC() {
111 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &matLogC);
112 }
113
114 inline auto getMatTangent() {
115 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &matTangent);
116 }
117};
118
119template <int DIM, IntegrationType I, typename DomainEleOp>
120struct OpCalculateEigenValsImpl;
121
122template <int DIM, IntegrationType I, typename DomainEleOp>
123struct OpCalculateLogCImpl;
124
125template <int DIM, IntegrationType I, typename DomainEleOp>
126struct OpCalculateLogC_dCImpl;
127
128template <int DIM, IntegrationType I, typename DomainEleOp, int S>
129struct OpCalculateHenckyStressImpl;
130
131template <int DIM, IntegrationType I, typename DomainEleOp, int S>
132struct OpCalculateHenckyThermalStressImpl;
133
134template <int DIM, IntegrationType I, typename DomainEleOp, int S>
135struct OpCalculateHenckyPlasticStressImpl;
136
137template <int DIM, IntegrationType I, typename DomainEleOp, int S>
139
140template <int DIM, IntegrationType I, typename DomainEleOp, int S>
142
143template <int DIM, IntegrationType I, typename DomainEleOp, int S>
145
146template <int DIM, IntegrationType I, typename DomainEleOp, int S>
148
149template <int DIM, typename DomainEleOp>
150struct OpCalculateEigenValsImpl<DIM, GAUSS, DomainEleOp> : public DomainEleOp {
151
153 boost::shared_ptr<CommonData> common_data)
155 commonDataPtr(common_data) {
156 std::fill(&DomainEleOp::doEntities[MBEDGE],
157 &DomainEleOp::doEntities[MBMAXTYPE], false);
158 }
159
160 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
162
163 FTensor::Index<'i', DIM> i;
164 FTensor::Index<'j', DIM> j;
165 FTensor::Index<'k', DIM> k;
166
167 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
168 // const size_t nb_gauss_pts = matGradPtr->size2();
169 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
170
171 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
172
173 commonDataPtr->matEigVal.resize(DIM, nb_gauss_pts, false);
174 commonDataPtr->matEigVec.resize(DIM * DIM, nb_gauss_pts, false);
175 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
176 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
177
178 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
179
184
185 F(i, j) = t_grad(i, j) + t_kd(i, j);
186 C(i, j) = F(k, i) ^ F(k, j);
187
188 for (int ii = 0; ii != DIM; ii++)
189 for (int jj = 0; jj != DIM; jj++)
190 eigen_vec(ii, jj) = C(ii, jj);
191
192 CHKERR computeEigenValuesSymmetric(eigen_vec, eig);
193 for (auto ii = 0; ii != DIM; ++ii)
194 eig(ii) = std::max(std::numeric_limits<double>::epsilon(), eig(ii));
195
196 // rare case when two eigen values are equal
197 auto nb_uniq = get_uniq_nb<DIM>(&eig(0));
198 if constexpr (DIM == 3) {
199 if (nb_uniq == 2) {
200 sort_eigen_vals<DIM>(eig, eigen_vec);
201 }
202 }
203
204 t_eig_val(i) = eig(i);
205 t_eig_vec(i, j) = eigen_vec(i, j);
206
207 ++t_grad;
208 ++t_eig_val;
209 ++t_eig_vec;
210 }
211
213 }
214
215private:
216 boost::shared_ptr<CommonData> commonDataPtr;
217};
218
219template <int DIM, typename DomainEleOp>
220struct OpCalculateLogCImpl<DIM, GAUSS, DomainEleOp> : public DomainEleOp {
221
223 boost::shared_ptr<CommonData> common_data)
225 commonDataPtr(common_data) {
226 std::fill(&DomainEleOp::doEntities[MBEDGE],
227 &DomainEleOp::doEntities[MBMAXTYPE], false);
228 }
229
230 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
232
233 FTensor::Index<'i', DIM> i;
234 FTensor::Index<'j', DIM> j;
235
236 // const size_t nb_gauss_pts = matGradPtr->size2();
237 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
238 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
239 commonDataPtr->matLogC.resize(size_symm, nb_gauss_pts, false);
240
241 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
242 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
243
244 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
245
246 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
247 t_logC(i, j) = EigenMatrix::getMat(t_eig_val, t_eig_vec, f)(i, j);
248 ++t_eig_val;
249 ++t_eig_vec;
250 ++t_logC;
251 }
252
254 }
255
256private:
257 boost::shared_ptr<CommonData> commonDataPtr;
258};
259
260template <int DIM, typename DomainEleOp>
261struct OpCalculateLogC_dCImpl<DIM, GAUSS, DomainEleOp> : public DomainEleOp {
262
264 boost::shared_ptr<CommonData> common_data)
266 commonDataPtr(common_data) {
267 std::fill(&DomainEleOp::doEntities[MBEDGE],
268 &DomainEleOp::doEntities[MBMAXTYPE], false);
269 }
270
271 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
273
274 FTensor::Index<'i', DIM> i;
275 FTensor::Index<'j', DIM> j;
276 FTensor::Index<'k', DIM> k;
277 FTensor::Index<'l', DIM> l;
278
279 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
280 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
281 commonDataPtr->matLogCdC.resize(size_symm * size_symm, nb_gauss_pts, false);
282 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
283 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
284 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
285
286 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
287 // rare case when two eigen values are equal
288 auto nb_uniq = get_uniq_nb<DIM>(&t_eig_val(0));
289 t_logC_dC(i, j, k, l) =
290 2 * EigenMatrix::getDiffMat(t_eig_val, t_eig_vec, f, d_f,
291 nb_uniq)(i, j, k, l);
292
293 ++t_logC_dC;
294 ++t_eig_val;
295 ++t_eig_vec;
296 }
297
299 }
300
301private:
302 boost::shared_ptr<CommonData> commonDataPtr;
303};
304
305template <int DIM, typename DomainEleOp, int S>
306struct OpCalculateHenckyStressImpl<DIM, GAUSS, DomainEleOp, S>
307 : public DomainEleOp {
308
310 boost::shared_ptr<CommonData> common_data)
312 commonDataPtr(common_data) {
313 std::fill(&DomainEleOp::doEntities[MBEDGE],
314 &DomainEleOp::doEntities[MBMAXTYPE], false);
315 }
316
317 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
319
320 FTensor::Index<'i', DIM> i;
321 FTensor::Index<'j', DIM> j;
322 FTensor::Index<'k', DIM> k;
323 FTensor::Index<'l', DIM> l;
324
325 // const size_t nb_gauss_pts = matGradPtr->size2();
326 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
327 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S, HenckyTensorLayout<S>>(
328 *commonDataPtr->matDPtr);
329 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
330 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
331 commonDataPtr->matHenckyStress.resize(size_symm, nb_gauss_pts, false);
332 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
333
334 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
335 t_T(i, j) = t_D(i, j, k, l) * t_logC(k, l);
336 ++t_logC;
337 ++t_T;
338 ++t_D;
339 }
340
342 }
343
344private:
345 boost::shared_ptr<CommonData> commonDataPtr;
346};
347
348template <int DIM, typename DomainEleOp, int S>
349struct OpCalculateHenckyThermalStressImpl<DIM, GAUSS, DomainEleOp, S>
350 : public DomainEleOp {
351
353 const std::string field_name, boost::shared_ptr<VectorDouble> temperature,
354 boost::shared_ptr<CommonData> common_data,
355 boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
356 boost::shared_ptr<double> ref_temp_ptr)
357 : DomainEleOp(field_name, DomainEleOp::OPROW), tempPtr(temperature),
358 commonDataPtr(common_data), coeffExpansionPtr(coeff_expansion_ptr),
359 refTempPtr(ref_temp_ptr) {
360 std::fill(&DomainEleOp::doEntities[MBEDGE],
361 &DomainEleOp::doEntities[MBMAXTYPE], false);
362 }
363
364 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
366
367 FTensor::Index<'i', DIM> i;
368 FTensor::Index<'j', DIM> j;
369 FTensor::Index<'k', DIM> k;
370 FTensor::Index<'l', DIM> l;
371
372 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
373
374 // const size_t nb_gauss_pts = matGradPtr->size2();
375 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
376 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S, HenckyTensorLayout<S>>(
377 *commonDataPtr->matDPtr);
378 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
379 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
380 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
381 commonDataPtr->matHenckyStress.resize(size_symm, nb_gauss_pts, false);
382 commonDataPtr->matFirstPiolaStress.resize(DIM * DIM, nb_gauss_pts, false);
383 commonDataPtr->matSecondPiolaStress.resize(size_symm, nb_gauss_pts, false);
384 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
385 auto t_P = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matFirstPiolaStress);
386 auto t_S =
387 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
388 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
389 auto t_temp = getFTensor0FromVec(*tempPtr);
390
392 t_coeff_exp(i, j) = 0;
393 for (auto d = 0; d != SPACE_DIM; ++d) {
394 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
395 }
396
397 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
398#ifdef HENCKY_SMALL_STRAIN
399 t_P(i, j) = t_D(i, j, k, l) *
400 (t_grad(k, l) - t_coeff_exp(k, l) * (t_temp - (*refTempPtr)));
401#else
402 t_T(i, j) = t_D(i, j, k, l) *
403 (t_logC(k, l) - t_coeff_exp(k, l) * (t_temp - (*refTempPtr)));
405 t_F(i, j) = t_grad(i, j) + t_kd(i, j);
406 t_S(k, l) = t_T(i, j) * t_logC_dC(i, j, k, l);
407 t_P(i, l) = t_F(i, k) * t_S(k, l);
408#endif
409 ++t_grad;
410 ++t_logC;
411 ++t_logC_dC;
412 ++t_P;
413 ++t_T;
414 ++t_S;
415 ++t_D;
416 ++t_temp;
417 }
418
420 }
421
422private:
423 boost::shared_ptr<CommonData> commonDataPtr;
424 boost::shared_ptr<VectorDouble> tempPtr;
425 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
426 boost::shared_ptr<double> refTempPtr;
427};
428
429template <int DIM, typename DomainEleOp, int S>
430struct OpCalculateHenckyPlasticStressImpl<DIM, GAUSS, DomainEleOp, S>
431 : public DomainEleOp {
432
434 boost::shared_ptr<CommonData> common_data,
435 boost::shared_ptr<MatrixDouble> mat_D_ptr,
436 const double scale = 1)
437 : DomainEleOp(field_name, DomainEleOp::OPROW), commonDataPtr(common_data),
438 scaleStress(scale), matDPtr(mat_D_ptr) {
439 std::fill(&DomainEleOp::doEntities[MBEDGE],
440 &DomainEleOp::doEntities[MBMAXTYPE], false);
441
442 matLogCPlastic = commonDataPtr->matLogCPlastic;
443 }
444
445 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
447
448 FTensor::Index<'i', DIM> i;
449 FTensor::Index<'j', DIM> j;
450 FTensor::Index<'k', DIM> k;
451 FTensor::Index<'l', DIM> l;
452
453 // const size_t nb_gauss_pts = matGradPtr->size2();
454 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
455 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S, HenckyTensorLayout<S>>(
456 *matDPtr);
457 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
458 auto t_logCPlastic = getFTensor2SymmetricFromMat<DIM>(*matLogCPlastic);
459 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
460 commonDataPtr->matHenckyStress.resize(size_symm, nb_gauss_pts, false);
461 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
462
463 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
464 t_T(i, j) = t_D(i, j, k, l) * (t_logC(k, l) - t_logCPlastic(k, l));
465 t_T(i, j) /= scaleStress;
466 ++t_logC;
467 ++t_T;
468 ++t_D;
469 ++t_logCPlastic;
470 }
471
473 }
474
475private:
476 boost::shared_ptr<CommonData> commonDataPtr;
477 boost::shared_ptr<MatrixDouble> matDPtr;
478 boost::shared_ptr<MatrixDouble> matLogCPlastic;
479 const double scaleStress;
480};
481
482template <int DIM, typename DomainEleOp, int S>
484 : public DomainEleOp {
485
487 const std::string field_name, boost::shared_ptr<VectorDouble> temperature,
488 boost::shared_ptr<CommonData> common_data,
489 boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
490 boost::shared_ptr<double> ref_temp_ptr)
491 : DomainEleOp(field_name, DomainEleOp::OPROW), tempPtr(temperature),
492 commonDataPtr(common_data), coeffExpansionPtr(coeff_expansion_ptr),
493 refTempPtr(ref_temp_ptr) {
494 std::fill(&DomainEleOp::doEntities[MBEDGE],
495 &DomainEleOp::doEntities[MBMAXTYPE], false);
496
497 matLogCPlastic = commonDataPtr->matLogCPlastic;
498 }
499
500 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
502
503 FTensor::Index<'i', DIM> i;
504 FTensor::Index<'j', DIM> j;
505 FTensor::Index<'k', DIM> k;
506 FTensor::Index<'l', DIM> l;
507
508 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
509
510 // const size_t nb_gauss_pts = matGradPtr->size2();
511 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
512 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S, HenckyTensorLayout<S>>(
513 *commonDataPtr->matDPtr);
514 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
515 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
516 auto t_logCPlastic = getFTensor2SymmetricFromMat<DIM>(*matLogCPlastic);
517 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
518 commonDataPtr->matHenckyStress.resize(size_symm, nb_gauss_pts, false);
519 commonDataPtr->matFirstPiolaStress.resize(DIM * DIM, nb_gauss_pts, false);
520 commonDataPtr->matSecondPiolaStress.resize(size_symm, nb_gauss_pts, false);
521 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
522 auto t_P = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matFirstPiolaStress);
523 auto t_S =
524 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
525 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
526 auto t_temp = getFTensor0FromVec(*tempPtr);
527
529 t_coeff_exp(i, j) = 0;
530 for (auto d = 0; d != SPACE_DIM; ++d) {
531 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
532 }
533
534 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
535#ifdef HENCKY_SMALL_STRAIN
536 t_P(i, j) =
537 t_D(i, j, k, l) * (t_grad(k, l) - t_logCPlastic(k, l) -
538 t_coeff_exp(k, l) * (t_temp - (*refTempPtr)));
539#else
540 t_T(i, j) =
541 t_D(i, j, k, l) * (t_logC(k, l) - t_logCPlastic(k, l) -
542 t_coeff_exp(k, l) * (t_temp - (*refTempPtr)));
544 t_F(i, j) = t_grad(i, j) + t_kd(i, j);
545 t_S(k, l) = t_T(i, j) * t_logC_dC(i, j, k, l);
546 t_P(i, l) = t_F(i, k) * t_S(k, l);
547#endif
548 ++t_grad;
549 ++t_logC;
550 ++t_P;
551 ++t_T;
552 ++t_S;
553 ++t_D;
554 ++t_temp;
555 ++t_logCPlastic;
556 }
557
559 }
560
561private:
562 boost::shared_ptr<CommonData> commonDataPtr;
563 boost::shared_ptr<VectorDouble> tempPtr;
564 boost::shared_ptr<MatrixDouble> matLogCPlastic;
565 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
566 boost::shared_ptr<double> refTempPtr;
567};
568
569template <int DIM, typename DomainEleOp, int S>
570struct OpCalculatePiolaStressImpl<DIM, GAUSS, DomainEleOp, S>
571 : public DomainEleOp {
572
574 boost::shared_ptr<CommonData> common_data)
576 commonDataPtr(common_data) {
577 std::fill(&DomainEleOp::doEntities[MBEDGE],
578 &DomainEleOp::doEntities[MBMAXTYPE], false);
579 }
580
581 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
583
584 FTensor::Index<'i', DIM> i;
585 FTensor::Index<'j', DIM> j;
586 FTensor::Index<'k', DIM> k;
587 FTensor::Index<'l', DIM> l;
588
589 constexpr auto t_kd = FTensor::Kronecker_Delta<int>();
590
591 // const size_t nb_gauss_pts = matGradPtr->size2();
592 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
593#ifdef HENCKY_SMALL_STRAIN
594 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S, HenckyTensorLayout<S>>(
595 *commonDataPtr->matDPtr);
596#endif
597 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
598 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
599 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
600 commonDataPtr->matFirstPiolaStress.resize(DIM * DIM, nb_gauss_pts, false);
601 commonDataPtr->matSecondPiolaStress.resize(size_symm, nb_gauss_pts, false);
602 auto t_P = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matFirstPiolaStress);
603 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
604 auto t_S =
605 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
606 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
607
608 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
609
610#ifdef HENCKY_SMALL_STRAIN
611 t_P(i, j) = t_D(i, j, k, l) * t_grad(k, l);
612#else
614 t_F(i, j) = t_grad(i, j) + t_kd(i, j);
615 t_S(k, l) = t_T(i, j) * t_logC_dC(i, j, k, l);
616 t_P(i, l) = t_F(i, k) * t_S(k, l);
617#endif
618
619 ++t_grad;
620 ++t_logC;
621 ++t_logC_dC;
622 ++t_P;
623 ++t_T;
624 ++t_S;
625#ifdef HENCKY_SMALL_STRAIN
626 ++t_D;
627#endif
628 }
629
631 }
632
633private:
634 boost::shared_ptr<CommonData> commonDataPtr;
635};
636
637template <int DIM, typename DomainEleOp, int S>
638struct OpHenckyTangentImpl<DIM, GAUSS, DomainEleOp, S> : public DomainEleOp {
640 boost::shared_ptr<CommonData> common_data,
641 boost::shared_ptr<MatrixDouble> mat_D_ptr = nullptr)
643 commonDataPtr(common_data) {
644 std::fill(&DomainEleOp::doEntities[MBEDGE],
645 &DomainEleOp::doEntities[MBMAXTYPE], false);
646 if (mat_D_ptr)
647 matDPtr = mat_D_ptr;
648 else
649 matDPtr = commonDataPtr->matDPtr;
650 }
651
652 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
654
655 FTensor::Index<'i', DIM> i;
656 FTensor::Index<'j', DIM> j;
657 FTensor::Index<'k', DIM> k;
658 FTensor::Index<'l', DIM> l;
659 FTensor::Index<'m', DIM> m;
660 FTensor::Index<'n', DIM> n;
661 FTensor::Index<'o', DIM> o;
662 FTensor::Index<'p', DIM> p;
663
664 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
665 // const size_t nb_gauss_pts = matGradPtr->size2();
666 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
667 commonDataPtr->matTangent.resize(nb_gauss_pts, DIM * DIM * DIM * DIM);
668 auto dP_dF =
669 getFTensor4FromMat<DIM, DIM, DIM, DIM>(commonDataPtr->matTangent);
670
671 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S, HenckyTensorLayout<S>>(
672 *matDPtr);
673 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
674 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
675 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
676 auto t_S =
677 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
678 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
679 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
680 commonDataPtr->matCdF.resize(nb_gauss_pts, DIM * DIM * DIM * DIM);
681 auto dC_dF =
682 getFTensor4FromMat<DIM, DIM, DIM, DIM>(commonDataPtr->matCdF);
683
684 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
685
686#ifdef HENCKY_SMALL_STRAIN
687 dP_dF(i, j, k, l) = t_D(i, j, k, l);
688#else
689
691 t_F(i, j) = t_grad(i, j) + t_kd(i, j);
692
693 // rare case when two eigen values are equal
694 auto nb_uniq = get_uniq_nb<DIM>(&t_eig_val(0));
695
696 dC_dF(i, j, k, l) = (t_kd(i, l) * t_F(k, j)) + (t_kd(j, l) * t_F(k, i));
697
698 auto TL = EigenMatrix::getDiffDiffMat(t_eig_val, t_eig_vec, f, d_f, dd_f,
699 t_T, nb_uniq);
700 TL(i, j, k, l) *= 4;
701 FTensor::Ddg<double, DIM, DIM> P_D_P_plus_TL;
702 P_D_P_plus_TL(i, j, k, l) =
703 TL(i, j, k, l) +
704 (t_logC_dC(i, j, o, p) * t_D(o, p, m, n)) * t_logC_dC(m, n, k, l);
705 P_D_P_plus_TL(i, j, k, l) *= 0.5;
706 dP_dF(i, j, m, n) = t_kd(i, m) * (t_kd(k, n) * t_S(k, j));
707 dP_dF(i, j, m, n) +=
708 t_F(i, k) * (P_D_P_plus_TL(k, j, o, p) * dC_dF(o, p, m, n));
709
710#endif
711
712 ++dP_dF;
713
714 ++t_grad;
715 ++t_eig_val;
716 ++t_eig_vec;
717 ++t_logC_dC;
718 ++t_S;
719 ++t_T;
720 ++t_D;
721 ++dC_dF;
722 }
723
725 }
726
727private:
728 boost::shared_ptr<CommonData> commonDataPtr;
729 boost::shared_ptr<MatrixDouble> matDPtr;
730};
731
732template <int DIM, typename AssemblyDomainEleOp, int S>
733struct OpCalculateHenckyThermalStressdTImpl<DIM, GAUSS, AssemblyDomainEleOp, S>
734 : public AssemblyDomainEleOp {
736 const std::string row_field_name, const std::string col_field_name,
737 boost::shared_ptr<CommonData> elastic_common_data_ptr,
738 boost::shared_ptr<VectorDouble> coeff_expansion_ptr);
739
740 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
741 EntitiesFieldData::EntData &col_data);
742
743private:
744 boost::shared_ptr<CommonData> elasticCommonDataPtr;
745 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
746};
747
748template <int DIM, typename AssemblyDomainEleOp, int S>
751 const std::string row_field_name, const std::string col_field_name,
752 boost::shared_ptr<CommonData> elastic_common_data_ptr,
753 boost::shared_ptr<VectorDouble> coeff_expansion_ptr)
754 : AssemblyDomainEleOp(row_field_name, col_field_name,
755 AssemblyDomainEleOp::OPROWCOL),
756 elasticCommonDataPtr(elastic_common_data_ptr),
757 coeffExpansionPtr(coeff_expansion_ptr) {
758 this->sYmm = false;
759}
760
761template <int DIM, typename AssemblyDomainEleOp, int S>
762MoFEMErrorCode
763OpCalculateHenckyThermalStressdTImpl<DIM, GAUSS, AssemblyDomainEleOp, S>::
764 iNtegrate(EntitiesFieldData::EntData &row_data,
765 EntitiesFieldData::EntData &col_data) {
767
768 auto &locMat = AssemblyDomainEleOp::locMat;
769
770 const auto nb_integration_pts = row_data.getN().size1();
771 const auto nb_row_base_functions = row_data.getN().size2();
772 auto t_w = this->getFTensor0IntegrationWeight();
773
775 auto t_row_diff_base = row_data.getFTensor1DiffN<DIM>();
776 auto t_D =
777 getFTensor4DdgFromMat<DIM, DIM, S, HenckyTensorLayout<S>>(
778 *elasticCommonDataPtr->matDPtr);
779 auto t_grad =
780 getFTensor2FromMat<DIM, DIM>(*(elasticCommonDataPtr->matGradPtr));
781 auto t_logC_dC =
782 getFTensor4DdgFromMat<DIM, DIM>(elasticCommonDataPtr->matLogCdC);
785
786 FTensor::Index<'i', DIM> i;
787 FTensor::Index<'j', DIM> j;
788 FTensor::Index<'k', DIM> k;
789 FTensor::Index<'l', DIM> l;
790 FTensor::Index<'m', DIM> m;
791 FTensor::Index<'n', DIM> n;
792 FTensor::Index<'o', DIM> o;
793
795 t_coeff_exp(i, j) = 0;
796 for (auto d = 0; d != SPACE_DIM; ++d) {
797 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
798 }
799
800 t_eigen_strain(i, j) = t_D(i, j, k, l) * t_coeff_exp(k, l);
801
802 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
803
804 t_F(i, j) = t_grad(i, j) + t_kd(i, j);
805
806 double alpha = this->getMeasure() * t_w;
807 auto rr = 0;
808 for (; rr != AssemblyDomainEleOp::nbRows / DIM; ++rr) {
809 auto t_mat =
810 getFTensor1FromMat<DIM, 1,
811 DataLayoutTraits<DataLayout::CoeffsByGauss>>(
812 locMat, rr * DIM);
813 auto t_col_base = col_data.getFTensor0N(gg, 0);
814 for (auto cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
815#ifdef HENCKY_SMALL_STRAIN
816 t_mat(i) -=
817 (t_row_diff_base(j) * t_eigen_strain(i, j)) * (t_col_base * alpha);
818#else
819 t_mat(i) -= (t_row_diff_base(j) *
820 (t_F(i, o) * ((t_D(m, n, k, l) * t_coeff_exp(k, l)) *
821 t_logC_dC(m, n, o, j)))) *
822 (t_col_base * alpha);
823#endif
824
825 ++t_mat;
826 ++t_col_base;
827 }
828
829 ++t_row_diff_base;
830 }
831 for (; rr != nb_row_base_functions; ++rr)
832 ++t_row_diff_base;
833
834 ++t_w;
835 ++t_grad;
836 ++t_logC_dC;
837 ++t_D;
838 }
839
841}
842
843template <typename DomainEleOp> struct HenckyIntegrators {
844 template <int DIM, IntegrationType I>
846
847 template <int DIM, IntegrationType I>
849
850 template <int DIM, IntegrationType I>
852
853 template <int DIM, IntegrationType I, int S>
856
857 template <int DIM, IntegrationType I, int S>
860
861 template <int DIM, IntegrationType I, int S>
864
865 template <int DIM, IntegrationType I, int S>
868
869 template <int DIM, IntegrationType I, int S>
872
873 template <int DIM, IntegrationType I, int S>
875
876 template <int DIM, IntegrationType I, typename AssemblyDomainEleOp, int S>
879};
880
881template <int DIM>
882MoFEMErrorCode
884 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
885 std::string block_name,
886 boost::shared_ptr<MatrixDouble> mat_D_Ptr, Sev sev,
887 double scale = 1) {
889
890 PetscBool plane_strain_flag = PETSC_FALSE;
891 CHKERR PetscOptionsGetBool(PETSC_NULLPTR, "", "-plane_strain",
892 &plane_strain_flag, PETSC_NULLPTR);
893
894 struct OpMatBlocks : public DomainEleOp {
895 OpMatBlocks(boost::shared_ptr<MatrixDouble> m, double bulk_modulus_K,
896 double shear_modulus_G, MoFEM::Interface &m_field, Sev sev,
897 std::vector<const CubitMeshSets *> meshset_vec_ptr,
898 double scale, PetscBool plane_strain_flag)
899 : DomainEleOp(NOSPACE, DomainEleOp::OPSPACE), matDPtr(m),
900 bulkModulusKDefault(bulk_modulus_K),
901 shearModulusGDefault(shear_modulus_G), scaleYoungModulus(scale),
902 planeStrainFlag(plane_strain_flag) {
903 CHK_THROW_MESSAGE(extractBlockData(m_field, meshset_vec_ptr, sev),
904 "Can not get data from block");
905 }
906
907 MoFEMErrorCode doWork(int side, EntityType type,
908 EntitiesFieldData::EntData &data) {
910
911 for (auto &b : blockData) {
912
913 if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
914 CHKERR getMatDPtr(matDPtr, b.bulkModulusK * scaleYoungModulus,
915 b.shearModulusG * scaleYoungModulus,
916 planeStrainFlag);
918 }
919 }
920
921 CHKERR getMatDPtr(matDPtr, bulkModulusKDefault * scaleYoungModulus,
922 shearModulusGDefault * scaleYoungModulus,
923 planeStrainFlag);
925 }
926
927 private:
928 boost::shared_ptr<MatrixDouble> matDPtr;
929 const double scaleYoungModulus;
930 const PetscBool planeStrainFlag;
931
932 struct BlockData {
933 double bulkModulusK;
934 double shearModulusG;
935 Range blockEnts;
936 };
937
938 double bulkModulusKDefault;
939 double shearModulusGDefault;
940 std::vector<BlockData> blockData;
941
942 MoFEMErrorCode
943 extractBlockData(MoFEM::Interface &m_field,
944 std::vector<const CubitMeshSets *> meshset_vec_ptr,
945 Sev sev) {
947
948 for (auto m : meshset_vec_ptr) {
949 MOFEM_TAG_AND_LOG("WORLD", sev, "MatBlock") << *m;
950 std::vector<double> block_data;
951 CHKERR m->getAttributes(block_data);
952 if (block_data.size() < 2) {
954 "Expected that block has two attribute");
955 }
956 auto get_block_ents = [&]() {
957 Range ents;
959 m_field.get_moab().get_entities_by_handle(m->meshset, ents, true),
960 "Can not get entities for block meshset");
961 return ents;
962 };
963
964 double young_modulus = block_data[0];
965 double poisson_ratio = block_data[1];
966 double bulk_modulus_K = young_modulus / (3 * (1 - 2 * poisson_ratio));
967 double shear_modulus_G = young_modulus / (2 * (1 + poisson_ratio));
968
969 MOFEM_TAG_AND_LOG("WORLD", sev, "MatBlock")
970 << "E = " << young_modulus << " nu = " << poisson_ratio;
971
972 blockData.push_back(
973 {bulk_modulus_K, shear_modulus_G, get_block_ents()});
974 }
975 MOFEM_LOG_CHANNEL("WORLD");
977 }
978
979 MoFEMErrorCode getMatDPtr(boost::shared_ptr<MatrixDouble> mat_D_ptr,
980 double bulk_modulus_K, double shear_modulus_G,
981 PetscBool is_plane_strain) {
983 //! [Calculate elasticity tensor]
984 auto set_material_stiffness = [&]() {
985 FTensor::Index<'i', DIM> i;
986 FTensor::Index<'j', DIM> j;
987 FTensor::Index<'k', DIM> k;
988 FTensor::Index<'l', DIM> l;
990 double A = (SPACE_DIM == 2 && !is_plane_strain)
991 ? 2 * shear_modulus_G /
992 (bulk_modulus_K + (4. / 3.) * shear_modulus_G)
993 : 1;
994 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*mat_D_ptr);
995 t_D(i, j, k, l) =
996 2 * shear_modulus_G * ((t_kd(i, k) ^ t_kd(j, l)) / 4.) +
997 A * (bulk_modulus_K - (2. / 3.) * shear_modulus_G) * t_kd(i, j) *
998 t_kd(k, l);
999 };
1000 //! [Calculate elasticity tensor]
1001 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1002 mat_D_ptr->resize(size_symm * size_symm, 1);
1003 set_material_stiffness();
1005 }
1006 };
1007
1008 double E = young_modulus;
1009 double nu = poisson_ratio;
1010
1011 PetscOptionsBegin(PETSC_COMM_WORLD, "", "", "none");
1012 CHKERR PetscOptionsScalar("-young_modulus", "Young modulus", "", E, &E,
1013 PETSC_NULLPTR);
1014 CHKERR PetscOptionsScalar("-poisson_ratio", "poisson ratio", "", nu, &nu,
1015 PETSC_NULLPTR);
1016 PetscOptionsEnd();
1017
1018 double bulk_modulus_K = E / (3 * (1 - 2 * nu));
1019 double shear_modulus_G = E / (2 * (1 + nu));
1020 pip.push_back(new OpMatBlocks(
1021 mat_D_Ptr, bulk_modulus_K, shear_modulus_G, m_field, sev,
1022
1023 // Get blockset using regular expression
1024 m_field.getInterface<MeshsetsManager>()->getCubitMeshsetPtr(std::regex(
1025
1026 (boost::format("%s(.*)") % block_name).str()
1027
1028 )),
1029 scale, plane_strain_flag
1030
1031 ));
1032
1034}
1035
1036template <int DIM, IntegrationType I, typename DomainEleOp>
1038 MoFEM::Interface &m_field,
1039 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1040 std::string field_name, std::string block_name, Sev sev, double scale = 1) {
1041
1042 auto common_ptr = boost::make_shared<HenckyOps::CommonData>();
1043 common_ptr->matDPtr = boost::make_shared<MatrixDouble>();
1044 common_ptr->matGradPtr = boost::make_shared<MatrixDouble>();
1045
1046 CHK_THROW_MESSAGE(addMatBlockOps<DIM>(m_field, pip, block_name,
1047 common_ptr->matDPtr, sev, scale),
1048 "addMatBlockOps");
1049
1050 using H = HenckyIntegrators<DomainEleOp>;
1051
1052 pip.push_back(new OpCalculateVectorFieldGradient<DIM, DIM>(
1053 field_name, common_ptr->matGradPtr));
1054 pip.push_back(new typename H::template OpCalculateEigenVals<DIM, I>(
1055 field_name, common_ptr));
1056 pip.push_back(
1057 new typename H::template OpCalculateLogC<DIM, I>(field_name, common_ptr));
1058 pip.push_back(new typename H::template OpCalculateLogC_dC<DIM, I>(
1059 field_name, common_ptr));
1060 // Assumes constant D matrix per entity
1061 pip.push_back(new typename H::template OpCalculateHenckyStress<DIM, I, 0>(
1062 field_name, common_ptr));
1063 pip.push_back(new typename H::template OpCalculatePiolaStress<DIM, I, 0>(
1064 field_name, common_ptr));
1065
1066 return common_ptr;
1067}
1068
1069template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
1071 MoFEM::Interface &m_field,
1072 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1073 std::string field_name, boost::shared_ptr<HenckyOps::CommonData> common_ptr,
1074 Sev sev) {
1076
1077 using B = typename FormsIntegrators<DomainEleOp>::template Assembly<
1078 A>::template LinearForm<I>;
1079 using OpInternalForcePiola =
1080 typename B::template OpGradTimesTensor<1, DIM, DIM>;
1081 pip.push_back(
1082 new OpInternalForcePiola("U", common_ptr->getMatFirstPiolaStress()));
1083
1085}
1086
1087template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
1089 MoFEM::Interface &m_field,
1090 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1091 std::string field_name, std::string block_name, Sev sev, double scale = 1) {
1093
1094 auto common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
1095 m_field, pip, field_name, block_name, sev, scale);
1096 CHKERR opFactoryDomainRhs<DIM, A, I, DomainEleOp>(m_field, pip, field_name,
1097 common_ptr, sev);
1098
1100}
1101
1102template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
1104 MoFEM::Interface &m_field,
1105 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1106 std::string field_name, boost::shared_ptr<HenckyOps::CommonData> common_ptr,
1107 Sev sev) {
1109
1110 using B = typename FormsIntegrators<DomainEleOp>::template Assembly<
1111 A>::template BiLinearForm<I>;
1112 using OpKPiola = typename B::template OpGradTensorGrad<1, DIM, DIM, 1>;
1113
1114 using H = HenckyIntegrators<DomainEleOp>;
1115 // Assumes constant D matrix per entity
1116 pip.push_back(new typename H::template OpHenckyTangent<DIM, I, 0>(
1117 field_name, common_ptr));
1118 pip.push_back(
1119 new OpKPiola(field_name, field_name, common_ptr->getMatTangent()));
1120
1122}
1123
1124template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
1126 MoFEM::Interface &m_field,
1127 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1128 std::string field_name, std::string block_name, Sev sev, double scale = 1) {
1130
1131 auto common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
1132 m_field, pip, field_name, block_name, sev, scale);
1133 CHKERR opFactoryDomainLhs<DIM, A, I, DomainEleOp>(m_field, pip, field_name,
1134 common_ptr, sev);
1135
1137}
1138} // namespace HenckyOps
1139
1140#endif // __HENCKY_OPS_HPP__
std::string type
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
constexpr double a
constexpr int SPACE_DIM
DomainEle::UserDataOperator DomainEleOp
Finire element operator type.
Kronecker Delta class symmetric.
Kronecker Delta class.
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ NOSPACE
Definition definitions.h:83
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
double bulk_modulus_K
double shear_modulus_G
@ F
constexpr auto t_kd
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
FTensor::Index< 'i', SPACE_DIM > i
const double v
phase velocity of light in medium (cm/ns)
const double n
refractive index of diffusive medium
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
auto getMat(A &&t_val, B &&t_vec, Fun< double > f)
Get the Mat object.
auto getDiffMat(A &&t_val, B &&t_vec, Fun< double > f, Fun< double > d_f, const int nb)
Get the Diff Mat object.
auto getDiffDiffMat(A &&t_val, B &&t_vec, Fun< double > f, Fun< double > d_f, Fun< double > dd_f, C &&t_S, const int nb)
Get the Diff Diff Mat object.
auto get_uniq_nb(double *ptr)
Definition HenckyOps.hpp:24
auto sort_eigen_vals(FTensor::Tensor1< double, DIM > &eig, FTensor::Tensor2< double, DIM, DIM > &eigen_vec)
Definition HenckyOps.hpp:32
MoFEMErrorCode opFactoryDomainLhs(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, boost::shared_ptr< HenckyOps::CommonData > common_ptr, Sev sev)
std::conditional_t< S==1, DataLayoutTraits< DataLayout::CoeffsByGauss >, DataLayoutTraits< DataLayout::GaussByCoeffs > > HenckyTensorLayout
Definition HenckyOps.hpp:43
const double eps
Definition HenckyOps.hpp:13
MoFEMErrorCode opFactoryDomainRhs(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, boost::shared_ptr< HenckyOps::CommonData > common_ptr, Sev sev)
MoFEMErrorCode addMatBlockOps(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string block_name, boost::shared_ptr< MatrixDouble > mat_D_Ptr, Sev sev, double scale=1)
auto commonDataFactory(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, std::string block_name, Sev sev, double scale=1)
bool is_eq(const double &a, const double &b)
Definition HenckyOps.hpp:19
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
auto getFTensor1FromMat(M &data, int rr=0, int cc=0)
Get tensor rank 1 (vector) form data matrix.
FormsIntegrators< DomainEleOp >::Assembly< A >::LinearForm< I >::OpGradTimesTensor< 1, FIELD_DIM, SPACE_DIM > OpGradTimesTensor
constexpr AssemblyType A
constexpr auto field_name
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpGradTimesTensor< 1, SPACE_DIM, SPACE_DIM > OpInternalForcePiola
Definition seepage.cpp:65
PetscBool is_plane_strain
Definition seepage.cpp:177
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpGradTensorGrad< 1, SPACE_DIM, SPACE_DIM, -1 > OpKPiola
[Only used for dynamics]
Definition seepage.cpp:63
FTensor::Index< 'm', 3 > m
MatrixDouble matEigVec
Definition HenckyOps.hpp:75
boost::shared_ptr< MatrixDouble > matLogCPlastic
Definition HenckyOps.hpp:72
MatrixDouble matCdF
Definition HenckyOps.hpp:94
MatrixDouble matHenckyStress
Definition HenckyOps.hpp:80
MatrixDouble matLogCdC
Definition HenckyOps.hpp:77
MatrixDouble matEigVal
Definition HenckyOps.hpp:74
MatrixDouble matFirstPiolaStress
Definition HenckyOps.hpp:78
boost::shared_ptr< MatrixDouble > matDPtr
Definition HenckyOps.hpp:71
MatrixDouble matSecondPiolaStress
Definition HenckyOps.hpp:79
MatrixDouble matLogC
Definition HenckyOps.hpp:76
MatrixDouble matTangent
Definition HenckyOps.hpp:81
boost::shared_ptr< MatrixDouble > matGradPtr
Definition HenckyOps.hpp:70
OpCalculateEigenValsImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
OpCalculateHenckyPlasticStressImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data, boost::shared_ptr< MatrixDouble > mat_D_ptr, const double scale=1)
OpCalculateHenckyStressImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
OpCalculateHenckyThermalStressImpl(const std::string field_name, boost::shared_ptr< VectorDouble > temperature, boost::shared_ptr< CommonData > common_data, boost::shared_ptr< VectorDouble > coeff_expansion_ptr, boost::shared_ptr< double > ref_temp_ptr)
OpCalculateHenckyThermalStressdTImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< CommonData > elastic_common_data_ptr, boost::shared_ptr< VectorDouble > coeff_expansion_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
OpCalculateHenckyThermoPlasticStressImpl(const std::string field_name, boost::shared_ptr< VectorDouble > temperature, boost::shared_ptr< CommonData > common_data, boost::shared_ptr< VectorDouble > coeff_expansion_ptr, boost::shared_ptr< double > ref_temp_ptr)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
OpCalculateLogCImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
OpCalculateLogC_dCImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data)
OpCalculatePiolaStressImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
OpHenckyTangentImpl(const std::string field_name, boost::shared_ptr< CommonData > common_data, boost::shared_ptr< MatrixDouble > mat_D_ptr=nullptr)
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
static double absMax
Definition HenckyOps.hpp:23
static auto check(const double &a, const double &b)
Definition HenckyOps.hpp:20
virtual moab::Interface & get_moab()=0
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
double young_modulus
Young modulus.
Definition plastic.cpp:126
double poisson_ratio
Poisson ratio.
Definition plastic.cpp:127
double scale
Definition plastic.cpp:124
constexpr auto size_symm
Definition plastic.cpp:42
double H
Hardening.
Definition plastic.cpp:129