v0.13.1
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Public Attributes | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | Friends | List of all members
MoFEM::ForcesAndSourcesCore Struct Reference

structure to get information form mofem into EntitiesFieldData More...

#include <src/finite_elements/ForcesAndSourcesCore.hpp>

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

Classes

struct  UserDataOperator
 

Public Types

typedef boost::function< int(int order_row, int order_col, int order_data)> RuleHookFun
 
typedef boost::function< MoFEMErrorCode(ForcesAndSourcesCore *fe_raw_ptr, int order_row, int order_col, int order_data)> GaussHookFun
 
- Public Types inherited from MoFEM::KspMethod
enum  KSPContext { CTX_SETFUNCTION , CTX_OPERATORS , CTX_KSPNONE }
 pass information about context of KSP/DM for with finite element is computed More...
 
- Public Types inherited from MoFEM::PetscData
enum  DataContext {
  CTX_SET_NONE = 0 , CTX_SET_F = 1 << 0 , CTX_SET_A = 1 << 1 , CTX_SET_B = 1 << 2 ,
  CTX_SET_X = 1 << 3 , CTX_SET_X_T = 1 << 4 , CTX_SET_X_TT = 1 << 6 , CTX_SET_TIME = 1 << 7
}
 
using Switches = std::bitset< 8 >
 
- Public Types inherited from MoFEM::SnesMethod
enum  SNESContext { CTX_SNESSETFUNCTION , CTX_SNESSETJACOBIAN , CTX_SNESNONE }
 
- Public Types inherited from MoFEM::TSMethod
enum  TSContext {
  CTX_TSSETRHSFUNCTION , CTX_TSSETRHSJACOBIAN , CTX_TSSETIFUNCTION , CTX_TSSETIJACOBIAN ,
  CTX_TSTSMONITORSET , CTX_TSNONE
}
 

Public Member Functions

 ForcesAndSourcesCore (Interface &m_field)
 
boost::ptr_vector< UserDataOperator > & getOpPtrVector ()
 Use to push back operator for row operator. More...
 
auto & getElementPolynomialBase ()
 Get the Entity Polynomial Base object. More...
 
auto & getUserPolynomialBase ()
 Get the User Polynomial Base object. More...
 
virtual MoFEMErrorCode preProcess ()
 function is run at the beginning of loop More...
 
virtual MoFEMErrorCode operator() ()
 function is run for every finite element More...
 
virtual MoFEMErrorCode postProcess ()
 function is run at the end of loop More...
 
int getMaxDataOrder () const
 Get max order of approximation for data fields. More...
 
int getMaxRowOrder () const
 Get max order of approximation for field in rows. More...
 
int getMaxColOrder () const
 Get max order of approximation for field in columns. More...
 
auto & getEntData (const FieldSpace space, const EntityType type, const int side)
 Get the entity data. More...
 
auto & getDataOnElementBySpaceArray ()
 Get data on entities and space. More...
 
auto & getDerivedDataOnElementBySpaceArray ()
 Get derived data on entities and space. More...
 
- Public Member Functions inherited from MoFEM::FEMethod
MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const
 
 FEMethod ()=default
 
auto getFEName () const
 get finite element name More...
 
auto getDataDofsPtr () const
 
auto getDataVectorDofsPtr () const
 
const FieldEntity_vector_viewgetDataFieldEnts () const
 
boost::shared_ptr< FieldEntity_vector_view > & getDataFieldEntsPtr () const
 
auto & getRowFieldEnts () const
 
auto & getRowFieldEntsPtr () const
 
auto & getColFieldEnts () const
 
auto & getColFieldEntsPtr () const
 
auto getRowDofsPtr () const
 
auto getColDofsPtr () const
 
auto getNumberOfNodes () const
 
EntityHandle getFEEntityHandle () const
 
MoFEMErrorCode getNodeData (const std::string field_name, VectorDouble &data, const bool reset_dofs=true)
 
- Public Member Functions inherited from MoFEM::BasicMethod
MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const
 
 BasicMethod ()
 
virtual ~BasicMethod ()=default
 
int getNinTheLoop () const
 get number of evaluated element in the loop More...
 
int getLoopSize () const
 get loop size More...
 
auto getLoHiFERank () const
 Get lo and hi processor rank of iterated entities. More...
 
auto getLoFERank () const
 Get upper rank in loop for iterating elements. More...
 
auto getHiFERank () const
 Get upper rank in loop for iterating elements. More...
 
unsigned int getFieldBitNumber (std::string field_name) const
 
MoFEMErrorCode copyBasicMethod (const BasicMethod &basic)
 Copy data from other base method to this base method. More...
 
virtual MoFEMErrorCode preProcess ()
 function is run at the beginning of loop More...
 
virtual MoFEMErrorCode operator() ()
 function is run for every finite element More...
 
virtual MoFEMErrorCode postProcess ()
 function is run at the end of loop More...
 
boost::weak_ptr< CacheTuplegetCacheWeakPtr () const
 Get the cache weak ptr object. More...
 
- Public Member Functions inherited from MoFEM::KspMethod
MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const
 
 KspMethod ()
 
virtual ~KspMethod ()=default
 
MoFEMErrorCode copyKsp (const KspMethod &ksp)
 copy data form another method More...
 
- Public Member Functions inherited from MoFEM::PetscData
MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const
 
 PetscData ()
 
virtual ~PetscData ()=default
 
MoFEMErrorCode copyPetscData (const PetscData &petsc_data)
 
- Public Member Functions inherited from MoFEM::UnknownInterface
virtual MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const =0
 
template<class IFACE >
MoFEMErrorCode registerInterface (bool error_if_registration_failed=true)
 Register interface. More...
 
template<class IFACE >
MoFEMErrorCode getInterface (IFACE *&iface) const
 Get interface refernce to pointer of interface. More...
 
template<class IFACE >
MoFEMErrorCode getInterface (IFACE **const iface) const
 Get interface pointer to pointer of interface. More...
 
template<class IFACE , typename boost::enable_if< boost::is_pointer< IFACE >, int >::type = 0>
IFACE getInterface () const
 Get interface pointer to pointer of interface. More...
 
template<class IFACE , typename boost::enable_if< boost::is_reference< IFACE >, int >::type = 0>
IFACE getInterface () const
 Get reference to interface. More...
 
template<class IFACE >
IFACE * getInterface () const
 Function returning pointer to interface. More...
 
virtual ~UnknownInterface ()=default
 
- Public Member Functions inherited from MoFEM::SnesMethod
MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const
 
 SnesMethod ()
 
virtual ~SnesMethod ()=default
 
MoFEMErrorCode copySnes (const SnesMethod &snes)
 Copy snes data. More...
 
- Public Member Functions inherited from MoFEM::TSMethod
MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const
 
 TSMethod ()
 
virtual ~TSMethod ()=default
 
MoFEMErrorCode copyTs (const TSMethod &ts)
 Copy TS solver data. More...
 

Public Attributes

InterfacemField
 
RuleHookFun getRuleHook
 Hook to get rule. More...
 
GaussHookFun setRuleHook
 Set function to calculate integration rule. More...
 
MatrixDouble gaussPts
 Matrix of integration points. More...
 
- Public Attributes inherited from MoFEM::FEMethod
std::string feName
 Name of finite element. More...
 
boost::shared_ptr< const NumeredEntFiniteElementnumeredEntFiniteElementPtr
 
boost::function< bool(FEMethod *fe_method_ptr)> exeTestHook
 Tet if element to skip element. More...
 
- Public Attributes inherited from MoFEM::BasicMethod
int nInTheLoop
 number currently of processed method More...
 
int loopSize
 local number oe methods to process More...
 
std::pair< int, int > loHiFERank
 Llo and hi processor rank of iterated entities. More...
 
int rAnk
 processor rank More...
 
int sIze
 number of processors in communicator More...
 
const RefEntity_multiIndexrefinedEntitiesPtr
 container of mofem dof entities More...
 
const RefElement_multiIndexrefinedFiniteElementsPtr
 container of mofem finite element entities More...
 
const ProblemproblemPtr
 raw pointer to problem More...
 
const Field_multiIndexfieldsPtr
 raw pointer to fields container More...
 
const FieldEntity_multiIndexentitiesPtr
 raw pointer to container of field entities More...
 
const DofEntity_multiIndexdofsPtr
 raw pointer container of dofs More...
 
const FiniteElement_multiIndexfiniteElementsPtr
 raw pointer to container finite elements More...
 
const EntFiniteElement_multiIndexfiniteElementsEntitiesPtr
 
const FieldEntityEntFiniteElementAdjacencyMap_multiIndexadjacenciesPtr
 
boost::function< MoFEMErrorCode()> preProcessHook
 Hook function for pre-processing. More...
 
boost::function< MoFEMErrorCode()> postProcessHook
 Hook function for post-processing. More...
 
boost::function< MoFEMErrorCode()> operatorHook
 Hook function for operator. More...
 
boost::movelib::unique_ptr< boolvecAssembleSwitch
 
boost::movelib::unique_ptr< boolmatAssembleSwitch
 
boost::weak_ptr< CacheTuplecacheWeakPtr
 
- Public Attributes inherited from MoFEM::KspMethod
KSPContext ksp_ctx
 Context. More...
 
KSP ksp
 KSP solver. More...
 
Vec & ksp_f
 
Mat & ksp_A
 
Mat & ksp_B
 
- Public Attributes inherited from MoFEM::PetscData
Switches data_ctx
 
Vec f
 
Mat A
 
Mat B
 
Vec x
 
Vec x_t
 
Vec x_tt
 
- Public Attributes inherited from MoFEM::SnesMethod
SNESContext snes_ctx
 
SNES snes
 snes solver More...
 
Vec & snes_x
 state vector More...
 
Vec & snes_f
 residual More...
 
Mat & snes_A
 jacobian matrix More...
 
Mat & snes_B
 preconditioner of jacobian matrix More...
 
- Public Attributes inherited from MoFEM::TSMethod
TS ts
 time solver More...
 
TSContext ts_ctx
 
PetscInt ts_step
 time step number More...
 
PetscReal ts_a
 shift for U_t (see PETSc Time Solver) More...
 
PetscReal ts_aa
 shift for U_tt shift for U_tt More...
 
PetscReal ts_t
 time More...
 
PetscReal ts_dt
 time step size More...
 
Vec & ts_u
 state vector More...
 
Vec & ts_u_t
 time derivative of state vector More...
 
Vec & ts_u_tt
 second time derivative of state vector More...
 
Vec & ts_F
 residual vector More...
 
Mat & ts_A
 
Mat & ts_B
 Preconditioner for ts_A. More...
 

Protected Member Functions

MoFEMErrorCode getEntitySense (const EntityType type, boost::ptr_vector< EntitiesFieldData::EntData > &data) const
 get sense (orientation) of entity More...
 
MoFEMErrorCode getEntityDataOrder (const EntityType type, const FieldSpace space, boost::ptr_vector< EntitiesFieldData::EntData > &data) const
 Get the entity data order. More...
 
template<EntityType type>
MoFEMErrorCode getEntitySense (EntitiesFieldData &data) const
 Get the entity sense (orientation) More...
 
template<EntityType type>
MoFEMErrorCode getEntityDataOrder (EntitiesFieldData &data, const FieldSpace space) const
 Get the entity data order for given space. More...
 
MoFEMErrorCode getFaceNodes (EntitiesFieldData &data) const
 Get nodes on faces. More...
 
MoFEMErrorCode getSpacesAndBaseOnEntities (EntitiesFieldData &data) const
 Get field approximation space and base on entities. More...
 
virtual int getRule (int order_row, int order_col, int order_data)
 another variant of getRule More...
 
virtual MoFEMErrorCode setGaussPts (int order_row, int order_col, int order_data)
 set user specific integration rule More...
 
MoFEMErrorCode calHierarchicalBaseFunctionsOnElement (const FieldApproximationBase b)
 Calculate base functions. More...
 
MoFEMErrorCode calHierarchicalBaseFunctionsOnElement ()
 Calculate base functions. More...
 
MoFEMErrorCode calBernsteinBezierBaseFunctionsOnElement ()
 Calculate Bernstein-Bezier base. More...
 
MoFEMErrorCode createDataOnElement (EntityType type)
 Create a entity data on element object. More...
 
MoFEMErrorCode loopOverOperators ()
 Iterate user data operators. More...
 
Indices
template<typename EXTRACTOR >
MoFEMErrorCode getNodesIndices (const int bit_number, FieldEntity_vector_view &ents_field, VectorInt &nodes_indices, VectorInt &local_nodes_indices, EXTRACTOR &&extractor) const
 get node indices More...
 
MoFEMErrorCode getRowNodesIndices (EntitiesFieldData &data, const int bit_number) const
 get row node indices from FENumeredDofEntity_multiIndex More...
 
MoFEMErrorCode getColNodesIndices (EntitiesFieldData &data, const int bit_number) const
 get col node indices from FENumeredDofEntity_multiIndex More...
 
template<typename EXTRACTOR >
MoFEMErrorCode getEntityIndices (EntitiesFieldData &data, const int bit_number, FieldEntity_vector_view &ents_field, const EntityType type_lo, const EntityType type_hi, EXTRACTOR &&extractor) const
 
MoFEMErrorCode getEntityRowIndices (EntitiesFieldData &data, const int bit_number, const EntityType type_lo=MBVERTEX, const EntityType type_hi=MBPOLYHEDRON) const
 
MoFEMErrorCode getEntityColIndices (EntitiesFieldData &data, const int bit_number, const EntityType type_lo=MBVERTEX, const EntityType type_hi=MBPOLYHEDRON) const
 
MoFEMErrorCode getNoFieldIndices (const int bit_number, boost::shared_ptr< FENumeredDofEntity_multiIndex > dofs, VectorInt &nodes_indices) const
 get NoField indices More...
 
MoFEMErrorCode getNoFieldRowIndices (EntitiesFieldData &data, const int bit_number) const
 get col NoField indices More...
 
MoFEMErrorCode getNoFieldColIndices (EntitiesFieldData &data, const int bit_number) const
 get col NoField indices More...
 
Data
MoFEMErrorCode getBitRefLevelOnData ()
 
MoFEMErrorCode getNoFieldFieldData (const int bit_number, VectorDouble &ent_field_data, VectorDofs &ent_field_dofs, VectorFieldEntities &ent_field) const
 Get field data on nodes. More...
 
MoFEMErrorCode getNoFieldFieldData (EntitiesFieldData &data, const int bit_number) const
 
MoFEMErrorCode getNodesFieldData (EntitiesFieldData &data, const int bit_number) const
 Get data on nodes. More...
 
MoFEMErrorCode getEntityFieldData (EntitiesFieldData &data, const int bit_number, const EntityType type_lo=MBVERTEX, const EntityType type_hi=MBPOLYHEDRON) const
 
Data form NumeredDofEntity_multiIndex
MoFEMErrorCode getProblemNodesIndices (const std::string &field_name, const NumeredDofEntity_multiIndex &dofs, VectorInt &nodes_indices) const
 get indices of nodal indices which are declared for problem but not this particular element More...
 
MoFEMErrorCode getProblemTypeIndices (const std::string &field_name, const NumeredDofEntity_multiIndex &dofs, EntityType type, int side_number, VectorInt &indices) const
 get indices by type (generic function) which are declared for problem but not this particular element More...
 
MoFEMErrorCode getProblemNodesRowIndices (const std::string &field_name, VectorInt &nodes_indices) const
 
MoFEMErrorCode getProblemTypeRowIndices (const std::string &field_name, EntityType type, int side_number, VectorInt &indices) const
 
MoFEMErrorCode getProblemNodesColIndices (const std::string &field_name, VectorInt &nodes_indices) const
 
MoFEMErrorCode getProblemTypeColIndices (const std::string &field_name, EntityType type, int side_number, VectorInt &indices) const
 
Deprecated (do not use)
virtual int getRule (int order)
 
virtual MoFEMErrorCode setGaussPts (int order)
 

Protected Attributes

const std::array< boost::shared_ptr< EntitiesFieldData >, LASTSPACEdataOnElement
 Entity data on element entity rows fields. More...
 
const std::array< boost::shared_ptr< EntitiesFieldData >, LASTSPACEderivedDataOnElement
 Entity data on element entity columns fields. More...
 
EntitiesFieldDatadataNoField
 
EntitiesFieldDatadataH1
 
EntitiesFieldDatadataHcurl
 
EntitiesFieldDatadataHdiv
 
EntitiesFieldDatadataL2
 
boost::ptr_vector< UserDataOperatoropPtrVector
 Vector of finite element users data operators. More...
 
EntityType lastEvaluatedElementEntityType
 Last evaluated type of element entity. More...
 
MatrixDouble coordsAtGaussPts
 coordinated at gauss points More...
 
double elementMeasure
 

Private Member Functions

MoFEMErrorCode setSideFEPtr (const ForcesAndSourcesCore *side_fe_ptr)
 Set the pointer to face element on the side. More...
 
MoFEMErrorCode setRefineFEPtr (const ForcesAndSourcesCore *refine_fe_ptr)
 Set the pointer to face element refined. More...
 

Private Attributes

boost::shared_ptr< BaseFunctionelementPolynomialBasePtr
 Pointer to entity polynomial base. More...
 
boost::shared_ptr< BaseFunctionuserPolynomialBasePtr
 Pointer to user polynomail base. More...
 
ForcesAndSourcesCoresidePtrFE
 Element to integrate on the sides. More...
 
ForcesAndSourcesCorerefinePtrFE
 Element to integrate parent or child. More...
 

Friends

class UserDataOperator
 
class VolumeElementForcesAndSourcesCoreOnSide
 
class FaceElementForcesAndSourcesCoreOnSide
 
class FaceElementForcesAndSourcesCoreOnChildParent
 
class EdgeElementForcesAndSourcesCoreOnChildParent
 
class VolumeElementForcesAndSourcesCoreOnContactPrismSide
 

Additional Inherited Members

- Static Public Member Functions inherited from MoFEM::UnknownInterface
static MoFEMErrorCode getLibVersion (Version &version)
 Get library version. More...
 
static MoFEMErrorCode getFileVersion (moab::Interface &moab, Version &version)
 Get database major version. More...
 
static MoFEMErrorCode setFileVersion (moab::Interface &moab, Version version=Version(MoFEM_VERSION_MAJOR, MoFEM_VERSION_MINOR, MoFEM_VERSION_BUILD))
 Get database major version. More...
 
static MoFEMErrorCode getInterfaceVersion (Version &version)
 Get database major version. More...
 
- Static Public Attributes inherited from MoFEM::PetscData
static constexpr Switches CtxSetNone = PetscData::Switches(CTX_SET_NONE)
 
static constexpr Switches CtxSetF = PetscData::Switches(CTX_SET_F)
 
static constexpr Switches CtxSetA = PetscData::Switches(CTX_SET_A)
 
static constexpr Switches CtxSetB = PetscData::Switches(CTX_SET_B)
 
static constexpr Switches CtxSetX = PetscData::Switches(CTX_SET_X)
 
static constexpr Switches CtxSetX_T = PetscData::Switches(CTX_SET_X_T)
 
static constexpr Switches CtxSetX_TT = PetscData::Switches(CTX_SET_X_TT)
 
static constexpr Switches CtxSetTime = PetscData::Switches(CTX_SET_TIME)
 

Detailed Description

structure to get information form mofem into EntitiesFieldData

Examples
EshelbianPlasticity.cpp, hanging_node_approx.cpp, hello_world.cpp, prism_elements_from_surface.cpp, prism_polynomial_approximation.cpp, and quad_polynomial_approximation.cpp.

Definition at line 22 of file ForcesAndSourcesCore.hpp.

Member Typedef Documentation

◆ GaussHookFun

typedef boost::function<MoFEMErrorCode(ForcesAndSourcesCore *fe_raw_ptr, int order_row, int order_col, int order_data)> MoFEM::ForcesAndSourcesCore::GaussHookFun

Definition at line 33 of file ForcesAndSourcesCore.hpp.

◆ RuleHookFun

typedef boost::function<int(int order_row, int order_col, int order_data)> MoFEM::ForcesAndSourcesCore::RuleHookFun

Definition at line 28 of file ForcesAndSourcesCore.hpp.

Constructor & Destructor Documentation

◆ ForcesAndSourcesCore()

MoFEM::ForcesAndSourcesCore::ForcesAndSourcesCore ( Interface m_field)

Definition at line 42 of file ForcesAndSourcesCore.cpp.

43 :
44
45 mField(m_field), getRuleHook(0), setRuleHook(0),
47
48 boost::make_shared<EntitiesFieldData>(MBENTITYSET), // NOSPACE,
49 boost::make_shared<EntitiesFieldData>(MBENTITYSET), // NOFIELD
50 boost::make_shared<EntitiesFieldData>(MBENTITYSET), // H1
51 boost::make_shared<EntitiesFieldData>(MBENTITYSET), // HCURL
52 boost::make_shared<EntitiesFieldData>(MBENTITYSET), // HDIV
53 boost::make_shared<EntitiesFieldData>(MBENTITYSET) // L2
54
55 },
57
58 nullptr,
59 boost::make_shared<DerivedEntitiesFieldData>(
60 dataOnElement[NOFIELD]), // NOFIELD
61 boost::make_shared<DerivedEntitiesFieldData>(dataOnElement[H1]), // H1
62 boost::make_shared<DerivedEntitiesFieldData>(
63 dataOnElement[HCURL]), // HCURL
64 boost::make_shared<DerivedEntitiesFieldData>(
65 dataOnElement[HDIV]), // HDIV
66 boost::make_shared<DerivedEntitiesFieldData>(dataOnElement[L2]) // L2
67
68 },
72 lastEvaluatedElementEntityType(MBMAXTYPE), sidePtrFE(nullptr),
73 refinePtrFE(nullptr) {
74
75 dataOnElement[NOSPACE]->dataOnEntities[MBENTITYSET].push_back(
76 new EntitiesFieldData::EntData());
77
78 dataOnElement[NOFIELD]->dataOnEntities[MBENTITYSET].push_back(
79 new EntitiesFieldData::EntData());
80 derivedDataOnElement[NOFIELD]->dataOnEntities[MBENTITYSET].push_back(
81 new EntitiesFieldData::EntData());
82}
@ L2
field with C-1 continuity
Definition: definitions.h:88
@ NOFIELD
scalar or vector of scalars describe (no true field)
Definition: definitions.h:84
@ H1
continuous field
Definition: definitions.h:85
@ NOSPACE
Definition: definitions.h:83
@ HCURL
field with continuous tangents
Definition: definitions.h:86
@ HDIV
field with continuous normal traction
Definition: definitions.h:87
const std::array< boost::shared_ptr< EntitiesFieldData >, LASTSPACE > derivedDataOnElement
Entity data on element entity columns fields.
ForcesAndSourcesCore * sidePtrFE
Element to integrate on the sides.
const std::array< boost::shared_ptr< EntitiesFieldData >, LASTSPACE > dataOnElement
Entity data on element entity rows fields.
EntityType lastEvaluatedElementEntityType
Last evaluated type of element entity.
GaussHookFun setRuleHook
Set function to calculate integration rule.
ForcesAndSourcesCore * refinePtrFE
Element to integrate parent or child.
RuleHookFun getRuleHook
Hook to get rule.

Member Function Documentation

◆ calBernsteinBezierBaseFunctionsOnElement()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::calBernsteinBezierBaseFunctionsOnElement ( )
protected

Calculate Bernstein-Bezier base.

Returns
MoFEMErrorCode

Definition at line 1098 of file ForcesAndSourcesCore.cpp.

1098 {
1100
1101 const auto ele_type = numeredEntFiniteElementPtr->getEntType();
1102
1103 auto get_nodal_base_data = [&](EntitiesFieldData &data, auto field_ptr) {
1105 auto &space = data.dataOnEntities[MBVERTEX][0].getSpace();
1106 auto &base = data.dataOnEntities[MBVERTEX][0].getBase();
1107 auto &bb_node_order = data.dataOnEntities[MBVERTEX][0].getBBNodeOrder();
1108
1109 auto &field_ents = getDataFieldEnts();
1110 auto bit_number = field_ptr->getBitNumber();
1111 const auto lo_uid = FieldEntity::getLocalUniqueIdCalculate(
1112 bit_number, get_id_for_min_type<MBVERTEX>());
1113 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
1114 cmp_uid_lo);
1115 if (lo != field_ents.end()) {
1116 const auto hi_uid = FieldEntity::getLocalUniqueIdCalculate(
1117 bit_number, get_id_for_max_type<MBVERTEX>());
1118 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid, cmp_uid_hi);
1119 if (lo != hi) {
1120
1121 for (auto it = lo; it != hi; ++it)
1122 if (auto first_e = it->lock()) {
1123 space = first_e->getSpace();
1124 base = first_e->getApproxBase();
1125 const int num_nodes = getNumberOfNodes();
1126 bb_node_order.resize(num_nodes, false);
1127 bb_node_order.clear();
1128 const int nb_dof_idx = first_e->getNbOfCoeffs();
1129
1130 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
1131
1132 for (; it != hi; ++it) {
1133 if (auto e = it->lock()) {
1134 const auto &sn = e->getSideNumberPtr();
1135 const int side_number = sn->side_number;
1136 const int brother_side_number = sn->brother_side_number;
1137 if (brother_side_number != -1)
1138 brother_ents_vec.emplace_back(e);
1139 bb_node_order[side_number] = e->getMaxOrder();
1140 }
1141 }
1142
1143 for (auto &it : brother_ents_vec) {
1144 if (const auto e = it.lock()) {
1145 const auto &sn = e->getSideNumberPtr();
1146 const int side_number = sn->side_number;
1147 const int brother_side_number = sn->brother_side_number;
1148 bb_node_order[brother_side_number] = bb_node_order[side_number];
1149 }
1150 }
1151
1152 break;
1153 }
1154 }
1155 }
1156
1158 };
1159
1160 auto get_entity_base_data = [&](EntitiesFieldData &data, auto field_ptr,
1161 const EntityType type_lo,
1162 const EntityType type_hi) {
1164 for (EntityType t = MBEDGE; t != MBPOLYHEDRON; ++t) {
1165 for (auto &dat : data.dataOnEntities[t]) {
1166 dat.getOrder() = 0;
1167 dat.getBase() = NOBASE;
1168 dat.getSpace() = NOSPACE;
1169 dat.getFieldData().resize(0, false);
1170 dat.getFieldDofs().resize(0, false);
1171 }
1172 }
1173
1174 auto &field_ents = getDataFieldEnts();
1175 auto bit_number = field_ptr->getBitNumber();
1176 const auto lo_uid = FieldEntity::getLocalUniqueIdCalculate(
1177 bit_number, get_id_for_min_type(type_lo));
1178 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
1179 cmp_uid_lo);
1180 if (lo != field_ents.end()) {
1181 const auto hi_uid = FieldEntity::getLocalUniqueIdCalculate(
1182 bit_number, get_id_for_max_type(type_hi));
1183 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid, cmp_uid_hi);
1184
1185 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
1186 for (; lo != hi; ++lo) {
1187 if (auto e = lo->lock()) {
1188 if (auto cache = e->entityCacheDataDofs.lock()) {
1189 if (cache->loHi[0] != cache->loHi[1]) {
1190 if (const auto side = e->getSideNumberPtr()->side_number;
1191 side >= 0) {
1192 const EntityType type = e->getEntType();
1193 auto &dat = data.dataOnEntities[type][side];
1194 const int brother_side =
1195 e->getSideNumberPtr()->brother_side_number;
1196 if (brother_side != -1)
1197 brother_ents_vec.emplace_back(e);
1198 dat.getBase() = e->getApproxBase();
1199 dat.getSpace() = e->getSpace();
1200 const auto ent_order = e->getMaxOrder();
1201 dat.getOrder() =
1202 dat.getOrder() > ent_order ? dat.getOrder() : ent_order;
1203 }
1204 }
1205 }
1206 }
1207 }
1208
1209 for (auto &ent_ptr : brother_ents_vec) {
1210 if (auto e = ent_ptr.lock()) {
1211 const EntityType type = e->getEntType();
1212 const int side = e->getSideNumberPtr()->side_number;
1213 const int brother_side = e->getSideNumberPtr()->brother_side_number;
1214 auto &dat = data.dataOnEntities[type][side];
1215 auto &dat_brother = data.dataOnEntities[type][brother_side];
1216 dat_brother.getBase() = dat.getBase();
1217 dat_brother.getSpace() = dat.getSpace();
1218 dat_brother.getOrder() = dat.getOrder();
1219 }
1220 }
1221 }
1223 };
1224
1225 for (auto &e : getDataFieldEnts()) {
1226 if (auto ent_data_ptr = e.lock()) {
1227 if (ent_data_ptr->getApproxBase() == AINSWORTH_BERNSTEIN_BEZIER_BASE) {
1228 auto space = ent_data_ptr->getSpace();
1229 for (EntityType t = MBVERTEX; t != MBPOLYHEDRON; ++t) {
1230 for (auto &dat : (*dataOnElement[space]).dataOnEntities[t]) {
1231 for (auto &ptr : dat.getBBAlphaIndicesByOrderArray())
1232 ptr.reset();
1233 for (auto &ptr : dat.getBBNByOrderArray())
1234 ptr.reset();
1235 for (auto &ptr : dat.getBBDiffNByOrderArray())
1236 ptr.reset();
1237 }
1238 }
1239 }
1240 }
1241 }
1242
1243 auto check_space = [&](const auto space) {
1244 switch (space) {
1245 case H1:
1246 for (auto t = MBVERTEX; t <= ele_type; ++t) {
1247 if (dataOnElement[H1]->spacesOnEntities[t].test(H1))
1248 return true;
1249 }
1250 return false;
1251 case HCURL:
1252 for (auto t = MBEDGE; t <= ele_type; ++t) {
1253 if (dataOnElement[HCURL]->spacesOnEntities[t].test(HCURL))
1254 return true;
1255 }
1256 return false;
1257 case HDIV:
1258 for (auto t = MBTRI; t <= ele_type; ++t) {
1259 if (dataOnElement[HDIV]->spacesOnEntities[t].test(HDIV))
1260 return true;
1261 }
1262 return false;
1263 case L2:
1264 return dataOnElement[L2]->spacesOnEntities[ele_type].test(L2);
1265 break;
1266 default:
1267 THROW_MESSAGE("Not implemented");
1268 }
1269 };
1270
1271 std::set<string> fields_list;
1272 for (auto &e : getDataFieldEnts()) {
1273 if (auto ent_data_ptr = e.lock()) {
1274 if (ent_data_ptr->getApproxBase() == AINSWORTH_BERNSTEIN_BEZIER_BASE) {
1275 auto field_name = ent_data_ptr->getName();
1276 if (fields_list.find(field_name) == fields_list.end()) {
1277 auto field_ptr = ent_data_ptr->getFieldRawPtr();
1278 auto space = ent_data_ptr->getSpace();
1279 CHKERR get_nodal_base_data(*dataOnElement[space], field_ptr);
1280 CHKERR get_entity_base_data(*dataOnElement[space], field_ptr, MBEDGE,
1281 ele_type);
1282 if (check_space(space)) {
1283 CHKERR getElementPolynomialBase()->getValue(
1284 gaussPts, boost::make_shared<EntPolynomialBaseCtx>(
1285 *dataOnElement[space], field_name,
1286 static_cast<FieldSpace>(space),
1288 fields_list.insert(field_name);
1289 }
1290 }
1291 }
1292 }
1293 }
1294
1296};
@ NOBASE
Definition: definitions.h:59
@ AINSWORTH_BERNSTEIN_BEZIER_BASE
Definition: definitions.h:64
FieldSpace
approximation spaces
Definition: definitions.h:82
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:346
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:416
#define CHKERR
Inline error check.
Definition: definitions.h:535
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
Definition: definitions.h:561
BlockParamData * cache
static auto cmp_uid_lo(const boost::weak_ptr< FieldEntity > &a, const UId &b)
EntityHandle get_id_for_max_type()
static auto cmp_uid_hi(const UId &b, const boost::weak_ptr< FieldEntity > &a)
EntityHandle get_id_for_min_type()
constexpr double t
plate stiffness
Definition: plate.cpp:59
constexpr auto field_name
const FieldEntity_vector_view & getDataFieldEnts() const
auto getNumberOfNodes() const
boost::shared_ptr< const NumeredEntFiniteElement > numeredEntFiniteElementPtr
UId getLocalUniqueIdCalculate()
Get the Local Unique Id Calculate object.
auto & getElementPolynomialBase()
Get the Entity Polynomial Base object.
MatrixDouble gaussPts
Matrix of integration points.

◆ calHierarchicalBaseFunctionsOnElement() [1/2]

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::calHierarchicalBaseFunctionsOnElement ( )
protected

Calculate base functions.

Returns
Error code

Use the some node base. Node base is usually used for construction other bases.

Definition at line 1078 of file ForcesAndSourcesCore.cpp.

1078 {
1080 /// Use the some node base. Node base is usually used for construction other
1081 /// bases.
1082 for (int space = HCURL; space != LASTSPACE; ++space) {
1083 dataOnElement[space]->dataOnEntities[MBVERTEX][0].getNSharedPtr(NOBASE) =
1084 dataOnElement[H1]->dataOnEntities[MBVERTEX][0].getNSharedPtr(NOBASE);
1085 dataOnElement[space]->dataOnEntities[MBVERTEX][0].getDiffNSharedPtr(
1086 NOBASE) =
1087 dataOnElement[H1]->dataOnEntities[MBVERTEX][0].getDiffNSharedPtr(
1088 NOBASE);
1089 }
1090 for (int b = AINSWORTH_LEGENDRE_BASE; b != LASTBASE; b++) {
1092 static_cast<FieldApproximationBase>(b));
1093 }
1095}
FieldApproximationBase
approximation base
Definition: definitions.h:58
@ LASTBASE
Definition: definitions.h:69
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
Definition: definitions.h:60
@ LASTSPACE
FieldSpace in [ 0, LASTSPACE )
Definition: definitions.h:89
MoFEMErrorCode calHierarchicalBaseFunctionsOnElement()
Calculate base functions.

◆ calHierarchicalBaseFunctionsOnElement() [2/2]

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::calHierarchicalBaseFunctionsOnElement ( const FieldApproximationBase  b)
protected

Calculate base functions.

Returns
Error code

Definition at line 1024 of file ForcesAndSourcesCore.cpp.

1025 {
1027 if (dataOnElement[H1]->bAse.test(b)) {
1028 switch (static_cast<FieldApproximationBase>(b)) {
1029 case NOBASE:
1030 break;
1032 // BERNSTEIN_BEZIER_BASE is not hierarchical base
1033 break;
1038 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1039 "Functions genrating approximation base not defined");
1040
1041 for (int space = H1; space != LASTSPACE; ++space) {
1042 if (dataOnElement[H1]->sPace.test(space) &&
1043 dataOnElement[H1]->bAse.test(b) &&
1044 dataOnElement[H1]->basesOnSpaces[space].test(b)) {
1045 CHKERR getElementPolynomialBase()->getValue(
1046 gaussPts,
1047 boost::make_shared<EntPolynomialBaseCtx>(
1048 *dataOnElement[space], static_cast<FieldSpace>(space),
1049 static_cast<FieldApproximationBase>(b), NOBASE));
1050 }
1051 }
1052 break;
1053 case USER_BASE:
1054 if (!getUserPolynomialBase())
1055 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1056 "Functions generating user approximation base not defined");
1057
1058 for (int space = H1; space != LASTSPACE; ++space)
1059 if (dataOnElement[H1]->sPace.test(space) &&
1060 dataOnElement[H1]->bAse.test(b) &&
1061 dataOnElement[H1]->basesOnSpaces[space].test(b)) {
1062 CHKERR getUserPolynomialBase()->getValue(
1063 gaussPts,
1064 boost::make_shared<EntPolynomialBaseCtx>(
1065 *dataOnElement[space], static_cast<FieldSpace>(space),
1066 static_cast<FieldApproximationBase>(b), NOBASE));
1067 }
1068 break;
1069 default:
1071 "Base <%s> not yet implemented",
1073 }
1074 }
1076}
@ AINSWORTH_LOBATTO_BASE
Definition: definitions.h:62
@ USER_BASE
user implemented approximation base
Definition: definitions.h:68
@ DEMKOWICZ_JACOBI_BASE
Definition: definitions.h:66
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
static const char *const ApproximationBaseNames[]
Definition: definitions.h:72
virtual MPI_Comm & get_comm() const =0
auto & getUserPolynomialBase()
Get the User Polynomial Base object.

◆ createDataOnElement()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::createDataOnElement ( EntityType  type)
protected

Create a entity data on element object.

Returns
MoFEMErrorCode

Definition at line 1298 of file ForcesAndSourcesCore.cpp.

1298 {
1300
1301 // Data on elements for proper spaces
1302 for (int space = H1; space != LASTSPACE; ++space) {
1303 dataOnElement[space]->setElementType(type);
1304 derivedDataOnElement[space]->setElementType(type);
1305 }
1306
1308}

◆ getBitRefLevelOnData()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getBitRefLevelOnData ( )
protected

Get bit ref level in entities, and set it to data

Definition at line 596 of file ForcesAndSourcesCore.cpp.

596 {
598
599 // for (int s = H1; s != LASTSPACE; ++s) {
600 // dataOnElement[s]->dataOnEntities[MBENTITYSET].resize(0);
601 // }
602
603 for (auto &data : dataOnElement) {
604 if (data) {
605 for (auto &dat : data->dataOnEntities) {
606 for (auto &ent_dat : dat) {
607 ent_dat.getEntDataBitRefLevel().reset();
608 }
609 }
610 }
611 }
612
613 auto &field_ents = getDataFieldEnts();
614 for (auto it : field_ents) {
615 if (auto e = it.lock()) {
616 const FieldSpace space = e->getSpace();
617 if (space > NOFIELD) {
618 const EntityType type = e->getEntType();
619 const signed char side =
620 type == MBVERTEX ? 0 : e->getSideNumberPtr()->side_number;
621 if (side >= 0) {
622 if (auto &data = dataOnElement[space]) {
623 auto &dat = data->dataOnEntities[type][side];
624 dat.getEntDataBitRefLevel() |= e->getBitRefLevel();
625 }
626 }
627 } else {
628 if (auto &data = dataOnElement[NOFIELD]) {
629 auto &dat = data->dataOnEntities[MBENTITYSET][0];
630 dat.getEntDataBitRefLevel() |= e->getBitRefLevel();
631 }
632 }
633 }
634 }
635
637};

◆ getColNodesIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getColNodesIndices ( EntitiesFieldData data,
const int  bit_number 
) const
protected

get col node indices from FENumeredDofEntity_multiIndex

Definition at line 328 of file ForcesAndSourcesCore.cpp.

329 {
330
331 struct Extractor {
332 boost::weak_ptr<EntityCacheNumeredDofs>
333 operator()(boost::shared_ptr<FieldEntity> &e) {
334 return e->entityCacheColDofs;
335 }
336 };
337
338 return getNodesIndices(bit_number, getColFieldEnts(),
339 data.dataOnEntities[MBVERTEX][0].getIndices(),
340 data.dataOnEntities[MBVERTEX][0].getLocalIndices(),
341 Extractor());
342}
auto & getColFieldEnts() const
MoFEMErrorCode getNodesIndices(const int bit_number, FieldEntity_vector_view &ents_field, VectorInt &nodes_indices, VectorInt &local_nodes_indices, EXTRACTOR &&extractor) const
get node indices

◆ getDataOnElementBySpaceArray()

auto & MoFEM::ForcesAndSourcesCore::getDataOnElementBySpaceArray ( )
inline

Get data on entities and space.

Entities data are stored by space, by entity type, and entity side.

Returns
std::array<boost::shared_ptr<EntitiesFieldData>, LASTSPACE>

Definition at line 156 of file ForcesAndSourcesCore.hpp.

156{ return dataOnElement; }

◆ getDerivedDataOnElementBySpaceArray()

auto & MoFEM::ForcesAndSourcesCore::getDerivedDataOnElementBySpaceArray ( )
inline

Get derived data on entities and space.

Entities data are stored by space, by entity type, and entity side. Derived data is used to store data on columns, so it shares infromatin about shape functions wih rows.

Returns
std::array<boost::shared_ptr<EntitiesFieldData>, LASTSPACE>

Definition at line 167 of file ForcesAndSourcesCore.hpp.

167{ return derivedDataOnElement; }

◆ getElementPolynomialBase()

auto & MoFEM::ForcesAndSourcesCore::getElementPolynomialBase ( )
inline

Get the Entity Polynomial Base object.

Returns
boost::shared_ptr<BaseFunction>&&

Definition at line 90 of file ForcesAndSourcesCore.hpp.

boost::shared_ptr< BaseFunction > elementPolynomialBasePtr
Pointer to entity polynomial base.

◆ getEntData()

auto & MoFEM::ForcesAndSourcesCore::getEntData ( const FieldSpace  space,
const EntityType  type,
const int  side 
)
inline

Get the entity data.

Parameters
space
type
side
Returns
EntitiesFieldData::EntData&

Definition at line 144 of file ForcesAndSourcesCore.hpp.

145 {
146 return dataOnElement[space]->dataOnEntities[type][side];
147 }

◆ getEntityColIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getEntityColIndices ( EntitiesFieldData data,
const int  bit_number,
const EntityType  type_lo = MBVERTEX,
const EntityType  type_hi = MBPOLYHEDRON 
) const
protected

Definition at line 427 of file ForcesAndSourcesCore.cpp.

429 {
430
431 struct Extractor {
432 boost::weak_ptr<EntityCacheNumeredDofs>
433 operator()(boost::shared_ptr<FieldEntity> &e) {
434 return e->entityCacheColDofs;
435 }
436 };
437
438 return getEntityIndices(data, bit_number, getColFieldEnts(), type_lo, type_hi,
439 Extractor());
440}
MoFEMErrorCode getEntityIndices(EntitiesFieldData &data, const int bit_number, FieldEntity_vector_view &ents_field, const EntityType type_lo, const EntityType type_hi, EXTRACTOR &&extractor) const

◆ getEntityDataOrder() [1/2]

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getEntityDataOrder ( const EntityType  type,
const FieldSpace  space,
boost::ptr_vector< EntitiesFieldData::EntData > &  data 
) const
protected

Get the entity data order.

Parameters
type
space
data
Returns
MoFEMErrorCode

Definition at line 141 of file ForcesAndSourcesCore.cpp.

143 {
145
146 auto set_order = [&]() {
148 auto &side_table = numeredEntFiniteElementPtr->getSideNumberTable();
149
150 for (unsigned int s = 0; s != data.size(); ++s)
151 data[s].getOrder() = 0;
152
153 const FieldEntity_vector_view &data_field_ent = getDataFieldEnts();
154
155 for (auto r = fieldsPtr->get<BitFieldId_space_mi_tag>().equal_range(space);
156 r.first != r.second; ++r.first) {
157
158 const auto field_bit_number = (*r.first)->getBitNumber();
159 const auto lo_uid = FieldEntity::getLocalUniqueIdCalculate(
160 field_bit_number, get_id_for_min_type(type));
161 auto lo = std::lower_bound(data_field_ent.begin(), data_field_ent.end(),
162 lo_uid, cmp_uid_lo);
163 if (lo != data_field_ent.end()) {
164 const auto hi_uid = FieldEntity::getLocalUniqueIdCalculate(
165 field_bit_number, get_id_for_max_type(type));
166 auto hi =
167 std::upper_bound(lo, data_field_ent.end(), hi_uid, cmp_uid_hi);
168 for (; lo != hi; ++lo) {
169
170 if (auto ptr = lo->lock()) {
171
172 auto &e = *ptr;
173 auto sit = side_table.find(e.getEnt());
174 if (sit != side_table.end()) {
175 auto &side = *sit;
176 if (const auto side_number = side->side_number; side_number >= 0) {
177 ApproximationOrder ent_order = e.getMaxOrder();
178 auto &dat = data[side_number];
179 dat.getOrder() =
180 dat.getOrder() > ent_order ? dat.getOrder() : ent_order;
181 }
182 } else
183 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
184 "Entity on side of the element not found");
185 }
186 }
187 }
188 }
189
191 };
192
193 auto set_order_on_brother = [&]() {
195 auto &side_table =
196 numeredEntFiniteElementPtr->getSideNumberTable().get<0>();
197 auto sit = side_table.lower_bound(get_id_for_min_type(type));
198 if (sit != side_table.end()) {
199 auto hi_sit = side_table.upper_bound(get_id_for_max_type(type));
200 for (; sit != hi_sit; ++sit) {
201 const int brother_side_number = (*sit)->brother_side_number;
202 if (brother_side_number != -1) {
203 const int side_number = (*sit)->side_number;
204 data[brother_side_number].getOrder() = data[side_number].getOrder();
205 }
206 }
207 }
209 };
210
211 CHKERR set_order();
212 CHKERR set_order_on_brother();
213
215}
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:447
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:440
int ApproximationOrder
Approximation on the entity.
Definition: Types.hpp:26
std::vector< boost::weak_ptr< FieldEntity > > FieldEntity_vector_view
const double r
rate factor
const Field_multiIndex * fieldsPtr
raw pointer to fields container

◆ getEntityDataOrder() [2/2]

template<EntityType type>
MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getEntityDataOrder ( EntitiesFieldData data,
const FieldSpace  space 
) const
inlineprotected

Get the entity data order for given space.

Template Parameters
type
Parameters
data
space
Returns
MoFEMErrorCode

Definition at line 213 of file ForcesAndSourcesCore.hpp.

214 {
215 return getEntityDataOrder(type, space, data.dataOnEntities[type]);
216 }
MoFEMErrorCode getEntityDataOrder(const EntityType type, const FieldSpace space, boost::ptr_vector< EntitiesFieldData::EntData > &data) const
Get the entity data order.

◆ getEntityFieldData()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getEntityFieldData ( EntitiesFieldData data,
const int  bit_number,
const EntityType  type_lo = MBVERTEX,
const EntityType  type_hi = MBPOLYHEDRON 
) const
protected

Definition at line 762 of file ForcesAndSourcesCore.cpp.

764 {
766 for (EntityType t = type_lo; t != type_hi; ++t) {
767 for (auto &dat : data.dataOnEntities[t]) {
768 dat.getOrder() = 0;
769 dat.getBase() = NOBASE;
770 dat.getSpace() = NOSPACE;
771 dat.getFieldData().resize(0, false);
772 dat.getFieldDofs().resize(0, false);
773 dat.getFieldEntities().resize(0, false);
774 }
775 }
776
777 auto &field_ents = getDataFieldEnts();
778 const auto lo_uid = FieldEntity::getLocalUniqueIdCalculate(
779 bit_number, get_id_for_min_type(type_lo));
780 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
781 cmp_uid_lo);
782 if (lo != field_ents.end()) {
783 const auto hi_uid = FieldEntity::getLocalUniqueIdCalculate(
784 bit_number, get_id_for_max_type(type_hi));
785 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid, cmp_uid_hi);
786 if (lo != hi) {
787
788 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
789
790 for (auto it = lo; it != hi; ++it)
791 if (auto e = it->lock()) {
792 auto side_ptr = e->getSideNumberPtr();
793 if (const auto side = side_ptr->side_number; side >= 0) {
794 const EntityType type = e->getEntType();
795 auto &dat = data.dataOnEntities[type][side];
796 auto &ent_field = dat.getFieldEntities();
797 auto &ent_field_dofs = dat.getFieldDofs();
798 auto &ent_field_data = dat.getFieldData();
799
800 const int brother_side = side_ptr->brother_side_number;
801 if (brother_side != -1)
802 brother_ents_vec.emplace_back(e);
803
804 dat.getBase() = e->getApproxBase();
805 dat.getSpace() = e->getSpace();
806 const int ent_order = e->getMaxOrder();
807 dat.getOrder() =
808 dat.getOrder() > ent_order ? dat.getOrder() : ent_order;
809
810 auto ent_data = e->getEntFieldData();
811 ent_field_data.resize(ent_data.size(), false);
812 noalias(ent_field_data) = ent_data;
813 ent_field_dofs.resize(ent_data.size(), false);
814 std::fill(ent_field_dofs.begin(), ent_field_dofs.end(), nullptr);
815 ent_field.resize(1, false);
816 ent_field[0] = e.get();
817 if (auto cache = e->entityCacheDataDofs.lock()) {
818 for (auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
819 ent_field_dofs[(*dit)->getEntDofIdx()] =
820 reinterpret_cast<FEDofEntity *>((*dit).get());
821 }
822 }
823 }
824 }
825
826 for (auto &it : brother_ents_vec) {
827 if (const auto e = it.lock()) {
828 const EntityType type = e->getEntType();
829 const int side = e->getSideNumberPtr()->side_number;
830 const int brother_side = e->getSideNumberPtr()->brother_side_number;
831 auto &dat = data.dataOnEntities[type][side];
832 auto &dat_brother = data.dataOnEntities[type][brother_side];
833 dat_brother.getBase() = dat.getBase();
834 dat_brother.getSpace() = dat.getSpace();
835 dat_brother.getOrder() = dat.getOrder();
836 dat_brother.getFieldData() = dat.getFieldData();
837 dat_brother.getFieldDofs() = dat.getFieldDofs();
838 dat_brother.getFieldEntities() = dat.getFieldEntities();
839 }
840 }
841 }
842 }
843
845}

◆ getEntityIndices()

template<typename EXTRACTOR >
MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getEntityIndices ( EntitiesFieldData data,
const int  bit_number,
FieldEntity_vector_view ents_field,
const EntityType  type_lo,
const EntityType  type_hi,
EXTRACTOR &&  extractor 
) const
protected

Definition at line 345 of file ForcesAndSourcesCore.cpp.

348 {
350
351 for (EntityType t = type_lo; t != type_hi; ++t) {
352 for (auto &dat : data.dataOnEntities[t]) {
353 dat.getIndices().resize(0, false);
354 dat.getLocalIndices().resize(0, false);
355 }
356 }
357
358 const auto lo_uid = FieldEntity::getLocalUniqueIdCalculate(
359 bit_number, get_id_for_min_type(type_lo));
360 auto lo = std::lower_bound(ents_field.begin(), ents_field.end(), lo_uid,
361 cmp_uid_lo);
362 if (lo != ents_field.end()) {
363 const auto hi_uid = FieldEntity::getLocalUniqueIdCalculate(
364 bit_number, get_id_for_max_type(type_hi));
365 auto hi = std::upper_bound(lo, ents_field.end(), hi_uid, cmp_uid_hi);
366 if (lo != hi) {
367
368 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
369
370 for (auto it = lo; it != hi; ++it)
371 if (auto e = it->lock()) {
372
373 const EntityType type = e->getEntType();
374 auto side_ptr = e->getSideNumberPtr();
375 if (const auto side = side_ptr->side_number; side >= 0) {
376 const auto nb_dofs_on_ent = e->getNbDofsOnEnt();
377 const auto brother_side = side_ptr->brother_side_number;
378 auto &dat = data.dataOnEntities[type][side];
379 auto &ent_field_indices = dat.getIndices();
380 auto &ent_field_local_indices = dat.getLocalIndices();
381
382 ent_field_indices.resize(nb_dofs_on_ent, false);
383 ent_field_local_indices.resize(nb_dofs_on_ent, false);
384 std::fill(ent_field_indices.data().begin(),
385 ent_field_indices.data().end(), -1);
386 std::fill(ent_field_local_indices.data().begin(),
387 ent_field_local_indices.data().end(), -1);
388
389 if (auto cache = extractor(e).lock()) {
390 for (auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
391 const int idx = (*dit)->getEntDofIdx();
392 ent_field_indices[idx] = (*dit)->getPetscGlobalDofIdx();
393 ent_field_local_indices[idx] = (*dit)->getPetscLocalDofIdx();
394 }
395 }
396
397 if (brother_side != -1) {
398 auto &dat_brother = data.dataOnEntities[type][brother_side];
399 dat_brother.getIndices().resize(nb_dofs_on_ent, false);
400 dat_brother.getLocalIndices().resize(nb_dofs_on_ent, false);
401 noalias(dat_brother.getIndices()) = dat.getIndices();
402 noalias(dat_brother.getLocalIndices()) = dat.getLocalIndices();
403 }
404 }
405 }
406 }
407 }
408
410}

◆ getEntityRowIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getEntityRowIndices ( EntitiesFieldData data,
const int  bit_number,
const EntityType  type_lo = MBVERTEX,
const EntityType  type_hi = MBPOLYHEDRON 
) const
protected

Definition at line 412 of file ForcesAndSourcesCore.cpp.

414 {
415
416 struct Extractor {
417 boost::weak_ptr<EntityCacheNumeredDofs>
418 operator()(boost::shared_ptr<FieldEntity> &e) {
419 return e->entityCacheRowDofs;
420 }
421 };
422
423 return getEntityIndices(data, bit_number, getRowFieldEnts(), type_lo, type_hi,
424 Extractor());
425}
auto & getRowFieldEnts() const

◆ getEntitySense() [1/2]

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getEntitySense ( const EntityType  type,
boost::ptr_vector< EntitiesFieldData::EntData > &  data 
) const
protected

get sense (orientation) of entity

Parameters
typetype of entity
dataentity data
Returns
error code

Definition at line 86 of file ForcesAndSourcesCore.cpp.

88 {
90
91 auto &side_table = numeredEntFiniteElementPtr->getSideNumberTable().get<0>();
92 auto sit = side_table.lower_bound(get_id_for_min_type(type));
93 if (sit != side_table.end()) {
94 auto hi_sit = side_table.upper_bound(get_id_for_max_type(type));
95 for (; sit != hi_sit; ++sit) {
96 if (const auto side_number = (*sit)->side_number; side_number >= 0) {
97 const int brother_side_number = (*sit)->brother_side_number;
98 const int sense = (*sit)->sense;
99
100 data[side_number].getSense() = sense;
101 if (brother_side_number != -1)
102 data[brother_side_number].getSense() = sense;
103 }
104 }
105 }
107}

◆ getEntitySense() [2/2]

template<EntityType type>
MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getEntitySense ( EntitiesFieldData data) const
inlineprotected

Get the entity sense (orientation)

Template Parameters
type
Parameters
data
Returns
MoFEMErrorCode

Definition at line 200 of file ForcesAndSourcesCore.hpp.

200 {
201 return getEntitySense(type, data.dataOnEntities[type]);
202 }
MoFEMErrorCode getEntitySense(const EntityType type, boost::ptr_vector< EntitiesFieldData::EntData > &data) const
get sense (orientation) of entity

◆ getFaceNodes()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getFaceNodes ( EntitiesFieldData data) const
protected

Get nodes on faces.

Definition at line 913 of file ForcesAndSourcesCore.cpp.

913 {
915 auto &face_nodes = data.facesNodes;
916 auto &face_nodes_order = data.facesNodesOrder;
917 auto &side_table = const_cast<SideNumber_multiIndex &>(
918 numeredEntFiniteElementPtr->getSideNumberTable());
919 const auto ent = numeredEntFiniteElementPtr->getEnt();
920 const auto type = numeredEntFiniteElementPtr->getEntType();
921 const auto nb_faces = CN::NumSubEntities(type, 2);
922 const EntityHandle *conn_ele;
923 int num_nodes_ele;
924 CHKERR mField.get_moab().get_connectivity(ent, conn_ele, num_nodes_ele, true);
925 auto side_ptr_it = side_table.get<1>().lower_bound(
926 boost::make_tuple(CN::TypeDimensionMap[2].first, 0));
927 auto hi_side_ptr_it = side_table.get<1>().upper_bound(
928 boost::make_tuple(CN::TypeDimensionMap[2].second, 100));
929
930 for (; side_ptr_it != hi_side_ptr_it; ++side_ptr_it) {
931 const auto side = (*side_ptr_it)->side_number;
932 const auto sense = (*side_ptr_it)->sense;
933 const auto offset = (*side_ptr_it)->offset;
934 const auto face_ent = (*side_ptr_it)->ent;
935
936 EntityType face_type;
937 int nb_nodes_face;
938 auto face_indices =
939 CN::SubEntityVertexIndices(type, 2, side, face_type, nb_nodes_face);
940 face_nodes.resize(nb_faces, nb_nodes_face);
941 face_nodes_order.resize(nb_faces, nb_nodes_face);
942
943 if (sense == 1)
944 for (int n = 0; n != nb_nodes_face; ++n)
945 face_nodes_order(side, n) = (n + offset) % nb_nodes_face;
946 else
947 for (int n = 0; n != nb_nodes_face; ++n)
948 face_nodes_order(side, n) =
949 (nb_nodes_face - (n - offset) % nb_nodes_face) % nb_nodes_face;
950
951 for (int n = 0; n != nb_nodes_face; ++n)
952 face_nodes(side, n) = face_indices[face_nodes_order(side, n)];
953
954#ifndef NDEBUG
955 auto check = [&]() {
957 const EntityHandle *conn_face;
958 // int nb_nodes_face;
959 CHKERR mField.get_moab().get_connectivity(face_ent, conn_face,
960 nb_nodes_face, true);
961 face_nodes.resize(nb_faces, nb_nodes_face);
962 for (int nn = 0; nn != nb_nodes_face; ++nn) {
963 if (face_nodes(side, nn) !=
964 std::distance(
965 conn_ele,
966 std::find(conn_ele, &conn_ele[num_nodes_ele], conn_face[nn]))) {
967 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
968 "Wrong face numeration");
969 }
970 }
972 };
973 CHKERR check();
974#endif
975 }
976
978}
FTensor::Index< 'n', SPACE_DIM > n
multi_index_container< boost::shared_ptr< SideNumber >, indexed_by< ordered_unique< member< SideNumber, EntityHandle, &SideNumber::ent > >, ordered_non_unique< composite_key< SideNumber, const_mem_fun< SideNumber, EntityType, &SideNumber::getEntType >, member< SideNumber, signed char, &SideNumber::side_number > > > > > SideNumber_multiIndex
SideNumber_multiIndex for SideNumber.
virtual moab::Interface & get_moab()=0

◆ getMaxColOrder()

int MoFEM::ForcesAndSourcesCore::getMaxColOrder ( ) const

Get max order of approximation for field in columns.

Definition at line 137 of file ForcesAndSourcesCore.cpp.

137 {
139}
static int getMaxOrder(const ENTMULTIINDEX &multi_index)

◆ getMaxDataOrder()

int MoFEM::ForcesAndSourcesCore::getMaxDataOrder ( ) const

Get max order of approximation for data fields.

getMeasure getMaxDataOrder () return maximal order on entities, for all data on the element. So for example if finite element is triangle, and triangle base function have order 4 and on edges base function have order 2, this function return 4.

If finite element has for example 2 or more approximated fields, for example Pressure (order 3) and displacement field (order 5), this function returns 5.

Definition at line 122 of file ForcesAndSourcesCore.cpp.

122 {
123 int max_order = 0;
124 for (auto e : getDataFieldEnts()) {
125 if (auto ptr = e.lock()) {
126 const int order = ptr->getMaxOrder();
127 max_order = (max_order < order) ? order : max_order;
128 }
129 }
130 return max_order;
131}

◆ getMaxRowOrder()

int MoFEM::ForcesAndSourcesCore::getMaxRowOrder ( ) const

Get max order of approximation for field in rows.

Definition at line 133 of file ForcesAndSourcesCore.cpp.

133 {
135}

◆ getNodesFieldData()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getNodesFieldData ( EntitiesFieldData data,
const int  bit_number 
) const
protected

Get data on nodes.

Parameters
dataData structure
field_nameField name
Returns
Error code

Definition at line 640 of file ForcesAndSourcesCore.cpp.

641 {
642
643 auto get_nodes_field_data = [&](VectorDouble &nodes_data,
644 VectorFieldEntities &field_entities,
645 VectorDofs &nodes_dofs, FieldSpace &space,
647 VectorInt &bb_node_order) {
649
650 nodes_data.resize(0, false);
651 nodes_dofs.resize(0, false);
652 field_entities.resize(0, false);
653
654 auto field_it =
655 fieldsPtr->get<BitFieldId_mi_tag>().find(BitFEId().set(bit_number - 1));
656 if (field_it != fieldsPtr->get<BitFieldId_mi_tag>().end()) {
657
658#ifndef NDEBUG
659 if ((*field_it)->getBitNumber() != bit_number)
660 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "Wrong bit number");
661#endif
662 const int nb_dofs_on_vert = (*field_it)->getNbOfCoeffs();
663 space = (*field_it)->getSpace();
664 base = (*field_it)->getApproxBase();
665
666 auto &field_ents = getDataFieldEnts();
667 const auto lo_uid = FieldEntity::getLocalUniqueIdCalculate(
668 bit_number, get_id_for_min_type<MBVERTEX>());
669 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
670 cmp_uid_lo);
671 if (lo != field_ents.end()) {
672 const auto hi_uid = FieldEntity::getLocalUniqueIdCalculate(
673 bit_number, get_id_for_max_type<MBVERTEX>());
674 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid, cmp_uid_hi);
675 if (lo != hi) {
676
677 int nb_dofs = 0;
678 for (auto it = lo; it != hi; ++it) {
679 if (auto e = it->lock()) {
680 nb_dofs += e->getNbDofsOnEnt();
681 }
682 }
683
684 if (nb_dofs) {
685
686 const int num_nodes = getNumberOfNodes();
687 bb_node_order.resize(num_nodes, false);
688 bb_node_order.clear();
689 const int max_nb_dofs = nb_dofs_on_vert * num_nodes;
690 nodes_data.resize(max_nb_dofs, false);
691 nodes_dofs.resize(max_nb_dofs, false);
692 field_entities.resize(num_nodes, false);
693 std::fill(nodes_data.begin(), nodes_data.end(), 0);
694 std::fill(nodes_dofs.begin(), nodes_dofs.end(), nullptr);
695 std::fill(field_entities.begin(), field_entities.end(), nullptr);
696
697 std::vector<boost::weak_ptr<FieldEntity>> brother_ents_vec;
698
699 for (auto it = lo; it != hi; ++it) {
700 if (auto e = it->lock()) {
701 const auto &sn = e->getSideNumberPtr();
702 // Some field entities on skeleton can have negative side
703 // number
704 if (const auto side_number = sn->side_number; side_number >= 0) {
705 const int brother_side_number = sn->brother_side_number;
706
707 field_entities[side_number] = e.get();
708 if (brother_side_number != -1) {
709 brother_ents_vec.emplace_back(e);
710 field_entities[side_number] = field_entities[side_number];
711 }
712
713 bb_node_order[side_number] = e->getMaxOrder();
714 int pos = side_number * nb_dofs_on_vert;
715 auto ent_filed_data_vec = e->getEntFieldData();
716 if (auto cache = e->entityCacheDataDofs.lock()) {
717 for (auto dit = cache->loHi[0]; dit != cache->loHi[1];
718 ++dit) {
719 const auto dof_idx = (*dit)->getEntDofIdx();
720 nodes_data[pos + dof_idx] = ent_filed_data_vec[dof_idx];
721 nodes_dofs[pos + dof_idx] =
722 reinterpret_cast<FEDofEntity *>((*dit).get());
723 }
724 }
725 }
726 }
727 }
728
729 for (auto &it : brother_ents_vec) {
730 if (const auto e = it.lock()) {
731 const auto &sn = e->getSideNumberPtr();
732 const int side_number = sn->side_number;
733 const int brother_side_number = sn->brother_side_number;
734 bb_node_order[brother_side_number] = bb_node_order[side_number];
735 int pos = side_number * nb_dofs_on_vert;
736 int brother_pos = brother_side_number * nb_dofs_on_vert;
737 for (int ii = 0; ii != nb_dofs_on_vert; ++ii) {
738 nodes_data[brother_pos] = nodes_data[pos];
739 nodes_dofs[brother_pos] = nodes_dofs[pos];
740 ++pos;
741 ++brother_pos;
742 }
743 }
744 }
745 }
746 }
747 }
748 }
749
751 };
752
753 return get_nodes_field_data(
754 data.dataOnEntities[MBVERTEX][0].getFieldData(),
755 data.dataOnEntities[MBVERTEX][0].getFieldEntities(),
756 data.dataOnEntities[MBVERTEX][0].getFieldDofs(),
757 data.dataOnEntities[MBVERTEX][0].getSpace(),
758 data.dataOnEntities[MBVERTEX][0].getBase(),
759 data.dataOnEntities[MBVERTEX][0].getBBNodeOrder());
760}
std::bitset< BITFEID_SIZE > BitFEId
Finite element Id.
Definition: Types.hpp:43
UBlasVector< double > VectorDouble
Definition: Types.hpp:68
UBlasVector< int > VectorInt
Definition: Types.hpp:67
ublas::vector< FieldEntity *, FieldEntAllocator > VectorFieldEntities
Field_multiIndex::index< FieldName_mi_tag >::type::iterator field_it
ublas::vector< FEDofEntity *, DofsAllocator > VectorDofs

◆ getNodesIndices()

template<typename EXTRACTOR >
MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getNodesIndices ( const int  bit_number,
FieldEntity_vector_view ents_field,
VectorInt nodes_indices,
VectorInt local_nodes_indices,
EXTRACTOR &&  extractor 
) const
protected

get node indices

Definition at line 220 of file ForcesAndSourcesCore.cpp.

223 {
225
226 auto field_it = fieldsPtr->get<BitFieldId_mi_tag>().find(
227 BitFieldId().set(bit_number - 1));
228 if (field_it != fieldsPtr->get<BitFieldId_mi_tag>().end()) {
229
230#ifndef NDEBUG
231 if ((*field_it)->getBitNumber() != bit_number)
232 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "Wrong bit number");
233#endif
234 const auto lo_uid = FieldEntity::getLocalUniqueIdCalculate(
235 bit_number, get_id_for_min_type<MBVERTEX>());
236 auto lo = std::lower_bound(ents_field.begin(), ents_field.end(), lo_uid,
237 cmp_uid_lo);
238 if (lo != ents_field.end()) {
239 const auto hi_uid = FieldEntity::getLocalUniqueIdCalculate(
240 bit_number, get_id_for_max_type<MBVERTEX>());
241 auto hi = std::upper_bound(lo, ents_field.end(), hi_uid, cmp_uid_hi);
242
243 const int num_nodes = getNumberOfNodes();
244 const int nb_dofs_on_vert = (*field_it)->getNbOfCoeffs();
245 const int max_nb_dofs = nb_dofs_on_vert * num_nodes;
246
247 int nb_dofs = 0;
248 for (auto it = lo; it != hi; ++it) {
249 if (auto e = it->lock()) {
250 if (auto cache = extractor(e).lock()) {
251 if (cache->loHi[0] != cache->loHi[1]) {
252 nb_dofs += std::distance(cache->loHi[0], cache->loHi[1]);
253 break;
254 }
255 }
256 }
257 }
258
259 if (nb_dofs) {
260 nodes_indices.resize(max_nb_dofs, false);
261 local_nodes_indices.resize(max_nb_dofs, false);
262 } else {
263 nodes_indices.resize(0, false);
264 local_nodes_indices.resize(0, false);
265 }
266
267 if (nb_dofs != max_nb_dofs) {
268 std::fill(nodes_indices.begin(), nodes_indices.end(), -1);
269 std::fill(local_nodes_indices.begin(), local_nodes_indices.end(), -1);
270 }
271
272 for (auto it = lo; it != hi; ++it) {
273 if (auto e = it->lock()) {
274 auto side_ptr = e->getSideNumberPtr();
275 if (const auto side_number = side_ptr->side_number; side_number >= 0) {
276 const auto brother_side_number = side_ptr->brother_side_number;
277 if (auto cache = extractor(e).lock()) {
278 for (auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
279 auto &dof = **dit;
280 const int idx = dof.getPetscGlobalDofIdx();
281 const int local_idx = dof.getPetscLocalDofIdx();
282 const int pos =
283 side_number * nb_dofs_on_vert + dof.getDofCoeffIdx();
284 nodes_indices[pos] = idx;
285 local_nodes_indices[pos] = local_idx;
286 if (brother_side_number != -1) {
287 const int elem_idx = brother_side_number * nb_dofs_on_vert +
288 (*dit)->getDofCoeffIdx();
289 nodes_indices[elem_idx] = idx;
290 local_nodes_indices[elem_idx] = local_idx;
291 }
292 }
293 }
294 }
295 }
296 }
297 } else {
298 nodes_indices.resize(0, false);
299 local_nodes_indices.resize(0, false);
300 }
301
302 } else {
303 nodes_indices.resize(0, false);
304 local_nodes_indices.resize(0, false);
305 }
306
308}
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
Definition: Types.hpp:42

◆ getNoFieldColIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getNoFieldColIndices ( EntitiesFieldData data,
const int  bit_number 
) const
protected

get col NoField indices

Definition at line 474 of file ForcesAndSourcesCore.cpp.

475 {
477#ifndef NDEBUG
478 if (data.dataOnEntities[MBENTITYSET].size() == 0) {
479 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
480 "data.dataOnEntities[MBENTITYSET] is empty");
481 }
482#endif
484 data.dataOnEntities[MBENTITYSET][0].getIndices());
486}
auto getColDofsPtr() const
MoFEMErrorCode getNoFieldIndices(const int bit_number, boost::shared_ptr< FENumeredDofEntity_multiIndex > dofs, VectorInt &nodes_indices) const
get NoField indices

◆ getNoFieldFieldData() [1/2]

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getNoFieldFieldData ( const int  bit_number,
VectorDouble ent_field_data,
VectorDofs ent_field_dofs,
VectorFieldEntities ent_field 
) const
protected

Get field data on nodes.

Definition at line 847 of file ForcesAndSourcesCore.cpp.

849 {
850
852
853 ent_field_data.resize(0, false);
854 ent_field_dofs.resize(0, false);
855 ent_field.resize(0, false);
856
857 auto &field_ents = getDataFieldEnts();
858 const auto lo_uid = FieldEntity::getLocalUniqueIdCalculate(
859 bit_number, get_id_for_min_type<MBVERTEX>());
860 auto lo = std::lower_bound(field_ents.begin(), field_ents.end(), lo_uid,
861 cmp_uid_lo);
862 if (lo != field_ents.end()) {
863
864 ent_field.resize(field_ents.size(), false);
865 std::fill(ent_field.begin(), ent_field.end(), nullptr);
866
867 const auto hi_uid = FieldEntity::getLocalUniqueIdCalculate(
868 bit_number, get_id_for_max_type<MBENTITYSET>());
869 auto hi = std::upper_bound(lo, field_ents.end(), hi_uid, cmp_uid_hi);
870 if (lo != hi) {
871
872 int side = 0;
873 for (auto it = lo; it != hi; ++it, ++side)
874 if (auto e = it->lock()) {
875
876 const auto size = e->getNbDofsOnEnt();
877 ent_field_data.resize(size, false);
878 ent_field_dofs.resize(size, false);
879 ent_field[side] = e.get();
880 noalias(ent_field_data) = e->getEntFieldData();
881
882 if (auto cache = e->entityCacheDataDofs.lock()) {
883 for (auto dit = cache->loHi[0]; dit != cache->loHi[1]; ++dit) {
884 ent_field_dofs[(*dit)->getEntDofIdx()] =
885 reinterpret_cast<FEDofEntity *>((*dit).get());
886 }
887 }
888 }
889 }
890 }
891
893}

◆ getNoFieldFieldData() [2/2]

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getNoFieldFieldData ( EntitiesFieldData data,
const int  bit_number 
) const
protected

Definition at line 896 of file ForcesAndSourcesCore.cpp.

897 {
899 if (data.dataOnEntities[MBENTITYSET].size() == 0)
900 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
901 "No space to insert data");
902
904 bit_number, data.dataOnEntities[MBENTITYSET][0].getFieldData(),
905 data.dataOnEntities[MBENTITYSET][0].getFieldDofs(),
906 data.dataOnEntities[MBENTITYSET][0].getFieldEntities());
908}
MoFEMErrorCode getNoFieldFieldData(const int bit_number, VectorDouble &ent_field_data, VectorDofs &ent_field_dofs, VectorFieldEntities &ent_field) const
Get field data on nodes.

◆ getNoFieldIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getNoFieldIndices ( const int  bit_number,
boost::shared_ptr< FENumeredDofEntity_multiIndex dofs,
VectorInt nodes_indices 
) const
protected

get NoField indices

Definition at line 442 of file ForcesAndSourcesCore.cpp.

444 {
446 auto dit = dofs->get<Unique_mi_tag>().lower_bound(
448 auto hi_dit = dofs->get<Unique_mi_tag>().upper_bound(
450 indices.resize(std::distance(dit, hi_dit));
451 for (; dit != hi_dit; dit++) {
452 int idx = (*dit)->getPetscGlobalDofIdx();
453 indices[(*dit)->getDofCoeffIdx()] = idx;
454 }
456}
static UId getHiBitNumberUId(const FieldBitNumber bit_number)
static UId getLoBitNumberUId(const FieldBitNumber bit_number)

◆ getNoFieldRowIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getNoFieldRowIndices ( EntitiesFieldData data,
const int  bit_number 
) const
protected

get col NoField indices

Definition at line 459 of file ForcesAndSourcesCore.cpp.

460 {
462#ifndef NDEBUG
463 if (data.dataOnEntities[MBENTITYSET].size() == 0) {
464 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
465 "data.dataOnEntities[MBENTITYSET] is empty");
466 }
467#endif
469 data.dataOnEntities[MBENTITYSET][0].getIndices());
471}
auto getRowDofsPtr() const

◆ getOpPtrVector()

boost::ptr_vector< UserDataOperator > & MoFEM::ForcesAndSourcesCore::getOpPtrVector ( )
inline

Use to push back operator for row operator.

It can be used to calculate nodal forces or other quantities on the mesh.

Examples
MagneticElement.hpp, continuity_check_on_contact_prism_side_ele.cpp, continuity_check_on_skeleton_3d.cpp, continuity_check_on_skeleton_with_simple_2d_for_h1.cpp, continuity_check_on_skeleton_with_simple_2d_for_hcurl.cpp, continuity_check_on_skeleton_with_simple_2d_for_hdiv.cpp, forces_and_sources_testing_flat_prism_element.cpp, and lorentz_force.cpp.

Definition at line 83 of file ForcesAndSourcesCore.hpp.

83{ return opPtrVector; }
boost::ptr_vector< UserDataOperator > opPtrVector
Vector of finite element users data operators.

◆ getProblemNodesColIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getProblemNodesColIndices ( const std::string &  field_name,
VectorInt nodes_indices 
) const
protected

Definition at line 579 of file ForcesAndSourcesCore.cpp.

580 {
582 nodes_indices);
583}
const Problem * problemPtr
raw pointer to problem
MoFEMErrorCode getProblemNodesIndices(const std::string &field_name, const NumeredDofEntity_multiIndex &dofs, VectorInt &nodes_indices) const
get indices of nodal indices which are declared for problem but not this particular element
boost::shared_ptr< NumeredDofEntity_multiIndex > numeredColDofsPtr
store DOFs on columns for this problem

◆ getProblemNodesIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getProblemNodesIndices ( const std::string &  field_name,
const NumeredDofEntity_multiIndex dofs,
VectorInt nodes_indices 
) const
protected

get indices of nodal indices which are declared for problem but not this particular element

Definition at line 490 of file ForcesAndSourcesCore.cpp.

492 {
494
495 const Field *field_struture = mField.get_field_structure(field_name);
496 if (field_struture->getSpace() == H1) {
497
498 const int num_nodes = getNumberOfNodes();
499 nodes_indices.resize(field_struture->getNbOfCoeffs() * num_nodes, false);
500 std::fill(nodes_indices.begin(), nodes_indices.end(), -1);
501
502 auto &side_table = const_cast<SideNumber_multiIndex &>(
503 numeredEntFiniteElementPtr->getSideNumberTable());
504 auto siit = side_table.get<1>().lower_bound(boost::make_tuple(MBVERTEX, 0));
505 auto hi_siit =
506 side_table.get<1>().lower_bound(boost::make_tuple(MBVERTEX, 10000));
507
508 int nn = 0;
509 for (; siit != hi_siit; siit++, nn++) {
510 if (siit->get()->side_number >= 0) {
511 auto bit_number = mField.get_field_bit_number(field_name);
512 const EntityHandle ent = siit->get()->ent;
513 auto dit = dofs.get<Unique_mi_tag>().lower_bound(
515 auto hi_dit = dofs.get<Unique_mi_tag>().upper_bound(
517 for (; dit != hi_dit; dit++) {
518 nodes_indices[siit->get()->side_number * (*dit)->getNbOfCoeffs() +
519 (*dit)->getDofCoeffIdx()] =
520 (*dit)->getPetscGlobalDofIdx();
521 }
522 }
523 }
524 } else {
525 nodes_indices.resize(0, false);
526 }
527
529}
virtual Field * get_field_structure(const std::string &name)=0
get field structure
virtual FieldBitNumber get_field_bit_number(const std::string name) const =0
get field bit number
static UId getLoLocalEntityBitNumber(const char bit_number, const EntityHandle ent)
static UId getHiLocalEntityBitNumber(const char bit_number, const EntityHandle ent)

◆ getProblemNodesRowIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getProblemNodesRowIndices ( const std::string &  field_name,
VectorInt nodes_indices 
) const
protected

Definition at line 565 of file ForcesAndSourcesCore.cpp.

566 {
568 nodes_indices);
569}
boost::shared_ptr< NumeredDofEntity_multiIndex > numeredRowDofsPtr
store DOFs on rows for this problem

◆ getProblemTypeColIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getProblemTypeColIndices ( const std::string &  field_name,
EntityType  type,
int  side_number,
VectorInt indices 
) const
protected

Definition at line 586 of file ForcesAndSourcesCore.cpp.

588 {
590 type, side_number, indices);
591}
MoFEMErrorCode getProblemTypeIndices(const std::string &field_name, const NumeredDofEntity_multiIndex &dofs, EntityType type, int side_number, VectorInt &indices) const
get indices by type (generic function) which are declared for problem but not this particular element

◆ getProblemTypeIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getProblemTypeIndices ( const std::string &  field_name,
const NumeredDofEntity_multiIndex dofs,
EntityType  type,
int  side_number,
VectorInt indices 
) const
protected

get indices by type (generic function) which are declared for problem but not this particular element

Definition at line 531 of file ForcesAndSourcesCore.cpp.

533 {
535
536 indices.resize(0);
537
538 auto &side_table = const_cast<SideNumber_multiIndex &>(
539 numeredEntFiniteElementPtr->getSideNumberTable());
540 auto siit =
541 side_table.get<1>().lower_bound(boost::make_tuple(type, side_number));
542 auto hi_siit =
543 side_table.get<1>().upper_bound(boost::make_tuple(type, side_number));
544
545 for (; siit != hi_siit; siit++) {
546 if (siit->get()->side_number >= 0) {
547
548 const EntityHandle ent = siit->get()->ent;
549 auto bit_number = mField.get_field_bit_number(field_name);
550 auto dit = dofs.get<Unique_mi_tag>().lower_bound(
552 auto hi_dit = dofs.get<Unique_mi_tag>().upper_bound(
554 indices.resize(std::distance(dit, hi_dit));
555 for (; dit != hi_dit; dit++) {
556
557 indices[(*dit)->getEntDofIdx()] = (*dit)->getPetscGlobalDofIdx();
558 }
559 }
560 }
561
563}

◆ getProblemTypeRowIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getProblemTypeRowIndices ( const std::string &  field_name,
EntityType  type,
int  side_number,
VectorInt indices 
) const
protected

Definition at line 572 of file ForcesAndSourcesCore.cpp.

574 {
576 type, side_number, indices);
577}

◆ getRowNodesIndices()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getRowNodesIndices ( EntitiesFieldData data,
const int  bit_number 
) const
protected

get row node indices from FENumeredDofEntity_multiIndex

Definition at line 311 of file ForcesAndSourcesCore.cpp.

312 {
313
314 struct Extractor {
315 boost::weak_ptr<EntityCacheNumeredDofs>
316 operator()(boost::shared_ptr<FieldEntity> &e) {
317 return e->entityCacheRowDofs;
318 }
319 };
320
321 return getNodesIndices(bit_number, getRowFieldEnts(),
322 data.dataOnEntities[MBVERTEX][0].getIndices(),
323 data.dataOnEntities[MBVERTEX][0].getLocalIndices(),
324 Extractor());
325}

◆ getRule() [1/2]

int MoFEM::ForcesAndSourcesCore::getRule ( int  order)
protectedvirtual
Deprecated:
Use getRule(int row_order, int col_order, int data order)

Reimplemented in MoFEM::EdgeElementForcesAndSourcesCoreOnChildParent, MoFEM::FaceElementForcesAndSourcesCoreOnChildParent, MoFEM::FaceElementForcesAndSourcesCoreOnSide, MoFEM::VolumeElementForcesAndSourcesCoreOnContactPrismSide, MoFEM::VolumeElementForcesAndSourcesCoreOnSide, MoFEM::PostProcBrokenMeshInMoabBase< EdgeElementForcesAndSourcesCore >, MoFEM::PostProcBrokenMeshInMoabBase< FaceElementForcesAndSourcesCore >, MoFEM::PostProcBrokenMeshInMoabBase< VolumeElementForcesAndSourcesCore >, CohesiveElement::CohesiveInterfaceElement::MyPrism, AnalyticalDirichletBC::ApproxField::MyTriFE, BodyForceConstantField::MyVolumeFE, EdgeForce::MyFE, FluidPressure::MyTriangleFE, KelvinVoigtDamper::DamperFE, NonlinearElasticElement::MyVolumeFE, PostProcFaceOnRefinedMesh, PostProcEdgeOnRefinedMesh, NeumannForcesSurface::MyTriangleFE, NeumannForcesSurfaceComplexForLazy::MyTriangleSpatialFE, SurfaceSlidingConstrains::MyTriangleFE, EdgeSlidingConstrains::MyEdgeFE, ThermalElement::MyVolumeFE, ThermalElement::MyTriFE, ThermalStressElement::MyVolumeFE, BoneRemodeling::DensityMapFe, BoneRemodeling::Remodeling::Fe, CellEngineering::FaceElement, CellEngineering::DispMapFe, GelModule::Gel::GelFE, NitscheMethod::MyFace, NitscheMethod::MyVolumeFE, SmallStrainPlasticity::MyVolumeFE, MixTransport::MixTransportElement::MyVolumeFE, MixTransport::MixTransportElement::MyTriFE, MagneticElement::VolumeFE, and MagneticElement::TriFE.

Definition at line 1856 of file ForcesAndSourcesCore.cpp.

1856{ return 2 * order; }

◆ getRule() [2/2]

int MoFEM::ForcesAndSourcesCore::getRule ( int  order_row,
int  order_col,
int  order_data 
)
protectedvirtual

another variant of getRule

Parameters
order_roworder of base function on row
order_colorder of base function on columns
order_dataorder of base function approximating data
Returns
integration rule

This function is overloaded by the user. The integration rule is set such that specific operator implemented by the user is integrated accurately. For example if user implement bilinear operator

\[ b(u,v) = \int_\mathcal{T} \frac{\partial u_i}{\partial x_j}\frac{\partial v_i}{\partial x_j} \textrm{d}\mathcal{T} \]

then if \(u\) and \(v\) are polynomial of given order, then exact integral would be

int getRule(int order) { return
2*(order-1); };
virtual int getRule(int order_row, int order_col, int order_data)
another variant of getRule

The integration points and weights are set appropriately for given entity type and integration rule from quad.c

Method ForcesAndSourcesCore::getRule takes at argument takes maximal polynomial order set on the element on all fields defined on the element. If a user likes to have more control, another variant of this function can be called which distinguishing between field orders on rows, columns and data, the i.e. first argument of a bilinear form, the second argument of bilinear form and field coefficients on the element.

Note
If user set rule to -1 or any other negative integer, then method ForcesAndSourcesCore::setGaussPts is called. In that method user can implement own (specific) integration method.
Bug:
this function should be const

Reimplemented in TriFE, QuadFE, and EdgeFE.

Definition at line 1844 of file ForcesAndSourcesCore.cpp.

1845 {
1846 return getRuleHook ? getRuleHook(order_row, order_col, order_data)
1847 : getRule(order_data);
1848}

◆ getSpacesAndBaseOnEntities()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::getSpacesAndBaseOnEntities ( EntitiesFieldData data) const
protected

Get field approximation space and base on entities.

Definition at line 982 of file ForcesAndSourcesCore.cpp.

983 {
985
986 if (nInTheLoop == 0) {
987 data.sPace.reset();
988 data.bAse.reset();
989 for (EntityType t = MBVERTEX; t != MBMAXTYPE; ++t) {
990 data.spacesOnEntities[t].reset();
991 data.basesOnEntities[t].reset();
992 }
993 for (int s = 0; s != LASTSPACE; ++s) {
994 data.basesOnSpaces[s].reset();
995 }
996 }
997
998 auto fe_type = numeredEntFiniteElementPtr->getEntType();
999
1000 if (getDataFieldEntsPtr())
1001 for (auto e : getDataFieldEnts()) {
1002 if (auto ptr = e.lock()) {
1003 // get data from entity
1004 const EntityType type = ptr->getEntType();
1005 if (DefaultElementAdjacency::getDefTypeMap(fe_type, type)) {
1006 const FieldSpace space = ptr->getSpace();
1007 const FieldApproximationBase approx = ptr->getApproxBase();
1008 // set data
1009 data.sPace.set(space);
1010 data.bAse.set(approx);
1011 data.spacesOnEntities[type].set(space);
1012 data.basesOnEntities[type].set(approx);
1013 data.basesOnSpaces[space].set(approx);
1014 }
1015 }
1016 }
1017 else
1018 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1019 "data fields ents not allocated on element");
1020
1022}
int nInTheLoop
number currently of processed method
static bool getDefTypeMap(const EntityType fe_type, const EntityType ent_type)
boost::shared_ptr< FieldEntity_vector_view > & getDataFieldEntsPtr() const

◆ getUserPolynomialBase()

auto & MoFEM::ForcesAndSourcesCore::getUserPolynomialBase ( )
inline

Get the User Polynomial Base object.

Returns
boost::shared_ptr<BaseFunction>&

Definition at line 97 of file ForcesAndSourcesCore.hpp.

97{ return userPolynomialBasePtr; }
boost::shared_ptr< BaseFunction > userPolynomialBasePtr
Pointer to user polynomail base.

◆ loopOverOperators()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::loopOverOperators ( )
protected

Iterate user data operators.

Returns
MoFEMErrorCode

Definition at line 1340 of file ForcesAndSourcesCore.cpp.

1340 {
1342
1343 using UDO = UserDataOperator;
1344
1345 std::array<std::string, 2> field_name;
1346 std::array<Field *, 3> field_struture;
1347 std::array<int, 2>
1348 field_id; // note the this is field bit number (nor field bit)
1349 std::array<FieldSpace, 2> space;
1350 std::array<FieldApproximationBase, 2> base;
1351
1352 constexpr std::array<UDO::OpType, 2> types = {UDO::OPROW, UDO::OPCOL};
1353 std::array<int, 2> last_eval_field_id = {0, 0};
1354
1355 std::array<boost::shared_ptr<EntitiesFieldData>, 2> op_data;
1356
1357 auto swap_bases = [&](auto &op) {
1359 for (size_t ss = 0; ss != 2; ++ss) {
1360 if (op.getOpType() & types[ss] || op.getOpType() & UDO::OPROWCOL) {
1361 switch (base[ss]) {
1363 CHKERR op_data[ss]->baseSwap(field_name[ss],
1365 default:
1366 break;
1367 }
1368 }
1369 }
1370
1372 };
1373
1374 const EntityType type = numeredEntFiniteElementPtr->getEntType();
1375
1376 // evaluate entity data only, no field specific data provided or known
1377 auto evaluate_op_space = [&](auto &op) {
1379
1380 // reseat all data which all field dependent
1381 dataOnElement[op.sPace]->resetFieldDependentData();
1382 std::fill(last_eval_field_id.begin(), last_eval_field_id.end(), 0);
1383
1384 switch (op.sPace) {
1385 case NOSPACE:
1386 try {
1387 CHKERR op.doWork(
1388 0, MBENTITYSET,
1389 dataOnElement[NOSPACE]->dataOnEntities[MBENTITYSET][0]);
1390 }
1391 CATCH_OP_ERRORS(op);
1392 break;
1393 case NOFIELD:
1394 case H1:
1395 case HCURL:
1396 case HDIV:
1397 case L2:
1398 try {
1399
1400 for (EntityType t = MBVERTEX; t != MBMAXTYPE; ++t) {
1401 for (auto &e : dataOnElement[op.sPace]->dataOnEntities[t]) {
1402 e.getSpace() = op.sPace;
1403 }
1404 }
1405
1406 CHKERR op.opRhs(*dataOnElement[op.sPace], false);
1407 }
1408 CATCH_OP_ERRORS(op);
1409 break;
1410 default:
1411 SETERRQ1(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
1412 "Not implemented for this space", op.sPace);
1413 }
1414
1416 };
1417
1418 // set entity data
1419 auto set_op_entityties_data = [&](auto ss, auto &op) {
1421
1422#ifndef NDEBUG
1423 if ((op.getNumeredEntFiniteElementPtr()->getBitFieldIdData() &
1425 .none()) {
1426 SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1427 "no data field < %s > on finite element < %s >",
1428 field_name[ss].c_str(), getFEName().c_str());
1429 }
1430#endif
1431
1432 op_data[ss] =
1433 !ss ? dataOnElement[space[ss]] : derivedDataOnElement[space[ss]];
1434
1435 for (auto &data : op_data[ss]->dataOnEntities[MBENTITYSET]) {
1436 CHKERR data.resetFieldDependentData();
1437 }
1438
1439 auto get_data_for_nodes = [&]() {
1441 if (!ss)
1442 CHKERR getRowNodesIndices(*op_data[ss], field_id[ss]);
1443 else
1444 CHKERR getColNodesIndices(*op_data[ss], field_id[ss]);
1445 CHKERR getNodesFieldData(*op_data[ss], field_id[ss]);
1447 };
1448
1449 // get data on entities but not nodes
1450 auto get_data_for_entities = [&]() {
1452 CHKERR getEntityFieldData(*op_data[ss], field_id[ss], MBEDGE);
1453 if (!ss)
1454 CHKERR getEntityRowIndices(*op_data[ss], field_id[ss], MBEDGE);
1455 else
1456 CHKERR getEntityColIndices(*op_data[ss], field_id[ss], MBEDGE);
1458 };
1459
1460 auto get_data_for_meshset = [&]() {
1462 if (!ss) {
1463 CHKERR getNoFieldRowIndices(*op_data[ss], field_id[ss]);
1464 } else {
1465 CHKERR getNoFieldColIndices(*op_data[ss], field_id[ss]);
1466 }
1467 CHKERR getNoFieldFieldData(*op_data[ss], field_id[ss]);
1469 };
1470
1471 switch (space[ss]) {
1472 case H1:
1473 CHKERR get_data_for_nodes();
1474 case HCURL:
1475 case HDIV:
1476 CHKERR get_data_for_entities();
1477 break;
1478 case L2:
1479 switch (type) {
1480 case MBVERTEX:
1481 CHKERR get_data_for_nodes();
1482 break;
1483 default:
1484 CHKERR get_data_for_entities();
1485 }
1486 break;
1487 case NOFIELD:
1488 // if (!getNinTheLoop()) {
1489 // NOFIELD data are the same for each element, can be
1490 // retrieved only once
1491 CHKERR get_data_for_meshset();
1492 // }
1493 break;
1494 default:
1495 SETERRQ1(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
1496 "not implemented for this space < %s >",
1497 FieldSpaceNames[space[ss]]);
1498 }
1500 };
1501
1502 // evalate operators with field data
1503 auto evaluate_op_for_fields = [&](auto &op) {
1505
1506 if (op.getOpType() & UDO::OPROW) {
1507 try {
1508 CHKERR op.opRhs(*op_data[0], false);
1509 }
1510 CATCH_OP_ERRORS(op);
1511 }
1512
1513 if (op.getOpType() & UDO::OPCOL) {
1514 try {
1515 CHKERR op.opRhs(*op_data[1], false);
1516 }
1517 CATCH_OP_ERRORS(op);
1518 }
1519
1520 if (op.getOpType() & UDO::OPROWCOL) {
1521 try {
1522 CHKERR op.opLhs(*op_data[0], *op_data[1]);
1523 }
1524 CATCH_OP_ERRORS(op);
1525 }
1527 };
1528
1529 // Collect bit ref level on all entities, fields and spaces
1531
1532 auto oit = opPtrVector.begin();
1533 auto hi_oit = opPtrVector.end();
1534
1535 // interate over all operators on element
1536 for (; oit != hi_oit; oit++) {
1537
1538 try {
1539
1540 CHKERR oit->setPtrFE(this);
1541
1542 if ((oit->opType & UDO::OPSPACE) == UDO::OPSPACE) {
1543
1544 // run operator for space but specific field
1545 CHKERR evaluate_op_space(*oit);
1546
1547 } else if (
1548
1549 (oit->opType & (UDO::OPROW | UDO::OPCOL | UDO::OPROWCOL)) ==
1550 oit->opType
1551
1552 ) {
1553
1554 field_name[0] = oit->rowFieldName;
1555 field_name[1] = oit->colFieldName;
1556
1557 for (size_t ss = 0; ss != 2; ss++) {
1558
1559#ifndef NDEBUG
1560 if (field_name[ss].empty()) {
1561 SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1562 "Not set Field name in operator %d (0-row, 1-column) in "
1563 "operator %s",
1564 ss,
1565 (boost::typeindex::type_id_runtime(*oit).pretty_name())
1566 .c_str());
1567 }
1568#endif
1569
1570 field_struture[ss] = mField.get_field_structure(field_name[ss]);
1571 field_id[ss] = field_struture[ss]->getBitNumber();
1572 space[ss] = field_struture[ss]->getSpace();
1573 base[ss] = field_struture[ss]->getApproxBase();
1574 }
1575
1576 // not that if field name do not change between operators, entity field
1577 // data are nor rebuild
1578 for (size_t ss = 0; ss != 2; ss++) {
1579
1580 if (oit->getOpType() & types[ss] ||
1581 oit->getOpType() & UDO::OPROWCOL) {
1582 if (last_eval_field_id[ss] != field_id[ss]) {
1583 CHKERR set_op_entityties_data(ss, *oit);
1584 last_eval_field_id[ss] = field_id[ss];
1585 }
1586 }
1587 }
1588
1589 CHKERR swap_bases(*oit);
1590
1591 // run operator for given field or row, column or both
1592 CHKERR evaluate_op_for_fields(*oit);
1593
1594 CHKERR swap_bases(*oit);
1595
1596 } else {
1597
1598 for (int i = 0; i != 5; ++i)
1599 if (oit->opType & (1 << i))
1600 MOFEM_LOG("SELF", Sev::error) << UDO::OpTypeNames[i];
1601 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1602 "Impossible operator type");
1603 }
1604 }
1605 CATCH_OP_ERRORS(*oit);
1606 }
1608}
#define CATCH_OP_ERRORS(OP)
ForcesAndSourcesCore::UserDataOperator UserDataOperator
static const char *const FieldSpaceNames[]
Definition: definitions.h:92
@ MOFEM_NOT_IMPLEMENTED
Definition: definitions.h:32
#define MOFEM_LOG(channel, severity)
Log.
Definition: LogManager.hpp:301
FTensor::Index< 'i', SPACE_DIM > i
virtual BitFieldId get_field_id(const std::string &name) const =0
Get field Id.
auto getFEName() const
get finite element name
FieldBitNumber getBitNumber() const
Get number of set bit in Field ID. Each field has uid, get getBitNumber get number of bit set for giv...
MoFEMErrorCode getEntityRowIndices(EntitiesFieldData &data, const int bit_number, const EntityType type_lo=MBVERTEX, const EntityType type_hi=MBPOLYHEDRON) const
MoFEMErrorCode getRowNodesIndices(EntitiesFieldData &data, const int bit_number) const
get row node indices from FENumeredDofEntity_multiIndex
MoFEMErrorCode getNoFieldRowIndices(EntitiesFieldData &data, const int bit_number) const
get col NoField indices
MoFEMErrorCode getEntityFieldData(EntitiesFieldData &data, const int bit_number, const EntityType type_lo=MBVERTEX, const EntityType type_hi=MBPOLYHEDRON) const
MoFEMErrorCode getColNodesIndices(EntitiesFieldData &data, const int bit_number) const
get col node indices from FENumeredDofEntity_multiIndex
MoFEMErrorCode getNodesFieldData(EntitiesFieldData &data, const int bit_number) const
Get data on nodes.
MoFEMErrorCode getEntityColIndices(EntitiesFieldData &data, const int bit_number, const EntityType type_lo=MBVERTEX, const EntityType type_hi=MBPOLYHEDRON) const
MoFEMErrorCode getNoFieldColIndices(EntitiesFieldData &data, const int bit_number) const
get col NoField indices

◆ operator()()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::operator() ( )
virtual

function is run for every finite element

It is used to calculate element local matrices and assembly. It can be used for post-processing.

Reimplemented from MoFEM::BasicMethod.

Reimplemented in MoFEM::ContactPrismElementForcesAndSourcesCore, MoFEM::EdgeElementForcesAndSourcesCore, MoFEM::FaceElementForcesAndSourcesCore, MoFEM::FatPrismElementForcesAndSourcesCore, MoFEM::FlatPrismElementForcesAndSourcesCore, MoFEM::VertexElementForcesAndSourcesCore, MoFEM::VolumeElementForcesAndSourcesCore, and NeumannForcesSurfaceComplexForLazy::MyTriangleSpatialFE.

Definition at line 1890 of file ForcesAndSourcesCore.cpp.

1890 {
1892 if (operatorHook) {
1893 ierr = operatorHook();
1894 CHKERRG(ierr);
1895 } else {
1896#ifndef NDEBUG
1897 MOFEM_LOG("SELF", Sev::warning)
1898 << "No method operator() overloaded on element entity on finite "
1899 "element <"
1900 << boost::typeindex::type_id_runtime(*this).pretty_name() << ">";
1901#endif
1902 }
1904}
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
Definition: definitions.h:483
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Exceptions.hpp:76
boost::function< MoFEMErrorCode()> operatorHook
Hook function for operator.

◆ postProcess()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::postProcess ( )
virtual

function is run at the end of loop

It is used to assembly matrices and vectors, calculating global variables, f.e. total internal energy, ect.

Iterating over dofs: Example1 iterating over dofs in row by name of the field for(IT_GET_FEROW_BY_NAME_DOFS_FOR_LOOP(this,"DISPLACEMENT",it)) { ... }

Reimplemented from MoFEM::BasicMethod.

Reimplemented in MoFEM::PostProcBrokenMeshInMoabBase< EdgeElementForcesAndSourcesCore >, MoFEM::PostProcBrokenMeshInMoabBase< FaceElementForcesAndSourcesCore >, MoFEM::PostProcBrokenMeshInMoabBase< VolumeElementForcesAndSourcesCore >, KelvinVoigtDamper::DamperFE, NonlinearElasticElement::MyVolumeFE, PostProcFatPrismOnRefinedMesh, PostProcFaceOnRefinedMesh, PostProcEdgeOnRefinedMesh, Smoother::MyVolumeFE, GelModule::Gel::GelFE, SolidShellModule::SolidShellPrismElement::SolidShell, SolidShellModule::SolidShellPrismElement::SolidShellError, and SolidShellModule::SolidShellPrismElement::PostProcFatPrismOnTriangleOnRefinedMesh.

Definition at line 1905 of file ForcesAndSourcesCore.cpp.

1905 {
1907 if (postProcessHook) {
1909 CHKERRG(ierr);
1910 }
1912}
boost::function< MoFEMErrorCode()> postProcessHook
Hook function for post-processing.

◆ preProcess()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::preProcess ( )
virtual

◆ setGaussPts() [1/2]

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::setGaussPts ( int  order)
protectedvirtual

◆ setGaussPts() [2/2]

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::setGaussPts ( int  order_row,
int  order_col,
int  order_data 
)
protectedvirtual

set user specific integration rule

This function allows for user defined integration rule. The key is to called matrix gaussPts, which is used by other MoFEM procedures. Matrix has number of rows equal to problem dimension plus one, where last index is used to store weight values. Number of columns is equal to number of integration points.

Note
This function is called if method ForcesAndSourcesCore::getRule is returning integer -1 or any other negative integer.

User sets

where

gaussPts.resize(dim+1,nb_gauss_pts);
const int dim

number rows represents local coordinates of integration points in reference element, where last index in row is for integration weight.

Reimplemented in TriFE, QuadFE, and EdgeFE.

Definition at line 1850 of file ForcesAndSourcesCore.cpp.

1851 {
1852 return setRuleHook ? setRuleHook(this, order_row, order_col, order_data)
1853 : setGaussPts(order_data);
1854}
virtual MoFEMErrorCode setGaussPts(int order_row, int order_col, int order_data)
set user specific integration rule

◆ setRefineFEPtr()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::setRefineFEPtr ( const ForcesAndSourcesCore refine_fe_ptr)
private

Set the pointer to face element refined.

Parameters
refine_fe_ptr
Returns
MoFEMErrorCode

Definition at line 1654 of file ForcesAndSourcesCore.cpp.

1655 {
1657 refinePtrFE = const_cast<ForcesAndSourcesCore *>(refine_fe_ptr);
1659}
ForcesAndSourcesCore(Interface &m_field)

◆ setSideFEPtr()

MoFEMErrorCode MoFEM::ForcesAndSourcesCore::setSideFEPtr ( const ForcesAndSourcesCore side_fe_ptr)
private

Set the pointer to face element on the side.

Note
Function is is used by face element, while it iterates over elements on the side
Parameters
side_fe_ptr
Returns
MoFEMErrorCode

Definition at line 1648 of file ForcesAndSourcesCore.cpp.

1648 {
1650 sidePtrFE = const_cast<ForcesAndSourcesCore *>(side_fe_ptr);
1652}

Friends And Related Function Documentation

◆ EdgeElementForcesAndSourcesCoreOnChildParent

Definition at line 537 of file ForcesAndSourcesCore.hpp.

◆ FaceElementForcesAndSourcesCoreOnChildParent

Definition at line 536 of file ForcesAndSourcesCore.hpp.

◆ FaceElementForcesAndSourcesCoreOnSide

Definition at line 535 of file ForcesAndSourcesCore.hpp.

◆ UserDataOperator

friend class UserDataOperator
friend

Definition at line 482 of file ForcesAndSourcesCore.hpp.

◆ VolumeElementForcesAndSourcesCoreOnContactPrismSide

Definition at line 538 of file ForcesAndSourcesCore.hpp.

◆ VolumeElementForcesAndSourcesCoreOnSide

Definition at line 534 of file ForcesAndSourcesCore.hpp.

Member Data Documentation

◆ coordsAtGaussPts

MatrixDouble MoFEM::ForcesAndSourcesCore::coordsAtGaussPts
protected

coordinated at gauss points

Definition at line 541 of file ForcesAndSourcesCore.hpp.

◆ dataH1

EntitiesFieldData& MoFEM::ForcesAndSourcesCore::dataH1
protected

Definition at line 471 of file ForcesAndSourcesCore.hpp.

◆ dataHcurl

EntitiesFieldData& MoFEM::ForcesAndSourcesCore::dataHcurl
protected

Definition at line 472 of file ForcesAndSourcesCore.hpp.

◆ dataHdiv

EntitiesFieldData& MoFEM::ForcesAndSourcesCore::dataHdiv
protected

Definition at line 473 of file ForcesAndSourcesCore.hpp.

◆ dataL2

EntitiesFieldData& MoFEM::ForcesAndSourcesCore::dataL2
protected

Definition at line 474 of file ForcesAndSourcesCore.hpp.

◆ dataNoField

EntitiesFieldData& MoFEM::ForcesAndSourcesCore::dataNoField
protected

Definition at line 470 of file ForcesAndSourcesCore.hpp.

◆ dataOnElement

const std::array<boost::shared_ptr<EntitiesFieldData>, LASTSPACE> MoFEM::ForcesAndSourcesCore::dataOnElement
protected

Entity data on element entity rows fields.

Definition at line 461 of file ForcesAndSourcesCore.hpp.

◆ derivedDataOnElement

const std::array<boost::shared_ptr<EntitiesFieldData>, LASTSPACE> MoFEM::ForcesAndSourcesCore::derivedDataOnElement
protected

Entity data on element entity columns fields.

Definition at line 468 of file ForcesAndSourcesCore.hpp.

◆ elementMeasure

double MoFEM::ForcesAndSourcesCore::elementMeasure
protected

Depending on dimension of elements, stores length, area or volume of element.

Definition at line 542 of file ForcesAndSourcesCore.hpp.

◆ elementPolynomialBasePtr

boost::shared_ptr<BaseFunction> MoFEM::ForcesAndSourcesCore::elementPolynomialBasePtr
private

Pointer to entity polynomial base.

Definition at line 496 of file ForcesAndSourcesCore.hpp.

◆ gaussPts

MatrixDouble MoFEM::ForcesAndSourcesCore::gaussPts

Matrix of integration points.

Columns is equal to number of integration points, numver of rows depends on dimension of finite element entity, for example for tetrahedron rows are x,y,z,weight. Last row is integration weight.

FIXME: that should be moved to private class data and acessed only by member function

Examples
hanging_node_approx.cpp, and prism_elements_from_surface.cpp.

Definition at line 109 of file ForcesAndSourcesCore.hpp.

◆ getRuleHook

RuleHookFun MoFEM::ForcesAndSourcesCore::getRuleHook

Hook to get rule.

Todo:
check preferred format how works with gcc and clang, see http://www.boost.org/doc/libs/1_64_0/doc/html/function/tutorial.html#idp247873024
Examples
field_evaluator.cpp, and lorentz_force.cpp.

Definition at line 42 of file ForcesAndSourcesCore.hpp.

◆ lastEvaluatedElementEntityType

EntityType MoFEM::ForcesAndSourcesCore::lastEvaluatedElementEntityType
protected

Last evaluated type of element entity.

Definition at line 489 of file ForcesAndSourcesCore.hpp.

◆ mField

Interface& MoFEM::ForcesAndSourcesCore::mField
Examples
prism_elements_from_surface.cpp.

Definition at line 24 of file ForcesAndSourcesCore.hpp.

◆ opPtrVector

boost::ptr_vector<UserDataOperator> MoFEM::ForcesAndSourcesCore::opPtrVector
protected

Vector of finite element users data operators.

Definition at line 480 of file ForcesAndSourcesCore.hpp.

◆ refinePtrFE

ForcesAndSourcesCore* MoFEM::ForcesAndSourcesCore::refinePtrFE
private

Element to integrate parent or child.

u

Definition at line 524 of file ForcesAndSourcesCore.hpp.

◆ setRuleHook

GaussHookFun MoFEM::ForcesAndSourcesCore::setRuleHook

Set function to calculate integration rule.

Definition at line 48 of file ForcesAndSourcesCore.hpp.

◆ sidePtrFE

ForcesAndSourcesCore* MoFEM::ForcesAndSourcesCore::sidePtrFE
private

Element to integrate on the sides.

Definition at line 507 of file ForcesAndSourcesCore.hpp.

◆ userPolynomialBasePtr

boost::shared_ptr<BaseFunction> MoFEM::ForcesAndSourcesCore::userPolynomialBasePtr
private

Pointer to user polynomail base.

Definition at line 501 of file ForcesAndSourcesCore.hpp.


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