public void RunExample() { double[,] matrix1 = MatrixOperations.CreateRandomMatrix(2000, 2000); double[,] matrix2 = MatrixOperations.CreateRandomMatrix(2000, 2000); double[] vector1 = VectorOperations.CreateRandomVector(2000); double[,] result1, result2, result1b, result2b; double[] result1c, result2c; double result1d, result2d; MatrixOperations.ParallelCalculations = false; Stopwatch watch1 = Stopwatch.StartNew(); result1 = MatrixOperations.MatrixAddition(matrix1, matrix2); result1b = MatrixOperations.MatrixProduct(matrix1, matrix2); result1c = VectorOperations.MatrixVectorProduct(result1b, vector1); result1d = VectorOperations.VectorNorm2(result1c); long first = watch1.ElapsedMilliseconds; MatrixOperations.ParallelCalculations = true; Stopwatch watch2 = Stopwatch.StartNew(); result2 = MatrixOperations.MatrixAddition(matrix1, matrix2); result2b = MatrixOperations.MatrixProduct(matrix1, matrix2); //result2 = MatrixOperations.TempVariable; result2c = VectorOperations.MatrixVectorProduct(result2b, vector1); result2d = VectorOperations.VectorNorm2(result2c); long second = watch2.ElapsedMilliseconds; string timeForCalculations = "Elapsed time for single threaded operation: " + first.ToString() + " -Result is:" + result1d + "\n" + "Elapsed time for multithreaded operation: " + second.ToString() + " -Result is:" + result2d; OnTimeElapsed(timeForCalculations); }
private double[] LoadControlledNR(double[] forceVector) { lambda = 1.0 / numberOfLoadSteps; double[] incrementDf = VectorOperations.VectorScalarProductNew(forceVector, lambda); double[] solutionVector = new double[forceVector.Length]; double[] incrementalExternalForcesVector = new double[forceVector.Length]; double[] tempSolutionVector = new double[solutionVector.Length]; double[] deltaU = new double[solutionVector.Length]; double[] internalForcesTotalVector; double[] dU; double[] residual; double residualNorm; //Assembler.UpdateAccelerations(CalculateAccelerations(InitialValues.InitialAccelerationVector)); for (int i = 0; i < numberOfLoadSteps; i++) { incrementalExternalForcesVector = VectorOperations.VectorVectorAddition(incrementalExternalForcesVector, incrementDf); Assembler.UpdateDisplacements(solutionVector); Assembler.UpdateAccelerations(explicitAcceleration.Values.Last()); internalForcesTotalVector = Assembler.CreateTotalInternalForcesVector(); double[,] tangentMatrix = CalculateHatMMatrix(); dU = LinearSolver.Solve(tangentMatrix, incrementDf); solutionVector = VectorOperations.VectorVectorAddition(solutionVector, dU); Assembler.UpdateDisplacements(solutionVector); tangentMatrix = CalculateHatMMatrix(); internalForcesTotalVector = Assembler.CreateTotalInternalForcesVector(); residual = VectorOperations.VectorVectorSubtraction(internalForcesTotalVector, incrementalExternalForcesVector); residualNorm = VectorOperations.VectorNorm2(residual); int iteration = 0; Array.Clear(deltaU, 0, deltaU.Length); while (residualNorm > tolerance && iteration < maxIterations) { tangentMatrix = CalculateHatMMatrix(); deltaU = VectorOperations.VectorVectorSubtraction(deltaU, LinearSolver.Solve(tangentMatrix, residual)); tempSolutionVector = VectorOperations.VectorVectorAddition(solutionVector, deltaU); Assembler.UpdateDisplacements(tempSolutionVector); //Assembler.UpdateAccelerations(CalculateAccelerations(solutionVector)); internalForcesTotalVector = Assembler.CreateTotalInternalForcesVector(); residual = VectorOperations.VectorVectorSubtraction(internalForcesTotalVector, incrementalExternalForcesVector); residualNorm = VectorOperations.VectorNorm2(residual); iteration = iteration + 1; } solutionVector = VectorOperations.VectorVectorAddition(solutionVector, deltaU); if (iteration >= maxIterations) { Console.WriteLine("Newton-Raphson: Solution not converged at current iterations"); } } return(solutionVector); }
private double[] LoadControlledNR(double[] forceVector) { double[] incrementDf = VectorOperations.VectorScalarProductNew(forceVector, lambda); double[] solutionVector = localSolutionVector; double[] incrementalExternalForcesVector = new double[forceVector.Length]; double[] tempSolutionVector = new double[solutionVector.Length]; double[] deltaU = new double[solutionVector.Length]; double[] internalForcesTotalVector; double[] dU; double[] residual; double residualNorm; for (int i = 0; i < numberOfLoadSteps; i++) { incrementalExternalForcesVector = VectorOperations.VectorVectorAddition(incrementalExternalForcesVector, incrementDf); discretization.UpdateDisplacements(solutionVector); internalForcesTotalVector = discretization.CreateTotalInternalForcesVector(); double[,] stiffnessMatrix = discretization.CreateTotalStiffnessMatrix(); //OnConvergenceResult("Newton-Raphson: Solution not converged at load step" + i); dU = linearSolver.Solve(stiffnessMatrix, incrementDf); solutionVector = VectorOperations.VectorVectorAddition(solutionVector, dU); residual = VectorOperations.VectorVectorSubtraction(internalForcesTotalVector, incrementalExternalForcesVector); residualNorm = VectorOperations.VectorNorm2(residual); int iteration = 0; Array.Clear(deltaU, 0, deltaU.Length); while (residualNorm > Tolerance && iteration < MaxIterations) { stiffnessMatrix = discretization.CreateTotalStiffnessMatrix(); deltaU = VectorOperations.VectorVectorSubtraction(deltaU, linearSolver.Solve(stiffnessMatrix, residual)); tempSolutionVector = VectorOperations.VectorVectorAddition(solutionVector, deltaU); discretization.UpdateDisplacements(tempSolutionVector); internalForcesTotalVector = discretization.CreateTotalInternalForcesVector(); residual = VectorOperations.VectorVectorSubtraction(internalForcesTotalVector, incrementalExternalForcesVector); residualNorm = VectorOperations.VectorNorm2(residual); if (residualNorm <= Tolerance) { OnConvergenceResult("Newton-Raphson: Load Step " + i + " - Solution converged at iteration " + iteration + " - Residual Norm = " + residualNorm); } else { OnConvergenceResult("Newton-Raphson: Load Step " + i + " - Solution not converged at iteration " + iteration + " - Residual Norm = " + residualNorm); } iteration = iteration + 1; //(Application.Current.Windows[0] as MainWindow).LogTool.Text = "ok"; //OnConvergenceResult("Newton-Raphson: Solution not converged at load step" + iteration); } InternalForces.Add(i + 1, internalForcesTotalVector); solutionVector = VectorOperations.VectorVectorAddition(solutionVector, deltaU); Solutions.Add(i + 1, solutionVector); if (iteration >= MaxIterations) { OnConvergenceResult("Newton-Raphson did not converge at Load Step " + i + ". Exiting solution."); LoadStepConvergence.Add("Solution not converged."); break; } LoadStepConvergence.Add("Solution converged."); } return(solutionVector); }
private double[] BiCGSTAB(double[,] stiffnessMatrix, double[] forceVector) { double[] solutionVector = new double[forceVector.Length]; double[] xVector = new double[forceVector.Length]; double[] pVector = new double[forceVector.Length]; double[] vVector = new double[forceVector.Length]; double[,] K = stiffnessMatrix; double[] bVector = forceVector; double[] rVector = VectorOperations.VectorVectorSubtraction(bVector, VectorOperations.MatrixVectorProduct(K, xVector)); double[] r0hatVector = rVector; double rho0 = 1.0; double w = 1.0; double a = 1.0; double rho1 = VectorOperations.VectorDotProduct(r0hatVector, rVector); double b; double[] sVector; double[] tVector; int iters = 100; double converged; for (int i = 0; i < iters; i++) { b = (rho1 / rho0) * (a / w); pVector = VectorOperations.VectorVectorAddition(rVector, VectorOperations.VectorScalarProductNew( VectorOperations.VectorVectorSubtraction(pVector, VectorOperations.VectorScalarProductNew(vVector, w)), b)); vVector = VectorOperations.MatrixVectorProduct(K, pVector); a = rho1 / VectorOperations.VectorDotProduct(r0hatVector, vVector); sVector = VectorOperations.VectorVectorSubtraction(rVector, VectorOperations.VectorScalarProductNew(vVector, a)); tVector = VectorOperations.MatrixVectorProduct(K, sVector); w = VectorOperations.VectorDotProduct(tVector, sVector) / VectorOperations.VectorDotProduct(tVector, tVector); rho0 = rho1; rho1 = -w *VectorOperations.VectorDotProduct(r0hatVector, tVector); xVector = VectorOperations.VectorVectorAddition(xVector, VectorOperations.VectorScalarProductNew(pVector, a)); xVector = VectorOperations.VectorVectorAddition(xVector, VectorOperations.VectorScalarProductNew(sVector, w)); rVector = VectorOperations.VectorVectorSubtraction(sVector, VectorOperations.VectorScalarProductNew(tVector, w)); converged = VectorOperations.VectorNorm2(rVector); if (i == iters | converged < 0.00000001) { break; } } solutionVector = xVector; return(solutionVector); }
private double[] CalculateNormalUnitVector() { double X1 = Nodes[1].XCoordinate; double Y1 = Nodes[1].YCoordinate; double X2 = Nodes[2].XCoordinate; double Y2 = Nodes[2].YCoordinate; double[] normalVector = new double[] { X2 - X1, Y2 - Y1 }; double normalVectorLength = VectorOperations.VectorNorm2(normalVector); double[] normalUnitVec = new double[] { normalVector[0] / normalVectorLength, normalVector[1] / normalVectorLength }; return(normalUnitVec); }
private double[] NewtonIterationsNewmark(double[] forceVector, int stepNumber, List <double> aConstants) { lambda = 1.0 / numberOfLoadSteps; //double[] incrementDf = VectorOperations.VectorScalarProductNew(forceVector, lambda); double[] solutionVector = new double[forceVector.Length]; double[] deltaU = new double[solutionVector.Length]; double[] internalForcesTotalVector; double[] residual; double residualNorm; double[] hatR; solutionVector = explicitSolution.Values.Last(); Assembler.UpdateDisplacements(solutionVector); //Assembler.UpdateAccelerations(explicitAcceleration.Values.Last()); hatR = CalculateHatRVectorNewmarkNL(stepNumber, aConstants, solutionVector); internalForcesTotalVector = Assembler.CreateTotalInternalForcesVector(); residual = VectorOperations.VectorVectorSubtraction(hatR, internalForcesTotalVector); residual = VectorOperations.VectorVectorSubtraction(forceVector, Assembler.CreateTotalInternalForcesVector()); int iteration = 0; Array.Clear(deltaU, 0, deltaU.Length); for (int i = 0; i < maxIterations; i++) { double[,] tangentMatrix = CalculateHatKMatrixNewmark(aConstants); deltaU = LinearSolver.Solve(tangentMatrix, residual); solutionVector = VectorOperations.VectorVectorAddition(solutionVector, deltaU); Assembler.UpdateDisplacements(solutionVector); //Assembler.UpdateAccelerations(CalculateAccelerations()); hatR = CalculateHatRVectorNewmarkNL(stepNumber, aConstants, solutionVector); internalForcesTotalVector = Assembler.CreateTotalInternalForcesVector(); residual = VectorOperations.VectorVectorSubtraction(hatR, internalForcesTotalVector); residualNorm = VectorOperations.VectorNorm2(residual); if (residualNorm < tolerance) { break; } iteration = iteration + 1; } //Console.WriteLine(iteration); if (iteration >= maxIterations) { Console.WriteLine("Newton-Raphson: Solution not converged at current iterations"); } return(solutionVector); }
private double[] LoadControlledNR(double[] forceVector) { double[] incrementDf = VectorOperations.VectorScalarProductNew(forceVector, lambda); double[] solutionVector = new double[forceVector.Length]; double[] incrementalExternalForcesVector = new double[forceVector.Length]; double[] tempSolutionVector = new double[solutionVector.Length]; double[] deltaU = new double[solutionVector.Length]; double[] internalForcesTotalVector; double[] dU; double[] residual; double residualNorm; for (int i = 0; i < numberOfLoadSteps; i++) { incrementalExternalForcesVector = VectorOperations.VectorVectorAddition(incrementalExternalForcesVector, incrementDf); base.UpdateDisplacements(solutionVector); internalForcesTotalVector = base.CreateTotalInternalForcesVector(); double[,] stiffnessMatrix = base.CreateTotalStiffnessMatrix(); dU = linearSolver.Solve(stiffnessMatrix, incrementDf); solutionVector = VectorOperations.VectorVectorAddition(solutionVector, dU); residual = VectorOperations.VectorVectorSubtraction(internalForcesTotalVector, incrementalExternalForcesVector); residualNorm = VectorOperations.VectorNorm2(residual); int iteration = 0; Array.Clear(deltaU, 0, deltaU.Length); while (residualNorm > tolerance && iteration < maxIterations) { stiffnessMatrix = base.CreateTotalStiffnessMatrix(); deltaU = VectorOperations.VectorVectorSubtraction(deltaU, linearSolver.Solve(stiffnessMatrix, residual)); tempSolutionVector = VectorOperations.VectorVectorAddition(solutionVector, deltaU); base.UpdateDisplacements(tempSolutionVector); internalForcesTotalVector = base.CreateTotalInternalForcesVector(); residual = VectorOperations.VectorVectorSubtraction(internalForcesTotalVector, incrementalExternalForcesVector); residualNorm = VectorOperations.VectorNorm2(residual); iteration = iteration + 1; } solutionVector = VectorOperations.VectorVectorAddition(solutionVector, deltaU); if (iteration >= maxIterations) { Console.WriteLine("Newton-Raphson: Solution not converged at current iterations"); } } return(solutionVector); }
private double[] StartNewtonIterations(double[] forceVector) { lambda = 1.0 / numberOfLoadSteps; double[] solutionVector = new double[forceVector.Length]; double[] tempSolutionVector = new double[solutionVector.Length]; double[] deltaU = new double[solutionVector.Length]; double[] internalForcesTotalVector; double[] dU; double[] residual; double residualNorm; discretization.UpdateDisplacements(solutionVector); residual = VectorOperations.VectorVectorSubtraction(forceVector, discretization.CreateTotalInternalForcesVector()); int iteration = 0; Array.Clear(deltaU, 0, deltaU.Length); for (int i = 0; i < MaxIterations; i++) { double[,] tangentMatrix = discretization.CreateTotalStiffnessMatrix(); deltaU = linearSolver.Solve(tangentMatrix, residual); solutionVector = VectorOperations.VectorVectorAddition(solutionVector, deltaU); discretization.UpdateDisplacements(solutionVector); internalForcesTotalVector = discretization.CreateTotalInternalForcesVector(); residual = VectorOperations.VectorVectorSubtraction(forceVector, internalForcesTotalVector); residualNorm = VectorOperations.VectorNorm2(residual); if (residualNorm < Tolerance) { continue; } iteration = iteration + 1; } if (iteration >= MaxIterations) { Console.WriteLine("Newton-Raphson: Solution not converged at current iterations"); } return(solutionVector); }
private double[] Project(double[] ksiVectorInitial) { int maxIterations = 1000; double tol = Math.Pow(10.0, -4.0); double[] deltaKsi = new double[2]; double norm = new double(); double[] ksiVector = ksiVectorInitial; double[] xUpdated = xUpdatedVector(); for (int i = 1; i <= maxIterations; i++) { double[] oldksiVector = ksiVector; Tuple <double[, ], double[, ], double[, ]> aMatrices = CalculatePositionMatrix(ksiVector[0], ksiVector[1]); List <double[]> dRho = SurfaceVectors(ksiVector[0], ksiVector[1]); double[] f = Calculate_f(dRho, aMatrices.Item1, xUpdated); double e = Calculate_e(aMatrices.Item1, xUpdated);//double e = Calculate_e(aMatrices.Item2, xUpdated); double[,] m = MetricTensor(dRho); double detm = MetricTensorDet(m); deltaKsi = CalculateDeltaKsi(detm, m, f, e); ksiVector = VectorOperations.VectorVectorAddition(ksiVector, deltaKsi);//Iterations for the CPP? norm = VectorOperations.VectorNorm2(VectorOperations.VectorVectorSubtraction(ksiVector, oldksiVector)); if (norm <= tol) { break; } } if (norm > tol) { throw new Exception("CPP not found in current iterations"); } else { return(ksiVector); } }
public static Results RunStaticExample() { #region Structural IAssembly elementsAssembly = CreateAssembly(); elementsAssembly.CreateElementsAssembly(); elementsAssembly.ActivateBoundaryConditions = true; double[,] globalStiffnessMatrix = elementsAssembly.CreateTotalStiffnessMatrix(); //Gnuplot graphs ShowToGUI.PlotInitialGeometry(elementsAssembly); Dictionary <int, INode> initialNodes = elementsAssembly.Nodes; double[] initialXCoord = Assembly.NodalCoordinatesToVectors(initialNodes).Item1; double[] initialYCoord = Assembly.NodalCoordinatesToVectors(initialNodes).Item2; double[] Xvec1Initial = new double[totalNodes / 2]; double[] Yvec1Initial = new double[totalNodes / 2]; double[] Xvec2Initial = new double[totalNodes / 2]; double[] Yvec2Initial = new double[totalNodes / 2]; double[] Ζvec1Initial = Enumerable.Repeat(1.0, totalNodes / 2).ToArray(); double[] Ζvec2Initial = Enumerable.Repeat(1.0, totalNodes / 2).ToArray(); Array.Copy(initialXCoord, 0, Xvec1Initial, 0, totalNodes / 2); Array.Copy(initialYCoord, 0, Yvec1Initial, 0, totalNodes / 2); Array.Copy(initialXCoord, totalNodes / 2, Xvec2Initial, 0, totalNodes / 2); Array.Copy(initialYCoord, totalNodes / 2, Yvec2Initial, 0, totalNodes / 2); string pathForContour1 = @"C:\Users\Public\Documents\Total\1"; string pathForContour2 = @"C:\Users\Public\Documents\Total\2"; ExportToFile.CreateContourDataForMatlab(Xvec1Initial, Yvec1Initial, Ζvec1Initial, nodesInYCoor, nodesInXCoor, pathForContour1); ExportToFile.CreateContourDataForMatlab(Xvec2Initial, Yvec2Initial, Ζvec2Initial, nodesInYCoor, nodesInXCoor, pathForContour2); ///structuralSolution = new StaticSolver(); structuralSolution.LinearScheme = new LUFactorization(); //structuralSolution.NonLinearScheme = new LoadControlledNewtonRaphson(); structuralSolution.NonLinearScheme.Tolerance = 1e-4; structuralSolution.ActivateNonLinearSolver = true; structuralSolution.NonLinearScheme.numberOfLoadSteps = 40; double[] externalForces3 = externalForcesStructuralVector; foreach (var dof in loadedStructuralDOFs) { externalForces3[dof - 1] = externalStructuralLoad; } double[] reducedExternalForces3 = BoundaryConditionsImposition.ReducedVector(externalForces3, elementsAssembly.BoundedDOFsVector); structuralSolution.AssemblyData = elementsAssembly; structuralSolution.Solve(reducedExternalForces3); double[] solvector3 = structuralSolution.GetSolution(); elementsAssembly.UpdateDisplacements(solvector3); ShowToGUI.PlotFinalGeometry(elementsAssembly); double[] fullSolVector3 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(solvector3, elementsAssembly.BoundedDOFsVector); Dictionary <int, INode> finalNodes = Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullSolVector3); double[] xFinalNodalCoor = Assembly.NodalCoordinatesToVectors(finalNodes).Item1; double[] yFinalNodalCoor = Assembly.NodalCoordinatesToVectors(finalNodes).Item2; Dictionary <int, double[]> allStepsSolutions = structuralSolution.GetAllStepsSolutions(); Dictionary <int, Dictionary <int, double[]> > allStepsContactForces = new Dictionary <int, Dictionary <int, double[]> >(); Dictionary <int, double[]> elementsInternalContactForcesVector; for (int i = 1; i <= allStepsSolutions.Count; i++) { elementsInternalContactForcesVector = new Dictionary <int, double[]>(); elementsAssembly.UpdateDisplacements(allStepsSolutions[i]); for (int j = totalElements + 1; j <= totalElements + totalContactElements; j++) { elementsInternalContactForcesVector[j] = elementsAssembly.ElementsAssembly[j].CreateInternalGlobalForcesVector(); } allStepsContactForces[i] = elementsInternalContactForcesVector; } List <double[]> structuralSolutions = new List <double[]>(); #endregion #region Thermal Dictionary <int, double[]> thermalSolutions = new Dictionary <int, double[]>(); Dictionary <int, Dictionary <int, double[]> > allStepsHeatFluxes = new Dictionary <int, Dictionary <int, double[]> >(); List <Dictionary <int, double> > contactContactivityForEachStep = new List <Dictionary <int, double> >(); for (int k = 1; k <= allStepsSolutions.Count; k++) { IAssembly elementsAssembly2 = CreateThermalAssembly(); for (int j = totalElements + 1; j < totalElements + totalContactElements; j++) { double[] contactForce = allStepsContactForces[k][j]; elementsAssembly2.ElementsProperties[j].ContactForceValue = VectorOperations.VectorNorm2(new double[] { contactForce[2], contactForce[3] }); } elementsAssembly2.CreateElementsAssembly(); elementsAssembly2.ActivateBoundaryConditions = true; double[,] globalStiffnessMatrix2 = elementsAssembly2.CreateTotalStiffnessMatrix(); ISolver thermalSolution = new StaticSolver(); thermalSolution.LinearScheme = new LUFactorization(); thermalSolution.NonLinearScheme = new LoadControlledNewtonRaphson(); thermalSolution.ActivateNonLinearSolver = true; thermalSolution.NonLinearScheme.numberOfLoadSteps = 10; thermalSolution.AssemblyData = elementsAssembly2; double[] externalHeatFlux = externalHeatLoafVector; //externalHeatFlux[0] = externalHeatLoad; //externalHeatFlux[15] = externalHeatLoad; //externalHeatFlux[30] = externalHeatLoad; //externalHeatFlux[45] = externalHeatLoad; //externalHeatFlux[60] = externalHeatLoad; foreach (var dof in loadedThermalDOFs) { externalHeatFlux[dof - 1] = externalHeatLoad; } //for (int i = 61; i <= 75; i++) //{ // externalHeatFlux[61] = externalHeatLoad; //} double[] reducedExternalHeatFlux = BoundaryConditionsImposition.ReducedVector(externalHeatFlux, thermalSolution.AssemblyData.BoundedDOFsVector); thermalSolution.Solve(reducedExternalHeatFlux); double[] tempSol = thermalSolution.GetSolution(); thermalSolutions.Add(k, tempSol); double[] fullThermalSolutionVector = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(tempSol, elementsAssembly2.BoundedDOFsVector); elementsAssembly2.UpdateDisplacements(fullThermalSolutionVector); Dictionary <int, double[]> elementsInternalHeatFluxesVector = new Dictionary <int, double[]>(); for (int j = totalElements + 1; j <= totalElements + totalContactElements - 1; j++) { elementsInternalHeatFluxesVector[j] = elementsAssembly2.ElementsAssembly[j].CreateInternalGlobalForcesVector(); } allStepsHeatFluxes[k] = elementsInternalHeatFluxesVector; Dictionary <int, double> contactContactivity = AssemblyHelpMethods.RetrieveContactContactivity(thermalSolution.AssemblyData); contactContactivityForEachStep.Add(contactContactivity); } ExportToFile.ExportGeometryDataWithTemperatures(structuralSolution, thermalSolutions, thermalBoundaryConditions); ExportToFile.ExportCondactivityForAllLoadSteps(contactContactivityForEachStep); ExportToFile.ExportContactForcesForAllLoadSteps(allStepsContactForces); ExportToFile.ExportHeatFluxesForAllLoadSteps(allStepsHeatFluxes); int[] thermalBoundCond = thermalBoundaryConditions; double[] fullStructuralSol1 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[2], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol2 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[4], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol3 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[6], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol4 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[8], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol5 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[10], elementsAssembly.BoundedDOFsVector); double[] fullThermalSol1 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[1], thermalBoundCond); double[] fullThermalSol2 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[3], thermalBoundCond); double[] fullThermalSol3 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[5], thermalBoundCond); double[] fullThermalSol4 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[7], thermalBoundCond); double[] fullThermalSol5 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[9], thermalBoundCond); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol1), fullThermalSol1, @"C:\Users\Public\Documents\Results1.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol2), fullThermalSol2, @"C:\Users\Public\Documents\Results2.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol3), fullThermalSol3, @"C:\Users\Public\Documents\Results3.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol4), fullThermalSol4, @"C:\Users\Public\Documents\Results4.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol5), fullThermalSol5, @"C:\Users\Public\Documents\Results5.dat"); structuralSolutions.Add(fullStructuralSol1); structuralSolutions.Add(fullStructuralSol2); structuralSolutions.Add(fullStructuralSol3); structuralSolutions.Add(fullStructuralSol4); structuralSolutions.Add(fullStructuralSol5); double[] Xvec1Final = new double[totalNodes / 2]; double[] Yvec1Final = new double[totalNodes / 2]; double[] Xvec2Final = new double[totalNodes / 2]; double[] Yvec2Final = new double[totalNodes / 2]; double[] Ζvec1Final = new double[totalNodes / 2]; double[] Ζvec2Final = new double[totalNodes / 2]; Array.Copy(xFinalNodalCoor, 0, Xvec1Final, 0, totalNodes / 2); Array.Copy(yFinalNodalCoor, 0, Yvec1Final, 0, totalNodes / 2); Array.Copy(fullThermalSol4, 0, Ζvec1Final, 0, totalNodes / 2); Array.Copy(xFinalNodalCoor, totalNodes / 2, Xvec2Final, 0, totalNodes / 2); Array.Copy(yFinalNodalCoor, totalNodes / 2, Yvec2Final, 0, totalNodes / 2); Array.Copy(fullThermalSol4, totalNodes / 2, Ζvec2Final, 0, totalNodes / 2); List <HeatMapData> plots2 = new List <HeatMapData>(); plots2.Add(new HeatMapData() { Xcoordinates = Xvec1Final, Ycoordinates = Yvec1Final, Temperatures = Ζvec1Final }); plots2.Add(new HeatMapData() { Xcoordinates = Xvec2Final, Ycoordinates = Yvec2Final, Temperatures = Ζvec2Final }); ShowToGUI.PlotHeatMap(plots2); string path = @"C:\Users\Public\Documents\Total\1final"; string path2 = @"C:\Users\Public\Documents\Total\2final"; ExportToFile.CreateContourDataForMatlab(Xvec1Final, Yvec1Final, Ζvec1Final, nodesInYCoor, nodesInXCoor, path); ExportToFile.CreateContourDataForMatlab(Xvec2Final, Yvec2Final, Ζvec2Final, nodesInYCoor, nodesInXCoor, path2); //ExportToFile.ExportGeometryDataWithTemperatures(finalNodes, fullTempSol); GnuPlot.Close(); while (true) { if (File.Exists(AppContext.BaseDirectory + "gnuplot.png") && new FileInfo(AppContext.BaseDirectory + "gnuplot.png").Length > 0) { break; } Thread.Sleep(100); } GnuPlot.KillProcess(); #endregion return(new Results() { NonlinearSolution = structuralSolutions, SelectedDOF = 2, SolutionType = "Nonlinear" }); }
public static Results RunStaticExample() { #region Structural IAssembly elementsAssembly = CreateAssembly(); elementsAssembly.CreateElementsAssembly(); elementsAssembly.ActivateBoundaryConditions = true; double[,] globalStiffnessMatrix = elementsAssembly.CreateTotalStiffnessMatrix(); //Gnuplot graphs ShowToGUI.PlotInitialGeometry(elementsAssembly); ExportToFile.ExportMatlabInitialGeometry(elementsAssembly); //ISolver structuralSolution = new StaticSolver(); structuralSolution.LinearScheme = new LUFactorization(); //structuralSolution.NonLinearScheme = new LoadControlledNewtonRaphson(); structuralSolution.ActivateNonLinearSolver = true; structuralSolution.NonLinearScheme.numberOfLoadSteps = 10; //int[] BoundedDOFsVector2 = new int[] { 1, 2, 31, 32, 61, 62, 91, 92, 121, 122, 179, 180, 209, 210, 239, 240, 269, 270, 299, 300 }; double[] externalForces3 = externalForcesStructuralVector; foreach (var dof in loadedStructuralDOFs) { externalForces3[dof] = externalStructuralLoad; } //externalForces3[135] = externalStructuralLoad; //externalForces3[137] = externalStructuralLoad; //externalForces3[139] = externalStructuralLoad; //externalForces3[141] = externalStructuralLoad; //externalForces3[143] = externalStructuralLoad; //externalForces3[145] = externalStructuralLoad; //externalForces3[147] = externalStructuralLoad; //externalForces3[149] = externalStructuralLoad; double[] reducedExternalForces3 = BoundaryConditionsImposition.ReducedVector(externalForces3, elementsAssembly.BoundedDOFsVector); structuralSolution.AssemblyData = elementsAssembly; structuralSolution.Solve(reducedExternalForces3); double[] solvector3 = structuralSolution.GetSolution(); elementsAssembly.UpdateDisplacements(solvector3); //ShowToGUI.PlotFinalGeometry(elementsAssembly); double[] fullSolVector3 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(solvector3, elementsAssembly.BoundedDOFsVector); ExportToFile.ExportMatlabFinalGeometry(elementsAssembly, fullSolVector3); Dictionary <int, INode> finalNodes = Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullSolVector3); double[] xFinalNodalCoor = Assembly.NodalCoordinatesToVectors(finalNodes).Item1; double[] yFinalNodalCoor = Assembly.NodalCoordinatesToVectors(finalNodes).Item2; Dictionary <int, double[]> allStepsSolutions = structuralSolution.GetAllStepsSolutions(); Dictionary <int, Dictionary <int, double[]> > allStepsContactForces = new Dictionary <int, Dictionary <int, double[]> >(); Dictionary <int, double[]> elementsInternalContactForcesVector; for (int i = 1; i <= allStepsSolutions.Count; i++) { elementsInternalContactForcesVector = new Dictionary <int, double[]>(); elementsAssembly.UpdateDisplacements(allStepsSolutions[i]); for (int j = 113; j <= 120; j++) { elementsInternalContactForcesVector[j] = elementsAssembly.ElementsAssembly[j].CreateInternalGlobalForcesVector(); } allStepsContactForces[i] = elementsInternalContactForcesVector; } // double[] solVector2 = new double[280]; List <double[]> structuralSolutions = new List <double[]>(); // int[] BoundedDOFsVector = new int[] { 1, 2, 31, 32, 61, 62, 91, 92, 121, 122, 179, 180, 209, 210, 239, 240, 269, 270, 299, 300 }; // double[] externalForces2 = new double[300]; // for (int i = 1; i <= 5; i++) // { // structuralSolution.NonLinearScheme = new LoadControlledNewtonRaphson(solVector2); // externalForces2[135] = -10000.0 * i; // externalForces2[137] = -10000.0 * i; // externalForces2[139] = -10000.0 * i; // externalForces2[141] = -10000.0 * i; // externalForces2[143] = -10000.0 * i; // externalForces2[145] = -10000.0 * i; // externalForces2[147] = -10000.0 * i; // externalForces2[149] = -10000.0 * i; // double[] reducedExternalForces2 = BoundaryConditionsImposition.ReducedVector(externalForces2, BoundedDOFsVector); // structuralSolution.AssemblyData = elementsAssembly; // structuralSolution.Solve(reducedExternalForces2); // solVector2 = structuralSolution.GetSolution(); // structuralSolutions.Add(solVector2); // } // Dictionary<int, double[]> intForces = structuralSolution.GetInternalForces(); // Dictionary<int, double[]> elementInternalForces = elementsAssembly.GetElementsInternalForces(structuralSolutions[0]); // List<string> elementTypes = elementsAssembly.GetElementsType(); // double[] completeFinalSolutionVector = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(solVector2, BoundedDOFsVector); // Dictionary<int, INode> finalNodesList = new Dictionary<int, INode>(); // finalNodesList = Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, completeFinalSolutionVector); #endregion #region Thermal List <double[]> thermalSolutions = new List <double[]>(); for (int k = 1; k <= allStepsSolutions.Count; k++) { IAssembly elementsAssembly2 = CreateThermalAssembly(); for (int j = 113; j < 120; j++) { double[] contactForce = allStepsContactForces[k][j]; elementsAssembly2.ElementsProperties[j].ContactForceValue = VectorOperations.VectorNorm2(new double[] { contactForce[2], contactForce[3] }); } elementsAssembly2.CreateElementsAssembly(); elementsAssembly2.ActivateBoundaryConditions = true; double[,] globalStiffnessMatrix2 = elementsAssembly2.CreateTotalStiffnessMatrix(); ISolver thermalSolution = new StaticSolver(); thermalSolution.LinearScheme = new LUFactorization(); thermalSolution.NonLinearScheme = new LoadControlledNewtonRaphson(); thermalSolution.ActivateNonLinearSolver = true; thermalSolution.NonLinearScheme.numberOfLoadSteps = 10; thermalSolution.AssemblyData = elementsAssembly2; double[] externalHeatFlux = externalHeatLoafVector; //externalHeatFlux[0] = externalHeatLoad; //externalHeatFlux[15] = externalHeatLoad; //externalHeatFlux[30] = externalHeatLoad; //externalHeatFlux[45] = externalHeatLoad; //externalHeatFlux[60] = externalHeatLoad; foreach (var dof in loadedThermalDOFs) { externalHeatFlux[dof] = externalHeatLoad; } //for (int i = 61; i <= 75; i++) //{ // externalHeatFlux[61] = externalHeatLoad; //} double[] reducedExternalHeatFlux = BoundaryConditionsImposition.ReducedVector(externalHeatFlux, thermalSolution.AssemblyData.BoundedDOFsVector); thermalSolution.Solve(reducedExternalHeatFlux); double[] tempSol = thermalSolution.GetSolution(); thermalSolutions.Add(tempSol); } int[] thermalBoundCond = thermalBoundaryConditions; double[] fullStructuralSol1 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[2], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol2 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[4], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol3 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[6], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol4 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[8], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol5 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[10], elementsAssembly.BoundedDOFsVector); double[] fullThermalSol1 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[1], thermalBoundCond); double[] fullThermalSol2 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[3], thermalBoundCond); double[] fullThermalSol3 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[5], thermalBoundCond); double[] fullThermalSol4 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[7], thermalBoundCond); double[] fullThermalSol5 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[9], thermalBoundCond); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol1), fullThermalSol1, @"C:\Users\Public\Documents\Results1.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol2), fullThermalSol2, @"C:\Users\Public\Documents\Results2.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol3), fullThermalSol3, @"C:\Users\Public\Documents\Results3.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol4), fullThermalSol4, @"C:\Users\Public\Documents\Results4.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol5), fullThermalSol5, @"C:\Users\Public\Documents\Results5.dat"); //double[] temperatures = new double[135]; //int[] BoundedDOFsVectorForHeat = new int[] { 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 }; //for (int i = 1; i <= 5; i++) //{ // thermalSolution.NonLinearScheme = new LoadControlledNewtonRaphson(temperatures); // double[] externalHeatFlux = new double[150]; // double[] reducedExternalHeatFlux = BoundaryConditionsImposition.ReducedVector(externalHeatFlux, BoundedDOFsVectorForHeat); // thermalSolution.AssemblyData = elementsAssembly2; // thermalSolution.Solve(reducedExternalHeatFlux); // temperatures = thermalSolution.GetSolution(); // thermalSolutions.Add(temperatures); //} //List<double> X = new List<double>(); //List<double> Y = new List<double>(); //double[] fullTempSol = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(tempSol, thermalSolution.AssemblyData.BoundedDOFsVector); //double[] Z = fullTempSol;//thermalSolutions[4]; //foreach (var node in elementsAssembly2.Nodes) //{ // X.Add(node.Value.XCoordinate); // Y.Add(node.Value.YCoordinate); //} //double[] Xvec = X.ToArray(); //double[] Yvec = Y.ToArray(); //double[] Xvec1 = new double[75]; //double[] Yvec1 = new double[75]; //double[] Zvec1 = new double[75]; //double[] Xvec2 = new double[75]; //double[] Yvec2 = new double[75]; //double[] Zvec2 = new double[75]; //Array.Copy(Xvec, 75, Xvec2, 0, 75); //Array.Copy(Yvec, 75, Yvec2, 0, 75); //Array.Copy(Z, 75, Zvec2, 0, 75); //Array.Copy(Xvec, 0, Xvec1, 0, 75); //Array.Copy(Yvec, 0, Yvec1, 0, 75); //Array.Copy(Z, 0, Zvec1, 0, 75); //GnuPlot.Set("terminal png size 500, 300"); //GnuPlot.Set("output 'gnuplot.png'"); //GnuPlot.HoldOn(); //GnuPlot.Set("cbrange[0:20.0]"); //GnuPlot.Set("palette defined(0 \"blue\", 1 \"red\")"); //GnuPlot.Set("pm3d"); //GnuPlot.Set("dgrid3d"); //GnuPlot.Set("view map"); //GnuPlot.SPlot(Xvec1, Yvec1, Zvec1); //GnuPlot.SPlot(Xvec2, Yvec2, Zvec2); //GnuPlot.Set("output"); //List<HeatMapData> plots = new List<HeatMapData>(); //plots.Add(new HeatMapData() { Xcoordinates = Xvec1, Ycoordinates = Yvec1, Temperatures = Zvec1 }); //plots.Add(new HeatMapData() { Xcoordinates = Xvec2, Ycoordinates = Yvec2, Temperatures = Zvec2 }); ////ShowToGUI.PlotHeatMap(plots); double[] Xvec1Final = new double[75]; double[] Yvec1Final = new double[75]; double[] Xvec2Final = new double[75]; double[] Yvec2Final = new double[75]; double[] Ζvec1Final = new double[75]; double[] Ζvec2Final = new double[75]; Array.Copy(xFinalNodalCoor, 0, Xvec1Final, 0, 75); Array.Copy(yFinalNodalCoor, 0, Yvec1Final, 0, 75); Array.Copy(fullThermalSol4, 0, Ζvec1Final, 0, 75); Array.Copy(xFinalNodalCoor, 75, Xvec2Final, 0, 75); Array.Copy(yFinalNodalCoor, 75, Yvec2Final, 0, 75); Array.Copy(fullThermalSol4, 75, Ζvec2Final, 0, 75); List <HeatMapData> plots2 = new List <HeatMapData>(); plots2.Add(new HeatMapData() { Xcoordinates = Xvec1Final, Ycoordinates = Yvec1Final, Temperatures = Ζvec1Final }); plots2.Add(new HeatMapData() { Xcoordinates = Xvec2Final, Ycoordinates = Yvec2Final, Temperatures = Ζvec2Final }); //GnuPlot.HoldOn(); //GnuPlot.Set("pm3d"); //GnuPlot.Set("dgrid3d"); //GnuPlot.Set("view map"); //GnuPlot.SPlot(new double[] { -1.0, 2.0, 1.0, -1.0}, new double[] { 1.0, 2.0, -1.0, 1.0 }, new double[] { 2, 1, 3, 2 }); ////GnuPlot.SPlot(new double[] { -1.0, 1.0, 3.0 }, new double[] { 2.0, 2.0, -1.0 }, new double[] { 5, 4, 9 }); ////GnuPlot.Plot(Xvec2Final, Yvec2Final); ShowToGUI.PlotHeatMap(plots2); string path = @"C:\Users\Public\Documents\Total\1final"; string path2 = @"C:\Users\Public\Documents\Total\2final"; ExportToFile.CreateContourDataForMatlab(Xvec1Final, Yvec1Final, Ζvec1Final, 5, 15, path); ExportToFile.CreateContourDataForMatlab(Xvec2Final, Yvec2Final, Ζvec2Final, 5, 15, path2); //ExportToFile.ExportGeometryDataWithTemperatures(finalNodes, fullTempSol); GnuPlot.Close(); while (true) { if (File.Exists(AppContext.BaseDirectory + "gnuplot.png") && new FileInfo(AppContext.BaseDirectory + "gnuplot.png").Length > 0) { break; } Thread.Sleep(100); } GnuPlot.KillProcess(); #endregion structuralSolutions.Add(fullStructuralSol1); structuralSolutions.Add(fullStructuralSol2); structuralSolutions.Add(fullStructuralSol3); structuralSolutions.Add(fullStructuralSol4); structuralSolutions.Add(fullStructuralSol5); diagramData.ShowResults(new Results() { NonlinearSolution = structuralSolutions, SelectedDOF = 2, SolutionType = "Nonlinear" }); return(new Results() { NonlinearSolution = structuralSolutions, SelectedDOF = 2, SolutionType = "Nonlinear" }); }
public static Results RunStaticExample() { #region Structural IAssembly elementsAssembly = CreateAssembly(); elementsAssembly.CreateElementsAssembly(); elementsAssembly.ActivateBoundaryConditions = true; double[,] globalStiffnessMatrix = elementsAssembly.CreateTotalStiffnessMatrix(); //Gnuplot graphs ShowToGUI.PlotInitialGeometry(elementsAssembly); Dictionary <int, INode> initialNodes = elementsAssembly.Nodes; double[] initialXCoord = Assembly.NodalCoordinatesToVectors(initialNodes).Item1; double[] initialYCoord = Assembly.NodalCoordinatesToVectors(initialNodes).Item2; double[] Xvec1Initial = new double[totalNodes / 2]; double[] Yvec1Initial = new double[totalNodes / 2]; double[] Xvec2Initial = new double[totalNodes / 2]; double[] Yvec2Initial = new double[totalNodes / 2]; double[] Ζvec1Initial = Enumerable.Repeat(1.0, totalNodes / 2).ToArray(); double[] Ζvec2Initial = Enumerable.Repeat(1.0, totalNodes / 2).ToArray(); Array.Copy(initialXCoord, 0, Xvec1Initial, 0, totalNodes / 2); Array.Copy(initialYCoord, 0, Yvec1Initial, 0, totalNodes / 2); Array.Copy(initialXCoord, totalNodes / 2, Xvec2Initial, 0, totalNodes / 2); Array.Copy(initialYCoord, totalNodes / 2, Yvec2Initial, 0, totalNodes / 2); //string pathForContour1 = @"C:\Users\Public\Documents\Total\1"; //string pathForContour2 = @"C:\Users\Public\Documents\Total\2"; //ExportToFile.CreateContourDataForMatlab(Xvec1Initial, Yvec1Initial, Ζvec1Initial, nodesInYCoor, nodesInXCoor, pathForContour1); //ExportToFile.CreateContourDataForMatlab(Xvec2Initial, Yvec2Initial, Ζvec2Initial, nodesInYCoor, nodesInXCoor, pathForContour2); //ISolver structuralSolution = new StaticSolver(); structuralSolution.LinearScheme = new PCGSolver(); //structuralSolution.NonLinearScheme = new LoadControlledNewtonRaphson(); //structuralSolution.NonLinearScheme.Tolerance = 1e-5; structuralSolution.NonLinearScheme.Tolerance = 0.00001; //structuralSolution.NonLinearScheme.MaxIterations = 100; structuralSolution.ActivateNonLinearSolver = true; structuralSolution.NonLinearScheme.numberOfLoadSteps = 20; double[] externalForces3 = externalForcesStructuralVector; foreach (var dof in loadedStructuralDOFs) { if (dof == loadDof1 | dof == LoadDof2) { externalForces3[dof - 1] = externalStructuralLoad / 2; } else { externalForces3[dof - 1] = externalStructuralLoad; } } double[] reducedExternalForces3 = BoundaryConditionsImposition.ReducedVector(externalForces3, elementsAssembly.BoundedDOFsVector); structuralSolution.AssemblyData = elementsAssembly; structuralSolution.Solve(reducedExternalForces3); double[] solvector3 = structuralSolution.GetSolution(); elementsAssembly.UpdateDisplacements(solvector3); ShowToGUI.PlotFinalGeometry(elementsAssembly); double[] fullSolVector3 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(solvector3, elementsAssembly.BoundedDOFsVector); Dictionary <int, INode> finalNodes = Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullSolVector3); double[] xFinalNodalCoor = Assembly.NodalCoordinatesToVectors(finalNodes).Item1; double[] yFinalNodalCoor = Assembly.NodalCoordinatesToVectors(finalNodes).Item2; Dictionary <int, double[]> allStepsSolutions = structuralSolution.GetAllStepsSolutions(); Dictionary <int, Dictionary <int, double[]> > allStepsContactForces = new Dictionary <int, Dictionary <int, double[]> >(); Dictionary <int, Dictionary <int, double> > allStepsContactDXs = new Dictionary <int, Dictionary <int, double> >(); Dictionary <int, Dictionary <int, double> > allStepsContactDXs1 = new Dictionary <int, Dictionary <int, double> >(); Dictionary <int, Dictionary <int, double> > allStepsContactDXs2 = new Dictionary <int, Dictionary <int, double> >(); Dictionary <int, Dictionary <int, INode> > allstepsfinalNodes = new Dictionary <int, Dictionary <int, INode> >(); //Dictionary<int, Dictionary<int, INode>> PreviusStatefinalNodes = new Dictionary<int, Dictionary<int, INode>>(); Dictionary <int, double[]> elementsInternalContactForcesVector; Dictionary <int, double> Deltax; Dictionary <int, double> Deltax1; Dictionary <int, double> Deltax2; //double[] SolutionSum = new double[2 * totalNodes]; double[] NodalX = new double[totalNodes]; double[] NodalY = new double[totalNodes]; int upperNode = new int(); int lowerLeftNode = new int(); int lowerRightNode = new int(); for (int i = 1; i <= allStepsSolutions.Count; i++) { elementsInternalContactForcesVector = new Dictionary <int, double[]>(); Deltax = new Dictionary <int, double>(); Deltax1 = new Dictionary <int, double>(); Deltax2 = new Dictionary <int, double>(); //allstepsfinalNodes = new Dictionary<int, Dictionary<int, INode>>(); double[] fullSolVectorSteps = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[i], elementsAssembly.BoundedDOFsVector); //SolutionSum = VectorOperations.VectorVectorAddition(SolutionSum, fullSolVectorSteps); allstepsfinalNodes[i] = Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullSolVectorSteps); elementsAssembly.UpdateDisplacements(allStepsSolutions[i]); NodalX = Assembly.NodalCoordinatesToVectors(allstepsfinalNodes[i]).Item1; NodalY = Assembly.NodalCoordinatesToVectors(allstepsfinalNodes[i]).Item2; for (int j = totalElements + 1; j <= totalElements + totalContactElements; j++) { elementsInternalContactForcesVector[j] = elementsAssembly.ElementsAssembly[j].CreateInternalGlobalForcesVector(); } upperNode = nodesInXCoor - totalContactElements + 1; lowerLeftNode = (nodesInXCoor + nodesInXCoor2) * nodesInYCoor - nodesInXCoor2 + 1; lowerRightNode = lowerLeftNode + 1; for (int j = totalElements + 1; j <= totalElements + totalContactElements; j += 2) { Deltax[j] = Math.Pow(Math.Pow(NodalX[lowerRightNode - 1] - NodalX[lowerLeftNode - 1], 2) + Math.Pow(NodalY[lowerRightNode - 1] - NodalY[lowerLeftNode - 1], 2), 0.5); Deltax2[j] = Math.Pow(Math.Pow(NodalX[lowerRightNode - 1] - NodalX[upperNode - 1], 2) + Math.Pow(NodalY[lowerRightNode - 1] - NodalY[upperNode - 1], 2), 0.5); Deltax1[j] = Math.Pow(Math.Pow(NodalX[upperNode - 1] - NodalX[lowerLeftNode - 1], 2) + Math.Pow(NodalY[upperNode - 1] - NodalY[lowerLeftNode - 1], 2), 0.5); upperNode = upperNode + 1; Deltax[j + 1] = Math.Pow(Math.Pow(NodalX[lowerRightNode - 1] - NodalX[lowerLeftNode - 1], 2) + Math.Pow(NodalY[lowerRightNode - 1] - NodalY[lowerLeftNode - 1], 2), 0.5); Deltax2[j + 1] = Math.Pow(Math.Pow(NodalX[lowerRightNode - 1] - NodalX[upperNode - 1], 2) + Math.Pow(NodalY[lowerRightNode - 1] - NodalY[upperNode - 1], 2), 0.5); Deltax1[j + 1] = Math.Pow(Math.Pow(NodalX[upperNode - 1] - NodalX[lowerLeftNode - 1], 2) + Math.Pow(NodalY[upperNode - 1] - NodalY[lowerLeftNode - 1], 2), 0.5); lowerLeftNode = lowerRightNode; lowerRightNode = lowerRightNode + 1; upperNode = upperNode + 1; } allStepsContactForces[i] = elementsInternalContactForcesVector; allStepsContactDXs[i] = Deltax; allStepsContactDXs1[i] = Deltax1; allStepsContactDXs2[i] = Deltax2; } List <double[]> structuralSolutions = new List <double[]>(); #endregion #region Thermal List <double[]> thermalSolutions = new List <double[]>(); //List<double[]> thermalSolutions2 = new List<double[]>(); List <Dictionary <int, double> > contactContactivityForEachStep = new List <Dictionary <int, double> >(); List <double[]> contactContactivityForEachStep2 = new List <double[]>(); for (int k = 1; k <= allStepsSolutions.Count; k++) { IAssembly elementsAssembly2 = CreateThermalAssembly(); for (int j = totalElements + 1; j <= totalElements + totalContactElements; j++) { double[] contactForce = allStepsContactForces[k][j]; double DX = allStepsContactDXs[k][j]; double DX1 = allStepsContactDXs1[k][j]; double DX2 = allStepsContactDXs2[k][j]; //double ContactForceVar = Math.Pow(Math.Pow(VectorOperations.VectorNorm2(new double[] { contactForce[4], contactForce[5] }),2),0.5); elementsAssembly2.ElementsProperties[j].ContactForceValue = VectorOperations.VectorNorm2(new double[] { contactForce[4], contactForce[5] }); elementsAssembly2.ElementsProperties[j].Dx = DX; elementsAssembly2.ElementsProperties[j].Dx1 = DX1; elementsAssembly2.ElementsProperties[j].Dx2 = DX2; } elementsAssembly2.CreateElementsAssembly(); elementsAssembly2.ActivateBoundaryConditions = true; double[,] globalStiffnessMatrix2 = elementsAssembly2.CreateTotalStiffnessMatrix(); ISolver thermalSolution = new StaticSolver(); thermalSolution.LinearScheme = new LUFactorization(); thermalSolution.NonLinearScheme = new LoadControlledNewtonRaphson(); thermalSolution.NonLinearScheme.Tolerance = 1e-7; thermalSolution.NonLinearScheme.MaxIterations = 100; thermalSolution.ActivateNonLinearSolver = true; thermalSolution.NonLinearScheme.numberOfLoadSteps = 10; thermalSolution.AssemblyData = elementsAssembly2; double[] externalHeatFlux = externalHeatLoafVector; //externalHeatFlux[0] = externalHeatLoad; //externalHeatFlux[15] = externalHeatLoad; //externalHeatFlux[30] = externalHeatLoad; //externalHeatFlux[45] = externalHeatLoad; //externalHeatFlux[60] = externalHeatLoad; foreach (var dof in loadedThermalDOFs) { if ((dof == ThermalDof1 | dof == ThermalDof2)) { externalHeatFlux[dof - 1] = -T0 * (cond / (6 * xIntervals * yIntervals)) * ((Math.Pow(xIntervals, 2) - 2 * Math.Pow(yIntervals, 2)) - (Math.Pow(xIntervals, 2) + Math.Pow(yIntervals, 2))); } else { externalHeatFlux[dof - 1] = -2 * T0 * (cond / (6 * xIntervals * yIntervals)) * ((Math.Pow(xIntervals, 2) - 2 * Math.Pow(yIntervals, 2)) - (Math.Pow(xIntervals, 2) + Math.Pow(yIntervals, 2))); } } //for (int i = 61; i <= 75; i++) //{ // externalHeatFlux[61] = externalHeatLoad; //} double[] reducedExternalHeatFlux = BoundaryConditionsImposition.ReducedVector(externalHeatFlux, thermalSolution.AssemblyData.BoundedDOFsVector); thermalSolution.Solve(reducedExternalHeatFlux); Dictionary <int, double[]> IntHeatFlux = thermalSolution.GetInternalForces(); //double [] HeatSolve= new double[totalNodes]; //double[] value; ////double[] Values = new double[totalNodes]; //for (int i = 1; i <= 10; i++) //{ // value = IntHeatFlux[i]; // thermalSolutions2.Add(value); // //Values[i - 1] = Convert.ToDouble(value); //} //HeatSolve = VectorOperations.VectorVectorAddition(Values , externalHeatFlux); double[] tempSol = thermalSolution.GetSolution(); elementsAssembly2.UpdateDisplacements(tempSol); //double[] contactContactivityVector = new double[totalContactElements]; //Dictionary<int, double[]> allStepsSolutions2 = thermalSolution.GetAllStepsSolutions(); thermalSolutions.Add(tempSol); //thermalSolutions2.Add(HeatSolve); Dictionary <int, double> contactContactivity = AssemblyHelpMethods.RetrieveContactContactivity(thermalSolution.AssemblyData); // contactContactivityForEachStep.Add(contactContactivity); // for (int i = 0; i <= totalContactElements - 1; i++) // { // contactContactivityVector[i] = contactContactivity[i + totalElements + 1]; // } // contactContactivityForEachStep2.Add(contactContactivityVector); } int[] thermalBoundCond = thermalBoundaryConditions; //int[] thermalBoundCond2 = thermalBoundaryConditions2; double[] fullStructuralSol1 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[4], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol2 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[8], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol3 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[12], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol4 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[16], elementsAssembly.BoundedDOFsVector); double[] fullStructuralSol5 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(allStepsSolutions[20], elementsAssembly.BoundedDOFsVector); double[] fullThermalSol1 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[3], thermalBoundCond); double[] fullThermalSol2 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[7], thermalBoundCond); double[] fullThermalSol3 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[11], thermalBoundCond); double[] fullThermalSol4 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[15], thermalBoundCond); double[] fullThermalSol5 = BoundaryConditionsImposition.CreateFullVectorFromReducedVector(thermalSolutions[19], thermalBoundCond); //double[] fullThermalSol6 = thermalSolutions2[19]; //double[] fullThermalSol7 = thermalSolutions2[39]; //double[] fullThermalSol8 = thermalSolutions2[59]; //double[] fullThermalSol9 = thermalSolutions2[79]; //double[] fullThermalSol10 = thermalSolutions2[99]; //double[] FullcontactContactivity1 = contactContactivityForEachStep2[1]; //double[] FullcontactContactivity2 = contactContactivityForEachStep2[3]; //double[] FullcontactContactivity3 = contactContactivityForEachStep2[5]; //double[] FullcontactContactivity4 = contactContactivityForEachStep2[7]; //double[] FullcontactContactivity5 = contactContactivityForEachStep2[9]; double[] FullStructuralSolution_1_Χ = new double[totalNodes]; double[] FullStructuralSolution_1_Υ = new double[totalNodes]; double[] FullStructuralSolution_2_Χ = new double[totalNodes]; double[] FullStructuralSolution_2_Υ = new double[totalNodes]; double[] FullStructuralSolution_3_Χ = new double[totalNodes]; double[] FullStructuralSolution_3_Υ = new double[totalNodes]; double[] FullStructuralSolution_4_Χ = new double[totalNodes]; double[] FullStructuralSolution_4_Υ = new double[totalNodes]; double[] FullStructuralSolution_5_Χ = new double[totalNodes]; double[] FullStructuralSolution_5_Υ = new double[totalNodes]; int count = 1; for (int i = 1; i <= 2 * totalNodes - 1; i += 2) { FullStructuralSolution_1_Χ[count - 1] = fullStructuralSol1[i - 1]; FullStructuralSolution_1_Υ[count - 1] = fullStructuralSol1[i]; count += 1; } count = 1; for (int i = 1; i <= 2 * totalNodes - 1; i += 2) { FullStructuralSolution_2_Χ[count - 1] = fullStructuralSol2[i - 1]; FullStructuralSolution_2_Υ[count - 1] = fullStructuralSol2[i]; count += 1; } count = 1; for (int i = 1; i <= 2 * totalNodes - 1; i += 2) { FullStructuralSolution_3_Χ[count - 1] = fullStructuralSol3[i - 1]; FullStructuralSolution_3_Υ[count - 1] = fullStructuralSol3[i]; count += 1; } count = 1; for (int i = 1; i <= 2 * totalNodes - 1; i += 2) { FullStructuralSolution_4_Χ[count - 1] = fullStructuralSol4[i - 1]; FullStructuralSolution_4_Υ[count - 1] = fullStructuralSol4[i]; count += 1; } count = 1; for (int i = 1; i <= 2 * totalNodes - 1; i += 2) { FullStructuralSolution_5_Χ[count - 1] = fullStructuralSol5[i - 1]; FullStructuralSolution_5_Υ[count - 1] = fullStructuralSol5[i]; count += 1; } ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol1), FullStructuralSolution_1_Χ, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.00Mpa_Res1_ux.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol2), FullStructuralSolution_2_Χ, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.00Mpa_Res2_ux.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol3), FullStructuralSolution_3_Χ, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.00Mpa_Res3_ux.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol4), FullStructuralSolution_4_Χ, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.00Mpa_Res4_ux.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol5), FullStructuralSolution_5_Χ, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.00Mpa_Res5_ux.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol1), FullStructuralSolution_1_Υ, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.00Mpa_Res1_uy.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol2), FullStructuralSolution_2_Υ, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.00Mpa_Res2_uy.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol3), FullStructuralSolution_3_Υ, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.00Mpa_Res3_uy.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol4), FullStructuralSolution_4_Υ, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.00Mpa_Res4_uy.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol5), FullStructuralSolution_5_Υ, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.00Mpa_Res5_uy.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol1), fullThermalSol1, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.000Mpa_Res1_temp.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol2), fullThermalSol2, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.000Mpa_Res2_temp.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol3), fullThermalSol3, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.000Mpa_Res3_temp.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol4), fullThermalSol4, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.000Mpa_Res4_temp.dat"); ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol5), fullThermalSol5, @"C:\Users\Public\Documents\ThermalStructuralCNTsInAngle3_0.12L_20.000Mpa_Res5_temp.dat"); //ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol1), fullThermalSol6, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.90L_0.100Mpa_Res6.dat"); //ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol2), fullThermalSol7, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.90L_0.100Mpa_Res7.dat"); //ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol3), fullThermalSol8, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.90L_0.100Mpa_Res8.dat"); //ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol4), fullThermalSol9, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.90L_0.100Mpa_Res9.dat"); //ExportToFile.ExportGeometryDataWithTemperatures(Assembly.CalculateFinalNodalCoordinates(elementsAssembly.Nodes, fullStructuralSol5), fullThermalSol10, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.90L_0.100Mpa_Res10.dat"); //VectorOperations.PrintVectorToFile(fullThermalSol6, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.30L_0.100Mpa_Res6.dat"); //VectorOperations.PrintVectorToFile(fullThermalSol7, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.30L_0.100Mpa_Res7.dat"); //VectorOperations.PrintVectorToFile(fullThermalSol8, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.30L_0.100Mpa_Res8.dat"); //VectorOperations.PrintVectorToFile(fullThermalSol9, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.30L_0.100Mpa_Res9.dat"); //VectorOperations.PrintVectorToFile(fullThermalSol10, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.30L_0.100Mpa_Res10.dat"); //VectorOperations.PrintVectorToFile(FullcontactContactivity1, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.30L_0.100Mpa_CC1.dat"); //VectorOperations.PrintVectorToFile(FullcontactContactivity2, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.30L_0.100Mpa_CC2.dat"); //VectorOperations.PrintVectorToFile(FullcontactContactivity3, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.30L_0.100Mpa_CC3.dat"); //VectorOperations.PrintVectorToFile(FullcontactContactivity4, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.30L_0.100Mpa_CC4.dat"); //VectorOperations.PrintVectorToFile(FullcontactContactivity5, @"C:\Users\Public\Documents\CouplThermStructCNTs_0.30L_0.100Mpa_CC5.dat"); double[] Xvec1Final = new double[totalNodes / 2]; double[] Yvec1Final = new double[totalNodes / 2]; double[] Xvec2Final = new double[totalNodes / 2]; double[] Yvec2Final = new double[totalNodes / 2]; double[] Ζvec1Final = new double[totalNodes / 2]; double[] Ζvec2Final = new double[totalNodes / 2]; Array.Copy(xFinalNodalCoor, 0, Xvec1Final, 0, totalNodes / 2); Array.Copy(yFinalNodalCoor, 0, Yvec1Final, 0, totalNodes / 2); Array.Copy(fullThermalSol4, 0, Ζvec1Final, 0, totalNodes / 2); Array.Copy(xFinalNodalCoor, totalNodes / 2, Xvec2Final, 0, totalNodes / 2); Array.Copy(yFinalNodalCoor, totalNodes / 2, Yvec2Final, 0, totalNodes / 2); Array.Copy(fullThermalSol4, totalNodes / 2, Ζvec2Final, 0, totalNodes / 2); List <HeatMapData> plots2 = new List <HeatMapData>(); plots2.Add(new HeatMapData() { Xcoordinates = Xvec1Final, Ycoordinates = Yvec1Final, Temperatures = Ζvec1Final }); plots2.Add(new HeatMapData() { Xcoordinates = Xvec2Final, Ycoordinates = Yvec2Final, Temperatures = Ζvec2Final }); ShowToGUI.PlotHeatMap(plots2); //string path = @"C:\Users\Public\Documents\Total\1final"; //string path2 = @"C:\Users\Public\Documents\Total\2final"; //ExportToFile.CreateContourDataForMatlab(Xvec1Final, Yvec1Final, Ζvec1Final, nodesInYCoor, nodesInXCoor, path); //ExportToFile.CreateContourDataForMatlab(Xvec2Final, Yvec2Final, Ζvec2Final, nodesInYCoor, nodesInXCoor, path2); //ExportToFile.ExportGeometryDataWithTemperatures(finalNodes, fullTempSol); GnuPlot.Close(); while (true) { if (File.Exists(AppContext.BaseDirectory + "gnuplot.png") && new FileInfo(AppContext.BaseDirectory + "gnuplot.png").Length > 0) { break; } Thread.Sleep(100); } GnuPlot.KillProcess(); #endregion return(new Results() { NonlinearSolution = structuralSolutions, SelectedDOF = 2, SolutionType = "Nonlinear" }); }
private double[] NewtonIterationsExplicit(int timeStep, double[] forceVector, double[,] tangentMatrix) { //lambda = 1.0 / numberOfLoadSteps; //double[] incrementDf = VectorOperations.VectorScalarProductNew(forceVector, lambda); double[] solutionVector = new double[forceVector.Length]; double[] deltaU = new double[solutionVector.Length]; //double[] internalForcesTotalVector; double[] residual; double residualNorm; double[] hatRPrevious; double[] hatRNext; solutionVector = explicitSolution.Values.Last(); Assembler.UpdateDisplacements(solutionVector); Assembler.UpdateAccelerations(explicitAcceleration.Values.Last()); hatRPrevious = CalculateHatRVectorNL(timeStep); hatRNext = hatRPrevious; //internalForcesTotalVector = Assembler.CreateTotalInternalForcesVector(); //residual = VectorOperations.VectorVectorSubtraction(hatR, internalForcesTotalVector); residual = hatRPrevious; int iteration = 0; Array.Clear(deltaU, 0, deltaU.Length); for (int i = 0; i < maxIterations; i++) { if (i == 0) { //deltaU = LinearSolver.Solve(tangentMatrix, residual); //solutionVector = VectorOperations.VectorVectorAddition(solutionVector, deltaU); solutionVector = LinearSolver.Solve(tangentMatrix, residual); Assembler.UpdateDisplacements(solutionVector); //Assembler.UpdateAccelerations(CalculateAccelerations()); hatRNext = CalculateHatRVectorNL(timeStep); //internalForcesTotalVector = Assembler.CreateTotalInternalForcesVector(); residual = VectorOperations.VectorVectorSubtraction(hatRNext, hatRPrevious); residualNorm = VectorOperations.VectorNorm2(residual); if (residualNorm < tolerance) { break; } iteration = iteration + 1; hatRPrevious = hatRNext; } else { deltaU = LinearSolver.Solve(tangentMatrix, residual); solutionVector = VectorOperations.VectorVectorAddition(solutionVector, deltaU); //solutionVector = LinearSolver.Solve(tangentMatrix, residual); Assembler.UpdateDisplacements(solutionVector); //Assembler.UpdateAccelerations(CalculateAccelerations()); hatRNext = CalculateHatRVectorNL(timeStep); //internalForcesTotalVector = Assembler.CreateTotalInternalForcesVector(); residual = VectorOperations.VectorVectorSubtraction(hatRNext, hatRPrevious); residualNorm = VectorOperations.VectorNorm2(residual); if (residualNorm < tolerance) { break; } iteration = iteration + 1; hatRPrevious = hatRNext; } } //Console.WriteLine(iteration); if (iteration >= maxIterations) { Console.WriteLine("Newton-Raphson: Solution not converged at current iterations"); } return(solutionVector); }