#ifndef REDUCEDMODELOPTIMIZER_HPP #define REDUCEDMODELOPTIMIZER_HPP #include "csvfile.hpp" #include "drmsimulationmodel.hpp" #include "edgemesh.hpp" #include "linearsimulationmodel.hpp" #include "matplot/matplot.h" #include "reducedmodeloptimizer_structs.hpp" #include "simulationmesh.hpp" #include #ifdef POLYSCOPE_DEFINED #include "polyscope/color_management.h" #endif // POLYSCOPE_DEFINED using FullPatternVertexIndex = VertexIndex; using ReducedPatternVertexIndex = VertexIndex; class ReducedModelOptimizer { std::shared_ptr m_pReducedPatternSimulationMesh; std::shared_ptr m_pFullPatternSimulationMesh; std::unordered_map m_fullToReducedInterfaceViMap; std::unordered_map m_fullPatternOppositeInterfaceViMap; std::unordered_map nodeToSlot; std::unordered_map> slotToNode; #ifdef POLYSCOPE_DEFINED #endif // POLYSCOPE_DEFINED public: inline static int fanSize{6}; inline static VectorType patternPlaneNormal{0, 0, 1}; ReducedModelOptimization::Results optimize( const ReducedModelOptimization::Settings &xRanges, const std::vector &simulationScenarios = std::vector()); double operator()(const Eigen::VectorXd &x, Eigen::VectorXd &) const; ReducedModelOptimizer(const std::vector &numberOfNodesPerSlot); static void computeReducedModelSimulationJob( const SimulationJob &simulationJobOfFullModel, const std::unordered_map &fullToReducedMap, SimulationJob &simulationJobOfReducedModel); SimulationJob getReducedSimulationJob(const SimulationJob &fullModelSimulationJob); void initializePatterns(PatternGeometry &fullPattern, PatternGeometry &reducedPatterm, const std::unordered_set &reducedModelExcludedEges, const int &optimizationParameters); static void runSimulation(const std::string &filename, std::vector &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> createScenarios(const std::shared_ptr &pMesh, const std::unordered_map &fullPatternOppositeInterfaceViMap); static void createSimulationMeshes( PatternGeometry &fullModel, PatternGeometry &reducedModel, std::shared_ptr &pFullPatternSimulationMesh, std::shared_ptr &pReducedPatternSimulationMesh); static void computeMaps( const std::unordered_set &reducedModelExcludedEdges, const std::unordered_map> &slotToNode, PatternGeometry &fullPattern, PatternGeometry &reducedPattern, std::unordered_map &reducedToFullInterfaceViMap, std::unordered_map &fullToReducedInterfaceViMap, std::unordered_map &fullPatternOppositeInterfaceViMap); static void visualizeResults( const std::vector> &fullPatternSimulationJobs, const std::vector> &reducedPatternSimulationJobs, const std::vector &simulationScenarios, const std::unordered_map &reducedToFullInterfaceViMap); static void registerResultsForDrawing( const std::shared_ptr &pFullPatternSimulationJob, const std::shared_ptr &pReducedPatternSimulationJob, const std::unordered_map &reducedToFullInterfaceViMap); static double computeRawDisplacementError( const std::vector &reducedPatternDisplacements, const std::vector &fullPatternDisplacements, const std::unordered_map &reducedToFullInterfaceViMap); static double computeDisplacementError( const std::vector &reducedPatternDisplacements, const std::vector &fullPatternDisplacements, const std::unordered_map &reducedToFullInterfaceViMap, const double &normalizationFactor); static double objective(double E, double A, double innerHexagonSize, double innerHexagonRotationAngle); private: static void computeDesiredReducedModelDisplacements( const SimulationResults &fullModelResults, const std::unordered_map &displacementsReducedToFullMap, Eigen::MatrixX3d &optimalDisplacementsOfReducedModel); static ReducedModelOptimization::Results runOptimization( const ReducedModelOptimization::Settings &settings); std::vector> createScenarios( const std::shared_ptr &pMesh); void computeMaps(PatternGeometry &fullModel, PatternGeometry &reducedPattern, const std::unordered_set &reducedModelExcludedEges); void createSimulationMeshes(PatternGeometry &fullModel, PatternGeometry &reducedModel); static void initializeOptimizationParameters(const std::shared_ptr &mesh, const int &optimizationParamters); static double objective(long n, const double *x); DRMSimulationModel simulator; void computeObjectiveValueNormalizationFactors(); }; void updateMesh(long n, const double *x); #endif // REDUCEDMODELOPTIMIZER_HPP