def configure_lcoe_with_ecn_opex(assembly, ecn_file): assembly.replace('opex_a', opex_ecn_assembly(ecn_file)) assembly.connect('machine_rating', 'opex_a.machine_rating') assembly.connect('turbine_number', 'opex_a.turbine_number') assembly.connect('tcc_a.turbine_cost', 'opex_a.turbine_cost') assembly.connect('project_lifetime', 'opex_a.project_lifetime')
def setUp(self, model=None): print self.ssfile self.om = opex_ecn_assembly(self.ssfile) self.om.machine_rating = 5000.0 self.om.net_aep = 1701626526.28 self.om.sea_depth = 20.0 self.om.year = 2009 self.om.month = 12 self.om.turbine_number = 100
def setUp(self,model=None): print self.ssfile self.om = opex_ecn_assembly(self.ssfile) self.om.machine_rating = 5000.0 self.om.net_aep = 1701626526.28 self.om.sea_depth = 20.0 self.om.year = 2009 self.om.month = 12 self.om.turbine_number = 100
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', group='Plant_AEP')) 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)
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)
om.sea_depth = 0.0 om.run() print "Average annual operational expenditures for an land-based wind plant with 100 NREL 5 MW turbines" print "OPEX land-based: ${:.2f} USD".format(om.avg_annual_opex) print "Preventative OPEX by turbine: ${:.2f} USD".format(om.opex_breakdown.preventative_opex / om.turbine_number) print "Corrective OPEX by turbine: ${:.2f} USD".format(om.opex_breakdown.corrective_opex / om.turbine_number) print "Land Lease OPEX by turbine: ${:.2f} USD".format(om.opex_breakdown.lease_opex / om.turbine_number) print # 10 ----------- # 11 ---------- # A simple test of ecn_offshore_om model from plant_costsse.ecn_offshore_opex.ecn_offshore_opex import opex_ecn_assembly om2 = opex_ecn_assembly('C:/Models/ECN Model/ECN O&M Model.xls') # Substitute your own path to the ECN Model # 11 ---------- # 12 ---------- # Set input parameters om2.machine_rating = 5000.0 om2.turbine_cost = 9000000.0 om2.turbine_number = 100 om2.project_lifetime = 20 # 12 ---------- # 13 ---------- om2.run()
def configure(self): """ Creates a new LCOE Assembly object """ configure_extended_financial_analysis(self) self.replace('tcc_a', tcc_csm_assembly()) self.replace('bos_a', bos_csm_assembly()) self.replace('opex_a', opex_ecn_assembly(self.ssfile_1)) self.replace('aep_a', aep_csm_assembly()) self.replace('fin_a', fin_csm_assembly()) # connect i/o to component and assembly inputs # turbine configuration # rotor self.connect('rotor_diameter', ['aep_a.rotor_diameter', 'tcc_a.rotor_diameter', 'bos_a.rotor_diameter']) self.connect('max_tip_speed', ['aep_a.max_tip_speed']) self.connect('opt_tsr','aep_a.opt_tsr') self.connect('cut_in_wind_speed','aep_a.cut_in_wind_speed') self.connect('cut_out_wind_speed','aep_a.cut_out_wind_speed') self.connect('altitude','aep_a.altitude') self.connect('shear_exponent','aep_a.shear_exponent') self.connect('wind_speed_50m','aep_a.wind_speed_50m') self.connect('weibull_k','aep_a.weibull_k') self.connect('soiling_losses','aep_a.soiling_losses') self.connect('array_losses','aep_a.array_losses') self.connect('thrust_coefficient','aep_a.thrust_coefficient') self.connect('blade_number','tcc_a.blade_number') self.connect('advanced_blade','tcc_a.advanced_blade') # drivetrain self.connect('machine_rating', ['aep_a.machine_rating', 'tcc_a.machine_rating', 'bos_a.machine_rating', 'opex_a.machine_rating']) self.connect('drivetrain_design', ['aep_a.drivetrain_design', 'tcc_a.drivetrain_design']) self.connect('crane','tcc_a.crane') self.connect('advanced_bedplate','tcc_a.advanced_bedplate') # tower self.connect('hub_height', ['aep_a.hub_height', 'tcc_a.hub_height', 'bos_a.hub_height']) self.connect('advanced_tower','tcc_a.advanced_tower') # plant configuration # climate self.connect('sea_depth', ['bos_a.sea_depth', 'fin_a.sea_depth']) # 'opex_a.sea_depth', # ECN only offshore self.connect('offshore','tcc_a.offshore') # plant operation self.connect('turbine_number', ['aep_a.turbine_number', 'bos_a.turbine_number', 'opex_a.turbine_number']) # financial self.connect('year', ['tcc_a.year', 'bos_a.year']) # , 'opex_a.year' # ECN doesnt need self.connect('month', ['tcc_a.month', 'bos_a.month']) # , 'opex_a.month' # ECN doesnt need self.connect('fixed_charge_rate','fin_a.fixed_charge_rate') self.connect('construction_finance_rate','fin_a.construction_finance_rate') self.connect('tax_rate','fin_a.tax_rate') self.connect('discount_rate','fin_a.discount_rate') self.connect('construction_time','fin_a.construction_time') self.connect('project_lifetime',['fin_a.project_lifetime','opex_a.project_lifetime']) # new opex conx # connections self.connect('aep_a.rotor_thrust','tcc_a.rotor_thrust') self.connect('aep_a.rotor_torque','tcc_a.rotor_torque') self.connect('tcc_a.turbine_cost','bos_a.turbine_cost') self.connect('opex_a.availability', 'aep_a.availability') # new opex conx # create passthroughs for key output variables of interest # aep_a self.connect('aep_a.rated_rotor_speed','rated_rotor_speed') self.connect('aep_a.rated_wind_speed','rated_wind_speed') self.connect('aep_a.rotor_thrust','rotor_thrust') self.connect('aep_a.rotor_torque','rotor_torque') self.connect('aep_a.power_curve','power_curve') self.connect('aep_a.max_efficiency','max_efficiency') self.connect('aep_a.gross_aep','gross_aep') # opex_a self.connect('opex_a.availability','availability') # tcc_a self.connect('tcc_a.turbine_mass','turbine_mass') # fin_a self.connect('fin_a.lcoe','lcoe')