def setup(self): RefBlade = self.options['RefBlade'] Nsection_Tow = self.options['Nsection_Tow'] if 'Analysis_Level' in self.options['FASTpref']: Analysis_Level = self.options['FASTpref']['Analysis_Level'] else: Analysis_Level = 0 # Define all input variables from all models myIndeps = IndepVarComp() myIndeps.add_discrete_output('crane', False) # Turbine Costs myIndeps.add_discrete_output('bearing_number', 0) # Tower and Frame3DD options myIndeps.add_output('project_lifetime', 0.0, units='yr') myIndeps.add_output('max_taper_ratio', 0.0) myIndeps.add_output('min_diameter_thickness_ratio', 0.0) # Environment myIndeps.add_output('wind_bottom_height', 0.0, units='m') myIndeps.add_output('wind_beta', 0.0, units='deg') myIndeps.add_output('cd_usr', -1.) # Design standards myIndeps.add_output('gamma_b', 0.0) myIndeps.add_output('gamma_n', 0.0) # RNA myIndeps.add_discrete_output('rna_weightM', True) # Column myIndeps.add_output('morison_mass_coefficient', 2.0) myIndeps.add_output('material_density', 0.0, units='kg/m**3') myIndeps.add_output('E', 0.0, units='N/m**2') myIndeps.add_output('yield_stress', 0.0, units='N/m**2') # Pontoons myIndeps.add_output('G', 0.0, units='N/m**2') # LCOE myIndeps.add_output('labor_cost_rate', 0.0, units='USD/min') myIndeps.add_output('material_cost_rate', 0.0, units='USD/kg') myIndeps.add_output('painting_cost_rate', 0.0, units='USD/m**2') myIndeps.add_discrete_output('number_of_turbines', 0) myIndeps.add_output( 'annual_opex', 0.0, units='USD/kW/yr') # TODO: Replace with output connection myIndeps.add_output( 'bos_costs', 0.0, units='USD/kW') # TODO: Replace with output connection myIndeps.add_output('fixed_charge_rate', 0.0) myIndeps.add_output('wake_loss_factor', 0.0) self.add_subsystem('myIndeps', myIndeps, promotes=['*']) # Add components self.add_subsystem('rotorse', RotorSE(RefBlade=RefBlade, npts_coarse_power_curve=20, npts_spline_power_curve=200, regulation_reg_II5=True, regulation_reg_III=False, Analysis_Level=Analysis_Level, FASTpref=self.options['FASTpref'], topLevelFlag=True), promotes=['*']) self.add_subsystem('drive', DriveSE(debug=False, number_of_main_bearings=1, topLevelFlag=False), promotes=[ 'machine_rating', 'overhang', 'hub_mass', 'bedplate_mass', 'gearbox_mass', 'generator_mass', 'hss_mass', 'hvac_mass', 'lss_mass', 'cover_mass', 'pitch_system_mass', 'platforms_mass', 'spinner_mass', 'transformer_mass', 'vs_electronics_mass', 'yaw_mass' ]) # Tower and substructure self.add_subsystem( 'tow', TowerSE(nLC=1, nPoints=Nsection_Tow + 1, nFull=5 * Nsection_Tow + 1, wind='PowerWind', topLevelFlag=False), promotes=[ 'water_density', 'water_viscosity', 'wave_beta', 'significant_wave_height', 'significant_wave_period', 'material_density', 'E', 'G', 'tower_section_height', 'tower_wall_thickness', 'tower_outer_diameter', 'tower_outfitting_factor', 'tower_buckling_length', 'max_taper', 'min_d_to_t', 'rna_mass', 'rna_cg', 'rna_I', 'tower_mass', 'tower_I_base', 'hub_height', 'foundation_height', 'monopile', 'soil_G', 'soil_nu', 'suctionpile_depth', 'gamma_f', 'gamma_m', 'gamma_b', 'gamma_n', 'gamma_fatigue', 'labor_cost_rate', 'material_cost_rate', 'painting_cost_rate', 'z_full', 'd_full', 't_full', 'DC', 'shear', 'geom', 'tower_force_discretization', 'nM', 'Mmethod', 'lump', 'tol', 'shift' ]) # Turbine constraints self.add_subsystem('tcons', TurbineConstraints(nFull=5 * Nsection_Tow + 1), promotes=['*']) # Turbine costs self.add_subsystem('tcost', Turbine_CostsSE_2015( verbosity=self.options['VerbosityCosts'], topLevelFlag=False), promotes=['*']) # LCOE Calculation self.add_subsystem( 'plantfinancese', PlantFinance(verbosity=self.options['VerbosityCosts']), promotes=['machine_rating', 'lcoe']) # Set up connections # Connections to DriveSE self.connect('diameter', 'drive.rotor_diameter') self.connect('rated_Q', 'drive.rotor_torque') self.connect('rated_Omega', 'drive.rotor_rpm') self.connect('Fxyz_total', 'drive.Fxyz') self.connect('Mxyz_total', 'drive.Mxyz') self.connect('I_all_blades', 'drive.blades_I') self.connect('mass_one_blade', 'drive.blade_mass') self.connect('chord', 'drive.blade_root_diameter', src_indices=[0]) self.connect('Rtip', 'drive.blade_length', src_indices=[0]) self.connect('drivetrainEff', 'drive.drivetrain_efficiency', src_indices=[0]) self.connect('tower_outer_diameter', 'drive.tower_top_diameter', src_indices=[-1]) self.connect('material_density', 'tow.tower.rho') # Connections to TowerSE self.connect('drive.top_F', 'tow.pre.rna_F') self.connect('drive.top_M', 'tow.pre.rna_M') self.connect('drive.rna_I_TT', ['rna_I', 'tow.pre.mI']) self.connect('drive.rna_cm', ['rna_cg', 'tow.pre.mrho']) self.connect('drive.rna_mass', ['rna_mass', 'tow.pre.mass']) self.connect('rs.gust.V_gust', 'tow.wind.Uref') self.connect('wind_reference_height', ['tow.wind.zref', 'wind.zref']) # self.connect('wind_bottom_height', ['tow.wind.z0','tow.wave.z_surface', 'wind.z0']) # offshore self.connect('wind_bottom_height', ['tow.wind.z0', 'wind.z0']) self.connect('shearExp', ['tow.wind.shearExp']) # self.connect('morison_mass_coefficient','tow.cm') # offshore self.connect('yield_stress', 'tow.sigma_y') self.connect('max_taper_ratio', 'max_taper') self.connect('min_diameter_thickness_ratio', 'min_d_to_t') self.connect('rho', 'tow.windLoads.rho') self.connect('mu', 'tow.windLoads.mu') self.connect('wind_beta', 'tow.windLoads.beta') # Connections to TurbineConstraints self.connect('nBlades', ['blade_number', 'drive.number_of_blades']) self.connect('control_maxOmega', 'rotor_omega') self.connect('tow.post.structural_frequencies', 'tower_freq') # Connections to TurbineCostSE self.connect('mass_one_blade', 'blade_mass') self.connect('drive.mainBearing.mb_mass', 'main_bearing_mass') self.connect('total_blade_cost', 'blade_cost_external') # Connections to PlantFinanceSE self.connect('AEP', 'plantfinancese.turbine_aep') self.connect('turbine_cost_kW', 'plantfinancese.tcc_per_kW') self.connect('number_of_turbines', 'plantfinancese.turbine_number') self.connect('bos_costs', 'plantfinancese.bos_per_kW') self.connect('annual_opex', 'plantfinancese.opex_per_kW')
def setup(self): modeling_options = self.options["modeling_options"] opt_options = self.options["opt_options"] if modeling_options["flags"]["blade"] and modeling_options["flags"][ "nacelle"]: self.linear_solver = lbgs = om.LinearBlockGS() self.nonlinear_solver = nlbgs = om.NonlinearBlockGS() nlbgs.options["maxiter"] = 5 nlbgs.options["atol"] = 1e-2 nlbgs.options["rtol"] = 1e-8 nlbgs.options["iprint"] = 0 # Analysis components self.add_subsystem( "wt_init", WindTurbineOntologyOpenMDAO(modeling_options=modeling_options, opt_options=opt_options), promotes=["*"], ) if modeling_options["flags"]["blade"]: self.add_subsystem( "rotorse", RotorSE(modeling_options=modeling_options, opt_options=opt_options)) if modeling_options["flags"]["nacelle"]: self.add_subsystem( "drivese", DrivetrainSE(modeling_options=modeling_options, n_dlcs=1)) if modeling_options["flags"][ "tower"] and not modeling_options["flags"]["floating"]: self.add_subsystem("towerse", TowerSE(modeling_options=modeling_options)) if modeling_options["flags"]["floating"]: self.add_subsystem("floatingse", FloatingSE(modeling_options=modeling_options)) if modeling_options["flags"]["blade"] and modeling_options["flags"][ "tower"]: self.add_subsystem( "tcons", TurbineConstraints(modeling_options=modeling_options)) self.add_subsystem( "tcc", Turbine_CostsSE_2015( verbosity=modeling_options["General"]["verbosity"])) if modeling_options["flags"]["blade"]: n_span = modeling_options["WISDEM"]["RotorSE"]["n_span"] # Conncetions to ccblade self.connect("blade.pa.chord_param", "rotorse.chord") self.connect("blade.pa.twist_param", "rotorse.ccblade.twist") self.connect("blade.opt_var.s_opt_chord", "rotorse.ccblade.s_opt_chord") self.connect("blade.opt_var.s_opt_twist", "rotorse.ccblade.s_opt_twist") self.connect("blade.outer_shape_bem.s", "rotorse.s") self.connect("assembly.r_blade", "rotorse.r") self.connect("assembly.rotor_radius", "rotorse.Rtip") self.connect("hub.radius", "rotorse.Rhub") self.connect("blade.interp_airfoils.r_thick_interp", "rotorse.ccblade.rthick") self.connect("airfoils.aoa", "rotorse.airfoils_aoa") self.connect("airfoils.Re", "rotorse.airfoils_Re") self.connect("blade.interp_airfoils.cl_interp", "rotorse.airfoils_cl") self.connect("blade.interp_airfoils.cd_interp", "rotorse.airfoils_cd") self.connect("blade.interp_airfoils.cm_interp", "rotorse.airfoils_cm") self.connect("assembly.hub_height", "rotorse.hub_height") self.connect("hub.cone", "rotorse.precone") self.connect("nacelle.uptilt", "rotorse.tilt") self.connect("assembly.blade_ref_axis", "rotorse.precurve", src_indices=[(i, 0) for i in np.arange(n_span)]) self.connect("assembly.blade_ref_axis", "rotorse.precurveTip", src_indices=[(-1, 0)]) self.connect("assembly.blade_ref_axis", "rotorse.presweep", src_indices=[(i, 1) for i in np.arange(n_span)]) self.connect("assembly.blade_ref_axis", "rotorse.presweepTip", src_indices=[(-1, 1)]) if modeling_options["flags"]["control"]: self.connect("control.rated_pitch", "rotorse.pitch") self.connect("control.rated_TSR", "rotorse.tsr") self.connect("env.rho_air", "rotorse.rho_air") self.connect("env.mu_air", "rotorse.mu_air") self.connect("env.shear_exp", "rotorse.shearExp") self.connect( "configuration.n_blades", [ "rotorse.nBlades", "rotorse.re.precomp.n_blades", "rotorse.rs.constr.blade_number" ], ) self.connect("configuration.ws_class", "rotorse.wt_class.turbine_class") self.connect("blade.ps.layer_thickness_param", "rotorse.re.precomp.layer_thickness") # Connections to rotor elastic and frequency analysis self.connect("nacelle.uptilt", "rotorse.re.precomp.uptilt") self.connect("blade.outer_shape_bem.pitch_axis", "rotorse.re.pitch_axis") self.connect("blade.interp_airfoils.coord_xy_interp", "rotorse.re.coord_xy_interp") self.connect("blade.internal_structure_2d_fem.layer_start_nd", "rotorse.re.precomp.layer_start_nd") self.connect("blade.internal_structure_2d_fem.layer_end_nd", "rotorse.re.precomp.layer_end_nd") self.connect("blade.internal_structure_2d_fem.layer_web", "rotorse.re.precomp.layer_web") self.connect("blade.internal_structure_2d_fem.definition_layer", "rotorse.re.precomp.definition_layer") self.connect("blade.internal_structure_2d_fem.web_start_nd", "rotorse.re.precomp.web_start_nd") self.connect("blade.internal_structure_2d_fem.web_end_nd", "rotorse.re.precomp.web_end_nd") self.connect("blade.internal_structure_2d_fem.joint_position", "rotorse.re.precomp.joint_position") self.connect("blade.internal_structure_2d_fem.joint_mass", "rotorse.re.precomp.joint_mass") self.connect("blade.internal_structure_2d_fem.joint_cost", "rotorse.re.precomp.joint_cost") self.connect("materials.name", "rotorse.re.precomp.mat_name") self.connect("materials.orth", "rotorse.re.precomp.orth") self.connect("materials.E", "rotorse.re.precomp.E") self.connect("materials.G", "rotorse.re.precomp.G") self.connect("materials.nu", "rotorse.re.precomp.nu") self.connect("materials.rho", "rotorse.re.precomp.rho") self.connect("materials.component_id", "rotorse.re.precomp.component_id") self.connect("materials.unit_cost", "rotorse.re.precomp.unit_cost") self.connect("materials.waste", "rotorse.re.precomp.waste") self.connect("materials.rho_fiber", "rotorse.re.precomp.rho_fiber") self.connect("materials.rho_area_dry", "rotorse.re.precomp.rho_area_dry") self.connect("materials.ply_t", "rotorse.re.precomp.ply_t") self.connect("materials.fvf", "rotorse.re.precomp.fvf") self.connect("materials.fwf", "rotorse.re.precomp.fwf") self.connect("materials.roll_mass", "rotorse.re.precomp.roll_mass") # Conncetions to rail transport module if opt_options["constraints"]["blade"]["rail_transport"]["flag"]: self.connect("assembly.blade_ref_axis", "rotorse.re.rail.blade_ref_axis") # Connections from blade struct parametrization to rotor load anlysis self.connect("blade.opt_var.s_opt_spar_cap_ss", "rotorse.rs.constr.s_opt_spar_cap_ss") self.connect("blade.opt_var.s_opt_spar_cap_ps", "rotorse.rs.constr.s_opt_spar_cap_ps") # Connections to RotorPower self.connect("control.V_in", "rotorse.rp.v_min") self.connect("control.V_out", "rotorse.rp.v_max") self.connect("configuration.rated_power", "rotorse.rp.rated_power") self.connect("control.minOmega", "rotorse.rp.omega_min") self.connect("control.maxOmega", "rotorse.rp.omega_max") self.connect("control.max_TS", "rotorse.rp.control_maxTS") self.connect("configuration.gearbox_type", "rotorse.rp.drivetrainType") self.connect("nacelle.gearbox_efficiency", "rotorse.rp.powercurve.gearbox_efficiency") if modeling_options["flags"]["nacelle"]: self.connect("drivese.lss_rpm", "rotorse.rp.powercurve.lss_rpm") self.connect("drivese.generator_efficiency", "rotorse.rp.powercurve.generator_efficiency") self.connect("env.weibull_k", "rotorse.rp.cdf.k") self.connect("configuration.turb_class", "rotorse.rp.gust.turbulence_class") # Connections to RotorStructure self.connect("blade.internal_structure_2d_fem.d_f", "rotorse.rs.brs.d_f") self.connect("blade.internal_structure_2d_fem.sigma_max", "rotorse.rs.brs.sigma_max") self.connect("blade.pa.chord_param", "rotorse.rs.brs.rootD", src_indices=[0]) self.connect("blade.ps.layer_thickness_param", "rotorse.rs.brs.layer_thickness") self.connect("blade.internal_structure_2d_fem.layer_start_nd", "rotorse.rs.brs.layer_start_nd") self.connect("blade.internal_structure_2d_fem.layer_end_nd", "rotorse.rs.brs.layer_end_nd") # Connections to DriveSE if modeling_options["flags"]["nacelle"]: self.connect("hub.diameter", "drivese.hub_diameter") self.connect("hub.hub_in2out_circ", "drivese.hub_in2out_circ") self.connect("hub.flange_t2shell_t", "drivese.flange_t2shell_t") self.connect("hub.flange_OD2hub_D", "drivese.flange_OD2hub_D") self.connect("hub.flange_ID2flange_OD", "drivese.flange_ID2flange_OD") self.connect("hub.hub_stress_concentration", "drivese.hub_stress_concentration") self.connect("hub.n_front_brackets", "drivese.n_front_brackets") self.connect("hub.n_rear_brackets", "drivese.n_rear_brackets") self.connect("hub.clearance_hub_spinner", "drivese.clearance_hub_spinner") self.connect("hub.spin_hole_incr", "drivese.spin_hole_incr") self.connect("hub.pitch_system_scaling_factor", "drivese.pitch_system_scaling_factor") self.connect("hub.spinner_gust_ws", "drivese.spinner_gust_ws") self.connect("configuration.n_blades", "drivese.n_blades") self.connect("assembly.rotor_diameter", "drivese.rotor_diameter") self.connect("configuration.upwind", "drivese.upwind") self.connect("control.minOmega", "drivese.minimum_rpm") self.connect("rotorse.rp.powercurve.rated_Omega", "drivese.rated_rpm") self.connect("rotorse.rp.powercurve.rated_Q", "drivese.rated_torque") self.connect("configuration.rated_power", "drivese.machine_rating") if modeling_options["flags"]["tower"]: self.connect("tower.diameter", "drivese.D_top", src_indices=[-1]) self.connect("rotorse.rs.aero_hub_loads.Fhub", "drivese.F_hub") self.connect("rotorse.rs.aero_hub_loads.Mhub", "drivese.M_hub") self.connect("rotorse.rs.frame.root_M", "drivese.pitch_system.BRFM", src_indices=[1]) self.connect("blade.pa.chord_param", "drivese.blade_root_diameter", src_indices=[0]) self.connect("rotorse.re.precomp.blade_mass", "drivese.blade_mass") self.connect("rotorse.re.precomp.mass_all_blades", "drivese.blades_mass") self.connect("rotorse.re.precomp.I_all_blades", "drivese.blades_I") self.connect("nacelle.distance_hub2mb", "drivese.L_h1") self.connect("nacelle.distance_mb2mb", "drivese.L_12") self.connect("nacelle.L_generator", "drivese.L_generator") self.connect("nacelle.overhang", "drivese.overhang") self.connect("nacelle.distance_tt_hub", "drivese.drive_height") self.connect("nacelle.uptilt", "drivese.tilt") self.connect("nacelle.gear_ratio", "drivese.gear_ratio") self.connect("nacelle.damping_ratio", "drivese.damping_ratio") self.connect("nacelle.mb1Type", "drivese.bear1.bearing_type") self.connect("nacelle.mb2Type", "drivese.bear2.bearing_type") self.connect("nacelle.lss_diameter", "drivese.lss_diameter") self.connect("nacelle.lss_wall_thickness", "drivese.lss_wall_thickness") if modeling_options["WISDEM"]["DriveSE"]["direct"]: self.connect("nacelle.nose_diameter", "drivese.bear1.D_shaft", src_indices=[0]) self.connect("nacelle.nose_diameter", "drivese.bear2.D_shaft", src_indices=[-1]) else: self.connect("nacelle.lss_diameter", "drivese.bear1.D_shaft", src_indices=[0]) self.connect("nacelle.lss_diameter", "drivese.bear2.D_shaft", src_indices=[-1]) self.connect("nacelle.uptower", "drivese.uptower") self.connect("nacelle.brake_mass_user", "drivese.brake_mass_user") self.connect("nacelle.hvac_mass_coeff", "drivese.hvac_mass_coeff") self.connect("nacelle.converter_mass_user", "drivese.converter_mass_user") self.connect("nacelle.transformer_mass_user", "drivese.transformer_mass_user") if modeling_options["WISDEM"]["DriveSE"]["direct"]: self.connect("nacelle.nose_diameter", "drivese.nose_diameter") # only used in direct self.connect( "nacelle.nose_wall_thickness", "drivese.nose_wall_thickness") # only used in direct self.connect( "nacelle.bedplate_wall_thickness", "drivese.bedplate_wall_thickness") # only used in direct else: self.connect("nacelle.hss_length", "drivese.L_hss") # only used in geared self.connect("nacelle.hss_diameter", "drivese.hss_diameter") # only used in geared self.connect( "nacelle.hss_wall_thickness", "drivese.hss_wall_thickness") # only used in geared self.connect("nacelle.hss_material", "drivese.hss_material") self.connect("nacelle.planet_numbers", "drivese.planet_numbers") # only used in geared self.connect( "nacelle.gear_configuration", "drivese.gear_configuration") # only used in geared self.connect( "nacelle.bedplate_flange_width", "drivese.bedplate_flange_width") # only used in geared self.connect( "nacelle.bedplate_flange_thickness", "drivese.bedplate_flange_thickness") # only used in geared self.connect( "nacelle.bedplate_web_thickness", "drivese.bedplate_web_thickness") # only used in geared self.connect("hub.hub_material", "drivese.hub_material") self.connect("hub.spinner_material", "drivese.spinner_material") self.connect("nacelle.lss_material", "drivese.lss_material") self.connect("nacelle.bedplate_material", "drivese.bedplate_material") self.connect("materials.name", "drivese.material_names") self.connect("materials.E", "drivese.E_mat") self.connect("materials.G", "drivese.G_mat") self.connect("materials.rho", "drivese.rho_mat") self.connect("materials.sigma_y", "drivese.sigma_y_mat") self.connect("materials.Xt", "drivese.Xt_mat") self.connect("materials.unit_cost", "drivese.unit_cost_mat") if modeling_options["flags"]["generator"]: self.connect("generator.B_r", "drivese.generator.B_r") self.connect("generator.P_Fe0e", "drivese.generator.P_Fe0e") self.connect("generator.P_Fe0h", "drivese.generator.P_Fe0h") self.connect("generator.S_N", "drivese.generator.S_N") self.connect("generator.alpha_p", "drivese.generator.alpha_p") self.connect("generator.b_r_tau_r", "drivese.generator.b_r_tau_r") self.connect("generator.b_ro", "drivese.generator.b_ro") self.connect("generator.b_s_tau_s", "drivese.generator.b_s_tau_s") self.connect("generator.b_so", "drivese.generator.b_so") self.connect("generator.cofi", "drivese.generator.cofi") self.connect("generator.freq", "drivese.generator.freq") self.connect("generator.h_i", "drivese.generator.h_i") self.connect("generator.h_sy0", "drivese.generator.h_sy0") self.connect("generator.h_w", "drivese.generator.h_w") self.connect("generator.k_fes", "drivese.generator.k_fes") self.connect("generator.k_fillr", "drivese.generator.k_fillr") self.connect("generator.k_fills", "drivese.generator.k_fills") self.connect("generator.k_s", "drivese.generator.k_s") self.connect("generator.m", "drivese.generator.m") self.connect("generator.mu_0", "drivese.generator.mu_0") self.connect("generator.mu_r", "drivese.generator.mu_r") self.connect("generator.p", "drivese.generator.p") self.connect("generator.phi", "drivese.generator.phi") self.connect("generator.q1", "drivese.generator.q1") self.connect("generator.q2", "drivese.generator.q2") self.connect("generator.ratio_mw2pp", "drivese.generator.ratio_mw2pp") self.connect("generator.resist_Cu", "drivese.generator.resist_Cu") self.connect("generator.sigma", "drivese.generator.sigma") self.connect("generator.y_tau_p", "drivese.generator.y_tau_p") self.connect("generator.y_tau_pr", "drivese.generator.y_tau_pr") self.connect("generator.I_0", "drivese.generator.I_0") self.connect("generator.d_r", "drivese.generator.d_r") self.connect("generator.h_m", "drivese.generator.h_m") self.connect("generator.h_0", "drivese.generator.h_0") self.connect("generator.h_s", "drivese.generator.h_s") self.connect("generator.len_s", "drivese.generator.len_s") self.connect("generator.n_r", "drivese.generator.n_r") self.connect("generator.rad_ag", "drivese.generator.rad_ag") self.connect("generator.t_wr", "drivese.generator.t_wr") self.connect("generator.n_s", "drivese.generator.n_s") self.connect("generator.b_st", "drivese.generator.b_st") self.connect("generator.d_s", "drivese.generator.d_s") self.connect("generator.t_ws", "drivese.generator.t_ws") self.connect("generator.rho_Copper", "drivese.generator.rho_Copper") self.connect("generator.rho_Fe", "drivese.generator.rho_Fe") self.connect("generator.rho_Fes", "drivese.generator.rho_Fes") self.connect("generator.rho_PM", "drivese.generator.rho_PM") self.connect("generator.C_Cu", "drivese.generator.C_Cu") self.connect("generator.C_Fe", "drivese.generator.C_Fe") self.connect("generator.C_Fes", "drivese.generator.C_Fes") self.connect("generator.C_PM", "drivese.generator.C_PM") if modeling_options["WISDEM"]["GeneratorSE"]["type"] in [ "pmsg_outer" ]: self.connect("generator.N_c", "drivese.generator.N_c") self.connect("generator.b", "drivese.generator.b") self.connect("generator.c", "drivese.generator.c") self.connect("generator.E_p", "drivese.generator.E_p") self.connect("generator.h_yr", "drivese.generator.h_yr") self.connect("generator.h_ys", "drivese.generator.h_ys") self.connect("generator.h_sr", "drivese.generator.h_sr") self.connect("generator.h_ss", "drivese.generator.h_ss") self.connect("generator.t_r", "drivese.generator.t_r") self.connect("generator.t_s", "drivese.generator.t_s") self.connect("generator.u_allow_pcent", "drivese.generator.u_allow_pcent") self.connect("generator.y_allow_pcent", "drivese.generator.y_allow_pcent") self.connect("generator.z_allow_deg", "drivese.generator.z_allow_deg") self.connect("generator.B_tmax", "drivese.generator.B_tmax") self.connect("rotorse.rp.powercurve.rated_mech", "drivese.generator.P_mech") if modeling_options["WISDEM"]["GeneratorSE"]["type"] in [ "eesg", "pmsg_arms", "pmsg_disc" ]: self.connect("generator.tau_p", "drivese.generator.tau_p") self.connect("generator.h_ys", "drivese.generator.h_ys") self.connect("generator.h_yr", "drivese.generator.h_yr") self.connect("generator.b_arm", "drivese.generator.b_arm") elif modeling_options["WISDEM"]["GeneratorSE"]["type"] in [ "scig", "dfig" ]: self.connect("generator.B_symax", "drivese.generator.B_symax") self.connect("generator.S_Nmax", "drivese.generator.S_Nmax") if modeling_options["WISDEM"]["DriveSE"]["direct"]: self.connect("nacelle.nose_diameter", "drivese.generator.D_nose", src_indices=[-1]) self.connect("nacelle.lss_diameter", "drivese.generator.D_shaft", src_indices=[0]) else: self.connect("nacelle.hss_diameter", "drivese.generator.D_shaft", src_indices=[-1]) else: self.connect("generator.generator_radius_user", "drivese.generator_radius_user") self.connect("generator.generator_mass_user", "drivese.generator_mass_user") self.connect("generator.generator_efficiency_user", "drivese.generator_efficiency_user") # Connections to TowerSE if modeling_options["flags"][ "tower"] and not modeling_options["flags"]["floating"]: if modeling_options["flags"]["nacelle"]: self.connect("drivese.base_F", "towerse.pre.rna_F") self.connect("drivese.base_M", "towerse.pre.rna_M") self.connect("drivese.rna_I_TT", "towerse.rna_I") self.connect("drivese.rna_cm", "towerse.rna_cg") self.connect("drivese.rna_mass", "towerse.rna_mass") if modeling_options["flags"]["blade"]: self.connect("rotorse.rp.gust.V_gust", "towerse.wind.Uref") self.connect("assembly.hub_height", "towerse.wind_reference_height") self.connect("assembly.hub_height", "towerse.hub_height") self.connect("env.rho_air", "towerse.rho_air") self.connect("env.mu_air", "towerse.mu_air") self.connect("env.shear_exp", "towerse.shearExp") self.connect("tower_grid.foundation_height", "towerse.tower_foundation_height") self.connect("tower.diameter", "towerse.tower_outer_diameter_in") self.connect("tower_grid.height", "towerse.tower_height") self.connect("tower_grid.s", "towerse.tower_s") self.connect("tower.layer_thickness", "towerse.tower_layer_thickness") self.connect("tower.outfitting_factor", "towerse.tower_outfitting_factor") self.connect("tower.layer_mat", "towerse.tower_layer_materials") self.connect("materials.name", "towerse.material_names") self.connect("materials.E", "towerse.E_mat") self.connect("materials.G", "towerse.G_mat") self.connect("materials.rho", "towerse.rho_mat") self.connect("materials.sigma_y", "towerse.sigma_y_mat") self.connect("materials.unit_cost", "towerse.unit_cost_mat") self.connect("costs.labor_rate", "towerse.labor_cost_rate") self.connect("costs.painting_rate", "towerse.painting_cost_rate") if modeling_options["flags"]["monopile"]: self.connect("env.water_depth", "towerse.water_depth") self.connect("env.rho_water", "towerse.rho_water") self.connect("env.mu_water", "towerse.mu_water") if modeling_options["WISDEM"]["TowerSE"]["soil_springs"]: self.connect("env.G_soil", "towerse.G_soil") self.connect("env.nu_soil", "towerse.nu_soil") self.connect("env.Hsig_wave", "towerse.Hsig_wave") self.connect("env.Tsig_wave", "towerse.Tsig_wave") self.connect("monopile.diameter", "towerse.monopile_outer_diameter_in") self.connect("monopile.foundation_height", "towerse.monopile_foundation_height") self.connect("monopile.height", "towerse.monopile_height") self.connect("monopile.s", "towerse.monopile_s") self.connect("monopile.layer_thickness", "towerse.monopile_layer_thickness") self.connect("monopile.layer_mat", "towerse.monopile_layer_materials") self.connect("monopile.outfitting_factor", "towerse.monopile_outfitting_factor") self.connect("monopile.transition_piece_cost", "towerse.transition_piece_cost") self.connect("monopile.transition_piece_mass", "towerse.transition_piece_mass") self.connect("monopile.gravity_foundation_mass", "towerse.gravity_foundation_mass") if modeling_options["flags"]["floating"]: self.connect("env.rho_water", "floatingse.rho_water") self.connect("env.water_depth", "floatingse.water_depth") self.connect("env.mu_water", "floatingse.mu_water") self.connect("env.Hsig_wave", "floatingse.Hsig_wave") self.connect("env.Tsig_wave", "floatingse.Tsig_wave") self.connect("env.rho_air", "floatingse.rho_air") self.connect("env.mu_air", "floatingse.mu_air") self.connect("env.shear_exp", "floatingse.shearExp") self.connect("assembly.hub_height", "floatingse.zref") if modeling_options["flags"]["blade"]: self.connect("rotorse.rp.gust.V_gust", "floatingse.Uref") self.connect("materials.name", "floatingse.material_names") self.connect("materials.E", "floatingse.E_mat") self.connect("materials.G", "floatingse.G_mat") self.connect("materials.rho", "floatingse.rho_mat") self.connect("materials.sigma_y", "floatingse.sigma_y_mat") self.connect("materials.unit_cost", "floatingse.unit_cost_mat") self.connect("costs.labor_rate", "floatingse.labor_cost_rate") self.connect("costs.painting_rate", "floatingse.painting_cost_rate") self.connect("tower.diameter", "floatingse.tower.outer_diameter_in") self.connect("tower_grid.s", "floatingse.tower.s") self.connect("tower.layer_thickness", "floatingse.tower.layer_thickness") self.connect("tower.outfitting_factor", "floatingse.tower.outfitting_factor_in") self.connect("tower.layer_mat", "floatingse.tower.layer_materials") self.connect("floating.transition_node", "floatingse.transition_node") if modeling_options["flags"]["tower"]: self.connect("tower_grid.height", "floatingse.tower_height") if modeling_options["flags"]["nacelle"]: self.connect("drivese.base_F", "floatingse.rna_F") self.connect("drivese.base_M", "floatingse.rna_M") self.connect("drivese.rna_I_TT", "floatingse.rna_I") self.connect("drivese.rna_cm", "floatingse.rna_cg") self.connect("drivese.rna_mass", "floatingse.rna_mass") # Individual member connections for k, kname in enumerate( modeling_options["floating"]["members"]["name"]): idx = modeling_options["floating"]["members"]["name2idx"][ kname] self.connect(f"floating.memgrp{idx}.outer_diameter", f"floatingse.member{k}.outer_diameter_in") self.connect(f"floating.memgrp{idx}.outfitting_factor", f"floatingse.member{k}.outfitting_factor_in") for var in [ "s", "layer_thickness", "layer_materials", "bulkhead_grid", "bulkhead_thickness", "ballast_grid", "ballast_volume", "ballast_materials", "grid_axial_joints", "ring_stiffener_web_height", "ring_stiffener_web_thickness", "ring_stiffener_flange_width", "ring_stiffener_flange_thickness", "ring_stiffener_spacing", "axial_stiffener_web_height", "axial_stiffener_web_thickness", "axial_stiffener_flange_width", "axial_stiffener_flange_thickness", "axial_stiffener_spacing", ]: self.connect(f"floating.memgrp{idx}.{var}", f"floatingse.member{k}.{var}") for var in ["joint1", "joint2", "s_ghost1", "s_ghost2"]: self.connect(f"floating.member_{kname}:{var}", f"floatingse.member{k}.{var}") # Mooring connections self.connect("mooring.unstretched_length", "floatingse.line_length", src_indices=[0]) for var in [ "fairlead", "fairlead_radius", "anchor_radius", "anchor_cost", "line_diameter", "line_mass_density_coeff", "line_stiffness_coeff", "line_breaking_load_coeff", "line_cost_rate_coeff", ]: self.connect("mooring." + var, "floatingse." + var, src_indices=[0]) # Connections to turbine constraints if modeling_options["flags"]["blade"] and modeling_options["flags"][ "tower"]: self.connect("configuration.rotor_orientation", "tcons.rotor_orientation") self.connect("rotorse.rs.tip_pos.tip_deflection", "tcons.tip_deflection") self.connect("assembly.rotor_radius", "tcons.Rtip") self.connect("assembly.blade_ref_axis", "tcons.ref_axis_blade") self.connect("hub.cone", "tcons.precone") self.connect("nacelle.uptilt", "tcons.tilt") self.connect("nacelle.overhang", "tcons.overhang") self.connect("assembly.tower_ref_axis", "tcons.ref_axis_tower") self.connect("tower.diameter", "tcons.d_full") if modeling_options["flags"]["floating"]: self.connect("floatingse.tower_freqs", "tcons.tower_freq", src_indices=[0]) else: self.connect("towerse.tower.structural_frequencies", "tcons.tower_freq", src_indices=[0]) self.connect("configuration.n_blades", "tcons.blade_number") self.connect("rotorse.rp.powercurve.rated_Omega", "tcons.rated_Omega") # Connections to turbine capital cost self.connect("configuration.n_blades", "tcc.blade_number") self.connect("configuration.rated_power", "tcc.machine_rating") if modeling_options["flags"]["blade"]: self.connect("rotorse.re.precomp.blade_mass", "tcc.blade_mass") self.connect("rotorse.re.precomp.total_blade_cost", "tcc.blade_cost_external") if modeling_options["flags"]["nacelle"]: self.connect("drivese.hub_mass", "tcc.hub_mass") self.connect("drivese.pitch_mass", "tcc.pitch_system_mass") self.connect("drivese.spinner_mass", "tcc.spinner_mass") self.connect("drivese.lss_mass", "tcc.lss_mass") self.connect("drivese.mean_bearing_mass", "tcc.main_bearing_mass") self.connect("drivese.gearbox_mass", "tcc.gearbox_mass") self.connect("drivese.hss_mass", "tcc.hss_mass") self.connect("drivese.brake_mass", "tcc.brake_mass") self.connect("drivese.generator_mass", "tcc.generator_mass") self.connect("drivese.total_bedplate_mass", "tcc.bedplate_mass") self.connect("drivese.yaw_mass", "tcc.yaw_mass") self.connect("drivese.converter_mass", "tcc.converter_mass") self.connect("drivese.transformer_mass", "tcc.transformer_mass") self.connect("drivese.hvac_mass", "tcc.hvac_mass") self.connect("drivese.cover_mass", "tcc.cover_mass") self.connect("drivese.platform_mass", "tcc.platforms_mass") if modeling_options["flags"]["generator"]: self.connect("drivese.generator_cost", "tcc.generator_cost_external") if modeling_options["flags"][ "tower"] and not modeling_options["flags"]["floating"]: self.connect("towerse.structural_mass", "tcc.tower_mass") self.connect("towerse.structural_cost", "tcc.tower_cost_external") elif modeling_options["flags"]["floating"]: self.connect("floatingse.tower_mass", "tcc.tower_mass") self.connect("floatingse.tower_cost", "tcc.tower_cost_external") self.connect("costs.blade_mass_cost_coeff", "tcc.blade_mass_cost_coeff") self.connect("costs.hub_mass_cost_coeff", "tcc.hub_mass_cost_coeff") self.connect("costs.pitch_system_mass_cost_coeff", "tcc.pitch_system_mass_cost_coeff") self.connect("costs.spinner_mass_cost_coeff", "tcc.spinner_mass_cost_coeff") self.connect("costs.lss_mass_cost_coeff", "tcc.lss_mass_cost_coeff") self.connect("costs.bearing_mass_cost_coeff", "tcc.bearing_mass_cost_coeff") self.connect("costs.gearbox_mass_cost_coeff", "tcc.gearbox_mass_cost_coeff") self.connect("costs.hss_mass_cost_coeff", "tcc.hss_mass_cost_coeff") self.connect("costs.generator_mass_cost_coeff", "tcc.generator_mass_cost_coeff") self.connect("costs.bedplate_mass_cost_coeff", "tcc.bedplate_mass_cost_coeff") self.connect("costs.yaw_mass_cost_coeff", "tcc.yaw_mass_cost_coeff") self.connect("costs.converter_mass_cost_coeff", "tcc.converter_mass_cost_coeff") self.connect("costs.transformer_mass_cost_coeff", "tcc.transformer_mass_cost_coeff") self.connect("costs.hvac_mass_cost_coeff", "tcc.hvac_mass_cost_coeff") self.connect("costs.cover_mass_cost_coeff", "tcc.cover_mass_cost_coeff") self.connect("costs.elec_connec_machine_rating_cost_coeff", "tcc.elec_connec_machine_rating_cost_coeff") self.connect("costs.platforms_mass_cost_coeff", "tcc.platforms_mass_cost_coeff") self.connect("costs.tower_mass_cost_coeff", "tcc.tower_mass_cost_coeff") self.connect("costs.controls_machine_rating_cost_coeff", "tcc.controls_machine_rating_cost_coeff") self.connect("costs.crane_cost", "tcc.crane_cost")