# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
# SPDX-License-Identifier: MPL-2.0
import math
from VeraGridEngine.enumerations import DeviceType, VarPowerFlowReferenceType, ParamPowerFlowReferenceType
from VeraGridEngine.Devices.Dynamic.rms_template import RmsModelTemplate
from VeraGridEngine.Devices.Dynamic.var_factory import VarFactory
from VeraGridEngine.Utils.Symbolic.block import Block
[docs]
def ShuntLoadBuild(vfactory: VarFactory, name: str = "") -> RmsModelTemplate:
templ = RmsModelTemplate()
templ.tpe = DeviceType.ShuntDevice
res_block = Block()
pi = math.pi
# Inputs:
inputs = [vfactory.add_var('Vm'), vfactory.add_var('Va')]
Vm = inputs[0]
Va = inputs[1]
# Variables:
P = vfactory.add_var('P')
Q = vfactory.add_var('Q')
g = vfactory.add_var('g')
b = vfactory.add_var('b')
events_dict = {
g: vfactory.add_const(0.0),
b: vfactory.add_const(0.4),
}
res_block = Block(
algebraic_eqs=[
P + g * Vm ** 2,
Q - b * Vm ** 2,
],
algebraic_vars=[P, Q],
init_eqs={
P: vfactory.add_const(0.0),
Q: vfactory.add_const(0.1),
}
)
res_block.event_dict = events_dict
res_block.external_mapping = {
VarPowerFlowReferenceType.Vm: inputs[0],
VarPowerFlowReferenceType.Va: inputs[1],
VarPowerFlowReferenceType.P: P,
VarPowerFlowReferenceType.Q: Q,
}
res_block.in_vars = inputs
templ.block = res_block
return templ
[docs]
def ShuntPhasorBuild(vfactory: VarFactory, name: str = "") -> RmsModelTemplate:
templ = RmsModelTemplate()
templ.tpe = DeviceType.ShuntDevice
res_block = Block()
# Inputs:
inputs = [vfactory.add_var('Vr_'), vfactory.add_var('Vi_')]
Vr = inputs[0]
Vi = inputs[1]
# Variables:
Ir = vfactory.add_var('Ir_shunt')
Ii = vfactory.add_var('Ii_shunt')
#Parameters:
g = vfactory.add_var('g')
b = vfactory.add_var('b')
parameters = {
g: vfactory.add_const(0.2),
b: vfactory.add_const(0.2),
}
res_block = Block(
algebraic_eqs=[
Ir - (-g*Vr + b*Vi),
Ii - (-g*Vi - b*Vr),
],
algebraic_vars=[Ir, Ii],
external_mapping={
VarPowerFlowReferenceType.Vr: inputs[0],
VarPowerFlowReferenceType.Vi: inputs[1],
VarPowerFlowReferenceType.Ir: Ir,
VarPowerFlowReferenceType.Ii: Ii,
},
init_eqs={
Ir: -(g*Vr - b*Vi),
Ii: -(g*Vi + b*Vr),
},
api_obj_mapping={
ParamPowerFlowReferenceType.g: g,
ParamPowerFlowReferenceType.b: b,
}
)
res_block.parameters = parameters
res_block.in_vars = inputs
templ.block = res_block
return templ
[docs]
def get_shunt_template(vfactory: VarFactory, name: str = "", phasor:bool = True) -> RmsModelTemplate:
if phasor:
return ShuntPhasorBuild(vfactory, name)
else:
return ShuntLoadBuild(vfactory, name)