Example #1
0
        private static void TestMbbBeamHardCoded()
        {
            // Parameters
            int    numElementsX = 60, numElementsY = 20;
            double filterAreaRadius = 1.5;

            // Define the optimization
            var material = new ElasticMaterial2D(StressState2D.PlaneStress)
            {
                YoungModulus = youngModulus, PoissonRatio = 0.3
            };
            var fem = new LinearFemAnalysis2DUniformHardcoded(numElementsX, numElementsY, material,
                                                              LinearFemAnalysis2DUniformHardcoded.BoundaryConditions.MbbBeam);
            var filter = new MeshIndependentSensitivityFilter2DUniform(numElementsX, numElementsY, filterAreaRadius);

            TestMbbBeam(fem, filter);
        }
Example #2
0
        private static void TestCantileverBeamHardCoded()
        {
            // Parameters
            int    numElementsX = 32, numElementsY = 20;
            double filterAreaRadius = 1.2;

            // Define the fem analysis and the filter
            var material = new ElasticMaterial2D(StressState2D.PlaneStress)
            {
                YoungModulus = 1.0, PoissonRatio = 0.3
            };
            var fem = new LinearFemAnalysis2DUniformHardcoded(numElementsX, numElementsY, material,
                                                              LinearFemAnalysis2DUniformHardcoded.BoundaryConditions.ShortCantilever);
            var filter = new MeshIndependentSensitivityFilter2DUniform(numElementsX, numElementsY, filterAreaRadius);

            // Run the test
            TestCantileverBeam(fem, filter);
        }
Example #3
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));
        }