9#ifndef EXECUTABLE_DIMENSION
10 #define EXECUTABLE_DIMENSION 3
13#ifndef FINITE_DEFORMATION_FLAG
14 #define FINITE_DEFORMATION_FLAG true
22#include <ThermalConvection.hpp>
23#include <ThermalRadiation.hpp>
46 IntegrationType::GAUSS;
49#include <HenckyOps.hpp>
54#include <FiniteThermalOps.hpp>
58#include <ThermalOps.hpp>
103#include <ThermoElasticOps.hpp>
112 const std::string name,
const Range r) {
115 CHKERR moab.add_entities(*out_meshset, r);
116 CHKERR moab.write_file(name.c_str(),
"VTK",
"", out_meshset->get_ptr(), 1);
148 :
public boost::enable_shared_from_this<BlockedThermalParameters> {
157 return boost::shared_ptr<double>(shared_from_this(), &
heatCapacity);
162 :
public boost::enable_shared_from_this<BlockedThermoElasticParameters> {
167 return boost::shared_ptr<VectorDouble>(shared_from_this(),
172 return boost::shared_ptr<double>(shared_from_this(), &
refTemp);
177 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
178 std::string block_name,
179 boost::shared_ptr<BlockedThermalParameters> blockedParamsPtr,
Sev sev);
182 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
183 std::string block_name,
184 boost::shared_ptr<BlockedThermoElasticParameters> blockedParamsPtr,
187 template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
190 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
192 boost::shared_ptr<HenckyOps::CommonData> elastic_common_ptr,
193 boost::shared_ptr<ThermoElasticProblem::BlockedThermalParameters>
195 boost::shared_ptr<ThermoElasticProblem::BlockedThermoElasticParameters>
196 thermoelastic_common_ptr,
203 auto vec_temp_ptr = boost::make_shared<VectorDouble>();
205 auto coeff_expansion_ptr = thermoelastic_common_ptr->getCoeffExpansionPtr();
206 auto ref_temp_ptr = thermoelastic_common_ptr->getRefTempPtr();
208 new typename H::template OpCalculateHenckyThermalStress<DIM, I, 0>(
209 "U", vec_temp_ptr, elastic_common_ptr, coeff_expansion_ptr,
214 "U", elastic_common_ptr->getMatFirstPiolaStress()));
219 template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
222 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
223 std::string
field_name, std::string elastic_block_name,
224 std::string thermal_block_name, std::string thermoelastic_block_name,
228 auto elastic_common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
230 auto thermal_common_ptr = boost::make_shared<BlockedThermalParameters>();
233 auto thermoelastic_common_ptr =
234 boost::make_shared<BlockedThermoElasticParameters>();
236 thermoelastic_common_ptr, Sev::inform);
237 CHKERR opThermoElasticFactoryDomainRhs<DIM, A, I, DomainEleOp>(
238 m_field, pip,
field_name, elastic_common_ptr, thermal_common_ptr,
239 thermoelastic_common_ptr, sev);
244 template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
247 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
248 std::string
field_name, std::string coupled_field_name,
249 boost::shared_ptr<HenckyOps::CommonData> elastic_common_ptr,
250 boost::shared_ptr<ThermoElasticProblem::BlockedThermalParameters>
252 boost::shared_ptr<ThermoElasticProblem::BlockedThermoElasticParameters>
253 thermoelastic_common_ptr,
259 using OpKPiola =
typename B::template OpGradTensorGrad<1, DIM, DIM, -1>;
262 auto vec_temp_ptr = boost::make_shared<VectorDouble>();
264 auto coeff_expansion_ptr = thermoelastic_common_ptr->getCoeffExpansionPtr();
265 auto ref_temp_ptr = thermoelastic_common_ptr->getRefTempPtr();
267 new typename H::template OpCalculateHenckyThermalStress<DIM, I, 0>(
268 "U", vec_temp_ptr, elastic_common_ptr, coeff_expansion_ptr,
270 pip.push_back(
new typename H::template OpHenckyTangent<DIM, I, 0>(
273 elastic_common_ptr->getMatTangent()));
274 pip.push_back(
new typename H::template OpCalculateHenckyThermalStressdT<
276 field_name, coupled_field_name, elastic_common_ptr,
277 coeff_expansion_ptr));
282 template <
int DIM, AssemblyType A, IntegrationType I,
typename DomainEleOp>
285 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
286 std::string
field_name, std::string coupled_field_name,
287 std::string elastic_block_name, std::string thermal_block_name,
288 std::string thermoelastic_block_name,
Sev sev,
double scale = 1) {
291 auto elastic_common_ptr = commonDataFactory<DIM, I, DomainEleOp>(
293 auto thermal_common_ptr = boost::make_shared<BlockedThermalParameters>();
296 auto thermoelastic_common_ptr =
297 boost::make_shared<BlockedThermoElasticParameters>();
299 thermoelastic_common_ptr, Sev::inform);
300 CHKERR opThermoElasticFactoryDomainLhs<DIM, A, I, DomainEleOp>(
301 m_field, pip,
field_name, coupled_field_name, elastic_common_ptr,
302 thermal_common_ptr, thermoelastic_common_ptr, sev);
309 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
310 std::string block_name,
311 boost::shared_ptr<BlockedThermalParameters> blockedParamsPtr,
Sev sev) {
315 OpMatThermalBlocks(boost::shared_ptr<double> conductivity_ptr,
316 boost::shared_ptr<double> capacity_ptr,
318 std::vector<const CubitMeshSets *> meshset_vec_ptr)
320 conductivityPtr(conductivity_ptr), capacityPtr(capacity_ptr) {
322 "Cannot get data from thermal block");
329 for (
auto &b : blockData) {
331 if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
332 *conductivityPtr = b.conductivity;
333 *capacityPtr = b.capacity;
351 std::vector<BlockData> blockData;
355 std::vector<const CubitMeshSets *> meshset_vec_ptr,
359 for (
auto m : meshset_vec_ptr) {
361 std::vector<double> block_data;
362 CHKERR m->getAttributes(block_data);
363 if (block_data.size() < 2) {
365 "Expected that block has at least two attributes");
367 auto get_block_ents = [&]() {
370 m_field.
get_moab().get_entities_by_handle(
m->meshset, ents,
true);
375 <<
m->getName() <<
": conductivity = " << block_data[0]
376 <<
" capacity = " << block_data[1];
378 blockData.push_back({block_data[0], block_data[1], get_block_ents()});
384 boost::shared_ptr<double> conductivityPtr;
385 boost::shared_ptr<double> capacityPtr;
388 pipeline.push_back(
new OpMatThermalBlocks(
389 blockedParamsPtr->getHeatConductivityPtr(),
390 blockedParamsPtr->getHeatCapacityPtr(),
mField, sev,
395 (boost::format(
"%s(.*)") % block_name).str()
405 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
406 std::string block_name,
407 boost::shared_ptr<BlockedThermoElasticParameters> blockedParamsPtr,
411 struct OpMatThermoElasticBlocks :
public DomainEleOp {
412 OpMatThermoElasticBlocks(boost::shared_ptr<VectorDouble> expansion_ptr,
413 boost::shared_ptr<double> ref_temp_ptr,
415 std::vector<const CubitMeshSets *> meshset_vec_ptr)
417 expansionPtr(expansion_ptr), refTempPtr(ref_temp_ptr) {
419 extractThermoElasticBlockData(m_field, meshset_vec_ptr, sev),
420 "Cannot get data from thermoelastic block");
427 for (
auto &b : blockData) {
429 if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
430 *expansionPtr = b.expansion;
431 *refTempPtr = b.ref_temp;
449 std::vector<BlockData> blockData;
453 std::vector<const CubitMeshSets *> meshset_vec_ptr,
Sev sev) {
456 for (
auto m : meshset_vec_ptr) {
458 std::vector<double> block_data;
459 CHKERR m->getAttributes(block_data);
460 if (block_data.size() < 2) {
462 "Expected that block has at least two attributes");
464 auto get_block_ents = [&]() {
467 m_field.
get_moab().get_entities_by_handle(
m->meshset, ents,
true);
471 auto get_expansion = [&]() {
473 if (block_data.size() > 2) {
474 expansion[1] = block_data[2];
476 if (
SPACE_DIM == 3 && block_data.size() > 3) {
477 expansion[2] = block_data[3];
482 auto coeff_exp_vec = get_expansion();
485 <<
" ref_temp = " << block_data[0]
486 <<
" expansion = " << coeff_exp_vec;
488 blockData.push_back({block_data[0], coeff_exp_vec, get_block_ents()});
494 boost::shared_ptr<VectorDouble> expansionPtr;
495 boost::shared_ptr<double> refTempPtr;
498 pipeline.push_back(
new OpMatThermoElasticBlocks(
499 blockedParamsPtr->getCoeffExpansionPtr(),
500 blockedParamsPtr->getRefTempPtr(),
mField, sev,
505 (boost::format(
"%s(.*)") % block_name).str()
530 auto get_command_line_parameters = [&]() {
596 CHKERR get_command_line_parameters();
614 CHKERR simple->addDomainField(
"FLUX", flux_space, base, 1);
615 CHKERR simple->addBoundaryField(
"FLUX", flux_space, base, 1);
645 auto no_rule = [](int, int, int) {
return -1; };
648 field_eval_fe_ptr->getRuleHook = no_rule;
650 auto block_thermal_params = boost::make_shared<BlockedThermalParameters>();
651 auto block_thermoelastic_params =
652 boost::make_shared<BlockedThermoElasticParameters>();
653 auto coeff_expansion_ptr =
654 block_thermoelastic_params->getCoeffExpansionPtr();
655 auto ref_temp_ptr = block_thermoelastic_params->getRefTempPtr();
658 "MAT_THERMAL", block_thermal_params,
661 field_eval_fe_ptr->getOpPtrVector(),
"MAT_THERMOELASTIC",
662 block_thermoelastic_params, Sev::verbose);
665 field_eval_fe_ptr->getOpPtrVector(), {H1, HDIV});
667 auto hencky_common_data_ptr =
668 HenckyOps::commonDataFactory<SPACE_DIM, IT, DomainEleOp>(
669 mField, field_eval_fe_ptr->getOpPtrVector(),
"U",
"MAT_ELASTIC",
671 auto mat_D_ptr = hencky_common_data_ptr->matDPtr;
672 auto dispGradPtr = hencky_common_data_ptr->matGradPtr;
673 auto mat_stress_ptr = boost::make_shared<MatrixDouble>();
675 field_eval_fe_ptr->getOpPtrVector().push_back(
677 field_eval_fe_ptr->getOpPtrVector().push_back(
679 field_eval_fe_ptr->getOpPtrVector().push_back(
681 field_eval_fe_ptr->getOpPtrVector().push_back(
687 field_eval_fe_ptr->getOpPtrVector().push_back(
689 typename H::template OpCalculateHenckyThermalStress<SPACE_DIM, IT, 0>(
690 "U",
tempFieldPtr, hencky_common_data_ptr, coeff_expansion_ptr,
693 field_eval_fe_ptr->getOpPtrVector().push_back(
695 hencky_common_data_ptr->getMatFirstPiolaStress(),
697 field_eval_fe_ptr->getOpPtrVector().push_back(
700 field_eval_fe_ptr->getOpPtrVector().push_back(
701 new typename H::template OpCalculateLogC<SPACE_DIM, IT>(
702 "U", hencky_common_data_ptr));
703 stressFieldPtr = hencky_common_data_ptr->getMatFirstPiolaStress();
722 auto get_skin = [&]() {
727 CHKERR skin.find_skin(0, body_ents,
false, skin_ents);
731 auto filter_flux_blocks = [&](
auto skin,
bool temp_bc =
false) {
732 auto remove_cubit_blocks = [&](
auto c) {
742 skin = subtract(skin, ents);
747 auto remove_named_blocks = [&](
auto n) {
752 (boost::format(
"%s(.*)") %
n).str()
760 skin = subtract(skin, ents);
766 "remove_cubit_blocks");
768 "remove_named_blocks");
771 "remove_cubit_blocks");
780 ParallelComm *pcomm =
782 CHKERR pcomm->filter_pstatus(skin, PSTATUS_SHARED | PSTATUS_MULTISHARED,
783 PSTATUS_NOT, -1, &boundary_ents);
784 return boundary_ents;
788 auto remove_temp_bc_ents =
794 remove_temp_bc_ents);
796 MOFEM_LOG(
"SYNC", Sev::noisy) << remove_flux_ents << endl;
799 MOFEM_LOG(
"SYNC", Sev::noisy) << remove_temp_bc_ents << endl;
812 remove_temp_bc_ents);
817 simple->getProblemName(),
"FLUX", remove_flux_ents);
819 simple->getProblemName(),
"TBC", remove_temp_bc_ents);
821 auto set_init_temp = [](boost::shared_ptr<FieldEntity> field_entity_ptr) {
829 simple->getProblemName(),
"U");
831 simple->getProblemName(),
"FLUX",
false);
854 auto block_thermal_params = boost::make_shared<BlockedThermalParameters>();
855 auto heat_conductivity_ptr = block_thermal_params->getHeatConductivityPtr();
856 auto heat_capacity_ptr = block_thermal_params->getHeatCapacityPtr();
858 auto block_thermoelastic_params =
859 boost::make_shared<BlockedThermoElasticParameters>();
860 auto coeff_expansion_ptr = block_thermoelastic_params->getCoeffExpansionPtr();
861 auto ref_temp_ptr = block_thermoelastic_params->getRefTempPtr();
865 boost::make_shared<TimeScale>(
"",
false, [](
const double) {
return 1; });
866 auto def_time_scale = [time_scale](
const double time) {
867 return (!time_scale->argFileScale) ? time : 1;
869 auto def_file_name = [time_scale](
const std::string &&name) {
870 return (!time_scale->argFileScale) ? name :
"";
874 auto time_bodyforce_scaling = boost::make_shared<TimeScale>(
875 def_file_name(
"bodyforce_scale.txt"),
false, def_time_scale);
876 auto time_heatsource_scaling = boost::make_shared<TimeScale>(
877 def_file_name(
"heatsource_scale.txt"),
false, def_time_scale);
878 auto time_temperature_scaling = boost::make_shared<TimeScale>(
879 def_file_name(
"temperature_bc_scale.txt"),
false, def_time_scale);
880 auto time_displacement_scaling = boost::make_shared<TimeScale>(
881 def_file_name(
"displacement_bc_scale.txt"),
false, def_time_scale);
882 auto time_flux_scaling = boost::make_shared<TimeScale>(
883 def_file_name(
"flux_bc_scale.txt"),
false, def_time_scale);
884 auto time_force_scaling = boost::make_shared<TimeScale>(
885 def_file_name(
"force_bc_scale.txt"),
false, def_time_scale);
886 auto time_convection_temp_scaling = boost::make_shared<TimeScale>(
887 def_file_name(
"convection_temp_scale.txt"),
false, def_time_scale);
888 auto time_radiation_temp_scaling = boost::make_shared<TimeScale>(
889 def_file_name(
"radiation_temp_scale.txt"),
false, def_time_scale);
891 auto add_domain_rhs_ops = [&](
auto &pipeline) {
896 block_thermoelastic_params, Sev::inform);
899 auto hencky_common_data_ptr =
900 HenckyOps::commonDataFactory<SPACE_DIM, IT, DomainEleOp>(
901 mField, pipeline,
"U",
"MAT_ELASTIC", Sev::inform);
902 auto mat_D_ptr = hencky_common_data_ptr->matDPtr;
903 auto mat_grad_ptr = hencky_common_data_ptr->matGradPtr;
904 auto mat_strain_ptr = boost::make_shared<MatrixDouble>();
905 auto mat_stress_ptr = boost::make_shared<MatrixDouble>();
907 auto vec_temp_ptr = boost::make_shared<VectorDouble>();
908 auto vec_temp_dot_ptr = boost::make_shared<VectorDouble>();
909 auto mat_flux_ptr = boost::make_shared<MatrixDouble>();
910 auto vec_temp_div_ptr = boost::make_shared<VectorDouble>();
916 "FLUX", vec_temp_div_ptr));
920 CHKERR opThermoElasticFactoryDomainRhs<SPACE_DIM, AT, IT, DomainEleOp>(
921 mField, pipeline,
"U",
"MAT_ELASTIC",
"MAT_THERMAL",
922 "MAT_THERMOELASTIC", Sev::inform);
924 auto resistance = [heat_conductivity_ptr](
const double,
const double,
926 return (1. / (*heat_conductivity_ptr));
929 auto capacity = [heat_capacity_ptr](
const double,
const double,
931 return -(*heat_capacity_ptr);
937 new OpHdivFlux(
"FLUX", mat_flux_ptr, resistance, mat_grad_ptr));
938 pipeline.push_back(
new OpHDivTemp(
"FLUX", vec_temp_ptr, unity));
939 auto op_OpBaseDivFlux =
new OpBaseDivFlux(
"T", vec_temp_div_ptr, unity);
940 op_OpBaseDivFlux->feScalingFun = [](
const FEMethod *fe_ptr) {
941 return fe_ptr->ts_dt;
943 pipeline.push_back(op_OpBaseDivFlux);
944 auto op_OpBaseDotT =
new OpBaseDotT(
"T", vec_temp_dot_ptr, capacity);
945 op_OpBaseDotT->feScalingFun = [](
const FEMethod *fe_ptr) {
946 return fe_ptr->ts_dt;
948 pipeline.push_back(op_OpBaseDotT);
952 pipeline,
mField,
"T", {time_scale, time_heatsource_scaling},
954 [](
const FEMethod *fe_ptr) {
return fe_ptr->ts_dt; }, Sev::inform);
956 pipeline,
mField,
"T", vec_temp_ptr,
"SETTEMP",
957 [](
const FEMethod *fe_ptr) {
return fe_ptr->
ts_dt; }, Sev::inform);
959 pipeline,
mField,
"U", {time_scale, time_bodyforce_scaling},
960 "BODY_FORCE", Sev::inform);
965 auto add_domain_lhs_ops = [&](
auto &pipeline) {
970 block_thermoelastic_params,
974 auto hencky_common_data_ptr =
975 HenckyOps::commonDataFactory<SPACE_DIM, IT, DomainEleOp>(
976 mField, pipeline,
"U",
"MAT_ELASTIC", Sev::inform, 1);
977 auto mat_D_ptr = hencky_common_data_ptr->matDPtr;
978 auto mat_grad_ptr = hencky_common_data_ptr->matGradPtr;
980 auto resistance = [heat_conductivity_ptr](
const double,
const double,
982 return (1. / (*heat_conductivity_ptr));
984 auto capacity = [heat_capacity_ptr](
const double,
const double,
986 return -(*heat_capacity_ptr);
989 new OpHdivHdiv(
"FLUX",
"FLUX", resistance, mat_grad_ptr));
991 new OpHdivT(
"FLUX",
"T", []()
constexpr {
return -1; },
false,
false));
993 new OpHdivT(
"FLUX",
"T", []()
constexpr {
return -1; },
true,
true);
994 op_OpHdivT->feScalingFun = [](
const FEMethod *fe_ptr) {
995 return fe_ptr->ts_dt;
997 pipeline.push_back(op_OpHdivT);
999 auto mat_flux_ptr = boost::make_shared<MatrixDouble>();
1004 new OpHdivU(
"FLUX",
"U", mat_flux_ptr, resistance, mat_grad_ptr));
1006 CHKERR opThermoElasticFactoryDomainLhs<SPACE_DIM, AT, IT, DomainEleOp>(
1007 mField, pipeline,
"U",
"T",
"MAT_ELASTIC",
"MAT_THERMAL",
1008 "MAT_THERMOELASTIC", Sev::inform);
1010 auto op_capacity =
new OpCapacity(
"T",
"T", capacity);
1011 op_capacity->feScalingFun = [](
const FEMethod *fe_ptr) {
1012 return fe_ptr->ts_a * fe_ptr->ts_dt;
1014 pipeline.push_back(op_capacity);
1016 auto vec_temp_ptr = boost::make_shared<VectorDouble>();
1019 pipeline,
mField,
"T",
"SETTEMP",
1020 [](
const FEMethod *fe_ptr) {
return fe_ptr->
ts_dt; }, Sev::verbose);
1025 auto add_boundary_rhs_ops = [&](
auto &pipeline) {
1031 pipeline,
mField,
"U", {time_scale, time_force_scaling},
"FORCE",
1032 "PRESSURE", Sev::inform);
1039 pipeline,
mField,
"FLUX", {time_scale, time_temperature_scaling},
1040 "TEMPERATURE", Sev::inform);
1050 pipeline,
mField,
"TBC", {time_scale, time_flux_scaling},
"",
1052 using OpFluxBlocksetBC =
1055 pipeline,
mField,
"TBC", {time_scale, time_flux_scaling},
"HEATFLUX",
1059 using OpConvectionRhsBC =
1060 T::OpFlux<ThermoElasticOps::ConvectionBcType<BLOCKSET>, 1, 1>;
1061 using OpRadiationRhsBC =
1062 T::OpFlux<ThermoElasticOps::RadiationBcType<BLOCKSET>, 1, 1>;
1063 auto temp_bc_ptr = boost::make_shared<VectorDouble>();
1065 T::AddFluxToPipeline<OpConvectionRhsBC>::add(
1066 pipeline,
mField,
"TBC", temp_bc_ptr,
1067 {time_scale, time_convection_temp_scaling},
"CONVECTION", Sev::inform);
1068 T::AddFluxToPipeline<OpRadiationRhsBC>::add(
1069 pipeline,
mField,
"TBC", temp_bc_ptr,
1070 {time_scale, time_radiation_temp_scaling},
"RADIATION", Sev::inform);
1072 auto mat_flux_ptr = boost::make_shared<MatrixDouble>();
1081 struct OpTBCTimesNormalFlux
1086 OpTBCTimesNormalFlux(
const std::string
field_name,
1087 boost::shared_ptr<MatrixDouble> vec,
1088 boost::shared_ptr<Range> ents_ptr =
nullptr)
1095 auto t_w = OP::getFTensor0IntegrationWeight();
1099 auto t_normal = OP::getFTensor1NormalsAtGaussPts();
1101 auto t_vec = getFTensor1FromMat<SPACE_DIM, SPACE_DIM>(*sourceVec);
1103 for (
int gg = 0; gg != OP::nbIntegrationPts; gg++) {
1105 const double alpha = t_w * (t_vec(
i) * t_normal(
i));
1108 for (; rr != OP::nbRows; ++rr) {
1109 OP::locF[rr] += alpha * t_row_base;
1112 for (; rr < OP::nbRowBaseFunctions; ++rr)
1118 EntityType fe_type = OP::getNumeredEntFiniteElementPtr()->getEntType();
1119 if (fe_type == MBTRI) {
1126 boost::shared_ptr<MatrixDouble> sourceVec;
1128 pipeline.push_back(
new OpTBCTimesNormalFlux(
"TBC", mat_flux_ptr));
1130 struct OpBaseNormalTimesTBC
1135 OpBaseNormalTimesTBC(
const std::string
field_name,
1136 boost::shared_ptr<VectorDouble> vec,
1137 boost::shared_ptr<Range> ents_ptr =
nullptr)
1144 auto t_w = OP::getFTensor0IntegrationWeight();
1148 auto t_normal = OP::getFTensor1NormalsAtGaussPts();
1152 for (
int gg = 0; gg != OP::nbIntegrationPts; gg++) {
1154 const double alpha = t_w * t_vec;
1157 for (; rr != OP::nbRows; ++rr) {
1158 OP::locF[rr] += alpha * (t_row_base(
i) * t_normal(
i));
1161 for (; rr < OP::nbRowBaseFunctions; ++rr)
1167 EntityType fe_type = OP::getNumeredEntFiniteElementPtr()->getEntType();
1168 if (fe_type == MBTRI) {
1175 boost::shared_ptr<VectorDouble> sourceVec;
1178 pipeline.push_back(
new OpBaseNormalTimesTBC(
"FLUX", temp_bc_ptr));
1183 auto add_boundary_lhs_ops = [&](
auto &pipeline) {
1190 using OpConvectionLhsBC =
1191 T::OpFlux<ThermoElasticOps::ConvectionBcType<BLOCKSET>, 1, 1>;
1192 using OpRadiationLhsBC =
1193 T::OpFlux<ThermoElasticOps::RadiationBcType<BLOCKSET>, 1, 1>;
1194 auto temp_bc_ptr = boost::make_shared<VectorDouble>();
1196 T::AddFluxToPipeline<OpConvectionLhsBC>::add(pipeline,
mField,
"TBC",
"TBC",
1197 "CONVECTION", Sev::verbose);
1198 T::AddFluxToPipeline<OpRadiationLhsBC>::add(
1199 pipeline,
mField,
"TBC",
"TBC", temp_bc_ptr,
"RADIATION", Sev::verbose);
1206 struct OpTBCTimesNormalFlux
1211 OpTBCTimesNormalFlux(
const std::string row_field_name,
1212 const std::string col_field_name,
1213 boost::shared_ptr<Range> ents_ptr =
nullptr)
1214 :
OP(row_field_name, col_field_name, OP::OPROWCOL, ents_ptr) {
1216 this->assembleTranspose =
true;
1217 this->onlyTranspose =
false;
1227 auto t_w = OP::getFTensor0IntegrationWeight();
1231 auto t_normal = OP::getFTensor1NormalsAtGaussPts();
1233 for (
int gg = 0; gg != OP::nbIntegrationPts; gg++) {
1235 auto a_mat_ptr = &*OP::locMat.data().begin();
1237 for (; rr != OP::nbRows; rr++) {
1239 const double alpha = t_w * t_row_base;
1243 for (
int cc = 0; cc != OP::nbCols; cc++) {
1247 *a_mat_ptr += alpha * (t_col_base(
i) * t_normal(
i));
1253 for (; rr < OP::nbRowBaseFunctions; ++rr)
1258 EntityType fe_type = OP::getNumeredEntFiniteElementPtr()->getEntType();
1259 if (fe_type == MBTRI) {
1266 pipeline.push_back(
new OpTBCTimesNormalFlux(
"TBC",
"FLUX"));
1272 auto get_bc_hook_rhs = [&]() {
1274 mField, pipeline_mng->getDomainRhsFE(),
1275 {time_scale, time_displacement_scaling});
1278 auto get_bc_hook_lhs = [&]() {
1280 mField, pipeline_mng->getDomainLhsFE(),
1281 {time_scale, time_displacement_scaling});
1285 pipeline_mng->getDomainRhsFE()->preProcessHook = get_bc_hook_rhs();
1286 pipeline_mng->getDomainLhsFE()->preProcessHook = get_bc_hook_lhs();
1288 CHKERR add_domain_rhs_ops(pipeline_mng->getOpDomainRhsPipeline());
1289 CHKERR add_domain_lhs_ops(pipeline_mng->getOpDomainLhsPipeline());
1290 CHKERR add_boundary_rhs_ops(pipeline_mng->getOpBoundaryRhsPipeline());
1291 CHKERR add_boundary_lhs_ops(pipeline_mng->getOpBoundaryLhsPipeline());
1305 auto dm =
simple->getDM();
1309 auto set_section_monitor = [&](
auto solver) {
1312 CHKERR TSGetSNES(solver, &snes);
1313 CHKERR SNESMonitorSet(snes,
1316 (
void *)(snes_ctx_ptr.get()),
nullptr);
1320 auto create_post_process_elements = [&]() {
1321 auto block_thermal_params = boost::make_shared<BlockedThermalParameters>();
1323 auto block_thermoelastic_params =
1324 boost::make_shared<BlockedThermoElasticParameters>();
1325 auto coeff_expansion_ptr =
1326 block_thermoelastic_params->getCoeffExpansionPtr();
1327 auto ref_temp_ptr = block_thermoelastic_params->getRefTempPtr();
1329 auto u_ptr = boost::make_shared<MatrixDouble>();
1330 auto mat_grad_ptr = boost::make_shared<MatrixDouble>();
1331 auto mat_strain_ptr = boost::make_shared<MatrixDouble>();
1332 auto mat_stress_ptr = boost::make_shared<MatrixDouble>();
1333 auto vec_temp_ptr = boost::make_shared<VectorDouble>();
1334 auto mat_flux_ptr = boost::make_shared<MatrixDouble>();
1336 auto push_domain_ops = [&](
auto &pp_fe) {
1338 auto &pip = pp_fe->getOpPtrVector();
1343 pip,
"MAT_THERMOELASTIC", block_thermoelastic_params, Sev::verbose);
1353 "U", mat_grad_ptr));
1354 auto elastic_common_ptr = commonDataFactory<SPACE_DIM, IT, DomainEleOp>(
1355 mField, pip,
"U",
"MAT_ELASTIC", Sev::inform);
1359 typename H::template OpCalculateHenckyThermalStress<SPACE_DIM, IT, 0>(
1360 "U", vec_temp_ptr, elastic_common_ptr, coeff_expansion_ptr,
1364 elastic_common_ptr->getMatFirstPiolaStress(), mat_stress_ptr));
1368 mat_stress_ptr = elastic_common_ptr->getMatFirstPiolaStress();
1369 mat_strain_ptr = elastic_common_ptr->getMatLogC();
1375 auto push_post_proc_ops = [&](
auto &pp_fe) {
1377 auto &pip = pp_fe->getOpPtrVector();
1385 pp_fe->getPostProcMesh(), pp_fe->getMapGaussPts(),
1387 {{
"T", vec_temp_ptr}},
1389 {{
"U", u_ptr}, {
"FLUX", mat_flux_ptr}},
1393 {{
"CAUCHY", mat_stress_ptr}, {
"STRAIN", mat_strain_ptr}}
1403 pp_fe->getPostProcMesh(), pp_fe->getMapGaussPts(),
1405 {{
"T", vec_temp_ptr}},
1407 {{
"U", u_ptr}, {
"FLUX", mat_flux_ptr}},
1409 {{
"PIOLA", mat_stress_ptr}},
1411 {{
"HENCKY_STRAIN", mat_strain_ptr}}
1421 auto domain_post_proc = [&]() {
1423 return boost::shared_ptr<PostProcEle>();
1424 auto pp_fe = boost::make_shared<PostProcEle>(mField);
1426 "push domain ops to domain element");
1428 "push post proc ops to domain element");
1432 auto skin_post_proc = [&]() {
1434 return boost::shared_ptr<SkinPostProcEle>();
1435 auto pp_fe = boost::make_shared<SkinPostProcEle>(mField);
1440 "push domain ops to side element");
1441 pp_fe->getOpPtrVector().push_back(op_side);
1443 "push post proc ops to skin element");
1447 return std::make_pair(domain_post_proc(), skin_post_proc());
1450 auto monitor_ptr = boost::make_shared<FEMethod>();
1452 auto set_time_monitor = [&](
auto dm,
auto solver,
auto domain_post_proc_fe,
1453 auto skin_post_proc_fe) {
1455 monitor_ptr->preProcessHook = [&]() {
1461 domain_post_proc_fe,
1462 monitor_ptr->getCacheWeakPtr());
1463 CHKERR domain_post_proc_fe->writeFile(
1464 "out_" + boost::lexical_cast<std::string>(monitor_ptr->ts_step) +
1470 monitor_ptr->getCacheWeakPtr());
1471 CHKERR skin_post_proc_fe->writeFile(
1473 boost::lexical_cast<std::string>(monitor_ptr->ts_step) +
".h5m");
1477 struct AtomTestResult {
1479 std::string msg =
"";
1481 AtomTestResult atom_test_result;
1483 auto fail_atom_test = [&atom_test_result](
const std::string &msg) {
1484 atom_test_result.fail =
true;
1485 atom_test_result.msg = msg;
1488 struct AtomTestData{
1489 double expected = 0.0;
1496 ->evalFEAtThePoint<SPACE_DIM>(
1497 fieldEvalCoords.data(), 1e-12,
simple->getProblemName(),
1498 simple->getDomainFEName(), fieldEvalData,
1499 mField.get_comm_rank(), mField.get_comm_rank(),
nullptr,
1505 CHKERR VecZeroEntries(eval_num_vec);
1506 if (tempFieldPtr->size()) {
1507 CHKERR VecSetValue(eval_num_vec, 0, 1, ADD_VALUES);
1509 CHKERR VecAssemblyBegin(eval_num_vec);
1510 CHKERR VecAssemblyEnd(eval_num_vec);
1513 CHKERR VecSum(eval_num_vec, &eval_num);
1514 if (!(
int)eval_num) {
1516 "did not find elements to evaluate the field, check the "
1521 if (tempFieldPtr->size()) {
1523 MOFEM_LOG(
"ThermoElasticSync", Sev::inform)
1524 <<
"Eval point T: " << t_temp;
1525 if (
atom_test && fabs(monitor_ptr->ts_t - 10) < 1e-12) {
1526 AtomTestData atom_test_data;
1531 atom_test_data = {554.48, 1e-2};
1534 atom_test_data = {325.0, 2e-2};
1537 atom_test_data = {1.0, 1e-2};
1540 fail_atom_test(
"unknown atom test number");
1542 if (fabs(t_temp - atom_test_data.expected) > atom_test_data.tol) {
1543 fail_atom_test(
"wrong temperature value");
1547 if (fluxFieldPtr->size1()) {
1549 auto t_flux = getFTensor1FromMat<SPACE_DIM>(*fluxFieldPtr);
1550 auto flux_mag = sqrt(t_flux(
i) * t_flux(
i));
1551 MOFEM_LOG(
"ThermoElasticSync", Sev::inform)
1552 <<
"Eval point FLUX magnitude: " << flux_mag;
1553 if (
atom_test && fabs(monitor_ptr->ts_t - 10) < 1e-12) {
1554 AtomTestData atom_test_data;
1559 atom_test_data = {27008.0, 2e1};
1562 atom_test_data = {150e3, 2.1e1};
1565 atom_test_data = {0.0, 1e-6};
1568 fail_atom_test(
"unknown atom test number");
1570 if (fabs(flux_mag - atom_test_data.expected) > atom_test_data.tol) {
1571 fail_atom_test(
"wrong flux value");
1575 if (dispFieldPtr->size1()) {
1577 auto t_disp = getFTensor1FromMat<SPACE_DIM>(*dispFieldPtr);
1578 auto disp_mag = sqrt(t_disp(
i) * t_disp(
i));
1579 MOFEM_LOG(
"ThermoElasticSync", Sev::inform)
1580 <<
"Eval point U magnitude: " << disp_mag;
1581 if (
atom_test && fabs(monitor_ptr->ts_t - 10) < 1e-12) {
1582 AtomTestData atom_test_data;
1585 atom_test_data = {0.00345, 1e-5};
1589 atom_test_data = {0.00265, 1e-5};
1592 atom_test_data = {0.00075, 1e-5};
1595 atom_test_data = {std::sqrt(2) * (std::sqrt(std::exp(0.2)) - 1),
1599 fail_atom_test(
"unknown atom test number");
1601 if (fabs(disp_mag - atom_test_data.expected) > atom_test_data.tol) {
1602 fail_atom_test(
"wrong displacement value");
1606 if (strainFieldPtr->size1()) {
1608 auto t_strain = getFTensor2SymmetricFromMat<SPACE_DIM>(*strainFieldPtr);
1609 auto t_strain_trace = t_strain(
i,
i);
1610 if (
atom_test && fabs(monitor_ptr->ts_t - 10) < 1e-12) {
1611 AtomTestData atom_test_data;
1614 atom_test_data = {0.00679, 1e-5};
1618 atom_test_data = {0.00522, 1e-5};
1621 atom_test_data = {0.00055, 1e-5};
1624 atom_test_data = {0.2, 1e-5};
1627 fail_atom_test(
"unknown atom test number");
1629 if (fabs(t_strain_trace - atom_test_data.expected) >
1630 atom_test_data.tol) {
1631 fail_atom_test(
"wrong strain value");
1635 if (stressFieldPtr->size1()) {
1636 double von_mises_stress;
1637 auto getVonMisesStress = [&](
auto t_stress) {
1639 PetscBool plane_strain_flag = PETSC_FALSE;
1641 &plane_strain_flag, PETSC_NULLPTR);
1647 (t_stress(0, 0) + t_stress(1, 1))
1649 von_mises_stress = std::sqrt(
1650 0.5 * ((t_stress(0, 0) - t_stress(1, 1)) *
1651 (t_stress(0, 0) - t_stress(1, 1)) +
1652 (t_stress(1, 1) - s33) * (t_stress(1, 1) - s33) +
1653 (s33 - t_stress(0, 0)) * (s33 - t_stress(0, 0)) +
1654 6.0 * (t_stress(0, 1) * t_stress(0, 1) +
1655 (
SPACE_DIM == 3 ? t_stress(1, 2) * t_stress(1, 2)
1657 (
SPACE_DIM == 3 ? t_stress(2, 0) * t_stress(2, 0)
1662 auto t_stress = getFTensor2SymmetricFromMat<SPACE_DIM>(*stressFieldPtr);
1663 CHKERR getVonMisesStress(t_stress);
1666 getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*stressFieldPtr);
1667 CHKERR getVonMisesStress(t_stress);
1669 MOFEM_LOG(
"ThermoElasticSync", Sev::inform)
1670 <<
"Eval point von Mises Stress: " << von_mises_stress;
1671 if (
atom_test && fabs(monitor_ptr->ts_t - 10) < 1e-12) {
1672 AtomTestData atom_test_data;
1675 atom_test_data = {523.0, 5e-1};
1678 atom_test_data = {16.3, 6e-2};
1681 atom_test_data = {14.9, 5e-2};
1684 atom_test_data = {69.2, 1e-1};
1687 atom_test_data = {0.0, 5e-2};
1690 fail_atom_test(
"unknown atom test number");
1692 if (fabs(von_mises_stress - atom_test_data.expected) >
1693 atom_test_data.tol) {
1694 fail_atom_test(
"wrong von Mises stress value");
1701 if (atom_test_result.fail) {
1704 atom_test_result.msg.c_str());
1709 auto null = boost::shared_ptr<FEMethod>();
1715 auto set_fieldsplit_preconditioner = [&](
auto solver) {
1719 CHKERR TSGetSNES(solver, &snes);
1721 CHKERR SNESGetKSP(snes, &ksp);
1723 CHKERR KSPGetPC(ksp, &pc);
1724 PetscBool is_pcfs = PETSC_FALSE;
1725 PetscObjectTypeCompare((PetscObject)pc, PCFIELDSPLIT, &is_pcfs);
1728 if (is_pcfs == PETSC_TRUE) {
1729 auto is_mng = mField.getInterface<
ISManager>();
1730 auto name_prb =
simple->getProblemName();
1733 CHKERR is_mng->isCreateProblemFieldAndRank(name_prb,
ROW,
"U", 0,
1736 CHKERR is_mng->isCreateProblemFieldAndRank(name_prb,
ROW,
"FLUX", 0, 0,
1739 CHKERR is_mng->isCreateProblemFieldAndRank(name_prb,
ROW,
"T", 0, 0,
1742 CHKERR is_mng->isCreateProblemFieldAndRank(name_prb,
ROW,
"TBC", 0, 0,
1745 CHKERR ISExpand(is_T, is_flux, &is_tmp);
1746 CHKERR ISExpand(is_TBC, is_tmp, &is_tmp2);
1747 CHKERR ISDestroy(&is_tmp);
1752 CHKERR PCFieldSplitSetIS(pc, PETSC_NULLPTR, is_TFlux);
1753 CHKERR PCFieldSplitSetIS(pc, PETSC_NULLPTR, is_u);
1760 CHKERR TSSetIJacobian(solver,
B,
B, PETSC_NULLPTR, PETSC_NULLPTR);
1763 CHKERR TSSetSolution(solver,
D);
1764 CHKERR TSSetFromOptions(solver);
1766 CHKERR set_section_monitor(solver);
1767 CHKERR set_fieldsplit_preconditioner(solver);
1769 auto [domain_post_proc_fe, skin_post_proc_fe] =
1770 create_post_process_elements();
1771 CHKERR set_time_monitor(dm, solver, domain_post_proc_fe, skin_post_proc_fe);
1774 CHKERR TSSolve(solver, NULL);
1785 const char param_file[] =
"param_file.petsc";
1789 auto core_log = logging::core::get();
1803 DMType dm_name =
"DMMOFEM";
1808 moab::Core mb_instance;
1809 moab::Interface &moab = mb_instance;
static auto filter_true_skin(MoFEM::Interface &m_field, Range &&skin)
#define MOFEM_LOG_SEVERITY_SYNC(comm, severity)
Synchronise "SYNC" on curtain severity level.
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
#define FTENSOR_INDEX(DIM, I)
void simple(double P1[], double P2[], double P3[], double c[], const int N)
DomainEle::UserDataOperator DomainEleOp
Finire element operator type.
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
ElementsAndOps< SPACE_DIM >::BoundaryEle BoundaryEle
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#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()
@ L2
field with C-1 continuity
@ HCURL
field with continuous tangents
@ HDIV
field with continuous normal traction
#define MYPCOMM_INDEX
default communicator number PCOMM
#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_ATOM_TEST_INVALID
@ 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 MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode, RowColData rc=RowColData::COL)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
auto createDMVector(DM dm, RowColData rc=RowColData::COL)
Get smart vector from DM.
auto createDMMatrix(DM dm)
Get smart matrix from DM.
SmartPetscObj< TS > createTSIM(SmartPetscObj< DM > dm=nullptr)
Create TS (time) implicit solver.
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
SeverityLevel
Severity levels.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
MoFEMErrorCode getCubitMeshsetPtr(const int ms_id, const CubitBCType cubit_bc_type, const CubitMeshSets **cubit_meshset_ptr) const
get cubit meshset
FTensor::Index< 'i', SPACE_DIM > i
const double c
speed of light (cm/ns)
const double n
refractive index of diffusive medium
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
UBlasVector< double > VectorDouble
implementation of Data Operators for Forces and Sources
PetscErrorCode DMMoFEMTSSetMonitor(DM dm, TS ts, const std::string fe_name, boost::shared_ptr< MoFEM::FEMethod > method, boost::shared_ptr< MoFEM::BasicMethod > pre_only, boost::shared_ptr< MoFEM::BasicMethod > post_only)
Set Monitor To TS solver.
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
MoFEMErrorCode MoFEMSNESMonitorFields(SNES snes, PetscInt its, PetscReal fgnorm, SnesCtx *ctx)
Sens monitor printing residual field by field.
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
PetscErrorCode PetscOptionsGetRealArray(PetscOptions *, const char pre[], const char name[], PetscReal dval[], PetscInt *nmax, PetscBool *set)
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
OpCalculateScalarFieldValuesFromPetscVecImpl< PetscData::CTX_SET_X_T > OpCalculateScalarFieldValuesDot
auto get_temp_meshset_ptr(moab::Interface &moab)
Create smart pointer to temporary meshset.
static auto getFTensor0FromVec(V &data)
Get tensor rank 0 (scalar) form data vector.
auto getDMSnesCtx(DM dm)
Get SNES context data structure used by DM.
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMixDivTimesScalar< SPACE_DIM > OpHdivT
Integrate Lhs div of base of flux times base of temperature (FLUX x T) and transpose of it,...
OpHdivHdivImpl< SPACE_DIM, IS_LARGE_STRAINS > OpHdivHdiv
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, 1 > OpCapacity
Integrate Lhs base of temperature times (heat capacity) times base of temperature (T x T)
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesScalar< 1 > OpBaseDotT
Integrate Rhs base of temperature time heat capacity times heat rate (T)
OpBaseDotT OpBaseDivFlux
Integrate Rhs base of temperature times divergence of flux (T)
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpMixDivTimesU< 3, 1, SPACE_DIM > OpHDivTemp
Integrate Rhs div flux base times temperature (T)
OpCalculateQdotQLhs_dU< SPACE_DIM, GAUSS, AssemblyDomainEleOp, IS_LARGE_STRAINS > OpHdivU
Integrate Lhs of flux term coupled to displacement field.
OpHdivFluxImpl< SPACE_DIM, IS_LARGE_STRAINS > OpHdivFlux
FormsIntegrators< DomainEleOp >::Assembly< A >::LinearForm< I >::OpGradTimesTensor< 1, FIELD_DIM, SPACE_DIM > OpGradTimesTensor
constexpr IntegrationType I
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
constexpr auto field_name
static constexpr int approx_order
OpBaseImpl< PETSC, EdgeEleOp > OpBase
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpGradTimesTensor< 1, SPACE_DIM, SPACE_DIM > OpInternalForcePiola
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpGradTensorGrad< 1, SPACE_DIM, SPACE_DIM, -1 > OpKPiola
[Only used for dynamics]
FTensor::Index< 'm', 3 > m
Add operators pushing bases from local to physical configuration.
Boundary condition manager for finite element problem setup.
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
Definition of the displacement bc data structure.
Data on single entity (This is passed as argument to DataOperator::doWork)
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
auto getFTensor1N(FieldApproximationBase base)
Get base functions for Hdiv/Hcurl spaces.
Class (Function) to enforce essential constrains.
Structure for user loop methods on finite elements.
Field evaluator interface.
Definition of the heat flux bc data structure.
Section manager is used to create indexes and sections.
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmWorld()
Get the strm world object.
static boost::shared_ptr< std::ostream > getStrmSync()
Get the strm sync object.
Interface for managing meshsets containing materials and boundary conditions.
Natural boundary conditions.
Get vector field for H-div approximation.
Calculate divergence of vector field.
Specialization for double precision scalar field values calculation.
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
Specialization for MatrixDouble vector field values calculation.
Element used to execute operators on side of the element.
Post post-proc data at points from hash maps.
Operator for symmetrizing tensor fields.
Template struct for dimension-specific finite element types.
PipelineManager interface.
MoFEMErrorCode setDomainRhsIntegrationRule(RuleHookFun rule)
Set integration rule for domain right-hand side finite element.
Problem manager is used to build and partition problems.
Simple interface for fast problem set-up.
MoFEMErrorCode addDomainField(const std::string name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on domain.
MoFEMErrorCode getOptions()
get options
intrusive_ptr for managing petsc objects
PetscReal ts_dt
Current time step size.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
auto getHeatCapacityPtr()
auto getHeatConductivityPtr()
VectorDouble coeffExpansion
auto getCoeffExpansionPtr()
MoFEMErrorCode getCommandLineParameters()
[Run problem]
MoFEMErrorCode runProblem()
[Run problem]
boost::shared_ptr< MatrixDouble > dispFieldPtr
boost::shared_ptr< MatrixDouble > strainFieldPtr
ThermoElasticProblem(MoFEM::Interface &m_field)
std::array< double, 3 > fieldEvalCoords
boost::shared_ptr< VectorDouble > tempFieldPtr
boost::shared_ptr< MatrixDouble > fluxFieldPtr
MoFEMErrorCode opThermoElasticFactoryDomainRhs(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_ptr, boost::shared_ptr< ThermoElasticProblem::BlockedThermalParameters > thermal_common_ptr, boost::shared_ptr< ThermoElasticProblem::BlockedThermoElasticParameters > thermoelastic_common_ptr, Sev sev)
MoFEM::Interface & mField
MoFEMErrorCode setupProblem()
add fields
MoFEMErrorCode bC()
[Set up problem]
boost::shared_ptr< MatrixDouble > stressFieldPtr
MoFEMErrorCode OPs()
[Boundary condition]
MoFEMErrorCode tsSolve()
[Push operators to pipeline]
MoFEMErrorCode opThermoElasticFactoryDomainLhs(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, std::string coupled_field_name, std::string elastic_block_name, std::string thermal_block_name, std::string thermoelastic_block_name, Sev sev, double scale=1)
MoFEMErrorCode opThermoElasticFactoryDomainLhs(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, std::string coupled_field_name, boost::shared_ptr< HenckyOps::CommonData > elastic_common_ptr, boost::shared_ptr< ThermoElasticProblem::BlockedThermalParameters > thermal_common_ptr, boost::shared_ptr< ThermoElasticProblem::BlockedThermoElasticParameters > thermoelastic_common_ptr, Sev sev)
MoFEMErrorCode addMatThermalBlockOps(boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pipeline, std::string block_name, boost::shared_ptr< BlockedThermalParameters > blockedParamsPtr, Sev sev)
MoFEMErrorCode addMatThermoElasticBlockOps(boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pipeline, std::string block_name, boost::shared_ptr< BlockedThermoElasticParameters > blockedParamsPtr, Sev sev)
boost::shared_ptr< MatrixDouble > dispGradPtr
MoFEMErrorCode opThermoElasticFactoryDomainRhs(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, std::string elastic_block_name, std::string thermal_block_name, std::string thermoelastic_block_name, Sev sev, double scale=1)
boost::shared_ptr< FieldEvaluatorInterface::SetPtsData > fieldEvalData
ElementsAndOps< SPACE_DIM >::SideEle SideEle
#define FINITE_DEFORMATION_FLAG
constexpr AssemblyType AT
constexpr IntegrationType IT
static char help[]
[Solve]
constexpr bool IS_LARGE_STRAINS
#define EXECUTABLE_DIMENSION
double default_heat_capacity
double default_young_modulus
[Natural boundary conditions]
double default_coeff_expansion
PetscBool do_output_domain
double default_heat_conductivity
double default_poisson_ratio
constexpr bool IS_LARGE_STRAINS
double default_heat_capacity
double default_young_modulus
[Essential boundary conditions (Least square approach)]
double default_coeff_expansion
PetscBool do_output_domain
double default_heat_conductivity
double default_poisson_ratio