61XfemManager :: XfemManager(
Domain *domain)
63 this->domain = domain;
64 numberOfEnrichmentItems = -1;
65 numberOfNucleationCriteria = 0;
72 mEnrDofScaleFac = 1.0;
76 vtkExportFields.
clear();
78 mNodeEnrichmentItemIndices.resize(0);
79 mElementEnrichmentItemIndices.clear();
80 mMaterialModifyingEnrItemIndices.clear();
83XfemManager :: ~XfemManager()
91 case XFEMST_Enrichment:
92 case XFEMST_LevelSetPhi:
93 case XFEMST_LevelSetGamma:
94 case XFEMST_NumIntersecPoints:
95 case XFEMST_NodeEnrMarker:
104bool XfemManager :: isElementEnriched(
const Element *elem)
127XfemManager :: createEnrichedDofs()
134 ei->createEnrichedDofs();
135 ei->givePotentialEIDofIdArray(dofIdArray);
176 if ( vtkDebug == 1 ) {
181 XfemTolerances :: setCharacteristicElementLength(0.001);
215 mir.giveRecordKeywordField(name);
217 std :: unique_ptr< EnrichmentItem >ei(
classFactory.createEnrichmentItem( name.c_str(), i,
this, this->giveDomain() ) );
218 if ( ei.get() == NULL ) {
219 OOFEM_ERROR(
"unknown enrichment item (%s)", name.c_str() );
222 ei->initializeFrom(mir);
223 ei->instanciateYourself(dr);
232 for(
auto& mir: nuclRecs){
233 mir.giveRecordKeywordField(name);
235 std :: unique_ptr< NucleationCriterion >nc(
classFactory.createNucleationCriterion( name.c_str(), this->giveDomain() ) );
236 if ( nc.get() == NULL ) {
237 OOFEM_ERROR(
"Unknown nucleation criterion: (%s)", name.c_str() );
241 nc->initializeFrom(mir);
242 nc->instanciateYourself(dr);
252void XfemManager :: postInitialize()
268void XfemManager :: setDomain(
Domain *ipDomain)
273 ei->setDomain(ipDomain);
280 if ( !stream.
write(this->numberOfEnrichmentItems) ) {
293 object->saveContext(stream, mode);
301 if ( !stream.
read(this->numberOfEnrichmentItems) ) {
311 if ( !stream.
read(name) ) {
315 std :: unique_ptr< EnrichmentItem >ei(
classFactory.createEnrichmentItem(name.c_str(), i,
this, this->domain) );
330 ei->updateGeometry();
336void XfemManager :: propagateFronts(
bool &oAnyFronHasPropagated)
338 oAnyFronHasPropagated =
false;
342 bool eiHasPropagated =
false;
343 ei->propagateFronts(eiHasPropagated);
345 if(eiHasPropagated) {
346 oAnyFronHasPropagated =
true;
351 if ( geoEI != NULL ) {
352 std :: vector< FloatArray >points;
355 std :: vector< double >x, y;
356 for (
size_t j = 0; j < points.size(); j++ ) {
357 x.push_back( points [ j ].at(1) );
358 y.push_back( points [ j ].at(2) );
362 char fileName [ 200 ];
363 sprintf( fileName,
"crack%d.dat", ei->giveNumber() );
364 XFEMDebugTools :: WriteArrayToGnuplot(fileName, x, y);
373void XfemManager :: initiateFronts(
bool &oAnyFronHasPropagated,
TimeStep *tStep)
376 oAnyFronHasPropagated =
false;
380 std :: vector < FloatArray > initiationFactors; initiationFactors.
resize(this->
domain->giveNumberOfCrossSectionModels());
383 int CSinterfaceNumber = dei->giveDelamInterfaceNum();
384 for (
int CSnumber : dei->giveDelamCrossSectionNum()) {
386 if (initiationFactors[CSnumber-1].giveSize() < CSinterfaceNumber) {
387 initiationFactors[CSnumber-1].resizeWithValues(CSinterfaceNumber);
389 initiationFactors[CSnumber-1].at(CSinterfaceNumber) = dei->giveInitiationFactor();
394 bool failureChecked =
false;
395 std :: vector < IntArray > CSinterfaceNumbers; CSinterfaceNumbers.resize(CSnumbers.
giveSize());
396 std :: vector < IntArray > CSDofManNumbers; CSDofManNumbers.resize(CSnumbers.
giveSize());
400 bool eiHasPropagated =
false;
404 if ( !failureChecked ) {
405 dei->findInitiationFronts(failureChecked, CSnumbers, CSinterfaceNumbers, CSDofManNumbers, initiationFactors, tStep);
408 for (
int CSnum : dei->giveDelamCrossSectionNum()) {
411 int iInt = CSinterfaceNumbers[iCS-1].findSorted(dei->giveDelamInterfaceNum());
422 dei->initiateFronts(eiHasPropagated,propNodes);
426 OOFEM_ERROR(
" XfemManager :: initiateFronts not implemented for other than Delamination.")
428 if(eiHasPropagated) {
429 oAnyFronHasPropagated =
true;
435 OOFEM_ERROR(
" XfemManager :: initiateFronts not implemented for other than Delamination.")
441bool XfemManager :: hasPropagatingFronts()
444 if ( ei->hasPropagatingFronts() ) {
452bool XfemManager :: hasInitiationCriteria()
455 if ( ei->hasInitiationCriteria() ) {
463void XfemManager :: clearEnrichmentItems()
469void XfemManager :: appendEnrichmentItems(std :: vector< std :: unique_ptr< EnrichmentItem > > &iEIlist)
471 for(
auto &ei : iEIlist ) {
479void XfemManager :: nucleateEnrichmentItems(
bool &oNewItemsWereNucleated)
485 std::vector<std::unique_ptr<EnrichmentItem>> eiList = nucCrit->nucleateEnrichmentItems();
487 if(eiList.size() > 0) {
493 for(
auto &ei : eiList) {
499 oNewItemsWereNucleated =
true;
507 oNewItemsWereNucleated =
false;
511bool XfemManager :: hasNucleationCriteria()
516void XfemManager :: updateNodeEnrichmentItemMap()
519 int nDMan =
domain->giveNumberOfDofManagers();
523 int nElem =
domain->giveNumberOfElements();
526 for (
int i = 1; i <= nElem; i++ ) {
527 int elIndex =
domain->giveElement(i)->giveGlobalNumber();
528 int elPlaceInArray =
domain->giveElementPlaceInArray(elIndex);
529 if ( i != elPlaceInArray ) {
530 printf(
"i != elPlaceInArray.\n");
538 for (
int eiIndex = 1; eiIndex <= nEI; eiIndex++ ) {
541 const std :: unordered_map< int, NodeEnrichmentType > &enrNodeInd = ei->
giveEnrNodeMap();
544 for (
auto &nodeEiPair: enrNodeInd ) {
555 for (
int i = 1; i <= nodeElements.
giveSize(); i++ ) {
556 int elInd = nodeElements.
at(i);
577 for (
int eiIndex = 1; eiIndex <= nEI; eiIndex++ ) {
586void XfemManager :: giveElementEnrichmentItemIndices(std :: vector< int > &oElemEnrInd,
int iElementIndex)
const
590 oElemEnrInd = res->second;
#define REGISTER_XfemManager(class)
void giveNodeNeighbourList(IntArray &answer, IntArray &nodeList)
Internal range-like class, return type for giveGroupRecords methods.
RAII guard for DataReader::enterRecord and DataReader::leaveRecord.
GroupRecords giveGroupRecords(const std::shared_ptr< InputRecord > &ir, InputFieldType ift, const std::string &name, InputRecordType irType, bool optional)
virtual int read(int *data, std::size_t count)=0
Reads count integer values into array pointed by data.
virtual int write(const int *data, std::size_t count)=0
Writes count integer values from array pointed by data.
bool hasDofID(DofIDItem id) const
void clear()
Clear receiver.
const IntArray & giveDofManArray() const
const std ::unordered_map< int, NodeEnrichmentType > & giveEnrNodeMap() const
virtual bool canModifyMaterial() const
virtual const char * giveInputRecordName() const =0
virtual void restoreContext(DataStream &stream, ContextMode mode)
void giveSubPolygon(std ::vector< FloatArray > &oPoints, const double &iXiStart, const double &iXiEnd) const
bool insertSortedOnce(int value, int allocChunk=0)
void followedBy(const IntArray &b, int allocChunk=0)
int findCommonValuesSorted(const IntArray &iarray, IntArray &common, int allocChunk=0) const
int findSorted(int value) const
const IntArray & giveElementList()
bool isElementEnriched(const Element *elem)
bool giveVtkDebug() const
std ::vector< int > mMaterialModifyingEnrItemIndices
std ::vector< std ::vector< int > > mNodeEnrichmentItemIndices
std ::vector< std ::unique_ptr< EnrichmentItem > > enrichmentItemList
Enrichment item list.
int numberOfNucleationCriteria
IntArray mXFEMPotentialDofIDs
std ::unordered_map< int, std ::vector< int > > mElementEnrichmentItemIndices
int giveNumberOfNucleationCriteria() const
EnrichmentItem * giveEnrichmentItem(int n)
int numberOfEnrichmentItems
std::shared_ptr< InputRecord > thisIr
std::vector< std ::unique_ptr< NucleationCriterion > > mNucleationCriteria
NucleationCriterion * giveNucleationCriterion(int n)
virtual const char * giveInputRecordName() const
bool mDebugVTK
If extra debug vtk files should be written.
void updateNodeEnrichmentItemMap()
int giveNumberOfEnrichmentItems() const
InternalStateValueType
Determines the type of internal variable.
@ ISVT_UNDEFINED
Undefined.
ClassFactory & classFactory
@ CIO_IOERR
General IO error.
#define _IFT_XfemManager_numberOfEnrichmentItems
#define _IFT_XfemManager_numberOfGpPerTri
#define _IFT_XfemManager_debugVTK
#define _IFT_XfemManager_numberOfNucleationCriteria
#define _IFT_XfemManager_VTKExport
#define _IFT_XfemManager_VTKExportFields
#define _IFT_XfemManager_enrDofScaleFac
#define _IFT_XfemManager_numberOfTriRefs
How many times a subtriangle should be refined.