private double[,] MainStiffnessPart(double penaltyFactor, double[] normalVector, double[,] aMatrix) { double[,] nxn = VectorOperations.VectorVectorTensorProduct(normalVector, normalVector); double[,] aT = MatrixOperations.Transpose(aMatrix); double[,] nxna = MatrixOperations.MatrixProduct(nxn, aMatrix); double[,] aTnxna = MatrixOperations.MatrixProduct(aT, nxna); double[,] Kmain = MatrixOperations.ScalarMatrixProductNew(penaltyFactor, aTnxna); return(Kmain); }
private double[,] CalculateMainStiffnessPart(double ksi1, double[] n) { double[,] mainStiffnessMatrix = new double[6, 6]; double N1 = 1.0 / 2.0 * (1.0 - ksi1); double N2 = 1.0 / 2.0 * (1.0 + ksi1); Tuple <double[, ], double[, ]> positionMatrices = CalculatePositionMatrix(ksi1); double[,] A = positionMatrices.Item1; double[,] nxn = VectorOperations.VectorVectorTensorProduct(n, n); double[,] nxn_A = MatrixOperations.MatrixProduct(nxn, A); double[,] AT_nxn_A = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(A), nxn_A); mainStiffnessMatrix = MatrixOperations.ScalarMatrixProductNew(PenaltyFactor, AT_nxn_A); //mainStiffnessMatrix[0, 0] = N1 * N1 * n[0] * n[0] * PenaltyFactor; //mainStiffnessMatrix[0, 1] = N1 * N1 * n[0] * n[1] * PenaltyFactor; //mainStiffnessMatrix[0, 2] = N1 * N2 * n[0] * n[0] * PenaltyFactor; //mainStiffnessMatrix[0, 3] = N1 * N1 * n[0] * n[1] * PenaltyFactor; //mainStiffnessMatrix[0, 4] = -N1 * n[0] * n[0] * PenaltyFactor; //mainStiffnessMatrix[0, 5] = -N1 * n[0] * n[1] * PenaltyFactor; //mainStiffnessMatrix[1, 0] = mainStiffnessMatrix[0, 1]; //mainStiffnessMatrix[1, 1] = N1 * N1 * n[1] * n[1] * PenaltyFactor; //mainStiffnessMatrix[1, 2] = N1 * N2 * n[0] * n[1] * PenaltyFactor; //mainStiffnessMatrix[1, 3] = N1 * N2 * n[1] * n[1] * PenaltyFactor; //mainStiffnessMatrix[1, 4] = -N1 * n[0] * n[1] * PenaltyFactor; //mainStiffnessMatrix[1, 5] = -N1 * n[1] * n[1] * PenaltyFactor; //mainStiffnessMatrix[2, 0] = mainStiffnessMatrix[0, 2]; //mainStiffnessMatrix[2, 1] = mainStiffnessMatrix[1, 2]; //mainStiffnessMatrix[2, 2] = N2 * N2 * n[0] * n[0] * PenaltyFactor; //mainStiffnessMatrix[2, 3] = N2 * N2 * n[0] * n[1] * PenaltyFactor; //mainStiffnessMatrix[2, 4] = -N2 * n[0] * n[0] * PenaltyFactor; //mainStiffnessMatrix[2, 5] = -N2 * n[0] *n[1] * PenaltyFactor; //mainStiffnessMatrix[3, 0] = mainStiffnessMatrix[0, 3]; //mainStiffnessMatrix[3, 1] = mainStiffnessMatrix[1, 3]; //mainStiffnessMatrix[3, 2] = mainStiffnessMatrix[2, 3]; //mainStiffnessMatrix[3, 3] = N2 * N2 * n[1] * n[1] * PenaltyFactor; //mainStiffnessMatrix[3, 4] = -N2 * n[0] * n[1] * PenaltyFactor; //mainStiffnessMatrix[3, 5] = -N2 * n[1] * n[1] * PenaltyFactor; //mainStiffnessMatrix[4, 0] = mainStiffnessMatrix[0, 4]; //mainStiffnessMatrix[4, 1] = mainStiffnessMatrix[1, 4]; //mainStiffnessMatrix[4, 2] = mainStiffnessMatrix[2, 4]; //mainStiffnessMatrix[4, 3] = mainStiffnessMatrix[3, 4]; //mainStiffnessMatrix[4, 4] = n[0] * n[0] * PenaltyFactor; //mainStiffnessMatrix[4, 5] = n[0] * n[1] * PenaltyFactor; //mainStiffnessMatrix[5, 0] = mainStiffnessMatrix[0, 5]; //mainStiffnessMatrix[5, 1] = mainStiffnessMatrix[1, 5]; //mainStiffnessMatrix[5, 2] = mainStiffnessMatrix[2, 5]; //mainStiffnessMatrix[5, 3] = mainStiffnessMatrix[3, 5]; //mainStiffnessMatrix[5, 4] = mainStiffnessMatrix[4, 5]; //mainStiffnessMatrix[5, 5] = n[1] * n[1] * PenaltyFactor; return(mainStiffnessMatrix); }
private double[,] CalculateNormalStiffnessMatrix() { double[] n = CalculateNormalUnitVector(); double[,] A = CalculatePositionMatrix(); double[,] AT = MatrixOperations.Transpose(A); double[,] nxn = VectorOperations.VectorVectorTensorProduct(n, n); double[,] nxn_A = MatrixOperations.MatrixProduct(nxn, A); double[,] AT_nxn_A = MatrixOperations.MatrixProduct(AT, nxn_A); double[,] globalStiffnessMatrix = MatrixOperations.ScalarMatrixProductNew(PenaltyFactor, AT_nxn_A); return(globalStiffnessMatrix); }
private double[,] CalculateTangentialStiffnessMatrixForStick() { double[] t = CalculateTangentUnitVector(); double[,] A = CalculatePositionMatrix(); double[,] AT = MatrixOperations.Transpose(A); double[,] txt = VectorOperations.VectorVectorTensorProduct(t, t); double[,] txt_A = MatrixOperations.MatrixProduct(txt, A); double[,] AT_txt_A = MatrixOperations.MatrixProduct(AT, txt_A); double[,] tangentialStiffnessMatrix = MatrixOperations.ScalarMatrixProductNew(-PenaltyFactor, AT_txt_A); return(tangentialStiffnessMatrix); }
private double[,] CalculateMainStiffnessPart(double ksi1, double[] n) { double[,] mainStiffnessMatrix = new double[8, 8]; Tuple <double[, ], double[, ], double[, ]> positionMatrices = CalculatePositionMatrix(ksi1); double[,] A = positionMatrices.Item1; double[,] nxn = VectorOperations.VectorVectorTensorProduct(n, n); double[,] nxn_A = MatrixOperations.MatrixProduct(nxn, A); double[,] AT_nxn_A = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(A), nxn_A); mainStiffnessMatrix = MatrixOperations.ScalarMatrixProductNew(PenaltyFactor, AT_nxn_A); return(mainStiffnessMatrix); }
private double[,] CalculateMainStiffnessPart(double ksi1, double ksi2, double[] n) { int numberOfNodes = Properties.MasterSegmentPolynomialDegree + Properties.SlaveSegmentPolynomialDegree + 2; double[,] mainStiffnessMatrix = new double[2 * numberOfNodes, 2 * numberOfNodes]; Tuple <double[, ], double[, ], double[, ], double[, ], double[, ]> positionMatrices = CalculatePositionMatrix(ksi1, ksi2); double[,] A = positionMatrices.Item1; double[,] nxn = VectorOperations.VectorVectorTensorProduct(n, n); double[,] nxn_A = MatrixOperations.MatrixProduct(nxn, A); double[,] AT_nxn_A = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(A), nxn_A); mainStiffnessMatrix = MatrixOperations.ScalarMatrixProductNew(PenaltyFactor, AT_nxn_A); return(mainStiffnessMatrix); }
private double[,] CalculateTangentialStiffnessMatrixForSlip(double tangentialTraction) { double Tr = tangentialTraction; double[] t = CalculateTangentUnitVector(); double[] n = CalculateNormalUnitVector(); double[,] A = CalculatePositionMatrix(); double[,] AT = MatrixOperations.Transpose(A); double[,] txn = VectorOperations.VectorVectorTensorProduct(t, n); double[,] txn_A = MatrixOperations.MatrixProduct(txn, A); double[,] AT_txn_A = MatrixOperations.MatrixProduct(AT, txn_A); double scalarFactor = -FrictionCoef * PenaltyFactor * (Tr / Math.Abs(Tr)); double[,] tangentialStiffnessMatrix = MatrixOperations.ScalarMatrixProductNew(scalarFactor, AT_txn_A); return(tangentialStiffnessMatrix); }
private double[,] CalculateCurvatureStiffnessPart(double[,] A, double ksi3, double m11, double[] dRho, double h11) { double coef = PenaltyFactor * ksi3 * m11 * h11; double[,] curvaturePart; double[,] dRho_x_dRho = VectorOperations.VectorVectorTensorProduct(dRho, dRho); double[,] Matrix = MatrixOperations.MatrixProduct( MatrixOperations.Transpose(A), MatrixOperations.MatrixProduct(dRho_x_dRho, A) ); curvaturePart = MatrixOperations.ScalarMatrixProductNew( coef, Matrix ); return(curvaturePart); }
public double[,] CreateGlobalStiffnessMatrix() { double penetration = CalculateNormalGap(); if (penetration <= 0) { double[] n = CalculateNormalUnitVector(); double[,] A = CalculatePositionMatrix(); double[,] AT = MatrixOperations.Transpose(A); double[,] nxn = VectorOperations.VectorVectorTensorProduct(n, n); double[,] nxn_A = MatrixOperations.MatrixProduct(nxn, A); double[,] AT_nxn_A = MatrixOperations.MatrixProduct(AT, nxn_A); double[,] globalStiffnessMatrix = MatrixOperations.ScalarMatrixProductNew(PenaltyFactor, AT_nxn_A); return(globalStiffnessMatrix); } else { double[,] globalStifnessMatrix = new double[4, 4]; return(globalStifnessMatrix); } }
private double[,] CalculateRotationalStiffnessPart(double[,] A, double[,] dA, double[] n, double ksi3, double m11, double[] dRho) { double coef = PenaltyFactor * ksi3 * m11; double[,] rotationalPart; double[,] n_x_dRho = VectorOperations.VectorVectorTensorProduct(n, dRho); double[,] dRho_x_n = VectorOperations.VectorVectorTensorProduct(dRho, n); double[,] firstTerm = MatrixOperations.MatrixProduct( MatrixOperations.Transpose(dA), MatrixOperations.MatrixProduct(n_x_dRho, A) ); double[,] secondTerm = MatrixOperations.MatrixProduct( MatrixOperations.Transpose(A), MatrixOperations.MatrixProduct(dRho_x_n, dA) ); rotationalPart = MatrixOperations.ScalarMatrixProductNew( coef, MatrixOperations.MatrixAddition(firstTerm, secondTerm) ); return(rotationalPart); }
private double[,] CalculateRotationalStiffnessPart(double[,] A, double[,] dA, double[] n, double ksi3, double m11, double[] dRho) { double coef = PenaltyFactor * ksi3 * m11; double[,] rotationalPart; double[,] n_x_dRho = VectorOperations.VectorVectorTensorProduct(n, dRho); double[,] dRho_x_n = VectorOperations.VectorVectorTensorProduct(dRho, n); double[,] firstTerm = MatrixOperations.MatrixProduct( MatrixOperations.Transpose(dA), MatrixOperations.MatrixProduct(n_x_dRho, A) ); double[,] secondTerm = MatrixOperations.MatrixProduct( MatrixOperations.Transpose(A), MatrixOperations.MatrixProduct(dRho_x_n, dA) ); rotationalPart = MatrixOperations.ScalarMatrixProductNew( coef, MatrixOperations.MatrixAddition(firstTerm, secondTerm) ); //double[,] rotationalPart = new double[6, 6]; //double N1 = 1 / 2 * (1 - ksi1); //double N2 = 1 / 2 * (1 + ksi1); //double coef = PenaltyFactor * ksi3 * m11; //rotationalPart[0, 0] = -coef * N1 * drho[0] * n[0]; //rotationalPart[0, 1] = -coef * (N1 * drho[0] * n[1] / 2) - coef * (N1 * drho[1] * n[0] / 2); //rotationalPart[0, 2] = coef * (N1 * drho[0] * n[0] / 2) - coef * (N2 * drho[0] * n[0] / 2); //rotationalPart[0, 3] = coef * (N1 * drho[0] * n[1] / 2) - coef * (N2 * drho[1] * n[0] / 2); //rotationalPart[0, 4] = coef * (drho[0] * n[0] / 2); //rotationalPart[0, 5] = coef * (drho[1] * n[0] / 2) - coef * (N1 * drho[0] * n[1]); //rotationalPart[1, 0] = rotationalPart[0, 1]; //rotationalPart[1, 1] = -coef * N1 * drho[1] * n[1]; //rotationalPart[1, 2] = coef * (N1 * drho[1] * n[0] / 2) - coef * (N2 * drho[0] * n[1] / 2); //rotationalPart[1, 3] = coef * (N1 * drho[1] * n[1] / 2) - coef * (N2 * drho[1] * n[1] / 2); //rotationalPart[1, 4] = coef * drho[0] * n[1] / 2; //rotationalPart[1, 5] = coef * (drho[1] * n[1] / 2) - coef * (N1 * drho[1] * n[1]); return(rotationalPart); }
public double[,] CreateGlobalStiffnessMatrix() { //double ksi1 = ClosestPointProjection(); if (counter == 1) { Ksi1Initial = Ksi1Current; } counter = counter + 1; if (Math.Abs(Ksi1Current) <= 1.05) { Tuple <double[, ], double[, ]> positionMatrices = CalculatePositionMatrix(Ksi1Current); double[,] aMatrix = positionMatrices.Item1; double[,] daMatrix = positionMatrices.Item2; Tuple <double[], double, double[], double[], double> surfaceCharacteristics = SurfaceGeometry(daMatrix); double m11 = surfaceCharacteristics.Item2; double[] dRho = surfaceCharacteristics.Item1; double[] n = surfaceCharacteristics.Item3; double[] tVector = surfaceCharacteristics.Item4; double detM = surfaceCharacteristics.Item5; double ksi3 = CalculateNormalGap(aMatrix, n); if (ksi3 <= 0) { double[,] sN = CalculateMainStiffnessPart(Ksi1Current, n); double deltaKsi = CalculateTangentialVelocity(Ksi1Current, Ksi1Initial); double Tr1 = CalculateTangentialTraction(deltaKsi, detM); double phi = Math.Sqrt(Tr1 * Tr1 * m11) - FrictionCoef * PenaltyFactor * Math.Abs(ksi3); if (phi <= 0.0) { double T1 = Tr1; double[,] sT1 = MatrixOperations.ScalarMatrixProductNew(TangentPenaltyFactor, MatrixOperations.MatrixProduct( MatrixOperations.Transpose(aMatrix), MatrixOperations.MatrixProduct( VectorOperations.VectorVectorTensorProduct(tVector, tVector), aMatrix))); double[,] sT2 = MatrixOperations.ScalarMatrixProductNew(T1 * m11, MatrixOperations.MatrixProduct( MatrixOperations.Transpose(daMatrix), MatrixOperations.MatrixProduct( VectorOperations.VectorVectorTensorProduct(tVector, tVector), aMatrix))); double[,] sT = MatrixOperations.MatrixAddition( MatrixOperations.ScalarMatrixProductNew(-1.0, sT1), MatrixOperations.MatrixAddition(sT2, MatrixOperations.Transpose(sT2))); double[,] globalStiffnessMatrix = MatrixOperations.MatrixAddition(sN, sT); return(globalStiffnessMatrix); } else { double T1 = (Tr1 / Math.Abs(Tr1)) * mhid * PenaltyFactor * Math.Abs(ksi3) * Math.Sqrt(detM); double[,] sT1 = MatrixOperations.ScalarMatrixProductNew(mhid * PenaltyFactor * (Tr1 / Math.Abs(Tr1)), MatrixOperations.MatrixProduct( MatrixOperations.Transpose(aMatrix), MatrixOperations.MatrixProduct( VectorOperations.VectorVectorTensorProduct(tVector, n), aMatrix))); double[,] sT2 = MatrixOperations.ScalarMatrixProductNew(mhid * PenaltyFactor * Math.Abs(ksi3) * (Tr1 / Math.Abs(Tr1)) * Math.Sqrt(m11), MatrixOperations.MatrixProduct( MatrixOperations.Transpose(daMatrix), MatrixOperations.MatrixProduct( VectorOperations.VectorVectorTensorProduct(tVector, tVector), aMatrix))); double[,] sT = MatrixOperations.MatrixAddition( MatrixOperations.ScalarMatrixProductNew(-1.0, sT1), MatrixOperations.MatrixAddition(sT2, MatrixOperations.Transpose(sT2))); double[,] globalStiffnessMatrix = MatrixOperations.MatrixAddition(sN, sT); return(globalStiffnessMatrix); } //double[,] rotationalPart = CalculateRotationalStiffnessPart(aMatrix, daMatrix, n, ksi3, m11, dRho); //double[,] globalStiffnessMatrix = MatrixOperations.MatrixAddition(mainPart, rotationalPart); } else { double[,] globalStifnessMatrix = new double[6, 6]; return(globalStifnessMatrix); } } else { double[,] globalStifnessMatrix = new double[6, 6]; return(globalStifnessMatrix); } }
private double[,] RotationalStiffnessPart(double penaltyFactor, double[] normalVector, double[,] aMatrix, double[,] a1Matrix, double[,] a2Matrix, List <double[]> dRho, double ksi3) { double[,] m = MetricTensor(dRho); double[,] mInv = InverseMetricTensor(m); double scalar1 = penaltyFactor * ksi3 * mInv[0, 0]; double scalar2 = penaltyFactor * ksi3 * mInv[1, 0]; double scalar3 = penaltyFactor * ksi3 * mInv[0, 1]; double scalar4 = penaltyFactor * ksi3 * mInv[1, 1]; double[,] mat11 = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(a1Matrix), MatrixOperations.MatrixProduct(VectorOperations.VectorVectorTensorProduct(normalVector, dRho[0]), aMatrix)); double[,] mat12 = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(aMatrix), MatrixOperations.MatrixProduct(VectorOperations.VectorVectorTensorProduct(dRho[0], normalVector), a1Matrix)); double[,] mat21 = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(a1Matrix), MatrixOperations.MatrixProduct(VectorOperations.VectorVectorTensorProduct(normalVector, dRho[1]), aMatrix)); double[,] mat22 = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(aMatrix), MatrixOperations.MatrixProduct(VectorOperations.VectorVectorTensorProduct(dRho[0], normalVector), a2Matrix)); double[,] mat31 = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(a2Matrix), MatrixOperations.MatrixProduct(VectorOperations.VectorVectorTensorProduct(normalVector, dRho[0]), aMatrix)); double[,] mat32 = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(aMatrix), MatrixOperations.MatrixProduct(VectorOperations.VectorVectorTensorProduct(dRho[1], normalVector), a1Matrix)); double[,] mat41 = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(a2Matrix), MatrixOperations.MatrixProduct(VectorOperations.VectorVectorTensorProduct(normalVector, dRho[1]), aMatrix)); double[,] mat42 = MatrixOperations.MatrixProduct(MatrixOperations.Transpose(aMatrix), MatrixOperations.MatrixProduct(VectorOperations.VectorVectorTensorProduct(dRho[1], normalVector), a2Matrix)); double[,] mat1 = MatrixOperations.MatrixAddition(mat11, mat12); double[,] mat2 = MatrixOperations.MatrixAddition(mat21, mat22); double[,] mat3 = MatrixOperations.MatrixAddition(mat31, mat32); double[,] mat4 = MatrixOperations.MatrixAddition(mat41, mat42); double[,] Kr = MatrixOperations.MatrixAddition(MatrixOperations.MatrixAddition(MatrixOperations.MatrixAddition(MatrixOperations.ScalarMatrixProductNew(scalar1, mat1), MatrixOperations.ScalarMatrixProductNew(scalar2, mat2)), MatrixOperations.ScalarMatrixProductNew(scalar3, mat3)), MatrixOperations.ScalarMatrixProductNew(scalar4, mat4)); return(Kr); }