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

Go to the source code of this file.

Classes

struct  ApproxFunctions
 
struct  OpCheckValsDiffVals
 

Typedefs

using Ele = MoFEM::PipelineManager::ElementsAndOpsByDim< SPACE_DIM >::DomainEle
 
using EleOp = Ele::UserDataOperator
 
using OpDomainMass = FormsIntegrators< EleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< BASE_DIM, SPACE_DIM >
 OPerator to integrate mass matrix for least square approximation.
 
using OpDomainSource = FormsIntegrators< EleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, SPACE_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 = 3
 
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

◆ Ele

◆ EleOp

Definition at line 19 of file hdiv_check_approx_in_3d.cpp.

◆ OpDomainMass

OPerator to integrate mass matrix for least square approximation.

Definition at line 25 of file hdiv_check_approx_in_3d.cpp.

◆ OpDomainSource

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

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

Definition at line 32 of file hdiv_check_approx_in_3d.cpp.

Function Documentation

◆ main()

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

Definition at line 129 of file hdiv_check_approx_in_3d.cpp.

129 {
130
131 MoFEM::Core::Initialize(&argc, &argv, (char *)0, help);
132
133 try {
134
135 DMType dm_name = "DMMOFEM";
136 CHKERR DMRegister_MoFEM(dm_name);
137
138 moab::Core mb_instance;
139 moab::Interface &moab = mb_instance;
140
141 // Create MoFEM instance
142 MoFEM::Core core(moab);
143 MoFEM::Interface &m_field = core;
144
145 Simple *simple = m_field.getInterface<Simple>();
146 PipelineManager *pipeline_mng = m_field.getInterface<PipelineManager>();
147 CHKERR simple->getOptions();
148 CHKERR simple->loadFile();
149
150 // Declare elements
151 enum bases { AINSWORTH, DEMKOWICZ, LASBASETOP };
152 const char *list_bases[] = {"ainsworth", "demkowicz"};
153 PetscBool flg;
154 PetscInt choice_base_value = AINSWORTH;
155 CHKERR PetscOptionsGetEList(PETSC_NULLPTR, NULL, "-base", list_bases,
156 LASBASETOP, &choice_base_value, &flg);
157
158 if (flg != PETSC_TRUE)
159 SETERRQ(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE, "base not set");
161 if (choice_base_value == AINSWORTH)
163 else if (choice_base_value == DEMKOWICZ)
165
166 AinsworthOrderHooks::broken_nbfacetri_edge_hdiv = [](int p) { return p; };
167 AinsworthOrderHooks::broken_nbfacetri_face_hdiv = [](int p) { return p; };
171 return p;
172 };
173
174 CHKERR simple->addDomainField("FIELD1", HDIV, base, 1);
175 constexpr int order = 4;
176 CHKERR simple->setFieldOrder("FIELD1", order);
177 CHKERR simple->setUp();
178 auto dm = simple->getDM();
179
180 MatrixDouble vals, diff_vals;
181
182 auto assemble_matrices_and_vectors = [&]() {
184
186 pipeline_mng->getOpDomainRhsPipeline(), {HDIV});
187 pipeline_mng->getOpDomainRhsPipeline().push_back(
188 new OpDomainSource("FIELD1", ApproxFunctions::fUn));
189
191 pipeline_mng->getOpDomainLhsPipeline(), {HDIV});
192 pipeline_mng->getOpDomainLhsPipeline().push_back(
193
194 new OpDomainMass("FIELD1", "FIELD1",
195 [](double x, double, double) { return 1; })
196
197 );
198
199 auto integration_rule = [](int, int, int p_data) {
200 return 2 * p_data + 1;
201 };
202 CHKERR pipeline_mng->setDomainRhsIntegrationRule(integration_rule);
203 CHKERR pipeline_mng->setDomainLhsIntegrationRule(integration_rule);
204
206 };
207
208 auto solve_problem = [&] {
210 auto solver = pipeline_mng->createKSP();
211 CHKERR KSPSetFromOptions(solver);
212 CHKERR KSPSetUp(solver);
213
214 auto D = createDMVector(dm);
215 auto F = vectorDuplicate(D);
216
217 CHKERR KSPSolve(solver, F, D);
218 CHKERR VecGhostUpdateBegin(D, INSERT_VALUES, SCATTER_FORWARD);
219 CHKERR VecGhostUpdateEnd(D, INSERT_VALUES, SCATTER_FORWARD);
220 CHKERR DMoFEMMeshToLocalVector(dm, D, INSERT_VALUES, SCATTER_REVERSE);
222 };
223
224 auto check_solution = [&] {
226
227 pipeline_mng->getOpDomainLhsPipeline().clear();
228 pipeline_mng->getOpDomainRhsPipeline().clear();
229
230 auto ptr_values = boost::make_shared<MatrixDouble>();
231 auto ptr_grad = boost::make_shared<MatrixDouble>();
232
233 // Change H-curl to H-div in 2D, and apply Piola transform
235 pipeline_mng->getOpDomainRhsPipeline(), {HDIV});
236
237 // Calculate field values at integration points
238 pipeline_mng->getOpDomainRhsPipeline().push_back(
239 new OpCalculateHVecVectorField<BASE_DIM>("FIELD1", ptr_values));
240 // Gradient
241 pipeline_mng->getOpDomainRhsPipeline().push_back(
243 ptr_grad));
244 pipeline_mng->getOpDomainRhsPipeline().push_back(
245 new OpCheckValsDiffVals(ptr_values, ptr_grad));
246
247 CHKERR pipeline_mng->loopFiniteElements();
248
250 };
251
252 CHKERR assemble_matrices_and_vectors();
253 CHKERR solve_problem();
254 CHKERR check_solution();
255 }
257
259}
void simple(double P1[], double P2[], double P3[], double c[], const int N)
Definition acoustic.cpp:69
#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
@ HDIV
field with continuous normal traction
Definition definitions.h:87
#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)
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)
Get smart vector from DM.
Definition DMMoFEM.hpp:1234
static char help[]
FormsIntegrators< EleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< BASE_DIM, SPACE_DIM > OpDomainMass
OPerator to integrate mass matrix for least square approximation.
FormsIntegrators< EleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, SPACE_DIM > OpDomainSource
Operator to integrate the right hand side matrix for the problem.
double D
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, PetscBool *set)
Add operators pushing bases from local to physical configuration.
static boost::function< int(int)> broken_nbvolumetet_edge_hdiv
Definition Hdiv.hpp:27
static boost::function< int(int)> broken_nbvolumetet_face_hdiv
Definition Hdiv.hpp:28
static boost::function< int(int)> broken_nbfacetri_face_hdiv
Definition Hdiv.hpp:26
static boost::function< int(int)> broken_nbvolumetet_volume_hdiv
Definition Hdiv.hpp:29
static boost::function< int(int)> broken_nbfacetri_edge_hdiv
Definition Hdiv.hpp:25
Core (interface) class.
Definition Core.hpp:82
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
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition Core.cpp:118
Deprecated interface functions.
Get vector field for H-div approximation.
Calculate gradient of vector field.
PipelineManager interface.
Simple interface for fast problem set-up.
Definition Simple.hpp:27
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 15 of file hdiv_check_approx_in_3d.cpp.

◆ help

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

Definition at line 13 of file hdiv_check_approx_in_3d.cpp.

◆ SPACE_DIM

constexpr int SPACE_DIM = 3
constexpr

Definition at line 16 of file hdiv_check_approx_in_3d.cpp.