def test_const_pq_gen_trafo_tap(simple_test_net):
    # allows to use recycle = {"bus_pq", "gen", "trafo"}
    net = simple_test_net
    profiles, _ = create_data_source(n_timesteps)
    profiles['ext_grid'] = np.ones(n_timesteps) + np.arange(0,
                                                            n_timesteps) * 1e-2
    ds = DFData(profiles)
    # 1load
    c1 = add_const(net, ds, recycle=None)
    c2 = add_const(net,
                   ds,
                   recycle=None,
                   profile_name="ext_grid",
                   variable="vm_pu",
                   element_index=0,
                   element="ext_grid")
    c3 = ContinuousTapControl(net, 0, 1.01, tol=1e-9)

    vm_pu, ll = _run_recycle(net)
    del c1, c2, c3

    # calculate the same results without recycle
    c = add_const(net, ds, recycle=False)
    c2 = add_const(net,
                   ds,
                   recycle=False,
                   profile_name="ext_grid",
                   variable="vm_pu",
                   element_index=0,
                   element="ext_grid")
    c3 = ContinuousTapControl(net, 0, 1.01, recycle=False, tol=1e-9)
    ow = _run_normal(net)
    assert np.allclose(vm_pu, ow.output["res_bus.vm_pu"])
    assert np.allclose(ll, ow.output["res_line.loading_percent"])
def test_const_gen(simple_test_net):
    # allows to use recycle = {"gen"} and fast output read
    net = simple_test_net
    pp.create_gen(net, 1, p_mw=2.)
    profiles, _ = create_data_source(n_timesteps)
    profiles['gen'] = np.random.random(n_timesteps) * 2e1
    ds = DFData(profiles)
    # 1load
    c1 = add_const(net, ds, recycle=None)
    c2 = add_const(net,
                   ds,
                   recycle=None,
                   profile_name="gen",
                   element_index=0,
                   element="gen")

    vm_pu, ll = _run_recycle(net)
    del c1, c2

    # calculate the same results without recycle
    c = add_const(net, ds, recycle=False)
    c2 = add_const(net,
                   ds,
                   recycle=None,
                   profile_name="gen",
                   element_index=0,
                   element="gen")
    ow = _run_normal(net)
    assert np.allclose(vm_pu, ow.output["res_bus.vm_pu"])
    assert np.allclose(ll, ow.output["res_line.loading_percent"])
def test_const_ext_grid(simple_test_net):
    # allows to use recycle = {"gen"} and fast output read
    net = simple_test_net
    profiles, _ = create_data_source(n_timesteps)
    profiles['ext_grid'] = np.ones(n_timesteps) + np.arange(0,
                                                            n_timesteps) * 1e-2

    ds = DFData(profiles)
    # 1load
    c1 = add_const(net, ds, recycle=None)
    c2 = add_const(net,
                   ds,
                   recycle=None,
                   profile_name="ext_grid",
                   variable="vm_pu",
                   element_index=0,
                   element="ext_grid")

    vm_pu, ll = _run_recycle(net)
    del c1, c2

    # calculate the same results without recycle
    c = add_const(net, ds, recycle=False)
    c2 = add_const(net,
                   ds,
                   recycle=False,
                   profile_name="ext_grid",
                   variable="vm_pu",
                   element_index=0,
                   element="ext_grid")
    ow = _run_normal(net)
    assert np.allclose(vm_pu, ow.output["res_bus.vm_pu"])
    assert np.allclose(ll, ow.output["res_line.loading_percent"])
    assert np.allclose(ow.output["res_bus.vm_pu"].values[:, 0],
                       profiles["ext_grid"])
    assert np.allclose(vm_pu.values[:, 0], profiles["ext_grid"])
Ejemplo n.º 4
0
# net.sgen["controllable"] = False

net["load"].loc[:, "type"] = "residential"
net.sgen.loc[:, "type"] = "pv"
net.sgen.loc[8, "type"] = "wind"

input_file = r"C:\Users\x230\.julia\dev\PandaModels\test\pycodes\cigre_timeseries_15min.json"
time_series = pd.read_json(input_file)


time_series.sort_index(inplace=True)

load_df = pd.DataFrame(time_series["residential"]).dot([net["load"]["p_mw"].values])

ConstControl(net, "load", "p_mw", element_index=net.load.index[net.load.type == "residential"],
             profile_name=net.load.index[net.load.type == "residential"], data_source=DFData(load_df))

pv_df = pd.DataFrame(time_series["pv"]).dot([net["sgen"].loc[:7, "p_mw"].values])

ConstControl(net, "sgen", "p_mw", element_index=net.sgen.index[net.sgen.type == "pv"],
             profile_name=net.sgen.index[net.sgen.type == "pv"], data_source=DFData(pv_df))

wind_df = pd.DataFrame(time_series["wind"]).dot([net["sgen"].loc[8, "p_mw"]])

ConstControl(net, "sgen", "p_mw", element_index=net.sgen.index[net.sgen.type == "wind"],
             profile_name=net.sgen.index[net.sgen.type == "wind"], data_source=DFData(time_series["wind"]))


storage_results = pp.runpm_storage_opf(net, n_timesteps=96, time_elapsed=0.25)

# time_series.sort_values(by="timestep", inplace=True)
import pandapower.control as control
import pandapower.networks as nw
import pandapower.timeseries as timeseries
from pandapower.timeseries.data_sources.frame_data import DFData

# load a pandapower network
net = nw.mv_oberrhein(scenario='generation')
# number of time steps
n_ts = 95
# load your timeseries from a file (here csv file)
# df = pd.read_csv("sgen_timeseries.csv")
# or create a DataFrame with some random time series as an example
df = pd.DataFrame(np.random.normal(1., 0.1, size=(n_ts, len(net.sgen.index))),
                  index=list(range(n_ts)), columns=net.sgen.index) * net.sgen.p_mw.values
# create the data source from it
ds = DFData(df)

# initialising ConstControl controller to update values of the regenerative generators ("sgen" elements)
# the element_index specifies which elements to update (here all sgens in the net since net.sgen.index is passed)
# the controlled variable is "p_mw"
# the profile_name are the columns in the csv file (here this is also equal to the sgen indices 0-N )
const_sgen = control.ConstControl(net, element='sgen', element_index=net.sgen.index,
                                  variable='p_mw', data_source=ds, profile_name=net.sgen.index)

# do the same for loads
# df = pd.read_csv("load_timeseries.csv")
# create a DataFrame with some random time series as an example
df = pd.DataFrame(np.random.normal(1., 0.1, size=(n_ts, len(net.load.index))),
                  index=list(range(n_ts)), columns=net.load.index) * net.load.p_mw.values
ds = DFData(df)
const_load = control.ConstControl(net, element='load', element_index=net.load.index,
Ejemplo n.º 6
0
def test_time_series_p2g_control(get_gas_example, get_power_example_simple):
    net_gas = get_gas_example
    net_power = get_power_example_simple

    pandapipes.create_source(net_gas, 5, 0.003)
    pandapipes.create_sink(net_gas, 3, 0.003)
    pandapipes.create_sink(net_gas, 4, 0.003)

    pandapower.create_load(net_power, 6, 0.004)
    pandapower.create_load(net_power, 5, 0.004)
    pandapower.create_sgen(net_power, 4, 0.004)

    mn = create_empty_multinet('coupled net')

    add_nets_to_multinet(mn, power=net_power, gas=net_gas)

    data_p2g_power = pd.DataFrame(np.concatenate(
        [np.array([1.0] * 5),
         np.array([0.75] * 2),
         np.array([1.0] * 3)]),
                                  columns=['load_p2g_power'])
    data_const_load = pd.DataFrame(np.concatenate(
        [np.array([1.2] * 5),
         np.array([1.75] * 2),
         np.array([1.2] * 3)]),
                                   columns=['load_const'])
    data_const_sgen = pd.DataFrame(np.concatenate(
        [np.array([0.8] * 5),
         np.array([0.9] * 2),
         np.array([0.8] * 3)]),
                                   columns=['sgen_const'])
    data_const_sink = np.zeros([10, 2])
    data_const_sink[:5, :] = [0.6, 0.4]
    data_const_sink[5:7, :] = [1.2, 0.3]
    data_const_sink[7:, :] = [0.6, 0.4]
    data_const_sink = pd.DataFrame(data_const_sink,
                                   columns=['sink_const_0', 'sink_const_1'])

    ds = DFData(data_p2g_power)
    _, p2g = coupled_p2g_const_control(mn,
                                       0,
                                       0,
                                       0.6,
                                       initial_run=True,
                                       profile_name='load_p2g_power',
                                       data_source=ds)
    ds = DFData(data_const_sink)
    ConstControl(net_gas,
                 'sink',
                 'mdot_kg_per_s', [0, 1],
                 profile_name=['sink_const_0', 'sink_const_1'],
                 data_source=ds)
    ds = DFData(data_const_load)
    ConstControl(net_power,
                 'load',
                 'p_mw',
                 1,
                 profile_name=['load_const'],
                 data_source=ds)
    ds = DFData(data_const_sgen)
    ConstControl(net_power,
                 'sgen',
                 'p_mw',
                 0,
                 profile_name=['sgen_const'],
                 data_source=ds)

    log_variables = [('res_source', 'mdot_kg_per_s'),
                     ('res_sink', 'mdot_kg_per_s')]

    ow_gas = OutputWriter(net_gas, range(10), log_variables=log_variables)

    log_variables = [('res_load', 'p_mw'), ('res_sgen', 'p_mw')]

    ow_power = OutputWriter(net_power, range(10), log_variables=log_variables)
    run_timeseries(mn, range(10))

    gas_res = ow_gas.np_results
    power_res = ow_power.np_results
    assert np.all(gas_res['res_sink.mdot_kg_per_s'] == data_const_sink.values)
    assert np.all(gas_res['res_source.mdot_kg_per_s'] == data_p2g_power.values * \
                  p2g.conversion_factor_mw_to_kgps() * p2g.efficiency)
    assert np.all(power_res['res_load.p_mw'][:, 1] == data_const_load.values.T)
    assert np.all(power_res['res_sgen.p_mw'] == data_const_sgen.values)