diff --git a/Examples/04_simple_sim.py b/Examples/04_simple_sim.py index 5c022733..46ff3dea 100644 --- a/Examples/04_simple_sim.py +++ b/Examples/04_simple_sim.py @@ -112,3 +112,6 @@ def main(): if __name__ == "__main__": main() +if __name__=='__main__': + main() + diff --git a/rosco/controller/rosco_registry/rosco_types.yaml b/rosco/controller/rosco_registry/rosco_types.yaml index d1a2ff21..e0bd5dc3 100644 --- a/rosco/controller/rosco_registry/rosco_types.yaml +++ b/rosco/controller/rosco_registry/rosco_types.yaml @@ -976,6 +976,10 @@ LocalVariables: iStatus: <<: *integer description: Initialization status + AlreadyInitialized: + <<: *integer + description: Has ROSCO already been initialized (0-no, 1-yes) + equals: 0 RestartWSE: <<: *integer description: Restart WSE flag, 0 - restart, 1- not, to mirror iStatus diff --git a/rosco/controller/rosco_registry/write_registry.py b/rosco/controller/rosco_registry/write_registry.py index 1c07fc98..acaf63cb 100644 --- a/rosco/controller/rosco_registry/write_registry.py +++ b/rosco/controller/rosco_registry/write_registry.py @@ -39,8 +39,8 @@ def write_types(yfile): for attype in reg[toptype].keys(): f90type = read_type(reg[toptype][attype]) atstr = check_size(reg[toptype], attype) - if reg[toptype][attype]['equals']: - atstr += ' = ' + reg[toptype][attype]['equals'] + if reg[toptype][attype]['equals'] is not None: + atstr += ' = ' + str(reg[toptype][attype]['equals']) file.write(' {:<25s} :: {:<25s} ! {}\n'.format(f90type, atstr, reg[toptype][attype]['description'])) file.write('END TYPE {}\n'.format(toptype)) file.write('\n') diff --git a/rosco/controller/src/DISCON.F90 b/rosco/controller/src/DISCON.F90 index 4787e19f..e95c1580 100644 --- a/rosco/controller/src/DISCON.F90 +++ b/rosco/controller/src/DISCON.F90 @@ -78,10 +78,12 @@ SUBROUTINE DISCON(avrSWAP, aviFAIL, accINFILE, avcOUTNAME, avcMSG) BIND (C, NAME END IF ! Read avrSWAP array into derived types/variables -CALL ReadAvrSWAP(avrSWAP, LocalVar, CntrPar) +CALL ReadAvrSWAP(avrSWAP, LocalVar, CntrPar, ErrVar) ! Set Control Parameters -CALL SetParameters(avrSWAP, accINFILE, SIZE(avcMSG), CntrPar, LocalVar, objInst, PerfData, RootName, ErrVar) +IF (ErrVar%aviFAIL >= 0) THEN + CALL SetParameters(avrSWAP, accINFILE, SIZE(avcMSG), CntrPar, LocalVar, objInst, PerfData, RootName, ErrVar) +ENDIF ! Call external controller, if desired IF (CntrPar%Ext_Mode > 0 .AND. ErrVar%aviFAIL >= 0) THEN diff --git a/rosco/controller/src/ROSCO_IO.f90 b/rosco/controller/src/ROSCO_IO.f90 index 33b2bddc..5deb4574 100644 --- a/rosco/controller/src/ROSCO_IO.f90 +++ b/rosco/controller/src/ROSCO_IO.f90 @@ -37,6 +37,7 @@ SUBROUTINE WriteRestartFile(LocalVar, CntrPar, ErrVar, objInst, RootName, size_a ELSE WRITE( Un, IOSTAT=ErrStat) LocalVar%iStatus + WRITE( Un, IOSTAT=ErrStat) LocalVar%AlreadyInitialized WRITE( Un, IOSTAT=ErrStat) LocalVar%RestartWSE WRITE( Un, IOSTAT=ErrStat) LocalVar%Time WRITE( Un, IOSTAT=ErrStat) LocalVar%DT @@ -354,6 +355,7 @@ SUBROUTINE ReadRestartFile(avrSWAP, LocalVar, CntrPar, objInst, PerfData, RootNa ELSE READ( Un, IOSTAT=ErrStat) LocalVar%iStatus + READ( Un, IOSTAT=ErrStat) LocalVar%AlreadyInitialized READ( Un, IOSTAT=ErrStat) LocalVar%RestartWSE READ( Un, IOSTAT=ErrStat) LocalVar%Time READ( Un, IOSTAT=ErrStat) LocalVar%DT @@ -722,176 +724,178 @@ SUBROUTINE Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, size_av '[N/A]', '[N/A]', '[N/A]', '[N/A]', '[rad/s]', & '[deg]', '[deg]', '[deg]', '[N/A]', '[rad/s]', & '[rad/s]'] - nLocalVars = 139 + nLocalVars = 140 Allocate(LocalVarOutData(nLocalVars)) Allocate(LocalVarOutStrings(nLocalVars)) LocalVarOutData(1) = LocalVar%iStatus - LocalVarOutData(2) = LocalVar%RestartWSE - LocalVarOutData(3) = LocalVar%Time - LocalVarOutData(4) = LocalVar%DT - LocalVarOutData(5) = LocalVar%n_DT - LocalVarOutData(6) = LocalVar%Time_Last - LocalVarOutData(7) = LocalVar%VS_GenPwr - LocalVarOutData(8) = LocalVar%VS_GenPwrF - LocalVarOutData(9) = LocalVar%GenSpeed - LocalVarOutData(10) = LocalVar%RotSpeed - LocalVarOutData(11) = LocalVar%NacHeading - LocalVarOutData(12) = LocalVar%NacVane - LocalVarOutData(13) = LocalVar%NacVaneF - LocalVarOutData(14) = LocalVar%HorWindV - LocalVarOutData(15) = LocalVar%HorWindV_F - LocalVarOutData(16) = LocalVar%rootMOOP(1) - LocalVarOutData(17) = LocalVar%rootMOOPF(1) - LocalVarOutData(18) = LocalVar%BlPitch(1) - LocalVarOutData(19) = LocalVar%BlPitchCMeas - LocalVarOutData(20) = LocalVar%Azimuth - LocalVarOutData(21) = LocalVar%OL_Azimuth - LocalVarOutData(22) = LocalVar%AzUnwrapped - LocalVarOutData(23) = LocalVar%AzError - LocalVarOutData(24) = LocalVar%GenTqAz - LocalVarOutData(25) = LocalVar%AzBuffer(1) - LocalVarOutData(26) = LocalVar%NumBl - LocalVarOutData(27) = LocalVar%FA_Acc - LocalVarOutData(28) = LocalVar%NacIMU_FA_Acc - LocalVarOutData(29) = LocalVar%FA_AccHPF - LocalVarOutData(30) = LocalVar%FA_AccHPFI - LocalVarOutData(31) = LocalVar%FA_PitCom(1) - LocalVarOutData(32) = LocalVar%VS_RefSpd - LocalVarOutData(33) = LocalVar%VS_RefSpd_TSR - LocalVarOutData(34) = LocalVar%VS_RefSpd_TRA - LocalVarOutData(35) = LocalVar%VS_RefSpd_RL - LocalVarOutData(36) = LocalVar%PC_RefSpd - LocalVarOutData(37) = LocalVar%PC_RefSpd_SS - LocalVarOutData(38) = LocalVar%PC_RefSpd_PRC - LocalVarOutData(39) = LocalVar%RotSpeedF - LocalVarOutData(40) = LocalVar%GenSpeedF - LocalVarOutData(41) = LocalVar%GenTq - LocalVarOutData(42) = LocalVar%GenTqMeas - LocalVarOutData(43) = LocalVar%GenArTq - LocalVarOutData(44) = LocalVar%GenBrTq - LocalVarOutData(45) = LocalVar%IPC_PitComF(1) - LocalVarOutData(46) = LocalVar%PC_KP - LocalVarOutData(47) = LocalVar%PC_KI - LocalVarOutData(48) = LocalVar%PC_KD - LocalVarOutData(49) = LocalVar%PC_TF - LocalVarOutData(50) = LocalVar%PC_MaxPit - LocalVarOutData(51) = LocalVar%PC_MinPit - LocalVarOutData(52) = LocalVar%PC_PitComT - LocalVarOutData(53) = LocalVar%PC_PitComT_Last - LocalVarOutData(54) = LocalVar%PC_PitComTF - LocalVarOutData(55) = LocalVar%PC_PitComT_IPC(1) - LocalVarOutData(56) = LocalVar%PC_PwrErr - LocalVarOutData(57) = LocalVar%PC_SpdErr - LocalVarOutData(58) = LocalVar%IPC_AxisTilt_1P - LocalVarOutData(59) = LocalVar%IPC_AxisYaw_1P - LocalVarOutData(60) = LocalVar%IPC_AxisTilt_2P - LocalVarOutData(61) = LocalVar%IPC_AxisYaw_2P - LocalVarOutData(62) = LocalVar%axisTilt_1P - LocalVarOutData(63) = LocalVar%axisYaw_1P - LocalVarOutData(64) = LocalVar%axisYawF_1P - LocalVarOutData(65) = LocalVar%axisTilt_2P - LocalVarOutData(66) = LocalVar%axisYaw_2P - LocalVarOutData(67) = LocalVar%axisYawF_2P - LocalVarOutData(68) = LocalVar%IPC_KI(1) - LocalVarOutData(69) = LocalVar%IPC_KP(1) - LocalVarOutData(70) = LocalVar%IPC_IntSat - LocalVarOutData(71) = LocalVar%PC_State - LocalVarOutData(72) = LocalVar%PitCom(1) - LocalVarOutData(73) = LocalVar%PitComAct(1) - LocalVarOutData(74) = LocalVar%SS_DelOmegaF - LocalVarOutData(75) = LocalVar%TestType - LocalVarOutData(76) = LocalVar%Kp_Float - LocalVarOutData(77) = LocalVar%VS_MaxTq - LocalVarOutData(78) = LocalVar%VS_LastGenTrq - LocalVarOutData(79) = LocalVar%VS_LastGenPwr - LocalVarOutData(80) = LocalVar%VS_MechGenPwr - LocalVarOutData(81) = LocalVar%VS_SpdErrAr - LocalVarOutData(82) = LocalVar%VS_SpdErrBr - LocalVarOutData(83) = LocalVar%VS_SpdErr - LocalVarOutData(84) = LocalVar%VS_State - LocalVarOutData(85) = LocalVar%VS_Rgn3Pitch - LocalVarOutData(86) = LocalVar%WE_Vw - LocalVarOutData(87) = LocalVar%WE_Vw_F - LocalVarOutData(88) = LocalVar%WE_VwI - LocalVarOutData(89) = LocalVar%WE_VwIdot - LocalVarOutData(90) = LocalVar%WE_Op - LocalVarOutData(91) = LocalVar%WE_Op_Last - LocalVarOutData(92) = LocalVar%VS_LastGenTrqF - LocalVarOutData(93) = LocalVar%PRC_WSE_F - LocalVarOutData(94) = LocalVar%PRC_R_Speed - LocalVarOutData(95) = LocalVar%PRC_R_Torque - LocalVarOutData(96) = LocalVar%PRC_R_Pitch - LocalVarOutData(97) = LocalVar%PRC_R_Total - LocalVarOutData(98) = LocalVar%PRC_Min_Pitch - LocalVarOutData(99) = LocalVar%PS_Min_Pitch - LocalVarOutData(100) = LocalVar%OL_Index - LocalVarOutData(101) = LocalVar%Fl_PitCom - LocalVarOutData(102) = LocalVar%NACIMU_FA_AccF - LocalVarOutData(103) = LocalVar%FA_AccF - LocalVarOutData(104) = LocalVar%FA_Hist - LocalVarOutData(105) = LocalVar%TRA_LastRefSpd - LocalVarOutData(106) = LocalVar%VS_RefSpeed - LocalVarOutData(107) = LocalVar%PtfmTDX - LocalVarOutData(108) = LocalVar%PtfmTDY - LocalVarOutData(109) = LocalVar%PtfmTDZ - LocalVarOutData(110) = LocalVar%PtfmRDX - LocalVarOutData(111) = LocalVar%PtfmRDY - LocalVarOutData(112) = LocalVar%PtfmRDZ - LocalVarOutData(113) = LocalVar%PtfmTVX - LocalVarOutData(114) = LocalVar%PtfmTVY - LocalVarOutData(115) = LocalVar%PtfmTVZ - LocalVarOutData(116) = LocalVar%PtfmRVX - LocalVarOutData(117) = LocalVar%PtfmRVY - LocalVarOutData(118) = LocalVar%PtfmRVZ - LocalVarOutData(119) = LocalVar%PtfmTAX - LocalVarOutData(120) = LocalVar%PtfmTAY - LocalVarOutData(121) = LocalVar%PtfmTAZ - LocalVarOutData(122) = LocalVar%PtfmRAX - LocalVarOutData(123) = LocalVar%PtfmRAY - LocalVarOutData(124) = LocalVar%PtfmRAZ - LocalVarOutData(125) = LocalVar%CC_DesiredL(1) - LocalVarOutData(126) = LocalVar%CC_ActuatedL(1) - LocalVarOutData(127) = LocalVar%CC_ActuatedDL(1) - LocalVarOutData(128) = LocalVar%StC_Input(1) - LocalVarOutData(129) = LocalVar%Flp_Angle(1) - LocalVarOutData(130) = LocalVar%RootMyb_Last(1) - LocalVarOutData(131) = LocalVar%ACC_INFILE_SIZE - LocalVarOutData(132) = LocalVar%AWC_complexangle(1) - LocalVarOutData(133) = LocalVar%ZMQ_ID - LocalVarOutData(134) = LocalVar%ZMQ_YawOffset - LocalVarOutData(135) = LocalVar%ZMQ_TorqueOffset - LocalVarOutData(136) = LocalVar%ZMQ_PitOffset(1) - LocalVarOutData(137) = LocalVar%ZMQ_R_Speed - LocalVarOutData(138) = LocalVar%ZMQ_R_Torque - LocalVarOutData(139) = LocalVar%ZMQ_R_Pitch - LocalVarOutStrings = [CHARACTER(15) :: 'iStatus', 'RestartWSE', 'Time', 'DT', 'n_DT', & - 'Time_Last', 'VS_GenPwr', 'VS_GenPwrF', 'GenSpeed', 'RotSpeed', & - 'NacHeading', 'NacVane', 'NacVaneF', 'HorWindV', 'HorWindV_F', & - 'rootMOOP', 'rootMOOPF', 'BlPitch', 'BlPitchCMeas', 'Azimuth', & - 'OL_Azimuth', 'AzUnwrapped', 'AzError', 'GenTqAz', 'AzBuffer', & - 'NumBl', 'FA_Acc', 'NacIMU_FA_Acc', 'FA_AccHPF', 'FA_AccHPFI', & - 'FA_PitCom', 'VS_RefSpd', 'VS_RefSpd_TSR', 'VS_RefSpd_TRA', 'VS_RefSpd_RL', & - 'PC_RefSpd', 'PC_RefSpd_SS', 'PC_RefSpd_PRC', 'RotSpeedF', 'GenSpeedF', & - 'GenTq', 'GenTqMeas', 'GenArTq', 'GenBrTq', 'IPC_PitComF', & - 'PC_KP', 'PC_KI', 'PC_KD', 'PC_TF', 'PC_MaxPit', & - 'PC_MinPit', 'PC_PitComT', 'PC_PitComT_Last', 'PC_PitComTF', 'PC_PitComT_IPC', & - 'PC_PwrErr', 'PC_SpdErr', 'IPC_AxisTilt_1P', 'IPC_AxisYaw_1P', 'IPC_AxisTilt_2P', & - 'IPC_AxisYaw_2P', 'axisTilt_1P', 'axisYaw_1P', 'axisYawF_1P', 'axisTilt_2P', & - 'axisYaw_2P', 'axisYawF_2P', 'IPC_KI', 'IPC_KP', 'IPC_IntSat', & - 'PC_State', 'PitCom', 'PitComAct', 'SS_DelOmegaF', 'TestType', & - 'Kp_Float', 'VS_MaxTq', 'VS_LastGenTrq', 'VS_LastGenPwr', 'VS_MechGenPwr', & - 'VS_SpdErrAr', 'VS_SpdErrBr', 'VS_SpdErr', 'VS_State', 'VS_Rgn3Pitch', & - 'WE_Vw', 'WE_Vw_F', 'WE_VwI', 'WE_VwIdot', 'WE_Op', & - 'WE_Op_Last', 'VS_LastGenTrqF', 'PRC_WSE_F', 'PRC_R_Speed', 'PRC_R_Torque', & - 'PRC_R_Pitch', 'PRC_R_Total', 'PRC_Min_Pitch', 'PS_Min_Pitch', 'OL_Index', & - 'Fl_PitCom', 'NACIMU_FA_AccF', 'FA_AccF', 'FA_Hist', 'TRA_LastRefSpd', & - 'VS_RefSpeed', 'PtfmTDX', 'PtfmTDY', 'PtfmTDZ', 'PtfmRDX', & - 'PtfmRDY', 'PtfmRDZ', 'PtfmTVX', 'PtfmTVY', 'PtfmTVZ', & - 'PtfmRVX', 'PtfmRVY', 'PtfmRVZ', 'PtfmTAX', 'PtfmTAY', & - 'PtfmTAZ', 'PtfmRAX', 'PtfmRAY', 'PtfmRAZ', 'CC_DesiredL', & - 'CC_ActuatedL', 'CC_ActuatedDL', 'StC_Input', 'Flp_Angle', 'RootMyb_Last', & - 'ACC_INFILE_SIZE', 'AWC_complexangle', 'ZMQ_ID', 'ZMQ_YawOffset', 'ZMQ_TorqueOffset', & - 'ZMQ_PitOffset', 'ZMQ_R_Speed', 'ZMQ_R_Torque', 'ZMQ_R_Pitch'] + LocalVarOutData(2) = LocalVar%AlreadyInitialized + LocalVarOutData(3) = LocalVar%RestartWSE + LocalVarOutData(4) = LocalVar%Time + LocalVarOutData(5) = LocalVar%DT + LocalVarOutData(6) = LocalVar%n_DT + LocalVarOutData(7) = LocalVar%Time_Last + LocalVarOutData(8) = LocalVar%VS_GenPwr + LocalVarOutData(9) = LocalVar%VS_GenPwrF + LocalVarOutData(10) = LocalVar%GenSpeed + LocalVarOutData(11) = LocalVar%RotSpeed + LocalVarOutData(12) = LocalVar%NacHeading + LocalVarOutData(13) = LocalVar%NacVane + LocalVarOutData(14) = LocalVar%NacVaneF + LocalVarOutData(15) = LocalVar%HorWindV + LocalVarOutData(16) = LocalVar%HorWindV_F + LocalVarOutData(17) = LocalVar%rootMOOP(1) + LocalVarOutData(18) = LocalVar%rootMOOPF(1) + LocalVarOutData(19) = LocalVar%BlPitch(1) + LocalVarOutData(20) = LocalVar%BlPitchCMeas + LocalVarOutData(21) = LocalVar%Azimuth + LocalVarOutData(22) = LocalVar%OL_Azimuth + LocalVarOutData(23) = LocalVar%AzUnwrapped + LocalVarOutData(24) = LocalVar%AzError + LocalVarOutData(25) = LocalVar%GenTqAz + LocalVarOutData(26) = LocalVar%AzBuffer(1) + LocalVarOutData(27) = LocalVar%NumBl + LocalVarOutData(28) = LocalVar%FA_Acc + LocalVarOutData(29) = LocalVar%NacIMU_FA_Acc + LocalVarOutData(30) = LocalVar%FA_AccHPF + LocalVarOutData(31) = LocalVar%FA_AccHPFI + LocalVarOutData(32) = LocalVar%FA_PitCom(1) + LocalVarOutData(33) = LocalVar%VS_RefSpd + LocalVarOutData(34) = LocalVar%VS_RefSpd_TSR + LocalVarOutData(35) = LocalVar%VS_RefSpd_TRA + LocalVarOutData(36) = LocalVar%VS_RefSpd_RL + LocalVarOutData(37) = LocalVar%PC_RefSpd + LocalVarOutData(38) = LocalVar%PC_RefSpd_SS + LocalVarOutData(39) = LocalVar%PC_RefSpd_PRC + LocalVarOutData(40) = LocalVar%RotSpeedF + LocalVarOutData(41) = LocalVar%GenSpeedF + LocalVarOutData(42) = LocalVar%GenTq + LocalVarOutData(43) = LocalVar%GenTqMeas + LocalVarOutData(44) = LocalVar%GenArTq + LocalVarOutData(45) = LocalVar%GenBrTq + LocalVarOutData(46) = LocalVar%IPC_PitComF(1) + LocalVarOutData(47) = LocalVar%PC_KP + LocalVarOutData(48) = LocalVar%PC_KI + LocalVarOutData(49) = LocalVar%PC_KD + LocalVarOutData(50) = LocalVar%PC_TF + LocalVarOutData(51) = LocalVar%PC_MaxPit + LocalVarOutData(52) = LocalVar%PC_MinPit + LocalVarOutData(53) = LocalVar%PC_PitComT + LocalVarOutData(54) = LocalVar%PC_PitComT_Last + LocalVarOutData(55) = LocalVar%PC_PitComTF + LocalVarOutData(56) = LocalVar%PC_PitComT_IPC(1) + LocalVarOutData(57) = LocalVar%PC_PwrErr + LocalVarOutData(58) = LocalVar%PC_SpdErr + LocalVarOutData(59) = LocalVar%IPC_AxisTilt_1P + LocalVarOutData(60) = LocalVar%IPC_AxisYaw_1P + LocalVarOutData(61) = LocalVar%IPC_AxisTilt_2P + LocalVarOutData(62) = LocalVar%IPC_AxisYaw_2P + LocalVarOutData(63) = LocalVar%axisTilt_1P + LocalVarOutData(64) = LocalVar%axisYaw_1P + LocalVarOutData(65) = LocalVar%axisYawF_1P + LocalVarOutData(66) = LocalVar%axisTilt_2P + LocalVarOutData(67) = LocalVar%axisYaw_2P + LocalVarOutData(68) = LocalVar%axisYawF_2P + LocalVarOutData(69) = LocalVar%IPC_KI(1) + LocalVarOutData(70) = LocalVar%IPC_KP(1) + LocalVarOutData(71) = LocalVar%IPC_IntSat + LocalVarOutData(72) = LocalVar%PC_State + LocalVarOutData(73) = LocalVar%PitCom(1) + LocalVarOutData(74) = LocalVar%PitComAct(1) + LocalVarOutData(75) = LocalVar%SS_DelOmegaF + LocalVarOutData(76) = LocalVar%TestType + LocalVarOutData(77) = LocalVar%Kp_Float + LocalVarOutData(78) = LocalVar%VS_MaxTq + LocalVarOutData(79) = LocalVar%VS_LastGenTrq + LocalVarOutData(80) = LocalVar%VS_LastGenPwr + LocalVarOutData(81) = LocalVar%VS_MechGenPwr + LocalVarOutData(82) = LocalVar%VS_SpdErrAr + LocalVarOutData(83) = LocalVar%VS_SpdErrBr + LocalVarOutData(84) = LocalVar%VS_SpdErr + LocalVarOutData(85) = LocalVar%VS_State + LocalVarOutData(86) = LocalVar%VS_Rgn3Pitch + LocalVarOutData(87) = LocalVar%WE_Vw + LocalVarOutData(88) = LocalVar%WE_Vw_F + LocalVarOutData(89) = LocalVar%WE_VwI + LocalVarOutData(90) = LocalVar%WE_VwIdot + LocalVarOutData(91) = LocalVar%WE_Op + LocalVarOutData(92) = LocalVar%WE_Op_Last + LocalVarOutData(93) = LocalVar%VS_LastGenTrqF + LocalVarOutData(94) = LocalVar%PRC_WSE_F + LocalVarOutData(95) = LocalVar%PRC_R_Speed + LocalVarOutData(96) = LocalVar%PRC_R_Torque + LocalVarOutData(97) = LocalVar%PRC_R_Pitch + LocalVarOutData(98) = LocalVar%PRC_R_Total + LocalVarOutData(99) = LocalVar%PRC_Min_Pitch + LocalVarOutData(100) = LocalVar%PS_Min_Pitch + LocalVarOutData(101) = LocalVar%OL_Index + LocalVarOutData(102) = LocalVar%Fl_PitCom + LocalVarOutData(103) = LocalVar%NACIMU_FA_AccF + LocalVarOutData(104) = LocalVar%FA_AccF + LocalVarOutData(105) = LocalVar%FA_Hist + LocalVarOutData(106) = LocalVar%TRA_LastRefSpd + LocalVarOutData(107) = LocalVar%VS_RefSpeed + LocalVarOutData(108) = LocalVar%PtfmTDX + LocalVarOutData(109) = LocalVar%PtfmTDY + LocalVarOutData(110) = LocalVar%PtfmTDZ + LocalVarOutData(111) = LocalVar%PtfmRDX + LocalVarOutData(112) = LocalVar%PtfmRDY + LocalVarOutData(113) = LocalVar%PtfmRDZ + LocalVarOutData(114) = LocalVar%PtfmTVX + LocalVarOutData(115) = LocalVar%PtfmTVY + LocalVarOutData(116) = LocalVar%PtfmTVZ + LocalVarOutData(117) = LocalVar%PtfmRVX + LocalVarOutData(118) = LocalVar%PtfmRVY + LocalVarOutData(119) = LocalVar%PtfmRVZ + LocalVarOutData(120) = LocalVar%PtfmTAX + LocalVarOutData(121) = LocalVar%PtfmTAY + LocalVarOutData(122) = LocalVar%PtfmTAZ + LocalVarOutData(123) = LocalVar%PtfmRAX + LocalVarOutData(124) = LocalVar%PtfmRAY + LocalVarOutData(125) = LocalVar%PtfmRAZ + LocalVarOutData(126) = LocalVar%CC_DesiredL(1) + LocalVarOutData(127) = LocalVar%CC_ActuatedL(1) + LocalVarOutData(128) = LocalVar%CC_ActuatedDL(1) + LocalVarOutData(129) = LocalVar%StC_Input(1) + LocalVarOutData(130) = LocalVar%Flp_Angle(1) + LocalVarOutData(131) = LocalVar%RootMyb_Last(1) + LocalVarOutData(132) = LocalVar%ACC_INFILE_SIZE + LocalVarOutData(133) = LocalVar%AWC_complexangle(1) + LocalVarOutData(134) = LocalVar%ZMQ_ID + LocalVarOutData(135) = LocalVar%ZMQ_YawOffset + LocalVarOutData(136) = LocalVar%ZMQ_TorqueOffset + LocalVarOutData(137) = LocalVar%ZMQ_PitOffset(1) + LocalVarOutData(138) = LocalVar%ZMQ_R_Speed + LocalVarOutData(139) = LocalVar%ZMQ_R_Torque + LocalVarOutData(140) = LocalVar%ZMQ_R_Pitch + LocalVarOutStrings = [CHARACTER(15) :: 'iStatus', 'AlreadyInitialized', 'RestartWSE', 'Time', 'DT', & + 'n_DT', 'Time_Last', 'VS_GenPwr', 'VS_GenPwrF', 'GenSpeed', & + 'RotSpeed', 'NacHeading', 'NacVane', 'NacVaneF', 'HorWindV', & + 'HorWindV_F', 'rootMOOP', 'rootMOOPF', 'BlPitch', 'BlPitchCMeas', & + 'Azimuth', 'OL_Azimuth', 'AzUnwrapped', 'AzError', 'GenTqAz', & + 'AzBuffer', 'NumBl', 'FA_Acc', 'NacIMU_FA_Acc', 'FA_AccHPF', & + 'FA_AccHPFI', 'FA_PitCom', 'VS_RefSpd', 'VS_RefSpd_TSR', 'VS_RefSpd_TRA', & + 'VS_RefSpd_RL', 'PC_RefSpd', 'PC_RefSpd_SS', 'PC_RefSpd_PRC', 'RotSpeedF', & + 'GenSpeedF', 'GenTq', 'GenTqMeas', 'GenArTq', 'GenBrTq', & + 'IPC_PitComF', 'PC_KP', 'PC_KI', 'PC_KD', 'PC_TF', & + 'PC_MaxPit', 'PC_MinPit', 'PC_PitComT', 'PC_PitComT_Last', 'PC_PitComTF', & + 'PC_PitComT_IPC', 'PC_PwrErr', 'PC_SpdErr', 'IPC_AxisTilt_1P', 'IPC_AxisYaw_1P', & + 'IPC_AxisTilt_2P', 'IPC_AxisYaw_2P', 'axisTilt_1P', 'axisYaw_1P', 'axisYawF_1P', & + 'axisTilt_2P', 'axisYaw_2P', 'axisYawF_2P', 'IPC_KI', 'IPC_KP', & + 'IPC_IntSat', 'PC_State', 'PitCom', 'PitComAct', 'SS_DelOmegaF', & + 'TestType', 'Kp_Float', 'VS_MaxTq', 'VS_LastGenTrq', 'VS_LastGenPwr', & + 'VS_MechGenPwr', 'VS_SpdErrAr', 'VS_SpdErrBr', 'VS_SpdErr', 'VS_State', & + 'VS_Rgn3Pitch', 'WE_Vw', 'WE_Vw_F', 'WE_VwI', 'WE_VwIdot', & + 'WE_Op', 'WE_Op_Last', 'VS_LastGenTrqF', 'PRC_WSE_F', 'PRC_R_Speed', & + 'PRC_R_Torque', 'PRC_R_Pitch', 'PRC_R_Total', 'PRC_Min_Pitch', 'PS_Min_Pitch', & + 'OL_Index', 'Fl_PitCom', 'NACIMU_FA_AccF', 'FA_AccF', 'FA_Hist', & + 'TRA_LastRefSpd', 'VS_RefSpeed', 'PtfmTDX', 'PtfmTDY', 'PtfmTDZ', & + 'PtfmRDX', 'PtfmRDY', 'PtfmRDZ', 'PtfmTVX', 'PtfmTVY', & + 'PtfmTVZ', 'PtfmRVX', 'PtfmRVY', 'PtfmRVZ', 'PtfmTAX', & + 'PtfmTAY', 'PtfmTAZ', 'PtfmRAX', 'PtfmRAY', 'PtfmRAZ', & + 'CC_DesiredL', 'CC_ActuatedL', 'CC_ActuatedDL', 'StC_Input', 'Flp_Angle', & + 'RootMyb_Last', 'ACC_INFILE_SIZE', 'AWC_complexangle', 'ZMQ_ID', 'ZMQ_YawOffset', & + 'ZMQ_TorqueOffset', 'ZMQ_PitOffset', 'ZMQ_R_Speed', 'ZMQ_R_Torque', 'ZMQ_R_Pitch' & + ] ! Initialize debug file IF ((LocalVar%iStatus == 0) .OR. (LocalVar%iStatus == -9)) THEN ! .TRUE. if we're on the first call to the DLL IF (CntrPar%LoggingLevel > 0) THEN @@ -906,8 +910,8 @@ SUBROUTINE Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, size_av CALL GetNewUnit(UnDb2, ErrVar) OPEN(unit=UnDb2, FILE=TRIM(RootName)//'.RO.dbg2') WRITE(UnDb2, *) 'Generated on '//CurDate()//' at '//CurTime()//' using ROSCO-'//TRIM(rosco_version) - WRITE(UnDb2, '(140(a20,TR5:))') 'Time', LocalVarOutStrings - WRITE(UnDb2, '(140(a20,TR5:))') + WRITE(UnDb2, '(141(a20,TR5:))') 'Time', LocalVarOutStrings + WRITE(UnDb2, '(141(a20,TR5:))') END IF IF (CntrPar%LoggingLevel > 2) THEN @@ -970,7 +974,7 @@ SUBROUTINE Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, size_av END DO ! Write debug files - FmtDat = "(F20.5,TR5,139(ES20.5E2,TR5:))" ! The format of the debugging data + FmtDat = "(F20.5,TR5,140(ES20.5E2,TR5:))" ! The format of the debugging data IF ( MOD(LocalVar%n_DT, CntrPar%n_DT_Out) == 0) THEN IF(CntrPar%LoggingLevel > 0) THEN WRITE (UnDb, TRIM(FmtDat)) LocalVar%Time, DebugOutData diff --git a/rosco/controller/src/ROSCO_Types.f90 b/rosco/controller/src/ROSCO_Types.f90 index a1c53f6b..8175d99d 100644 --- a/rosco/controller/src/ROSCO_Types.f90 +++ b/rosco/controller/src/ROSCO_Types.f90 @@ -263,6 +263,7 @@ MODULE ROSCO_Types TYPE, PUBLIC :: LocalVariables INTEGER(IntKi) :: iStatus ! Initialization status + INTEGER(IntKi) :: AlreadyInitialized = 0 ! Has ROSCO already been initialized (0-no, 1-yes) INTEGER(IntKi) :: RestartWSE ! Restart WSE flag, 0 - restart, 1- not, to mirror iStatus REAL(DbKi) :: Time ! Time [s] REAL(DbKi) :: DT ! Time step [s] diff --git a/rosco/controller/src/ReadSetParameters.f90 b/rosco/controller/src/ReadSetParameters.f90 index a1dbdfde..8a1d0080 100644 --- a/rosco/controller/src/ReadSetParameters.f90 +++ b/rosco/controller/src/ReadSetParameters.f90 @@ -26,12 +26,13 @@ MODULE ReadSetParameters CONTAINS ! ----------------------------------------------------------------------------------- ! Read avrSWAP array passed from ServoDyn - SUBROUTINE ReadAvrSWAP(avrSWAP, LocalVar, CntrPar) + SUBROUTINE ReadAvrSWAP(avrSWAP, LocalVar, CntrPar, ErrVar) USE ROSCO_Types, ONLY : LocalVariables REAL(ReKi), INTENT(INOUT) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from, the DLL controller. TYPE(LocalVariables), INTENT(INOUT) :: LocalVar TYPE(ControlParameters), INTENT(IN) :: CntrPar + TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Allocate Variables: INTEGER(IntKi) :: K ! Index used for looping through blades. @@ -80,9 +81,18 @@ SUBROUTINE ReadAvrSWAP(avrSWAP, LocalVar, CntrPar) ENDIF - ! GenTemp = avrSWAP(1026) - ! WRITE(1000,*) LocalVar%GenSpeed*RPS2RPM, GenTemp + ! Check that we haven't already loaded this dynamic library + IF (LocalVar%iStatus == 0) THEN + IF (LocalVar%AlreadyInitialized == 0) THEN + LocalVar%AlreadyInitialized = 1 + ELSE + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'ERROR: This ROSCO dynamic library has already been loaded.' + RETURN + ENDIF + ENDIF + diff --git a/rosco/test/test_initialization.py b/rosco/test/test_initialization.py new file mode 100644 index 00000000..7f695604 --- /dev/null +++ b/rosco/test/test_initialization.py @@ -0,0 +1,34 @@ +''' +Unit testing for ROSCO + +Tests: + initialization +''' + +import os +import unittest + + +# ROSCO toolbox modules +from rosco import discon_lib_path +from rosco.toolbox import control_interface as ROSCO_ci + + +class UnitTesting(unittest.TestCase): + def test_initialization(self): + + this_dir = os.path.dirname(os.path.abspath(__file__)) + param_filename = os.path.join(this_dir,'../../Examples/Test_Cases/IEA-15-240-RWT-UMaineSemi/DISCON-UMaineSemi.IN') + + + # Load controller library + ci_1 = ROSCO_ci.ControllerInterface(discon_lib_path,param_filename=param_filename,sim_name='sim1') + + ci_2 = ROSCO_ci.ControllerInterface(discon_lib_path,param_filename=param_filename,sim_name='sim2') + + # Check that the error is as expected + assert("b'ROSCO:ERROR: This ROSCO dynamic library has already been loaded" == str(ci_2.avcMSG.raw).split('.')[0]) + + +if __name__ == "__main__": + unittest.main()