bool EnrichmentItem :: tipIsTouchingEI(const TipInfo &iTipInfo) { double tol = 1.0e-9; SpatialLocalizer *localizer = giveDomain()->giveSpatialLocalizer(); Element *tipEl = localizer->giveElementContainingPoint(iTipInfo.mGlobalCoord); if ( tipEl != NULL ) { // Check if the candidate tip is located on the current crack FloatArray N; FloatArray locCoord; tipEl->computeLocalCoordinates(locCoord, iTipInfo.mGlobalCoord); FEInterpolation *interp = tipEl->giveInterpolation(); interp->evalN( N, locCoord, FEIElementGeometryWrapper(tipEl) ); double normalSignDist; evalLevelSetNormal( normalSignDist, iTipInfo.mGlobalCoord, N, tipEl->giveDofManArray() ); double tangSignDist; evalLevelSetTangential( tangSignDist, iTipInfo.mGlobalCoord, N, tipEl->giveDofManArray() ); if ( fabs(normalSignDist) < tol && tangSignDist > tol ) { return true; } } return false; }
void TrPlaneStress2dXFEM :: computeGaussPoints() { if ( giveDomain()->hasXfemManager() ) { XfemManager *xMan = giveDomain()->giveXfemManager(); if ( xMan->isElementEnriched(this) ) { if ( !this->XfemElementInterface_updateIntegrationRule() ) { TrPlaneStress2d :: computeGaussPoints(); } } else { TrPlaneStress2d :: computeGaussPoints(); } } else { TrPlaneStress2d :: computeGaussPoints(); } }
LoadTimeFunction * NonStationaryTransportProblem :: giveDtTimeFunction() // Returns the load-time function of the receiver. { if ( !dtTimeFunction || !ndomains ) { return NULL; } return giveDomain(1)->giveLoadTimeFunction(dtTimeFunction); }
IRResultType Beam2d :: initializeFrom(InputRecord *ir) { IRResultType result; // Required by IR_GIVE_FIELD macro // first call parent BeamBaseElement :: initializeFrom(ir); if ( ir->hasField(_IFT_Beam2d_dofstocondense) ) { IntArray val; IR_GIVE_FIELD(ir, val, _IFT_Beam2d_dofstocondense); if ( val.giveSize() >= 6 ) { OOFEM_WARNING("wrong input data for condensed dofs"); return IRRT_BAD_FORMAT; } DofIDItem mask[] = { D_u, D_w, R_v }; this->numberOfCondensedDofs = val.giveSize(); for ( int i = 1; i <= val.giveSize(); i++ ) { if ( val.at(i) <= 3 ) { if ( ghostNodes [ 0 ] == NULL ) { ghostNodes [ 0 ] = new ElementDofManager(1, giveDomain(), this); } ghostNodes [ 0 ]->appendDof( new MasterDof(ghostNodes [ 0 ], mask [ val.at(i) - 1 ]) ); } else { if ( ghostNodes [ 1 ] == NULL ) { ghostNodes [ 1 ] = new ElementDofManager(1, giveDomain(), this); } ghostNodes [ 1 ]->appendDof( new MasterDof(ghostNodes [ 1 ], mask [ val.at(i) - 4 ]) ); } } } return IRRT_OK; }
void Delamination :: propagateFronts(bool &oFrontsHavePropagated) { oFrontsHavePropagated = false; Domain *d = this->giveDomain(); TipPropagation tipProp; if ( mpPropagationLaw->propagateInterface(* giveDomain(), * mpEnrichmentFrontStart, tipProp) ) { // Propagate front // 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; for (int CSnum : this->giveDelamCrossSectionNum()) { Set *elSet = d->giveSet(d->giveCrossSection(CSnum)->giveSetNumber()); for (int elID : elSet->giveElementList() ) { delamNodes.followedBy(d->giveElement(elID)->giveDofManArray()); } } delamNodes.sort(); delamNodes.findCommonValuesSorted(tipProp.mPropagationDofManNumbers, propNodes); //propNodes.printYourself("propNodes"); bool printed = false; for ( int inode : propNodes ) { //std::list< int > :: iterator p; std :: vector< int > :: iterator p; p = std :: find( this->dofManList.begin(), this->dofManList.end(), inode ); if ( p == this->dofManList.end() ) { // if new node if ( !printed ) { printf("\n Enrichment %i - The following nodes will be expanded to:",this->giveNumber()); printed = true; } printf(" %i", inode ); this->dofManList.push_back( inode ); } } printf(" \n"); std :: sort( dofManList.begin(), this->dofManList.end() ); oFrontsHavePropagated = true; } this->updateGeometry(); }
void TrPlaneStress2dXFEM :: giveDofManDofIDMask(int inode, IntArray &answer) const { // Continuous part TrPlaneStress2d :: giveDofManDofIDMask(inode, answer); // Discontinuous part if( this->giveDomain()->hasXfemManager() ) { DofManager *dMan = giveDofManager(inode); XfemManager *xMan = giveDomain()->giveXfemManager(); const std::vector<int> &nodeEiIndices = xMan->giveNodeEnrichmentItemIndices( dMan->giveGlobalNumber() ); for ( size_t i = 0; i < nodeEiIndices.size(); i++ ) { EnrichmentItem *ei = xMan->giveEnrichmentItem(nodeEiIndices[i]); if ( ei->isDofManEnriched(* dMan) ) { IntArray eiDofIdArray; ei->computeEnrichedDofManDofIdArray(eiDofIdArray, *dMan); answer.followedBy(eiDofIdArray); } } } }
void XfemManager :: updateNodeEnrichmentItemMap() { Domain *domain = giveDomain(); int nDMan = domain->giveNumberOfDofManagers(); mNodeEnrichmentItemIndices.clear(); mNodeEnrichmentItemIndices.resize(nDMan); int nElem = domain->giveNumberOfElements(); mElementEnrichmentItemIndices.clear(); for ( int i = 1; i <= nElem; i++ ) { int elIndex = domain->giveElement(i)->giveGlobalNumber(); int elPlaceInArray = domain->giveElementPlaceInArray(elIndex); if ( i != elPlaceInArray ) { printf("i != elPlaceInArray.\n"); exit(0); } mElementEnrichmentItemIndices [ elPlaceInArray ].clear(); } int nEI = giveNumberOfEnrichmentItems(); for ( int eiIndex = 1; eiIndex <= nEI; eiIndex++ ) { EnrichmentItem *ei = giveEnrichmentItem(eiIndex); const std :: unordered_map< int, NodeEnrichmentType > &enrNodeInd = ei->giveEnrNodeMap(); //for(size_t i = 0; i < enrNodeInd.size(); i++) { for ( auto &nodeEiPair: enrNodeInd ) { mNodeEnrichmentItemIndices [ nodeEiPair.first - 1 ].push_back(eiIndex); ConnectivityTable *ct = domain->giveConnectivityTable(); //const IntArray *nodeElements = ct->giveDofManConnectivityArray(nodeEiPair.first); IntArray nodeElements; IntArray nodeList = { nodeEiPair.first }; ct->giveNodeNeighbourList(nodeElements, nodeList); for ( int i = 1; i <= nodeElements.giveSize(); i++ ) { int elInd = nodeElements.at(i); bool found = false; for ( size_t j = 0; j < mElementEnrichmentItemIndices [ elInd ].size(); j++ ) { if ( mElementEnrichmentItemIndices [ elInd ] [ j ] == eiIndex ) { found = true; break; } } if ( !found ) { mElementEnrichmentItemIndices [ elInd ].push_back(eiIndex); } } } } mMaterialModifyingEnrItemIndices.clear(); for ( int eiIndex = 1; eiIndex <= nEI; eiIndex++ ) { EnrichmentItem *ei = giveEnrichmentItem(eiIndex); if ( ei->canModifyMaterial() ) { mMaterialModifyingEnrItemIndices.push_back(eiIndex); } } }