49 {
51
53
54 auto norm_fe = boost::make_shared<DomainEle>(
mField);
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;
70 stress.clear();
73 t_stress(0, 0) = uniaxial_stress_xx;
74 return stress;
75 };
76
79 auto lame_stress = [&
lame_solution](
const double x,
const double y,
80 const double z) {
82 };
83
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 =
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
106 norm_fe);
107 CHKERR VecAssemblyBegin(norms_vec);
108 CHKERR VecAssemblyEnd(norms_vec);
109
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;
124 &max_error_l2, PETSC_NULLPTR);
125 if (error_l2 >= max_error_l2) {
127 "Stress L2 error %.16e exceeds tolerance %.16e", error_l2,
128 max_error_l2);
129 }
130 }
131
133}
const AnalyticalSolutions::HollowCylinderUnderRadialPressure< SPACE_DIM > lame_solution(0.5, 1.0, 2.0, 1.0, 1e3, 0.3)
#define MOFEM_LOG_C(channel, severity, format,...)
void simple(double P1[], double P2[], double P3[], double c[], const int N)
@ MOFEM_DATA_INCONSISTENCY
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
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...
MoFEM::Interface & mField
Add operators pushing bases from local to physical configuration.
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
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...
Simple interface for fast problem set-up.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.