void Delamination :: appendInputRecords(DynamicDataReader &oDR) { ///@todo almost everything is copied from EnrichmentItem :: giveInputRecord, should be written in a better way DynamicInputRecord *eiRec = new DynamicInputRecord(); FEMComponent :: giveInputRecord(* eiRec); eiRec->setField(mEnrFrontIndex, _IFT_EnrichmentItem_front); eiRec->setField(mPropLawIndex, _IFT_EnrichmentItem_propagationlaw); // Delamination specific records eiRec->setField(this->interfaceNum, _IFT_Delamination_interfacenum); eiRec->setField(this->crossSectionNum, _IFT_Delamination_csnum); eiRec->setField(this->matNum, _IFT_Delamination_CohesiveZoneMaterial); oDR.insertInputRecord(DataReader :: IR_enrichItemRec, eiRec); // Enrichment function DynamicInputRecord *efRec = new DynamicInputRecord(); mpEnrichmentFunc->giveInputRecord(* efRec); oDR.insertInputRecord(DataReader :: IR_enrichFuncRec, efRec); // Enrichment domain DynamicInputRecord *geoRec = new DynamicInputRecord(); geoRec->setRecordKeywordField(this->giveInputRecordName(), 1); IntArray idList; idList.resize( dofManList.size() ); for ( size_t i = 0; i < dofManList.size(); i++ ) { idList.at(i + 1) = dofManList [ i ]; } geoRec->setField(idList, _IFT_ListBasedEI_list); oDR.insertInputRecord(DataReader :: IR_geoRec, geoRec); // Enrichment front if ( mEnrFrontIndex != 0 ) { DynamicInputRecord *efrRecStart = new DynamicInputRecord(); mpEnrichmentFrontStart->giveInputRecord(* efrRecStart); oDR.insertInputRecord(DataReader :: IR_enrichFrontRec, efrRecStart); DynamicInputRecord *efrRecEnd = new DynamicInputRecord(); mpEnrichmentFrontEnd->giveInputRecord(* efrRecEnd); oDR.insertInputRecord(DataReader :: IR_enrichFrontRec, efrRecEnd); } if ( mPropLawIndex != 0 ) { // Propagation law DynamicInputRecord *plRec = new DynamicInputRecord(); this->mpPropagationLaw->giveInputRecord(* plRec); oDR.insertInputRecord(DataReader :: IR_propagationLawRec, plRec); } }
void Delamination :: appendInputRecords(DynamicDataReader &oDR) { ///@todo almost everything is copied from EnrichmentItem :: giveInputRecord, should be written in a better way DynamicInputRecord *eiRec = new DynamicInputRecord(); FEMComponent :: giveInputRecord(* eiRec); eiRec->setField(mEnrFrontIndex, _IFT_EnrichmentItem_front); eiRec->setField(mPropLawIndex, _IFT_EnrichmentItem_propagationlaw); // Delamination specific records eiRec->setField(this->interfaceNum, _IFT_Delamination_interfacenum); eiRec->setField(this->crossSectionNum, _IFT_Delamination_csnum); eiRec->setField(this->matNum, _IFT_Delamination_CohesiveZoneMaterial); oDR.insertInputRecord(DataReader :: IR_enrichItemRec, eiRec); // Enrichment function DynamicInputRecord *efRec = new DynamicInputRecord(); mpEnrichmentFunc->giveInputRecord(* efRec); oDR.insertInputRecord(DataReader :: IR_enrichFuncRec, efRec); // Enrichment domain DynamicInputRecord *edRec = new DynamicInputRecord(); mpEnrichmentDomain->giveInputRecord(* edRec); oDR.insertInputRecord(DataReader :: IR_geoRec, edRec); // Enrichment front if ( mEnrFrontIndex != 0 ) { DynamicInputRecord *efrRecStart = new DynamicInputRecord(); mpEnrichmentFrontStart->giveInputRecord(* efrRecStart); oDR.insertInputRecord(DataReader :: IR_enrichFrontRec, efrRecStart); DynamicInputRecord *efrRecEnd = new DynamicInputRecord(); mpEnrichmentFrontEnd->giveInputRecord(* efrRecEnd); oDR.insertInputRecord(DataReader :: IR_enrichFrontRec, efrRecEnd); } if ( mPropLawIndex != 0 ) { // Propagation law DynamicInputRecord *plRec = new DynamicInputRecord(); this->mpPropagationLaw->giveInputRecord(* plRec); oDR.insertInputRecord(DataReader :: IR_propagationLawRec, plRec); } }
void XfemStructureManager :: splitCracks() { // Loop over cracks for ( int i = 1; i <= giveNumberOfEnrichmentItems(); i++ ) { Crack *crack_i = dynamic_cast< Crack * >( this->giveEnrichmentItem(i) ); if ( crack_i ) { // Check if crack i intersects with any of the cracks [1,i-1]: for ( int j = 1; j < i; j++ ) { // TODO: To improve performance, we may wish to use // a tree structure here. bool splittedCrack = false; Crack *crack_j = dynamic_cast< Crack * >( this->giveEnrichmentItem(j) ); if ( crack_j ) { // If so, find the arc length positions of the intersections on crack i ... std :: vector< FloatArray >intersectionPoints; std :: vector< double >arcPositions_i, arcPositions_j; crack_i->computeCrackIntersectionPoints(* crack_j, intersectionPoints, arcPositions_i); crack_j->computeArcPoints(intersectionPoints, arcPositions_j); const double arcLengthTol = 1.0e-6; for ( int k = 0; k < int( arcPositions_i.size() ); k++ ) { if ( arcPositions_i [ k ] < arcLengthTol || arcPositions_i [ k ] > ( 1.0 - arcLengthTol ) || arcPositions_j [ k ] < arcLengthTol || arcPositions_j [ k ] > ( 1.0 - arcLengthTol ) ) { arcPositions_i.erase(arcPositions_i.begin() + k); arcPositions_j.erase(arcPositions_j.begin() + k); k--; } } if ( arcPositions_i.size() > 0 ) { arcPositions_i.insert(arcPositions_i.begin(), 0.0); arcPositions_i.push_back(1.0); arcPositions_j.insert(arcPositions_j.begin(), 0.0); arcPositions_j.push_back(1.0); for ( int k = 1; k < int( arcPositions_i.size() ); k++ ) { // Only include segments of finite length if ( fabs(arcPositions_i [ k ] - arcPositions_i [ k - 1 ]) > arcLengthTol ) { //printf("arcPositions.size(): %lu\n", arcPositions.size() ); DynamicDataReader dataReader; crack_i->appendInputRecords(dataReader); // ... split crack i at the intersection and add intersection enrichment // fronts at the newly detected intersections. int n1 = this->giveNumberOfEnrichmentItems() + 1; // EnrichmentItem *newEI_1 = new Crack(n1, this, this->giveDomain() ); Crack *newCrack = new Crack( n1, this, this->giveDomain() ); std :: unique_ptr< EnrichmentItem >newEI_1(newCrack); InputRecord *ir = dataReader.giveInputRecord(DataReader :: IR_enrichItemRec, i); newEI_1->initializeFrom(ir); newEI_1->instanciateYourself(& dataReader); PolygonLine *new_pl = dynamic_cast< PolygonLine * >( newCrack->giveGeometry() ); // EDCrack *ed = dynamic_cast<EDCrack*>( newEI_1->giveEnrichmentDomain() ); if ( new_pl == NULL ) { OOFEM_ERROR("Failed to cast PolygonLine *new_pl.") } if ( new_pl != NULL ) { //printf("arcPositions_i[k-1]: %e arcPositions_i[k]: %e\n", arcPositions_i[k-1], arcPositions_i[k] ); new_pl->cropPolygon(arcPositions_i [ k - 1 ], arcPositions_i [ k ]); PolygonLine *polygonLine_j = dynamic_cast< PolygonLine * >( crack_j->giveGeometry() ); if ( polygonLine_j == NULL ) { OOFEM_ERROR("Failed to cast PolygonLine *polygonLine_j.") } PolygonLine *polygonLine_i = dynamic_cast< PolygonLine * >( crack_i->giveGeometry() ); if ( polygonLine_i == NULL ) { OOFEM_ERROR("Failed to cast PolygonLine *polygonLine_i.") } // Take enrichment front tangent direction // as the normal direction of crack_j // EnrichmentDomain_BG *ed_crack_j = dynamic_cast<EnrichmentDomain_BG*>( crack_j->giveEnrichmentDomain() ); // if(ed_crack_j == NULL) { // OOFEM_ERROR("Failed to cast EnrichmentDomain_BG *ed_crack_j.") // } // // PolygonLine *polygonLine_j = dynamic_cast<PolygonLine*>( ed_crack_j->bg ); // if(polygonLine_j == NULL) { // OOFEM_ERROR("Failed to cast PolygonLine *polygonLine_j.") // } // // EnrichmentDomain_BG *ed_crack_i = dynamic_cast<EnrichmentDomain_BG*>( crack_i->giveEnrichmentDomain() ); // if(ed_crack_i == NULL) { // OOFEM_ERROR("Failed to cast EnrichmentDomain_BG *ed_crack_i.") // } // // PolygonLine *polygonLine_i = dynamic_cast<PolygonLine*>( ed_crack_i->bg ); // if(polygonLine_i == NULL) { // OOFEM_ERROR("Failed to cast PolygonLine *polygonLine_i.") // } // Change enrichment fronts if ( k - 1 > 0 ) { FloatArray frontTangent1; polygonLine_j->giveNormal(frontTangent1, arcPositions_j [ k - 1 ]); FloatArray crackTangent1; polygonLine_i->giveTangent(crackTangent1, arcPositions_i [ k - 1 ]); crackTangent1.times(-1.0); EnrFrontIntersection *ef = new EnrFrontIntersection(); if ( frontTangent1.dotProduct(crackTangent1) < 0.0 ) { frontTangent1.times(-1.0); } ef->setTangent(frontTangent1); newEI_1->setEnrichmentFrontStart(ef); } if ( k < int( arcPositions_i.size() ) - 1 ) { FloatArray frontTangent1; polygonLine_j->giveNormal(frontTangent1, arcPositions_j [ k ]); FloatArray crackTangent1; polygonLine_i->giveTangent(crackTangent1, arcPositions_i [ k ]); EnrFrontIntersection *ef = new EnrFrontIntersection(); if ( frontTangent1.dotProduct(crackTangent1) < 0.0 ) { frontTangent1.times(-1.0); } ef->setTangent(frontTangent1); newEI_1->setEnrichmentFrontEnd(ef); } } //this->enrichmentItemList[i-1] = std :: move(ei); this->enrichmentItemList.push_back(NULL); newEI_1->updateGeometry(); this->enrichmentItemList [ enrichmentItemList.size() - 1 ] = std :: move(newEI_1); splittedCrack = true; } } } } if ( splittedCrack ) { enrichmentItemList.erase(enrichmentItemList.begin() + i - 1); numberOfEnrichmentItems = giveNumberOfEnrichmentItems(); i--; break; } }