Parameter Studies

1 Introduction

This tutorial shows how to perform parameter studies in a concise and structured way and to generate targeted parameter modifications with minimal code. Compared to the ‘Study Cases’ tutorial, the focus is not on creating study cases, variations and operation scenarios, but rather on the parameter sets.

First, we activate the PowerFactory project, i.e. the IEEE 39 bus system.

# If you use IPython/Jupyter:
import sys

sys.path.append(
    r"C:\Program Files\DIgSILENT\PowerFactory 2025 SP3\Python\3.13"
)  # you may use a different directory

# Get the PF app
import powerfactory
import powfacpy

app = powerfactory.GetApplication()
app.Show()
app.ActivateProject(
    r"powfacpy\39_bus_new_england_copy_where_tests_run"
)  # You may change the project path.
0

We create a copy of the study case that simulates a fault at bus 16 and clear all result variables.

from powfacpy.base.active_project import ActiveProject

act_prj = ActiveProject(app)
act_prj.create_study_case("Parameter Study", r"Study Cases\2.1 Simulation Fault Bus 16 Stable", parent_folder=r"Study Cases\powfacpy")
act_prj.clear_results_variables()

We get all synchronous machines and their types and their rotor speed as monitored result varibales.

from powfacpy.result_variables import ResVar
RMS_BAL = ResVar.RMS_Bal

try:
    app.Hide()
    synchronous_machines = act_prj.get_calc_relevant_obj("ElmSym")
    synchronous_machines.sort(key=lambda x: x.loc_name)
    synchronous_machine_types = [sm.typ_id for sm in synchronous_machines]
    act_prj.add_results_variable(synchronous_machines, RMS_BAL.ElmSym.s_speed.value)
finally:
    app.Show()
synchronous_machines    
[<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 01.ElmSym</l1>>,
 <powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 02.ElmSym</l1>>,
 <powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 03.ElmSym</l1>>,
 <powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 04.ElmSym</l1>>,
 <powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 05.ElmSym</l1>>,
 <powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 06.ElmSym</l1>>,
 <powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 07.ElmSym</l1>>,
 <powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 08.ElmSym</l1>>,
 <powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 09.ElmSym</l1>>,
 <powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 10.ElmSym</l1>>]

2 Definition of Variants

We define the parameter sets to be simulated by instantiating the Variant class. This class provides a concise and structured way to generate targeted parameter modifications with minimal code. Two representative examples are outlined below.


Variant 1: “All SM (H, mult.)”

This variant modifies the inertia constant (tag) of all synchronous machine (SM) types. The original inertia values are scaled multiplicatively by factors ranging from 0.6 to 1.4, distributed over four equidistant steps.

The first plot below illustrates the resulting inertia constants for all SM types across these scaling factors.

Note that, in addition to multiplicative scaling, the Variant class also supports alternative modification schemes, such as additive offsets to the original parameter values.


Variant 2: “All SM (H, grad.)”

The second variant also targets the inertia constants but applies a gradient distribution (var.variation_type = "gradient").

As shown in the second plot below:

  • The inertia of the first generator (Gen 01) is varied from 6 to 10.
  • The inertia of the last generator (Gen 10) is varied from 10 to 6.
  • etc.

This creates a linear gradient across the generator fleet while preserving the overall average inertia of the system (though relative to the nominal power of the generators).

from powfacpy.applications.parameter_studies import Variant

try:
    app.Hide()
    
    variants = []

    var = Variant(app)
    var.name = "All SM (H, mult.)"
    var.objs_and_attr = [synchronous_machine_types, "tag"]
    var.par_range = [0.6, 1.4]
    var.steps = 4
    var.value_calculation = "multiply" # other options are e.g. "add"
    var.initialize()
    variants.append(var)
    
    var = Variant(act_prj.app)
    var.name = "All SM (H, grad.)"
    var.objs_and_attr = [synchronous_machine_types, "tag"]
    var.par_range = [6, 10]
    var.steps = 4
    var.value_calculation = "equal"
    var.variation_type = "gradient"
    var.initialize()
    variants.append(var)

finally:
    app.Show()    
import matplotlib.pyplot as plt

plt.rcParams.update({"axes.grid" : True})
for var in variants:
    plt.figure()
    for sm, h_values in var.values.items():
        plt.plot(h_values, linestyle='--', marker='x', label=sm[0].loc_name)
    plt.xticks(
        ticks=list(range(len(var.names_for_each_value  ))),
        labels=var.names_for_each_value,
    )
    plt.xticks(rotation=90)
    plt.ylabel("Inertia [s]")
    plt.subplots_adjust(bottom=0.3)    
    plt.title(var.name)
    plt.legend()

3 The ParameterStudy Class

The ParameterStudy class offers an interface to several Variants.

from powfacpy.applications.parameter_studies import ParameterStudy
from powfacpy.result_variables import ResVar
RMS_BAL = ResVar.RMS_Bal

try:
    app.Hide()
    parstudy = ParameterStudy()
    parstudy.variants = variants
    parstudy.initialize()
finally:
    app.Show()   

As shown in the plot below, the values of the parameter sets of both variants can be accessed and compared.

for sm, h_values in parstudy.values.items():
    plt.plot(h_values, linestyle='--', marker='x', label=sm[0].loc_name)
simulation_names = parstudy.get_all_names()    
plt.xticks(
    ticks=list(range(len(simulation_names))),
    labels=simulation_names,
)
plt.xticks(rotation=90)
plt.ylabel("Inertia [s]")
plt.subplots_adjust(bottom=0.3)    
plt.legend()    

We can now iterate all parameters sets and perform any kind of simulation or calculation. The values for each step are automatically set in PowerFactory.

try:
    app.Hide()
    for values, sim_name in parstudy.step_generator():
        print(sim_name)
        print(values)
        # perform any kind of calculation
    parstudy.set_default_values()     
finally:
    app.Show()
All SM (H, mult.)=0.600
{(<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 01.TypSym</l1>>, 'tag'): np.float64(6.0), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 02.TypSym</l1>>, 'tag'): np.float64(5.7333332061767575), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 03.TypSym</l1>>, 'tag'): np.float64(5.466666412353516), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 04.TypSym</l1>>, 'tag'): np.float64(5.200000190734863), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 05.TypSym</l1>>, 'tag'): np.float64(4.933333396911621), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 06.TypSym</l1>>, 'tag'): np.float64(4.6666666030883786), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 07.TypSym</l1>>, 'tag'): np.float64(4.400000095367432), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 08.TypSym</l1>>, 'tag'): np.float64(4.133333301544189), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 09.TypSym</l1>>, 'tag'): np.float64(3.866666793823242), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 10.TypSym</l1>>, 'tag'): np.float64(3.5999999999999996)}
All SM (H, mult.)=0.867
{(<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 01.TypSym</l1>>, 'tag'): np.float64(8.666666666666668), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 02.TypSym</l1>>, 'tag'): np.float64(8.281481297810872), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 03.TypSym</l1>>, 'tag'): np.float64(7.8962959289550785), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 04.TypSym</l1>>, 'tag'): np.float64(7.511111386617025), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 05.TypSym</l1>>, 'tag'): np.float64(7.1259260177612305), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 06.TypSym</l1>>, 'tag'): np.float64(6.740740648905437), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 07.TypSym</l1>>, 'tag'): np.float64(6.355555693308513), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 08.TypSym</l1>>, 'tag'): np.float64(5.970370324452718), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 09.TypSym</l1>>, 'tag'): np.float64(5.585185368855795), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 10.TypSym</l1>>, 'tag'): np.float64(5.2)}
All SM (H, mult.)=1.13
{(<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 01.TypSym</l1>>, 'tag'): np.float64(11.333333333333332), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 02.TypSym</l1>>, 'tag'): np.float64(10.829629389444987), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 03.TypSym</l1>>, 'tag'): np.float64(10.32592544555664), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 04.TypSym</l1>>, 'tag'): np.float64(9.822222582499187), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 05.TypSym</l1>>, 'tag'): np.float64(9.31851863861084), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 06.TypSym</l1>>, 'tag'): np.float64(8.814814694722493), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 07.TypSym</l1>>, 'tag'): np.float64(8.311111291249594), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 08.TypSym</l1>>, 'tag'): np.float64(7.807407347361247), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 09.TypSym</l1>>, 'tag'): np.float64(7.303703943888346), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 10.TypSym</l1>>, 'tag'): np.float64(6.8)}
All SM (H, mult.)=1.40
{(<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 01.TypSym</l1>>, 'tag'): np.float64(14.0), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 02.TypSym</l1>>, 'tag'): np.float64(13.3777774810791), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 03.TypSym</l1>>, 'tag'): np.float64(12.755554962158202), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 04.TypSym</l1>>, 'tag'): np.float64(12.133333778381347), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 05.TypSym</l1>>, 'tag'): np.float64(11.51111125946045), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 06.TypSym</l1>>, 'tag'): np.float64(10.88888874053955), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 07.TypSym</l1>>, 'tag'): np.float64(10.266666889190674), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 08.TypSym</l1>>, 'tag'): np.float64(9.644444370269774), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 09.TypSym</l1>>, 'tag'): np.float64(9.022222518920898), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 10.TypSym</l1>>, 'tag'): np.float64(8.399999999999999)}
All SM (H, grad.)=6.00
{(<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 01.TypSym</l1>>, 'tag'): np.float64(6.0), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 02.TypSym</l1>>, 'tag'): np.float64(6.444444444444445), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 03.TypSym</l1>>, 'tag'): np.float64(6.888888888888889), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 04.TypSym</l1>>, 'tag'): np.float64(7.333333333333333), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 05.TypSym</l1>>, 'tag'): np.float64(7.777777777777778), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 06.TypSym</l1>>, 'tag'): np.float64(8.222222222222221), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 07.TypSym</l1>>, 'tag'): np.float64(8.666666666666666), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 08.TypSym</l1>>, 'tag'): np.float64(9.11111111111111), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 09.TypSym</l1>>, 'tag'): np.float64(9.555555555555555), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 10.TypSym</l1>>, 'tag'): np.float64(10.0)}
All SM (H, grad.)=7.33
{(<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 01.TypSym</l1>>, 'tag'): np.float64(7.333333333333333), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 02.TypSym</l1>>, 'tag'): np.float64(7.481481481481482), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 03.TypSym</l1>>, 'tag'): np.float64(7.62962962962963), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 04.TypSym</l1>>, 'tag'): np.float64(7.777777777777778), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 05.TypSym</l1>>, 'tag'): np.float64(7.925925925925926), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 06.TypSym</l1>>, 'tag'): np.float64(8.074074074074073), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 07.TypSym</l1>>, 'tag'): np.float64(8.222222222222221), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 08.TypSym</l1>>, 'tag'): np.float64(8.37037037037037), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 09.TypSym</l1>>, 'tag'): np.float64(8.518518518518519), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 10.TypSym</l1>>, 'tag'): np.float64(8.666666666666666)}
All SM (H, grad.)=8.67
{(<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 01.TypSym</l1>>, 'tag'): np.float64(8.666666666666666), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 02.TypSym</l1>>, 'tag'): np.float64(8.518518518518519), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 03.TypSym</l1>>, 'tag'): np.float64(8.37037037037037), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 04.TypSym</l1>>, 'tag'): np.float64(8.222222222222221), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 05.TypSym</l1>>, 'tag'): np.float64(8.074074074074073), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 06.TypSym</l1>>, 'tag'): np.float64(7.925925925925926), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 07.TypSym</l1>>, 'tag'): np.float64(7.777777777777778), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 08.TypSym</l1>>, 'tag'): np.float64(7.62962962962963), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 09.TypSym</l1>>, 'tag'): np.float64(7.481481481481481), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 10.TypSym</l1>>, 'tag'): np.float64(7.333333333333334)}
All SM (H, grad.)=10.0
{(<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 01.TypSym</l1>>, 'tag'): np.float64(10.0), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 02.TypSym</l1>>, 'tag'): np.float64(9.555555555555555), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 03.TypSym</l1>>, 'tag'): np.float64(9.11111111111111), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 04.TypSym</l1>>, 'tag'): np.float64(8.666666666666666), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 05.TypSym</l1>>, 'tag'): np.float64(8.222222222222221), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 06.TypSym</l1>>, 'tag'): np.float64(7.777777777777778), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 07.TypSym</l1>>, 'tag'): np.float64(7.333333333333333), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 08.TypSym</l1>>, 'tag'): np.float64(6.888888888888889), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 09.TypSym</l1>>, 'tag'): np.float64(6.444444444444445), (<powerfactory.DataObject <l1>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Library.IntPrjfolder\Equipment Type Library.IntPrjfolder\Generator Types.IntPrjfolder\Type Gen 10.TypSym</l1>>, 'tag'): np.float64(6.0)}

You can also set the parameters for a specific simulation by specifiying the name of the variant and the step:

parstudy.set_values_in_pf("All SM (H, grad.)", 3)

For dynamic (RMS or EMT) simulations, a dedicated utility function is available that automatically executes the simulation for all defined parameter sets and returns the corresponding time-domain results.

try:
    app.Hide()
    sim_res_time_domain = parstudy.execute_dynamic_simulations()
    
finally:
    app.Show()

We can access the results using the simulation name.

sim_res_time_domain.keys() # simulation names
dict_keys(['All SM (H, mult.)=0.600', 'All SM (H, mult.)=0.867', 'All SM (H, mult.)=1.13', 'All SM (H, mult.)=1.40', 'All SM (H, grad.)=6.00', 'All SM (H, grad.)=7.33', 'All SM (H, grad.)=8.67', 'All SM (H, grad.)=10.0'])
sim_res_time_domain['All SM (H, mult.)=0.600']
<l3>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 01.ElmSym</l3> <l3>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 02.ElmSym</l3> <l3>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 03.ElmSym</l3> <l3>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 04.ElmSym</l3> <l3>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 05.ElmSym</l3> <l3>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 06.ElmSym</l3> <l3>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 07.ElmSym</l3> <l3>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 08.ElmSym</l3> <l3>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 09.ElmSym</l3> <l3>\seberlein.IntUser\powfacpy\39_bus_new_england_copy_where_tests_run.IntPrj\Network Model.IntPrjfolder\Network Data.IntPrjfolder\Grid.ElmNet\G 10.ElmSym</l3>
s:speed s:speed s:speed s:speed s:speed s:speed s:speed s:speed s:speed s:speed
time
-0.100000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
-0.090000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
-0.080000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
-0.070000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
-0.060000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
... ... ... ... ... ... ... ... ... ... ...
0.461667 1.032267 1.032367 1.029011 1.020319 1.017666 1.010297 1.010424 1.032762 1.025537 1.032713
0.471667 1.033014 1.032917 1.029458 1.019778 1.017504 1.010124 1.009711 1.032994 1.025739 1.032103
0.481667 1.033752 1.033416 1.029869 1.019239 1.017365 1.010067 1.009107 1.033133 1.025922 1.031430
0.491667 1.034480 1.033859 1.030240 1.018708 1.017253 1.010132 1.008631 1.033176 1.026082 1.030705
0.500000 1.035077 1.034177 1.030511 1.018280 1.017182 1.010291 1.008354 1.033129 1.026195 1.030065

64 rows × 10 columns

4 Analysis of Simulation Results

We now want to find out the maximum rotor speed of any generator in each simulation.

from powfacpy.applications.results import Results

try:
    app.Hide()
    pfres = Results(app)
    pfres.pf_objects_in_labels = True
    max_frequency = {}
    for sim_name, sim_res in sim_res_time_domain.items():
        max_frequency[sim_name] = pfres.get_simulation_results_from_dataframe(sim_res, synchronous_machines, RMS_BAL.ElmSym.s_speed.value).max(0).max()
finally:
    app.Show()
max_frequency    
{'All SM (H, mult.)=0.600': np.float64(1.0350770765172106),
 'All SM (H, mult.)=0.867': np.float64(1.025149141688988),
 'All SM (H, mult.)=1.13': np.float64(1.0198041047687196),
 'All SM (H, mult.)=1.40': np.float64(1.0162908116530092),
 'All SM (H, grad.)=6.00': np.float64(1.0283309060062829),
 'All SM (H, grad.)=7.33': np.float64(1.0260559852115951),
 'All SM (H, grad.)=8.67': np.float64(1.024244208550774),
 'All SM (H, grad.)=10.0': np.float64(1.0221382805092931)}

The result is illustrated in the plot below. The mutiplication has a stronger influence than the gradient distribution.

plt.plot(max_frequency.values(), linestyle='--', marker='o')
plt.xticks(
    ticks=list(range(len(max_frequency.keys()))),
    labels=max_frequency.keys(),
)
plt.xticks(rotation=90)
plt.ylabel("Maximum frequency [pu]")
plt.subplots_adjust(bottom=0.3)

Back to top