Skip to content

ESDC1A Documentation + Implementation#424

Open
lukelowry wants to merge 3 commits into
developfrom
lukel/esdc1a-dev
Open

ESDC1A Documentation + Implementation#424
lukelowry wants to merge 3 commits into
developfrom
lukel/esdc1a-dev

Conversation

@lukelowry
Copy link
Copy Markdown
Collaborator

@lukelowry lukelowry commented Jun 1, 2026

Description

Implementation and documentation for the ESDC1A PhasorDynamics exciter model.

Proposed changes

  • Added ESDC1A model implementation, documentation, and diagram.
  • Added ESDC1A JSON parsing and SystemModel assembly support.
  • Added focused PhasorDynamicsExciterEsdc1aTest unit coverage.
  • Added sparse Jacobian support through Enzyme and DependencyTracking build paths.
  • Updated exciter registration, input-format docs, and changelog.

Checklist

  • All tests pass (except known PE failure)
  • Code compiles cleanly with flags -Wall -Wpedantic -Wconversion -Wextra.
  • The new code follows GridKit™ style guidelines.
  • There are unit tests for the new code.
  • The new code is documented.
  • The feature branch is rebased with respect to the target branch.
  • I have updated CHANGELOG.md to reflect the changes in this PR.

Further comments (A)

@nkoukpaizan, I keep running into an issue with Enzyme for Exciter models in the control voltage effective input algebraic equation:

const ScalarT ref_err = vref_ - ev;
const ScalarT sig_err = vs - vc;
const ScalarT lim_err = sUEL_ * vuel - vf;
f[EV]                 = ref_err + sig_err + lim_err;

Enzyme fails if that is an inline expression. Sparsity issue. I am not sure if this is intentional, but I finally found a reliable way to circumvent the issue within the model implementation (the code above).

Further comments (B)

@pelesh @abirchfield @alexander-novo

Out of PR scope, but there is a modeling issue that I'd like to raise here:

  • The 'Compensation voltage', $E_C$, typically comes from the machine model instead of the terminal Bus. This is because there is a parameter specified by the machine model (e.g.GENROU) that we do not currently support: $R_{comp}$ and $X_{comp}$. When these are both zero-valued, $E_C=|V_{bus}|$. Sometimes, the compensation reactance is configured to be nonzero specifically to decouple $E_C$ from $|V_{bus}|$ and improve numerical stability. I think there is a broader conversation to be had about how we can model sensed terminal voltage.
  • This exciter as well as IEEET1, locally compute $E_C=\sqrt{V_r^2+V_i^2}$, despite $E_C$ being documented as an external variable. This was a temporary design choice before we had signals.
  • For more advanced grid cases and models, the terminal voltage magnitude is consumed more than once. Therefore, I encourage us to introduce $V_{m}$ as a third internal algebraic variable of Bus, conditionally included based on consumption (otherwise we could introduce unused nonlinear algebraic equations incessantly!). Same for $\theta_{bus}$. I will soon need models that need the bus frequency (i.e., time derivative of $\theta_{bus}$).

Please let me know if I should open distinct issues for these. They are front of mind as I implemented this so I am leaving here for now.

@lukelowry lukelowry marked this pull request as ready for review June 1, 2026 03:23
@lukelowry lukelowry added new model documentation Improvements or additions to documentation and removed documentation Improvements or additions to documentation labels Jun 1, 2026
@lukelowry lukelowry added this to the Texas Completion milestone Jun 1, 2026
@lukelowry lukelowry force-pushed the lukel/esdc1a-dev branch 2 times, most recently from 5c12909 to 9000b94 Compare June 5, 2026 07:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant