35#ifndef enrichmentitem_h
36#define enrichmentitem_h
48#include <unordered_map>
53#define _IFT_EnrichmentItem_domains "enrichmentdomains"
54#define _IFT_EnrichmentItem_domain "enrichmentdomain"
55#define _IFT_EnrichmentItem_function "enrichmentfunction"
56#define _IFT_EnrichmentItem_front "enrichmentfront"
57#define _IFT_EnrichmentItem_propagationlaw "propagationlaw"
59#define _IFT_EnrichmentItem_inheritbc "inheritbc"
60#define _IFT_EnrichmentItem_inheritorderedbc "inheritorderedbc"
66class EnrichmentFunction;
67class EnrichmentDomain;
69class FailureCriteriaStatus;
70class EnrichmentDomain_BG;
74class LinElBranchFunction;
76class DynamicDataReader;
78class GnuplotExportModule;
127 {
OOFEM_ERROR(
"This function must be called with DynamicDataReader as input."); }
131 int giveNumberOfEnrDofs()
const;
136 bool isElementEnriched(
const Element *element)
const;
137 inline bool isDofManEnriched(
const DofManager &iDMan)
const;
138 int giveNumDofManEnrichments(
const DofManager &iDMan)
const;
160 virtual int giveDofPoolSize()
const;
164 virtual void computeEnrichedDofManDofIdArray(
IntArray &oDofIdArray,
DofManager &iDMan);
166 virtual void giveEIDofIdArray(
IntArray &answer)
const;
167 virtual void givePotentialEIDofIdArray(
IntArray &answer)
const;
220 void setPropagationLaw(std::unique_ptr<PropagationLaw> ipPropagationLaw);
232 void setEnrichmentFrontStart(std::unique_ptr<EnrichmentFront> ipEnrichmentFrontStart,
bool iDeleteOld =
true);
235 void setEnrichmentFrontEnd(std::unique_ptr<EnrichmentFront> ipEnrichmentFrontEnd,
bool iDeleteOld =
true);
237 bool tipIsTouchingEI(
const TipInfo &iTipInfo);
304inline bool EnrichmentItem :: isDofManEnriched(
const DofManager &iDMan)
const
int giveGlobalNumber() const
bool mLevelSetsNeedUpdate
virtual bool hasInitiationCriteria()
bool evalNodeEnrMarkerInNode(double &oNodeEnrMarker, int iNodeInd) const
void setEnrichmentFunction(std::unique_ptr< EnrichmentFunction > ipEnrichmentFunc)
static const double mLevelSetRelTol
virtual void propagateFronts(bool &oFrontsHavePropagated)=0
static const double mLevelSetTol
EnrichmentFront * giveEnrichmentFrontStart()
int mEnrFrontIndex
mEnrFrontIndex: nonzero if an enrichment front is present, zero otherwise.
virtual void evalLevelSetNormal(double &oLevelSet, const FloatArray &iGlobalCoord, const FloatArray &iN, const IntArray &iNodeInd) const =0
std::unique_ptr< EnrichmentFront > mpEnrichmentFrontEnd
virtual int instanciateYourself(DataReader &dr)=0
std ::unordered_map< int, NodeEnrichmentType > mNodeEnrMarkerMap
bool evalLevelSetTangInNode(double &oLevelSet, int iNodeInd, const FloatArray &iGlobalCoord) const
virtual void evaluateEnrFuncAt(std ::vector< double > &oEnrFunc, const FloatArray &iGlobalCoord, const FloatArray &iLocalCoord, int iNodeInd, const Element &iEl, const FloatArray &iN, const IntArray &iElNodes) const =0
virtual void appendInputRecords(DynamicDataReader &oDR)=0
virtual void updateNodeEnrMarker(XfemManager &ixFemMan)=0
virtual void updateGeometry()=0
virtual void evaluateEnrFuncInNode(std ::vector< double > &oEnrFunc, const Node &iNode) const =0
virtual void evaluateEnrFuncDerivAt(std ::vector< FloatArray > &oEnrFuncDeriv, const FloatArray &iGlobalCoord, const FloatArray &iLocalCoord, int iNodeInd, const Element &iEl, const FloatArray &iN, const FloatMatrix &idNdX, const IntArray &iElNodes) const =0
std::unique_ptr< EnrichmentFront > mpEnrichmentFrontStart
std::unique_ptr< EnrichmentFunction > mpEnrichmentFunc
virtual void evaluateEnrFuncDerivAt(std ::vector< FloatArray > &oEnrFuncDeriv, const FloatArray &iGlobalCoord, const FloatArray &iLocalCoord, int iNodeInd, const Element &iEl) const =0
int mPropLawIndex
mPropLawIndex: nonzero if a propagation law is present, zero otherwise.
std::shared_ptr< InputRecord > thisIr
std ::unordered_map< int, double > mLevelSetTangDirMap
virtual void updateGeometry(TimeStep *tStep)
const std ::unordered_map< int, NodeEnrichmentType > & giveEnrNodeMap() const
std ::unordered_map< int, double > mLevelSetNormalDirMap
const IntArray * giveEnrichesDofsWithIdArray() const
virtual void evalGradLevelSetNormal(FloatArray &oGradLevelSet, const FloatArray &iGlobalCoord, const FloatMatrix &idNdX, const IntArray &iNodeInd) const =0
int giveStartOfDofIdPool() const
IntArray mpEnrichesDofsWithIdArray
Geometry associated with EnrichmentItem.
std::unique_ptr< PropagationLaw > mpPropagationLaw
virtual void updateGeometry(FailureCriteriaStatus *fc, TimeStep *tStep)
void initializeFrom(InputRecord &ir) override
virtual bool hasPropagatingFronts() const
virtual void giveBoundingSphere(FloatArray &oCenter, double &oRadius)=0
static double calcXiZeroLevel(const double &iQ1, const double &iQ2)
virtual void evaluateEnrFuncAt(std ::vector< double > &oEnrFunc, const FloatArray &iGlobalCoord, const FloatArray &iLocalCoord, int iNodeInd, const Element &iEl) const =0
virtual bool giveElementTipCoord(FloatArray &oCoord, double &oArcPos, Element &iEl, const FloatArray &iElCenter) const =0
void giveInputRecord(DynamicInputRecord &input) override
EnrichmentFront * giveEnrichmentFrontEnd()
EnrichmentItem(int n, XfemManager *xm, Domain *aDomain)
Constructor / destructor.
bool evalLevelSetNormalInNode(double &oLevelSet, int iNodeInd, const FloatArray &iGlobalCoord) const
virtual void createEnrichedDofs()
PropagationLaw * givePropagationLaw()
virtual void writeVtkDebug() const
bool mInheritBoundaryConditions
int giveEndOfDofIdPool() const
const double mLevelSetTol2
virtual bool canModifyMaterial() const
virtual void evalLevelSetTangential(double &oLevelSet, const FloatArray &iGlobalCoord, const FloatArray &iN, const IntArray &iNodeInd) const =0
bool mInheritOrderedBoundaryConditions
static void calcPolarCoord(double &oR, double &oTheta, const FloatArray &iOrigin, const FloatArray &iPos, const FloatArray &iN, const FloatArray &iT, const EfInput &iEfInput, bool iFlipTangent)
FEMComponent(int n, Domain *d)
@ NodeEnr_START_AND_END_TIP