# 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
from abc import ABC
from typing import List, Dict
from VeraGridEngine.Devices.types import ALL_DEV_TYPES
from VeraGridEngine.Devices.multi_circuit import MultiCircuit
from VeraGridEngine.Utils.Symbolic.symbolic import Var
from VeraGridEngine.basic_structures import Vec
from VeraGridEngine.Simulations.driver_template import DummySignal
from VeraGridEngine.Utils.Symbolic.bus_rms_template import initialize_bus_rms
from VeraGridEngine.Templates.Rms.genqec_phasor_rms_template import get_complete_generator_template_phasor
from VeraGridEngine.Templates.Rms.line_rms_template import get_line_rms_template
from VeraGridEngine.Templates.Rms.load_rms_template import get_load_rms_template
from VeraGridEngine.Templates.Rms.shunt_template import get_shunt_template
from VeraGridEngine.Templates.Rms.transformer_rms_template import initialize_trafo_rms
from VeraGridEngine.Templates.Rms.vsc_gfl_dclinked import build_vsc_rms
from VeraGridEngine.Utils.Symbolic.templates_common_functions import set_rms_model
[docs]
class RmsProblemTemplate(ABC):
def __init__(self,
progress_signal: DummySignal | None = None,
progress_text: DummySignal | None = None,):
self._is_initialized = False
self.progress_signal = DummySignal() if progress_signal is None else progress_signal
self.progress_text = DummySignal(str) if progress_text is None else progress_text
[docs]
def set_initialize_flag(self):
self._is_initialized = True
[docs]
def is_initialized(self) -> bool:
return self._is_initialized
[docs]
def get_vars_info(self) -> Dict[ALL_DEV_TYPES, List[Var]]:
raise NotImplementedError("get_device_vars_dict")
[docs]
def get_all_vars_number(self) -> int:
return 0
[docs]
def get_diff_var_number(self) -> int:
return 0
[docs]
def get_algebraic_var_number(self) -> int:
return 0
[docs]
def get_algebraic_vars(self) -> List:
return list()
[docs]
def get_states_number(self) -> int:
return 0
[docs]
def get_variable_parameter_number(self) -> int:
return 0
[docs]
def algebraic_vars(self) -> List:
return list()
[docs]
def state_vars(self):
return list()
# def get_constant_parameters(self) -> Vec:
# raise NotImplementedError("get_constant_parameters")
[docs]
def get_x0(self) -> Vec:
raise NotImplementedError("get_x0")
# def compute_event_params(self, parameters: Vec, time_value: float) -> Vec:
# raise NotImplementedError("compute_event_params")
[docs]
def update_variable_params(self, t: float, x_snapshot: Vec | None = None):
raise NotImplementedError("update_variable_params")
[docs]
def get_dx(self, x: Vec, xn: Vec, dx: Vec, h: float) -> Vec:
raise NotImplementedError("derivative")
[docs]
def rhs_state(self, x: Vec, dx: Vec) -> Vec:
raise NotImplementedError("rhs_state")
[docs]
def rhs_algebraic(self, values: Vec, diff_values: Vec) -> Vec:
raise NotImplementedError("rhs_algebraic")
[docs]
def get_j11(self, x: Vec, dx: Vec, h: float):
raise NotImplementedError("get_j11")
[docs]
def get_j12(self, x: Vec, dx: Vec, h: float):
raise NotImplementedError("get_j12")
[docs]
def get_j21(self, x: Vec, dx: Vec, h: float):
raise NotImplementedError("get_j21")
[docs]
def get_j22(self, x: Vec, dx: Vec, h: float):
raise NotImplementedError("get_j22")
[docs]
def get_E_matrix(self, x:Vec, dx:Vec):
raise NotImplementedError("get_E_matrix")
[docs]
def get_static_state_matrix(self, x: Vec, dx: Vec):
raise NotImplementedError("get_static_state_matrix")
[docs]
def get_dt(self):
return NotImplementedError("get_dt")
[docs]
def get_dt_value(self):
return NotImplementedError("get_dt_value")
[docs]
def report_progress(self, val: float):
"""
Report progress
:param val: float value
"""
self.progress_signal.emit(val)
[docs]
def report_progress2(self, current: int, total: int):
"""
Report progress
:param current: current value (zero based)
:param total: total value
"""
if self.progress_signal is not None:
val = ((current + 1) / total) * 100
self.progress_signal.emit(val)
[docs]
def report_text(self, val: str):
"""
Report text
:param val: text value
"""
self.progress_text.emit(val)