v0.14.0
Classes | Functions | Variables
hdiv_divergence_operator.cpp File Reference
#include <MoFEM.hpp>

Go to the source code of this file.

Classes

struct  OpVolDivergence
 
struct  OpFacesFluxes
 

Functions

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

Variables

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

Function Documentation

◆ main()

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

< database

< interface

This has no real effect, folling line are only for atom test purpose

Examples
hdiv_divergence_operator.cpp.

Definition at line 44 of file hdiv_divergence_operator.cpp.

44  {
45 
46  MoFEM::Core::Initialize(&argc, &argv, (char *)0, help);
47 
48  try {
49 
50  enum bases { AINSWORTH, DEMKOWICZ, LASTOP };
51 
52  const char *list[] = {"ainsworth", "demkowicz"};
53 
54  PetscBool flg;
55  PetscInt choice_value = AINSWORTH;
56  CHKERR PetscOptionsGetEList(PETSC_NULL, NULL, "-base", list, LASTOP,
57  &choice_value, &flg);
58  if (flg != PETSC_TRUE) {
59  SETERRQ(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE, "base not set");
60  }
61 
62  PetscBool ho_geometry = PETSC_FALSE;
63  CHKERR PetscOptionsGetBool(PETSC_NULL, "", "-ho_geometry", &ho_geometry,
64  PETSC_NULL);
65 
66  PetscInt ho_choice_value = AINSWORTH;
67  CHKERR PetscOptionsGetEList(PETSC_NULL, NULL, "-ho_base", list, LASTOP,
68  &ho_choice_value, &flg);
69 
70  DMType dm_name = "DMMOFEM";
71  CHKERR DMRegister_MoFEM(dm_name);
72 
73  // Create MoAB
74  moab::Core mb_instance; ///< database
75  moab::Interface &moab = mb_instance; ///< interface
76 
77  // Create MoFEM
78  MoFEM::Core core(moab);
79  MoFEM::Interface &m_field = core;
80 
81  Simple *simple_interface = m_field.getInterface<Simple>();
82  PipelineManager *pipeline_mng = m_field.getInterface<PipelineManager>();
83  CHKERR simple_interface->getOptions();
84  CHKERR simple_interface->loadFile("");
85 
86  // fields
87  switch (choice_value) {
88  case AINSWORTH:
89  CHKERR simple_interface->addDomainField("HDIV", HDIV,
91  CHKERR simple_interface->addBoundaryField("HDIV", HDIV,
93  break;
94  case DEMKOWICZ:
95  CHKERR simple_interface->addDomainField("HDIV", HDIV,
97  CHKERR simple_interface->addBoundaryField("HDIV", HDIV,
99  break;
100  }
101 
102  if (ho_geometry == PETSC_TRUE) {
103  switch (ho_choice_value) {
104  case AINSWORTH:
105  CHKERR simple_interface->addDataField("MESH_NODE_POSITIONS", H1,
107  case DEMKOWICZ:
108  CHKERR simple_interface->addDataField("MESH_NODE_POSITIONS", H1,
110  }
111  }
112 
113  constexpr int order = 3;
114  CHKERR simple_interface->setFieldOrder("HDIV", order);
115  if (ho_geometry == PETSC_TRUE)
116  CHKERR simple_interface->setFieldOrder("MESH_NODE_POSITIONS", 2);
117  CHKERR simple_interface->setUp();
118 
119  /// This has no real effect, folling line are only for atom test purpose
120  pipeline_mng->getDomainLhsFE().reset();
121  pipeline_mng->getDomainRhsFE().reset();
122  pipeline_mng->getBoundaryLhsFE().reset();
123  pipeline_mng->getBoundaryRhsFE().reset();
124  pipeline_mng->getSkeletonLhsFE().reset();
125  pipeline_mng->getSkeletonRhsFE().reset();
126 
127  auto integration_rule = [](int, int, int p_data) { return 2 * p_data; };
128  CHKERR pipeline_mng->setDomainRhsIntegrationRule(integration_rule);
129  CHKERR pipeline_mng->setBoundaryRhsIntegrationRule(integration_rule);
130 
131  double divergence_vol = 0;
132  double divergence_skin = 0;
133 
134  if (m_field.check_field("MESH_NODE_POSITIONS")) {
135  CHKERR AddHOOps<3, 3, 3>::add(pipeline_mng->getOpDomainRhsPipeline(),
136  {HDIV}, "MESH_NODE_POSITIONS");
137  CHKERR AddHOOps<2, 3, 3>::add(pipeline_mng->getOpBoundaryRhsPipeline(),
138  {HDIV}, "MESH_NODE_POSITIONS");
139  } else {
140  CHKERR AddHOOps<3, 3, 3>::add(pipeline_mng->getOpDomainRhsPipeline(),
141  {HDIV});
142  CHKERR AddHOOps<2, 3, 3>::add(pipeline_mng->getOpBoundaryRhsPipeline(),
143  {HDIV});
144  }
145 
146  // domain
147  pipeline_mng->getOpDomainRhsPipeline().push_back(
148  new OpVolDivergence(divergence_vol));
149  // boundary
150  pipeline_mng->getOpBoundaryRhsPipeline().push_back(
151  new OpFacesFluxes(divergence_skin));
152 
153  // project geometry form 10 node tets on higher order approx. functions
154  if (ho_geometry == PETSC_TRUE) {
155  Projection10NodeCoordsOnField ent_method(m_field, "MESH_NODE_POSITIONS");
156  CHKERR m_field.loop_dofs("MESH_NODE_POSITIONS", ent_method);
157  }
158  CHKERR pipeline_mng->loopFiniteElements();
159 
160  MOFEM_LOG("WORLD", Sev::inform)
161  << "divergence_vol " << std::setprecision(12) << divergence_vol;
162  MOFEM_LOG("WORLD", Sev::inform)
163  << "divergence_skin " << std::setprecision(12) << divergence_skin;
164 
165  constexpr double eps = 1e-8;
166  const double error = divergence_skin - divergence_vol;
167  if (fabs(error) > eps)
168  SETERRQ1(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
169  "invalid surface flux or divergence or both error = %3.4e",
170  error);
171  }
172  CATCH_ERRORS;
173 
175 }

Variable Documentation

◆ help

char help[] = "...\n\n"
static
Examples
hdiv_divergence_operator.cpp.

Definition at line 16 of file hdiv_divergence_operator.cpp.

MoFEM::UnknownInterface::getInterface
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Definition: UnknownInterface.hpp:93
MoFEM::CoreInterface::loop_dofs
virtual MoFEMErrorCode loop_dofs(const Problem *problem_ptr, const std::string &field_name, RowColData rc, DofMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)=0
Make a loop over dofs.
MoFEM::CoreTmp< 0 >
Core (interface) class.
Definition: Core.hpp:82
H1
@ H1
continuous field
Definition: definitions.h:85
MoFEM::Simple::addDataField
MoFEMErrorCode addDataField(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:396
OpFacesFluxes
Definition: hdiv_divergence_operator.cpp:31
MoFEM::Simple::loadFile
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name, LoadFileFunc loadFunc=defaultLoadFileFunc)
Load mesh file.
Definition: Simple.cpp:194
MoFEM::PipelineManager
PipelineManager interface.
Definition: PipelineManager.hpp:24
MoFEM::Projection10NodeCoordsOnField
Projection of edge entities with one mid-node on hierarchical basis.
Definition: Projection10NodeCoordsOnField.hpp:24
MoFEM::CoreTmp< 0 >::Finalize
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition: Core.cpp:112
MoFEM::Simple
Simple interface for fast problem set-up.
Definition: Simple.hpp:27
MOFEM_IMPOSSIBLE_CASE
@ MOFEM_IMPOSSIBLE_CASE
Definition: definitions.h:35
order
constexpr int order
Definition: dg_projection.cpp:18
MoFEM::DeprecatedCoreInterface
Deprecated interface functions.
Definition: DeprecatedCoreInterface.hpp:16
MoFEM::Interface
DeprecatedCoreInterface Interface
Definition: Interface.hpp:2010
MoFEM::Simple::getOptions
MoFEMErrorCode getOptions()
get options
Definition: Simple.cpp:180
help
static char help[]
Definition: hdiv_divergence_operator.cpp:16
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:548
MoFEM::DMRegister_MoFEM
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
Definition: DMMoFEM.cpp:43
MoFEM::Simple::addBoundaryField
MoFEMErrorCode addBoundaryField(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 boundary.
Definition: Simple.cpp:358
MoFEM::CoreInterface::check_field
virtual bool check_field(const std::string &name) const =0
check if field is in database
MoFEM::Simple::setFieldOrder
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
Definition: Simple.cpp:604
MoFEM::AddHOOps
Add operators pushing bases from local to physical configuration.
Definition: HODataOperators.hpp:417
integration_rule
auto integration_rule
Definition: free_surface.cpp:187
MoFEM::CoreTmp< 0 >::Initialize
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition: Core.cpp:72
MOFEM_LOG
#define MOFEM_LOG(channel, severity)
Log.
Definition: LogManager.hpp:308
CATCH_ERRORS
#define CATCH_ERRORS
Catch errors.
Definition: definitions.h:385
DEMKOWICZ_JACOBI_BASE
@ DEMKOWICZ_JACOBI_BASE
Definition: definitions.h:66
OpVolDivergence
Definition: hdiv_divergence_operator.cpp:18
MoFEM::Core
CoreTmp< 0 > Core
Definition: Core.hpp:1148
eps
static const double eps
Definition: check_base_functions_derivatives_on_tet.cpp:11
AINSWORTH_LEGENDRE_BASE
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
Definition: definitions.h:60
MoFEM::PetscOptionsGetEList
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, PetscBool *set)
Definition: DeprecatedPetsc.hpp:203
MOFEM_ATOM_TEST_INVALID
@ MOFEM_ATOM_TEST_INVALID
Definition: definitions.h:40
MoFEM::Simple::setUp
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
Definition: Simple.cpp:770
FractureMechanics::LASTOP
@ LASTOP
Definition: CrackFrontElement.hpp:23
convert.int
int
Definition: convert.py:64
HDIV
@ HDIV
field with continuous normal traction
Definition: definitions.h:87
MoFEM::Simple::addDomainField
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:264
MoFEM::PetscOptionsGetBool
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
Definition: DeprecatedPetsc.hpp:182