diff --git a/.gitignore b/.gitignore
index fc8ef955b..9ee0b2652 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,7 @@
build/
*.swp
doxygen-docs/
+docs/_build/
+docs/api/reference/
+docs/xml/
__pycache__
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 000000000..4ddc09f6b
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,18 @@
+version: 2
+
+build:
+ os: ubuntu-24.04
+ tools:
+ python: "3.12"
+ apt_packages:
+ - doxygen
+ jobs:
+ pre_build:
+ - rm -rf docs/xml && cd docs && doxygen Doxyfile
+
+sphinx:
+ configuration: docs/conf.py
+
+python:
+ install:
+ - requirements: docs/requirements.txt
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 066786e09..612211975 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,7 @@
- Added 3, 10, 37, and 39 bus test cases.
- Updated documentation.
+- Added support for Read the Docs
- Added JSON parsing.
- Automatic differentiation with enzyme (w.r.t. internal and external variables).
- Added PR and issue templates.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 4985b656a..1a446018e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -107,11 +107,11 @@ required.
Doxygen supports Markdown markup and it should be used to make documentation
more clear. For example,
-```c++
+```text
* @return The size of `a`
```
is clearer than
-```c++
+```text
* @return The size of a
```
when read in plain text and in formatted documentation.
diff --git a/GridKit/CommonMath.md b/GridKit/CommonMath.md
index 9f9f9bdcc..9c1995e51 100644
--- a/GridKit/CommonMath.md
+++ b/GridKit/CommonMath.md
@@ -1,6 +1,6 @@
# CommonMath
-Smooth, autodiff-friendly replacements for piecewise functions used across GridKit component models. See [CommonMath.hpp](CommonMath.hpp) for implementation details.
+Smooth, autodiff-friendly replacements for piecewise functions used across GridKit component models. See `CommonMath.hpp` for implementation details.
## Primitives
@@ -28,7 +28,7 @@ The sigmoid is also known as the logistic function. The equivalent `tanh` form i
\end{aligned}
```
-

+
### $\rho$ - `ramp`
@@ -42,7 +42,7 @@ The sigmoid is also known as the logistic function. The equivalent `tanh` form i
\end{aligned}
```
-
+
### $q$ - `qramp`
@@ -52,7 +52,7 @@ The sigmoid is also known as the logistic function. The equivalent `tanh` form i
q(x)=x^2\,\sigma(x)
```
-
+
## Derived Functions
@@ -85,7 +85,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `min`
@@ -101,7 +101,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `clamp`
@@ -118,7 +118,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `deadband1`
@@ -135,7 +135,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `deadband2`
@@ -152,7 +152,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `slew`
@@ -169,7 +169,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `linseg`
@@ -186,7 +186,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `above`
@@ -202,7 +202,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `below`
@@ -218,7 +218,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `inside`
@@ -234,7 +234,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `outside`
@@ -250,7 +250,7 @@ q(x)=x^2\,\sigma(x)
\end{aligned}
```
-
+
### `antiwindup`
diff --git a/GridKit/Model/EMT/Component/Branch/BranchLumpedConstant/README.md b/GridKit/Model/EMT/Component/Branch/BranchLumpedConstant/README.md
index 17a7374ea..0ec665ed2 100644
--- a/GridKit/Model/EMT/Component/Branch/BranchLumpedConstant/README.md
+++ b/GridKit/Model/EMT/Component/Branch/BranchLumpedConstant/README.md
@@ -7,11 +7,9 @@ Series current $\mathbf{i}$ is directed from bus 1 to bus 2. Bus residual
current injections are positive into buses. All electrical parameter matrices
are $3 \times 3$ and capture self and mutual coupling between phases.
-
-

+
- Figure 1: Lumped constant EMT branch model
-
+Figure 1: Lumped constant EMT branch model
## Model Parameters
diff --git a/GridKit/Model/PhasorDynamics/Branch/README.md b/GridKit/Model/PhasorDynamics/Branch/README.md
index e96c4e3f6..fcdea7692 100644
--- a/GridKit/Model/PhasorDynamics/Branch/README.md
+++ b/GridKit/Model/PhasorDynamics/Branch/README.md
@@ -17,11 +17,9 @@ An ideal complex tap is placed on the bus-1 side of the branch equivalent. The
ordinary transmission-line $\pi$ model is recovered with $\tau = 1$ and
$\theta = 0$.
-
-

+
- Figure 1: Branch equivalent circuit
-
+Figure 1: Branch equivalent circuit
## Model Parameters
diff --git a/GridKit/Model/PhasorDynamics/Bus/README.md b/GridKit/Model/PhasorDynamics/Bus/README.md
index 2d61eed2f..327a9e53b 100644
--- a/GridKit/Model/PhasorDynamics/Bus/README.md
+++ b/GridKit/Model/PhasorDynamics/Bus/README.md
@@ -15,16 +15,11 @@ numerical integrator requests residual evaluation.
Current entering the bus has positive and current exiting the bus negative
sign.
-
-

-
- Figure 1: Needs to be changed to represent current balance instead of power
- balance.
-
-
-
+
+Figure 1: Needs to be changed to represent current balance instead of power
+balance.
**Other Parameters**
Buses are uniquely defined by their ID (number or name). Besides, each bus
should have associated Nominal Voltage value.
diff --git a/GridKit/Model/PhasorDynamics/BusToSignalAdapter/README.md b/GridKit/Model/PhasorDynamics/BusToSignalAdapter/README.md
index b418fad98..d618c6323 100644
--- a/GridKit/Model/PhasorDynamics/BusToSignalAdapter/README.md
+++ b/GridKit/Model/PhasorDynamics/BusToSignalAdapter/README.md
@@ -3,17 +3,17 @@
This component enables signals to send and receive bus variables. It has five
ports:
-#### Bus port
+## Bus Port
- `bus` for the bus whose variables are managed by the adapter
-#### Input ports
+## Input Ports
- `ir` ($I_r$)
- `ii` ($I_i$)
External current injections are read from input signal nodes added to currents
on the bus.
-#### Output ports
+## Output Ports
- `vr` ($V_r$)
- `vi` ($V_i$)
diff --git a/GridKit/Model/PhasorDynamics/Converter/REECA/README.md b/GridKit/Model/PhasorDynamics/Converter/REECA/README.md
index 6e0d0b83e..68c8ab96f 100644
--- a/GridKit/Model/PhasorDynamics/Converter/REECA/README.md
+++ b/GridKit/Model/PhasorDynamics/Converter/REECA/README.md
@@ -11,11 +11,9 @@ Notes:
Standard REECA block diagram.
-
-

+
- Figure 1: REECA block diagram. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: REECA block diagram. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -251,7 +249,7 @@ The state-equation residuals use compact limiter notation where applicable. The
\end{aligned}
```
-CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator) target and smooth approximation.
+CommonMath defines the [Anti-Windup](../../../../CommonMath.md#antiwindup) target and smooth approximation.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Converter/REGCA/README.md b/GridKit/Model/PhasorDynamics/Converter/REGCA/README.md
index ea352c520..45b63f3a7 100644
--- a/GridKit/Model/PhasorDynamics/Converter/REGCA/README.md
+++ b/GridKit/Model/PhasorDynamics/Converter/REGCA/README.md
@@ -13,11 +13,9 @@ Notes:
Standard REGCA converter-interface model.
-
-

+
- Figure 1: Generator/Converter REGCA model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Generator/Converter REGCA model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
diff --git a/GridKit/Model/PhasorDynamics/Converter/REGCB/README.md b/GridKit/Model/PhasorDynamics/Converter/REGCB/README.md
index f10fe2218..32f86f38d 100644
--- a/GridKit/Model/PhasorDynamics/Converter/REGCB/README.md
+++ b/GridKit/Model/PhasorDynamics/Converter/REGCB/README.md
@@ -9,11 +9,9 @@ the REGCB source standard before implementation.
Standard model diagram for the REGCB converter interface.
-
-

+
- Figure 1: Generator/Converter REGCB model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Generator/Converter REGCB model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
Detailed REGCB parameters, variables, equations, initialization details, and
outputs will be added after validation against the REGCB source standard.
diff --git a/GridKit/Model/PhasorDynamics/Exciter/ESAC6A/README.md b/GridKit/Model/PhasorDynamics/Exciter/ESAC6A/README.md
index c2b556cd7..07a3ccfda 100644
--- a/GridKit/Model/PhasorDynamics/Exciter/ESAC6A/README.md
+++ b/GridKit/Model/PhasorDynamics/Exciter/ESAC6A/README.md
@@ -16,11 +16,9 @@ Notes:
Standard model of the ESAC6A Exciter.
-
-

+
- Figure 1: Exciter ESAC6A model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Exciter ESAC6A model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
diff --git a/GridKit/Model/PhasorDynamics/Exciter/ESDC2A/README.md b/GridKit/Model/PhasorDynamics/Exciter/ESDC2A/README.md
index 29c3028ff..da01f2157 100644
--- a/GridKit/Model/PhasorDynamics/Exciter/ESDC2A/README.md
+++ b/GridKit/Model/PhasorDynamics/Exciter/ESDC2A/README.md
@@ -17,11 +17,9 @@ Notes:
Standard model of the ESDC2A Exciter.
-
-

+
- Figure 1: Exciter ESDC2A model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Exciter ESDC2A model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -167,7 +165,7 @@ $\omega$ | [p.u.] | Machine speed deviation
\end{aligned}
```
-CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator)
+CommonMath defines the [Anti-Windup](../../../../CommonMath.md#antiwindup)
target and smooth approximation.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Exciter/ESST4B/README.md b/GridKit/Model/PhasorDynamics/Exciter/ESST4B/README.md
index fa77d9030..27ae8e018 100644
--- a/GridKit/Model/PhasorDynamics/Exciter/ESST4B/README.md
+++ b/GridKit/Model/PhasorDynamics/Exciter/ESST4B/README.md
@@ -18,11 +18,9 @@ Notes:
Standard model of the ESST4B Exciter.
-
-

+
- Figure 1: Exciter ESST4B model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Exciter ESST4B model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -151,7 +149,7 @@ $I_{\mathrm{fd}}$ | [p.u.] | Machine field current
\end{aligned}
```
-CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator)
+CommonMath defines the [Anti-Windup](../../../../CommonMath.md#antiwindup)
target and smooth approximation.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Exciter/EXAC1/README.md b/GridKit/Model/PhasorDynamics/Exciter/EXAC1/README.md
index bbf7a68b3..31f04139a 100644
--- a/GridKit/Model/PhasorDynamics/Exciter/EXAC1/README.md
+++ b/GridKit/Model/PhasorDynamics/Exciter/EXAC1/README.md
@@ -16,11 +16,9 @@ Notes:
Standard model of the EXAC1 Exciter.
-
-

+
- Figure 1: Exciter EXAC1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Exciter EXAC1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -153,7 +151,7 @@ $\omega$ | [p.u.] | Machine speed deviation
\end{aligned}
```
-CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator)
+CommonMath defines the [Anti-Windup](../../../../CommonMath.md#antiwindup)
target and smooth approximation.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Exciter/EXAC2/README.md b/GridKit/Model/PhasorDynamics/Exciter/EXAC2/README.md
index 3ec486d00..f957d31ff 100644
--- a/GridKit/Model/PhasorDynamics/Exciter/EXAC2/README.md
+++ b/GridKit/Model/PhasorDynamics/Exciter/EXAC2/README.md
@@ -16,11 +16,9 @@ Notes:
Standard model of the EXAC2 Exciter.
-
-

+
- Figure 1: Exciter EXAC2 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Exciter EXAC2 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -150,7 +148,7 @@ $\omega$ | [p.u.] | Machine speed deviation
\end{aligned}
```
-CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator)
+CommonMath defines the [Anti-Windup](../../../../CommonMath.md#antiwindup)
target and smooth approximation.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Exciter/EXDC1/README.md b/GridKit/Model/PhasorDynamics/Exciter/EXDC1/README.md
index 3b6c75108..db6f96886 100644
--- a/GridKit/Model/PhasorDynamics/Exciter/EXDC1/README.md
+++ b/GridKit/Model/PhasorDynamics/Exciter/EXDC1/README.md
@@ -4,11 +4,9 @@
> This documentation is not in the standard format and EXDC1 is not scheduled to be developed as of 06/26/2025.
-
-

-
- Figure 1: Exciter EXDC1 model. Figure courtesy of [PoweWorld](https://www.powerworld.com/WebHelp/).
-
+
+
+Figure 1: Exciter EXDC1 model. Figure courtesy of [PoweWorld](https://www.powerworld.com/WebHelp/).
## Nomenclature
diff --git a/GridKit/Model/PhasorDynamics/Exciter/EXPIC1/README.md b/GridKit/Model/PhasorDynamics/Exciter/EXPIC1/README.md
index 1073c54ac..fe51dbaca 100644
--- a/GridKit/Model/PhasorDynamics/Exciter/EXPIC1/README.md
+++ b/GridKit/Model/PhasorDynamics/Exciter/EXPIC1/README.md
@@ -17,11 +17,9 @@ Notes:
Standard model of the EXPIC1 Exciter.
-
-

+
- Figure 1: Exciter EXPIC1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Exciter EXPIC1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -164,7 +162,7 @@ $I_{\mathrm{fd}}$ | [p.u.] | Machine field current
\end{aligned}
```
-CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator)
+CommonMath defines the [Anti-Windup](../../../../CommonMath.md#antiwindup)
target and smooth approximation.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/README.md b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/README.md
index 9bb2ef5fb..d6b252825 100644
--- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/README.md
+++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/README.md
@@ -9,12 +9,9 @@ Notes:
- The current implementation uses its `Bus` reference as a proxy for $E_C$.
- This direct coupling affects numerical conditioning; production models typically use a decoupling reactance for the exciter-current path that forms $E_C$.
-
-

+
-
- Figure 1: Exciter IEEET1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Exciter IEEET1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -133,7 +130,7 @@ so that $\dot V_R$ is the anti-windup limited derivative.
\end{aligned}
```
-CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator) target and smooth approximation.
+CommonMath defines the [Anti-Windup](../../../../CommonMath.md#antiwindup) target and smooth approximation.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Exciter/SCRX/README.md b/GridKit/Model/PhasorDynamics/Exciter/SCRX/README.md
index 8d53d83b2..e5eca2ed8 100644
--- a/GridKit/Model/PhasorDynamics/Exciter/SCRX/README.md
+++ b/GridKit/Model/PhasorDynamics/Exciter/SCRX/README.md
@@ -18,11 +18,9 @@ Notes:
Standard model of the SCRX Exciter.
-
-

+
- Figure 1: Exciter SCRX model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Exciter SCRX model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -118,7 +116,7 @@ $V_{\mathrm{oel}}$ | [p.u.] | Over-excitation limiter input
\end{aligned}
```
-CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator)
+CommonMath defines the [Anti-Windup](../../../../CommonMath.md#antiwindup)
target and smooth approximation.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/README.md b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/README.md
index 5ee75a980..ba79674d6 100644
--- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/README.md
+++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/README.md
@@ -4,11 +4,9 @@
Simplified excitation system model.
-
-

+
- Figure 1: Exciter SEXS-PTI model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Exciter SEXS-PTI model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -84,7 +82,7 @@ so that $\dot E_{fd}$ can be written in piecewise form compactly.
\end{aligned}
```
-In simulation the piecewise form above is replaced with a smooth approximation where $\phi$ is GridKit's smooth anti-windup indicator. See [CommonMath: Anti-Windup Indicator](../../../../CommonMath.md#anti-windup-indicator) for its definition, behavior, and design rationale.
+In simulation the piecewise form above is replaced with a smooth approximation where $\phi$ is GridKit's smooth anti-windup indicator. See [CommonMath: Anti-Windup Indicator](../../../../CommonMath.md#antiwindup) for its definition, behavior, and design rationale.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md b/GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md
index 2cf037d9e..4b14a4662 100644
--- a/GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md
+++ b/GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md
@@ -19,11 +19,9 @@ Notes:
Standard model of the GGOV1 Governor.
-
-

+
- Figure 1: Governor GGOV1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Governor GGOV1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -176,7 +174,7 @@ $\omega$ | [p.u.] | Machine speed deviation
\end{aligned}
```
-CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator)
+CommonMath defines the [Anti-Windup](../../../../CommonMath.md#antiwindup)
target and smooth approximation.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Governor/IEEEG1/README.md b/GridKit/Model/PhasorDynamics/Governor/IEEEG1/README.md
index c6e775e37..e2bfc8a6e 100644
--- a/GridKit/Model/PhasorDynamics/Governor/IEEEG1/README.md
+++ b/GridKit/Model/PhasorDynamics/Governor/IEEEG1/README.md
@@ -20,11 +20,9 @@ Notes:
Standard model of the IEEEG1 Governor.
-
-

+
- Figure 1: Governor IEEEG1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Governor IEEEG1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -170,7 +168,7 @@ $P_{\mathrm{aux}}$ | [p.u.] | Auxiliary power input | Sour
\end{aligned}
```
-CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator)
+CommonMath defines the [Anti-Windup](../../../../CommonMath.md#antiwindup)
target and smooth approximation.
### Algebraic Equations
diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/README.md b/GridKit/Model/PhasorDynamics/Governor/Tgov1/README.md
index c51dc72b1..8e57404da 100644
--- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/README.md
+++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/README.md
@@ -4,11 +4,9 @@
Standard model of the stream turbine
-
-

-
- Figure 1: Governor TGOV1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+
+
+Figure 1: Governor TGOV1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
@@ -83,7 +81,7 @@ The algebraic equation dictating the mechnical power output.
\end{aligned}
```
-In simulation the piecewise form above is replaced with a smooth approximation where $\phi$ is GridKit's smooth anti-windup indicator. See [CommonMath: Anti-Windup Indicator](../../../../CommonMath.md#anti-windup-indicator) for its definition, behavior, and design rationale.
+In simulation the piecewise form above is replaced with a smooth approximation where $\phi$ is GridKit's smooth anti-windup indicator. See [CommonMath: Anti-Windup Indicator](../../../../CommonMath.md#antiwindup) for its definition, behavior, and design rationale.
## Initialization
At steady state we assume that $P_v$ is at or within its limits. This implies the initial conditions are a function of $P_m$ which is equal to the electric torque.
diff --git a/GridKit/Model/PhasorDynamics/SignalNode/README.md b/GridKit/Model/PhasorDynamics/SignalNode/README.md
new file mode 100644
index 000000000..c05d85a0d
--- /dev/null
+++ b/GridKit/Model/PhasorDynamics/SignalNode/README.md
@@ -0,0 +1,15 @@
+# Signal Node
+
+Signal nodes provide scalar connection points between phasor-dynamics
+components. Components attach external inputs to signal nodes and assign
+internal outputs to signal nodes through `ComponentSignals`.
+
+A linked signal node stores a pointer to the component variable that owns the
+signal value, so other connected components can read or initialize that value
+without owning the producing model.
+
+## Model Parameters
+
+Symbol | Description
+-------|------------
+`signal_id` | Unique identifier for the signal node
diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md
index d01c45be3..e5765ba1a 100644
--- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md
+++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md
@@ -5,11 +5,9 @@ blocks, washout, and output limiter.
## Block Diagram
-
-

+
- Figure 1: Stabilizer IEEEST model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Stabilizer IEEEST model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/PSS1A/README.md b/GridKit/Model/PhasorDynamics/Stabilizer/PSS1A/README.md
index f380cc21c..6f3ba0cc1 100644
--- a/GridKit/Model/PhasorDynamics/Stabilizer/PSS1A/README.md
+++ b/GridKit/Model/PhasorDynamics/Stabilizer/PSS1A/README.md
@@ -8,14 +8,9 @@
-
-

-
-
- Figure 1: Power system stabilizer PSS1A model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
-
+
+Figure 1: Power system stabilizer PSS1A model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/README.md b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/README.md
index ea8607359..96679af3f 100644
--- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/README.md
+++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/README.md
@@ -9,12 +9,10 @@ Notes:
- Same relative amount of saturation occurs on both $d$ and $q$ axis
## Block Diagram
-
-

-
- Figure 2: GENROU. Figure courtesy of
- [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+
+
+Figure 2: GENROU. Figure courtesy of
+[PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/README.md b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/README.md
index bcb0136a7..8bbf0a206 100644
--- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/README.md
+++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/README.md
@@ -13,12 +13,10 @@ Notes:
- Only d-axis affected by saturation
## Block Diagram
-
-

+
- Figure 2: GENSAL. Figure courtesy of
- [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 2: GENSAL. Figure courtesy of
+[PowerWorld](https://www.powerworld.com/WebHelp/)
## Model Parameters
diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/README.md b/GridKit/Model/PhasorDynamics/SynchronousMachine/README.md
index e7fd5fbc9..39c86cc2d 100644
--- a/GridKit/Model/PhasorDynamics/SynchronousMachine/README.md
+++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/README.md
@@ -2,12 +2,10 @@
## Convention
-
-

+
- Figure 1: Synchronous Machine. Figure courtesy of
- [PowerWorld](https://www.powerworld.com/files/Synchronous-Machines.pdf/)
-
+Figure 1: Synchronous Machine. Figure courtesy of
+[PowerWorld](https://www.powerworld.com/files/Synchronous-Machines.pdf/)
The following conventions are used for the d-q reference frame.
- The q-axis leads the d-axis
diff --git a/GridKit/Model/PowerFlow/Branch/README.md b/GridKit/Model/PowerFlow/Branch/README.md
index 3440da3eb..c9c8eb06a 100644
--- a/GridKit/Model/PowerFlow/Branch/README.md
+++ b/GridKit/Model/PowerFlow/Branch/README.md
@@ -6,12 +6,9 @@ Transmission lines and different types of transformers (traditional, Load Tap-Ch
The most common circuit that is used to represent the transmission line model is $`\pi`$ circuit as shown in Figure 1. The nominal flow direction is from sending bus _s_ to receiving bus _r_.
-
-

-
-
- Figure 1: Transmission line $`\pi`$ equivalent circuit
-
+
+
+Figure 1: Transmission line $`\pi`$ equivalent circuit
Here
``` math
@@ -107,13 +104,9 @@ These quantities are treated as _loads_ and are substracted from $`P`$ and $`Q`$
The branch model can be created by adding the ideal transformer in series with the $`\pi`$ circuit as shown in Figure 2 where $`\tau`$ is a tap ratio magnitude and $`\theta_{shift}`$is the phase shift angle.
-
-

-
-
- Figure 2: Branch equivalent circuit
-
+
+Figure 2: Branch equivalent circuit
The branch admitance matrix is then:
diff --git a/GridKit/Model/PowerFlow/Bus/README.md b/GridKit/Model/PowerFlow/Bus/README.md
index c67f718cc..d7f2288cb 100644
--- a/GridKit/Model/PowerFlow/Bus/README.md
+++ b/GridKit/Model/PowerFlow/Bus/README.md
@@ -27,14 +27,9 @@ There exist two:
- *Generator convention*: current **leaves** positive terminal of the circuit element, and if P(Q) is positive that means power is **delivered**, or if negative then it is **absorbed**.
-
-

-
-
- Figure 1: Sign convention for the power flow at the bus $`i`$
-
-
+
+Figure 1: Sign convention for the power flow at the bus $`i`$
Using the previously defined sign convention, real and reactive power **delivered** to bus $`i`$ are then defined as follows:
diff --git a/README.md b/README.md
index 58a252f7b..379856292 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,9 @@ framework could be used in other areas without major modifications.
GridKit™ supports adding multiple families of models to provide different
representations of power grids and possibly other complex engineered systems.
+- Documentation is hosted on [ReadTheDocs](https://gridkit.readthedocs.io/en/latest/)
+- Source code is hosted on [GitHub](https://github.com/ORNL/GridKit)
+
## Installation Guide
GridKit™ has been built and tested on Linux and Mac platforms. It should
diff --git a/application/PhasorDynamics/README.md b/application/PhasorDynamics/README.md
index c3da80264..7f7d0f902 100644
--- a/application/PhasorDynamics/README.md
+++ b/application/PhasorDynamics/README.md
@@ -12,7 +12,7 @@
`reference_file` | A string containing the name of the case
`error_tolerance` | A string containing the name of the case
-[^1]: See system model [case format](../../Model/PhasorDynamics/INPUT_FORMAT.md)
+[^1]: See system model [case format](../../GridKit/Model/PhasorDynamics/INPUT_FORMAT.md)
## Events
diff --git a/docs/Doxyfile b/docs/Doxyfile
new file mode 100644
index 000000000..8564e075e
--- /dev/null
+++ b/docs/Doxyfile
@@ -0,0 +1,17 @@
+PROJECT_NAME = "GridKit"
+OUTPUT_DIRECTORY = .
+
+INPUT = ../GridKit
+RECURSIVE = YES
+EXCLUDE_PATTERNS = *.md
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = ..
+
+GENERATE_HTML = NO
+GENERATE_LATEX = NO
+GENERATE_XML = YES
+XML_OUTPUT = xml
+XML_PROGRAMLISTING = NO
+
+EXTRACT_ALL = YES
+QUIET = YES
diff --git a/docs/GridKit/CommonMath.md b/docs/GridKit/CommonMath.md
new file mode 100644
index 000000000..5c5b8a5fa
--- /dev/null
+++ b/docs/GridKit/CommonMath.md
@@ -0,0 +1,6 @@
+# CommonMath
+
+```{include} ../../GridKit/CommonMath.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/EMT/Bus/README.md b/docs/GridKit/Model/EMT/Bus/README.md
new file mode 100644
index 000000000..251bb5167
--- /dev/null
+++ b/docs/GridKit/Model/EMT/Bus/README.md
@@ -0,0 +1,6 @@
+# Bus
+
+```{include} ../../../../../GridKit/Model/EMT/Bus/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/EMT/Component/Branch/BranchLumpedConstant/README.md b/docs/GridKit/Model/EMT/Component/Branch/BranchLumpedConstant/README.md
new file mode 100644
index 000000000..9f3caaec5
--- /dev/null
+++ b/docs/GridKit/Model/EMT/Component/Branch/BranchLumpedConstant/README.md
@@ -0,0 +1,6 @@
+# BranchLumpedConstant
+
+```{include} ../../../../../../../GridKit/Model/EMT/Component/Branch/BranchLumpedConstant/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/EMT/Component/Branch/README.md b/docs/GridKit/Model/EMT/Component/Branch/README.md
new file mode 100644
index 000000000..27dca5bee
--- /dev/null
+++ b/docs/GridKit/Model/EMT/Component/Branch/README.md
@@ -0,0 +1,14 @@
+# Branch
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+BranchLumpedConstant
+```
+
+```{include} ../../../../../../GridKit/Model/EMT/Component/Branch/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/EMT/Component/LoadRL/README.md b/docs/GridKit/Model/EMT/Component/LoadRL/README.md
new file mode 100644
index 000000000..ce5aa7f65
--- /dev/null
+++ b/docs/GridKit/Model/EMT/Component/LoadRL/README.md
@@ -0,0 +1,6 @@
+# LoadRL
+
+```{include} ../../../../../../GridKit/Model/EMT/Component/LoadRL/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/EMT/Component/README.md b/docs/GridKit/Model/EMT/Component/README.md
new file mode 100644
index 000000000..587ecb957
--- /dev/null
+++ b/docs/GridKit/Model/EMT/Component/README.md
@@ -0,0 +1,16 @@
+# Component
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+Branch
+LoadRL
+VoltageSource
+```
+
+```{include} ../../../../../GridKit/Model/EMT/Component/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/EMT/Component/VoltageSource/README.md b/docs/GridKit/Model/EMT/Component/VoltageSource/README.md
new file mode 100644
index 000000000..fd8ce8d32
--- /dev/null
+++ b/docs/GridKit/Model/EMT/Component/VoltageSource/README.md
@@ -0,0 +1,6 @@
+# VoltageSource
+
+```{include} ../../../../../../GridKit/Model/EMT/Component/VoltageSource/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/EMT/README.md b/docs/GridKit/Model/EMT/README.md
new file mode 100644
index 000000000..7a6e5fe76
--- /dev/null
+++ b/docs/GridKit/Model/EMT/README.md
@@ -0,0 +1,15 @@
+# EMT
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+Bus
+Component
+```
+
+```{include} ../../../../GridKit/Model/EMT/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Branch/README.md b/docs/GridKit/Model/PhasorDynamics/Branch/README.md
new file mode 100644
index 000000000..f1adc4f9d
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Branch/README.md
@@ -0,0 +1,6 @@
+# Branch
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/Branch/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Bus/README.md b/docs/GridKit/Model/PhasorDynamics/Bus/README.md
new file mode 100644
index 000000000..7ef7e2a7c
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Bus/README.md
@@ -0,0 +1,6 @@
+# Bus
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/Bus/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/BusFault/README.md b/docs/GridKit/Model/PhasorDynamics/BusFault/README.md
new file mode 100644
index 000000000..5e8126a10
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/BusFault/README.md
@@ -0,0 +1,6 @@
+# BusFault
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/BusFault/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/BusToSignalAdapter/README.md b/docs/GridKit/Model/PhasorDynamics/BusToSignalAdapter/README.md
new file mode 100644
index 000000000..7189c86bd
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/BusToSignalAdapter/README.md
@@ -0,0 +1,6 @@
+# BusToSignalAdapter
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/BusToSignalAdapter/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Converter/README.md b/docs/GridKit/Model/PhasorDynamics/Converter/README.md
new file mode 100644
index 000000000..fa56e8dd8
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Converter/README.md
@@ -0,0 +1,16 @@
+# Converter
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+REGCA
+REGCB
+REECA
+```
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/Converter/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Converter/REECA/README.md b/docs/GridKit/Model/PhasorDynamics/Converter/REECA/README.md
new file mode 100644
index 000000000..e84371269
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Converter/REECA/README.md
@@ -0,0 +1,6 @@
+# REECA
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Converter/REECA/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Converter/REGCA/README.md b/docs/GridKit/Model/PhasorDynamics/Converter/REGCA/README.md
new file mode 100644
index 000000000..499bb0c57
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Converter/REGCA/README.md
@@ -0,0 +1,6 @@
+# REGCA
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Converter/REGCA/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Converter/REGCB/README.md b/docs/GridKit/Model/PhasorDynamics/Converter/REGCB/README.md
new file mode 100644
index 000000000..d19a58851
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Converter/REGCB/README.md
@@ -0,0 +1,6 @@
+# REGCB
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Converter/REGCB/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/ESAC6A/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/ESAC6A/README.md
new file mode 100644
index 000000000..435254723
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/ESAC6A/README.md
@@ -0,0 +1,6 @@
+# ESAC6A
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Exciter/ESAC6A/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/ESDC2A/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/ESDC2A/README.md
new file mode 100644
index 000000000..eaf45c4b8
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/ESDC2A/README.md
@@ -0,0 +1,6 @@
+# ESDC2A
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Exciter/ESDC2A/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/ESST4B/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/ESST4B/README.md
new file mode 100644
index 000000000..55d73db77
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/ESST4B/README.md
@@ -0,0 +1,6 @@
+# ESST4B
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Exciter/ESST4B/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/EXAC1/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/EXAC1/README.md
new file mode 100644
index 000000000..5a46913bb
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/EXAC1/README.md
@@ -0,0 +1,6 @@
+# EXAC1
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Exciter/EXAC1/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/EXAC2/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/EXAC2/README.md
new file mode 100644
index 000000000..2ca7536f6
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/EXAC2/README.md
@@ -0,0 +1,6 @@
+# EXAC2
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Exciter/EXAC2/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/EXDC1/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/EXDC1/README.md
new file mode 100644
index 000000000..fc7417fe8
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/EXDC1/README.md
@@ -0,0 +1,6 @@
+# EXDC1
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Exciter/EXDC1/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/EXPIC1/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/EXPIC1/README.md
new file mode 100644
index 000000000..d04c95c7f
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/EXPIC1/README.md
@@ -0,0 +1,6 @@
+# EXPIC1
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Exciter/EXPIC1/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/IEEET1/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/IEEET1/README.md
new file mode 100644
index 000000000..9064ca815
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/IEEET1/README.md
@@ -0,0 +1,6 @@
+# IEEET1
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Exciter/IEEET1/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/README.md
new file mode 100644
index 000000000..2980fd53c
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/README.md
@@ -0,0 +1,23 @@
+# Exciter
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+ESAC6A
+IEEET1
+EXDC1
+ESDC2A
+EXAC1
+ESST4B
+SCRX
+EXAC2
+EXPIC1
+SEXS-PTI
+```
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/Exciter/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/SCRX/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/SCRX/README.md
new file mode 100644
index 000000000..ada503dab
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/SCRX/README.md
@@ -0,0 +1,6 @@
+# SCRX
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Exciter/SCRX/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/README.md b/docs/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/README.md
new file mode 100644
index 000000000..05c770732
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/README.md
@@ -0,0 +1,6 @@
+# SEXS-PTI
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md b/docs/GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md
new file mode 100644
index 000000000..16bd080c5
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md
@@ -0,0 +1,6 @@
+# GGOV1
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Governor/IEEEG1/README.md b/docs/GridKit/Model/PhasorDynamics/Governor/IEEEG1/README.md
new file mode 100644
index 000000000..e0c238862
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Governor/IEEEG1/README.md
@@ -0,0 +1,6 @@
+# IEEEG1
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Governor/IEEEG1/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Governor/README.md b/docs/GridKit/Model/PhasorDynamics/Governor/README.md
new file mode 100644
index 000000000..fe3d5b5b7
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Governor/README.md
@@ -0,0 +1,16 @@
+# Governor
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+TGOV1
+IEEEG1
+GGOV1
+```
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/Governor/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Governor/Tgov1/README.md b/docs/GridKit/Model/PhasorDynamics/Governor/Tgov1/README.md
new file mode 100644
index 000000000..fe595d696
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Governor/Tgov1/README.md
@@ -0,0 +1,6 @@
+# TGOV1
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Governor/Tgov1/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/INPUT_FORMAT.md b/docs/GridKit/Model/PhasorDynamics/INPUT_FORMAT.md
new file mode 100644
index 000000000..5b290cfae
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/INPUT_FORMAT.md
@@ -0,0 +1,6 @@
+# Input Format
+
+```{include} ../../../../GridKit/Model/PhasorDynamics/INPUT_FORMAT.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Load/README.md b/docs/GridKit/Model/PhasorDynamics/Load/README.md
new file mode 100644
index 000000000..d595e2985
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Load/README.md
@@ -0,0 +1,6 @@
+# Load
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/Load/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/LoadZIP/README.md b/docs/GridKit/Model/PhasorDynamics/LoadZIP/README.md
new file mode 100644
index 000000000..632aa337d
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/LoadZIP/README.md
@@ -0,0 +1,6 @@
+# LoadZIP
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/LoadZIP/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/README.md b/docs/GridKit/Model/PhasorDynamics/README.md
new file mode 100644
index 000000000..cc93a9d23
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/README.md
@@ -0,0 +1,26 @@
+# PhasorDynamics
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+Input Format
+Branch
+Bus
+BusFault
+BusToSignalAdapter
+Converter
+Exciter
+Governor
+Load
+LoadZIP
+SignalNode
+Stabilizer
+SynchronousMachine
+```
+
+```{include} ../../../../GridKit/Model/PhasorDynamics/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/SignalNode/README.md b/docs/GridKit/Model/PhasorDynamics/SignalNode/README.md
new file mode 100644
index 000000000..41e8eea1a
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/SignalNode/README.md
@@ -0,0 +1,6 @@
+# SignalNode
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/SignalNode/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md b/docs/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md
new file mode 100644
index 000000000..2b75014c8
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md
@@ -0,0 +1,6 @@
+# IEEEST
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Stabilizer/PSS1A/README.md b/docs/GridKit/Model/PhasorDynamics/Stabilizer/PSS1A/README.md
new file mode 100644
index 000000000..1c1c33632
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Stabilizer/PSS1A/README.md
@@ -0,0 +1,6 @@
+# PSS1A
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/Stabilizer/PSS1A/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/Stabilizer/README.md b/docs/GridKit/Model/PhasorDynamics/Stabilizer/README.md
new file mode 100644
index 000000000..d67f66663
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/Stabilizer/README.md
@@ -0,0 +1,15 @@
+# Stabilizer
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+IEEEST
+PSS1A
+```
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/Stabilizer/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/README.md b/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/README.md
new file mode 100644
index 000000000..adaa79d23
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/README.md
@@ -0,0 +1,6 @@
+# GENROU
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/README.md b/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/README.md
new file mode 100644
index 000000000..402e58221
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/README.md
@@ -0,0 +1,6 @@
+# GENSAL
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/README.md b/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/README.md
new file mode 100644
index 000000000..22f3fe8e4
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/README.md
@@ -0,0 +1,6 @@
+# GenClassical
+
+```{include} ../../../../../../GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/README.md b/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/README.md
new file mode 100644
index 000000000..eedbbe0de
--- /dev/null
+++ b/docs/GridKit/Model/PhasorDynamics/SynchronousMachine/README.md
@@ -0,0 +1,16 @@
+# SynchronousMachine
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+GenClassical
+GENROU
+GENSAL
+```
+
+```{include} ../../../../../GridKit/Model/PhasorDynamics/SynchronousMachine/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PowerElectronics/DistributedGenerator/README.md b/docs/GridKit/Model/PowerElectronics/DistributedGenerator/README.md
new file mode 100644
index 000000000..47c358d81
--- /dev/null
+++ b/docs/GridKit/Model/PowerElectronics/DistributedGenerator/README.md
@@ -0,0 +1,5 @@
+# DistributedGenerator
+
+```{include} ../../../../../GridKit/Model/PowerElectronics/DistributedGenerator/README.md
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PowerElectronics/MicrogridBusDQ/README.md b/docs/GridKit/Model/PowerElectronics/MicrogridBusDQ/README.md
new file mode 100644
index 000000000..8f6a8e8e4
--- /dev/null
+++ b/docs/GridKit/Model/PowerElectronics/MicrogridBusDQ/README.md
@@ -0,0 +1,5 @@
+# MicrogridBusDQ
+
+```{include} ../../../../../GridKit/Model/PowerElectronics/MicrogridBusDQ/README.md
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PowerElectronics/MicrogridLine/README.md b/docs/GridKit/Model/PowerElectronics/MicrogridLine/README.md
new file mode 100644
index 000000000..9da5568b0
--- /dev/null
+++ b/docs/GridKit/Model/PowerElectronics/MicrogridLine/README.md
@@ -0,0 +1,5 @@
+# MicrogridLine
+
+```{include} ../../../../../GridKit/Model/PowerElectronics/MicrogridLine/README.md
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PowerElectronics/MicrogridLoad/README.md b/docs/GridKit/Model/PowerElectronics/MicrogridLoad/README.md
new file mode 100644
index 000000000..8637cabc0
--- /dev/null
+++ b/docs/GridKit/Model/PowerElectronics/MicrogridLoad/README.md
@@ -0,0 +1,5 @@
+# MicrogridLoad
+
+```{include} ../../../../../GridKit/Model/PowerElectronics/MicrogridLoad/README.md
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PowerElectronics/README.md b/docs/GridKit/Model/PowerElectronics/README.md
new file mode 100644
index 000000000..e6ab491a7
--- /dev/null
+++ b/docs/GridKit/Model/PowerElectronics/README.md
@@ -0,0 +1,16 @@
+# PowerElectronics
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+DistributedGenerator
+MicrogridBusDQ
+MicrogridLine
+MicrogridLoad
+```
+
+```{include} ../../../../GridKit/Model/PowerElectronics/README.md
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PowerFlow/Branch/README.md b/docs/GridKit/Model/PowerFlow/Branch/README.md
new file mode 100644
index 000000000..72bfa3d2a
--- /dev/null
+++ b/docs/GridKit/Model/PowerFlow/Branch/README.md
@@ -0,0 +1,6 @@
+# Branch
+
+```{include} ../../../../../GridKit/Model/PowerFlow/Branch/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PowerFlow/Bus/README.md b/docs/GridKit/Model/PowerFlow/Bus/README.md
new file mode 100644
index 000000000..3c817be13
--- /dev/null
+++ b/docs/GridKit/Model/PowerFlow/Bus/README.md
@@ -0,0 +1,6 @@
+# Bus
+
+```{include} ../../../../../GridKit/Model/PowerFlow/Bus/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PowerFlow/Load/README.md b/docs/GridKit/Model/PowerFlow/Load/README.md
new file mode 100644
index 000000000..2e491131b
--- /dev/null
+++ b/docs/GridKit/Model/PowerFlow/Load/README.md
@@ -0,0 +1,6 @@
+# Load
+
+```{include} ../../../../../GridKit/Model/PowerFlow/Load/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/GridKit/Model/PowerFlow/README.md b/docs/GridKit/Model/PowerFlow/README.md
new file mode 100644
index 000000000..013ad8b5d
--- /dev/null
+++ b/docs/GridKit/Model/PowerFlow/README.md
@@ -0,0 +1,15 @@
+# PowerFlow
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+Branch
+Bus
+Load
+```
+
+```{include} ../../../../GridKit/Model/PowerFlow/README.md
+:relative-images:
+```
diff --git a/docs/GridKit/Model/README.md b/docs/GridKit/Model/README.md
new file mode 100644
index 000000000..d725e4a3a
--- /dev/null
+++ b/docs/GridKit/Model/README.md
@@ -0,0 +1,13 @@
+# Models
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+CommonMath <../CommonMath>
+EMT
+PhasorDynamics
+PowerElectronics
+PowerFlow
+```
diff --git a/docs/INSTALL.md b/docs/INSTALL.md
new file mode 100644
index 000000000..b30e0e212
--- /dev/null
+++ b/docs/INSTALL.md
@@ -0,0 +1,6 @@
+# Installation
+
+```{include} ../INSTALL.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/README.md b/docs/README.md
index 2242f220a..357d7a8e1 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,32 +1,40 @@
-# GridKit Documentation Target
+# GridKit Documentation
-We use CMake's built-in `FindDoxygen` module to generate a target that will
-use Doxygen to build the project documentation.
+GridKit documentation can be built two ways:
-## Building
+1. Read the Docs builds the Sphinx site from `docs/conf.py`.
+2. CMake can build the existing Doxygen HTML target.
+
+## Read the Docs Build
+
+The Read the Docs proof of concept is configured by `.readthedocs.yaml`.
+Static MyST wrapper pages under `docs/` include the repository Markdown
+files directly. Before Sphinx runs, the build generates Doxygen XML:
-The documentation target is excluded from the default set of targets built via
-`make` (or `cmake --build .`). It must be designated explicitly with
```sh
-make GridKitDocs
+rm -rf docs/xml
+cd docs && doxygen Doxyfile
```
-or
+
+To test the same flow locally:
+
```sh
-cmake --build . -t GridKitDocs
+python -m pip install -r docs/requirements.txt
+rm -rf docs/xml
+cd docs && doxygen Doxyfile
+cd ..
+sphinx-build -T -b html docs docs/_build/html
```
-The generated files can be found in the build directory under `docs/html/` and
-the main page is `docs/html/index.html`.
-
-If you wish to inspect the Doxyfile itself, it is generated as
-`docs/Doxyfile.GridKitDocs`.
-
-## Notes
-The reasoning behind taking this approach is as follows:
-
-1. It is easier to maintain just the few options we need to customize rather
- than a whole Doxyfile (leave what can be generated out of the repo); if
- another option is needed, it's easy to look it up.
-2. Since the documentation can be seen as a "product" or "artifact" of the code,
- it makes sense for it to be a buildable "target"
-3. Generated files should not be placed in the source directory. The binary
- directory makes sense for this, and the CMake target makes this easy.
+
+Doxygen XML under `docs/xml`, generated API reference files, and HTML
+output are build artifacts and should not be committed.
+
+## CMake Doxygen Target
+
+The existing CMake target is still available for standalone Doxygen HTML output:
+
+```sh
+cmake --build build -t GridKitDocs
+```
+
+The generated files are written under the build directory.
diff --git a/docs/api.md b/docs/api.md
new file mode 100644
index 000000000..8c60ce7a7
--- /dev/null
+++ b/docs/api.md
@@ -0,0 +1,18 @@
+# API Reference
+
+```{toctree}
+:maxdepth: 1
+:titlesonly:
+:hidden:
+
+GridKit Core
+Solvers
+Phasor Dynamics
+Power Electronics
+Power Flow Data
+Linear Algebra
+Math Utilities
+Model Utilities
+Utilities
+Testing
+```
diff --git a/docs/application/PhasorDynamics/ContingencyAnalysis.md b/docs/application/PhasorDynamics/ContingencyAnalysis.md
new file mode 100644
index 000000000..40ee2c3f9
--- /dev/null
+++ b/docs/application/PhasorDynamics/ContingencyAnalysis.md
@@ -0,0 +1,5 @@
+# ContingencyAnalysis
+
+Source: `application/PhasorDynamics/ContingencyAnalysis.cpp`
+
+Input format: [Phasor Dynamics](README.md)
diff --git a/docs/application/PhasorDynamics/DynamicSimulation.md b/docs/application/PhasorDynamics/DynamicSimulation.md
new file mode 100644
index 000000000..1f7322ec7
--- /dev/null
+++ b/docs/application/PhasorDynamics/DynamicSimulation.md
@@ -0,0 +1,5 @@
+# DynamicSimulation
+
+Source: `application/PhasorDynamics/DynamicSimulation.cpp`
+
+Input format: [Phasor Dynamics](README.md)
diff --git a/docs/application/PhasorDynamics/README.md b/docs/application/PhasorDynamics/README.md
new file mode 100644
index 000000000..10aaadf18
--- /dev/null
+++ b/docs/application/PhasorDynamics/README.md
@@ -0,0 +1,15 @@
+# Phasor Dynamics
+
+```{toctree}
+:maxdepth: 2
+:titlesonly:
+:hidden:
+
+DynamicSimulation
+ContingencyAnalysis
+```
+
+```{include} ../../../application/PhasorDynamics/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/application/README.md b/docs/application/README.md
new file mode 100644
index 000000000..b7faa35c0
--- /dev/null
+++ b/docs/application/README.md
@@ -0,0 +1,9 @@
+# Applications
+
+```{toctree}
+:maxdepth: 3
+:titlesonly:
+:hidden:
+
+Phasor Dynamics
+```
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 000000000..c66dda99f
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,55 @@
+from pathlib import Path
+
+from exhale import utils as exhale_utils
+
+project = "GridKit"
+author = "GridKit Developers"
+
+docs_dir = Path(__file__).parent.resolve()
+
+extensions = ["breathe", "exhale", "myst_parser"]
+
+breathe_projects = {"GridKit": str(docs_dir / "xml")}
+breathe_default_project = "GridKit"
+
+
+# Exhale's default class/struct pages also include protected and undocumented members.
+def public_member_specs(kind):
+ if kind in {"class", "struct"}:
+ return [":members:"]
+ return []
+
+
+exhale_args = {
+ "containmentFolder": "./api/reference",
+ "rootFileName": "EXCLUDE",
+ "doxygenStripFromPath": str(docs_dir.parent),
+ "customSpecificationsMapping": exhale_utils.makeCustomSpecificationsMapping(
+ public_member_specs
+ ),
+ "contentsDirectives": False,
+ "pageLevelConfigMeta": ":orphan:",
+}
+
+primary_domain = "cpp"
+
+html_theme = "sphinx_rtd_theme"
+html_theme_options = {
+ "collapse_navigation": True,
+ "navigation_depth": 6,
+ "titles_only": True,
+}
+
+myst_enable_extensions = [
+ "amsmath",
+ "dollarmath",
+ "html_image",
+]
+myst_fence_as_directive = ["math"]
+myst_heading_anchors = 5
+
+
+exclude_patterns = [
+ "_build",
+ "README.md",
+]
diff --git a/docs/development/CHANGELOG.md b/docs/development/CHANGELOG.md
new file mode 100644
index 000000000..004c4928a
--- /dev/null
+++ b/docs/development/CHANGELOG.md
@@ -0,0 +1,6 @@
+# Changelog
+
+```{include} ../../CHANGELOG.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/development/CONTRIBUTING.md b/docs/development/CONTRIBUTING.md
new file mode 100644
index 000000000..a3db186d1
--- /dev/null
+++ b/docs/development/CONTRIBUTING.md
@@ -0,0 +1,6 @@
+# Contributing
+
+```{include} ../../CONTRIBUTING.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/development/README.md b/docs/development/README.md
new file mode 100644
index 000000000..e6c32e266
--- /dev/null
+++ b/docs/development/README.md
@@ -0,0 +1,12 @@
+# Development
+
+```{toctree}
+:maxdepth: 2
+:titlesonly:
+:hidden:
+
+Contributing
+Buildsystem
+Documentation Build
+Changelog
+```
diff --git a/docs/development/buildsystem/README.md b/docs/development/buildsystem/README.md
new file mode 100644
index 000000000..3d3819565
--- /dev/null
+++ b/docs/development/buildsystem/README.md
@@ -0,0 +1,5 @@
+# Buildsystem
+
+```{include} ../../../buildsystem/README.md
+:relative-images:
+```
diff --git a/docs/development/docs/README.md b/docs/development/docs/README.md
new file mode 100644
index 000000000..06d53cb30
--- /dev/null
+++ b/docs/development/docs/README.md
@@ -0,0 +1,6 @@
+# Documentation Build
+
+```{include} ../../README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/examples/PhasorDynamics/Large/Illinois/README.md b/docs/examples/PhasorDynamics/Large/Illinois/README.md
new file mode 100644
index 000000000..ef619f11a
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Large/Illinois/README.md
@@ -0,0 +1,6 @@
+# Illinois
+
+```{include} ../../../../../examples/PhasorDynamics/Large/Illinois/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/examples/PhasorDynamics/Large/README.md b/docs/examples/PhasorDynamics/Large/README.md
new file mode 100644
index 000000000..3c272648e
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Large/README.md
@@ -0,0 +1,11 @@
+# Large
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+Illinois
+Texas
+WECC
+```
diff --git a/docs/examples/PhasorDynamics/Large/Texas/README.md b/docs/examples/PhasorDynamics/Large/Texas/README.md
new file mode 100644
index 000000000..b6f0a2708
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Large/Texas/README.md
@@ -0,0 +1,6 @@
+# Texas
+
+```{include} ../../../../../examples/PhasorDynamics/Large/Texas/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/examples/PhasorDynamics/Large/WECC/README.md b/docs/examples/PhasorDynamics/Large/WECC/README.md
new file mode 100644
index 000000000..fe16c3a72
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Large/WECC/README.md
@@ -0,0 +1,6 @@
+# WECC
+
+```{include} ../../../../../examples/PhasorDynamics/Large/WECC/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/examples/PhasorDynamics/Medium/Hawaii/README.md b/docs/examples/PhasorDynamics/Medium/Hawaii/README.md
new file mode 100644
index 000000000..b31917834
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Medium/Hawaii/README.md
@@ -0,0 +1,6 @@
+# Hawaii
+
+```{include} ../../../../../examples/PhasorDynamics/Medium/Hawaii/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/examples/PhasorDynamics/Medium/NewEngland/README.md b/docs/examples/PhasorDynamics/Medium/NewEngland/README.md
new file mode 100644
index 000000000..4d2e32cb5
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Medium/NewEngland/README.md
@@ -0,0 +1,6 @@
+# NewEngland
+
+```{include} ../../../../../examples/PhasorDynamics/Medium/NewEngland/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/examples/PhasorDynamics/Medium/README.md b/docs/examples/PhasorDynamics/Medium/README.md
new file mode 100644
index 000000000..6bb0cbca1
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Medium/README.md
@@ -0,0 +1,10 @@
+# Medium
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+Hawaii
+NewEngland
+```
diff --git a/docs/examples/PhasorDynamics/README.md b/docs/examples/PhasorDynamics/README.md
new file mode 100644
index 000000000..c7d2bbf1c
--- /dev/null
+++ b/docs/examples/PhasorDynamics/README.md
@@ -0,0 +1,12 @@
+# PhasorDynamics
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+Large
+Medium
+Small
+Tiny
+```
diff --git a/docs/examples/PhasorDynamics/Small/README.md b/docs/examples/PhasorDynamics/Small/README.md
new file mode 100644
index 000000000..dacd336f8
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Small/README.md
@@ -0,0 +1,9 @@
+# Small
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+TwoArea
+```
diff --git a/docs/examples/PhasorDynamics/Small/TwoArea/README.md b/docs/examples/PhasorDynamics/Small/TwoArea/README.md
new file mode 100644
index 000000000..ae355b039
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Small/TwoArea/README.md
@@ -0,0 +1,6 @@
+# TwoArea
+
+```{include} ../../../../../examples/PhasorDynamics/Small/TwoArea/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/examples/PhasorDynamics/Tiny/README.md b/docs/examples/PhasorDynamics/Tiny/README.md
new file mode 100644
index 000000000..f624a9299
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Tiny/README.md
@@ -0,0 +1,9 @@
+# Tiny
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+TwoBus
+```
diff --git a/docs/examples/PhasorDynamics/Tiny/TwoBus/Gensal/README.md b/docs/examples/PhasorDynamics/Tiny/TwoBus/Gensal/README.md
new file mode 100644
index 000000000..ff711e698
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Tiny/TwoBus/Gensal/README.md
@@ -0,0 +1,6 @@
+# GENSAL
+
+```{include} ../../../../../../examples/PhasorDynamics/Tiny/TwoBus/Gensal/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/examples/PhasorDynamics/Tiny/TwoBus/README.md b/docs/examples/PhasorDynamics/Tiny/TwoBus/README.md
new file mode 100644
index 000000000..812eb7908
--- /dev/null
+++ b/docs/examples/PhasorDynamics/Tiny/TwoBus/README.md
@@ -0,0 +1,9 @@
+# TwoBus
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+GENSAL
+```
diff --git a/docs/examples/PowerElectronics/Microgrid/README.md b/docs/examples/PowerElectronics/Microgrid/README.md
new file mode 100644
index 000000000..a12d20b72
--- /dev/null
+++ b/docs/examples/PowerElectronics/Microgrid/README.md
@@ -0,0 +1,5 @@
+# Microgrid
+
+```{include} ../../../../examples/PowerElectronics/Microgrid/README.md
+:relative-images:
+```
diff --git a/docs/examples/PowerElectronics/README.md b/docs/examples/PowerElectronics/README.md
new file mode 100644
index 000000000..2658685a9
--- /dev/null
+++ b/docs/examples/PowerElectronics/README.md
@@ -0,0 +1,10 @@
+# PowerElectronics
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+Microgrid
+ScaleMicrogrid
+```
diff --git a/docs/examples/PowerElectronics/ScaleMicrogrid/README.md b/docs/examples/PowerElectronics/ScaleMicrogrid/README.md
new file mode 100644
index 000000000..c8d36c436
--- /dev/null
+++ b/docs/examples/PowerElectronics/ScaleMicrogrid/README.md
@@ -0,0 +1,5 @@
+# ScaleMicrogrid
+
+```{include} ../../../../examples/PowerElectronics/ScaleMicrogrid/README.md
+:relative-images:
+```
diff --git a/docs/examples/PowerFlow/Grid3Bus/README.md b/docs/examples/PowerFlow/Grid3Bus/README.md
new file mode 100644
index 000000000..13eceaf03
--- /dev/null
+++ b/docs/examples/PowerFlow/Grid3Bus/README.md
@@ -0,0 +1,6 @@
+# Grid3Bus
+
+```{include} ../../../../examples/PowerFlow/Grid3Bus/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/examples/PowerFlow/README.md b/docs/examples/PowerFlow/README.md
new file mode 100644
index 000000000..a09011b8f
--- /dev/null
+++ b/docs/examples/PowerFlow/README.md
@@ -0,0 +1,9 @@
+# PowerFlow
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+Grid3Bus
+```
diff --git a/docs/examples/README.md b/docs/examples/README.md
new file mode 100644
index 000000000..d06c6f640
--- /dev/null
+++ b/docs/examples/README.md
@@ -0,0 +1,16 @@
+# Examples
+
+```{toctree}
+:maxdepth: 4
+:titlesonly:
+:hidden:
+
+PhasorDynamics
+PowerElectronics
+PowerFlow
+```
+
+```{include} ../../examples/README.md
+:start-line: 1
+:relative-images:
+```
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 000000000..54fc5258d
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,16 @@
+```{include} ../README.md
+:relative-images:
+```
+
+```{toctree}
+:maxdepth: 5
+:titlesonly:
+:hidden:
+
+Installation
+Applications
+Models
+Examples
+API Reference
+Development
+```
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 000000000..7f0c2b7ed
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,5 @@
+sphinx
+breathe
+exhale
+myst-parser
+sphinx-rtd-theme
diff --git a/examples/PhasorDynamics/Large/Illinois/README.md b/examples/PhasorDynamics/Large/Illinois/README.md
index a429de7f8..e4ab9ad8c 100644
--- a/examples/PhasorDynamics/Large/Illinois/README.md
+++ b/examples/PhasorDynamics/Large/Illinois/README.md
@@ -2,11 +2,9 @@
## One-Line Diagram
-
-

+
- Figure 1: Oneline of the ACTIVSg200 Case, from Texas A&M University [Grid Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/activsg200/) (Updated Oneline WIP)
-
+Figure 1: Oneline of the ACTIVSg200 Case, from Texas A&M University [Grid Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/activsg200/) (Updated Oneline WIP)
## Case Description
@@ -20,7 +18,7 @@
[TGOV1](../../../../GridKit/Model/PhasorDynamics/Governor/Tgov1/README.md) | 40
[SEXS-PTI](../../../../GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/README.md) | 40
[LoadZIP](../../../../GridKit/Model/PhasorDynamics/LoadZIP/README.md) | 164
- [SignalNode](../../../../GridKit/Model/PhasorDynamics/SignalNode/) | 120
+ [SignalNode](../../../../GridKit/Model/PhasorDynamics/SignalNode/README.md) | 120
## Data Notes
diff --git a/examples/PhasorDynamics/Large/WECC/README.md b/examples/PhasorDynamics/Large/WECC/README.md
index 373ed3302..efa0e1742 100644
--- a/examples/PhasorDynamics/Large/WECC/README.md
+++ b/examples/PhasorDynamics/Large/WECC/README.md
@@ -2,11 +2,9 @@
## One-Line Diagram
-
-

+
- Figure 1: Oneline of the WECC case of [National Laboratory of the Rockies](https://www.nlr.gov/grid/test-case-repository)
-
+Figure 1: Oneline of the WECC case of [National Laboratory of the Rockies](https://www.nlr.gov/grid/test-case-repository)
## Case Description
@@ -23,7 +21,7 @@ Model | Count
[SEXS-PTI](../../../../GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/README.md) | 103
[IEEEST](../../../../GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md) | 10
[LoadZIP](../../../../GridKit/Model/PhasorDynamics/LoadZIP/README.md) | 146
-[SignalNode](../../../../GridKit/Model/PhasorDynamics/SignalNode/) | 319
+[SignalNode](../../../../GridKit/Model/PhasorDynamics/SignalNode/README.md) | 319
## Data Notes
diff --git a/examples/PhasorDynamics/Medium/Hawaii/README.md b/examples/PhasorDynamics/Medium/Hawaii/README.md
index 9923641ca..3c780c3bb 100644
--- a/examples/PhasorDynamics/Medium/Hawaii/README.md
+++ b/examples/PhasorDynamics/Medium/Hawaii/README.md
@@ -2,11 +2,9 @@
## One-Line Diagram
-
-

+
- Figure 1: Oneline of the synthetic Hawaii case, courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/) (WIP Updated Oneline)
-
+Figure 1: Oneline of the synthetic Hawaii case, courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/) (WIP Updated Oneline)
## Case Description
@@ -21,7 +19,7 @@ Model | Count
[IEEET1](../../../../GridKit/Model/PhasorDynamics/Exciter/IEEET1/README.md) | 39
[IEEEST](../../../../GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md) | 14
[LoadZIP](../../../../GridKit/Model/PhasorDynamics/LoadZIP/README.md) | 28
-[SignalNode](../../../../GridKit/Model/PhasorDynamics/SignalNode/) | 131
+[SignalNode](../../../../GridKit/Model/PhasorDynamics/SignalNode/README.md) | 131
## Data Notes
diff --git a/examples/PhasorDynamics/Medium/NewEngland/README.md b/examples/PhasorDynamics/Medium/NewEngland/README.md
index 2d9e6a449..e34535891 100644
--- a/examples/PhasorDynamics/Medium/NewEngland/README.md
+++ b/examples/PhasorDynamics/Medium/NewEngland/README.md
@@ -2,11 +2,9 @@
## One-Line Diagram
-
-

+
- Figure 1: Oneline of the New England IEEE 39-bus case, courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+Figure 1: Oneline of the New England IEEE 39-bus case, courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Case Description
@@ -21,7 +19,7 @@ Model | Count
[IEEET1](../../../../GridKit/Model/PhasorDynamics/Exciter/IEEET1/README.md) | 10
[IEEEST](../../../../GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/README.md) | 10
[LoadZIP](../../../../GridKit/Model/PhasorDynamics/LoadZIP/README.md) | 19
-[SignalNode](../../../../GridKit/Model/PhasorDynamics/SignalNode/) | 40
+[SignalNode](../../../../GridKit/Model/PhasorDynamics/SignalNode/README.md) | 40
## Events
diff --git a/examples/PhasorDynamics/Small/TwoArea/README.md b/examples/PhasorDynamics/Small/TwoArea/README.md
index 480b4c9ac..55f38f395 100644
--- a/examples/PhasorDynamics/Small/TwoArea/README.md
+++ b/examples/PhasorDynamics/Small/TwoArea/README.md
@@ -2,11 +2,9 @@
## One-Line Diagram
-
-

-
- Figure 1: Oneline of the two-area Case, courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
-
+
+
+Figure 1: Oneline of the two-area Case, courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/)
## Case Description
diff --git a/examples/PhasorDynamics/Tiny/TwoBus/Gensal/README.md b/examples/PhasorDynamics/Tiny/TwoBus/Gensal/README.md
index 475c30031..0d7cf94e2 100644
--- a/examples/PhasorDynamics/Tiny/TwoBus/Gensal/README.md
+++ b/examples/PhasorDynamics/Tiny/TwoBus/Gensal/README.md
@@ -9,8 +9,8 @@ monitored machine states are compared against `GENSAL.ref.csv`.
## Trajectory Comparison
-
+
## Error
-
+
diff --git a/examples/PowerFlow/Grid3Bus/README.md b/examples/PowerFlow/Grid3Bus/README.md
index 943b6f044..ae76d93f1 100644
--- a/examples/PowerFlow/Grid3Bus/README.md
+++ b/examples/PowerFlow/Grid3Bus/README.md
@@ -9,12 +9,9 @@ The mathematical model of the power flow problem is formulated as a set of nonli
The model and its parameters are described in Figure 1:
-
-

-
-
- Figure 1: A simple 3-bus grid example.
-
+
+
+Figure 1: A simple 3-bus grid example.
Problem variables are voltage magnitudes and phases; they are stored in bus objects. Branch and load models do not have any internal variables. Contributions to residual vector for the model are computed in individual component model objects. Residual values are sumed up and stored in buses.
@@ -34,7 +31,7 @@ Q_2 & = & -Q_{L1} &~~~\mathrm{(load ~2)} \\
\end{array}
```
-**Bus 3**: PV bus, stores variable $`\theta_3`$ and residual $`P_3`$. Voltage is set to $`|V_3| \equiv 1.1`$p.u.. Generator $`P_{G3} = 2`$p.u. is attached to it. From the equations for [branch](../../../src/Model/PowerFlow/Branch/README.md) and [generator](../../../src/Model/PowerFlow/Gen/README.md) components, we assemble Bus 3 residual as:
+**Bus 3**: PV bus, stores variable $`\theta_3`$ and residual $`P_3`$. Voltage is set to $`|V_3| \equiv 1.1`$p.u.. Generator $`P_{G3} = 2`$p.u. is attached to it. From the equations for [branch](../../../GridKit/Model/PowerFlow/Branch/README.md) and [generator](../../../GridKit/Model/PowerFlow/README.md) components, we assemble Bus 3 residual as:
```math
\begin{array}{rcll}
P_3 & = &P_{G3} &~~~\mathrm{(generator ~3)} \\