Skip to main content

v0.23.0 Release Notes

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

MetricValueDescription
N-1 verification (IEEE 118)1.2s118 contingencies
N-1 verification (1000 nodes)8.5s1500 contingencies
Short circuit calculation (three-phase)15msSingle fault
Transient stability (10s simulation)350ms100 nodes
Small signal analysis (1000 nodes)280msFull eigenvalues
New Crates4Analysis-related
New tests500+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 TypePurposeComputational ComplexityParallelism
N-1 verificationStatic security assessmentO(n)High
N-2 verificationSevere fault assessmentO(n²)High
Short circuit calculationProtection settingO(1)Medium
Transient stabilityDynamic security assessmentO(t×n)Medium
Small signal analysisOscillation analysisO(n³)Low
Harmonic analysisPower qualityO(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 TypeTotalPassedOverlimitsPass Rate
Line faults186182497.8%
Transformer faults32320100%
Generator faults2423195.8%
Bus faults1211191.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 TypeSymmetrical ComponentsCalculation MethodStandard
Three-phase short circuitPositive sequenceEquivalent circuitIEC 60909
Two-phase short circuitPositive + negative sequenceEquivalent circuitIEC 60909
Single-phase groundPositive + negative + zero sequenceEquivalent circuitIEC 60909
Two-phase groundPositive + negative + zero sequenceEquivalent circuitIEC 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

MetricThresholdAssessment
Maximum angle difference< 180°Stable
Frequency deviation< 0.5 HzStable
Voltage drop> 0.0 puStable
Damping ratio> 0.05Good

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(&current_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

ModeFrequency (Hz)Damping Ratio (%)TypeAssessment
10.758.2Inter-areaGood
21.235.1LocalGood
30.923.2Inter-areaAlert
41.8512.5LocalGood
50.652.1Inter-areaWarning

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-n1 incorrect verification results after electrical island splitting (#2308)
  • Fixed eneros-analysis-shortcircuit zero-sequence network construction error (#2312)
  • Fixed eneros-analysis-transient numerical divergence at large step sizes (#2317)
  • Fixed eneros-analysis-smallsignal unstable eigenvalue sorting (#2322)

Breaking Changes

  • AnalysisService::analyze: Parameter changed from &AnalysisRequest to AnalysisRequest (ownership transfer)
  • N1Report: Field cases renamed to contingency_cases, providing clearer semantics

Upgrade Guide

  1. Run cargo update -p eneros-analysis
  2. Update AnalysisService::analyze calls to adapt to ownership transfer
  3. Update N1Report.cases field access to contingency_cases
  4. Refer to docs/migration/v0.23.0.md for detailed migration steps