SAVI LOOPIQ
Verification · Not marketing

Every tuning rule, verified against textbook references.

Savi LoopIQ ships a 64-case regression corpus that runs on every commit across three independent implementations (Python, Dart, TypeScript). Every rule must produce identical Kc, Ti, Td within a relative tolerance of 1e-6. If the math ever drifts, CI fails and the deploy is blocked.

CI runs on every commitcorpus 64 casestolerance ±1e-6parity Python · Dart · TypeScript
Cases
64
Rules covered
6
Model kinds
FOPDT · SOPDT · IPDT
Verticals
5
Rel. tolerance
1e-6
Abs. tolerance
1e-9

How verification runs

The reference implementation is Python (libloopiq_control_py). Expected Kc, Ti, Td for every case are machine-generated by regression/build_corpus.py and committed to regression/corpus.json. Every push to main and every pull request runs the same corpus through three separate rule engines — Python, Dart, and TypeScript — and asserts each output is within ±1e-6 (relative) or ±1e-9 (absolute) of the reference. If any implementation drifts, CI blocks the merge. The Python job additionally regenerates the corpus and diffs it against the committed file, so a silent rule change cannot slip in without a matching expected-value update.

Rules and academic references

SIMC
Skogestad, S. (2003). Simple analytic rules for model reduction and PID controller tuning. Journal of Process Control, 13(4), 291–309.
https://folk.ntnu.no/skoge/publications/2003/tuningPID/more/skogestad_pid.pdf
IMC
Rivera, D. E., Morari, M., & Skogestad, S. (1986). Internal Model Control: PID Controller Design. I&EC Process Design and Development, 25(1), 252–265.
Lambda
Seborg, D. E., Edgar, T. F., Mellichamp, D. A., & Doyle, F. J. (2016). Process Dynamics and Control (4th ed.), Chapter 12 — Direct Synthesis / Lambda Tuning.
Cohen-Coon
Cohen, G. H., & Coon, G. A. (1953). Theoretical consideration of retarded control. Transactions of the ASME, 75, 827–834.
ZN-OL
Ziegler, J. G., & Nichols, N. B. (1942). Optimum settings for automatic controllers (open-loop / reaction curve). Transactions of the ASME, 64, 759–768.
ZN-CL
Ziegler, J. G., & Nichols, N. B. (1942). Optimum settings for automatic controllers (closed-loop / ultimate cycle). Transactions of the ASME, 64, 759–768.

The corpus — every case

View source on GitHub
IDVerticalLoopRuleModelKcTiTd
ref-01refiningcrude tower reflux flowSIMCFOPDT(Kp=1.2, τ=8, θ=1)3.333380
ref-02refiningcrude tower bottom tempLambdaSOPDT(Kp=0.9, τ₁=45, τ₂=6, θ=8)1.2821450
ref-03refiningvac tower pressureIMCFOPDT(Kp=1.7, τ=15, θ=3)1.764716.51.3636
ref-04refiningreformer feed flowSIMCFOPDT(Kp=1, τ=4, θ=0.3)6.66672.40
ref-05refiningFCC riser temperatureLambdaSOPDT(Kp=1.4, τ₁=30, τ₂=8, θ=12)0.4286300
ref-06refiningalkylation acid ratioIMCSOPDT(Kp=0.8, τ₁=20, τ₂=4, θ=5)3.897126.53.0189
ref-07refininghydrogen makeup pressureSIMCIPDT(Kp=0.05, θ=2.5)4200
ref-08refininggasoline blender ratioCohen-CoonFOPDT(Kp=1, τ=6, θ=1.5)5.58333.350.5217
ref-09refiningcoker drum levelLambdaIPDT(Kp=0.02, θ=4)4.7091340
ref-10refiningsulfur recovery tempSIMCSOPDT(Kp=1.6, τ₁=25, τ₂=5, θ=6)1.3021255
chm-01chemicalsjacket flowSIMCFOPDT(Kp=0.9, τ=3, θ=0.4)4.166730
chm-02chemicalsreactor temperatureIMCSOPDT(Kp=1.2, τ₁=18, τ₂=3.5, θ=2.5)3.611122.752.7692
chm-03chemicalsreactor pressureLambdaFOPDT(Kp=1.5, τ=6, θ=0.8)1.052660
chm-04chemicalspolymer viscosityIMCSOPDT(Kp=2.1, τ₁=40, τ₂=8, θ=10)1.2619536.0377
chm-05chemicalscascade slave flowSIMCFOPDT(Kp=1, τ=2, θ=0.15)6.66671.20
chm-06chemicalsanalyser compositionLambdaSOPDT(Kp=1.3, τ₁=25, τ₂=6, θ=15)0.469250
chm-07chemicalspH neutralisationCohen-CoonFOPDT(Kp=2.5, τ=8, θ=1.5)2.94443.42670.5275
chm-08chemicalsreactor level (integrating)LambdaIPDT(Kp=0.03, θ=1.5)9.07311.50
chm-09chemicalsdistillation reboiler dutySIMCSOPDT(Kp=1.1, τ₁=15, τ₂=3, θ=3)2.2727153
chm-10chemicalscooling water tempIMCFOPDT(Kp=0.7, τ=12, θ=2)4.6429130.9231
wtr-01water_wwaeration DOLambdaFOPDT(Kp=0.4, τ=180, θ=30)51800
wtr-02water_wwchlorine dose (integrating)LambdaIPDT(Kp=0.008, θ=8)7.6531480
wtr-03water_wwfilter influent flowSIMCFOPDT(Kp=1, τ=6, θ=0.5)640
wtr-04water_wwclarifier level (integrating)LambdaIPDT(Kp=0.005, θ=12)6.8047920
wtr-05water_wwpH adjustmentCohen-CoonFOPDT(Kp=3.5, τ=10, θ=2.5)1.59525.58330.8696
wtr-06water_wwraw water intake pressureSIMCFOPDT(Kp=0.6, τ=4, θ=0.3)11.11112.40
wtr-07water_wwsludge blanket depthLambdaSOPDT(Kp=0.9, τ₁=90, τ₂=15, θ=20)1.0526900
wtr-08water_wwpolymer feedIMCFOPDT(Kp=1.8, τ=6, θ=1)1.20376.50.4615
wtr-09water_wwUV lamp intensitySIMCFOPDT(Kp=1, τ=8, θ=0.4)103.20
wtr-10water_wwdigester temperatureLambdaSOPDT(Kp=0.7, τ₁=120, τ₂=25, θ=15)1.42861200
pp-01pulp_paperstock consistencyLambdaFOPDT(Kp=1.1, τ=25, θ=4)1.4205250
pp-02pulp_paperheadbox pressureSIMCFOPDT(Kp=0.8, τ=3, θ=0.2)9.3751.60
pp-03pulp_paperbrightness (scanner)LambdaSOPDT(Kp=1.5, τ₁=35, τ₂=8, θ=18)0.4167350
pp-04pulp_paperbasis weight (scanner)IMCSOPDT(Kp=1.3, τ₁=30, τ₂=6, θ=20)1.011463.913
pp-05pulp_paperdryer steam pressureSIMCSOPDT(Kp=1, τ₁=15, τ₂=3, θ=2)3.75153
pp-06pulp_paperdigester Kappa numberLambdaFOPDT(Kp=2, τ=90, θ=25)0.5294900
pp-07pulp_paperwhite water levelLambdaIPDT(Kp=0.015, θ=3)9.073230
pp-08pulp_paperchip conveyor flowSIMCFOPDT(Kp=1, τ=5, θ=0.6)4.16674.80
pp-09pulp_paperbleach plant pHCohen-CoonFOPDT(Kp=1.8, τ=6, θ=1.2)3.84262.72880.4211
pp-10pulp_papercalender roll tempIMCFOPDT(Kp=1.2, τ=20, θ=3)2.388921.51.3953
pwr-01powerdrum level (integrating)LambdaIPDT(Kp=0.01, θ=5)7.2450
pwr-02powersuperheater outlet tempIMCSOPDT(Kp=1.5, τ₁=40, τ₂=10, θ=15)1.393957.56.9565
pwr-03powerfuel/air ratio slaveSIMCFOPDT(Kp=1, τ=3, θ=0.5)330
pwr-04powerfeedwater flowSIMCFOPDT(Kp=1, τ=2, θ=0.2)51.60
pwr-05powercondenser hotwell levelLambdaIPDT(Kp=0.012, θ=6)4.8561560
pwr-06powergas turbine inlet tempZN-CLFOPDT(Kp=1, τ=8, θ=2)1.924.251.0625
pwr-07powerdeaerator levelLambdaIPDT(Kp=0.008, θ=4)11.7729340
pwr-08powerstack O2LambdaSOPDT(Kp=0.6, τ₁=25, τ₂=8, θ=10)1.0965250
pwr-09powerturbine governor speedZN-OLFOPDT(Kp=1, τ=2, θ=0.3)80.60.15
pwr-10powercooling tower fan pitchIMCFOPDT(Kp=0.9, τ=15, θ=4)2.3611171.7647
gap-imc-fopdt-defaultrefiningIMC FOPDT default lambdaIMCFOPDT(Kp=1.5, τ=12, θ=2)1.9697130.9231
gap-imc-sopdt-defaultchemicalsIMC SOPDT default lambdaIMCSOPDT(Kp=1.1, τ₁=20, τ₂=5, θ=3)3.650126.53.7736
gap-imc-ipdt-defaultpowerIMC IPDT default lambda (M1 regression)IMCIPDT(Kp=0.02, θ=4)5200
gap-imc-ipdt-floorpowerIMC IPDT default lambda floored at 1.0IMCIPDT(Kp=0.05, θ=0.2)18.18182.20
gap-simc-fopdt-defaultrefiningSIMC FOPDT default tauCSIMCFOPDT(Kp=1, τ=10, θ=2)2.5100
gap-simc-ipdt-defaultpowerSIMC IPDT default tauCSIMCIPDT(Kp=0.03, θ=3)5.5556240
gap-lambda-fopdt-defaultchemicalsLambda FOPDT default lambdaLambdaFOPDT(Kp=1.2, τ=8, θ=1.5)0.38180
gap-lambda-ipdt-defaultpowerLambda IPDT default lambdaLambdaIPDT(Kp=0.01, θ=5)11.1111250
gap-imc-fopdt-theta0refiningIMC FOPDT theta=0IMCFOPDT(Kp=1, τ=5, θ=0)450
gap-simc-fopdt-theta0refiningSIMC FOPDT theta=0 (found via a real crash: default tau_c=theta collapsed to 0)SIMCFOPDT(Kp=2, τ=10, θ=0)500.40
gap-simc-ipdt-theta0refiningSIMC IPDT theta=0SIMCIPDT(Kp=1, θ=0)100.40
gap-simc-fopdt-negkpchemicalsSIMC FOPDT reverse-acting (negative Kp)SIMCFOPDT(Kp=-1.4, τ=9, θ=1.5)2.142990
gap-zn-ol-pipowerZN open-loop PIZN-OLFOPDT(Kp=1, τ=6, θ=1)5.43.330
gap-zn-cl-pipowerZN closed-loop PIZN-CLFOPDT(Kp=1, τ=6, θ=1)1.12550

Verify it yourself

The corpus and the three rule engines are open in the public repository. Clone the repo, run any of the three implementations, and diff against the committed expected values. If a case disagrees by more than 1e-6 relative or 1e-9 absolute, we consider it a rule regression.

git clone https://github.com/Savage-4-Lyfe/loopiq
cd loopiq

# Python
pip install -e python/libloopiq_control_py
python regression/run_python_corpus.py

# TypeScript
cd webapp && npm ci && npm test

# Dart
cd ../dart/libloopiq_control && dart pub get && dart test

What this does not claim

Verification proves the tuning rules are implemented correctly against published references. It does not guarantee any particular tuning is safe for your plant, that your process model is accurate, or that your controller structure matches the assumptions of the rule. You are the engineer. Savi LoopIQ is a tool. Read the robustness metrics (Ms, Mt, GM, PM), inspect the Nyquist plot, bump-test conservatively, and stay in the control room during commissioning.

← Back to Savi LoopIQOpen the repository
Methodology · Savi LoopIQ