def setUp(self): self.turbine = Turbine_CostsSE() self.turbine.blade_mass = 17650.67 # inline with the windpact estimates self.turbine.hub_mass = 31644.5 self.turbine.pitch_system_mass = 17004.0 self.turbine.spinner_mass = 1810.5 self.turbine.low_speed_shaft_mass = 31257.3 #bearingsMass = 9731.41 self.turbine.main_bearing_mass = 9731.41 / 2 self.turbine.second_bearing_mass = 9731.41 / 2 self.turbine.gearbox_mass = 30237.60 self.turbine.high_speed_side_mass = 1492.45 self.turbine.generator_mass = 16699.85 self.turbine.bedplate_mass = 93090.6 self.turbine.yaw_system_mass = 11878.24 self.turbine.tower_mass = 434559.0 self.turbine.machine_rating = 5000.0 self.turbine.advanced = True self.turbine.blade_number = 3 self.turbine.drivetrain_design = 'geared' self.turbine.crane = True self.turbine.offshore = True self.turbine.year = 2010 self.turbine.month = 12
class TestTurbine_CostSE(unittest.TestCase): def setUp(self): self.turbine = Turbine_CostsSE() self.turbine.blade_mass = 17650.67 # inline with the windpact estimates self.turbine.hub_mass = 31644.5 self.turbine.pitch_system_mass = 17004.0 self.turbine.spinner_mass = 1810.5 self.turbine.low_speed_shaft_mass = 31257.3 #bearingsMass = 9731.41 self.turbine.main_bearing_mass = 9731.41 / 2 self.turbine.second_bearing_mass = 9731.41 / 2 self.turbine.gearbox_mass = 30237.60 self.turbine.high_speed_side_mass = 1492.45 self.turbine.generator_mass = 16699.85 self.turbine.bedplate_mass = 93090.6 self.turbine.yaw_system_mass = 11878.24 self.turbine.tower_mass = 434559.0 self.turbine.machine_rating = 5000.0 self.turbine.advanced = True self.turbine.blade_number = 3 self.turbine.drivetrain_design = 'geared' self.turbine.crane = True self.turbine.offshore = True self.turbine.year = 2010 self.turbine.month = 12 def test_functionality(self): self.turbine.run() self.assertEqual(round(self.turbine.turbine_cost,2), 6153564.42)
def configure_lcoe_with_turb_costs(assembly): """ tcc_a inputs: advanced_blade = Bool offshore = Bool assemblyCostMultiplier = Float overheadCostMultiplier = Float profitMultiplier = Float transportMultiplier = Float """ assembly.replace('tcc_a', Turbine_CostsSE()) assembly.add('advanced_blade', Bool(True, iotype='in', desc='advanced (True) or traditional (False) blade design')) assembly.add('offshore', Bool(iotype='in', desc='flag for offshore site')) assembly.add('assemblyCostMultiplier',Float(0.0, iotype='in', desc='multiplier for assembly cost in manufacturing')) assembly.add('overheadCostMultiplier', Float(0.0, iotype='in', desc='multiplier for overhead')) assembly.add('profitMultiplier', Float(0.0, iotype='in', desc='multiplier for profit markup')) assembly.add('transportMultiplier', Float(0.0, iotype='in', desc='multiplier for transport costs')) # connections to turbine costs assembly.connect('rotor.mass_one_blade', 'tcc_a.blade_mass') assembly.connect('hub.hub_mass', 'tcc_a.hub_mass') assembly.connect('hub.pitch_system_mass', 'tcc_a.pitch_system_mass') assembly.connect('hub.spinner_mass', 'tcc_a.spinner_mass') assembly.connect('nacelle.low_speed_shaft_mass', 'tcc_a.low_speed_shaft_mass') assembly.connect('nacelle.main_bearing_mass', 'tcc_a.main_bearing_mass') assembly.connect('nacelle.second_bearing_mass', 'tcc_a.second_bearing_mass') assembly.connect('nacelle.gearbox_mass', 'tcc_a.gearbox_mass') assembly.connect('nacelle.high_speed_side_mass', 'tcc_a.high_speed_side_mass') assembly.connect('nacelle.generator_mass', 'tcc_a.generator_mass') assembly.connect('nacelle.bedplate_mass', 'tcc_a.bedplate_mass') assembly.connect('nacelle.yaw_system_mass', 'tcc_a.yaw_system_mass') assembly.connect('jacket.Twrouts.mass', 'tcc_a.tower_mass') # jacket input assembly.connect('rotor.control.ratedPower', 'tcc_a.machine_rating') assembly.connect('rotor.nBlades', 'tcc_a.blade_number') assembly.connect('nacelle.crane', 'tcc_a.crane') assembly.connect('year', 'tcc_a.year') assembly.connect('month', 'tcc_a.month') assembly.connect('nacelle.drivetrain_design', 'tcc_a.drivetrain_design') assembly.connect('advanced_blade','tcc_a.advanced_blade') assembly.connect('offshore','tcc_a.offshore') assembly.connect('assemblyCostMultiplier','tcc_a.assemblyCostMultiplier') assembly.connect('overheadCostMultiplier','tcc_a.overheadCostMultiplier') assembly.connect('profitMultiplier','tcc_a.profitMultiplier') assembly.connect('transportMultiplier','tcc_a.transportMultiplier')
# 1 --------- # A simple test of turbine_costsse model from turbine_costsse.turbine_costsse import Turbine_CostsSE turbine = Turbine_CostsSE() # 1 --------- # 2 --------- # NREL 5 MW turbine component masses based on Sunderland model approach # Rotor turbine.blade_mass = 17650.67 # inline with the windpact estimates turbine.hub_mass = 31644.5 turbine.pitch_system_mass = 17004.0 turbine.spinner_mass = 1810.5 # Drivetrain and Nacelle turbine.low_speed_shaft_mass = 31257.3 #bearingsMass = 9731.41 turbine.main_bearing_mass = 9731.41 / 2 turbine.second_bearing_mass = 9731.41 / 2 turbine.gearbox_mass = 30237.60 turbine.high_speed_side_mass = 1492.45 turbine.generator_mass = 16699.85 turbine.bedplate_mass = 93090.6 turbine.yaw_system_mass = 11878.24 # Tower turbine.tower_mass = 434559.0
def configure(self): """ tcc_a inputs: advanced_blade = Bool offshore = Bool assemblyCostMultiplier = Float overheadCostMultiplier = Float profitMultiplier = Float transportMultiplier = Float aep inputs: array_losses = Float other_losses = Float fin inputs: fixed_charge_rate = Float construction_finance_rate = Float tax_rate = Float discount_rate = Float construction_time = Float bos inputs: bos_multiplier = Float inputs: sea_depth year month project lifetime if csm opex additional inputs: availability = Float() if openwind opex additional inputs: power_curve rpm ct if with_landbos additional inputs: voltage distInter terrain layout soil """ # configure base assembly configure_extended_financial_analysis(self) # putting replace statements here for now; TODO - openmdao bug # replace BOS with either CSM or landbos if self.with_landbos: self.replace('bos_a', NREL_Land_BOSSE()) else: self.replace('bos_a', bos_csm_assembly()) self.replace('tcc_a', Turbine_CostsSE()) if self.with_ecn_opex: self.replace('opex_a', opex_ecn_assembly(ecn_file)) else: self.replace('opex_a', opex_csm_assembly()) self.replace('aep_a', aep_weibull_assembly()) self.replace('fin_a', fin_csm_assembly()) # add TurbineSE assembly configure_turbine(self, self.with_new_nacelle, self.flexible_blade, self.with_3pt_drive) # replace TCC with turbine_costs configure_lcoe_with_turb_costs(self) # replace BOS with either CSM or landbos if self.with_landbos: configure_lcoe_with_landbos(self) else: configure_lcoe_with_csm_bos(self) # replace AEP with weibull AEP (TODO: option for basic aep) configure_lcoe_with_weibull_aep(self) # replace OPEX with CSM or ECN opex and add AEP if self.with_ecn_opex: configure_lcoe_with_ecn_opex(self, ecn_file) self.connect( 'opex_a.availability', 'aep_a.availability' ) # connecting here due to aep / opex reversal depending on model else: configure_lcoe_with_csm_opex(self) self.add( 'availability', Float( 0.94, iotype='in', desc='average annual availbility of wind turbines at plant' )) self.connect( 'availability', 'aep_a.availability' ) # connecting here due to aep / opex reversal depending on model # replace Finance with CSM Finance configure_lcoe_with_csm_fin(self)