Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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);
        }