v0.14.0
Loading...
Searching...
No Matches
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
 OPerator to integrate mass matrix for least square approximation.
 
using OpDomainSource
 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

using OpDomainMass
Initial value:
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM > OpMass
[Only used with Hooke equation (linear material model)]
Definition seepage.cpp:56

OPerator to integrate mass matrix for least square approximation.

Definition at line 25 of file hdiv_check_approx_in_3d.cpp.

◆ OpDomainSource

Initial value:

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_NULL, 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 nme:nme847.
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:523
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:1099
static char help[]
FormsIntegrators< EleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, SPACE_DIM > OpDomainSource
Operator to integrate the right hand side matrix for the problem.
FormsIntegrators< EleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< BASE_DIM, SPACE_DIM > OpDomainMass
OPerator to integrate mass matrix for least square approximation.
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:112
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

double a0 = 0.0
constexpr
Examples
hcurl_check_approx_in_2d.cpp.

Definition at line 35 of file hdiv_check_approx_in_3d.cpp.

◆ a1

double a1 = 2.0
constexpr
Examples
hcurl_check_approx_in_2d.cpp.

Definition at line 36 of file hdiv_check_approx_in_3d.cpp.

◆ a2

double a2 = -15.0 * a0
constexpr
Examples
hcurl_check_approx_in_2d.cpp.

Definition at line 37 of file hdiv_check_approx_in_3d.cpp.

◆ a3

double a3 = -20.0 / 6 * a1
constexpr
Examples
hcurl_check_approx_in_2d.cpp.

Definition at line 38 of file hdiv_check_approx_in_3d.cpp.

◆ a4

double a4 = 15.0 * a0
constexpr
Examples
hcurl_check_approx_in_2d.cpp.

Definition at line 39 of file hdiv_check_approx_in_3d.cpp.

◆ a5

double a5 = a1
constexpr
Examples
hcurl_check_approx_in_2d.cpp.

Definition at line 40 of file hdiv_check_approx_in_3d.cpp.

◆ a6

double a6 = -a0
constexpr
Examples
hcurl_check_approx_in_2d.cpp.

Definition at line 41 of file hdiv_check_approx_in_3d.cpp.

◆ BASE_DIM

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

int SPACE_DIM = 3
constexpr

Definition at line 16 of file hdiv_check_approx_in_3d.cpp.