ReducedModelOptimization/src/reducedmodeloptimizer.hpp

131 lines
6.3 KiB
C++
Raw Normal View History

2020-11-23 10:06:45 +01:00
#ifndef REDUCEDMODELOPTIMIZER_HPP
#define REDUCEDMODELOPTIMIZER_HPP
2021-03-23 18:20:46 +01:00
#include "drmsimulationmodel.hpp"
2021-02-10 12:19:37 +01:00
#include "csvfile.hpp"
2020-11-23 10:06:45 +01:00
#include "edgemesh.hpp"
2021-03-23 18:20:46 +01:00
#include "simulationmesh.hpp"
#include "linearsimulationmodel.hpp"
2020-12-09 16:58:48 +01:00
#include "matplot/matplot.h"
2020-11-23 10:06:45 +01:00
#include <Eigen/Dense>
2021-03-23 18:20:46 +01:00
#include "reducedmodeloptimizer_structs.hpp"
2020-11-23 10:06:45 +01:00
#ifdef POLYSCOPE_DEFINED
#include "polyscope/color_management.h"
#endif // POLYSCOPE_DEFINED
using FullPatternVertexIndex = VertexIndex;
using ReducedPatternVertexIndex = VertexIndex;
2020-11-23 10:06:45 +01:00
class ReducedModelOptimizer {
2021-03-23 18:20:46 +01:00
2020-12-16 20:31:58 +01:00
std::shared_ptr<SimulationMesh> m_pReducedPatternSimulationMesh;
std::shared_ptr<SimulationMesh> m_pFullPatternSimulationMesh;
std::unordered_map<FullPatternVertexIndex, ReducedPatternVertexIndex>
m_fullToReducedInterfaceViMap;
std::unordered_map<FullPatternVertexIndex, FullPatternVertexIndex>
m_fullPatternOppositeInterfaceViMap;
std::unordered_map<size_t, size_t> nodeToSlot;
std::unordered_map<size_t, std::unordered_set<size_t>> slotToNode;
#ifdef POLYSCOPE_DEFINED
#endif // POLYSCOPE_DEFINED
2020-11-23 10:06:45 +01:00
public:
inline static int fanSize{6};
inline static VectorType patternPlaneNormal{0, 0, 1};
2021-03-23 18:20:46 +01:00
ReducedModelOptimization::Results optimize(const ReducedModelOptimization::Settings &xRanges,
const std::vector<ReducedModelOptimization::SimulationScenario> &simulationScenarios =
std::vector<ReducedModelOptimization::SimulationScenario>());
2020-11-23 10:06:45 +01:00
double operator()(const Eigen::VectorXd &x, Eigen::VectorXd &) const;
ReducedModelOptimizer(const std::vector<size_t> &numberOfNodesPerSlot);
static void computeReducedModelSimulationJob(
2020-11-23 10:06:45 +01:00
const SimulationJob &simulationJobOfFullModel,
const std::unordered_map<size_t, size_t> &simulationJobFullToReducedMap,
2020-11-23 10:06:45 +01:00
SimulationJob &simulationJobOfReducedModel);
SimulationJob
getReducedSimulationJob(const SimulationJob &fullModelSimulationJob);
2021-03-23 18:20:46 +01:00
void initializePatterns(PatternGeometry &fullPattern, PatternGeometry &reducedPatterm,
const std::unordered_set<size_t> &reducedModelExcludedEges, const int &optimizationParameters);
static void runSimulation(const std::string &filename,
std::vector<double> &x);
static double objective(double x2, double A, double J, double I2, double I3, double x3,
double innerHexagonRotationAngle);
static double objective(double b, double r, double E);
static std::vector<std::shared_ptr<SimulationJob>>
createScenarios(const std::shared_ptr<SimulationMesh> &pMesh,
const std::unordered_map<size_t, size_t>
&fullPatternOppositeInterfaceViMap);
static void createSimulationMeshes(
PatternGeometry &fullModel, PatternGeometry &reducedModel,
std::shared_ptr<SimulationMesh> &pFullPatternSimulationMesh,
std::shared_ptr<SimulationMesh> &pReducedPatternSimulationMesh);
static void computeMaps(
const std::unordered_set<size_t> &reducedModelExcludedEdges,
const std::unordered_map<size_t, std::unordered_set<size_t>> &slotToNode,
PatternGeometry &fullPattern, PatternGeometry &reducedPattern,
std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
&reducedToFullInterfaceViMap,
std::unordered_map<FullPatternVertexIndex, ReducedPatternVertexIndex>
&fullToReducedInterfaceViMap,
std::unordered_map<FullPatternVertexIndex, ReducedPatternVertexIndex>
&fullPatternOppositeInterfaceViMap);
static void
visualizeResults(const std::vector<std::shared_ptr<SimulationJob>>
&fullPatternSimulationJobs,
const std::vector<std::shared_ptr<SimulationJob>>
&reducedPatternSimulationJobs,
2021-03-23 18:20:46 +01:00
const std::vector<ReducedModelOptimization::SimulationScenario> &simulationScenarios,
const std::unordered_map<ReducedPatternVertexIndex,
FullPatternVertexIndex>
&reducedToFullInterfaceViMap);
static void registerResultsForDrawing(
const std::shared_ptr<SimulationJob> &pFullPatternSimulationJob,
const std::shared_ptr<SimulationJob> &pReducedPatternSimulationJob,
2021-02-25 09:09:38 +01:00
const std::unordered_map<ReducedPatternVertexIndex,
FullPatternVertexIndex>
&reducedToFullInterfaceViMap);
static double
computeRawError(const std::vector<Vector6d> &reducedPatternDisplacements,
const std::vector<Vector6d> &fullPatternDisplacements,
const std::unordered_map<ReducedPatternVertexIndex,
FullPatternVertexIndex>
&reducedToFullInterfaceViMap);
static double
computeError(const std::vector<Vector6d> &reducedPatternDisplacements,
const std::vector<Vector6d> &fullPatternDisplacements,
const std::unordered_map<ReducedPatternVertexIndex,
FullPatternVertexIndex>
&reducedToFullInterfaceViMap,
const double &normalizationFactor);
2021-03-23 18:20:46 +01:00
static double objective(double E, double A, double innerHexagonSize, double innerHexagonRotationAngle);
private:
static void computeDesiredReducedModelDisplacements(
const SimulationResults &fullModelResults,
const std::unordered_map<size_t, size_t> &displacementsReducedToFullMap,
Eigen::MatrixX3d &optimalDisplacementsOfReducedModel);
2021-03-23 18:20:46 +01:00
static ReducedModelOptimization::Results runOptimization(const ReducedModelOptimization::Settings &settings);
std::vector<std::shared_ptr<SimulationJob>>
createScenarios(const std::shared_ptr<SimulationMesh> &pMesh);
void computeMaps(PatternGeometry &fullModel, PatternGeometry &reducedPattern,
const std::unordered_set<size_t> &reducedModelExcludedEges);
void createSimulationMeshes(PatternGeometry &fullModel,
PatternGeometry &reducedModel);
static void
2021-03-23 18:20:46 +01:00
initializeOptimizationParameters(const std::shared_ptr<SimulationMesh> &mesh, const int &optimizationParamters);
2020-12-09 16:58:48 +01:00
static double objective(long n, const double *x);
FormFinder simulator;
void computeObjectiveValueNormalizationFactors();
2020-11-23 10:06:45 +01:00
};
2021-03-23 18:20:46 +01:00
void updateMesh(long n, const double *x);
2020-11-23 10:06:45 +01:00
#endif // REDUCEDMODELOPTIMIZER_HPP