#ifndef REDUCEDMODELOPTIMIZER_HPP #define REDUCEDMODELOPTIMIZER_HPP #include "beamformfinder.hpp" #include "edgemesh.hpp" #include "elementalmesh.hpp" #include "matplot/matplot.h" #include using FullPatternVertexIndex = VertexIndex; using ReducedPatternVertexIndex = VertexIndex; class ReducedModelOptimizer { std::shared_ptr m_pReducedPatternSimulationMesh; std::shared_ptr m_pFullModelSimulationMesh; std::unordered_map m_fullToReducedInterfaceViMap; std::unordered_map m_fullPatternOppositeInterfaceViMap; std::unordered_map nodeToSlot; std::unordered_map> slotToNode; std::vector initialGuess; public: Eigen::VectorXd optimize(const int &simulationScenario = -1); double operator()(const Eigen::VectorXd &x, Eigen::VectorXd &) const; ReducedModelOptimizer(const std::vector &numberOfNodesPerSlot); void computeReducedModelSimulationJob( const SimulationJob &simulationJobOfFullModel, SimulationJob &simulationJobOfReducedModel); SimulationJob getReducedSimulationJob(const SimulationJob &fullModelSimulationJob); void initialize(FlatPattern &fullPattern, FlatPattern &reducedPatterm, const std::unordered_set &reducedModelExcludedEges); void setInitialGuess(std::vector v); private: void computeDesiredReducedModelDisplacements( const SimulationResults &fullModelResults, Eigen::MatrixX3d &optimalDisplacementsOfReducedModel); Eigen::VectorXd optimizeForSimulationJob(const SimulationJob &fullModelSimulationJob); std::vector createScenarios(const std::shared_ptr &pMesh); void computeMaps(FlatPattern &fullModel, FlatPattern &reducedPattern, const std::unordered_set &reducedModelExcludedEges); void createSimulationMeshes(FlatPattern &fullModel, FlatPattern &reducedModel); void initializeStiffnesses(); static double objective(long n, const double *x); }; #endif // REDUCEDMODELOPTIMIZER_HPP