10. Analysis views¶
The desktop app solves one network per tick and every tab after NETWORK reads that one solved frame. This chapter covers the analysis tabs: what question each answers, what every panel computes and from which Core type, the thresholds and colours it uses, the provenance of each number, and where the web dashboard differs. The tabs are SCADA, OPERATOR, MARKET, NESO RP1, MECHANICAL, THE MACHINE, CYCLE, ASSETS, GENERATION & INERTIA, HUMAN SCALE, SPEED DOMAINS, INVERTER FLEET and EXPERIMENTAL. Starting the app, the transport bar, the model and source pickers, the NETWORK tab and ABOUT are in the desktop app. HARMONICS is in harmonic studies.
How the tabs get their data¶
Every tab refreshes from each solved frame, in all three feeds: a live solve of the loaded case, a replayed run directory, and the GDA bridge. The exceptions are EXPERIMENTAL, ASSETS and CYCLE, described under their own headings. A frame carries voltages, flows, generator output, frequency, RoCoF and the model, and nothing in these tabs changes the grid.
The bridge adds lake side channels that a frame does not carry: the operator block (balancing acceptances,
constraints, warnings, response, reserve, derated margin, net interconnector flow, the measured inertia split) and the
market block (prices, net imbalance volume, constraint cost, carbon intensity, demand forecast, interconnector flows).
Each tab below separates its frame-derived panels, which fill in every feed, from its bridge-only panels. A
bridge-only panel reads - (or stays empty) until a bridge tick supplies the value.
Each tab keeps its own provenance rule. Three tags recur:
| Tag | Meaning |
|---|---|
| real | A solved or streamed quantity, or a formula over one. |
| proxy | A real quantity turned into a stand-in for something the feed does not carry, flagged in the view. |
| synthetic, demo, simulated, assumed | A fixed or invented value shown so a layout reads sensibly. It is never measured. |
To examine one instant, pause the transport bar first. Every drill-down reads the frame on screen when you click.
Colour rules shared by the tabs¶
These ramps live in src/GridSim.Wpf/Visuals/Palette.cs. Hex values are the palette constants.
| Ramp | Rule |
|---|---|
Loading (Palette.Loading, input as a fraction) |
Green #2FD27F at 0, amber #F3C13A at 0.6, red #FF5B5B at 1.0 and above, linear between. |
Voltage (Palette.Voltage, pu) |
Blue #3FA9F5 at 0.96 and below, green at 1.00, amber at 1.03, red at 1.06 and above, linear between. |
Condition (Palette.Condition, 0 to 1) |
Green at 0, amber at 0.5, red at 1. |
| Muted | #8492A0 for neutral or inactive items. |
Fuel names, fuel colours and the synchronous or converter split come from one Core taxonomy, FuelTaxonomy
(src/GridSim.Core/Presentation/FuelTaxonomy.cs), through Fuels.Classify. Synchronous plant carries inertia.
Wind, solar, storage, tidal, hydrogen, grid infeed, other and interconnectors are converter-connected and carry none. A generator whose type reads
hydrogen, fuel cell or electrolyser is Hydrogen (converter), and one typed recip, diesel or engine is a
reciprocating engine (fossil, synchronous).
SCADA¶
Question: what would a control-room point list and alarm log show for this frame? The tab is a simulated EMS
console. A telemetry register of tag-named points and an event log are both driven off the solved frames
(ScadaVm, with the thresholds in ScadaThresholds, src/GridSim.Core/Presentation/ScadaThresholds.cs, shared with
the web). The header reads SCADA SUPERVISORY CONTROL AND DATA ACQUISITION - SIMULATED and
RTU LINK SIMULATED.
The register¶
The register is built once per network, and again only when the model name, bus count or branch count changes. It holds, in this order:
| Points | Tag form | Value | Source |
|---|---|---|---|
Every bus with BaseKv of 275 or more (ScadaThresholds.EhvCutoffKv) |
SITE.400.V_PU |
Vm in pu, 4 decimals |
PowerFlowResult.Vm |
The 30 non-transformer branches with the highest solved loading at build time (ScadaThresholds.TopCorridors) |
FROM-TO.400.P_MW and FROM-TO.400.Q_MVAR |
PFromMw, QFromMvar, 1 decimal |
PowerFlowResult.LineFlows |
| One point per on-load tap changer whose transformer is found in the model | SITE-SGT.TAP_POS |
TapRatio of the transformer branch, 4 decimals |
Branch.TapRatio |
| System frequency | SYS.F_HZ |
Hz, 3 decimals | SimFrame.FrequencyHz |
A site code is the leading word of the bus name with non-alphanumerics removed, upper-cased and cut to 8 characters,
or BUS<id> when the name is empty. The kV field is the rounded base kV of the higher end of a branch, or EHV below
1 kV. A tag that collides with an earlier one gets -2, -3 and so on, so every tag is unique. Tags come from the
model's substation and circuit names. They are not read from an EMS point database.
The columns are TAG, DESCRIPTION, VALUE, UNITS, LOAD, QUAL and STAMP. LOAD is filled for the P and Q points only: it is
LineFlow.LoadingPercent, coloured by the loading ramp. The filter box is a case-insensitive substring match over tag
and description. The header shows visible / total points and the count of points reading GOOD.
Quality¶
A point reads GOOD (green) with the clock of the frame as its stamp. In each window of three ticks one point,
Hash(tick / 3) % pointCount, is held at its last value with quality STALE (amber #F3C13A) and an unchanged stamp (its load and brush also stay unchanged),
to mimic an RTU dropout. The choice is a deterministic function of the tick, so a replay shows the same dropouts.
STALE is simulated and means nothing about the model.
The event log¶
Events are raised once on the onset of a condition, so a sustained excursion logs once. The log holds the newest 200 entries, newest first.
| Priority | Raised by | Message |
|---|---|---|
P1 (red #FF5B5B) |
The lowest bus voltage below 0.94 pu or the highest above 1.06 pu (VoltageLimits.OperationalLowPu and OperationalHighPu). One event for the whole network, with the lowest bus as source. |
VOLTAGE OUT OF BAND lo-hi pu |
| P2 (amber) | A registered corridor with loading above 90 % (CorridorAlarmPct). |
CORRIDOR LOADING n% OF RATING |
| P2 (amber) | Frequency below 49.9 Hz or above 50.1 Hz (FreqOperationalLowHz, FreqOperationalHighHz). |
FREQUENCY f Hz OUTSIDE 49.9-50.1 |
P3 (muted #8492A0) |
A registered corridor above 70 % (CorridorWatchPct) and not above 90 %. |
corridor loading n% - watch |
| P3 | An OLTC tap ratio that moves by more than 1e-6. |
TAP MOVED a -> b pu |
| P3 | Voltage or frequency returning to band. | Voltages returned to band, Frequency recovered f Hz |
Only the registered corridors are watched, so a corridor outside the 30 heaviest at build time raises nothing. Each row has an ACK button and the header has ACK ALL. An acknowledged row dims to 45 % opacity, and the header counts the unacknowledged rows.
Clicking¶
Every register row except SYS.F_HZ is a link. A voltage point opens that substation page, and a flow or tap point
opens the circuit or transformer page, in the explorer of the ASSETS tab, and the tab switch selects ASSETS
by its name. The system-frequency point opens nothing.
On the web¶
The web register (ScadaService) has the same sources and thresholds, with these differences:
- Voltage points are in kV (
SITE.V,Vm x BaseKv) and the frequency tag isSYS.FREQ, which is the first point of the register where the desktop putsSYS.F_HZlast. Tags are the cleaned names with spaces as underscores. - There is no STALE state and no acknowledge. Quality is GOOD or ALARM, and an
In alarmcount replaces the acknowledge count. Every stamp is the frame clock. - The priorities are the same on both consoles, from one set of constants (
ScadaThresholds.Priority*): a bus voltage out of band is P1, frequency outside 49.9 to 50.1 Hz is P2, and a corridor above 90 % is P2. The web log keeps the newest 60 entries. - The web logs one event per point entering alarm, so a voltage excursion logs once for each EHV bus as P1, with the
text
<description> entered alarm (v unit), where the desktop logs one network event. A point leaving alarm logs<description> clearedas P3. The corridor watch text iscorridor loading n% - watch, raised for the P points only. The web has noTAP MOVEDevent and noVoltages returned to bandevent. - An unrated corridor takes its loading as
|P|against 2,000 MW (PresentationLimits.UnratedBranchNominalMw). - A row with an asset page opens it in ASSETS and the tab switch lands on ASSETS.
OPERATOR¶
Question: what is the system doing right now, as a control room sees it? The tab (OperatorVm) is a read-only
board of three columns.
Frame-derived panels¶
| Panel | Formula or source |
|---|---|
| FREQUENCY | SimFrame.FrequencyHz, 3 decimals. Red when the deviation from the model's nominal frequency exceeds 0.2 Hz, amber above 0.1 Hz, green otherwise. |
| RoCoF | SimFrame.RocofHzPerS, signed, 3 decimals. |
| INERTIA | GridModel.SystemInertiaGvaS, in GVA.s. |
| DEMAND, GENERATION | SimFrame.DemandMw and GenerationMw, in GW to 2 decimals. |
| LOSSES | PowerFlowResult.TotalLossMw, in MW. |
LARGEST LOSS * live N-1 |
FrequencyRiskPresenter.LargestSecuredUnit: the largest positive output of any single unit in this frame, synchronous, converter-connected or an interconnector import (a grid infeed at a model boundary is not a unit and is skipped). Shows - when nothing generates. |
| TRANSMISSION BOUNDARIES | One row per boundary the case defines, from BoundaryAnalysis.Evaluate: signed flow sum(direction x PFromMw) over the boundary's branches, the limit, and loading |flow| / limit x 100. A limit of 0 means no limit authored, so loading is 0 and the boundary is never overloaded. The bar runs to 120 % and takes the loading colour. Cases without boundaries show an empty panel. |
| GENERATION STACK | Dispatched MW by fuel (max(0, Pg) summed per fuel), biggest first, with the share of the total. Above it, SYNCHRONOUS and CONVERTER output in GW. |
The LARGEST LOSS tile carries one sub-line: 3,600 MW * Dogger Bank cluster (not secured). The 3,600 MW figure is
CredibleLossBasis.DesignBasisLossMw. It is the Dogger Bank A, B and C cluster lost together, a simultaneous event
that NESO's Frequency Risk and Control Report 2025 does not secure. The report (source S052, sections 4.1 and 7.1)
secures all single-unit (BMU-only) events and names 1,800 MW as the future largest loss
(CredibleLossBasis.FictionLossMw). The tile shows the live
single-unit loss, and the lake's own 1,800 MW figure is not shown here.
Bridge-only panels¶
| Panel | Content |
|---|---|
| Warning banner | The operator block's warning text, newlines collapsed, cut to 160 characters, white on red. Hidden when the block has no warning. |
| DERATED MARGIN, RESERVE | DeratedMarginMw and ReserveMw, in GW to 1 decimal. |
| BALANCING MECHANISM | Up to 40 acceptances: unit, kind badge, level MW and price. A kind starting BID is amber and any other kind is green. |
| ACTIVE CONSTRAINTS | Up to 30 constraints: name, a dot (red when binding, muted otherwise) and the cost in GBP thousands. |
The operator block also carries a response figure, a net interconnector figure and a warnings list. The model holds them, and this view does not display them. The voltage band the model computes is not displayed either.
OPERATOR, MARKET and NESO RP1 clear their bridge state on every model or source switch and on every replay restart (entering replay, a restart, a scrub to frame 0 and a replay loop), so a GB-scale acceptance list cannot sit over an unrelated case. Nothing on this tab is clickable.
On the web¶
The web OPERATOR tab (TabProjections.Operator) shows frequency, inertia, largest loss with the unit's name,
synchronous share, RoCoF, demand, generation and losses as tiles, the boundary table with headroom, and the fuel stack.
The lake panel, titled GDA LAKE - SYSTEM OPERATOR, adds the response, reserve, derated margin, net interconnector,
outturn inertia and market inertia figures, the warning, the acceptance table with price and fuel, and the constraint
table with flow, limit, cost and a binding flag. A model without boundaries says so in a note.
MARKET¶
Question: what are wholesale and balancing prices doing, and how carbon-heavy is the mix? The tab (MarketVm) has
six headline tiles, a price trace and an interconnector table.
Frame-derived¶
| Tile | Formula or source |
|---|---|
| DEMAND | SimFrame.DemandMw in GW, with fcast <GW> beneath it from the market block when present. |
| CARBON | sum(Pg x intensity) / sum(Pg) over generators with positive output, in gCO2/kWh, with CarbonFactors.IntensityKgPerMwh. Beneath it, renewable n%, the share of dispatched MW in renewable fuels. |
The factors, in kg CO2 per MWh, are the one carbon table CarbonIntensityTable
(src/GridSim.Core/Presentation/CarbonFactors.cs), from NESO's Carbon Intensity Regional Forecast Methodology (May
2024, Table 1):
| Fuel | kg CO2 per MWh |
|---|---|
| Coal | 937 |
| CCGT, Gas | 394 |
| OCGT | 651 |
| CHP | 394 |
| Oil, reciprocating engine | 935 |
| Biomass | 120 |
| Other, and an unlisted fossil fuel | 300 |
| Every other fuel (nuclear, wind, solar, hydro, storage, interconnector) | 0 |
Every figure is direct combustion except biomass, which NESO publishes on a consumption basis (supply-chain emissions; its stack CO2 is biogenic). Interconnectors and grid infeeds are 0 because their combustion happens outside the network, so a distribution model supplied mostly through its grid infeeds reads close to zero. NESO's methodology (docs/reference S325, Table 1) prints approximate import figures for consumption-based accounting (French about 53, Dutch about 474, Belgian about 179, Irish about 458 gCO2/kWh); GridSim does not apply them.
The figure is an estimate from fixed direct-combustion factors. The tile is labelled CARBON, and the word
indicative is this chapter's description and does not appear in the view. A lake carbon intensity replaces it on any bridge tick that carries one. Carbon is green
below 100 gCO2/kWh, amber below 250 and red from 250.
Bridge-only¶
| Tile or panel | Content |
|---|---|
| IMBALANCE PRICE | The streamed imbalance price, with a unit line in pounds per MWh. Green when below 0, red above 150, amber above 80, light grey otherwise. |
| MARKET INDEX | The streamed market index price, with the unit line APX / N2EX. |
| BSUoS | The balancing services use of system charge, with a unit line in pounds per MWh. |
| CONSTRAINT COST | With the unit line thermal, today. GBP, written GBP 1.2m from 1,000,000, GBP 340k from 1,000 and GBP 12 below. |
| IMBALANCE PRICE trace | A sparkline of the last 96 samples, captioned STREAMED FROM LAKE. |
| INTERCONNECTORS | Name, an IMPORT (green) or EXPORT (amber) badge, and the signed flow in GW. Import is positive. |
The trace takes one sample per GB settlement period (ImbalancePriceTrace, src/GridSim.Core/Presentation/ImbalancePriceTrace.cs).
A period is a 30-minute half-hour of the UTC clock. A later period appends a sample, a tick in the same period
replaces the period's sample, an earlier period (a seek back, or a looping replay) clears the trace first, and a
missing or non-finite price adds nothing. Ninety-six samples cover two days. Every bridge value, the interconnector
rows and the trace are cleared on a model or source switch, a replay restart and a bridge stream restart
(MarketVm.Reset), so no bridge price stays on screen over a local case.
The market block also carries a system sell price, a day-ahead price, a net imbalance volume and a price per interconnector. The model holds them, and the six tiles and the interconnector table do not display them.
On the web¶
The web MARKET tab (TabProjections.Market) shows four frame tiles (renewable share, carbon in kg/kWh, demand,
interconnector count) and, in bridge mode, a lake panel with eight tiles: imbalance price, system sell price,
day-ahead price, BSUoS, net imbalance volume, market index, carbon and demand forecast. Constraint cost and the
price sparkline sit below it. It adds a BALANCING panel (BM cost estimated as Elexon accepted volume times the marginal
bid or offer price, BSAD cost, volume and units instructed) and a BALANCING ACTIONS log of individual acceptances. Its
interconnector table keeps only named GB links and falls back to the model's interconnector units.
NESO RP1¶
Question: how long do I have? The tab (NesoRp1Vm) is a situational-awareness page built on one quantity, the
purchased time, in seconds of frequency ride-through on the system's real stored energy. The physics is
StabilityMetrics (src/GridSim.Core/Dynamics/StabilityMetrics.cs). The credible loss and the grade ladder come from
one presenter, FrequencyRiskPresenter, which the web calls too.
RP1 is a GB 50 Hz product: its purchased time is graded to the absolute 49.2 Hz limit and its RoCoF and MIF use the
GB nominal. On a case whose nominal is not exactly 50 Hz (case9, 60 Hz) both shells hide the page and show one line
in its place: NESO RP1 is a GB 50 Hz product page (purchased time to 49.2 Hz, GB RoCoF and MIF); this case runs at
60.0 Hz, so the page is not shown.
The quantities¶
E = intrinsic inertia in MW.s = 1000 x GVA.s(i)
RoCoF = f0 x dP / (2 x max(1, E)) f0 = 50 Hz, dP = credible loss in MW
t_purchase = (f_now - 49.2) / RoCoF 0 when f_now <= 49.2; infinite when RoCoF < 1e-9
dyn MIF = f0 x dP / (2 x 0.125) / 1000 GVA.s that holds 0.125 Hz/s for loss dP
The 49.2 Hz threshold is StabilityMetrics.LfddWorkingSetpointHz. The 0.125 Hz/s limit is
FrequencyLimits.RocofLimitLegacyHzPerS. This is the initial-RoCoF, governor-free approximation.
Panels¶
| Panel | Content |
|---|---|
| PURCHASED TIME (hero gauge) | t_purchase against the live credible loss, to 1 decimal in seconds. The gauge runs 0 to 10 s, red below 2 s (0.2 of range), amber below 5 s (0.5) and green above, and an infinite time reads >10 s. The figure is coloured by the ladder level without the trend rule: green at 5 s or more, amber at 2 s or more, red below. Beneath it, correlated cluster (not secured) with the same quantity at 3,600 MW. |
| GENERATION & INERTIA (three gauges) | GVA.s TOTAL, GVA.s(i) intrinsic and GVA.s(p) market. All three run 0 to 400 GVA.s, and GVA.s(i) alone has a red band to 0.255 of the range (102 GVA.s) and an amber band to 0.39 (156 GVA.s). Total is (i) plus (p). (i) is the lake's measured synchronous inertia in bridge mode, and otherwise the sum of H x MBase over synchronous units. (p) is the lake's market inertia and is 0 without a bridge. |
| DISPATCH STACK (left) | Per fuel: output, headroom (capacity - output, written +n above 1 MW), inertia in GVA.s for synchronous fuels, and a SYNC or CONV tag. SYNCHRONOUS and CONVERTER totals sit at the foot. |
| LIVE CREDIBLE LOSS | The largest single infeed online, named. Below it the largest correlated interconnector group, labelled (not secured). Then correlated cluster (not secured) at 3,600 MW with source Dogger Bank A+B+C, and future largest loss (FRCR 2025) at 1,800 MW. |
| INERTIA BY SOURCE | Each synchronous fuel's share of intrinsic stored energy times the purchased time, in seconds to 1 decimal. |
| STABILITY TREND | A sparkline of the purchased time over the last 60 frames (FrequencyRiskPresenter.TraceCapacity), one point per solved frame, headed STABILITY TREND * last 60 frames. Its span in time is 60 times the step: 60 minutes at a 1-minute step, 30 hours on a half-hourly replay. dyn MIF and RoCoF read-outs sit beneath. |
| LFDD RISK | The grade, in a coloured badge, in the header and again below the trend. |
| Handover sentence | <clock> - System carrying n GVA.s (n intrinsic), purchased time t s against a n MW credible loss. plus the top boundary's loading when the case has boundaries, then the 3,600 MW and 1,800 MW figures. |
| NETWORK CONSTRAINT & COST (right) | Boundary bars sorted by loading, with a trend arrow, and below them the constraint costs. |
| IMBALANCE PRICE, BM STABILITY DELTA, INTERCONNECTORS (bottom) | See below. |
Credible loss. The credible loss is the largest single infeed online, whatever its technology: NETS SQSS v2.10
paragraph 5.1.2 secures the loss of a single generating unit, power park module or DC converter, and NESO's Frequency
Risk and Control Report 2025 secures all single-unit (BMU-only) events, interconnectors included, and does not secure
simultaneous ones. A unit at zero or negative output (a pump, a charging battery, an exporting link) is not an infeed. The correlated group, which is a
simultaneous event, is context. CorrelatedGroupExceedsSecured is true when it is the larger figure, and the view then
draws the group figure bright. The unit figure is drawn bright whenever a unit is generating and muted only when none
is, so both figures can be bright together. A group is
the summed positive imports of its members: Sellindge (IFA and ElecLink) and North Sea (NSL and Viking), matched by
canonical link id in InterconnectorCorridors, so NS Link interconnector counts as NSL and IFA2 does not count as
IFA. Group flows come from the bridge market block, so the group reads - outside bridge mode.
LFDD ladder (FrequencyRiskPresenter.GradePurchasedTime), on purchased time:
| Grade | Condition | Colour |
|---|---|---|
| NORMAL | 5 s or more (GradeNormalS) |
green |
| WATCH | 3 s or more (GradeWatchS) |
amber |
| ADVISORY | 2 s or more (GradeAdvisoryS) |
amber |
| WARNING | below 2 s | red |
Below NORMAL, a falling trend turns the badge red and appends down. The trend is true when the newest trace point is
more than 0.05 s (TighteningDeltaS) below the point three frames earlier, so it needs four points. The ladder has no
source document. It is a presentation judgement anchored to the 49.2 Hz limit.
Boundary bars. The trend glyph compares each boundary's loading with the previous frame: an up triangle in red
when it rose by more than 0.5 percentage points (BoundaryTrendBandPct), a down triangle in green when it fell by
more, and a flat bar in muted colour otherwise. With no boundary model the panel says no boundary model for this case - constraint cost from the lake below.
Bridge-only panels¶
| Panel | Content |
|---|---|
| Constraint costs | Up to 12 constraints. The lake carries a daily cost, shown as an hourly rate daily / 24 / 1000 in GBP k/h. A dot is red when binding. |
| IMBALANCE PRICE | The latest price and a sparkline of the last 48 settlement periods (one day). It takes one sample per settlement period by the same rule as the MARKET trace (ImbalancePriceTrace), and keeps half as many. |
| BM STABILITY DELTA | Up to 30 acceptances graded by inertia effect. A synchronous unit with an OFFER kind reads an up triangle followed by inertia (green), and a synchronous unit with any other kind reads a down triangle followed by inertia (red). A non-synchronous unit reads neutral (muted). A row with no synchronous tag reads watch (amber). The header summarises n improving * n reducing * n neutral. |
| INTERCONNECTORS | Links ordered by absolute flow with signed MW. A link with |flow| below 0.5 MW (StatusLampRules.IdleInterconnectorMw) is left out. Importing links are amber. A red dot marks members of a correlated corridor. |
Clickable¶
Rows in the dispatch stack, inertia by source, BM stability delta and interconnectors open the Inspector, the overlay described under The Inspector.
On the web¶
The web NESO RP1 tab (TabProjections.Rp1) has the hero with the grade, the purchased-time gauge, the three
inertia gauges, the credible-loss card, inertia by source, the interconnector fleet with corridor flags, the narrative,
and an N-1 RoCoF screen that the desktop tab lacks: each online generator as a single loss, worst RoCoF first, top
10, flagged against 0.125 Hz/s and 1.0 Hz/s. Differences:
- The web has no boundary bars, constraint costs, BM stability delta, imbalance trace or stability-trend sparkline. It
has no DISPATCH STACK card, because the projection carries the rows and no page shows them, and no separate LFDD badge
below the trend. Its three inertia gauges scale to
max(50, ceil(total / 100) x 100)GVA.s. Its INERTIA BY SOURCE card lists GVA.s and the share of intrinsic, where the desktop lists seconds of purchased time. - An infinite purchased time reads as an infinity sign, where the desktop reads
>10 s. - Total inertia is the sum of
H x MBaseover every generator, intrinsic is the synchronous part, and market is the difference. On the desktop, market is the lake's figure or 0. - In the raw public-data replay the largest unit is set to 1,800 MW named
SQSS secured-event standard, because an aggregate mix has no units. - The web does not show the 3,600 MW cluster figure. The web grade ladder, thresholds and trend rule are the same Core code.
MECHANICAL¶
Question: what are the machines doing? The tab (MachineEngineerVm) is the plant engineer's view of every
synchronous unit, as against OPERATOR's view of the system. It lists synchronous units with output of 10 MW or more
(MechanicalThresholds.MinSyncMachineMw), since converter plant carries no rotating mass and small embedded plant is
noise at this level.
Per-machine state¶
Rows sort most-stressed first. The columns are a risk dot, MACHINE, FUEL, MW, MVAr, POWER FACTOR, EXC%*, AVR* and
GOV*. Each row is a button that opens the Inspector.
loading = Pg / Pmax 0 when Pmax is infinite or not positive
stress = max(loading, Qg+ / Qmax, Qg- / |Qmin|) reactive terms only when Qg is not 0
risk = LIMIT at or above 0.95, NEAR at or above 0.85, otherwise OK (red, amber, green)
KE = H x MBase / 1000 GVA.s
ramp = (Pg - Pg_previous) / period MW per minute
The limits are PresentationConstants.StressLimitFraction and StressNearFraction. The previous output is held per
generator index (UnitRampHistory, which checks bus and name), because names repeat on gb-full. A unit with no
history has no ramp. The period is the interval between the last two frame clocks, and 30 minutes
(DefaultPeriodMin) before two frames have been seen. A ramp counts as holding inside plus or minus 0.5 MW per
minute (RampDeadbandMwPerMin).
Provenance¶
| Field | Status |
|---|---|
| MW, loading against Pmax, risk grade | real |
Stored kinetic energy H x MBase, and H |
real |
| MW ramp, fleet trend, projected inertia | real, frame to frame |
| RoCoF relay margin | real (frame RoCoF against both settings) |
P-Q envelope (Qmin, Qmax, Pmax) |
real limits |
| MVAr, power factor, excitation | -, because the feed carries no per-generator reactive dispatch (Generator.Qg is 0) |
| Torsional pulse count | proxy: one pulse per frame-to-frame output step above 40 MW (TorsionalPulseStepMw) |
| AVR, governor mode | synthetic labels: AUTO+PSS for Nuclear, CCGT and Biomass, otherwise AUTO; governor AUTO |
| Stator and rotor temperature | synthetic: stator 40 + 60 x loading degC, rotor 50 + 45 x loading degC |
| Peak stress | synthetic: min(15 + 3 x pulses, 85) per cent once a unit has a pulse |
| Certified J, type-test date, committed starts | - or a placeholder note, because no asset register or commitment feed exists |
The view shows - for MVAr, not a number rebuilt from the bus net reactive injection. That injection includes line
charging and shunt compensation, so an 11 MW unit would read hundreds of MVAr. If a case carries a non-zero Qg,
MVAr, power factor and excitation (90 + 30 x Qg / Qmax, clamped to 40 to 130 %) fill from it.
The five sections¶
| Section | Content |
|---|---|
| PER-MACHINE STATE | The table above. |
| SHAFT / TORSIONAL & THERMAL | Per machine: pulse count, peak stress, stator and rotor temperature, and an up arrow when loading is above 0.9. |
| PROTECTION ENVELOPE | The P-Q diagram of the most-stressed machine inside its capability polygon. An infinite Qmin or Qmax is drawn as -Pg or +Pg, and an infinite Pmax as Pg. Without reactive telemetry the point sits on the P axis. Beside it, the RoCoF relay margin. |
| INERTIA PER UNIT | H, test date and KE per machine; sum ASSET KE, REPORTED (i) and SYNTHETIC GAP. |
| FLEET TRAJECTORY | Ramp arrow and MW per minute per machine; PROJECTED (i) +15 min; a count of units ramping up and de-loading. |
RoCoF relay margin. |f.RocofHzPerS| as a percentage of 0.125 Hz/s (the original setting) and of 1.0 Hz/s (the
relaxed setting, FrequencyLimits.RocofLimitModernHzPerS), each with a bar capped at 100 %. A bar is green up to 80 %,
amber above 80 % and red above 100 %.
Inertia roll-up. sum ASSET KE is the sum of the listed units' KE. REPORTED (i) is the lake's synchronous
inertia in bridge mode and the same sum otherwise, so outside a bridge the synthetic gap reported - sum is 0.
Projection. PROJECTED (i) +15 min is max(0, sum KE + R x 15 / 1000), where R sums ramp / Pmax x H x MBase over
units de-loading by more than the deadband. Only de-loading units contribute, so the projection can fall and cannot
rise. It is red when more than 1 GVA.s below the sum, green when more than 1 above and muted otherwise.
Clickable¶
A machine row opens the Inspector with a per-machine card: output, stored KE, risk, ramp, and the fields listed
above. Only some rows carry a status tag in their label: Excitation (proxy), Torsional pulses (proxy) and
Stator / rotor temp (synthetic), AVR mode (synthetic) and Governor mode (synthetic) (both assumed by fuel class,
with no AVR or governor telemetry), plus the type-test note. Real fields carry no real tag, and certified J and committed starts are absent.
On the web¶
The web tab (MechanicalService) lists the same units with the same threshold, sorts by stress, and shows the two
RoCoF margins as (limit - |RoCoF|) / limit per cent with a BREACH flag, the P-Q diagram for the top machine, and a
machine table. It omits the torsional, thermal, excitation, AVR and governor fields, REPORTED (i) and SYNTHETIC GAP, the
projection and the committed-starts note. The modern-margin card shows Sum inertia, the GVA.s of the listed units,
and a machine row opens an inspector. Its ramp divisor is the session step in minutes, which follows the STEP
picker. An infinite Pmax is replaced by max(Pg, MBase).
THE MACHINE¶
Question: what does the whole grid look like as one rotating machine? The tab (MachineVm) reduces the system to
a single machine. Fuel pushes torque in on the left, regions draw it off on the right, the transmission network is the
shaft between them layered by voltage, and the frequency story is told as torque. Its centre carries the title
THE SPINNING GRID - every generator locked together as one rotating mass.

The screenshot was captured on an earlier build and shows five tabs, so its glyph spacing differs from the current view.
Left and right columns¶
FUEL IN buckets the dispatched output (positive Pg) into coarse layman groups, each with GW, its share of the
push, a plant count and the inertia it carries:
| Bucket | Fuels |
|---|---|
| GAS & THERMAL | CCGT, OCGT, Gas, CHP, Coal |
| NUCLEAR | Nuclear |
| WIND | Wind (offshore), Wind (onshore) |
| SOLAR | Solar |
| HYDRO | Hydro, Pumped storage, Tidal |
| BIOMASS | Biomass |
| IMPORTS | Interconnector, Grid infeed |
| STORAGE | Storage |
| OTHER | Everything else |
The header shows total generation in GW, the synchronous and electronic split, and tCO2/h, which is
sum(Pg x CarbonFactors.CombustionTonnesPerMwh), the same table as the MARKET tab in tonnes per MWh: gas, CCGT and
CHP 0.394, OCGT 0.651, coal 0.937, oil and reciprocating engines 0.935, biomass 0.12, other 0.3, and 0 for every other
fuel.
POWER OUT shows total demand in GW, the solved losses (TotalLossMw, so it agrees with NETWORK), and the eight
buses with the highest demand, then EVERYWHERE ELSE.
The shaft and the centre¶
The centre shows frequency, RPM (f / 50 x 3000), stored spin (SystemInertiaGvaS, with
sum(H x MBase) / 3600 MWh held as rotation), the demand-weighted average voltage, and two 120-sample traces for
speed and voltage. THE SHAFT has one row per transmission voltage level: the sum, over non-transformer branches
whose higher-kV end is that level, of max(|PFromMw|, |PToMw|), in GW and as a share; the mean solved voltage of the
buses on that level in kV; and its deviation from nominal in per cent and kV. The deviation bar spans plus or minus
6 %.
The instruments¶
commanded torque T_cmd = (demand + losses) x 1e6 / (2 pi x 50) MNm at 50 Hz
surplus S = (f - 50) / 50 / 0.04 x demand MW, governor droop 4 %
delivered torque T_act = (demand + losses + S) x 1e6 / (2 pi f) MNm at the live speed
torque gap = S x 1e6 / (2 pi f)
stress = |gap| / (0.05 x T_cmd) x 100 clamped to 0 to 100 %
The droop (GovernorDroopFraction) and stress band (StressBand) are in EnergyEconomicsConstants. The dials are
GRID SPEED (2,970 to 3,030 rpm), TORQUE COMMANDED and TORQUE DELIVERED (0 to 200 MNm) and STRESS. The note beside the
gap reads supply and demand in balance inside plus or minus 200 MW (TorqueNarrativeBandMw), too much push - the
machine speeds up above it and not enough push - the machine slows down below it.
Simulated cards¶
Two cards, MAINS CLOCK DIVERGENCE (which also carries the POTENTIAL MISSED REGEN read-out) and GRID BATTERY BESS, are tagged SIMULATED in the view. They integrate over the simulated time between frames, and they restart
on a model switch, a replay restart and a scrub to frame 0 (MachineVm.Reset). A backward step in tick is a
discontinuity and integrates nothing.
| Card | Formula |
|---|---|
| MAINS CLOCK DIVERGENCE | Banked Hzs = sum((f - 50) x dt) with dt in seconds. Clock error in seconds is |banked| / 50, shown fast or slow. The note reads net fast - regeneration window open above +0.5, net slow - the grid owes energy below -0.5 and running true to 50 Hz otherwise. |
| POTENTIAL MISSED REGEN | sum(max(0, S) x dt) in MWh, valued at GBP 80 per MWh (RegenPricePerMwh) and as homes powered for a day at 8 kWh per home-day (HomeKwhPerDay). The price carries the tag (assumed) and the homes line carries none. |
| GRID BATTERY BESS | A narrative 500 MW, 1,000 MWh battery (BessCapMw, BessCapMwh) that takes 0.25 x S (BessResponseFraction) clamped to its power, stops charging at 95 % state of charge and discharging at 5 %, starts at 50 %, and reads CHARGING above +10 MW, DISCHARGING below -10 MW and STANDBY inside that band (BessModeDeadbandMw), where the power text reads holding. |
The electrical instruments¶
| Panel | Content |
|---|---|
| SYSTEM VOLTAGE | Average pu weighted by max(Pd, 0) + 1e-6 MW per bus, its deviation from 1.0 in per cent, the spread lo-hi pu, and the kV at the lowest and highest bus. The dial runs 0.94 to 1.06 pu. |
| REACTIVE BALANCE | The line term is the QLossMvar summed over all lines. Produced = positive generator Qg plus the network total when it is negative (charging). Absorbed = the sum of positive bus Qd only, negative generator Qg and the network total when it is positive. The net reads surplus or deficit. The note says VARs push voltage up above +300 Mvar, voltage sags below -300, and balanced between. The dial scale is max(2000, ceil(1.2 x produced / 500) x 500). |
| TAP-CHANGER FLEET | One row per OLTC record, on the transformer branch the solver drives (SteadyStateSolver.MapOltcRecordsToBranches: by name and controlled-bus end), so parallel transformers sharing a name are not confused. Per OLTC: percent off nominal (ratio - 1) x 100, the step tap +n of +/-m, and the held bus's kV and error against target. A tap within half a step of its travel limit reads AT LIMIT. The header shows the average offset, n of N at travel limit, the average error as a multiple of the deadband (the first tap changer's deadband, or 0.01 pu when the model has none), and the ratio range. It appends NOT SETTLED when the solve's tap loop did not finish. |
| REGULATION STRESS | max(limit fraction, min(1, average error / deadband / 2)) x 100, clamped to 0 to 100 %. |
Reactive quantities depend on the Qg the frame carries, which is 0 in a presolved feed. A case with no tap changers
shows no tap changers in this model.
On the web¶
The web tab (MachineService) uses the same constants and formulas. It adds a battery label GRID BATTERY (500 MW / 1
GWh). In the raw public-data replay it shows only the mechanical instruments, the speed trace and fuel in, because
there is no solve: voltage, reactive, taps, shaft layers and the integrated cards are hidden.
CYCLE¶
Question: what did the parallel analysis engine do with the last cycle? The base Newton-Raphson solve is
single-core. Everything run after it converges (N-1 sweeps, harmonics, RoCoF screening, physics conformance and the
watch list) reads the same solved frame and fans out across a worker pool under a compute budget. This tab is that
budget's read-out. Both the desktop (CycleVm) and the web wrap one shared ResidentCycleService
(src/GridSim.Core/Scheduling/ResidentCycleService.cs). The desktop refreshes when each cycle completes, not once per
frame.
The service builds its jobs from AnalysisJobLibrary:
| Job id | Name | Tier |
|---|---|---|
watch |
Watch list | High |
n-1:hot |
N-1 (hot branches): branches at 80 % loading or more (HotBranchLoadingPercent) |
High |
harmonics |
Harmonic penetration: a six-pulse source at the largest-demand bus; skipped above 1,500 buses | High |
n-1:lp:0 to n-1:lp:7 |
All branches, in up to 8 rotating shards named N-1 shard s [a..b) (NMinus1Shards); the hot-branch job overlaps them. A small case has fewer shards |
Low |
rocof |
RoCoF N-1 screen | Low |
physics |
Physics conformance | Low |
The desktop rebuilds the service on every model switch, replay load and bridge (re)start (CycleVm.ForgetModel), and
between those only when the bus count or branch count changes. The web builds one
SessionCycleService when a live session starts and never rebuilds it. Frames offered while a cycle runs coalesce to the newest.
Panels¶
| Panel | Meaning |
|---|---|
| Hero | HIGH TIER MET when every High job completed, else HIGH TIER MISSED, with utilisation spent / total core-ms as a percentage. A missed tier is the one hard failure the tab watches for. High jobs are never cancelled. |
CYCLE n - budget accounting |
The ledger below. |
| Base solve (single core) | The measured wall time of the solve that produced the frame, in ms. A replayed or bridge frame was not solved here and reads -. |
| Fan-out wall time | Wall clock of the parallel drain. |
| Compute spent (core-s) | spent / total core-seconds, where total is workers x window. |
| High tier | done / total complete, green when met. |
| Low tier (done / admitted / deferred) | Low jobs are admitted in rotation order while the running cost estimate fits the budget, and the first is always admitted. A Low job that is not served keeps its place at the front. |
| Low cancelled at deadline | Low jobs aborted when the window closed. Cancellation reaches into the Newton inner loop. |
| Backlog depth | Low jobs waiting for a later cycle. |
| N-1 shards covered since load | covered / total shards, the number of distinct n-1:lp shards that have completed at least once since the service was built (on loading the case). It is cumulative, not a rolling window: it never falls, and a shard completed many frames ago still counts. Green at full coverage and amber below. n/a when the case has no shards. |
| Worst contingency seen | The first non-converged outage, as <outage> - islands when that outage splits the network or <outage> - did not converge when it does not (voltage collapse or an iteration cap), otherwise the outage with the most violations as <outage> - n violations, red in both cases, or none - all secure in green. |
| Job table | Every job, High first then heaviest first by core-ms, with the outcome: a green tick and its ms for completed, an amber cancelled, a muted deferred, and a red faulted. A job that throws is isolated and does not stop the cycle. |
The pool is min(4, logical cores - 1) workers, at least 1, and the window is 1,000 ms (CycleOptions.WindowMs), so
the budget is 4,000 core-ms on a machine with five or more logical cores. The window is the wall-clock deadline for
Low jobs, and the budget scales with the worker count. Nothing on this tab is clickable.
On the web¶
The web tab (CycleTab) shows the same ledger with these differences. It adds a Utilization row coloured red above
100 %, amber above 85 % and green otherwise. It shows Low cancelled at deadline only when the count is above 0.
It is driven only for live sessions, and bridge and replay feeds do not drive it. The pool is min(4, logical cores - 1)
and the configuration keys Cycle:Enabled, Cycle:WindowMs, Cycle:Workers and Cycle:Shards override the
enabled flag, window, worker count and shard count (see configuration).
ASSETS¶
Question: what is this asset, and what is it connected to? The tab is a navigable stack of pages over every asset
class in the running model (AssetExplorerVm). The landing page has one card per class, each with a live count and a
headline metric. Click a card for the fleet list, and click an item for its detail page.
Navigation is a stack: BACK pops one page, ASSETS returns to the landing page, and the breadcrumb shows the trail. A detail page links onward: a circuit to its two substations, a substation to its plant and circuits, a generator to its bus, a transformer to its HV, LV and regulated buses, an interconnector to its landing substation. The header shows the simulated time and tick of the frame on screen. Only the visible page refreshes, and navigation refreshes the page it reveals. The explorer refreshes per frame only while its gate is set, which the desktop chapter's Limits describes.
| Card | Count | Headline metric |
|---|---|---|
| GENERATORS | Non-interconnector generators | Dispatched output in GW, with a bar of sum Pg / sum Pmax |
| GENERATOR PHASORS | Same count | ANGLE SPREAD: max minus min VaDeg over all buses, in degrees. Colour: red-amber above 30 degrees, amber above 15, green otherwise. Bar scaled to 60 degrees. |
| INTERCONNECTORS | Interconnector generators | Net Pg in GW, signed: NET IMPORT or NET EXPORT, or BALANCED when |net| is below the shared 0.5 MW idle cut-off (StatusLampRules.IdleInterconnectorMw) |
| TRANSFORMERS | Transformer branches | MEAN LOADING: mean LoadingPercent over rated transformers |
| CABLES & LINES | Non-transformer branches | PEAK CIRCUIT LOADING: the highest LoadingPercent among rated circuits |
| SUBSTATIONS | Buses | Count of buses outside 0.94 to 1.06 pu, or ALL IN VOLTAGE BAND |
| TAP CHANGERS | OLTCs | n / N OLTCs whose controlled bus is within DeadbandPu of TargetVpu |
The generator, circuit, transformer and substation pages cap the register at 200 rows, and the phasor page at 64 tiles. The capped pages say showing n of N (circuits and transformers add heaviest loaded first). The interconnector and tap-changer pages have no cap. Rows are keyed by model
index, because names repeat on gb-full.
GENERATORS¶
The fleet page shows tiles for total output (GW), n of N online (positive Pg), synchronous share
(sum sync Pg / sum Pg) and the largest unit. Rows are ordered by output and show fuel, output, utilisation
Pg / Pmax and H n or CONVERTER.
The detail page shows:
- OUTPUT, CAPACITY, UTILISATION and FUEL CLASS, and an OUTPUT dial against nameplate.
INERTIA CONTRIBUTION: H, stored energyH x MBasein MW.s and GVA.s, the share of systemsum(H x MBase), and the system total. A converter readsconverter - no inertia.PHASOR POWER FACTORandOPERATING POINT:S = sqrt(P^2 + Q^2),PF = |P| / S, and LAGGING forQ > 0, LEADING forQ < 0. The view labels Q as estimated: it is the bus net reactive injection plusQd, shared to the unit by its share of the bus'sPg. It is exact with one machine on the bus.- An estimated fuel-burn card. The fuel volume comes from textbook heat rates (CCGT, CHP and Gas 6.5 GJ/MWh with gas at
38.7 MJ/m^3; OCGT 10 GJ/MWh; coal 0.34 t/MWh; biomass 0.55 t/MWh; nuclear 3.9 g U-235 per MWh). The CO2 line reads the
one carbon table,
CarbonIntensityTable(CCGT, CHP and Gas 0.394 t/MWh, OCGT 0.651, coal 0.937, biomass 0.120 on NESO's supply-chain basis), so it matches THE MACHINE and MARKET for the same unit. Plants that burn nothing show the CO2 avoided against a CCGT at the table's 0.394 t/MWh. Every line is labelled estimated. - NAMEPLATE & CONNECTION: voltage setpoint, reactive output, limits and the connected bus.
- An output history of up to 96 samples, holding only the frames seen since the page opened.
- SUBSYSTEMS and EVENT LOG, both tagged
STATIC DEMO: fixed rows chosen by fuel class, not telemetry.
GENERATOR PHASORS¶
The page (GeneratorPhasorFleetVm, title PHASOR MAP) shows a grid of phasor discs, one per generator, up to 64 by
output. Tiles show output, the voltage angle of the unit's bus in degrees, the bus voltage in pu, PF, and LEAD, LAG or
UNITY, with the same estimated Q as the detail page. The header shows total output, units online and the angle spread
across the generators' buses. Click a tile for the generator page. The angle is the solved voltage angle of the bus
the unit connects to, not an internal rotor angle.
INTERCONNECTORS¶
Tiles: total capacity, net flow, links importing n of N, and the largest flow. Each row shows the route
(Interconnectors.RouteOf), signed flow, a badge (IMPORTING or EXPORTING, or IDLE when |Pg| is below the shared 0.5 MW cut-off),
and utilisation |Pg| / Pmax. The detail page shows flow, capacity, direction, the landing substation, its voltage
and co-located generation, and a history of up to 96 samples, holding only the frames seen since the page opened.
TRANSFORMERS¶
Tiles: count, voltage bands, mean loading and n of N OLTC fitted. Rows are ordered by loading and show the band
(400->132 kV), rating, loading, flow, tap ratio and an OLTC tag. The OLTC tag and the detail page's OLTC card follow
the solver's own OLTC-to-branch mapping (by name and controlled-bus end), so of two parallel transformers sharing a
name only the regulated one carries them. The detail page has a schematic, whose bushing badges show the
phase-to-neutral voltage V_LL / sqrt(3), the same on all three phases (the power flow is balanced), flow HV to LV,
rating, tap ratio, loading history, voltage and reactive flow at both ends (in kV and pu), and the OLTC card: regulated
bus, target, live voltage, tap range, step in per cent, deadband, and state IN BAND, HIGH or LOW. The THERMAL, DISSOLVED
GAS ANALYSIS, PROTECTION and EVENT LOG sections hold fixed values (top oil 58 degC, hot spot 71 degC, DGA ppm,
all relays healthy) that are not telemetry. Each of those headers carries an amber STATIC DEMO tag, the TOP-OIL and
HOT-SPOT dials read TOP-OIL DEMO and HOT-SPOT DEMO, and the schematic header is tagged
TEMPERATURES: STATIC DEMO because the temperatures it draws are the same fixed values.
CABLES & LINES¶
A chip row filters by voltage band, snapped to 400, 275, 132, 66, 33 or 11 kV. The register is re-ranked on every
frame, so it stays ordered by the live loading and a circuit that becomes heavily loaded enters the capped list. Tiles: circuit count, live transfer
(sum |PFromMw|), the highest loaded circuit and the count above 80 %. The detail page shows loading, signed flow,
rating, real loss, a loading history, in and out voltages oriented by the direction of real power, deltaV, angle
spread, the reactive balance (a net MVAr SINK when QLossMvar >= 0, a SOURCE otherwise), the current at each end
S / (sqrt(3) x V), series R, X and B and X/R. ROUTE INTEGRITY, THERMAL ENVELOPE, ACCESS & CIVIL and EVENT LOG hold
fixed values (conductor 62 degC, 90 degC limit, survey dates), each header tagged STATIC DEMO, and the conductor
dial reads CONDUCTOR DEMO. A circuit page is keyed by the branch's index, confirmed by its ends and name
(AssetLookup.FindBranch), so on a model that repeats a circuit name (a materialised GDA zone or a user case; the
bundled gb-full names are unique) each namesake opens its own page, and a circuit with no name opens too. When the model changes under an open page and the branch cannot be found, or two branches
share its ends and name, the page says the circuit is not in the current model.
SUBSTATIONS¶
A chip row filters by voltage level. Tiles: bus count, levels, total demand and buses out of band. Rows are ordered by
voltage then demand and show kV, solved voltage (voltage ramp), demand, generation and connection count. The detail
page shows voltage, angle, demand and reactive demand, generation, bus type (SLACK, PV or PQ) and base kV, a single-line
diagram, a voltage history, CONNECTIONS (every touching branch with the absolute flow at this end, an OUT -> or <- IN marker, and loading, unrated when
it has no rating), CONNECTED PLANT, and SUPPLY CONTEXT (net injection, net source above +5 MW or net sink below -5 MW,
transformer and line counts). Everything on the substation pages is read from the model and the solve. Connection rows are one per branch (keyed by the
branch's model index, N258), so parallel branches that share a name each have their own row and open their own page.
The interconnector fleet rows and pages are likewise one per link, opened by the unit's index, so two links that share a
name (gb-full's two Auchencrosh links) each show and open their own.
In bridge mode, a substation page opened from the map also queries the bridge for that bus's per-asset data
(generator envelope, battery storage, tap-changer wear, consumers). The rows are formatted by
AssetInsightFormatter and the page says when none resolved or why the query failed.
TAP CHANGERS¶
Tiles: count, n of N in deadband, and mean target. Each row shows the transformer, the regulated bus, target, tap
range and step, the live voltage, the deviation in milli-pu and an IN BAND, HIGH or LOW badge. Click a row for the
transformer page.
On the web¶
The web explorer has the same pages for six classes and has no GENERATOR PHASORS card. Its circuit page labels the
route integrity, thermal, access and event-log panels STATIC DEMO. Its SCADA click-through lands on ASSETS.
GENERATION & INERTIA¶
Question: how much of the dispatch spins? The tab reads the generators of the frame. Its tiles are TOTAL
GENERATION, SYSTEM INERTIA (SystemInertiaGvaS), SYNCHRONOUS SHARE and EST. CO2 in tCO2/h from the same stack rate as
THE MACHINE. Panels:
- GENERATION MIX BY FUEL, biggest first, with GW, share and the inertia each fuel carries.
- INERTIA BY CLASS.
- IMPORT LINKS: each interconnector with
|Pg|of 0.5 MW or more, a signed flow, a badge and a centred bar ofPg / Pmax, and the net flow asGW net importorexport. - THE GRID AS ONE MACHINE: speed dial (2,970 to 3,030 rpm), torque
P / (2 pi f)in MNm, and SYNCHRONOUS vs CONVERTER, FOSSIL and RENEWABLE totals. - STABILITY REGIME:
GAS FOR STABILITY n GW spinningwhen renewable output exceeds fossil and some gas is online,LOW INERTIA REGIMEwhen the synchronous share is below 0.40 (PresentationConstants.SyncShareModerateFraction), otherwisesynchronous-backed. - The TSGB DEVICE what-if: sliders for synthetic inertia (0 to 150 GVA.s, default 30) and fast response (0 to 10 GW,
default 2), and SIMULATE LARGEST-UNIT TRIP. The trip removes the largest unit and its inertia, runs
FrequencyDynamics.Simulatewith and without the device, and shows RoCoF and nadir for both, the baseline scored against the GB limits (FrequencyLimits.Assess), and the device size that holds 0.125 Hz/s and 49.5 Hz (TsgbSizer.SizeForTargets). A right-click trip on the NETWORK map drives the same panel. The method is in frequency studies.
The web GENERATION & INERTIA tab shows the mix, the inertia and carbon block, the stability note keyed to the
synchronous share (healthy at SyncShareHealthyFraction or more, moderate at 0.40 or more, otherwise converter
dominated), and a behind-the-meter note.
HUMAN SCALE¶
Question: what do these numbers mean in everyday units? The tab (HumanScaleVm) restates real streamed quantities
(generation, system inertia, RoCoF, demand, losses) as cars, homes, kettles and showers. The view is headed
JUST FOR FUN. It is presentation only, and no decision reads it. Each figure is a faithful conversion with a stated
anchor. Counts of cars, homes and kettles are whole numbers with grouping. The physical read-outs keep their own
precision: torque 2 decimals in MN.m, Mach number 1 decimal, rpm and GJ whole numbers, rpm per second 1 decimal and
losses whole MW.
| Panel | Formula |
|---|---|
| Shaft torque | T = Pgen x 1e6 / (2 pi f), in MN.m and ft.lb (1 Nm = 0.7376 ft.lb), and in family cars at 200 Nm each. |
| Shaft horsepower | Pgen / 745.7 W, in family cars at 130 hp and Formula 1 cars at 1,000 hp. |
| Grid speed | f / 50 x 3000 rpm, and blade-tip speed 2 pi f x 0.9 m (LpBladeTipRadiusM) against 343 m/s. |
| Stored spin | SystemInertiaGvaS GVA.s taken as GJ, times 277.78 kWh per GJ, in EVs at 60 kWh, homes at 8 kWh per day and kettle boils at 0.1 kWh. |
| Live braking power | 2 x E x |RoCoF| / f in MW (E in MW.s) and hp. DELIVERING when RoCoF is below -1e-4 Hz/s, SOAKING UP above +1e-4, COASTING otherwise. Also RoCoF in rpm per second, |RoCoF| x 60. |
| The load | Demand as kettles at 3 kW, homes at 0.5 kW mean draw and showers at 8.5 kW. Losses as homes and kettles. |
THE TWIST is the one panel the view tags as real (THIS ONE IS REAL). It takes the solved bus voltage angles
VaDeg, buckets buses into four latitude bands by bus name on GB models (SCOTLAND, NORTHERN ENGLAND, THE MIDLANDS,
LONDON & THE SOUTH) and into three bands by map Y elsewhere, and references every angle to the mean of the southern
band. It shows the mean lead per band, the end-to-end spread, the widest angle across a single in-service branch (from
end, less any phase shift, minus to end) as a share of the 90 degree sin(delta) peak, naming that branch, and every
synchronous unit of 10 MW or more ranked by the lead of its bus. The sin(delta) peak applies to the angle across one
series reactance, which is why the share is taken per branch and not from a bus's angle against the south; it is a
steady-state bus-angle margin, not a rotor-angle or small-signal one. Units are listed one row each, by model index.
For a two-pole set electrical degrees equal mechanical degrees, which is why the view calls the lead a rotor twist. The
number is the angle of the unit's bus, not a measured rotor angle.
The web tab has the same panels. In the raw public-data replay THE TWIST is replaced by a note, because it needs solved angles.
SPEED DOMAINS¶
Question: does one speed domain carry enough inertia to anchor recovery? The tab (DomainsVm) is experimental. It
groups the generators of the frame into speed domains with DomainAssignment.Assign
(src/GridSim.Core/Dynamics/Distributed/DomainAssignment.cs):
domain = machines sharing (poles, kind), from PoleMap.ForType(type)
E_d (MW.s) = sum(H x MBase)
S_d (MVA) = sum(MBase)
GVad = sum(MBase x availability) availability = clamp(|Pg| / MBase, 0, 1)
rpm = 6000 / poles at 50 Hz
deltaGVa = (GVad_1 - GVad_2) / GVad_2 top two domains by GVad
dominant = deltaGVa >= 0.10 (DistributedConfig.DominanceThreshold)
A sole domain, or a runner-up with zero GVad, reads sole domain and is dominant. Pole assignment is PoleMap: coal,
nuclear, biomass, CCGT, OCGT, CHP and gas are 2-pole at 3,000 rpm, recip is 4-pole at 1,500, hydro and pumped storage
are 8-pole at 750, storage is a virtual synthetic-inertia domain, and everything else inverter-based is a virtual PLL
domain. Any machine whose type maps to a virtual domain (so with no pole count) but has H > 0 becomes a 2-pole synchronous machine, whatever its fuel. PoleMap.ForType matches the lower-cased raw type string, so pumped-storage, pumped, battery and bess are also accepted, and it does not use FuelTaxonomy.
The tab shows the domain count, deltaGVa, the dominant domain with the line Domain n carries waveform authority or
none - inertia too evenly spread, a GVad bar per domain and a spinning-inertia bar per domain, and the gap sentence.
Bars are green for the dominant domain, blue for other synchronous domains and purple for virtual ones. The provenance
line reads that domain structure and GVad are grounded in the model while per-bus spatial spread and propagation delay
are unvalidated at scale. The type-to-pole map is a modelling assumption, since the data holds no pole or speed field. A
fixed footnote in the view states that real rotational inertia sits almost entirely in the synchronous thermal domain.
The web tab shows the same panels from TabProjections.Domains.
INVERTER FLEET¶
Question: what does the authored inverter fleet do that the synchronous fleet cannot? The tab (InverterFleetVm)
shows OFF, with the text Inverter-fleet dynamics are OFF for this session, until the case ships an
asset-classes.json that binds assets, because the asset-aware frequency integrator
(AssetAwareFrequencyIntegrator) is then driving the frequency. When active it shows:
| Item | Source |
|---|---|
| NET FLEET RESPONSE | SimFrame.AssetFleetNetMw, signed MW. |
| CLASSES, BOUND UNITS, TRIPPED (LoM) | Class count, the sum of unit counts, and the sum of tripped counts, red when above 0. |
| PER-CLASS RESPONSE | Class, mode (green for grid-forming, blue otherwise), units, online MW, tripped, and state of charge when above 0. |
| Loss-of-Mains warning | Shown when AssetTrippedMw is above 0: that much embedded generation tripped on RoCoF or vector-shift protection and was added to the deficit, the feedback loop of 9 August 2019. |
Grid-forming units inject synthetic inertia in proportion to df/dt and ride through. Grid-following units droop on
measured local frequency and trip on RoCoF or vector shift. Provenance: every control parameter (gains, timings, relay
settings) is vendor-proprietary and approximated from the literature, tagged [VERIFY] in the view. The fleet response
is unvalidated at scale. Capacity and location are grounded, and the curve shape is assumption-driven. The web tab
shows the same table and an OFF message otherwise.
EXPERIMENTAL¶
Question: is this state physically admissible, and what do the opt-in models say about it? The tab
(ExperimentalVm) computes its models only while it is the selected tab. Selecting it computes the newest frame at once.
The work runs on a worker thread, one computation at a time, and a frame that arrives meanwhile is parked, with only the
newest parked frame computed next.
Physics conformance¶
PhysicsLaws.Audit(model, result) recomputes ten laws per branch and bus independently of the solver, with a pass
threshold of 1e-6 MVA on the MVA-scale residuals. The table shows number, law, status, residual with its unit, and
the gate. Names come from PhysicsCheckRegistry.Names:
| Law | Name | Gate |
|---|---|---|
| 1 | Conservation of energy | HARD |
| 2 | Ohm's law | HARD |
| 3 | Joule heating | HARD |
| 4 | Faraday induction | |
| 5 | Ampere's law (passivity) | |
| 6 | Kirchhoff's current law | HARD |
| 7 | Kirchhoff's voltage law | |
| 8 | Complex power S = V I* | HARD |
| 9 | AC phase & frequency synchronism | |
| 10 | Gauss's law / Coulomb |
The hard-gate set is PhysicsCheckRegistry.HardGateLaws. The status is Holds (green), Violated (red), or Constitutive,
NotModeled or NotApplicable (muted). The verdict reads ADMISSIBLE - all hard laws hold in green or REJECTED - a hard
law is violated in red, and a violated non-hard law does not reject. The same audit is the physics-check verb in
validation tools, and the laws are specified in
physics conformance.
Experimental models¶
All are opt-in, provenance-tagged and off the validated solver path. The panel is headed
EXPERIMENTAL MODELS * opt-in, off the validated path.
| Model | Shows | Skipped when |
|---|---|---|
RECIPROCITY (Y = Y^T) |
ReciprocityCheck.Evaluate: status and the asymmetry residual. |
Never. |
| CONTINUUM WAVE | ContinuumWaveModel.FromSolvedCase: the dominant inter-area mode in Hz, and the machines swinging against each other (buses with a signed mode-shape amplitude beyond plus or minus 0.05). |
Reads needs per-machine inertia when the solve did not converge, there are no generators, or any generator has no inertia constant. The model is then not built. |
| POWER-FLOW TRACE | PowerFlowTracing.Trace: Bialek proportional sharing, the six largest generator-to-load allocations in MW. |
trace skipped (>1500 buses), and flow graph has a cycle - proportional trace not defined when the flow graph is cyclic. |
| CARBON INTENSITY | CarbonTracing.Trace: a flow-traced system intensity in gCO2/kWh from the same carbon table (coal 0.937, OCGT 0.651, CCGT, CHP and generic gas 0.394, oil 0.935, biomass 0.12, imports and grid infeeds 0, unknown 0.3 t CO2 per MWh). On a distribution model fed mostly by grid infeeds the figure is near zero at infeed-fed loads. |
- above 1,500 buses (HeavyModelBusLimit). |
The three carbon figures in the app, the MACHINE stack rate, the MARKET grid intensity and this tracing figure, read
one figure per fuel from CarbonIntensityTable, so the same dispatch gives the same carbon on each.
On the web¶
The web EXPERIMENTAL tab has the continuum wave, reciprocity, carbon and the power-flow trace, with a hero colour that follows reciprocity. It has no law table. The law audit is its own CONFORMANCE tab (an ADMISSIBLE or IMPOSSIBLE hero and one row per law with a gate mark). The web also has TRIP / DEVICE and AUDIT LOG tabs, which the desktop app summarises. The CHARTS and LIVE tabs exist only in the strip shown for a raw public-data replay.
The Inspector¶
NESO RP1 and MECHANICAL share a drill-down overlay (InspectorVm). Click an aggregate and the Inspector shows how it is
made up for the displayed frame. It has a title and subtitle, a row of stat tiles, and constituent rows. A row that can
drill further shows a chevron. Every hop pushes the previous page on a back stack, BACK retraces it and the close button
clears it.
| Start | Page |
|---|---|
| RP1 fuel row | The fuel's units, ordered by output. Tiles: UNITS, TOTAL OUTPUT, MEAN, AVG LOADING (mean of Pg / capacity) and INERTIA. Each row shows output, KE in GVA.s, H and loading, or converter (0 inertia). |
| A unit | OUTPUT, HEADROOM, LOADING, INERTIA, and rows for fuel (drills back up), real power, headroom to capacity, H, stored KE and whether the unit is intrinsic. |
| RP1 BM row | LEVEL, ACTION and STABILITY, and Why: a synchronous unit turning up or down changes real intrinsic inertia, and a non-synchronous action changes MW and not intrinsic inertia. |
| RP1 interconnector row | FLOW, DIRECTION and CORRELATED, with the corridor name and each other member's flow as a row that drills to that member. importing - a trip is a loss of infeed or exporting - not an infeed loss. |
| MECHANICAL machine row | The per-machine card described under MECHANICAL. |
The Inspector reads the frame on screen only. If you leave the transport running, the numbers you drilled into belong to the frame you clicked.
Limits¶
- N-1 shard coverage on CYCLE is cumulative since the case was loaded, so it shows that the rotation has reached every shard, not that every shard's result is recent.
- The OPERATOR view does not display the response, net interconnector, voltage-band or warnings-list values its model computes, and the MARKET view does not display the system sell price, day-ahead price, net imbalance volume or the per-interconnector price.
See also¶
- The desktop app - starting the app, tabs tour, transport bar, source pickers, the map
- Frequency studies - tripping an infeed and watching these tabs react
- Replaying estimated states - bridge sources and the SRC picker
- The GDA bridge - the server that feeds the lake-only panels
- Harmonic studies - the HARMONICS tab
- Validation tools -
physics-check, the CLI form of the conformance audit - Physics conformance - the laws, residuals and the gate
- Frequency dynamics - the swing equation behind the dial and the trip what-if
- CLI reference - every verb