13static char help[] =
"...\n\n";
19using EleOp = Ele::UserDataOperator;
33 GAUSS>::OpSource<BASE_DIM, SPACE_DIM>;
35constexpr double a0 = 0.0;
36constexpr double a1 = 2.0;
37constexpr double a2 = -15.0 *
a0;
38constexpr double a3 = -20.0 / 6 *
a1;
39constexpr double a4 = 15.0 *
a0;
56 diffFun(
const double x,
const double y,
const double z) {
71 2 * x, 0., 1. + 3 * z * z);
77 boost::shared_ptr<MatrixDouble>
ptrVals;
78 boost::shared_ptr<MatrixDouble>
ptrGrad;
81 boost::shared_ptr<MatrixDouble> ptr_grad)
92 const double eps = 1e-6;
98 for (
int gg = 0; gg != nb_gauss_pts; gg++) {
105 delta_val(
i) = t_vals_from_op(
i) - ApproxFunctions::fUn(x, y, z)(
i);
106 double err_val = sqrt(delta_val(
i) * delta_val(
i));
107 MOFEM_LOG(
"SELF", Sev::verbose) <<
"Approximation error: " << err_val;
115 delta_diff_val(
i,
j) =
116 t_grad_from_op(
i,
j) - ApproxFunctions::diffFun(x, y, z)(
i,
j);
117 double err_diff_val = sqrt(delta_diff_val(
i,
j) * delta_diff_val(
i,
j));
118 if (err_diff_val >
eps)
120 "Wrong derivative of value %4.3e", err_diff_val);
129int main(
int argc,
char *argv[]) {
135 DMType dm_name =
"DMMOFEM";
138 moab::Core mb_instance;
139 moab::Interface &moab = mb_instance;
151 enum bases { AINSWORTH, DEMKOWICZ, LASBASETOP };
152 const char *list_bases[] = {
"ainsworth",
"demkowicz"};
154 PetscInt choice_base_value = AINSWORTH;
156 LASBASETOP, &choice_base_value, &flg);
158 if (flg != PETSC_TRUE)
161 if (choice_base_value == AINSWORTH)
163 else if (choice_base_value == DEMKOWICZ)
175 constexpr int order = 4;
178 auto dm =
simple->getDM();
182 auto assemble_matrices_and_vectors = [&]() {
186 pipeline_mng->getOpDomainRhsPipeline(), {HDIV});
187 pipeline_mng->getOpDomainRhsPipeline().push_back(
191 pipeline_mng->getOpDomainLhsPipeline(), {HDIV});
192 pipeline_mng->getOpDomainLhsPipeline().push_back(
195 [](
double x,
double,
double) {
return 1; })
200 return 2 * p_data + 1;
208 auto solve_problem = [&] {
210 auto solver = pipeline_mng->createKSP();
211 CHKERR KSPSetFromOptions(solver);
218 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
219 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
224 auto check_solution = [&] {
227 pipeline_mng->getOpDomainLhsPipeline().clear();
228 pipeline_mng->getOpDomainRhsPipeline().clear();
230 auto ptr_values = boost::make_shared<MatrixDouble>();
231 auto ptr_grad = boost::make_shared<MatrixDouble>();
235 pipeline_mng->getOpDomainRhsPipeline(), {HDIV});
238 pipeline_mng->getOpDomainRhsPipeline().push_back(
241 pipeline_mng->getOpDomainRhsPipeline().push_back(
244 pipeline_mng->getOpDomainRhsPipeline().push_back(
247 CHKERR pipeline_mng->loopFiniteElements();
252 CHKERR assemble_matrices_and_vectors();
void simple(double P1[], double P2[], double P3[], double c[], const int N)
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< 1, FIELD_DIM > OpDomainSource
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, FIELD_DIM > OpDomainMass
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
@ HDIV
field with continuous normal traction
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_ATOM_TEST_INVALID
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
auto createDMVector(DM dm)
Get smart vector from DM.
#define MOFEM_LOG(channel, severity)
Log.
FormsIntegrators< EleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, SPACE_DIM > OpDomainSource
Operator to integrate the right hand side matrix for the problem.
MoFEM::PipelineManager::ElementsAndOpsByDim< SPACE_DIM >::DomainEle Ele
FormsIntegrators< EleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< BASE_DIM, SPACE_DIM > OpDomainMass
OPerator to integrate mass matrix for least square approximation.
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
FTensor::Tensor1< FTensor::PackPtr< T *, S >, Tensor_Dim > getFTensor1FromMat(ublas::matrix< T, L, A > &data)
Get tensor rank 1 (vector) form data matrix.
FTensor::Tensor2< FTensor::PackPtr< double *, 1 >, Tensor_Dim1, Tensor_Dim2 > getFTensor2FromMat(MatrixDouble &data)
Get tensor rank 2 (matrix) form data matrix.
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, PetscBool *set)
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM > OpMass
[Only used with Hooke equation (linear material model)]
static FTensor::Tensor2< double, BASE_DIM, SPACE_DIM > diffFun(const double x, const double y, const double z)
static FTensor::Tensor1< double, BASE_DIM > fUn(const double x, const double y, double z)
Add operators pushing bases from local to physical configuration.
static boost::function< int(int)> broken_nbvolumetet_edge_hdiv
static boost::function< int(int)> broken_nbvolumetet_face_hdiv
static boost::function< int(int)> broken_nbfacetri_face_hdiv
static boost::function< int(int)> broken_nbvolumetet_volume_hdiv
static boost::function< int(int)> broken_nbfacetri_edge_hdiv
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)
MatrixDouble & getCoordsAtGaussPts()
Gauss points and weight, matrix (nb. of points x 3)
@ OPSPACE
operator do Work is execute on space data
MatrixDouble & getGaussPts()
matrix of integration (Gauss) points for Volume Element
Get vector field for H-div approximation.
Calculate gradient of vector field.
PipelineManager interface.
Simple interface for fast problem set-up.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
FTensor::Index< 'i', 3 > i
FTENSOR_INDEX(SPACE_DIM, i)
boost::shared_ptr< MatrixDouble > ptrVals
MoFEMErrorCode doWork(int side, EntityType type, EntitiesFieldData::EntData &data)
Operator for linear form, usually to calculate values on right hand side.
FTENSOR_INDEX(SPACE_DIM, j)
FTENSOR_INDEX(SPACE_DIM, k)
FTensor::Index< 'j', 2 > j
OpCheckValsDiffVals(boost::shared_ptr< MatrixDouble > ptr_vals, boost::shared_ptr< MatrixDouble > ptr_grad)
boost::shared_ptr< MatrixDouble > ptrGrad
FTensor::Index< 'k', 2 > k