153void XfemStructureManager :: splitCracks()
160 for (
int j = 1; j < i; j++ ) {
163 bool splittedCrack =
false;
169 std :: vector< FloatArray >intersectionPoints;
170 std :: vector< double >arcPositions_i, arcPositions_j;
174 const double arcLengthTol = 1.0e-6;
176 for (
int k = 0; k < int( arcPositions_i.size() ); k++ ) {
177 if ( arcPositions_i [ k ] < arcLengthTol || arcPositions_i [ k ] > ( 1.0 - arcLengthTol ) || arcPositions_j [ k ] < arcLengthTol || arcPositions_j [ k ] > ( 1.0 - arcLengthTol ) ) {
178 arcPositions_i.erase(arcPositions_i.begin() + k);
179 arcPositions_j.erase(arcPositions_j.begin() + k);
184 if ( arcPositions_i.size() > 0 ) {
185 arcPositions_i.insert(arcPositions_i.begin(), 0.0);
186 arcPositions_i.push_back(1.0);
187 arcPositions_j.insert(arcPositions_j.begin(), 0.0);
188 arcPositions_j.push_back(1.0);
190 for (
int k = 1; k < int( arcPositions_i.size() ); k++ ) {
192 if ( fabs(arcPositions_i [ k ] - arcPositions_i [ k - 1 ]) > arcLengthTol ) {
202 auto newCrack = std::make_unique<Crack>( n1,
this, this->
giveDomain() );
204 auto &ir = dataReader.
giveInputRecord(DataReader :: IR_enrichItemRec, i);
205 newCrack->initializeFrom(ir);
206 newCrack->instanciateYourself(dataReader);
215 new_pl->
cropPolygon(arcPositions_i [ k - 1 ], arcPositions_i [ k ]);
220 if ( !polygonLine_j ) {
221 OOFEM_ERROR(
"Failed to cast PolygonLine *polygonLine_j.")
226 if ( !polygonLine_i ) {
227 OOFEM_ERROR(
"Failed to cast PolygonLine *polygonLine_i.")
256 polygonLine_j->
giveNormal(frontTangent1, arcPositions_j [ k - 1 ]);
259 polygonLine_i->
giveTangent(crackTangent1, arcPositions_i [ k - 1 ]);
260 crackTangent1.
times(-1.0);
262 if ( frontTangent1.
dotProduct(crackTangent1) < 0.0 ) {
263 frontTangent1.
times(-1.0);
265 auto ef = std::make_unique<EnrFrontIntersection>();
266 ef->setTangent(frontTangent1);
268 newCrack->setEnrichmentFrontStart(std::move(ef));
271 if ( k <
int( arcPositions_i.size() ) - 1 ) {
273 polygonLine_j->
giveNormal(frontTangent1, arcPositions_j [ k ]);
276 polygonLine_i->
giveTangent(crackTangent1, arcPositions_i [ k ]);
279 if ( frontTangent1.
dotProduct(crackTangent1) < 0.0 ) {
280 frontTangent1.
times(-1.0);
282 auto ef = std::make_unique<EnrFrontIntersection>();
283 ef->setTangent(frontTangent1);
285 newCrack->setEnrichmentFrontEnd(std::move(ef));
291 newCrack->updateGeometry();
295 splittedCrack =
true;
301 if ( splittedCrack ) {
370void XfemStructureManager :: mergeCloseCracks()
385 bg_i->
giveTips(startTip_i, endTip_i) ;
392 if ( !polygonLine_i ) {
393 OOFEM_ERROR(
"Failed to cast PolygonLine *polygonLine_i.")
410 bg_j->
giveTips(startTip_j, endTip_j) ;
417 if ( !polygonLine_j ) {
418 OOFEM_ERROR(
"Failed to cast PolygonLine *polygonLine_j.")
422 if (
distance(ps_i, ps_j) < dist_tol ) {
423 printf(
"distance(ps_i, ps_j) < dist_tol\n");
427 printf(
"Preventing merge due to parallel tips.\n");
431 for (
int k = 1; k <= n; k++) {
438 polygonLine_j->
clear();
456 if (
distance(ps_i, pe_j) < dist_tol ) {
457 printf(
"distance(ps_i, pe_j) < dist_tol\n");
461 printf(
"Preventing merge due to parallel tips.\n");
466 for(
int k = n; k > 0; k--) {
473 polygonLine_j->
clear();
492 if (
distance(pe_i, ps_j) < dist_tol ) {
493 printf(
"distance(pe_i, ps_j) < dist_tol\n");
496 printf(
"Preventing merge due to parallel tips.\n");
501 for(
int k = 1; k <= n; k++) {
508 polygonLine_j->
clear();
525 if (
distance(pe_i, pe_j) < dist_tol ) {
526 printf(
"distance(pe_i, pe_j) < dist_tol\n");
529 printf(
"Preventing merge due to parallel tips.\n");
534 for(
int k = n; k > 0; k--) {
540 polygonLine_j->
clear();