Exemple #1
0
        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);
        }
Exemple #2
0
        //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);
                    }
                }
            }
        }