int EIPrimaryUnknownMapper :: mapAndUpdate(FloatArray &answer, ValueModeType mode, Domain *oldd, Domain *newd, TimeStep *tStep) { int inode, nd_nnodes = newd->giveNumberOfDofManagers(); int nsize = newd->giveEngngModel()->giveNumberOfDomainEquations( newd->giveNumber(), EModelDefaultEquationNumbering() ); FloatArray unknownValues; IntArray dofidMask, locationArray; IntArray reglist; #ifdef OOFEM_MAPPING_CHECK_REGIONS ConnectivityTable *conTable = newd->giveConnectivityTable(); const IntArray *nodeConnectivity; #endif answer.resize(nsize); answer.zero(); for ( inode = 1; inode <= nd_nnodes; inode++ ) { DofManager *node = newd->giveNode(inode); /* HUHU CHEATING */ #ifdef __PARALLEL_MODE if ( ( node->giveParallelMode() == DofManager_null ) || ( node->giveParallelMode() == DofManager_remote ) ) { continue; } #endif #ifdef OOFEM_MAPPING_CHECK_REGIONS // build up region list for node nodeConnectivity = conTable->giveDofManConnectivityArray(inode); reglist.resize( nodeConnectivity->giveSize() ); reglist.clear(); for ( int indx = 1; indx <= nodeConnectivity->giveSize(); indx++ ) { reglist.insertSortedOnce( newd->giveElement( nodeConnectivity->at(indx) )->giveRegionNumber() ); } #endif ///@todo Shouldn't we pass a primary field or something to this function? if ( this->evaluateAt(unknownValues, dofidMask, mode, oldd, * node->giveCoordinates(), reglist, tStep) ) { ///@todo This doesn't respect local coordinate systems in nodes. Supporting that would require major reworking. for ( int ii = 1; ii <= dofidMask.giveSize(); ii++ ) { // exclude slaves; they are determined from masters auto it = node->findDofWithDofId((DofIDItem)dofidMask.at(ii)); if ( it != node->end() ) { Dof *dof = *it; if ( dof->isPrimaryDof() ) { int eq = dof->giveEquationNumber(EModelDefaultEquationNumbering()); answer.at( eq ) += unknownValues.at(ii); } } } } else { OOFEM_ERROR("evaluateAt service failed for node %d", inode); } } return 1; }
void ConnectivityTable :: giveNodeNeighbourList(IntArray &answer, IntArray &nodeList) { int nnodes = nodeList.giveSize(); if ( nodalConnectivityFlag == 0 ) { this->instanciateConnectivityTable(); } answer.resize(0); for ( int i = 1; i <= nnodes; i++ ) { int inode = nodeList.at(i); for ( auto &val : this->nodalConnectivity[inode-1] ) { answer.insertSortedOnce( val ); } } }
bool DofManager :: giveMasterDofMans(IntArray &masters) { IntArray _dof_masters; bool answer = false; masters.clear(); for ( Dof *dof: *this ) { if ( !dof->isPrimaryDof() ) { answer = true; dof->giveMasterDofManArray(_dof_masters); for ( int j = 1; j <= _dof_masters.giveSize(); j++ ) { masters.insertSortedOnce(_dof_masters.at(j), 2); } } } return answer; }
void ConnectivityTable :: giveElementNeighbourList(IntArray &answer, IntArray &elemList) { if ( nodalConnectivityFlag == 0 ) { this->instanciateConnectivityTable(); } answer.resize(0); for ( auto &el_num : elemList ) { Element *ielem = domain->giveElement( el_num ); int nnode = ielem->giveNumberOfDofManagers(); for ( int j = 1; j <= nnode; j++ ) { int jnode = ielem->giveDofManager(j)->giveNumber(); for ( auto &val : this->nodalConnectivity[jnode-1] ) { answer.insertSortedOnce( val ); } } } }
int EIPrimaryUnknownMapper :: mapAndUpdate(FloatArray &answer, ValueModeType mode, Domain *oldd, Domain *newd, TimeStep *tStep) { int inode, nd_nnodes = newd->giveNumberOfDofManagers(); int nsize = newd->giveEngngModel()->giveNumberOfDomainEquations(newd->giveNumber(), EModelDefaultEquationNumbering()); FloatArray unknownValues; IntArray dofMask, locationArray; IntArray reglist; #ifdef OOFEM_MAPPING_CHECK_REGIONS ConnectivityTable *conTable = newd->giveConnectivityTable(); const IntArray *nodeConnectivity; #endif answer.resize(nsize); answer.zero(); for ( inode = 1; inode <= nd_nnodes; inode++ ) { /* HUHU CHEATING */ #ifdef __PARALLEL_MODE if ( ( newd->giveNode(inode)->giveParallelMode() == DofManager_null ) || ( newd->giveNode(inode)->giveParallelMode() == DofManager_remote ) ) { continue; } #endif #ifdef OOFEM_MAPPING_CHECK_REGIONS // build up region list for node nodeConnectivity = conTable->giveDofManConnectivityArray(inode); reglist.resize( nodeConnectivity->giveSize() ); reglist.resize(0); for ( int indx = 1; indx <= nodeConnectivity->giveSize(); indx++ ) { reglist.insertSortedOnce( newd->giveElement( nodeConnectivity->at(indx) )->giveRegionNumber() ); } #endif if ( this->evaluateAt(unknownValues, dofMask, mode, oldd, * newd->giveNode(inode)->giveCoordinates(), reglist, tStep) ) { // // WARNING !! LIMITED IMPLEMENTATION HERE !! // // possible source of error -> general service allowing to request all DOFs interpolated by element // should be there, but newNode can accommodate only certain dofs. // // newd->giveNode(inode)->giveLocationArray( dofMask, locationArray, EModelDefaultEquationNumbering() ); if ( newd->giveNode(inode)->hasAnySlaveDofs() ) { for ( int ii = 1; ii <= dofMask.giveSize(); ii++ ) { ///@todo How should be deal with slave dofs and such? dofMask.size() != locationArray.size() will happen // exclude slaves; they are determined from masters if ( newd->giveNode(inode)->giveDof(ii)->isPrimaryDof() ) { answer.at( locationArray.at(ii) ) += unknownValues.at(ii); } } } else { // assemble the interpolated values to global vector using locationArray of new node answer.assemble(unknownValues, locationArray); } } else { OOFEM_ERROR2("EIPrimaryUnknownMapper :: mapAndUpdate - evaluateAt service failed for node %d", inode); } } return 1; }
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(); }