/// <summary> /// Generates the transposed strain-displacement matrix for the given element /// </summary> /// <returns></returns> public override KeyedRowColumnMatrix <Strain, NodalDegreeOfFreedom> StrainDisplacementMatrix(XYZ locationInLocalCoordinates) { IList <Strain> supportedDegreesOfFreedom = new List <Strain>(1); supportedDegreesOfFreedom.Add(Strain.LinearStrainX); IList <NodalDegreeOfFreedom> supportedNodalDegreeOfFreedoms = this.Element.SupportedLocalNodalDegreeOfFreedoms; KeyedRowColumnMatrix <Strain, NodalDegreeOfFreedom> strainDisplacementMatrix = new KeyedRowColumnMatrix <Strain, NodalDegreeOfFreedom>(supportedDegreesOfFreedom, supportedNodalDegreeOfFreedoms); double originalLength = this.Element.OriginalLength; strainDisplacementMatrix.At(Strain.LinearStrainX, new NodalDegreeOfFreedom(this.Element.StartNode, DegreeOfFreedom.X), -1.0 / originalLength); strainDisplacementMatrix.At(Strain.LinearStrainX, new NodalDegreeOfFreedom(this.Element.EndNode, DegreeOfFreedom.X), 1.0 / originalLength); return(strainDisplacementMatrix); }
private void SetSUTValues(double ax, double ay, double bx, double by, double cx, double cy) { SUT.At("a", "x", ax); SUT.At("a", "y", ay); SUT.At("b", "x", bx); SUT.At("b", "y", by); SUT.At("c", "x", cx); SUT.At("c", "y", cy); }
public static void AssertMatrix <TRowKey, TColumnKey>(KeyedRowColumnMatrix <TRowKey, TColumnKey> actual, int expectedRowCount, int expectedColumnCount, params double[] expectedValues) { if (expectedValues == null) { throw new ArgumentNullException("expectedValues"); } if (expectedRowCount * expectedColumnCount != expectedValues.Length) { throw new ArgumentException(String.Format("You have not provided the correct number of values to check for in the matrix. " + "You provided a expected Row count of {0} and an expected column count of {1}. " + "We would have expected {2} values, but you provided {3}. The actual matrix has {4} values.\n\r{5}", expectedRowCount, expectedColumnCount, expectedRowCount * expectedColumnCount, expectedValues.Length, actual.ColumnCount * actual.RowCount, actual)); } Assert.IsNotNull(actual); Assert.AreEqual(expectedRowCount, actual.RowCount, "RowCount is not correct"); Assert.AreEqual(expectedColumnCount, actual.ColumnCount, "ColumnCount"); int currentArrayIndex = 0; foreach (TRowKey rowKey in actual.RowKeys) { foreach (TColumnKey columnKey in actual.ColumnKeys) { Assert.AreEqual(expectedValues[currentArrayIndex], actual.At(rowKey, columnKey), 0.0005, String.Format("Row : {0}; Column : {1},\r\n" + "Actual : \r\n" + "{2}", rowKey, columnKey, PrettyPrintKeyedRowColumnMatrix(actual))); currentArrayIndex++; } } }
/// <summary> /// /// </summary> /// <returns></returns> public override KeyedRowColumnMatrix <Strain, NodalDegreeOfFreedom> StrainDisplacementMatrix(XYZ locationInLocalCoordinates) { IList <Strain> supportedStrains = this.SupportedStrains; IList <NodalDegreeOfFreedom> supportedNodalDegreesOfFreedom = this.Element.SupportedLocalNodalDegreeOfFreedoms; KeyedRowColumnMatrix <Strain, NodalDegreeOfFreedom> strainDisplacementMatrix = new KeyedRowColumnMatrix <Strain, NodalDegreeOfFreedom>(supportedStrains, supportedNodalDegreesOfFreedom); IFiniteElementNode node0 = this.Element.Nodes[0]; IFiniteElementNode node1 = this.Element.Nodes[1]; IFiniteElementNode node2 = this.Element.Nodes[2]; IDictionary <IFiniteElementNode, XYZ> localCoords = this.Element.CalculateLocalPositionsOfNodes(); XYZ node0Pos = localCoords[node0]; XYZ node1Pos = localCoords[node1]; XYZ node2Pos = localCoords[node2]; double constant = 1.0 / (2.0 * this.Element.Area); strainDisplacementMatrix.At(Strain.LinearStrainX, new NodalDegreeOfFreedom(node0, DegreeOfFreedom.X), constant * (node1Pos.Y - node2Pos.Y)); strainDisplacementMatrix.At(Strain.LinearStrainX, new NodalDegreeOfFreedom(node1, DegreeOfFreedom.X), constant * (node2Pos.Y - node0Pos.Y)); strainDisplacementMatrix.At(Strain.LinearStrainX, new NodalDegreeOfFreedom(node2, DegreeOfFreedom.X), constant * (node0Pos.Y - node1Pos.Y)); strainDisplacementMatrix.At(Strain.LinearStrainY, new NodalDegreeOfFreedom(node0, DegreeOfFreedom.Y), constant * (node2Pos.X - node1Pos.X)); strainDisplacementMatrix.At(Strain.LinearStrainY, new NodalDegreeOfFreedom(node1, DegreeOfFreedom.Y), constant * (node0Pos.X - node2Pos.X)); strainDisplacementMatrix.At(Strain.LinearStrainY, new NodalDegreeOfFreedom(node2, DegreeOfFreedom.Y), constant * (node1Pos.X - node0Pos.X)); strainDisplacementMatrix.At(Strain.ShearStrainXY, new NodalDegreeOfFreedom(node0, DegreeOfFreedom.X), constant * (node2Pos.X - node1Pos.X)); strainDisplacementMatrix.At(Strain.ShearStrainXY, new NodalDegreeOfFreedom(node0, DegreeOfFreedom.Y), constant * (node1Pos.Y - node2Pos.Y)); strainDisplacementMatrix.At(Strain.ShearStrainXY, new NodalDegreeOfFreedom(node1, DegreeOfFreedom.X), constant * (node0Pos.X - node2Pos.X)); strainDisplacementMatrix.At(Strain.ShearStrainXY, new NodalDegreeOfFreedom(node1, DegreeOfFreedom.Y), constant * (node2Pos.Y - node0Pos.Y)); strainDisplacementMatrix.At(Strain.ShearStrainXY, new NodalDegreeOfFreedom(node2, DegreeOfFreedom.X), constant * (node1Pos.X - node0Pos.X)); strainDisplacementMatrix.At(Strain.ShearStrainXY, new NodalDegreeOfFreedom(node2, DegreeOfFreedom.Y), constant * (node0Pos.Y - node1Pos.Y)); return(strainDisplacementMatrix); }