Next Article in Journal
Alternative Analyzers for the Measurement of Gaseous Compounds During Type-Approval of Heavy-Duty Vehicles
Previous Article in Journal
Impact of Power Quality on the Efficiency of the Mining Process
 
 
Font Type:
Arial Georgia Verdana
Font Size:
Aa Aa Aa
Line Spacing:
Column Width:
Background:
Article

An Open-Source Julia Package for RMS Time-Domain Simulations of Power Systems

by
Thomas Philpott
1,2,*,
Ashish P. Agalgaonkar
1,*,
Thomas Brinsmead
2 and
Kashem M. Muttaqi
1
1
School of Electrical, Computer and Telecommunications Engineering, University of Wollongong, Wollongong, NSW 2522, Australia
2
Commonwealth Scientific and Industrial Research Organisation (CSIRO), Mayfield West, NSW 2304, Australia
*
Authors to whom correspondence should be addressed.
Energies 2024, 17(22), 5677; https://doi.org/10.3390/en17225677
Submission received: 25 September 2024 / Revised: 7 November 2024 / Accepted: 11 November 2024 / Published: 13 November 2024
(This article belongs to the Section F1: Electrical Power System)

Abstract

:
This paper presents RMSPowerSims.jl, an open-source Julia package for the time-domain simulation of power systems. The package is designed to be used in conjunction with PowerModels.jl, a widely used Julia package for power system optimization. RMSPowerSims.jl provides a framework for the simulation of power systems in the time domain, allowing for the study of transient stability, frequency stability, and other dynamic phenomena. The package is designed to be intuitive and flexible, allowing users to easily define custom models for network components and disturbances, while also providing a range of pre-constructed models for common power system components. RMSPowerSims.jl simplifies the process of performing RMS simulations on power system models developed using the PowerModels.jl ecosystem, and provides an easy-to-use modeling that reduces the barrier to entry for new users wishing to perform RMS simulations. The accuracy of the package is verified against DIgSILENT PowerFactory for short-circuit and load-increase disturbances, using the New England 39-bus system. The active power generation delivered by several generators in the network, and the voltage magnitudes of selected busbars are analyzed and noted to be in close agreement with those obtained using PowerFactory. The computational performance of the package is compared to that of PowerFactory and is found to be comparable for load-step simulations; however, PowerFactory is found to be considerably faster for short-circuit simulations. As computational performance is not a priority at this stage of development, this is expected, and speed optimization is planned for future work. RMSPowerSims.jl is available under an open-source license and can be downloaded from GitHub.

1. Introduction

Power grids across the globe are presently undergoing a transition away from fossil-fueled electricity generation towards renewable energy generation (REG). The variable nature of REG, the decentralization of generation, and the introduction of large numbers of inverter-based generators (IBGs) in the form of solar photovoltaic and wind generation mark significant differences from the traditional synchronous generator-dominated power systems [1]. As a result, the development of new tools for power system analysis, operation, and planning is critical to maintain reliable and stable operation in modern power systems. For example, electromechanical root mean square (RMS) simulations, which have historically been used to analyze the dynamic behavior of the power grid, are unable to capture some of the fast dynamics of IBGs. As a result, the need for electromagnetic transient (EMT) simulations, which operate with much smaller time steps, and associated grid models has become more prevalent [1]. This being said, RMS simulations remain applicable in some areas of power system stability analysis due to the computational expense of EMT simulations [2]. This is most prevalent in studies relating to frequency and angular stability, where the reduction in grid inertia resulting from an absence of synchronism is significant. Regarding scheduling and the dispatching of generation, new optimal power flow (OPF) formulations are needed that can account for the stochastic nature of renewable generation, and the growing impact of distributed energy resources [3,4].
Commercial software packages, such as DIgSILENT PowerFactory [5] and PSS/E [6], are commonly used throughout industry for the steady-state and dynamic analysis of power systems, and PSCAD/EMTDC [7] is commonly used for EMT simulation [8]. Open-source software tools are, however, becoming increasingly popular amongst academics and researchers due to their ability to be modified and extended to suit the needs of the user, and the lack of prohibitively expensive licensing fees. In recent years, the Julia programming language has seen a range of power system-related tools developed [9,10,11,12,13]. The reasoning for the selection of Julia for these developments is due to its high performance, comparable to that of low-level programming languages such as C and C++, while maintaining a high-level syntax that is easy for a user to understand. As a result, a suite of state-of-the-art solvers for differential equations, optimization, and linear algebra are available in Julia, making it an ideal language for developing power system analysis tools.
The collection of packages developed by the National Renewable Energy Laboratory (NREL) provides a modeling architecture for modern power grids [9], including a quasi-static simulation package as in [10] and dynamic simulation package suitable for both electromechanical and electromagnetic transient simulation as in [11]. The complexity of this ecosystem does, however, result in a steep learning curve for new users, especially those with little prior programming experience. PowerDynamics.jl provides an alternative option for users who wish to perform dynamic simulations of power systems; however, the implementation of the package models the generators, loads, and inverters as nodes in a graph rather than as components connected to a node. This is a departure from the traditional power system modeling approach as is used in DIgSILENT PowerFactory [5] and PSS/E [6]. The approach is suitable for some research applications and has been shown to be highly performative [12] but is restrictive, in that it requires bespoke models if multiple components are connected to a single node. Additionally, for initialization purposes, it is practical to define a node as a slack bus; however, doing so requires that the dynamics of the generator at that slack bus must be omitted from a given model, which is unrealistic and not always acceptable.
The PowerModels.jl package provides a power system modeling framework, with the aim of facilitating the easy comparison of OPF formulations and is the only Julia package known to the authors capable of solving AC OPF problems. Substantial work has been performed in implementing large, synthetic models of Australia’s National Electricity Market in the PowerModels.jl format, and it would be beneficial to be able to build on these models for dynamic simulation; however, this functionality is not supported by PowerModels.jl [14,15]. It is possible to convert from the PowerModels.jl network data dictionary (NDD) format to a format which can be used with software, either commercial or open-source, that is capable of dynamic simulation. In particular, the ability to import and export steady-state network models in the MATPOWER case file format [16] is commonly supported by open-source power system simulation packages. However, in the experience of the authors, the process of implementing a power system in multiple software programs is time consuming, requires verification to ensure that the models are equivalent, requires maintaining two separate representations of the same system, and often requires an in-depth knowledge of both the source and destination program/format. It is, therefore, preferable to build on an existing model rather than reconstructing it in a different format. For this reason, this paper presents the development of a Julia-based simulation package, known as RMSPowerSims.jl, that is capable of performing dynamic simulations using the existing PowerModels.jl model package from Julia.
In consideration during the development of RMSPowerSims.jl is the fact that the scope of the energy transition requires a new generation of power system engineers to be trained in the use of power system analysis tools, and to be capable of addressing the research gaps. Currently, there is a gap in the freely available open-source tools for power system education when it comes to dynamic simulation. MATPOWER is commonly utilized in tertiary education programs for steady-state analysis and power flow studies but does not provide a toolbox with dynamic simulation capabilities. PowerSimulationsDynamics [11] provides a flexible and performative dynamic simulation package; however, the level of programming experience required to use the package is high and, as a result, is not ideal for less experienced users. For this reason, RMSPowerSims.jl aims to provide an easy-to-use interface, intuitive for power system simulation, without making compromises to performance or accuracy.
The advantages of RMSPowerSims.jl are as follows:
  • Simplification of the process of performing RMS simulations on power system models developed using the PowerModels.jl ecosystem;
  • A flexible modeling framework that allows for the inclusion of a wide range of power system components and disturbances;
  • Pre-constructed models of common power system components, such as synchronous generators, loads, and common generator control systems, that can be used to build models of power systems;
  • A simple, easy-to-understand programming interface that is suitable for power system education.
The remainder of this paper is organized as follows: Section 2 discusses the overall structure of the new RMSPowerSims.jl package, Section 3 examines the process of running a simulation and provides a detailed overview implementation of the package, Section 4 presents a verification process of the package using the 39 Bus New England System and examines the computational performance of the package [17] and DIgSILENTs PowerFactory, and Section 5 provides conclusions and outlines future work.

2. RMSPowerSims.jl

This section provides details relating to the modeling structures of RMSPowerSims. The high-level control flow, and the data structures used to define the network model are discussed in Section 2.1. The hierarchical software object type structure used to define individual power system components is discussed in Section 2.2. Details of some specific component models that have been implemented are provided in Section 2.3, and the disturbance simulation is discussed in Section 2.4. An overview of the package functionality is provided in Section 2.5. The package documentation [18] provides specific details relating to the data model; the parameter definitions and underlying equations for the component models; disturbance implementation; function definitions; and the simulation process.
It is important to note that RMSPowerSims.jl is built on top of a number of other Julia packages. The most significant dependencies, within the context of this paper, are PowerModels.jl [13], which provides the basis for the data structure used to model the system and is used for steady-state analysis, and DifferentialEquations.jl [19], which is used to solve the differential equations that characterize the system dynamics. Additionally, the default solver used by the package is the IDA solver [20] from the Sundials suite [21]; however, users are free to choose a different, suitable solver if desired. The full list of dependencies and their functions within the package is shown in Appendix B.

2.1. High-Level Package Structure

To provide an overview of the intended use of the package, the procedure of preparing a model and running a simulation is shown in Figure 1.
The primary data structure used for storing network data is an extension of the PowerModels.jl NDD format [13]. The NDD is an augmented version of the MATPOWER case file format [16], with the significant difference being the addition of dedicated fields for loads and shunt components. Any existing, valid, Julia-based PowerModels.jl model must contain all the necessary information for steady-state analysis. For time-domain simulation, additional parameters and modeling details are required that specify the dynamical behavior of the components of the network. RMSPowerSims.jl is configured in such a way that RMSPowerSims.jl NDD is an extension of the PowerModels.jl NDD.
The Julia package DifferentialEquations.jl [19] is used to formulate the differential-algebraic equation (DAE) problem that characterizes the power-system dynamics. Passing the entire PowerModels.jl NDD to the differential equation solver would be inefficient, as only a subset of the data contained in the dictionary is required to define the dynamic model of the system. Accordingly, a bespoke data structure is defined that contains only the data required for the time-domain simulation, referred to as a PowerSystemSimulation object. At this point, it is worth briefly outlining how a differential-algebraic equation problem is formulated in DifferentialEquations.jl, as a cursory understanding is necessary to explain the structure of the PowerSystemSimulation object and its components. A general DAE problem passed to the DifferentialEquations.jl package can be expressed as a function in the form
o u t = D A E _ f u n c t i o n ( u , d u , p , t )
where u is a state vector containing the state and algebraic variables of the system, d u is a vector containing the derivatives of the state variables, p is an object containing the non-time-varying parameters of the system, t is the time, and  o u t is a vector containing the residuals of the differential and algebraic equations. The body of code in the D A E _ f u n c t i o n is where the equations that define an arbitrary dynamical system are implemented. Since a power system is an example of a DAE-type system, it is possible to directly implement the equations that define the system in this form. However, due to the size and complexity of modern power systems, it is more practical to define the equations in a modular form, with each component of the system representing a functional module that has its own parameters and equations. These function modules can then all be called from a single main function that assembles the equations of the entire system. Algorithm 1 shows a pseudo-code representation of how this process is implemented in RMSPowerSims.jl, where u , d u , and o u t are the subsets of the u, d u , and o u t vectors that are necessary for the implementation of the component model, and  m o d e l is a custom typed object that contains the parameters of the component model. This custom typing is important, as it allows for the use of Julia’s type-based multiple dispatch capabilities. Multiple dispatch in Julia allows for the definition of multiple methods for a given function, with the method that is called being determined by the types of the arguments passed to the function [22]. In the context of RMSPowerSims.jl, this allows the solver to identify which moduar D A E _ f u n c t i o n should be applied, depending on the type of the m o d e l parameter. This type is defined within a hierarchical typing structure, with the supertype defined as ComponentModel. The type hierarchy and the existing sub-types defined are discussed further in Section 2.2.
Algorithm 1 Power system equations.
  • function power_system_equations!( o u t , d u , u, p, t)
  • for each c o m p o n e n t _ m o d e l in p o w e r _ s y s t e m _ m o d e l  do
  •    o u t = DAE_Function( d u , u , m o d e l , t)
  • end for
  • end function
With an understanding of how the equations of the system are implemented in the RMSPowerSims.jl package, it is now possible to discuss the structure of the PowerSystemSimulation object passed to the solver, and its components. A dictionary tree representation of the PowerSystemSimulation object is shown in Listing 1. For brevity, the diagram does not show the full structure, only those parts which are necessary for the explanation of the structure. The actual implementation can be found in the package documentation [18].
As can be seen in Listing 1, the PowerSystemSimulation object has a tiered structure and contains several other custom data objects. The top level of the structure contains a PowerSystemModel object, the initial conditions of the simulation, and a list of any disturbances that occur during the simulation. Disturbance handling and calculation of the initial conditions are discussed in Section 2.4 and Section 3, respectively. The design philosophy is that the PowerSystemModel object is intended to contain all of the data required to define the dynamic model of the system, independent of any state of the system. In contrast, the PowerSystemSimulation object contains only those details related to a given simulation and corresponds to a specific state and trajectory of the system. The PowerSystemModel object is defined with two distinct lists. The variable list contains the uniquely defined names of all state and algebraic variables used to define the model, including the names of any derivative quantities required to implement the component models. The component list contains the ComponentModel objects and the pointers to the variables required for the simulation of each component. There is a one-to-many relation between the component list and the variable list.
Listing 1. Simulated dirtree within listing.
1PowerSystemSimulation
2|--PowerSystemModel
3||--Component List
4|||--ComponentModel 1 & Pointers
5|||--ComponentModel 2 & Pointers
6|||--...
7||‘--ComponentModel n & Pointers
8|‘--List of State & Algebraic Variables
9|--Initial Conditions
10‘--Disturbances
11|--Disturbance 1
12|--Disturbance 2
13|--...
14‘--Disturbance n

2.2. Component Models and Typing

A hierarchical typing system is used to classify, and differentiate among, the various components of the model. The models for each component sit at the bottom of this hierarchy, and are implemented as what is referred to in the Julia programming language as a concrete type, i.e., a type that can be instantiated. It is this lowest level of the hierarchy that is used to identify the correct method of a given RMSPowerSims.jl function to apply to a given component, using Julia’s multiple dispatch.
During the process of solving the differential equations, a system is fully defined by instances of concrete-typed component models and their corresponding DAE_functions. That is to say that all components in the system are treated in the same manner by the solver, and the hierarchical type structure of the PowerSystemModel is irrelevant. The need for supertypes arises when configuring the ystemSimulation object and calculating the initial conditions. The hierarchy of supertypes defined in the package is shown in Figure 2. As can be seen in Figure 2, all component models are sub-typed from the ComponentModel type. The next level of sub-types classifies components as either a generator, controller, node, or load model. Conveniently, this classification aligns with the definitions already used in the PowerModels.jl NDD, with the exception of controller models, which are not included in PowerModels.jl. The reasoning for this classification, however, arises from the structure of the network equations. The power balance form of the network equations for bus i are expressed as
0 = j G i P g j l L i P d l k B i | V i | | V k | | Y i k | cos ( θ i θ k α i k )
0 = j G i Q g j l L i Q d l k B i | V i | | V k | | Y i k | sin ( θ i θ k α i k )
where we have the following:
  • i is the index of the bus for which the power balance is being calculated;
  • j is the index for generators connected to bus i;
  • l is the index for loads connected to bus i;
  • k is the index for summation over all buses in the network;
  • G i is the set of generators connected to bus i;
  • L i is the set of loads connected to bus i;
  • B i is the set of buses in the network with branches connecting to bus i;
  • V i , V k are the voltage magnitudes at buses i and k, respectively;
  • θ i , θ k are the voltage phase angles at buses i and k, respectively;
  • P g j , Q g j are the real and reactive power injections of generator j;
  • P d l , Q d l are the real and reactive power demands of load l;
  • Y i k is the magnitude of the admittance between buses i and k;
  • α i k is the phase angle of the admittance between buses i and k.
The interpretation of these equations is that the dynamics of the generators and loads in the system are coupled through the power injection terms in the network equations. The definition of the generator and load supertypes is motivated by the need to ensure that the power injection terms P g j , Q g j , P d l , and Q d l are defined; otherwise, this coupling would not be possible. As such, it is enforced by the RMSPowerSims.jl package that all generators must include variables P g j and Q g j , all loads must include variables P d l and Q d l , and that all power injection variables must be expressed on a common per-unit base. P d l and Q d l are defined as having positive values for positive demand to be consistent with the conventions used in PowerModels.jl. The definition of separate supertypes for generators and loads allows for this difference in polarity, and also provides an intuitive distinction between the two types of components.
It is worth noting that it is also possible to couple the generators and loads through current injections, where the nodal algebraic equations represent a real and reactive current, rather than real and reactive power [23]. This formulation is mathematically equivalent, and often viewed to be programmatically simpler; however, the power-balance form has been chosen, as it is more intuitive and removes the need for additional equations to account for power injections. Extension of the package to include current injections, to allow alternative definitions of generators and loads, is in the scope of future work for the package.
The ControllerModel supertype is defined to allow for the inclusion of external generator controllers, such as automatic voltage regulators (AVRs) and governors for synchronous machines. A given instance of a ControllerModel object is implemented as a functional module that is distinct from the functional module of the generator it is connected to. It is during the process of configuring the ystemSimulation object that the pointers are configured so that both the controller and the generator module point to the coupling variables. In the formulation of RMSPowerSims.jl presented in this paper, a ControllerModel can only be connected to a GeneratorModel and not to a LoadModel. This is a logical restriction for a traditional power system, where generators are typically controllable, while loads are not. However, considering the increasing prevalence of demand-side management, the authors note the utility of extending the package to allow for the modeling of controllable loads, and as such is in the scope of future work.
The lower-level supertype SynchrounousGeneratorModel is defined as a sub-type of the GeneratorModel, and the lower-level supertypes AVRModel and GovernorModel are defined as sub-types of the ControllerModel. This is to allow synchronous generators to be modeled either with or without AVR and turbine-governor models. The parameters that are controlled by the AVR and governor, the excitation voltage and mechanical torque, respectively, are necessary for the modeling of a synchronous generator; however, it is common to model them as constant in a simplified model. To allow for this, during the process of configuring the ystemSimulation object, the package checks whether a controller of type AVRModel or GovernorModel is defined, and if not, a ConstantExcitation or ConstantMechanicalPower model is automatically added.

2.3. Implemented Component Models

Component models implemented for the IEEET1 type excitation system [24] the TGOV1 thermal governor [25] remain largely unchanged from their source material. The only differences are the omission of the over/underexcitation limiter inputs from the IEEET1, as those systems have yet not been implemented in the developed package, and the omission of the turbine damping branch in the TGOV1, as this is commonly neglected. Component models for constant excitation and constant mechanical power inputs to a synchronous machine model are also available; however, these are not discussed here, as their implementation is trivial.
A static ZIP load model is included, with the governing equations shown below:
P d = P d 0 K p z V V 0 2 + K p i V V 0 + K q c
Q d = Q d 0 K q z V V 0 2 + K q i V V 0 + K q c
where V is the voltage magnitude of the connected bus, and  P d 0 , Q d 0 , and V 0 are the initial values of the active power injection, reactive power injection, and voltage magnitude of the connected bus, respectively. The initial values are parsed from the load flow solution. The parameters K p z , K p i , K p c , K q i , K q z , and  K q c are the ZIP load parameters, and must satisfy the conditions
K p z + K p i + K p c = 1 , and K q z + K q i + K q c = 1 .
A sixth-order synchronous machine model based on the model presented in [23] is implemented. Some modifications are made to account for the dependence of the electrical torque on the rotor speed as can be seen in the speed ratio terms in (11)–(13). This dependence is necessary for simulations of small systems, where the rotor speed deviates significantly from the synchronous speed during a disturbance [26]. If it is required that the effects of the rotor speed variation be neglected, these ratios are simply replaced by one. The differential equations of the model, as it is implemented in the package, are given in (6) through (11); the stator voltage equations are given in (12) and (13); and the generator power injections to the network are given in (14) and (15):
E q ˙ T d o = E q ( X d X d ) I d X d X d ( X d X l ) 2 ( ψ 1 d + ( X d X l ) I d E q ) + E f d
E d ˙ T q o = E d + ( X q X q ) I q X q X q ( X q X l ) 2 ( ψ 2 q + ( X q X l ) I q + E d )
ψ ˙ 1 d T d o = ψ 1 d + E q ( X d X l ) I d
ψ ˙ 2 q T q o = ψ 2 q E d ( X q X l ) I q
δ ˙ = 2 π f nom ( ω ω ref )
ω ˙ 2 H ω s = T m ω s ω V d I d + V q I q + R s I d 2 + I q 2
0 = V sin ( δ θ ) + R s I d + ω ω s X q I q X q X l X q X l E d + X q X q X q X l ψ 2 q
0 = V cos ( δ θ ) + R s I q + ω ω s X d I d X d X l X d X l E q X d X d X d X l ψ 1 d
P g = I d V sin ( δ θ ) + I q V cos ( δ θ )
Q g = I d V cos ( δ θ ) I q V sin ( δ θ )
The state variables of the synchronous machine model are E q , E d , ψ 1 d , ψ 2 q , δ , and  ω , which represent the flux in the excitation, the flux in the three damper windings, the rotor angle, and the rotor speed, respectively. I d , I q , V d , and V q are the direct and quadrature components of the stator current and voltage, respectively. E f d and T m are the excitation voltage and mechanical torque, respectively, and depend on the connected control system models. ω r e f is the reference speed of the system, which is typically the speed of the reference machine, although a center-of-inertia reference is also possible. R s and X l are the stator resistance and leakage reactance, respectively. X d , X d , and  X d represent the direct-axis synchronous, transient, and sub-transient reactances, respectively. X q , X q , and  X q represent the quadrature-axis synchronous, transient, and sub-transient reactances, respectively. T d o and T q o represent the open-circuit transient and sub-transient direct and quadrature-axis transient times, respectively. T d o and T q o represent the open-circuit sub-transient direct and quadrature-axis transient times, respectively. H is the inertia constant of the machine, expressed in seconds, and  ω s is the nominal speed of the system in rad/s.

2.4. Disturbances

As with the modeling of power system components, the modeling of disturbances utilizes custom typing to leverage Julia’s multiple dispatch capabilities. Only a single supertype is defined in this instance, named Disturbance. The implementation of a disturbance in RMSPowerSims.jl consists of two parts: a uniquely typed disturbance object containing the parameters required to implement the disturbance, and a perturb_model! function that modifies the PowerSystemModel object.
For disturbances that do not cause significant discontinuities in the system variables, such as a small step change in load, the perturb_model! function can be implemented directly on the PowerSystemModel object used by the solver. Attempting this for disturbances that result in larger discontinuities, such as short-circuit faults, often results in the solver failing to converge. In these instances, the solver must be restarted from the time of the disturbance. The initial conditions for the new simulation are calculated from the state of the system prior to the disturbance using the following assumptions:
  • The values of state variables do not change from the time of the disturbance to the time immediately following the disturbance.
  • The values of algebraic variables are allowed to change instantaneously.
  • The values of the derivatives of the state variables are allowed to change instantaneously.
In the current implementation of the developed package, this recalculation is performed as a two-step process. Firstly, the values of the algebraic variables are recalculated using the updated PowerSystemModel object. This calculation is handled by one of Julia’s non-linear equation solver packages [27], with the definition of equations once again being performed using type-based function overloading. A key difference between the algebraic_equations! functions called during this process and the DAE_functions used during the simulation is that the number of equations is reduced to only those required to define the algebraic variables. The second step is to recalculate the derivatives of the state variables. It is not necessary to use a non-linear solver for this process, as enough variables are defined at this stage for the direct calculation of the derivatives for each component.
It is worth noting that the two-step process for recalculating the system state is not the most programmatically succinct method. An alternative that was considered is to re-use the equations defined in the DAE_functions and simply fix the values of the state variables, treating both the algebraic variables and the derivatives of the state variables as variable quantities passed to the solver. This allows for simultaneous calculation of the algebraic variables and the derivatives of the state variables, and reduces the number of function definitions required for each component model. The reason for not selecting this approach is that it requires the solver to know which variables are state variables and which are algebraic variables. In most cases, this is simple, and can be parsed from the component models data file; however, it becomes more complex for variables that can be treated as either, depending on the simulation context. The sole example of this that has arisen in development so far is the excitation voltage of a synchronous machine, which can change depending on the presence of an excitation system. This alternative method also increases the order of the system that must be passed to the non-linear solver, which in turn increases the time taken to solve. In any case, the solution of the alternative method is identical; however, the implementation of the alternative method is an open question that may be revisited in future development.

2.5. Package Functionality

This section details the functionality of the developed package. A complete list of function implementations, their documentation, and usage examples can be found in the package documentation [18].
  • The package provides a modeling framework that extends the PowerModels.jl NDD format to incorporate additional parameters required for dynamic simulation.
  • Hierarchical typing allows for the definition of custom models of power system components and their incorporation into the simulation.
  • The package provides functionality to calculate the initial conditions for dynamic simulations.
  • The package provides functionality to execute RMS time-domain simulations.
  • The package provides the ability to recalculate the system state following a disturbance that causes a significant discontinuity in the system state variables. This is necessary for some disturbances which result in significant non-linearity in the system equations.
  • The package provides functionality to visualize the results of simulations using the Plots.jl package.

3. Simulation Process

This section will present a short example of how to run a simulation using RMSPowerSims.jl, in order to give an overview of what occurs during each function call. Listing 2 shows a code snippet that demonstrates how to run a simulation using RMSPowerSims.jl. The  l o a d _ m o d e l function called in line 2 loads a PowerModels.jl NDD, which will be assumed in this example to already have been configured with the details needed for time-domain simulation.
The p r e p a r e _ s i m u l a t i o n function call builds the ystemSimulation object from the PowerModels.jl NDD. It is at this point that the initial conditions for the simulation are calculated. PowerModels.jl is used to solve the load flow problem required as a starting point for the initialization process; however, in principle, other alternative solvers for the static power flow solvers would be suitable. Following this, the initial values of all state and algebraic variables are calculated by the functions defined for each ComponentModel. It is worth noting that the RMSPowerSims.jl function defined for the calculation of the initial conditions assumes a steady-state operating point, and as such is not suitable for starting simulations from a transient state. The PowerSystemModel is then generated by iterating over each power system component in the NDD.
Any disturbances that are to be applied during the simulation are added directly to the ystemSimulation object as is shown in lines 7–13 of Listing 2. The specific disturbances shown in the listing are a short-circuit fault at bus 3 of the network, and the clearance of the fault at the same bus. Note that the r e s t a r t _ s i m u l a t i o n flag is set to true for the C l e a r B u s F a u l t disturbance. This is often necessary for the clearance of faults, as the solver has trouble converging to a solution from a state of near zero voltages.
Listing 2. Example of running a simulation using RMSPowerSims.jl.
1# Load network model
2load_model("example_network")
3
4# Build PowerSystemSimulation object
5power_system_simulation = prepare_simulation(net)
6
7# Set disturbances
8faulted_bus_index = 3
9(t_fault, t_clear) = (0.5, 0.55)
10power_system_simulation.disturbances = Disturbance[
11BusFault(faulted_bus_index, t_fault),
12ClearBusFault(faulted_bus_index, t_clear, restart_simulation=true),
13]
14
15# Run simulation
16tspan = (0.0, 10.0)
17soln = run_RMS_simulation(
18power_system_simulation,
19tspan;
20solver_settings=Dict(
21"reltol" => 1e-9,
22"abstol" => 1e-8,
23"maxiters" => 10000,
24"dtmax" => 0.01,
25)
26)
27
28# Add simulation results to network model
29add_simulation_results!(net, soln)
30
31# Plot results
32plot_res(net, "gen", 1, "Pg")
The call of the r u n _ R M S _ s i m u l a t i o n function executes the time-domain simulation. If any of the disturbances require a restart of the simulation, the simulation will be run in multiple stages, with the initial condition of each stage being calculated from the final state of the previous stage. To avoid duplicate time values, subsequent stages are started after a small time interval, t g a p , from the previous stage. For simulations in which multiple disturbances occur, this results in the simulated time interval between disturbances being smaller than the difference between the times they are set to occur by an amount of t g a p . It is important to minimize t g a p , as significant variations in the simulation results are observed if it is too large. An interval in the order of 10 5 is found to provide acceptable results.
Finally, lines 28–32 of Listing 2 show some simple data processing. The function a d d _ s i m u l a t i o n _ r e s u l t s ! parses the solution objects returned by the differential equation solver and adds them to the PowerModels.jl NDD. This simplifies the process of accessing the simulation results. The  p l o t _ r e s function is a simple plotting function that uses the Plots.jl [28] package to plot the results of the simulation.

4. Verification

In this section, the time-domain simulation results produced by RMSPowerSims.jl are compared to those produced by the DIgSILENT PowerFactory. A version of the PowerFactory model of the 39 Bus New England System [17,29], with modified AVR models and salient-pole generators replaced by round-rotor generators, is used for the simulation. The network diagram of the system is shown in Figure 3. The system contains ten synchronous generators, nine of which are equipped with a TGOV1 thermal governor and IEEET1 type AVR model. All generators are modeled as round rotor machines using PowerFactory’s Standard Model [30]. The complete list of parameters used to model the system is provided in Appendix A.
Figure 4 shows comparisons of the time series results produced by RMSPowerSims.jl and PowerFactory. The simulation used for comparison includes a bolted short-circuit fault, clearance of the fault, and a load increase. The fault occurs at Bus 31 at t = 0.1 s, and is cleared at t = 0.2 s. The load increase occurs at t = 1.5 s for the load at Bus 16, and is set to 20% of the load at Bus 16 before the fault, that being 322 MW. RMSPowerSims.jl is set to recalculate the state of the system at the time of fault clearance but not at the time of the fault, or  the time of the load increase. The Sundials IDA solver [20,21] is used in RMSPowerSims.jl with both absolute tolerance and relative tolerance set to 10 4 .
As can be seen in Figure 4a,b, both the voltage at the faulted bus and the active power response of the generator connected to faulted bus, G 02, match the results produced by PowerFactory quite closely. Figure 4c,d show the voltage of Bus 9 and the active power response of the generator connected to Bus 38, G 09, which is distant from the fault. The results here are also shown to be in close agreement with those produced by PowerFactory. Figure 4e shows that the active power drawn by the load at Bus 16 closely matches the PowerFactory results through both the short-circuit disturbance, and the load increase.
It is worth noting that while the verification processes of other software packages commonly use metrics such as the root mean square error of the compared signals, we simply opt for visual inspection in this case. The reasoning for this is that the synchronous generator models used in RMSPowerSims.jl and PowerFactory are not strictly identical [31], and as such, the results produced by the two packages are not expected to match identically. Any metric-based comparison would, therefore, be misleading, as it is not possible to identify which differences are due to the generator model and which are the implementation of the simulation package.
To evaluate the computational performance, both load-step and short-circuit simulations are conducted comparing RMSPowerSims.jl and PowerFactory. The performance analysis consists of 100 simulations executed on an Intel Core i9-11900H CPU, with computation times recorded for each run. The initial condition calculations are excluded from the timing measurements. Due to Julia’s just-in-time compilation characteristics, a warm-up simulation is performed prior to recording the computation times, as the first execution of a simulation run in RMSPowerSims.jl is slower than subsequent runs.
The analysis employs both fixed-step and adaptive-step solvers. The fixed-step solver utilizes a 0.01 s step size, while the adaptive-step solver’s maximum step size is configured at 0.1 s. RMSPowerSims.jl again implements the Sundials IDA solver, whereas PowerFactory employs a trapezoidal integration method. A direct solver comparison is not feasible due to two constraints: (1) limited access to PowerFactory’s internal solver implementation, and (2) the restricted availability of DAE-compatible solvers within the Julia ecosystem.
The computational performance comparison for load-step studies is presented in Figure 5 using violin plots. The results demonstrate that PowerFactory exhibits superior performance, with both mean and median computation times approximately three times faster than RMSPowerSims.jl for fixed-step simulations and approximately four times faster for the adaptive-step simulations. This performance differential is anticipated, given that the primary development focus of RMSPowerSims.jl has prioritized accuracy, flexibility, and usability over computational optimization. For the load-step studies examined here, the absolute difference in computation times is in the order of hundreds of milliseconds, making the performance gap negligible for these specific cases. Further investigation is warranted to evaluate the scalability of RMSPowerSims.jl’s computational performance with increasing system size.
The computational performance comparison for short-circuit studies is presented in Figure 6. While similar performance trends are observed as in the load-step studies, the performance differential between PowerFactory and RMSPowerSims.jl is more pronounced for short-circuit simulations. PowerFactory demonstrates significantly faster execution times, with mean and median computation times approximately twelve times faster for fixed-step studies and twenty times faster for adaptive-step studies.
A substantial portion of this performance gap can be attributed to RMSPowerSims.jl’s requirement to recalculate the initial system conditions at fault clearance time, a process that requires approximately 1.5 s for the New England 39 Bus System. This recalculation, while necessary for ensuring result accuracy, introduces considerable computational overhead, which does not scale well with the size of the system. Given the magnitude of these performance differences, RMSPowerSims.jl in its current implementation may not be suitable for short-circuit applications, where computational efficiency is a primary consideration.

5. Conclusions

This paper has presented an RMS simulation capable Julia package that is intended to be compatible with the PowerModels.jl ecosystem. The overall structure of the package has been discussed, as well as a brief overview of the simulation process. A verification process has been performed using the 39 Bus New England System to compare the responses acquired using the developed RMSPowerSims.jl package and DIgSILENT PowerFactory. The results clearly indicate that RMSPowerSims.jl is capable of producing accurate time-domain simulation results. The computational performance of the package has also been discussed, and while the package is not yet at the level of performance of commercial packages such as DIgSILENT PowerFactory, the simulation times are not prohibitively long as long as the computational performance is not the primary concern. Performance optimizations are planned for future development to improve the computational performance of the package.
The immediate future work for the package includes the implementation of additional synchronous generator control models and renewable energy generation models. This will increase the range of systems that can be simulated and facilitate studies of modern power systems for all researchers.

Author Contributions

Conceptualization, T.P.; methodology, T.P.; software, T.P.; validation, T.P.; formal analysis, T.P.; investigation, T.P.; resources, A.P.A., T.B. and K.M.M.; data curation, T.P.; writing—original draft preparation, T.P.; writing—review and editing, T.P., A.P.A., T.B. and K.M.M.; visualization, T.P.; supervision, A.P.A., T.B. and K.M.M.; project administration, T.P., A.P.A., T.B. and K.M.M. All authors have read and agreed to the published version of the manuscript.

Funding

This research was funded by the Australian Government Research Training Program Scholarship and the Commonwealth Scientific and Industrial Research Organisation (CSIRO).

Data Availability Statement

The original data presented in the study are openly available in RMSPowerSims.jl at https://github.com/tphilpott2/RMSPowerSims.jl, (accessed on 10 November 2024).

Conflicts of Interest

The authors declare no conflicts of interest.

Abbreviations

    The following abbreviations are used in this manuscript:
AC  Alternating Current
AVR  Automatic Voltage Regulator
DAE  Differential-Algebraic Equation
EMT  Electromagnetic Transient
IBGInverter-Based Generation
NDDNetwork Data Dictionary
OPFOptimal Power Flow
REGRenewable Energy Generation
RMSRoot Mean Square

Appendix A

This appendix contains the parameters of the New England 39-bus system used for verification of the package. The internal generator parameters, listed in Table A3, are expressed using the generator base power. All other per unit quantities are expressed on a system base of 100 MVA. The voltage ratings of all lines, transformers, generators, and loads are equal to the voltage at the connecting busbar. The model provided in this appendix is derived from the models presented in [17,29].
Table A1. IEEE 39 Bus System bus data.
Table A1. IEEE 39 Bus System bus data.
NameBase Voltage
(kV)
Bus TypeVoltage Magnitude
(p.u.)
Voltage Angle
(deg)
Bus 01345.0PQ1.047−8.439
Bus 02345.0PQ1.049−5.754
Bus 03345.0PQ1.030−8.599
Bus 04345.0PQ1.004−9.607
Bus 05345.0PQ1.005−8.612
Bus 06345.0PQ1.008−7.950
Bus 07345.0PQ0.997−10.124
Bus 08345.0PQ0.996−10.615
Bus 09345.0PQ1.028−10.322
Bus 10345.0PQ1.017−5.427
Bus 11345.0PQ1.013−6.284
Bus 12138.0PQ1.000−6.244
Bus 13345.0PQ1.014−6.098
Bus 14345.0PQ1.012−7.656
Bus 15345.0PQ1.015−7.736
Bus 16345.0PQ1.032−6.188
Bus 17345.0PQ1.034−7.301
Bus 18345.0PQ1.031−8.224
Bus 19345.0PQ1.050−1.023
Bus 20230.0PQ0.991−2.015
Bus 21345.0PQ1.032−3.781
Bus 22345.0PQ1.0500.668
Bus 23345.0PQ1.0450.470
Bus 24345.0PQ1.037−6.068
Bus 25345.0PQ1.058−4.363
Bus 26345.0PQ1.052−5.527
Bus 27345.0PQ1.038−7.495
Bus 28345.0PQ1.050−2.015
Bus 29345.0PQ1.0500.744
Bus 3016.5PV1.048−3.334
Bus 3116.5Slack0.9820.000
Bus 3216.5PV0.9832.569
Bus 3316.5PV0.9974.195
Bus 3416.5PV1.0123.175
Bus 3516.5PV1.0495.630
Bus 3616.5PV1.0648.323
Bus 3716.5PV1.0282.421
Bus 3816.5PV1.0267.808
Bus 39345.0PV1.030−10.053
Table A2. IEEE 39 Bus System generator data.
Table A2. IEEE 39 Bus System generator data.
NameBase Power
(MVA)
BusVoltage
(p.u.)
Active Power
(MW)
Reactive Power
(MVar)
G 0110,000.0Bus 391.0301000.088.28
G 02700.0Bus 310.982520.8198.25
G 03800.0Bus 320.983650.0205.14
G 04800.0Bus 330.997632.0109.91
G 05600.0Bus 341.012508.0165.76
G 06800.0Bus 351.049650.0212.41
G 07700.0Bus 361.064560.0101.18
G 08700.0Bus 371.028540.00.44
G 091000.0Bus 381.026830.022.84
G 101000.0Bus 301.048250.0146.16
Table A3. IEEE 39 Bus System generator internal parameters.
Table A3. IEEE 39 Bus System generator internal parameters.
NameRs (p.u.)Xl (p.u.)Xd (p.u.)Xq (p.u.) X d (p.u.) X q (p.u.)
G 010.00.3002.0001.9000.6000.800
G 020.00.2452.0651.9740.4881.190
G 030.00.2431.9961.8960.4250.701
G 040.00.2362.0962.0640.3491.328
G 050.00.1622.0101.8600.3960.498
G 060.00.1792.0321.9280.4000.651
G 070.00.2252.0652.0440.3431.302
G 080.00.1962.0301.9600.3990.638
G 090.00.2982.1062.0500.5700.587
G 100.00.1251.0000.6900.3100.500
NameXd″ = Xq
(p.u.)
Td′ (s)Tq′ (s)Td″ (s)Tq″ (s)H (s)
G 010.4007.0000.7000.0500.0355.000
G 020.3506.5601.5000.0500.0354.329
G 030.3605.7001.5000.0500.0354.475
G 040.2805.6901.5000.0500.0353.575
G 050.2675.4000.4400.0500.0354.333
G 060.3207.3000.4000.0500.0354.350
G 070.3085.6601.5000.0500.0353.771
G 080.3156.7000.4100.0500.0353.471
G 090.4504.7901.9600.0500.0353.450
G 100.25010.2002.0000.0500.0354.200
Table A4. IEEE 39 Bus System AVR data.
Table A4. IEEE 39 Bus System AVR data.
NameKaKeKfTaTeTfTr
G 026.2−0.6330.0570.0500.4050.5000.010
G 035.0−0.0200.0800.0600.5001.0000.010
G 045.0−0.0520.0800.0600.5001.0000.010
G 0540.01.0000.0300.0200.7851.0000.010
G 065.0−0.0420.0750.0200.4711.2460.010
G 0740.01.0000.0300.0200.7301.0000.010
G 085.0−0.0470.0850.0200.5281.2600.010
G 0940.01.0000.0300.0201.4001.0000.010
G 105.0−0.0480.0400.0600.2501.0000.010
NameE1E2Se1Se2VrminVrmaxVref
G 023.0364.0490.6600.880−1.0001.0000.928
G 032.3423.1230.1300.340−1.0001.0001.021
G 042.8683.8240.0800.314−1.0001.0000.975
G 053.9275.2360.0700.910−10.00010.0001.070
G 063.5874.7820.0640.251−1.0001.0001.031
G 072.8023.7360.5300.740−6.5006.5001.133
G 083.1914.2550.0720.282−1.0001.0001.011
G 094.2575.6760.6200.850−10.50010.5001.090
G 103.5464.7280.0800.260−1.0001.0001.036
Table A5. IEEE 39 Bus System Governor Data.
Table A5. IEEE 39 Bus System Governor Data.
NameT1T2T3RdVminVmax
G 020.52.17.20.050.01.0
G 030.52.17.20.050.01.0
G 040.52.17.20.050.01.0
G 050.52.17.20.050.01.0
G 060.52.17.20.050.01.0
G 070.52.17.20.050.01.0
G 080.52.17.20.050.01.0
G 090.52.17.20.050.01.0
G 100.52.17.20.050.01.0
Table A6. IEEE 39 Bus System line data.
Table A6. IEEE 39 Bus System line data.
NameFrom BusTo BusResistance
(p.u.)
Reactance
(p.u.)
Susceptance
From Bus (p.u.)
Susceptance
To Bus (p.u.)
Line 01–02Bus 01Bus 020.0040.0410.3490.349
Line 01–39Bus 01Bus 390.0010.0250.3750.375
Line 02–03Bus 02Bus 030.0010.0150.1290.129
Line 02–25Bus 02Bus 250.0070.0090.0730.073
Line 03–04Bus 03Bus 040.0010.0210.1110.111
Line 03–18Bus 03Bus 180.0010.0130.1070.107
Line 04–05Bus 04Bus 050.0010.0130.0670.067
Line 04–14Bus 04Bus 140.0010.0130.0690.069
Line 05–06Bus 05Bus 060.0000.0030.0220.022
Line 05–08Bus 05Bus 080.0010.0110.0740.074
Line 06–07Bus 06Bus 070.0010.0090.0570.057
Line 06–11Bus 06Bus 110.0010.0080.0690.069
Line 07–08Bus 07Bus 080.0000.0050.0390.039
Line 08–09Bus 08Bus 090.0020.0360.1900.190
Line 09–39Bus 09Bus 390.0010.0250.6000.600
Line 10–11Bus 10Bus 110.0000.0040.0360.036
Line 10–13Bus 10Bus 130.0000.0040.0360.036
Line 13–14Bus 13Bus 140.0010.0100.0860.086
Line 14–15Bus 14Bus 150.0020.0220.1830.183
Line 15–16Bus 15Bus 160.0010.0090.0860.086
Line 16–17Bus 16Bus 170.0010.0090.0670.067
Line 16–19Bus 16Bus 190.0020.0200.1520.152
Line 16–21Bus 16Bus 210.0010.0140.1270.127
Line 16–24Bus 16Bus 240.0000.0060.0340.034
Line 17–18Bus 17Bus 180.0010.0080.0660.066
Line 17–27Bus 17Bus 270.0010.0170.1610.161
Line 21–22Bus 21Bus 220.0010.0140.1280.128
Line 22–23Bus 22Bus 230.0010.0100.0920.092
Line 23–24Bus 23Bus 240.0020.0350.1810.181
Line 25–26Bus 25Bus 260.0030.0320.2560.256
Line 26–27Bus 26Bus 270.0010.0150.1200.120
Line 26–28Bus 26Bus 280.0040.0470.3900.390
Line 26–29Bus 26Bus 290.0060.0630.5140.514
Line 28–29Bus 28Bus 290.0010.0150.1250.125
Table A7. IEEE 39 Bus System transformer data.
Table A7. IEEE 39 Bus System transformer data.
NameFrom BusTo BusResistance
(p.u.)
Reactance
(p.u.)
Tap Ratio
Trf 02–30Bus 02Bus 300.0000.0181.025
Trf 06–31Bus 06Bus 310.0000.0251.070
Trf 10–32Bus 10Bus 320.0000.0201.070
Trf 11–12Bus 12Bus 110.0020.0431.006
Trf 13–12Bus 12Bus 130.0020.0431.006
Trf 19–20Bus 19Bus 200.0010.0141.060
Trf 19–33Bus 19Bus 330.0010.0141.070
Trf 20–34Bus 20Bus 340.0010.0181.009
Trf 22–35Bus 22Bus 350.0000.0141.025
Trf 23–36Bus 23Bus 360.0000.0271.000
Trf 25–37Bus 25Bus 370.0010.0231.025
Trf 29–38Bus 29Bus 380.0010.0161.025
Table A8. IEEE 39 Bus System load data.
Table A8. IEEE 39 Bus System load data.
NameBusActive Power (MW)Reactive Power (MVar)
Load 03Bus 03322.02.4
Load 04Bus 04500.0184.0
Load 07Bus 07233.884.0
Load 08Bus 08522.0176.0
Load 12Bus 127.588.0
Load 15Bus 15320.0153.0
Load 16Bus 16329.032.3
Load 18Bus 18158.030.0
Load 20Bus 20628.0103.0
Load 21Bus 21274.0115.0
Load 23Bus 23247.584.6
Load 24Bus 24308.6−92.2
Load 25Bus 25224.047.2
Load 26Bus 26139.017.0
Load 27Bus 27281.075.5
Load 28Bus 28206.027.6
Load 29Bus 29283.526.9
Load 31Bus 319.24.6
Load 39Bus 391104.0250.0

Appendix B

The full list of dependencies and their functions within the package is as follows:
  • PowerModels.jl [13] provides the base data structure on which the power system models are built, and is used to solve the load flow problem required for initialization of the simulation. The package Ipopt.jl provides a wrapper for the interior-point solver, IPOPT [32], which is required for the solution of the power flow problem.
  • DifferentialEquations.jl [19] is used to formulate the system of differential-algebraic equations that defines the dynamic behavior of the power system.
  • NLsolve.jl [27] is used to solve the non-linear equations that arise when calculating the values of algebraic variables during a recalculation of the system state.
  • Sundials.jl [21] provides a Julia wrapper for the Sundials suite of solvers. The IDA [20] solver, from this suite, is the default solver used by the package.
  • DataFrames.jl [33] and OrderedCollections.jl [34] are used for data storage and manipulation.
  • CSV.jl [35] and JSON.jl [36] are used for file input and output, including the simulation results and network models, respectively.
  • Plots.jl [37] is used for visualization of the simulation results.

References

  1. Renewable Integration Study Stage 1 Report; Australian Energy Market Operator: Sydney, Australia, 2020; Available online: https://aemo.com.au/-/media/files/major-publications/ris/2020/renewable-integration-study-stage-1.pdf?la=en (accessed on 18 August 2024).
  2. Hatziargyriou, N.; Milanovic, J.; Rahmann, C.; Ajjarapu, V.; Canizares, C.; Erlich, I.; Hill, D.; Hiskens, I.; Kamwa, I.; Pal, B.; et al. Definition and Classification of Power System Stability–Revisited & Extended. IEEE Trans. Power Syst. 2021, 36, 3271–3281. [Google Scholar]
  3. Capitanescu, F. Critical review of recent advances and further developments needed in AC optimal power flow. Electr. Power Syst. Res. 2016, 136, 57–68. [Google Scholar] [CrossRef]
  4. Roald, L.; Andersson, G. Chance-Constrained AC Optimal Power Flow: Reformulations and Efficient Algorithms. IEEE Trans. Power Syst. 2018, 33, 2906–2918. [Google Scholar] [CrossRef]
  5. DIgSILENT PowerFactory Release 2022; DIgSILENT GmbH: Gomaringen, Germany. Available online: https://www.digsilent.de/en/powerfactory.html (accessed on 18 August 2024).
  6. PSS/E; Siemens: Munich, Germany. Available online: https://www.siemens.com/global/en/products/energy/grid-software/planning/pss-software/pss-e.html (accessed on 18 August 2024).
  7. PSCAD; Manitoba Hydro International Ltd.: Winnipeg, MB, Canada. Available online: https://www.pscad.com/ (accessed on 18 August 2024).
  8. Hay, S.; Ferguson, A. A Review of Power System Modelling Platforms and Capabilities; The Institution of Engineering and Technology: London, UK, 2015. [Google Scholar]
  9. Lara, J.D.; Barrows, C.; Thom, D.; Krishnamurthy, D.; Callaway, D. PowerSystems.jl —A power system data management package for large scale modeling. SoftwareX 2021, 15, 100747. [Google Scholar] [CrossRef]
  10. PowerSimulations.jl; National Renewable Energy Lab: Golden, CO, USA; Available online: https://github.com/NREL-Sienna/PowerSimulations.jl (accessed on 18 August 2024).
  11. Lara, J.D.; Henriquez-Auba, R.; Bossart, M.; Callaway, D.S.; Barrows, C. PowerSimulationsDynamics.jl—An Open Source Modeling Package for Modern Power Systems with Inverter-Based Resources. arXiv 2024, arXiv:2308.02921. [Google Scholar] [CrossRef]
  12. Plietzsch, A.; Kogler, R.; Auer, S.; Merino, J.; Gil-de Muro, A.; Liße, J.; Vogel, C.; Hellmann, F. PowerDynamics.jl—An experimentally validated open-source package for the dynamical analysis of power grids. SoftwareX 2022, 17, 100861. [Google Scholar] [CrossRef]
  13. Coffrin, C.; Russell, B.; Sundar, K.; Ng, Y.; Lubin, M. PowerModels.jl: An Open-Source Framework for Exploring Power Flow Formulations. arXiv 2018, arXiv:1711.01728. [Google Scholar] [CrossRef]
  14. Heidari, R.; Amos, M.; Geth, F. An Open Optimal Power Flow Model for the Australian National Electricity Market. In Proceedings of the 2023 IEEE PES Innovative Smart Grid Technologies—Asia (ISGT Asia), Auckland, New Zealand, 21–24 November 2023; pp. 1–5. [Google Scholar] [CrossRef]
  15. Philpott, T.; Agalgaonkar, A.P.; Muttaqi, K.M.; Brinsmead, T.; Ergun, H. Development of High Renewable Penetration Test Cases for Dynamic Network Simulations using a Synthetic Model of South-East Australia. In Proceedings of the 2023 IEEE International Conference on Energy Technologies for Future Grids (ETFG), Wollongong, Australia, 3–6 December 2023; pp. 1–6. [Google Scholar] [CrossRef]
  16. Zimmerman, R.D.; Murillo-Sánchez, C.E.; Thomas, R.J. MATPOWER: Steady-State Operations, Planning, and Analysis Tools for Power Systems Research and Education. IEEE Trans. Power Syst. 2011, 26, 12–19. [Google Scholar] [CrossRef]
  17. Athay, T.; Podmore, R.; Virmani, S. A Practical Method for the Direct Analysis of Transient Stability. IEEE Trans. Power Appar. Syst. 1979, PAS-98, 573–584. [Google Scholar] [CrossRef]
  18. RMSPowerSims.jl. Available online: https://github.com/tphilpott2/RMSPowerSims.jl (accessed on 18 August 2024).
  19. Christopher, R.; Qing, N. DifferentialEquations.jl—A Performant and Feature-Rich Ecosystem for Solving Differential Equations in Julia. J. Open Res. Softw. 2017, 5, 15. [Google Scholar] [CrossRef]
  20. Hindmarsh, A.C.; Serban, R.; Balos, C.J.; Gardner, D.J.; Reynolds, D.R.; Woodward, C.S. User Documentation for IDA. 2024. v7.1.1. Available online: https://sundials.readthedocs.io/en/latest/ida/index.html (accessed on 10 November 2024).
  21. Hindmarsh, A.C.; Brown, P.N.; Grant, K.E.; Lee, S.L.; Serban, R.; Shumaker, D.E.; Woodward, C.S. SUNDIALS: Suite of nonlinear and differential/algebraic equation solvers. ACM Trans. Math. Softw. (TOMS) 2005, 31, 363–396. [Google Scholar] [CrossRef]
  22. Julia Documentation. Available online: https://docs.julialang.org/en/v1/manual/methods/ (accessed on 18 August 2024).
  23. Sauer, P.W.; Pai, M.A. Power System Dynamics and Stability; Prentice Hall: Saddle River, NJ, USA, 1998. [Google Scholar]
  24. Exciter IEEET1. Available online: https://www.powerworld.com/WebHelp/Content/TransientModels_HTML/Exciter%20IEEET1.htm (accessed on 18 August 2024).
  25. Governor TGOV1 and TGOV1D. Available online: https://www.powerworld.com/WebHelp/Content/TransientModels_HTML/Governor%20TGOV1%20and%20TGOV1D.htm (accessed on 18 August 2024).
  26. IEEE Standard 1110-2002 (Revision of IEEE Std 1110-1992); IEEE Guide for Synchronous Generator Modeling Practices and Applications in Power System Stability Analyses. IEEE: Piscataway, NJ, USA, 2002.
  27. NLsolve.jl. Available online: https://github.com/JuliaNLSolvers/NLsolve.jl (accessed on 18 August 2024).
  28. Christ, S.; Schwabeneder, D.; Rackauckas, C.; Borregaard, M.K.; Breloff, T. Plots.jl—A user extendable plotting API for the julia programming language. J. Open Res. Softw. 2023, 11, 5. [Google Scholar] [CrossRef]
  29. 39 Bus New England System, DIgSILENT PowerFactory; DIgSILENT GmbH, Heinrich-Hertz-Straße 9: Gomaringen, Germany, 2020.
  30. PowerFactory 2022, Technical Reference, Synchronous Machine; DIgSILENT GmbH, Heinrich-Hertz-Straße 9: Gomaringen, Germany, 2022.
  31. Canay, I.M. Causes of Discrepancies on Calculation of Rotor Quantities and Exact Equivalent Diagrams of the Synchronous Machine. IEEE Trans. Power Appar. Syst. 1969, PAS-88, 1114–1120. [Google Scholar] [CrossRef]
  32. Wächter, A.; Biegler, L.T. On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming. Math. Program. 2006, 106, 25–57. [Google Scholar] [CrossRef]
  33. Bouchet-Valat, M.; Kamiński, B. DataFrames.jl: Flexible and Fast Tabular Data in Julia. J. Stat. Softw. 2023, 107, 1–32. [Google Scholar] [CrossRef]
  34. OrderedCollections.jl. Available online: https://github.com/JuliaCollections/OrderedCollections.jl (accessed on 18 August 2024).
  35. CSV.jl. Available online: https://github.com/JuliaData/CSV.jl (accessed on 18 August 2024).
  36. JSON.jl. Available online: https://github.com/JuliaIO/JSON.jl (accessed on 18 August 2024).
  37. Plots.jl. Available online: https://github.com/JuliaPlots/Plots.jl (accessed on 18 August 2024).
Figure 1. Intended procedure for running a simulation using RMSPowerSims.jl.
Figure 1. Intended procedure for running a simulation using RMSPowerSims.jl.
Energies 17 05677 g001
Figure 2. Structure of component model types in RMSPowerSims.jl.
Figure 2. Structure of component model types in RMSPowerSims.jl.
Energies 17 05677 g002
Figure 3. Network diagram of the 39 Bus New England System.
Figure 3. Network diagram of the 39 Bus New England System.
Energies 17 05677 g003
Figure 4. Time series results for short-circuit simulation.
Figure 4. Time series results for short-circuit simulation.
Energies 17 05677 g004aEnergies 17 05677 g004b
Figure 5. Computation time comparison for load-step studies.
Figure 5. Computation time comparison for load-step studies.
Energies 17 05677 g005
Figure 6. Computation time comparison for short-circuit studies.
Figure 6. Computation time comparison for short-circuit studies.
Energies 17 05677 g006
Disclaimer/Publisher’s Note: The statements, opinions and data contained in all publications are solely those of the individual author(s) and contributor(s) and not of MDPI and/or the editor(s). MDPI and/or the editor(s) disclaim responsibility for any injury to people or property resulting from any ideas, methods, instructions or products referred to in the content.

Share and Cite

MDPI and ACS Style

Philpott, T.; Agalgaonkar, A.P.; Brinsmead, T.; Muttaqi, K.M. An Open-Source Julia Package for RMS Time-Domain Simulations of Power Systems. Energies 2024, 17, 5677. https://doi.org/10.3390/en17225677

AMA Style

Philpott T, Agalgaonkar AP, Brinsmead T, Muttaqi KM. An Open-Source Julia Package for RMS Time-Domain Simulations of Power Systems. Energies. 2024; 17(22):5677. https://doi.org/10.3390/en17225677

Chicago/Turabian Style

Philpott, Thomas, Ashish P. Agalgaonkar, Thomas Brinsmead, and Kashem M. Muttaqi. 2024. "An Open-Source Julia Package for RMS Time-Domain Simulations of Power Systems" Energies 17, no. 22: 5677. https://doi.org/10.3390/en17225677

APA Style

Philpott, T., Agalgaonkar, A. P., Brinsmead, T., & Muttaqi, K. M. (2024). An Open-Source Julia Package for RMS Time-Domain Simulations of Power Systems. Energies, 17(22), 5677. https://doi.org/10.3390/en17225677

Note that from the first issue of 2016, this journal uses article numbers instead of page numbers. See further details here.

Article Metrics

Back to TopTop