From fd2f9a08013f370144dbea5a9c6af94266bc3216 Mon Sep 17 00:00:00 2001 From: Sadia Ferdous Snigdha <69901214+sf-snigdha@users.noreply.github.com> Date: Wed, 9 Oct 2024 15:06:33 +0200 Subject: [PATCH] Add files via upload Added multinetwork with power and heat networks , developed their simple controller according to the power to gas network and tried to plot the coupled network. --- tutorials/coupled_nets_power_heat.py | 88 +++++++++++++++ tutorials/coupled_plot.png | Bin 0 -> 27667 bytes tutorials/coupled_plot.py | 85 ++++++++++++++ tutorials/multinet_control_power2heat.py | 136 +++++++++++++++++++++++ 4 files changed, 309 insertions(+) create mode 100644 tutorials/coupled_nets_power_heat.py create mode 100644 tutorials/coupled_plot.png create mode 100644 tutorials/coupled_plot.py create mode 100644 tutorials/multinet_control_power2heat.py diff --git a/tutorials/coupled_nets_power_heat.py b/tutorials/coupled_nets_power_heat.py new file mode 100644 index 00000000..ceaaa031 --- /dev/null +++ b/tutorials/coupled_nets_power_heat.py @@ -0,0 +1,88 @@ +import pandapipes as pp +import pandapower as ppower +from pandapower.control.basic_controller import Controller +from pandapower import networks as pandasnet +from pandapipes import networks as pipenet +from pandapipes.multinet.create_multinet import create_empty_multinet, add_net_to_multinet +from pandapipes.multinet.control.run_control_multinet import run_control +import pandapower.plotting as pp_plot +import os +import matplotlib.pyplot as plt +from pandapower.plotting.plotly import simple_plotly +import pandas as pd +import pandapower.plotting.plotly as pplotly +import sys +from multinet_control_power2heat import * + +import matplotlib.pyplot as plt +# ---------------------------------------- +# Step 1: Creating the power network using pandapower's predefined simple network example +power_net = pandasnet.example_simple() # Loading a predefined simple electrical network. + +# ---------------------------------------- +# Step 2: Creating a heat network using pandapipes +# This defines a thermal (fluid) network that models the heat system. + +heat_net = pp.create_empty_network(fluid="water") # Create an empty heat network with water as the fluid. + +# Create junctions (nodes) in the heat network: +j0 = pp.create_junction(heat_net, pn_bar=5, tfluid_k=293.15, name="junction 0") # Junction 0 at 5 bar pressure and 293.15 K temperature. +j1 = pp.create_junction(heat_net, pn_bar=5, tfluid_k=293.15, name="junction 1") # Junction 1 with same pressure and temperature. +j2 = pp.create_junction(heat_net, pn_bar=5, tfluid_k=293.15, name="junction 2") # Junction 2 with same pressure and temperature. +j3 = pp.create_junction(heat_net, pn_bar=5, tfluid_k=293.15, name="junction 3") # Junction 3 with same pressure and temperature. + +# Create a pump to circulate fluid between junctions j0 and j3, with a constant mass flow rate. +pp.create_circ_pump_const_mass_flow(heat_net, return_junction=j3, flow_junction=j0, p_flow_bar=5, + mdot_flow_kg_per_s=20, t_flow_k=273.15+35) # A pump for fluid flow at 20 kg/s with 5 bar pressure difference. + +# Create a heat exchanger between junctions j1 and j2 +pp.create_heat_exchanger(heat_net, from_junction=j1, to_junction=j2, diameter_m=200e-3, qext_w=100000) # Heat exchanger between j1 and j2. + +# Create pipes to connect the junctions and form the network. +pp.create_pipe_from_parameters(heat_net, from_junction=j0, to_junction=j1, length_km=1, + diameter_m=200e-3, k_mm=.1, alpha_w_per_m2k=10, sections=5, text_k=283) # Pipe from j0 to j1. +pp.create_pipe_from_parameters(heat_net, from_junction=j2, to_junction=j3, length_km=1, + diameter_m=200e-3, k_mm=.1, alpha_w_per_m2k=10, sections=5, text_k=283) # Pipe from j2 to j3. + +# ---------------------------------------- +# Step 3: Create a multinet (multi-network) and add power and heat networks +multinet = create_empty_multinet('multinet') # Create an empty multinet system. +add_net_to_multinet(multinet, power_net, 'power') # Add the power network to the multinet system. +add_net_to_multinet(multinet, heat_net, 'heat') # Add the heat network to the multinet system. + +# ---------------------------------------- +# Step 4: Define conversion units (power-to-heat and heat-to-power) within the networks. +# These elements will facilitate energy conversions between the power and heat networks. + +# Power-to-Heat (P2H) conversion: Creating a load in the power network (consuming power) and a heat exchanger in the heat network. +p2h_id_el = ppower.create_load(power_net, bus=6, p_mw=.0002, name="power to heat consumption") # Load in the power network at bus 6 (0.2 MW). +p2h_id_heat = pp.create_heat_exchanger(heat_net, from_junction=0, to_junction=1, diameter_m=200e-3, qext_w=0, name="power to heat feed in") + +# Heat-to-Power (H2P) conversion: Creating a heat exchanger in the heat network and a generator in the power network. +h2p_id_heat = pp.create_heat_exchanger(heat_net, from_junction=2, to_junction=3, diameter_m=200e-3, qext_w=200000, name="power to heat feed in") +h2p_id_el = ppower.create_sgen(power_net, bus=6, p_mw=0, name="fuel cell feed in") + +# ---------------------------------------- +# Step 5: Define control objects for the power-to-heat and heat-to-power conversions. + +# Power-to-Heat control: A control object to manage the energy transfer between power and heat networks. +p2h_ctrl = P2HControlMultiEnergy(multinet, p2h_id_el, p2h_id_heat, efficiency=3, + name_power_net="power", name_heat_net="heat") + +# Heat-to-Power control: Another control object for managing the reverse flow (heat to power). +h2p_ctrl = H2PControlMultiEnergy(multinet, h2p_id_el, h2p_id_heat, efficiency=2, + name_power_net="power", name_heat_net="heat") + +# ---------------------------------------- +# Step 6: Print initial values of power-to-heat and heat-to-power elements. +print(heat_net.heat_exchanger.loc[p2h_id_heat, 'qext_w']) # Print the initial power-to-heat exchange rate. +print(power_net.sgen.loc[h2p_id_el, 'p_mw']) # Print the initial power generation from the fuel cell. + +# ---------------------------------------- +# Step 7: Run the control simulation on the multinet system. +run_control(multinet) # This runs the control logic for the power and heat networks based on the defined conversions. + +# ---------------------------------------- +# Step 8: Print updated values after running the simulation. +print(heat_net.heat_exchanger.loc[p2h_id_heat, 'qext_w']) # Print the updated power-to-heat exchange rate after running control. +print(power_net.sgen.loc[h2p_id_el, 'p_mw']) # Print the updated power generation after running control. diff --git a/tutorials/coupled_plot.png b/tutorials/coupled_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc85e4e3b8150fa153e31d5c3cb7224075f26d7 GIT binary patch literal 27667 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 literal 0 HcmV?d00001 diff --git a/tutorials/coupled_plot.py b/tutorials/coupled_plot.py new file mode 100644 index 00000000..d444f895 --- /dev/null +++ b/tutorials/coupled_plot.py @@ -0,0 +1,85 @@ +import pandapipes.plotting as plot +from itertools import chain +from pandapower.control import ConstControl +from pandapipes.properties.fluids import get_fluid +from pandapower.control.basic_controller import Controller +from pandas.errors import InvalidIndexError + +import matplotlib.pyplot as plt +import pandapipes.plotting as pp_plot + +import sys +try: + import matplotlib.pyplot as plt + MATPLOTLIB_INSTALLED = True +except ImportError: + MATPLOTLIB_INSTALLED = False + +from pandapower.auxiliary import soft_dependency_error +from pandapower.plotting.plotting_toolbox import get_collection_sizes +from pandapower.plotting.collections import create_bus_collection, create_line_collection, \ + create_trafo_collection, create_trafo3w_collection, \ + create_line_switch_collection, draw_collections, create_bus_bus_switch_collection, create_ext_grid_collection, create_sgen_collection, \ + create_gen_collection, create_load_collection, create_dcline_collection +from pandapower.plotting.generic_geodata import create_generic_coordinates +from pandapipes.component_models.circulation_pump_mass_component import CirculationPumpMass +from pandapipes.component_models.circulation_pump_pressure_component import CirculationPumpPressure +from pandapipes.component_models.pump_component import Pump +from pandapipes.plotting.collections import create_junction_collection, create_pipe_collection, \ + create_valve_collection, create_source_collection, create_pressure_control_collection, \ + create_heat_exchanger_collection, create_sink_collection, create_pump_collection, \ + create_compressor_collection, create_flow_control_collection +from pandapipes.plotting.generic_geodata import create_generic_coordinates +from pandapipes.plotting.plotting_toolbox import get_collection_sizes + +try: + import pandaplan.core.pplog as logging +except ImportError: + import logging + +logger = logging.getLogger(__name__) + +import pandapower.plotting as pp_plot +import pandapipes.plotting as pipes_plot +import matplotlib.pyplot as plt + + +import pandapower.plotting as pp_plot +import pandapipes.plotting as pipes_plot +import matplotlib.pyplot as plt +import sys +from coupled_nets_power_heat import * +def plot_coupled_network_with_highlighted_bus(multinet, highlighted_bus): + fig, ax = plt.subplots() + + # Plot pandapower network + power_network = multinet["nets"]["power"] + pp_plot.simple_plot(power_network, ax=ax) + + # Highlight the specific bus in pandapipes network + heat_network = multinet["nets"]["heat"] + highlighted_bus_color = 'red' # Choose your desired color + pipes_plot.simple_plot(heat_network, ax=ax, bus_color=highlighted_bus_color, highlighted_bus=highlighted_bus) + + plt.show() + +plot_coupled_network_with_highlighted_bus(multinet, highlighted_bus=3) + +def plot_coupled_network(multinet): + fig, ax = plt.subplots() + + # Plot pandapower network + power_network = multinet["nets"]["power"] + pp_plot.simple_plot(power_network, ax=ax) + + # Plot pandapipes network + heat_network = multinet["nets"]["heat"] + pipes_plot.simple_plot(heat_network, ax=ax) + + plt.show() + +# plotting coupled net +plot_coupled_network(multinet) + + + diff --git a/tutorials/multinet_control_power2heat.py b/tutorials/multinet_control_power2heat.py new file mode 100644 index 00000000..bc21fe1c --- /dev/null +++ b/tutorials/multinet_control_power2heat.py @@ -0,0 +1,136 @@ +from pandapower.control import ConstControl +from pandapipes.properties.fluids import get_fluid +from pandapower.control.basic_controller import Controller +from pandas.errors import InvalidIndexError + +import pandapower as ppower +class P2HControlMultiEnergy(Controller): + def __init__(self, multinet, element_index_power, element_index_heat, efficiency, + name_power_net='power', name_heat_net='heat', + in_service=True, order=0, level=0, + drop_same_existing_ctrl=False, initial_run=True, **kwargs): + super().__init__(multinet, in_service, order, level, + drop_same_existing_ctrl=drop_same_existing_ctrl, initial_run=initial_run, + **kwargs) + + self.elm_idx_power = element_index_power + self.elm_idx_heat = element_index_heat + self.name_net_power = name_power_net + self.name_net_heat = name_heat_net + self.efficiency = efficiency + self.qext_w = None + self.fluid = get_fluid(multinet['nets'][name_heat_net]) + self.applied = False + + def initialize_control(self, multinet): + self.applied = False + + def get_all_net_names(self): + return [self.name_net_power, self.name_net_heat] + + def control_step(self, multinet): + ppower.runpp(multinet['nets'][self.name_net_power]) + + try: + power_load = \ + multinet['nets'][self.name_net_power].res_load.at[self.elm_idx_power, 'p_mw'] + except (ValueError, TypeError, InvalidIndexError): + power_load = \ + multinet['nets'][self.name_net_power].res_load.loc[self.elm_idx_power, 'p_mw'].values + self.qext_w = - (power_load * self.conversion_factor_mw_to_w() * self.efficiency) + + self.write_to_net(multinet) + self.applied = True + + def write_to_net(self, multinet): + try: + multinet['nets'][self.name_net_heat].heat_exchanger.at[self.elm_idx_heat, 'qext_w'] \ + = self.qext_w + except (ValueError, TypeError, InvalidIndexError): + multinet['nets'][self.name_net_heat].heat_exchanger.loc[self.elm_idx_heat, + 'qext_w'] = self.qext_w + + def is_converged(self, multinet): + return self.applied + + def conversion_factor_mw_to_w(self): + return 1e6 + + +class H2PControlMultiEnergy(Controller): + def __init__(self, multinet, element_index_power, element_index_heat, efficiency, + name_power_net='power', name_heat_net='heat', element_type_power="sgen", + in_service=True, order=0, + level=0, drop_same_existing_ctrl=False, initial_run=True, + calc_heat_from_power=False, **kwargs): + super().__init__(multinet, in_service, order, level, + drop_same_existing_ctrl=drop_same_existing_ctrl, initial_run=initial_run, + **kwargs) + + self.elm_idx_power = element_index_power + self.elm_idx_heat = element_index_heat + self.elm_type_power = element_type_power + self.name_net_power = name_power_net + self.name_net_heat = name_heat_net + self.efficiency = efficiency + self.qext_w = None + self.fluid = get_fluid(multinet['nets'][name_heat_net]) + self.el_power_led = calc_heat_from_power + self.applied = False + + def initialize_control(self, multinet): + self.applied = False + + def get_all_net_names(self): + return [self.name_net_heat, self.name_net_power] + + def control_step(self, multinet): + if self.el_power_led: + try: + power_gen = multinet['nets'][self.name_net_power][self.elm_type_power].at[ + self.elm_idx_power, 'p_mw'] * multinet['nets'][self.name_net_power][ + self.elm_type_power].at[self.elm_idx_power, 'scaling'] + + except (ValueError, TypeError, InvalidIndexError): + power_gen = multinet['nets'][self.name_net_power][self.elm_type_power].loc[ + self.elm_idx_power, 'p_mw'].values[:] \ + * multinet['nets'][self.name_net_power][self.elm_type_power].loc[ + self.elm_idx_power, 'scaling'].values[:] + + self.heat_cons = power_gen / (self.conversion_factor_w_to_mw() * self.efficiency) + + else: + try: + heat_heat_exchanger = \ + multinet['nets'][self.name_net_heat].heat_exchanger.at[self.elm_idx_heat, 'qext_w'] + + except (ValueError, TypeError, InvalidIndexError): + heat_heat_exchanger = multinet['nets'][self.name_net_heat].heat_exchanger.loc[self.elm_idx_heat, + 'qext_w'].values[:] + + self.power_gen = heat_heat_exchanger * self.conversion_factor_w_to_mw() * self.efficiency + + self.write_to_net(multinet) + self.applied = True + + def write_to_net(self, multinet): + if self.el_power_led: + try: + multinet['nets'][self.name_net_heat].heat_exchanger.at[self.elm_idx_heat, + 'qext_w'] = self.heat_cons + except (ValueError, TypeError, InvalidIndexError): + multinet['nets'][self.name_net_heat].heat_exchanger.loc[self.elm_idx_heat, + 'qext_w'] = self.heat_cons + else: + try: + multinet['nets'][self.name_net_power][self.elm_type_power].at[ + self.elm_idx_power, 'p_mw'] = self.power_gen + except (ValueError, TypeError, InvalidIndexError): + multinet['nets'][self.name_net_power][self.elm_type_power].loc[ + self.elm_idx_power, 'p_mw'] = self.power_gen + + def is_converged(self, multinet): + return self.applied + + def conversion_factor_w_to_mw(self): + return 1 / 1e6