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