use std::collections::HashMap;
mod bus;
mod ele_process;
mod generator;
mod line;
mod load;
mod sgen;
mod shunt;
mod switch;
mod trans;
mod units;
use crate::io::pandapower;
use bevy_ecs::entity::EntityHash;
use bevy_ecs::prelude::*;
use derive_more::{Deref, DerefMut};
pub use ele_process::*;
use nalgebra::Complex;
#[derive(Debug, Component, Deref, DerefMut, Default, serde::Serialize, serde::Deserialize)]
pub struct VBase(pub f64);
#[derive(Component, Clone, Default, PartialEq, Debug, serde::Serialize, serde::Deserialize)]
pub struct Admittance(pub Complex<f64>);
#[derive(
Component,
Deref,
DerefMut,
Default,
Debug,
Clone,
PartialEq,
serde::Serialize,
serde::Deserialize,
)]
pub struct Port2(pub nalgebra::Vector2<i64>);
impl Port2 {
pub fn new(a: i64, b: i64) -> Self {
Self(nalgebra::Vector2::new(a, b))
}
}
#[derive(Debug, Default, Bundle)]
pub struct AdmittanceBranch {
pub y: Admittance,
pub port: Port2,
pub v_base: VBase,
}
#[derive(Debug, Resource, Deref, DerefMut, serde::Serialize, serde::Deserialize)]
pub struct PPNetwork(pub pandapower::Network);
#[derive(Default, Debug, Resource)]
pub struct NodeLookup {
pub forward: Vec<Option<Entity>>,
pub reverse: HashMap<Entity, i64, EntityHash>,
}
#[derive(Debug, Component, serde::Serialize, serde::Deserialize)]
pub struct AuxNode {
pub bus: i64,
}
#[derive(Debug, Component, serde::Serialize, serde::Deserialize,Clone)]
pub struct Line;
#[derive(Debug, Component, serde::Serialize, serde::Deserialize)]
pub struct Transformer;
#[derive(Debug, Component, serde::Serialize, serde::Deserialize)]
pub struct EShunt;
#[derive(Debug, Resource, serde::Serialize, serde::Deserialize)]
pub struct PFCommonData {
pub wbase: f64, pub f_hz: f64, pub sbase: f64, }
impl NodeLookup {
pub fn len(&self) -> usize {
self.reverse.len()
}
pub fn iter(&self) -> impl Iterator<Item = (i64, Entity)> + '_ {
self.forward
.iter()
.enumerate()
.filter_map(|(i, v)| v.map(|e| (i as i64, e)))
}
pub fn insert(&mut self, bus_id: i64, entity: Entity) {
let idx = bus_id as usize;
if self.forward.len() <= idx {
self.forward.resize_with(idx + 1, || None);
}
if let Some(old_id) = self.reverse.insert(entity, bus_id) {
if let Some(e) = self.forward.get_mut(old_id as usize) {
if *e == Some(entity) {
*e = None;
}
}
}
self.forward[idx] = Some(entity);
}
pub fn remove_entity(&mut self, entity: Entity) {
if let Some(id) = self.reverse.remove(&entity) {
if let Some(slot) = self.forward.get_mut(id as usize) {
if *slot == Some(entity) {
*slot = None;
}
}
}
}
pub fn remove_id(&mut self, bus_id: i64) {
if let Some(Some(entity)) = self.forward.get_mut(bus_id as usize) {
self.reverse.remove(entity);
}
}
pub fn get_entity(&self, bus_id: i64) -> Option<Entity> {
self.forward.get(bus_id as usize).and_then(|x| *x)
}
pub fn get_id(&self, entity: Entity) -> Option<i64> {
self.reverse.get(&entity).copied()
}
pub fn contains_id(&self, bus_id: i64) -> bool {
self.forward
.get(bus_id as usize)
.map_or(false, |e| e.is_some())
}
pub fn contains_entity(&self, entity: Entity) -> bool {
self.reverse.contains_key(&entity)
}
}