diff --git a/rosco/controller/src/ControllerBlocks.f90 b/rosco/controller/src/ControllerBlocks.f90 index be9e6400..986322c2 100644 --- a/rosco/controller/src/ControllerBlocks.f90 +++ b/rosco/controller/src/ControllerBlocks.f90 @@ -490,7 +490,7 @@ SUBROUTINE RefSpeedExclusion(LocalVar, CntrPar, objInst, DebugVar) LocalVar%TRA_LastRefSpd = CntrPar%TRA_ExclSpeed - CntrPar%TRA_ExclBand / 2 ENDIF ELSE - LocalVar%TRA_LastRefSpd = LocalVar%VS_RefSpd + LocalVar%TRA_LastRefSpd = VS_RefSpeed_LSS END IF END IF diff --git a/rosco/controller/src/ReadSetParameters.f90 b/rosco/controller/src/ReadSetParameters.f90 index 131b6581..b76ef5f5 100644 --- a/rosco/controller/src/ReadSetParameters.f90 +++ b/rosco/controller/src/ReadSetParameters.f90 @@ -229,7 +229,7 @@ SUBROUTINE SetParameters(avrSWAP, accINFILE, size_avcMSG, CntrPar, LocalVar, obj ENDIF LocalVar%VS_LastGenTrq = LocalVar%GenTq LocalVar%VS_MaxTq = CntrPar%VS_MaxTq - LocalVar%VS_GenPwr = LocalVar%GenTq * LocalVar%GenSpeed + LocalVar%VS_GenPwr = LocalVar%GenTq * LocalVar%GenSpeed * CntrPar%VS_GenEff/100.0 ! Initialize variables LocalVar%CC_DesiredL = 0 @@ -1499,6 +1499,11 @@ SUBROUTINE CheckInputs(LocalVar, CntrPar, avrSWAP, ErrVar, size_avcMSG) ErrVar%ErrMsg = 'Pitch offset fault enabled (PF_Mode = 1), but Ptch_Cntrl in ServoDyn has a value of 0. Set it to 1 for individual pitch control.' ENDIF + IF (NINT(avrSWAP(28)) == 0 .AND. (CntrPar%AWC_Mode > 1)) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'AWC enabled, but Ptch_Cntrl in ServoDyn has a value of 0. Set it to 1 for individual pitch control.' + ENDIF + ! DT IF (LocalVar%DT <= 0.0) THEN ErrVar%aviFAIL = -1 diff --git a/rosco/toolbox/controller.py b/rosco/toolbox/controller.py index f26c67d0..bce35b2e 100644 --- a/rosco/toolbox/controller.py +++ b/rosco/toolbox/controller.py @@ -325,8 +325,14 @@ def tune_controller(self, turbine): self.vs_gain_schedule.second_order_PI(self.zeta_vs, self.omega_vs,A_vs,B_tau[0:len(v_below_rated)],linearize=False,v=v_below_rated) # -- Find K for Komega_g^2 -- - self.vs_rgn2K = (pi*rho*R**5.0 * turbine.Cp.max * turbine.GBoxEff/100 * turbine.GenEff/100) / \ - (2.0 * turbine.Cp.TSR_opt**3 * Ng**3) * self.controller_params['rgn2k_factor'] + # Careful handling of different efficiencies + # P_lss = 1/2 * Cp * rho * pi * R^5 / (TSR^3 * Ng^3) + # P_hss = GBoxEff * P_lss = tau_gen * omega_gen = K * omega_gen^3 + # P_gen = GenEff * P_hss + # Generator efficiency is not included in K here, but gearbox efficiency is + # Note that this differs from the + self.vs_rgn2K = (pi*rho*R**5.0 * turbine.Cp.max * turbine.GBoxEff/100) / (2.0 * turbine.Cp.TSR_opt**3 * Ng**3) * self.controller_params['rgn2k_factor'] + self.vs_refspd = min(turbine.TSR_operational * turbine.v_rated/R, turbine.rated_rotor_speed) * Ng # -- Define some setpoints -- diff --git a/rosco/toolbox/sim.py b/rosco/toolbox/sim.py index 2c845ca7..1846af21 100644 --- a/rosco/toolbox/sim.py +++ b/rosco/toolbox/sim.py @@ -113,8 +113,7 @@ def sim_ws_series(self, t_array, ws_array, rotor_rpm_init=10, init_pitch=0.0, # Update the turbine state # -- 1DOF model: rotor speed and generator speed (scaled by Ng) aero_torque[i] = 0.5 * self.turbine.rho * (np.pi * R**3) * (cp/tsr) * ws**2 - rot_speed[i] = rot_speed[i-1] + (dt/self.turbine.J)*(aero_torque[i] - * self.turbine.GenEff/100 - self.turbine.Ng * gen_torque[i-1]) + rot_speed[i] = rot_speed[i-1] + (dt/self.turbine.J)*(aero_torque[i] - self.turbine.Ng * gen_torque[i-1] / (self.turbine.GBoxEff/100)) gen_speed[i] = rot_speed[i] * self.turbine.Ng # -- Simple nacelle model nac_yawerr[i] = wd - nac_yaw[i-1] diff --git a/rosco/toolbox/tune.py b/rosco/toolbox/tune.py index fa121247..dae685dd 100644 --- a/rosco/toolbox/tune.py +++ b/rosco/toolbox/tune.py @@ -112,6 +112,10 @@ def update_discon_version(file,tuning_yaml,new_discon_filename): if original_vt['F_NotchType'] == 2 or original_vt['F_NotchType'] == 3: new_discon['F_TwrTopNotch_N'] = 1 new_discon['F_TwrTopNotch_Ind'] = [1] + + # OL blade pitch changed to array + if ('Ind_BldPitch' in original_vt) and (not hasattr(original_vt['Ind_BldPitch'],'__len__')): + new_discon['Ind_BldPitch'] = [original_vt['Ind_BldPitch']] * 3 # Make the DISCON