void XfemManager :: initiateFronts(bool &oAnyFronHasPropagated, TimeStep *tStep) { oAnyFronHasPropagated = false; // Loop over EI:s and collect cross sections which have delaminaion EI:s IntArray CSnumbers; std :: vector < FloatArray > initiationFactors; initiationFactors.resize(this->domain->giveNumberOfCrossSectionModels()); for ( auto &ei: enrichmentItemList ) { if ( Delamination *dei = dynamic_cast< Delamination * >( ei.get() ) ) { int CSinterfaceNumber = dei->giveDelamInterfaceNum(); for (int CSnumber : dei->giveDelamCrossSectionNum()) { CSnumbers.insertSortedOnce(CSnumber); if (initiationFactors[CSnumber-1].giveSize() < CSinterfaceNumber) { initiationFactors[CSnumber-1].resizeWithValues(CSinterfaceNumber); } initiationFactors[CSnumber-1].at(CSinterfaceNumber) = dei->giveInitiationFactor(); } } } bool failureChecked = false; std :: vector < IntArray > CSinterfaceNumbers; CSinterfaceNumbers.resize(CSnumbers.giveSize()); std :: vector < IntArray > CSDofManNumbers; CSDofManNumbers.resize(CSnumbers.giveSize()); for ( auto &ei: enrichmentItemList ) { bool eiHasPropagated = false; if ( Delamination *dei = dynamic_cast< Delamination * >( ei.get() ) ) { if ( !failureChecked ) { dei->findInitiationFronts(failureChecked, CSnumbers, CSinterfaceNumbers, CSDofManNumbers, initiationFactors, tStep); } for (int CSnum : dei->giveDelamCrossSectionNum()) { int iCS = CSnumbers.findSorted(CSnum); int iInt = CSinterfaceNumbers[iCS-1].findSorted(dei->giveDelamInterfaceNum()); if ( iInt ) { // Check if nodes are viable for enrichment ///TODO: this should actually not inlcude the nodes at the boundary of the delamination, since this will propagate the delamination outside. IntArray delamNodes, propNodes; Set *elSet = this->giveDomain()->giveSet(this->giveDomain()->giveCrossSection(CSnum)->giveSetNumber()); for (int elID : elSet->giveElementList() ) { delamNodes.followedBy(this->giveDomain()->giveElement(elID)->giveDofManArray()); } delamNodes.sort(); delamNodes.findCommonValuesSorted(CSDofManNumbers[iCS-1], propNodes); dei->initiateFronts(eiHasPropagated,propNodes); } } } else { OOFEM_ERROR(" XfemManager :: initiateFronts not implemented for other than Delamination.") } if(eiHasPropagated) { oAnyFronHasPropagated = true; } } updateNodeEnrichmentItemMap(); }