Skip to content

Commit

Permalink
Merge branch 'feature/offshore-h2' of github.com:NREL/HOPP into featu…
Browse files Browse the repository at this point in the history
…re/offshore-h2
  • Loading branch information
jaredthomas68 committed Jul 20, 2023
2 parents 813cafa + 74d4363 commit 6fdc507
Show file tree
Hide file tree
Showing 6 changed files with 524 additions and 33 deletions.
4 changes: 2 additions & 2 deletions hopp/offshore/example_fixed_project.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Modified orbit configuration file for a single platform to carry "X technology"
design_phases:
- FixedPlatformDesign # Appended Design Phase
- FixedPlatformDesign # Register Design Phase
install_phases:
FixedPlatformInstallation: 0 # Appended Install Phase
FixedPlatformInstallation: 0 # Register Install Phase
oss_install_vessel: example_heavy_lift_vessel
site:
depth: 22.5 # site depth [m]
Expand Down
14 changes: 14 additions & 0 deletions hopp/offshore/example_floating_project.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Modified orbit configuration file for a single platform to carry "X technology"
design_phases:
- FloatingPlatformDesign # Resgister Design Phase
install_phases:
FloatingPlatformInstallation: 0 # Register Install Phase
oss_install_vessel: example_heavy_lift_vessel
site:
depth: 500.5 # site depth [m]
distance: 124 # distance to port [km]
equipment:
tech_required_area: 300. # equipment area [m**2]
tech_combined_mass: 1000 # equipment mass [t]
topside_design_cost: 4500000 # topside design cost [USD]
installation_duration: 14 # time at sea [days]
66 changes: 43 additions & 23 deletions hopp/offshore/fixed_platform.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,23 @@
Sources:
- [1] ORBIT: https://github.com/WISDEM/ORBIT electrical_refactor branch
- [2] J. Nunemaker, M. Shields, R. Hammond, and P. Duffy,
“ORBIT: Offshore Renewables Balance-of-System and Installation Tool,”
NREL/TP-5000-77081, 1660132, MainId:26027, Aug. 2020. doi: 10.2172/1660132.
- [3] M. Maness, B. Maples, and A. Smith,
“NREL Offshore Balance-of-System Model,”
NREL/TP--6A20-66874, 1339522, Jan. 2017. doi: 10.2172/1339522.
Args:
- tech_required_area: (float): area needed for combination of all tech (m^2), not including buffer or working space
- tech_combined_mass: (float): mass of all tech being placed on the platform (kg or tonnes)year
- depth: (float): bathometry at the platform location (m)
- distance_to_port: (float): distance ships must travel from port to site location (km)
- distance: (float): distance ships must travel from port to site location (km)
Future arguments: (Not used at this time)
- construction year (int):
- lifetime (int): lifetime of the plant in years (may not be needed)
- Assembly costs and construction on land
Returns:
- platform_mass (float): Adjusted mass of platform + substructure
Expand All @@ -30,8 +36,9 @@
"""
'''
Notes:
Thank you Jake Nunemaker's oswh2 repository!!!
pile_cost=0 $US/tonne for monopile construction. Not a bug, this # is consistent with the rest of ORBIT
- Thank you Jake Nunemaker's oswh2 repository!!!
- pile_cost=0 $US/tonne for monopile construction. Not a bug, this # is
consistent with the rest of ORBIT [1].
'''

import os
Expand All @@ -45,7 +52,9 @@

class FixedPlatformDesign(DesignPhase):
'''
This is a modified class based on ORBIT's design phase
This is a modified class based on ORBIT's [1] design phase. The implementation
is discussed in [2], Section 2.5: Offshore Substation Design. Default values originate
from [3], Appendix A: Inputs, Key Assumptions and Caveats.
'''

#phase = "H2 Fixed Platform Design"
Expand Down Expand Up @@ -87,12 +96,12 @@ def run(self):

_platform = self.config.get('equipment',{})

self.mass = _platform.get('tech_combined_mass',999) # t
self.mass = _platform.get('tech_comnined_mass',999) # t
self.area = _platform.get('tech_required_area', 1000) # m**2

design_cost = _platform.get('topside_design_cost', 4.5e6) # USD
fab_cost = _platform.get('fabrication_cost_rate', 14500.) # USD/t
steel_cost = _platform.get('substructure_steel_cost', 3000) # USD/t
steel_cost = _platform.get('substructure_steel_rate', 3000) # USD/t

# Add individual calcs/functions in the run() method
total_cost, total_mass = calc_substructure_mass_and_cost(self.mass, self.area,
Expand Down Expand Up @@ -125,7 +134,9 @@ def detailed_output(self):

class FixedPlatformInstallation(InstallPhase):
'''
This is a modified class based on ORBIT's install phase
This is a modified class based on ORBIT's [1] install phase. The implementation
is duscussed in [2], Section 3.6: Offshore Substation Installation. Default values
originate from [3], Appendix A: Inputs, Key Assumptions and Caveats.
'''

#phase = "H2 Fixed Platform Installation"
Expand Down Expand Up @@ -170,7 +181,7 @@ def setup_simulation(self, **kwargs):
_platform = self.config.get('equipment', {})
design_cost = _platform.get('topside_design_cost', 4.5e6) # USD
fab_cost = _platform.get('fabrication_cost_rate', 14500.) # USD/t
steel_cost = _platform.get('substructure_steel_cost', 3000) # USD/t
steel_cost = _platform.get('substructure_steel_rate', 3000) # USD/t

install_duration = _platform.get("install_duration", 14) # days

Expand All @@ -189,8 +200,7 @@ def setup_simulation(self, **kwargs):
self.depth, fab_cost, design_cost, steel_cost
)

total_mass = self.mass + substructure_mass # t

total_mass = substructure_mass # t
# Call the install_platform function
self.install_capex = install_platform(total_mass, self.area, self.distance, \
install_duration, self.install_vessel)
Expand All @@ -214,34 +224,42 @@ def detailed_output(self):
# Define individual calculations and functions to use outside or with ORBIT
def calc_substructure_mass_and_cost(mass, area, depth, fab_cost=14500., design_cost=4.5e6, sub_cost=3000, pile_cost=0):
'''
calc_substructure_mass_and_cost returns the total mass including substructure, topside and equipment. Also returns the cost of the substructure and topside
Inputs: mass | Mass of equipment on platform (tonnes)
area | Area needed for equipment (meter^2) (not necessary)
depth | Ocean depth at platform location (meters) (not necessary)
fab_cost_rate | Cost rate to fabricate topside (USD/tonne)
design_cost | Design cost to design structural components (USD) from ORBIT
sub_cost_rate | Steel cost rate (USD/tonne) from ORBIT'''
'''
Platform is substructure and topside combined
All funstions are based off NREL's ORBIT (oss_design)
default values are specified in ORBIT
All functions are based off NREL's ORBIT [1] (oss_design.py)
default values are specified in [3],
'''
#Inputs needed
topside_mass = mass
topside_fab_cost_rate = fab_cost
topside_design_cost = design_cost

'''Topside Cost & Mass
'''Topside Cost & Mass (repurposed eq. 2.26 from [2])
Topside Mass is the required Mass the platform will hold
Topside Cost is a function of topside mass, fab cost and design cost'''
topside_cost = topside_mass *topside_fab_cost_rate +topside_design_cost
topside_cost = topside_mass*topside_fab_cost_rate + topside_design_cost

'''Substructure
'''Substructure (repurposed eq. 2.31-2.33 from [2])
Substructure Mass is a function of the topside mass
Substructure Cost is a function of of substructure mass pile mass and cost rates for each'''

#inputs needed
substructure_cost_rate = sub_cost # USD/t
pile_cost_rate = pile_cost # USD/t

substructure_mass = 0.4 * topside_mass # t
substructure_pile_mass = 8 * substructure_mass**0.5574 # t
substructure_cost = (substructure_mass *substructure_cost_rate +
substructure_pile_mass *pile_cost_rate) # USD
substructure_mass = 0.4*topside_mass # t
substructure_pile_mass = 8*substructure_mass**0.5574 # t
substructure_cost = (substructure_mass*substructure_cost_rate +
substructure_pile_mass*pile_cost_rate) # USD

substructure_total_mass = substructure_mass +substructure_pile_mass # t
substructure_total_mass = substructure_mass + substructure_pile_mass # t

'''Total Platform capex = capex Topside + capex substructure'''

Expand All @@ -257,6 +275,7 @@ def install_platform(mass, area, distance, install_duration=14, vessel=None):
Total Cost = install_cost * duration
Compares the mass and/or deck space of equipment to the vessel limits to determine
the number of trips. Add an additional "at sea" install duration
Default values are from [3].
'''
# print("Install process worked!")
# If no ORBIT vessel is defined set default values (based on ORBIT's example_heavy_lift_vessel)
Expand Down Expand Up @@ -313,8 +332,9 @@ def calc_platform_opex(capex, opex_rate=0.011):
config_fname = load_config(os.path.join(config_path, os.pardir, "example_fixed_project.yaml"))


ProjectManager._design_phases.append(FixedPlatformDesign)
ProjectManager._install_phases.append(FixedPlatformInstallation)
ProjectManager.register_design_phase(FixedPlatformDesign)

ProjectManager.register_install_phase(FixedPlatformInstallation)

platform = ProjectManager(config_fname)
platform.run()
Expand Down
Loading

0 comments on commit 6fdc507

Please sign in to comment.