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) {
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));
54 std::max(std::max(std::abs(eig(0)), std::abs(eig(1))), std::abs(eig(2)));
56 int i = 0,
j = 1,
k = 2;
58 if (
is_eq(eig(0), eig(1))) {
62 }
else if (
is_eq(eig(0), eig(2))) {
66 }
else if (
is_eq(eig(1), eig(2))) {
73 eigen_vec(
i, 0), eigen_vec(
i, 1), eigen_vec(
i, 2),
75 eigen_vec(
j, 0), eigen_vec(
j, 1), eigen_vec(
j, 2),
77 eigen_vec(
k, 0), eigen_vec(
k, 1), eigen_vec(
k, 2)};
85 eigen_vec(
i,
j) = eigen_vec_c(
i,
j);
89struct CommonData :
public boost::enable_shared_from_this<CommonData> {
91 boost::shared_ptr<MatrixDouble>
matDPtr;
105 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
110 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
115 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &
matLogC);
119 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &
matTangent);
123template <
int DIM, IntegrationType I,
typename DomainEleOp>
124struct OpCalculateEigenValsImpl;
126template <
int DIM, IntegrationType I,
typename DomainEleOp>
127struct OpCalculateLogCImpl;
129template <
int DIM, IntegrationType I,
typename DomainEleOp>
130struct OpCalculateLogC_dCImpl;
132template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
133struct OpCalculateHenckyStressImpl;
135template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
136struct OpCalculateHenckyThermalStressImpl;
138template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
139struct OpCalculateHenckyPlasticStressImpl;
141template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
144template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
147template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
150template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
153template <
int DIM,
typename DomainEleOp>
157 boost::shared_ptr<CommonData> common_data)
159 commonDataPtr(common_data) {
160 std::fill(&DomainEleOp::doEntities[MBEDGE],
161 &DomainEleOp::doEntities[MBMAXTYPE],
false);
173 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
175 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
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);
182 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
192 for (
int ii = 0; ii != DIM; ii++)
193 for (
int jj = 0; jj != DIM; jj++)
194 eigen_vec(ii, jj) = C(ii, jj);
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));
201 auto nb_uniq = getUniqNb(eig);
202 if constexpr (DIM == 3) {
204 sortEigenVals(eig, eigen_vec);
208 t_eig_val(
i) = eig(
i);
209 t_eig_vec(
i,
j) = eigen_vec(
i,
j);
220 boost::shared_ptr<CommonData> commonDataPtr;
223template <
int DIM,
typename DomainEleOp>
227 boost::shared_ptr<CommonData> common_data)
229 commonDataPtr(common_data) {
230 std::fill(&DomainEleOp::doEntities[MBEDGE],
231 &DomainEleOp::doEntities[MBMAXTYPE],
false);
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);
245 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
246 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
248 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
250 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
261 boost::shared_ptr<CommonData> commonDataPtr;
264template <
int DIM,
typename DomainEleOp>
268 boost::shared_ptr<CommonData> common_data)
270 commonDataPtr(common_data) {
271 std::fill(&DomainEleOp::doEntities[MBEDGE],
272 &DomainEleOp::doEntities[MBMAXTYPE],
false);
283 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
284 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
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);
290 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
292 auto nb_uniq = get_uniq_nb<DIM>(&t_eig_val(0));
293 t_logC_dC(
i,
j,
k,
l) =
295 nb_uniq)(
i,
j,
k,
l);
306 boost::shared_ptr<CommonData> commonDataPtr;
309template <
int DIM,
typename DomainEleOp,
int S>
310struct OpCalculateHenckyStressImpl<DIM, GAUSS,
DomainEleOp, S>
314 boost::shared_ptr<CommonData> common_data)
316 commonDataPtr(common_data) {
317 std::fill(&DomainEleOp::doEntities[MBEDGE],
318 &DomainEleOp::doEntities[MBMAXTYPE],
false);
330 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
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);
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);
351 boost::shared_ptr<CommonData> commonDataPtr;
354template <
int DIM,
typename DomainEleOp,
int S>
355struct OpCalculateHenckyThermalStressImpl<DIM, GAUSS,
DomainEleOp, S>
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)
364 commonDataPtr(common_data), coeffExpansionPtr(coeff_expansion_ptr),
365 refTempPtr(ref_temp_ptr) {
366 std::fill(&DomainEleOp::doEntities[MBEDGE],
367 &DomainEleOp::doEntities[MBMAXTYPE],
false);
381 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
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);
395 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
396 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
397 auto t_temp = getFTensor0FromVec(*tempPtr);
400 t_coeff_exp(
i,
j) = 0;
402 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
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)));
410 t_T(
i,
j) = t_D(
i,
j,
k,
l) *
411 (t_logC(
k,
l) - t_coeff_exp(
k,
l) * (t_temp - (*refTempPtr)));
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);
431 boost::shared_ptr<CommonData> commonDataPtr;
432 boost::shared_ptr<VectorDouble> tempPtr;
433 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
434 boost::shared_ptr<double> refTempPtr;
437template <
int DIM,
typename DomainEleOp,
int S>
438struct OpCalculateHenckyPlasticStressImpl<DIM, GAUSS,
DomainEleOp, S>
442 boost::shared_ptr<CommonData> common_data,
443 boost::shared_ptr<MatrixDouble> mat_D_ptr,
444 const double scale = 1)
446 scaleStress(
scale), matDPtr(mat_D_ptr) {
447 std::fill(&DomainEleOp::doEntities[MBEDGE],
448 &DomainEleOp::doEntities[MBMAXTYPE],
false);
450 matLogCPlastic = commonDataPtr->matLogCPlastic;
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);
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;
484 boost::shared_ptr<CommonData> commonDataPtr;
485 boost::shared_ptr<MatrixDouble> matDPtr;
486 boost::shared_ptr<MatrixDouble> matLogCPlastic;
487 const double scaleStress;
490template <
int DIM,
typename DomainEleOp,
int S>
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)
500 commonDataPtr(common_data), coeffExpansionPtr(coeff_expansion_ptr),
501 refTempPtr(ref_temp_ptr) {
502 std::fill(&DomainEleOp::doEntities[MBEDGE],
503 &DomainEleOp::doEntities[MBMAXTYPE],
false);
505 matLogCPlastic = commonDataPtr->matLogCPlastic;
519 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
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);
534 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
535 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
536 auto t_temp = getFTensor0FromVec(*tempPtr);
539 t_coeff_exp(
i,
j) = 0;
541 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
544 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
545#ifdef HENCKY_SMALL_STRAIN
547 t_D(
i,
j,
k,
l) * (t_grad(
k,
l) - t_logCPlastic(
k,
l) -
548 t_coeff_exp(
k,
l) * (t_temp - (*refTempPtr)));
551 t_D(
i,
j,
k,
l) * (t_logC(
k,
l) - t_logCPlastic(
k,
l) -
552 t_coeff_exp(
k,
l) * (t_temp - (*refTempPtr)));
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);
579template <
int DIM,
typename DomainEleOp,
int S>
584 boost::shared_ptr<CommonData> common_data)
586 commonDataPtr(common_data) {
587 std::fill(&DomainEleOp::doEntities[MBEDGE],
588 &DomainEleOp::doEntities[MBMAXTYPE],
false);
602 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
603#ifdef HENCKY_SMALL_STRAIN
605 getFTensor4DdgFromMat<DIM, DIM, S,
606 DataLayoutTraits<DataLayout::GaussByCoeffs>>(
607 *commonDataPtr->matDPtr);
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);
617 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
618 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
620 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
622#ifdef HENCKY_SMALL_STRAIN
623 t_P(
i,
j) = t_D(
i,
j,
k,
l) * t_grad(
k,
l);
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);
637#ifdef HENCKY_SMALL_STRAIN
646 boost::shared_ptr<CommonData> commonDataPtr;
649template <
int DIM,
typename DomainEleOp,
int S>
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);
661 matDPtr = commonDataPtr->matDPtr;
678 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
679 commonDataPtr->matTangent.resize(nb_gauss_pts, DIM * DIM * DIM * DIM);
681 getFTensor4FromMat<DIM, DIM, DIM, DIM>(commonDataPtr->matTangent);
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);
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);
694 getFTensor4FromMat<DIM, DIM, DIM, DIM>(commonDataPtr->matCdF);
696 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
698#ifdef HENCKY_SMALL_STRAIN
699 dP_dF(
i,
j,
k,
l) = t_D(
i,
j,
k,
l);
706 auto nb_uniq = get_uniq_nb<DIM>(&t_eig_val(0));
714 P_D_P_plus_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;
720 t_F(
i,
k) * (P_D_P_plus_TL(
k,
j, o, p) * dC_dF(o, p,
m,
n));
740 boost::shared_ptr<CommonData> commonDataPtr;
741 boost::shared_ptr<MatrixDouble> matDPtr;
744template <
int DIM,
typename AssemblyDomainEleOp,
int S>
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);
752 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
753 EntitiesFieldData::EntData &col_data);
756 boost::shared_ptr<CommonData> elasticCommonDataPtr;
757 boost::shared_ptr<VectorDouble> coeffExpansionPtr;
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)
768 elasticCommonDataPtr(elastic_common_data_ptr),
769 coeffExpansionPtr(coeff_expansion_ptr) {
773template <
int DIM,
typename AssemblyDomainEleOp,
int S>
775OpCalculateHenckyThermalStressdTImpl<DIM, GAUSS, AssemblyDomainEleOp, S>::
776 iNtegrate(EntitiesFieldData::EntData &row_data,
777 EntitiesFieldData::EntData &col_data) {
780 auto &locMat = AssemblyDomainEleOp::locMat;
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();
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);
792 getFTensor2FromMat<DIM, DIM>(*(elasticCommonDataPtr->matGradPtr));
794 getFTensor4DdgFromMat<DIM, DIM>(elasticCommonDataPtr->matLogCdC);
807 t_coeff_exp(
i,
j) = 0;
809 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
812 t_eigen_strain(
i,
j) = t_D(
i,
j,
k,
l) * t_coeff_exp(
k,
l);
814 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
818 double alpha = this->getMeasure() * t_w;
820 for (; rr != AssemblyDomainEleOp::nbRows / DIM; ++rr) {
823 DataLayoutTraits<DataLayout::CoeffsByGauss>>(
825 auto t_col_base = col_data.getFTensor0N(gg, 0);
826 for (
auto cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
827#ifdef HENCKY_SMALL_STRAIN
829 (t_row_diff_base(
j) * t_eigen_strain(
i,
j)) * (t_col_base * alpha);
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);
843 for (; rr != nb_row_base_functions; ++rr)
855template <
typename DomainEleOp>
struct HenckyIntegrators {
856 template <
int DIM, IntegrationType I>
859 template <
int DIM, IntegrationType I>
862 template <
int DIM, IntegrationType I>
865 template <
int DIM, IntegrationType I,
int S>
869 template <
int DIM, IntegrationType I,
int S>
873 template <
int DIM, IntegrationType I,
int S>
877 template <
int DIM, IntegrationType I,
int S>
881 template <
int DIM, IntegrationType I,
int S>
885 template <
int DIM, IntegrationType I,
int S>
888 template <
int DIM, IntegrationType I,
typename AssemblyDomainEleOp,
int S>
896 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
897 std::string block_name,
898 boost::shared_ptr<MatrixDouble> mat_D_Ptr, Sev sev,
902 PetscBool plane_strain_flag = PETSC_FALSE;
903 CHKERR PetscOptionsGetBool(PETSC_NULLPTR,
"",
"-plane_strain",
904 &plane_strain_flag, PETSC_NULLPTR);
909 std::vector<const CubitMeshSets *> meshset_vec_ptr,
910 double scale, PetscBool plane_strain_flag)
914 planeStrainFlag(plane_strain_flag) {
916 "Can not get data from block");
919 MoFEMErrorCode doWork(
int side, EntityType
type,
920 EntitiesFieldData::EntData &data) {
923 for (
auto &b : blockData) {
925 if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
926 CHKERR getMatDPtr(matDPtr, b.bulkModulusK * scaleYoungModulus,
927 b.shearModulusG * scaleYoungModulus,
933 CHKERR getMatDPtr(matDPtr, bulkModulusKDefault * scaleYoungModulus,
934 shearModulusGDefault * scaleYoungModulus,
940 boost::shared_ptr<MatrixDouble> matDPtr;
941 const double scaleYoungModulus;
942 const PetscBool planeStrainFlag;
946 double shearModulusG;
950 double bulkModulusKDefault;
951 double shearModulusGDefault;
952 std::vector<BlockData> blockData;
956 std::vector<const CubitMeshSets *> meshset_vec_ptr,
960 for (
auto m : meshset_vec_ptr) {
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");
968 auto get_block_ents = [&]() {
971 m_field.
get_moab().get_entities_by_handle(
m->meshset, ents,
true),
972 "Can not get entities for block meshset");
991 MoFEMErrorCode getMatDPtr(boost::shared_ptr<MatrixDouble> mat_D_ptr,
996 auto set_material_stiffness = [&]() {
1006 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*mat_D_ptr);
1013 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1015 set_material_stiffness();
1023 PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"",
"none");
1024 CHKERR PetscOptionsScalar(
"-young_modulus",
"Young modulus",
"",
E, &
E,
1026 CHKERR PetscOptionsScalar(
"-poisson_ratio",
"poisson ratio",
"", nu, &nu,
1032 pip.push_back(
new OpMatBlocks(
1036 m_field.
getInterface<MeshsetsManager>()->getCubitMeshsetPtr(std::regex(
1038 (boost::format(
"%s(.*)") % block_name).str()
1041 scale, plane_strain_flag
1048template <
int DIM, IntegrationType I,
typename DomainEleOp>
1051 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1052 std::string
field_name, std::string block_name, Sev sev,
double scale = 1) {
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>();
1059 common_ptr->matDPtr, sev,
scale),
1062 using H = HenckyIntegrators<DomainEleOp>;
1064 pip.push_back(
new OpCalculateVectorFieldGradient<DIM, DIM>(
1066 pip.push_back(
new typename H::template OpCalculateEigenVals<DIM, I>(
1069 new typename H::template OpCalculateLogC<DIM, I>(
field_name, common_ptr));
1070 pip.push_back(
new typename H::template OpCalculateLogC_dC<DIM, I>(
1073 pip.push_back(
new typename H::template OpCalculateHenckyStress<DIM, I, 0>(
1075 pip.push_back(
new typename H::template OpCalculatePiolaStress<DIM, I, 0>(
1081template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
1084 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1085 std::string
field_name, boost::shared_ptr<HenckyOps::CommonData> common_ptr,
1089 using B =
typename FormsIntegrators<DomainEleOp>::template Assembly<
1099template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
1102 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1103 std::string
field_name, std::string block_name, Sev sev,
double scale = 1) {
1106 auto common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
1108 CHKERR opFactoryDomainRhs<DIM, A, I, DomainEleOp>(m_field, pip,
field_name,
1114template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
1117 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1118 std::string
field_name, boost::shared_ptr<HenckyOps::CommonData> common_ptr,
1122 using B =
typename FormsIntegrators<DomainEleOp>::template Assembly<
1124 using OpKPiola =
typename B::template OpGradTensorGrad<1, DIM, DIM, 1>;
1126 using H = HenckyIntegrators<DomainEleOp>;
1128 pip.push_back(
new typename H::template OpHenckyTangent<DIM, I, 0>(
1136template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
1139 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1140 std::string
field_name, std::string block_name, Sev sev,
double scale = 1) {
1143 auto common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
1145 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)
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)
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.