8#ifndef __HENCKY_OPS_HPP__
9#define __HENCKY_OPS_HPP__
13const double eps = std::sqrt(std::numeric_limits<double>::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); };
19inline bool is_eq(
const double &
a,
const double &b) {
20 const auto abs_max = std::max(1., std::max(std::abs(
a), std::abs(b)));
21 return std::abs(
a - b) <=
eps * abs_max;
25 std::array<double, DIM> tmp;
26 std::copy(ptr, ptr + DIM, tmp.begin());
27 std::sort(tmp.begin(), tmp.end());
28 return std::distance(tmp.begin(), std::unique(tmp.begin(), tmp.end(),
is_eq));
34 static_assert(DIM == 3,
"sort_eigen_vals expects three eigenvalues");
36 int i = 0,
j = 1,
k = 2;
38 if (
is_eq(eig(0), eig(1))) {
42 }
else if (
is_eq(eig(0), eig(2))) {
46 }
else if (
is_eq(eig(1), eig(2))) {
53 eigen_vec(
i, 0), eigen_vec(
i, 1), eigen_vec(
i, 2),
55 eigen_vec(
j, 0), eigen_vec(
j, 1), eigen_vec(
j, 2),
57 eigen_vec(
k, 0), eigen_vec(
k, 1), eigen_vec(
k, 2)};
65 eigen_vec(
i,
j) = eigen_vec_c(
i,
j);
69struct CommonData :
public boost::enable_shared_from_this<CommonData> {
84 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
89 return boost::shared_ptr<MatrixDouble>(shared_from_this(),
94 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &
matLogC);
98 return boost::shared_ptr<MatrixDouble>(shared_from_this(), &
matTangent);
102template <
int DIM, IntegrationType I,
typename DomainEleOp>
105template <
int DIM, IntegrationType I,
typename DomainEleOp>
108template <
int DIM, IntegrationType I,
typename DomainEleOp>
111template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
114template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
117template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
120template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
123template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
126template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
129template <
int DIM, IntegrationType I,
typename DomainEleOp,
int S>
132template <
int DIM,
typename DomainEleOp>
136 boost::shared_ptr<CommonData> common_data)
138 commonDataPtr(common_data) {
139 std::fill(&DomainEleOp::doEntities[MBEDGE],
140 &DomainEleOp::doEntities[MBMAXTYPE],
false);
152 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
154 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
156 commonDataPtr->matEigVal.resize(nb_gauss_pts, DIM,
false);
157 commonDataPtr->matEigVec.resize(nb_gauss_pts, DIM * DIM,
false);
158 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
159 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
161 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
171 for (
int ii = 0; ii != DIM; ii++)
172 for (
int jj = 0; jj != DIM; jj++)
173 eigen_vec(ii, jj) = C(ii, jj);
175 CHKERR computeEigenValuesSymmetric(eigen_vec, eig);
176 for (
auto ii = 0; ii != DIM; ++ii)
177 eig(ii) = std::max(
eps, eig(ii));
180 auto nb_uniq = get_uniq_nb<DIM>(&eig(0));
181 if constexpr (DIM == 3) {
183 sort_eigen_vals<DIM>(eig, eigen_vec);
187 t_eig_val(
i) = eig(
i);
188 t_eig_vec(
i,
j) = eigen_vec(
i,
j);
191 auto nb_uniq_test = get_uniq_nb<DIM>(&t_eig_val(0));
192 if (nb_uniq_test != nb_uniq) {
194 "Inconsistent number of unique eigen values %ld != %ld",
195 nb_uniq, nb_uniq_test);
211template <
int DIM,
typename DomainEleOp>
215 boost::shared_ptr<CommonData> common_data)
217 commonDataPtr(common_data) {
218 std::fill(&DomainEleOp::doEntities[MBEDGE],
219 &DomainEleOp::doEntities[MBMAXTYPE],
false);
229 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
230 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
231 commonDataPtr->matLogC.resize(nb_gauss_pts,
size_symm,
false);
233 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
234 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
236 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
238 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
252template <
int DIM,
typename DomainEleOp>
256 boost::shared_ptr<CommonData> common_data)
258 commonDataPtr(common_data) {
259 std::fill(&DomainEleOp::doEntities[MBEDGE],
260 &DomainEleOp::doEntities[MBMAXTYPE],
false);
271 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
272 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
274 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
275 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
276 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
278 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
280 auto nb_uniq = get_uniq_nb<DIM>(&t_eig_val(0));
281 t_logC_dC(
i,
j,
k,
l) =
283 nb_uniq)(
i,
j,
k,
l);
297template <
int DIM,
typename DomainEleOp,
int S>
302 boost::shared_ptr<CommonData> common_data)
304 commonDataPtr(common_data) {
305 std::fill(&DomainEleOp::doEntities[MBEDGE],
306 &DomainEleOp::doEntities[MBMAXTYPE],
false);
318 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
319 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S>(*commonDataPtr->matDPtr);
320 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
321 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
322 commonDataPtr->matHenckyStress.resize(nb_gauss_pts,
size_symm,
false);
323 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
325 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
326 t_T(
i,
j) = t_D(
i,
j,
k,
l) * t_logC(
k,
l);
339template <
int DIM,
typename DomainEleOp,
int S>
344 const std::string
field_name, boost::shared_ptr<VectorDouble> temperature,
345 boost::shared_ptr<CommonData> common_data,
346 boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
347 boost::shared_ptr<double> ref_temp_ptr)
349 commonDataPtr(common_data), coeffExpansionPtr(coeff_expansion_ptr),
350 refTempPtr(ref_temp_ptr) {
351 std::fill(&DomainEleOp::doEntities[MBEDGE],
352 &DomainEleOp::doEntities[MBMAXTYPE],
false);
366 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
367 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S>(*commonDataPtr->matDPtr);
368 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
369 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
370 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
371 commonDataPtr->matHenckyStress.resize(nb_gauss_pts,
size_symm,
false);
372 commonDataPtr->matFirstPiolaStress.resize(nb_gauss_pts, DIM * DIM,
false);
373 commonDataPtr->matSecondPiolaStress.resize(nb_gauss_pts,
size_symm,
false);
374 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
375 auto t_P = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matFirstPiolaStress);
377 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
378 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
379 auto t_temp = getFTensor0FromVec(*tempPtr);
382 t_coeff_exp(
i,
j) = 0;
384 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
387 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
388#ifdef HENCKY_SMALL_STRAIN
389 t_P(
i,
j) = t_D(
i,
j,
k,
l) *
390 (t_grad(
k,
l) - t_coeff_exp(
k,
l) * (t_temp - (*refTempPtr)));
392 t_T(
i,
j) = t_D(
i,
j,
k,
l) *
393 (t_logC(
k,
l) - t_coeff_exp(
k,
l) * (t_temp - (*refTempPtr)));
396 t_S(
k,
l) = t_T(
i,
j) * t_logC_dC(
i,
j,
k,
l);
397 t_P(
i,
l) = t_F(
i,
k) * t_S(
k,
l);
419template <
int DIM,
typename DomainEleOp,
int S>
424 boost::shared_ptr<CommonData> common_data,
425 boost::shared_ptr<MatrixDouble> mat_D_ptr,
426 const double scale = 1)
428 scaleStress(
scale), matDPtr(mat_D_ptr) {
429 std::fill(&DomainEleOp::doEntities[MBEDGE],
430 &DomainEleOp::doEntities[MBMAXTYPE],
false);
432 matLogCPlastic = commonDataPtr->matLogCPlastic;
444 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
445 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S>(*matDPtr);
446 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
447 auto t_logCPlastic = getFTensor2SymmetricFromMat<DIM>(*matLogCPlastic);
448 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
449 commonDataPtr->matHenckyStress.resize(nb_gauss_pts,
size_symm,
false);
450 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
452 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
453 t_T(
i,
j) = t_D(
i,
j,
k,
l) * (t_logC(
k,
l) - t_logCPlastic(
k,
l));
454 t_T(
i,
j) /= scaleStress;
471template <
int DIM,
typename DomainEleOp,
int S>
476 boost::shared_ptr<CommonData> common_data)
478 commonDataPtr(common_data) {
479 std::fill(&DomainEleOp::doEntities[MBEDGE],
480 &DomainEleOp::doEntities[MBMAXTYPE],
false);
494 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
495#ifdef HENCKY_SMALL_STRAIN
496 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S>(*commonDataPtr->matDPtr);
498 auto t_logC = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matLogC);
499 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
500 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
501 commonDataPtr->matFirstPiolaStress.resize(nb_gauss_pts, DIM * DIM,
false);
502 commonDataPtr->matSecondPiolaStress.resize(nb_gauss_pts,
size_symm,
false);
503 auto t_P = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matFirstPiolaStress);
504 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
506 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
507 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
509 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
511#ifdef HENCKY_SMALL_STRAIN
512 t_P(
i,
j) = t_D(
i,
j,
k,
l) * t_grad(
k,
l);
516 t_S(
k,
l) = t_T(
i,
j) * t_logC_dC(
i,
j,
k,
l);
517 t_P(
i,
l) = t_F(
i,
k) * t_S(
k,
l);
526#ifdef HENCKY_SMALL_STRAIN
538template <
int DIM,
typename DomainEleOp,
int S>
541 boost::shared_ptr<CommonData> common_data,
542 boost::shared_ptr<MatrixDouble> mat_D_ptr =
nullptr)
544 commonDataPtr(common_data) {
545 std::fill(&DomainEleOp::doEntities[MBEDGE],
546 &DomainEleOp::doEntities[MBMAXTYPE],
false);
550 matDPtr = commonDataPtr->matDPtr;
567 const size_t nb_gauss_pts = DomainEleOp::getGaussPts().size2();
568 commonDataPtr->matTangent.resize(nb_gauss_pts, DIM * DIM * DIM * DIM);
570 getFTensor4FromMat<DIM, DIM, DIM, DIM>(commonDataPtr->matTangent);
572 auto t_D = getFTensor4DdgFromMat<DIM, DIM, S>(*matDPtr);
573 auto t_eig_val = getFTensor1FromMat<DIM>(commonDataPtr->matEigVal);
574 auto t_eig_vec = getFTensor2FromMat<DIM, DIM>(commonDataPtr->matEigVec);
575 auto t_T = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matHenckyStress);
577 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->matSecondPiolaStress);
578 auto t_grad = getFTensor2FromMat<DIM, DIM>(*(commonDataPtr->matGradPtr));
579 auto t_logC_dC = getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->matLogCdC);
581 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
583#ifdef HENCKY_SMALL_STRAIN
584 dP_dF(
i,
j,
k,
l) = t_D(
i,
j,
k,
l);
591 auto nb_uniq = get_uniq_nb<DIM>(&t_eig_val(0));
599 P_D_P_plus_TL(
i,
j,
k,
l) =
601 (t_logC_dC(
i,
j, o, p) * t_D(o, p,
m,
n)) * t_logC_dC(
m,
n,
k,
l);
602 P_D_P_plus_TL(
i,
j,
k,
l) *= 0.5;
605 t_F(
i,
k) * (P_D_P_plus_TL(
k,
j, o, p) * dC_dF(o, p,
m,
n));
628template <
int DIM,
typename AssemblyDomainEleOp,
int S>
632 const std::string row_field_name,
const std::string col_field_name,
633 boost::shared_ptr<CommonData> elastic_common_data_ptr,
634 boost::shared_ptr<VectorDouble> coeff_expansion_ptr);
636 MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
637 EntitiesFieldData::EntData &col_data);
644template <
int DIM,
typename AssemblyDomainEleOp,
int S>
647 const std::string row_field_name,
const std::string col_field_name,
648 boost::shared_ptr<CommonData> elastic_common_data_ptr,
649 boost::shared_ptr<VectorDouble> coeff_expansion_ptr)
652 elasticCommonDataPtr(elastic_common_data_ptr),
653 coeffExpansionPtr(coeff_expansion_ptr) {
657template <
int DIM,
typename AssemblyDomainEleOp,
int S>
660 iNtegrate(EntitiesFieldData::EntData &row_data,
661 EntitiesFieldData::EntData &col_data) {
664 auto &locMat = AssemblyDomainEleOp::locMat;
666 const auto nb_integration_pts = row_data.getN().size1();
667 const auto nb_row_base_functions = row_data.getN().size2();
668 auto t_w = this->getFTensor0IntegrationWeight();
671 auto t_row_diff_base = row_data.getFTensor1DiffN<DIM>();
672 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*elasticCommonDataPtr->matDPtr);
674 getFTensor2FromMat<DIM, DIM>(*(elasticCommonDataPtr->matGradPtr));
676 getFTensor4DdgFromMat<DIM, DIM>(elasticCommonDataPtr->matLogCdC);
689 t_coeff_exp(
i,
j) = 0;
691 t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
694 t_eigen_strain(
i,
j) = (t_D(
i,
j,
k,
l) * t_coeff_exp(
k,
l));
696 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
700 double alpha = this->getMeasure() * t_w;
702 for (; rr != AssemblyDomainEleOp::nbRows / DIM; ++rr) {
704 getFTensor1FromMat<DIM, 1,
705 DataLayoutTraits<DataLayout::CoeffsByGauss>>(
707 auto t_col_base = col_data.getFTensor0N(gg, 0);
708 for (
auto cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
709#ifdef HENCKY_SMALL_STRAIN
711 (t_row_diff_base(
j) * t_eigen_strain(
i,
j)) * (t_col_base * alpha);
713 t_mat(
i) -= (t_row_diff_base(
j) *
714 (t_F(
i, o) * ((t_D(
m,
n,
k,
l) * t_coeff_exp(
k,
l)) *
715 t_logC_dC(
m,
n, o,
j)))) *
716 (t_col_base * alpha);
725 for (; rr != nb_row_base_functions; ++rr)
738 template <
int DIM, IntegrationType I>
741 template <
int DIM, IntegrationType I>
744 template <
int DIM, IntegrationType I>
747 template <
int DIM, IntegrationType I,
int S>
751 template <
int DIM, IntegrationType I,
int S>
755 template <
int DIM, IntegrationType I,
int S>
759 template <
int DIM, IntegrationType I,
int S>
763 template <
int DIM, IntegrationType I,
int S>
766 template <
int DIM, IntegrationType I,
typename AssemblyDomainEleOp,
int S>
774 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
775 std::string block_name,
776 boost::shared_ptr<MatrixDouble> mat_D_Ptr, Sev sev,
780 PetscBool plane_strain_flag = PETSC_FALSE;
781 CHKERR PetscOptionsGetBool(PETSC_NULLPTR,
"",
"-plane_strain",
782 &plane_strain_flag, PETSC_NULLPTR);
787 std::vector<const CubitMeshSets *> meshset_vec_ptr,
788 double scale, PetscBool plane_strain_flag)
792 planeStrainFlag(plane_strain_flag) {
794 "Can not get data from block");
797 MoFEMErrorCode doWork(
int side, EntityType
type,
798 EntitiesFieldData::EntData &data) {
801 for (
auto &b : blockData) {
803 if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
804 CHKERR getMatDPtr(matDPtr, b.bulkModulusK * scaleYoungModulus,
805 b.shearModulusG * scaleYoungModulus,
811 CHKERR getMatDPtr(matDPtr, bulkModulusKDefault * scaleYoungModulus,
812 shearModulusGDefault * scaleYoungModulus,
818 boost::shared_ptr<MatrixDouble> matDPtr;
819 const double scaleYoungModulus;
820 const PetscBool planeStrainFlag;
824 double shearModulusG;
828 double bulkModulusKDefault;
829 double shearModulusGDefault;
830 std::vector<BlockData> blockData;
834 std::vector<const CubitMeshSets *> meshset_vec_ptr,
838 for (
auto m : meshset_vec_ptr) {
840 std::vector<double> block_data;
841 CHKERR m->getAttributes(block_data);
842 if (block_data.size() != 2) {
844 "Expected that block has two attribute");
846 auto get_block_ents = [&]() {
849 m_field.
get_moab().get_entities_by_handle(
m->meshset, ents,
true);
868 MoFEMErrorCode getMatDPtr(boost::shared_ptr<MatrixDouble> mat_D_ptr,
873 auto set_material_stiffness = [&]() {
883 auto t_D = getFTensor4DdgFromMat<DIM, DIM, 0>(*mat_D_ptr);
890 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
892 set_material_stiffness();
900 PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"",
"none");
901 CHKERR PetscOptionsScalar(
"-young_modulus",
"Young modulus",
"",
E, &
E,
903 CHKERR PetscOptionsScalar(
"-poisson_ratio",
"poisson ratio",
"", nu, &nu,
909 pip.push_back(
new OpMatBlocks(
913 m_field.
getInterface<MeshsetsManager>()->getCubitMeshsetPtr(std::regex(
915 (boost::format(
"%s(.*)") % block_name).str()
918 scale, plane_strain_flag
925template <
int DIM, IntegrationType I,
typename DomainEleOp>
928 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
929 std::string
field_name, std::string block_name, Sev sev,
double scale = 1) {
931 auto common_ptr = boost::make_shared<HenckyOps::CommonData>();
932 common_ptr->matDPtr = boost::make_shared<MatrixDouble>();
933 common_ptr->matGradPtr = boost::make_shared<MatrixDouble>();
936 common_ptr->matDPtr, sev,
scale),
941 pip.push_back(
new OpCalculateVectorFieldGradient<DIM, DIM>(
943 pip.push_back(
new typename H::template OpCalculateEigenVals<DIM, I>(
946 new typename H::template OpCalculateLogC<DIM, I>(
field_name, common_ptr));
947 pip.push_back(
new typename H::template OpCalculateLogC_dC<DIM, I>(
950 pip.push_back(
new typename H::template OpCalculateHenckyStress<DIM, I, 0>(
952 pip.push_back(
new typename H::template OpCalculatePiolaStress<DIM, I, 0>(
958template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
961 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
962 std::string
field_name, boost::shared_ptr<HenckyOps::CommonData> common_ptr,
966 using B =
typename FormsIntegrators<DomainEleOp>::template Assembly<
976template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
979 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
980 std::string
field_name, std::string block_name, Sev sev,
double scale = 1) {
983 auto common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
991template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
994 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
995 std::string
field_name, boost::shared_ptr<HenckyOps::CommonData> common_ptr,
999 using B =
typename FormsIntegrators<DomainEleOp>::template Assembly<
1001 using OpKPiola =
typename B::template OpGradTensorGrad<1, DIM, DIM, -1>;
1005 pip.push_back(
new typename H::template OpHenckyTangent<DIM, I, 0>(
1013template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
1016 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
1017 std::string
field_name, std::string block_name, Sev sev,
double scale = 1) {
1020 auto common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
1022 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 ...
@ 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)
bool is_eq(const double &a, const double &b)
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)
boost::shared_ptr< CommonData > commonDataPtr
boost::shared_ptr< MatrixDouble > matDPtr
boost::shared_ptr< MatrixDouble > matLogCPlastic
boost::shared_ptr< CommonData > commonDataPtr
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)
boost::shared_ptr< CommonData > commonDataPtr
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)
boost::shared_ptr< CommonData > commonDataPtr
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)
boost::shared_ptr< VectorDouble > coeffExpansionPtr
boost::shared_ptr< double > refTempPtr
boost::shared_ptr< VectorDouble > tempPtr
boost::shared_ptr< VectorDouble > coeffExpansionPtr
boost::shared_ptr< CommonData > elasticCommonDataPtr
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
boost::shared_ptr< CommonData > commonDataPtr
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)
boost::shared_ptr< CommonData > commonDataPtr
boost::shared_ptr< CommonData > commonDataPtr
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)
boost::shared_ptr< MatrixDouble > matDPtr
boost::shared_ptr< CommonData > commonDataPtr
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.