236 {
237
239
240 try {
241
242 DMType dm_name = "DMMOFEM";
244
245 moab::Core mb_instance;
246 moab::Interface &moab = mb_instance;
247
248
251
256
257
258 enum bases { AINSWORTH, DEMKOWICZ, LASBASETOP };
259 const char *list_bases[] = {"ainsworth", "demkowicz"};
260 PetscBool flg;
261 PetscInt choice_base_value = AINSWORTH;
263 LASBASETOP, &choice_base_value, &flg);
264
265 if (flg != PETSC_TRUE)
268 if (choice_base_value == AINSWORTH)
270 else if (choice_base_value == DEMKOWICZ)
272
274 constexpr int order = 5;
277 auto dm = simple_interface->
getDM();
278
280
281 auto assemble_matrices_and_vectors = [&]() {
283 auto jac_ptr = boost::make_shared<MatrixDouble>();
284 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
285 auto det_ptr = boost::make_shared<VectorDouble>();
286
287 pipeline_mng->getOpDomainRhsPipeline().push_back(
289 pipeline_mng->getOpDomainRhsPipeline().push_back(
291 pipeline_mng->getOpDomainRhsPipeline().push_back(
293 pipeline_mng->getOpDomainRhsPipeline().push_back(
295 pipeline_mng->getOpDomainRhsPipeline().push_back(
297
298 pipeline_mng->getOpDomainLhsPipeline().push_back(
300 pipeline_mng->getOpDomainLhsPipeline().push_back(
302 pipeline_mng->getOpDomainLhsPipeline().push_back(
304 pipeline_mng->getOpDomainLhsPipeline().push_back(
306 pipeline_mng->getOpDomainLhsPipeline().push_back(
307
309 [](double, double, double) { return 1; })
310
311 );
312
316
318 };
319
320 auto solve_problem = [&] {
322 auto solver = pipeline_mng->createKSP();
323 CHKERR KSPSetFromOptions(solver);
325
328
330 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
331 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
334 };
335
336 auto check_solution = [&] {
338
339
340 auto ptr_values = boost::make_shared<MatrixDouble>();
341 auto ptr_divergence = boost::make_shared<VectorDouble>();
342 auto ptr_grad = boost::make_shared<MatrixDouble>();
343 auto ptr_hessian = boost::make_shared<MatrixDouble>();
344
345 auto jac_ptr = boost::make_shared<MatrixDouble>();
346 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
347 auto det_ptr = boost::make_shared<VectorDouble>();
348
349
350 pipeline_mng->getOpEvaluationPipeline().push_back(
352 pipeline_mng->getOpEvaluationPipeline().push_back(
354 pipeline_mng->getOpEvaluationPipeline().push_back(
356 pipeline_mng->getOpEvaluationPipeline().push_back(
358 pipeline_mng->getOpEvaluationPipeline().push_back(
360
361
362 auto base_mass = boost::make_shared<MatrixDouble>();
363 auto data_l2 = boost::make_shared<EntitiesFieldData>(MBENTITYSET);
364
365 pipeline_mng->getOpEvaluationPipeline().push_back(
367 pipeline_mng->getOpEvaluationPipeline().push_back(
369 inv_jac_ptr));
370 pipeline_mng->getOpEvaluationPipeline().push_back(
372 base_mass, data_l2, base,
HCURL));
373
374
375 pipeline_mng->getOpEvaluationPipeline().push_back(
377
378 pipeline_mng->getOpEvaluationPipeline().push_back(
380 ptr_grad));
381
382 pipeline_mng->getOpEvaluationPipeline().push_back(
384 "FIELD1", ptr_divergence));
385 pipeline_mng->getOpEvaluationPipeline().push_back(
387 ptr_hessian));
388
390 ptr_values, ptr_divergence, ptr_grad, ptr_hessian));
391
392 CHKERR pipeline_mng->loopFiniteElementsEvaluation();
393
395 };
396
397 CHKERR assemble_matrices_and_vectors();
400 }
402
404}
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
@ L2
field with C-1 continuity
@ HCURL
field with continuous tangents
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#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, RowColData rc=RowColData::COL)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
auto createDMVector(DM dm, RowColData rc=RowColData::COL)
Get smart vector from DM.
FormsIntegrators< FaceEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, BASE_DIM > OpDomainSource
Operator to integrate the right hand side matrix for the problem.
FormsIntegrators< FaceEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< BASE_DIM, BASE_DIM > OpDomainMass
OPerator to integrate mass matrix for least square approximation.
OpSetInvJacHcurlFaceImpl< 2 > OpSetInvJacHcurlFace
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
OpSetContravariantPiolaTransformOnFace2DImpl< 2 > OpSetContravariantPiolaTransformOnFace2D
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, PetscBool *set)
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.
Get vector field for H-div approximation.
Calculate gradient of vector field.
Calculate gradient of vector field.
Calculate divergence of vector field.
Operator for inverting matrices at integration points.
Make Hdiv space from Hcurl space in 2d.
PipelineManager interface.
Simple interface for fast problem set-up.
MoFEMErrorCode addDomainField(const std::string name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on domain.
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name, LoadFileFunc loadFunc=defaultLoadFileFunc)
Load mesh file.
MoFEMErrorCode getOptions()
get options
MoFEMErrorCode getDM(DM *dm)
Get DM.
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.