35 std::vector<EntityHandle> &map_gauss_pts,
36 Range &post_proc_elements,
39 boost::shared_ptr<MatrixDouble> field_values_ptr,
40 boost::shared_ptr<MatrixDouble> mesh_positions_ptr,
41 boost::shared_ptr<MatrixDouble> field_gradient_ptr,
42 const std::string mesh_positions_field_name =
43 "MESH_NODE_POSITIONS",
44 const bool field_disp =
false,
45 const bool replace_nonanumber_by_max_value =
false,
46 const double max_val = 1e16,
47 const bool print_cauchy_stress =
false)
62 EntitiesFieldData::EntData &data) {
67 if (data.getIndices().size() == 0)
74 const auto &dof_ptr = data.getFieldDofs()[0];
79 int def_block_id = -1;
81 MB_TAG_CREAT | MB_TAG_SPARSE,
85 string tag_name_piola1 = dof_ptr->getName() +
"_PIOLA1_STRESS";
86 string tag_name_energy = dof_ptr->getName() +
"_ENERGY_DENSITY";
89 double def_VAL[tag_length];
90 bzero(def_VAL, tag_length *
sizeof(
double));
91 Tag th_piola1, th_energy, th_cauchy;
93 MB_TYPE_DOUBLE, th_piola1,
94 MB_TAG_CREAT | MB_TAG_SPARSE, def_VAL);
96 MB_TYPE_DOUBLE, th_energy,
97 MB_TAG_CREAT | MB_TAG_SPARSE, def_VAL);
100 string tag_name_cauchy =
"MED_" + dof_ptr->getName() +
"_CAUCHY_STRESS";
102 MB_TYPE_DOUBLE, th_cauchy,
103 MB_TAG_CREAT | MB_TAG_SPARSE, def_VAL);
106 int nb_gauss_pts = data.getN().size1();
107 if (
mapGaussPts.size() != (
unsigned int)nb_gauss_pts) {
109 "Nb. of integration points is not equal to number points on "
110 "post-processing mesh");
116 "Gradient of field not found, filed <%s> not found",
120 auto make_field_values = [](
auto values_ptr) {
121 std::vector<VectorDouble> values;
124 values.resize(values_ptr->size1());
125 for (
size_t gg = 0; gg != values_ptr->size1(); ++gg) {
126 values[gg].resize(values_ptr->size2(),
false);
127 for (
size_t rr = 0; rr != values_ptr->size2(); ++rr) {
128 values[gg][rr] = (*values_ptr)(gg, rr);
134 auto make_gradients = [](
auto gradient_ptr) {
135 std::vector<MatrixDouble> gradients;
138 const size_t field_rank = gradient_ptr->size2() / 3;
139 gradients.resize(gradient_ptr->size1());
140 for (
size_t gg = 0; gg != gradient_ptr->size1(); ++gg) {
141 gradients[gg].resize(field_rank, 3,
false);
142 for (
size_t rr = 0; rr != field_rank; ++rr) {
143 for (
size_t cc = 0; cc != 3; ++cc) {
144 gradients[gg](rr, cc) = (*gradient_ptr)(gg, 3 * rr + cc);
151 std::map<std::string, std::vector<VectorDouble>> field_map{
154 std::map<std::string, std::vector<MatrixDouble>> gradient_map{
157 MatrixDouble3by3
H, invH;
168 MatrixDouble3by3 maxP(3, 3);
171 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
178 for (
int dd = 0; dd != 3; dd++) {
183 (
unsigned int)nb_gauss_pts) {
187 detH = determinantTensor3by3(
H);
188 CHKERR invertTensor3by3(
H, detH, invH);
193 int nb_active_variables = 9;
195 nb_active_variables);
215 MatrixDouble3by3 P(3, 3);
216 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
220 if (!std::isnormal(val_energy)) {
225 for (
unsigned int r = 0; r != P.size1(); ++r) {
226 for (
unsigned int c = 0;
c != P.size2(); ++
c) {
227 if (!std::isnormal(P(r,
c)))
228 P(r,
c) = copysign(
maxVal, P(r,
c));