Skip to content

Support zero IEEET1 transducer time constant#439

Open
lukelowry wants to merge 5 commits into
developfrom
lukel/ieeet1-tr-zero-safety
Open

Support zero IEEET1 transducer time constant#439
lukelowry wants to merge 5 commits into
developfrom
lukel/ieeet1-tr-zero-safety

Conversation

@lukelowry

Copy link
Copy Markdown
Collaborator

Description

Support Tr = 0 in the IEEET1 exciter by treating the sensed terminal voltage state as algebraic when the transducer time constant is zero.

This removes the need for small artificial Tr values in validation and example cases.

Proposed changes

  • Tag IEEET1 Vts as algebraic when Tr = 0.
  • Update the IEEET1 README equations to match the implementation and standard notation
  • Update IEEET1 example, validation, and parser-test data so prior tiny Tr placeholders are zero.
  • Add unit-test for the Tr = 0 algebraic behavior.

Checklist

  • All tests pass for the focused coverage listed below.
  • 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.

Changelog changes N/A

Further comments

Early development known issue that did not matter until detailed validation of the larger models.

@lukelowry lukelowry requested a review from pelesh June 5, 2026 23:17
@lukelowry lukelowry added the enhancement New feature or request label Jun 5, 2026
tag_[6] = false; // y6 - ve - Excit. Cntrl Volt
tag_[7] = false; // y7 - efd - Efd
tag_[8] = false; // y8 - ksat - Saturation
tag_[0] = (Tr_ != 0.0); // y0 - vts - Sensed term volt

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are potential issues with comparing a floating point value to 0 like this.

@lukelowry lukelowry Jun 7, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, so I added the smallest possible inequality using epsilon().

There are many models that use zero-valued parameters to control the model's behavior (e.g., a control block bypass). A good way to describe them would be 'parametrically piecewise'. In the fixed time step solvers like PowerWorld, it doesn't even allow $T_r\leq \Delta t/2$ for numeric stability, but of course, we are not constrained by the time step here. We should probably establish a convention for these 'parametrically piecewise' models as they become more common.

We might actually want a way to wire in the minimum time step for IDA into the algebraic flag $T_r\leq \Delta t$, so if we ever allow the user to set a minimum or fixed time step, this model is still stable. This can probably be done for a lot of the equations in other models that take this form (as Power World does). cc @Steven-Roberts

@lukelowry lukelowry force-pushed the lukel/ieeet1-tr-zero-safety branch 2 times, most recently from c34a018 to 8b4586f Compare June 8, 2026 17:47
@lukelowry

Copy link
Copy Markdown
Collaborator Author

Added a fix to the exciter scaling now that $\sigma(x)$ is fixed

@lukelowry lukelowry force-pushed the lukel/ieeet1-tr-zero-safety branch 2 times, most recently from 287b384 to 99c66a9 Compare June 10, 2026 18:56
@lukelowry lukelowry force-pushed the lukel/ieeet1-tr-zero-safety branch from 99c66a9 to 3d0bd28 Compare June 22, 2026 16:34
@lukelowry lukelowry mentioned this pull request Jun 23, 2026
7 tasks

@pelesh pelesh left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a patchwork solution that works only for DAEs defined in fully implicit form. It will not work for any solver taking equations in Hessenberg form.

If this is essential feature needed, I suggest creating an issue flagging this model as potential blocker for Hessenberg-form solvers before merging it to develop.

Also, some minor comments below.

Comment thread GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp Outdated
Comment on lines +76 to 77
$V_{ts}$ | [p.u.] | Sensed terminal voltage | Algebraic when $T_R=0$
$V_R$ | [p.u.] | Voltage regulator |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will create an issue when implementing interface for equations in Hessenberg form. I think a proper solution would be instantiating different models rather than having switch from algebraic to differential using a parameter. When an equation is turned from differential to algebraic, the numerical treatment may be different. In case of IDA solver, it does not matter, but any solver taking equations in Hessenberg form would require different methods for evaluating model equations.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you expound on the meaning of 'different models'? As in we have Ieeet1A and Ieeet1B? That feels like it could be hard to maintain, possibly. I am not opposed, however.

I would say that this type of conditional algebraic/differential is very common, and in the larger cases, you could have some exciters/models with $T=0$ and the other half $T>0$. If we did a variant model for each variable like this, we would need a permutation for each, which could be quite a few....

If you could clarify intent

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We want to eventually have separate methods for evaluating differential and algebraic equations, so instead of one residual function for implicit DAEs, we would have differential equations rhs and algebraic equations residual functions. In that case when the equation changes from differential to algebraic, it should be implemented in different method.

Therefore, we would need separate methods for cases when $T=0$ and $T>0$. The boolean variable Tr_ ! = 0.0 would then decide which pair of methods (differential equation rhs and algebraic equation residual) to use.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is helpful, thank you. I will open an issue for this and list which models need to be addressed.

I am in favor of this form for now, so we don't have to have duplicate equations or helper functions.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Opened #463 for this issue

@pelesh

pelesh commented Jun 24, 2026

Copy link
Copy Markdown
Collaborator

CC @alexander-novo

@lukelowry lukelowry force-pushed the lukel/ieeet1-tr-zero-safety branch from 05fd735 to 80f48a8 Compare June 24, 2026 22:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants