8#ifndef __HENCKY_OPS_HPP__
9#define __HENCKY_OPS_HPP__
13constexpr double eps = std::numeric_limits<float>::epsilon();
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); };
20 static inline auto check(
const double &
a,
const double &b) {
28inline auto is_eq(
const double &
a,
const double &b) {
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));
42 std::conditional_t<S == 1, DataLayoutTraits<DataLayout::CoeffsByGauss>,
43 DataLayoutTraits<DataLayout::GaussByCoeffs>>;
50 std::max(std::max(std::abs(eig(0)), std::abs(eig(1))), std::abs(eig(2)));
52 int i = 0,
j = 1,
k = 2;
54 if (
is_eq(eig(0), eig(1))) {
58 }
else if (
is_eq(eig(0), eig(2))) {
62 }
else if (
is_eq(eig(1), eig(2))) {
69 eigen_vec(
i, 0), eigen_vec(
i, 1), eigen_vec(
i, 2),
71 eigen_vec(
j, 0), eigen_vec(
j, 1), eigen_vec(
j, 2),
73 eigen_vec(
k, 0), eigen_vec(
k, 1), eigen_vec(
k, 2)};
81 eigen_vec(
i,
j) = eigen_vec_c(
i,
j);
85struct CommonData :
public boost::enable_shared_from_this<CommonData> {
87 boost::shared_ptr<MatrixDouble>
matDPtr;
101 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
106 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
111 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &
matLogC);
115 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &
matTangent);
119template <
int DIM, IntegrationType I,
typename DomainEleOp>
120struct OpCalculateEigenValsImpl;
122template <
int DIM, IntegrationType I,
typename DomainEleOp>
123struct OpCalculateLogCImpl;
125template <
int DIM, IntegrationType I,
typename DomainEleOp>
126struct OpCalculateLogC_dCImpl;
128template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
129struct OpCalculateHenckyStressImpl;
131template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
132struct OpCalculateHenckyThermalStressImpl;
134template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
135struct OpCalculateHenckyPlasticStressImpl;
137template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
140template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
143template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
146template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
149template <
int DIM,
typename DomainEleOp>
153 boost::shared_ptr<CommonData> common_data)
155 commonDataPtr(common_data) {
156 std::fill(&DomainEleOp::doEntities[MBEDGE],
157 &DomainEleOp::doEntities[MBMAXTYPE],
false);
169 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
171 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
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);
178 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
188 for (
int ii = 0; ii != DIM; ii++)
189 for (
int jj = 0; jj != DIM; jj++)
190 eigen_vec(ii, jj) = C(ii, jj);
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));
197 auto nb_uniq = get_uniq_nb<DIM>(&eig(0));
198 if constexpr (DIM == 3) {
200 sort_eigen_vals<DIM>(eig, eigen_vec);
204 t_eig_val(
i) = eig(
i);
205 t_eig_vec(
i,
j) = eigen_vec(
i,
j);
216 boost::shared_ptr<CommonData> commonDataPtr;
219template <
int DIM,
typename DomainEleOp>
223 boost::shared_ptr<CommonData> common_data)
225 commonDataPtr(common_data) {
226 std::fill(&DomainEleOp::doEntities[MBEDGE],
227 &DomainEleOp::doEntities[MBMAXTYPE],
false);
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);
241 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
242 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
244 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
246 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
257 boost::shared_ptr<CommonData> commonDataPtr;
260template <
int DIM,
typename DomainEleOp>
264 boost::shared_ptr<CommonData> common_data)
266 commonDataPtr(common_data) {
267 std::fill(&DomainEleOp::doEntities[MBEDGE],
268 &DomainEleOp::doEntities[MBMAXTYPE],
false);
279 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
280 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
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);
286 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
288 auto nb_uniq = get_uniq_nb<DIM>(&t_eig_val(0));
289 t_logC_dC(
i,
j,
k,
l) =
291 nb_uniq)(
i,
j,
k,
l);
302 boost::shared_ptr<CommonData> commonDataPtr;
305template <
int DIM,
typename DomainEleOp,
int S>
306struct OpCalculateHenckyStressImpl<DIM, GAUSS,
DomainEleOp, S>
310 boost::shared_ptr<CommonData> common_data)
312 commonDataPtr(common_data) {
313 std::fill(&DomainEleOp::doEntities[MBEDGE],
314 &DomainEleOp::doEntities[MBMAXTYPE],
false);
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);
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);
345 boost::shared_ptr<CommonData> commonDataPtr;
348template <
int DIM,
typename DomainEleOp,
int S>
349struct OpCalculateHenckyThermalStressImpl<DIM, GAUSS,
DomainEleOp, S>
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)
358 commonDataPtr(common_data), coeffExpansionPtr(coeff_expansion_ptr),
359 refTempPtr(ref_temp_ptr) {
360 std::fill(&DomainEleOp::doEntities[MBEDGE],
361 &DomainEleOp::doEntities[MBMAXTYPE],
false);
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);
387 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
388 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
389 auto t_temp = getFTensor0FromVec(*tempPtr);
392 t_coeff_exp(
i,
j) = 0;
394 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
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)));
402 t_T(
i,
j) = t_D(
i,
j,
k,
l) *
403 (t_logC(
k,
l) - t_coeff_exp(
k,
l) * (t_temp - (*refTempPtr)));
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);
423 boost::shared_ptr<CommonData> commonDataPtr;
424 boost::shared_ptr<VectorDouble> tempPtr;
425 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
426 boost::shared_ptr<double> refTempPtr;
429template <
int DIM,
typename DomainEleOp,
int S>
430struct OpCalculateHenckyPlasticStressImpl<DIM, GAUSS,
DomainEleOp, S>
434 boost::shared_ptr<CommonData> common_data,
435 boost::shared_ptr<MatrixDouble> mat_D_ptr,
436 const double scale = 1)
438 scaleStress(
scale), matDPtr(mat_D_ptr) {
439 std::fill(&DomainEleOp::doEntities[MBEDGE],
440 &DomainEleOp::doEntities[MBMAXTYPE],
false);
442 matLogCPlastic = commonDataPtr->matLogCPlastic;
454 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
455 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S, HenckyTensorLayout<S>>(
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);
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;
476 boost::shared_ptr<CommonData> commonDataPtr;
477 boost::shared_ptr<MatrixDouble> matDPtr;
478 boost::shared_ptr<MatrixDouble> matLogCPlastic;
479 const double scaleStress;
482template <
int DIM,
typename DomainEleOp,
int S>
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)
492 commonDataPtr(common_data), coeffExpansionPtr(coeff_expansion_ptr),
493 refTempPtr(ref_temp_ptr) {
494 std::fill(&DomainEleOp::doEntities[MBEDGE],
495 &DomainEleOp::doEntities[MBMAXTYPE],
false);
497 matLogCPlastic = commonDataPtr->matLogCPlastic;
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);
524 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
525 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
526 auto t_temp = getFTensor0FromVec(*tempPtr);
529 t_coeff_exp(
i,
j) = 0;
531 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
534 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
535#ifdef HENCKY_SMALL_STRAIN
537 t_D(
i,
j,
k,
l) * (t_grad(
k,
l) - t_logCPlastic(
k,
l) -
538 t_coeff_exp(
k,
l) * (t_temp - (*refTempPtr)));
541 t_D(
i,
j,
k,
l) * (t_logC(
k,
l) - t_logCPlastic(
k,
l) -
542 t_coeff_exp(
k,
l) * (t_temp - (*refTempPtr)));
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);
569template <
int DIM,
typename DomainEleOp,
int S>
574 boost::shared_ptr<CommonData> common_data)
576 commonDataPtr(common_data) {
577 std::fill(&DomainEleOp::doEntities[MBEDGE],
578 &DomainEleOp::doEntities[MBMAXTYPE],
false);
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);
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);
605 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
606 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
608 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
610#ifdef HENCKY_SMALL_STRAIN
611 t_P(
i,
j) = t_D(
i,
j,
k,
l) * t_grad(
k,
l);
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);
625#ifdef HENCKY_SMALL_STRAIN
634 boost::shared_ptr<CommonData> commonDataPtr;
637template <
int DIM,
typename DomainEleOp,
int S>
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);
649 matDPtr = commonDataPtr->matDPtr;
666 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
667 commonDataPtr->matTangent.resize(nb_gauss_pts, DIM * DIM * DIM * DIM);
669 getFTensor4FromMat<DIM, DIM, DIM, DIM>(commonDataPtr->matTangent);
671 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S, HenckyTensorLayout<S>>(
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);
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);
682 getFTensor4FromMat<DIM, DIM, DIM, DIM>(commonDataPtr->matCdF);
684 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
686#ifdef HENCKY_SMALL_STRAIN
687 dP_dF(
i,
j,
k,
l) = t_D(
i,
j,
k,
l);
694 auto nb_uniq = get_uniq_nb<DIM>(&t_eig_val(0));
702 P_D_P_plus_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;
708 t_F(
i,
k) * (P_D_P_plus_TL(
k,
j, o, p) * dC_dF(o, p,
m,
n));
728 boost::shared_ptr<CommonData> commonDataPtr;
729 boost::shared_ptr<MatrixDouble> matDPtr;
732template <
int DIM,
typename AssemblyDomainEleOp,
int S>
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);
740 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
741 EntitiesFieldData::EntData &col_data);
744 boost::shared_ptr<CommonData> elasticCommonDataPtr;
745 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
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)
756 elasticCommonDataPtr(elastic_common_data_ptr),
757 coeffExpansionPtr(coeff_expansion_ptr) {
761template <
int DIM,
typename AssemblyDomainEleOp,
int S>
763OpCalculateHenckyThermalStressdTImpl<DIM, GAUSS, AssemblyDomainEleOp, S>::
764 iNtegrate(EntitiesFieldData::EntData &row_data,
765 EntitiesFieldData::EntData &col_data) {
768 auto &locMat = AssemblyDomainEleOp::locMat;
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();
775 auto t_row_diff_base = row_data.getFTensor1DiffN<DIM>();
777 getFTensor4DdgFromMat<DIM, DIM, S, HenckyTensorLayout<S>>(
778 *elasticCommonDataPtr->matDPtr);
780 getFTensor2FromMat<DIM, DIM>(*(elasticCommonDataPtr->matGradPtr));
782 getFTensor4DdgFromMat<DIM, DIM>(elasticCommonDataPtr->matLogCdC);
795 t_coeff_exp(
i,
j) = 0;
797 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
800 t_eigen_strain(
i,
j) = t_D(
i,
j,
k,
l) * t_coeff_exp(
k,
l);
802 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
806 double alpha = this->getMeasure() * t_w;
808 for (; rr != AssemblyDomainEleOp::nbRows / DIM; ++rr) {
811 DataLayoutTraits<DataLayout::CoeffsByGauss>>(
813 auto t_col_base = col_data.getFTensor0N(gg, 0);
814 for (
auto cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
815#ifdef HENCKY_SMALL_STRAIN
817 (t_row_diff_base(
j) * t_eigen_strain(
i,
j)) * (t_col_base * alpha);
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);
831 for (; rr != nb_row_base_functions; ++rr)
843template <
typename DomainEleOp>
struct HenckyIntegrators {
844 template <
int DIM, IntegrationType I>
847 template <
int DIM, IntegrationType I>
850 template <
int DIM, IntegrationType I>
853 template <
int DIM, IntegrationType I,
int S>
857 template <
int DIM, IntegrationType I,
int S>
861 template <
int DIM, IntegrationType I,
int S>
865 template <
int DIM, IntegrationType I,
int S>
869 template <
int DIM, IntegrationType I,
int S>
873 template <
int DIM, IntegrationType I,
int S>
876 template <
int DIM, IntegrationType I,
typename AssemblyDomainEleOp,
int S>
884 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
885 std::string block_name,
886 boost::shared_ptr<MatrixDouble> mat_D_Ptr, Sev sev,
890 PetscBool plane_strain_flag = PETSC_FALSE;
891 CHKERR PetscOptionsGetBool(PETSC_NULLPTR,
"",
"-plane_strain",
892 &plane_strain_flag, PETSC_NULLPTR);
897 std::vector<const CubitMeshSets *> meshset_vec_ptr,
898 double scale, PetscBool plane_strain_flag)
902 planeStrainFlag(plane_strain_flag) {
904 "Can not get data from block");
907 MoFEMErrorCode doWork(
int side, EntityType
type,
908 EntitiesFieldData::EntData &data) {
911 for (
auto &b : blockData) {
913 if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
914 CHKERR getMatDPtr(matDPtr, b.bulkModulusK * scaleYoungModulus,
915 b.shearModulusG * scaleYoungModulus,
921 CHKERR getMatDPtr(matDPtr, bulkModulusKDefault * scaleYoungModulus,
922 shearModulusGDefault * scaleYoungModulus,
928 boost::shared_ptr<MatrixDouble> matDPtr;
929 const double scaleYoungModulus;
930 const PetscBool planeStrainFlag;
934 double shearModulusG;
938 double bulkModulusKDefault;
939 double shearModulusGDefault;
940 std::vector<BlockData> blockData;
944 std::vector<const CubitMeshSets *> meshset_vec_ptr,
948 for (
auto m : meshset_vec_ptr) {
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");
956 auto get_block_ents = [&]() {
959 m_field.
get_moab().get_entities_by_handle(
m->meshset, ents,
true),
960 "Can not get entities for block meshset");
979 MoFEMErrorCode getMatDPtr(boost::shared_ptr<MatrixDouble> mat_D_ptr,
984 auto set_material_stiffness = [&]() {
994 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*mat_D_ptr);
1001 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1003 set_material_stiffness();
1011 PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"",
"none");
1012 CHKERR PetscOptionsScalar(
"-young_modulus",
"Young modulus",
"",
E, &
E,
1014 CHKERR PetscOptionsScalar(
"-poisson_ratio",
"poisson ratio",
"", nu, &nu,
1020 pip.push_back(
new OpMatBlocks(
1024 m_field.
getInterface<MeshsetsManager>()->getCubitMeshsetPtr(std::regex(
1026 (boost::format(
"%s(.*)") % block_name).str()
1029 scale, plane_strain_flag
1036template <
int DIM, IntegrationType I,
typename DomainEleOp>
1039 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1040 std::string
field_name, std::string block_name, Sev sev,
double scale = 1) {
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>();
1047 common_ptr->matDPtr, sev,
scale),
1050 using H = HenckyIntegrators<DomainEleOp>;
1052 pip.push_back(
new OpCalculateVectorFieldGradient<DIM, DIM>(
1054 pip.push_back(
new typename H::template OpCalculateEigenVals<DIM, I>(
1057 new typename H::template OpCalculateLogC<DIM, I>(
field_name, common_ptr));
1058 pip.push_back(
new typename H::template OpCalculateLogC_dC<DIM, I>(
1061 pip.push_back(
new typename H::template OpCalculateHenckyStress<DIM, I, 0>(
1063 pip.push_back(
new typename H::template OpCalculatePiolaStress<DIM, I, 0>(
1069template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
1072 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1073 std::string
field_name, boost::shared_ptr<HenckyOps::CommonData> common_ptr,
1077 using B =
typename FormsIntegrators<DomainEleOp>::template Assembly<
1087template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
1090 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1091 std::string
field_name, std::string block_name, Sev sev,
double scale = 1) {
1094 auto common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
1096 CHKERR opFactoryDomainRhs<DIM, A, I, DomainEleOp>(m_field, pip,
field_name,
1102template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
1105 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1106 std::string
field_name, boost::shared_ptr<HenckyOps::CommonData> common_ptr,
1110 using B =
typename FormsIntegrators<DomainEleOp>::template Assembly<
1112 using OpKPiola =
typename B::template OpGradTensorGrad<1, DIM, DIM, 1>;
1114 using H = HenckyIntegrators<DomainEleOp>;
1116 pip.push_back(
new typename H::template OpHenckyTangent<DIM, I, 0>(
1124template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
1127 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1128 std::string
field_name, std::string block_name, Sev sev,
double scale = 1) {
1131 auto common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
1133 CHKERR opFactoryDomainLhs<DIM, A, I, DomainEleOp>(m_field, pip,
field_name,
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
DomainEle::UserDataOperator DomainEleOp
Finire element operator type.
Kronecker Delta class symmetric.
#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()
#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
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#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)
auto sort_eigen_vals(FTensor::Tensor1< double, DIM > &eig, FTensor::Tensor2< double, DIM, DIM > &eigen_vec)
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
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)
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 auto field_name
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpGradTimesTensor< 1, SPACE_DIM, SPACE_DIM > OpInternalForcePiola
PetscBool is_plane_strain
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpGradTensorGrad< 1, SPACE_DIM, SPACE_DIM, -1 > OpKPiola
[Only used for dynamics]
FTensor::Index< 'm', 3 > m
auto getMatHenckyStress()
boost::shared_ptr< MatrixDouble > matLogCPlastic
MatrixDouble matHenckyStress
auto getMatFirstPiolaStress()
MatrixDouble matFirstPiolaStress
boost::shared_ptr< MatrixDouble > matDPtr
MatrixDouble matSecondPiolaStress
boost::shared_ptr< MatrixDouble > matGradPtr
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)
boost::shared_ptr< MatrixDouble > matLogCPlastic
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
boost::shared_ptr< CommonData > commonDataPtr
boost::shared_ptr< VectorDouble > tempPtr
boost::shared_ptr< double > refTempPtr
boost::shared_ptr< VectorDouble > coeffExpansionPtr
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 auto check(const double &a, const double &b)
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.
double poisson_ratio
Poisson ratio.