Skip to the content.

The canonical controls benchmark gives NeqSim one reproducible CI suite for six dynamic control capabilities: level, pressure, cascade temperature, split-range capacity, anti-surge protection, and compressor speed/recycle coordination. It uses the production controller and control-structure classes while keeping each plant model deliberately small and inspectable.

This page reports a deterministic regression qualification, not an independent plant or vendor benchmark. The Java implementation and executable test are the authoritative sources for the equations, schedules, acceptance gates, and published reference values.

Run the complete suite through the public API:

import neqsim.process.controllerdevice.ControlsBenchmarkSuite;

ControlsBenchmarkSuite.Report report = ControlsBenchmarkSuite.runCanonicalSuite();
if (!report.isPassed()) {
  throw new IllegalStateException("Canonical controls benchmark failed");
}
ControlsBenchmarkSuite.CaseResult level = report.getCase("control_level_setpoint");
double levelIae = level.getMetrics().getIntegralAbsoluteError();

Report.getCases() returns the uniformly sampled time, process-value, set-point, and controller-output vectors for every case. Each result also exposes ControllerPerformanceMetrics, the final relative error, process-value range, the case-specific acceptance detail, and the corresponding AgentBenchmarkSuite verdict.

Model and numerical contract

The suite uses a fixed time step of 1 s. Self-regulating cases apply the transparent first-order balance

\[\tau\frac{dy}{dt}=y_{\mathrm{target}}(u,d)-y\]

and the level case applies the inventory balance

\[C\frac{dh}{dt}=q_{\mathrm{in}}-q_{\mathrm{out}}\]

Here, $t$ is time [s], $y$ is a case process value, $u$ is controller output [%], $d$ is the declared disturbance, $y_{\mathrm{target}}$ is the resulting target, and $\tau$ is the case time constant [s]. For the normalized level case, $h$ is level [%], $C=25\ \mathrm{s}$, and $q_{\mathrm{in}}$ and $q_{\mathrm{out}}$ are percent-scale surrogate flow signals. Process values and set points use case-specific surrogate units; they are not field transmitter units.

The anti-surge case uses AntiSurgeDynamicBenchmark, including a controller-disabled reference. All generic loops use proportional-only tuning so their steady offsets, output limits, and challenge response remain easy to audit.

Stable ID Case Duration Process-value/set-point view Controller and challenge
control_level_setpoint Integrating level 240 s Normalized level [%] Direct-acting Kp = 10; SP 50 -> 55% at 30 s; inflow 50 -> 55 at 130 s
control_pressure_disturbance Pressure rejection 220 s Normalized pressure [%] Reverse-acting Kp = 8; load +10 from 50-140 s and -5 thereafter
control_cascade_temperature Cascade temperature 260 s Normalized temperature [%] Primary Kp = 8, secondary Kp = 2; SP 50 -> 52% at 30 s; load -2 at 150 s
control_split_range Sequential split range 240 s Normalized capacity response [%] Reverse-acting Kp = 20; load -20 from 40-150 s and -10 thereafter
control_anti_surge Anti-surge recycle 120 s Surge-margin fraction Initial margin 0.30; erosion 0.020/s; full-recycle authority 0.060/s
control_speed_recycle_coordination Speed/recycle coordination 360 s Normalized pressure [%] Reverse-acting Kp = 6; SP 75%; load -12 then +18; protection demand 35% at 210 s

CI reference results

The following values are generated and locked by ControlsBenchmarkSuiteTest.publishedReferenceValuesRemainCurrent(). IAE is the trapezoidal integral of absolute error in each case’s surrogate process-value unit multiplied by seconds. It is useful for deterministic regression comparison within one case, not comparison across unlike process variables.

Case Final relative error IAE [case unit s] PV range [case units] Output [%] Acceptance gate
Integrating level 0.909% 62.000 50.000-55.500 0.000-55.000 Error <= 1%; non-negative level; bounded output
Pressure rejection 1.111% 143.093 49.444-51.111 41.111-54.444 Error <= 1.5%; bounded output after both load steps
Cascade temperature 1.215% 114.233 50.000-51.684 50.000-82.000 Error <= 2%; bounded inner-loop valve
Sequential split range 0.952% 147.880 49.000-50.000 50.000-70.000 Error <= 2%; second final element exercised
Anti-surge recycle 0.00488% 2.333 0.0423-0.300 (fraction) 0.000-37.481 Positive closed-loop margin; disabled reference crosses surge
Speed/recycle coordination 0.503% 476.566 79.068-84.523 55.364-88.091 Error <= 2%; speed, recycle, and protection ranges selected

Every case must pass its physical checks and the dedicated CONTROL problems in AgentBenchmarkSuite.createControlsSuite(). A numerical value alone cannot hide a non-converged or physically failed case.

Evidence and reproduction

The authoritative implementation is ControlsBenchmarkSuite.java. The executable reference-value and acceptance contracts are in ControlsBenchmarkSuiteTest.java and AgentBenchmarkSuiteTest.

Run them with:

./mvnw -q -DskipITs \
  -Dtest=ControlsBenchmarkSuiteTest,AgentBenchmarkSuiteTest test

Qualification boundary

This benchmark qualifies deterministic NeqSim controller execution, control structure selection, trace collection, KPI reporting, and source-linked regression values. The plant equations are transparent qualification surrogates. They are not field tuning, a vendor compressor map, severe-slugging validation, a safety-instrumented function, operator training, or a commissioning study. Engineering applications must replace the surrogate with qualified process dynamics and validate tuning, valve authority, equipment limits, and protection layers against project data.

See the Benchmark Gallery for independently referenced property benchmarks and other evidence classes.