public CrackElementPosition FindRelativePositionOf(XContinuumElement2D element) { CartesianPoint crackTip = lsm.GetCrackTip(CrackTipPosition.Single); double minBodyLevelSet = double.MaxValue; double maxBodyLevelSet = double.MinValue; double minTipLevelSet = double.MaxValue; double maxTipLevelSet = double.MinValue; foreach (XNode node in element.Nodes) { double bodyLevelSet = lsm.LevelSetsBody[node]; double tipLevelSet = lsm.LevelSetsTip[node]; if (bodyLevelSet < minBodyLevelSet) { minBodyLevelSet = bodyLevelSet; } if (bodyLevelSet > maxBodyLevelSet) { maxBodyLevelSet = bodyLevelSet; } if (tipLevelSet < minTipLevelSet) { minTipLevelSet = tipLevelSet; } if (tipLevelSet > maxTipLevelSet) { maxTipLevelSet = tipLevelSet; } } //Warning: this might actually be worse than Stolarska's criterion. At least that one enriched the dubious //intersected elements with tip enrichments. This one just ignores them. if (minBodyLevelSet * maxBodyLevelSet <= 0.0) { if (minTipLevelSet * maxTipLevelSet <= 0) { var outline = ConvexPolygon2D.CreateUnsafe(element.Nodes); if (outline.IsPointInsidePolygon(crackTip)) { return(CrackElementPosition.ContainsTip); } } else if (maxTipLevelSet < 0) { return(CrackElementPosition.Intersected); } } return(CrackElementPosition.Irrelevant); }
//TODO: replace this with the Faster~() version public CrackElementPosition FindRelativePositionOf(XContinuumElement2D element) { CartesianPoint crackTip = lsm.GetCrackTip(CrackTipPosition.Single); double minBodyLevelSet = double.MaxValue; double maxBodyLevelSet = double.MinValue; double minTipLevelSet = double.MaxValue; double maxTipLevelSet = double.MinValue; foreach (XNode node in element.Nodes) { double bodyLevelSet = lsm.LevelSetsBody[node]; double tipLevelSet = lsm.LevelSetsTip[node]; if (bodyLevelSet < minBodyLevelSet) { minBodyLevelSet = bodyLevelSet; } if (bodyLevelSet > maxBodyLevelSet) { maxBodyLevelSet = bodyLevelSet; } if (tipLevelSet < minTipLevelSet) { minTipLevelSet = tipLevelSet; } if (tipLevelSet > maxTipLevelSet) { maxTipLevelSet = tipLevelSet; } } // Warning: This criterion might give false positives for tip elements (see Serafeim's thesis for details) if (minBodyLevelSet * maxBodyLevelSet <= 0.0) { var outline = ConvexPolygon2D.CreateUnsafe(element.Nodes); if (outline.IsPointInsidePolygon(crackTip)) { return(CrackElementPosition.ContainsTip); } else if (maxTipLevelSet < 0) { return(CrackElementPosition.Intersected); } } return(CrackElementPosition.Irrelevant); }
public CrackElementPosition FindRelativePositionOf(XContinuumElement2D element) { CartesianPoint crackTip = lsm.GetCrackTip(CrackTipPosition.Single); double minBodyLevelSet = double.MaxValue; double maxBodyLevelSet = double.MinValue; double minTipLevelSet = double.MaxValue; double maxTipLevelSet = double.MinValue; foreach (XNode node in element.Nodes) { double bodyLevelSet = lsm.LevelSetsBody[node]; double tipLevelSet = lsm.LevelSetsTip[node]; if (bodyLevelSet < minBodyLevelSet) { minBodyLevelSet = bodyLevelSet; } if (bodyLevelSet > maxBodyLevelSet) { maxBodyLevelSet = bodyLevelSet; } if (tipLevelSet < minTipLevelSet) { minTipLevelSet = tipLevelSet; } if (tipLevelSet > maxTipLevelSet) { maxTipLevelSet = tipLevelSet; } } if (minBodyLevelSet * maxBodyLevelSet > 0.0) { return(CrackElementPosition.Irrelevant); } else // The element is intersected by the zero body level set. { if (minTipLevelSet > 0) { return(CrackElementPosition.Irrelevant); // intersected by the crack's extension } else if (maxTipLevelSet < 0) { return(CrackElementPosition.Intersected); } else // Stolarska's criterion marks all the next as tip elements { Dictionary <CartesianPoint, double> intersections = FindIntersectionsAndTipLevelSets(element); Debug.Assert((intersections.Count == 2) || (intersections.Count == 1)); // 1 is veeeeery improbable double tipLevelSetInter1 = intersections.First().Value; double tipLevelSetInter2 = intersections.Last().Value; if ((tipLevelSetInter1 > 0) && (tipLevelSetInter2 > 0)) { return(CrackElementPosition.Irrelevant); } else if ((tipLevelSetInter1 < 0) && (tipLevelSetInter2 < 0)) { return(CrackElementPosition.Intersected); } else { return(CrackElementPosition.ContainsTip); } } } }