From c5cf414ebd82584d5ac65ee923b3f1ab652e3130 Mon Sep 17 00:00:00 2001 From: keviny Date: Tue, 14 May 2024 12:33:14 +0200 Subject: [PATCH] uid added for each component --- RunFEEMSSim/RunFeemsSim/__init__.py | 2 +- RunFEEMSSim/RunFeemsSim/_modidx.py | 2 +- RunFEEMSSim/settings.ini | 2 +- .../feems/components_model/component_base.py | 14 +- .../components_model/component_electric.py | 39 +- .../components_model/component_mechanical.py | 20 +- feems/pyproject.toml | 2 +- .../00_ConvertToFeems.ipynb | 97 +++- .../01_ConvertToProtobuf.ipynb | 55 +- machinery-system-structure/02_Utility.ipynb | 4 - .../MachSysS/__init__.py | 2 +- .../MachSysS/_modidx.py | 2 +- .../MachSysS/convert_to_feems.py | 54 +- .../MachSysS/convert_to_protobuf.py | 21 +- .../MachSysS/feems_result_pb2.pyi | 2 +- .../MachSysS/system_structure_pb2.py | 112 ++-- .../MachSysS/system_structure_pb2.pyi | 44 ++ machinery-system-structure/build_package.sh | 10 + .../build_package_linux.sh | 13 - .../build_package_mac.sh | 13 - machinery-system-structure/compile_proto.sh | 32 + .../proto/system_structure.proto | 11 + machinery-system-structure/settings.ini | 2 +- machinery-system-structure/shipX2DeSim.json | 90 +++ .../tests/electric_propulsion_system.mss | Bin 3529 -> 4757 bytes .../tests/electric_system_with_pto.mss | Bin 2652 -> 3267 bytes .../tests/hybrid_propulsion_system.mss | Bin 3840 -> 4802 bytes ...anical_propulsion_with_electric_system.mss | Bin 3047 -> 3625 bytes .../tests/mechanical_system_with_pto.mss | Bin 1156 -> 1503 bytes .../tests/system_proto.mss | Bin 3529 -> 4757 bytes .../tests/system_proto_with_coges.mss | Bin 3264 -> 4262 bytes .../tests/utility_compare_proto.py | 1 + .../timeseries_test.csv | 546 ++++++++++++++++++ .../timeseries_test.sim | Bin 0 -> 22552 bytes .../timeseries_test_.sim | Bin 0 -> 32529 bytes 35 files changed, 1041 insertions(+), 151 deletions(-) create mode 100644 machinery-system-structure/build_package.sh delete mode 100644 machinery-system-structure/build_package_linux.sh delete mode 100644 machinery-system-structure/build_package_mac.sh create mode 100644 machinery-system-structure/compile_proto.sh create mode 100644 machinery-system-structure/shipX2DeSim.json create mode 100644 machinery-system-structure/timeseries_test.csv create mode 100644 machinery-system-structure/timeseries_test.sim create mode 100644 machinery-system-structure/timeseries_test_.sim diff --git a/RunFEEMSSim/RunFeemsSim/__init__.py b/RunFEEMSSim/RunFeemsSim/__init__.py index d31c31e..788da1f 100644 --- a/RunFEEMSSim/RunFeemsSim/__init__.py +++ b/RunFEEMSSim/RunFeemsSim/__init__.py @@ -1 +1 @@ -__version__ = "0.2.3" +__version__ = "0.2.4" diff --git a/RunFEEMSSim/RunFeemsSim/_modidx.py b/RunFEEMSSim/RunFeemsSim/_modidx.py index 5fc3c1b..63c1d4b 100644 --- a/RunFEEMSSim/RunFeemsSim/_modidx.py +++ b/RunFEEMSSim/RunFeemsSim/_modidx.py @@ -5,7 +5,7 @@ "branch": "master", "doc_baseurl": "/RunFeemsSim/", "doc_host": "https://kevinkoosup.yum@sintef.no.github.io", - "git_url": "https://SintefOceanEnergySystem@dev.azure.com/SintefOceanEnergySystem/FEEMSService/_git/RunFEEMSSim", + "git_url": "https://github.com/SINTEF/FEEMS", "lib_path": "RunFeemsSim", }, "syms": { diff --git a/RunFEEMSSim/settings.ini b/RunFEEMSSim/settings.ini index 34b7d72..6c4d21f 100644 --- a/RunFEEMSSim/settings.ini +++ b/RunFEEMSSim/settings.ini @@ -8,7 +8,7 @@ author = Kevin Koosup Yum author_email = kevinkoosup.yum@sintef.no copyright = SINTEF branch = master -version = 0.2.3 +version = 0.2.4 min_python = 3.10 audience = Developers language = English diff --git a/feems/feems/components_model/component_base.py b/feems/feems/components_model/component_base.py index 4836fa2..8d2dc13 100644 --- a/feems/feems/components_model/component_base.py +++ b/feems/feems/components_model/component_base.py @@ -1,5 +1,6 @@ from typing import Union, List, Tuple, Optional, TypeVar, Dict from dataclasses import dataclass, field +from uuid import uuid4 import numpy as np import pandas as pd @@ -52,6 +53,7 @@ def __init__( power_type: TypePower, rated_power: Power_kW = Power_kW(0.0), rated_speed: Speed_rpm = Speed_rpm(0.0), + uid: Optional[str] = None, ): self.type = type_ self.power_type = power_type @@ -61,6 +63,8 @@ def __init__( self.status = np.ones(1).astype(bool) # Status on/off self.power_input = np.array([0]) # power input self.power_output = np.array([0]) # power output + # if uid is not given, create a random uid + self.uid = str(uuid4()) if uid is None else uid def get_type_name(self) -> str: return self.type.name @@ -94,9 +98,15 @@ def __init__( eff_curve: np.ndarray = np.array([1]), rated_speed: Speed_rpm = Speed_rpm(0.0), file_name: str = None, + uid: Optional[str] = None, ): super(BasicComponent, self).__init__( - name, type_, power_type, rated_power, rated_speed + name=name, + type_=type_, + power_type=power_type, + rated_power=rated_power, + rated_speed=rated_speed, + uid=uid ) if file_name is not None: df = pd.read_csv(file_name, index_col=0) @@ -417,6 +427,7 @@ def __init__( components: List[BasicComponent], rated_power: Power_kW = None, rated_speed: Speed_rpm = None, + uid: Optional[str] = None, ): self.component_names = [] self.components = components @@ -445,4 +456,5 @@ def __init__( rated_power=rated_power, rated_speed=rated_speed, eff_curve=efficiency_points, + uid=uid, ) diff --git a/feems/feems/components_model/component_electric.py b/feems/feems/components_model/component_electric.py index 59a8789..29e6eee 100644 --- a/feems/feems/components_model/component_electric.py +++ b/feems/feems/components_model/component_electric.py @@ -52,6 +52,7 @@ def __init__( rated_speed: Speed_rpm = Speed_rpm(0), switchboard_id: SwbId = SwbId(0), file_name: str = None, + uid: Optional[str] = None, ): super().__init__( type_=type_, @@ -61,6 +62,7 @@ def __init__( rated_speed=rated_speed, eff_curve=eff_curve, file_name=file_name, + uid=uid, ) self.power_type = power_type if power_type in [ @@ -91,6 +93,7 @@ def __init__( switchboard_id: SwbId = SwbId(0), number_poles: int = 1, eff_curve: np.ndarray = np.ones(1), + uid: Optional[str] = None, ): super(ElectricMachine, self).__init__( type_=type_, @@ -100,6 +103,7 @@ def __init__( rated_speed=rated_speed, eff_curve=eff_curve, switchboard_id=switchboard_id, + uid=uid, ) self.number_of_poles = number_poles @@ -203,6 +207,7 @@ def __init__( eff_charging: float = 0.975, eff_discharging: float = 0.975, switchboard_id: SwbId = SwbId(0), + uid: Optional[str] = None, ): rated_power = Power_kW(rated_capacity_kwh * discharge_rate_c) super().__init__( @@ -211,6 +216,7 @@ def __init__( rated_power, power_type=TypePower.ENERGY_STORAGE, switchboard_id=switchboard_id, + uid=uid, ) self.rated_capacity_kWh = rated_capacity_kwh self.charging_rate_C = charging_rate_c @@ -337,9 +343,16 @@ def __init__( switchboard_id: SwbId, rated_power: Power_kW, rated_speed: Speed_rpm = Speed_rpm(0), + uid: Optional[str] = None, ): super(SerialSystemElectric, self).__init__( - type_, power_type, name, components, rated_power, rated_speed + type_=type_, + power_type=power_type, + name=name, + components=components, + rated_power=rated_power, + rated_speed=rated_speed, + uid=uid, ) #: Set the load sharing mode 0 as default value if the component is either a power source, @@ -361,6 +374,7 @@ def __init__( eff_curve: np.ndarray, fuel_type: TypeFuel = TypeFuel.HYDROGEN, fuel_origin: FuelOrigin = FuelOrigin.RENEWABLE_NON_BIO, + uid: Optional[str] = None, ): super(FuelCell, self).__init__( type_=TypeComponent.FUEL_CELL, @@ -368,6 +382,7 @@ def __init__( name=name, rated_power=rated_power, eff_curve=eff_curve, + uid=uid, ) self.fuel_type = fuel_type self.fuel_origin = fuel_origin @@ -441,6 +456,7 @@ def __init__( converter: ElectricComponent, switchboard_id: SwbId, number_modules: int = 1, + uid: Optional[str] = None, ): super(FuelCellSystem, self).__init__( name=name, @@ -449,6 +465,7 @@ def __init__( eff_curve=converter._efficiency_points, power_type=TypePower.POWER_SOURCE, switchboard_id=switchboard_id, + uid=uid, ) self.converter = converter self.fuel_cell = fuel_cell_module @@ -515,6 +532,7 @@ def __init__( battery: Battery, converter: ElectricComponent, switchboard_id: SwbId, + uid: Optional[str] = None, ): super().__init__( name=name, @@ -525,6 +543,7 @@ def __init__( eff_charging=battery.eff_charging, eff_discharging=battery.eff_discharging, switchboard_id=switchboard_id, + uid=uid, ) self.type = TypeComponent.BATTERY_SYSTEM self.rated_power = converter.rated_power @@ -588,6 +607,7 @@ def __init__( aux_engine: Engine, generator: ElectricMachine, rectifier: ElectricComponent = None, + uid: Optional[str] = None, ): super(Genset, self).__init__( name=name, @@ -595,6 +615,7 @@ def __init__( power_type=TypePower.POWER_SOURCE, rated_power=generator.rated_power, rated_speed=generator.rated_speed, + uid=uid, ) self.fuel_type = aux_engine.fuel_type self.aux_engine = aux_engine @@ -666,6 +687,7 @@ def __init__( rated_power: Power_kW, rated_speed: Speed_rpm = Speed_rpm(0), shaft_line_id: int = 1, + uid: Optional[str] = None, ): super(PTIPTO, self).__init__( TypeComponent.PTI_PTO_SYSTEM, @@ -675,6 +697,7 @@ def __init__( switchboard_id, rated_power, rated_speed, + uid=uid, ) self.shaft_line_id = shaft_line_id self.full_pti_mode = np.zeros(1).astype(bool) @@ -691,6 +714,7 @@ class SuperCapacitor(ElectricComponent): :param eff_charging: Efficiency for charging in percentage :param eff_discharging: Efficiency for discharging in percentage :param switchboard_id: Switchboard ID + :param uid: Unique ID """ def __init__( @@ -702,6 +726,7 @@ def __init__( eff_charging: float = 0.995, eff_discharging: float = 0.995, switchboard_id: SwbId = SwbId(0), + uid: Optional[str] = None, ): super().__init__( TypeComponent.SUPERCAPACITOR, @@ -709,6 +734,7 @@ def __init__( rated_power, power_type=TypePower.ENERGY_STORAGE, switchboard_id=switchboard_id, + uid=uid, ) self.rated_capacity_Wh = rated_capacity_wh self.soc0 = soc0 @@ -821,6 +847,7 @@ def __init__( supercapacitor: SuperCapacitor, converter: ElectricComponent, switchboard_id: SwbId, + uid: Optional[str] = None, ): super().__init__( name=name, @@ -830,6 +857,7 @@ def __init__( eff_charging=supercapacitor.eff_charging, eff_discharging=supercapacitor.eff_discharging, switchboard_id=switchboard_id, + uid=uid, ) self.converter = converter self.supercapacitor = supercapacitor @@ -882,7 +910,11 @@ class ShorePowerConnection(ElectricComponent): """ def __init__( - self, name: str, rated_power: Power_kW, switchboard_id: SwbId = SwbId(0) + self, + name: str, + rated_power: Power_kW, + switchboard_id: SwbId = SwbId(0), + uid: Optional[str] = None, ): super().__init__( TypeComponent.SHORE_POWER, @@ -890,6 +922,7 @@ def __init__( rated_power, power_type=TypePower.POWER_SOURCE, switchboard_id=switchboard_id, + uid=uid, ) @@ -929,6 +962,7 @@ def __init__( name: str, cogas: COGAS, generator: ElectricMachine, + uid: Optional[str] = None, ): super().__init__( name=name, @@ -936,6 +970,7 @@ def __init__( power_type=TypePower.POWER_SOURCE, rated_power=generator.rated_power, rated_speed=generator.rated_speed, + uid=uid, ) self.fuel_type = cogas.fuel_type self.cogas = cogas diff --git a/feems/feems/components_model/component_mechanical.py b/feems/feems/components_model/component_mechanical.py index 8eacb8b..821d831 100644 --- a/feems/feems/components_model/component_mechanical.py +++ b/feems/feems/components_model/component_mechanical.py @@ -72,6 +72,7 @@ def __init__( file_name: str = None, emissions_curves: List[EmissionCurve] = None, engine_cycle_type: EngineCycleType = EngineCycleType.DIESEL, + uid: Optional[str] = None, ): super(Engine, self).__init__( name=name, @@ -79,6 +80,7 @@ def __init__( power_type=TypePower.POWER_SOURCE, rated_power=rated_power, rated_speed=rated_speed, + uid=uid, ) self.fuel_type = fuel_type self.fuel_origin = fuel_origin @@ -238,6 +240,7 @@ def __init__( pilot_fuel_type: TypeFuel.DIESEL, pilot_fuel_origin: FuelOrigin = FuelOrigin.FOSSIL, emissions_curves: List[EmissionCurve] = None, + uid: Optional[str] = None, ): super().__init__( type_=type_, @@ -249,6 +252,7 @@ def __init__( fuel_type=fuel_type, fuel_origin=fuel_origin, emissions_curves=emissions_curves, + uid=uid, ) self.bspfc_curve = bspfc_curve self.pilot_fuel_type = pilot_fuel_type @@ -321,6 +325,7 @@ def __init__( name, engine: Union[Engine, EngineDualFuel], shaft_line_id: int = 1, + uid: Optional[str] = None, ): super().__init__( name=name, @@ -328,6 +333,7 @@ def __init__( type_=TypeComponent.MAIN_ENGINE, rated_power=engine.rated_power, rated_speed=engine.rated_speed, + uid=uid, ) self.engine = engine self.shaft_line_id = shaft_line_id @@ -392,9 +398,17 @@ def __init__( rated_speed: Speed_rpm = Speed_rpm(0), shaft_line_id: int = 1, file_name: str = None, + uid: Optional[str] = None, ): super(MechanicalPropulsionComponent, self).__init__( - type_, power_type, name, rated_power, eff_curve, rated_speed, file_name + type_=type_, + power_type=power_type, + name=name, + rated_power=rated_power, + eff_curve=eff_curve, + rated_speed=rated_speed, + file_name=file_name, + uid=uid, ) self.shaft_line_id = shaft_line_id @@ -406,11 +420,13 @@ def __init__( engine: Union[Engine, EngineDualFuel], gearbox: BasicComponent, shaft_line_id: int = 1, + uid: Optional[str] = None, ): super(MainEngineWithGearBoxForMechanicalPropulsion, self).__init__( name=name, engine=engine, shaft_line_id=shaft_line_id, + uid=uid, ) self.gearbox = gearbox @@ -478,6 +494,7 @@ def __init__( fuel_origin: FuelOrigin = FuelOrigin.FOSSIL, emissions_curves: List[EmissionCurve] = None, nox_calculation_method: NOxCalculationMethod = NOxCalculationMethod.TIER_3, + uid: Optional[str] = None, ): """Constructor for COGES component""" # Validate the inputs for curves. The length of the curves should be the same and the x values should be the same. @@ -505,6 +522,7 @@ def __init__( rated_power=rated_power, eff_curve=eff_curve, rated_speed=rated_speed, + uid=uid, ) self.gas_turbine_power_curve = gas_turbine_power_curve self.steam_turbine_power_curve = steam_turbine_power_curve diff --git a/feems/pyproject.toml b/feems/pyproject.toml index af37cdd..8a8f6b9 100644 --- a/feems/pyproject.toml +++ b/feems/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "feems" -version = "0.10.6" +version = "0.10.7" description = "" authors = ["Kevin Koosup Yum "] readme = "readme.md" diff --git a/machinery-system-structure/00_ConvertToFeems.ipynb b/machinery-system-structure/00_ConvertToFeems.ipynb index 91cd415..c85188a 100644 --- a/machinery-system-structure/00_ConvertToFeems.ipynb +++ b/machinery-system-structure/00_ConvertToFeems.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -27,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -87,6 +87,8 @@ "\n", "import MachSysS.system_structure_pb2 as proto\n", "\n", + "_MIN_LENGTH_UID = 5\n", + "\n", "\n", "def convert_proto_point_to_list(point: proto.Point) -> List[float]:\n", " \"\"\"Converts protobuf point to a list\"\"\"\n", @@ -128,6 +130,7 @@ " ),\n", " power_type=power_type,\n", " switchboard_id=switchboard_id,\n", + " uid=proto_component.uid if len(proto_component.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -147,6 +150,7 @@ " proto_component.efficiency\n", " ),\n", " switchboard_id=switchboard_id,\n", + " uid=proto_component.uid if len(proto_component.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -165,6 +169,11 @@ " ),\n", " fuel_type=TypeFuel(subsystem.fuel_cell.fuel.fuel_type),\n", " fuel_origin=FuelOrigin(subsystem.fuel_cell.fuel.fuel_origin),\n", + " uid=(\n", + " subsystem.fuel_cell.uid\n", + " if len(subsystem.fuel_cell.uid) > _MIN_LENGTH_UID\n", + " else None\n", + " ),\n", " )\n", " converter = convert_proto_electric_component_to_feems(\n", " subsystem.converter1,\n", @@ -178,6 +187,7 @@ " converter=converter,\n", " switchboard_id=switchboard_id,\n", " number_modules=number_modules,\n", + " uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -243,6 +253,7 @@ " pilot_fuel_origin=FuelOrigin(proto_engine.pilot_fuel.fuel_origin),\n", " nox_calculation_method=nox_calculation_method,\n", " emissions_curves=emission_curves,\n", + " uid=proto_engine.uid if len(proto_engine.uid) > _MIN_LENGTH_UID else None,\n", " )\n", " return Engine(\n", " type_=type_engine,\n", @@ -254,6 +265,7 @@ " fuel_origin=FuelOrigin(proto_engine.main_fuel.fuel_origin),\n", " nox_calculation_method=nox_calculation_method,\n", " emissions_curves=emission_curves,\n", + " uid=proto_engine.uid if len(proto_engine.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -287,6 +299,7 @@ " fuel_origin=FuelOrigin(proto_cogas.fuel.fuel_origin),\n", " nox_calculation_method=nox_calculation_method,\n", " emissions_curves=emission_curves,\n", + " uid=proto_cogas.uid if len(proto_cogas.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -310,7 +323,11 @@ " switchboard_id=switchboard_id,\n", " )\n", " return Genset(\n", - " name=subsystem.name, aux_engine=engine, generator=generator, rectifier=rectifier\n", + " name=subsystem.name,\n", + " aux_engine=engine,\n", + " generator=generator,\n", + " rectifier=rectifier,\n", + " uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -325,7 +342,12 @@ " power_type=TypePower.POWER_SOURCE,\n", " switchboard_id=switchboard_id,\n", " )\n", - " return COGES(name=subsystem.name, cogas=cogas, generator=generator)\n", + " return COGES(\n", + " name=subsystem.name,\n", + " cogas=cogas,\n", + " generator=generator,\n", + " uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None,\n", + " )\n", "\n", "\n", "def convert_proto_battery_to_feems(\n", @@ -340,6 +362,7 @@ " eff_discharging=proto_component.efficiency_discharging,\n", " soc0=proto_component.initial_state_of_charge,\n", " switchboard_id=switchboard_id,\n", + " uid=proto_component.uid if len(proto_component.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -360,6 +383,7 @@ " battery=battery,\n", " converter=converter,\n", " switchboard_id=switchboard_id,\n", + " uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -374,6 +398,7 @@ " eff_discharging=proto_component.efficiency_discharging,\n", " soc0=proto_component.initial_state_of_charge,\n", " switchboard_id=switchboard_id,\n", + " uid=proto_component.uid if len(proto_component.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -394,6 +419,7 @@ " supercapacitor=supercapacitor,\n", " converter=converter,\n", " switchboard_id=switchboard_id,\n", + " uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -477,6 +503,7 @@ " rated_speed=subsystem.rated_speed_rpm,\n", " switchboard_id=switchboard_id,\n", " shaft_line_id=shaft_line_id,\n", + " uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -502,6 +529,7 @@ " rated_speed=(\n", " None if subsystem.rated_speed_rpm == 0 else subsystem.rated_speed_rpm\n", " ),\n", + " uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None,\n", " )\n", "\n", "\n", @@ -613,6 +641,11 @@ " type_engine=TypeComponent.MAIN_ENGINE,\n", " ),\n", " shaft_line_id=shaft_line_id,\n", + " uid=(\n", + " sub_system.uid\n", + " if len(sub_system.uid) > _MIN_LENGTH_UID\n", + " else None\n", + " ),\n", " )\n", " )\n", " elif (\n", @@ -628,15 +661,25 @@ " ),\n", " gearbox=BasicComponent(\n", " type_=TypeComponent.GEARBOX,\n", - " name=sub_system.gearbox.name,\n", + " name=sub_system.gear.name,\n", " power_type=TypePower.POWER_TRANSMISSION,\n", " rated_power=sub_system.gear.rated_power_kw,\n", " rated_speed=sub_system.gear.rated_speed_rpm,\n", " eff_curve=convert_proto_efficiency_bsfc_power_to_np_array(\n", " efficiency_bsfc_power=sub_system.gear.efficiency\n", " ),\n", + " uid=(\n", + " sub_system.gear.uid\n", + " if len(sub_system.gear.uid) > _MIN_LENGTH_UID\n", + " else None\n", + " ),\n", " ),\n", " shaft_line_id=shaft_line_id,\n", + " uid=(\n", + " sub_system.uid\n", + " if len(sub_system.uid) > _MIN_LENGTH_UID\n", + " else None\n", + " ),\n", " )\n", " )\n", " elif sub_system.component_type == proto.Subsystem.ComponentType.PTI_PTO_SYSTEM:\n", @@ -681,6 +724,11 @@ " eff_curve=convert_proto_efficiency_bsfc_power_to_np_array(\n", " efficiency_bsfc_power=sub_system.propeller.efficiency\n", " ),\n", + " uid=(\n", + " sub_system.uid\n", + " if len(sub_system.uid) > _MIN_LENGTH_UID\n", + " else None\n", + " ),\n", " )\n", " )\n", " else:\n", @@ -697,7 +745,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -719,9 +767,20 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-05-14 10:42:47,190 - tests.utility - WARNING - Efficiency of generator is not supplied, using random monotonic curve\n", + "2024-05-14 10:42:47,191 - tests.utility - WARNING - Efficiency of engine is not supplied, using random monotonic curve\n", + "2024-05-14 10:42:47,194 - tests.utility - WARNING - Efficiency of generator is not supplied, using random monotonic curve\n", + "2024-05-14 10:42:47,195 - tests.utility - WARNING - Efficiency of engine is not supplied, using random monotonic curve\n" + ] + } + ], "source": [ "# Test conversion\n", "from tests.utility import create_switchboard_with_components\n", @@ -752,7 +811,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -868,7 +927,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -957,7 +1016,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1013,7 +1072,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1074,18 +1133,6 @@ "display_name": "python3", "language": "python", "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.1" } }, "nbformat": 4, diff --git a/machinery-system-structure/01_ConvertToProtobuf.ipynb b/machinery-system-structure/01_ConvertToProtobuf.ipynb index 9d02ddf..f00ba81 100644 --- a/machinery-system-structure/01_ConvertToProtobuf.ipynb +++ b/machinery-system-structure/01_ConvertToProtobuf.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -27,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -153,6 +153,7 @@ " rated_speed_rpm=component.rated_speed,\n", " efficiency=convert_efficiency_curve_to_protobuf(component),\n", " order_from_switchboard_or_shaftline=order_from_switchboard,\n", + " uid=component.uid,\n", " )\n", "\n", "\n", @@ -165,6 +166,7 @@ " rated_power_kw=component.rated_power,\n", " efficiency=convert_efficiency_curve_to_protobuf(component),\n", " order_from_switchboard_or_shaftline=order_from_switchboard,\n", + " uid=component.uid,\n", " )\n", "\n", "\n", @@ -181,6 +183,7 @@ " efficiency_discharging=component.eff_discharging,\n", " initial_state_of_charge=component.soc0,\n", " order_from_switchboard_or_shaftline=order_from_switchboard,\n", + " uid=component.uid,\n", " )\n", "\n", "\n", @@ -196,6 +199,7 @@ " efficiency_discharging=component.eff_discharging,\n", " initial_state_of_charge=component.soc0,\n", " order_from_switchboard_or_shaftline=order_from_switchboard,\n", + " uid=component.uid,\n", " )\n", "\n", "\n", @@ -205,7 +209,14 @@ ") -> proto.Subsystem:\n", " \"\"\"Convert serial electric system or PTI/PTO component to protobuf message\"\"\"\n", " order = initial_order_from_switchboard\n", - " subsystem = proto.Subsystem()\n", + " subsystem = proto.Subsystem(\n", + " name=component.name,\n", + " rated_power_kw=component.rated_power,\n", + " rated_speed_rpm=component.rated_speed,\n", + " component_type=component.type.value,\n", + " power_type=component.power_type.value,\n", + " uid=component.uid,\n", + " )\n", " for subcomponent in component.components:\n", " if subcomponent.type == TypeComponent.TRANSFORMER:\n", " subsystem.transformer.CopyFrom(\n", @@ -298,6 +309,7 @@ " engine_feems.emission_curves\n", " ),\n", " order_from_switchboard_or_shaftline=order_from_shaftline_or_switchboard,\n", + " uid=engine_feems.uid,\n", " )\n", " if isinstance(engine_feems, EngineDualFuel):\n", " engine.pilot_bsfc.CopyFrom(\n", @@ -331,6 +343,7 @@ " ),\n", " emission_curves=convert_emission_curves_to_protobuf(component.emission_curves),\n", " order_from_switchboard_or_shaftline=order_from_shaftline_or_switchboard,\n", + " uid=component.uid,\n", " )\n", " if component.gas_turbine_power_curve is not None:\n", " cogas.gas_turbine_power_curve.CopyFrom(\n", @@ -357,6 +370,7 @@ " name=component.name,\n", " rated_power_kw=component.rated_power,\n", " rated_speed_rpm=component.rated_speed,\n", + " uid=component.uid,\n", " )\n", " if component.type == TypeComponent.GENERATOR:\n", " subsystem.electric_machine.CopyFrom(\n", @@ -382,6 +396,7 @@ " ),\n", " number_modules=component.number_modules,\n", " order_from_switchboard_or_shaftline=2,\n", + " uid=component.fuel_cell.uid,\n", " )\n", " )\n", " elif component.type == TypeComponent.COGES:\n", @@ -477,6 +492,7 @@ " rated_speed_rpm=gear.rated_speed,\n", " efficiency=convert_efficiency_curve_to_protobuf(gear),\n", " order_from_switchboard_or_shaftline=1,\n", + " uid=gear.uid,\n", " )\n", "\n", " for component in shaftline_feems.components:\n", @@ -486,6 +502,7 @@ " name=component.name,\n", " rated_power_kw=component.rated_power,\n", " rated_speed_rpm=component.rated_speed,\n", + " uid=component.uid,\n", " )\n", " if component.type == TypeComponent.MAIN_ENGINE:\n", " component = cast(MainEngineForMechanicalPropulsion, component)\n", @@ -515,6 +532,7 @@ " rated_speed_rpm=component.gearbox.rated_speed,\n", " efficiency=convert_efficiency_curve_to_protobuf(component.gearbox),\n", " order_from_switchboard_or_shaftline=1,\n", + " uid=component.gearbox.uid,\n", " )\n", " )\n", " elif component.type == TypeComponent.PROPELLER_LOAD:\n", @@ -525,6 +543,7 @@ " efficiency=convert_efficiency_curve_to_protobuf(component),\n", " propulsor_id=propeller_id,\n", " order_from_switchboard_or_shaftline=2,\n", + " uid=component.uid,\n", " )\n", " )\n", " propeller_id += 1\n", @@ -552,7 +571,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -905,7 +924,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -992,7 +1011,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1994,7 +2013,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2165,7 +2184,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2348,7 +2367,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3012,7 +3031,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3937,7 +3956,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3969,18 +3988,6 @@ "display_name": "python3", "language": "python", "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.1" } }, "nbformat": 4, diff --git a/machinery-system-structure/02_Utility.ipynb b/machinery-system-structure/02_Utility.ipynb index 5d71383..11325d3 100644 --- a/machinery-system-structure/02_Utility.ipynb +++ b/machinery-system-structure/02_Utility.ipynb @@ -76,10 +76,6 @@ "display_name": "python3", "language": "python", "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.12.1" } }, "nbformat": 4, diff --git a/machinery-system-structure/MachSysS/__init__.py b/machinery-system-structure/MachSysS/__init__.py index 7bbb2ef..4c513f3 100644 --- a/machinery-system-structure/MachSysS/__init__.py +++ b/machinery-system-structure/MachSysS/__init__.py @@ -1 +1 @@ -__version__ = "0.6.5" +__version__ = "0.6.6" diff --git a/machinery-system-structure/MachSysS/_modidx.py b/machinery-system-structure/MachSysS/_modidx.py index 3d8d86d..5d412d7 100644 --- a/machinery-system-structure/MachSysS/_modidx.py +++ b/machinery-system-structure/MachSysS/_modidx.py @@ -5,7 +5,7 @@ "branch": "master", "doc_baseurl": "/MachSysS/", "doc_host": "https://keviny.github.io", - "git_url": "https://SintefOceanEnergySystem@dev.azure.com/SintefOceanEnergySystem/MachinerySystemStucture/_git/MachinerySystemStucture", + "git_url": "https://github.com/SINTEF/FEEMS", "lib_path": "MachSysS", }, "syms": { diff --git a/machinery-system-structure/MachSysS/convert_to_feems.py b/machinery-system-structure/MachSysS/convert_to_feems.py index 3194ed0..5b9ea69 100644 --- a/machinery-system-structure/MachSysS/convert_to_feems.py +++ b/machinery-system-structure/MachSysS/convert_to_feems.py @@ -79,6 +79,8 @@ import MachSysS.system_structure_pb2 as proto +_MIN_LENGTH_UID = 5 + def convert_proto_point_to_list(point: proto.Point) -> List[float]: """Converts protobuf point to a list""" @@ -120,6 +122,7 @@ def convert_proto_electric_component_to_feems( ), power_type=power_type, switchboard_id=switchboard_id, + uid=proto_component.uid if len(proto_component.uid) > _MIN_LENGTH_UID else None, ) @@ -139,6 +142,7 @@ def convert_proto_electric_machine_to_feems( proto_component.efficiency ), switchboard_id=switchboard_id, + uid=proto_component.uid if len(proto_component.uid) > _MIN_LENGTH_UID else None, ) @@ -157,6 +161,11 @@ def convert_proto_fuel_cell_system_to_feems( ), fuel_type=TypeFuel(subsystem.fuel_cell.fuel.fuel_type), fuel_origin=FuelOrigin(subsystem.fuel_cell.fuel.fuel_origin), + uid=( + subsystem.fuel_cell.uid + if len(subsystem.fuel_cell.uid) > _MIN_LENGTH_UID + else None + ), ) converter = convert_proto_electric_component_to_feems( subsystem.converter1, @@ -170,6 +179,7 @@ def convert_proto_fuel_cell_system_to_feems( converter=converter, switchboard_id=switchboard_id, number_modules=number_modules, + uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None, ) @@ -235,6 +245,7 @@ def convert_proto_engine_to_feems( pilot_fuel_origin=FuelOrigin(proto_engine.pilot_fuel.fuel_origin), nox_calculation_method=nox_calculation_method, emissions_curves=emission_curves, + uid=proto_engine.uid if len(proto_engine.uid) > _MIN_LENGTH_UID else None, ) return Engine( type_=type_engine, @@ -246,6 +257,7 @@ def convert_proto_engine_to_feems( fuel_origin=FuelOrigin(proto_engine.main_fuel.fuel_origin), nox_calculation_method=nox_calculation_method, emissions_curves=emission_curves, + uid=proto_engine.uid if len(proto_engine.uid) > _MIN_LENGTH_UID else None, ) @@ -279,6 +291,7 @@ def convert_proto_cogas_to_feems( fuel_origin=FuelOrigin(proto_cogas.fuel.fuel_origin), nox_calculation_method=nox_calculation_method, emissions_curves=emission_curves, + uid=proto_cogas.uid if len(proto_cogas.uid) > _MIN_LENGTH_UID else None, ) @@ -302,7 +315,11 @@ def convert_proto_genset_to_feems( switchboard_id=switchboard_id, ) return Genset( - name=subsystem.name, aux_engine=engine, generator=generator, rectifier=rectifier + name=subsystem.name, + aux_engine=engine, + generator=generator, + rectifier=rectifier, + uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None, ) @@ -317,7 +334,12 @@ def convert_proto_coges_to_feems( power_type=TypePower.POWER_SOURCE, switchboard_id=switchboard_id, ) - return COGES(name=subsystem.name, cogas=cogas, generator=generator) + return COGES( + name=subsystem.name, + cogas=cogas, + generator=generator, + uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None, + ) def convert_proto_battery_to_feems( @@ -332,6 +354,7 @@ def convert_proto_battery_to_feems( eff_discharging=proto_component.efficiency_discharging, soc0=proto_component.initial_state_of_charge, switchboard_id=switchboard_id, + uid=proto_component.uid if len(proto_component.uid) > _MIN_LENGTH_UID else None, ) @@ -352,6 +375,7 @@ def convert_proto_battery_system_to_feems( battery=battery, converter=converter, switchboard_id=switchboard_id, + uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None, ) @@ -366,6 +390,7 @@ def convert_proto_supercapacitor_to_feems( eff_discharging=proto_component.efficiency_discharging, soc0=proto_component.initial_state_of_charge, switchboard_id=switchboard_id, + uid=proto_component.uid if len(proto_component.uid) > _MIN_LENGTH_UID else None, ) @@ -386,6 +411,7 @@ def convert_proto_supercapacitor_system_to_feems( supercapacitor=supercapacitor, converter=converter, switchboard_id=switchboard_id, + uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None, ) @@ -469,6 +495,7 @@ def convert_proto_pti_pto_subsystem_to_feems( rated_speed=subsystem.rated_speed_rpm, switchboard_id=switchboard_id, shaft_line_id=shaft_line_id, + uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None, ) @@ -494,6 +521,7 @@ def convert_proto_serial_subsystem_to_feems( rated_speed=( None if subsystem.rated_speed_rpm == 0 else subsystem.rated_speed_rpm ), + uid=subsystem.uid if len(subsystem.uid) > _MIN_LENGTH_UID else None, ) @@ -605,6 +633,11 @@ def convert_proto_shaftline_to_feems( type_engine=TypeComponent.MAIN_ENGINE, ), shaft_line_id=shaft_line_id, + uid=( + sub_system.uid + if len(sub_system.uid) > _MIN_LENGTH_UID + else None + ), ) ) elif ( @@ -620,15 +653,25 @@ def convert_proto_shaftline_to_feems( ), gearbox=BasicComponent( type_=TypeComponent.GEARBOX, - name=sub_system.gearbox.name, + name=sub_system.gear.name, power_type=TypePower.POWER_TRANSMISSION, rated_power=sub_system.gear.rated_power_kw, rated_speed=sub_system.gear.rated_speed_rpm, eff_curve=convert_proto_efficiency_bsfc_power_to_np_array( efficiency_bsfc_power=sub_system.gear.efficiency ), + uid=( + sub_system.gear.uid + if len(sub_system.gear.uid) > _MIN_LENGTH_UID + else None + ), ), shaft_line_id=shaft_line_id, + uid=( + sub_system.uid + if len(sub_system.uid) > _MIN_LENGTH_UID + else None + ), ) ) elif sub_system.component_type == proto.Subsystem.ComponentType.PTI_PTO_SYSTEM: @@ -673,6 +716,11 @@ def convert_proto_shaftline_to_feems( eff_curve=convert_proto_efficiency_bsfc_power_to_np_array( efficiency_bsfc_power=sub_system.propeller.efficiency ), + uid=( + sub_system.uid + if len(sub_system.uid) > _MIN_LENGTH_UID + else None + ), ) ) else: diff --git a/machinery-system-structure/MachSysS/convert_to_protobuf.py b/machinery-system-structure/MachSysS/convert_to_protobuf.py index bbe6282..939af79 100644 --- a/machinery-system-structure/MachSysS/convert_to_protobuf.py +++ b/machinery-system-structure/MachSysS/convert_to_protobuf.py @@ -135,6 +135,7 @@ def convert_electric_machine_to_protobuf( rated_speed_rpm=component.rated_speed, efficiency=convert_efficiency_curve_to_protobuf(component), order_from_switchboard_or_shaftline=order_from_switchboard, + uid=component.uid, ) @@ -147,6 +148,7 @@ def convert_electric_component_to_protobuf( rated_power_kw=component.rated_power, efficiency=convert_efficiency_curve_to_protobuf(component), order_from_switchboard_or_shaftline=order_from_switchboard, + uid=component.uid, ) @@ -163,6 +165,7 @@ def convert_battery_component_to_protobuf( efficiency_discharging=component.eff_discharging, initial_state_of_charge=component.soc0, order_from_switchboard_or_shaftline=order_from_switchboard, + uid=component.uid, ) @@ -178,6 +181,7 @@ def convert_supercapacitor_component_to_protobuf( efficiency_discharging=component.eff_discharging, initial_state_of_charge=component.soc0, order_from_switchboard_or_shaftline=order_from_switchboard, + uid=component.uid, ) @@ -187,7 +191,14 @@ def convert_serial_electric_system_to_protobuf( ) -> proto.Subsystem: """Convert serial electric system or PTI/PTO component to protobuf message""" order = initial_order_from_switchboard - subsystem = proto.Subsystem() + subsystem = proto.Subsystem( + name=component.name, + rated_power_kw=component.rated_power, + rated_speed_rpm=component.rated_speed, + component_type=component.type.value, + power_type=component.power_type.value, + uid=component.uid, + ) for subcomponent in component.components: if subcomponent.type == TypeComponent.TRANSFORMER: subsystem.transformer.CopyFrom( @@ -280,6 +291,7 @@ def convert_engine_component_to_protobuf( engine_feems.emission_curves ), order_from_switchboard_or_shaftline=order_from_shaftline_or_switchboard, + uid=engine_feems.uid, ) if isinstance(engine_feems, EngineDualFuel): engine.pilot_bsfc.CopyFrom( @@ -313,6 +325,7 @@ def convert_cogas_component_to_protobuf( ), emission_curves=convert_emission_curves_to_protobuf(component.emission_curves), order_from_switchboard_or_shaftline=order_from_shaftline_or_switchboard, + uid=component.uid, ) if component.gas_turbine_power_curve is not None: cogas.gas_turbine_power_curve.CopyFrom( @@ -339,6 +352,7 @@ def convert_switchboard_to_protobuf( name=component.name, rated_power_kw=component.rated_power, rated_speed_rpm=component.rated_speed, + uid=component.uid, ) if component.type == TypeComponent.GENERATOR: subsystem.electric_machine.CopyFrom( @@ -364,6 +378,7 @@ def convert_switchboard_to_protobuf( ), number_modules=component.number_modules, order_from_switchboard_or_shaftline=2, + uid=component.fuel_cell.uid, ) ) elif component.type == TypeComponent.COGES: @@ -459,6 +474,7 @@ def convert_shaftline_to_protobuf(shaftline_feems: ShaftLine) -> proto.ShaftLine rated_speed_rpm=gear.rated_speed, efficiency=convert_efficiency_curve_to_protobuf(gear), order_from_switchboard_or_shaftline=1, + uid=gear.uid, ) for component in shaftline_feems.components: @@ -468,6 +484,7 @@ def convert_shaftline_to_protobuf(shaftline_feems: ShaftLine) -> proto.ShaftLine name=component.name, rated_power_kw=component.rated_power, rated_speed_rpm=component.rated_speed, + uid=component.uid, ) if component.type == TypeComponent.MAIN_ENGINE: component = cast(MainEngineForMechanicalPropulsion, component) @@ -497,6 +514,7 @@ def convert_shaftline_to_protobuf(shaftline_feems: ShaftLine) -> proto.ShaftLine rated_speed_rpm=component.gearbox.rated_speed, efficiency=convert_efficiency_curve_to_protobuf(component.gearbox), order_from_switchboard_or_shaftline=1, + uid=component.gearbox.uid, ) ) elif component.type == TypeComponent.PROPELLER_LOAD: @@ -507,6 +525,7 @@ def convert_shaftline_to_protobuf(shaftline_feems: ShaftLine) -> proto.ShaftLine efficiency=convert_efficiency_curve_to_protobuf(component), propulsor_id=propeller_id, order_from_switchboard_or_shaftline=2, + uid=component.uid, ) ) propeller_id += 1 diff --git a/machinery-system-structure/MachSysS/feems_result_pb2.pyi b/machinery-system-structure/MachSysS/feems_result_pb2.pyi index d03307e..c1cbf20 100644 --- a/machinery-system-structure/MachSysS/feems_result_pb2.pyi +++ b/machinery-system-structure/MachSysS/feems_result_pb2.pyi @@ -1,4 +1,4 @@ -import system_structure_pb2 as _system_structure_pb2 +from . import system_structure_pb2 as _system_structure_pb2 from google.protobuf.internal import containers as _containers from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message diff --git a/machinery-system-structure/MachSysS/system_structure_pb2.py b/machinery-system-structure/MachSysS/system_structure_pb2.py index 2a6c613..e1cf6b1 100644 --- a/machinery-system-structure/MachSysS/system_structure_pb2.py +++ b/machinery-system-structure/MachSysS/system_structure_pb2.py @@ -14,7 +14,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x16system_structure.proto\x12\x18machinerySystemStructure"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x01\x12\t\n\x01y\x18\x02 \x01(\x01":\n\x07\x43urve1D\x12/\n\x06points\x18\x01 \x03(\x0b\x32\x1f.machinerySystemStructure.Point"_\n\tBSFCCurve\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x30\n\x05\x63urve\x18\x03 \x01(\x0b\x32!.machinerySystemStructure.Curve1D"e\n\x0f\x45\x66\x66iciencyCurve\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x30\n\x05\x63urve\x18\x03 \x01(\x0b\x32!.machinerySystemStructure.Curve1D"X\n\x04\x42SFC\x12\x32\n\x05\x63urve\x18\x01 \x01(\x0b\x32#.machinerySystemStructure.BSFCCurve\x12\x12\n\x05value\x18\x02 \x01(\x01H\x00\x88\x01\x01\x42\x08\n\x06_value"s\n\nEfficiency\x12=\n\x05\x63urve\x18\x01 \x01(\x0b\x32).machinerySystemStructure.EfficiencyCurveH\x00\x88\x01\x01\x12\x12\n\x05value\x18\x02 \x01(\x01H\x01\x88\x01\x01\x42\x08\n\x06_curveB\x08\n\x06_value"`\n\nPowerCurve\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x30\n\x05\x63urve\x18\x03 \x01(\x0b\x32!.machinerySystemStructure.Curve1D"\x85\x01\n\x19PropulsionPowerTimeSeries\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x14\n\x0cpropulsor_id\x18\x03 \x01(\r\x12\x30\n\x05\x63urve\x18\x04 \x01(\x0b\x32!.machinerySystemStructure.Curve1D"\x85\x01\n\x17\x41uxiliaryLoadTimeSeries\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x16\n\x0eswitchboard_id\x18\x03 \x01(\r\x12\x30\n\x05\x63urve\x18\x04 \x01(\x0b\x32!.machinerySystemStructure.Curve1D"8\n\rAuxiliaryLoad\x12\x16\n\x0eswitchboard_id\x18\x01 \x01(\r\x12\x0f\n\x07load_kw\x18\x02 \x01(\x01"\xa2\x01\n\rEmissionCurve\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x30\n\x05\x63urve\x18\x03 \x01(\x0b\x32!.machinerySystemStructure.Curve1D\x12=\n\remission_type\x18\x04 \x01(\x0e\x32&.machinerySystemStructure.EmissionType"\xd8\x01\n\x04Gear\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ngear_ratio\x18\x02 \x01(\x01\x12\x16\n\x0erated_power_kw\x18\x03 \x01(\x01\x12\x17\n\x0frated_speed_rpm\x18\x04 \x01(\x01\x12\x38\n\nefficiency\x18\x05 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12+\n#order_from_switchboard_or_shaftline\x18\x06 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\x07 \x01(\x01"x\n\x04\x46uel\x12\x35\n\tfuel_type\x18\x01 \x01(\x0e\x32".machinerySystemStructure.FuelType\x12\x39\n\x0b\x66uel_origin\x18\x02 \x01(\x0e\x32$.machinerySystemStructure.FuelOrigin"\x85\x06\n\x06\x45ngine\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x17\n\x0frated_speed_rpm\x18\x03 \x01(\x01\x12,\n\x04\x62sfc\x18\x04 \x01(\x0b\x32\x1e.machinerySystemStructure.BSFC\x12\x31\n\tmain_fuel\x18\x05 \x01(\x0b\x32\x1e.machinerySystemStructure.Fuel\x12+\n#order_from_switchboard_or_shaftline\x18\x06 \x01(\r\x12\x32\n\npilot_bsfc\x18\x07 \x01(\x0b\x32\x1e.machinerySystemStructure.BSFC\x12\x32\n\npilot_fuel\x18\x08 \x01(\x0b\x32\x1e.machinerySystemStructure.Fuel\x12U\n\x16nox_calculation_method\x18\t \x01(\x0e\x32\x35.machinerySystemStructure.Engine.NOxCalculationMethod\x12@\n\x0f\x65mission_curves\x18\n \x03(\x0b\x32\'.machinerySystemStructure.EmissionCurve\x12K\n\x11\x65ngine_cycle_type\x18\x0b \x01(\x0e\x32\x30.machinerySystemStructure.Engine.EngineCycleType\x12\x16\n\x0eunit_price_usd\x18\x0c \x01(\x01\x12\x15\n\rstart_delay_s\x18\r \x01(\x01\x12\x19\n\x11turn_off_power_kw\x18\x0e \x01(\x01"E\n\x14NOxCalculationMethod\x12\n\n\x06TIER_2\x10\x00\x12\n\n\x06TIER_1\x10\x01\x12\n\n\x06TIER_3\x10\x02\x12\t\n\x05\x43URVE\x10\x03"O\n\x0f\x45ngineCycleType\x12\x08\n\x04NONE\x10\x00\x12\n\n\x06\x44IESEL\x10\x01\x12\x08\n\x04OTTO\x10\x02\x12\x1c\n\x18LEAN_BURN_SPARK_IGNITION\x10\x03"\xce\x04\n\x05\x43OGAS\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x17\n\x0frated_speed_rpm\x18\x03 \x01(\x01\x12\x38\n\nefficiency\x18\x04 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12\x45\n\x17gas_turbine_power_curve\x18\x05 \x01(\x0b\x32$.machinerySystemStructure.PowerCurve\x12G\n\x19steam_turbine_power_curve\x18\x06 \x01(\x0b\x32$.machinerySystemStructure.PowerCurve\x12,\n\x04\x66uel\x18\x07 \x01(\x0b\x32\x1e.machinerySystemStructure.Fuel\x12+\n#order_from_switchboard_or_shaftline\x18\x08 \x01(\r\x12U\n\x16nox_calculation_method\x18\t \x01(\x0e\x32\x35.machinerySystemStructure.Engine.NOxCalculationMethod\x12@\n\x0f\x65mission_curves\x18\n \x03(\x0b\x32\'.machinerySystemStructure.EmissionCurve\x12\x16\n\x0eunit_price_usd\x18\x0b \x01(\x01\x12\x15\n\rstart_delay_s\x18\x0c \x01(\x01\x12\x19\n\x11turn_off_power_kw\x18\r \x01(\x01"\xcf\x01\n\x0f\x45lectricMachine\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x17\n\x0frated_speed_rpm\x18\x03 \x01(\x01\x12\x38\n\nefficiency\x18\x04 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12+\n#order_from_switchboard_or_shaftline\x18\x05 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\x06 \x01(\x01"\x82\x03\n\x07\x42\x61ttery\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x13\x65nergy_capacity_kwh\x18\x02 \x01(\x01\x12\x1d\n\x15rated_charging_rate_c\x18\x03 \x01(\x01\x12 \n\x18rated_discharging_rate_c\x18\x04 \x01(\x01\x12\x1b\n\x13\x65\x66\x66iciency_charging\x18\x05 \x01(\x01\x12\x1e\n\x16\x65\x66\x66iciency_discharging\x18\x06 \x01(\x01\x12\x1f\n\x17initial_state_of_charge\x18\x07 \x01(\x01\x12+\n#order_from_switchboard_or_shaftline\x18\x08 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\t \x01(\x01\x12&\n\x1eself_discharge_percent_per_day\x18\n \x01(\x01\x12\x1f\n\x17state_of_energy_minimum\x18\x0b \x01(\x01\x12\x1f\n\x17state_of_energy_maximum\x18\x0c \x01(\x01"\xb8\x01\n\x11\x45lectricComponent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x38\n\nefficiency\x18\x03 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12+\n#order_from_switchboard_or_shaftline\x18\x04 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\x05 \x01(\x01"\xac\x02\n\x08\x46uelCell\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x38\n\nefficiency\x18\x03 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12+\n#order_from_switchboard_or_shaftline\x18\x05 \x01(\r\x12,\n\x04\x66uel\x18\x06 \x01(\x0b\x32\x1e.machinerySystemStructure.Fuel\x12\x16\n\x0eunit_price_usd\x18\x07 \x01(\x01\x12\x16\n\x0enumber_modules\x18\x08 \x01(\r\x12\x1e\n\x16power_minimum_specific\x18\t \x01(\x01\x12\x15\n\rstart_delay_s\x18\n \x01(\x01"\x96\x01\n\tPropeller\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\nefficiency\x18\x02 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12\x14\n\x0cpropulsor_id\x18\x03 \x01(\r\x12+\n#order_from_switchboard_or_shaftline\x18\x05 \x01(\r"$\n\nBusBreaker\x12\x16\n\x0eswitchboard_to\x18\x01 \x01(\x05"\xf5\x01\n\x0eSuperCapacitor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1a\n\x12\x65nergy_capacity_wh\x18\x02 \x01(\x01\x12\x16\n\x0erated_power_kw\x18\x03 \x01(\x01\x12\x1b\n\x13\x65\x66\x66iciency_charging\x18\x04 \x01(\x01\x12\x1e\n\x16\x65\x66\x66iciency_discharging\x18\x05 \x01(\x01\x12\x1f\n\x17initial_state_of_charge\x18\x06 \x01(\x01\x12+\n#order_from_switchboard_or_shaftline\x18\x07 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\x08 \x01(\x01"\xba\x01\n\x13MechanicalComponent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x38\n\nefficiency\x18\x03 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12+\n#order_from_switchboard_or_shaftline\x18\x04 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\x05 \x01(\x01"\x80\x0e\n\tSubsystem\x12,\n\x04gear\x18\x01 \x01(\x0b\x32\x1e.machinerySystemStructure.Gear\x12\x30\n\x06\x65ngine\x18\x02 \x01(\x0b\x32 .machinerySystemStructure.Engine\x12\x43\n\x10\x65lectric_machine\x18\x03 \x01(\x0b\x32).machinerySystemStructure.ElectricMachine\x12@\n\x0btransformer\x18\x04 \x01(\x0b\x32+.machinerySystemStructure.ElectricComponent\x12?\n\nconverter1\x18\x05 \x01(\x0b\x32+.machinerySystemStructure.ElectricComponent\x12?\n\nconverter2\x18\x06 \x01(\x0b\x32+.machinerySystemStructure.ElectricComponent\x12\x32\n\x07\x62\x61ttery\x18\x07 \x01(\x0b\x32!.machinerySystemStructure.Battery\x12\x35\n\tfuel_cell\x18\x08 \x01(\x0b\x32".machinerySystemStructure.FuelCell\x12\x36\n\tpropeller\x18\t \x01(\x0b\x32#.machinerySystemStructure.Propeller\x12\x39\n\x0b\x62us_breaker\x18\n \x01(\x0b\x32$.machinerySystemStructure.BusBreaker\x12@\n\x0esupercapacitor\x18\x0b \x01(\x0b\x32(.machinerySystemStructure.SuperCapacitor\x12?\n\nother_load\x18\x0c \x01(\x0b\x32+.machinerySystemStructure.ElectricComponent\x12.\n\x05\x63ogas\x18\r \x01(\x0b\x32\x1f.machinerySystemStructure.COGAS\x12\x41\n\npower_type\x18\x0e \x01(\x0e\x32-.machinerySystemStructure.Subsystem.PowerType\x12I\n\x0e\x63omponent_type\x18\x0f \x01(\x0e\x32\x31.machinerySystemStructure.Subsystem.ComponentType\x12\x0c\n\x04name\x18\x10 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x11 \x01(\x01\x12\x17\n\x0frated_speed_rpm\x18\x12 \x01(\x01\x12-\n%ramp_up_rate_limit_percent_per_second\x18\x13 \x01(\x01\x12/\n\'ramp_down_rate_limit_percent_per_second\x18\x14 \x01(\x01\x12\x17\n\x0f\x62\x61se_load_order\x18\x15 \x01(\r"s\n\tPowerType\x12\t\n\x05NONE1\x10\x00\x12\x10\n\x0cPOWER_SOURCE\x10\x01\x12\x12\n\x0ePOWER_CONSUMER\x10\x02\x12\x0b\n\x07PTI_PTO\x10\x03\x12\x12\n\x0e\x45NERGY_STORAGE\x10\x04\x12\x14\n\x10SHORE_CONNECTION\x10\x05"\xbd\x04\n\rComponentType\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\x0bMAIN_ENGINE\x10\x01\x12\x14\n\x10\x41UXILIARY_ENGINE\x10\x02\x12\r\n\tGENERATOR\x10\x03\x12\x14\n\x10PROPULSION_DRIVE\x10\x04\x12\x0e\n\nOTHER_LOAD\x10\x05\x12\x12\n\x0ePTI_PTO_SYSTEM\x10\x06\x12\x12\n\x0e\x42\x41TTERY_SYSTEM\x10\x07\x12\x14\n\x10\x46UEL_CELL_SYSTEM\x10\x08\x12\r\n\tRECTIFIER\x10\t\x12\x1c\n\x18MAIN_ENGINE_WITH_GEARBOX\x10\n\x12\x12\n\x0e\x45LECTRIC_MOTOR\x10\x0b\x12\n\n\x06GENSET\x10\x0c\x12\x0f\n\x0bTRANSFORMER\x10\r\x12\x0c\n\x08INVERTER\x10\x0e\x12\x13\n\x0f\x43IRCUIT_BREAKER\x10\x0f\x12\x14\n\x10\x41\x43TIVE_FRONT_END\x10\x10\x12\x13\n\x0fPOWER_CONVERTER\x10\x11\x12\x17\n\x13SYNCHRONOUS_MACHINE\x10\x12\x12\x15\n\x11INDUCTION_MACHINE\x10\x13\x12\x0b\n\x07GEARBOX\x10\x14\x12\r\n\tFUEL_CELL\x10\x15\x12\x12\n\x0ePROPELLER_LOAD\x10\x16\x12\x19\n\x15OTHER_MECHANICAL_LOAD\x10\x17\x12\x0b\n\x07\x42\x41TTERY\x10\x18\x12\x12\n\x0eSUPERCAPACITOR\x10\x19\x12\x19\n\x15SUPERCAPACITOR_SYSTEM\x10\x1a\x12\x0f\n\x0bSHORE_POWER\x10\x1b\x12\t\n\x05\x43OGAS\x10\x1c\x12\t\n\x05\x43OGES\x10\x1d"^\n\x0bSwitchboard\x12\x16\n\x0eswitchboard_id\x18\x01 \x01(\r\x12\x37\n\nsubsystems\x18\x02 \x03(\x0b\x32#.machinerySystemStructure.Subsystem"[\n\tShaftLine\x12\x15\n\rshaft_line_id\x18\x01 \x01(\r\x12\x37\n\nsubsystems\x18\x02 \x03(\x0b\x32#.machinerySystemStructure.Subsystem"L\n\x10MechanicalSystem\x12\x38\n\x0bshaft_lines\x18\x01 \x03(\x0b\x32#.machinerySystemStructure.ShaftLine"M\n\x0e\x45lectricSystem\x12;\n\x0cswitchboards\x18\x01 \x03(\x0b\x32%.machinerySystemStructure.Switchboard"Y\n\x0b\x46uelStorage\x12\x35\n\tfuel_type\x18\x01 \x01(\x0e\x32".machinerySystemStructure.FuelType\x12\x13\n\x0b\x63\x61pacity_kg\x18\x02 \x01(\x01"\xfe\x03\n\x0fMachinerySystem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12Q\n\x0fpropulsion_type\x18\x02 \x01(\x0e\x32\x38.machinerySystemStructure.MachinerySystem.PropulsionType\x12;\n\x0c\x66uel_storage\x18\x03 \x03(\x0b\x32%.machinerySystemStructure.FuelStorage\x12.\n&maximum_allowed_genset_load_percentage\x18\x04 \x01(\x01\x12\x45\n\x11mechanical_system\x18\x05 \x01(\x0b\x32*.machinerySystemStructure.MechanicalSystem\x12\x41\n\x0f\x65lectric_system\x18\x06 \x01(\x0b\x32(.machinerySystemStructure.ElectricSystem\x12\x31\n)maximum_allowed_fuel_cell_load_percentage\x18\x07 \x01(\x01\x12$\n\x1c\x61verage_base_load_percentage\x18\x08 \x01(\x01":\n\x0ePropulsionType\x12\x0e\n\nMECHANICAL\x10\x00\x12\x0c\n\x08\x45LECTRIC\x10\x01\x12\n\n\x06HYBRID\x10\x02*T\n\x0c\x45missionType\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SOX\x10\x01\x12\x07\n\x03NOX\x10\x02\x12\x06\n\x02\x43O\x10\x03\x12\x06\n\x02PM\x10\x04\x12\x06\n\x02HC\x10\x05\x12\x07\n\x03\x43H4\x10\x06\x12\x07\n\x03N2O\x10\x07*\x90\x01\n\x08\x46uelType\x12\n\n\x06\x44IESEL\x10\x00\x12\x07\n\x03HFO\x10\x01\x12\x0f\n\x0bNATURAL_GAS\x10\x02\x12\x0c\n\x08HYDROGEN\x10\x03\x12\x0b\n\x07\x41MMONIA\x10\x04\x12\x0f\n\x0bLPG_PROPANE\x10\x05\x12\x0e\n\nLPG_BUTANE\x10\x06\x12\x0b\n\x07\x45THANOL\x10\x07\x12\x0c\n\x08METHANOL\x10\x08\x12\x07\n\x03LFO\x10\t*C\n\nFuelOrigin\x12\t\n\x05NONE1\x10\x00\x12\n\n\x06\x46OSSIL\x10\x01\x12\x07\n\x03\x42IO\x10\x02\x12\x15\n\x11RENEWABLE_NON_BIO\x10\x03*E\n\x0f\x46uelSpecifiedBy\x12\t\n\x05NONE2\x10\x00\x12\x14\n\x10\x46UEL_EU_MARITIME\x10\x01\x12\x07\n\x03IMO\x10\x02\x12\x08\n\x04USER\x10\x03\x62\x06proto3' + b'\n\x16system_structure.proto\x12\x18machinerySystemStructure"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x01\x12\t\n\x01y\x18\x02 \x01(\x01":\n\x07\x43urve1D\x12/\n\x06points\x18\x01 \x03(\x0b\x32\x1f.machinerySystemStructure.Point"_\n\tBSFCCurve\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x30\n\x05\x63urve\x18\x03 \x01(\x0b\x32!.machinerySystemStructure.Curve1D"e\n\x0f\x45\x66\x66iciencyCurve\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x30\n\x05\x63urve\x18\x03 \x01(\x0b\x32!.machinerySystemStructure.Curve1D"X\n\x04\x42SFC\x12\x32\n\x05\x63urve\x18\x01 \x01(\x0b\x32#.machinerySystemStructure.BSFCCurve\x12\x12\n\x05value\x18\x02 \x01(\x01H\x00\x88\x01\x01\x42\x08\n\x06_value"s\n\nEfficiency\x12=\n\x05\x63urve\x18\x01 \x01(\x0b\x32).machinerySystemStructure.EfficiencyCurveH\x00\x88\x01\x01\x12\x12\n\x05value\x18\x02 \x01(\x01H\x01\x88\x01\x01\x42\x08\n\x06_curveB\x08\n\x06_value"`\n\nPowerCurve\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x30\n\x05\x63urve\x18\x03 \x01(\x0b\x32!.machinerySystemStructure.Curve1D"\x85\x01\n\x19PropulsionPowerTimeSeries\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x14\n\x0cpropulsor_id\x18\x03 \x01(\r\x12\x30\n\x05\x63urve\x18\x04 \x01(\x0b\x32!.machinerySystemStructure.Curve1D"\x85\x01\n\x17\x41uxiliaryLoadTimeSeries\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x16\n\x0eswitchboard_id\x18\x03 \x01(\r\x12\x30\n\x05\x63urve\x18\x04 \x01(\x0b\x32!.machinerySystemStructure.Curve1D"8\n\rAuxiliaryLoad\x12\x16\n\x0eswitchboard_id\x18\x01 \x01(\r\x12\x0f\n\x07load_kw\x18\x02 \x01(\x01"\xa2\x01\n\rEmissionCurve\x12\x0f\n\x07x_label\x18\x01 \x01(\t\x12\x0f\n\x07y_label\x18\x02 \x01(\t\x12\x30\n\x05\x63urve\x18\x03 \x01(\x0b\x32!.machinerySystemStructure.Curve1D\x12=\n\remission_type\x18\x04 \x01(\x0e\x32&.machinerySystemStructure.EmissionType"\xe5\x01\n\x04Gear\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ngear_ratio\x18\x02 \x01(\x01\x12\x16\n\x0erated_power_kw\x18\x03 \x01(\x01\x12\x17\n\x0frated_speed_rpm\x18\x04 \x01(\x01\x12\x38\n\nefficiency\x18\x05 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12+\n#order_from_switchboard_or_shaftline\x18\x06 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\x07 \x01(\x01\x12\x0b\n\x03uid\x18\x08 \x01(\t"x\n\x04\x46uel\x12\x35\n\tfuel_type\x18\x01 \x01(\x0e\x32".machinerySystemStructure.FuelType\x12\x39\n\x0b\x66uel_origin\x18\x02 \x01(\x0e\x32$.machinerySystemStructure.FuelOrigin"\x92\x06\n\x06\x45ngine\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x17\n\x0frated_speed_rpm\x18\x03 \x01(\x01\x12,\n\x04\x62sfc\x18\x04 \x01(\x0b\x32\x1e.machinerySystemStructure.BSFC\x12\x31\n\tmain_fuel\x18\x05 \x01(\x0b\x32\x1e.machinerySystemStructure.Fuel\x12+\n#order_from_switchboard_or_shaftline\x18\x06 \x01(\r\x12\x32\n\npilot_bsfc\x18\x07 \x01(\x0b\x32\x1e.machinerySystemStructure.BSFC\x12\x32\n\npilot_fuel\x18\x08 \x01(\x0b\x32\x1e.machinerySystemStructure.Fuel\x12U\n\x16nox_calculation_method\x18\t \x01(\x0e\x32\x35.machinerySystemStructure.Engine.NOxCalculationMethod\x12@\n\x0f\x65mission_curves\x18\n \x03(\x0b\x32\'.machinerySystemStructure.EmissionCurve\x12K\n\x11\x65ngine_cycle_type\x18\x0b \x01(\x0e\x32\x30.machinerySystemStructure.Engine.EngineCycleType\x12\x16\n\x0eunit_price_usd\x18\x0c \x01(\x01\x12\x15\n\rstart_delay_s\x18\r \x01(\x01\x12\x19\n\x11turn_off_power_kw\x18\x0e \x01(\x01\x12\x0b\n\x03uid\x18\x0f \x01(\t"E\n\x14NOxCalculationMethod\x12\n\n\x06TIER_2\x10\x00\x12\n\n\x06TIER_1\x10\x01\x12\n\n\x06TIER_3\x10\x02\x12\t\n\x05\x43URVE\x10\x03"O\n\x0f\x45ngineCycleType\x12\x08\n\x04NONE\x10\x00\x12\n\n\x06\x44IESEL\x10\x01\x12\x08\n\x04OTTO\x10\x02\x12\x1c\n\x18LEAN_BURN_SPARK_IGNITION\x10\x03"\xdb\x04\n\x05\x43OGAS\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x17\n\x0frated_speed_rpm\x18\x03 \x01(\x01\x12\x38\n\nefficiency\x18\x04 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12\x45\n\x17gas_turbine_power_curve\x18\x05 \x01(\x0b\x32$.machinerySystemStructure.PowerCurve\x12G\n\x19steam_turbine_power_curve\x18\x06 \x01(\x0b\x32$.machinerySystemStructure.PowerCurve\x12,\n\x04\x66uel\x18\x07 \x01(\x0b\x32\x1e.machinerySystemStructure.Fuel\x12+\n#order_from_switchboard_or_shaftline\x18\x08 \x01(\r\x12U\n\x16nox_calculation_method\x18\t \x01(\x0e\x32\x35.machinerySystemStructure.Engine.NOxCalculationMethod\x12@\n\x0f\x65mission_curves\x18\n \x03(\x0b\x32\'.machinerySystemStructure.EmissionCurve\x12\x16\n\x0eunit_price_usd\x18\x0b \x01(\x01\x12\x15\n\rstart_delay_s\x18\x0c \x01(\x01\x12\x19\n\x11turn_off_power_kw\x18\r \x01(\x01\x12\x0b\n\x03uid\x18\x0e \x01(\t"\xdc\x01\n\x0f\x45lectricMachine\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x17\n\x0frated_speed_rpm\x18\x03 \x01(\x01\x12\x38\n\nefficiency\x18\x04 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12+\n#order_from_switchboard_or_shaftline\x18\x05 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\x06 \x01(\x01\x12\x0b\n\x03uid\x18\x07 \x01(\t"\x8f\x03\n\x07\x42\x61ttery\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x13\x65nergy_capacity_kwh\x18\x02 \x01(\x01\x12\x1d\n\x15rated_charging_rate_c\x18\x03 \x01(\x01\x12 \n\x18rated_discharging_rate_c\x18\x04 \x01(\x01\x12\x1b\n\x13\x65\x66\x66iciency_charging\x18\x05 \x01(\x01\x12\x1e\n\x16\x65\x66\x66iciency_discharging\x18\x06 \x01(\x01\x12\x1f\n\x17initial_state_of_charge\x18\x07 \x01(\x01\x12+\n#order_from_switchboard_or_shaftline\x18\x08 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\t \x01(\x01\x12&\n\x1eself_discharge_percent_per_day\x18\n \x01(\x01\x12\x1f\n\x17state_of_energy_minimum\x18\x0b \x01(\x01\x12\x1f\n\x17state_of_energy_maximum\x18\x0c \x01(\x01\x12\x0b\n\x03uid\x18\r \x01(\t"\xc5\x01\n\x11\x45lectricComponent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x38\n\nefficiency\x18\x03 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12+\n#order_from_switchboard_or_shaftline\x18\x04 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\x05 \x01(\x01\x12\x0b\n\x03uid\x18\x06 \x01(\t"\xb9\x02\n\x08\x46uelCell\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x38\n\nefficiency\x18\x03 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12+\n#order_from_switchboard_or_shaftline\x18\x05 \x01(\r\x12,\n\x04\x66uel\x18\x06 \x01(\x0b\x32\x1e.machinerySystemStructure.Fuel\x12\x16\n\x0eunit_price_usd\x18\x07 \x01(\x01\x12\x16\n\x0enumber_modules\x18\x08 \x01(\r\x12\x1e\n\x16power_minimum_specific\x18\t \x01(\x01\x12\x15\n\rstart_delay_s\x18\n \x01(\x01\x12\x0b\n\x03uid\x18\x0b \x01(\t"\xa3\x01\n\tPropeller\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\nefficiency\x18\x02 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12\x14\n\x0cpropulsor_id\x18\x03 \x01(\r\x12+\n#order_from_switchboard_or_shaftline\x18\x05 \x01(\r\x12\x0b\n\x03uid\x18\x06 \x01(\t"$\n\nBusBreaker\x12\x16\n\x0eswitchboard_to\x18\x01 \x01(\x05"\x82\x02\n\x0eSuperCapacitor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1a\n\x12\x65nergy_capacity_wh\x18\x02 \x01(\x01\x12\x16\n\x0erated_power_kw\x18\x03 \x01(\x01\x12\x1b\n\x13\x65\x66\x66iciency_charging\x18\x04 \x01(\x01\x12\x1e\n\x16\x65\x66\x66iciency_discharging\x18\x05 \x01(\x01\x12\x1f\n\x17initial_state_of_charge\x18\x06 \x01(\x01\x12+\n#order_from_switchboard_or_shaftline\x18\x07 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\x08 \x01(\x01\x12\x0b\n\x03uid\x18\t \x01(\t"\xc7\x01\n\x13MechanicalComponent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x02 \x01(\x01\x12\x38\n\nefficiency\x18\x03 \x01(\x0b\x32$.machinerySystemStructure.Efficiency\x12+\n#order_from_switchboard_or_shaftline\x18\x04 \x01(\r\x12\x16\n\x0eunit_price_usd\x18\x05 \x01(\x01\x12\x0b\n\x03uid\x18\x06 \x01(\t"\x8d\x0e\n\tSubsystem\x12,\n\x04gear\x18\x01 \x01(\x0b\x32\x1e.machinerySystemStructure.Gear\x12\x30\n\x06\x65ngine\x18\x02 \x01(\x0b\x32 .machinerySystemStructure.Engine\x12\x43\n\x10\x65lectric_machine\x18\x03 \x01(\x0b\x32).machinerySystemStructure.ElectricMachine\x12@\n\x0btransformer\x18\x04 \x01(\x0b\x32+.machinerySystemStructure.ElectricComponent\x12?\n\nconverter1\x18\x05 \x01(\x0b\x32+.machinerySystemStructure.ElectricComponent\x12?\n\nconverter2\x18\x06 \x01(\x0b\x32+.machinerySystemStructure.ElectricComponent\x12\x32\n\x07\x62\x61ttery\x18\x07 \x01(\x0b\x32!.machinerySystemStructure.Battery\x12\x35\n\tfuel_cell\x18\x08 \x01(\x0b\x32".machinerySystemStructure.FuelCell\x12\x36\n\tpropeller\x18\t \x01(\x0b\x32#.machinerySystemStructure.Propeller\x12\x39\n\x0b\x62us_breaker\x18\n \x01(\x0b\x32$.machinerySystemStructure.BusBreaker\x12@\n\x0esupercapacitor\x18\x0b \x01(\x0b\x32(.machinerySystemStructure.SuperCapacitor\x12?\n\nother_load\x18\x0c \x01(\x0b\x32+.machinerySystemStructure.ElectricComponent\x12.\n\x05\x63ogas\x18\r \x01(\x0b\x32\x1f.machinerySystemStructure.COGAS\x12\x41\n\npower_type\x18\x0e \x01(\x0e\x32-.machinerySystemStructure.Subsystem.PowerType\x12I\n\x0e\x63omponent_type\x18\x0f \x01(\x0e\x32\x31.machinerySystemStructure.Subsystem.ComponentType\x12\x0c\n\x04name\x18\x10 \x01(\t\x12\x16\n\x0erated_power_kw\x18\x11 \x01(\x01\x12\x17\n\x0frated_speed_rpm\x18\x12 \x01(\x01\x12-\n%ramp_up_rate_limit_percent_per_second\x18\x13 \x01(\x01\x12/\n\'ramp_down_rate_limit_percent_per_second\x18\x14 \x01(\x01\x12\x17\n\x0f\x62\x61se_load_order\x18\x15 \x01(\r\x12\x0b\n\x03uid\x18\x16 \x01(\t"s\n\tPowerType\x12\t\n\x05NONE1\x10\x00\x12\x10\n\x0cPOWER_SOURCE\x10\x01\x12\x12\n\x0ePOWER_CONSUMER\x10\x02\x12\x0b\n\x07PTI_PTO\x10\x03\x12\x12\n\x0e\x45NERGY_STORAGE\x10\x04\x12\x14\n\x10SHORE_CONNECTION\x10\x05"\xbd\x04\n\rComponentType\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\x0bMAIN_ENGINE\x10\x01\x12\x14\n\x10\x41UXILIARY_ENGINE\x10\x02\x12\r\n\tGENERATOR\x10\x03\x12\x14\n\x10PROPULSION_DRIVE\x10\x04\x12\x0e\n\nOTHER_LOAD\x10\x05\x12\x12\n\x0ePTI_PTO_SYSTEM\x10\x06\x12\x12\n\x0e\x42\x41TTERY_SYSTEM\x10\x07\x12\x14\n\x10\x46UEL_CELL_SYSTEM\x10\x08\x12\r\n\tRECTIFIER\x10\t\x12\x1c\n\x18MAIN_ENGINE_WITH_GEARBOX\x10\n\x12\x12\n\x0e\x45LECTRIC_MOTOR\x10\x0b\x12\n\n\x06GENSET\x10\x0c\x12\x0f\n\x0bTRANSFORMER\x10\r\x12\x0c\n\x08INVERTER\x10\x0e\x12\x13\n\x0f\x43IRCUIT_BREAKER\x10\x0f\x12\x14\n\x10\x41\x43TIVE_FRONT_END\x10\x10\x12\x13\n\x0fPOWER_CONVERTER\x10\x11\x12\x17\n\x13SYNCHRONOUS_MACHINE\x10\x12\x12\x15\n\x11INDUCTION_MACHINE\x10\x13\x12\x0b\n\x07GEARBOX\x10\x14\x12\r\n\tFUEL_CELL\x10\x15\x12\x12\n\x0ePROPELLER_LOAD\x10\x16\x12\x19\n\x15OTHER_MECHANICAL_LOAD\x10\x17\x12\x0b\n\x07\x42\x41TTERY\x10\x18\x12\x12\n\x0eSUPERCAPACITOR\x10\x19\x12\x19\n\x15SUPERCAPACITOR_SYSTEM\x10\x1a\x12\x0f\n\x0bSHORE_POWER\x10\x1b\x12\t\n\x05\x43OGAS\x10\x1c\x12\t\n\x05\x43OGES\x10\x1d"^\n\x0bSwitchboard\x12\x16\n\x0eswitchboard_id\x18\x01 \x01(\r\x12\x37\n\nsubsystems\x18\x02 \x03(\x0b\x32#.machinerySystemStructure.Subsystem"[\n\tShaftLine\x12\x15\n\rshaft_line_id\x18\x01 \x01(\r\x12\x37\n\nsubsystems\x18\x02 \x03(\x0b\x32#.machinerySystemStructure.Subsystem"L\n\x10MechanicalSystem\x12\x38\n\x0bshaft_lines\x18\x01 \x03(\x0b\x32#.machinerySystemStructure.ShaftLine"M\n\x0e\x45lectricSystem\x12;\n\x0cswitchboards\x18\x01 \x03(\x0b\x32%.machinerySystemStructure.Switchboard"Y\n\x0b\x46uelStorage\x12\x35\n\tfuel_type\x18\x01 \x01(\x0e\x32".machinerySystemStructure.FuelType\x12\x13\n\x0b\x63\x61pacity_kg\x18\x02 \x01(\x01"\xfe\x03\n\x0fMachinerySystem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12Q\n\x0fpropulsion_type\x18\x02 \x01(\x0e\x32\x38.machinerySystemStructure.MachinerySystem.PropulsionType\x12;\n\x0c\x66uel_storage\x18\x03 \x03(\x0b\x32%.machinerySystemStructure.FuelStorage\x12.\n&maximum_allowed_genset_load_percentage\x18\x04 \x01(\x01\x12\x45\n\x11mechanical_system\x18\x05 \x01(\x0b\x32*.machinerySystemStructure.MechanicalSystem\x12\x41\n\x0f\x65lectric_system\x18\x06 \x01(\x0b\x32(.machinerySystemStructure.ElectricSystem\x12\x31\n)maximum_allowed_fuel_cell_load_percentage\x18\x07 \x01(\x01\x12$\n\x1c\x61verage_base_load_percentage\x18\x08 \x01(\x01":\n\x0ePropulsionType\x12\x0e\n\nMECHANICAL\x10\x00\x12\x0c\n\x08\x45LECTRIC\x10\x01\x12\n\n\x06HYBRID\x10\x02*T\n\x0c\x45missionType\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SOX\x10\x01\x12\x07\n\x03NOX\x10\x02\x12\x06\n\x02\x43O\x10\x03\x12\x06\n\x02PM\x10\x04\x12\x06\n\x02HC\x10\x05\x12\x07\n\x03\x43H4\x10\x06\x12\x07\n\x03N2O\x10\x07*\x90\x01\n\x08\x46uelType\x12\n\n\x06\x44IESEL\x10\x00\x12\x07\n\x03HFO\x10\x01\x12\x0f\n\x0bNATURAL_GAS\x10\x02\x12\x0c\n\x08HYDROGEN\x10\x03\x12\x0b\n\x07\x41MMONIA\x10\x04\x12\x0f\n\x0bLPG_PROPANE\x10\x05\x12\x0e\n\nLPG_BUTANE\x10\x06\x12\x0b\n\x07\x45THANOL\x10\x07\x12\x0c\n\x08METHANOL\x10\x08\x12\x07\n\x03LFO\x10\t*C\n\nFuelOrigin\x12\t\n\x05NONE1\x10\x00\x12\n\n\x06\x46OSSIL\x10\x01\x12\x07\n\x03\x42IO\x10\x02\x12\x15\n\x11RENEWABLE_NON_BIO\x10\x03*E\n\x0f\x46uelSpecifiedBy\x12\t\n\x05NONE2\x10\x00\x12\x14\n\x10\x46UEL_EU_MARITIME\x10\x01\x12\x07\n\x03IMO\x10\x02\x12\x08\n\x04USER\x10\x03\x62\x06proto3' ) _globals = globals() @@ -22,14 +22,14 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "system_structure_pb2", _globals) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None - _globals["_EMISSIONTYPE"]._serialized_start = 7315 - _globals["_EMISSIONTYPE"]._serialized_end = 7399 - _globals["_FUELTYPE"]._serialized_start = 7402 - _globals["_FUELTYPE"]._serialized_end = 7546 - _globals["_FUELORIGIN"]._serialized_start = 7548 - _globals["_FUELORIGIN"]._serialized_end = 7615 - _globals["_FUELSPECIFIEDBY"]._serialized_start = 7617 - _globals["_FUELSPECIFIEDBY"]._serialized_end = 7686 + _globals["_EMISSIONTYPE"]._serialized_start = 7458 + _globals["_EMISSIONTYPE"]._serialized_end = 7542 + _globals["_FUELTYPE"]._serialized_start = 7545 + _globals["_FUELTYPE"]._serialized_end = 7689 + _globals["_FUELORIGIN"]._serialized_start = 7691 + _globals["_FUELORIGIN"]._serialized_end = 7758 + _globals["_FUELSPECIFIEDBY"]._serialized_start = 7760 + _globals["_FUELSPECIFIEDBY"]._serialized_end = 7829 _globals["_POINT"]._serialized_start = 52 _globals["_POINT"]._serialized_end = 81 _globals["_CURVE1D"]._serialized_start = 83 @@ -53,51 +53,51 @@ _globals["_EMISSIONCURVE"]._serialized_start = 979 _globals["_EMISSIONCURVE"]._serialized_end = 1141 _globals["_GEAR"]._serialized_start = 1144 - _globals["_GEAR"]._serialized_end = 1360 - _globals["_FUEL"]._serialized_start = 1362 - _globals["_FUEL"]._serialized_end = 1482 - _globals["_ENGINE"]._serialized_start = 1485 - _globals["_ENGINE"]._serialized_end = 2258 - _globals["_ENGINE_NOXCALCULATIONMETHOD"]._serialized_start = 2108 - _globals["_ENGINE_NOXCALCULATIONMETHOD"]._serialized_end = 2177 - _globals["_ENGINE_ENGINECYCLETYPE"]._serialized_start = 2179 - _globals["_ENGINE_ENGINECYCLETYPE"]._serialized_end = 2258 - _globals["_COGAS"]._serialized_start = 2261 - _globals["_COGAS"]._serialized_end = 2851 - _globals["_ELECTRICMACHINE"]._serialized_start = 2854 - _globals["_ELECTRICMACHINE"]._serialized_end = 3061 - _globals["_BATTERY"]._serialized_start = 3064 - _globals["_BATTERY"]._serialized_end = 3450 - _globals["_ELECTRICCOMPONENT"]._serialized_start = 3453 - _globals["_ELECTRICCOMPONENT"]._serialized_end = 3637 - _globals["_FUELCELL"]._serialized_start = 3640 - _globals["_FUELCELL"]._serialized_end = 3940 - _globals["_PROPELLER"]._serialized_start = 3943 - _globals["_PROPELLER"]._serialized_end = 4093 - _globals["_BUSBREAKER"]._serialized_start = 4095 - _globals["_BUSBREAKER"]._serialized_end = 4131 - _globals["_SUPERCAPACITOR"]._serialized_start = 4134 - _globals["_SUPERCAPACITOR"]._serialized_end = 4379 - _globals["_MECHANICALCOMPONENT"]._serialized_start = 4382 - _globals["_MECHANICALCOMPONENT"]._serialized_end = 4568 - _globals["_SUBSYSTEM"]._serialized_start = 4571 - _globals["_SUBSYSTEM"]._serialized_end = 6363 - _globals["_SUBSYSTEM_POWERTYPE"]._serialized_start = 5672 - _globals["_SUBSYSTEM_POWERTYPE"]._serialized_end = 5787 - _globals["_SUBSYSTEM_COMPONENTTYPE"]._serialized_start = 5790 - _globals["_SUBSYSTEM_COMPONENTTYPE"]._serialized_end = 6363 - _globals["_SWITCHBOARD"]._serialized_start = 6365 - _globals["_SWITCHBOARD"]._serialized_end = 6459 - _globals["_SHAFTLINE"]._serialized_start = 6461 - _globals["_SHAFTLINE"]._serialized_end = 6552 - _globals["_MECHANICALSYSTEM"]._serialized_start = 6554 - _globals["_MECHANICALSYSTEM"]._serialized_end = 6630 - _globals["_ELECTRICSYSTEM"]._serialized_start = 6632 - _globals["_ELECTRICSYSTEM"]._serialized_end = 6709 - _globals["_FUELSTORAGE"]._serialized_start = 6711 - _globals["_FUELSTORAGE"]._serialized_end = 6800 - _globals["_MACHINERYSYSTEM"]._serialized_start = 6803 - _globals["_MACHINERYSYSTEM"]._serialized_end = 7313 - _globals["_MACHINERYSYSTEM_PROPULSIONTYPE"]._serialized_start = 7255 - _globals["_MACHINERYSYSTEM_PROPULSIONTYPE"]._serialized_end = 7313 + _globals["_GEAR"]._serialized_end = 1373 + _globals["_FUEL"]._serialized_start = 1375 + _globals["_FUEL"]._serialized_end = 1495 + _globals["_ENGINE"]._serialized_start = 1498 + _globals["_ENGINE"]._serialized_end = 2284 + _globals["_ENGINE_NOXCALCULATIONMETHOD"]._serialized_start = 2134 + _globals["_ENGINE_NOXCALCULATIONMETHOD"]._serialized_end = 2203 + _globals["_ENGINE_ENGINECYCLETYPE"]._serialized_start = 2205 + _globals["_ENGINE_ENGINECYCLETYPE"]._serialized_end = 2284 + _globals["_COGAS"]._serialized_start = 2287 + _globals["_COGAS"]._serialized_end = 2890 + _globals["_ELECTRICMACHINE"]._serialized_start = 2893 + _globals["_ELECTRICMACHINE"]._serialized_end = 3113 + _globals["_BATTERY"]._serialized_start = 3116 + _globals["_BATTERY"]._serialized_end = 3515 + _globals["_ELECTRICCOMPONENT"]._serialized_start = 3518 + _globals["_ELECTRICCOMPONENT"]._serialized_end = 3715 + _globals["_FUELCELL"]._serialized_start = 3718 + _globals["_FUELCELL"]._serialized_end = 4031 + _globals["_PROPELLER"]._serialized_start = 4034 + _globals["_PROPELLER"]._serialized_end = 4197 + _globals["_BUSBREAKER"]._serialized_start = 4199 + _globals["_BUSBREAKER"]._serialized_end = 4235 + _globals["_SUPERCAPACITOR"]._serialized_start = 4238 + _globals["_SUPERCAPACITOR"]._serialized_end = 4496 + _globals["_MECHANICALCOMPONENT"]._serialized_start = 4499 + _globals["_MECHANICALCOMPONENT"]._serialized_end = 4698 + _globals["_SUBSYSTEM"]._serialized_start = 4701 + _globals["_SUBSYSTEM"]._serialized_end = 6506 + _globals["_SUBSYSTEM_POWERTYPE"]._serialized_start = 5815 + _globals["_SUBSYSTEM_POWERTYPE"]._serialized_end = 5930 + _globals["_SUBSYSTEM_COMPONENTTYPE"]._serialized_start = 5933 + _globals["_SUBSYSTEM_COMPONENTTYPE"]._serialized_end = 6506 + _globals["_SWITCHBOARD"]._serialized_start = 6508 + _globals["_SWITCHBOARD"]._serialized_end = 6602 + _globals["_SHAFTLINE"]._serialized_start = 6604 + _globals["_SHAFTLINE"]._serialized_end = 6695 + _globals["_MECHANICALSYSTEM"]._serialized_start = 6697 + _globals["_MECHANICALSYSTEM"]._serialized_end = 6773 + _globals["_ELECTRICSYSTEM"]._serialized_start = 6775 + _globals["_ELECTRICSYSTEM"]._serialized_end = 6852 + _globals["_FUELSTORAGE"]._serialized_start = 6854 + _globals["_FUELSTORAGE"]._serialized_end = 6943 + _globals["_MACHINERYSYSTEM"]._serialized_start = 6946 + _globals["_MACHINERYSYSTEM"]._serialized_end = 7456 + _globals["_MACHINERYSYSTEM_PROPULSIONTYPE"]._serialized_start = 7398 + _globals["_MACHINERYSYSTEM_PROPULSIONTYPE"]._serialized_end = 7456 # @@protoc_insertion_point(module_scope) diff --git a/machinery-system-structure/MachSysS/system_structure_pb2.pyi b/machinery-system-structure/MachSysS/system_structure_pb2.pyi index 661cd59..97fc846 100644 --- a/machinery-system-structure/MachSysS/system_structure_pb2.pyi +++ b/machinery-system-structure/MachSysS/system_structure_pb2.pyi @@ -237,6 +237,7 @@ class Gear(_message.Message): "efficiency", "order_from_switchboard_or_shaftline", "unit_price_usd", + "uid", ) NAME_FIELD_NUMBER: _ClassVar[int] GEAR_RATIO_FIELD_NUMBER: _ClassVar[int] @@ -245,6 +246,7 @@ class Gear(_message.Message): EFFICIENCY_FIELD_NUMBER: _ClassVar[int] ORDER_FROM_SWITCHBOARD_OR_SHAFTLINE_FIELD_NUMBER: _ClassVar[int] UNIT_PRICE_USD_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] name: str gear_ratio: float rated_power_kw: float @@ -252,6 +254,7 @@ class Gear(_message.Message): efficiency: Efficiency order_from_switchboard_or_shaftline: int unit_price_usd: float + uid: str def __init__( self, name: _Optional[str] = ..., @@ -261,6 +264,7 @@ class Gear(_message.Message): efficiency: _Optional[_Union[Efficiency, _Mapping]] = ..., order_from_switchboard_or_shaftline: _Optional[int] = ..., unit_price_usd: _Optional[float] = ..., + uid: _Optional[str] = ..., ) -> None: ... class Fuel(_message.Message): @@ -291,6 +295,7 @@ class Engine(_message.Message): "unit_price_usd", "start_delay_s", "turn_off_power_kw", + "uid", ) class NOxCalculationMethod(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): @@ -330,6 +335,7 @@ class Engine(_message.Message): UNIT_PRICE_USD_FIELD_NUMBER: _ClassVar[int] START_DELAY_S_FIELD_NUMBER: _ClassVar[int] TURN_OFF_POWER_KW_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] name: str rated_power_kw: float rated_speed_rpm: float @@ -344,6 +350,7 @@ class Engine(_message.Message): unit_price_usd: float start_delay_s: float turn_off_power_kw: float + uid: str def __init__( self, name: _Optional[str] = ..., @@ -362,6 +369,7 @@ class Engine(_message.Message): unit_price_usd: _Optional[float] = ..., start_delay_s: _Optional[float] = ..., turn_off_power_kw: _Optional[float] = ..., + uid: _Optional[str] = ..., ) -> None: ... class COGAS(_message.Message): @@ -379,6 +387,7 @@ class COGAS(_message.Message): "unit_price_usd", "start_delay_s", "turn_off_power_kw", + "uid", ) NAME_FIELD_NUMBER: _ClassVar[int] RATED_POWER_KW_FIELD_NUMBER: _ClassVar[int] @@ -393,6 +402,7 @@ class COGAS(_message.Message): UNIT_PRICE_USD_FIELD_NUMBER: _ClassVar[int] START_DELAY_S_FIELD_NUMBER: _ClassVar[int] TURN_OFF_POWER_KW_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] name: str rated_power_kw: float rated_speed_rpm: float @@ -406,6 +416,7 @@ class COGAS(_message.Message): unit_price_usd: float start_delay_s: float turn_off_power_kw: float + uid: str def __init__( self, name: _Optional[str] = ..., @@ -423,6 +434,7 @@ class COGAS(_message.Message): unit_price_usd: _Optional[float] = ..., start_delay_s: _Optional[float] = ..., turn_off_power_kw: _Optional[float] = ..., + uid: _Optional[str] = ..., ) -> None: ... class ElectricMachine(_message.Message): @@ -433,6 +445,7 @@ class ElectricMachine(_message.Message): "efficiency", "order_from_switchboard_or_shaftline", "unit_price_usd", + "uid", ) NAME_FIELD_NUMBER: _ClassVar[int] RATED_POWER_KW_FIELD_NUMBER: _ClassVar[int] @@ -440,12 +453,14 @@ class ElectricMachine(_message.Message): EFFICIENCY_FIELD_NUMBER: _ClassVar[int] ORDER_FROM_SWITCHBOARD_OR_SHAFTLINE_FIELD_NUMBER: _ClassVar[int] UNIT_PRICE_USD_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] name: str rated_power_kw: float rated_speed_rpm: float efficiency: Efficiency order_from_switchboard_or_shaftline: int unit_price_usd: float + uid: str def __init__( self, name: _Optional[str] = ..., @@ -454,6 +469,7 @@ class ElectricMachine(_message.Message): efficiency: _Optional[_Union[Efficiency, _Mapping]] = ..., order_from_switchboard_or_shaftline: _Optional[int] = ..., unit_price_usd: _Optional[float] = ..., + uid: _Optional[str] = ..., ) -> None: ... class Battery(_message.Message): @@ -470,6 +486,7 @@ class Battery(_message.Message): "self_discharge_percent_per_day", "state_of_energy_minimum", "state_of_energy_maximum", + "uid", ) NAME_FIELD_NUMBER: _ClassVar[int] ENERGY_CAPACITY_KWH_FIELD_NUMBER: _ClassVar[int] @@ -483,6 +500,7 @@ class Battery(_message.Message): SELF_DISCHARGE_PERCENT_PER_DAY_FIELD_NUMBER: _ClassVar[int] STATE_OF_ENERGY_MINIMUM_FIELD_NUMBER: _ClassVar[int] STATE_OF_ENERGY_MAXIMUM_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] name: str energy_capacity_kwh: float rated_charging_rate_c: float @@ -495,6 +513,7 @@ class Battery(_message.Message): self_discharge_percent_per_day: float state_of_energy_minimum: float state_of_energy_maximum: float + uid: str def __init__( self, name: _Optional[str] = ..., @@ -509,6 +528,7 @@ class Battery(_message.Message): self_discharge_percent_per_day: _Optional[float] = ..., state_of_energy_minimum: _Optional[float] = ..., state_of_energy_maximum: _Optional[float] = ..., + uid: _Optional[str] = ..., ) -> None: ... class ElectricComponent(_message.Message): @@ -518,17 +538,20 @@ class ElectricComponent(_message.Message): "efficiency", "order_from_switchboard_or_shaftline", "unit_price_usd", + "uid", ) NAME_FIELD_NUMBER: _ClassVar[int] RATED_POWER_KW_FIELD_NUMBER: _ClassVar[int] EFFICIENCY_FIELD_NUMBER: _ClassVar[int] ORDER_FROM_SWITCHBOARD_OR_SHAFTLINE_FIELD_NUMBER: _ClassVar[int] UNIT_PRICE_USD_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] name: str rated_power_kw: float efficiency: Efficiency order_from_switchboard_or_shaftline: int unit_price_usd: float + uid: str def __init__( self, name: _Optional[str] = ..., @@ -536,6 +559,7 @@ class ElectricComponent(_message.Message): efficiency: _Optional[_Union[Efficiency, _Mapping]] = ..., order_from_switchboard_or_shaftline: _Optional[int] = ..., unit_price_usd: _Optional[float] = ..., + uid: _Optional[str] = ..., ) -> None: ... class FuelCell(_message.Message): @@ -549,6 +573,7 @@ class FuelCell(_message.Message): "number_modules", "power_minimum_specific", "start_delay_s", + "uid", ) NAME_FIELD_NUMBER: _ClassVar[int] RATED_POWER_KW_FIELD_NUMBER: _ClassVar[int] @@ -559,6 +584,7 @@ class FuelCell(_message.Message): NUMBER_MODULES_FIELD_NUMBER: _ClassVar[int] POWER_MINIMUM_SPECIFIC_FIELD_NUMBER: _ClassVar[int] START_DELAY_S_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] name: str rated_power_kw: float efficiency: Efficiency @@ -568,6 +594,7 @@ class FuelCell(_message.Message): number_modules: int power_minimum_specific: float start_delay_s: float + uid: str def __init__( self, name: _Optional[str] = ..., @@ -579,6 +606,7 @@ class FuelCell(_message.Message): number_modules: _Optional[int] = ..., power_minimum_specific: _Optional[float] = ..., start_delay_s: _Optional[float] = ..., + uid: _Optional[str] = ..., ) -> None: ... class Propeller(_message.Message): @@ -587,21 +615,25 @@ class Propeller(_message.Message): "efficiency", "propulsor_id", "order_from_switchboard_or_shaftline", + "uid", ) NAME_FIELD_NUMBER: _ClassVar[int] EFFICIENCY_FIELD_NUMBER: _ClassVar[int] PROPULSOR_ID_FIELD_NUMBER: _ClassVar[int] ORDER_FROM_SWITCHBOARD_OR_SHAFTLINE_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] name: str efficiency: Efficiency propulsor_id: int order_from_switchboard_or_shaftline: int + uid: str def __init__( self, name: _Optional[str] = ..., efficiency: _Optional[_Union[Efficiency, _Mapping]] = ..., propulsor_id: _Optional[int] = ..., order_from_switchboard_or_shaftline: _Optional[int] = ..., + uid: _Optional[str] = ..., ) -> None: ... class BusBreaker(_message.Message): @@ -620,6 +652,7 @@ class SuperCapacitor(_message.Message): "initial_state_of_charge", "order_from_switchboard_or_shaftline", "unit_price_usd", + "uid", ) NAME_FIELD_NUMBER: _ClassVar[int] ENERGY_CAPACITY_WH_FIELD_NUMBER: _ClassVar[int] @@ -629,6 +662,7 @@ class SuperCapacitor(_message.Message): INITIAL_STATE_OF_CHARGE_FIELD_NUMBER: _ClassVar[int] ORDER_FROM_SWITCHBOARD_OR_SHAFTLINE_FIELD_NUMBER: _ClassVar[int] UNIT_PRICE_USD_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] name: str energy_capacity_wh: float rated_power_kw: float @@ -637,6 +671,7 @@ class SuperCapacitor(_message.Message): initial_state_of_charge: float order_from_switchboard_or_shaftline: int unit_price_usd: float + uid: str def __init__( self, name: _Optional[str] = ..., @@ -647,6 +682,7 @@ class SuperCapacitor(_message.Message): initial_state_of_charge: _Optional[float] = ..., order_from_switchboard_or_shaftline: _Optional[int] = ..., unit_price_usd: _Optional[float] = ..., + uid: _Optional[str] = ..., ) -> None: ... class MechanicalComponent(_message.Message): @@ -656,17 +692,20 @@ class MechanicalComponent(_message.Message): "efficiency", "order_from_switchboard_or_shaftline", "unit_price_usd", + "uid", ) NAME_FIELD_NUMBER: _ClassVar[int] RATED_POWER_KW_FIELD_NUMBER: _ClassVar[int] EFFICIENCY_FIELD_NUMBER: _ClassVar[int] ORDER_FROM_SWITCHBOARD_OR_SHAFTLINE_FIELD_NUMBER: _ClassVar[int] UNIT_PRICE_USD_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] name: str rated_power_kw: float efficiency: Efficiency order_from_switchboard_or_shaftline: int unit_price_usd: float + uid: str def __init__( self, name: _Optional[str] = ..., @@ -674,6 +713,7 @@ class MechanicalComponent(_message.Message): efficiency: _Optional[_Union[Efficiency, _Mapping]] = ..., order_from_switchboard_or_shaftline: _Optional[int] = ..., unit_price_usd: _Optional[float] = ..., + uid: _Optional[str] = ..., ) -> None: ... class Subsystem(_message.Message): @@ -699,6 +739,7 @@ class Subsystem(_message.Message): "ramp_up_rate_limit_percent_per_second", "ramp_down_rate_limit_percent_per_second", "base_load_order", + "uid", ) class PowerType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): @@ -801,6 +842,7 @@ class Subsystem(_message.Message): RAMP_UP_RATE_LIMIT_PERCENT_PER_SECOND_FIELD_NUMBER: _ClassVar[int] RAMP_DOWN_RATE_LIMIT_PERCENT_PER_SECOND_FIELD_NUMBER: _ClassVar[int] BASE_LOAD_ORDER_FIELD_NUMBER: _ClassVar[int] + UID_FIELD_NUMBER: _ClassVar[int] gear: Gear engine: Engine electric_machine: ElectricMachine @@ -822,6 +864,7 @@ class Subsystem(_message.Message): ramp_up_rate_limit_percent_per_second: float ramp_down_rate_limit_percent_per_second: float base_load_order: int + uid: str def __init__( self, gear: _Optional[_Union[Gear, _Mapping]] = ..., @@ -845,6 +888,7 @@ class Subsystem(_message.Message): ramp_up_rate_limit_percent_per_second: _Optional[float] = ..., ramp_down_rate_limit_percent_per_second: _Optional[float] = ..., base_load_order: _Optional[int] = ..., + uid: _Optional[str] = ..., ) -> None: ... class Switchboard(_message.Message): diff --git a/machinery-system-structure/build_package.sh b/machinery-system-structure/build_package.sh new file mode 100644 index 0000000..63c2400 --- /dev/null +++ b/machinery-system-structure/build_package.sh @@ -0,0 +1,10 @@ +set -e +bash ./compile_proto.sh +echo "Exporting notebooks" +nbdev_export +echo "Running tests" +nbdev_test +echo "Formatting code" +black . +echo "Building package" +python -m build \ No newline at end of file diff --git a/machinery-system-structure/build_package_linux.sh b/machinery-system-structure/build_package_linux.sh deleted file mode 100644 index c1f6748..0000000 --- a/machinery-system-structure/build_package_linux.sh +++ /dev/null @@ -1,13 +0,0 @@ -set -e -echo "Building protobuf files" -protoc -I=proto --proto_path=proto --python_out=MachSysS proto/system_structure.proto proto/gymir_result.proto proto/feems_result.proto -echo "Fixing imports in protobuf files" -sed -i 's/import system_structure_pb2/from . import system_structure_pb2/' MachSysS/feems_result_pb2.py -echo "Exporting notebooks" -nbdev_export -echo "Running tests" -nbdev_test -echo "Formatting code" -black . -echo "Building package" -python -m build diff --git a/machinery-system-structure/build_package_mac.sh b/machinery-system-structure/build_package_mac.sh deleted file mode 100644 index 6b23bd1..0000000 --- a/machinery-system-structure/build_package_mac.sh +++ /dev/null @@ -1,13 +0,0 @@ -set -e -echo "Building protobuf files" -protoc -I=proto --proto_path=proto --pyi_out=MachSysS --python_out=MachSysS proto/system_structure.proto proto/gymir_result.proto proto/feems_result.proto -echo "Fixing imports in protobuf files" -sed -i '' 's/import system_structure_pb2/from . import system_structure_pb2/' MachSysS/feems_result_pb2.py -echo "Exporting notebooks" -nbdev_export -echo "Running tests" -nbdev_test -echo "Formatting code" -black . -echo "Building package" -python -m build \ No newline at end of file diff --git a/machinery-system-structure/compile_proto.sh b/machinery-system-structure/compile_proto.sh new file mode 100644 index 0000000..22ebc2d --- /dev/null +++ b/machinery-system-structure/compile_proto.sh @@ -0,0 +1,32 @@ +set -e +echo "Building protobuf files" +protoc -I=proto --proto_path=proto --pyi_out=MachSysS --python_out=MachSysS proto/system_structure.proto proto/gymir_result.proto proto/feems_result.proto +echo "Fixing imports in protobuf files" + +# loop over files and replace import system_structure_pb2 +# Determine OS platform +OS="$(uname -s)" +case "$OS" in + Linux*) machine=Linux;; + Darwin*) machine=Mac;; + *) machine="UNKNOWN:${OS}" +esac +echo "Detected OS: $machine" + +# Run commands based on the detected OS +case "$machine" in + Linux) echo "Running Linux-specific commands" + # Linux specific commands here + for file in MachSysS/*_pb2.py MachSysS/*_pb2.pyi; do + sed -i 's/import system_structure_pb2/from . import system_structure_pb2/' $file + done + ;; + Mac) echo "Running macOS-specific commands" + for file in MachSysS/*_pb2.py MachSysS/*_pb2.pyi; do + sed -i '' 's/import system_structure_pb2/from . import system_structure_pb2/' $file + done + ;; + *) echo "Unsupported OS. Exiting script." + exit 1 + ;; +esac \ No newline at end of file diff --git a/machinery-system-structure/proto/system_structure.proto b/machinery-system-structure/proto/system_structure.proto index ff063d9..b48ec6a 100644 --- a/machinery-system-structure/proto/system_structure.proto +++ b/machinery-system-structure/proto/system_structure.proto @@ -84,6 +84,7 @@ message Gear { Efficiency efficiency = 5; uint32 order_from_switchboard_or_shaftline = 6; double unit_price_usd = 7; + string uid = 8; } // Should follow the same order as in feems.type_for_feems.TypeFuel @@ -146,6 +147,7 @@ message Engine { double unit_price_usd = 12; double start_delay_s = 13; double turn_off_power_kw = 14; + string uid = 15; } message COGAS { @@ -162,6 +164,7 @@ message COGAS { double unit_price_usd = 11; double start_delay_s = 12; double turn_off_power_kw = 13; + string uid = 14; } message ElectricMachine { @@ -171,6 +174,7 @@ message ElectricMachine { Efficiency efficiency = 4; uint32 order_from_switchboard_or_shaftline = 5; double unit_price_usd = 6; + string uid = 7; } message Battery { @@ -186,6 +190,7 @@ message Battery { double self_discharge_percent_per_day = 10; double state_of_energy_minimum = 11; double state_of_energy_maximum = 12; + string uid = 13; } message ElectricComponent { @@ -194,6 +199,7 @@ message ElectricComponent { Efficiency efficiency = 3; uint32 order_from_switchboard_or_shaftline = 4; double unit_price_usd = 5; + string uid = 6; } message FuelCell { @@ -206,6 +212,7 @@ message FuelCell { uint32 number_modules = 8; double power_minimum_specific= 9; double start_delay_s = 10; + string uid = 11; } message Propeller { @@ -213,6 +220,7 @@ message Propeller { Efficiency efficiency = 2; uint32 propulsor_id = 3; uint32 order_from_switchboard_or_shaftline = 5; + string uid = 6; } message BusBreaker { @@ -228,6 +236,7 @@ message SuperCapacitor { double initial_state_of_charge = 6; uint32 order_from_switchboard_or_shaftline = 7; double unit_price_usd = 8; + string uid = 9; } message MechanicalComponent { @@ -236,6 +245,7 @@ message MechanicalComponent { Efficiency efficiency = 3; uint32 order_from_switchboard_or_shaftline = 4; double unit_price_usd = 5; + string uid = 6; } message Subsystem { @@ -300,6 +310,7 @@ message Subsystem { double ramp_up_rate_limit_percent_per_second = 19; double ramp_down_rate_limit_percent_per_second = 20; uint32 base_load_order = 21; // The order of the power source in the base load calculation. 1 is the primary base load, 2 is the secondary base load, etc. + string uid = 22; } message Switchboard { diff --git a/machinery-system-structure/settings.ini b/machinery-system-structure/settings.ini index 2d7828b..62563e1 100644 --- a/machinery-system-structure/settings.ini +++ b/machinery-system-structure/settings.ini @@ -12,7 +12,7 @@ user = keviny author = Kevin Koosup Yum author_email = kevinkoosup.yum@sintef.no copyright = SINTEF Ocean -version = 0.6.5 +version = 0.6.6 min_python = 3.10 audience = Developers language = English diff --git a/machinery-system-structure/shipX2DeSim.json b/machinery-system-structure/shipX2DeSim.json new file mode 100644 index 0000000..6f1f9d1 --- /dev/null +++ b/machinery-system-structure/shipX2DeSim.json @@ -0,0 +1,90 @@ +[ + { + "shipX": "task", + "deSim": "task_type" + }, + { + "shipX": "assignment", + "deSim": "task_name" + }, + { + "shipX": "latitude", + "deSim": "latitude_deg" + }, + { + "shipX": "longitude", + "deSim": "longitude_deg" + }, + { + "shipX": "heading", + "deSim": "heading_deg" + }, + { + "shipX": "wave height significant", + "deSim": "wave_height_significant_m" + }, + { + "shipX": "wave peak period (tp)", + "deSim": "wave_peak_period_s" + }, + { + "shipX": "wave direction in degrees relative to geographic north", + "deSim": "wave_dir_rel_north_deg" + }, + { + "shipX": "wave direction in degrees relative to vessel heading", + "deSim": "wave_dir_rel_vessel_deg" + }, + { + "shipX": "wind speed in meter per sec", + "deSim": "wind_speed_mps" + }, + { + "shipX": "wind direction in degrees relative to geographic north", + "deSim": "wind_dir_rel_north_deg" + }, + { + "shipX": "wind direction in degrees relative to vessel heading", + "deSim": "wind_dir_rel_vessel_deg" + }, + { + "shipX": "speed over ground", + "deSim": "speed_over_ground_kn" + }, + { + "shipX": "speed", + "deSim": "speed_over_ground_kn" + }, + { + "shipX": "speed through water", + "deSim": "speed_through_water_kn" + }, + { + "shipX": "sea current speed in meter pr sec", + "deSim": "current_speed_mps" + }, + { + "shipX": "sea current direction in degrees relative to geographic north", + "deSim": "current_dir_rel_north_deg" + }, + { + "shipX": "power", + "deSim": "power_kw" + }, + { + "shipX": "torque", + "deSim": "torque_k_nm" + }, + { + "shipX": "thrust", + "deSim": "thrust_k_n" + }, + { + "shipX": "rtot", + "deSim": "total_resistance_k_n" + }, + { + "shipX": "weather source", + "deSim": "weather_source" + } +] \ No newline at end of file diff --git a/machinery-system-structure/tests/electric_propulsion_system.mss b/machinery-system-structure/tests/electric_propulsion_system.mss index bd1e6b507ac78506c9a92e34c88eafca488f4fd7..e7b5c6b7563f1230566754b645142832ddcbb69b 100644 GIT binary patch literal 4757 zcmdT|O=w(I6z-cuOrKq(-n_E8MHd&V=TGci@ATB2PW}1Q3sw8(T>FRW^xkRj)7~=& zH!obRx9fV)|A01@*ZLv1=i_EcOSx{J{PK(8^?i5rq1%HVpN+ou*8bUv_3_#5{j+QD zkI(+xKkKcI&vwV}JKI{UMC;Ag)edGK6UG2VWd-Q9gkY5iW25v&1y|57eOJ{_y+P}= z5w`jp%kqd?*6P)%T52j~C9TkUy0Ua(vZAtg{n4GQNbg;D#%Em7jb}f;^Y)Fu$7fto z{oB`rm+O1oGu63{52S)m1w1AMw61`QN`i<<$zqzA8#}1BPwi9-{N$UowJblW4qE@& z{kw0gj`32JA|eQx1z=VYg47wb_N5WtMU8p3F?5X$G9rP<(g7lB?n*46sYw(X{zG{P zLp2K+DnU)*9z$b_1{BglAgzG;DA8llI;Uw2)iD^NONvU4kVJ@pIt7ScCGbQ^3T2YY zsr^su>`f-}EB*D$w6Vpi8xwiyT2+5^EP+YDCEXfh6C&>CA1invxmgE7^ zmn+rL#YC%yd`^*pw3Zvv6bHg6p-mxW8+~r2K6yTD@$+AqC}89&Cw9C0_Osi4aipqy zU3qZhN4D};x7S+j)XIkev zwg^Xr1saD#LP=zMAva`dX}k(DNqY>NuJ>kyO~?kWEear!Gt0{h@QyX6MRX05LWLX$ zt?l`pY7&`OH&!mw8071{DYH~MWY0a+1i+Wz8P4 zInmnMBoMQpGc~_3w>a0Ed$&_WVFDF?_#!!mV1wW_vWrV^P2@0<4Du*gV6KjDR3>;b6qPxQAS3&@i+rvjIzV@PrG`a91>XPS_|FF4?0ae-a@K@S!E^Ao4Q8y8I|FKOFi6fGJ3?dE6q@oQx zGn5_103IAJ@C#+ugoq|_jfW!5c$0mI*!};l4wI2aQ?aC=u+cLlj$M!gGH5A?jlV<{ nhTH9tk>+5}9YvbhkfRb5sKo!CL5hYK+f2YqZ*(Q|&Zy(R+7Z}C delta 240 zcmbQLdQy6V2G4wHt`0s9Mxk>|LenNs;GWJT)j#p`gvl!zm06L+CU0k&FgceQDA>ZJ zHGA?N<~dAO&XXHhoF_N(DY6RvWRhAv`5fOGkQ^7=oXKa{bXkN-lfovevWHDx$S%t& z^c*C$S6~j4)8fhNIF?MV;8f<~n#jw+gknoK*M!NA+-O$&^Guk`%1eUPsJ1le7qRzzy{6gdV|7kwm)p$ z{5p){O+@hy1bNQuYj4aEoC=wY>s-VB{IP16QE`XIfn?9d}5|%dHV=-wu*yydEti%f8E4Bsse#YH delta 151 zcmX>sc}IkctB;?9QK*YqDs3Wn8k17!#F?Q?TEUaW7(*C?CQk%nP9`N*p~I{~t((J{ z+8CLnrfz0s5o4U}$f^t#p1=wbwqpkhS8*t_2o)xUOg_mGqFTUI!P>;gm9gGuyQa#jP2)y=(ptt>aXNc1^~VIC!hcT diff --git a/machinery-system-structure/tests/hybrid_propulsion_system.mss b/machinery-system-structure/tests/hybrid_propulsion_system.mss index 9e916dc733bac3d083bc88690634d2a89459db07..b8565eb1b7c1bbc7fd8aba9dd9d3cd8dfa3f3d7d 100644 GIT binary patch delta 1177 zcmd^9&5Bk>5amwB$vC4fzCh3sve4@|NDBI=y1PmP$-g&-JI z?gRJ$fh;nTjgUoz1hUO4kdSrWAWQ4}d;$0Ft4^PD>YV=WvtO?~zj*fF{k^~Ucc;}K z+Xqjl<;QJ3x;~S-G`JHKaSRxGhgL?099t=jX^`Nh2QQx8I|_4&+H1)Kl2Qh2I)GX% zfLe;9ltUGJ(_>GPkanWHPnF#sd23CCf;R3Hc^*N|euu=?}V>c5j$)6K2J z<2gCZEZ#wOVhgDkV=V$Cy}DSNMkmYvAAJRDaIM<8bRfzKID!!w!GXu-1yQ>rzj`&@ zy1#mH`-^Mmr=zVf2dSJJGdLaIcCdl@S)rSK%0Z~qx;)&Tli|P5Y8H zS^aQwW9RX7bUarb!$pjCp}anmM_{%5u$PcEG0WhC*C%g2{&YILK6fQaH8~)R6;N7$ z)^dT7VkJuIV$aK8yO-CANnAtc*xm&jQ3^B`gyfuttx_DVB6*U!`ekaz%WwO4tr)!z8KoLm^oC9LO3fxScqQc8Qj@YAoVn;t=KIX< zz24c~dZ+cvGaIeiSch2adZ%W#vuPb>PPebXm*jhhYFd9kyV2T^*EJ(hY1aFgI@HL; ojACMJAqM2-pL3V58Xq66Gr45YLcx4dHLdn8la#?i*eBsFz23zrz5AJ=Mtw@`8DjjOg3OGUr8o_}__JXM0Rloc^d;E0zFn_oX zt00Xs6M@s=EsqS;YlB`0m4ejL+Vpq6Lfd_jZ1{J5@5?pg|GK?=dvfQ}@$B$u)pQIO zF&cY56YvP6PJq0Gtcgel-8wyabNR+>eSg)pN@~eL#n=Fa12E?TBgIy0QWtxkzHc3z z=_YESQ)J*WG9XF;CP7HfX-F=$Kyr@qduxMI8x`ajzzwm1>>IR_7&HY|iA8ehhVp!8 zgF?B9phQDaOG{1AoJ&xO1TI3X~v4)c2|3)Wz!5^D^lacQl{DNZEu)nm3GU*T%=)JPl zPUbqSoQ|RUl6((Q&Gr4>#+8wTlB=M?1u&)#EmE0RI_-NOZO9m}9 SSTCyPn(Wk+yK+e``2HVn4a4~W delta 135 zcmZ1}^IUv_49|B~t}m<{j6!X!LWehMxG+tg#N@ytln Xah+i0V1g+8$^}ulm+?MtgKZ@RFQCqO;M^)mwgI?>fZ{w+(EZ=b=d<0ByphbPpn?dTN`mB*02zxd zIZ9$2-Aq4+(;XVEdMBm|ByI})IUmsw7_V8W1B$fiYS=z_8pdcbaI^%G<j%o3_w)p?&aX4Ptxg8y{k7^J+YA?7Fy0j{YmV`FtW>KfN)x$4%ORdCEK*TrT zN?oK9g5hkGxfK+%_&c0jPFu61E>4=F&oKhFYI>eC^eYpT{#=Ws5>lEjX5(%b|4#M; DH41Ly delta 77 zcmcc5-NMPm)yT=gDAdI)l{S$(jY%nV;>=Jct>DRGj3JCclP3Z(CzBGZP#dez;mzSp gE=-dTvN*5`rF%IFP28Y5F+!Y0f>DEM@)TAT0R1`>xBvhE diff --git a/machinery-system-structure/tests/system_proto.mss b/machinery-system-structure/tests/system_proto.mss index bd1e6b507ac78506c9a92e34c88eafca488f4fd7..e7b5c6b7563f1230566754b645142832ddcbb69b 100644 GIT binary patch literal 4757 zcmdT|O=w(I6z-cuOrKq(-n_E8MHd&V=TGci@ATB2PW}1Q3sw8(T>FRW^xkRj)7~=& zH!obRx9fV)|A01@*ZLv1=i_EcOSx{J{PK(8^?i5rq1%HVpN+ou*8bUv_3_#5{j+QD zkI(+xKkKcI&vwV}JKI{UMC;Ag)edGK6UG2VWd-Q9gkY5iW25v&1y|57eOJ{_y+P}= z5w`jp%kqd?*6P)%T52j~C9TkUy0Ua(vZAtg{n4GQNbg;D#%Em7jb}f;^Y)Fu$7fto z{oB`rm+O1oGu63{52S)m1w1AMw61`QN`i<<$zqzA8#}1BPwi9-{N$UowJblW4qE@& z{kw0gj`32JA|eQx1z=VYg47wb_N5WtMU8p3F?5X$G9rP<(g7lB?n*46sYw(X{zG{P zLp2K+DnU)*9z$b_1{BglAgzG;DA8llI;Uw2)iD^NONvU4kVJ@pIt7ScCGbQ^3T2YY zsr^su>`f-}EB*D$w6Vpi8xwiyT2+5^EP+YDCEXfh6C&>CA1invxmgE7^ zmn+rL#YC%yd`^*pw3Zvv6bHg6p-mxW8+~r2K6yTD@$+AqC}89&Cw9C0_Osi4aipqy zU3qZhN4D};x7S+j)XIkev zwg^Xr1saD#LP=zMAva`dX}k(DNqY>NuJ>kyO~?kWEear!Gt0{h@QyX6MRX05LWLX$ zt?l`pY7&`OH&!mw8071{DYH~MWY0a+1i+Wz8P4 zInmnMBoMQpGc~_3w>a0Ed$&_WVFDF?_#!!mV1wW_vWrV^P2@0<4Du*gV6KjDR3>;b6qPxQAS3&@i+rvjIzV@PrG`a91>XPS_|FF4?0ae-a@K@S!E^Ao4Q8y8I|FKOFi6fGJ3?dE6q@oQx zGn5_103IAJ@C#+ugoq|_jfW!5c$0mI*!};l4wI2aQ?aC=u+cLlj$M!gGH5A?jlV<{ nhTH9tk>+5}9YvbhkfRb5sKo!CL5hYK+f2YqZ*(Q|&Zy(R+7Z}C delta 240 zcmbQLdQy6V2G4wHt`0s9Mxk>|LenNs;GWJT)j#p`gvl!zm06L+CU0k&FgceQDA>ZJ zHGA?N<~dAO&XXHhoF_N(DY6RvWRhAv`5fOGkQ^7=oXKa{bXkN-lfovevWHDx$S%t& z^c*C$S6~j4)8fhNIF?MV;8f<~n#jw+gknoK*M!NA+-O$&^Guk`%1eUPsJ1l z#b|wu<=NE>+uHxBIJX`@7}0y-!cx*~~EAtm%JeL`bP55K0Oy z3g>2X_MDcFuRgbYe&sm2FBuD~4Thk`?qM|0K0C}@C?jW~tVcgSb+G$iByptd{xg*3 zuYF?lWz`6c8(JDFnfV_iTW}&QXaJ?;m1gd5oY#DXRlk}9Tpkg z92*TK_B>hXNhFC`LSym~)f{&hBGWoBMPf8D9^qd|vhS#Kudoe|H*mAG3qctZ=d4{k zOplTDb~wb%M#_$4Ndk>Z1GCOWLwDTh5jJOs7vXe+TWYIkG!7z{6P`eZK@+(eH^L{oJ0lQ}-S<4_c46665bNH~-{sN>yQ(6E3 delta 249 zcmZ3cctCQ3F;BN7*FPQ(Mxhoat=SXp=P+40PoBr=JUNF^kyYp?lho?TI~mu2r9>y& za<@{^4iHqIY-`z1-!EkaQkML#*UMI%MtJsuSg`NYAo_vmP4wKX3$$QwBOpXzdm^_bz nn~STRhl7a(H?cx&bLN@A476?YAD%eI$qjsH7EIy?S)dF6YY$9w diff --git a/machinery-system-structure/tests/utility_compare_proto.py b/machinery-system-structure/tests/utility_compare_proto.py index 3f659c4..3208b77 100644 --- a/machinery-system-structure/tests/utility_compare_proto.py +++ b/machinery-system-structure/tests/utility_compare_proto.py @@ -157,6 +157,7 @@ def compare_proto_subsystems( "name", "ratedPowerKw", "ratedSpeedRpm", + "uid", ] subsystem1_dict = MessageToDict(subsystem1) subsystem2_dict = MessageToDict(subsystem2) diff --git a/machinery-system-structure/timeseries_test.csv b/machinery-system-structure/timeseries_test.csv new file mode 100644 index 0000000..989cf9d --- /dev/null +++ b/machinery-system-structure/timeseries_test.csv @@ -0,0 +1,546 @@ +1604188800.0,task,sailingtaskwithspeedchange +1604188800.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604188800.0,latitude,65.9177 +1604188800.0,longitude,13.105099999999998 +1604188800.0,heading,0.0 +1604188800.0,wave height significant,0.2183055281639099 +1604188800.0,wave peak period (tp),2.0086119174957275 +1604188800.0,wave direction in degrees relative to geographic north,132.63381958007812 +1604188800.0,wave direction in degrees relative to vessel heading,132.63381958007812 +1604188800.0,wind speed in meter per sec,5.820233345031738 +1604188800.0,wind direction in degrees relative to geographic north,284.8569641113281 +1604188800.0,wind direction in degrees relative to vessel heading,284.8569641113281 +1604188800.0,weather source,remote weather_wam800 +1604188800.0,speed over ground,15.0 +1604188800.0,speed through water,0.0 +1604188800.0,sea current speed in meter pr sec,0.0 +1604188800.0,sea current direction in degrees relative to geographic north,0.0 +1604188800.0,power,311.6036210421622 +1604188800.0,torque,0.0 +1604188800.0,thrust,0.0 +1604188800.0,rtot,0.0 +1604189706.0,task,sailingtaskwithspeedchange +1604189706.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604189706.0,latitude,65.94398908591388 +1604189706.0,longitude,12.965058340508804 +1604189706.0,heading,-65.22003792766533 +1604189706.0,wave height significant,0.5654219388961792 +1604189706.0,wave peak period (tp),2.647538900375366 +1604189706.0,wave direction in degrees relative to geographic north,98.8360595703125 +1604189706.0,wave direction in degrees relative to vessel heading,164.05609749797782 +1604189706.0,wind speed in meter per sec,14.152313232421875 +1604189706.0,wind direction in degrees relative to geographic north,278.6241760253906 +1604189706.0,wind direction in degrees relative to vessel heading,343.84421395305594 +1604189706.0,weather source,remote weather_wam800 +1604189706.0,speed over ground,15.0 +1604189706.0,speed through water,0.0 +1604189706.0,sea current speed in meter pr sec,0.0 +1604189706.0,sea current direction in degrees relative to geographic north,0.0 +1604189706.0,power,112.98942864346961 +1604189706.0,torque,0.0 +1604189706.0,thrust,0.0 +1604189706.0,rtot,0.0 +1604190517.0,task,sailingtaskwithspeedchange +1604190517.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604190517.0,latitude,65.9810068889561 +1604190517.0,longitude,12.860980584770873 +1604190517.0,heading,-48.82581811917973 +1604190517.0,wave height significant,0.6421118378639221 +1604190517.0,wave peak period (tp),3.125613212585449 +1604190517.0,wave direction in degrees relative to geographic north,121.88983154296875 +1604190517.0,wave direction in degrees relative to vessel heading,170.71564966214848 +1604190517.0,wind speed in meter per sec,13.640847206115723 +1604190517.0,wind direction in degrees relative to geographic north,305.4472351074219 +1604190517.0,wind direction in degrees relative to vessel heading,354.27305322660163 +1604190517.0,weather source,remote weather_wam800 +1604190517.0,speed over ground,15.0 +1604190517.0,speed through water,0.0 +1604190517.0,sea current speed in meter pr sec,0.0 +1604190517.0,sea current direction in degrees relative to geographic north,0.0 +1604190517.0,power,495.01570738457923 +1604190517.0,torque,0.0 +1604190517.0,thrust,0.0 +1604190517.0,rtot,0.0 +1604191186.0,task,sailingtaskwithspeedchange +1604191186.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604191186.0,latitude,65.96499305300499 +1604191186.0,longitude,12.753953706942221 +1604191186.0,heading,-110.12832330334405 +1604191186.0,wave height significant,0.3410550355911255 +1604191186.0,wave peak period (tp),2.3184194564819336 +1604191186.0,wave direction in degrees relative to geographic north,104.8050537109375 +1604191186.0,wave direction in degrees relative to vessel heading,214.93337701428155 +1604191186.0,wind speed in meter per sec,10.641560554504395 +1604191186.0,wind direction in degrees relative to geographic north,298.5522766113281 +1604191186.0,wind direction in degrees relative to vessel heading,48.68059991467214 +1604191186.0,weather source,remote weather_wam800 +1604191186.0,speed over ground,15.0 +1604191186.0,speed through water,0.0 +1604191186.0,sea current speed in meter pr sec,0.0 +1604191186.0,sea current direction in degrees relative to geographic north,0.0 +1604191186.0,power,580.5793529320733 +1604191186.0,torque,0.0 +1604191186.0,thrust,0.0 +1604191186.0,rtot,0.0 +1604192400.0,task,sailingtaskwithspeedchange +1604192400.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604192400.0,latitude,65.90710116529142 +1604192400.0,longitude,12.60384498835462 +1604192400.0,heading,-133.33669019661886 +1604192400.0,wave height significant,0.2209988236427307 +1604192400.0,wave peak period (tp),2.3221964836120605 +1604192400.0,wave direction in degrees relative to geographic north,163.26300048828125 +1604192400.0,wave direction in degrees relative to vessel heading,296.5996906849001 +1604192400.0,wind speed in meter per sec,4.227132320404053 +1604192400.0,wind direction in degrees relative to geographic north,306.3592529296875 +1604192400.0,wind direction in degrees relative to vessel heading,79.69594312630636 +1604192400.0,weather source,remote weather_wam800 +1604192400.0,speed over ground,15.0 +1604192400.0,speed through water,0.0 +1604192400.0,sea current speed in meter pr sec,0.0 +1604192400.0,sea current direction in degrees relative to geographic north,0.0 +1604192400.0,power,277.2219163791282 +1604192400.0,torque,0.0 +1604192400.0,thrust,0.0 +1604192400.0,rtot,0.0 +1604192423.0,task,sailingtaskwithspeedchange +1604192423.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604192423.0,latitude,65.90600295523144 +1604192423.0,longitude,12.601007634674227 +1604192423.0,heading,-133.4737531309435 +1604192423.0,wave height significant,0.22912248969078064 +1604192423.0,wave peak period (tp),2.4058475494384766 +1604192423.0,wave direction in degrees relative to geographic north,162.33157348632812 +1604192423.0,wave direction in degrees relative to vessel heading,295.8053266172716 +1604192423.0,wind speed in meter per sec,4.365622520446777 +1604192423.0,wind direction in degrees relative to geographic north,306.01507568359375 +1604192423.0,wind direction in degrees relative to vessel heading,79.48882881453721 +1604192423.0,weather source,remote weather_wam800 +1604192423.0,speed over ground,15.0 +1604192423.0,speed through water,0.0 +1604192423.0,sea current speed in meter pr sec,0.0 +1604192423.0,sea current direction in degrees relative to geographic north,0.0 +1604192423.0,power,25.905163402709206 +1604192423.0,torque,0.0 +1604192423.0,thrust,0.0 +1604192423.0,rtot,0.0 +1604193529.0,task,sailingtaskwithspeedchange +1604193529.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604193529.0,latitude,65.83600157254318 +1604193529.0,longitude,12.524001724709004 +1604193529.0,heading,-155.75153715873785 +1604193529.0,wave height significant,0.3684995770454407 +1604193529.0,wave peak period (tp),2.9408090114593506 +1604193529.0,wave direction in degrees relative to geographic north,174.51553344726562 +1604193529.0,wave direction in degrees relative to vessel heading,330.2670706060035 +1604193529.0,wind speed in meter per sec,7.4958086013793945 +1604193529.0,wind direction in degrees relative to geographic north,329.2124328613281 +1604193529.0,wind direction in degrees relative to vessel heading,124.96397002006597 +1604193529.0,weather source,remote weather_wam800 +1604193529.0,speed over ground,15.0 +1604193529.0,speed through water,0.0 +1604193529.0,sea current speed in meter pr sec,0.0 +1604193529.0,sea current direction in degrees relative to geographic north,0.0 +1604193529.0,power,493.91605516134297 +1604193529.0,torque,0.0 +1604193529.0,thrust,0.0 +1604193529.0,rtot,0.0 +1604194874.0,task,sailingtaskwithspeedchange +1604194874.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604194874.0,latitude,65.78038971273043 +1604194874.0,longitude,12.341069226717616 +1604194874.0,heading,-126.48618573170994 +1604194874.0,wave height significant,0.568785548210144 +1604194874.0,wave peak period (tp),4.305638790130615 +1604194874.0,wave direction in degrees relative to geographic north,205.4559783935547 +1604194874.0,wave direction in degrees relative to vessel heading,331.94216412526464 +1604194874.0,wind speed in meter per sec,7.179786205291748 +1604194874.0,wind direction in degrees relative to geographic north,334.7338562011719 +1604194874.0,wind direction in degrees relative to vessel heading,101.22004193288183 +1604194874.0,weather source,remote weather_wam800 +1604194874.0,speed over ground,15.0 +1604194874.0,speed through water,0.0 +1604194874.0,sea current speed in meter pr sec,0.0 +1604194874.0,sea current direction in degrees relative to geographic north,0.0 +1604194874.0,power,681.3837164029684 +1604194874.0,torque,0.0 +1604194874.0,thrust,0.0 +1604194874.0,rtot,0.0 +1604196000.0,task,sailingtaskwithspeedchange +1604196000.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604196000.0,latitude,65.70545356737648 +1604196000.0,longitude,12.287149422137635 +1604196000.0,heading,-163.50715579194338 +1604196000.0,wave height significant,0.9916881322860718 +1604196000.0,wave peak period (tp),3.923922061920166 +1604196000.0,wave direction in degrees relative to geographic north,189.7821502685547 +1604196000.0,wave direction in degrees relative to vessel heading,353.28930606049806 +1604196000.0,wind speed in meter per sec,13.11324691772461 +1604196000.0,wind direction in degrees relative to geographic north,348.2752380371094 +1604196000.0,wind direction in degrees relative to vessel heading,151.78239382905275 +1604196000.0,weather source,remote weather_wam800 +1604196000.0,speed over ground,15.0 +1604196000.0,speed through water,0.0 +1604196000.0,sea current speed in meter pr sec,0.0 +1604196000.0,sea current direction in degrees relative to geographic north,0.0 +1604196000.0,power,844.1279292397296 +1604196000.0,torque,0.0 +1604196000.0,thrust,0.0 +1604196000.0,rtot,0.0 +1604197749.0,task,sailingtaskwithspeedchange +1604197749.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604197749.0,latitude,65.58901885359728 +1604197749.0,longitude,12.204013398823498 +1604197749.0,heading,-163.55631509798957 +1604197749.0,wave height significant,1.085551381111145 +1604197749.0,wave peak period (tp),12.284492492675781 +1604197749.0,wave direction in degrees relative to geographic north,217.18252563476562 +1604197749.0,wave direction in degrees relative to vessel heading,20.738840732755193 +1604197749.0,wind speed in meter per sec,12.736698150634766 +1604197749.0,wind direction in degrees relative to geographic north,330.674560546875 +1604197749.0,wind direction in degrees relative to vessel heading,134.23087564486457 +1604197749.0,weather source,remote weather_wam800 +1604197749.0,speed over ground,15.0 +1604197749.0,speed through water,0.0 +1604197749.0,sea current speed in meter pr sec,0.0 +1604197749.0,sea current direction in degrees relative to geographic north,0.0 +1604197749.0,power,148.257820839521 +1604197749.0,torque,0.0 +1604197749.0,thrust,0.0 +1604197749.0,rtot,0.0 +1604199600.0,task,sailingtaskwithspeedchange +1604199600.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604199600.0,latitude,65.50779836872366 +1604199600.0,longitude,11.963586101204264 +1604199600.0,heading,-129.1095415229322 +1604199600.0,wave height significant,1.7652848958969116 +1604199600.0,wave peak period (tp),14.864236831665039 +1604199600.0,wave direction in degrees relative to geographic north,226.7213897705078 +1604199600.0,wave direction in degrees relative to vessel heading,355.83093129344 +1604199600.0,wind speed in meter per sec,13.274995803833008 +1604199600.0,wind direction in degrees relative to geographic north,332.4287414550781 +1604199600.0,wind direction in degrees relative to vessel heading,101.53828297801033 +1604199600.0,weather source,remote weather_wam800 +1604199600.0,speed over ground,15.0 +1604199600.0,speed through water,0.0 +1604199600.0,sea current speed in meter pr sec,0.0 +1604199600.0,sea current direction in degrees relative to geographic north,0.0 +1604199600.0,power,906.6903161480209 +1604199600.0,torque,0.0 +1604199600.0,thrust,0.0 +1604199600.0,rtot,0.0 +1604199914.0,task,sailingtaskwithspeedchange +1604199914.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604199914.0,latitude,65.49398265570295 +1604199914.0,longitude,11.922949031059236 +1604199914.0,heading,-129.32840532264524 +1604199914.0,wave height significant,1.7833387851715088 +1604199914.0,wave peak period (tp),14.864236831665039 +1604199914.0,wave direction in degrees relative to geographic north,219.7960205078125 +1604199914.0,wave direction in degrees relative to vessel heading,349.12442583045777 +1604199914.0,wind speed in meter per sec,13.837101936340332 +1604199914.0,wind direction in degrees relative to geographic north,330.6998596191406 +1604199914.0,wind direction in degrees relative to vessel heading,100.02826494178589 +1604199914.0,weather source,remote weather_wam800 +1604199914.0,speed over ground,15.0 +1604199914.0,speed through water,0.0 +1604199914.0,sea current speed in meter pr sec,0.0 +1604199914.0,sea current direction in degrees relative to geographic north,0.0 +1604199914.0,power,563.1002964115078 +1604199914.0,torque,0.0 +1604199914.0,thrust,0.0 +1604199914.0,rtot,0.0 +1604203037.0,task,sailingtaskwithspeedchange +1604203037.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604203037.0,latitude,65.28002429220516 +1604203037.0,longitude,11.840009339302998 +1604203037.0,heading,-170.79109851876296 +1604203037.0,wave height significant,1.3425443172454834 +1604203037.0,wave peak period (tp),14.854530334472656 +1604203037.0,wave direction in degrees relative to geographic north,208.41525268554688 +1604203037.0,wave direction in degrees relative to vessel heading,19.20635120430984 +1604203037.0,wind speed in meter per sec,11.585634231567383 +1604203037.0,wind direction in degrees relative to geographic north,330.5367736816406 +1604203037.0,wind direction in degrees relative to vessel heading,141.3278722004036 +1604203037.0,weather source,remote weather_wam800 +1604203037.0,speed over ground,15.0 +1604203037.0,speed through water,0.0 +1604203037.0,sea current speed in meter pr sec,0.0 +1604203037.0,sea current direction in degrees relative to geographic north,0.0 +1604203037.0,power,788.0065500622838 +1604203037.0,torque,0.0 +1604203037.0,thrust,0.0 +1604203037.0,rtot,0.0 +1604203200.0,task,sailingtaskwithspeedchange +1604203200.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604203200.0,latitude,65.2687367827885 +1604203200.0,longitude,11.838237359089353 +1604203200.0,heading,-176.24237449022505 +1604203200.0,wave height significant,1.4657821655273438 +1604203200.0,wave peak period (tp),13.512940406799316 +1604203200.0,wave direction in degrees relative to geographic north,205.18359375 +1604203200.0,wave direction in degrees relative to vessel heading,21.425968240225075 +1604203200.0,wind speed in meter per sec,13.373538970947266 +1604203200.0,wind direction in degrees relative to geographic north,339.33282470703125 +1604203200.0,wind direction in degrees relative to vessel heading,155.57519919725632 +1604203200.0,weather source,remote weather_wam800 +1604203200.0,speed over ground,15.0 +1604203200.0,speed through water,0.0 +1604203200.0,sea current speed in meter pr sec,0.0 +1604203200.0,sea current direction in degrees relative to geographic north,0.0 +1604203200.0,power,423.3180725307778 +1604203200.0,torque,0.0 +1604203200.0,thrust,0.0 +1604203200.0,rtot,0.0 +1604204886.0,task,sailingtaskwithspeedchange +1604204886.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604204886.0,latitude,65.1519825558404 +1604204886.0,longitude,11.819997286784531 +1604204886.0,heading,-176.24398401749744 +1604204886.0,wave height significant,1.0866183042526245 +1604204886.0,wave peak period (tp),14.864236831665039 +1604204886.0,wave direction in degrees relative to geographic north,231.82382202148438 +1604204886.0,wave direction in degrees relative to vessel heading,48.067806038981814 +1604204886.0,wind speed in meter per sec,13.297026634216309 +1604204886.0,wind direction in degrees relative to geographic north,339.98541259765625 +1604204886.0,wind direction in degrees relative to vessel heading,156.22939661515375 +1604204886.0,weather source,remote weather_wam800 +1604204886.0,speed over ground,15.0 +1604204886.0,speed through water,0.0 +1604204886.0,sea current speed in meter pr sec,0.0 +1604204886.0,sea current direction in degrees relative to geographic north,0.0 +1604204886.0,power,945.3084160727689 +1604204886.0,torque,0.0 +1604204886.0,thrust,0.0 +1604204886.0,rtot,0.0 +1604205991.0,task,sailingtaskwithspeedchange +1604205991.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604205991.0,latitude,65.07800532295366 +1604205991.0,longitude,11.772003443390757 +1604205991.0,heading,-164.70860366248255 +1604205991.0,wave height significant,0.41843631863594055 +1604205991.0,wave peak period (tp),2.430420398712158 +1604205991.0,wave direction in degrees relative to geographic north,183.70155334472656 +1604205991.0,wave direction in degrees relative to vessel heading,348.41015700720914 +1604205991.0,wind speed in meter per sec,12.319045066833496 +1604205991.0,wind direction in degrees relative to geographic north,338.69305419921875 +1604205991.0,wind direction in degrees relative to vessel heading,143.40165786170132 +1604205991.0,weather source,remote weather_wam800 +1604205991.0,speed over ground,15.0 +1604205991.0,speed through water,0.0 +1604205991.0,sea current speed in meter pr sec,0.0 +1604205991.0,sea current direction in degrees relative to geographic north,0.0 +1604205991.0,power,699.2054333685735 +1604205991.0,torque,0.0 +1604205991.0,thrust,0.0 +1604205991.0,rtot,0.0 +1604206800.0,task,sailingtaskwithspeedchange +1604206800.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604206800.0,latitude,65.04551963915743 +1604206800.0,longitude,11.663404990131633 +1604206800.0,heading,-125.30477994911364 +1604206800.0,wave height significant,0.5285452604293823 +1604206800.0,wave peak period (tp),14.864237785339355 +1604206800.0,wave direction in degrees relative to geographic north,167.16339111328125 +1604206800.0,wave direction in degrees relative to vessel heading,292.4681710623949 +1604206800.0,wind speed in meter per sec,10.17496395111084 +1604206800.0,wind direction in degrees relative to geographic north,335.6573486328125 +1604206800.0,wind direction in degrees relative to vessel heading,100.96212858192615 +1604206800.0,weather source,remote weather_wam800 +1604206800.0,speed over ground,15.0 +1604206800.0,speed through water,0.0 +1604206800.0,sea current speed in meter pr sec,0.0 +1604206800.0,sea current direction in degrees relative to geographic north,0.0 +1604206800.0,power,152.91384664645767 +1604206800.0,torque,0.0 +1604206800.0,thrust,0.0 +1604206800.0,rtot,0.0 +1604207782.0,task,sailingtaskwithspeedchange +1604207782.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604207782.0,latitude,65.0059815747751 +1604207782.0,longitude,11.531938914962092 +1604207782.0,heading,-125.40325299862951 +1604207782.0,wave height significant,0.6025618314743042 +1604207782.0,wave peak period (tp),13.512940406799316 +1604207782.0,wave direction in degrees relative to geographic north,190.9228515625 +1604207782.0,wave direction in degrees relative to vessel heading,316.3261045611295 +1604207782.0,wind speed in meter per sec,11.866759300231934 +1604207782.0,wind direction in degrees relative to geographic north,336.20806884765625 +1604207782.0,wind direction in degrees relative to vessel heading,101.61132184628576 +1604207782.0,weather source,remote weather_wam800 +1604207782.0,speed over ground,15.0 +1604207782.0,speed through water,0.0 +1604207782.0,sea current speed in meter pr sec,0.0 +1604207782.0,sea current direction in degrees relative to geographic north,0.0 +1604207782.0,power,274.58177599789303 +1604207782.0,torque,0.0 +1604207782.0,thrust,0.0 +1604207782.0,rtot,0.0 +1604208824.0,task,sailingtaskwithspeedchange +1604208824.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604208824.0,latitude,64.96500807306059 +1604208824.0,longitude,11.391027676550678 +1604208824.0,heading,-124.45086946507155 +1604208824.0,wave height significant,0.5090584754943848 +1604208824.0,wave peak period (tp),2.673462390899658 +1604208824.0,wave direction in degrees relative to geographic north,195.25860595703125 +1604208824.0,wave direction in degrees relative to vessel heading,319.7094754221028 +1604208824.0,wind speed in meter per sec,10.641841888427734 +1604208824.0,wind direction in degrees relative to geographic north,339.5870056152344 +1604208824.0,wind direction in degrees relative to vessel heading,104.03787508030592 +1604208824.0,weather source,remote weather_wam800 +1604208824.0,speed over ground,15.0 +1604208824.0,speed through water,0.0 +1604208824.0,sea current speed in meter pr sec,0.0 +1604208824.0,sea current direction in degrees relative to geographic north,0.0 +1604208824.0,power,593.0435028248605 +1604208824.0,torque,0.0 +1604208824.0,thrust,0.0 +1604208824.0,rtot,0.0 +1604209673.0,task,sailingtaskwithspeedchange +1604209673.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604209673.0,latitude,64.90898168220494 +1604209673.0,longitude,11.347985958472387 +1604209673.0,heading,-161.9536614634771 +1604209673.0,wave height significant,0.2734917104244232 +1604209673.0,wave peak period (tp),1.8260105848312378 +1604209673.0,wave direction in degrees relative to geographic north,174.63516235351562 +1604209673.0,wave direction in degrees relative to vessel heading,336.5888238169927 +1604209673.0,wind speed in meter per sec,10.212474822998047 +1604209673.0,wind direction in degrees relative to geographic north,341.6849365234375 +1604209673.0,wind direction in degrees relative to vessel heading,143.6385979869146 +1604209673.0,weather source,remote weather_wam800 +1604209673.0,speed over ground,15.0 +1604209673.0,speed through water,0.0 +1604209673.0,sea current speed in meter pr sec,0.0 +1604209673.0,sea current direction in degrees relative to geographic north,0.0 +1604209673.0,power,126.71827310428397 +1604209673.0,torque,0.0 +1604209673.0,thrust,0.0 +1604209673.0,rtot,0.0 +1604210400.0,task,sailingtaskwithspeedchange +1604210400.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604210400.0,latitude,64.8663919961889 +1604210400.0,longitude,11.284255412958112 +1604210400.0,heading,-147.5532836732007 +1604210400.0,wave height significant,0.3633185625076294 +1604210400.0,wave peak period (tp),1.8260105848312378 +1604210400.0,wave direction in degrees relative to geographic north,192.0460968017578 +1604210400.0,wave direction in degrees relative to vessel heading,339.5993804749585 +1604210400.0,wind speed in meter per sec,8.035566329956055 +1604210400.0,wind direction in degrees relative to geographic north,344.24395751953125 +1604210400.0,wind direction in degrees relative to vessel heading,131.79724119273192 +1604210400.0,weather source,remote weather_wam800 +1604210400.0,speed over ground,15.0 +1604210400.0,speed through water,0.0 +1604210400.0,sea current speed in meter pr sec,0.0 +1604210400.0,sea current direction in degrees relative to geographic north,0.0 +1604210400.0,power,4.692365611099425 +1604210400.0,torque,0.0 +1604210400.0,thrust,0.0 +1604210400.0,rtot,0.0 +1604211652.0,task,sailingtaskwithspeedchange +1604211652.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604211652.0,latitude,64.79298273634353 +1604211652.0,longitude,11.174974384315643 +1604211652.0,heading,-147.61099026064363 +1604211652.0,wave height significant,1.2737219333648682 +1604211652.0,wave peak period (tp),12.284492492675781 +1604211652.0,wave direction in degrees relative to geographic north,234.6975555419922 +1604211652.0,wave direction in degrees relative to vessel heading,22.30854580263582 +1604211652.0,wind speed in meter per sec,11.271003723144531 +1604211652.0,wind direction in degrees relative to geographic north,344.09344482421875 +1604211652.0,wind direction in degrees relative to vessel heading,131.70443508486238 +1604211652.0,weather source,remote weather_wam800 +1604211652.0,speed over ground,15.0 +1604211652.0,speed through water,0.0 +1604211652.0,sea current speed in meter pr sec,0.0 +1604211652.0,sea current direction in degrees relative to geographic north,0.0 +1604211652.0,power,532.0021501000223 +1604211652.0,torque,0.0 +1604211652.0,thrust,0.0 +1604211652.0,rtot,0.0 +1604212887.0,task,sailingtaskwithspeedchange +1604212887.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604212887.0,latitude,64.72299036981285 +1604212887.0,longitude,11.058984092573088 +1604212887.0,heading,-144.69889935536287 +1604212887.0,wave height significant,1.9874669313430786 +1604212887.0,wave peak period (tp),13.512940406799316 +1604212887.0,wave direction in degrees relative to geographic north,242.4027862548828 +1604212887.0,wave direction in degrees relative to vessel heading,27.10168561024568 +1604212887.0,wind speed in meter per sec,12.35629653930664 +1604212887.0,wind direction in degrees relative to geographic north,345.2295227050781 +1604212887.0,wind direction in degrees relative to vessel heading,129.928422060441 +1604212887.0,weather source,remote weather_wam800 +1604212887.0,speed over ground,15.0 +1604212887.0,speed through water,0.0 +1604212887.0,sea current speed in meter pr sec,0.0 +1604212887.0,sea current direction in degrees relative to geographic north,0.0 +1604212887.0,power,863.9798013880974 +1604212887.0,torque,0.0 +1604212887.0,thrust,0.0 +1604212887.0,rtot,0.0 +1604214000.0,task,sailingtaskwithspeedchange +1604214000.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604214000.0,latitude,64.65799852861934 +1604214000.0,longitude,10.9613543560931 +1604214000.0,heading,-147.2474622327896 +1604214000.0,wave height significant,1.9222803115844727 +1604214000.0,wave peak period (tp),13.512940406799316 +1604214000.0,wave direction in degrees relative to geographic north,253.89605712890625 +1604214000.0,wave direction in degrees relative to vessel heading,41.14351936169584 +1604214000.0,wind speed in meter per sec,10.696914672851562 +1604214000.0,wind direction in degrees relative to geographic north,329.5866394042969 +1604214000.0,wind direction in degrees relative to vessel heading,116.83410163708646 +1604214000.0,weather source,remote weather_wam800 +1604214000.0,speed over ground,15.0 +1604214000.0,speed through water,0.0 +1604214000.0,sea current speed in meter pr sec,0.0 +1604214000.0,sea current direction in degrees relative to geographic north,0.0 +1604214000.0,power,117.12681198092245 +1604214000.0,torque,0.0 +1604214000.0,thrust,0.0 +1604214000.0,rtot,0.0 +1604214565.0,task,sailingtaskwithspeedchange +1604214565.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604214565.0,latitude,64.62498172547295 +1604214565.0,longitude,10.911972707661183 +1604214565.0,heading,-147.33572066880436 +1604214565.0,wave height significant,1.2445582151412964 +1604214565.0,wave peak period (tp),13.512940406799316 +1604214565.0,wave direction in degrees relative to geographic north,258.9476013183594 +1604214565.0,wave direction in degrees relative to vessel heading,46.28332198716373 +1604214565.0,wind speed in meter per sec,9.793121337890625 +1604214565.0,wind direction in degrees relative to geographic north,335.588623046875 +1604214565.0,wind direction in degrees relative to vessel heading,122.92434371567936 +1604214565.0,weather source,remote weather_wam800 +1604214565.0,speed over ground,15.0 +1604214565.0,speed through water,0.0 +1604214565.0,sea current speed in meter pr sec,0.0 +1604214565.0,sea current direction in degrees relative to geographic north,0.0 +1604214565.0,power,172.50684009842354 +1604214565.0,torque,0.0 +1604214565.0,thrust,0.0 +1604214565.0,rtot,0.0 +1604215950.0,task,sailingtaskwithspeedchange +1604215950.0,assignment,sailing_mosjoen_rotterdam(sailing) +1604215950.0,latitude,64.59499938138765 +1604215950.0,longitude,10.698995632908813 +1604215950.0,heading,-108.07994844143826 +1604215950.0,wave height significant,2.2321343421936035 +1604215950.0,wave peak period (tp),13.512941360473633 +1604215950.0,wave direction in degrees relative to geographic north,249.26536560058594 +1604215950.0,wave direction in degrees relative to vessel heading,357.3453140420242 +1604215950.0,wind speed in meter per sec,9.837118148803711 +1604215950.0,wind direction in degrees relative to geographic north,336.2023010253906 +1604215950.0,wind direction in degrees relative to vessel heading,84.28224946682889 +1604215950.0,weather source,remote weather_wam800 +1604215950.0,speed over ground,15.0 +1604215950.0,speed through water,0.0 +1604215950.0,sea current speed in meter pr sec,0.0 +1604215950.0,sea current direction in degrees relative to geographic north,0.0 +1604215950.0,power,870.7189882146831 +1604215950.0,torque,0.0 +1604215950.0,thrust,0.0 +1604215950.0,rtot,0.0 diff --git a/machinery-system-structure/timeseries_test.sim b/machinery-system-structure/timeseries_test.sim new file mode 100644 index 0000000000000000000000000000000000000000..05e92814a8e8731c27328fefa94e3e0564eee96b GIT binary patch literal 22552 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 literal 0 HcmV?d00001