private static void TestMbbBeam(ILinearFemAnalysis fem, IDensityFilter filter) { // Parameters double volumeFraction = 0.5, penalty = 3.0; // Define the optimization var materialInterpolation = new PowerLawMaterialInterpolation(youngModulus, penalty, 1E-3); var simp = new TopologySimpLinear2D(fem, optimAlgorithmBuilder, filter, materialInterpolation, volumeFraction); var logger = new ObjectiveFunctionLogger(); simp.Logger = logger; // Run the optimization simp.Initialize(); (double compliance, Vector densities) = simp.Optimize(); // Check the history of the compliance (objective function) var expectedCompliances = Vector.CreateFromArray(TopologySimp99LinesTests.ComplianceHistoryForMbbBeam); Assert.True(expectedCompliances.Equals( Vector.CreateFromArray(logger.ObjectiveFunctionValues.ToArray()), 1E-10)); // Check the optimum element densities (design variables). string densitiesPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName + @"\Resources\topology99lines_MBBbeam_densities.txt"; var reader = new FullMatrixReader(false, ','); Vector densitiesExpected = reader.ReadFile(densitiesPath).Reshape(false); Assert.True(densitiesExpected.Equals(densities, 1E-8)); }
private static void TestCantileverBeamWith2LoadCasesHardCoded() { // Parameters int numElementsX = 30, numElementsY = 30; double filterAreaRadius = 1.2, volumeFraction = 0.4, penalty = 3.0; // Define the optimization var material = new ElasticMaterial2D(StressState2D.PlaneStress) { YoungModulus = youngModulus, PoissonRatio = 0.3 }; var fem = new LinearFemAnalysis2DUniformHardcoded(numElementsX, numElementsY, material, LinearFemAnalysis2DUniformHardcoded.BoundaryConditions.Cantilever2LoadCases); var filter = new MeshIndependentSensitivityFilter2DUniform(numElementsX, numElementsY, filterAreaRadius); var materialInterpolation = new PowerLawMaterialInterpolation(youngModulus, penalty, 1E-3); var simp = new TopologySimpLinear2D(fem, optimAlgorithmBuilder, filter, materialInterpolation, volumeFraction); var logger = new ObjectiveFunctionLogger(); simp.Logger = logger; // Run the optimization simp.Initialize(); (double compliance, Vector densities) = simp.Optimize(); // Check the history of the compliance (objective function) var expectedCompliances = Vector.CreateFromArray( TopologySimp99LinesTests.ComplianceHistoryForCantileverWith2LoadCases); Assert.True(expectedCompliances.Equals( Vector.CreateFromArray(logger.ObjectiveFunctionValues.ToArray()), 1E-11)); // Check the optimum element densities (design variables). string densitiesPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName + @"\Resources\topology99lines_cantilever_loadcases_densities.txt"; var reader = new FullMatrixReader(false, ','); Vector densitiesExpected = reader.ReadFile(densitiesPath).Reshape(false); Assert.True(densitiesExpected.Equals(densities, 1E-11)); }
public (double compliance, Matrix densities, ObjectiveFunctionLogger logger) TopologyOptimization() { // Initialize var x = Matrix.CreateWithValue(nely, nelx, volfrac); // design variables: element densities bool[,] passive = applyPassiveElements(x); // extension for passive elements var dc = Matrix.CreateZero(nely, nelx); // compliance sensitivities int loop = 0; double change = 1.0; double c = double.MaxValue; var logger = new ObjectiveFunctionLogger(); // Start iterations while (change > 0.01) { ++loop; Matrix xold = x.Copy(); // FE analysis IList <Vector> U = feAnalysis(x); // Objective function and sensitivity analysis Matrix Ke = ElementStiffness(); // common for all elements c = 0.0; for (int ely = 1; ely <= nely; ++ely) { for (int elx = 1; elx <= nelx; ++elx) { int n1 = (nely + 1) * (elx - 1) + ely; int n2 = (nely + 1) * elx + ely; dc[ely - 1, elx - 1] = 0.0; int[] elementDofs = GetElementDofs(elx, ely); foreach (Vector Ui in U) { Vector Ue = Ui.GetSubvector(elementDofs); double unitCompliance = Ue * (Ke * Ue); double xe = x[ely - 1, elx - 1]; c += Math.Pow(xe, penal) * unitCompliance; dc[ely - 1, elx - 1] -= Math.Pow(xe, penal - 1) * unitCompliance * penal; } } } // Filtering of sensitivities dc = MeshIndependencyFilter(x, dc); // Design update by the optimality criteria method x = OptimalityCriteriaUpdate(x, dc, passive); change = (x - xold).MaxAbsolute(); // Print results Console.WriteLine($"Iteration = {loop}, Compliance = {c}, Volume = {x.Sum() / (nelx*nely)}, Change = {change}"); //Console.WriteLine("Densities:"); //var writer = new FullMatrixWriter(); //writer.WriteToConsole(x); //Console.WriteLine("-----------------------------------"); logger.Log(c); } return(c, x, logger); }