1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
use clap::ValueEnum;
#[derive(Debug, PartialEq, Copy, Clone, ValueEnum)]
pub enum Alg {
/// Newton's method.
NR = 0,
/// Fast-Decoupled method (BX version).
FDBX = 1,
/// Fast-Decoupled method (XB version).
FDXB = 2,
/// Gauss-Seidel method.
GS = 3,
/// Power/current/admittance summation method (radial networks only).
SUM = 4,
}
#[derive(Copy, Clone)]
pub enum Sum {
POWER,
CURRENT,
ADMITTANCE,
}
/// Type of nodal balance equation.
#[derive(Copy, Clone)]
pub enum NodalBalance {
POWER,
CURRENT,
}
#[derive(Copy, Clone)]
pub enum BusVoltage {
/// bus voltage variables represented in polar coordinates
POLAR,
/// bus voltage variables represented in cartesian coordinates
CARTESIAN,
/// Polar updates computed via modified cartesian Jacobian
HYBRID,
}
#[derive(PartialEq, Copy, Clone)]
pub enum GenQLimits {
IgnoreLimits = 0,
// Simultaneous bus type conversion.
Simultaneous = 1,
// One-at-a-time bus type conversion.
OneAtATime = 2,
}
#[derive(Default)]
pub struct MPOpt {
// Linearized DC power flow that assumes lossless branches,
// 1pu voltages and small voltage angle differences.
pub dc: bool,
pub pf: PFOpt,
pub exp: ExpOpt,
}
#[derive(Clone)]
pub struct PFOpt {
// AC power flow algorithm.
pub algorithm: Alg,
// Termination tolerance on per unit P & Q mismatch. Default value is 1e-8.
pub tolerance: f64,
// Maximum number of iterations for Newton's method. Default value is 10.
pub max_it_nr: usize,
// Maximum number of iterations for fast decoupled method. Default value is 30.
pub max_it_fd: usize,
// Maximum number of iterations for Gauss-Seidel method. Default value is 1000.
pub max_it_gs: usize,
// Enforce gen reactive power limits at expense of |V|.
pub enforce_q_limits: GenQLimits,
pub current_balance: NodalBalance,
pub v_cartesian: BusVoltage,
pub summation_method: Sum,
}
impl Default for PFOpt {
fn default() -> Self {
Self {
algorithm: Alg::NR,
tolerance: 1e-8,
max_it_nr: 10,
max_it_fd: 30,
max_it_gs: 1000,
enforce_q_limits: GenQLimits::IgnoreLimits,
current_balance: NodalBalance::POWER,
v_cartesian: BusVoltage::POLAR,
summation_method: Sum::POWER,
}
}
}
#[derive(Clone, Default)]
pub struct ExpOpt {
pub sys_wide_zip_loads: SysWideZipLoads,
}
#[derive(Clone, Default)]
pub struct SysWideZipLoads {
pub pw: Option<[f64; 3]>,
pub qw: Option<[f64; 3]>,
}