OOFEM 3.0
Loading...
Searching...
No Matches
enrichmentfrontcohesivebranchfunconeel.C
Go to the documentation of this file.
1/*
2 * enrichmentfrontcohesivebranchfunconeel.C
3 *
4 * Created on: Nov 28, 2014
5 * Author: svennine
6 */
7
10#include "classfactory.h"
11#include "xfem/xfemmanager.h"
12#include "domain.h"
13#include "connectivitytable.h"
14#include "spatiallocalizer.h"
15#include "element.h"
16#include "gausspoint.h"
17#include "mathfem.h"
18
19namespace oofem {
25
27
28
29void EnrFrontCohesiveBranchFuncOneEl :: MarkNodesAsFront(std :: unordered_map< int, NodeEnrichmentType > &ioNodeEnrMarkerMap, XfemManager &ixFemMan, const std :: unordered_map< int, double > &iLevelSetNormalDirMap, const std :: unordered_map< int, double > &iLevelSetTangDirMap, const TipInfo &iTipInfo)
30{
31 MarkTipElementNodesAsFront(ioNodeEnrMarkerMap, ixFemMan, iLevelSetNormalDirMap, iLevelSetTangDirMap, iTipInfo);
32}
33
34int EnrFrontCohesiveBranchFuncOneEl :: giveNumEnrichments(const DofManager &iDMan) const
35{
36 return 1;
37}
38
39void EnrFrontCohesiveBranchFuncOneEl :: evaluateEnrFuncAt(std :: vector< double > &oEnrFunc, const EfInput &iEfInput) const
40{
41 FloatArray xTip = Vec2(
42 mTipInfo.mGlobalCoord.at(1), mTipInfo.mGlobalCoord.at(2)
43 );
44
45 FloatArray pos = Vec2(
46 iEfInput.mPos.at(1), iEfInput.mPos.at(2)
47 );
48
49 // Crack tangent and normal
50 FloatArray t, n;
51 bool flipTangent = false;
52 computeCrackTangent(t, n, flipTangent, iEfInput);
53
54 double r = 0.0, theta = 0.0;
55 EnrichmentItem :: calcPolarCoord(r, theta, xTip, pos, n, t, iEfInput, flipTangent);
56
57 mpBranchFunc.evaluateEnrFuncAt(oEnrFunc, r, theta);
58
59#ifdef DEBUG
60 for ( double val:oEnrFunc ) {
61 if ( !std :: isfinite(val) ) {
62 printf("r: %e theta: %e\n", r, theta);
63 OOFEM_ERROR("!std::isfinite(val)")
64 }
65 }
66#endif
67}
68
69void EnrFrontCohesiveBranchFuncOneEl :: evaluateEnrFuncDerivAt(std :: vector< FloatArray > &oEnrFuncDeriv, const EfInput &iEfInput, const FloatArray &iGradLevelSet) const
70{
71 const FloatArray &xTip = mTipInfo.mGlobalCoord;
72
73 // Crack tangent and normal
74 FloatArray t, n;
75 bool flipTangent = false;
76 computeCrackTangent(t, n, flipTangent, iEfInput);
77
78 double r = 0.0, theta = 0.0;
79 EnrichmentItem :: calcPolarCoord(r, theta, xTip, iEfInput.mPos, n, t, iEfInput, flipTangent);
80
81
82 size_t sizeStart = oEnrFuncDeriv.size();
83 mpBranchFunc.evaluateEnrFuncDerivAt(oEnrFuncDeriv, r, theta);
84
89 E.resize(2, 2);
90 E.setColumn(t, 1);
91 E.setColumn(n, 2);
92
93
94 for ( size_t j = sizeStart; j < oEnrFuncDeriv.size(); j++ ) {
95 FloatArray enrFuncDerivGlob;
96 enrFuncDerivGlob.beProductOf(E, oEnrFuncDeriv [ j ]);
97 oEnrFuncDeriv [ j ] = enrFuncDerivGlob;
98 }
99}
100
101void EnrFrontCohesiveBranchFuncOneEl :: evaluateEnrFuncJumps(std :: vector< double > &oEnrFuncJumps, GaussPoint &iGP, int iNodeInd, bool iGPLivesOnCurrentCrack, const double &iNormalSignDist) const
102{
103 const FloatArray &xTip = mTipInfo.mGlobalCoord;
104 const FloatArray &gpCoord = iGP.giveGlobalCoordinates();
105
106 double radius = distance(gpCoord, xTip);
107
108 std :: vector< double >jumps;
109 mpBranchFunc.giveJump(jumps, radius);
110
111 oEnrFuncJumps.insert( oEnrFuncJumps.end(), jumps.begin(), jumps.end() );
112}
113
114void EnrFrontCohesiveBranchFuncOneEl :: initializeFrom(InputRecord &ir)
115{
116}
117
118void EnrFrontCohesiveBranchFuncOneEl :: giveInputRecord(DynamicInputRecord &input)
119{
120 int number = 1;
121 input.setRecordKeywordField(this->giveInputRecordName(), number);
122}
123
124} /* namespace oofem */
#define E(a, b)
#define REGISTER_EnrichmentFront(class)
void setRecordKeywordField(std ::string keyword, int number)
void MarkTipElementNodesAsFront(std ::unordered_map< int, NodeEnrichmentType > &ioNodeEnrMarkerMap, XfemManager &ixFemMan, const std ::unordered_map< int, double > &iLevelSetNormalDirMap, const std ::unordered_map< int, double > &iLevelSetTangDirMap, const TipInfo &iTipInfo)
TipInfo mTipInfo
reference to the associated enrichment item
void computeCrackTangent(FloatArray &oTangent, FloatArray &oNormal, bool &oFlipTangent, const EfInput &iEfInput) const
double & at(Index i)
Definition floatarray.h:202
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:689
const FloatArray & giveGlobalCoordinates()
Definition gausspoint.h:159
#define OOFEM_ERROR(...)
Definition error.h:79
static FloatArray Vec2(const double &a, const double &b)
Definition floatarray.h:606
double distance(const FloatArray &x, const FloatArray &y)

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011