#ifndef __ADOLC_MATERIAL_MODELS_HPP
#define __ADOLC_MATERIAL_MODELS_HPP
#ifndef WITH_ADOL_C
#error "MoFEM need to be compiled with ADOL-C"
#endif
template <int DIM> struct J2Plasticity;
template <> struct J2Plasticity<3> : public ClosestPointProjection {
J2Plasticity() : ClosestPointProjection() {
nbInternalVariables = 7;
activeVariablesW.resize(12 + nbInternalVariables, false);
}
double K;
enum ModelParams {
LAMBDA,
MU, ISOH, KINK, PHI, SIGMA_Y, LAST_PARAM };
using ParamsArray = std::array<double, LAST_PARAM>;
boost::shared_ptr<ParamsArray> defaultParamsArrayPtr = nullptr;
boost::shared_ptr<ParamsArray> paramsArrayPtr = nullptr;
boost::shared_ptr<ParamsArray> oldParamsArrayPtr = nullptr;
MoFEMErrorCode getDefaultMaterialParameters() {
K = 0;
PETSC_NULLPTR);
0);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-sigma_y", &
sigmaY, PETSC_NULLPTR);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-H", &
H, PETSC_NULLPTR);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-K", &K, PETSC_NULLPTR);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-phi", &
phi, PETSC_NULLPTR);
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
defaultParamsArrayPtr = boost::make_shared<ParamsArray>();
(*defaultParamsArrayPtr)[
MU] =
mu;
(*defaultParamsArrayPtr)[ISOH] =
H;
(*defaultParamsArrayPtr)[KINK] = K;
(*defaultParamsArrayPtr)[PHI] =
phi;
(*defaultParamsArrayPtr)[SIGMA_Y] =
sigmaY;
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"LAMBDA: " << (*defaultParamsArrayPtr)[
LAMBDA];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"MU: " << (*defaultParamsArrayPtr)[
MU];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<< "H: " << (*defaultParamsArrayPtr)[ISOH];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<< "K: " << (*defaultParamsArrayPtr)[KINK];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<< "PHI: " << (*defaultParamsArrayPtr)[PHI];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<< "SIGMA_Y: " << (*defaultParamsArrayPtr)[SIGMA_Y];
paramsArrayPtr = boost::make_shared<ParamsArray>();
std::copy(defaultParamsArrayPtr->begin(), defaultParamsArrayPtr->end(),
paramsArrayPtr->begin());
oldParamsArrayPtr = boost::make_shared<ParamsArray>();
std::fill(oldParamsArrayPtr->begin(), oldParamsArrayPtr->end(), 0);
};
MoFEMErrorCode
boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
std::string block_name, Sev sev) {
struct OpMatBlocks : public ForcesAndSourcesCore::UserDataOperator {
using OP = ForcesAndSourcesCore::UserDataOperator;
OpMatBlocks(boost::shared_ptr<ParamsArray> params_array_ptr,
boost::shared_ptr<ParamsArray> def_params_array_otr,
std::vector<const CubitMeshSets *> meshset_vec_ptr)
:
OP(
NOSPACE, OP::OPSPACE), paramsArrayPtr(params_array_ptr),
defParamsArray(def_params_array_otr) {
"Can not get data from block");
}
MoFEMErrorCode doWork(int side, EntityType type,
EntitiesFieldData::EntData &data) {
for (auto &b : blockData) {
if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
std::copy(b.paramsArray.begin(), b.paramsArray.end(),
paramsArrayPtr->begin());
}
}
std::copy(defParamsArray->begin(), defParamsArray->end(),
paramsArrayPtr->begin());
}
private:
boost::shared_ptr<ParamsArray> paramsArrayPtr;
boost::shared_ptr<ParamsArray> defParamsArray;
ParamsArray paramsArray;
};
std::vector<BlockData> blockData;
MoFEMErrorCode
std::vector<const CubitMeshSets *> meshset_vec_ptr,
Sev sev) {
for (
auto m : meshset_vec_ptr) {
std::vector<double> block_data;
CHKERR m->getAttributes(block_data);
if (block_data.size() != 6) {
"Expected that block has two attribute");
}
auto get_block_ents = [&]() {
m_field.
get_moab().get_entities_by_handle(
m->meshset, ents,
true);
return ents;
};
blockData.push_back({*defParamsArray, get_block_ents()});
std::copy(block_data.begin(), block_data.end(),
blockData.back().paramsArray.begin());
<<
"Young modulus: " << (blockData.back().paramsArray)[
LAMBDA];
<<
"Poisson ratio: " << (blockData.back().paramsArray)[
MU];
blockData.back().paramsArray[
LAMBDA] =
<<
"LAMBDA: " << (blockData.back().paramsArray)[
LAMBDA];
<<
"MU: " << (blockData.back().paramsArray)[
MU];
<< "H: " << (blockData.back().paramsArray)[ISOH];
<< "K: " << (blockData.back().paramsArray)[KINK];
<< "PHI: " << (blockData.back().paramsArray)[PHI];
<< "SIGMA_Y: " << (blockData.back().paramsArray)[SIGMA_Y];
}
}
};
auto cubit_meshsets_vec_ptr =
m_field.
getInterface<MeshsetsManager>()->getCubitMeshsetPtr(
std::regex((boost::format("%s(.*)") % block_name).str()));
pip.push_back(new OpMatBlocks(paramsArrayPtr, defaultParamsArrayPtr,
m_field, sev, cubit_meshsets_vec_ptr));
}
MoFEMErrorCode setParams(short tag, bool &recalculate_elastic_tangent) {
switch (tag) {
case TypesTags::W: {
set_param_vec(tapesTags[tag], paramsArrayPtr->size(),
paramsArrayPtr->data());
for (auto p = 0; p != LAST_PARAM; p++) {
if ((*paramsArrayPtr)[p] != (*oldParamsArrayPtr)[p]) {
recalculate_elastic_tangent = true;
std::copy(paramsArrayPtr->begin(), paramsArrayPtr->end(),
oldParamsArrayPtr->begin());
break;
}
}
} break;
case TypesTags::Y:
case TypesTags::H:
break;
default:
"Unknown tag for setParams");
}
}
MoFEMErrorCode freeHemholtzEnergy() {
auto p_lambda = mkparam(
lambda);
auto p_K = mkparam(K);
auto p_phi = mkparam(
phi);
auto p_sigma_y = mkparam(
sigmaY);
auto t_voight_total_strain = getFTensor1FromPtr<6>(&a_sTrain[0]);
auto t_voight_plastic_strain = getFTensor1FromPtr<6>(&a_plasticStrain[0]);
auto t_voight_internal_tensor =
getFTensor1FromPtr<6>(&a_internalVariables[1]);
tTotalStrain(
i,
j) = t_voight_strain_op(
i,
j, Z) * t_voight_total_strain(Z);
t_voight_strain_op(
i,
j, Z) * t_voight_plastic_strain(Z);
t_voight_strain_op(
i,
j, Z) * t_voight_internal_tensor(Z);
tElasticStrain(
i,
j) = tTotalStrain(
i,
j) - tPlasticStrain(
i,
j);
tR = tElasticStrain(
i,
i);
a_w = 0.5 * p_lambda * tR * tR +
p_mu * (tElasticStrain(
i,
j) * tElasticStrain(
i,
j));
a_w +=
a_internalVariables[0] * p_sigma_y +
0.5 * p_phi * p_H * (a_internalVariables[0] * a_internalVariables[0]);
a_w += (0.5 * (1 - p_phi) * p_K) *
(tInternalTensor(
i,
j) * tInternalTensor(
i,
j));
}
MoFEMErrorCode evalF() {
auto t_vioght_stress = getFTensor1FromPtr<6>(&a_sTress[0]);
auto t_back_stress = getFTensor1FromPtr<6>(&a_internalFluxes[1]);
tStress(
i,
j) = t_voight_stress_op(
i,
j, Z) * t_vioght_stress(Z);
tBackStress(
i,
j) = t_voight_stress_op(
i,
j, Z) * t_back_stress(Z);
constexpr double third = boost::math::constants::third<double>();
tDeviator(
i,
j) = tStress(
i,
j) - tR *
t_kd(
i,
j) - tBackStress(
i,
j);
constexpr double c = 3. / 2.;
f =
c * tDeviator(
i,
j) * tDeviator(
i,
j);
}
MoFEMErrorCode yieldFunction() {
a_y = sqrt(f) - a_internalFluxes[0];
}
MoFEMErrorCode flowPotential() {
a_h = sqrt(f) - a_internalFluxes[0];
}
MoFEMErrorCode codedHessianW(vector<double *> hessian)
{
lambda = (*paramsArrayPtr)[0];
mu = (*paramsArrayPtr)[1];
H = (*paramsArrayPtr)[5];
double lambda_plus_2mu =
lambda + 2 *
mu;
hessian[0][0] = lambda_plus_2mu;
hessian[1][1] = lambda_plus_2mu;
hessian[2][2] = lambda_plus_2mu;
for (
int i = 3;
i <= 5; ++
i) {
}
double neg_lambda_plus_2mu = -(
lambda + 2 *
mu);
for (
int i = 6;
i <= 8; ++
i) {
for (
int j = 0;
j <= 2; ++
j) {
hessian[
i][
j] = (
i - 6 ==
j) ? neg_lambda_plus_2mu : neg_lambda;
}
}
hessian[9][3] = neg_mu;
hessian[10][4] = neg_mu;
hessian[11][5] = neg_mu;
hessian[6][6] = lambda_plus_2mu;
hessian[7][7] = lambda_plus_2mu;
hessian[8][8] = lambda_plus_2mu;
}
};
template <> struct J2Plasticity<2> : public J2Plasticity<3> {
using J2Plasticity<3>::J2Plasticity;
MoFEMErrorCode freeHemholtzEnergy() {
auto p_lambda = mkparam(
lambda);
auto p_K = mkparam(K);
auto p_phi = mkparam(
phi);
auto p_sigma_y = mkparam(
sigmaY);
auto t_voight_total_strain = getFTensor1FromPtr<6>(&a_sTrain[0]);
auto t_voight_plastic_strain = getFTensor1FromPtr<6>(&a_plasticStrain[0]);
auto t_voight_internal_tensor =
getFTensor1FromPtr<6>(&a_internalVariables[1]);
tTotalStrain(
i,
j) = t_voight_strain_op(
i,
j, Z) * t_voight_total_strain(Z);
t_voight_strain_op(
i,
j, Z) * t_voight_plastic_strain(Z);
t_voight_strain_op(
i,
j, Z) * t_voight_internal_tensor(Z);
tElasticStrain(
i,
j) = tTotalStrain(
i,
j) - tPlasticStrain(
i,
j);
tElasticStrain(2, 2) =
(-tElasticStrain(0, 0) * p_lambda - tElasticStrain(1, 1) * p_lambda) /
(p_lambda + 2 * p_mu);
tR = tElasticStrain(
i,
i);
a_w = 0.5 * p_lambda * tR * tR +
p_mu * (tElasticStrain(
i,
j) * tElasticStrain(
i,
j));
a_w +=
a_internalVariables[0] * p_sigma_y +
0.5 * p_phi * p_H * (a_internalVariables[0] * a_internalVariables[0]);
a_w += (0.5 * (1 - p_phi) * p_K) *
(tInternalTensor(
i,
j) * tInternalTensor(
i,
j));
}
MoFEMErrorCode codedHessianW(vector<double *> hessian) {
"2D Energy Hessian not yet implemented");
}
};
struct ParaboloidalPlasticity : public ClosestPointProjection {
}
};
PETSC_NULLPTR);
0);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-sigma_yt", &
sigmaYt, PETSC_NULLPTR);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-sigma_yc", &
sigmaYc, PETSC_NULLPTR);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-Ht", &
Ht, PETSC_NULLPTR);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-Hc", &
Hc, PETSC_NULLPTR);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-nt", &
nt, PETSC_NULLPTR);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-nc", &
nc, PETSC_NULLPTR);
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-nup", &
nup, PETSC_NULLPTR);
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
(*defaultParamsArrayPtr)[
MU] =
mu;
(*defaultParamsArrayPtr)[
NUP] =
nup;
(*defaultParamsArrayPtr)[
HT] =
Ht;
(*defaultParamsArrayPtr)[
HC] =
Hc;
(*defaultParamsArrayPtr)[
NT] =
nt;
(*defaultParamsArrayPtr)[
NC] =
nc;
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"LAMBDA: " << (*defaultParamsArrayPtr)[
LAMBDA];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"MU: " << (*defaultParamsArrayPtr)[
MU];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"NUP: " << (*defaultParamsArrayPtr)[
NUP];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"SIGMA_YT: " << (*defaultParamsArrayPtr)[
SIGMA_YT];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"SIGMA_YC: " << (*defaultParamsArrayPtr)[
SIGMA_YC];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"HT: " << (*defaultParamsArrayPtr)[
HT];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"HC: " << (*defaultParamsArrayPtr)[
HC];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"NT: " << (*defaultParamsArrayPtr)[
NT];
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::inform)
<<
"NC: " << (*defaultParamsArrayPtr)[
NC];
};
MoFEMErrorCode
boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
std::string block_name, Sev sev) {
struct OpMatBlocks : public ForcesAndSourcesCore::UserDataOperator {
using OP = ForcesAndSourcesCore::UserDataOperator;
OpMatBlocks(boost::shared_ptr<ParamsArray> params_array_ptr,
boost::shared_ptr<ParamsArray> def_params_array_ptr,
std::vector<const CubitMeshSets *> meshset_vec_ptr)
:
OP(
NOSPACE, OP::OPSPACE), paramsArrayPtr(params_array_ptr),
defParamsArray(def_params_array_ptr) {
"Can not get data from block");
}
MoFEMErrorCode doWork(int side, EntityType type,
EntitiesFieldData::EntData &data) {
for (auto &b : blockData) {
if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
std::copy(b.paramsArray.begin(), b.paramsArray.end(),
paramsArrayPtr->begin());
}
}
std::copy(defParamsArray->begin(), defParamsArray->end(),
paramsArrayPtr->begin());
}
private:
boost::shared_ptr<ParamsArray> paramsArrayPtr;
boost::shared_ptr<ParamsArray> defParamsArray;
ParamsArray paramsArray;
};
std::vector<BlockData> blockData;
MoFEMErrorCode
std::vector<const CubitMeshSets *> meshset_vec_ptr,
Sev sev) {
for (
auto m : meshset_vec_ptr) {
std::vector<double> block_data;
CHKERR m->getAttributes(block_data);
if (block_data.size() != 9) {
"Expected that block has nine attributes");
}
auto get_block_ents = [&]() {
m_field.
get_moab().get_entities_by_handle(
m->meshset, ents,
true);
return ents;
};
blockData.push_back({*defParamsArray, get_block_ents()});
std::copy(block_data.begin(), block_data.end(),
blockData.back().paramsArray.begin());
<<
"Young modulus: " << (blockData.back().paramsArray)[
LAMBDA];
<<
"Poisson ratio: " << (blockData.back().paramsArray)[
MU];
blockData.back().paramsArray[
LAMBDA] =
<<
"LAMBDA: " << (blockData.back().paramsArray)[
LAMBDA];
<<
"MU: " << (blockData.back().paramsArray)[
MU];
<< "NUP: " << (blockData.back().paramsArray)[NUP];
<< "SIGMA_YT: " << (blockData.back().paramsArray)[SIGMA_YT];
<< "SIGMA_YC: " << (blockData.back().paramsArray)[SIGMA_YC];
<< "HT: " << (blockData.back().paramsArray)[HT];
<< "HC: " << (blockData.back().paramsArray)[HC];
<< "NT: " << (blockData.back().paramsArray)[NT];
<< "NC: " << (blockData.back().paramsArray)[NC];
}
}
};
auto cubit_meshsets_vec_ptr =
m_field.
getInterface<MeshsetsManager>()->getCubitMeshsetPtr(
std::regex((boost::format("%s(.*)") % block_name).str()));
m_field, sev, cubit_meshsets_vec_ptr));
}
MoFEMErrorCode
setParams(
short tag,
bool &recalculate_elastic_tangent) {
switch (tag) {
recalculate_elastic_tangent = true;
break;
}
}
} break;
break;
default:
"Unknown tag for setParams");
}
return 0;
}
auto p_lambda = mkparam(
lambda);
auto p_nup = mkparam(
nup);
auto p_sigma_yt = mkparam(
sigmaYt);
auto p_sigma_yc = mkparam(
sigmaYc);
auto t_voight_total_strain = getFTensor1FromPtr<6>(&
a_sTrain[0]);
t_voight_strain_op(
i,
j,
Z) * t_voight_plastic_strain(
Z);
}
{
lambda = (*paramsArrayPtr)[0];
mu = (*paramsArrayPtr)[1];
Ht = (*paramsArrayPtr)[5];
Hc = (*paramsArrayPtr)[6];
double lambda_plus_2mu =
lambda + 2 *
mu;
hessian[0][0] = lambda_plus_2mu;
hessian[1][1] = lambda_plus_2mu;
hessian[2][2] = lambda_plus_2mu;
for (
int i = 3;
i <= 5; ++
i) {
}
double neg_lambda_plus_2mu = -(
lambda + 2 *
mu);
for (
int i = 6;
i <= 8; ++
i) {
for (
int j = 0;
j <= 2; ++
j) {
hessian[
i][
j] = (
i - 6 ==
j) ? neg_lambda_plus_2mu : neg_lambda;
}
}
hessian[9][3] = neg_mu;
hessian[10][4] = neg_mu;
hessian[11][5] = neg_mu;
hessian[6][6] = lambda_plus_2mu;
hessian[7][7] = lambda_plus_2mu;
hessian[8][8] = lambda_plus_2mu;
}
auto t_vioght_stress = getFTensor1FromPtr<6>(&
a_sTress[0]);
tStress(
i,
j) = t_voight_stress_op(
i,
j,
Z) * t_vioght_stress(
Z);
}
}
double alpha =
}
};
struct HeterogeneousParaboloidalPlasticity : public ParaboloidalPlasticity {
MoFEMErrorCode
boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pip,
std::string block_name, Sev sev) override {
struct OpMatBlocks : public ForcesAndSourcesCore::UserDataOperator {
using OP = ForcesAndSourcesCore::UserDataOperator;
double poissonRatio = 0.25;
Tag thCompressiveYieldStress;
Tag thTensionYieldStress;
double youngsModulus;
double yieldStrengthC;
double yieldStrengthT;
OpMatBlocks(boost::shared_ptr<ParamsArray> params_array_ptr,
boost::shared_ptr<ParamsArray> def_params_array_ptr,
std::vector<const CubitMeshSets *> meshset_vec_ptr)
:
OP(
NOSPACE, OP::OPSPACE), paramsArrayPtr(params_array_ptr),
defParamsArray(def_params_array_ptr), mField(m_field) {
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-poisson_ratio",
&poissonRatio, 0);
rval = mField.get_moab().tag_get_handle(
"YOUNGS_MODULUS", 1, MB_TYPE_DOUBLE, thYoungModulus, MB_TAG_SPARSE);
if (rval != MB_SUCCESS) {
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::warning)
<< "YOUNGS_MODULUS tag does not exist using default value";
CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"-young_modulus",
&youngsModulus, 0);
}
rval = mField.get_moab().tag_get_handle(
"Yield_Strength_C", 1, MB_TYPE_DOUBLE, thCompressiveYieldStress,
MB_TAG_SPARSE);
if (rval != MB_SUCCESS) {
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::warning)
<< "Yield_Strength_C tag does not exist using default value";
yieldStrengthC = defParamsArray->at(SIGMA_YC);
}
rval = mField.get_moab().tag_get_handle(
"Yield_Strength_T", 1, MB_TYPE_DOUBLE, thTensionYieldStress,
MB_TAG_SPARSE);
if (rval != MB_SUCCESS) {
MOFEM_LOG(
"ADOLCPlasticityWold", Sev::warning)
<< "Yield_Strength_T tag does not exist using default value";
yieldStrengthT = defParamsArray->at(SIGMA_YT);
}
"Can not get data from block");
}
MoFEMErrorCode doWork(int side, EntityType type,
EntitiesFieldData::EntData &data) {
for (auto &b : blockData) {
if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
if (thYoungModulus != 0)
CHKERR mField.get_moab().tag_get_data(thYoungModulus, &fe_ent, 1,
&youngsModulus);
if (thCompressiveYieldStress != 0)
CHKERR mField.get_moab().tag_get_data(
thCompressiveYieldStress, &fe_ent, 1, &yieldStrengthC);
if (thTensionYieldStress != 0)
CHKERR mField.get_moab().tag_get_data(
thTensionYieldStress, &fe_ent, 1, &yieldStrengthT);
std::copy(b.paramsArray.begin(), b.paramsArray.end(),
paramsArrayPtr->begin());
(*paramsArrayPtr)[
LAMBDA] =
LAMBDA(youngsModulus, poissonRatio);
(*paramsArrayPtr)[
MU] =
MU(youngsModulus, poissonRatio);
(*paramsArrayPtr)[SIGMA_YC] = yieldStrengthC;
(*paramsArrayPtr)[SIGMA_YT] = yieldStrengthT;
}
}
std::copy(defParamsArray->begin(), defParamsArray->end(),
paramsArrayPtr->begin());
}
private:
boost::shared_ptr<ParamsArray> paramsArrayPtr;
boost::shared_ptr<ParamsArray> defParamsArray;
ParamsArray paramsArray;
};
std::vector<BlockData> blockData;
MoFEMErrorCode
std::vector<const CubitMeshSets *> meshset_vec_ptr,
Sev sev) {
for (
auto m : meshset_vec_ptr) {
"Heterogeneous Paraboloidal")
std::vector<double> block_data;
CHKERR m->getAttributes(block_data);
if (block_data.size() != 0) {
"Expected that block has zero attributes");
}
auto get_block_ents = [&]() {
m_field.
get_moab().get_entities_by_handle(
m->meshset, ents,
true);
return ents;
};
blockData.push_back({*defParamsArray, get_block_ents()});
std::copy(block_data.begin(), block_data.end(),
blockData.back().paramsArray.begin());
<<
"Young modulus: " << (blockData.back().paramsArray)[
LAMBDA];
<<
"Poisson ratio: " << (blockData.back().paramsArray)[
MU];
blockData.back().paramsArray[
LAMBDA] =
<<
"LAMBDA: " << (blockData.back().paramsArray)[
LAMBDA];
<<
"MU: " << (blockData.back().paramsArray)[
MU];
<< "NUP: " << (blockData.back().paramsArray)[NUP];
<< "SIGMA_YT: " << (blockData.back().paramsArray)[SIGMA_YT];
<< "SIGMA_YC: " << (blockData.back().paramsArray)[SIGMA_YC];
<< "HT: " << (blockData.back().paramsArray)[HT];
<< "HC: " << (blockData.back().paramsArray)[HC];
<< "NT: " << (blockData.back().paramsArray)[NT];
<< "NC: " << (blockData.back().paramsArray)[NC];
}
}
};
auto cubit_meshsets_vec_ptr =
m_field.
getInterface<MeshsetsManager>()->getCubitMeshsetPtr(
std::regex((boost::format("%s(.*)") % block_name).str()));
m_field, sev, cubit_meshsets_vec_ptr));
}
};
template <typename MODEL>
std::array<int, ClosestPointProjection::LAST_TAPE> tapes_tags = {0, 1, 2}) {
auto cp_ptr = boost::make_shared<MODEL>();
cp_ptr->getDefaultMaterialParameters();
cp_ptr->createMatAVecR();
cp_ptr->snesCreate();
cp_ptr->recordTapes();
cp_ptr->tapesTags = tapes_tags;
return cp_ptr;
}
}
#endif
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
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, severity)
Log.
FTensor::Index< 'i', SPACE_DIM > i
const double c
speed of light (cm/ns)
FTensor::Index< 'j', 3 > j
FTensor::Dg< double, 3, 6 > voight_to_stress_op()
Op convert Vight stress vector to stress tensor.
auto createMaterial(std::array< int, ClosestPointProjection::LAST_TAPE > tapes_tags={0, 1, 2})
FTensor::Dg< double, 3, 6 > voight_to_strain_op()
Op convert Vight strain vector to strain tensor.
double young_modulus
Young modulus.
double poisson_ratio
Poisson ratio.
double sigmaY
Yield stress.
FTensor::Index< 'm', 3 > m
VectorAdaptor activeVariablesW
ublas::vector< adouble > a_internalFluxes
ublas::vector< adouble > a_plasticStrain
std::array< int, LAST_TAPE > tapesTags
ublas::vector< adouble > a_internalVariables
ublas::vector< adouble > a_sTress
ublas::vector< adouble > a_sTrain
MoFEMErrorCode addMatBlockOps(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string block_name, Sev sev) override
Get model parameters from blocks.
MoFEMErrorCode addMatBlockOps(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string block_name, Sev sev)
Get model parameters from blocks.
FTensor::Index< 'i', 3 > i
MoFEMErrorCode yieldFunction()
Set yield function.
MoFEMErrorCode codedHessianW(vector< double * > hessian)
[Paraboloidal free energy]
FTensor::Index< 'j', 3 > j
MoFEMErrorCode getDefaultMaterialParameters()
FTensor::Tensor2_symmetric< adouble, 3 > tDeviator
MoFEMErrorCode evalF()
[Paraboloidal yield function]
boost::shared_ptr< ParamsArray > oldParamsArrayPtr
FTensor::Index< 'Z', 6 > Z
FTensor::Tensor2_symmetric< adouble, 3 > tPlasticStrain
boost::shared_ptr< ParamsArray > paramsArrayPtr
std::array< double, LAST_PARAM > ParamsArray
FTensor::Tensor2_symmetric< adouble, 3 > tTotalStrain
FTensor::Tensor2_symmetric< adouble, 3 > tElasticStrain
boost::shared_ptr< ParamsArray > defaultParamsArrayPtr
MoFEMErrorCode setParams(short tag, bool &recalculate_elastic_tangent)
Set parameters for ADOL-C of constitutive relations.
MoFEMErrorCode freeHemholtzEnergy()
[Paraboloidal free energy]
FTensor::Tensor2_symmetric< adouble, 3 > tStress
MoFEMErrorCode flowPotential()
[Paraboloidal yield function]
virtual moab::Interface & get_moab()=0
Deprecated interface functions.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.