- Separate array-enabled parameters from NumParam into
BaseConvParam, which implementsiconvertandoconvert, and thenListParam[x] Improve the robustness of accessing the fields ofpycodeby properly handlingKeyErrors. [x] Numba code generation for all models. Add a function for triggering all the JIT compilation before simulation.andes prep -cdoes it. - Unit Model Test framework - a difficult task. Testing models will require proper inputs (from external models), addressing from the system, proper initialization, and the coupling with integration methods.
- Center-of-inertia for rotor angle and speed.
- Allow selection of output variables
- Timeseries data input support. Reading data from file.
PQTSmodel 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
enableoption for most discrete blocks. - allow to remind developer of missing equations (such as
voutof 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
Summarymodel 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 bothnpyandnpz. - Power flow model variables erroneously point to the old
dae.yarray (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
GENROUmodel with saturation function - Fix the model connectivity status
uin interface equations - A refreshed raw file reader to build data into
ModelData(partially refreshed) - A refreshed dyr file reader
- Add
Model.intfor internal indexer (implemented by replacingModel.idxas 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
PQNewclass 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
Systemclass 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
Serviceitself) - 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_externalto 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
resetandclear(clearclears the values but retains the size;resetresets
attributes to a state before setup)
- Fix the case when Area is not a
TDSmodel but has an equationtime = dae_twhich 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.timesrather 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_daeandvars_to_model - low pass filter in PI Controller - How the equations should be written
- Refactor
Configto 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