Exemplo n.º 1
0
        public void Initialize()
        {
            // Write basic info
            solvingInfo = PreprocessingInfo();

            foreach (var elem in Model.Elements)
            {
                elem.Xe = 1.0;
            }

            // Filtering
            Stopwatch sw = new Stopwatch();

            sw.Start();
            _Filter = new Filter(Model.Elements, FilterRadius, Dim);
            _Filter.PreFlt();
            sw.Stop();

            solvingInfo += "Prefiltering: " + sw.Elapsed.TotalMilliseconds.ToString() + " ms";
            solvingInfo += '\n';

            FEIO.WriteInvalidElements(0, Path, Model.Elements);
        }
Exemplo n.º 2
0
        public void Optimize(bool writeKG = false)
        {
            double        delta         = 1.0;
            int           iter          = 0;
            double        currentVolume = 1.0;
            List <double> Ae_old        = new List <double>();
            List <double> Ae            = new List <double>();

            while (delta > 0.001 && iter < MaximumIteration ||
                   Math.Abs(currentVolume - VolumeFraction) > 0.01)
            {
                iter         += 1;
                currentVolume = Math.Max(VolumeFraction, currentVolume * (1.0 - EvolutionRate));

                List <double> timeCost = new List <double>();
                #region Run FEA
                Stopwatch sw = new Stopwatch();
                sw.Start();
                System.Initialize();
                sw.Stop();
                timeCost.Add(sw.Elapsed.TotalMilliseconds);

                Console.WriteLine("Prepare to solve the system");
                sw.Restart();
                //if (writeKG && iter == 1) FEIO.WriteKG(System.GetKG(),Path + iter.ToString() + ".mtx", false);
                System.Solve();
                sw.Stop();
                timeCost.Add(sw.Elapsed.TotalMilliseconds);
                Console.WriteLine("Done");
                #endregion

                // Calculate sensitivities and global compliance
                sw.Restart();
                Ae = CalSensitivities();

                HistoryC.Add(CalGlobalCompliance());
                sw.Stop();
                timeCost.Add(sw.Elapsed.TotalMilliseconds);

                sw.Restart();
                // Process sensitivities
                Ae = FltAe(_Filter, Ae);

                if (iter > 1)
                {
                    for (int i = 0; i < Ae.Count; i++)
                    {
                        Ae[i] = (Ae[i] + Ae_old[i]) * 0.5;
                    }
                }
                // Record the sensitiveies in each step
                var raw = new double[Ae.Count];
                Ae.CopyTo(raw);
                Ae_old = raw.ToList();
                sw.Stop();
                timeCost.Add(sw.Elapsed.TotalMilliseconds);

                // Run BESO
                sw.Restart();
                BESO_Core(currentVolume, Ae);
                sw.Stop();
                timeCost.Add(sw.Elapsed.TotalMilliseconds);

                double sum       = 0.0;
                double removeNum = 0;
                foreach (var elem in Model.Elements)
                {
                    if (elem.Xe != 1.0)
                    {
                        removeNum++;
                    }
                    sum += elem.Xe;
                }

                HistoryV.Add(sum / Model.Elements.Count);

                sw.Restart();
                FEIO.WriteInvalidElements(iter, Path, Model.Elements);

                Sensitivities = Ae_old;
                System.Update();

                // Check convergence
                if (iter > 10)
                {
                    var newV  = 0.0;
                    var lastV = 0.0;
                    for (int i = 1; i < 6; i++)
                    {
                        newV  += HistoryC[HistoryC.Count - i];
                        lastV += HistoryC[HistoryC.Count - 5 - i];
                    }
                    delta = Math.Abs((newV - lastV) / lastV);
                }
                sw.Stop();
                timeCost.Add(sw.Elapsed.TotalMilliseconds);

                solvingInfo += BESOInfo(iter, HistoryC.Last(), HistoryV.Last(), timeCost);
                WritePerformanceReport();
            }
            FEIO.WriteSensitivities(Path, Sensitivities);
            FEIO.WriteVertSensitivities(Path, ComputeVertSensitivities(Sensitivities), Model);
            Console.WriteLine("Done BESO");
        }