- Separate array-enabled parameters from NumParam into
BaseConvParam
, which implementsiconvert
andoconvert
, and thenListParam
- Improve the robustness of accessing the fields of
pycode
by properly handlingKeyError
s. - Numba code generation for all models. Add a function for triggering all the JIT compilation before simulation.
- Unit Model Test framework.
- Allow selection of output variables
PQTS
model for PQ with time-series.- Generalize two-terminal and multi-terminal devices
- Allow for semi-analytical derivation of equations
- Define general hooks - when should the connectivity check happen
- Vectorize the
enable
option for most discrete blocks. - allow to remind developer of missing equations (such as
vout
of Exciters).
- Restore compatibility with dome format
- Draw block diagram from symbolic models using BDP (or SchemDraw)
- Eigenvalue analysis report sort options: by damping, frequency, or eigenvalue
- Root loci plots
- Disallow linking ExtAlgeb to State and ExtState to Algeb (check in prepare).
- Implement switched shunt model (ShuntSw)
- Allow arrays as device parameter
- An
Summary
model for storing system summary - Allow export of equation values. Using equation values are not recommended due to convergence considerations (partial derivatives not used).
- Robust iterative initialization for variables
- Limiter check and warning after initialization
- Renewable generator models (REGC_A, REEC_A, REPC_A)
- Improve the speed of
DAETimeSeries.unpack
. - Allow simulating to a time, pause, and continue to a new ending time.
- Store TDS data as NumPy compressed format
npz
; allow to reload bothnpy
andnpz
. - Power flow model variables erroneously point to the old
dae.y
array (fixed) - Allow loading default config for
selftest
(andes.run(default_config=True))
- Help system and consistency check system for Config
- Handling of zero time constants (through
State.t_const
) - Refactor Model to separate symbolic processing part as
ModelSymbolic
->Model.syms
. - Separate the solver class into an interface class + different solver classes
- A working
GENROU
model with saturation function - Fix the model connectivity status
u
in interface equations - A refreshed raw file reader to build data into
ModelData
(partially refreshed) - A refreshed dyr file reader
- Add
Model.int
for internal indexer (implemented by replacingModel.idx
as DataParam) - Allow adding routine without modifying code (as long as routines are added to
Routines.all_routines
) - Add a help system for Config
- Add consistency checks for Config
- Return an error state to system if a simulation routine fails
- Example COI model
- A working
PQNew
class with an option to convert to Z; Allow config in models - A defined data loading, model initialization, variable/equation relaying sequence
- A working power flow routine fully generated from symbolic expressions
- A working
System
class providing parameter retrieval by group and model - Time domain simulation using scipy.integrate (odeint and solve_ivp)
- Symbolic DAE modeling and automated code generation for numerical simulation
- Numerical DAE modeling for scenarios when symbolic implementations are difficult
- Rapid modeling with block library with common transfer functions.
- Discrete component library such as hard limiter, dead band, and anti-windup limiter.
- Pretty printing of DAE and automatically derived Jacobians
- Newton-Raphson and Newton-Krylov power flow (with automatic handling of separated systems).
- Trapezoidal method for semi-explicit time domain simulation.
- Set up command line interface
- Clearly define interface variables
VarExt
- Define associated equation with each variable (internal of interface)
- Use SymPy/SynEngine to generate function calls - define the interfaces
- Use SymEngine to get the derivative for each model; the derivatives may store in a smaller matrix locally to the model
- Pickle/dill the auto-generated function calls on the first run
- Function for providing the jacobian triplet
- Implement a PV model with the old code - Partially done with the Hybrid
j_numeric
- Define the call sequence for data flow between models and dae/models
- Initial values, pass initialized values between models, and solve initializer equations
- Improve the access to dae attributes. Get rid of
self.dae.__dict__[f'']
usages. - Configs in models that can participate in the computation, saved to files, and loaded
- Dummy service variables for storing initial values (such as pm0, vref0) (Solved with
Service
itself) - Improve running functions based on routine. Get rid of passing around
is_tds
. Possibly implementing a
pflow_models
and a tds_models
list in system
- Implement a group for PV and Slack. Possibly implementing all groups in
group.py
- Implement index handling in
group.py
, updatelink_external
to work with groups (Let group implement
similar api to models.idx2uid, or implement a get_by_idx
for both)
- Let Synchronous generator subsitute PV; more generally, let any non-pflow model substitute a pflow one
(Currently done with v_numeric
)
- Prototype Connectivity checking, previously implemented as
gyisland
. Need to be implemented under
System
(It turns out that gy_island
and gisland
does not need to be implemented. If there is a large
mismatch, just let the power flow fail and let the user correct the data.)
- Prototype a Bus voltage average for area (COI-type of one-to-multiple aggregation model
(RefParam, SericeReduce and RepeaterService)
- Divide limiter to update_var and update_eq (such as anti-windup limiter which depends on equations)
- Allow time definition in models reserve keyword
dae_t
(seeArea
) - Clean up
System._get_models
; Clean up the use of model-dependent calls - Clearly define
reset
andclear
(clear
clears the values but retains the size;reset
resets
attributes to a state before setup)
- Fix the case when Area is not a
TDS
model but has an equationtime = dae_t
which does not get updated
during TDS. (a non- tds
model is not allowed to use dae.t
)
- Implement a trapezoidal rule for numerical integration
- Refactorize jacobian after critical time (works for implicit method)
- Use an iterator into
System.times
rather than deletingtimes[0]
- Implement a time-based switching model and export all switching time to
System.switch_times
- Sequential initialization
- Limiter in PI controller
- Clean up the use of
vars_to_dae
andvars_to_model
- low pass filter in PI Controller - How the equations should be written
- Refactor
Config
to make load and save part of the config - Per-unit conversion (get ExtParam Sn, Vn before per unit conversion - Yes)
- LaTeX names in blocks and limiters
- Input switch. If input equals 1, 2, 3, or 4; Discrete
- Quadratic and exponential saturation for generators
- Piecewise nonlinear functions (block. Piecewise)
- Decide whether to keep Calc as Var or move it to service. (eliminated from VarBase subclasses; Likely a
service subclass)
- Use SymPy to solve e1d, e1q, e2d and e2q equations for GENROU
- Test initialization and report suspect issues
- Test anti-windup limiter
- Added expression symbol checking. Undefined symbols will throw ValueError during preparation
- [X]
System.reset()
not working afterTDS.run
- Export power flow iteration steps for debugging; export limiter status (get_inputs) alongside equations (implemented in _input_z)
- Batch simulation with in-place parameter modification (implemented with
Model.alter()
) - Control feedback, possibly with perturbation files (control implemented in this approach has a "delay" of a step size)
- TimeSeries output to DataFrame (system.dae.ts.df)
- implement a standalone PI controller with numerical jacobians