/// <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); }
/// <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); }
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); }
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); }