use bevy_app::{plugin_group, prelude::*};
use bevy_ecs::prelude::*;
use crate::io::pandapower::ecs_net_conv::pandapower_init_system;
use super::{elements::*, network::*, powerflow::prelude::*};
#[derive(Debug, SystemSet, Hash, Eq, PartialEq, Clone)]
pub struct BeforePFInitStage;
#[derive(Debug, SystemSet, Hash, Eq, PartialEq, Clone)]
pub struct PFInitStage;
#[derive(Debug, SystemSet, Hash, Eq, PartialEq, Clone)]
pub struct AfterPFInitStage;
#[derive(Default)]
pub struct BasePFPlugin;
#[derive(Default)]
pub struct SwitchPluginTypeA;
#[derive(Default)]
pub struct SwitchPluginTypeB;
impl Plugin for BasePFPlugin {
fn build(&self, app: &mut bevy_app::App) {
app.world_mut().insert_resource(PowerFlowConfig {
max_it: None,
tol: None,
});
app.world_mut().insert_resource(PowerFlowSolver::default());
app.configure_sets(
Update,
(
SolverStage::BeforeSolve,
SolverStage::Solve,
SolverStage::AfterSolve,
)
.into_configs()
.chain(),
);
app.add_systems(Update, ecs_run_pf.in_set(SolverStage::Solve));
}
}
impl Plugin for SwitchPluginTypeA {
fn build(&self, app: &mut bevy_app::App) {
app.add_systems(
Startup,
(process_switch_state)
.chain()
.before(init_states)
.in_set(PFInitStage),
);
app.add_systems(
Startup,
(node_aggregation_system.pipe(handle_node_merge))
.chain()
.after(init_states)
.before(apply_permutation)
.in_set(AfterPFInitStage),
);
}
}
impl Plugin for SwitchPluginTypeB {
fn build(&self, app: &mut bevy_app::App) {
app.add_systems(
Startup,
(process_switch_state_admit)
.before(init_states)
.in_set(PFInitStage),
);
}
}
pub fn default_app() -> App {
let mut app = App::new();
app.add_plugins((BasePFInitPlugins, DefaultPlugins));
app
}
#[derive(Default)]
pub struct NewPPLoadPlugin;
impl Plugin for NewPPLoadPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Startup, (pandapower_init_system).before(BeforePFInitStage));
}
}
plugin_group! {
#[derive(Debug)]
pub struct DefaultPlugins {
:BasePFPlugin,
:NewPPLoadPlugin,
#[cfg(feature = "archive")]
crate::io::archive::aurora_format:::ArchivePlugin,
}
}
#[cfg(test)]
mod test {
use std::{env, fs};
use serde_json::{Map, Value};
use crate::{
basic::ecs::{elements::PPNetwork, post_processing::PostProcessing},
io::pandapower::{load_csv_zip, load_pandapower_json_obj},
};
use super::*;
#[test]
fn test_pf_init() {
let mut app = default_app();
let dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let folder = format!("{}/cases/IEEE118", dir);
let name = folder.to_owned() + "/data.zip";
let net = load_csv_zip(&name).unwrap();
app.world_mut().insert_resource(PPNetwork(net));
app.update();
app.post_process();
app.print_res_bus();
}
fn load_json_from_str(file_content: &str) -> Result<Map<String, Value>, std::io::Error> {
let parsed: Value = serde_json::from_str(&file_content)?;
let obj: Map<String, Value> = parsed.as_object().unwrap().clone();
Ok(obj)
}
fn load_json(file_path: &str) -> Result<Map<String, Value>, std::io::Error> {
let file_content = fs::read_to_string(file_path).expect("Error reading network file");
let obj = load_json_from_str(&file_content);
obj
}
#[test]
fn test_ecs_pf_switch_a() {
let dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let folder = format!("{}/cases/test/", dir);
let name = folder.to_owned() + "/new_input_PFLV_modified.json";
let json = load_json(&name).unwrap();
let json: Map<String, Value> = json
.get("pp_network")
.and_then(|v| v.as_object())
.unwrap()
.clone();
let net = load_pandapower_json_obj(&json);
let mut pf_net = default_app();
pf_net.add_plugins(SwitchPluginTypeA);
pf_net.world_mut().insert_resource(PPNetwork(net));
pf_net.update();
pf_net.post_process();
pf_net.print_res_bus();
}
#[test]
fn test_ecs_pf_switch_b() {
let dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let folder = format!("{}/cases/test/", dir);
let name = folder.to_owned() + "/new_input_PFLV_modified.json";
let json = load_json(&name).unwrap();
let json: Map<String, Value> = json
.get("pp_network")
.and_then(|v| v.as_object())
.unwrap()
.clone();
let net = load_pandapower_json_obj(&json);
let mut pf_net = default_app();
pf_net.add_plugins(SwitchPluginTypeB);
pf_net.world_mut().insert_resource(PPNetwork(net));
pf_net.update();
pf_net.post_process();
pf_net.print_res_bus();
}
}