ReducedModelOptimization/src/reducedmodeloptimizer.hpp

58 lines
2.0 KiB
C++

#ifndef REDUCEDMODELOPTIMIZER_HPP
#define REDUCEDMODELOPTIMIZER_HPP
#include "beamformfinder.hpp"
#include "edgemesh.hpp"
#include "elementalmesh.hpp"
#include <Eigen/Dense>
using FullModelVertexIndex = VertexIndex;
using ReducedModelVertexIndex = VertexIndex;
struct SimulationScenarios {
std::vector<SimulationJob> scenarios;
std::shared_ptr<ElementalMesh> pMesh;
SimulationScenarios(std::shared_ptr<ElementalMesh> pMesh) : pMesh(pMesh) {}
std::vector<SimulationJob> getSimulationJobs() const { return scenarios; }
};
class ReducedModelOptimizer {
std::shared_ptr<ElementalMesh> reducedModelElementalMesh;
std::shared_ptr<ConstElementalMesh> pFullModelElementalMesh;
const std::unordered_map<ReducedModelVertexIndex, FullModelVertexIndex>
&reducedToFullViMap;
std::unordered_map<FullModelVertexIndex, ReducedModelVertexIndex>
fullToReducedViMap;
std::unordered_map<ReducedModelVertexIndex, ReducedModelVertexIndex>
oppositeVertexMap;
public:
Eigen::VectorXd optimize();
double operator()(const Eigen::VectorXd &x, Eigen::VectorXd &) const;
ReducedModelOptimizer(
ConstVCGEdgeMesh &fullModel, ConstVCGEdgeMesh &reducedModel,
const std::unordered_map<ReducedModelVertexIndex, FullModelVertexIndex>
&viMap,
const std::vector<std::pair<ReducedModelVertexIndex,
ReducedModelVertexIndex>> &oppositeVertices);
void computeReducedModelSimulationJob(
const SimulationJob &simulationJobOfFullModel,
SimulationJob &simulationJobOfReducedModel);
SimulationJob
getReducedSimulationJob(const SimulationJob &fullModelSimulationJob);
private:
void computeDesiredReducedModelDisplacements(
const SimulationResults &fullModelResults,
Eigen::MatrixX3d &optimaldisplacementsOfReducedModel);
Eigen::VectorXd
optimizeForSimulationJob(const SimulationJob &fullModelSimulationJob);
std::vector<SimulationJob>
createScenarios(const std::shared_ptr<ElementalMesh> &pMesh);
};
#endif // REDUCEDMODELOPTIMIZER_HPP