#pragma once #include "gridfire/engine/views/engine_view_abstract.h" #include "gridfire/engine/engine_abstract.h" #include "gridfire/io/network_file.h" #include "gridfire/network.h" #include "fourdst/config/config.h" #include "fourdst/logging/logging.h" #include "quill/Logger.h" #include namespace gridfire{ class FileDefinedEngineView final: public DynamicEngine, public EngineView { public: explicit FileDefinedEngineView( DynamicEngine& baseEngine, const std::string& fileName, const io::NetworkFileParser& parser ); // --- EngineView Interface --- const DynamicEngine& getBaseEngine() const override; // --- Engine Interface --- const std::vector& getNetworkSpecies() const override; // --- DynamicEngine Interface --- StepDerivatives calculateRHSAndEnergy( const std::vector& Y_defined, const double T9, const double rho ) const override; void generateJacobianMatrix( const std::vector& Y_defined, const double T9, const double rho ) override; double getJacobianMatrixEntry( const int i_defined, const int j_defined ) const override; void generateStoichiometryMatrix() override; int getStoichiometryMatrixEntry( const int speciesIndex_defined, const int reactionIndex_defined ) const override; double calculateMolarReactionFlow( const reaction::Reaction& reaction, const std::vector& Y_defined, const double T9, const double rho ) const override; const reaction::LogicalReactionSet& getNetworkReactions() const override; std::unordered_map getSpeciesTimescales( const std::vector& Y_defined, const double T9, const double rho ) const override; void update(const NetIn &netIn) override; void setNetworkFile(const std::string& fileName); void setScreeningModel(screening::ScreeningType model) override; [[nodiscard]] screening::ScreeningType getScreeningModel() const override; private: using Config = fourdst::config::Config; using LogManager = fourdst::logging::LogManager; Config& m_config = Config::getInstance(); quill::Logger* m_logger = LogManager::getInstance().getLogger("log"); DynamicEngine& m_baseEngine; std::string m_fileName; ///< Name of the file defining the reaction set considered by the engine view. const io::NetworkFileParser& m_parser; ///< Parser for the network file. std::vector m_activeSpecies; ///< Active species in the defined engine. reaction::LogicalReactionSet m_activeReactions; ///< Active reactions in the defined engine. std::vector m_speciesIndexMap; ///< Maps indices of active species to indices in the full network. std::vector m_reactionIndexMap; ///< Maps indices of active reactions to indices in the full network. bool m_isStale = true; private: void buildFromFile(const std::string& fileName); /** * @brief Constructs the species index map. * * @return A vector mapping culled species indices to full species indices. * * This method creates a map from the indices of the active species to the indices of the * corresponding species in the full network. * * @see AdaptiveEngineView::update() */ std::vector constructSpeciesIndexMap() const; /** * @brief Constructs the reaction index map. * * @return A vector mapping culled reaction indices to full reaction indices. * * This method creates a map from the indices of the active reactions to the indices of the * corresponding reactions in the full network. * * @see AdaptiveEngineView::update() */ std::vector constructReactionIndexMap() const; /** * @brief Maps a vector of culled abundances to a vector of full abundances. * * @param culled A vector of abundances for the active species. * @return A vector of abundances for the full network, with the abundances of the active * species copied from the culled vector. */ std::vector mapViewToFull(const std::vector& culled) const; /** * @brief Maps a vector of full abundances to a vector of culled abundances. * * @param full A vector of abundances for the full network. * @return A vector of abundances for the active species, with the abundances of the active * species copied from the full vector. */ std::vector mapFullToView(const std::vector& full) const; /** * @brief Maps a culled species index to a full species index. * * @param culledSpeciesIndex The index of the species in the culled species list. * @return The index of the corresponding species in the full network. * * @throws std::out_of_range If the culled index is out of bounds for the species index map. */ size_t mapViewToFullSpeciesIndex(size_t culledSpeciesIndex) const; /** * @brief Maps a culled reaction index to a full reaction index. * * @param culledReactionIndex The index of the reaction in the culled reaction list. * @return The index of the corresponding reaction in the full network. * * @throws std::out_of_range If the culled index is out of bounds for the reaction index map. */ size_t mapViewToFullReactionIndex(size_t culledReactionIndex) const; void validateNetworkState() const; }; }