v0.15.0
Loading...
Searching...
No Matches
MoFEM::FieldEvaluatorInterface Struct Reference

Field evaluator interface. More...

#include "src/interfaces/FieldEvaluator.hpp"

Inheritance diagram for MoFEM::FieldEvaluatorInterface:
[legend]
Collaboration diagram for MoFEM::FieldEvaluatorInterface:
[legend]

Classes

struct  SetPts
 Default evaluator for setting integration points. More...
 
struct  SetPtsData
 

Public Member Functions

MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const
 
 FieldEvaluatorInterface (const MoFEM::Core &core)
 
template<typename VE , typename SPD = SetPtsData, typename SP = SetPts>
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.
 
DEPRECATED MoFEMErrorCode buildTree3D (boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
 
DEPRECATED MoFEMErrorCode buildTree2D (boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
 
DEPRECATED 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)
 
DEPRECATED 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)
 
template<int D>
MoFEMErrorCode buildTree (boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
 Build spatial tree.
 
template<int D>
MoFEMErrorCode evalFEAtThePoint (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.
 
template<>
MoFEMErrorCode buildTree (boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
 
template<>
MoFEMErrorCode buildTree (boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
 
template<>
MoFEMErrorCode evalFEAtThePoint (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, VERBOSITY_LEVELS verb)
 
template<>
MoFEMErrorCode evalFEAtThePoint (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, VERBOSITY_LEVELS verb)
 
template<>
MoFEMErrorCode buildTree (boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
 
template<>
MoFEMErrorCode buildTree (boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
 
template<>
MoFEMErrorCode evalFEAtThePoint (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, VERBOSITY_LEVELS verb)
 
template<>
MoFEMErrorCode evalFEAtThePoint (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, VERBOSITY_LEVELS verb)
 
- Public Member Functions inherited from MoFEM::UnknownInterface
template<class IFACE >
MoFEMErrorCode registerInterface (bool error_if_registration_failed=true)
 Register interface.
 
template<class IFACE >
MoFEMErrorCode getInterface (IFACE *&iface) const
 Get interface reference to pointer of interface.
 
template<class IFACE >
MoFEMErrorCode getInterface (IFACE **const iface) const
 Get interface pointer to pointer of interface.
 
template<class IFACE , typename boost::enable_if< boost::is_pointer< IFACE >, int >::type = 0>
IFACE getInterface () const
 Get interface pointer to pointer of interface.
 
template<class IFACE , typename boost::enable_if< boost::is_reference< IFACE >, int >::type = 0>
IFACE getInterface () const
 Get reference to interface.
 
template<class IFACE >
IFACE * getInterface () const
 Function returning pointer to interface.
 
virtual ~UnknownInterface ()=default
 

Public Attributes

MoFEM::CorecOre
 

Private Member Functions

template<int D>
MoFEMErrorCode buildTreeImpl (boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
 
template<int D>
MoFEMErrorCode evalFEAtThePointImpl (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)
 

Additional Inherited Members

- Static Public Member Functions inherited from MoFEM::UnknownInterface
static MoFEMErrorCode getLibVersion (Version &version)
 Get library version.
 
static MoFEMErrorCode getFileVersion (moab::Interface &moab, Version &version)
 Get database major version.
 
static MoFEMErrorCode setFileVersion (moab::Interface &moab, Version version=Version(MoFEM_VERSION_MAJOR, MoFEM_VERSION_MINOR, MoFEM_VERSION_BUILD))
 Get database major version.
 
static MoFEMErrorCode getInterfaceVersion (Version &version)
 Get database major version.
 

Detailed Description

Constructor & Destructor Documentation

◆ FieldEvaluatorInterface()

MoFEM::FieldEvaluatorInterface::FieldEvaluatorInterface ( const MoFEM::Core & core)

Definition at line 8 of file FieldEvaluator.cpp.

9 : cOre(const_cast<MoFEM::Core &>(core)) {
10
11 if (!LogManager::checkIfChannelExist("FieldEvaluatorWorld")) {
12 auto core_log = logging::core::get();
13
15 "FieldEvaluatorWorld"));
17 "FieldEvaluatorSync"));
19 "FieldEvaluatorSelf"));
20
21 LogManager::setLog("FieldEvaluatorWorld");
22 LogManager::setLog("FieldEvaluatorSync");
23 LogManager::setLog("FieldEvaluatorSelf");
24
25 MOFEM_LOG_TAG("FieldEvaluatorWorld", "FieldEvaluator");
26 MOFEM_LOG_TAG("FieldEvaluatorSync", "FieldEvaluator");
27 MOFEM_LOG_TAG("FieldEvaluatorSelf", "FieldEvaluator");
28 }
29
30 MOFEM_LOG("FieldEvaluatorWorld", Sev::noisy) << "Field evaluator intreface";
31}
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
Core (interface) class.
Definition Core.hpp:82
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmWorld()
Get the strm world object.
static boost::shared_ptr< std::ostream > getStrmSync()
Get the strm sync object.
static bool checkIfChannelExist(const std::string channel)
Check if channel exist.
static boost::shared_ptr< std::ostream > getStrmSelf()
Get the strm self object.

Member Function Documentation

◆ buildTree() [1/5]

template<int D>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::buildTree ( boost::shared_ptr< SetPtsData > spd_ptr,
const std::string finite_element )

Build spatial tree.

Parameters
finite_elementfinite element name
Returns
MoFEMErrorCode
Examples
field_evaluator.cpp, and lorentz_force.cpp.

◆ buildTree() [2/5]

template<>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::buildTree ( boost::shared_ptr< SetPtsData > spd_ptr,
const std::string finite_element )

◆ buildTree() [3/5]

template<>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::buildTree ( boost::shared_ptr< SetPtsData > spd_ptr,
const std::string finite_element )

◆ buildTree() [4/5]

template<>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::buildTree ( boost::shared_ptr< SetPtsData > spd_ptr,
const std::string finite_element )

Definition at line 57 of file FieldEvaluator.cpp.

59 {
60 return buildTreeImpl<2>(spd_ptr, finite_element);
61}
MoFEMErrorCode buildTreeImpl(boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)

◆ buildTree() [5/5]

template<>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::buildTree ( boost::shared_ptr< SetPtsData > spd_ptr,
const std::string finite_element )

Definition at line 64 of file FieldEvaluator.cpp.

66 {
67 return buildTreeImpl<3>(spd_ptr, finite_element);
68}

◆ buildTree2D()

MoFEMErrorCode MoFEM::FieldEvaluatorInterface::buildTree2D ( boost::shared_ptr< SetPtsData > spd_ptr,
const std::string finite_element )
Deprecated
use buildTree<SPACE_DIM>

Definition at line 77 of file FieldEvaluator.cpp.

78 {
79 return buildTree<2>(spd_ptr, finite_element);
80}
MoFEMErrorCode buildTree(boost::shared_ptr< SetPtsData > spd_ptr, const std::string finite_element)
Build spatial tree.

◆ buildTree3D()

MoFEMErrorCode MoFEM::FieldEvaluatorInterface::buildTree3D ( boost::shared_ptr< SetPtsData > spd_ptr,
const std::string finite_element )
Deprecated
use buildTree<SPACE_DIM>

Definition at line 71 of file FieldEvaluator.cpp.

72 {
73 return buildTree<3>(spd_ptr, finite_element);
74}

◆ buildTreeImpl()

template<int D>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::buildTreeImpl ( boost::shared_ptr< SetPtsData > spd_ptr,
const std::string finite_element )
private

Definition at line 42 of file FieldEvaluator.cpp.

43 {
44 CoreInterface &m_field = cOre;
46 EntityHandle fe_meshset;
47 fe_meshset = m_field.get_finite_element_meshset(finite_element);
48 Range entities;
49 CHKERR m_field.get_moab().get_entities_by_dimension(fe_meshset, D, entities,
50 true);
51 spd_ptr->treePtr.reset(new AdaptiveKDTree(&m_field.get_moab()));
52 CHKERR spd_ptr->treePtr->build_tree(entities, &spd_ptr->rooTreeSet);
54}
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
double D

◆ evalFEAtThePoint() [1/5]

template<>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::evalFEAtThePoint ( 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,
VERBOSITY_LEVELS verb )

◆ evalFEAtThePoint() [2/5]

template<>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::evalFEAtThePoint ( 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,
VERBOSITY_LEVELS verb )

◆ evalFEAtThePoint() [3/5]

template<>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::evalFEAtThePoint ( 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,
VERBOSITY_LEVELS verb )

Definition at line 384 of file FieldEvaluator.cpp.

388 {
389 return evalFEAtThePointImpl<2>(point, distance, problem, finite_element,
390 data_ptr, lower_rank, upper_rank, cache_ptr,
391 bh, verb);
392}
MoFEMErrorCode evalFEAtThePointImpl(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)

◆ evalFEAtThePoint() [4/5]

template<>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::evalFEAtThePoint ( 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,
VERBOSITY_LEVELS verb )

Definition at line 395 of file FieldEvaluator.cpp.

399 {
400 return evalFEAtThePointImpl<3>(point, distance, problem, finite_element,
401 data_ptr, lower_rank, upper_rank, cache_ptr,
402 bh, verb);
403}

◆ evalFEAtThePoint() [5/5]

template<int D>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::evalFEAtThePoint ( 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.

std::array<double, 3> point = {0, 0, 0};
const double dist = 0.3;
std::array<double, 6> eval_points = {-1., -1., -1., 1., 1., 1. };
using VolEle = VolumeElementForcesAndSourcesCore;
auto data_ptr =
getData<VolEle>(point.data(), point.size/3);
if(auto vol_ele = data_ptr->feMethod.lock()) {
// push operators to finite element instance, e.g.
vol_ele->getOpPtrVector().push_back(new MyOp());
// iterate over elemnts with evaluated points
auto cache_ptr = boost::make_shared<CacheTuple>();
CHKERR m_field.cache_problem_entities(prb_ptr->getName(), cache_ptr);
// SPACE_DIM is 3 in this example
CHKERR m_field.getInterface<FieldEvaluatorInterface>()
->evalFEAtThePoint<3>(point.data(), dist, prb_ptr->getName(),
"FINITE_ELEMENT_NAME",
data_ptr, m_field.get_comm_rank(),
m_field.get_comm_rank(), cache_ptr);
}
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.
FieldEvaluatorInterface(const MoFEM::Core &core)
MoFEMErrorCode evalFEAtThePoint(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.
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...
Parameters
pointpoint used to find tetrahedrons
distancedistance from the point where tetrahedrons are searched
problemproblem name
finite_elementfinite element name
data_ptrpointer to data abut gauss points
lower_ranklower processor
upper_rankupper process
cache_ptrcache or problem entities
bhcontrol looping over entities, e.g. throwing error if element not found
verbverbosity level
Returns
MoFEMErrorCode
Examples
field_evaluator.cpp, and lorentz_force.cpp.

◆ evalFEAtThePoint2D()

MoFEMErrorCode MoFEM::FieldEvaluatorInterface::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 )
Deprecated
use evalFEAtThePoint<SPACE_DIM>

Definition at line 414 of file FieldEvaluator.cpp.

418 {
419 return evalFEAtThePoint<2>(point, distance, problem, finite_element, data_ptr,
420 lower_rank, upper_rank, cache_ptr, bh, verb);
421}

◆ evalFEAtThePoint3D()

MoFEMErrorCode MoFEM::FieldEvaluatorInterface::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 )
Deprecated
use evalFEAtThePoint<SPACE_DIM>

Definition at line 405 of file FieldEvaluator.cpp.

409 {
410 return evalFEAtThePoint<3>(point, distance, problem, finite_element, data_ptr,
411 lower_rank, upper_rank, cache_ptr, bh, verb);
412}

◆ evalFEAtThePointImpl()

template<int D>
MoFEMErrorCode MoFEM::FieldEvaluatorInterface::evalFEAtThePointImpl ( 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 )
private

Definition at line 175 of file FieldEvaluator.cpp.

179 {
180 CoreInterface &m_field = cOre;
182
183 std::vector<EntityHandle> leafs_out;
184 CHKERR data_ptr->treePtr->distance_search(point, distance, leafs_out);
185 Range tree_ents;
186 for (auto lit : leafs_out) //{
187 CHKERR m_field.get_moab().get_entities_by_dimension(lit, D, tree_ents,
188 true);
189
190 if (verb >= NOISY)
191 MOFEM_LOG("SELF", Sev::noisy) << "tree entities: " << tree_ents;
192
193 data_ptr->evalPointEntityHandle.resize(data_ptr->nbEvalPoints);
194 std::fill(data_ptr->evalPointEntityHandle.begin(),
195 data_ptr->evalPointEntityHandle.end(), 0);
196
197 std::vector<double> local_coords;
198 std::vector<double> shape;
199
200 auto nb_eval_points = data_ptr->nbEvalPoints;
201
202 for (auto tet : tree_ents) {
203 if ((type_from_handle(tet) != moab::MBTRI) &&
204 (type_from_handle(tet) != moab::MBTET)) {
205 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
206 "Wrong element type, Field Evaluator not implemented for Quads and Hexes");
207 }
208 const EntityHandle *conn;
209 int num_nodes;
210 CHKERR m_field.get_moab().get_connectivity(tet, conn, num_nodes, true);
211
212 if constexpr (D == 3) {
213
214 local_coords.resize(3 * nb_eval_points);
215 shape.resize(4 * nb_eval_points);
216
217 std::array<double, 12> coords;
218 CHKERR m_field.get_moab().get_coords(conn, num_nodes, coords.data());
219
221 coords.data(), &data_ptr->evalPoints[0], nb_eval_points,
222 &local_coords[0]);
223 CHKERR Tools::shapeFunMBTET<3>(&shape[0], &local_coords[0],
224 &local_coords[1], &local_coords[2],
225 nb_eval_points);
226
227 FTensor::Index<'i', 4> i4;
229 &shape[0], &shape[1], &shape[2], &shape[3]};
231 &data_ptr->shapeFunctions(0, 0), &data_ptr->shapeFunctions(0, 1),
232 &data_ptr->shapeFunctions(0, 2), &data_ptr->shapeFunctions(0, 3)};
233
234 FTensor::Index<'j', 3> j3;
236 &local_coords[0], &local_coords[1], &local_coords[2]};
238 &(data_ptr->localCoords(0, 0)), &(data_ptr->localCoords(0, 1)),
239 &(data_ptr->localCoords(0, 2))};
240
241 for (int n = 0; n != nb_eval_points; ++n) {
242
243 const double eps = data_ptr->eps;
244 if (t_shape(0) >= 0 - eps && t_shape(0) <= 1 + eps &&
245
246 t_shape(1) >= 0 - eps && t_shape(1) <= 1 + eps &&
247
248 t_shape(2) >= 0 - eps && t_shape(2) <= 1 + eps &&
249
250 t_shape(3) >= 0 - eps && t_shape(3) <= 1 + eps) {
251
252 data_ptr->evalPointEntityHandle[n] = tet;
253 t_shape_data(i4) = t_shape(i4);
254 t_local_data(j3) = t_local(j3);
255 }
256
257 ++t_shape;
258 ++t_shape_data;
259 ++t_local;
260 ++t_local_data;
261 }
262 }
263
264 if constexpr (D == 2) {
265
266 local_coords.resize(2 * nb_eval_points);
267 shape.resize(3 * nb_eval_points);
268
269 std::array<double, 9> coords;
270 CHKERR m_field.get_moab().get_coords(conn, num_nodes, coords.data());
271
273 coords.data(), &data_ptr->evalPoints[0], nb_eval_points,
274 &local_coords[0]);
275 CHKERR Tools::shapeFunMBTRI<2>(&shape[0], &local_coords[0],
276 &local_coords[1], nb_eval_points);
277
278 FTensor::Index<'i', 3> i3;
280 &shape[0], &shape[1], &shape[2]};
282 &data_ptr->shapeFunctions(0, 0), &data_ptr->shapeFunctions(0, 1),
283 &data_ptr->shapeFunctions(0, 2)};
284
285 FTensor::Index<'j', 2> j2;
287 &local_coords[0], &local_coords[1]};
288 data_ptr->localCoords.resize(nb_eval_points, 2);
290 &(data_ptr->localCoords(0, 0)), &(data_ptr->localCoords(0, 1))};
291
292 for (int n = 0; n != nb_eval_points; ++n) {
293
294 const double eps = data_ptr->eps;
295 if (t_shape(0) >= 0 - eps && t_shape(0) <= 1 + eps &&
296
297 t_shape(1) >= 0 - eps && t_shape(1) <= 1 + eps &&
298
299 t_shape(2) >= 0 - eps && t_shape(2) <= 1 + eps) {
300
301 data_ptr->evalPointEntityHandle[n] = tet;
302 t_shape_data(i3) = t_shape(i3);
303 t_local_data(j2) = t_local(j2);
304 }
305
306 ++t_shape;
307 ++t_shape_data;
308 ++t_local;
309 ++t_local_data;
310 }
311 }
312 }
313
314 const Problem *prb_ptr;
315 CHKERR m_field.get_problem(problem, &prb_ptr);
316 boost::shared_ptr<NumeredEntFiniteElement_multiIndex> numered_fes(
318
319 Range in_tets;
320 in_tets.insert_list(data_ptr->evalPointEntityHandle.begin(),
321 data_ptr->evalPointEntityHandle.end());
322 in_tets = in_tets.subset_by_dimension(D);
323
324 if (verb >= NOISY)
325 MOFEM_LOG("SELF", Sev::noisy) << "in tets: " << in_tets << endl;
326
327 auto fe_miit =
328 m_field.get_finite_elements()->get<FiniteElement_name_mi_tag>().find(
329 finite_element);
330 if (fe_miit !=
331 m_field.get_finite_elements()->get<FiniteElement_name_mi_tag>().end()) {
332
333 for (auto peit = in_tets.pair_begin(); peit != in_tets.pair_end(); ++peit) {
334
335 auto lo =
336 prb_ptr->numeredFiniteElementsPtr->get<Unique_mi_tag>().lower_bound(
338 peit->first, (*fe_miit)->getFEUId()));
339 auto hi =
340 prb_ptr->numeredFiniteElementsPtr->get<Unique_mi_tag>().upper_bound(
342 peit->second, (*fe_miit)->getFEUId()));
343 numered_fes->insert(lo, hi);
344
345 if (verb >= VERY_NOISY)
346 std::cerr << "numered elements:" << std::endl;
347 for (; lo != hi; ++lo)
348 if (verb >= VERY_NOISY)
349 std::cerr << **lo << endl;
350 }
351 if (verb >= VERY_NOISY)
352 std::cerr << std::endl;
353
354 if (auto fe_ptr = data_ptr->feMethodPtr.lock()) {
355
356 MOFEM_LOG_C("FieldEvaluatorSync", Sev::verbose,
357 "Number elements %d to evaluate at proc %d",
358 numered_fes->size(), m_field.get_comm_rank());
359 MOFEM_LOG_SYNCHRONISE(m_field.get_comm());
360
361 if (!cache_ptr) {
362 cache_ptr = boost::make_shared<CacheTuple>();
363 CHKERR m_field.cache_problem_entities(prb_ptr->getName(), cache_ptr);
364
365 MOFEM_LOG("FieldEvaluatorSync", Sev::noisy)
366 << "If you call that function many times in the loop consider to "
367 "set "
368 "cache_ptr outside of the loop. Otherwise code can be slow.";
369 }
370
371 CHKERR m_field.loop_finite_elements(prb_ptr, finite_element, *fe_ptr,
372 lower_rank, upper_rank, numered_fes,
373 bh, cache_ptr, verb);
374
375 } else
376 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
377 "Pointer to element does not exists");
378 }
379
381}
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
#define MOFEM_LOG_C(channel, severity, format,...)
static const double eps
@ NOISY
@ VERY_NOISY
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
@ MOFEM_NOT_IMPLEMENTED
Definition definitions.h:32
multi_index_container< boost::shared_ptr< NumeredEntFiniteElement >, indexed_by< ordered_unique< tag< Unique_mi_tag >, const_mem_fun< NumeredEntFiniteElement::interface_type_EntFiniteElement, UId, &NumeredEntFiniteElement::getLocalUniqueId > >, ordered_non_unique< tag< Part_mi_tag >, member< NumeredEntFiniteElement, unsigned int, &NumeredEntFiniteElement::part > >, ordered_non_unique< tag< Ent_mi_tag >, const_mem_fun< NumeredEntFiniteElement::interface_type_RefEntity, EntityHandle, &NumeredEntFiniteElement::getEnt > >, ordered_non_unique< tag< Composite_Name_And_Part_mi_tag >, composite_key< NumeredEntFiniteElement, const_mem_fun< NumeredEntFiniteElement::interface_type_FiniteElement, boost::string_ref, &NumeredEntFiniteElement::getNameRef >, member< NumeredEntFiniteElement, unsigned int, &NumeredEntFiniteElement::part > > > > > NumeredEntFiniteElement_multiIndex
MultiIndex for entities for NumeredEntFiniteElement.
const double n
refractive index of diffusive medium
auto type_from_handle(const EntityHandle h)
get type from entity handle
UId getLocalUniqueIdCalculate() const
Generate UId for finite element entity.
static MoFEMErrorCode getLocalCoordinatesOnReferenceFourNodeTet(const double *elem_coords, const double *glob_coords, const int nb_nodes, double *local_coords)
Get the local coordinates on reference four node tet object.
Definition Tools.cpp:88
static MoFEMErrorCode getLocalCoordinatesOnReferenceThreeNodeTri(const double *elem_coords, const double *glob_coords, const int nb_nodes, double *local_coords)
Get the local coordinates on reference three node tri object.
Definition Tools.cpp:188
static MoFEMErrorCode shapeFunMBTET(double *shape, const double *ksi, const double *eta, const double *zeta, const double nb)
Calculate shape functions on tetrahedron.
Definition Tools.hpp:747
static MoFEMErrorCode shapeFunMBTRI(double *shape, const double *ksi, const double *eta, const int nb)
Calculate shape functions on triangle.
Definition Tools.hpp:716

◆ getData()

template<typename VE , typename SPD = SetPtsData, typename SP = SetPts>
boost::shared_ptr< SPD > MoFEM::FieldEvaluatorInterface::getData ( const double * ptr = nullptr,
const int nb_eval_points = 0,
const double eps = 1e-12,
VERBOSITY_LEVELS verb = QUIET )
inline

Get the Data object.

Pack pointers with data structures for field evaluator and finite element. Function return shared pointer if returned shared pointer is reset; all data are destroyed. The idea is to pack all data in one structure, create shared pointer to it and return aliased shared pointer to one of the elements of the data structure. It is a bit complicated, but has great flexibility.

Template Parameters
VE
SetPtsData
SetPts
Parameters
ptr
nb_eval_points
eps
verb
Returns
boost::shared_ptr<SPD>
Examples
field_evaluator.cpp, and lorentz_force.cpp.

Definition at line 107 of file FieldEvaluator.hpp.

108 {
109 struct PackData {
110 boost::scoped_ptr<VE> elePtr;
111 boost::scoped_ptr<SPD> setPtsDataPtr;
112 boost::scoped_ptr<SP> setPtsPtr;
113 };
114 boost::shared_ptr<PackData> pack_data(new PackData());
115 MoFEM::Interface &m_field = cOre;
116 pack_data->elePtr.reset(new VE(m_field));
117
118 pack_data->setPtsDataPtr.reset(
119 new SPD(boost::shared_ptr<VE>(pack_data, pack_data->elePtr.get()), ptr,
120 nb_eval_points, eps, verb));
121 pack_data->setPtsPtr.reset(new SP(
122 boost::shared_ptr<SPD>(pack_data, pack_data->setPtsDataPtr.get())));
123 pack_data->elePtr->setRuleHook = boost::ref(*pack_data->setPtsPtr);
124 boost::shared_ptr<SPD> data(pack_data, pack_data->setPtsDataPtr.get());
125 return data;
126 }
Deprecated interface functions.

◆ query_interface()

MoFEMErrorCode MoFEM::FieldEvaluatorInterface::query_interface ( boost::typeindex::type_index type_index,
UnknownInterface ** iface ) const
virtual

Implements MoFEM::UnknownInterface.

Definition at line 33 of file FieldEvaluator.cpp.

34 {
36 *iface = const_cast<FieldEvaluatorInterface *>(this);
38}
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...

Member Data Documentation

◆ cOre

MoFEM::Core& MoFEM::FieldEvaluatorInterface::cOre

Definition at line 26 of file FieldEvaluator.hpp.


The documentation for this struct was generated from the following files: