v0.15.0
Loading...
Searching...
No Matches
Classes | Namespaces | Macros | Typedefs
ProblemsMultiIndices.hpp File Reference

Multi-index containers, data structures for problems and other low-level functions. More...

Go to the source code of this file.

Classes

struct  MoFEM::ComposedProblemsData
 
struct  MoFEM::Problem
 keeps basic data about problem More...
 
struct  MoFEM::Problem::SubProblemData
 Subproblem problem data. More...
 
struct  MoFEM::ProblemChangeRefLevelBitAdd
 add ref level to problem More...
 
struct  MoFEM::ProblemChangeRefLevelBitSet
 set ref level to problem More...
 
struct  MoFEM::ProblemChangeRefLevelBitDofMaskSet
 set prof dof bit ref mask More...
 
struct  MoFEM::ProblemFiniteElementChangeBitAdd
 add finite element to problem More...
 
struct  MoFEM::ProblemChangeRefLevelBitDofMaskAdd
 set prof dof bit ref mask More...
 
struct  MoFEM::ProblemFiniteElementChangeBitUnSet
 remove finite element from problem More...
 
struct  MoFEM::ProblemZeroNbRowsChange
 zero nb. of DOFs in row More...
 
struct  MoFEM::ProblemZeroNbColsChange
 zero nb. of DOFs in col More...
 
struct  MoFEM::ProblemClearNumeredFiniteElementsChange
 clear problem finite elements More...
 
struct  MoFEM::ProblemClearSubProblemData
 Clear sub-problem data structure. More...
 
struct  MoFEM::ProblemClearComposedProblemData
 Clear composed problem data structure. More...
 

Namespaces

namespace  MoFEM
 implementation of Data Operators for Forces and Sources
 

Macros

#define _IT_NUMEREDDOF_ROW_FOR_LOOP_(PROBLEMPTR, IT)
 use with loops to iterate row DOFs
 
#define _IT_NUMEREDDOF_COL_FOR_LOOP_(PROBLEMPTR, IT)
 
#define _IT_NUMEREDDOF_ROW_BY_LOCIDX_FOR_LOOP_(PROBLEMPTR, IT)
 use with loops to iterate row DOFs
 
#define _IT_NUMEREDDOF_COL_BY_LOCIDX_FOR_LOOP_(PROBLEMPTR, IT)
 use with loops to iterate col DOFs
 
#define _IT_NUMEREDDOF_ROW_BY_ENT_FOR_LOOP_(PROBLEMPTR, ENT, IT)
 use with loops to iterate row DOFs
 
#define _IT_NUMEREDDOF_COL_BY_ENT_FOR_LOOP_(PROBLEMPTR, ENT, IT)
 use with loops to iterate col DOFs
 
#define _IT_NUMEREDDOF_ROW_BY_BITNUMBER_FOR_LOOP_(PROBLEMPTR, FIELD_BIT_NUMBER, IT)
 
#define _IT_NUMEREDDOF_COL_BY_BITNUMBER_FOR_LOOP_(PROBLEMPTR, FIELD_BIT_NUMBER, IT)
 use with loops to iterate col DOFs
 

Typedefs

using MoFEM::BlockFieldPair = Problem::BlockFieldPair
 
using MoFEM::EmptyFieldBlocks = Problem::EmptyFieldBlocks
 
typedef multi_index_container< Problem, indexed_by< ordered_unique< tag< Meshset_mi_tag >, member< Problem, EntityHandle, &Problem::meshset > >, hashed_unique< tag< BitProblemId_mi_tag >, const_mem_fun< Problem, BitProblemId, &Problem::getId >, HashBit< BitProblemId >, EqBit< BitProblemId > >, hashed_unique< tag< Problem_mi_tag >, const_mem_fun< Problem, std::string, &Problem::getName > > > > Problem_multiIndex
 MultiIndex for entities for Problem.
 

Detailed Description

Multi-index containers, data structures for problems and other low-level functions.

Definition in file ProblemsMultiIndices.hpp.

Macro Definition Documentation

◆ _IT_NUMEREDDOF_COL_BY_LOCIDX_FOR_LOOP_

#define _IT_NUMEREDDOF_COL_BY_LOCIDX_FOR_LOOP_ (   PROBLEMPTR,
  IT 
)
Value:
NumeredDofEntityByUId::iterator IT = \
PROBLEMPTR->getNumeredColDofsByLocIdxBegin(0); \
IT != PROBLEMPTR->getNumeredColDofsByLocIdxEnd( \
PROBLEMPTR->getNbLocalDofsRow() - 1); \
IT++
constexpr IntegrationType IT

use with loops to iterate col DOFs

...
}
#define _IT_NUMEREDDOF_COL_BY_LOCIDX_FOR_LOOP_(PROBLEMPTR, IT)
use with loops to iterate col DOFs

Definition at line 239 of file ProblemsMultiIndices.hpp.

247 {
248 return numeredRowDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(locidx);
249 }
250
251 /// get end iterator for numeredRowDofsPtr (insted you can use
252 /// #_IT_NUMEREDDOF_ROW_FOR_LOOP_ for loops)
253 auto getNumeredRowDofsByLocIdxEnd(const DofIdx locidx) const {
254 return numeredRowDofsPtr->get<PetscLocalIdx_mi_tag>().upper_bound(locidx);
255 }
256
257 /// get begin iterator for numeredColDofsPtr (insted you can use
258 /// #_IT_NUMEREDDOF_COL_FOR_LOOP_ for loops)
259 auto getNumeredColDofsByLocIdxBegin(const DofIdx locidx) const {
260 return numeredColDofsPtr->get<PetscLocalIdx_mi_tag>().lower_bound(locidx);
261 }
262
263 /// get end iterator for numeredColDofsPtr (insted you can use
264 /// #_IT_NUMEREDDOF_COL_FOR_LOOP_ for loops)
265 auto getNumeredColDofsByLocIdxEnd(const DofIdx locidx) const {
266 return numeredColDofsPtr->get<PetscLocalIdx_mi_tag>().upper_bound(locidx);
267 }
268
269/**
270 * \brief use with loops to iterate row DOFs
271 * \ingroup problems_multi_indices
272 *
273 * \code
274 * for(_IT_NUMEREDDOF_BY_ENT_ROW_FOR_LOOP_(PROBLEMPTR,ENT,IT)) {
275 * ...
276 * }
277 * \endcode
278 *
279 */
280#define _IT_NUMEREDDOF_ROW_BY_ENT_FOR_LOOP_(PROBLEMPTR, ENT, IT) \
281 auto IT = PROBLEMPTR->getNumeredRowDofsByEntBegin(ENT); \
282 IT != PROBLEMPTR->getNumeredRowDofsByEntEnd(ENT); \
283 IT++
284
285/**
286 * \brief use with loops to iterate col DOFs
287 * \ingroup problems_multi_indices
288 *
289 * \code
290 * for(_IT_NUMEREDDOF_COL_BY_ENT_FOR_LOOP_(PROBLEMPTR,ENT,IT)) {
291 * ...
292 * }
293 * \endcode
294 *
295 */
296#define _IT_NUMEREDDOF_COL_BY_ENT_FOR_LOOP_(PROBLEMPTR, ENT, IT) \
297 auto IT = PROBLEMPTR->getNumeredColDofsByEntBegin(ENT); \
298 IT != PROBLEMPTR->getNumeredColDofsByEntEnd(ENT); \
299 IT++
300
301 /// get begin iterator for numeredRowDofsPtr (insted you can use
302 /// #_IT_NUMEREDDOF_ROW_BY_ENT_FOR_LOOP_ for loops)
303 auto getNumeredRowDofsByEntBegin(const EntityHandle ent) const {
304 return numeredRowDofsPtr->get<Ent_mi_tag>().lower_bound(ent);
305 }
306
307 /// get end iterator for numeredRowDofsPtr (insted you can use
308 /// #_IT_NUMEREDDOF_ROW_BY_ENT_FOR_LOOP_ for loops)
309 auto getNumeredRowDofsByEntEnd(const EntityHandle ent) const {
310 return numeredRowDofsPtr->get<Ent_mi_tag>().upper_bound(ent);
311 }
312
313 /// get begin iterator for numeredColDofsPtr (insted you can use
314 /// #_IT_NUMEREDDOF_COL_BY_ENT_FOR_LOOP_ for loops)
315 auto getNumeredColDofsByEntBegin(const EntityHandle ent) const {
316 return numeredColDofsPtr->get<Ent_mi_tag>().lower_bound(ent);
317 }
318
319 /// get end iterator for numeredColDofsPtr (insted you can use
320 /// #_IT_NUMEREDDOF_COL_BY_ENT_FOR_LOOP_ for loops)
321 auto getNumeredColDofsByEntEnd(const EntityHandle ent) const {
322 return numeredColDofsPtr->get<Ent_mi_tag>().upper_bound(ent);
323 }
324
325/**
326 * use with loops to iterate row DOFs
327 * \ingroup problems_multi_indices
328 *
329 * \code
330 * for(_IT_NUMEREDDOF_BY_NAME_ROW_FOR_LOOP_(PROBLEMPTR,m_field.get_field_bit_number(FIELD_BIT_NUMBER),IT))
331 * {
332 * ...
333 * }
334 * \endcode
335 *
336 */
337#define _IT_NUMEREDDOF_ROW_BY_BITNUMBER_FOR_LOOP_(PROBLEMPTR, \
338 FIELD_BIT_NUMBER, IT) \
339 auto IT = PROBLEMPTR->numeredRowDofsPtr->lower_bound( \
340 FieldEntity::getLoBitNumberUId(FIELD_BIT_NUMBER)); \
341 IT != PROBLEMPTR->numeredRowDofsPtr->upper_bound( \
342 FieldEntity::getHiBitNumberUId(FIELD_BIT_NUMBER)); \
343 IT++
344
345/**
346 * \brief use with loops to iterate col DOFs
347 * \ingroup problems_multi_indices
348 *
349 * \code
350 * for(_IT_NUMEREDDOF_COL_BY_BITNUMBER_FOR_LOOP_(PROBLEMPTR,m_field.get_field_bit_number(FIELD_BIT_NUMBER),IT))
351 * {
352 * ...
353 * }
354 * \endcode
355 *
356 */
357#define _IT_NUMEREDDOF_COL_BY_BITNUMBER_FOR_LOOP_(PROBLEMPTR, \
358 FIELD_BIT_NUMBER, IT) \
359 auto IT = PROBLEMPTR->numeredColDofsPtr->lower_bound( \
360 FieldEntity::getLoBitNumberUId(FIELD_BIT_NUMBER)); \
361 IT != PROBLEMPTR->numeredColDofsPtr->upper_bound( \
362 FieldEntity::getHiBitNumberUId(FIELD_BIT_NUMBER)); \
363 IT++
364
365 Problem(Interface &moab, const EntityHandle meshset);
366
367 virtual ~Problem() = default;
368
369 inline BitProblemId getId() const { return *((BitProblemId *)tagId); }
370
371 inline auto getName() const {
372 return std::string((char *)tagName, tagNameSize);
373 }
374
375 inline DofIdx getNbDofsRow() const { return nbDofsRow; }
376 inline DofIdx getNbDofsCol() const { return nbDofsCol; }
377 inline DofIdx getNbLocalDofsRow() const { return nbLocDofsRow; }
378 inline DofIdx getNbLocalDofsCol() const { return nbLocDofsCol; }
379 inline DofIdx getNbGhostDofsRow() const { return nbGhostDofsRow; }
380 inline DofIdx getNbGhostDofsCol() const { return nbGhostDofsCol; }
381
382 inline BitRefLevel getBitRefLevel() const { return *tagBitRefLevel; }
383 inline BitRefLevel getBitRefLevelMask() const { return *tagBitRefLevelMask; }
384
385 // DEPRECATED inline BitRefLevel getMaskBitRefLevel() const {
386 // return *tagBitRefLevelMask;
387 // }
388
389 /**
390 * @brief Get the Row Dofs By Petsc Global Dof Idx object
391 *
392 * @param idx
393 * @param dof_ptr
394 * @param bh
395 * @return MoFEMErrorCode
396 */
397 MoFEMErrorCode getRowDofsByPetscGlobalDofIdx(DofIdx idx,
398 const NumeredDofEntity **dof_ptr,
399 MoFEMTypes bh = MF_EXIST) const;
400
401 /**
402 * @brief Get the Col Dofs By Petsc Global Dof Idx object
403 *
404 * @param idx
405 * @param dof_ptr
406 * @param bh
407 * @return MoFEMErrorCode
408 */
409 MoFEMErrorCode getColDofsByPetscGlobalDofIdx(DofIdx idx,
410 const NumeredDofEntity **dof_ptr,
411 MoFEMTypes bh = MF_EXIST) const;
412
413 /**
414 * @brief Get the Row Dofs By Petsc Global Dof Idx object
415 *
416 * @param idx
417 * @return boost::weak_ptr<NumeredDofEntity>
418 */
419 boost::weak_ptr<NumeredDofEntity>
420 getRowDofsByPetscGlobalDofIdx(DofIdx idx) const;
421
422 /**
423 * @brief Get the Col Dofs By Petsc Global Dof Idx object
424 *
425 * @param idx
426 * @return boost::weak_ptr<NumeredDofEntity>
427 */
428 boost::weak_ptr<NumeredDofEntity>
429 getColDofsByPetscGlobalDofIdx(DofIdx idx) const;
430
431 /**
432 * @brief Get the BitFEIDs in problem
433 * @return BitFEId
434 */
435 BitFEId getBitFEId() const;
436
437 friend std::ostream &operator<<(std::ostream &os, const Problem &e);
438
439 /**
440 * \brief Get number of finite elements by name on processors
441 *
442 * Size retuned IS is equal to size of processors.
443 *
444 * What PetscLayout see,
445 <http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/IS/index.html>
446 *
447 * Example of usage for layout
448 * \code
449
450 PetscInt rstart, rend;
451 ierr = PetscLayoutGetRange(layout, &rstart, &rend); CHKERRG(ierr);
452 int global_size;
453 ierr = PetscLayoutGetSize(layout,&global_size); CHKERRG(ierr);
454
455 \endcode
456 *
457 * @param comm Communicator
458 * @param name Finite element name
459 * @param layout Get number of elements on each processor
460 * @return error code
461 */
462 MoFEMErrorCode getNumberOfElementsByNameAndPart(MPI_Comm comm,
463 const std::string name,
464 PetscLayout *layout) const;
465
466 /**
467 * \brief Get number of finite elements on processors
468 *
469 * Size retuned IS is equal to size of processors.
470 *
471 * What PetscLayout see,
472 <http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/IS/index.html>
473 *
474 * Example of usage for layout
475 * \code
476
477 PetscInt rstart, rend;
478 ierr = PetscLayoutGetRange(layout, &rstart, &rend); CHKERRG(ierr);
479 int global_size;
480 ierr = PetscLayoutGetSize(layout,&global_size); CHKERRG(ierr);
481
482 \endcode
483 *
484 * @param comm Communicator
485 * @param layout Get number of elements on each processor
486 * @return error code
487 */
488 MoFEMErrorCode getNumberOfElementsByPart(MPI_Comm comm,
489 PetscLayout *layout) const;
490
491 typedef multi_index_container<boost::weak_ptr<std::vector<NumeredDofEntity>>,
492 indexed_by<sequenced<>>>
493 SequenceDofContainer;
494
495 /**
496 * \brief Get reference to sequence data numbered dof container
497 *
498 * In sequence data container data are physically stored. The purpose of this
499 * is to allocate NumeredDofEntity data in bulk, having only one allocation
500 instead
501 * each time entity is inserted. That makes code efficient.
502 *
503 * The vector in sequence is destroyed if last entity inside that vector is
504 * destroyed. All MoFEM::NumeredDofEntity have aliased shared_ptr which points
505 to the vector.
506
507 * @return MoFEM::Problem::SequenceDofContainer
508 */
509 inline auto &getRowDofsSequence() const { return sequenceRowDofContainer; }
510
511 /**
512 * \brief Get reference to sequence data numbered dof container
513 *
514 * In sequence data container data are physically stored. The purpose of this
515 * is to allocate NumeredDofEntity data in bulk, having only one allocation
516 instead
517 * each time entity is inserted. That makes code efficient.
518 *
519 * The vector in sequence is destroyed if last entity inside that vector is
520 * destroyed. All MoFEM::NumeredDofEntity have aliased shared_ptr which points
521 to the vector.
522
523 * @return MoFEM::Problem::SequenceDofContainer
524 */
525 inline auto &getColDofsSequence() const { return sequenceColDofContainer; }
526
527 using BlockFieldPair = std::pair<BitFieldId, BitFieldId>;
528 using EmptyFieldBlocks = std::vector<BlockFieldPair>;
529
530 /**
531 * @brief Get the empty field blocks
532 *
533 * Emtpy field blocks is a pair contains IDs of the fields for which matrix
534 * has zero entries.
535 *
536 * @return EmptyFieldBlocks&
537 */
538 inline EmptyFieldBlocks &getEmptyFieldBlocks() const {
539 return emptyFieldBlocks;
540 }
541
542 /**
543 * @brief Add fields to the empty field blocks
544 *
545 * Emtpy field blocks is a pair contains IDs of the fields for which matrix
546 * has zero entries.
547 *
548 * @param add_fields
549 * @return EmptyFieldBlocks&
550 */
551 inline BlockFieldPair &
552 addFieldToEmptyFieldBlocks(const BlockFieldPair add_fields) const {
553 emptyFieldBlocks.push_back(add_fields);
554 return emptyFieldBlocks.back();
555 }
556
557private:
558 // Keep vector of DoFS on entity
559 mutable boost::shared_ptr<SequenceDofContainer> sequenceRowDofContainer;
560 mutable boost::shared_ptr<SequenceDofContainer> sequenceColDofContainer;
561
562 mutable EmptyFieldBlocks emptyFieldBlocks;
563};
564
565using BlockFieldPair = Problem::BlockFieldPair;
566using EmptyFieldBlocks = Problem::EmptyFieldBlocks;
567
568/**
569 * \brief Subproblem problem data
570 */
571struct Problem::SubProblemData {
572
573 SmartPetscObj<IS>
574 rowIs; ///< indices of main problem of which sub problem is this
575 SmartPetscObj<IS>
576 colIs; ///< indices of main problem of which sub problem is this
577 SmartPetscObj<AO>
578 rowMap; ///< mapping form main problem indices to sub-problem indices
579 SmartPetscObj<AO>
580 colMap; ///< mapping form main problem indices to sub-problem indices
581
582 inline auto getSmartRowIs() { return rowIs; }
583 inline auto getSmartColIs() { return colIs; }
584 inline auto getSmartRowMap() { return rowMap; }
585 inline auto getSmartColMap() { return colMap; }
586
587 /**
588 * get row Is for sub problem
589 * @param is create is
590 * @return error code
591 */
592 inline MoFEMErrorCode getRowIs(IS *is) {
594 *is = rowIs;
595 PetscObjectReference((PetscObject)(*is));
597 }
598
599 /**
600 * get col Is for sub problem
601 * @param is create is
602 * @return error code
603 */
604 inline MoFEMErrorCode getColIs(IS *is) {
606 *is = colIs;
607 PetscObjectReference((PetscObject)(*is));
609 };
610
611 /**
612 * get row AO mapping for sub problem
613 * @param ao get mapping
614 * @return error code
615 */
616 inline MoFEMErrorCode getRowMap(AO *ao) {
618 *ao = rowMap;
619 PetscObjectReference((PetscObject)(*ao));
621 }
622
623 /**
624 * get col AO mapping for sub problem
625 * @param ao get mapping
626 * @return error code
627 */
628 inline MoFEMErrorCode getColMap(AO *ao) {
630 *ao = colMap;
631 PetscObjectReference((PetscObject)(*ao));
633 }
634
635 SubProblemData() = default;
636 virtual ~SubProblemData() = default;
637};
638
639using EmptyFieldBlocks = Problem::EmptyFieldBlocks;
640
641/**
642 * @relates multi_index_container
643 * \brief MultiIndex for entities for Problem
644 * \ingroup fe_multi_indices
645 */
646typedef multi_index_container<
647 Problem,
648 indexed_by<
649 ordered_unique<tag<Meshset_mi_tag>,
650 member<Problem, EntityHandle, &Problem::meshset>>,
651 hashed_unique<tag<BitProblemId_mi_tag>,
652 const_mem_fun<Problem, BitProblemId, &Problem::getId>,
653 HashBit<BitProblemId>, EqBit<BitProblemId>>,
654 hashed_unique<tag<Problem_mi_tag>,
655 const_mem_fun<Problem, std::string, &Problem::getName>>>>
657
658/** \brief add ref level to problem
659 * \ingroup problems_multi_indices
660 */
661struct ProblemChangeRefLevelBitAdd {
663 ProblemChangeRefLevelBitAdd(const BitRefLevel _bit) : bit(_bit){};
664 void operator()(Problem &p) { *(p.tagBitRefLevel) |= bit; };
665};
666
667/** \brief set ref level to problem
668 * \ingroup problems_multi_indices
669 */
670struct ProblemChangeRefLevelBitSet {
672 ProblemChangeRefLevelBitSet(const BitRefLevel _bit) : bit(_bit){};
673 void operator()(Problem &p) { *(p.tagBitRefLevel) = bit; };
674};
675
676/** \brief set prof dof bit ref mask
677 * \ingroup problems_multi_indices
678 */
679struct ProblemChangeRefLevelBitDofMaskSet {
681 ProblemChangeRefLevelBitDofMaskSet(const BitRefLevel _bit) : bit(_bit){};
682 void operator()(Problem &p) { *(p.tagBitRefLevelMask) = bit; };
683};
684
685/** \brief add finite element to problem
686 * \ingroup problems_multi_indices
687 */
688struct ProblemFiniteElementChangeBitAdd {
689 BitFEId f_id;
690 ProblemFiniteElementChangeBitAdd(const BitFEId _f_id) : f_id(_f_id){};
691 void operator()(Problem &p);
692};
693
694/** \brief set prof dof bit ref mask
695 * \ingroup problems_multi_indices
696 */
697struct ProblemChangeRefLevelBitDofMaskAdd {
699 ProblemChangeRefLevelBitDofMaskAdd(const BitRefLevel _bit) : bit(_bit){};
700 void operator()(Problem &p) { *(p.tagBitRefLevelMask) |= bit; };
701};
702
703/** \brief remove finite element from problem
704 * \ingroup problems_multi_indices
705 */
706struct ProblemFiniteElementChangeBitUnSet {
707 BitFEId f_id;
708 ProblemFiniteElementChangeBitUnSet(const BitFEId _f_id) : f_id(_f_id){};
709 void operator()(Problem &p);
710};
711
712/** \brief zero nb. of DOFs in row
713 * \ingroup problems_multi_indices
714 */
715struct ProblemZeroNbRowsChange {
716 void operator()(Problem &e);
717};
718
719/** \brief zero nb. of DOFs in col
720 * \ingroup problems_multi_indices
721 */
722struct ProblemZeroNbColsChange {
723 void operator()(Problem &e);
724};
725
726/** \brief clear problem finite elements
727 * \ingroup problems_multi_indices
728 */
729struct ProblemClearNumeredFiniteElementsChange {
730 void operator()(Problem &e);
731};
732
733/**
734 * \brief Clear sub-problem data structure
735 */
736struct ProblemClearSubProblemData {
737 void operator()(Problem &e) { e.subProblemData.reset(); }
738};
739
740/**
741 * \brief Clear composed problem data structure
742 */
743struct ProblemClearComposedProblemData {
744 void operator()(Problem &e) { e.composedProblemsData.reset(); }
745};
746
747inline MoFEMErrorCode
748ComposedProblemsData::getRowIs(IS *is, const unsigned int pp) const {
750 if (pp <= rowIs.size()) {
751 SETERRQ(PETSC_COMM_WORLD, MOFEM_INVALID_DATA, "Exceed size of array pp<%ld",
752 rowIs.size());
753 }
754 *is = rowIs[pp].get();
755 PetscObjectReference((PetscObject)(*is));
757}
758
759inline MoFEMErrorCode
760ComposedProblemsData::getColIs(IS *is, const unsigned int pp) const {
762 if (pp <= colIs.size()) {
763 SETERRQ(PETSC_COMM_WORLD, MOFEM_INVALID_DATA, "Exceed size of array pp<%ld",
764 colIs.size());
765 }
766 *is = colIs[pp].get();
767 PetscObjectReference((PetscObject)(*is));
769}
770
771} // namespace MoFEM
772
773#endif //__PROBLEMSMULTIINDICES_HPP__
774
775/**
776 * \defgroup problems_multi_indices Problems structures and multi-indices
777 * \ingroup mofem
778 ******************************************************************************/
MoFEMTypes
Those types control how functions respond on arguments, f.e. error handling.
@ MF_EXIST
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ MOFEM_INVALID_DATA
Definition definitions.h:36
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
multi_index_container< Problem, indexed_by< ordered_unique< tag< Meshset_mi_tag >, member< Problem, EntityHandle, &Problem::meshset > >, hashed_unique< tag< BitProblemId_mi_tag >, const_mem_fun< Problem, BitProblemId, &Problem::getId >, HashBit< BitProblemId >, EqBit< BitProblemId > >, hashed_unique< tag< Problem_mi_tag >, const_mem_fun< Problem, std::string, &Problem::getName > > > > Problem_multiIndex
MultiIndex for entities for Problem.
auto bit
set bit
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
std::bitset< BITFEID_SIZE > BitFEId
Finite element Id.
Definition Types.hpp:43
int DofIdx
Index of DOF.
Definition Types.hpp:18
std::bitset< BITPROBLEMID_SIZE > BitProblemId
Problem Id.
Definition Types.hpp:44
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Definition Types.hpp:40
std::ostream & operator<<(std::ostream &os, const EntitiesFieldData::EntData &e)
Problem::EmptyFieldBlocks EmptyFieldBlocks
Problem::BlockFieldPair BlockFieldPair