Skip to main content

ucte_area_probe/
ucte_area_probe.rs

1//! Country areas from a UCTE file, and what each is currently exchanging.
2fn main() {
3    for path in std::env::args().skip(1) {
4        let net = gridoxide::ucte::read(&path).expect("import");
5        let (of_bus, names) = net.country_areas();
6        let (lines, transformers) = net.as_switched();
7        let report = gridoxide::run_power_flow(
8            net.buses.clone(),
9            &lines,
10            &transformers,
11            &net.shunts,
12            gridoxide::TapData::none(),
13            gridoxide::PowerFlowOptions {
14                tol: 1e-10,
15                max_iter: 40,
16                ..Default::default()
17            },
18        );
19        let x = gridoxide::outerloop::AreaInterchange::measure(
20            &report.buses,
21            &lines,
22            &transformers,
23            &of_bus,
24            names.len(),
25        );
26        println!(
27            "{path}: {} areas {names:?}, solve {:?}",
28            names.len(),
29            report.stats.status
30        );
31        for (i, n) in names.iter().enumerate() {
32            let buses = of_bus.iter().filter(|a| **a == Some(i)).count();
33            println!(
34                "    {n}: {buses:>3} bus(es), exporting {:>9.3} MW",
35                x[i] * net.base_mva
36            );
37        }
38        println!(
39            "    unassigned buses: {}",
40            of_bus.iter().filter(|a| a.is_none()).count()
41        );
42        println!(
43            "    sum of positions (= tie losses): {:.3} MW",
44            x.iter().sum::<f64>() * net.base_mva
45        );
46    }
47}