REECB

REECB is a WECC renewable electrical-control model with power-factor, reactive-power, voltage, and active-power command paths for an inverter-coupled resource.[1]

Warning

GridKit does not inherit mva from the associated REGCA model. Set mva to the REGCA component base.[2]

Warning

GridKit does not yet apply the associated generator’s Governor Response Limits modes Down Only and Fixed to REECB.

Notes

  • In direct-voltage mode (\(s_Q=1\), \(s_V=0\)) qext carries a terminal-voltage reference instead of a system-base reactive power.

Block Diagram

REECB electrical-control block diagram

Figure 1: REECB electrical-control model. Figure courtesy of the PowerWorld REEC_B model reference.

Model Parameters

Symbol

Units

JSON

Description

Typical Value

Note

\(S^\mathrm{base}\)

[MVA]

mva

REECB component power base

Required

Must be positive

\(s_\mathrm{pf}\)

[boolean]

PfFlag

Power-factor control selector

false

true = power-factor control, false = reactive-power control

\(s_V\)

[boolean]

VFlag

Voltage-reference selector under \(s_Q=1\)

false

true = cascaded Q-PI voltage command, false = direct external voltage reference

\(s_Q\)

[boolean]

QFlag

Reactive-path selector

false

true = Volt/VAr PI control, false = reactive-current lag

\(s_\mathrm{pq}\)

[boolean]

Pqflag

Converter current-priority selector

false

true = P priority, false = Q priority

\(T_\mathrm{rv}\)

[s]

Trv

Voltage-measurement filter time constant

0.02

State 1 in Fig. 1

\(T_\mathrm{p}\)

[s]

Tp

Electrical-power measurement filter time constant

0.0

State 2 in Fig. 1

\(V^\mathrm{ref}\)

[p.u.]

Vref0

Reactive-current-injection voltage reference

\(V_T\)

Initialized from terminal voltage when omitted

\(V_\mathrm{dip}\)

[p.u.]

Vdip

Low-voltage threshold for the voltage-band gate

0.85

\(V_\mathrm{up}\)

[p.u.]

Vup

High-voltage threshold for the voltage-band gate

1.15

\(D_1^\mathrm{db}\)

[p.u.]

dbd1

Lower deadband threshold for voltage-error response

0.0

\(D_2^\mathrm{db}\)

[p.u.]

dbd2

Upper deadband threshold for voltage-error response

0.0

\(K_\mathrm{qv}\)

[p.u.]

kqv

Reactive-current injection gain

5.0

\(I_{q,\mathrm{inj}}^{\min}\)

[p.u.]

Iql1

Minimum reactive-current injection

-1.1

\(I_{q,\mathrm{inj}}^{\max}\)

[p.u.]

Iqh1

Maximum reactive-current injection

1.1

\(Q^{\max}\)

[p.u.]

Qmax

Maximum reactive-power control output

0.436

\(Q^{\min}\)

[p.u.]

Qmin

Minimum reactive-power control output

-0.436

\(K_\mathrm{qp}\)

[p.u.]

Kqp

Reactive-power controller proportional gain

0.0

\(K_\mathrm{qi}\)

[p.u./s]

Kqi

Reactive-power controller integral gain

0.1

\(V^{\max}\)

[p.u.]

Vmax

Maximum voltage-control output

1.1

\(V^{\min}\)

[p.u.]

Vmin

Minimum voltage-control output

0.9

\(K_\mathrm{vp}\)

[p.u.]

Kvp

Voltage controller proportional gain

18.0

\(K_\mathrm{vi}\)

[p.u./s]

Kvi

Voltage controller integral gain

5.0

\(T_\mathrm{iq}\)

[s]

Tiq

Reactive-current command lag time constant

0.02

State 5 in Fig. 1

\(T_\mathrm{pord}\)

[s]

Tpord

Active-power order filter time constant

0.02

State 6 in Fig. 1

\(R_P^{\max}\)

[p.u./s]

dPmax

Positive active-power order ramp-rate limit

99.0

\(R_P^{\min}\)

[p.u./s]

dPmin

Negative active-power order ramp-rate limit

-99.0

\(P^{\max}\)

[p.u.]

Pmax

Maximum active-power order

1.0

\(P^{\min}\)

[p.u.]

Pmin

Minimum active-power order

0.0

\(I^{\max}\)

[p.u.]

Imax

Maximum converter current

1.3

Real-valued parameters accept real or integer JSON values; selectors require Boolean JSON values.

Parameter Validation

A valid REECB parameter set must satisfy the following conditions:

\[\begin{split}\begin{aligned} S^\mathrm{base} &> 0 \\ T_\mathrm{rv},T_\mathrm{p},T_\mathrm{iq},T_\mathrm{pord} &\ge 0 \\ V_\mathrm{dip} &< V_\mathrm{up} \\ D_1^\mathrm{db} &\le 0 \le D_2^\mathrm{db} \\ K_\mathrm{qv},K_\mathrm{qp},K_\mathrm{qi},K_\mathrm{vp},K_\mathrm{vi} &\ge 0 \\ I_{q,\mathrm{inj}}^{\min} &\le I_{q,\mathrm{inj}}^{\max} \\ Q^{\min} &\le Q^{\max} \\ V^{\min} &\le V^{\max} \\ R_P^{\min} &< 0 < R_P^{\max} \\ P^{\min} &\le P^{\max} \\ I^{\max} &> 0 \end{aligned}\end{split}\]

Enabling both PfFlag and QFlag logs an atypical-configuration warning.

Model Derived Parameters

Let \(\epsilon_T=10^{-3}\ \mathrm{s}\). A time constant below \(\epsilon_T\) is raised to that floor in place, so every equation below uses the raised value:

\[\begin{split}\begin{aligned} T_x &\leftarrow \max(T_x,\epsilon_T), && x\in\{\mathrm{rv},\mathrm{p},\mathrm{iq},\mathrm{pord}\} \\ s_\mathrm{pf}^\mathrm{off} &= 1 - s_\mathrm{pf} \\ s_Q^\mathrm{off} &= 1 - s_Q \\ s_Q^\mathrm{PI} &= s_Q s_V \\ s_V^\mathrm{ref} &= s_Q(1-s_V) \\ s_Q^\mathrm{ref} &= 1 - s_V^\mathrm{ref} \\ s_\mathrm{pq}^\mathrm{off} &= 1 - s_\mathrm{pq} \\ k_\mathrm{base} &= \dfrac{S^\mathrm{sys}}{S^\mathrm{base}} \end{aligned}\end{split}\]

Multiplying by \(k_\mathrm{base}\) converts system base to component base.

Model Ports

Name

Port

Init

Description

bus

Bus

Known

Terminal-bus voltage

pe

Input

Known

Active-power feedback

qgen

Input

Known

Reactive-power feedback

qext

Input

Unknown

Volt/VAr reference

pfaref

Input

Unknown

Power-factor angle reference

pref

Input

Unknown

Active-power reference

iqcmd

Output

Known

Reactive-current command

ipcmd

Output

Known

Active-current command

bus is required; signal ports are optional and must be linked when attached. Known values are seeded before initialization and preserved. Unknown inputs are initialized in attached signal storage or held constant when unattached.

Model Variables

Internal Variables

Differential

Symbol

Units

Description

Note

\(V^\mathrm{meas}\)

[p.u.]

Filtered terminal voltage

State 1 in Fig. 1; Source label: Vmeas

\(P^\mathrm{meas}\)

[p.u.]

Filtered electrical power

State 2 in Fig. 1; Source label: Pmeas; component base

\(x_Q^\mathrm{PI}\)

[p.u.]

Reactive-power PI controller state

State 3 in Fig. 1; Source label: PIQ

\(x_V^\mathrm{PI}\)

[p.u.]

Voltage-control PI controller state

State 4 in Fig. 1; Source label: PIV; component-base current

\(Q_V\)

[p.u.]

Reactive-current command lag state

State 5 in Fig. 1; Source label: Q_V; component base

\(P^\mathrm{ord}\)

[p.u.]

Filtered active-power order

State 6 in Fig. 1; Source label: Pord; component base

Algebraic

Symbol

Units

Description

Note

\(V_T\)

[p.u.]

Terminal voltage magnitude

\(V_\mathrm{safe}^\mathrm{meas}\)

[p.u.]

Safe measured voltage

\(s_\mathrm{dip}\)

[-]

Voltage-band gate

\(I_q^\mathrm{inj}\)

[p.u.]

Reactive-current injection

Component base

\(Q^\mathrm{ref}\)

[p.u.]

Reactive-power reference

Component base

\(e_Q\)

[p.u.]

Reactive-power error

Component base

\(V_Q^\mathrm{PI}\)

[p.u.]

Reactive-power PI output

\(e_V^\mathrm{PI}\)

[p.u.]

Voltage-control error

\(r_P^\mathrm{ord}\)

[p.u./s]

Limited active-power order rate

Component base

\(I_L^\mathrm{cap}\)

[p.u.]

Off-axis current capacity

Component base

\(I_q^{\max}\)

[p.u.]

Reactive-current limit

Component base

\(I_p^{\max}\)

[p.u.]

Active-current limit

Component base

\(I_q^\mathrm{base}\)

[p.u.]

Voltage-controller current

Component base

\(I_q^\mathrm{raw}\)

[p.u.]

Pre-limit reactive-current command

Component base

\(I_q^\mathrm{cmd}\)

[p.u.]

Reactive-current command output

System base

\(I_p^\mathrm{cmd}\)

[p.u.]

Active-current command output

System base

External Variables

Differential

None.

Algebraic

Symbol

Units

Description

Note

\(V_r\)

[p.u.]

Terminal voltage, real component

Bus input

\(V_i\)

[p.u.]

Terminal voltage, imaginary component

Bus input

\(P_\mathrm{e}\)

[p.u.]

Electrical active-power feedback

Optional signal port pe; system base

\(Q^\mathrm{gen}\)

[p.u.]

Reactive-power feedback

Optional signal port qgen; system base

\(Q^\mathrm{ext}\)

[p.u.]

External Volt/VAr reference

Optional signal port qext; terminal voltage in direct-voltage mode

\(\phi^\mathrm{ref}\)

[rad]

Power-factor angle reference

Optional signal port pfaref

\(P^\mathrm{ref}\)

[p.u.]

External active-power reference

Optional signal port pref; system base

Model Equations

Smooth functions: antiwindup, clamp, deadband2, inside, max.

Internal Equations

Differential

\[\begin{split}\begin{aligned} 0 &= -\dot{V}^\mathrm{meas} + \dfrac{1}{T_\mathrm{rv}}(V_T-V^\mathrm{meas}) \\ 0 &= -\dot{P}^\mathrm{meas} + \dfrac{1}{T_\mathrm{p}}(k_\mathrm{base}P_\mathrm{e}-P^\mathrm{meas}) \\ 0 &= -\dot{x}_Q^\mathrm{PI} + s_Q^\mathrm{PI}s_\mathrm{dip}\,\text{antiwindup}(K_\mathrm{qp}e_Q+x_Q^\mathrm{PI},K_\mathrm{qi}e_Q;\,V^{\min},V^{\max}) \\ 0 &= -\dot{x}_V^\mathrm{PI} + s_Qs_\mathrm{dip}\,\text{antiwindup}(K_\mathrm{vp}e_V^\mathrm{PI}+x_V^\mathrm{PI},K_\mathrm{vi}e_V^\mathrm{PI};\,-I_q^{\max},I_q^{\max}) \\ 0 &= -\dot{Q}_V + \dfrac{1}{T_\mathrm{iq}}s_Q^\mathrm{off}s_\mathrm{dip}\left(\dfrac{Q^\mathrm{ref}}{V_\mathrm{safe}^\mathrm{meas}}-Q_V\right) \\ 0 &= -\dot{P}^\mathrm{ord} + s_\mathrm{dip}\,\text{antiwindup}(P^\mathrm{ord},r_P^\mathrm{ord};\,P^{\min},P^{\max}) \end{aligned}\end{split}\]

Algebraic

\[\begin{split}\begin{aligned} 0 &= -V_T^2+V_r^2+V_i^2 \\ 0 &= -V_\mathrm{safe}^\mathrm{meas}+\text{max}(V^\mathrm{meas},0.01) \\ 0 &= -s_\mathrm{dip}+\text{inside}(V_T;\,V_\mathrm{dip},V_\mathrm{up}) \\ 0 &= -I_q^\mathrm{inj}+\text{clamp}\!(K_\mathrm{qv}\text{deadband2}(V^\mathrm{ref}-V^\mathrm{meas};\,D_1^\mathrm{db},D_2^\mathrm{db});\,I_{q,\mathrm{inj}}^{\min},I_{q,\mathrm{inj}}^{\max}) \\ 0 &= -Q^\mathrm{ref}+s_Q^\mathrm{ref}(s_\mathrm{pf}P^\mathrm{meas}\tan(\phi^\mathrm{ref})+s_\mathrm{pf}^\mathrm{off}k_\mathrm{base}Q^\mathrm{ext}) \\ 0 &= -e_Q+\text{clamp}(Q^\mathrm{ref};\,Q^{\min},Q^{\max})-k_\mathrm{base}Q^\mathrm{gen} \\ 0 &= -V_Q^\mathrm{PI}+\text{clamp}(K_\mathrm{qp}e_Q+x_Q^\mathrm{PI};\,V^{\min},V^{\max}) \\ 0 &= -e_V^\mathrm{PI}+s_Q^\mathrm{PI}V_Q^\mathrm{PI}+s_V^\mathrm{ref}Q^\mathrm{ext}-s_QV^\mathrm{meas} \\ 0 &= -r_P^\mathrm{ord}+\text{aslew}\!\left(\dfrac{k_\mathrm{base}P^\mathrm{ref}-P^\mathrm{ord}}{T_\mathrm{pord}};\,R_P^{\min},R_P^{\max}\right) \\ 0 &= -I_L^\mathrm{cap}+\text{sqrtramp}\big((I^{\max}-I^\mathrm{high})(I^{\max}+I^\mathrm{high})\big) \\ 0 &= -I_q^{\max}+s_\mathrm{pq}I_L^\mathrm{cap}+s_\mathrm{pq}^\mathrm{off}I^{\max} \\ 0 &= -I_p^{\max}+s_\mathrm{pq}I^{\max}+s_\mathrm{pq}^\mathrm{off}I_L^\mathrm{cap} \\ 0 &= -I_q^\mathrm{base}+\text{clamp}(K_\mathrm{vp}e_V^\mathrm{PI}+x_V^\mathrm{PI};\,-I_q^{\max},I_q^{\max}) \\ 0 &= -I_q^\mathrm{raw}+s_QI_q^\mathrm{base}+s_Q^\mathrm{off}Q_V+I_q^\mathrm{inj} \\ 0 &= -k_\mathrm{base}I_q^\mathrm{cmd}+\text{clamp}(I_q^\mathrm{raw};\,-I_q^{\max},I_q^{\max}) \\ 0 &= -k_\mathrm{base}I_p^\mathrm{cmd}+\text{clamp}\left(\dfrac{P^\mathrm{ord}}{V_\mathrm{safe}^\mathrm{meas}};\,0,I_p^{\max}\right) \end{aligned}\end{split}\]

Here \(I^\mathrm{high}=s_\mathrm{pq}k_\mathrm{base}I_p^\mathrm{cmd} +s_\mathrm{pq}^\mathrm{off}k_\mathrm{base}I_q^\mathrm{cmd}\) and \(\epsilon_\mathrm{init}=100\epsilon_\mathrm{machine}\). Appendix B defines sqrtramp.

Appendix A defines aslew.

External Equations

None.

Initialization

REECB reconstructs a steady operating point. Arbitrary-state restart is unsupported.

Input Initialization

\[\begin{split}\begin{aligned} V_r,V_i &\leftarrow \text{terminal-bus voltage} \\ I_q^\mathrm{cmd},I_p^\mathrm{cmd} &\leftarrow \text{owned current-command variables} \\ P_\mathrm{e} &\leftarrow \text{attached active-power feedback},\quad \text{if attached} \\ Q^\mathrm{gen} &\leftarrow \text{attached reactive-power feedback},\quad \text{if attached} \end{aligned}\end{split}\]

Internal Initialization

Initialization resolves the steady-state quantities in dependency order; all internal derivatives start at zero. Initialize the component-base commands: \(I_p\leftarrow k_\mathrm{base}I_p^\mathrm{cmd}\) and \(I_q\leftarrow k_\mathrm{base}I_q^\mathrm{cmd}\). REECB’s iclamp helper inverts the smooth CommonMath clamp during initialization. At a bound, REECB uses an outward offset \(\delta=-\ln(\text{expm1}(\mu\epsilon_\mathrm{init}/2))/\mu\) to keep the clamp error within \(\epsilon_\mathrm{init}\); collapsed bounds return the bound.

\[\begin{split}\begin{aligned} V_T &\leftarrow \sqrt{V_r^2+V_i^2} \\ V^\mathrm{ref} &\leftarrow V_T,\quad \text{if omitted} \\ V^\mathrm{meas} &\leftarrow V_T \\ V_\mathrm{safe}^\mathrm{meas} &\leftarrow \text{max}(V^\mathrm{meas},0.01) \\ s_\mathrm{dip} &\leftarrow \text{inside}(V_T;\,V_\mathrm{dip},V_\mathrm{up}) \\ P_\mathrm{e} &\leftarrow V_\mathrm{safe}^\mathrm{meas}I_p^\mathrm{cmd},\quad \text{if unattached} \\ Q^\mathrm{gen} &\leftarrow V_\mathrm{safe}^\mathrm{meas}I_q^\mathrm{cmd},\quad \text{if unattached} \\ P^\mathrm{meas} &\leftarrow k_\mathrm{base}P_\mathrm{e} \\ e_V^\mathrm{db} &\leftarrow \text{deadband2}(V^\mathrm{ref}-V^\mathrm{meas};\,D_1^\mathrm{db},D_2^\mathrm{db}) \\ I_q^\mathrm{inj} &\leftarrow \text{clamp}(K_\mathrm{qv}e_V^\mathrm{db};\,I_{q,\mathrm{inj}}^{\min},I_{q,\mathrm{inj}}^{\max}) \end{aligned}\end{split}\]

Let \(I_q^\mathrm{need}\) be the smooth-clamp input magnitude required to reproduce \(I_q\), including the Volt/VAr recovery margin. Initialization raises \(I^{\max}\), if needed, to a finite limit satisfying

\[\begin{split}\begin{aligned} h &\leftarrow s_\mathrm{pq}I_p+s_\mathrm{pq}^\mathrm{off}|I_q| \\ \ell &\leftarrow s_\mathrm{pq}I_q^\mathrm{need}+s_\mathrm{pq}^\mathrm{off}I_p \\ I &\ge \max(I^{\max},h,\ell,I_q^\mathrm{need}) \\ \text{sqrtramp}\big((I-h)(I+h)\big) &\ge \ell \end{aligned}\end{split}\]

The solution initializes \(I^{\max}\leftarrow I\) and \(I_L^\mathrm{cap}\leftarrow\text{sqrtramp}\big((I-h)(I+h)\big)\). The operating point is rejected if no finite solution exists or the reactive-current injection is incompatible. Q, V, and P limits are expanded as needed; each adjustment logs a warning. This matches PowerWorld’s default Modify Limits and Run treatment of initial limit violations. This preserves the supplied operating point for steady-state initialization; subsequent simulation uses the adjusted limits.

\[\begin{split}\begin{aligned} I_q^\mathrm{raw} &\leftarrow \text{iclamp}(I_q;\,-I_q^{\max},I_q^{\max}) \\ I_q^\mathrm{ctrl} &\leftarrow I_q^\mathrm{raw}-I_q^\mathrm{inj} \\ P^\mathrm{ord} &\leftarrow V_\mathrm{safe}^\mathrm{meas}\text{iclamp}(I_p;\,0,I_p^{\max}) \\ Q^\mathrm{target} &\leftarrow \begin{cases} V_\mathrm{safe}^\mathrm{meas}I_q^\mathrm{ctrl} & s_Q=0 \\ \text{iclamp}(k_\mathrm{base}Q^\mathrm{gen};\,Q^{\min},Q^{\max}) & s_Qs_V=1 \\ 0 & \text{otherwise} \end{cases} \end{aligned}\end{split}\]

The references resolved under Output Initialization give

\[\begin{split}\begin{aligned} Q^\mathrm{ref} &\leftarrow s_Q^\mathrm{ref}(s_\mathrm{pf}P^\mathrm{meas}\tan(\phi^\mathrm{ref})+s_\mathrm{pf}^\mathrm{off}k_\mathrm{base}Q^\mathrm{ext}) \\ e_Q &\leftarrow \text{clamp}(Q^\mathrm{ref};\,Q^{\min},Q^{\max})-k_\mathrm{base}Q^\mathrm{gen} \\ x_Q^\mathrm{PI} &\leftarrow \begin{cases} \text{iclamp}(V^\mathrm{meas};\,V^{\min},V^{\max})-K_\mathrm{qp}e_Q & s_Qs_V=1 \\ 0 & s_Qs_V=0 \end{cases} \\ V_Q^\mathrm{PI} &\leftarrow \text{clamp}(K_\mathrm{qp}e_Q+x_Q^\mathrm{PI};\,V^{\min},V^{\max}) \\ e_V^\mathrm{PI} &\leftarrow s_Q^\mathrm{PI}V_Q^\mathrm{PI}+s_V^\mathrm{ref}Q^\mathrm{ext}-s_QV^\mathrm{meas} \\ x_V^\mathrm{PI} &\leftarrow \begin{cases} -K_\mathrm{vp}e_V^\mathrm{PI} & s_Q=1\ \land\ I_q^{\max}\le\epsilon_\mathrm{init} \\ \text{iclamp}(I_q^\mathrm{ctrl};\,-I_q^{\max},I_q^{\max})-K_\mathrm{vp}e_V^\mathrm{PI} & s_Q=1\ \land\ I_q^{\max}>\epsilon_\mathrm{init} \\ 0 & s_Q=0 \end{cases} \\ Q_V &\leftarrow \begin{cases} 0 & s_Q=1 \\ Q^\mathrm{ref}/V_\mathrm{safe}^\mathrm{meas} & s_Q=0 \end{cases} \\ I_q^\mathrm{base} &\leftarrow \text{clamp}(K_\mathrm{vp}e_V^\mathrm{PI}+x_V^\mathrm{PI};\,-I_q^{\max},I_q^{\max}) \\ I_q^\mathrm{raw} &\leftarrow s_QI_q^\mathrm{base}+s_Q^\mathrm{off}Q_V+I_q^\mathrm{inj} \\ r_P^\mathrm{ord} &\leftarrow 0 \end{aligned}\end{split}\]

Invalid or non-equilibrium operating points are rejected before any state, limit, latch, or signal is changed.

Output Initialization

\[\begin{split}\begin{aligned} \phi^\mathrm{ref} &\leftarrow \begin{cases} \arctan(Q^\mathrm{target}/P^\mathrm{meas}) & s_\mathrm{pf}=1\ \land\ P^\mathrm{meas}\ne0 \\ 0 & \text{otherwise} \end{cases} \\ Q^\mathrm{ext} &\leftarrow \begin{cases} V^\mathrm{meas} & s_V^\mathrm{ref}=1 \\ 0 & s_V^\mathrm{ref}=0\ \land\ s_\mathrm{pf}=1 \\ Q^\mathrm{target}/k_\mathrm{base} & s_V^\mathrm{ref}=0\ \land\ s_\mathrm{pf}=0 \end{cases} \\ P^\mathrm{ref} &\leftarrow \dfrac{P^\mathrm{ord}}{k_\mathrm{base}} \end{aligned}\end{split}\]

REECB writes the resolved references to attached signal inputs; unattached ports retain them as constant inputs.

Monitors

Monitor

Units

Description

Note

iqcmd

[p.u.]

Reactive-current command output

\(I_q^\mathrm{cmd}\) (system base)

ipcmd

[p.u.]

Active-current command output

\(I_p^\mathrm{cmd}\) (system base)

vmeas

[p.u.]

Filtered terminal voltage

\(V^\mathrm{meas}\)

pmeas

[p.u.]

Filtered electrical power

\(P^\mathrm{meas}\) (component base)

Appendix A: aslew

For \(\ell<0<u\), REECB uses

\[\text{aslew}(f;\ell,u) =\dfrac{f}{1+\rho(f/u-1)+\rho(f/\ell-1)}\]

where \(\rho\) is GridKit’s smooth ramp. With exact one-sided ramps this reduces to \(\text{clamp}(f;\ell,u)\); the smooth form preserves \(\text{aslew}(0;\ell,u)=0\).

Appendix B: sqrtramp

The off-axis capacity approaches \(\sqrt{\max(0,s)}\), where \(s=(I^{\max}-I^\mathrm{high})(I^{\max}+I^\mathrm{high})\). Let \(\kappa=\epsilon_\mathrm{init}/\mu\), with \(\mu\) GridKit’s smoothing scale. REECB uses

\[\begin{split}\begin{aligned} h_\kappa(s) &= \tfrac{1}{2}\left(s+\sqrt{s^2+\kappa^2}\right)\\ \text{sqrtramp}(s) &= \dfrac{\mu h_\kappa(s)}{\sqrt{\mu^2 h_\kappa(s)+1}} \end{aligned}\end{split}\]

Both softenings are differentiable for every finite \(s\). The narrow hinge leaves a negligible positive capacity when the circle is closed or over-driven, while preserving the current-command dependence through the transition. Increasing \(\mu\) recovers the exact current-circle leg.