v0.16.3
Loading...
Searching...
No Matches
auxiliary_logarithmic_stress_patch_atom.cpp
Go to the documentation of this file.
1/**
2 * @file auxiliary_logarithmic_stress_patch_atom.cpp
3 * @brief Homogeneous finite-deformation patch and boundary flux verification.
4 */
5
6#include <MoFEM.hpp>
7using namespace MoFEM;
10#include <Lie.hpp>
11using namespace EshelbianPlasticity;
12
13namespace {
14
15using VolumeElement = VolumeElementForcesAndSourcesCore;
16using FaceElement = FaceElementForcesAndSourcesCore;
17
18// Independent forward reference: diagonal logarithmic stretch followed by a
19// finite rotation. The boundary callback constructs the same F with Rodrigues.
20struct Reference {
21 const double c10 = 1.7;
22 const double bulk = 8.5;
23 const double theta = .03;
24 FTensor::Tensor1<double, 3> omega{.02, -.015, .01};
25 FTensor::Tensor2<double, 3, 3> deformation, piola;
27
28 Reference() {
29 FTENSOR_INDEXES(3, i, j, k);
30 double total_angle = omega.l2();
32 "-test_patch_total_rotation",
33 &total_angle, nullptr),
34 "get patch rotation");
35 omega(i) *= total_angle / omega.l2();
36 FTensor::Tensor2_symmetric<double, 3> t_h{.04, 0., 0., -.015, 0., .005};
38 std::exp(.04), 0., 0., std::exp(-.015), 0., std::exp(.005)};
40 std::exp(-.04), 0., 0., std::exp(.015), 0., std::exp(-.005)};
41 const auto t_rotation = LieGroups::SO3::exp(omega, omega.l2());
42 FTensor::Tensor2<double, 3, 3> t_inverse_transpose;
43 deformation(i, j) = t_rotation(i, k) * t_u(k, j);
44 t_inverse_transpose(i, j) = t_rotation(i, k) * t_inverse_u(k, j);
45 const double jacobian = std::exp(theta);
46 const double invariant = deformation(i, j) * deformation(i, j);
47 piola(i, j) =
48 (2. * c10 * std::exp(-2. * theta / 3.)) *
49 (deformation(i, j) - (invariant / 3.) * t_inverse_transpose(i, j)) +
50 (bulk * jacobian * (jacobian - 1.)) * t_inverse_transpose(i, j);
53 std::exp(.06), 0., 0., std::exp(-.05), 0., std::exp(-.01)};
55 FTensor::Index<'A', 5> A;
56 stress(A) *= 2. * c10;
57 }
58};
59
60struct Audit {
61 enum Error { F, P, D, THETA, TD, OMEGA, W, FLUX, FACE_FLUX, COUNT };
62 std::array<double, COUNT> error{};
63 std::array<double, 3> reaction{};
64 PetscInt volumePoints = 0;
65 PetscInt faces = 0;
66 double boundaryArea = 0.;
67 MatrixDouble exactTraction;
68};
69
70struct OpCheckVolume : VolumeElement::UserDataOperator {
71 OpCheckVolume(boost::shared_ptr<DataAtIntegrationPts> data,
72 boost::shared_ptr<Audit> audit,
73 boost::shared_ptr<Reference> reference)
74 : VolumeElement::UserDataOperator(NOSPACE, OPSPACE), dataPtr(data),
75 auditPtr(audit), referencePtr(reference) {}
76
77 MoFEMErrorCode doWork(int, EntityType, EntData &) override {
79 FTENSOR_INDEXES(3, i, j);
80 FTensor::Index<'A', 5> A;
81 constexpr auto t_identity = FTensor::Kronecker_Delta<int>();
82 const int points = getGaussPts().size2();
83 if (points <= 1)
84 SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
85 "Patch requires multiple volume quadrature points");
86 auto t_f = dataPtr->getFTensorSmallH(points);
87 auto t_p = dataPtr->getFTensorApproxP(points);
88 auto rotation = dataPtr->getFTensorRotMat(points);
89 auto t_w = dataPtr->getFTensorSmallWL2(points);
90 auto t_x = getFTensor1CoordsAtGaussPts();
91 auto t_d = MatrixSizeHelper<GetFTensor1FromMatType<5, -1, DL>, DL>::get(
92 *dataPtr->auxiliaryData->logDeviator, points)();
93 auto t_theta = MatrixSizeHelper<GetFTensor1FromMatType<1, -1, DL>, DL>::get(
94 *dataPtr->auxiliaryData->logJacobian, points)();
95 auto t_stress =
97 *dataPtr->auxiliaryData->stress, points)();
98 const auto &reference = *referencePtr;
99 FTensor::Tensor2<double, 3, 3> t_matrix_error;
100 FTensor::Tensor1<double, 3> t_vector_error;
101 FTensor::Tensor1<double, 5> t_material_error;
102 const auto update = [&](Audit::Error index, double error) {
103 auditPtr->error[index] = std::max(
104 auditPtr->error[index],
105 std::isfinite(error) ? error
106 : std::numeric_limits<double>::infinity());
107 };
108 for (int gg = 0; gg != points; ++gg) {
109 t_matrix_error(i, j) = t_f(i, j) - reference.deformation(i, j);
110 update(Audit::F, std::sqrt(t_matrix_error(i, j) * t_matrix_error(i, j)));
111 t_matrix_error(i, j) = t_p(i, j) - reference.piola(i, j);
112 update(Audit::P, std::sqrt(t_matrix_error(i, j) * t_matrix_error(i, j)));
113 t_material_error(A) = t_d(A) - reference.deviator(A);
114 update(Audit::D, std::sqrt(t_material_error(A) * t_material_error(A)));
115 update(Audit::THETA, std::abs(t_theta(0) - reference.theta));
116 t_material_error(A) = t_stress(A) - reference.stress(A);
117 update(Audit::TD, std::sqrt(t_material_error(A) * t_material_error(A)));
118 // Compare physical rotations; branch-equivalent coefficients may differ.
119 const auto expected_rotation =
120 LieGroups::SO3::exp(reference.omega, reference.omega.l2());
121 t_matrix_error(i, j) = rotation(i, j) - expected_rotation(i, j);
122 update(Audit::OMEGA,
123 std::sqrt(t_matrix_error(i, j) * t_matrix_error(i, j)));
124 t_vector_error(i) =
125 t_w(i) - (reference.deformation(i, j) - t_identity(i, j)) * t_x(j);
126 update(Audit::W, t_vector_error.l2());
127 ++t_f;
128 ++t_p;
129 ++rotation;
130 ++t_w;
131 ++t_x;
132 ++t_d;
133 ++t_theta;
134 ++t_stress;
135 }
136 auditPtr->volumePoints += points;
138 }
139
140 boost::shared_ptr<DataAtIntegrationPts> dataPtr;
141 boost::shared_ptr<Audit> auditPtr;
142 boost::shared_ptr<Reference> referencePtr;
143};
144
145struct OpPatchTraction : OpCalculateTractionFromSideEle {
146 OpPatchTraction(boost::shared_ptr<DataAtIntegrationPts> data,
147 boost::shared_ptr<Audit> audit,
148 boost::shared_ptr<Reference> reference)
149 : OpCalculateTractionFromSideEle(data), auditPtr(audit),
150 referencePtr(reference) {}
151
152 MoFEMErrorCode doWork(int side, EntityType type, EntData &data) override {
155 if (getLoopSize() != 1)
156 SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
157 "Patch flux check requires an exterior face");
158 FTENSOR_INDEXES(3, i, j);
159 const int points = getGaussPts().size2();
160 auto t_normal = getFTensor1NormalsAtGaussPts();
161 auto t_exact =
163 auditPtr->exactTraction, points)();
164 for (int gg = 0; gg != points; ++gg) {
165 t_exact(i) = referencePtr->piola(i, j) *
166 (getSkeletonSense() * t_normal(j) / t_normal.l2());
167 ++t_normal;
168 ++t_exact;
169 }
171 }
172
173 boost::shared_ptr<Audit> auditPtr;
174 boost::shared_ptr<Reference> referencePtr;
175};
176
177struct OpCheckFace : FaceElement::UserDataOperator {
178 OpCheckFace(boost::shared_ptr<DataAtIntegrationPts> data,
179 boost::shared_ptr<Audit> audit)
180 : FaceElement::UserDataOperator(NOSPACE, OPSPACE), dataPtr(data),
181 auditPtr(audit) {}
182
183 MoFEMErrorCode doWork(int, EntityType, EntData &) override {
185 FTENSOR_INDEX(3, i);
186 const int points = getGaussPts().size2();
187 auto t_weight = getFTensor0IntegrationWeight();
188 auto t_traction = dataPtr->getFTensorTraction(points);
189 auto t_exact = MatrixSizeHelper<GetFTensor1FromMatType<3, -1, DL>, DL>::get(
190 auditPtr->exactTraction, points)();
191 FTensor::Tensor1<double, 3> t_error, t_face_error{0., 0., 0.};
192 FTensor::Tensor1<double, 3> t_reaction{0., 0., 0.};
193 double area = 0.;
194 for (int gg = 0; gg != points; ++gg) {
195 const double weight = t_weight * getMeasure();
196 t_error(i) = t_traction(i) - t_exact(i);
197 if (!std::isfinite(t_error.l2()))
198 SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
199 "Nonfinite patch traction error");
200 auditPtr->error[Audit::FLUX] =
201 std::max(auditPtr->error[Audit::FLUX], t_error.l2());
202 t_face_error(i) += weight * t_error(i);
203 t_reaction(i) += weight * t_traction(i);
204 area += weight;
205 ++t_weight;
206 ++t_traction;
207 ++t_exact;
208 }
209 if (!(area > 0.))
210 SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
211 "Nonpositive patch face area");
212 auditPtr->error[Audit::FACE_FLUX] =
213 std::max(auditPtr->error[Audit::FACE_FLUX], t_face_error.l2() / area);
214 auditPtr->reaction[0] += t_reaction(0);
215 auditPtr->reaction[1] += t_reaction(1);
216 auditPtr->reaction[2] += t_reaction(2);
217 auditPtr->boundaryArea += area;
218 ++auditPtr->faces;
220 }
221
222 boost::shared_ptr<DataAtIntegrationPts> dataPtr;
223 boost::shared_ptr<Audit> auditPtr;
224};
225
226MoFEMErrorCode prepareMesh() {
228 int ranks;
229 CHKERR MPI_Comm_size(PETSC_COMM_WORLD, &ranks);
230 if (ranks != 1)
231 SETERRQ(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
232 "Prepare the patch mesh on one rank before partitioning");
233 char source[PETSC_MAX_PATH_LEN] = "";
234 char output[PETSC_MAX_PATH_LEN] = "";
235 CHKERR PetscOptionsGetString(nullptr, nullptr, "-file_name", source,
236 sizeof(source), nullptr);
237 CHKERR PetscOptionsGetString(nullptr, nullptr, "-output_file", output,
238 sizeof(output), nullptr);
239 if (!source[0] || !output[0] || std::string(source) == output)
240 SETERRQ(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
241 "Patch mesh preparation requires distinct source and output files");
242 moab::Core moab;
243 new ParallelComm(&moab, PETSC_COMM_WORLD);
244 CHKERR moab.load_file(source);
245 MoFEM::Core core(moab);
246 MoFEM::Interface &m_field = core;
247 auto *meshsets = m_field.getInterface<MeshsetsManager>();
248 CHKERR meshsets->setMeshsetFromFile();
249 std::vector<std::pair<CubitBCType, int>> old_sets;
250 for (auto it = meshsets->getBegin(); it != meshsets->getEnd(); ++it)
251 old_sets.emplace_back(CubitBCType(it->getMaskedBcTypeULong()),
252 it->getMeshsetId());
253 for (const auto &entry : old_sets)
254 CHKERR meshsets->deleteMeshset(entry.first, entry.second);
255 Range tets, skin;
256 CHKERR moab.get_entities_by_type(0, MBTET, tets);
257 if (tets.empty())
258 SETERRQ(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
259 "Patch fixture requires tetrahedra");
260 Skinner skinner(&moab);
261 CHKERR skinner.find_skin(0, tets, false, skin);
262 const std::string name = "ANALYTICAL_DISPLACEMENT_1001";
263 CHKERR meshsets->addMeshset(BLOCKSET, 1001, name);
264 CHKERR meshsets->addEntitiesToMeshset(BLOCKSET, 1001, skin);
265 CHKERR meshsets->setAttributes(BLOCKSET, 1001, {1., 1., 1.}, name);
266 CHKERR moab.write_file(output);
267 CHKERR PetscPrintf(
268 PETSC_COMM_WORLD, "Prepared affine patch: %d tetrahedra, %d skin faces\n",
269 static_cast<int>(tets.size()), static_cast<int>(skin.size()));
271}
272
273MoFEMErrorCode runPatch(EshelbianCore &ep) {
275 auto reference = boost::make_shared<Reference>();
279 CHKERR VecZeroEntries(state);
280 auto ts = createTS(PETSC_COMM_WORLD);
281 CHKERR TSSetType(ts, TSBEULER);
282 CHKERR TSAdaptRegister(TSADAPTMOFEM, TSAdaptCreateMoFEM);
283 TSAdapt adapt;
284 CHKERR TSGetAdapt(ts, &adapt);
285 CHKERR TSAdaptSetType(adapt, TSADAPTNONE);
287 TSConvergedReason reason;
288 PetscReal time;
289 CHKERR TSGetConvergedReason(ts, &reason);
290 CHKERR TSGetTime(ts, &time);
291 if (reason <= 0 || std::abs(time - 1.) > 1.e-12)
293 "Patch solve did not reach t=1: reason %d, time %g", reason, time);
295 SCATTER_REVERSE);
296
297 auto audit = boost::make_shared<Audit>();
298 auto volume = boost::make_shared<VolumeElement>(ep.mField);
299 CHKERR ep.setBaseVolumeElementOps(1, false, false, false, volume);
300 volume->getOpPtrVector().push_back(
301 new OpCheckVolume(ep.dataAtPts, audit, reference));
303
304 auto face = boost::make_shared<FaceElement>(ep.mField);
305 face->getRuleHook = [](int, int, int order) { return 2 * order + 1; };
306 CHKERR EshelbianPlasticity::AddHOOps<2, 3, 3>::add(
307 face->getOpPtrVector(), {L2}, ep.materialH1Positions, ep.frontAdjEdges);
308 auto *side =
310 face->getOpPtrVector().push_back(side);
311 auto side_fe = side->getSideFEPtr();
312 side_fe->getUserPolynomialBase() =
313 boost::make_shared<CGGUserPolynomialBase>();
314 CHKERR EshelbianPlasticity::AddHOOps<3, 3, 3>::add(
315 side_fe->getOpPtrVector(), {H1, HDIV, L2}, ep.materialH1Positions,
317 side_fe->getOpPtrVector().push_back(new OpCalculateHVecTensorField<3, 3>(
318 ep.piolaStress, ep.dataAtPts->getApproxPAtPts(),
319 boost::make_shared<double>(1.)));
320 side_fe->getOpPtrVector().push_back(new OpCalculateHTensorTensorField<3, 3>(
321 ep.bubbleField, ep.dataAtPts->getApproxPAtPts(), MBMAXTYPE));
322 side_fe->getOpPtrVector().push_back(
323 new OpPatchTraction(ep.dataAtPts, audit, reference));
324 face->getOpPtrVector().push_back(new OpCheckFace(ep.dataAtPts, audit));
326
327 std::array<double, Audit::COUNT> error;
328 std::array<double, 3> reaction;
329 PetscInt points, faces;
330 double area;
331 CHKERR MPI_Allreduce(audit->error.data(), error.data(), Audit::COUNT,
332 MPI_DOUBLE, MPI_MAX, ep.mField.get_comm());
333 CHKERR MPI_Allreduce(audit->reaction.data(), reaction.data(), 3, MPI_DOUBLE,
334 MPI_SUM, ep.mField.get_comm());
335 CHKERR MPI_Allreduce(&audit->volumePoints, &points, 1, MPIU_INT, MPI_SUM,
336 ep.mField.get_comm());
337 CHKERR MPI_Allreduce(&audit->faces, &faces, 1, MPIU_INT, MPI_SUM,
338 ep.mField.get_comm());
339 CHKERR MPI_Allreduce(&audit->boundaryArea, &area, 1, MPI_DOUBLE, MPI_SUM,
340 ep.mField.get_comm());
341 double tolerance = 1.e-7;
342 CHKERR PetscOptionsGetReal(nullptr, nullptr, "-patch_tolerance", &tolerance,
343 nullptr);
344 if (!(tolerance > 0.) || points == 0 || faces == 0 || !(area > 0.))
346 "Invalid patch tolerance or incomplete quadrature coverage");
347 const std::array<const char *, Audit::COUNT> names{
348 "F", "P", "D",
349 "theta", "Td", "R",
350 "w", "normal flux", "integrated face flux/area"};
351 for (int index = 0; index != Audit::COUNT; ++index) {
352 CHKERR PetscPrintf(ep.mField.get_comm(), "Patch %s error %.3e\n",
353 names[index], error[index]);
354 if (!std::isfinite(error[index]) || error[index] > tolerance)
356 "Patch %s error %g exceeds %g", names[index], error[index],
357 tolerance);
358 }
359 const FTensor::Tensor1<double, 3> t_reaction{reaction[0], reaction[1],
360 reaction[2]};
361 if (!std::isfinite(t_reaction.l2()) || t_reaction.l2() / area > tolerance)
363 "Patch total flux/area %g exceeds %g", t_reaction.l2() / area,
364 tolerance);
365 CHKERR PetscPrintf(ep.mField.get_comm(),
366 "Auxiliary homogeneous patch passed: %d volume points, "
367 "%d faces, total flux/area %.3e\n",
368 static_cast<int>(points), static_cast<int>(faces),
369 t_reaction.l2() / area);
371}
372
373} // namespace
374
375static char help[] =
376 "Prepare and solve an affine auxiliary logarithmic patch.\n";
377
378int main(int argc, char *argv[]) {
379 MoFEM::Core::Initialize(&argc, &argv, nullptr, help);
380#ifdef ENABLE_PYTHON_BINDING
381 Py_Initialize();
382 np::initialize();
383#endif
384 auto core_log = logging::core::get();
385 core_log->add_sink(LogManager::createSink(LogManager::getStrmWorld(), "EP"));
386 LogManager::setLog("EP");
387 core_log->add_sink(
389 LogManager::setLog("EPSELF");
390 core_log->add_sink(
392 LogManager::setLog("EPSYNC");
393 try {
395 // Read the mode before loading its mesh. The normal test setup creates its
396 // own MoFEM database and applies the same JSON configuration there.
397 {
398 moab::Core options_moab;
399 MoFEM::Core options_core(options_moab);
400 options_core.getInterface<JsonConfigManager>();
401 }
402 PetscBool prepare = PETSC_FALSE;
403 CHKERR PetscOptionsGetBool(nullptr, nullptr, "-patch_prepare", &prepare,
404 nullptr);
405 if (prepare)
406 CHKERR prepareMesh();
407 else
409 }
412 return 0;
413}
Shared mesh and problem setup for auxiliary formulation atoms.
Evaluation of independent logarithmic material fields.
std::string type
Lie algebra implementation.
boost::shared_ptr< DataAtIntegrationPts > data
boost::shared_ptr< PlasticLocalLawGaussData > dataPtr
EshelbianCore * ep
SmartPetscObj< Mat > jacobian
PetscInt size
#define FTENSOR_INDEXES(DIM,...)
#define FTENSOR_INDEX(DIM, I)
std::string name
#define TSADAPTMOFEM
Definition TsCtx.hpp:10
int main()
Kronecker Delta class.
#define CATCH_ERRORS
Catch errors.
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
@ NOSPACE
Definition definitions.h:83
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ BLOCKSET
@ MOFEM_ATOM_TEST_INVALID
Definition definitions.h:40
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
constexpr int order
constexpr double omega
Save field DOFS on vertices/tags.
@ F
double W
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
Definition DMMoFEM.cpp:543
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
Definition DMMoFEM.cpp:605
auto createDMVector(DM dm, RowColData rc=RowColData::COL)
Get smart vector from DM.
Definition DMMoFEM.hpp:1250
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
MoFEMErrorCode runAuxiliaryLogarithmicStressTest(const std::function< MoFEMErrorCode(EshelbianCore &)> &test)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
std::bitset< 32 > CubitBCType
Definition Types.hpp:52
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
PetscErrorCode PetscOptionsGetReal(PetscOptions *, const char pre[], const char name[], PetscReal *dval, PetscBool *set)
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
auto createTS(MPI_Comm comm)
decltype(GetFTensor1FromMatImpl< Tensor_Dim, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor1FromMatType
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
PetscErrorCode TSAdaptCreateMoFEM(TSAdapt adapt)
Craete MOFEM adapt.
Definition TsCtx.cpp:829
auto deviator(FTensor::Tensor2_symmetric< T, DIM > &t_stress, double trace, FTensor::Tensor2_symmetric< double, DIM > &t_alpha, FTensor::Number< DIM >)
const double D
diffusivity
constexpr AssemblyType A
MoFEMErrorCode setElasticElementOps(const int tag)
boost::shared_ptr< Range > frontAdjEdges
MoFEM::Interface & mField
const std::string materialH1Positions
const std::string elementVolumeName
MoFEMErrorCode solveElastic(TS ts, Vec x)
const std::string piolaStress
MoFEMErrorCode setElasticElementToTs(DM dm)
const std::string bubbleField
const std::string skinElement
MoFEMErrorCode setBaseVolumeElementOps(const int tag, const bool do_rhs, const bool do_lhs, const bool calc_rates, boost::shared_ptr< VolumeElementForcesAndSourcesCore > fe, const bool add_bubble=true)
boost::shared_ptr< DataAtIntegrationPts > dataAtPts
SmartPetscObj< DM > dmElastic
Elastic problem.
static auto exp(A &&t_w_vee, B &&theta)
Definition Lie.hpp:69
virtual MPI_Comm & get_comm() const =0
Core (interface) class.
Definition Core.hpp:83
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition Core.cpp:68
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition Core.cpp:123
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
static MoFEMErrorCode setMeshFileFromJson()
Set -file_name from JSON before Core is available.
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.
static boost::shared_ptr< std::ostream > getStrmSelf()
Get the strm self object.
Interface for managing meshsets containing materials and boundary conditions.
MoFEMErrorCode setMeshsetFromFile(const string file_name, const bool clean_file_options=true)
add blocksets reading config file
Calculate tenor field using tensor base, i.e. Hdiv/Hcurl.
Calculate tenor field using vectorial base, i.e. Hdiv/Hcurl.
Element used to execute operators on side of the element.
static FTensor::Tensor1< double, 5 > getCoordinates(const Tensor &t_tensor)
Project a full or symmetric tensor onto the five orthonormal columns.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)