@@ -99,6 +99,98 @@ def post_process_with_inputs(self):
99
99
data .i_dc_int = 1.5 * np .real (data .q_cs * np .conj (data .i_cs ))
100
100
101
101
102
+ class ThreeLevelConverter (VoltageSourceConverter ):
103
+ """
104
+ Lossless three-phase, three-level voltage-source converter.
105
+
106
+ Parameters
107
+ ----------
108
+ u_dc : float
109
+ DC-bus voltage (V). This value is used as an initial condition for the
110
+ voltage across both capacitors.
111
+ C_dc1 : float
112
+ DC-bus capacitance (F), positive side.
113
+ C_dc2 : float
114
+ DC-bus capacitance (F), negative side.
115
+ i_dc : callable
116
+ External current (A) fed to the DC bus.
117
+
118
+ """
119
+
120
+ def __init__ (self , u_dc , C_dc1 , C_dc2 , i_dc ):
121
+ super ().__init__ (u_dc )
122
+ self .par = SimpleNamespace (C_dc1 = C_dc1 , C_dc2 = C_dc2 )
123
+ self .state = SimpleNamespace (u_dc1 = u_dc / 2 , u_dc2 = u_dc / 2 )
124
+ self .sol_states = SimpleNamespace (u_dc1 = [], u_dc2 = [])
125
+ self .i_dc = i_dc
126
+ self .inp .q_p , self .inp .q_o = []
127
+ self .inp .i_dc = i_dc (0 )
128
+
129
+ @property
130
+ def u_dc (self ):
131
+ """DC-bus voltage (V)."""
132
+ return self .state .u_dc1 .real + self .state .u_dc2 .real
133
+
134
+ @property
135
+ def u_cs (self ):
136
+ """AC-side voltage (V)."""
137
+ state , inp = self .state , self .inp
138
+ u_a = (inp .q_p [0 ] + inp .q_o [0 ])* state .u_dc1 + inp .q_o [0 ]* state .u_dc2
139
+ u_b = (inp .q_p [1 ] + inp .q_o [1 ])* state .u_dc1 + inp .q_o [1 ]* state .u_dc2
140
+ u_c = (inp .q_p [2 ] + inp .q_o [2 ])* state .u_dc1 + inp .q_o [2 ]* state .u_dc2
141
+ return abc2complex ([u_a , u_b , u_c ])
142
+
143
+ @property
144
+ def i_p (self ):
145
+ """Converter-side positive DC current (A)."""
146
+ i_abc = complex2abc (self .inp .i_cs )
147
+ q_p = self .inp .q_p
148
+ return (q_p [0 ] == 1 )* i_abc [0 ] + (q_p [1 ] == 1 )* i_abc [1 ] + (
149
+ q_p [2 ] == 1 )* i_abc [2 ]
150
+
151
+ @property
152
+ def i_o (self ):
153
+ """Converter-side neutral-point current (A)."""
154
+ i_abc = complex2abc (self .inp .i_cs )
155
+ q_o = self .inp .q_o
156
+ return (q_o [0 ] == .5 )* i_abc [0 ] + (q_o [1 ] == .5 )* i_abc [1 ] + (
157
+ q_o [2 ] == .5 )* i_abc [2 ]
158
+
159
+ def set_outputs (self , _ ):
160
+ """Set output variables."""
161
+ self .out .u_cs = self .u_cs
162
+ self .out .u_dc = self .u_dc
163
+
164
+ def set_inputs (self , t ):
165
+ """Set input variables."""
166
+ # External DC-bus current
167
+ self .inp .i_dc = self .i_dc (t )
168
+ # Switching state vectors for DC-bus positive and neutral points
169
+ q_abc = self .inp .q_cs
170
+ self .inp .q_p = [q_abc [0 ] == 1 , q_abc [1 ] == 1 , q_abc [2 ] == 1 ]
171
+ self .inp .q_o = [q_abc [0 ] == .5 , q_abc [1 ] == .5 , q_abc [2 ] == .5 ]
172
+
173
+ def rhs (self ):
174
+ """Compute the state derivatives."""
175
+ d_u_dc1 = (self .inp .i_dc - self .i_p )/ self .par .C_dc1
176
+ d_u_dc2 = (self .inp .i_dc - self .i_p - self .i_o )/ self .par .C_dc2
177
+ return [d_u_dc1 , d_u_dc2 ]
178
+
179
+ def post_process_states (self ):
180
+ """Post-process data."""
181
+ data = self .data
182
+ data .u_dc1 , data .u_dc2 = data .u_dc1 .real , data .u_dc2 .real
183
+ u_a = (data .q_cs [0 ] == 1 )* data .u_dc1 - (data .q_cs [0 ] == .5 )* data .u_dc2
184
+ u_b = (data .q_cs [1 ] == 1 )* data .u_dc1 - (data .q_cs [1 ] == .5 )* data .u_dc2
185
+ u_c = (data .q_cs [2 ] == 1 )* data .u_dc1 - (data .q_cs [2 ] == .5 )* data .u_dc2
186
+ data .u_cs = abc2complex ([u_a , u_b , u_c ])
187
+
188
+ def post_process_with_inputs (self ):
189
+ """Post-process data with inputs."""
190
+ data = self .data
191
+ #data.i_o =
192
+
193
+
102
194
# %%
103
195
class FrequencyConverter (VoltageSourceConverter ):
104
196
"""
0 commit comments