EnerOS v0.23.0 Release Notes
Release Date: August 3, 2025 Codename: Analysis Git Tag: v0.23.0 Support Status: Stable Total Crates: 56 (4 new) Test Cases: 7100+ (500+ new)
Overview
EnerOS v0.23.0 “Analysis” is a specialized release for grid analysis tools, providing dispatchers and Agents with complete grid analysis capabilities. Power system operation requires continuous safety assessment: N-1 verification ensures the system can still operate stably after any component failure, short circuit calculations provide basis for protection setting, transient stability analysis assesses system dynamic behavior after large disturbances, and small-signal analysis reveals system oscillation characteristics under small disturbances. v0.23.0 brings these analysis tools from standalone software down to kernel services, allowing Agents to invoke them directly through syscalls.
This version introduces four core analysis capabilities: N-1 Contingency Verification, Short Circuit Calculation, Transient Stability Analysis, and Small Signal Analysis, unified as the eneros-analysis toolkit, supporting parallel computation and incremental analysis.
In terms of design philosophy, v0.23.0 implements “analysis as a service”—all analysis capabilities are provided as kernel services, Agents do not need to implement analysis algorithms themselves, and can obtain results through syscalls. Analysis results are returned in structured report format for further Agent decision-making.
Key Metrics
| Metric | Value | Description |
|---|---|---|
| N-1 verification (IEEE 118) | 1.2s | 118 contingencies |
| N-1 verification (1000 nodes) | 8.5s | 1500 contingencies |
| Short circuit calculation (three-phase) | 15ms | Single fault |
| Transient stability (10s simulation) | 350ms | 100 nodes |
| Small signal analysis (1000 nodes) | 280ms | Full eigenvalues |
| New Crates | 4 | Analysis-related |
| New tests | 500+ | Including IEEE standard cases |
New Features
1. Grid Analysis Toolkit
Introduced the eneros-analysis Crate, uniformly encapsulating grid analysis capabilities and providing a consistent service interface.
Service Interface
use eneros_analysis::{AnalysisService, AnalysisRequest, AnalysisResult};
let service = AnalysisService::new(&network);
// Unified invocation entry
let result: AnalysisResult = service.analyze(AnalysisRequest::N1 {
contingencies: ContingencySet::all_elements(),
check: Check::all(),
}).await?;
// Structured results
match result {
AnalysisResult::N1(report) => {
println!("Pass rate: {:.1}%", report.pass_rate());
for v in report.violations() {
println!("Overlimit: {}", v);
}
}
_ => unreachable!(),
}
Analysis Capability List
| Analysis Type | Purpose | Computational Complexity | Parallelism |
|---|---|---|---|
| N-1 verification | Static security assessment | O(n) | High |
| N-2 verification | Severe fault assessment | O(n²) | High |
| Short circuit calculation | Protection setting | O(1) | Medium |
| Transient stability | Dynamic security assessment | O(t×n) | Medium |
| Small signal analysis | Oscillation analysis | O(n³) | Low |
| Harmonic analysis | Power quality | O(n log n) | Medium |
2. N-1 Verification
Introduced the eneros-analysis-n1 Crate, providing N-1 static security verification. For each component in the system (lines, transformers, generators), it assumes failure one by one and verifies whether the system meets all constraints after the fault.
Basic Usage
use eneros_analysis_n1::{N1Verifier, Contingency, Check};
let verifier = N1Verifier::new(&network)
.parallelism(8) // 8-way parallel
.incremental(true); // Incremental analysis
// Verify all line N-1
let report = verifier.verify(
Contingency::all_lines(),
Check::all(), // Voltage + thermal stability + reserve
).await?;
for case in report.failed_cases() {
println!("Fault {}: {} exceeded by {:.1}%",
case.contingency, case.violation_type, case.severity);
}
Incremental Analysis
// Analyze only contingencies affected by topology changes
let delta = verifier.verify_delta(
TopologyChange::SwitchOpened(switch_id),
).await?;
println!("Affected contingencies: {}", delta.affected_count);
println!("New violations: {}", delta.new_violations.len());
N-1 Verification Results
| Fault Type | Total | Passed | Overlimits | Pass Rate |
|---|---|---|---|---|
| Line faults | 186 | 182 | 4 | 97.8% |
| Transformer faults | 32 | 32 | 0 | 100% |
| Generator faults | 24 | 23 | 1 | 95.8% |
| Bus faults | 12 | 11 | 1 | 91.7% |
3. Short Circuit Calculation
Introduced the eneros-analysis-shortcircuit Crate, providing short circuit current calculation. Supports four fault types: three-phase short circuit, two-phase short circuit, single-phase ground fault, and two-phase ground fault, following the IEC 60909 standard.
Fault Calculation
use eneros_analysis_shortcircuit::{ShortCircuit, FaultType, FaultLocation};
let sc = ShortCircuit::new(&network)
.method(Method::IEC60909)
.voltage_level(VoltageLevel::All);
// Calculate three-phase short circuit at bus 42
let result = sc.calculate(
FaultLocation::Bus(42),
FaultType::ThreePhase,
).await?;
println!("Short circuit current: {:.2} kA", result.current_kA);
println!("Short circuit capacity: {:.1} MVA", result.mva);
println!("Peak current: {:.2} kA", result.peak_kA);
Scan Calculation
// Full network short circuit scan
let scan = sc.scan_all(FaultType::ThreePhase).await?;
for bus in scan.high_current_buses(threshold_kA: 20.0) {
println!("Bus {}: {:.2} kA", bus.id, bus.current_kA);
}
Short Circuit Calculation Parameters
| Fault Type | Symmetrical Components | Calculation Method | Standard |
|---|---|---|---|
| Three-phase short circuit | Positive sequence | Equivalent circuit | IEC 60909 |
| Two-phase short circuit | Positive + negative sequence | Equivalent circuit | IEC 60909 |
| Single-phase ground | Positive + negative + zero sequence | Equivalent circuit | IEC 60909 |
| Two-phase ground | Positive + negative + zero sequence | Equivalent circuit | IEC 60909 |
4. Transient Stability Analysis
Introduced the eneros-analysis-transient Crate, providing transient stability analysis. Based on time-domain simulation, it simulates system dynamic behavior after large disturbances (such as three-phase short circuits), assessing whether generators can maintain synchronism.
Time-Domain Simulation
use eneros_analysis_transient::{TransientSimulator, Disturbance, Solver};
let simulator = TransientSimulator::new(&network)
.solver(Solver::Rk45) // Runge-Kutta adaptive
.time_step(Duration::milliseconds(1))
.duration(Duration::seconds(10));
// Simulate three-phase short circuit fault
let disturbance = Disturbance::Fault {
location: BusId::from(42),
type: FaultType::ThreePhase,
start: Duration::milliseconds(0),
clear: Duration::milliseconds(100), // 100ms clearing
};
let result = simulator.run(disturbance).await?;
println!("Maximum angle difference: {:.1}°", result.max_angle_diff());
println!("Stability assessment: {}", if result.is_stable() { "Stable" } else { "Unstable" });
Power Angle Curve
// Get generator power angle curve
for gen in result.generators() {
let curve = result.angle_curve(gen);
println!("{}: max angle {:.1}°, final value {:.1}°",
gen.name, curve.max(), curve.last());
}
Transient Stability Metrics
| Metric | Threshold | Assessment |
|---|---|---|
| Maximum angle difference | < 180° | Stable |
| Frequency deviation | < 0.5 Hz | Stable |
| Voltage drop | > 0.0 pu | Stable |
| Damping ratio | > 0.05 | Good |
5. Small Signal Analysis
Introduced the eneros-analysis-smallsignal Crate, providing small signal stability analysis. By linearizing system equations, it calculates eigenvalues and participation factors, assessing system oscillation characteristics under small disturbances.
Eigenvalue Analysis
use eneros_analysis_smallsignal::{SmallSignal, EigenAnalysis};
let ss = SmallSignal::new(&network)
.operating_point(¤t_state);
// Calculate full eigenvalues
let eigen: EigenAnalysis = ss.eigenvalues().await?;
for ev in eigen.oscillatory_modes() {
println!("Frequency: {:.2} Hz, damping ratio: {:.2}%, eigenvalue: {:.4}",
ev.frequency_hz, ev.damping_ratio * 100.0, ev.value);
}
Participation Factors
// Identify related generators of oscillation modes
for mode in eigen.low_damping_modes(threshold: 0.05) {
let participants = mode.participants().top(3);
println!("Oscillation mode {:.2} Hz:", mode.frequency_hz);
for p in participants {
println!(" {}: participation {:.2f}", p.generator, p.factor);
}
}
Small Signal Analysis Results
| Mode | Frequency (Hz) | Damping Ratio (%) | Type | Assessment |
|---|---|---|---|---|
| 1 | 0.75 | 8.2 | Inter-area | Good |
| 2 | 1.23 | 5.1 | Local | Good |
| 3 | 0.92 | 3.2 | Inter-area | Alert |
| 4 | 1.85 | 12.5 | Local | Good |
| 5 | 0.65 | 2.1 | Inter-area | Warning |
Improvements
- Parallel Computation: N-1 verification supports multi-threading, 6.5x speedup on 8 cores
- Incremental Analysis: N-1 verification supports incremental updates, only computing affected parts during small topology changes
- Result Caching: Analysis results cached by fingerprint under same conditions, repeated queries reduced from seconds to milliseconds
- Report Export: Analysis results support CSV, JSON, and PDF format export
Bug Fixes
- Fixed
eneros-analysis-n1incorrect verification results after electrical island splitting (#2308) - Fixed
eneros-analysis-shortcircuitzero-sequence network construction error (#2312) - Fixed
eneros-analysis-transientnumerical divergence at large step sizes (#2317) - Fixed
eneros-analysis-smallsignalunstable eigenvalue sorting (#2322)
Breaking Changes
AnalysisService::analyze: Parameter changed from&AnalysisRequesttoAnalysisRequest(ownership transfer)N1Report: Fieldcasesrenamed tocontingency_cases, providing clearer semantics
Upgrade Guide
- Run
cargo update -p eneros-analysis - Update
AnalysisService::analyzecalls to adapt to ownership transfer - Update
N1Report.casesfield access tocontingency_cases - Refer to
docs/migration/v0.23.0.mdfor detailed migration steps