private void Solve(double[] x, out Model model, out LinearAnalyzer childAnalyzer, out Rod2DResults rodResults) { model = BuildModel(x); SkylineSolver solver = new SkylineSolver.Builder().BuildSolver(model); var provider = new ProblemStructural(model, solver); childAnalyzer = new LinearAnalyzer(model, solver, provider); var parentAnalyzer = new StaticAnalyzer(model, solver, provider, childAnalyzer); CreateLogs(model, childAnalyzer); rodResults = new Rod2DResults(model.SubdomainsDictionary[subdomainID], solver.LinearSystems[subdomainID]); // Let's hope this is the one! parentAnalyzer.Initialize(); parentAnalyzer.Solve(); }
private double[] EvaluateConstraints(Model model, LinearAnalyzer childAnalyzer, Rod2DResults rodResults) { var constraints = new LinkedList <double>(); // Displacements const double maxDisplacement = 2; double max = 0; foreach (var displacement in ((DOFSLog)childAnalyzer.Logs[1][0]).DOFValues.Values) { if (Math.Abs(displacement) > max) { max = Math.Abs(displacement); } } constraints.AddLast(max / maxDisplacement - 1.0); // Stresses double[] minStresses = new double[10]; minStresses = minStresses.Select(i => - 25.0).ToArray(); double[] maxStresses = new double[10]; maxStresses = maxStresses.Select(i => 25.0).ToArray(); double[] stresses = new double[10]; int counter = 0; foreach (var element in model.Elements) { stresses[counter++] = rodResults.AxialRod2DStress(element); } for (int i = 0; i < stresses.Length; ++i) { constraints.AddLast(stresses[i] / maxStresses[i] - 1.0); constraints.AddLast(stresses[i] / minStresses[i] - 1.0); } return(constraints.ToArray()); }