delete template files

pull/1/head
Yang Liu 3 years ago
parent c075fbbe73
commit abd46b524a

@ -1,405 +0,0 @@
.. _cases:
***********************
Test Cases and Parsers
***********************
Directory
=========
ANDES comes with several test cases in the ``andes/cases/`` folder.
Currently, the Kundur's 2-area system, IEEE 14-bus system,
NPCC 140-bus system, and the WECC 179-bus system has been verified
against DSATools TSAT.
The test case library will continue to build as more models get implemented.
A tree view of the test directory is as follows. ::
cases/
├── 5bus/
│ └── pjm5bus.xlsx
├── GBnetwork/
│ ├── GBnetwork.m
│ ├── GBnetwork.xlsx
│ └── README.md
├── ieee14/
│ ├── ieee14.dyr
│ └── ieee14.raw
├── kundur/
│ ├── kundur.raw
│ ├── kundur_aw.xlsx
│ ├── kundur_coi.xlsx
│ ├── kundur_coi_empty.xlsx
│ ├── kundur_esdc2a.xlsx
│ ├── kundur_esst3a.xlsx
│ ├── kundur_exdc2_zero_tb.xlsx
│ ├── kundur_exst1.xlsx
│ ├── kundur_freq.xlsx
│ ├── kundur_full.dyr
│ ├── kundur_full.xlsx
│ ├── kundur_gentrip.xlsx
│ ├── kundur_ieeeg1.xlsx
│ ├── kundur_ieeest.xlsx
│ ├── kundur_sexs.xlsx
│ └── kundur_st2cut.xlsx
├── matpower/
│ ├── case118.m
│ ├── case14.m
│ ├── case300.m
│ └── case5.m
├── nordic44/
│ ├── N44_BC.dyr
│ ├── N44_BC.raw
│ └── README.md
├── npcc/
│ ├── npcc.raw
│ └── npcc_full.dyr
├── wecc/
│ ├── wecc.raw
│ ├── wecc.xlsx
│ ├── wecc_full.dyr
│ ├── wecc_gencls.dyr
└── wscc9/
├── wscc9.raw
└── wscc9.xlsx
MATPOWER Cases
==============================
MATPOWER cases has been tested in ANDES for power flow calculation.
All following cases are calculated with the provided initial values
using the full Newton-Raphson iterative approach.
The numerical library used for sparse matrix factorization is KLU.
In addition, Jacobians are updated in place ``spmatrix.ipadd``.
Computations are performed on macOS 10.15.4 with i9-9980H, 16 GB
2400 MHz DDR4, running ANDES 0.9.1, CVXOPT 1.2.4 and NumPy 1.18.1.
The statistics of convergence, number of iterations, and solution time
(including equation evaluation, Jacobian, and factorization time) are
reported in the following table.
The computation time may vary depending on operating system and hardware.
+--------------------------+------------+-----------------+----------+
| File Name | Converged? | # of Iterations | Time [s] |
+==========================+============+=================+==========+
| case30.m | 1 | 3 | 0.012 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg500.m | 1 | 3 | 0.019 |
+--------------------------+------------+-----------------+----------+
| case13659pegase.m | 1 | 5 | 0.531 |
+--------------------------+------------+-----------------+----------+
| case9Q.m | 1 | 3 | 0.011 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg200.m | 1 | 2 | 0.013 |
+--------------------------+------------+-----------------+----------+
| case24_ieee_rts.m | 1 | 4 | 0.014 |
+--------------------------+------------+-----------------+----------+
| case300.m | 1 | 5 | 0.026 |
+--------------------------+------------+-----------------+----------+
| case6495rte.m | 1 | 5 | 0.204 |
+--------------------------+------------+-----------------+----------+
| case39.m | 1 | 1 | 0.009 |
+--------------------------+------------+-----------------+----------+
| case18.m | 1 | 4 | 0.013 |
+--------------------------+------------+-----------------+----------+
| case_RTS_GMLC.m | 1 | 3 | 0.014 |
+--------------------------+------------+-----------------+----------+
| case1951rte.m | 1 | 3 | 0.047 |
+--------------------------+------------+-----------------+----------+
| case6ww.m | 1 | 3 | 0.010 |
+--------------------------+------------+-----------------+----------+
| case5.m | 1 | 3 | 0.010 |
+--------------------------+------------+-----------------+----------+
| case69.m | 1 | 3 | 0.014 |
+--------------------------+------------+-----------------+----------+
| case6515rte.m | 1 | 4 | 0.168 |
+--------------------------+------------+-----------------+----------+
| case2383wp.m | 1 | 6 | 0.084 |
+--------------------------+------------+-----------------+----------+
| case30Q.m | 1 | 3 | 0.011 |
+--------------------------+------------+-----------------+----------+
| case2868rte.m | 1 | 4 | 0.074 |
+--------------------------+------------+-----------------+----------+
| case1354pegase.m | 1 | 4 | 0.047 |
+--------------------------+------------+-----------------+----------+
| case2848rte.m | 1 | 3 | 0.063 |
+--------------------------+------------+-----------------+----------+
| case4_dist.m | 1 | 3 | 0.010 |
+--------------------------+------------+-----------------+----------+
| case6470rte.m | 1 | 4 | 0.175 |
+--------------------------+------------+-----------------+----------+
| case2746wp.m | 1 | 4 | 0.074 |
+--------------------------+------------+-----------------+----------+
| case_SyntheticUSA.m | 1 | 21 | 11.120 |
+--------------------------+------------+-----------------+----------+
| case118.m | 1 | 3 | 0.014 |
+--------------------------+------------+-----------------+----------+
| case30pwl.m | 1 | 3 | 0.021 |
+--------------------------+------------+-----------------+----------+
| case57.m | 1 | 3 | 0.017 |
+--------------------------+------------+-----------------+----------+
| case89pegase.m | 1 | 5 | 0.024 |
+--------------------------+------------+-----------------+----------+
| case6468rte.m | 1 | 6 | 0.232 |
+--------------------------+------------+-----------------+----------+
| case2746wop.m | 1 | 4 | 0.075 |
+--------------------------+------------+-----------------+----------+
| case85.m | 1 | 3 | 0.011 |
+--------------------------+------------+-----------------+----------+
| case22.m | 1 | 2 | 0.008 |
+--------------------------+------------+-----------------+----------+
| case4gs.m | 1 | 3 | 0.012 |
+--------------------------+------------+-----------------+----------+
| case14.m | 1 | 2 | 0.010 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg10k.m | 1 | 4 | 0.251 |
+--------------------------+------------+-----------------+----------+
| case2869pegase.m | 1 | 6 | 0.136 |
+--------------------------+------------+-----------------+----------+
| case_ieee30.m | 1 | 2 | 0.010 |
+--------------------------+------------+-----------------+----------+
| case2737sop.m | 1 | 5 | 0.087 |
+--------------------------+------------+-----------------+----------+
| case9target.m | 1 | 5 | 0.013 |
+--------------------------+------------+-----------------+----------+
| case1888rte.m | 1 | 2 | 0.037 |
+--------------------------+------------+-----------------+----------+
| case145.m | 1 | 3 | 0.018 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg2000.m | 1 | 3 | 0.059 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg70k.m | 1 | 15 | 7.043 |
+--------------------------+------------+-----------------+----------+
| case9241pegase.m | 1 | 6 | 0.497 |
+--------------------------+------------+-----------------+----------+
| case9.m | 1 | 3 | 0.010 |
+--------------------------+------------+-----------------+----------+
| case141.m | 1 | 3 | 0.012 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg25k.m | 1 | 7 | 1.040 |
+--------------------------+------------+-----------------+----------+
| case118.m | 1 | 3 | 0.015 |
+--------------------------+------------+-----------------+----------+
| case1354pegase.m | 1 | 4 | 0.048 |
+--------------------------+------------+-----------------+----------+
| case13659pegase.m | 1 | 5 | 0.523 |
+--------------------------+------------+-----------------+----------+
| case14.m | 1 | 2 | 0.011 |
+--------------------------+------------+-----------------+----------+
| case141.m | 1 | 3 | 0.013 |
+--------------------------+------------+-----------------+----------+
| case145.m | 1 | 3 | 0.017 |
+--------------------------+------------+-----------------+----------+
| case18.m | 1 | 4 | 0.012 |
+--------------------------+------------+-----------------+----------+
| case1888rte.m | 1 | 2 | 0.037 |
+--------------------------+------------+-----------------+----------+
| case1951rte.m | 1 | 3 | 0.052 |
+--------------------------+------------+-----------------+----------+
| case22.m | 1 | 2 | 0.011 |
+--------------------------+------------+-----------------+----------+
| case2383wp.m | 1 | 6 | 0.086 |
+--------------------------+------------+-----------------+----------+
| case24_ieee_rts.m | 1 | 4 | 0.015 |
+--------------------------+------------+-----------------+----------+
| case2736sp.m | 1 | 4 | 0.074 |
+--------------------------+------------+-----------------+----------+
| case2737sop.m | 1 | 5 | 0.108 |
+--------------------------+------------+-----------------+----------+
| case2746wop.m | 1 | 4 | 0.093 |
+--------------------------+------------+-----------------+----------+
| case2746wp.m | 1 | 4 | 0.089 |
+--------------------------+------------+-----------------+----------+
| case2848rte.m | 1 | 3 | 0.065 |
+--------------------------+------------+-----------------+----------+
| case2868rte.m | 1 | 4 | 0.079 |
+--------------------------+------------+-----------------+----------+
| case2869pegase.m | 1 | 6 | 0.137 |
+--------------------------+------------+-----------------+----------+
| case30.m | 1 | 3 | 0.033 |
+--------------------------+------------+-----------------+----------+
| case300.m | 1 | 5 | 0.102 |
+--------------------------+------------+-----------------+----------+
| case30Q.m | 1 | 3 | 0.013 |
+--------------------------+------------+-----------------+----------+
| case30pwl.m | 1 | 3 | 0.013 |
+--------------------------+------------+-----------------+----------+
| case39.m | 1 | 1 | 0.008 |
+--------------------------+------------+-----------------+----------+
| case4_dist.m | 1 | 3 | 0.010 |
+--------------------------+------------+-----------------+----------+
| case4gs.m | 1 | 3 | 0.010 |
+--------------------------+------------+-----------------+----------+
| case5.m | 1 | 3 | 0.011 |
+--------------------------+------------+-----------------+----------+
| case57.m | 1 | 3 | 0.015 |
+--------------------------+------------+-----------------+----------+
| case6468rte.m | 1 | 6 | 0.229 |
+--------------------------+------------+-----------------+----------+
| case6470rte.m | 1 | 4 | 0.170 |
+--------------------------+------------+-----------------+----------+
| case6495rte.m | 1 | 5 | 0.198 |
+--------------------------+------------+-----------------+----------+
| case6515rte.m | 1 | 4 | 0.169 |
+--------------------------+------------+-----------------+----------+
| case69.m | 1 | 3 | 0.012 |
+--------------------------+------------+-----------------+----------+
| case6ww.m | 1 | 3 | 0.011 |
+--------------------------+------------+-----------------+----------+
| case85.m | 1 | 3 | 0.013 |
+--------------------------+------------+-----------------+----------+
| case89pegase.m | 1 | 5 | 0.020 |
+--------------------------+------------+-----------------+----------+
| case9.m | 1 | 3 | 0.010 |
+--------------------------+------------+-----------------+----------+
| case9241pegase.m | 1 | 6 | 0.487 |
+--------------------------+------------+-----------------+----------+
| case9Q.m | 1 | 3 | 0.013 |
+--------------------------+------------+-----------------+----------+
| case9target.m | 1 | 5 | 0.015 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg10k.m | 1 | 4 | 0.257 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg200.m | 1 | 2 | 0.014 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg2000.m | 1 | 3 | 0.058 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg25k.m | 1 | 7 | 1.118 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg500.m | 1 | 3 | 0.027 |
+--------------------------+------------+-----------------+----------+
| case_ACTIVSg70k.m | 1 | 15 | 6.931 |
+--------------------------+------------+-----------------+----------+
| case_RTS_GMLC.m | 1 | 3 | 0.014 |
+--------------------------+------------+-----------------+----------+
| case_SyntheticUSA.m | 1 | 21 | 11.103 |
+--------------------------+------------+-----------------+----------+
| case_ieee30.m | 1 | 2 | 0.010 |
+--------------------------+------------+-----------------+----------+
| case3375wp.m | 0 | - | 0.061 |
+--------------------------+------------+-----------------+----------+
| case33bw.m | 0 | - | 0.007 |
+--------------------------+------------+-----------------+----------+
| case3120sp.m | 0 | - | 0.037 |
+--------------------------+------------+-----------------+----------+
| case3012wp.m | 0 | - | 0.082 |
+--------------------------+------------+-----------------+----------+
| case3120sp.m | 0 | - | 0.039 |
+--------------------------+------------+-----------------+----------+
| case3375wp.m | 0 | - | 0.059 |
+--------------------------+------------+-----------------+----------+
| case33bw.m | 0 | - | 0.007 |
+--------------------------+------------+-----------------+----------+
PSS/E Dyr Parser
================
ANDES supporting parsing PSS/E dynamic files in the format of ``.dyr``.
Support new dynamic models can be added by editing the input and output
conversion definition file in ``andes/io/psse-dyr.yaml``,
which is in the standard YAML format.
To add support for a new dynamic model, it is recommended to start with
an existing model of similar functionality.
Consider a ``GENCLS`` entry in a dyr file. The entry looks like ::
1 'GENCLS' 1 13.0000 0.000000 /
where the fields are in the order of bus index, model name,
generator index on the bus, inertia (H) and damping coefficient (D).
The input-output conversion definition for GENCLS is as follows ::
GENCLS:
destination: GENCLS
inputs:
- BUS
- ID
- H
- D
find:
gen:
StaticGen:
bus: BUS
subidx: ID
get:
u:
StaticGen:
src: u
idx: gen
Sn:
StaticGen:
src: Sn
idx: gen
Vn:
Bus:
src: Vn
idx: BUS
ra:
StaticGen:
src: ra
idx: gen
xs:
StaticGen:
src: xs
idx: gen
outputs:
u: u
bus: BUS
gen: gen
Sn: Sn
Vn: Vn
D: D
M: "GENCLS.H; lambda x: 2 * x"
ra: ra
xd1: xs
It begins with a base-level definition of the model name to be parsed from the
dyr file, namely, ``GENCLS``. Five directives can be defined for each model:
``destination``, ``inputs``, ``outputs``, ``find`` and ``get``.
Note that ``find`` and ``get`` are optional, but the other three are mandatory.
- ``destination`` is ANDES model to which the original PSS/E model will be
converted. In this case, the ANDES model have the same name ``GENCLS``.
- ``inputs`` is a list of the parameter names for the PSS/E data.
Arbitrary names can be used, but it is recommended to use the same notation
following the PSS/E manual.
- ``outputs`` is a dictionary where the keys are the ANDES model parameter and
the values are the input parameter or lambda functions that processes the inputs
(see notes below).
- ``find`` is a dictionary with the keys being the temporary parameter name to store
the ``idx`` of
external devices and the values being the criteria to locate the devices.
In the example above, ``GENCLS`` will try to find the ``idx`` of ``StaticGen``
with ``bus == BUS`` and the ``subidx == ID``, where ``BUS`` and ``ID`` are from
the dyr file.
- ``get`` is a dictionary with each key being a temporary parameter name for storing
an external parameter and each value being the criteria to find the external parameter.
In the example above, a temporary parameter ``u`` is the ``u`` parameter of ``StaticGen``
whose ``idx == gen``. Note that ``gen`` is the ``idx`` of ``StaticGen`` retrieved
in the above ``find`` section.
For the ``inputs`` section, one will need to skip the model name
because for any model, the second field is always the model name.
That is why for ``GENCLS`` below, we only list four input parameters. ::
1 'GENCLS' 1 13.0000 0.000000 /
For the ``outputs`` section, the order can be arbitrary, but it is recommended
to follow the input order as much as possible for maintainability.
In particular, the right-hand-side of the outputs can be either an input parameter name
or an anonymous expression that processes the input parameters.
For the example of GENCLS, since ANDES internally uses the parameter of ``M = 2H``,
the input ``H`` needs to be multiplied by 2.
It is done by the following ::
M: "GENCLS.H; lambda x: 2 * x"
where the left-hand-side is the output parameter name (destination ANDES model parameter name),
and the right-hand-side is arguments and the lambda function separated by semi-colon, all in a
pair of double quotation marks.
Multiple arguments are accepted and should be separated by comma.
Arguments can come from the same model or another model.
In the case of the same model, the model name can be neglected, namely, by writing
``M: "H; lambda x: 2 * x"``.

@ -1,23 +0,0 @@
.. role:: raw-html(raw)
:format: html
*******
License
*******
GNU Public License v3
*********************
| Copyright :raw-html:`©` 2015-2020 Hantao Cui.
ANDES is free software; you can redistribute it and/or modify it under
the terms of the
`GNU General Public License <http://www.gnu.org/licenses/gpl-3.0.html>`_
as published by the Free Software Foundation; either version 3 of the
License, or (at your option) any later version.
ANDES is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the
`GNU General Public License <http://www.gnu.org/licenses/gpl-3.0.html>`_
for more details.

@ -1,51 +0,0 @@
.. _faq:
**************************
Frequently Asked Questions
**************************
General
=======
Q: What is the Hybrid Symbolic-Numeric Framework in ANDES?
A: It is a modeling and simulation framework that uses symbolic computation for descriptive
modeling and code generation for fast numerical simulation.
The goal of the framework is to reduce the programming efforts associated with implementing
complex models and automate the research workflow of modeling, simulation, and documentation.
The framework reduces the modeling efforts from two aspects:
(1) allowing modeling by typing in equations, and (2) allowing modeling using modularized
control blocks and discontinuous components.
One only needs to describe the model using equations and blocks without having to write the
numerical code to implement the computation.
The framework automatically generate symbolic expressions, computes partial derivatives,
and generates vectorized numerical code.
Modeling
========
Admittance matrix
-----------------
Q: Where to find the line admittance matrix?
A: ANDES does not build line admittance matrix for computing
line power injections. Instead, line power injections are
computed as vectors on the two line terminal. This approach
generalizes line as a power injection model.
Q: Without admittance matrix, how to switch out lines?
A: Lines can be switched out and in by using ``Toggler``.
See the example in ``cases/kundur/kundur_full.xlsx``.
One does not need to manually trigger a Jacobian matrix rebuild
because ``Toggler`` automatically triggers it using the new
connectivity status.
Reference of the existing model
-------------------------------
Q: Is there any further reference of the existing model?
A: Most of them can be found online, such as ESIG and PowerWorld.

@ -1,195 +0,0 @@
.. _install:
*************************
Installation
*************************
ANDES can be installed in Python 3.6+.
Please follow the installation guide carefully.
Environment
===========
Setting Up Miniconda
--------------------
We recommend the Miniconda distribution that includes the conda package manager and Python.
Downloaded and install the latest Miniconda (x64, with Python 3)
from https://conda.io/miniconda.html.
Step 1: Open terminal (on Linux or maxOS) or `Anaconda Prompt` (on Windows, **not the cmd
program!!**).
Make sure you are in a conda environment - you should see ``(base)`` prepended to the
command-line prompt, such as ``(base) C:\Users\user>``.
Create a conda environment for ANDES (recommended)
.. code:: bash
conda create --name andes python=3.7
Activate the new environment with
.. code:: bash
conda activate andes
You will need to activate the ``andes`` environment every time in a new Anaconda Prompt or
shell.
Step 2: Add the ``conda-forge`` channel and set it as default
.. code:: bash
conda config --add channels conda-forge
conda config --set channel_priority flexible
If these steps complete without an error, continue to `Install Andes`_.
Existing Python Environment (Advanced)
--------------------------------------
This is for advanced user only and is **not recommended on Microsoft Windows**.
Please skip it if you have set up a Conda environment.
Instead of using Conda, if you prefer an existing Python environment,
you can install ANDES with `pip`:
.. code:: bash
python3 -m pip install andes
If you see a `Permission denied` error, you will need to
install the packages locally with `--user`
Install ANDES
=============
ANDES can be installed in the user mode and the development mode.
- If you want to use ANDES without modifying the source code, install it in the `User Mode`_.
- If you want to develop models or routine, install it in the `Development Mode`_.
User Mode
---------
.. warning ::
Please skip this section and install ANDES in the `Development Mode`_
if you want to modify ANDES code or receive unreleased development
updates.
The User Model installation will install the latest stable version.
In the Anaconda environment, run
.. code:: bash
conda install andes
You will be prompted to confirm the installation,
This command installs ANDES into the active environment, which should be called ``andes`` if
you followed all the above steps.
.. note::
To use ``andes``, you will need to activate the ``andes`` environment every time in a new Anaconda Prompt or
shell.
Development Mode
----------------
This is for users who want to hack into the code and, for example, develop new models or routines.
The usage of ANDES is the same in development mode as in user mode.
In addition, changes to source code will be reflected immediately without re-installation.
Step 1: Get ANDES source code
As a developer, you are strongly encouraged to clone the source code using ``git``
from either your fork or the original repository:
.. code:: bash
git clone https://github.com/cuihantao/andes
In this way, you can easily update to the latest source code using ``git``.
Alternatively, you can download the ANDES source code from
https://github.com/cuihantao/andes and extract all files to the path of your choice.
Although this will work, this is not recommended since tracking changes and pushing back code
would be painful.
Step 2: Install dependencies
In the Anaconda environment, use ``cd`` to change directory to the ANDES root folder.
Install dependencies with
.. code:: bash
conda install --file requirements.txt
conda install --file requirements-dev.txt
Step 3: Install ANDES in the development mode using
.. code:: bash
python3 -m pip install -e .
Note the dot at the end. Pip will take care of the rest.
Updating ANDES
==============
Regular ANDES updates will be pushed to both ``conda-forge`` and Python package index.
It is recommended to use the latest version for bug fixes and new features.
We also recommended you to check the :ref:`ReleaseNotes` before updating to stay informed
of changes that might break your downstream code.
Depending you how you installed ANDES, you will use one of the following ways to upgrade.
If you installed it from conda (most common for users), run
.. code:: bash
conda install -c conda-forge --yes andes
If you install it from PyPI (namely, through ``pip``), run
.. code:: bash
python3 -m pip install --yes andes
If you installed ANDES from source code (in the `Development Mode`_),
and the source was cloned using ``git``,
you can use ``git pull`` to pull in changes from remote. However, if your source
code was downloaded, you will have to download the new source code again and manually
overwrite the existing one.
In rare cases, after updating the source code, command-line ``andes`` will complain
about missing dependency. If this ever happens, it means the new ANDES has introduced
new dependencies. In such cases, reinstall andes in the development mode to fix.
Change directory to the ANDES source code folder that contains ``setup.py`` and run
.. code:: bash
python3 -m pip install -e .
Performance Packages
====================
.. note::
Performance packages can be safely skipped and will not affect the
functionality of ANDES.
KVXOPT
------
KVXOPT is a fork of the CVXOPT with KLU by Uriel Sandoval (@sanurielf).
KVXOPT interfaces to KLU, which is
roughly 20% faster than UMFPACK for circuit simulations based on our testing.
KVXOPT contains inplace add and set functions for sparse matrix
contributed by CURENT.
These inplace functions significantly speed up large-scale system simulations.
To install ``KVXOPT`` run
.. code:: bash
python -m pip install kvxopt

@ -1,112 +0,0 @@
.. _misc:
**********************
Miscellaneous
**********************
Notes
=====
Modeling Blocks
---------------
State Freeze
````````````
State freeze is used by converter controllers during fault transients
to fix a variable at the pre-fault values. The concept of state freeze
is applicable to both state or algebraic variables.
For example, in the renewable energy electric control model (REECA),
the proportional-integral controllers for reactive power error and voltage
error are subject to state freeze when voltage dip is observed.
The internal and output states should be frozen when the freeze signal
turns one and freed when the signal turns back to zero.
Freezing a state variable can be easily implemented by multiplying the freeze
signal with the right-hand side (RHS) of the differential equation:
.. math ::
T \dot{x} = (1 - z_f) \times f(x)
where :math:`f(x)` is the original RHS of the differential equation,
and :math:`z_f` is the freeze signal. When :math:`z_f` becomes zero
the differential equation will evaluate to zero, making the increment
zero.
Freezing an algebraic variable is more complicate to implement.
One might consider a similar solution to freezing a differential variable
by constructing a piecewise equation, for example,
.. math::
0 = (1 - z_f)\times g(y)
where :math:`g(y)` is the original RHS of the algebraic equation.
One might also need to add a small value to the diagonals of ``dae.gy``
associated with the algebraic variable to avoid singularity.
The rationale behind this implementation is to zero out the algebraic
equation mismatch and thus stop incremental correction:
in the frozen state, since :math:`z_f` switches to zero,
the algebraic increment should be forced to zero.
This method, however, would not work when a dishonest Newton method is
used.
If the Jacobian matrix is not updated after :math:`z_f` switches to one,
in the row associated with the equation, the derivatives will remain the
same. For the algebraic equation of the PI controller given by
.. math::
0 = (K_p u + x_i) - y
where :math:`K_p` is the proportional gain, :math:`u` is the input,
:math:`x_I` is the integrator output, and :math:`y` is the PI controller
output, the derivatives w.r.t :math:`u`, :math:`x_i` and :math:`y` are
nonzero in the pre-frozen state. These derivative corrects :math:`y`
following the changes of :math:`u` and :math:`x`.
Although :math:`x` has been frozen, if the Jacobian is not rebuilt,
correction will still be made due to the change of :math:`u`.
Since this equation is linear, only one iteration is needed to let
:math:`y` track the changes of :math:`u`.
For nonlinear algebraic variables, this approach will likely give wrong
results, since the residual is pegged at zero.
To correctly freeze an algebraic variable, the freezing signal needs to
be passed to an ``EventFlag``, which will set an ``custom_event`` flag
if any input changes.
``EventFlag`` is a ``VarService`` that will be evaluated at each
iteration after discrete components and before equations.
Per Unit System
==============================
The bases for AC system are
- :math:`S_b^{ac}`: three-phase power in MVA. By default, :math:`S_b^{ac}=100 MVA` (in ``System.config.mva``).
- :math:`V_b^{ac}`: phase-to-phase voltage in kV.
- :math:`I_b^{ac}`: current base :math:`I_b^{ac} = \frac{S_b^{ac}} {\sqrt{3} V_b^{ac}}`
The bases for DC system are
- :math:`S_b^{dc}`: power in MVA. It is assumed to be the same as :math:`S_b^{ac}`.
- :math:`V_b^{dc}`: voltage in kV.
Some device parameters with specific properties are per unit values under the corresponding
device base ``Sn`` and ``Vn`` (if applicable).
These properties are documented in :py:mod:`andes.core.param.NumParam`.
After setting up the system, these parameters will be converted to the system base MVA
as specified in the config file (100 MVA by default).
The parameter values in the system base will be stored in the ``v`` attribute of the ``NumParam``,
and the original inputs in the device base will be stored to the ``vin`` attribute.
Values in the ``v`` attribute is what get utilized in computation.
Writing new values directly to ``vin`` will not affect the values in ``v`` afterwards.
Profiling Import
========================================
To speed up the command-line program, import profiling is used to breakdown the program loading time.
With tool ``profimp``, ``andes`` can be profiled with ``profimp "import andes" --html > andes_import.htm``. The
report can be viewed in any web browser.

@ -1,522 +0,0 @@
.. _ReleaseNotes:
=============
Release Notes
=============
The APIs before v3.0.0 are in beta and may change without prior notice.
v1.4 Notes
----------
v1.4.3 (2021-09-25)
```````````````````
This release features parallel processing that cuts the time for
``andes prepare`` by more than half.
- ``andes prepare`` supports multiprocessing and uses it by default.
- Added aliases ``andes st`` and ``andes prep`` for
``andes selftest`` and ``andes prepare``.
- ``andes.config_logger`` supports setting new ``stream_level`` and
``file_level``.
New exciter models are contributed by Jinning Wang.
- Added ``AC8B``, ``IEEET3`` and ``ESAC1A``.
Other changes include disallowing numba's ``nopython`` mode.
v1.4.2 (2021-09-12)
```````````````````
- Bug fixes
- Dropped support for ``cvxoptklu``.
v1.4.1 (2021-09-12)
```````````````````
- Bug fixes.
- Overhaul of the ``prepare`` and ``undill`` methods.
- ``andes prepare`` can be called for specific models through
``-m``, which takes one or many model names as arguments.
v1.4.0 (2021-09-08)
```````````````````
This release highlights the distributed energy resource protection model.
- Added ``DGPRCT1`` model to provide DG models with voltage-
and frequency-based protection following IEEE 1547-2018.
- ``REECA1E`` supports frequency droop on power.
- Throws TypeError if type mismatches when using ExtAlgeb and ExtState.
v1.3 Notes
----------
v1.3.12 (2021-08-22)
````````````````````
Plot enhancements:
- ``plot()`` takes an argument ``mark`` for masking y-axis data based on
the ``left`` and ``right`` range parameters.
- ``TDS.plt`` provides a ``panoview`` method for plotting an panoramic view
for selected variables and devices of a model.
Models:
- Added WIP EV models and protection models.
Test case:
- Added CURENT EI test system.
- Added a number of IEEE 14 bus test systems for specific models.
v1.3.11 (2021-07-27)
````````````````````
- Added ``REECA1E`` model with inertia emulation.
- Fixed an issue where the ``vtype`` of services was ignored.
- Changed default DPI for plotting to 100.
v1.3.10 (2021-06-08)
````````````````````
- Bug fixes for controllers when generators are off.
v1.3.9 (2021-06-02)
```````````````````
- Bug fixes in exciters when generators are offline.
- Added `safe_div` function for initialization equations.
v1.3.8 (2021-06-02)
```````````````````
- Added ``REGCVSG`` model for voltage-source controlled renewables.
- Turbine governors are now aware of the generator connection status.
v1.3.7 (2021-05-03)
```````````````````
- Allow manually specifying variables needing initialization
preceding a variable. Specify a list of variable names through
``BaseVar.deps``.
v1.3.6 (2021-04-23)
```````````````````
- Patched ESD1 model. Converted `distributed.py` into a package.
- Bug fixes.
v1.3.5 (2021-03-20)
```````````````````
- Fixed a bug in connectivity check when bus 0 is islanded.
- Updated notebook examples.
- Updated tutorials.
v1.3.4 (2021-03-13)
```````````````````
- Fixed a bug for the generated renewable energy code.
v1.3.2 (2021-03-08)
```````````````````
- Relaxed the version requirements for NumPy and SymPy.
v1.3.1 (2021-03-07)
```````````````````
- Writes all generated Python code to ``~/.andes/pycode`` by default.
- Uses generated Python code by default instead of `calls.pkl`.
- Works with NumPy 1.20; works on Apple Silicon (use `miniforge`) to
install native Python and NumPy for Apple Silicon.
- Generalized model initialization: automatically determines the
initialization sequence and solve equations iteratively when
necessary.
- In `System.config`, `save_pycode` and `use_pycode` are now
deprecated.
v1.3.0 (2021-02-20)
```````````````````
- Allow `State` variable set `check_init=False` to skip
initialization test. One use case is for integrators
with non-zero inputs (such as state-of-charge integration).
- Solves power flow for systems with multiple areas, each with
one Slack generator.
- Added `Jumper` for connecting two buses with zero impedance.
- `REGCA1` and synchronous generators can take power ratio
parameters `gammap` and `gammaq`.
- New models: `IEESGO` and `IEEET1`, `EXAC4`.
- Refactored exciters, turbine governors, and renewable models
into modules.
v1.2 Notes
----------
v1.2.9 (2021-01-16)
```````````````````
- Added system connectivity check for islanded buses.
- Depend on `openpyxl` for reading excel files since `xlrd` dropped
support for any format but `xlsx` since v2.0.0.
v1.2.7 (2020-12-08)
```````````````````
- Time-domain integration now evaluates anti-windup limiter before
algebraic residuals. It assures that algebraic residuals are
calculated with the new state values if pegged at limits.
- Fixed the conditions for Iq ramping in REGC;
removed ``Iqmax`` and ``Iqmin``.
- Added a new plot function ``plotn`` to allow multiple subplots in
one figure.
- ``TDS.config.g_scale`` is now now used as a factor for scaling
algebraic equations for better convergence. Setting it to 1.0
functions the same as before.
v1.2.6 (2020-12-01)
```````````````````
- Added `TGOV1N` model which sums `pref` and `paux` after
the 1/droop block.
- Added `ZIP` and `FLoad` for dynamic analysis. Need to be initialized
after power flow.
- Added `DAETimeSeries.get_data()` method.
- Added IEEE 14-bus test cases with solar PV (ieee14_solar.xlsx) and
Generic Type 3 wind (ieee14_wt3.xlsx).
v1.2.5 (2020-11-19)
```````````````````
- Added `Summary` model to allow arbitrary information for
a test case. Works in `xlsx` and `json` formats.
- PV reactive power limit works. Automatically determines
the number of PVs to convert if `npv2pq=0`.
- Limiter and AntiWindup limiter can use `sign_upper=-1` and
`sign_lower=-1` to negate the provided limits.
- Improved error messages for inconsistent data.
- `DAETimeSeries` functions refactored.
v1.2.4 (2020-11-13)
```````````````````
- Added switched shunt class `ShuntSw`.
- BaseParam takes `inconvert` and `oconvert` for converting parameter
elements from and to files.
v1.2.3 (2020-11-02)
```````````````````
- Support variable `sys_mva` (system base mva) in equation strings.
- Default support for KVXOPT through ``pip`` installation.
v1.2.2 (2020-11-01)
```````````````````
New Models:
- ``PVD1`` model, WECC distributed PV model.
Supports multiple PVD1 devices on the same bus.
- Added ``ACEc`` model, ACE calculation with continuous freq.
Changes and fixes:
- Renamed `TDS._itm_step` to `TDS.itm_step` as a public API.
- Allow variable `sys_f` (system frequency) in equation strings.
- Fixed ACE equation.
measurement.
- Support ``kvxopt`` as a drop-in replacement for ``cvxopt``
to bring KLU to Windows (and other platforms).
- Added ``kvxopt`` as a dependency for PyPI installation.
v1.2.1 (2020-10-11)
```````````````````
- Renamed `models.non_jit` to `models.file_classes`.
- Removed `models/jit.py` as models have to be loaded and instantiated
anyway before undill.
- Skip generating empty equation calls.
v1.2.0 (2020-10-10)
```````````````````
This version contains major refactor for speed improvement.
- Refactored Jacobian calls generation so that for each model, one call
is generated for each Jacobian type.
- Refactored Service equation generation so that the exact arguments are
passed.
Also contains an experimental Python code dump function.
- Controlled in ``System.config``, one can turn on ``save_pycode`` to dump
equation and Jacobian calls to ``~/.andes/pycode``. Requires one call to
``andes prepare``.
- The Python code dump can be reformatted with ``yapf`` through the config
option ``yapf_pycode``. Requires separate installation.
- The dumped Python code can be used for subsequent simulations through
the config option ``use_pycode``.
v1.1 Notes
----------
v1.1.5 (2020-10-08)
```````````````````
- Allow plotting to existing axes with the same plot API.
- Added TGOV1DB model (TGOV1 with an input dead-band).
- Added an experimental numba support.
- Patched `LazyImport` for a snappier command-line interface.
- ``andes selftest -q`` now skips code generation.
v1.1.4 (2020-09-22)
```````````````````
- Support `BackRef` for groups.
- Added CLI ``--pool`` to use ``multiprocess.Pool`` for multiple cases.
When combined with ``--shell``, ``--pool`` returns ``System`` Objects
in the list ``system``.
- Fixed bugs and improved manual.
v1.1.3 (2020-09-05)
```````````````````
- Improved documentation.
- Minor bug fixes.
v1.1.2 (2020-09-03)
```````````````````
- Patched time-domain for continuing simulation.
v1.1.1 (2020-09-02)
```````````````````
- Added back quasi-real-time speed control through `--qrt`
and `--kqrt KQRT`.
- Patched the time-domain routine for the final step.
v1.1.0 (2020-09-01)
```````````````````
- Defaulted `BaseVar.diag_eps` to `System.Config.diag_eps`.
- Added option `TDS.config.g_scale` to allow for scaling the
algebraic mismatch with step size.
- Added induction motor models `Motor3` and `Motor5` (PSAT models).
- Allow a PFlow-TDS model to skip TDS initialization by setting
`ModelFlags.tds_init` to False.
- Added Motor models `Motor3` and `Motor5`.
- Imported `get_case` and `list_cases` to the root package level.
- Added test cases (Kundur's system) with wind.
Added Generic Type 3 wind turbine component models:
- Drive-train models `WTDTA1` (dual-mass model) and `WTDS`
(single-mass model).
- Aerodynamic model `WTARA1`.
- Pitch controller model `WTPTA1`.
- Torque (a.k.a. Pref) model `WTTQA1`.
v1.0 Notes
----------
v1.0.8 (2020-07-29)
```````````````````
New features and models:
- Added renewable energy models `REECA1` and `REPCA1`.
- Added service `EventFlag` which automatically calls events
if its input changes.
- Added service `ExtendedEvent` which flags an extended event
for a given time.
- Added service `ApplyFunc` to apply a numeric function.
For the most cases where one would need `ApplyFunc`,
consider using `ConstService` first.
- Allow `selftest -q` for quick selftest by skipping codegen.
- Improved time stepping logic and convergence tests.
- Updated examples.
Default behavior changes include:
- ``andes prepare`` now takes three mutually exclusive arguments,
`full`, `quick` and `incremental`. The command-line now defaults
to the quick mode. ``andes.prepare()`` still uses the full mode.
- ``Model.s_update`` now evaluates the generated and the
user-provided calls in sequence for each service in order.
- Renamed model `REGCAU1` to `REGCA1`.
v1.0.7 (2020-07-18)
```````````````````
- Use in-place assignment when updating Jacobian values in Triplets.
- Patched a major but simple bug where the Jacobian refactorization
flag is set to the wrong place.
- New models: PMU, REGCAU1 (tests pending).
- New blocks: DeadBand1, PIFreeze, PITrackAW, PITrackAWFreeze (tests
pending), and LagFreeze (tests pending).
- `andes plot` supports dashed horizontal and vertical lines through
`hline1`, `hline2`, `vline1` and `vline2`.
- Discrete: renamed `DeadBand` to `DeadBandRT` (deadband with
return).
- Service: renamed `FlagNotNone` to `FlagValue` with an option
to flip the flags.
- Other tweaks.
v1.0.6 (2020-07-08)
```````````````````
- Patched step size adjustment algorithm.
- Added Area Control Error (ACE) model.
v1.0.5 (2020-07-02)
```````````````````
- Minor bug fixes for service initialization.
- Added a wrapper to call TDS.fg_update to
allow passing variables from caller.
- Added pre-event time to the switch_times.
v1.0.4 (2020-06-26)
```````````````````
- Implemented compressed NumPy format (npz) for time-domain
simulation output data file.
- Implemented optional attribute `vtype` for specifying data type
for Service.
- Patched COI speed initialization.
- Patched PSS/E parser for two-winding transformer winding and
impedance modes.
v1.0.3 (2020-06-02)
```````````````````
- Patches `PQ` model equations where the "or" logic "|" is ignored in
equation strings. To adjust PQ load in time domain simulation, refer
to the note in `pq.py`.
- Allow `Model.alter` to update service values.
v1.0.2 (2020-06-01)
```````````````````
- Patches the conda-forge script to use SymPy < 1.6. After SymPy version
1.5.1, comparison operations cannot be sympified. Pip installations are
not affected.
v1.0.1 (2020-05-27)
```````````````````
- Generate one lambda function for each of f and g, instead of generating
one for each single f/g equation. Requires to run `andes prepare` after
updating.
v1.0.0 (2020-05-25)
```````````````````
This release is going to be tagged as v0.9.5 and later tagged as v1.0.0.
- Added verification results using IEEE 14-bus, NPCC, and WECC systems
under folder `examples`.
- Patches GENROU and EXDC2 models.
- Updated test cases for WECC, NPCC IEEE 14-bus.
- Documentation improvements.
- Various tweaks.
Pre-v1.0.0
----------
v0.9.4 (2020-05-20)
```````````````````
- Added exciter models EXST1, ESST3A, ESDC2A, SEXS, and IEEEX1,
turbine governor model IEEEG1 (dual-machine support), and stabilizer
model ST2CUT.
- Added blocks HVGate and LVGate with a work-around for sympy.maximum/
minimum.
- Added services `PostInitService` (for storing initialized values), and
`VarService` (variable services that get updated) after limiters and before
equations).
- Added service `InitChecker` for checking initialization values against
typical values. Warnings will be issued when out of bound or equality/
inequality conditions are not met.
- Allow internal variables to be associated with a discrete component which
will be updated before initialization (through `BaseVar.discrete`).
- Allow turbine governors to specify an optional `Tn` (turbine rating). If
not provided, turbine rating will fall back to `Sn` (generator rating).
- Renamed `OptionalSelect` to `DataSelect`; Added `NumSelect`, the array-based
version of `DataSelect`.
- Allow to regenerate code for updated models through ``andes prepare -qi``.
- Various patches to allow zeroing out time constants in transfer functions.
v0.9.3 (2020-05-05)
```````````````````
This version contains bug fixes and performance tweaks.
- Fixed an `AntiWindup` issue that causes variables to stuck at limits.
- Allow ``TDS.run()`` to resume from a stopped simulation and run to the new
end time in ``TDS.config.tf``.
- Improved TDS data dump speed by not constructing DataFrame by default.
- Added tests for `kundur_full.xlsx` and `kundur_aw.xlsx` to ensure
results are the same as known values.
- Other bug fixes.
v0.9.1 (2020-05-02)
```````````````````
This version accelerates computations by about 35%.
- Models with flag ``collate=False``, which is the new default,
will slice DAE arrays for all internal vars to reduce copying back and forth.
- The change above greatly reduced computation time.
For ``kundur_ieeest.xlsx``, simulation time is down from 2.50 sec to 1.64 sec.
- The side-effects include a change in variable ordering in output lst file.
It also eliminated the feasibility of evaluating model equations in
parallel, which has not been implemented and does not seem promising in Python.
- Separated symbolic processor and documentation generator from Model into
``SymProcessor`` and ``Documenter`` classes.
- ``andes prepare`` now shows progress in the console.
- Store exit code in ``System.exit_code`` and returns to system when called
from CLI.
- Refactored the solver interface.
- Patched Config.check for routines.
- SciPy Newton-Krylov power flow solver is no longer supported.
- Patched a bug in v0.9.0 related to `dae.Tf`.
v0.8.8 (2020-04-28)
```````````````````
This update contains a quick but significant fix to boost the simulation speed by avoiding
calls to empty user-defined numerical calls.
- In `Model.flags` and `Block.flags`, added `f_num`, `g_num` and `j_num` to indicate
if user-defined numerical calls exist.
- In `Model.f_update`, `Model.g_update` and `Model.j_update`, check the above flags
to avoid unnecessary calls to empty numeric functions.
- For the `kundur_ieeest.xlsx` case, simulation time was reduced from 3.5s to 2.7s.
v0.8.7 (2020-04-28)
```````````````````
- Changed `RefParam` to a service type called `BackRef`.
- Added `DeviceFinder`, a service type to find device idx when not provided.
`DeviceFinder` will also automatically add devices if not found.
- Added `OptionalSelect`, a service type to select optional parameters if provided
and select fallback ones otherwise.
- Added discrete types `Derivative`, `Delay`, and `Average`,
- Implemented full IEEEST stabilizer.
- Implemented COI for generator speed and angle measurement.
v0.8.6 (2020-04-21)
```````````````````
This release contains important documentation fixes and two new blocks.
- Fixed documentations in `andes doc` to address a misplacement of symbols and equations.
- Converted all blocks to the division-free formulation (with `dae.zf` renamed to `dae.Tf`).
- Fixed equation errors in the block documentation.
- Implemented two new blocks: Lag2ndOrd and LeadLag2ndOrd.
- Added a prototype for IEEEST stabilizer with some fixes needed.
v0.8.5 (2020-04-17)
```````````````````
- Converted the differential equations to the form of ``T \dot{x} = f(x, y)``, where T is supplied to
``t_const`` of ``State/ExtState``.
- Added the support for Config fields in documentation (in ``andes doc`` and on readthedocs).
- Added Config consistency checking.
- Converted `Model.idx` from a list to `DataParam`.
- Renamed the API of routines (summary, init, run, report).
- Automatically generated indices now start at 1 (i.e., "GENCLS_1" is the first GENCLS device).
- Added test cases for WECC system. The model with classical generators is verified against TSAT.
- Minor features: `andes -v 1` for debug output with levels and line numbers.
v0.8.4 (2020-04-07)
```````````````````
- Added support for JSON case files. Convert existing case file to JSON with ``--convert json``.
- Added support for PSS/E dyr files, loadable with ``-addfile ADDFILE``.
- Added ``andes plot --xargs`` for searching variable name and plotting. See example 6.
- Various bug fixes: Fault power injection fix;
v0.8.3 (2020-03-25)
```````````````````
- Improved storage for Jacobian triplets (see ``andes.core.triplet.JacTriplet``).
- On-the-fly parameter alteration for power flow calculations (``Model.alter`` method).
- Exported frequently used functions to the root package
(``andes.config_logger``, ``andes.run``, ``andes.prepare`` and ``andes.load``).
- Return a list of System objects when multiprocessing in an interactive environment.
- Exported classes to `andes.core`.
- Various bug fixes and documentation improvements.
v0.8.0 (2020-02-12)
```````````````````
- First release of the hybrid symbolic-numeric framework in ANDES.
- A new framework is used to describe DAE models, generate equation documentation, and generate code for
numerical simulation.
- Models are written in the new framework. Supported models include GENCLS, GENROU, EXDC2, TGOV1, TG2
- PSS/E raw parser, MATPOWER parser, and ANDES xlsx parser.
- Newton-Raphson power flow, trapezoidal rule for numerical integration, and full eigenvalue analysis.
v0.6.9 (2020-02-12)
```````````````````
- Version 0.6.9 is the last version for the numeric-only modeling framework.
- This version will not be updated any more.
But, models, routines and functions will be ported to the new version.

@ -1,59 +0,0 @@
.. _troubleshooting:
**************************
Troubleshooting
**************************
Import Errors
=============
ImportError: DLL load failed
----------------------------
Platform: Windows, error message:
ImportError: DLL load failed: The specified module could not be found.
This usually happens when andes is not installed in a Conda environment
but instead in a system-wide Python whose library path was not correctly
set in environment variables.
The easiest fix is to install andes in a Conda environment.
Runtime Errors
==============
EOFError: Ran out of input
--------------------------
The error message looks like ::
Traceback (most recent call last):
File "/home/user/miniconda3/envs/andes/bin/andes", line 11, in <module>
load_entry_point('andes', 'console_scripts', 'andes')()
File "/home/user/repos/andes/andes/cli.py", line 179, in main
return func(cli=True, **vars(args))
File "/home/user/repos/andes/andes/main.py", line 514, in run
system = run_case(cases[0], codegen=codegen, **kwargs)
File "/home/user/repos/andes/andes/main.py", line 304, in run_case
system = load(case, codegen=codegen, **kwargs)
File "/home/user/repos/andes/andes/main.py", line 284, in load
system.undill()
File "/home/user/repos/andes/andes/system.py", line 980, in undill
loaded_calls = self._load_pkl()
File "/home/user/repos/andes/andes/system.py", line 963, in _load_pkl
loaded_calls = dill.load(f)
File "/home/user/miniconda3/envs/andes/lib/python3.7/site-packages/dill/_dill.py", line 270, in load
return Unpickler(file, ignore=ignore, **kwds).load()
File "/home/user/miniconda3/envs/andes/lib/python3.7/site-packages/dill/_dill.py", line 473, in load
obj = StockUnpickler.load(self)
EOFError: Ran out of input
Resolution:
The error indicates the file for generated code is corrupt or inaccessible.
It can be fixed by running ``andes prepare`` from the command line.
If the issue persists, try removing ``~/.andes/calls.pkl`` and running
``andes prepare`` agian.
Loading…
Cancel
Save