From 47534e0de5ce3ecd4ee14508619d3ad3de32d2b6 Mon Sep 17 00:00:00 2001 From: anneliesvdm Date: Tue, 26 Sep 2017 15:52:58 +0200 Subject: [PATCH] Added python package architecture for main file --- Corpus/__init__.py | 0 Corpus/component.py | 0 Corpus/main.py | 114 +++++++++++++++++++++++++++++++++++++++ Corpus/pipe.py | 0 Structure/structure.pptx | Bin 41219 -> 41245 bytes 5 files changed, 114 insertions(+) create mode 100644 Corpus/__init__.py create mode 100644 Corpus/component.py create mode 100644 Corpus/main.py create mode 100644 Corpus/pipe.py diff --git a/Corpus/__init__.py b/Corpus/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Corpus/component.py b/Corpus/component.py new file mode 100644 index 0000000..e69de29 diff --git a/Corpus/main.py b/Corpus/main.py new file mode 100644 index 0000000..631bccf --- /dev/null +++ b/Corpus/main.py @@ -0,0 +1,114 @@ +from component import * +from pipe import * + +from pyomo.environ import * +import pandas as pd + + +class Modesto: + def __init__(self, graph): + """ + This class allows setting up optimization problems for district energy systems + + :param graph: Object containing structure of the network, + structure and parameters describing component models and + design parameters + """ + + self.model = AbstractModel() + # self.user_data = pd.DataFrame({'A' : []}) # TODO Better way to initialize empty df? + # self.weather_data = pd.DataFrame({'A' : []}) + + def build_opt(self): + """ + Build the structure of the optimization problem + Sets up the equations without parameters + + :return: + """ + pass + + def fill_opt(self): + """ + Fill the optimization problem with all necessary parameters + + :return: + """ + pass + + def solve(self): + """ + Solve a new optimization + + :return: + """ + pass + + def get_sol(self, name): + """ + Get the solution of a variable + + :param name: Name of the variable + :return: A list containing the optimal values throughout the entire horizon of the variable + """ + pass + + def opt_settings(self, objective=None, horizon=None, time_step=None, pipe_type=None): + """ + Change the setting of the optimization problem + + :param objective: Name of the optimization objective + :param horizon: The horizon of the problem, in seconds + :param time_step: The time between two points, in secinds + :param pipe_type: The name of the type of pipe model to be used + :return: + """ + pass + + def change_user_behaviour(self, comp, kind, new_data): + """ + Change the user behaviour of a certain component + + :param comp: Name of the component + :param kind: Name of the kind of user data (e.g. mDHW) + :param new_data: The new data, in a dataframe (index is time) + :return: + """ + # TODO Is resampling possible for the new data in case it doesn't have the correct time step? + pass + + def change_weather(self, new_data): + """ + Change the weather + + :param new_data: The new data that describes the weather, in a dataframe (index is time), + columns are the different required signals + :return: + """ + + # TODO Is resampling possible for the new data in case it doesn't have the correct time step? + pass + + def change_design_param(self, comp, param, val): + """ + Change a design parameter + + :param comp: Name of the component + :param param: name of the parameter + :param val: New value of the parameter + :return: + """ + pass + + def change_initial_cond(self, comp, state, val): + """ + Change the initial condition of a state + + :param comp: Name of the component + :param state: Name of the state + :param val: New initial value of the state + :return: + """ + pass + + diff --git a/Corpus/pipe.py b/Corpus/pipe.py new file mode 100644 index 0000000..e69de29 diff --git a/Structure/structure.pptx b/Structure/structure.pptx index 9477984fb416582887228325dfa456310ddc6abd..2d4d595e3816b0939747f01475624f70acc64be4 100644 GIT binary patch delta 12317 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 H|7rYR2ZxN7 delta 12171 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