public static void TestJIntegral(int numElemX, int numElemY, double jIntegralRadiusRatio, double expectedJIntegral, double expectedSifMode1) { // Analyze the model var dcb = new DoubleCantileverBeam(); dcb.CreateModel(numElemX, numElemY, jIntegralRadiusRatio); XModel model = dcb.Model; TrackingExteriorCrackLSM crack = dcb.Crack; (IVectorView globalU, IMatrixView globalK) = dcb.SolveModel(); var freeDisplacementsPerSubdomain = new Dictionary <int, Vector>(); freeDisplacementsPerSubdomain[model.Subdomains.First().Key] = (Vector)globalU; (double jIntegral, double sifMode1) = dcb.Propagate(freeDisplacementsPerSubdomain); // Check the results. For now, they are allowed to be more accurate. double tolerance = 1E-6; Assert.InRange(Math.Round(jIntegral, 3), 2.100, expectedJIntegral); // All Assert.InRange(Math.Round(sifMode1, 3), 2148.000, expectedSifMode1); //TODO: Find out why not all cases satisfy these //Assert.Equal(expectedJIntegral, Math.Round(jIntegral, 3)); //Assert.Equal(expectedSifMode1, Math.Round(sifMode1, 3)); }
public static void TestDisplacements135x45() { double[] expectedDisplacements = { 9.12E-3, -48.17E-3, 9.12E-3, 48.17E-3, 0.43E-3, 48.17E-3, -0.43E-3, 48.17E-3 }; // Analyze the model var dcb = new DoubleCantileverBeam(); dcb.CreateModel(135, 45, 2.0); XModel model = dcb.Model; TrackingExteriorCrackLSM crack = dcb.Crack; (IVectorView globalU, IMatrixView globalK) = dcb.SolveModel(); // Locate nodes double tol = 1E-6; double L = DoubleCantileverBeam.beamLength; IEnumerable <XNode> rightNodes = model.Nodes.Where(n => Math.Abs(n.X - L) <= tol); XNode[] crackMouthNodes = rightNodes.Where(n => n.EnrichmentItems.Count > 0).ToArray(); Assert.Equal(2, crackMouthNodes.Length); XNode crackMouthBottom = crackMouthNodes.OrderBy(n => n.Y).First(); XNode crackMouthTop = crackMouthNodes.OrderBy(n => n.Y).Last(); // Extract displacements of standard dofs var displacements = Vector.CreateZero(8); DofTable freeDofs = model.Subdomains[DoubleCantileverBeam.subdomainID].FreeDofOrdering.FreeDofs; displacements[0] = globalU[freeDofs[crackMouthBottom, StructuralDof.TranslationX]]; displacements[1] = globalU[freeDofs[crackMouthBottom, StructuralDof.TranslationY]]; displacements[2] = globalU[freeDofs[crackMouthTop, StructuralDof.TranslationX]]; displacements[3] = globalU[freeDofs[crackMouthTop, StructuralDof.TranslationY]]; // Enriched dofs IReadOnlyList <EnrichedDof> enrichedDofs = crack.CrackBodyEnrichment.Dofs; displacements[4] = globalU[freeDofs[crackMouthBottom, enrichedDofs[0]]]; displacements[5] = globalU[freeDofs[crackMouthBottom, enrichedDofs[1]]]; displacements[6] = globalU[freeDofs[crackMouthTop, enrichedDofs[0]]]; displacements[7] = globalU[freeDofs[crackMouthTop, enrichedDofs[1]]]; // Check double tolerance = 1E-13; Func <double, double> round = x => 1E-3 * Math.Round(x * 1E3, 2); Assert.True(Vector.CreateFromArray(expectedDisplacements).Equals(displacements.DoToAllEntries(round), tolerance)); }