#ifndef __THERMO_PLASTIC_OPS_HPP__
#define __THERMO_PLASTIC_OPS_HPP__
struct BlockedParameters
: public boost::enable_shared_from_this<BlockedParameters> {
};
struct ThermoPlasticBlockedParameters
: public boost::enable_shared_from_this<ThermoPlasticBlockedParameters> {
return boost::shared_ptr<double>(shared_from_this(), &
omega0);
}
return boost::shared_ptr<double>(shared_from_this(), &
omegaH);
}
return boost::shared_ptr<double>(shared_from_this(),
}
return boost::shared_ptr<double>(shared_from_this(), &
temp0);
}
return boost::shared_ptr<VectorDouble>(shared_from_this(), &
temperature);
}
return boost::shared_ptr<MatrixDouble>(shared_from_this(), &
heat_flux);
}
};
boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
std::string thermoplastic_block_name,
boost::shared_ptr<ThermoPlasticBlockedParameters> blockedParamsPtr,
boost::shared_ptr<ThermoElasticOps::BlockedThermalParameters>
&blockedThermalParamsPtr,
template <int DIM, IntegrationType I, typename DomainEleOp>
std::string thermal_block_name, std::string thermoelastic_block_name,
std::string thermoplastic_block_name,
boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
std::string u, std::string ep, std::string tau, std::string temperature,
bool with_rates = true);
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
struct OpCalculateAdiabaticHeatingRhsImpl;
template <int DIM, typename AssemblyDomainEleOp>
OpCalculateAdiabaticHeatingRhsImpl(
boost::shared_ptr<MatrixDouble> stress_measure,
boost::shared_ptr<MatrixDouble> plastic_strain_rate_measure,
ScalarFun inelastic_heating_function,
boost::shared_ptr<Range> ents_ptr = nullptr)
stressMeasurePtr(stress_measure),
plasticStrainRateMeasurePtr(plastic_strain_rate_measure),
inelasticHeatingFunction(inelastic_heating_function) {}
protected:
boost::shared_ptr<MatrixDouble> stressMeasurePtr;
boost::shared_ptr<MatrixDouble> plasticStrainRateMeasurePtr;
ScalarFun inelasticHeatingFunction;
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data);
};
template <int DIM, typename AssemblyDomainEleOp>
MoFEMErrorCode
OpCalculateAdiabaticHeatingRhsImpl<DIM, GAUSS, AssemblyDomainEleOp>::iNtegrate(
EntitiesFieldData::EntData &data) {
const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
auto t_stress = getFTensor2SymmetricFromMat<DIM>(*stressMeasurePtr);
auto t_plastic_strain_rate =
getFTensor2SymmetricFromMat<DIM>(*plasticStrainRateMeasurePtr);
const double vol = AssemblyDomainEleOp::getMeasure();
auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
auto t_row_base = data.getFTensor0N();
auto t_coords = AssemblyDomainEleOp::getFTensor1CoordsAtGaussPts();
for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
const double alpha =
t_w * vol *
inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
t_stress(
i,
j) * t_plastic_strain_rate(
i,
j);
size_t rr = 0;
for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
AssemblyDomainEleOp::locF[rr] += alpha * t_row_base;
++t_row_base;
}
for (; rr < AssemblyDomainEleOp::nbRowBaseFunctions; ++rr)
++t_row_base;
++t_w;
++t_coords;
++t_stress;
++t_plastic_strain_rate;
};
}
struct OpCalculateAdiabaticHeatingRhs;
template <int SPACE_DIM, IntegrationType I, typename AssemblyDomainEleOp>
: public OpCalculateAdiabaticHeatingRhsImpl<SPACE_DIM, GAUSS,
AssemblyDomainEleOp> {
OpCalculateAdiabaticHeatingRhs(
boost::shared_ptr<MatrixDouble> stress_measure,
boost::shared_ptr<MatrixDouble> plastic_strain_rate_measure,
ScalarFun inelastic_heating_function,
boost::shared_ptr<Range> ents_ptr = nullptr)
: OpCalculateAdiabaticHeatingRhsImpl<
SPACE_DIM, GAUSS,
field_name, stress_measure, plastic_strain_rate_measure,
inelastic_heating_function, ents_ptr) {}
};
template <int SPACE_DIM, IntegrationType I, typename AssemblyDomainEleOp>
: public OpCalculateAdiabaticHeatingRhsImpl<SPACE_DIM, GAUSS,
AssemblyDomainEleOp> {
OpCalculateAdiabaticHeatingRhs(
boost::shared_ptr<MatrixDouble> stress_measure,
boost::shared_ptr<MatrixDouble> plastic_strain_rate_measure,
ScalarFun inelastic_heating_function,
boost::shared_ptr<Range> ents_ptr = nullptr)
: OpCalculateAdiabaticHeatingRhsImpl<
SPACE_DIM, GAUSS,
field_name, stress_measure, plastic_strain_rate_measure,
inelastic_heating_function, ents_ptr) {}
};
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
struct OpCalculateAdiabaticHeatingLhsdTImpl;
template <int DIM, typename AssemblyDomainEleOp>
OpCalculateAdiabaticHeatingLhsdTImpl(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
ScalarFun inelastic_heating_function,
boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
boost::shared_ptr<Range> ents_ptr = nullptr)
AssemblyDomainEleOp::OPROWCOL),
elasticCommonDataPtr(elastic_common_data_ptr),
plasticCommonDataPtr(plastic_common_data_ptr),
inelasticHeatingFunction(inelastic_heating_function),
coeffExpansionPtr(coeff_expansion_ptr), entsPtr(ents_ptr) {}
protected:
boost::shared_ptr<HenckyOps::CommonData> elasticCommonDataPtr;
boost::shared_ptr<PlasticOps::CommonData> plasticCommonDataPtr;
ScalarFun inelasticHeatingFunction;
boost::shared_ptr<VectorDouble> coeffExpansionPtr;
boost::shared_ptr<Range> entsPtr;
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
EntitiesFieldData::EntData &col_data);
};
template <int DIM, typename AssemblyDomainEleOp>
MoFEMErrorCode
OpCalculateAdiabaticHeatingLhsdTImpl<DIM, GAUSS, AssemblyDomainEleOp>::
iNtegrate(EntitiesFieldData::EntData &row_data,
EntitiesFieldData::EntData &col_data) {
const auto nb_integration_pts = row_data.getN().size1();
const auto nb_row_base_functions = row_data.getN().size2();
auto t_w = this->getFTensor0IntegrationWeight();
auto t_row_base = row_data.getFTensor0N();
auto t_plastic_strain_rate = getFTensor2SymmetricFromMat<DIM>(
*(plasticCommonDataPtr->getPlasticStrainDotPtr()));
auto t_D =
getFTensor4DdgFromMat<DIM, DIM, 0>(*(elasticCommonDataPtr->matDPtr));
auto t_coords = AssemblyDomainEleOp::getFTensor1CoordsAtGaussPts();
t_coeff_exp(d, d) = (*coeffExpansionPtr)[d];
}
for (auto gg = 0; gg != nb_integration_pts; ++gg) {
double alpha = this->getMeasure() * t_w;
auto rr = 0;
for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
auto t_col_base = col_data.getFTensor0N(gg, 0);
for (auto cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
#ifdef HENCKY_SMALL_STRAIN
AssemblyDomainEleOp::locMat(rr, cc) -=
alpha * t_row_base *
inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
t_coeff_exp(
i,
j) * t_D(
i,
j,
k,
l) * t_plastic_strain_rate(
k,
l) *
t_col_base;
#else
AssemblyDomainEleOp::locMat(rr, cc) -=
alpha * t_row_base *
inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
t_coeff_exp(
i,
j) * t_D(
i,
j,
k,
l) * t_plastic_strain_rate(
k,
l) *
t_col_base;
#endif
++t_col_base;
}
++t_row_base;
}
for (; rr != nb_row_base_functions; ++rr)
++t_row_base;
++t_w;
++t_plastic_strain_rate;
++t_D;
++t_coords;
}
}
struct OpCalculateAdiabaticHeatingLhsdT;
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
: public OpCalculateAdiabaticHeatingLhsdTImpl<DIM, GAUSS,
AssemblyDomainEleOp> {
OpCalculateAdiabaticHeatingLhsdT(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
ScalarFun inelastic_heating_function,
boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
boost::shared_ptr<Range> ents_ptr = nullptr)
: OpCalculateAdiabaticHeatingLhsdTImpl<DIM, GAUSS, AssemblyDomainEleOp>(
row_field_name, col_field_name, elastic_common_data_ptr,
plastic_common_data_ptr, inelastic_heating_function,
coeff_expansion_ptr, ents_ptr) {}
};
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
: public OpCalculateAdiabaticHeatingLhsdTImpl<DIM, GAUSS,
AssemblyDomainEleOp> {
OpCalculateAdiabaticHeatingLhsdT(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
ScalarFun inelastic_heating_function,
boost::shared_ptr<VectorDouble> coeff_expansion_ptr,
boost::shared_ptr<Range> ents_ptr = nullptr)
: OpCalculateAdiabaticHeatingLhsdTImpl<DIM, GAUSS, AssemblyDomainEleOp>(
row_field_name, col_field_name, elastic_common_data_ptr,
plastic_common_data_ptr, inelastic_heating_function,
coeff_expansion_ptr, ents_ptr) {}
};
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
struct OpCalculateAdiabaticHeatingLhsdEPImpl;
template <int DIM, typename AssemblyDomainEleOp>
OpCalculateAdiabaticHeatingLhsdEPImpl(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
ScalarFun inelastic_heating_function,
boost::shared_ptr<Range> ents_ptr = nullptr)
AssemblyDomainEleOp::OPROWCOL),
elasticCommonDataPtr(elastic_common_data_ptr),
plasticCommonDataPtr(plastic_common_data_ptr),
inelasticHeatingFunction(inelastic_heating_function),
entsPtr(ents_ptr) {
this->sYmm = false;
}
protected:
boost::shared_ptr<HenckyOps::CommonData> elasticCommonDataPtr;
boost::shared_ptr<PlasticOps::CommonData> plasticCommonDataPtr;
ScalarFun inelasticHeatingFunction;
boost::shared_ptr<Range> entsPtr;
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
EntitiesFieldData::EntData &col_data);
};
template <int DIM, typename AssemblyDomainEleOp>
MoFEMErrorCode
OpCalculateAdiabaticHeatingLhsdEPImpl<DIM, GAUSS, AssemblyDomainEleOp>::
iNtegrate(EntitiesFieldData::EntData &row_data,
EntitiesFieldData::EntData &col_data) {
constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
const auto nb_integration_pts = row_data.getN().size1();
const auto nb_row_base_functions = row_data.getN().size2();
auto t_w = this->getFTensor0IntegrationWeight();
auto t_row_base = row_data.getFTensor0N();
auto t_stress = getFTensor2SymmetricFromMat<DIM>(
*(elasticCommonDataPtr->getMatHenckyStress()));
auto t_plastic_strain_rate = getFTensor2SymmetricFromMat<DIM>(
*(plasticCommonDataPtr->getPlasticStrainDotPtr()));
auto t_D =
getFTensor4DdgFromMat<DIM, DIM, 0>(*(elasticCommonDataPtr->matDPtr));
auto t_coords = AssemblyDomainEleOp::getFTensor1CoordsAtGaussPts();
for (auto gg = 0; gg != nb_integration_pts; ++gg) {
auto t_vec = getFTensor1FromPtr<size_symm>(&this->locMat(0, 0));
double alpha = this->getMeasure() * t_w;
auto rr = 0;
for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
auto t_col_base = col_data.getFTensor0N(gg, 0);
for (
auto cc = 0; cc != AssemblyDomainEleOp::nbCols /
size_symm; cc++) {
#ifdef HENCKY_SMALL_STRAIN
t_vec(L) -=
alpha * t_row_base *
inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
(t_plastic_strain_rate(
i,
j) * t_D(
i,
j,
k,
l) *
this->getTSa() * t_stress(
i,
j) * t_diff(
i,
j,
m,
n)) *
t_col_base * t_L(
m,
n, L);
#else
t_vec(L) -=
alpha * t_row_base *
inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
(t_plastic_strain_rate(
i,
j) * t_D(
i,
j,
k,
l) *
this->getTSa() * t_stress(
i,
j) * t_diff(
i,
j,
m,
n)) *
t_col_base * t_L(
m,
n, L);
#endif
++t_vec;
++t_col_base;
}
++t_row_base;
}
for (; rr != nb_row_base_functions; ++rr)
++t_row_base;
++t_w;
++t_plastic_strain_rate;
++t_D;
++t_coords;
++t_stress;
}
}
struct OpCalculateAdiabaticHeatingLhsdEP;
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
: public OpCalculateAdiabaticHeatingLhsdEPImpl<DIM, GAUSS,
AssemblyDomainEleOp> {
OpCalculateAdiabaticHeatingLhsdEP(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
ScalarFun inelastic_heating_function,
boost::shared_ptr<Range> ents_ptr = nullptr)
: OpCalculateAdiabaticHeatingLhsdEPImpl<DIM, GAUSS, AssemblyDomainEleOp>(
row_field_name, col_field_name, elastic_common_data_ptr,
plastic_common_data_ptr, inelastic_heating_function, ents_ptr) {}
};
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
: public OpCalculateAdiabaticHeatingLhsdEPImpl<DIM, GAUSS,
AssemblyDomainEleOp> {
OpCalculateAdiabaticHeatingLhsdEP(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
ScalarFun inelastic_heating_function,
boost::shared_ptr<Range> ents_ptr = nullptr)
: OpCalculateAdiabaticHeatingLhsdEPImpl<DIM, GAUSS, AssemblyDomainEleOp>(
row_field_name, col_field_name, elastic_common_data_ptr,
plastic_common_data_ptr, inelastic_heating_function, ents_ptr) {}
};
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
struct OpCalculateAdiabaticHeatingLhsdUImpl;
template <int DIM, typename AssemblyDomainEleOp>
OpCalculateAdiabaticHeatingLhsdUImpl(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
ScalarFun inelastic_heating_function,
boost::shared_ptr<Range> ents_ptr = nullptr)
AssemblyDomainEleOp::OPROWCOL),
elasticCommonDataPtr(elastic_common_data_ptr),
plasticCommonDataPtr(plastic_common_data_ptr),
inelasticHeatingFunction(inelastic_heating_function),
entsPtr(ents_ptr) {
this->sYmm = false;
}
protected:
boost::shared_ptr<HenckyOps::CommonData> elasticCommonDataPtr;
boost::shared_ptr<PlasticOps::CommonData> plasticCommonDataPtr;
ScalarFun inelasticHeatingFunction;
boost::shared_ptr<Range> entsPtr;
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
EntitiesFieldData::EntData &col_data);
};
template <int DIM, typename AssemblyDomainEleOp>
MoFEMErrorCode
OpCalculateAdiabaticHeatingLhsdUImpl<DIM, GAUSS, AssemblyDomainEleOp>::
iNtegrate(EntitiesFieldData::EntData &row_data,
EntitiesFieldData::EntData &col_data) {
const auto nb_integration_pts = row_data.getN().size1();
const auto nb_row_base_functions = row_data.getN().size2();
auto t_w = this->getFTensor0IntegrationWeight();
auto t_row_base = row_data.getFTensor0N();
auto t_logC_dC =
getFTensor4DdgFromMat<DIM, DIM>(elasticCommonDataPtr->matLogCdC);
auto t_C_dF =
getFTensor4FromMat<DIM, DIM, DIM, DIM, 1>(elasticCommonDataPtr->matCdF);
auto t_plastic_strain_rate = getFTensor2SymmetricFromMat<DIM>(
*(plasticCommonDataPtr->getPlasticStrainDotPtr()));
auto t_D =
getFTensor4DdgFromMat<DIM, DIM, 0>(*(elasticCommonDataPtr->matDPtr));
auto t_coords = AssemblyDomainEleOp::getFTensor1CoordsAtGaussPts();
for (auto gg = 0; gg != nb_integration_pts; ++gg) {
auto t_vec = getFTensor1FromPtr<DIM>(&this->locMat(0, 0));
double alpha = this->getMeasure() * t_w;
auto rr = 0;
for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
auto t_col_grad_base = col_data.getFTensor1DiffN<DIM>(gg, 0);
for (auto cc = 0; cc != AssemblyDomainEleOp::nbCols / DIM; cc++) {
#ifdef HENCKY_SMALL_STRAIN
0.5 * alpha * t_row_base *
inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
(t_plastic_strain_rate(
i,
j) * t_D(
i,
j,
k,
l) *
t_logC_dC(
k,
l, o, p) * t_C_dF(o, p,
m,
n)) *
#else
0.5 * alpha * t_row_base *
inelasticHeatingFunction(t_coords(0), t_coords(1), t_coords(2)) *
(t_plastic_strain_rate(
i,
j) * t_D(
i,
j,
k,
l) *
t_logC_dC(
k,
l, o, p) * t_C_dF(o, p,
m,
n)) *
#endif
++t_col_grad_base;
++t_vec;
}
++t_row_base;
}
for (; rr != nb_row_base_functions; ++rr)
++t_row_base;
++t_w;
++t_plastic_strain_rate;
++t_D;
++t_coords;
++t_logC_dC;
++t_C_dF;
}
}
struct OpCalculateAdiabaticHeatingLhsdU;
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
: public OpCalculateAdiabaticHeatingLhsdUImpl<DIM, GAUSS,
AssemblyDomainEleOp> {
OpCalculateAdiabaticHeatingLhsdU(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
ScalarFun inelastic_heating_function,
boost::shared_ptr<Range> ents_ptr = nullptr)
: OpCalculateAdiabaticHeatingLhsdUImpl<DIM, GAUSS, AssemblyDomainEleOp>(
row_field_name, col_field_name, elastic_common_data_ptr,
plastic_common_data_ptr, inelastic_heating_function, ents_ptr) {}
};
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
: public OpCalculateAdiabaticHeatingLhsdUImpl<DIM, GAUSS,
AssemblyDomainEleOp> {
OpCalculateAdiabaticHeatingLhsdU(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<HenckyOps::CommonData> elastic_common_data_ptr,
boost::shared_ptr<PlasticOps::CommonData> plastic_common_data_ptr,
ScalarFun inelastic_heating_function,
boost::shared_ptr<Range> ents_ptr = nullptr)
: OpCalculateAdiabaticHeatingLhsdUImpl<DIM, GAUSS, AssemblyDomainEleOp>(
row_field_name, col_field_name, elastic_common_data_ptr,
plastic_common_data_ptr, inelastic_heating_function, ents_ptr) {}
};
template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
std::string thermal_block_name,
boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
std::string u, std::string ep, std::string tau, std::string temperature);
template <int DIM, AssemblyType A, IntegrationType I, typename DomainEleOp>
std::string thermal_block_name,
boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
std::string u, std::string ep, std::string tau, std::string temperature);
template <IntegrationType I, typename AssemblyDomainEleOp>
struct OpCalculateConstraintsLhs_dTImpl;
template <IntegrationType I>
OpCalculateConstraintsLhs_dTImpl<I, AssemblyDomainEleOp>;
template <typename AssemblyDomainEleOp>
OpCalculateConstraintsLhs_dTImpl(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
TP_common_data_ptr);
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
EntitiesFieldData::EntData &col_data);
private:
boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
TPcommonDataPtr;
};
template <typename AssemblyDomainEleOp>
OpCalculateConstraintsLhs_dTImpl<GAUSS, AssemblyDomainEleOp>::
OpCalculateConstraintsLhs_dTImpl(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
TP_common_data_ptr)
DomainEleOp::OPROWCOL),
TPcommonDataPtr(TP_common_data_ptr) {
AssemblyDomainEleOp::sYmm = false;
}
template <typename AssemblyDomainEleOp>
MoFEMErrorCode
OpCalculateConstraintsLhs_dTImpl<GAUSS, AssemblyDomainEleOp>::iNtegrate(
EntitiesFieldData::EntData &row_data,
EntitiesFieldData::EntData &col_data) {
const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
const auto nb_row_base_functions = row_data.getN().size2();
auto t_res_c_dtemperature =
getFTensor0FromVec(TPcommonDataPtr->resCdTemperature);
auto next = [&]() { ++t_res_c_dtemperature; };
auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
auto t_row_base = row_data.getFTensor0N();
for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
++t_w;
const auto res = alpha * (t_res_c_dtemperature);
next();
auto mat_ptr = AssemblyDomainEleOp::locMat.data().begin();
size_t rr = 0;
for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
auto t_col_base = col_data.getFTensor0N(gg, 0);
for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; ++cc) {
*mat_ptr += t_row_base * t_col_base * res;
++t_col_base;
++mat_ptr;
}
++t_row_base;
}
for (; rr < nb_row_base_functions; ++rr)
++t_row_base;
}
}
template <int DIM, IntegrationType I, typename AssemblyDomainEleOp>
struct OpCalculatePlasticFlowLhs_dTImpl;
template <int DIM, IntegrationType I>
OpCalculatePlasticFlowLhs_dTImpl<DIM, I, AssemblyDomainEleOp>;
template <int DIM, typename AssemblyDomainEleOp>
OpCalculatePlasticFlowLhs_dTImpl(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
common_TP_data_ptr);
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data,
EntitiesFieldData::EntData &col_data);
private:
boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
commonTPDataPtr;
};
template <int DIM, typename AssemblyDomainEleOp>
OpCalculatePlasticFlowLhs_dTImpl<DIM, GAUSS, AssemblyDomainEleOp>::
OpCalculatePlasticFlowLhs_dTImpl(
const std::string row_field_name, const std::string col_field_name,
boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters>
common_TP_data_ptr)
DomainEleOp::OPROWCOL),
commonTPDataPtr(common_TP_data_ptr) {
AssemblyDomainEleOp::sYmm = false;
}
template <int DIM, typename AssemblyDomainEleOp>
MoFEMErrorCode
OpCalculatePlasticFlowLhs_dTImpl<DIM, GAUSS, AssemblyDomainEleOp>::iNtegrate(
EntitiesFieldData::EntData &row_data,
EntitiesFieldData::EntData &col_data) {
constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
const size_t nb_row_base_functions = row_data.getN().size2();
auto &locMat = AssemblyDomainEleOp::locMat;
auto t_res_flow_dtemp =
getFTensor2SymmetricFromMat<DIM>(commonTPDataPtr->resFlowDtemp);
auto next = [&]() { ++t_res_flow_dtemp; };
auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
auto t_row_base = row_data.getFTensor0N();
for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
++t_w;
t_res_vec(L) = alpha * (t_res_flow_dtemp(
i,
j) * t_L(
i,
j, L));
next();
size_t rr = 0;
for (; rr != AssemblyDomainEleOp::nbRows /
size_symm; ++rr) {
auto t_col_base = col_data.getFTensor0N(gg, 0);
for (size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
t_mat(L) += t_row_base * t_col_base * t_res_vec(L);
++t_mat;
++t_col_base;
}
++t_row_base;
}
for (; rr != nb_row_base_functions; ++rr)
++t_row_base;
}
}
};
#endif
constexpr int SPACE_DIM
[Define dimension]
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
FTensor::Index< 'i', SPACE_DIM > i
const double n
refractive index of diffusive medium
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
static auto get_mat_tensor_sym_dscalar(size_t rr, MatrixDouble &mat, FTensor::Number< 2 >)
auto symm_L_tensor(FTensor::Number< DIM >)
auto diff_tensor(FTensor::Number< DIM >)
[Lambda functions]
MoFEMErrorCode opThermoPlasticFactoryDomainLhs(MoFEM::Interface &m_field, std::string block_name, std::string thermal_block_name, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string u, std::string ep, std::string tau, std::string temperature)
MoFEMErrorCode opThermoPlasticFactoryDomainRhs(MoFEM::Interface &m_field, std::string block_name, std::string thermal_block_name, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string u, std::string ep, std::string tau, std::string temperature)
OpCalculatePlasticFlowLhs_dTImpl< DIM, I, AssemblyDomainEleOp > OpCalculatePlasticFlowLhs_dT
auto createCommonThermoPlasticOps(MoFEM::Interface &m_field, std::string plastic_block_name, std::string thermal_block_name, std::string thermoelastic_block_name, std::string thermoplastic_block_name, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string u, std::string ep, std::string tau, std::string temperature, double scale, ScalerFunTwoArgs thermal_conductivity_scaling, ScalerFunTwoArgs heat_capacity_scaling, ScalerFunThreeArgs inelastic_heat_fraction_scaling, Sev sev, bool with_rates=true)
OpCalculateConstraintsLhs_dTImpl< I, AssemblyDomainEleOp > OpCalculateConstraintsLhs_dT
MoFEMErrorCode addMatThermoPlasticBlockOps(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pipeline, std::string thermoplastic_block_name, boost::shared_ptr< ThermoPlasticBlockedParameters > blockedParamsPtr, boost::shared_ptr< ThermoElasticOps::BlockedThermalParameters > &blockedThermalParamsPtr, Sev sev, ScalerFunThreeArgs inelastic_heat_fraction_scaling)
constexpr IntegrationType I
constexpr auto field_name
FTensor::Index< 'm', 3 > m
Deprecated interface functions.
auto getHeatConductivityPtr()
double inelasticHeatFraction
auto getHeatCapacityPtr()
auto getInelasticHeatFractionPtr()
auto getCoeffExpansionPtr()
VectorDouble resCdTemperature
auto getInelasticHeatFractionPtr()
double inelasticHeatFraction
MatrixDouble resFlowDtemp
FormsIntegrators< DomainEleOp >::Assembly< A >::OpBase AssemblyDomainEleOp
ScalerFunTwoArgs heat_capacity_scaling
ScalerFunThreeArgs inelastic_heat_fraction_scaling
boost::function< double(const double, const double, const double)> ScalerFunThreeArgs
boost::function< double(const double, const double)> ScalerFunTwoArgs
ScalerFunTwoArgs thermal_conductivity_scaling
constexpr bool IS_LARGE_STRAINS