11 #ifndef __FORCES_AND_SOURCES_CORE__HPP__
12 #define __FORCES_AND_SOURCES_CORE__HPP__
14 using namespace boost::numeric;
27 typedef boost::function<
int(
int order_row,
int order_col,
int order_data)>
31 int order_row,
int order_col,
128 int getMaxDataOrder()
const;
131 int getMaxRowOrder()
const;
134 int getMaxColOrder()
const;
146 return dataOnElement[space]->dataOnEntities[
type][side];
177 const EntityType
type,
178 boost::ptr_vector<EntitiesFieldData::EntData> &data)
const;
190 boost::ptr_vector<EntitiesFieldData::EntData> &data)
const;
199 template <EntityType type>
212 template <EntityType type>
223 template <
typename EXTRACTOR>
225 getNodesIndices(
const int bit_number,
227 VectorInt &local_nodes_indices, EXTRACTOR &&extractor)
const;
231 const int bit_number)
const;
235 const int bit_number)
const;
237 template <
typename EXTRACTOR>
240 const EntityType type_lo,
241 const EntityType type_hi,
242 EXTRACTOR &&extractor)
const;
246 const EntityType type_lo = MBVERTEX,
247 const EntityType type_hi = MBPOLYHEDRON)
const;
251 const EntityType type_lo = MBVERTEX,
252 const EntityType type_hi = MBPOLYHEDRON)
const;
256 getNoFieldIndices(
const int bit_number,
257 boost::shared_ptr<FENumeredDofEntity_multiIndex> dofs,
262 const int bit_number)
const;
266 const int bit_number)
const;
287 const int bit_number)
const;
296 const int bit_number)
const;
300 const EntityType type_lo = MBVERTEX,
301 const EntityType type_hi = MBPOLYHEDRON)
const;
326 EntityType
type,
int side_number,
332 EntityType
type,
int side_number,
337 EntityType
type,
int side_number,
379 virtual int getRule(
int order_row,
int order_col,
int order_data);
448 virtual int getRule(
int order);
460 const std::array<boost::shared_ptr<EntitiesFieldData>,
LASTSPACE>
467 const std::array<boost::shared_ptr<EntitiesFieldData>,
LASTSPACE>
574 static const char *
const OpTypeNames[];
589 const bool symm =
true);
592 const bool symm =
true);
595 const std::string col_field_name,
const char type,
596 const bool symm =
true);
600 inline boost::shared_ptr<const NumeredEntFiniteElement>
601 getNumeredEntFiniteElementPtr()
const;
614 inline int getFEDim()
const;
621 inline EntityType getFEType()
const;
634 inline boost::weak_ptr<SideNumber> getSideNumberPtr(
const int side_number,
635 const EntityType
type);
669 inline EntityHandle getSideEntity(
const int side_number,
670 const EntityType
type);
677 inline int getNumberOfNodesOnElement()
const;
694 const EntityType
type,
const int side,
712 const EntityType
type,
const int side,
717 inline const FEMethod *getFEMethod()
const;
723 inline int getOpType()
const;
740 inline int getNinTheLoop()
const;
746 inline int getLoopSize()
const;
750 inline std::string getFEName()
const;
768 inline Vec getKSPf()
const;
770 inline Mat getKSPA()
const;
772 inline Mat getKSPB()
const;
780 inline Vec getSNESf()
const;
782 inline Vec getSNESx()
const;
784 inline Mat getSNESA()
const;
786 inline Mat getSNESB()
const;
794 inline Vec getTSu()
const;
796 inline Vec getTSu_t()
const;
798 inline Vec getTSu_tt()
const;
800 inline Vec getTSf()
const;
802 inline Mat getTSA()
const;
804 inline Mat getTSB()
const;
806 inline int getTSstep()
const;
808 inline double getTStime()
const;
810 inline double getTStimeStep()
const;
812 inline double getTSa()
const;
814 inline double getTSaa()
const;
848 inline auto getFTensor0IntegrationWeight();
876 inline auto getFTensor1CoordsAtGaussPts();
888 inline double getMeasure()
const;
894 inline double &getMeasure();
904 std::vector<boost::weak_ptr<NumeredEntFiniteElement>>>;
923 boost::shared_ptr<Range> fe_range =
nullptr,
924 const int verb =
QUIET,
943 const int verb =
QUIET,
958 const int verb =
QUIET,
973 const int verb =
QUIET,
1000 boost::shared_ptr<const NumeredEntFiniteElement>
1001 ForcesAndSourcesCore::UserDataOperator::getNumeredEntFiniteElementPtr()
const {
1005 EntityHandle ForcesAndSourcesCore::UserDataOperator::getFEEntityHandle()
const {
1006 return getNumeredEntFiniteElementPtr()->getEnt();
1009 int ForcesAndSourcesCore::UserDataOperator::getFEDim()
const {
1013 EntityType ForcesAndSourcesCore::UserDataOperator::getFEType()
const {
1017 boost::weak_ptr<SideNumber>
1018 ForcesAndSourcesCore::UserDataOperator::getSideNumberPtr(
1019 const int side_number,
const EntityType
type) {
1020 auto &side_table_by_side_and_type =
1021 ptrFE->numeredEntFiniteElementPtr->getSideNumberTable().get<1>();
1023 side_table_by_side_and_type.find(boost::make_tuple(
type, side_number));
1024 if (side_it != side_table_by_side_and_type.end())
1027 return boost::weak_ptr<SideNumber>();
1031 ForcesAndSourcesCore::UserDataOperator::getSideEntity(
const int side_number,
1032 const EntityType
type) {
1033 if (
auto side_ptr = getSideNumberPtr(side_number,
type).lock())
1034 return side_ptr->ent;
1039 int ForcesAndSourcesCore::UserDataOperator::getNumberOfNodesOnElement()
const {
1040 return ptrFE->getNumberOfNodes();
1043 const FEMethod *ForcesAndSourcesCore::UserDataOperator::getFEMethod()
const {
1047 int ForcesAndSourcesCore::UserDataOperator::getOpType()
const {
return opType; }
1049 void ForcesAndSourcesCore::UserDataOperator::setOpType(
const OpType type) {
1053 void ForcesAndSourcesCore::UserDataOperator::addOpType(
const OpType type) {
1057 int ForcesAndSourcesCore::UserDataOperator::getNinTheLoop()
const {
1058 return getFEMethod()->getNinTheLoop();
1061 int ForcesAndSourcesCore::UserDataOperator::getLoopSize()
const {
1062 return getFEMethod()->getLoopSize();
1065 std::string ForcesAndSourcesCore::UserDataOperator::getFEName()
const {
1066 return getFEMethod()->getFEName();
1070 ForcesAndSourcesCore::UserDataOperator::getDataCtx()
const {
1071 return getFEMethod()->data_ctx;
1075 ForcesAndSourcesCore::UserDataOperator::getKSPCtx()
const {
1076 return getFEMethod()->ksp_ctx;
1080 ForcesAndSourcesCore::UserDataOperator::getSNESCtx()
const {
1081 return getFEMethod()->snes_ctx;
1085 ForcesAndSourcesCore::UserDataOperator::getTSCtx()
const {
1086 return getFEMethod()->ts_ctx;
1089 Vec ForcesAndSourcesCore::UserDataOperator::getKSPf()
const {
1091 if (getFEMethod()->ksp_f == PETSC_NULL)
1094 return getFEMethod()->ksp_f;
1097 Mat ForcesAndSourcesCore::UserDataOperator::getKSPA()
const {
1099 if (getFEMethod()->ksp_A == PETSC_NULL)
1102 return getFEMethod()->ksp_A;
1105 Mat ForcesAndSourcesCore::UserDataOperator::getKSPB()
const {
1107 if (getFEMethod()->ksp_B == PETSC_NULL)
1110 return getFEMethod()->ksp_B;
1113 Vec ForcesAndSourcesCore::UserDataOperator::getSNESf()
const {
1115 if (getFEMethod()->snes_f == PETSC_NULL)
1118 return getFEMethod()->snes_f;
1121 Vec ForcesAndSourcesCore::UserDataOperator::getSNESx()
const {
1123 if (getFEMethod()->snes_x == PETSC_NULL)
1126 return getFEMethod()->snes_x;
1129 Mat ForcesAndSourcesCore::UserDataOperator::getSNESA()
const {
1131 if (getFEMethod()->snes_A == PETSC_NULL)
1134 return getFEMethod()->snes_A;
1137 Mat ForcesAndSourcesCore::UserDataOperator::getSNESB()
const {
1139 if (getFEMethod()->snes_B == PETSC_NULL)
1142 return getFEMethod()->snes_B;
1145 Vec ForcesAndSourcesCore::UserDataOperator::getTSu()
const {
1147 if (getFEMethod()->ts_u == PETSC_NULL)
1150 return getFEMethod()->ts_u;
1153 Vec ForcesAndSourcesCore::UserDataOperator::getTSu_t()
const {
1155 if (getFEMethod()->ts_u_t == PETSC_NULL)
1158 return getFEMethod()->ts_u_t;
1161 Vec ForcesAndSourcesCore::UserDataOperator::getTSu_tt()
const {
1163 if (getFEMethod()->ts_u_tt == PETSC_NULL)
1166 return getFEMethod()->ts_u_tt;
1169 Vec ForcesAndSourcesCore::UserDataOperator::getTSf()
const {
1171 if (getFEMethod()->ts_F == PETSC_NULL)
1174 return getFEMethod()->ts_F;
1177 Mat ForcesAndSourcesCore::UserDataOperator::getTSA()
const {
1179 if (getFEMethod()->ts_A == PETSC_NULL)
1182 return getFEMethod()->ts_A;
1185 Mat ForcesAndSourcesCore::UserDataOperator::getTSB()
const {
1187 if (getFEMethod()->ts_B == PETSC_NULL)
1190 return getFEMethod()->ts_B;
1193 int ForcesAndSourcesCore::UserDataOperator::getTSstep()
const {
1195 if ((getFEMethod()->data_ctx & PetscData::PetscData::CtxSetTime).none())
1198 return getFEMethod()->ts_step;
1201 double ForcesAndSourcesCore::UserDataOperator::getTStime()
const {
1203 if ((getFEMethod()->data_ctx & PetscData::PetscData::CtxSetTime).none())
1206 return getFEMethod()->ts_t;
1209 double ForcesAndSourcesCore::UserDataOperator::getTStimeStep()
const {
1211 if ((getFEMethod()->data_ctx & PetscData::PetscData::CtxSetTime).none())
1214 return getFEMethod()->ts_dt;
1217 double ForcesAndSourcesCore::UserDataOperator::getTSa()
const {
1219 if ((getFEMethod()->data_ctx & (PetscData::CtxSetA | PetscData::CtxSetB))
1221 (getFEMethod()->data_ctx & (PetscData::CtxSetX_T)).none())
1224 return getFEMethod()->ts_a;
1227 double ForcesAndSourcesCore::UserDataOperator::getTSaa()
const {
1229 if ((getFEMethod()->data_ctx & (PetscData::CtxSetA | PetscData::CtxSetB))
1231 (getFEMethod()->data_ctx & (PetscData::CtxSetX_TT)).none())
1234 return getFEMethod()->ts_aa;
1241 auto ForcesAndSourcesCore::UserDataOperator::getFTensor0IntegrationWeight() {
1243 &(getGaussPts()(getGaussPts().size1() - 1, 0)));
1257 ForcesAndSourcesCore::UserDataOperator::getSidePtrFE()
const {
1262 ForcesAndSourcesCore::UserDataOperator::getRefinePtrFE()
const {
1266 MatrixDouble &ForcesAndSourcesCore::UserDataOperator::getCoordsAtGaussPts() {
1270 auto ForcesAndSourcesCore::UserDataOperator::getFTensor1CoordsAtGaussPts() {
1272 &getCoordsAtGaussPts()(0, 0), &getCoordsAtGaussPts()(0, 1),
1273 &getCoordsAtGaussPts()(0, 2));
1276 double ForcesAndSourcesCore::UserDataOperator::getMeasure()
const {
1280 double &ForcesAndSourcesCore::UserDataOperator::getMeasure() {
1290 template <
typename E>
1296 const int side_dim, boost::shared_ptr<Range> fe_range,
1298 boost::shared_ptr<AdjCache> adj_cache =
nullptr)
1300 sideFEName(fe_name), sideDim(side_dim), sevLevel(sev),
1301 adjCache(adj_cache), feRange(fe_range) {}
1315 boost::shared_ptr<AdjCache> adj_cache =
nullptr)
1316 :
OpLoopSide(m_field, fe_name, side_dim, nullptr, sev, adj_cache) {}
1320 return loopSide(sideFEName, sideFEPtr.get(), sideDim, 0, feRange,
VERBOSE,
1321 sevLevel, adjCache.get());
1325 return sideFEPtr->getOpPtrVector();
1354 #endif //__FORCES_AND_SOURCES_CORE__HPP__