Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def init1(self, dae):
self.system.rmgen(self.gen)
self.build_service()
p0 = mul(self.u, self.system.Bus.Pg[self.a], self.gammap)
q0 = mul(self.u, self.system.Bus.Qg[self.a], self.gammaq)
v0 = mul(1, dae.y[self.v])
theta0 = dae.y[self.a]
v = polar(v0, theta0)
S = p0 - q0 * 1j
I = div(S, conj(v)) # NOQA
E = v + mul(self.ra + self.xq * 1j, I)
dae.y[self.p] = p0
dae.y[self.q] = q0
delta = log(div(E, abs(E) + 0j))
dae.x[self.delta] = mul(self.u, delta.imag())
dae.x[self.omega] = matrix(self.u, (self.n, 1), 'd')
# d- and q-axis voltages and currents
vdq = mul(self.u, mul(v, exp(jpi2 - delta)))
idq = mul(self.u, mul(I, exp(jpi2 - delta)))
vd = dae.y[self.vd] = vdq.real()
vq = dae.y[self.vq] = vdq.imag()
def build_y(self):
"""Build transmission line admittance matrix into self.Y"""
if not self.n:
return
self.y1 = mul(self.u, self.g1 + self.b1 * 1j)
self.y2 = mul(self.u, self.g2 + self.b2 * 1j)
self.y12 = div(self.u, self.r + self.x * 1j)
self.m = polar(self.tap, self.phi * deg2rad)
self.m2 = abs(self.m)**2
self.mconj = conj(self.m)
# build self and mutual admittances into Y
self.Y = spmatrix(
div(self.y12 + self.y1, self.m2), self.a1, self.a1,
(self.nb, self.nb), 'z')
self.Y -= spmatrix(
div(self.y12, self.mconj), self.a1, self.a2, (self.nb, self.nb),
'z')
self.Y -= spmatrix(
div(self.y12, self.m), self.a2, self.a1, (self.nb, self.nb), 'z')
self.Y += spmatrix(self.y12 + self.y2, self.a2, self.a2,
(self.nb, self.nb), 'z')
def build_gy(self, dae):
"""Build line Jacobian matrix"""
if not self.n:
idx = range(dae.m)
dae.set_jac(Gy, 1e-6, idx, idx)
return
Vn = polar(1.0, dae.y[self.a])
Vc = mul(dae.y[self.v], Vn)
Ic = self.Y * Vc
diagVn = spdiag(Vn)
diagVc = spdiag(Vc)
diagIc = spdiag(Ic)
dS = self.Y * diagVn
dS = diagVc * conj(dS)
dS += conj(diagIc) * diagVn
dR = diagIc
dR -= self.Y * diagVc
dR = diagVc.H.T * dR
self.gy_store = sparse([[dR.imag(), dR.real()], [dS.real(),
def build_b(self):
"""build Bp and Bpp for fast decoupled method"""
if not self.n:
return
method = self.system.pflow.config.method.lower()
# Build B prime matrix
y1 = mul(
self.u, self.g1
) # y1 neglects line charging shunt, and g1 is usually 0 in HV lines
y2 = mul(
self.u, self.g2
) # y2 neglects line charging shunt, and g2 is usually 0 in HV lines
m = polar(1.0, self.phi * deg2rad) # neglected tap ratio
self.mconj = conj(m)
m2 = matrix(1.0, (self.n, 1), 'z')
if method in ('fdxb', 'dcpf'):
# neglect line resistance in Bp in XB method
y12 = div(self.u, self.x * 1j)
else:
y12 = div(self.u, self.r + self.x * 1j)
self.Bp = spmatrix(
div(y12 + y1, m2), self.a1, self.a1, (self.nb, self.nb), 'z')
self.Bp -= spmatrix(
div(y12, conj(m)), self.a1, self.a2, (self.nb, self.nb), 'z')
self.Bp -= spmatrix(
div(y12, m), self.a2, self.a1, (self.nb, self.nb), 'z')
self.Bp += spmatrix(y12 + y2, self.a2, self.a2, (self.nb, self.nb),
'z')
self.Bp = self.Bp.imag()
def gycall(self, dae):
if sum(self.u) == 0:
return
Zsh = self.rsh + 1j * self.xsh
iZsh = div(self.u, abs(Zsh))
Vh = polar(dae.y[self.v], dae.y[self.a] * 1j)
Vsh = polar(dae.y[self.vsh], dae.y[self.ash] * 1j)
Ish = div(Vsh - Vh + 1e-6, Zsh)
iIsh = div(self.u, Ish)
gsh = div(self.u, Zsh).real()
bsh = div(self.u, Zsh).imag()
V = dae.y[self.v]
theta = dae.y[self.a]
Vsh = dae.y[self.vsh]
thetash = dae.y[self.ash]
Vdc = dae.y[self.v1] - dae.y[self.v2]
iVdc2 = div(self.u, Vdc**2)
dae.add_jac(Gy, div(self.u, Vdc), self.v1, self.pdc)
dae.add_jac(Gy, -mul(self.u, dae.y[self.pdc], iVdc2), self.v1, self.v1)
dae.add_jac(Gy, mul(self.u, dae.y[self.pdc], iVdc2), self.v1, self.v2)
def gcall(self, dae):
if self.system.pflow.config.method == 'DCPF':
return
if self.rebuild:
self.build_y()
self.rebuild = False
vc = polar(dae.y[self.v], dae.y[self.a])
Ic = self.Y * vc
S = mul(vc, conj(Ic))
dae.g[self.a] += S.real()
dae.g[self.v] += S.imag()
def init0(self, dae):
# behind-transformer AC theta_sh and V_sh - must assign first
dae.y[self.ash] = dae.y[self.a] + 1e-6
dae.y[self.vsh] = mul(self.v0, 1 - self.vV) + mul(self.vref0,
self.vV) + 1e-6
Vm = polar(dae.y[self.v], dae.y[self.a])
Vsh = polar(dae.y[self.vsh], dae.y[self.ash]) # Initial value for Vsh
IshC = conj(div(Vsh - Vm, self.Zsh))
# PQ PV and V control initials on converters
dae.y[self.psh] = mul(self.pref0, self.PQ + self.PV)
dae.y[self.qsh] = mul(self.qref0, self.PQ)
dae.y[self.v1] = dae.y[self.v2] + mul(dae.y[self.v1], 1 - self.vV) + mul(self.vdcref0, self.vV)
# PV and V control on AC buses
dae.y[self.v] = mul(dae.y[self.v], 1 - self.PV - self.vV) + mul(self.vref0, self.PV + self.vV)
# Converter current initial
dae.y[self.Ish] = abs(IshC)
# Converter dc power output
dae.y[self.pdc] = mul(Vsh, IshC).real() + \