/** * \file * \copyright * Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org) * Distributed under a Modified BSD License. * See accompanying file LICENSE.txt or * http://www.opengeosys.org/project/license * */ #pragma once namespace ProcessLib { //! Base class for BHENetwork. //! This class will get Python bindings and is intended to be to be derived in //! Python. class BHEInflowPythonBoundaryConditionPythonSideInterface { public: /*! * Initialize network dataframe * return a tuple (time, BHE inflow temperature, BHE outflow * temperature, BHE outflow bc node id, BHE flowrate) * set at that position and the parameters of the BHE network. */ virtual std::tuple<double /*time*/, std::vector<double> /*Tin_val*/, std::vector<double> /*Tout_val*/, std::vector<int> /*bc_out_ids*/, std::vector<double> /*BHE_flowrate*/> initializeDataContainer() const { _overridden_essential = false; return std::tuple<double, std::vector<double>, std::vector<double>, std::vector<int>, std::vector<double>>{ std::numeric_limits<double>::quiet_NaN(), {}, {}, {}, {}}; } /*! * transfer BHE network dataframe to TESPy and get Tin from TESPy * * \return a tuple (if use tespyThermalSolver, if convergence achieved * in tespy, BHE Tin and Tout value from TESPy) * indicating if tespyThermalSolver shall be used at that position, if * themal convergence has been achieved in the tespy and the new * inflow temperature of all BHEs. */ virtual std::tuple<bool, bool, std::vector<double>> tespyThermalSolver( double /*t*/, std::vector<double> const& /*Tin_val*/, std::vector<double> const& /*Tout_val*/) const { _overridden_tespyThermal = false; return std::tuple<bool, bool, std::vector<double>>{false, false, {}}; } /*! * call Tespy hydraulic solver to get flow velocity in each pipe * * \return a tuple (if use tespyHydroSolver, f_velocity) indicating if * tespyHydroSolver shall be used at that position and the flow velocity * in each pipe of all BHEs. */ virtual std::tuple<bool, std::vector<double>> tespyHydroSolver( double /*t*/) const { _overridden_tespyHydro = false; return std::tuple<bool, std::vector<double>>{false, {}}; } //! Tells if initializeDataContainer() has been overridden in the derived //! class in Python. //! //! \pre initializeDataContainer() must already have been called //! once. bool isOverriddenEssential() const { return _overridden_essential; } //! Tells if tespyThermalSolver() has been overridden in the derived class //! in Python. //! //! \pre tespyThermalSolver() must already have been called once. bool isOverriddenTespyThermal() const { return _overridden_tespyThermal; } //! Tells if tespyHydroSolver() has been overridden in the derived class //! in Python. //! //! \pre tespyHydroSolver() must already have been called once. bool isOverriddenTespyHydro() const { return _overridden_tespyHydro; } // BHE network dataframe container std::tuple<double, std::vector<double>, std::vector<double>, std::vector<int>, std::vector<double>> dataframe_network; virtual ~BHEInflowPythonBoundaryConditionPythonSideInterface() = default; private: //! Tells if initializeDataContainer() has been overridden in the derived //! class in Python. mutable bool _overridden_essential = true; //! Tells if tespyThermalSolver() has been overridden in the derived class //! in Python. mutable bool _overridden_tespyThermal = true; //! Tells if tespyHydroSolver() has been overridden in the derived class in //! Python. mutable bool _overridden_tespyHydro = true; }; } // namespace ProcessLib