v0.16.0
Loading...
Searching...
No Matches
Classes | Typedefs | Functions | Variables
hcurl_check_approx_in_2d.cpp File Reference
#include <MoFEM.hpp>

Go to the source code of this file.

Classes

struct  ApproxFunctions
 
struct  OpCheckValsDiffVals
 

Typedefs

using FaceEle = MoFEM::FaceElementForcesAndSourcesCore
 
using FaceEleOp = FaceEle::UserDataOperator
 
using OpDomainMass = FormsIntegrators< FaceEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< BASE_DIM, BASE_DIM >
 OPerator to integrate mass matrix for least square approximation.
 
using OpDomainSource = FormsIntegrators< FaceEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, BASE_DIM >
 Operator to integrate the right hand side matrix for the problem.
 

Functions

int main (int argc, char *argv[])
 

Variables

static char help [] = "...\n\n"
 
constexpr int BASE_DIM = 3
 
constexpr int SPACE_DIM = 2
 
constexpr double a0 = 0.0
 
constexpr double a1 = 2.0
 
constexpr double a2 = -15.0 * a0
 
constexpr double a3 = -20.0 / 6 * a1
 
constexpr double a4 = 15.0 * a0
 
constexpr double a5 = a1
 
constexpr double a6 = -a0
 

Typedef Documentation

◆ FaceEle

Definition at line 17 of file hcurl_check_approx_in_2d.cpp.

◆ FaceEleOp

Definition at line 18 of file hcurl_check_approx_in_2d.cpp.

◆ OpDomainMass

OPerator to integrate mass matrix for least square approximation.

Definition at line 27 of file hcurl_check_approx_in_2d.cpp.

◆ OpDomainSource

using OpDomainSource = FormsIntegrators<FaceEleOp>::Assembly<PETSC>::LinearForm< GAUSS>::OpSource<BASE_DIM, BASE_DIM>

Operator to integrate the right hand side matrix for the problem.

Definition at line 34 of file hcurl_check_approx_in_2d.cpp.

Function Documentation

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 236 of file hcurl_check_approx_in_2d.cpp.

236 {
237
238 MoFEM::Core::Initialize(&argc, &argv, (char *)0, help);
239
240 try {
241
242 DMType dm_name = "DMMOFEM";
243 CHKERR DMRegister_MoFEM(dm_name);
244
245 moab::Core mb_instance;
246 moab::Interface &moab = mb_instance;
247
248 // Create MoFEM instance
249 MoFEM::Core core(moab);
250 MoFEM::Interface &m_field = core;
251
252 Simple *simple_interface = m_field.getInterface<Simple>();
253 PipelineManager *pipeline_mng = m_field.getInterface<PipelineManager>();
254 CHKERR simple_interface->getOptions();
255 CHKERR simple_interface->loadFile("", "rectangle_tri.h5m");
256
257 // Declare elements
258 enum bases { AINSWORTH, DEMKOWICZ, LASBASETOP };
259 const char *list_bases[] = {"ainsworth", "demkowicz"};
260 PetscBool flg;
261 PetscInt choice_base_value = AINSWORTH;
262 CHKERR PetscOptionsGetEList(PETSC_NULLPTR, NULL, "-base", list_bases,
263 LASBASETOP, &choice_base_value, &flg);
264
265 if (flg != PETSC_TRUE)
266 SETERRQ(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE, "base not set");
268 if (choice_base_value == AINSWORTH)
270 else if (choice_base_value == DEMKOWICZ)
272
273 CHKERR simple_interface->addDomainField("FIELD1", HCURL, base, 1);
274 constexpr int order = 5;
275 CHKERR simple_interface->setFieldOrder("FIELD1", order);
276 CHKERR simple_interface->setUp();
277 auto dm = simple_interface->getDM();
278
279 MatrixDouble vals, diff_vals;
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(
288 new OpCalculateHOJac<SPACE_DIM>(jac_ptr));
289 pipeline_mng->getOpDomainRhsPipeline().push_back(
290 new OpInvertMatrix<SPACE_DIM>(jac_ptr, det_ptr, inv_jac_ptr));
291 pipeline_mng->getOpDomainRhsPipeline().push_back(
292 new OpMakeHdivFromHcurl());
293 pipeline_mng->getOpDomainRhsPipeline().push_back(
295 pipeline_mng->getOpDomainRhsPipeline().push_back(
296 new OpDomainSource("FIELD1", ApproxFunctions::fUn));
297
298 pipeline_mng->getOpDomainLhsPipeline().push_back(
299 new OpCalculateHOJac<SPACE_DIM>(jac_ptr));
300 pipeline_mng->getOpDomainLhsPipeline().push_back(
301 new OpInvertMatrix<SPACE_DIM>(jac_ptr, det_ptr, inv_jac_ptr));
302 pipeline_mng->getOpDomainLhsPipeline().push_back(
303 new OpMakeHdivFromHcurl());
304 pipeline_mng->getOpDomainLhsPipeline().push_back(
306 pipeline_mng->getOpDomainLhsPipeline().push_back(
307
308 new OpDomainMass("FIELD1", "FIELD1",
309 [](double, double, double) { return 1; })
310
311 );
312
313 auto integration_rule = [](int, int, int p_data) { return 2 * p_data; };
314 CHKERR pipeline_mng->setDomainRhsIntegrationRule(integration_rule);
315 CHKERR pipeline_mng->setDomainLhsIntegrationRule(integration_rule);
316
318 };
319
320 auto solve_problem = [&] {
322 auto solver = pipeline_mng->createKSP();
323 CHKERR KSPSetFromOptions(solver);
324 CHKERR KSPSetUp(solver);
325
326 auto D = createDMVector(dm);
327 auto F = vectorDuplicate(D);
328
329 CHKERR KSPSolve(solver, F, D);
330 CHKERR VecGhostUpdateBegin(D, INSERT_VALUES, SCATTER_FORWARD);
331 CHKERR VecGhostUpdateEnd(D, INSERT_VALUES, SCATTER_FORWARD);
332 CHKERR DMoFEMMeshToLocalVector(dm, D, INSERT_VALUES, SCATTER_REVERSE);
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 // Change H-curl to H-div in 2D, and apply Piola transform
350 pipeline_mng->getOpEvaluationPipeline().push_back(
351 new OpCalculateHOJac<SPACE_DIM>(jac_ptr));
352 pipeline_mng->getOpEvaluationPipeline().push_back(
353 new OpInvertMatrix<SPACE_DIM>(jac_ptr, det_ptr, inv_jac_ptr));
354 pipeline_mng->getOpEvaluationPipeline().push_back(
355 new OpMakeHdivFromHcurl());
356 pipeline_mng->getOpEvaluationPipeline().push_back(
358 pipeline_mng->getOpEvaluationPipeline().push_back(
359 new OpSetInvJacHcurlFace(inv_jac_ptr));
360
361 // Evaluate base function second derivative
362 auto base_mass = boost::make_shared<MatrixDouble>();
363 auto data_l2 = boost::make_shared<EntitiesFieldData>(MBENTITYSET);
364
365 pipeline_mng->getOpEvaluationPipeline().push_back(
366 new OpBaseDerivativesMass<BASE_DIM>(base_mass, data_l2, base, L2));
367 pipeline_mng->getOpEvaluationPipeline().push_back(
369 inv_jac_ptr));
370 pipeline_mng->getOpEvaluationPipeline().push_back(
371 new OpBaseDerivativesNext<BASE_DIM>(BaseDerivatives::SecondDerivative,
372 base_mass, data_l2, base, HCURL));
373
374 // Calculate field values at integration points
375 pipeline_mng->getOpEvaluationPipeline().push_back(
376 new OpCalculateHVecVectorField<BASE_DIM>("FIELD1", ptr_values));
377 // Gradient
378 pipeline_mng->getOpEvaluationPipeline().push_back(
380 ptr_grad));
381 // Hessian
382 pipeline_mng->getOpEvaluationPipeline().push_back(
384 "FIELD1", ptr_divergence));
385 pipeline_mng->getOpEvaluationPipeline().push_back(
387 ptr_hessian));
388
389 pipeline_mng->getOpEvaluationPipeline().push_back(new OpCheckValsDiffVals(
390 ptr_values, ptr_divergence, ptr_grad, ptr_hessian));
391
392 CHKERR pipeline_mng->loopFiniteElementsEvaluation();
393
395 };
396
397 CHKERR assemble_matrices_and_vectors();
398 CHKERR solve_problem();
399 CHKERR check_solution();
400 }
402
404}
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
Definition definitions.h:58
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
Definition definitions.h:60
@ DEMKOWICZ_JACOBI_BASE
Definition definitions.h:66
@ L2
field with C-1 continuity
Definition definitions.h:88
@ HCURL
field with continuous tangents
Definition definitions.h:86
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_IMPOSSIBLE_CASE
Definition definitions.h:35
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
constexpr int order
@ F
auto integration_rule
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
Definition DMMoFEM.cpp:514
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
Definition DMMoFEM.cpp:43
auto createDMVector(DM dm, RowColData rc=RowColData::COL)
Get smart vector from DM.
Definition DMMoFEM.hpp:1237
FormsIntegrators< FaceEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, BASE_DIM > OpDomainSource
Operator to integrate the right hand side matrix for the problem.
static char help[]
FormsIntegrators< FaceEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< BASE_DIM, BASE_DIM > OpDomainMass
OPerator to integrate mass matrix for least square approximation.
double D
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)
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.
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.
Definition Simple.hpp:27
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.
Definition Simple.cpp:261
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name, LoadFileFunc loadFunc=defaultLoadFileFunc)
Load mesh file.
Definition Simple.cpp:191
MoFEMErrorCode getOptions()
get options
Definition Simple.cpp:180
MoFEMErrorCode getDM(DM *dm)
Get DM.
Definition Simple.cpp:799
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
Definition Simple.cpp:575
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
Definition Simple.cpp:735
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.

Variable Documentation

◆ a0

constexpr double a0 = 0.0
constexpr

◆ a1

constexpr double a1 = 2.0
constexpr

◆ a2

constexpr double a2 = -15.0 * a0
constexpr

◆ a3

constexpr double a3 = -20.0 / 6 * a1
constexpr

◆ a4

constexpr double a4 = 15.0 * a0
constexpr

◆ a5

constexpr double a5 = a1
constexpr

◆ a6

constexpr double a6 = -a0
constexpr

◆ BASE_DIM

constexpr int BASE_DIM = 3
constexpr

Definition at line 20 of file hcurl_check_approx_in_2d.cpp.

◆ help

char help[] = "...\n\n"
static

Definition at line 15 of file hcurl_check_approx_in_2d.cpp.

◆ SPACE_DIM

constexpr int SPACE_DIM = 2
constexpr

Definition at line 21 of file hcurl_check_approx_in_2d.cpp.