From 679f554e923da579c04c8a49dcffb5180677144c Mon Sep 17 00:00:00 2001 From: Mark van Koningsveld Date: Sun, 16 Feb 2020 22:38:27 +0100 Subject: [PATCH] Important bug fixed that influenced quay length (both in agribulk and container --- CHANGELOG.rst | 5 +++++ HISTORY.rst | 4 ++++ opentisim/__init__.py | 2 +- opentisim/agribulk_system.py | 26 +++++++++++++++++--------- opentisim/container_defaults.py | 11 +++++------ opentisim/container_system.py | 29 ++++++++++++++++------------- opentisim/hydrogen_system.py | 1 + setup.py | 2 +- 8 files changed, 50 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 99d234c..314753a 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog ========= +Version 0.6.0 +=========== + +- Updated container code + Version 0.5.0 =========== diff --git a/HISTORY.rst b/HISTORY.rst index e84d3e3..98b4fa6 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -2,6 +2,10 @@ History ======= +v0.6.0 (2020-02-14) +------------------ + +* Updated the container code and example v0.5.0 (2020-01-24) ------------------ diff --git a/opentisim/__init__.py b/opentisim/__init__.py index 985b9e3..fc02b2d 100644 --- a/opentisim/__init__.py +++ b/opentisim/__init__.py @@ -4,5 +4,5 @@ __author__ = """Mark van Koningsveld""" __email__ = 'm.vankoningsveld@tudelft.nl' -__version__ = 'v.0.5.0' +__version__ = 'v.0.6.0' diff --git a/opentisim/agribulk_system.py b/opentisim/agribulk_system.py index 44203fa..f177c90 100644 --- a/opentisim/agribulk_system.py +++ b/opentisim/agribulk_system.py @@ -242,10 +242,15 @@ def berth_invest(self, year, handysize, handymax, panamax): berths = len(core.find_elements(self, Berth)) quay_walls = len(core.find_elements(self, Quay_wall)) if berths > quay_walls: - length_v = max(agribulk_defaults.handysize_data["LOA"], agribulk_defaults.handymax_data["LOA"], - agribulk_defaults.panamax_data["LOA"]) # average size - draft = max(agribulk_defaults.handysize_data["draft"], agribulk_defaults.handymax_data["draft"], - agribulk_defaults.panamax_data["draft"]) + # bug fixed, should only take the value of the vessels that actually come + length_v = max( + (not agribulk_defaults.maize_data['handysize_perc'] == 0) * agribulk_defaults.handysize_data["LOA"], + (not agribulk_defaults.maize_data['handymax_perc'] == 0) * agribulk_defaults.handymax_data["LOA"], + (not agribulk_defaults.maize_data['panamax_perc'] == 0) * agribulk_defaults.panamax_data["LOA"]) # max size + draft = max( + (not agribulk_defaults.maize_data['handysize_perc'] == 0) * agribulk_defaults.handysize_data["draft"], + (not agribulk_defaults.maize_data['handymax_perc'] == 0) * agribulk_defaults.handymax_data["draft"], + (not agribulk_defaults.maize_data['panamax_perc'] == 0) * agribulk_defaults.panamax_data["draft"]) # apply PIANC 2014: # see Ijzermans, 2019 - infrastructure.py line 107 - 111 @@ -315,18 +320,21 @@ def quay_invest(self, year, length, depth): # add length and depth to the elements (useful for later reporting) quay_wall.length = length quay_wall.depth = depth + quay_wall.retaining_height = 2 * (depth + quay_wall.freeboard) # - capex - unit_rate = int(quay_wall.Gijt_constant_2 * 2 * (depth + quay_wall.freeboard)) - mobilisation = int(max((length * unit_rate * quay_wall.mobilisation_perc), quay_wall.mobilisation_min)) + quay_wall.unit_rate = int(quay_wall.Gijt_constant_2 * 2 * (depth + quay_wall.freeboard)) + mobilisation = int(max((length * quay_wall.unit_rate * quay_wall.mobilisation_perc), quay_wall.mobilisation_min)) # Todo: consider adding cost of apron and cost of land here (compare containers) - quay_wall.capex = int(length * unit_rate + mobilisation) + + quay_wall.capex = int(length * quay_wall.unit_rate + mobilisation) # - opex - quay_wall.insurance = unit_rate * length * quay_wall.insurance_perc - quay_wall.maintenance = unit_rate * length * quay_wall.maintenance_perc + quay_wall.insurance = quay_wall.unit_rate * length * quay_wall.insurance_perc + quay_wall.maintenance = quay_wall.unit_rate * length * quay_wall.maintenance_perc quay_wall.year_online = year + quay_wall.delivery_time + # - land use # Todo: consider adding a landuse section here (compare containers) # add cash flow information to quay_wall object in a dataframe diff --git a/opentisim/container_defaults.py b/opentisim/container_defaults.py index 75ead26..6f57385 100644 --- a/opentisim/container_defaults.py +++ b/opentisim/container_defaults.py @@ -422,12 +422,11 @@ # *** Default inputs: Commodity class *** container_data = {"name": 'Laden', - "handling_fee": 150, - "handysize_perc": 0, - "handymax_perc": 0, - "panamax_perc": 100, - "historic_data": pd.DataFrame(data={'year': [2014, 2015, 2016, 2017, 2018], - 'volume': [1_000_000, 1_100_000, 1_250_000, 1_400_000, 1_500_000]})} + "handling_fee": 150, + "handysize_perc": 0, + "handymax_perc": 0, + "panamax_perc": 100, + "historic_data": []} # *** Default inputs: Vessel class *** diff --git a/opentisim/container_system.py b/opentisim/container_system.py index f898577..15d115b 100644 --- a/opentisim/container_system.py +++ b/opentisim/container_system.py @@ -324,12 +324,15 @@ def berth_invest(self, year, handysize, handymax, panamax): berths = len(core.find_elements(self, Berth)) quay_walls = len(core.find_elements(self, Quay_wall)) if berths > quay_walls: - length_v = max(container_defaults.handysize_data["LOA"], container_defaults.handymax_data["LOA"], - container_defaults.panamax_data["LOA"]) # average size - draft = max(container_defaults.handysize_data["draft"], container_defaults.handymax_data["draft"], - container_defaults.panamax_data["draft"]) - - quay_wall = Quay_wall(**container_defaults.quay_wall_data) + # bug fixed, should only take the value of the vessels that actually come + length_v = max( + (not container_defaults.container_data['handysize_perc'] == 0) * container_defaults.handysize_data["LOA"], + (not container_defaults.container_data['handymax_perc'] == 0) * container_defaults.handymax_data["LOA"], + (not container_defaults.container_data['panamax_perc'] == 0) * container_defaults.panamax_data["LOA"]) # average size + draft = max( + (not container_defaults.container_data['handysize_perc'] == 0) * container_defaults.handysize_data["draft"], + (not container_defaults.container_data['handymax_perc'] == 0) * container_defaults.handymax_data["draft"], + (not container_defaults.container_data['panamax_perc'] == 0) * container_defaults.panamax_data["draft"]) # apply PIANC 2014: # see Ijzermans, 2019 - infrastructure.py line 107 - 111 @@ -343,6 +346,7 @@ def berth_invest(self, year, handysize, handymax, panamax): length = 1.1 * berths * (length_v + 15) - 1.1 * (berths - 1) * (length_v + 15) # - depth + quay_wall = Quay_wall(**container_defaults.quay_wall_data) depth = np.sum([draft, quay_wall.max_sinkage, quay_wall.wave_motion, quay_wall.safety_margin]) self.quay_invest(year, length, depth) @@ -398,19 +402,18 @@ def quay_invest(self, year, length, depth): # add length and depth to the elements (useful for later reporting) quay_wall.length = length quay_wall.depth = depth + quay_wall.retaining_height = 2 * (depth + quay_wall.freeboard) # - capex - # Todo: check this. Clearly some error was introduced here (now made equal to agribulk example) - # unit_rate = int(quay_wall.Gijt_constant * (depth * 2 + quay_wall.freeboard) ** quay_wall.Gijt_coefficient) - unit_rate = int(quay_wall.Gijt_constant_2 * 2 * (depth + quay_wall.freeboard)) - mobilisation = int(max((length * unit_rate * quay_wall.mobilisation_perc), quay_wall.mobilisation_min)) + quay_wall.unit_rate = int(quay_wall.Gijt_constant_2 * 2 * (depth + quay_wall.freeboard)) + mobilisation = int(max((length * quay_wall.unit_rate * quay_wall.mobilisation_perc), quay_wall.mobilisation_min)) apron_pavement = length * quay_wall.apron_width * quay_wall.apron_pavement cost_of_land = length * quay_wall.apron_width * self.land_price - quay_wall.capex = int(length * unit_rate + mobilisation + apron_pavement + cost_of_land) + quay_wall.capex = int(length * quay_wall.unit_rate + mobilisation + apron_pavement + cost_of_land) # - opex - quay_wall.insurance = unit_rate * length * quay_wall.insurance_perc - quay_wall.maintenance = unit_rate * length * quay_wall.maintenance_perc + quay_wall.insurance = quay_wall.unit_rate * length * quay_wall.insurance_perc + quay_wall.maintenance = quay_wall.unit_rate * length * quay_wall.maintenance_perc quay_wall.year_online = year + quay_wall.delivery_time # - land use diff --git a/opentisim/hydrogen_system.py b/opentisim/hydrogen_system.py index 6f901e1..4ac0aba 100644 --- a/opentisim/hydrogen_system.py +++ b/opentisim/hydrogen_system.py @@ -36,6 +36,7 @@ def __init__(self, startyear=2019, lifecycle=20, operational_hours=5840, debug=F self.h2retrieval_type_defaults = h2retrieval_type_defaults # triggers for the various elements (berth, storage and h2retrieval) + self.allowable_waiting_service_time_ratio_berth = allowable_waiting_service_time_ratio_berth self.allowable_berth_occupancy = allowable_berth_occupancy self.allowable_dwelltime = allowable_dwelltime self.h2retrieval_trigger = h2retrieval_trigger diff --git a/setup.py b/setup.py index 957d822..2fbe5f4 100644 --- a/setup.py +++ b/setup.py @@ -69,6 +69,6 @@ test_suite="tests", tests_require=tests_require, url="https://github.com/TUDelft-CITG/OpenTISim", - version="v0.5.0", + version="v0.6.0", zip_safe=False, )