v0.14.0
Loading...
Searching...
No Matches
field_evaluator.cpp File Reference
#include <MoFEM.hpp>

Go to the source code of this file.

Classes

struct  MyOp< OP >
 Operator used to check consistency between local coordinates and global cooridnates for integrated points and evaluated points. More...
 

Functions

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

Variables

static char help [] = "testing field evaluator\n\n"
 
auto get_rule
 

Function Documentation

◆ main()

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

Definition at line 77 of file field_evaluator.cpp.

77 {
78
79 MoFEM::Core::Initialize(&argc, &argv, (char *)0, help);
80
81 try {
82
83 // Read mesh and create moab and mofem data structures
84 moab::Core mb_instance;
85 moab::Interface &moab = mb_instance;
86
87 MoFEM::Core core(moab, PETSC_COMM_WORLD);
88 MoFEM::Interface &m_field = core;
89
90 // Register DM Manager
91 DMType dm_name = "DMMOFEM";
92 CHKERR DMRegister_MoFEM(dm_name);
93
94 // Simple interface
95 Simple *simple_interface;
96 CHKERR m_field.getInterface(simple_interface);
97 {
98
99 // get options from command line
100 CHKERR simple_interface->getOptions();
101 // load mesh file
102 CHKERR simple_interface->loadFile();
103 // add fields
104 CHKERR simple_interface->addDomainField("FIELD1", H1,
106 // set fields order
107 CHKERR simple_interface->setFieldOrder("FIELD1", 1);
108 // setup problem
109 CHKERR simple_interface->setUp();
110
111 FieldEvaluatorInterface *field_eval_ptr;
112 CHKERR m_field.getInterface(field_eval_ptr);
113
114
115 auto dm = simple_interface->getDM();
116 const MoFEM::Problem *prb_ptr;
117 CHKERR DMMoFEMGetProblemPtr(dm, &prb_ptr);
118
119 if (simple_interface->getDim() == 3) {
120
121 std::array<double, 3> point = {0, 0, 0};
122 const double dist = 0.1;
123
124 std::array<double, 12> eval_points = {0.0, 0.0, 0.0, 0.0, 0.01, 0.0,
125 -0.1, 0.0, 0.0, 0.1, 0.0, 0.0};
126
129
130 // Get pointer of FieldEvaluator data. Note finite element and method
131 // set integrating points is destroyed when this pointer is releases
132 auto data = field_eval_ptr->getData<VolEle>();
133
134 // Set operators and integration rule
135 if (auto fe_method = data->feMethodPtr.lock()) {
136 fe_method->getRuleHook = get_rule;
137 fe_method->getOpPtrVector().push_back(new MyOp<VolOp>(eval_points));
138 } else
139 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
140 "Pointer to element does not exists");
141
142 // Build tree for particular element
143 CHKERR field_eval_ptr->buildTree3D(data,
144 simple_interface->getDomainFEName());
145 // Set points to set on finite elements
146 data->setEvalPoints(eval_points.data(), eval_points.size() / 3);
147
148 // Evaluate points on finite elements
149 CHKERR field_eval_ptr->evalFEAtThePoint3D(
150 &point[0], dist, prb_ptr->getName(),
151 simple_interface->getDomainFEName(), data, m_field.get_comm_rank(),
152 m_field.get_comm_rank(), nullptr, MF_EXIST, VERY_NOISY);
153 }
154
155 if (simple_interface->getDim() == 2) {
156
157 std::array<double, 3> point = {0, 0, 0};
158 const double dist = 0.1;
159
160 std::array<double, 12> eval_points = {
161 0.0, 0.0, 0.0,
162 0.0, 0.01, 0.0,
163 -0.1, 0.0, 0.0,
164 0.1, 0.0, 0.0};
165
168
169 // Get pointer of FieldEvaluator data. Note finite element and method
170 // set integrating points is destroyed when this pointer is releases
171 auto data = field_eval_ptr->getData<FaceEle>();
172
173 // Set operators and integration rule
174 if (auto fe_method = data->feMethodPtr.lock()) {
175 fe_method->getRuleHook = get_rule;
176 fe_method->getOpPtrVector().push_back(new MyOp<FaceOp>(eval_points));
177 } else
178 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
179 "Pointer to element does not exists");
180
181 // Build tree for particular element
182 CHKERR field_eval_ptr->buildTree2D(data,
183 simple_interface->getDomainFEName());
184 // Set points to set on finite elements
185 data->setEvalPoints(eval_points.data(), eval_points.size() / 3);
186
187 // Evaluate points on finite elements
188 CHKERR field_eval_ptr->evalFEAtThePoint2D(
189 &point[0], dist, prb_ptr->getName(),
190 simple_interface->getDomainFEName(), data, m_field.get_comm_rank(),
191 m_field.get_comm_rank(), nullptr, MF_EXIST, VERY_NOISY);
192 }
193
194 }
195 }
197
199
200 return 0;
201}
@ VERY_NOISY
#define CATCH_ERRORS
Catch errors.
@ MF_EXIST
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
Definition definitions.h:60
@ H1
continuous field
Definition definitions.h:85
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define CHKERR
Inline error check.
static char help[]
auto get_rule
PetscErrorCode DMMoFEMGetProblemPtr(DM dm, const MoFEM::Problem **problem_ptr)
Get pointer to problem data structure.
Definition DMMoFEM.cpp:426
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
Definition DMMoFEM.cpp:43
virtual int get_comm_rank() const =0
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.
Field evaluator interface.
MoFEMErrorCode buildTree3D(boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
Build spatial tree.
MoFEMErrorCode buildTree2D(boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
Build spatial tree.
MoFEMErrorCode evalFEAtThePoint2D(const double *const point, const double distance, const std::string problem, const std::string finite_element, boost::shared_ptr< SetPtsData > data_ptr, int lower_rank, int upper_rank, boost::shared_ptr< CacheTuple > cache_ptr, MoFEMTypes bh=MF_EXIST, VERBOSITY_LEVELS verb=QUIET)
Evaluate field at artbitray position.
boost::shared_ptr< SPD > getData(const double *ptr=nullptr, const int nb_eval_points=0, const double eps=1e-12, VERBOSITY_LEVELS verb=QUIET)
Get the Data object.
MoFEMErrorCode evalFEAtThePoint3D(const double *const point, const double distance, const std::string problem, const std::string finite_element, boost::shared_ptr< SetPtsData > data_ptr, int lower_rank, int upper_rank, boost::shared_ptr< CacheTuple > cache_ptr, MoFEMTypes bh=MF_EXIST, VERBOSITY_LEVELS verb=QUIET)
Evaluate field at artbitray position.
keeps basic data about problem
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:264
int getDim() const
Get the problem dimension.
Definition Simple.hpp:331
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name, LoadFileFunc loadFunc=defaultLoadFileFunc)
Load mesh file.
Definition Simple.cpp:194
MoFEMErrorCode getOptions()
get options
Definition Simple.cpp:180
MoFEMErrorCode getDM(DM *dm)
Get DM.
Definition Simple.cpp:829
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
Definition Simple.cpp:599
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
Definition Simple.cpp:765
const std::string getDomainFEName() const
Get the Domain FE Name.
Definition Simple.hpp:387
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Operator used to check consistency between local coordinates and global cooridnates for integrated po...

Variable Documentation

◆ get_rule

auto get_rule
Initial value:
= [](int order_row, int order_col, int order_data) {
return -1;
}
Examples
field_evaluator.cpp, and lorentz_force.cpp.

Definition at line 73 of file field_evaluator.cpp.

73 {
74 return -1;
75};

◆ help

char help[] = "testing field evaluator\n\n"
static

Definition at line 14 of file field_evaluator.cpp.