OOFEM 3.0
Loading...
Searching...
No Matches
delamination.C
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
35#include "delamination.h"
36#include "classfactory.h"
37#include "fracturemanager.h"
38#include "element.h"
39#include "dof.h"
41#include "dynamicinputrecord.h"
42#include "dynamicdatareader.h"
44#include "xfem/propagationlaw.h"
45#include "xfem/xfemmanager.h"
48#include "spatiallocalizer.h"
49#include <cassert>
50
51namespace oofem {
53
54//------------------
55// DELAMINATION
56//------------------
57
58Delamination :: Delamination(int n, XfemManager *xm, Domain *aDomain) : ListBasedEI(n, xm, aDomain)
59{
60 mpEnrichesDofsWithIdArray = {
61 D_u, D_v, D_w, W_u, W_v, W_w
62 };
63 this->interfaceNum.clear();
64 this->crossSectionNum.clear();
65 this->matNum = 0;
66 this->xiBottom = -1.0;
67 this->xiTop = -1.0;
68 this->initiationFactor = 1e6; // a high number
69 this->initiationRadius = 0.0;
70 this->recoverStresses = true; // default is to recover transverse stresses
71}
72
73int Delamination :: instanciateYourself(DataReader &dr)
74{
75 std :: string name;
76
77 // Instantiate enrichment function
78 {
80 mir->giveRecordKeywordField(name);
81
82 mpEnrichmentFunc = classFactory.createEnrichmentFunction( name.c_str(), 1, this->giveDomain() );
83 if ( mpEnrichmentFunc ) {
84 mpEnrichmentFunc->initializeFrom(*mir);
85 } else {
86 OOFEM_ERROR( "failed to create enrichment function (%s)", name.c_str() );
87 }
88 }
89
90
91 // Instantiate enrichment domain
92 {
93 auto &mir = dr.giveInputRecord(DataReader :: IR_geoRec, 1);
94 mir.giveRecordKeywordField(name);
95
96 IntArray idList;
98 for ( int i = 1; i <= idList.giveSize(); i++ ) {
99 this->dofManList.push_back( idList.at(i) );
100 }
101
102 std :: sort( dofManList.begin(), this->dofManList.end() );
103 // IR_GIVE_FIELD(ir, this->xi, _IFT_DofManList_DelaminationLevel);
104 }
105
106 // Instantiate EnrichmentFront
107 if ( mEnrFrontIndex == 0 ) {
108 mpEnrichmentFrontStart = std::make_unique<EnrFrontDoNothing>(this->giveNumber());
109 mpEnrichmentFrontEnd = std::make_unique<EnrFrontDoNothing>(this->giveNumber());
110 } else {
111 int i=0;
112 for(InputRecord& efIr: dr.giveGroupRecords("EnrichmentFront",DataReader :: IR_enrichFrontRec,/*numRequired*/2)){
113 std::string enrFrontName;
114 efIr.giveRecordKeywordField(enrFrontName);
115 auto ef = classFactory.createEnrichmentFront( enrFrontName.c_str() );
116 if ( ef ) {
117 assert(i==0 || i==1);
118 ef->initializeFrom(efIr);
119 (i==0?mpEnrichmentFrontStart:mpEnrichmentFrontEnd)=std::move(ef);
120 } else {
121 OOFEM_ERROR( "Failed to create enrichment front (%s)", enrFrontName.c_str() );
122 }
123 i++;
124 }
125 }
126
127
128 // Instantiate PropagationLaw
129 if ( mPropLawIndex == 0 ) {
130 mpPropagationLaw = std::make_unique<PLDoNothing>();
131 } else {
132 std :: string propLawName;
133
134 auto propLawir = dr.giveChildRecord(thisIr,"",DataReader::InputRecordTags[DataReader::IR_propagationLawRec],DataReader :: IR_propagationLawRec,/*optional*/false);
135 propLawir->giveRecordKeywordField(propLawName);
136
137 mpPropagationLaw = classFactory.createPropagationLaw( propLawName.c_str() );
138 if ( mpPropagationLaw ) {
139 mpPropagationLaw->initializeFrom(*propLawir);
140 } else {
141 OOFEM_ERROR( "Failed to create propagation law (%s)", propLawName.c_str() );
142 }
143 }
144
145 // Set start of the enrichment dof pool for the given EI
146 int xDofPoolAllocSize = this->giveDofPoolSize();
147 this->startOfDofIdPool = this->giveDomain()->giveNextFreeDofID(xDofPoolAllocSize);
148 this->endOfDofIdPool = this->startOfDofIdPool + xDofPoolAllocSize - 1;
149
150 //writeVtkDebug();
151
152 return 1;
153}
154
155void Delamination :: postInitialize() {
156 XfemManager *xMan = this->giveDomain()->giveXfemManager();
157 // mpEnrichmentDomain->CallNodeEnrMarkerUpdate(* this, * xMan);
158 this->updateNodeEnrMarker(* xMan);
159
160}
161
162
163#if 0
164void
165Delamination :: updateGeometry(FailureCriteriaStatus *fc, TimeStep *tStep)
166{
167 OOFEM_ERROR( "UpdateGeometry in Delamination not used" );
168 return;
169
170 if ( fc->hasFailed( this->giveNumber() ) ) { // interface has failed
171 //printf( "...fails in interface %d \n", this->giveNumber() );
172 IntArray dofManNumbers, elDofMans;
173 Element *el = fc->el;
174 elDofMans = el->giveDofManArray();
175
176 for ( int i = 1; i <= el->giveNumberOfDofManagers(); i++ ) {
177 // ugly piece of code that will skip enrichment of dofmans that have any bc's
178 // which is not generally what you want
179
180#if 1
181 bool hasBc = false;
182 for ( Dof *dof: *el->giveDofManager(i) ) {
183 if ( dof->hasBc(tStep) ) {
184 hasBc = true;
185 continue;
186 }
187 }
188
189#endif
190 if ( !hasBc ) {
191 dofManNumbers.followedBy( elDofMans.at(i) );
192 }
193 }
194
195 for ( int i = 1; i <= dofManNumbers.giveSize(); i++ ) {
196 //std::list< int > :: iterator p;
197 std :: vector< int > :: iterator p;
198 p = std :: find( this->dofManList.begin(), this->dofManList.end(), dofManNumbers.at(i) );
199 if ( p == this->dofManList.end() ) { // if new node
200 this->dofManList.push_back( dofManNumbers.at(i) );
201 }
202 }
203
204 std :: sort( dofManList.begin(), this->dofManList.end() );
205 }
206}
207#endif
208
209bool
210Delamination :: hasInitiationCriteria()
211{
212 if ( this->initiationFactor < 1e6 ) { // less than default
213 return true;
214 }
215
216 return false;
217}
218
219
220void
221Delamination :: propagateFronts(bool &oFrontsHavePropagated)
222{
223 oFrontsHavePropagated = false;
224
225 Domain *d = this->giveDomain();
226 TipPropagation tipProp;
227 if ( mpPropagationLaw->propagateInterface(* giveDomain(), * mpEnrichmentFrontStart, tipProp) ) {
228 // Propagate front
229
230 // Check if nodes are viable for enrichment
232 IntArray delamNodes, propNodes;
233 for (int CSnum : this->giveDelamCrossSectionNum()) {
234 Set *elSet = d->giveSet(d->giveCrossSection(CSnum)->giveSetNumber());
235 for (int elID : elSet->giveElementList() ) {
236 delamNodes.followedBy(d->giveElement(elID)->giveDofManArray());
237 }
238 }
239 delamNodes.sort();
240
241 delamNodes.findCommonValuesSorted(tipProp.mPropagationDofManNumbers, propNodes);
242 //propNodes.printYourself("propNodes");
243
244 bool printed = false;
245 for ( int inode : propNodes ) {
246 //std::list< int > :: iterator p;
247 std :: vector< int > :: iterator p;
248 p = std :: find( this->dofManList.begin(), this->dofManList.end(), inode );
249 if ( p == this->dofManList.end() ) { // if new node
250 if ( !printed ) {
251 printf("\n Enrichment %i - The following nodes will be expanded to:",this->giveNumber());
252 printed = true;
253 }
254 printf(" %i", inode );
255 this->dofManList.push_back( inode );
256 }
257 }
258 printf(" \n");
259
260 std :: sort( dofManList.begin(), this->dofManList.end() );
261
262 oFrontsHavePropagated = true;
263 }
264
265 this->updateGeometry();
266
267}
268
269void
270Delamination :: findInitiationFronts(bool &failureChecked, const IntArray &CSnumbers, std :: vector< IntArray > &CSinterfaceNumbers, std :: vector< IntArray > &CSDofManNumbers, std :: vector< FloatArray > &initiationFactors, TimeStep *tStep)
271{
272 // Loop through all cross sections associated with delaminations
273 // Returns
274 // CSinterfaceNumbers: the failed interface number associated with the cross sections.
275 // CSDofManNumbers: the dofmanagers that should be enriched (associated with the cross sections)
276 IntArray failedElementInterfaces;
277 IntArray elementNumbers;
278 SpatialLocalizer *localizer = this->giveDomain()->giveSpatialLocalizer();
279
280 // NB: Assumes that elements can only be included in one cross section.
281
282 for ( int iCS = 1 ; iCS <= CSnumbers.giveSize() ; iCS++ ) {
283
284 int eltSetNumber = this->giveDomain()->giveCrossSection(CSnumbers.at(iCS))->giveSetNumber();
285 //printf("Cross section No. %i, set No. %i \n",CSnumbers.at(iCS),eltSetNumber);
286 IntArray elementNumbers = this->giveDomain()->giveSet(eltSetNumber)->giveElementList();
287
288 for ( auto eltNumber : elementNumbers ) {
289 Element *elt = this->giveDomain()->giveGlobalElement(eltNumber);
290
291 if ( Shell7BaseXFEM *shellElt = dynamic_cast < Shell7BaseXFEM * > (elt) ) {
292
293 //bool recoverStresses = true;
294 shellElt->giveFailedInterfaceNumber(failedElementInterfaces, initiationFactors[iCS-1], tStep, this->recoverStresses);
295 //failedElementInterfaces.printYourself("failedElementInterfaces");
296 for (int eltInt : failedElementInterfaces ) {
297 CSinterfaceNumbers[iCS-1].insertSortedOnce(eltInt);
298 }
299 if ( !failedElementInterfaces.isEmpty() ) {
300 for (int iDF : shellElt->giveDofManArray() ) {
301 //printf("element node %d \n",iDF);
302 if ( this->initiationRadius > 0.0 ) {
303 const auto &gCoords = this->giveDomain()->giveNode(iDF)->giveCoordinates();
304 std :: list< int > nodeList;
305 localizer->giveAllNodesWithinBox(nodeList, gCoords, initiationRadius);
306
307 for ( int jNode : nodeList ) {
308 //printf("nodeList node %d \n",jNode);
309 CSDofManNumbers[iCS-1].insertSortedOnce(jNode);
310 }
311 } else {
312 CSDofManNumbers[iCS-1].insertSortedOnce(iDF);
313 }
314 }
315 }
316 }
317 }
318 }
319
320 failureChecked = true;
321}
322
323
324void Delamination :: evaluateEnrFuncAt(std :: vector< double > &oEnrFunc, const FloatArray &iGlobalCoord, const FloatArray &iLocalCoord, int iNodeInd, const Element &iEl) const
325{
326 if ( iLocalCoord.giveSize() != 3 ) {
327 OOFEM_ERROR("iLocalCoord.giveSize() != 3")
328 }
329
330 double levelSet = iLocalCoord.at(3) - giveDelamXiCoord();
331
332 oEnrFunc.resize(1, 0.0);
333 mpEnrichmentFunc->evaluateEnrFuncAt(oEnrFunc [ 0 ], iGlobalCoord, levelSet);
334}
335
336
337void Delamination :: evaluateEnrFuncAt(std :: vector< double > &oEnrFunc, const FloatArray &iGlobalCoord, const FloatArray &iLocalCoord, int iNodeInd, const Element &iEl, const FloatArray &iN, const IntArray &iElNodes) const
338{
339 evaluateEnrFuncAt(oEnrFunc, iGlobalCoord, iLocalCoord, iNodeInd, iEl);
340}
341
342
343void Delamination :: initializeFrom(InputRecord &ir)
344{
345 EnrichmentItem :: initializeFrom(ir);
346
347 // Compute the delamination xi-coord
348 IR_GIVE_FIELD(ir, this->interfaceNum, _IFT_Delamination_interfacenum); // interface number from the bottom
351 this->recoverStresses = false;
352 //printf("averageStresses");
353 }
354
355#if 1
356 // update: csnum is now an IntArray of cross sections viable for delamination
357 bool checkCS = false;
358 double totalThickness(0.0);
359 std::vector<double> layerThicknesses;
360 int numberOfLayers(0);
361 for (int iCS : this->crossSectionNum) {
362 LayeredCrossSection *layeredCS = dynamic_cast< LayeredCrossSection * >( this->giveDomain()->giveCrossSection(iCS) );
363 if ( !layeredCS ) {
364 throw ValueInputException(ir, _IFT_Delamination_csnum, "Delamination EI requires a valid layered cross section number input");
365 } else if ( this->interfaceNum.giveSize() < 1 || this->interfaceNum.giveSize() > 2 ) {
366 throw ValueInputException(ir, _IFT_Delamination_interfacenum, "Size must be 1 or 2");
367 }
368
369 // check that interface numbers are valid
370 //interfaceNum.printYourself("interface num");
371 for ( int i = 1; i <= this->interfaceNum.giveSize(); i++ ) {
372 if ( this->interfaceNum.at(i) < 1 || this->interfaceNum.at(i) >= layeredCS->giveNumberOfLayers() ) {
373 throw ValueInputException(ir, _IFT_Delamination_interfacenum, "Cross section does not contain the interface number");
374 }
375 }
376
377
378 if (checkCS) {
379 if ( layeredCS->give(CS_Thickness, FloatArray(), nullptr, false) != totalThickness ) {
380 throw ValueInputException(ir, _IFT_Delamination_csnum, "Delamination cross section have different totalThickness");
381 }
382 if ( layeredCS->giveNumberOfLayers() != numberOfLayers ) {
383 throw ValueInputException(ir, _IFT_Delamination_csnum, "Delamination cross section have different number of layers");
384 }
385
386 } else
387 numberOfLayers = layeredCS->giveNumberOfLayers();
388 totalThickness = layeredCS->give(CS_Thickness, FloatArray(), nullptr, false); // no position available
389 for ( int i = 1 ; i <= numberOfLayers ; i++) {
390 double layerThickness = layeredCS->giveLayerThickness(i);
391 if (checkCS) {
392 if ( layerThickness != layerThicknesses[i-1] ) {
393 throw ValueInputException(ir, _IFT_Delamination_csnum, "Delamination cross section have different layer thicknesses");
394 }
395 layerThicknesses[i-1] = layerThickness;
396 } else {
397 layerThicknesses.push_back(layeredCS->giveLayerThickness(i));
398 }
399 }
400
401 // compute xi-coord of the delamination
402 this->delamXiCoord = -1.0;
403 this->xiBottom = -1.0;
404 for ( int i = 1; i <= this->interfaceNum.at(1); i++ ) {
405 this->delamXiCoord += layeredCS->giveLayerThickness(i) / totalThickness * 2.0;
406 this->xiBottom += layeredCS->giveLayerThickness(i) / totalThickness * 2.0;
407 }
408
409 if ( this->interfaceNum.giveSize() == 2 ) {
410 if ( this->interfaceNum.at(1) >= this->interfaceNum.at(2) ) {
411 throw ValueInputException(ir, _IFT_Delamination_interfacenum, "second intercfacenum must be greater than the first one");
412 }
413 this->xiTop = -1.0;
414 for ( int i = 1; i <= this->interfaceNum.at(2); i++ ) {
415 this->xiTop += layeredCS->giveLayerThickness(i) / totalThickness * 2.0;
416 }
417 } else {
418 this->xiTop = 1.0; // default is the top surface
419 }
420 checkCS = true;
421 }
422#else
423 // old csnum (int version). NB: this was a bug since element nodes that where not part of the cross section could be enriched.
424 LayeredCrossSection *layeredCS = dynamic_cast< LayeredCrossSection * >( this->giveDomain()->giveCrossSection(this->crossSectionNum) );
425 if ( !layeredCS ) {
426 throw ValueInputException(ir, _IFT_Delamination_csnum, "Delamination EI requires a valid layered cross section number input");
427 } else if ( this->interfaceNum.giveSize() < 1 || this->interfaceNum.giveSize() > 2 ) {
428 throw ValueInputException(ir, _IFT_Delamination_interfacenum, "size must be 1 or 2");
429 }
430
431 // check that interface numbers are valid
432 //interfaceNum.printYourself("interface num");
433 for ( int i = 1; i <= this->interfaceNum.giveSize(); i++ ) {
434 if ( this->interfaceNum.at(i) < 1 || this->interfaceNum.at(i) >= layeredCS->giveNumberOfLayers() ) {
435 throw ValueInputException(ir, _IFT_Delamination_interfacenum, "Cross section does not contain the interface number");
436 }
437 }
438
439 // compute xi-coord of the delamination
440 this->delamXiCoord = -1.0;
441 double totalThickness = layeredCS->give(CS_Thickness, FloatArray(), nullptr, false); // no position available
442 for ( int i = 1; i <= this->interfaceNum.at(1); i++ ) {
443 this->delamXiCoord += layeredCS->giveLayerThickness(i) / totalThickness * 2.0;
444 this->xiBottom += layeredCS->giveLayerThickness(i) / totalThickness * 2.0;
445 }
446
447 if ( this->interfaceNum.giveSize() == 2 ) {
448 if ( this->interfaceNum.at(1) >= this->interfaceNum.at(2) ) {
449 throw ValueInputException(ir, "second intercfacenum must be greater than the first one");
450 }
451 for ( int i = 1; i <= this->interfaceNum.at(2); i++ ) {
452 this->xiTop += layeredCS->giveLayerThickness(i) / totalThickness * 2.0;
453 }
454 } else {
455 this->xiTop = 1.0; // default is the top surface
456 }
457#endif
458
460 if ( this->matNum > 0 ) {
461 this->mat = this->giveDomain()->giveMaterial(this->matNum);
462 }
463
465 if ( this->initiationFactor <= 0 ) {
466 throw ValueInputException(ir, _IFT_Delamination_initiationFactor, "must be positive");
467 }
468
470 if ( this->initiationRadius < 0 ) {
471 throw ValueInputException(ir, _IFT_Delamination_initiationRadius, "must be positive");
472 }
473}
474
475
476
477void
478Delamination :: appendInputRecords(DynamicDataReader &oDR)
479{
481 auto eiRec = std::make_unique<DynamicInputRecord>();
482 FEMComponent :: giveInputRecord(* eiRec);
483
486
487 // Delamination specific records
488 eiRec->setField(this->interfaceNum, _IFT_Delamination_interfacenum);
489 eiRec->setField(this->crossSectionNum, _IFT_Delamination_csnum);
490 eiRec->setField(this->matNum, _IFT_Delamination_CohesiveZoneMaterial);
493 if ( !eiRec->hasField(_IFT_Delamination_averageStresses) ) {
494 recoverStresses = false;
495 }
496
497
498 oDR.insertInputRecord(DataReader :: IR_enrichItemRec, std::move(eiRec));
499
500 // Enrichment function
501 auto efRec = std::make_unique<DynamicInputRecord>();
502 mpEnrichmentFunc->giveInputRecord(* efRec);
503 oDR.insertInputRecord(DataReader :: IR_enrichFuncRec, std::move(efRec));
504
505
506 // Enrichment domain
507
508 auto geoRec = std::make_unique<DynamicInputRecord>();
509 geoRec->setRecordKeywordField(this->giveInputRecordName(), 1);
510
511 IntArray idList;
512 idList.resize( dofManList.size() );
513 for ( size_t i = 0; i < dofManList.size(); i++ ) {
514 idList.at(i + 1) = dofManList [ i ];
515 }
516
517 geoRec->setField(idList, _IFT_ListBasedEI_list);
518
519 oDR.insertInputRecord(DataReader :: IR_geoRec, std::move(geoRec));
520
521 // Enrichment front
522 if ( mEnrFrontIndex != 0 ) {
523 auto efrRecStart = std::make_unique<DynamicInputRecord>();
524 mpEnrichmentFrontStart->giveInputRecord(* efrRecStart);
525 oDR.insertInputRecord(DataReader :: IR_enrichFrontRec, std::move(efrRecStart));
526
527 auto efrRecEnd = std::make_unique<DynamicInputRecord>();
528 mpEnrichmentFrontEnd->giveInputRecord(* efrRecEnd);
529 oDR.insertInputRecord(DataReader :: IR_enrichFrontRec, std::move(efrRecEnd));
530 }
531
532 if ( mPropLawIndex != 0 ) {
533 // Propagation law
534 auto plRec = std::make_unique<DynamicInputRecord>();
535 this->mpPropagationLaw->giveInputRecord(* plRec);
536 oDR.insertInputRecord(DataReader :: IR_propagationLawRec, std::move(plRec));
537 }
538}
539
540void Delamination :: evalLevelSetNormal(double &oLevelSet, const FloatArray &iGlobalCoord, const FloatArray &iN, const IntArray &iNodeInd) const
541{
542 // TODO: For consistency, this should be evaluated based on giveDelamXiCoord() /ES
543 // interpLevelSet(oLevelSet, iN, iNodeInd);
544}
545
546void Delamination :: evaluateEnrFuncAt(std :: vector< double > &oEnrFunc, const FloatArray &iPos, const double &iLevelSet) const
547{
548 oEnrFunc.resize(1, 0.0);
549 mpEnrichmentFunc->evaluateEnrFuncAt(oEnrFunc [ 0 ], iPos, iLevelSet);
550}
551} // end namespace oofem
#define REGISTER_EnrichmentItem(class)
int giveSetNumber() const
virtual InputRecord & giveInputRecord(InputRecordType irType, int recordId)=0
GroupRecords giveGroupRecords(const std::shared_ptr< InputRecord > &ir, InputFieldType ift, const std::string &name, InputRecordType irType, bool optional)
Definition datareader.C:46
static constexpr const char * InputRecordTags[]
Definition datareader.h:76
InputRecord * giveChildRecord(const std::shared_ptr< InputRecord > &ir, InputFieldType ift, const std::string &name, InputRecordType irType, bool optional)
Return pointer to subrecord of given type (must be exactly one); if not present, returns nullptr.
Definition datareader.C:40
const char * giveInputRecordName() const override
double giveDelamXiCoord() const
void evaluateEnrFuncAt(std ::vector< double > &oEnrFunc, const FloatArray &iGlobalCoord, const FloatArray &iLocalCoord, int iNodeInd, const Element &iEl) const override
IntArray giveDelamCrossSectionNum() const
Set * giveSet(int n)
Definition domain.C:366
Element * giveElement(int n)
Definition domain.C:165
CrossSection * giveCrossSection(int n)
Definition domain.C:342
void insertInputRecord(InputRecordType type, std::unique_ptr< InputRecord > record)
const IntArray & giveDofManArray() const
Definition element.h:611
virtual int giveNumberOfDofManagers() const
Definition element.h:695
DofManager * giveDofManager(int i) const
Definition element.C:553
int mEnrFrontIndex
mEnrFrontIndex: nonzero if an enrichment front is present, zero otherwise.
std::unique_ptr< EnrichmentFront > mpEnrichmentFrontEnd
std::unique_ptr< EnrichmentFront > mpEnrichmentFrontStart
virtual int giveDofPoolSize() const
std::unique_ptr< EnrichmentFunction > mpEnrichmentFunc
int mPropLawIndex
mPropLawIndex: nonzero if a propagation law is present, zero otherwise.
std::shared_ptr< InputRecord > thisIr
std::unique_ptr< PropagationLaw > mpPropagationLaw
Domain * giveDomain() const
Definition femcmpnn.h:97
int giveNumber() const
Definition femcmpnn.h:104
double & at(Index i)
Definition floatarray.h:202
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
virtual void giveRecordKeywordField(std ::string &answer, int &value)=0
Reads the record id field (type of record) and its corresponding number.
void followedBy(const IntArray &b, int allocChunk=0)
Definition intarray.C:94
int findCommonValuesSorted(const IntArray &iarray, IntArray &common, int allocChunk=0) const
Definition intarray.C:332
void resize(int n)
Definition intarray.C:73
int & at(std::size_t i)
Definition intarray.h:104
int giveSize() const
Definition intarray.h:211
double giveLayerThickness(int layer) const
double give(CrossSectionProperty a, GaussPoint *gp) const override
void updateNodeEnrMarker(XfemManager &ixFemMan) override
std ::vector< int > dofManList
Definition listbasedei.h:73
void updateGeometry() override
Definition listbasedei.C:56
const IntArray & giveElementList()
Definition set.C:158
virtual void giveAllNodesWithinBox(nodeContainerType &nodeList, const FloatArray &coords, const double radius)=0
#define _IFT_Delamination_interfacenum
#define _IFT_Delamination_CohesiveZoneMaterial
#define _IFT_Delamination_initiationRadius
#define _IFT_Delamination_initiationFactor
#define _IFT_Delamination_csnum
#define _IFT_Delamination_averageStresses
#define _IFT_EnrichmentItem_front
#define _IFT_EnrichmentItem_propagationlaw
#define OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define IR_GIVE_FIELD(__ir, __value, __id)
Definition inputrecord.h:67
#define _IFT_ListBasedEI_list
Definition listbasedei.h:39
@ CS_Thickness
Thickness.
ClassFactory & classFactory
IntArray mPropagationDofManNumbers
Definition tipinfo.h:46

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