41 using ElasticTieMeshExample::ElasticTieMeshExample;
54 auto norm_fe = boost::make_shared<DomainEle>(
mField);
60 norm_fe->getOpPtrVector(), {H1},
"GEOMETRY");
62 auto common_ptr = HookeOps::commonDataFactory<SPACE_DIM, GAUSS, DomainEle>(
63 mField, norm_fe->getOpPtrVector(),
"U",
"MAT_ELASTIC", Sev::verbose);
65 auto exact_stress_ptr = boost::make_shared<MatrixDouble>();
67 constexpr double uniaxial_stress_xx = 1e3 * 0.3 / 3.0;
73 t_stress(0, 0) = uniaxial_stress_xx;
79 auto lame_stress = [&
lame_solution](
const double x,
const double y,
86 norm_fe->getOpPtrVector().push_back(
88 exact_stress_ptr, stress_func));
90 enum Norms { STRESS_ERROR_L2 = 0, STRESS_EXACT_L2, LAST_NORM };
95 CHKERR VecZeroEntries(norms_vec);
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,
107 CHKERR VecAssemblyBegin(norms_vec);
108 CHKERR VecAssemblyEnd(norms_vec);
112 CHKERR VecGetArrayRead(norms_vec, &norms);
114 const double error_l2 = std::sqrt(norms[STRESS_ERROR_L2]);
115 const double exact_l2 = std::sqrt(norms[STRESS_EXACT_L2]);
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);
120 CHKERR VecRestoreArrayRead(norms_vec, &norms);
122 double max_error_l2 = 1e-2;
124 &max_error_l2, PETSC_NULLPTR);
125 if (error_l2 >= max_error_l2) {
127 "Stress L2 error %.16e exceeds tolerance %.16e", error_l2,
140 if (test == 10 || test == 11)
147int main(
int argc,
char *argv[]) {
149 const char param_file[] =
"param_file.petsc";
154 auto core_log = logging::core::get();
163 DMType dm_name =
"DMMOFEM";
165 DMType dm_name_mg =
"DMMOFEM_MG";
168 moab::Core mb_instance;
169 moab::Interface &moab = mb_instance;
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)
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
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
constexpr IntegrationType I
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
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.
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
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.
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
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
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.
static bool broadcastMeshsetsOn
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.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
#define EXECUTABLE_DIMENSION
ElementsAndOps< SPACE_DIM >::SideEle SideEle