Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prepare for v1.6.2 release #301

Merged
merged 120 commits into from
Mar 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
120 commits
Select commit Hold shift + click to select a range
d286eb0
Add pandapower interface
jinningwang Mar 8, 2022
e27be61
Merge branch 'develop' into pr/jinningwang/287
cuihantao Mar 8, 2022
2af98b7
Add ex11 in toctree
jinningwang Mar 8, 2022
b41b768
Add doc of pandapower interface
jinningwang Mar 8, 2022
7636f0d
Fix pandapower interface
jinningwang Mar 8, 2022
5074b31
Revise pandapower interface
jinningwang Mar 8, 2022
486d1ce
Rerun ex11
jinningwang Mar 8, 2022
57569b7
Revise pandapower interface
jinningwang Mar 8, 2022
aad432a
Merge branch 'devcui' into ppintf
jinningwang Mar 9, 2022
1335311
Add three functions for pp2andes
jinningwang Mar 9, 2022
c747580
inprogress
jinningwang Mar 9, 2022
5b02b08
In progress
jinningwang Mar 9, 2022
d1a7dc7
Merge branch 'devcui' into ppintf
jinningwang Mar 12, 2022
d6d775f
Refactor pandapower interface
jinningwang Mar 12, 2022
2d0e38d
Rerun example ex11
jinningwang Mar 12, 2022
cff91c4
[WIP] Fix type issue with WTPTA1.
cuihantao Mar 15, 2022
e525e00
Added alter fault duration.
cuihantao Mar 15, 2022
c7f9a0d
[WIP] Fix WTDTA1's initialization due to WTTQA1.
cuihantao Mar 15, 2022
a18a8ef
Fix the ieee14_wt3 models and add notes
cuihantao Mar 16, 2022
441de32
Add notes on the output.
cuihantao Mar 16, 2022
106fa20
Update ieee14 case descriptions.
cuihantao Mar 16, 2022
d4afca2
Typo fixes.
cuihantao Mar 17, 2022
4c12361
Point to example.
cuihantao Mar 17, 2022
fbfa437
Added in-place update.
cuihantao Mar 17, 2022
50c1e3a
Rerun notebook.
cuihantao Mar 17, 2022
9736af7
Added some docstrings.
cuihantao Mar 21, 2022
a04e8fd
Pull the example from docs as the interface is not yet stable.
cuihantao Mar 22, 2022
b0b7aa9
Merge branch 'develop' into pr/jinningwang/287
cuihantao Mar 22, 2022
67b18dd
Test `interop` extras.
cuihantao Mar 22, 2022
3a34127
Upgrade pip.
cuihantao Mar 22, 2022
b7e6377
Update kernel name.
cuihantao Mar 22, 2022
c8537ad
Add test barebone.
cuihantao Mar 22, 2022
5050a9f
Rename functions; add docstring; rerun notebook.
cuihantao Mar 22, 2022
12312d5
[WIP] Refactor pandapower interface.
cuihantao Mar 22, 2022
021a0e7
Minor edits.
cuihantao Mar 22, 2022
d8b58c4
Fix typo in ex11
jinningwang Mar 22, 2022
1ebf38b
Initial commit. Waiting to hear from pypowsybl.
cuihantao Mar 22, 2022
556545c
Add paper citation.
cuihantao Mar 22, 2022
86a9bb3
Improve formatting of modelref.
cuihantao Mar 23, 2022
006c0f5
Update format for citation.
cuihantao Mar 23, 2022
bb04760
Fix style of docstring in modelref.
cuihantao Mar 23, 2022
1216f36
Fix docstring format.
cuihantao Mar 23, 2022
33a6f35
Fix docstring format.
cuihantao Mar 23, 2022
e79be07
Update.
cuihantao Mar 23, 2022
631ad50
Format reference.
cuihantao Mar 23, 2022
a1500bf
Remove "In Group" from rst docs.
cuihantao Mar 23, 2022
dfa3b8e
Merge branch 'pypowsybl' into pr/jinningwang/287
cuihantao Mar 23, 2022
557306c
Moved `pandapower` to `andes.interop`.
cuihantao Mar 23, 2022
b721aa2
Update headings and add example 11.
cuihantao Mar 23, 2022
72b3381
Add param g and fix docstring
jinningwang Mar 23, 2022
ae71962
Add error handling for imports.
cuihantao Mar 23, 2022
b4c7bda
Move skip test to class.
cuihantao Mar 23, 2022
cf21fc2
Add docs.
cuihantao Mar 23, 2022
23f90d8
Improved docs on connection.
cuihantao Mar 24, 2022
163161f
Improved formatting.
cuihantao Mar 24, 2022
f2daab5
Update.
cuihantao Mar 24, 2022
a4fbe3f
Add test for to_pandapower
jinningwang Mar 25, 2022
07929dc
Add test for make_link_table
jinningwang Mar 25, 2022
dfd9aca
Format test_pandapower
jinningwang Mar 25, 2022
4af324b
[WIP] add structure for ANDES->pypowsybl conversion.
cuihantao Mar 25, 2022
c28adc6
Fix tests called from `andes st`
cuihantao Mar 25, 2022
3653454
Merge pull request #287 from jinningwang/ppintf
cuihantao Mar 25, 2022
695e60a
Add `pypowsybl` to `interop` extras.
cuihantao Mar 25, 2022
ce19113
Store base values of pu.
cuihantao Mar 26, 2022
3d26bc5
Add methods to find `idx` for transmission lines and transformers.
cuihantao Mar 26, 2022
78315be
Add implementations.
cuihantao Mar 26, 2022
89d91b6
Style fix.
cuihantao Mar 26, 2022
097e3e4
Add notes.
cuihantao Mar 26, 2022
c597c82
Include interop in API docs.
cuihantao Mar 26, 2022
b26460a
Add notes for installation.
cuihantao Mar 26, 2022
801d731
Merge branch 'develop' into pypowsybl
cuihantao Mar 26, 2022
0460c30
Merge pull request #299 from cuihantao/pypowsybl
cuihantao Mar 26, 2022
2b8093e
Update.
cuihantao Mar 26, 2022
392ad30
Moved dev deps to `requirements-extra`.
cuihantao Mar 26, 2022
91b254b
Remove print statements when importing.
cuihantao Mar 26, 2022
9bc19fe
Fix extras.
cuihantao Mar 26, 2022
4b8ae27
Update installation notes.
cuihantao Mar 26, 2022
0f6bcf5
Edits.
cuihantao Mar 26, 2022
ea86b1b
Fix typo.
cuihantao Mar 26, 2022
d0ca457
Update.
cuihantao Mar 26, 2022
e6cee12
Use `tqdm.notebook` for notebook pbar.
cuihantao Mar 26, 2022
5ac1a6c
Convert bus idx of lines to integers.
cuihantao Mar 26, 2022
d463479
Style fixes.
cuihantao Mar 26, 2022
12a7abb
Add option for user-defined controllable
jinningwang Mar 26, 2022
ec0cb4e
Merge branch 'devcui' into pp
jinningwang Mar 26, 2022
3c572c9
Fix style.
cuihantao Mar 26, 2022
0e40eee
Remove ctrl from make_link_table
jinningwang Mar 26, 2022
ec619ab
Add sections for Examples.
cuihantao Mar 26, 2022
74e49da
Minor adjust
jinningwang Mar 26, 2022
048c099
Fix test_pandapower
jinningwang Mar 26, 2022
8a0dc26
Rerun ex11
jinningwang Mar 26, 2022
f683b20
Merge branch 'devcui' into pp
jinningwang Mar 26, 2022
ec9f674
Add link of Jinning
jinningwang Mar 26, 2022
f80657d
Removed unneeded calls to `undill`.
cuihantao Mar 27, 2022
88cf0c0
Add SMIB test case.
cuihantao Mar 27, 2022
aafaba3
Set `pbar` to None after simulation instead of removing.
cuihantao Mar 27, 2022
83bc3ff
Separated `m2mpc` and `mpc2system`.
cuihantao Mar 27, 2022
5d52916
Skip empty fields in the return of `m2mpc`
cuihantao Mar 27, 2022
f030fb9
Added `system2mpc`.
cuihantao Mar 27, 2022
c900229
Skip missing sections
cuihantao Mar 27, 2022
78873d4
Add interoperability wrapper for MATPOWER.
cuihantao Mar 27, 2022
ab1bf52
Import MATPOWER.
cuihantao Mar 27, 2022
b1a993c
Add dynamic only case to demo MATPOWER interface.
cuihantao Mar 27, 2022
8a0153e
Allow setting verbose on the fly.
cuihantao Mar 27, 2022
f8c8532
Add example for MATPOWER interop.
cuihantao Mar 27, 2022
14dd649
Edits.
cuihantao Mar 27, 2022
b9f3111
Fix import error.
cuihantao Mar 27, 2022
f424620
Update.
cuihantao Mar 27, 2022
938a886
Merge pull request #300 from jinningwang/pp
cuihantao Mar 27, 2022
070225c
Merge branch 'develop' of github.com:cuihantao/andes into develop
cuihantao Mar 27, 2022
51c6295
Fix angle conversion for Slack.
cuihantao Mar 27, 2022
1ca1a49
Improve imports.
cuihantao Mar 27, 2022
8608ece
Add power flow tests against matpower.
cuihantao Mar 27, 2022
b84c31c
Update.
cuihantao Mar 27, 2022
5ef7f82
Add command for savecase.
cuihantao Mar 27, 2022
4153a42
Removed unreachable code.
cuihantao Mar 27, 2022
ec65268
Fix title for non-reStruct format.
cuihantao Mar 27, 2022
4a5e899
Fix string for logging message.
cuihantao Mar 27, 2022
3dba484
Support sympy 1.10.1
cuihantao Mar 27, 2022
f83c392
Up requirement for kvxopt.
cuihantao Mar 27, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .azure-pipelines/azure-pipelines-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ jobs:

- script: |
python -m pip install --upgrade pip
pip install .
pip install -r requirements-dev.txt
pip install .[dev,interop]
displayName: 'Install dependencies'

- script: |
Expand Down
3 changes: 1 addition & 2 deletions .azure-pipelines/azure-pipelines-macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ jobs:

- script: |
python -m pip install --upgrade pip
pip install .
pip install -r requirements-dev.txt
pip install .[all]
displayName: 'Install dependencies'

- script: |
Expand Down
3 changes: 1 addition & 2 deletions .azure-pipelines/azure-pipelines-win.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ jobs:
call activate andesEnv
python -m pip install --upgrade pip
pip install pytest pytest-azurepipelines
pip install .
pip install -r requirements-dev.txt
pip install .[dev,interop]
pytest
displayName: pytest

Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/pythonapp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ jobs:
python-version: 3.8
- name: Install dependencies
run: |
# work around a pip issue with extras_require: https://github.com/pypa/pip/issues/8323
python -m pip install -U "pip @ git+https://github.com/pypa/pip.git"
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip install -r requirements-dev.txt
python -m pip install .
python -m pip install .[all]
python -m pip install nbmake==0.10 pytest-xdist line_profiler # add'l packages for notebook tests.
- name: Lint with flake8 for pull requests
if: github.event_name == 'pull_request'
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ coverage.xml
docs/source/modelref.rst
docs/source/configref.rst
docs/source/groupdoc
docs/source/examples
docs/source/_examples
docs/build/
docs/jupyter_execute/
docs/source/_build/
Expand Down
3 changes: 1 addition & 2 deletions .readthedocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,10 @@ python:
version: 3.8
install:
- requirements: requirements.txt
- requirements: requirements-dev.txt
- method: pip
path: .
extra_requirements:
- docs
- doc
- method: setuptools
path: .
system_packages: true
3 changes: 1 addition & 2 deletions CONTRIBUTING.rst
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,7 @@ set up your fork for local development::

$ mkvirtualenv andes
$ cd andes/
$ python setup.py develop
$ pip install requirements-dev.txt
$ pip install -e .[dev]

4. Create a branch for local development::

Expand Down
2 changes: 1 addition & 1 deletion MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ include CONTRIBUTING.rst
include LICENSE
include README.md
include requirements.txt
include requirements-dev.txt
include extra-requirements.txt

recursive-exclude * __pycache__
recursive-exclude * *.py[co]
Expand Down
3 changes: 2 additions & 1 deletion andes/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from andes import utils # NOQA
from andes import variables # NOQA
from andes import thirdparty # NOQA
from andes import interop # NOQA

from andes.main import config_logger, run, load, prepare # NOQA
from andes.system import System # NOQA
Expand All @@ -18,5 +19,5 @@
__author__ = 'Hantao Cui'

__all__ = ['main', 'plot', 'system', 'cli',
'utils', 'core', 'models', 'io', 'routines', 'variables', 'thirdparty',
'utils', 'core', 'models', 'io', 'routines', 'variables', 'thirdparty', 'interop',
'__version__']
45 changes: 40 additions & 5 deletions andes/cases/ieee14/README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,44 @@
IEEE 14-Bus System
# IEEE 14-Bus Systems

Power flow data is created by J. Conto.
The folder contains many variants of the IEEE 14-bus system that are created
during model development. One cawn find cases containing the needed model and modify
from them.
## Power flow data

Data is available at <https://drive.google.com/drive/folders/0B7uS9L2Woq_7YzYzcGhXT2VQYXc>
Power flow data is created by J. Conto obtained from the [Google drive
link](https://drive.google.com/drive/folders/0B7uS9L2Woq_7YzYzcGhXT2VQYXc).

Dynamic data is created by H. Cui for ANDES.
The base power flow file is ``ieee14.raw``. Almost all other cases in this
folder are created by adding models to it.

`ieee14.dyr` contains more models than `ieee14_gentrip.xlsx` and `ieee14_linetrip.xlsx`.
## Dynamic data

The base dynamic data is created by H. Cui for ANDES, given in ``ieee14.dyr``.

## Special cases

### Contingency cases:

- `ieee14_gentrip.xlsx` contains data for a generator trip using `Toggler`
- `ieee14_linetrip.xlsx` contains data for a line trip
- `ieee14_fault.xlsx` contains data for a three-phase-to-ground fault using `Fault`

### Renewable energy models

- `ieee14_wt3.xlsx` contains one generic Type-3 wind turbine
- `ieee14_wt3n.xlsx` has (almost) all generators represented by Type-3 wind turbines
- `ieee14_solar.xlsx` contains a generic solar PV device, which can also be used
to model a Type-4 wind turbine
- `ieee14_pvd1.xlsx` contains WECC distributed PV
- `ieee14_dgprct1.xlsx` contains the WECC distributed PV model with IEEE
1547.2018-based voltage and frequency protection

### Playback and Timeseries
- `ieee14_plbvfu1.xlsx` contains data for setting up a playback V-f generator
- `ieee14_timeseries.xlsx` contains data for using time series from `pqts.xlsx`
for a PQ load. Note that one needs to convert PQ to constant power load for
simulation.

### Other
- `ieee14_jumper.xlsx` contains data for a jumper device that connects two buses
without impedance.
Binary file added andes/cases/ieee14/ieee14_dyn_only.xlsx
Binary file not shown.
Binary file modified andes/cases/ieee14/ieee14_wt3.xlsx
Binary file not shown.
Binary file modified andes/cases/ieee14/ieee14_wt3n.xlsx
Binary file not shown.
15 changes: 15 additions & 0 deletions andes/cases/smib/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Single Machine Infinite Bus (SMIB) System

## Overview

`SMIB.xlsx` is originally prepared by Xiaoge Huang using data in [[1]](#1).

Parameters are modified by Hantao Cui to obtain the same per-unit results as in
the textbook in the base of 100 MVA. Essentially, the power bases, `Sn`, of all
devices are converted to 100 MVA. All elements are in the same voltage level.

## References

<a id="1">[1]</a> P. W. Sauer, M. A. Pai, and J. H. Chow, Power system dynamics
and stability: with synchrophasor measurement and power system toolbox, Second
edition. Hoboken, NJ, USA: IEEE Press, Wiley, 2017.
Binary file added andes/cases/smib/SMIB.xlsx
Binary file not shown.
10 changes: 8 additions & 2 deletions andes/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,14 @@

def create_parser():
"""
The main level of command-line interface.
Create a parser for the command-line interface.

Returns
-------
argparse.ArgumentParser
Parser with all ANDES options
"""

parser = argparse.ArgumentParser()

parser.add_argument(
Expand Down Expand Up @@ -192,7 +198,7 @@ def preamble():

def main():
"""
Main command-line interface
Entry point of the ANDES command-line interface.
"""

parser = create_parser()
Expand Down
42 changes: 29 additions & 13 deletions andes/core/documenter.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
Documenter class for ANDES models.
"""

import inspect
from collections import OrderedDict

from andes.utils.tab import make_doc_table, math_wrap
Expand Down Expand Up @@ -71,8 +72,10 @@ def _param_doc(self, max_width=78, export='plain'):
if export == 'rest':
symbols = [item.tex_name for item in self.params.values()]
symbols = math_wrap(symbols, export=export)
title = 'Parameters\n----------'
else:
symbols = [item.name for item in self.params.values()]
title = 'Parameters'

plain_dict = OrderedDict([('Name', names),
('Description', info),
Expand All @@ -88,7 +91,7 @@ def _param_doc(self, max_width=78, export='plain'):
('Properties', properties)])

# convert to rows and export as table
return make_doc_table(title='Parameters',
return make_doc_table(title=title,
max_width=max_width,
export=export,
plain_dict=plain_dict,
Expand Down Expand Up @@ -118,10 +121,13 @@ def _var_doc(self, max_width=78, export='plain'):
plist.append(item)
properties.append(','.join(plist))

title = 'Variables'

# replace with latex math expressions if export is ``rest``
if export == 'rest':
call_store = self.system.calls[self.class_name]
symbols = math_wrap(call_store.x_latex + call_store.y_latex, export=export)
title = 'Variables\n---------'

plain_dict = OrderedDict([('Name', names),
('Type', ty),
Expand All @@ -136,7 +142,7 @@ def _var_doc(self, max_width=78, export='plain'):
('Unit', units_rest),
('Properties', properties)])

return make_doc_table(title='Variables (States + Algebraics)',
return make_doc_table(title=title,
max_width=max_width,
export=export,
plain_dict=plain_dict,
Expand All @@ -146,6 +152,7 @@ def _init_doc(self, max_width=78, export='plain'):
"""
Variable initialization docs.
"""

if len(self.cache.all_vars) == 0:
return ''

Expand All @@ -157,11 +164,14 @@ def _init_doc(self, max_width=78, export='plain'):
ty.append(p.class_name)
ivs.append(p.v_str if p.v_str else '')

title = 'Initialization Equations'

# replace with latex math expressions if export is ``rest``
if export == 'rest':
call_store = self.system.calls[self.class_name]
symbols = math_wrap(call_store.x_latex + call_store.y_latex, export=export)
ivs_rest = math_wrap(call_store.init_latex.values(), export=export)
title = 'Initialization Equations\n------------------------'

plain_dict = OrderedDict([('Name', names),
('Type', ty),
Expand All @@ -174,7 +184,7 @@ def _init_doc(self, max_width=78, export='plain'):
('Initial Value', ivs_rest),
])

return make_doc_table(title='Variable Initialization Equations',
return make_doc_table(title=title,
max_width=max_width,
export=export,
plain_dict=plain_dict,
Expand Down Expand Up @@ -221,7 +231,7 @@ def _eq_doc(self, max_width=78, export='plain', e_code=None):
('Type', class_names),
(f'RHS of Equation "{e2form[e_name]}"', eqs),
])

title = f'{e2full[e_name]} Equations'
if export == 'rest':
call_store = self.system.calls[self.class_name]
e2var_sym = {'f': call_store.x_latex,
Expand All @@ -231,6 +241,7 @@ def _eq_doc(self, max_width=78, export='plain', e_code=None):

symbols = math_wrap(e2var_sym[e_name], export=export)
eqs_rest = math_wrap(e2eq_sym[e_name], export=export)
title = f'{e2full[e_name]} Equations\n-----------------------------'

rest_dict = OrderedDict([('Name', names),
('Symbol', symbols),
Expand All @@ -242,7 +253,7 @@ def _eq_doc(self, max_width=78, export='plain', e_code=None):
plain_dict['T (LHS)'] = lhs_names
rest_dict['T (LHS)'] = math_wrap(lhs_tex_names, export=export)

out += make_doc_table(title=f'{e2full[e_name]} Equations',
out += make_doc_table(title=title,
max_width=max_width,
export=export,
plain_dict=plain_dict,
Expand All @@ -263,10 +274,12 @@ def _service_doc(self, max_width=78, export='plain'):
symbols.append(p.tex_name if p.tex_name is not None else '')
eqs.append(p.v_str if p.v_str else '')

title = 'Services'
if export == 'rest':
call_store = self.system.calls[self.class_name]
symbols = math_wrap(symbols, export=export)
eqs_rest = math_wrap(call_store.s_latex, export=export)
title = 'Services\n----------'

plain_dict = OrderedDict([('Name', names),
('Equation', eqs),
Expand All @@ -277,7 +290,7 @@ def _service_doc(self, max_width=78, export='plain'):
('Equation', eqs_rest),
('Type', class_names)])

return make_doc_table(title='Services',
return make_doc_table(title=title,
max_width=max_width,
export=export,
plain_dict=plain_dict,
Expand All @@ -295,8 +308,11 @@ def _discrete_doc(self, max_width=78, export='plain'):
class_names.append(p.class_name)
info.append(p.info if p.info else '')

title = 'Discretes'
if export == 'rest':
symbols = math_wrap([item.tex_name for item in self.discrete.values()], export=export)
title = 'Discretes\n-----------'

plain_dict = OrderedDict([('Name', names),
('Type', class_names),
('Info', info)])
Expand All @@ -306,7 +322,7 @@ def _discrete_doc(self, max_width=78, export='plain'):
('Type', class_names),
('Info', info)])

return make_doc_table(title='Discrete',
return make_doc_table(title=title,
max_width=max_width,
export=export,
plain_dict=plain_dict,
Expand All @@ -327,8 +343,10 @@ def _block_doc(self, max_width=78, export='plain'):
class_names.append(p.class_name)
info.append(p.info if p.info else '')

title = 'Blocks'
if export == 'rest':
symbols = math_wrap([item.tex_name for item in self.blocks.values()], export=export)
title = 'Blocks\n-------'

plain_dict = OrderedDict([('Name', names),
('Type', class_names),
Expand All @@ -339,7 +357,7 @@ def _block_doc(self, max_width=78, export='plain'):
('Type', class_names),
('Info', info)])

return make_doc_table(title='Blocks',
return make_doc_table(title=title,
max_width=max_width,
export=export,
plain_dict=plain_dict,
Expand Down Expand Up @@ -371,14 +389,12 @@ def get(self, max_width=78, export='plain'):

if export == 'rest':
out += model_header + f'{self.class_name}\n' + model_header
out += f'\nGroup {self.parent.group}_\n\n'
else:
out += model_header + f'Model <{self.class_name}> in Group <{self.parent.group}>\n' + model_header

if self.__doc__ is not None:
if self.parent.__doc__ is not None:
out += self.parent.__doc__
out += '\n' # this fixes the indentation for the next line
if self.parent.__doc__ is not None:
out += inspect.cleandoc(self.parent.__doc__)
out += '\n\n' # this fixes the indentation for the next line

# add tables
out += self._param_doc(max_width=max_width, export=export)
Expand Down
3 changes: 3 additions & 0 deletions andes/core/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,9 @@ def __init__(self, system=None, config=None):
self.ii_args = OrderedDict()
self.ij_args = OrderedDict()

self.coeffs = dict() # pu conversion coefficient storage
self.bases = dict() # base storage, such as Vn, Vb, Zn, Zb

def _register_attribute(self, key, value):
"""
Register a pair of attributes to the model instance.
Expand Down
Loading