Ejemplo n.º 1
0
        /// <summary>
        /// Calculates displacements of knots for post-processing with Paraview.
        /// </summary>
        /// <param name="element">An element of type <see cref="NurbsElement3D"/>.</param>
        /// <param name="localDisplacements">A <see cref="Matrix"/> containing the displacements for the degrees of freedom of the element.</param>
        /// <returns>A <see cref="double"/> array calculating the displacement of the element Knots'.
        /// The rows of the matrix denote the knot numbering while the columns the displacements for each degree of freedom.</returns>
        public double[,] CalculateDisplacementsForPostProcessing(Element element, Matrix localDisplacements)
        {
            Contract.Requires(element != null, "The element cannot be null");

            var     nurbsElement                  = (NurbsElement3D)element;
            var     elementControlPoints          = nurbsElement.ControlPoints.ToArray();
            var     elementKnots                  = nurbsElement.Knots.ToArray();
            var     knotParametricCoordinatesKsi  = Vector.CreateFromArray(new double[] { elementKnots[0].Ksi, elementKnots[4].Ksi });
            var     knotParametricCoordinatesHeta = Vector.CreateFromArray(new double[] { elementKnots[0].Heta, elementKnots[2].Heta });
            var     knotParametricCoordinatesΖeta = Vector.CreateFromArray(new double[] { elementKnots[0].Zeta, elementKnots[1].Zeta });
            Nurbs3D nurbs                   = new Nurbs3D(nurbsElement, elementControlPoints, knotParametricCoordinatesKsi, knotParametricCoordinatesHeta, knotParametricCoordinatesΖeta);
            var     knotDisplacements       = new double[8, 3];
            var     paraviewKnotRenumbering = new int[] { 0, 4, 2, 6, 1, 5, 3, 7 };

            for (int j = 0; j < elementKnots.Length; j++)
            {
                for (int i = 0; i < elementControlPoints.Length; i++)
                {
                    knotDisplacements[paraviewKnotRenumbering[j], 0] += nurbs.NurbsValues[i, j] * localDisplacements[i, 0];
                    knotDisplacements[paraviewKnotRenumbering[j], 1] += nurbs.NurbsValues[i, j] * localDisplacements[i, 1];
                    knotDisplacements[paraviewKnotRenumbering[j], 2] += nurbs.NurbsValues[i, j] * localDisplacements[i, 2];
                }
            }

            return(knotDisplacements);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Calculates the stiffness matrix of the element.
        /// </summary>
        /// <param name="element">An element of type <see cref="NurbsElement3D"/>.</param>
        /// <returns>An <see cref="IMatrix"/> containing the stiffness matrix of an <see cref="NurbsElement3D"/>.</returns>
        public IMatrix StiffnessMatrix(IElement element)
        {
            var nurbsElement         = (NurbsElement3D)element;
            var elementControlPoints = nurbsElement.ControlPoints.ToArray();
            IList <GaussLegendrePoint3D> gaussPoints = CreateElementGaussPoints(nurbsElement);
            Matrix stiffnessMatrixElement            = Matrix.CreateZero(nurbsElement.ControlPointsDictionary.Count * 3, nurbsElement.ControlPointsDictionary.Count * 3);

            Nurbs3D nurbs = new Nurbs3D(nurbsElement, elementControlPoints);

            for (int j = 0; j < gaussPoints.Count; j++)
            {
                Matrix jacobianMatrix = CalculateJacobian(elementControlPoints, nurbs, j);

                double jacdet = CalculateJacobianDeterminant(jacobianMatrix);

                Matrix inverseJacobian = CalculateInverseJacobian(jacobianMatrix, jacdet);

                Matrix B1 = CalculateDeformationMatrix1(inverseJacobian);

                Matrix B2 = CalculateDeformationMatrix2(elementControlPoints, nurbs, j);

                Matrix B = B1 * B2;

                IMatrixView E = ((IContinuumMaterial3D)nurbsElement.Patch.Material).ConstitutiveMatrix;
                Matrix      stiffnessMatrixGaussPoint = B.ThisTransposeTimesOtherTimesThis(E) * jacdet * gaussPoints[j].WeightFactor;

                for (int m = 0; m < elementControlPoints.Length * 3; m++)
                {
                    for (int n = 0; n < elementControlPoints.Length * 3; n++)
                    {
                        stiffnessMatrixElement[m, n] += stiffnessMatrixGaussPoint[m, n];
                    }
                }
            }
            return(stiffnessMatrixElement);
        }
Ejemplo n.º 3
0
        private static Matrix CalculateJacobian(IList <ControlPoint> elementControlPoints, Nurbs3D nurbs, int j)
        {
            Matrix jacobianMatrix = Matrix.CreateZero(3, 3);

            for (int k = 0; k < elementControlPoints.Count; k++)
            {
                jacobianMatrix[0, 0] += nurbs.NurbsDerivativeValuesKsi[k, j] * elementControlPoints[k].X;
                jacobianMatrix[0, 1] += nurbs.NurbsDerivativeValuesKsi[k, j] * elementControlPoints[k].Y;
                jacobianMatrix[0, 2] += nurbs.NurbsDerivativeValuesKsi[k, j] * elementControlPoints[k].Z;
                jacobianMatrix[1, 0] += nurbs.NurbsDerivativeValuesHeta[k, j] * elementControlPoints[k].X;
                jacobianMatrix[1, 1] += nurbs.NurbsDerivativeValuesHeta[k, j] * elementControlPoints[k].Y;
                jacobianMatrix[1, 2] += nurbs.NurbsDerivativeValuesHeta[k, j] * elementControlPoints[k].Z;
                jacobianMatrix[2, 0] += nurbs.NurbsDerivativeValuesZeta[k, j] * elementControlPoints[k].X;
                jacobianMatrix[2, 1] += nurbs.NurbsDerivativeValuesZeta[k, j] * elementControlPoints[k].Y;
                jacobianMatrix[2, 2] += nurbs.NurbsDerivativeValuesZeta[k, j] * elementControlPoints[k].Z;
            }

            return(jacobianMatrix);
        }
Ejemplo n.º 4
0
        private static Matrix CalculateDeformationMatrix2(IList <ControlPoint> elementControlPoints, Nurbs3D nurbs, int j)
        {
            Matrix B2 = Matrix.CreateZero(9, 3 * elementControlPoints.Count);

            for (int column = 0; column < 3 * elementControlPoints.Count; column += 3)
            {
                B2[0, column] += nurbs.NurbsDerivativeValuesKsi[column / 3, j];
                B2[1, column] += nurbs.NurbsDerivativeValuesHeta[column / 3, j];
                B2[2, column] += nurbs.NurbsDerivativeValuesZeta[column / 3, j];

                B2[3, column + 1] += nurbs.NurbsDerivativeValuesKsi[column / 3, j];
                B2[4, column + 1] += nurbs.NurbsDerivativeValuesHeta[column / 3, j];
                B2[5, column + 1] += nurbs.NurbsDerivativeValuesZeta[column / 3, j];

                B2[6, column + 2] += nurbs.NurbsDerivativeValuesKsi[column / 3, j];
                B2[7, column + 2] += nurbs.NurbsDerivativeValuesHeta[column / 3, j];
                B2[8, column + 2] += nurbs.NurbsDerivativeValuesZeta[column / 3, j];
            }

            return(B2);
        }