Get model parameters from blocks.
1010 {
1012
1013 struct OpMatBlocks : public ForcesAndSourcesCore::UserDataOperator {
1014
1015 using OP = ForcesAndSourcesCore::UserDataOperator;
1016
1017 double poissonRatio = 0.25;
1019 Tag thCompressiveYieldStress;
1020 Tag thTensionYieldStress;
1021 double youngsModulus;
1022 double yieldStrengthC;
1023 double yieldStrengthT;
1024
1025 OpMatBlocks(boost::shared_ptr<ParamsArray> params_array_ptr,
1026 boost::shared_ptr<ParamsArray> def_params_array_ptr,
1028 std::vector<const CubitMeshSets *> meshset_vec_ptr)
1029 :
OP(
NOSPACE,
OP::OPSPACE), paramsArrayPtr(params_array_ptr),
1030 defParamsArray(def_params_array_ptr), mField(m_field) {
1032 &poissonRatio, 0);
1033 rval = mField.get_moab().tag_get_handle(
1034 "YOUNGS_MODULUS", 1, MB_TYPE_DOUBLE, thYoungModulus, MB_TAG_SPARSE);
1035 if (rval != MB_SUCCESS) {
1036 MOFEM_LOG(
"ADOLCPlasticityWold", Sev::warning)
1037 << "YOUNGS_MODULUS tag does not exist using default value";
1039 &youngsModulus, 0);
1040 }
1041
1042 rval = mField.get_moab().tag_get_handle(
1043 "Yield_Strength_C", 1, MB_TYPE_DOUBLE, thCompressiveYieldStress,
1044 MB_TAG_SPARSE);
1045
1046 if (rval != MB_SUCCESS) {
1047 MOFEM_LOG(
"ADOLCPlasticityWold", Sev::warning)
1048 << "Yield_Strength_C tag does not exist using default value";
1049 yieldStrengthC = defParamsArray->at(SIGMA_YC);
1050 }
1051
1052 rval = mField.get_moab().tag_get_handle(
1053 "Yield_Strength_T", 1, MB_TYPE_DOUBLE, thTensionYieldStress,
1054 MB_TAG_SPARSE);
1055
1056 if (rval != MB_SUCCESS) {
1057 MOFEM_LOG(
"ADOLCPlasticityWold", Sev::warning)
1058 << "Yield_Strength_T tag does not exist using default value";
1059 yieldStrengthT = defParamsArray->at(SIGMA_YT);
1060 }
1061
1063 "Can not get data from block");
1064 }
1065
1067 EntitiesFieldData::EntData &data) {
1069
1070 for (auto &b : blockData) {
1071
1072 if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
1074
1075 if (thYoungModulus != 0)
1076 CHKERR mField.get_moab().tag_get_data(thYoungModulus, &fe_ent, 1,
1077 &youngsModulus);
1078
1079 if (thCompressiveYieldStress != 0)
1080 CHKERR mField.get_moab().tag_get_data(
1081 thCompressiveYieldStress, &fe_ent, 1, &yieldStrengthC);
1082
1083 if (thTensionYieldStress != 0)
1084 CHKERR mField.get_moab().tag_get_data(
1085 thTensionYieldStress, &fe_ent, 1, &yieldStrengthT);
1086
1087 std::copy(b.paramsArray.begin(), b.paramsArray.end(),
1088 paramsArrayPtr->begin());
1089
1090 (*paramsArrayPtr)[
LAMBDA] =
LAMBDA(youngsModulus, poissonRatio);
1091 (*paramsArrayPtr)[
MU] =
MU(youngsModulus, poissonRatio);
1092 (*paramsArrayPtr)[SIGMA_YC] = yieldStrengthC;
1093 (*paramsArrayPtr)[SIGMA_YT] = yieldStrengthT;
1094
1096 }
1097 }
1098
1099 std::copy(defParamsArray->begin(), defParamsArray->end(),
1100 paramsArrayPtr->begin());
1101
1103 }
1104
1105 private:
1106 boost::shared_ptr<ParamsArray> paramsArrayPtr;
1107 boost::shared_ptr<ParamsArray> defParamsArray;
1109
1111 ParamsArray paramsArray;
1113 };
1114
1115 std::vector<BlockData> blockData;
1116
1119 std::vector<const CubitMeshSets *> meshset_vec_ptr,
1120 Sev sev) {
1122
1123 for (
auto m : meshset_vec_ptr) {
1125 "Heterogeneous Paraboloidal")
1127 std::vector<double> block_data;
1128 CHKERR m->getAttributes(block_data);
1129 if (block_data.size() != 0) {
1131 "Expected that block has zero attributes");
1132 }
1133 auto get_block_ents = [&]() {
1136 m_field.
get_moab().get_entities_by_handle(
m->meshset, ents,
true);
1137 return ents;
1138 };
1139
1140 blockData.push_back({*defParamsArray, get_block_ents()});
1141 std::copy(block_data.begin(), block_data.end(),
1142 blockData.back().paramsArray.begin());
1145
1146
1147
1148
1150 <<
"Young modulus: " << (blockData.back().paramsArray)[
LAMBDA];
1152 <<
"Poisson ratio: " << (blockData.back().paramsArray)[
MU];
1153
1154 blockData.back().paramsArray[
LAMBDA] =
1157
1159 <<
"LAMBDA: " << (blockData.back().paramsArray)[
LAMBDA];
1161 <<
"MU: " << (blockData.back().paramsArray)[
MU];
1163 << "NUP: " << (blockData.back().paramsArray)[NUP];
1165 << "SIGMA_YT: " << (blockData.back().paramsArray)[SIGMA_YT];
1167 << "SIGMA_YC: " << (blockData.back().paramsArray)[SIGMA_YC];
1169 << "HT: " << (blockData.back().paramsArray)[HT];
1171 << "HC: " << (blockData.back().paramsArray)[HC];
1173 << "NT: " << (blockData.back().paramsArray)[NT];
1175 << "NC: " << (blockData.back().paramsArray)[NC];
1176 }
1178 }
1179 };
1180
1181 auto cubit_meshsets_vec_ptr =
1182 m_field.
getInterface<MeshsetsManager>()->getCubitMeshsetPtr(
1183 std::regex((boost::format("%s(.*)") % block_name).str()));
1184
1186 m_field, sev, cubit_meshsets_vec_ptr));
1187
1189 }
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
#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.
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
double young_modulus
Young modulus.
double poisson_ratio
Poisson ratio.
FTensor::Index< 'm', 3 > m
boost::shared_ptr< ParamsArray > paramsArrayPtr
boost::shared_ptr< ParamsArray > defaultParamsArrayPtr
virtual moab::Interface & get_moab()=0
Deprecated interface functions.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.