A solver that marks its own homework is not validated — it is merely confident. So I built two instruments whose only job is to catch GridSim lying, and neither shares a line of code with it. One rebuilds the physics from the raw export and checks Kirchhoff at every single bus; the other is a different tool entirely. This page is what they found: fourteen cases, machine epsilon, zero reactive-limit violations, no partial credit anywhere.
Both were built to disagree with GridSim if GridSim deserves it. One recomputes the physics from scratch; the other is somebody else's Newton. Between them there is nowhere for a wrong answer to hide.
A standalone NumPy program that takes GridSim's solve export as raw data and rebuilds the bus admittance matrix Y from the recorded branch and shunt parameters using the MATPOWER π-model — its own construction, sharing no code with the solver. It then computes the complex power injection at every bus from the solved voltages and compares it against the specified injection. Not a sample of buses. Every bus, every case.
It also audits every PV bus's implied reactive output against the aggregate generator Q-limits at that bus. Pass means the worst mismatch sits at machine epsilon and zero reactive-limit violations — both, on every case. There is no partial credit and no averaging away of a bad bus.
The second instrument is pandapower 3.4.0 — an established open-source power-systems tool with its own Newton implementation, its own admittance construction and its own opinions. Each validation case is rebuilt in pandapower's native format and solved independently; wherever it converges, its voltage solution is compared bus-by-bus against GridSim's.
This is a corroboration instrument, not an oracle. Where both tools converge they agree to the last representable bit — the table in section 4 has the digits. Where pandapower stops, the residual instrument keeps working, because Kirchhoff does not need a second opinion to be checked — only voltages, impedances and arithmetic.
The division of labour matters: the residual check is necessary — it proves the solution satisfies the physics. The cross-check is reassuring — it proves an unrelated implementation lands on the same point. A pass requires the first; the second comes free wherever the reference tool can follow.
A note on the word tolerance. 1×10⁻⁶ MVA on a 100 MVA base is one part in 10⁸ — the level where double-precision arithmetic itself starts to blur. The instrument does not ask "close enough for engineering purposes"; it asks whether the answer is distinguishable from exact, and on all fourteen cases the answer is that it isn't.
From the nine-bus WSCC classroom case to the 9,241-bus PEGASE monster and the full 3,539-bus model of Great Britain. Active and reactive mismatch are reported separately because a solver can be right about one and quietly wrong about the other — this one is right about both.
| Case | Buses | Max P mismatch | Max Q mismatch | Q-limit violations | Verdict |
|---|---|---|---|---|---|
| case9 (WSCC) | 9 | 1.7×10⁻¹² MW | 1.9×10⁻¹² MVAr | 0 | MACHINE ε |
| case14 | 14 | 2.0×10⁻⁹ MW | 1.3×10⁻⁸ MVAr | 0 | MACHINE ε |
| cigre_mv | 15 | 1.0×10⁻⁸ MW | 6.2×10⁻⁸ MVAr | 0 | MACHINE ε |
| case24_ieee_rts | 24 | 2.3×10⁻¹⁰ MW | 1.4×10⁻¹⁰ MVAr | 0 | MACHINE ε |
| case30 | 30 | 9.6×10⁻⁸ MW | 6.4×10⁻⁸ MVAr | 0 | MACHINE ε |
| case57 | 57 | 3.5×10⁻¹⁰ MW | 1.4×10⁻¹⁰ MVAr | 0 | MACHINE ε |
| case73_ieee_rts (RTS-96) | 73 | 2.8×10⁻⁸ MW | 2.0×10⁻⁹ MVAr | 0 | MACHINE ε |
| case118 | 118 | 3.9×10⁻¹² MW | 2.8×10⁻¹² MVAr | 0 | MACHINE ε |
| case145 | 145 | 1.4×10⁻⁷ MW | 2.3×10⁻⁸ MVAr | 0 | MACHINE ε |
| case300 | 300 | 2.7×10⁻¹¹ MW | 5.7×10⁻¹¹ MVAr | 0 | MACHINE ε |
| case1354pegase | 1,354 | 2.2×10⁻⁷ MW | 1.3×10⁻⁸ MVAr | 0 | MACHINE ε |
| case2869pegase | 2,869 | 2.7×10⁻¹⁰ MW | 4.5×10⁻¹⁰ MVAr | 0 | MACHINE ε |
| case9241pegase | 9,241 | 4.3×10⁻⁹ MW | 1.0×10⁻⁹ MVAr | 0 | MACHINE ε |
| gb-full — Great Britain | 3,539 | 1.3×10⁻⁹ MW | 4.6×10⁻⁹ MVAr | 0 | MACHINE ε |
Worst mismatch anywhere: ~2×10⁻⁷ MW — 0.2 milliwatts on a national grid carrying ~50 GW. One part in 2.5×10¹¹.
These are the worst per-bus voltage-magnitude differences between GridSim and pandapower on the cases where the reference tool converges. A number like 4.4×10⁻¹⁶ pu is not "very close" — it is the machine epsilon of an IEEE-754 double. Two implementations, written by different people in different languages with different linear algebra, landing on the same 64-bit pattern.
The slightly larger figures — 10⁻¹² on case14 and case57 — are the ordinary accumulation of floating-point round-off through two different factorisation orders, and sit eight orders of magnitude below anything an engineer could act on. This is what agreement between independent Newtons looks like when both are telling the truth.
| Case | Max |ΔVm| vs pandapower | Reading |
|---|---|---|
| pandapower 3.4.0 · bus-by-bus voltage magnitude | ||
| case9 | 4.4×10⁻¹⁶ pu | the last bit of a double |
| case14 | 5.5×10⁻¹² pu | round-off accumulation |
| case30 | 1.7×10⁻¹⁵ pu | machine epsilon |
| case57 | 2.0×10⁻¹² pu | round-off accumulation |
| case118 | 6.7×10⁻¹⁶ pu | the last bit of a double |
| case145 | 3.4×10⁻¹⁴ pu | machine epsilon |
Cases where pandapower does not converge on the reconstructed networks are covered — factually — in the next section. Their GridSim solutions still pass the residual instrument at machine epsilon.
pandapower is a serious, widely used tool and I record these episodes because a licensee will reproduce them, not to score points. Each one is precisely characterised — and in each one the independent residual instrument had the final word.
The IEEE 300-bus system is notoriously hostile from a cold start. pandapower's Newton does not converge from a flat or DC start on the reconstructed network — a convergence-basin limitation, not a discrepancy; there is no disagreement to report because there is no second solution to compare.
GridSim solves it from the same start in 7 iterations with Q-limits enforced, to a residual of 2.7×10⁻¹¹ MW — verified by the independent instrument, not by the solver's own convergence flag. With Q-limit enforcement off, the benchmark run converges in 5.
On the PEGASE family — 1,354, 2,869 and 9,241 buses, derived from the continental European transmission system — pandapower reports a singular Jacobian mid-iteration on the reconstructed networks and stops. Again: a numerical limitation on these particular reconstructions, plainly stated, not a verdict on the tool.
GridSim solves all three to machine epsilon — 2.2×10⁻⁷, 2.7×10⁻¹⁰ and 4.3×10⁻⁹ MW respectively — and every solution passes the full residual audit, all buses, zero reactive-limit violations.
The interesting one. On case24_ieee_rts the two tools initially disagreed by an alarming 0.08 pu at one bus. This is exactly the scenario the independent instrument exists for — and it resolved the dispute in GridSim's favour: pandapower had wrongly switched a four-generator bus from PV to PQ; GridSim's solution carried a 2.3×10⁻¹⁰ MW mismatch and zero limit violations.
When tools disagree you don't vote — you recompute the physics and let Kirchhoff adjudicate.
Speed only matters after the physics is right, which is why it is section six and not section one. But it does matter — a national replay engine that cannot keep up with the nation is an ornament.
| Backend | Scope | Behaviour |
|---|---|---|
| Sparse — production | ||
| sparse · cold | 2,869-bus PEGASE | ~185 ms from a flat start, to machine epsilon |
| sparse · cold | 9,241-bus PEGASE | ~857 ms from a flat start — the largest validated case, still under a second |
| sparse · cold | gb-full, 3,539 buses | sits between the two PEGASE points — sub-second, cold |
| sparse · warm | gb-full, warm-started from GDA | settles in 1–3 iterations, ~60 ms — the number that makes national replay practical |
| Dense — validated reference | ||
| dense | up to ~600 buses | the transparent yardstick the instruments interrogate; bit-identical to sparse |
| dense | above ~600 buses | memory-bound, by design — the 9,241-bus dense Jacobian alone is ~2.7 GB |
| Determinism | ||
| both | every case | Newton iteration counts are deterministic run to run — the same case takes the same path, always |
The dense backend being memory-bound is not a weakness to be marketed around — it is the price of an explicit Jacobian, and the reason the sparse backend exists and is proven bit-identical to it.
Most numerical software treats reproducibility as an aspiration — a thing you hope survives the next refactor. GridSim treats it as a test subject. These are actual assertions in the 451-test suite: not "approximately equal", not "within tolerance", but byte-for-byte and bit-for-bit. If two runs ever differ by a single byte, a test fails before any human sees the output.
The consequence for a licensee is quietly enormous: any result on this page — any result your own team ever produces — can be regenerated identically, on demand, forever. An audit trail that cannot drift is worth more than one that merely exists.
Words like "validated" have been debased by a decade of dashboards, so let me be precise about the one used here. A case passes when two things are simultaneously true. First: the worst power mismatch at any bus — recomputed from the raw export by an instrument that shares no code with the solver — sits at machine epsilon. Not the average bus. Not the well-behaved buses. The worst one. Second: every generator in the case respects its reactive limits exactly — the implied Q at every PV bus audited against the aggregate limits, with zero violations tolerated. Both conditions, on every case, or the case fails. There is no partial credit, no waived row, no asterisk.
And the instrument doing the judging is not a friendly witness. It was written to catch the solver lying — its entire purpose is to find the bus where Kirchhoff's laws don't hold, and it checks every bus in every case on the assumption that one exists. Across fourteen networks from nine buses to nine thousand, it has never found one. That sentence is the whole report; everything above it is the working.
This is, I'd argue, the only honest definition available. A solver's own convergence flag proves it stopped, not that it was right. Agreement with another tool proves two implementations share a fixed point, not that the fixed point satisfies the physics. Recomputing the power balance from first principles at every bus and demanding indistinguishability-from-exact is the standard that remains when you refuse every softer one — so that is the standard this page uses.
Every figure in this report came out of a solve export you can step through iteration by iteration — mismatch vectors, corrections, Q-limit events and all. Watch the ladder, then talk to me about a licence.