v0.16.3
Loading...
Searching...
No Matches
elastic_tie_mesh.cpp
Go to the documentation of this file.
1/**
2 * @file elastic_tie_mesh.cpp
3 * @example mofem/tutorials/vec-11_elastic_tie_mesh/elastic_tie_mesh.cpp
4 * @brief Elastic mesh tie example with a tie-aware partitioned mesh loader
5 *
6 * @copyright Anonymous authors (c) 2025 under the MIT license
7 */
8
9#include <MoFEM.hpp>
10
11using namespace MoFEM;
12
14constexpr AssemblyType A =
15 (SCHUR_ASSEMBLE) ? AssemblyType::BLOCK_SCHUR : AssemblyType::PETSC;
16constexpr IntegrationType I = IntegrationType::GAUSS;
17
22using DomainEleOp = DomainEle::UserDataOperator;
23using BoundaryEleOp = BoundaryEle::UserDataOperator;
24
25struct DomainBCs {};
26struct BoundaryBCs {};
27
35
36#include <ElasticTie.hpp>
38
40
41 using ElasticTieMeshExample::ElasticTieMeshExample;
42
44
45private:
46 MoFEMErrorCode checkStressError(const int test);
47};
48
51
53
54 auto norm_fe = boost::make_shared<DomainEle>(mField);
55 norm_fe->getRuleHook = [](int, int, int approx_order) {
56 return 2 * approx_order + 1;
57 };
58
60 norm_fe->getOpPtrVector(), {H1}, "GEOMETRY");
61
62 auto common_ptr = HookeOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEle>(
63 mField, norm_fe->getOpPtrVector(), "U", "MAT_ELASTIC", Sev::verbose);
64
65 auto exact_stress_ptr = boost::make_shared<MatrixDouble>();
66
67 constexpr double uniaxial_stress_xx = 1e3 * 0.3 / 3.0;
68 auto uniaxial_stress = [](const double, const double, const double) {
69 MatrixDouble stress((SPACE_DIM * (SPACE_DIM + 1)) / 2, 1);
70 stress.clear();
71 auto t_stress = getFTensor2SymmetricFromMat<
73 t_stress(0, 0) = uniaxial_stress_xx;
74 return stress;
75 };
76
78 lame_solution(0.5, 1.0, 2.0, 1.0, 1e3, 0.3);
79 auto lame_stress = [&lame_solution](const double x, const double y,
80 const double z) {
81 return lame_solution.stress(x, y, z);
82 };
83
84 MatrixFunc stress_func = (test == 11) ? MatrixFunc(lame_stress)
85 : MatrixFunc(uniaxial_stress);
86 norm_fe->getOpPtrVector().push_back(
88 exact_stress_ptr, stress_func));
89
90 enum Norms { STRESS_ERROR_L2 = 0, STRESS_EXACT_L2, LAST_NORM };
91 auto norms_vec =
93 (mField.get_comm_rank() == 0) ? LAST_NORM : 0,
94 LAST_NORM);
95 CHKERR VecZeroEntries(norms_vec);
96
97 norm_fe->getOpPtrVector().push_back(
99 exact_stress_ptr, norms_vec, STRESS_EXACT_L2));
100 norm_fe->getOpPtrVector().push_back(
102 common_ptr->getMatCauchyStress(), norms_vec, STRESS_ERROR_L2,
103 exact_stress_ptr));
104
105 CHKERR DMoFEMLoopFiniteElements(simple->getDM(), simple->getDomainFEName(),
106 norm_fe);
107 CHKERR VecAssemblyBegin(norms_vec);
108 CHKERR VecAssemblyEnd(norms_vec);
109
110 if (mField.get_comm_rank() == 0) {
111 const double *norms;
112 CHKERR VecGetArrayRead(norms_vec, &norms);
113
114 const double error_l2 = std::sqrt(norms[STRESS_ERROR_L2]);
115 const double exact_l2 = std::sqrt(norms[STRESS_EXACT_L2]);
116
117 MOFEM_LOG_C("WORLD", Sev::inform, "STRESS_ERROR_L2 = %.16e\n", error_l2);
118 MOFEM_LOG_C("WORLD", Sev::inform, "STRESS_EXACT_L2 = %.16e\n", exact_l2);
119
120 CHKERR VecRestoreArrayRead(norms_vec, &norms);
121
122 double max_error_l2 = 1e-2;
123 CHKERR PetscOptionsGetReal(PETSC_NULLPTR, "", "-stress_error_l2_tol",
124 &max_error_l2, PETSC_NULLPTR);
125 if (error_l2 >= max_error_l2) {
126 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
127 "Stress L2 error %.16e exceeds tolerance %.16e", error_l2,
128 max_error_l2);
129 }
130 }
131
133}
134
137
138 int test = 0;
139 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, "", "-test", &test, PETSC_NULLPTR);
140 if (test == 10 || test == 11)
143}
144
145static char help[] = "...\n\n";
146
147int main(int argc, char *argv[]) {
148
149 const char param_file[] = "param_file.petsc";
150 MoFEM::Core::Initialize(&argc, &argv, param_file, help);
151
153
154 auto core_log = logging::core::get();
155 core_log->add_sink(
157 core_log->add_sink(
159 LogManager::setLog("FieldEvaluator");
160 MOFEM_LOG_TAG("FieldEvaluator", "field_eval");
161
162 try {
163 DMType dm_name = "DMMOFEM";
164 CHKERR DMRegister_MoFEM(dm_name);
165 DMType dm_name_mg = "DMMOFEM_MG";
167
168 moab::Core mb_instance;
169 moab::Interface &moab = mb_instance;
170
171 MoFEM::Core core(moab);
172 MoFEM::Interface &m_field = core;
173
174 ElasticTieMeshTutorial ex(m_field);
175 CHKERR ex.runProblem();
176 }
178
180}
const AnalyticalSolutions::HollowCylinderUnderRadialPressure< SPACE_DIM > lame_solution(0.5, 1.0, 2.0, 1.0, 1e3, 0.3)
TIE constraint support for the elastic tutorial.
#define MOFEM_LOG_C(channel, severity, format,...)
void simple(double P1[], double P2[], double P3[], double c[], const int N)
Definition acoustic.cpp:69
int main()
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
ElementsAndOps< SPACE_DIM >::BoundaryEle BoundaryEle
#define CATCH_ERRORS
Catch errors.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
static char help[]
constexpr int SPACE_DIM
constexpr IntegrationType I
constexpr AssemblyType A
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
Definition DMMoFEM.cpp:43
MoFEMErrorCode DMRegister_MGViaApproxOrders(const char sname[])
Register DM for Multi-Grid via approximation orders.
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:576
IntegrationType
Form integrator integration types.
AssemblyType
[Storage and set boundary conditions]
@ PETSC
Standard PETSc assembly.
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
PetscErrorCode PetscOptionsGetReal(PetscOptions *, const char pre[], const char name[], PetscReal *dval, PetscBool *set)
static auto getFTensor2SymmetricFromMat(M &data)
Get symmetric tensor rank 2 (matrix) form data matrix.
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
boost::function< MatrixDouble(const double, const double, const double)> MatrixFunc
static constexpr int approx_order
Lamé analytical solution for a hollow cylinder under radial pressure with a linear isotropic Hooke ma...
Boundary conditions marker.
Definition elastic.cpp:39
[Define entities]
Definition elastic.cpp:38
MoFEMErrorCode runProblem()
[Run problem]
MoFEM::Interface & mField
ElasticExample extension providing reusable TIE mesh behaviour.
MoFEMErrorCode checkStressError(const int test)
MoFEMErrorCode checkResults() override
[Postprocess results]
Add operators pushing bases from local to physical configuration.
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() 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 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.
Assembly methods.
Definition Natural.hpp:65
Get norm of input MatrixDouble for symmetric Tensor2.
Get values from matrix function in symmetric tensor storage at integration points and save them to Ma...
Template struct for dimension-specific finite element types.
Simple interface for fast problem set-up.
Definition Simple.hpp:27
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
#define EXECUTABLE_DIMENSION
Definition plastic.cpp:13
ElementsAndOps< SPACE_DIM >::SideEle SideEle
Definition plastic.cpp:61
#define SCHUR_ASSEMBLE
Definition contact.cpp:18