Example #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));
        }
 public TopologySimpLinear2D(ILinearFemAnalysis fem, OptimalityCriteriaBuilder optimAlgorithmBuilder,
                             IDensityFilter filter, IMaterialInterpolation materialInterpolation, double prescribedVolumeFraction)
 {
     this.fem = fem;
     this.optimAlgorithmBuilder = optimAlgorithmBuilder;
     this.filter = filter;
     this.materialInterpolation    = materialInterpolation;
     this.prescribedVolumeFraction = prescribedVolumeFraction;
 }