Skip to main content

iidm_area_probe/
iidm_area_probe.rs

1//! IIDM control areas: what a file declares, and what each area exchanges.
2fn main() {
3    for path in std::env::args().skip(1) {
4        let net = match gridoxide::iidm::read(&path) {
5            Ok(n) => n,
6            Err(e) => {
7                println!("{path}: {e}");
8                continue;
9            }
10        };
11        let a = &net.areas;
12        println!("=== {path}");
13        println!("    {:?}", a.report);
14        if a.ids.is_empty() {
15            continue;
16        }
17        let report = gridoxide::run_power_flow(
18            net.buses.clone(),
19            &net.lines,
20            &net.transformers,
21            &net.shunts,
22            gridoxide::TapData::none(),
23            gridoxide::PowerFlowOptions {
24                tol: 1e-10,
25                max_iter: 40,
26                ..Default::default()
27            },
28        );
29        let x = gridoxide::outerloop::AreaInterchange::measure(
30            &report.buses,
31            &net.lines,
32            &net.transformers,
33            &a.of_bus,
34            a.ids.len(),
35        );
36        println!("    solve {:?}", report.stats.status);
37        for (i, (id, name)) in a.ids.iter().enumerate() {
38            let n = a.of_bus.iter().filter(|z| **z == Some(i)).count();
39            println!(
40                "    {id:<6} {name:<28} {n:>3} bus(es)  scheduled export {:>9.3} MW  actual {:>9.3} MW",
41                a.targets[i] * net.base_mva,
42                x[i] * net.base_mva
43            );
44        }
45    }
46}