iidm_area_probe/
iidm_area_probe.rs1fn 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}