#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 #include #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::vector> m_fullPatternOppositeInterfaceViPairs; std::unordered_map nodeToSlot; std::unordered_map> slotToNode; std::string optimizationNotes; std::vector> &, SimulationJob &)>> constructBaseScenarioFunctions; std::vector scenarioIsSymmetrical; int fullPatternNumberOfEdges; public: constexpr static std::array simulationScenariosResolution = {11, 11, 20, 20, 20}; // constexpr static std::array simulationScenariosResolution = {3, 3, 3, 3, 3}; inline static int totalNumberOfSimulationScenarios = std::accumulate(simulationScenariosResolution.begin(), simulationScenariosResolution.end(), 0); inline static int fanSize{6}; inline static double initialHexagonSize{0.3}; inline static VectorType patternPlaneNormal{0, 0, 1}; void optimize( const ReducedPatternOptimization::Settings &xRanges, ReducedPatternOptimization::Results &results, const std::vector &simulationScenarios = std::vector( {ReducedPatternOptimization::Axial, ReducedPatternOptimization::Shear, ReducedPatternOptimization::Bending, ReducedPatternOptimization::Dome, ReducedPatternOptimization::Saddle})); 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::vector &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> createFullPatternSimulationJobs( 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_map> &slotToNode, PatternGeometry &fullPattern, PatternGeometry &reducedPattern, std::unordered_map &reducedToFullInterfaceViMap, std::unordered_map &fullToReducedInterfaceViMap, std::vector> &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 computeRawTranslationalError( const std::vector &fullPatternDisplacements, const std::vector &reducedPatternDisplacements, const std::unordered_map &reducedToFullInterfaceViMap); static double computeDisplacementError( const std::vector &fullPatternDisplacements, const std::vector &reducedPatternDisplacements, const std::unordered_map &reducedToFullInterfaceViMap, const double &normalizationFactor); static double objective(double E, double A, double innerHexagonSize, double innerHexagonRotationAngle); static double computeRawRotationalError( const std::vector> &rotatedQuaternion_fullPattern, const std::vector> &rotatedQuaternion_reducedPattern, const std::unordered_map &reducedToFullInterfaceViMap); static double computeRotationalError( const std::vector> &rotatedQuaternion_fullPattern, const std::vector> &rotatedQuaternion_reducedPattern, const std::unordered_map &reducedToFullInterfaceViMap, const double &normalizationFactor); static double computeError( const SimulationResults &simulationResults_fullPattern, const SimulationResults &simulationResults_reducedPattern, const std::unordered_map &reducedToFullInterfaceViMap, const double &normalizationFactor_translationalDisplacement, const double &normalizationFactor_rotationalDisplacement); static void constructAxialSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static void constructShearSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static void constructBendingSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static void constructDomeSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static void constructSaddleSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static std::function &x, std::shared_ptr &m)> function_updateReducedPattern; static std::function &x, std::shared_ptr &m)> function_updateReducedPattern_material; static std::function &pReducedPatternSimulationMesh, const double &newE)> function_updateReducedPattern_material_E; static std::function &pReducedPatternSimulationMesh, const double &newA)> function_updateReducedPattern_material_A; static std::function &pReducedPatternSimulationMesh, const double &newI)> function_updateReducedPattern_material_I; static std::function &pReducedPatternSimulationMesh, const double &newI2)> function_updateReducedPattern_material_I2; static std::function &pReducedPatternSimulationMesh, const double &newI3)> function_updateReducedPattern_material_I3; static std::function &pReducedPatternSimulationMesh, const double &newJ)> function_updateReducedPattern_material_J; static std::function &x, std::shared_ptr &m)> function_updateReducedPattern_geometry; private: static void computeDesiredReducedModelDisplacements( const SimulationResults &fullModelResults, const std::unordered_map &displacementsReducedToFullMap, Eigen::MatrixX3d &optimalDisplacementsOfReducedModel); static void runOptimization(const ReducedPatternOptimization::Settings &settings, ReducedPatternOptimization::Results &results); std::vector> createFullPatternSimulationJobs( const std::shared_ptr &pMesh, const std::vector> &maxForceMagnitudes); void computeMaps(PatternGeometry &fullModel, PatternGeometry &reducedPattern); void createSimulationMeshes(PatternGeometry &fullModel, PatternGeometry &reducedModel); static void initializeOptimizationParameters( const std::shared_ptr &mesh, const std::vector &optimizationParamters); static double objective(long n, const double *x); DRMSimulationModel simulator; void computeObjectiveValueNormalizationFactors(); static void getResults(const dlib::function_evaluation &optimizationResult_dlib, const ReducedPatternOptimization::Settings &settings, ReducedPatternOptimization::Results &results); double computeFullPatternMaxSimulationForce( const ReducedPatternOptimization::BaseSimulationScenario &scenario); std::vector> computeFullPatternMaxSimulationForces( const std::vector &desiredBaseSimulationScenarioIndices); std::vector> getFullPatternMaxSimulationForces( const std::vector &desiredBaseSimulationScenarioIndices); static double objective(const dlib::matrix &x); static void initializeUpdateReducedPatternFunctions(); }; inline std::function &x, std::shared_ptr &m)> ReducedModelOptimizer::function_updateReducedPattern; inline std::function &x, std::shared_ptr &m)> ReducedModelOptimizer::function_updateReducedPattern_material; inline std::function &pReducedPatternSimulationMesh, const double &newE)> ReducedModelOptimizer::function_updateReducedPattern_material_E; inline std::function &pReducedPatternSimulationMesh, const double &newA)> ReducedModelOptimizer::function_updateReducedPattern_material_A; inline std::function &pReducedPatternSimulationMesh, const double &newI)> ReducedModelOptimizer::function_updateReducedPattern_material_I; inline std::function &pReducedPatternSimulationMesh, const double &newI2)> ReducedModelOptimizer::function_updateReducedPattern_material_I2; inline std::function &pReducedPatternSimulationMesh, const double &newI3)> ReducedModelOptimizer::function_updateReducedPattern_material_I3; inline std::function &pReducedPatternSimulationMesh, const double &newJ)> ReducedModelOptimizer::function_updateReducedPattern_material_J; inline std::function &x, std::shared_ptr &m)> ReducedModelOptimizer::function_updateReducedPattern_geometry; #endif // REDUCEDMODELOPTIMIZER_HPP