/// <summary> /// /// </summary> /// <returns></returns> public override StiffnessMatrix LocalStiffnessMatrix() { double stiffness = this.CalculateStiffnessConstant(); StiffnessMatrix matrix = new StiffnessMatrix(this.Element.SupportedLocalNodalDegreeOfFreedoms); matrix.At(this.Element.StartNode, DegreeOfFreedom.X, this.Element.StartNode, DegreeOfFreedom.X, stiffness); matrix.At(this.Element.StartNode, DegreeOfFreedom.X, this.Element.EndNode, DegreeOfFreedom.X, -stiffness); matrix.At(this.Element.EndNode, DegreeOfFreedom.X, this.Element.StartNode, DegreeOfFreedom.X, -stiffness); matrix.At(this.Element.EndNode, DegreeOfFreedom.X, this.Element.EndNode, DegreeOfFreedom.X, stiffness); return(matrix); }
/// <summary> /// Returns a submatrix of the stiffness matrix. /// </summary> /// <param name="nodeRowKey">The rows of the returned matrix relate to <see cref="NodalDegreeOfFreedom">NodalDegreeOfFreedoms</see>, where the Node property of these NodalDegreeOfFreedom equals the nodeRowKey</param> /// <param name="nodeColumnKey">the node which defines the columns of the submatrix</param> /// <returns>A submatrix of the stiffness matrix</returns> public StiffnessMatrix SubMatrix(FiniteElementNode nodeRowKey, FiniteElementNode nodeColumnKey) { // TODO guard against bad parameters IList <NodalDegreeOfFreedom> validRowKeys = this.GetAllRowKeysWithMatchingNode(nodeRowKey); IList <NodalDegreeOfFreedom> validColumnKeys = this.GetAllColumnKeysWithMatchingNode(nodeColumnKey); StiffnessMatrix result = new StiffnessMatrix(validRowKeys, validColumnKeys); foreach (NodalDegreeOfFreedom rowKey in validRowKeys) { foreach (NodalDegreeOfFreedom columnKey in validColumnKeys) { result.At(rowKey, columnKey, this.At(rowKey, columnKey)); } } return(result); }
/// <summary> /// This function iterates through all the elements which provide stiffnesses for the given combination of nodal degree of freedoms /// and sums them to provide the total stiffness /// </summary> /// <param name="rowKeys">The nodal degree of freedoms which represent the rows of the matrix</param> /// <param name="columnKeys">The nodal degree of freedoms which represents the columns of the matrix</param> /// <returns>A matrix representing the stiffness for these combinations of rows and columns</returns> private StiffnessMatrix BuildStiffnessSubMatrix(IList <NodalDegreeOfFreedom> rowKeys, IList <NodalDegreeOfFreedom> columnKeys) { Guard.AgainstNullArgument(rowKeys, "rowKeys"); Guard.AgainstNullArgument(columnKeys, "columnKeys"); int numRows = rowKeys.Count; int numCols = columnKeys.Count; Guard.AgainstBadArgument( "rowKeys", () => { return(numRows == 0); }, "There must be at least one row"); Guard.AgainstBadArgument( "columnKeys", () => { return(numCols == 0); }, "There must be at least one column"); StiffnessMatrix result = new StiffnessMatrix(rowKeys, columnKeys); IList <IFiniteElement> connectedElements; foreach (NodalDegreeOfFreedom row in rowKeys) { foreach (NodalDegreeOfFreedom column in columnKeys) { connectedElements = this.parent.AllElementsDirectlyConnecting(row.Node, column.Node); double currentResult = this.SumStiffnessesForAllElementsAt(connectedElements, row, column); if (!currentResult.IsApproximatelyEqualTo(0.0)) { result.At(row, column, currentResult); } } } return(result); }
/// <summary> /// /// </summary> /// <returns></returns> public override StiffnessMatrix LocalStiffnessMatrix() { double length = this.Element.OriginalLength; StiffnessMatrix matrix = new StiffnessMatrix(this.Element.SupportedLocalNodalDegreeOfFreedoms); double axialStiffness = this.Element.StiffnessEA / length; matrix.At(this.Element.StartNode, DegreeOfFreedom.X, this.Element.StartNode, DegreeOfFreedom.X, axialStiffness); matrix.At(this.Element.StartNode, DegreeOfFreedom.X, this.Element.EndNode, DegreeOfFreedom.X, -axialStiffness); matrix.At(this.Element.EndNode, DegreeOfFreedom.X, this.Element.StartNode, DegreeOfFreedom.X, -axialStiffness); matrix.At(this.Element.EndNode, DegreeOfFreedom.X, this.Element.EndNode, DegreeOfFreedom.X, axialStiffness); double shearStiffnessInZ = 12.0 * this.Element.BendingStiffnessEIy / (length * length * length); matrix.At(this.Element.StartNode, DegreeOfFreedom.Z, this.Element.StartNode, DegreeOfFreedom.Z, shearStiffnessInZ); matrix.At(this.Element.StartNode, DegreeOfFreedom.Z, this.Element.EndNode, DegreeOfFreedom.Z, -shearStiffnessInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.Z, this.Element.StartNode, DegreeOfFreedom.Z, -shearStiffnessInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.Z, this.Element.EndNode, DegreeOfFreedom.Z, shearStiffnessInZ); double bendingStiffnessAboutYY = 2.0 * this.Element.BendingStiffnessEIy / length; matrix.At(this.Element.StartNode, DegreeOfFreedom.YY, this.Element.StartNode, DegreeOfFreedom.YY, 2.0 * bendingStiffnessAboutYY); matrix.At(this.Element.StartNode, DegreeOfFreedom.YY, this.Element.EndNode, DegreeOfFreedom.YY, bendingStiffnessAboutYY); matrix.At(this.Element.EndNode, DegreeOfFreedom.YY, this.Element.StartNode, DegreeOfFreedom.YY, bendingStiffnessAboutYY); matrix.At(this.Element.EndNode, DegreeOfFreedom.YY, this.Element.EndNode, DegreeOfFreedom.YY, 2.0 * bendingStiffnessAboutYY); double bendingAboutYYShearInZ = 6.0 * this.Element.BendingStiffnessEIy / (length * length); matrix.At(this.Element.StartNode, DegreeOfFreedom.Z, this.Element.StartNode, DegreeOfFreedom.YY, -bendingAboutYYShearInZ); matrix.At(this.Element.StartNode, DegreeOfFreedom.Z, this.Element.EndNode, DegreeOfFreedom.YY, -bendingAboutYYShearInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.Z, this.Element.StartNode, DegreeOfFreedom.YY, bendingAboutYYShearInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.Z, this.Element.EndNode, DegreeOfFreedom.YY, bendingAboutYYShearInZ); matrix.At(this.Element.StartNode, DegreeOfFreedom.YY, this.Element.StartNode, DegreeOfFreedom.Z, -bendingAboutYYShearInZ); matrix.At(this.Element.StartNode, DegreeOfFreedom.YY, this.Element.EndNode, DegreeOfFreedom.Z, bendingAboutYYShearInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.YY, this.Element.StartNode, DegreeOfFreedom.Z, -bendingAboutYYShearInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.YY, this.Element.EndNode, DegreeOfFreedom.Z, bendingAboutYYShearInZ); return(matrix); }
/// <summary> /// /// </summary> /// <returns></returns> public override StiffnessMatrix LocalStiffnessMatrix() { double length = this.Element.OriginalLength; StiffnessMatrix matrix = new StiffnessMatrix(this.Element.SupportedLocalNodalDegreeOfFreedoms); double axialStiffness = this.Element.CrossSection.Area * this.Element.Material.YoungsModulus / length; matrix.At(this.Element.StartNode, DegreeOfFreedom.X, this.Element.StartNode, DegreeOfFreedom.X, axialStiffness); matrix.At(this.Element.StartNode, DegreeOfFreedom.X, this.Element.EndNode, DegreeOfFreedom.X, -axialStiffness); matrix.At(this.Element.EndNode, DegreeOfFreedom.X, this.Element.StartNode, DegreeOfFreedom.X, -axialStiffness); matrix.At(this.Element.EndNode, DegreeOfFreedom.X, this.Element.EndNode, DegreeOfFreedom.X, axialStiffness); double shearStiffnessInY = 12.0 * this.Element.Material.YoungsModulus * this.Element.CrossSection.SecondMomentOfAreaAroundZZ / (length * length * length); matrix.At(this.Element.StartNode, DegreeOfFreedom.Y, this.Element.StartNode, DegreeOfFreedom.Y, shearStiffnessInY); matrix.At(this.Element.StartNode, DegreeOfFreedom.Y, this.Element.EndNode, DegreeOfFreedom.Y, -shearStiffnessInY); matrix.At(this.Element.EndNode, DegreeOfFreedom.Y, this.Element.StartNode, DegreeOfFreedom.Y, -shearStiffnessInY); matrix.At(this.Element.EndNode, DegreeOfFreedom.Y, this.Element.EndNode, DegreeOfFreedom.Y, shearStiffnessInY); double shearStiffnessInZ = 12.0 * this.Element.Material.YoungsModulus * this.Element.CrossSection.SecondMomentOfAreaAroundYY / (length * length * length); matrix.At(this.Element.StartNode, DegreeOfFreedom.Z, this.Element.StartNode, DegreeOfFreedom.Z, shearStiffnessInZ); matrix.At(this.Element.StartNode, DegreeOfFreedom.Z, this.Element.EndNode, DegreeOfFreedom.Z, -shearStiffnessInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.Z, this.Element.StartNode, DegreeOfFreedom.Z, -shearStiffnessInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.Z, this.Element.EndNode, DegreeOfFreedom.Z, shearStiffnessInZ); double torsionalStiffness = this.Element.Material.ShearModulusElasticity * this.Element.CrossSection.MomentOfInertiaInTorsion / length; matrix.At(this.Element.StartNode, DegreeOfFreedom.XX, this.Element.StartNode, DegreeOfFreedom.XX, torsionalStiffness); matrix.At(this.Element.StartNode, DegreeOfFreedom.XX, this.Element.EndNode, DegreeOfFreedom.XX, -torsionalStiffness); matrix.At(this.Element.EndNode, DegreeOfFreedom.XX, this.Element.StartNode, DegreeOfFreedom.XX, -torsionalStiffness); matrix.At(this.Element.EndNode, DegreeOfFreedom.XX, this.Element.EndNode, DegreeOfFreedom.XX, torsionalStiffness); double bendingStiffnessAboutYY = 2.0 * this.Element.Material.YoungsModulus * this.Element.CrossSection.SecondMomentOfAreaAroundYY / length; matrix.At(this.Element.StartNode, DegreeOfFreedom.YY, this.Element.StartNode, DegreeOfFreedom.YY, 2.0 * bendingStiffnessAboutYY); matrix.At(this.Element.StartNode, DegreeOfFreedom.YY, this.Element.EndNode, DegreeOfFreedom.YY, bendingStiffnessAboutYY); matrix.At(this.Element.EndNode, DegreeOfFreedom.YY, this.Element.StartNode, DegreeOfFreedom.YY, bendingStiffnessAboutYY); matrix.At(this.Element.EndNode, DegreeOfFreedom.YY, this.Element.EndNode, DegreeOfFreedom.YY, 2.0 * bendingStiffnessAboutYY); double bendingStiffnessAboutZZ = 2.0 * this.Element.Material.YoungsModulus * this.Element.CrossSection.SecondMomentOfAreaAroundZZ / length; matrix.At(this.Element.StartNode, DegreeOfFreedom.ZZ, this.Element.StartNode, DegreeOfFreedom.ZZ, 2.0 * bendingStiffnessAboutZZ); matrix.At(this.Element.StartNode, DegreeOfFreedom.ZZ, this.Element.EndNode, DegreeOfFreedom.ZZ, bendingStiffnessAboutZZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.ZZ, this.Element.StartNode, DegreeOfFreedom.ZZ, bendingStiffnessAboutZZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.ZZ, this.Element.EndNode, DegreeOfFreedom.ZZ, 2.0 * bendingStiffnessAboutZZ); double bendingAboutZZshearInY = 6.0 * this.Element.Material.YoungsModulus * this.Element.CrossSection.SecondMomentOfAreaAroundZZ / (length * length); matrix.At(this.Element.StartNode, DegreeOfFreedom.Y, this.Element.StartNode, DegreeOfFreedom.ZZ, bendingAboutZZshearInY); matrix.At(this.Element.StartNode, DegreeOfFreedom.Y, this.Element.EndNode, DegreeOfFreedom.ZZ, bendingAboutZZshearInY); matrix.At(this.Element.EndNode, DegreeOfFreedom.Y, this.Element.StartNode, DegreeOfFreedom.ZZ, -bendingAboutZZshearInY); matrix.At(this.Element.EndNode, DegreeOfFreedom.Y, this.Element.EndNode, DegreeOfFreedom.ZZ, -bendingAboutZZshearInY); matrix.At(this.Element.StartNode, DegreeOfFreedom.ZZ, this.Element.StartNode, DegreeOfFreedom.Y, bendingAboutZZshearInY); matrix.At(this.Element.StartNode, DegreeOfFreedom.ZZ, this.Element.EndNode, DegreeOfFreedom.Y, -bendingAboutZZshearInY); matrix.At(this.Element.EndNode, DegreeOfFreedom.ZZ, this.Element.StartNode, DegreeOfFreedom.Y, bendingAboutZZshearInY); matrix.At(this.Element.EndNode, DegreeOfFreedom.ZZ, this.Element.EndNode, DegreeOfFreedom.Y, -bendingAboutZZshearInY); double bendingAboutYYShearInZ = 6.0 * this.Element.Material.YoungsModulus * this.Element.CrossSection.SecondMomentOfAreaAroundYY / (length * length); matrix.At(this.Element.StartNode, DegreeOfFreedom.Z, this.Element.StartNode, DegreeOfFreedom.YY, -bendingAboutYYShearInZ); matrix.At(this.Element.StartNode, DegreeOfFreedom.Z, this.Element.EndNode, DegreeOfFreedom.YY, -bendingAboutYYShearInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.Z, this.Element.StartNode, DegreeOfFreedom.YY, bendingAboutYYShearInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.Z, this.Element.EndNode, DegreeOfFreedom.YY, bendingAboutYYShearInZ); matrix.At(this.Element.StartNode, DegreeOfFreedom.YY, this.Element.StartNode, DegreeOfFreedom.Z, -bendingAboutYYShearInZ); matrix.At(this.Element.StartNode, DegreeOfFreedom.YY, this.Element.EndNode, DegreeOfFreedom.Z, bendingAboutYYShearInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.YY, this.Element.StartNode, DegreeOfFreedom.Z, -bendingAboutYYShearInZ); matrix.At(this.Element.EndNode, DegreeOfFreedom.YY, this.Element.EndNode, DegreeOfFreedom.Z, bendingAboutYYShearInZ); return(matrix); }