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
40// This how you can detect layout, but I refer that thing like this is are not
41// inferred by always explicitly set by programmer. Automatization like this
42// ultimately lead to dependencies which are hard to track and maintain, and
43// detect errors.
44// template <int S>
45// using HenckyTensorLayout =
46// std::conditional_t<S == 1, DataLayoutTraits<DataLayout::CoeffsByGauss>,
47// DataLayoutTraits<DataLayout::GaussByCoeffs>>;
48
49template <int DIM>
52
54 std::max(std::max(std::abs(eig(0)), std::abs(eig(1))), std::abs(eig(2)));
55
56 int i = 0, j = 1, k = 2;
57
58 if (is_eq(eig(0), eig(1))) {
59 i = 0;
60 j = 2;
61 k = 1;
62 } else if (is_eq(eig(0), eig(2))) {
63 i = 0;
64 j = 1;
65 k = 2;
66 } else if (is_eq(eig(1), eig(2))) {
67 i = 1;
68 j = 0;
69 k = 2;
70 }
71
73 eigen_vec(i, 0), eigen_vec(i, 1), eigen_vec(i, 2),
74
75 eigen_vec(j, 0), eigen_vec(j, 1), eigen_vec(j, 2),
76
77 eigen_vec(k, 0), eigen_vec(k, 1), eigen_vec(k, 2)};
78
79 FTensor::Tensor1<double, 3> eig_c{eig(i), eig(j), eig(k)};
80
81 {
82 FTensor::Index<'i', DIM> i;
83 FTensor::Index<'j', DIM> j;
84 eig(i) = eig_c(i);
85 eigen_vec(i, j) = eigen_vec_c(i, j);
86 }
87};
88
89struct CommonData : public boost::enable_shared_from_this<CommonData> {
90 boost::shared_ptr<MatrixDouble> matGradPtr;
91 boost::shared_ptr<MatrixDouble> matDPtr;
92 boost::shared_ptr<MatrixDouble> matLogCPlastic;
93
94 MatrixDouble matEigVal;
95 MatrixDouble matEigVec;
96 MatrixDouble matLogC;
97 MatrixDouble matLogCdC;
98 MatrixDouble matCdF;
99 MatrixDouble matFirstPiolaStress;
100 MatrixDouble matSecondPiolaStress;
101 MatrixDouble matHenckyStress;
102 MatrixDouble matTangent;
103
105 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
107 }
108
109 inline auto getMatHenckyStress() {
110 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
112 }
113
114 inline auto getMatLogC() {
115 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &matLogC);
116 }
117
118 inline auto getMatTangent() {
119 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &matTangent);
120 }
121};
122
123template <int DIM, IntegrationType I, typename DomainEleOp>
124struct OpCalculateEigenValsImpl;
125
126template <int DIM, IntegrationType I, typename DomainEleOp>
127struct OpCalculateLogCImpl;
128
129template <int DIM, IntegrationType I, typename DomainEleOp>
130struct OpCalculateLogC_dCImpl;
131
132template <int DIM, IntegrationType I, typename DomainEleOp, int S>
133struct OpCalculateHenckyStressImpl;
134
135template <int DIM, IntegrationType I, typename DomainEleOp, int S>
136struct OpCalculateHenckyThermalStressImpl;
137
138template <int DIM, IntegrationType I, typename DomainEleOp, int S>
139struct OpCalculateHenckyPlasticStressImpl;
140
141template <int DIM, IntegrationType I, typename DomainEleOp, int S>
143
144template <int DIM, IntegrationType I, typename DomainEleOp, int S>
146
147template <int DIM, IntegrationType I, typename DomainEleOp, int S>
149
150template <int DIM, IntegrationType I, typename DomainEleOp, int S>
152
153template <int DIM, typename DomainEleOp>
154struct OpCalculateEigenValsImpl<DIM, GAUSS, DomainEleOp> : public DomainEleOp {
155
157 boost::shared_ptr<CommonData> common_data)
159 commonDataPtr(common_data) {
160 std::fill(&DomainEleOp::doEntities[MBEDGE],
161 &DomainEleOp::doEntities[MBMAXTYPE], false);
162 }
163
164 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
166
167 FTensor::Index<'i', DIM> i;
168 FTensor::Index<'j', DIM> j;
169 FTensor::Index<'k', DIM> k;
170
171 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
172 // const size_t nb_gauss_pts = matGradPtr->size2();
173 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
174
175 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
176
177 commonDataPtr->matEigVal.resize(DIM, nb_gauss_pts, false);
178 commonDataPtr->matEigVec.resize(DIM * DIM, nb_gauss_pts, false);
179 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
180 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
181
182 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
183
188
189 F(i, j) = t_grad(i, j) + t_kd(i, j);
190 C(i, j) = F(k, i) ^ F(k, j);
191
192 for (int ii = 0; ii != DIM; ii++)
193 for (int jj = 0; jj != DIM; jj++)
194 eigen_vec(ii, jj) = C(ii, jj);
195
196 CHKERR computeEigenValuesSymmetric(eigen_vec, eig);
197 for (auto ii = 0; ii != DIM; ++ii)
198 eig(ii) = std::max(std::numeric_limits<double>::epsilon(), eig(ii));
199
200 // rare case when two eigen values are equal
201 auto nb_uniq = getUniqNb(eig);
202 if constexpr (DIM == 3) {
203 if (nb_uniq == 2) {
204 sortEigenVals(eig, eigen_vec);
205 }
206 }
207
208 t_eig_val(i) = eig(i);
209 t_eig_vec(i, j) = eigen_vec(i, j);
210
211 ++t_grad;
212 ++t_eig_val;
213 ++t_eig_vec;
214 }
215
217 }
218
219private:
220 boost::shared_ptr<CommonData> commonDataPtr;
221};
222
223template <int DIM, typename DomainEleOp>
224struct OpCalculateLogCImpl<DIM, GAUSS, DomainEleOp> : public DomainEleOp {
225
227 boost::shared_ptr<CommonData> common_data)
229 commonDataPtr(common_data) {
230 std::fill(&DomainEleOp::doEntities[MBEDGE],
231 &DomainEleOp::doEntities[MBMAXTYPE], false);
232 }
233
234 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
236
237 FTensor::Index<'i', DIM> i;
238 FTensor::Index<'j', DIM> j;
239
240 // const size_t nb_gauss_pts = matGradPtr->size2();
241 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
242 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
243 commonDataPtr->matLogC.resize(size_symm, nb_gauss_pts, false);
244
245 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
246 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
247
248 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
249
250 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
251 t_logC(i, j) = EigenMatrix::getMat(t_eig_val, t_eig_vec, f)(i, j);
252 ++t_eig_val;
253 ++t_eig_vec;
254 ++t_logC;
255 }
256
258 }
259
260private:
261 boost::shared_ptr<CommonData> commonDataPtr;
262};
263
264template <int DIM, typename DomainEleOp>
265struct OpCalculateLogC_dCImpl<DIM, GAUSS, DomainEleOp> : public DomainEleOp {
266
268 boost::shared_ptr<CommonData> common_data)
270 commonDataPtr(common_data) {
271 std::fill(&DomainEleOp::doEntities[MBEDGE],
272 &DomainEleOp::doEntities[MBMAXTYPE], false);
273 }
274
275 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
277
278 FTensor::Index<'i', DIM> i;
279 FTensor::Index<'j', DIM> j;
280 FTensor::Index<'k', DIM> k;
281 FTensor::Index<'l', DIM> l;
282
283 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
284 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
285 commonDataPtr->matLogCdC.resize(size_symm * size_symm, nb_gauss_pts, false);
286 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
287 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
288 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
289
290 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
291 // rare case when two eigen values are equal
292 auto nb_uniq = get_uniq_nb<DIM>(&t_eig_val(0));
293 t_logC_dC(i, j, k, l) =
294 2 * EigenMatrix::getDiffMat(t_eig_val, t_eig_vec, f, d_f,
295 nb_uniq)(i, j, k, l);
296
297 ++t_logC_dC;
298 ++t_eig_val;
299 ++t_eig_vec;
300 }
301
303 }
304
305private:
306 boost::shared_ptr<CommonData> commonDataPtr;
307};
308
309template <int DIM, typename DomainEleOp, int S>
310struct OpCalculateHenckyStressImpl<DIM, GAUSS, DomainEleOp, S>
311 : public DomainEleOp {
312
314 boost::shared_ptr<CommonData> common_data)
316 commonDataPtr(common_data) {
317 std::fill(&DomainEleOp::doEntities[MBEDGE],
318 &DomainEleOp::doEntities[MBMAXTYPE], false);
319 }
320
321 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
323
324 FTensor::Index<'i', DIM> i;
325 FTensor::Index<'j', DIM> j;
326 FTensor::Index<'k', DIM> k;
327 FTensor::Index<'l', DIM> l;
328
329 // const size_t nb_gauss_pts = matGradPtr->size2();
330 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
331 auto t_D =
332 getFTensor4DdgFromMat<DIM, DIM, S,
333 DataLayoutTraits<DataLayout::GaussByCoeffs>>(
334 *commonDataPtr->matDPtr);
335 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
336 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
337 commonDataPtr->matHenckyStress.resize(size_symm, nb_gauss_pts, false);
338 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
339
340 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
341 t_T(i, j) = t_D(i, j, k, l) * t_logC(k, l);
342 ++t_logC;
343 ++t_T;
344 ++t_D;
345 }
346
348 }
349
350private:
351 boost::shared_ptr<CommonData> commonDataPtr;
352};
353
354template <int DIM, typename DomainEleOp, int S>
355struct OpCalculateHenckyThermalStressImpl<DIM, GAUSS, DomainEleOp, S>
356 : public DomainEleOp {
357
359 const std::string field_name, boost::shared_ptr<VectorDouble> temperature,
360 boost::shared_ptr<CommonData> common_data,
361 boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
362 boost::shared_ptr<double> ref_temp_ptr)
363 : DomainEleOp(field_name, DomainEleOp::OPROW), tempPtr(temperature),
364 commonDataPtr(common_data), coeffExpansionPtr(coeff_expansion_ptr),
365 refTempPtr(ref_temp_ptr) {
366 std::fill(&DomainEleOp::doEntities[MBEDGE],
367 &DomainEleOp::doEntities[MBMAXTYPE], false);
368 }
369
370 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
372
373 FTensor::Index<'i', DIM> i;
374 FTensor::Index<'j', DIM> j;
375 FTensor::Index<'k', DIM> k;
376 FTensor::Index<'l', DIM> l;
377
378 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
379
380 // const size_t nb_gauss_pts = matGradPtr->size2();
381 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
382 auto t_D =
383 getFTensor4DdgFromMat<DIM, DIM, S,
384 DataLayoutTraits<DataLayout::GaussByCoeffs>>(
385 *commonDataPtr->matDPtr);
386 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
387 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
388 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
389 commonDataPtr->matHenckyStress.resize(size_symm, nb_gauss_pts, false);
390 commonDataPtr->matFirstPiolaStress.resize(DIM * DIM, nb_gauss_pts, false);
391 commonDataPtr->matSecondPiolaStress.resize(size_symm, nb_gauss_pts, false);
392 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
393 auto t_P = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matFirstPiolaStress);
394 auto t_S =
395 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
396 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
397 auto t_temp = getFTensor0FromVec(*tempPtr);
398
400 t_coeff_exp(i, j) = 0;
401 for (auto d = 0; d != SPACE_DIM; ++d) {
402 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
403 }
404
405 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
406#ifdef HENCKY_SMALL_STRAIN
407 t_P(i, j) = t_D(i, j, k, l) *
408 (t_grad(k, l) - t_coeff_exp(k, l) * (t_temp - (*refTempPtr)));
409#else
410 t_T(i, j) = t_D(i, j, k, l) *
411 (t_logC(k, l) - t_coeff_exp(k, l) * (t_temp - (*refTempPtr)));
413 t_F(i, j) = t_grad(i, j) + t_kd(i, j);
414 t_S(k, l) = t_T(i, j) * t_logC_dC(i, j, k, l);
415 t_P(i, l) = t_F(i, k) * t_S(k, l);
416#endif
417 ++t_grad;
418 ++t_logC;
419 ++t_logC_dC;
420 ++t_P;
421 ++t_T;
422 ++t_S;
423 ++t_D;
424 ++t_temp;
425 }
426
428 }
429
430private:
431 boost::shared_ptr<CommonData> commonDataPtr;
432 boost::shared_ptr<VectorDouble> tempPtr;
433 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
434 boost::shared_ptr<double> refTempPtr;
435};
436
437template <int DIM, typename DomainEleOp, int S>
438struct OpCalculateHenckyPlasticStressImpl<DIM, GAUSS, DomainEleOp, S>
439 : public DomainEleOp {
440
442 boost::shared_ptr<CommonData> common_data,
443 boost::shared_ptr<MatrixDouble> mat_D_ptr,
444 const double scale = 1)
445 : DomainEleOp(field_name, DomainEleOp::OPROW), commonDataPtr(common_data),
446 scaleStress(scale), matDPtr(mat_D_ptr) {
447 std::fill(&DomainEleOp::doEntities[MBEDGE],
448 &DomainEleOp::doEntities[MBMAXTYPE], false);
449
450 matLogCPlastic = commonDataPtr->matLogCPlastic;
451 }
452
453 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
455
456 FTensor::Index<'i', DIM> i;
457 FTensor::Index<'j', DIM> j;
458 FTensor::Index<'k', DIM> k;
459 FTensor::Index<'l', DIM> l;
460
461 // const size_t nb_gauss_pts = matGradPtr->size2();
462 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
463 auto t_D = getFTensor4DdgFromMat<
464 DIM, DIM, S, DataLayoutTraits<DataLayout::GaussByCoeffs>>(*matDPtr);
465 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
466 auto t_logCPlastic = getFTensor2SymmetricFromMat<DIM>(*matLogCPlastic);
467 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
468 commonDataPtr->matHenckyStress.resize(size_symm, nb_gauss_pts, false);
469 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
470
471 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
472 t_T(i, j) = t_D(i, j, k, l) * (t_logC(k, l) - t_logCPlastic(k, l));
473 t_T(i, j) /= scaleStress;
474 ++t_logC;
475 ++t_T;
476 ++t_D;
477 ++t_logCPlastic;
478 }
479
481 }
482
483private:
484 boost::shared_ptr<CommonData> commonDataPtr;
485 boost::shared_ptr<MatrixDouble> matDPtr;
486 boost::shared_ptr<MatrixDouble> matLogCPlastic;
487 const double scaleStress;
488};
489
490template <int DIM, typename DomainEleOp, int S>
492 : public DomainEleOp {
493
495 const std::string field_name, boost::shared_ptr<VectorDouble> temperature,
496 boost::shared_ptr<CommonData> common_data,
497 boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
498 boost::shared_ptr<double> ref_temp_ptr)
499 : DomainEleOp(field_name, DomainEleOp::OPROW), tempPtr(temperature),
500 commonDataPtr(common_data), coeffExpansionPtr(coeff_expansion_ptr),
501 refTempPtr(ref_temp_ptr) {
502 std::fill(&DomainEleOp::doEntities[MBEDGE],
503 &DomainEleOp::doEntities[MBMAXTYPE], false);
504
505 matLogCPlastic = commonDataPtr->matLogCPlastic;
506 }
507
508 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
510
511 FTensor::Index<'i', DIM> i;
512 FTensor::Index<'j', DIM> j;
513 FTensor::Index<'k', DIM> k;
514 FTensor::Index<'l', DIM> l;
515
516 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
517
518 // const size_t nb_gauss_pts = matGradPtr->size2();
519 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
520 auto t_D =
521 getFTensor4DdgFromMat<DIM, DIM, S,
522 DataLayoutTraits<DataLayout::GaussByCoeffs>>(
523 *commonDataPtr->matDPtr);
524 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
525 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
526 auto t_logCPlastic = getFTensor2SymmetricFromMat<DIM>(*matLogCPlastic);
527 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
528 commonDataPtr->matHenckyStress.resize(size_symm, nb_gauss_pts, false);
529 commonDataPtr->matFirstPiolaStress.resize(DIM * DIM, nb_gauss_pts, false);
530 commonDataPtr->matSecondPiolaStress.resize(size_symm, nb_gauss_pts, false);
531 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
532 auto t_P = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matFirstPiolaStress);
533 auto t_S =
534 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
535 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
536 auto t_temp = getFTensor0FromVec(*tempPtr);
537
539 t_coeff_exp(i, j) = 0;
540 for (auto d = 0; d != SPACE_DIM; ++d) {
541 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
542 }
543
544 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
545#ifdef HENCKY_SMALL_STRAIN
546 t_P(i, j) =
547 t_D(i, j, k, l) * (t_grad(k, l) - t_logCPlastic(k, l) -
548 t_coeff_exp(k, l) * (t_temp - (*refTempPtr)));
549#else
550 t_T(i, j) =
551 t_D(i, j, k, l) * (t_logC(k, l) - t_logCPlastic(k, l) -
552 t_coeff_exp(k, l) * (t_temp - (*refTempPtr)));
554 t_F(i, j) = t_grad(i, j) + t_kd(i, j);
555 t_S(k, l) = t_T(i, j) * t_logC_dC(i, j, k, l);
556 t_P(i, l) = t_F(i, k) * t_S(k, l);
557#endif
558 ++t_grad;
559 ++t_logC;
560 ++t_P;
561 ++t_T;
562 ++t_S;
563 ++t_D;
564 ++t_temp;
565 ++t_logCPlastic;
566 }
567
569 }
570
571private:
572 boost::shared_ptr<CommonData> commonDataPtr;
573 boost::shared_ptr<VectorDouble> tempPtr;
574 boost::shared_ptr<MatrixDouble> matLogCPlastic;
575 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
576 boost::shared_ptr<double> refTempPtr;
577};
578
579template <int DIM, typename DomainEleOp, int S>
580struct OpCalculatePiolaStressImpl<DIM, GAUSS, DomainEleOp, S>
581 : public DomainEleOp {
582
584 boost::shared_ptr<CommonData> common_data)
586 commonDataPtr(common_data) {
587 std::fill(&DomainEleOp::doEntities[MBEDGE],
588 &DomainEleOp::doEntities[MBMAXTYPE], false);
589 }
590
591 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
593
594 FTensor::Index<'i', DIM> i;
595 FTensor::Index<'j', DIM> j;
596 FTensor::Index<'k', DIM> k;
597 FTensor::Index<'l', DIM> l;
598
599 constexpr auto t_kd = FTensor::Kronecker_Delta<int>();
600
601 // const size_t nb_gauss_pts = matGradPtr->size2();
602 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
603#ifdef HENCKY_SMALL_STRAIN
604 auto t_D =
605 getFTensor4DdgFromMat<DIM, DIM, S,
606 DataLayoutTraits<DataLayout::GaussByCoeffs>>(
607 *commonDataPtr->matDPtr);
608#endif
609 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
610 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
611 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
612 commonDataPtr->matFirstPiolaStress.resize(DIM * DIM, nb_gauss_pts, false);
613 commonDataPtr->matSecondPiolaStress.resize(size_symm, nb_gauss_pts, false);
614 auto t_P = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matFirstPiolaStress);
615 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
616 auto t_S =
617 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
618 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
619
620 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
621
622#ifdef HENCKY_SMALL_STRAIN
623 t_P(i, j) = t_D(i, j, k, l) * t_grad(k, l);
624#else
626 t_F(i, j) = t_grad(i, j) + t_kd(i, j);
627 t_S(k, l) = t_T(i, j) * t_logC_dC(i, j, k, l);
628 t_P(i, l) = t_F(i, k) * t_S(k, l);
629#endif
630
631 ++t_grad;
632 ++t_logC;
633 ++t_logC_dC;
634 ++t_P;
635 ++t_T;
636 ++t_S;
637#ifdef HENCKY_SMALL_STRAIN
638 ++t_D;
639#endif
640 }
641
643 }
644
645private:
646 boost::shared_ptr<CommonData> commonDataPtr;
647};
648
649template <int DIM, typename DomainEleOp, int S>
650struct OpHenckyTangentImpl<DIM, GAUSS, DomainEleOp, S> : public DomainEleOp {
652 boost::shared_ptr<CommonData> common_data,
653 boost::shared_ptr<MatrixDouble> mat_D_ptr = nullptr)
655 commonDataPtr(common_data) {
656 std::fill(&DomainEleOp::doEntities[MBEDGE],
657 &DomainEleOp::doEntities[MBMAXTYPE], false);
658 if (mat_D_ptr)
659 matDPtr = mat_D_ptr;
660 else
661 matDPtr = commonDataPtr->matDPtr;
662 }
663
664 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
666
667 FTensor::Index<'i', DIM> i;
668 FTensor::Index<'j', DIM> j;
669 FTensor::Index<'k', DIM> k;
670 FTensor::Index<'l', DIM> l;
671 FTensor::Index<'m', DIM> m;
672 FTensor::Index<'n', DIM> n;
673 FTensor::Index<'o', DIM> o;
674 FTensor::Index<'p', DIM> p;
675
676 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
677 // const size_t nb_gauss_pts = matGradPtr->size2();
678 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
679 commonDataPtr->matTangent.resize(nb_gauss_pts, DIM * DIM * DIM * DIM);
680 auto dP_dF =
681 getFTensor4FromMat<DIM, DIM, DIM, DIM>(commonDataPtr->matTangent);
682
683 auto t_D = getFTensor4DdgFromMat<
684 DIM, DIM, S, DataLayoutTraits<DataLayout::GaussByCoeffs>>(*matDPtr);
685 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
686 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
687 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
688 auto t_S =
689 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
690 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
691 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
692 commonDataPtr->matCdF.resize(nb_gauss_pts, DIM * DIM * DIM * DIM);
693 auto dC_dF =
694 getFTensor4FromMat<DIM, DIM, DIM, DIM>(commonDataPtr->matCdF);
695
696 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
697
698#ifdef HENCKY_SMALL_STRAIN
699 dP_dF(i, j, k, l) = t_D(i, j, k, l);
700#else
701
703 t_F(i, j) = t_grad(i, j) + t_kd(i, j);
704
705 // rare case when two eigen values are equal
706 auto nb_uniq = get_uniq_nb<DIM>(&t_eig_val(0));
707
708 dC_dF(i, j, k, l) = (t_kd(i, l) * t_F(k, j)) + (t_kd(j, l) * t_F(k, i));
709
710 auto TL = EigenMatrix::getDiffDiffMat(t_eig_val, t_eig_vec, f, d_f, dd_f,
711 t_T, nb_uniq);
712 TL(i, j, k, l) *= 4;
713 FTensor::Ddg<double, DIM, DIM> P_D_P_plus_TL;
714 P_D_P_plus_TL(i, j, k, l) =
715 TL(i, j, k, l) +
716 (t_logC_dC(i, j, o, p) * t_D(o, p, m, n)) * t_logC_dC(m, n, k, l);
717 P_D_P_plus_TL(i, j, k, l) *= 0.5;
718 dP_dF(i, j, m, n) = t_kd(i, m) * (t_kd(k, n) * t_S(k, j));
719 dP_dF(i, j, m, n) +=
720 t_F(i, k) * (P_D_P_plus_TL(k, j, o, p) * dC_dF(o, p, m, n));
721
722#endif
723
724 ++dP_dF;
725
726 ++t_grad;
727 ++t_eig_val;
728 ++t_eig_vec;
729 ++t_logC_dC;
730 ++t_S;
731 ++t_T;
732 ++t_D;
733 ++dC_dF;
734 }
735
737 }
738
739private:
740 boost::shared_ptr<CommonData> commonDataPtr;
741 boost::shared_ptr<MatrixDouble> matDPtr;
742};
743
744template <int DIM, typename AssemblyDomainEleOp, int S>
745struct OpCalculateHenckyThermalStressdTImpl<DIM, GAUSS, AssemblyDomainEleOp, S>
746 : public AssemblyDomainEleOp {
748 const std::string row_field_name, const std::string col_field_name,
749 boost::shared_ptr<CommonData> elastic_common_data_ptr,
750 boost::shared_ptr<VectorDouble> coeff_expansion_ptr);
751
752 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
753 EntitiesFieldData::EntData &col_data);
754
755private:
756 boost::shared_ptr<CommonData> elasticCommonDataPtr;
757 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
758};
759
760template <int DIM, typename AssemblyDomainEleOp, int S>
763 const std::string row_field_name, const std::string col_field_name,
764 boost::shared_ptr<CommonData> elastic_common_data_ptr,
765 boost::shared_ptr<VectorDouble> coeff_expansion_ptr)
766 : AssemblyDomainEleOp(row_field_name, col_field_name,
767 AssemblyDomainEleOp::OPROWCOL),
768 elasticCommonDataPtr(elastic_common_data_ptr),
769 coeffExpansionPtr(coeff_expansion_ptr) {
770 this->sYmm = false;
771}
772
773template <int DIM, typename AssemblyDomainEleOp, int S>
774MoFEMErrorCode
775OpCalculateHenckyThermalStressdTImpl<DIM, GAUSS, AssemblyDomainEleOp, S>::
776 iNtegrate(EntitiesFieldData::EntData &row_data,
777 EntitiesFieldData::EntData &col_data) {
779
780 auto &locMat = AssemblyDomainEleOp::locMat;
781
782 const auto nb_integration_pts = row_data.getN().size1();
783 const auto nb_row_base_functions = row_data.getN().size2();
784 auto t_w = this->getFTensor0IntegrationWeight();
785
787 auto t_row_diff_base = row_data.getFTensor1DiffN<DIM>();
788 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S,
789 DataLayoutTraits<DataLayout::GaussByCoeffs>>(
790 *elasticCommonDataPtr->matDPtr);
791 auto t_grad =
792 getFTensor2FromMat<DIM, DIM>(*(elasticCommonDataPtr->matGradPtr));
793 auto t_logC_dC =
794 getFTensor4DdgFromMat<DIM, DIM>(elasticCommonDataPtr->matLogCdC);
797
798 FTensor::Index<'i', DIM> i;
799 FTensor::Index<'j', DIM> j;
800 FTensor::Index<'k', DIM> k;
801 FTensor::Index<'l', DIM> l;
802 FTensor::Index<'m', DIM> m;
803 FTensor::Index<'n', DIM> n;
804 FTensor::Index<'o', DIM> o;
805
807 t_coeff_exp(i, j) = 0;
808 for (auto d = 0; d != SPACE_DIM; ++d) {
809 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
810 }
811
812 t_eigen_strain(i, j) = t_D(i, j, k, l) * t_coeff_exp(k, l);
813
814 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
815
816 t_F(i, j) = t_grad(i, j) + t_kd(i, j);
817
818 double alpha = this->getMeasure() * t_w;
819 auto rr = 0;
820 for (; rr != AssemblyDomainEleOp::nbRows / DIM; ++rr) {
821 auto t_mat =
822 getFTensor1FromMat<DIM, 1,
823 DataLayoutTraits<DataLayout::CoeffsByGauss>>(
824 locMat, rr * DIM);
825 auto t_col_base = col_data.getFTensor0N(gg, 0);
826 for (auto cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
827#ifdef HENCKY_SMALL_STRAIN
828 t_mat(i) -=
829 (t_row_diff_base(j) * t_eigen_strain(i, j)) * (t_col_base * alpha);
830#else
831 t_mat(i) -= (t_row_diff_base(j) *
832 (t_F(i, o) * ((t_D(m, n, k, l) * t_coeff_exp(k, l)) *
833 t_logC_dC(m, n, o, j)))) *
834 (t_col_base * alpha);
835#endif
836
837 ++t_mat;
838 ++t_col_base;
839 }
840
841 ++t_row_diff_base;
842 }
843 for (; rr != nb_row_base_functions; ++rr)
844 ++t_row_diff_base;
845
846 ++t_w;
847 ++t_grad;
848 ++t_logC_dC;
849 ++t_D;
850 }
851
853}
854
855template <typename DomainEleOp> struct HenckyIntegrators {
856 template <int DIM, IntegrationType I>
858
859 template <int DIM, IntegrationType I>
861
862 template <int DIM, IntegrationType I>
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>
876
877 template <int DIM, IntegrationType I, int S>
880
881 template <int DIM, IntegrationType I, int S>
884
885 template <int DIM, IntegrationType I, int S>
887
888 template <int DIM, IntegrationType I, typename AssemblyDomainEleOp, int S>
891};
892
893template <int DIM>
894MoFEMErrorCode
896 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
897 std::string block_name,
898 boost::shared_ptr<MatrixDouble> mat_D_Ptr, Sev sev,
899 double scale = 1) {
901
902 PetscBool plane_strain_flag = PETSC_FALSE;
903 CHKERR PetscOptionsGetBool(PETSC_NULLPTR, "", "-plane_strain",
904 &plane_strain_flag, PETSC_NULLPTR);
905
906 struct OpMatBlocks : public DomainEleOp {
907 OpMatBlocks(boost::shared_ptr<MatrixDouble> m, double bulk_modulus_K,
908 double shear_modulus_G, MoFEM::Interface &m_field, Sev sev,
909 std::vector<const CubitMeshSets *> meshset_vec_ptr,
910 double scale, PetscBool plane_strain_flag)
911 : DomainEleOp(NOSPACE, DomainEleOp::OPSPACE), matDPtr(m),
912 bulkModulusKDefault(bulk_modulus_K),
913 shearModulusGDefault(shear_modulus_G), scaleYoungModulus(scale),
914 planeStrainFlag(plane_strain_flag) {
915 CHK_THROW_MESSAGE(extractBlockData(m_field, meshset_vec_ptr, sev),
916 "Can not get data from block");
917 }
918
919 MoFEMErrorCode doWork(int side, EntityType type,
920 EntitiesFieldData::EntData &data) {
922
923 for (auto &b : blockData) {
924
925 if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
926 CHKERR getMatDPtr(matDPtr, b.bulkModulusK * scaleYoungModulus,
927 b.shearModulusG * scaleYoungModulus,
928 planeStrainFlag);
930 }
931 }
932
933 CHKERR getMatDPtr(matDPtr, bulkModulusKDefault * scaleYoungModulus,
934 shearModulusGDefault * scaleYoungModulus,
935 planeStrainFlag);
937 }
938
939 private:
940 boost::shared_ptr<MatrixDouble> matDPtr;
941 const double scaleYoungModulus;
942 const PetscBool planeStrainFlag;
943
944 struct BlockData {
945 double bulkModulusK;
946 double shearModulusG;
947 Range blockEnts;
948 };
949
950 double bulkModulusKDefault;
951 double shearModulusGDefault;
952 std::vector<BlockData> blockData;
953
954 MoFEMErrorCode
955 extractBlockData(MoFEM::Interface &m_field,
956 std::vector<const CubitMeshSets *> meshset_vec_ptr,
957 Sev sev) {
959
960 for (auto m : meshset_vec_ptr) {
961 MOFEM_TAG_AND_LOG("WORLD", sev, "MatBlock") << *m;
962 std::vector<double> block_data;
963 CHKERR m->getAttributes(block_data);
964 if (block_data.size() < 2) {
966 "Expected that block has two attribute");
967 }
968 auto get_block_ents = [&]() {
969 Range ents;
971 m_field.get_moab().get_entities_by_handle(m->meshset, ents, true),
972 "Can not get entities for block meshset");
973 return ents;
974 };
975
976 double young_modulus = block_data[0];
977 double poisson_ratio = block_data[1];
978 double bulk_modulus_K = young_modulus / (3 * (1 - 2 * poisson_ratio));
979 double shear_modulus_G = young_modulus / (2 * (1 + poisson_ratio));
980
981 MOFEM_TAG_AND_LOG("WORLD", sev, "MatBlock")
982 << "E = " << young_modulus << " nu = " << poisson_ratio;
983
984 blockData.push_back(
985 {bulk_modulus_K, shear_modulus_G, get_block_ents()});
986 }
987 MOFEM_LOG_CHANNEL("WORLD");
989 }
990
991 MoFEMErrorCode getMatDPtr(boost::shared_ptr<MatrixDouble> mat_D_ptr,
992 double bulk_modulus_K, double shear_modulus_G,
993 PetscBool is_plane_strain) {
995 //! [Calculate elasticity tensor]
996 auto set_material_stiffness = [&]() {
997 FTensor::Index<'i', DIM> i;
998 FTensor::Index<'j', DIM> j;
999 FTensor::Index<'k', DIM> k;
1000 FTensor::Index<'l', DIM> l;
1002 double A = (SPACE_DIM == 2 && !is_plane_strain)
1003 ? 2 * shear_modulus_G /
1004 (bulk_modulus_K + (4. / 3.) * shear_modulus_G)
1005 : 1;
1006 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*mat_D_ptr);
1007 t_D(i, j, k, l) =
1008 2 * shear_modulus_G * ((t_kd(i, k) ^ t_kd(j, l)) / 4.) +
1009 A * (bulk_modulus_K - (2. / 3.) * shear_modulus_G) * t_kd(i, j) *
1010 t_kd(k, l);
1011 };
1012 //! [Calculate elasticity tensor]
1013 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1014 mat_D_ptr->resize(size_symm * size_symm, 1);
1015 set_material_stiffness();
1017 }
1018 };
1019
1020 double E = young_modulus;
1021 double nu = poisson_ratio;
1022
1023 PetscOptionsBegin(PETSC_COMM_WORLD, "", "", "none");
1024 CHKERR PetscOptionsScalar("-young_modulus", "Young modulus", "", E, &E,
1025 PETSC_NULLPTR);
1026 CHKERR PetscOptionsScalar("-poisson_ratio", "poisson ratio", "", nu, &nu,
1027 PETSC_NULLPTR);
1028 PetscOptionsEnd();
1029
1030 double bulk_modulus_K = E / (3 * (1 - 2 * nu));
1031 double shear_modulus_G = E / (2 * (1 + nu));
1032 pip.push_back(new OpMatBlocks(
1033 mat_D_Ptr, bulk_modulus_K, shear_modulus_G, m_field, sev,
1034
1035 // Get blockset using regular expression
1036 m_field.getInterface<MeshsetsManager>()->getCubitMeshsetPtr(std::regex(
1037
1038 (boost::format("%s(.*)") % block_name).str()
1039
1040 )),
1041 scale, plane_strain_flag
1042
1043 ));
1044
1046}
1047
1048template <int DIM, IntegrationType I, typename DomainEleOp>
1050 MoFEM::Interface &m_field,
1051 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1052 std::string field_name, std::string block_name, Sev sev, double scale = 1) {
1053
1054 auto common_ptr = boost::make_shared<HenckyOps::CommonData>();
1055 common_ptr->matDPtr = boost::make_shared<MatrixDouble>();
1056 common_ptr->matGradPtr = boost::make_shared<MatrixDouble>();
1057
1058 CHK_THROW_MESSAGE(addMatBlockOps<DIM>(m_field, pip, block_name,
1059 common_ptr->matDPtr, sev, scale),
1060 "addMatBlockOps");
1061
1062 using H = HenckyIntegrators<DomainEleOp>;
1063
1064 pip.push_back(new OpCalculateVectorFieldGradient<DIM, DIM>(
1065 field_name, common_ptr->matGradPtr));
1066 pip.push_back(new typename H::template OpCalculateEigenVals<DIM, I>(
1067 field_name, common_ptr));
1068 pip.push_back(
1069 new typename H::template OpCalculateLogC<DIM, I>(field_name, common_ptr));
1070 pip.push_back(new typename H::template OpCalculateLogC_dC<DIM, I>(
1071 field_name, common_ptr));
1072 // Assumes constant D matrix per entity
1073 pip.push_back(new typename H::template OpCalculateHenckyStress<DIM, I, 0>(
1074 field_name, common_ptr));
1075 pip.push_back(new typename H::template OpCalculatePiolaStress<DIM, I, 0>(
1076 field_name, common_ptr));
1077
1078 return common_ptr;
1079}
1080
1081template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
1083 MoFEM::Interface &m_field,
1084 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1085 std::string field_name, boost::shared_ptr<HenckyOps::CommonData> common_ptr,
1086 Sev sev) {
1088
1089 using B = typename FormsIntegrators<DomainEleOp>::template Assembly<
1090 A>::template LinearForm<I>;
1091 using OpInternalForcePiola =
1092 typename B::template OpGradTimesTensor<1, DIM, DIM>;
1093 pip.push_back(
1094 new OpInternalForcePiola("U", common_ptr->getMatFirstPiolaStress()));
1095
1097}
1098
1099template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
1101 MoFEM::Interface &m_field,
1102 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1103 std::string field_name, std::string block_name, Sev sev, double scale = 1) {
1105
1106 auto common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
1107 m_field, pip, field_name, block_name, sev, scale);
1108 CHKERR opFactoryDomainRhs<DIM, A, I, DomainEleOp>(m_field, pip, field_name,
1109 common_ptr, sev);
1110
1112}
1113
1114template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
1116 MoFEM::Interface &m_field,
1117 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1118 std::string field_name, boost::shared_ptr<HenckyOps::CommonData> common_ptr,
1119 Sev sev) {
1121
1122 using B = typename FormsIntegrators<DomainEleOp>::template Assembly<
1123 A>::template BiLinearForm<I>;
1124 using OpKPiola = typename B::template OpGradTensorGrad<1, DIM, DIM, 1>;
1125
1126 using H = HenckyIntegrators<DomainEleOp>;
1127 // Assumes constant D matrix per entity
1128 pip.push_back(new typename H::template OpHenckyTangent<DIM, I, 0>(
1129 field_name, common_ptr));
1130 pip.push_back(
1131 new OpKPiola(field_name, field_name, common_ptr->getMatTangent()));
1132
1134}
1135
1136template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
1138 MoFEM::Interface &m_field,
1139 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1140 std::string field_name, std::string block_name, Sev sev, double scale = 1) {
1142
1143 auto common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
1144 m_field, pip, field_name, block_name, sev, scale);
1145 CHKERR opFactoryDomainLhs<DIM, A, I, DomainEleOp>(m_field, pip, field_name,
1146 common_ptr, sev);
1147
1149}
1150} // namespace HenckyOps
1151
1152#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:32
auto sort_eigen_vals(FTensor::Tensor1< double, DIM > &eig, FTensor::Tensor2< double, DIM, DIM > &eigen_vec)
Definition HenckyOps.hpp:50
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)
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)
auto is_eq(const double &a, const double &b)
Definition HenckyOps.hpp:28
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:25
boost::shared_ptr< MatrixDouble > matLogCPlastic
Definition HenckyOps.hpp:22
MatrixDouble matCdF
Definition HenckyOps.hpp:98
MatrixDouble matHenckyStress
Definition HenckyOps.hpp:30
MatrixDouble matLogCdC
Definition HenckyOps.hpp:27
MatrixDouble matEigVal
Definition HenckyOps.hpp:24
MatrixDouble matFirstPiolaStress
Definition HenckyOps.hpp:28
boost::shared_ptr< MatrixDouble > matDPtr
Definition HenckyOps.hpp:21
MatrixDouble matSecondPiolaStress
Definition HenckyOps.hpp:29
MatrixDouble matLogC
Definition HenckyOps.hpp:26
MatrixDouble matTangent
Definition HenckyOps.hpp:31
boost::shared_ptr< MatrixDouble > matGradPtr
Definition HenckyOps.hpp:20
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