qsim_elements/
generator.rs1use qsim_core::{GridElement, StateStore};
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct Generator {
9 pub bus: usize,
11 pub active_power: f64,
13 pub reactive_power: f64,
15 pub voltage_setpoint: f64,
17 pub p_min: f64,
19 pub p_max: f64,
21 pub q_min: f64,
23 pub q_max: f64,
25 pub in_service: bool,
27}
28
29impl Generator {
30 pub fn new(bus: usize, active_power: f64, voltage_setpoint: f64) -> Self {
32 Self {
33 bus,
34 active_power,
35 reactive_power: 0.0,
36 voltage_setpoint,
37 p_min: 0.0,
38 p_max: active_power * 2.0,
39 q_min: -active_power,
40 q_max: active_power,
41 in_service: true,
42 }
43 }
44
45 pub fn with_limits(
47 bus: usize,
48 active_power: f64,
49 voltage_setpoint: f64,
50 p_min: f64,
51 p_max: f64,
52 q_min: f64,
53 q_max: f64,
54 ) -> Self {
55 Self {
56 bus,
57 active_power,
58 reactive_power: 0.0,
59 voltage_setpoint,
60 p_min,
61 p_max,
62 q_min,
63 q_max,
64 in_service: true,
65 }
66 }
67}
68
69impl GridElement for Generator {
70 fn element_type(&self) -> &'static str {
71 "Generator"
72 }
73
74 fn apply(&self, state: &mut StateStore) {
75 if self.in_service && self.bus < state.bus_count() {
76 state.active_power[self.bus] += self.active_power;
77 state.reactive_power[self.bus] += self.reactive_power;
78 }
79 }
80}