diff --git a/docs/source/user/input_file_overview.rst b/docs/source/user/input_file_overview.rst index 9a5d75ce4d..8bcdd63417 100644 --- a/docs/source/user/input_file_overview.rst +++ b/docs/source/user/input_file_overview.rst @@ -82,6 +82,7 @@ modules use the *value column* format): ============== ========================================================== AeroDyn Main AD15 input file AeroDyn Airfoil files +HydroDyn Main HD input file InflowWind Main IfW input file InflowWind Uniform wind input file InflowWind Bladed wind summary file diff --git a/modules/hydrodyn/src/HydroDyn.f90 b/modules/hydrodyn/src/HydroDyn.f90 index e15ec0da7e..0778105764 100644 --- a/modules/hydrodyn/src/HydroDyn.f90 +++ b/modules/hydrodyn/src/HydroDyn.f90 @@ -249,7 +249,8 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Local variables CHARACTER(1024) :: SummaryName ! name of the HydroDyn summary file - TYPE(HydroDyn_InitInputType) :: InitLocal ! Local version of the initialization data, needed because the framework data (InitInp) is read-only + TYPE(HydroDyn_InputFile) :: InputFileData !< Data from input file + TYPE(FileInfoType) :: InFileInfo !< The derived type for holding the full input file for parsing -- we may pass this in the future TYPE(Waves_InitOutputType) :: Waves_InitOut ! Initialization Outputs from the Waves module initialization ! TYPE(Waves2_InitOutputType) :: Waves2_InitOut ! Initialization Outputs from the Waves2 module initialization TYPE(Current_InitOutputType) :: Current_InitOut ! Initialization Outputs from the Current module initialization @@ -305,6 +306,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I INTEGER :: tmpNWaveElev REAL(SiKi), ALLOCATABLE :: tmpWaveElevxi(: ) REAL(SiKi), ALLOCATABLE :: tmpWaveElevyi(: ) + REAL(SiKi), ALLOCATABLE :: tmpWaveElevXY(:,: ) REAL(SiKi), ALLOCATABLE :: WaveElevSt (:,: ) REAL(SiKi), ALLOCATABLE :: WaveVel0 (:,:,:) REAL(SiKi), ALLOCATABLE :: WaveAcc0 (:,:,:) @@ -315,8 +317,8 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I REAL(SiKi), ALLOCATABLE :: WaveVel2D0 (:,:,:) REAL(SiKi), ALLOCATABLE :: WaveAcc2D0 (:,:,:) REAL(SiKi), ALLOCATABLE :: WaveDynP2D0 (:,: ) + - INTEGER(IntKi) :: ErrStat2 ! local error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_Init' @@ -332,17 +334,6 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I #ifdef BETA_BUILD CALL DispBetaNotice( "This is a beta version of HydroDyn and is for testing purposes only."//NewLine//"This version includes user waves, WaveMod=6 and the ability to write example user waves." ) #endif - ! Copy the initialization input data to a local version because the framework states InitInp should have INTENT (IN), but due to an issue the the - ! copy routine, we needed to make it (INOUT), which means we actually don't need this local version!! I'm leaving this with the idea that the - ! copy routine will get modified so that InitInp can have INTENT (IN) again. GJH 4-Apr-2013 - - CALL HydroDyn_CopyInitInput( InitInp, InitLocal, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - ! Initialize the NWTC Subroutine Library @@ -353,35 +344,42 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I CALL DispNVD( HydroDyn_ProgDesc ) - - - - IF ( InitLocal%UseInputFile ) THEN - - - ! Parse all HydroDyn-related input files and populate the *_InitInputType derived types - - CALL HydroDynInput_GetInput( InitLocal, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - END IF - - - ! Start with the glue code's timestep. This may be altered in the Input file processing, and we will check that afterwards. - - InitLocal%DT = Interval + + IF ( InitInp%UseInputFile ) THEN + CALL ProcessComFile( InitInp%InputFile, InFileInfo, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + ENDIF + ELSE + CALL NWTC_Library_CopyFileInfoType( InitInp%PassedFileData, InFileInfo, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + ENDIF + ENDIF + + ! For diagnostic purposes, the following can be used to display the contents + ! of the InFileInfo data structure. + ! call Print_FileInfo_Struct( CU, InFileInfo ) ! CU is the screen -- different number on different systems. + + + ! Parse all HydroDyn-related input and populate the InputFileData structure + CALL HydroDyn_ParseInput( InitInp%InputFile, InitInp%OutRootName, InitInp%defWtrDens, InitInp%defWtrDpth, InitInp%defMSL2SWL, InFileInfo, InputFileData, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF ! Verify all the necessary initialization data. Do this at the HydroDynInput module-level ! because the HydroDynInput module is also responsible for parsing all this ! initialization data from a file - - CALL HydroDynInput_ProcessInitData( InitLocal, ErrStat2, ErrMsg2 ) + CALL HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -392,10 +390,10 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Since the Convolution Radiation module is currently the only module which requires knowledge of the time step size, ! we will set Hydrodyn's time step to be that of the Convolution radiation module if it is being used. Otherwise, we ! will set it to be equal to the glue-codes - IF ((Initlocal%PotMod == 1) .AND. (Initlocal%WAMIT%RdtnMod == 1) ) THEN + IF ((InputFileData%PotMod == 1) .AND. (InputFileData%WAMIT%RdtnMod == 1) ) THEN - p%DT = InitLocal%WAMIT%Conv_Rdtn%RdtnDT + p%DT = InputFileData%WAMIT%Conv_Rdtn%RdtnDT #ifdef USE_FIT ELSE IF (Initlocal%PotMod == 2) THEN @@ -420,10 +418,10 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Open a summary of the HydroDyn Initialization. Note: OutRootName must be set by the caller because there may not be an input file to obtain this rootname from. - IF ( InitLocal%HDSum ) THEN + IF ( InputFileData%HDSum ) THEN - SummaryName = TRIM(InitLocal%OutRootName)//'.HD.sum' - CALL HDOut_OpenSum( InitLocal%UnSum, SummaryName, HydroDyn_ProgDesc, ErrStat2, ErrMsg2 ) !this must be called before the Waves_Init() routine so that the appropriate wave data can be written to the summary file + SummaryName = TRIM(InitInp%OutRootName)//'.HD.sum' + CALL HDOut_OpenSum( InputFileData%UnSum, SummaryName, HydroDyn_ProgDesc, ErrStat2, ErrMsg2 ) !this must be called before the Waves_Init() routine so that the appropriate wave data can be written to the summary file CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -432,22 +430,22 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ELSE - InitLocal%UnSum = -1 + InputFileData%UnSum = -1 END IF ! Copy Additional preload, stiffness, and damping to the parameters - p%AddF0 = InitLocal%AddF0 - p%AddCLin = InitLocal%AddCLin - p%AddBLin = InitLocal%AddBLin - p%AddBQuad = InitLocal%AddBQuad + p%AddF0 = InputFileData%AddF0 + p%AddCLin = InputFileData%AddCLin + p%AddBLin = InputFileData%AddBLin + p%AddBQuad = InputFileData%AddBQuad ! Set summary unit number in Waves, Radiation, and Morison initialization input data - InitLocal%Waves%UnSum = InitLocal%UnSum - InitLocal%WAMIT%Conv_Rdtn%UnSum = InitLocal%UnSum - InitLocal%Morison%UnSum = InitLocal%UnSum + InputFileData%Waves%UnSum = InputFileData%UnSum + InputFileData%WAMIT%Conv_Rdtn%UnSum = InputFileData%UnSum + InputFileData%Morison%UnSum = InputFileData%UnSum ! Now call each sub-module's *_Init subroutine @@ -456,7 +454,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Initialize Current module - CALL Current_Init(InitLocal%Current, Current_u, Current_p, Current_x, Current_xd, Current_z, CurrentOtherState, & + CALL Current_Init(InputFileData%Current, Current_u, Current_p, Current_x, Current_xd, Current_z, CurrentOtherState, & Current_y, Current_m, Interval, Current_InitOut, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -475,25 +473,34 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Move initialization output data from Current module into the initialization input data for the Waves module - IF (ALLOCATED(Current_InitOut%CurrVxi)) CALL Move_Alloc( Current_InitOut%CurrVxi, InitLocal%Waves%CurrVxi ) - IF (ALLOCATED(Current_InitOut%CurrVyi)) CALL Move_Alloc( Current_InitOut%CurrVyi, InitLocal%Waves%CurrVyi ) + IF (ALLOCATED(Current_InitOut%CurrVxi)) CALL Move_Alloc( Current_InitOut%CurrVxi, InputFileData%Waves%CurrVxi ) + IF (ALLOCATED(Current_InitOut%CurrVyi)) CALL Move_Alloc( Current_InitOut%CurrVyi, InputFileData%Waves%CurrVyi ) - InitLocal%Waves%PCurrVxiPz0 = Current_InitOut%PCurrVxiPz0 - InitLocal%Waves%PCurrVyiPz0 = Current_InitOut%PCurrVyiPz0 + InputFileData%Waves%PCurrVxiPz0 = Current_InitOut%PCurrVxiPz0 + InputFileData%Waves%PCurrVyiPz0 = Current_InitOut%PCurrVyiPz0 - ! Copy the WaveElevXY data in from the HydroDyn InitLocal (already a copy of InitInp) + ! Copy the WaveElevXY data in from the HydroDyn InitInp + + IF (ALLOCATED(InitInp%WaveElevXY)) THEN + call AllocAry(tmpWaveElevXY,size(InitInp%WaveElevXY,DIM=1),size(InitInp%WaveElevXY,DIM=2),'tmpWaveElevXY',ErrStat2,ErrMsg2) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF + tmpWaveElevXY = InitInp%WaveElevXY + ENDIF - IF (ALLOCATED(InitLocal%WaveElevXY)) CALL MOVE_ALLOC(InitLocal%WaveElevXY, InitLocal%Waves%WaveElevXY) ! Initialize Waves module !========================================================================== ! Initialize Wave Stretching data for 1st Order Waves !========================================================================== - IF (InitLocal%Waves%WaveStMod > 0) THEN + IF (InputFileData%Waves%WaveStMod > 0) THEN ! Allocate the temporary storage array for the WvKinxi - ALLOCATE ( tmpWaveKinzi(InitLocal%Waves%NWaveKin), STAT = ErrStat2 ) + ALLOCATE ( tmpWaveKinzi(InputFileData%Waves%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for tmpWaveKinzi array.', ErrStat, ErrMsg, RoutineName) CALL CleanUp() @@ -502,38 +509,38 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I - tmpWaveKinzi = InitLocal%Waves%WaveKinzi - InitLocal%Waves%WaveKinzi = 0.0_ReKi ! Force all zi coordinates to 0.0 for this version of the Waves initialization + tmpWaveKinzi = InputFileData%Waves%WaveKinzi + InputFileData%Waves%WaveKinzi = 0.0_ReKi ! Force all zi coordinates to 0.0 for this version of the Waves initialization ! We will use the user-requested wave elevation arrays to compute the wave elevations for stretching at ALL node locations. ! We are going to store the user-requested wave elevation output locations so that we can restore them after we done. - IF (InitLocal%Waves%NWaveElev > 0) THEN - tmpNWaveElev = InitLocal%Waves%NWaveElev - CALL MOVE_ALLOC( InitLocal%Waves%WaveElevxi, tmpWaveElevxi ) ! (from, to) - CALL MOVE_ALLOC( InitLocal%Waves%WaveElevyi, tmpWaveElevyi ) + IF (InputFileData%Waves%NWaveElev > 0) THEN + tmpNWaveElev = InputFileData%Waves%NWaveElev + CALL MOVE_ALLOC( InputFileData%Waves%WaveElevxi, tmpWaveElevxi ) ! (from, to) + CALL MOVE_ALLOC( InputFileData%Waves%WaveElevyi, tmpWaveElevyi ) END IF - ALLOCATE ( InitLocal%Waves%WaveElevxi(InitLocal%Waves%NWaveKin), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Waves%WaveElevxi(InputFileData%Waves%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for tmpWaveKinzi array.', ErrStat, ErrMsg, RoutineName) CALL CleanUp() RETURN END IF - ALLOCATE ( InitLocal%Waves%WaveElevyi(InitLocal%Waves%NWaveKin), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Waves%WaveElevyi(InputFileData%Waves%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for tmpWaveKinzi array.', ErrStat, ErrMsg, RoutineName) CALL CleanUp() RETURN END IF - InitLocal%Waves%NWaveElev = InitLocal%Waves%NWaveKin - InitLocal%Waves%WaveElevxi = InitLocal%Waves%WaveKinxi - InitLocal%Waves%WaveElevyi = InitLocal%Waves%WaveKinyi + InputFileData%Waves%NWaveElev = InputFileData%Waves%NWaveKin + InputFileData%Waves%WaveElevxi = InputFileData%Waves%WaveKinxi + InputFileData%Waves%WaveElevyi = InputFileData%Waves%WaveKinyi - CALL Waves_Init(InitLocal%Waves, Waves_u, Waves_p, Waves_x, Waves_xd, Waves_z, WavesOtherState, & + CALL Waves_Init(InputFileData%Waves, Waves_u, Waves_p, Waves_x, Waves_xd, Waves_z, WavesOtherState, & Waves_y, Waves_m, Interval, Waves_InitOut, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -542,7 +549,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I END IF ! Store the wave elevations coming out of the Waves_Init for use in the stretching calculations - ALLOCATE ( WaveElevSt(0:Waves_InitOut%NStepWave,InitLocal%Waves%NWaveKin), STAT = ErrStat2 ) + ALLOCATE ( WaveElevSt(0:Waves_InitOut%NStepWave,InputFileData%Waves%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for WaveElevSt array.', ErrStat, ErrMsg, RoutineName) CALL CleanUp() @@ -552,22 +559,22 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! We need to reset the wave elevation arrays - DEALLOCATE(InitLocal%Waves%WaveElevxi) - DEALLOCATE(InitLocal%Waves%WaveElevyi) - InitLocal%Waves%NWaveElev = tmpNWaveElev + DEALLOCATE(InputFileData%Waves%WaveElevxi) + DEALLOCATE(InputFileData%Waves%WaveElevyi) + InputFileData%Waves%NWaveElev = tmpNWaveElev - IF (InitLocal%Waves%NWaveElev > 0) THEN - CALL MOVE_ALLOC( tmpWaveElevxi, InitLocal%Waves%WaveElevxi ) ! (from, to) - CALL MOVE_ALLOC( tmpWaveElevyi, InitLocal%Waves%WaveElevyi ) + IF (InputFileData%Waves%NWaveElev > 0) THEN + CALL MOVE_ALLOC( tmpWaveElevxi, InputFileData%Waves%WaveElevxi ) ! (from, to) + CALL MOVE_ALLOC( tmpWaveElevyi, InputFileData%Waves%WaveElevyi ) END IF - ALLOCATE ( WaveDynP0 (0:Waves_InitOut%NStepWave,InitLocal%Waves%NWaveKin ), STAT=ErrStat2 ) + ALLOCATE ( WaveDynP0 (0:Waves_InitOut%NStepWave,InputFileData%Waves%NWaveKin ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveDynP0.', ErrStat, ErrMsg, RoutineName) - ALLOCATE ( WaveVel0 (0:Waves_InitOut%NStepWave,InitLocal%Waves%NWaveKin,3), STAT=ErrStat2 ) + ALLOCATE ( WaveVel0 (0:Waves_InitOut%NStepWave,InputFileData%Waves%NWaveKin,3), STAT=ErrStat2 ) IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveVel0.', ErrStat, ErrMsg, RoutineName) - ALLOCATE ( WaveAcc0 (0:Waves_InitOut%NStepWave,InitLocal%Waves%NWaveKin,3), STAT=ErrStat2 ) + ALLOCATE ( WaveAcc0 (0:Waves_InitOut%NStepWave,InputFileData%Waves%NWaveKin,3), STAT=ErrStat2 ) IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveAcc0.', ErrStat, ErrMsg, RoutineName) @@ -582,7 +589,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I WaveVel0 = Waves_InitOut%WaveVel - InitLocal%Waves%WaveKinzi = tmpWaveKinzi + InputFileData%Waves%WaveKinzi = tmpWaveKinzi ! Deallocate data which will be allocated again within the Waves_Init routine DEALLOCATE( Waves_InitOut%WaveDynP ) @@ -599,7 +606,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I END IF !========================================================================== - CALL Waves_Init(InitLocal%Waves, Waves_u, Waves_p, Waves_x, Waves_xd, Waves_z, WavesOtherState, & + CALL Waves_Init(InputFileData%Waves, Waves_u, Waves_p, Waves_x, Waves_xd, Waves_z, WavesOtherState, & Waves_y, Waves_m, Interval, Waves_InitOut, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -619,11 +626,11 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Copy the wave elevation time series corresponding to WaveElevXY to the output. IF (ALLOCATED(Waves_InitOut%WaveElevSeries)) CALL MOVE_ALLOC( Waves_InitOut%WaveElevSeries, InitOut%WaveElevSeries ) - IF (ALLOCATED(InitLocal%Waves%WaveElevXY)) CALL MOVE_ALLOC(InitLocal%Waves%WaveElevXY, InitLocal%WaveElevXY) ! move this back for waves2 later + IF (ALLOCATED(InputFileData%Waves%WaveElevXY)) CALL MOVE_ALLOC(InputFileData%Waves%WaveElevXY, tmpWaveElevXY) ! move this back for waves2 later ! Copy Waves initialization output into the initialization input type for the WAMIT module - p%NWaveElev = InitLocal%Waves%NWaveElev + p%NWaveElev = InputFileData%Waves%NWaveElev p%NStepWave = Waves_InitOut%NStepWave CALL MOVE_ALLOC( Waves_InitOut%WaveTime, p%WaveTime ) @@ -643,61 +650,61 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I m%LastIndWave = 1 - IF ( InitLocal%Waves%WaveMod /= 6 ) THEN + IF ( InputFileData%Waves%WaveMod /= 6 ) THEN !---------------------------------- ! Initialize Waves2 module !---------------------------------- - IF (InitLocal%Waves2%WvDiffQTFF .OR. InitLocal%Waves2%WvSumQTFF ) THEN + IF (InputFileData%Waves2%WvDiffQTFF .OR. InputFileData%Waves2%WvSumQTFF ) THEN ! Set a few things from the Waves module output - InitLocal%Waves2%NStepWave = Waves_InitOut%NStepWave - InitLocal%Waves2%NStepWave2 = Waves_InitOut%NStepWave2 - InitLocal%Waves2%WaveDOmega = Waves_InitOut%WaveDOmega + InputFileData%Waves2%NStepWave = Waves_InitOut%NStepWave + InputFileData%Waves2%NStepWave2 = Waves_InitOut%NStepWave2 + InputFileData%Waves2%WaveDOmega = Waves_InitOut%WaveDOmega - ! Copy the WaveElevXY data in from the HydroDyn InitLocal, already a copy from InitInp - IF (ALLOCATED(InitLocal%WaveElevXY)) CALL MOVE_ALLOC(InitLocal%WaveElevXY, InitLocal%Waves2%WaveElevXY) + ! Copy the WaveElevXY data in from the HydroDyn InputFileData + IF (ALLOCATED(tmpWaveElevXY)) CALL MOVE_ALLOC(tmpWaveElevXY, InputFileData%Waves2%WaveElevXY) ! Temporarily move arrays to init input for Waves2 (save some space) - CALL MOVE_ALLOC(p%WaveTime, InitLocal%Waves2%WaveTime) - CALL MOVE_ALLOC(Waves_InitOut%WaveElevC0, InitLocal%Waves2%WaveElevC0) - CALL MOVE_ALLOC(Waves_InitOut%WaveDirArr, InitLocal%Waves2%WaveDirArr) + CALL MOVE_ALLOC(p%WaveTime, InputFileData%Waves2%WaveTime) + CALL MOVE_ALLOC(Waves_InitOut%WaveElevC0, InputFileData%Waves2%WaveElevC0) + CALL MOVE_ALLOC(Waves_InitOut%WaveDirArr, InputFileData%Waves2%WaveDirArr) !========================================================================== ! Initialize Wave Stretching data for 2nd Order Waves !========================================================================== - IF (InitLocal%Waves%WaveStMod > 0) THEN + IF (InputFileData%Waves%WaveStMod > 0) THEN ! Set the wave kinematics zi locations to zero to generate kinematics at MSL - InitLocal%Waves2%WaveKinzi = 0 + InputFileData%Waves2%WaveKinzi = 0 ! We will use the user-requested wave elevation arrays to compute the wave elevations for stretching at ALL node locations. ! We are going to store the user-requested wave elevation output locations so that we can restore them after we done. - IF (InitLocal%Waves2%NWaveElev > 0) THEN - tmpNWaveElev = InitLocal%Waves2%NWaveElev - CALL MOVE_ALLOC( InitLocal%Waves2%WaveElevxi, tmpWaveElevxi ) ! (from, to) - CALL MOVE_ALLOC( InitLocal%Waves2%WaveElevyi, tmpWaveElevyi ) + IF (InputFileData%Waves2%NWaveElev > 0) THEN + tmpNWaveElev = InputFileData%Waves2%NWaveElev + CALL MOVE_ALLOC( InputFileData%Waves2%WaveElevxi, tmpWaveElevxi ) ! (from, to) + CALL MOVE_ALLOC( InputFileData%Waves2%WaveElevyi, tmpWaveElevyi ) END IF - ALLOCATE ( InitLocal%Waves2%WaveElevxi(InitLocal%Waves2%NWaveKin), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Waves2%WaveElevxi(InputFileData%Waves2%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for WaveElevxi array.', ErrStat, ErrMsg, RoutineName) CALL CleanUp() RETURN END IF - ALLOCATE ( InitLocal%Waves2%WaveElevyi(InitLocal%Waves2%NWaveKin), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Waves2%WaveElevyi(InputFileData%Waves2%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for WaveElevyi array.', ErrStat, ErrMsg, RoutineName) CALL CleanUp() RETURN END IF - InitLocal%Waves2%NWaveElev = InitLocal%Waves2%NWaveKin - InitLocal%Waves2%WaveElevxi = InitLocal%Waves2%WaveKinxi - InitLocal%Waves2%WaveElevyi = InitLocal%Waves2%WaveKinyi + InputFileData%Waves2%NWaveElev = InputFileData%Waves2%NWaveKin + InputFileData%Waves2%WaveElevxi = InputFileData%Waves2%WaveKinxi + InputFileData%Waves2%WaveElevyi = InputFileData%Waves2%WaveKinyi - CALL Waves2_Init(InitLocal%Waves2, m%u_Waves2, p%Waves2, x%Waves2, xd%Waves2, z%Waves2, OtherState%Waves2, & + CALL Waves2_Init(InputFileData%Waves2, m%u_Waves2, p%Waves2, x%Waves2, xd%Waves2, z%Waves2, OtherState%Waves2, & y%Waves2, m%Waves2, Interval, InitOut%Waves2, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -710,32 +717,32 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I WaveElevSt = WaveElevSt + p%Waves2%WaveElev2 ! We need to reset the wave elevation arrays - DEALLOCATE(InitLocal%Waves2%WaveElevxi) - DEALLOCATE(InitLocal%Waves2%WaveElevyi) - InitLocal%Waves2%NWaveElev = tmpNWaveElev + DEALLOCATE(InputFileData%Waves2%WaveElevxi) + DEALLOCATE(InputFileData%Waves2%WaveElevyi) + InputFileData%Waves2%NWaveElev = tmpNWaveElev - IF (InitLocal%Waves2%NWaveElev > 0) THEN - CALL MOVE_ALLOC( tmpWaveElevxi, InitLocal%Waves2%WaveElevxi ) ! (from, to) - CALL MOVE_ALLOC( tmpWaveElevyi, InitLocal%Waves2%WaveElevyi ) + IF (InputFileData%Waves2%NWaveElev > 0) THEN + CALL MOVE_ALLOC( tmpWaveElevxi, InputFileData%Waves2%WaveElevxi ) ! (from, to) + CALL MOVE_ALLOC( tmpWaveElevyi, InputFileData%Waves2%WaveElevyi ) END IF - ALLOCATE ( WaveDynP2D0 (0:Waves_InitOut%NStepWave,InitLocal%Waves%NWaveKin ), STAT=ErrStat2 ) + ALLOCATE ( WaveDynP2D0 (0:Waves_InitOut%NStepWave,InputFileData%Waves%NWaveKin ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveDynP2D0.', ErrStat, ErrMsg, RoutineName) - ALLOCATE ( WaveVel2D0 (0:Waves_InitOut%NStepWave,InitLocal%Waves%NWaveKin,3), STAT=ErrStat2 ) + ALLOCATE ( WaveVel2D0 (0:Waves_InitOut%NStepWave,InputFileData%Waves%NWaveKin,3), STAT=ErrStat2 ) IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveVel2D0.', ErrStat, ErrMsg, RoutineName) - ALLOCATE ( WaveAcc2D0 (0:Waves_InitOut%NStepWave,InitLocal%Waves%NWaveKin,3), STAT=ErrStat2 ) + ALLOCATE ( WaveAcc2D0 (0:Waves_InitOut%NStepWave,InputFileData%Waves%NWaveKin,3), STAT=ErrStat2 ) IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveAcc2D0.', ErrStat, ErrMsg, RoutineName) - ALLOCATE ( WaveDynP2S0 (0:Waves_InitOut%NStepWave,InitLocal%Waves%NWaveKin ), STAT=ErrStat2 ) + ALLOCATE ( WaveDynP2S0 (0:Waves_InitOut%NStepWave,InputFileData%Waves%NWaveKin ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveDynP2S0.', ErrStat, ErrMsg, RoutineName) - ALLOCATE ( WaveVel2S0 (0:Waves_InitOut%NStepWave,InitLocal%Waves%NWaveKin,3), STAT=ErrStat2 ) + ALLOCATE ( WaveVel2S0 (0:Waves_InitOut%NStepWave,InputFileData%Waves%NWaveKin,3), STAT=ErrStat2 ) IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveVel2S0.', ErrStat, ErrMsg, RoutineName) - ALLOCATE ( WaveAcc2S0 (0:Waves_InitOut%NStepWave,InitLocal%Waves%NWaveKin,3), STAT=ErrStat2 ) + ALLOCATE ( WaveAcc2S0 (0:Waves_InitOut%NStepWave,InputFileData%Waves%NWaveKin,3), STAT=ErrStat2 ) IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveAcc2S0.', ErrStat, ErrMsg, RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -752,7 +759,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I WaveVel2S0 = InitOut%Waves2%WaveVel2S ! Reset the wave kinematics zi locations - InitLocal%Waves2%WaveKinzi = InitLocal%Waves%WaveKinzi + InputFileData%Waves2%WaveKinzi = InputFileData%Waves%WaveKinzi ! Deallocate arrays which will be re-allocated in the next call to Waves2_Init DEALLOCATE ( p%Waves2%WaveElev2 ) @@ -772,7 +779,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I !FIXME: why is this called again? I'm either not remembering something, or I don't undestand the wave stretching above. -- ADP - CALL Waves2_Init(InitLocal%Waves2, m%u_Waves2, p%Waves2, x%Waves2, xd%Waves2, z%Waves2, OtherState%Waves2, & + CALL Waves2_Init(InputFileData%Waves2, m%u_Waves2, p%Waves2, x%Waves2, xd%Waves2, z%Waves2, OtherState%Waves2, & y%Waves2, m%Waves2, Interval, InitOut%Waves2, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -781,9 +788,9 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I END IF ! move arrays back - CALL MOVE_ALLOC(InitLocal%Waves2%WaveTime, p%WaveTime) - CALL MOVE_ALLOC(InitLocal%Waves2%WaveElevC0, Waves_InitOut%WaveElevC0) - CALL MOVE_ALLOC(InitLocal%Waves2%WaveDirArr, Waves_InitOut%WaveDirArr) + CALL MOVE_ALLOC(InputFileData%Waves2%WaveTime, p%WaveTime) + CALL MOVE_ALLOC(InputFileData%Waves2%WaveElevC0, Waves_InitOut%WaveElevC0) + CALL MOVE_ALLOC(InputFileData%Waves2%WaveDirArr, Waves_InitOut%WaveDirArr) ! Verify that Waves2_Init() did not request a different Interval! @@ -796,7 +803,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! If we calculated the wave elevation series data (for visualization purposes), add the second order corrections to the first order. - IF (ALLOCATED(InitLocal%Waves2%WaveElevXY)) THEN + IF (ALLOCATED(InputFileData%Waves2%WaveElevXY)) THEN ! Make sure the sizes of the two resulting arrays are identical... IF ( SIZE(InitOut%WaveElevSeries,DIM=1) /= SIZE(InitOut%Waves2%WaveElevSeries2,DIM=1) .OR. & SIZE(InitOut%WaveElevSeries,DIM=2) /= SIZE(InitOut%Waves2%WaveElevSeries2,DIM=2)) THEN @@ -839,37 +846,37 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I p%Waves2%WvSumQTFF = .FALSE. p%Waves2%NumOuts = 0 - ENDIF ! InitLocal%Waves2%WvDiffQTFF .OR. InitLocal%Waves2%WvSumQTFF + ENDIF ! InputFileData%Waves2%WvDiffQTFF .OR. InputFileData%Waves2%WvSumQTFF ! Is there a WAMIT body? - IF ( InitLocal%PotMod == 1 ) THEN - p%nWAMITObj = InitLocal%nWAMITObj ! All the data for the various WAMIT bodies are stored in a single WAMIT file - p%vecMultiplier = InitLocal%vecMultiplier ! Multiply all vectors and matrices row/column lengths by NBody - InitLocal%WAMIT%NBodyMod = InitLocal%NBodyMod - InitLocal%WAMIT%Gravity = InitLocal%Gravity - InitLocal%WAMIT%WtrDpth = InitLocal%Morison%WtrDpth ! The data in InitLocal%Morison%WtrDpth was directly placed there when we parsed the HydroDyn input file - p%NBody = InitLocal%NBody - p%NBodyMod = InitLocal%NBodyMod + IF ( InputFileData%PotMod == 1 ) THEN + p%nWAMITObj = InputFileData%nWAMITObj ! All the data for the various WAMIT bodies are stored in a single WAMIT file + p%vecMultiplier = InputFileData%vecMultiplier ! Multiply all vectors and matrices row/column lengths by NBody + InputFileData%WAMIT%NBodyMod = InputFileData%NBodyMod + InputFileData%WAMIT%Gravity = InitInp%Gravity + InputFileData%WAMIT%WtrDpth = InputFileData%Morison%WtrDpth ! The data in InputFileData%Morison%WtrDpth was directly placed there when we parsed the HydroDyn input file + p%NBody = InputFileData%NBody + p%NBodyMod = InputFileData%NBodyMod - call AllocAry( m%F_PtfmAdd, 6*InitLocal%NBody, "m%F_PtfmAdd", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( m%F_Waves , 6*InitLocal%NBody, "m%F_Waves" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( m%F_PtfmAdd, 6*InputFileData%NBody, "m%F_PtfmAdd", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( m%F_Waves , 6*InputFileData%NBody, "m%F_Waves" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! Determine how many WAMIT modules we need based on NBody and NBodyMod if (p%NBodyMod == 1) then - InitLocal%WAMIT%NBody = InitLocal%NBody ! The WAMIT object will contain all NBody WAMIT bodies + InputFileData%WAMIT%NBody = InputFileData%NBody ! The WAMIT object will contain all NBody WAMIT bodies ! Allocate WAMIT InitInp arrays based on NBodyMod and copy the inputfile data into the WAMIT init data (entire arrays' worth for NBodyMod=1 - call AllocAry( InitLocal%WAMIT%PtfmVol0 , InitLocal%NBody, "PtfmVol0" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmRefxt , InitLocal%NBody, "PtfmRefxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmRefyt , InitLocal%NBody, "PtfmRefyt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmRefzt , InitLocal%NBody, "PtfmRefzt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmRefztRot, InitLocal%NBody, "PtfmRefztRot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmCOBxt , InitLocal%NBody, "PtfmCOBxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmCOByt , InitLocal%NBody, "PtfmCOByt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmVol0 , InputFileData%NBody, "PtfmVol0" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmRefxt , InputFileData%NBody, "PtfmRefxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmRefyt , InputFileData%NBody, "PtfmRefyt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmRefzt , InputFileData%NBody, "PtfmRefzt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmRefztRot, InputFileData%NBody, "PtfmRefztRot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmCOBxt , InputFileData%NBody, "PtfmCOBxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmCOByt , InputFileData%NBody, "PtfmCOByt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) allocate( p%WAMIT( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array p%WAMIT.', ErrStat, ErrMsg, RoutineName ) allocate( x%WAMIT( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array x%WAMIT.', ErrStat, ErrMsg, RoutineName ) allocate( xd%WAMIT( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array xd%WAMIT.', ErrStat, ErrMsg, RoutineName ) @@ -879,41 +886,41 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I allocate( m%u_WAMIT( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%u_WAMIT.', ErrStat, ErrMsg, RoutineName ) allocate( InitOut%WAMIT( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array InitOut%WAMIT.', ErrStat, ErrMsg, RoutineName ) - InitLocal%WAMIT%PtfmVol0 = InitLocal%PtfmVol0 - InitLocal%WAMIT%WAMITULEN = InitLocal%WAMITULEN(1) - InitLocal%WAMIT%PtfmRefxt = InitLocal%PtfmRefxt - InitLocal%WAMIT%PtfmRefyt = InitLocal%PtfmRefyt - InitLocal%WAMIT%PtfmRefzt = InitLocal%PtfmRefzt - InitLocal%WAMIT%PtfmRefztRot = InitLocal%PtfmRefztRot - InitLocal%WAMIT%PtfmCOBxt = InitLocal%PtfmCOBxt - InitLocal%WAMIT%PtfmCOByt = InitLocal%PtfmCOByt + InputFileData%WAMIT%PtfmVol0 = InputFileData%PtfmVol0 + InputFileData%WAMIT%WAMITULEN = InputFileData%WAMITULEN(1) + InputFileData%WAMIT%PtfmRefxt = InputFileData%PtfmRefxt + InputFileData%WAMIT%PtfmRefyt = InputFileData%PtfmRefyt + InputFileData%WAMIT%PtfmRefzt = InputFileData%PtfmRefzt + InputFileData%WAMIT%PtfmRefztRot = InputFileData%PtfmRefztRot + InputFileData%WAMIT%PtfmCOBxt = InputFileData%PtfmCOBxt + InputFileData%WAMIT%PtfmCOByt = InputFileData%PtfmCOByt else - InitLocal%WAMIT%NBody = 1 ! Each WAMIT object will only contain one of the NBody WAMIT bodies + InputFileData%WAMIT%NBody = 1 ! Each WAMIT object will only contain one of the NBody WAMIT bodies ! Allocate WAMIT InitInp arrays based on NBodyMod and copy the inputfile data into the 1st WAMIT body init data for NBodyMod > 1 - call AllocAry( InitLocal%WAMIT%PtfmVol0 , 1, "PtfmVol0" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmRefxt , 1, "PtfmRefxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmRefyt , 1, "PtfmRefyt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmRefzt , 1, "PtfmRefzt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmRefztRot, 1, "PtfmRefztRot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmCOBxt , 1, "PtfmCOBxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT%PtfmCOByt , 1, "PtfmCOByt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - allocate( p%WAMIT( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array p%WAMIT.', ErrStat, ErrMsg, RoutineName ) - allocate( x%WAMIT( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array x%WAMIT.', ErrStat, ErrMsg, RoutineName ) - allocate( xd%WAMIT( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array xd%WAMIT.', ErrStat, ErrMsg, RoutineName ) - allocate( OtherState%WAMIT(InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array OtherState%WAMIT.', ErrStat, ErrMsg, RoutineName ) - allocate( y%WAMIT( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array y%WAMIT.', ErrStat, ErrMsg, RoutineName ) - allocate( m%WAMIT( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%WAMIT.', ErrStat, ErrMsg, RoutineName ) - allocate( m%u_WAMIT( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%u_WAMIT.', ErrStat, ErrMsg, RoutineName ) - allocate( InitOut%WAMIT( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array InitOut%WAMIT.', ErrStat, ErrMsg, RoutineName ) - InitLocal%WAMIT%PtfmVol0 (1) = InitLocal%PtfmVol0 (1) - InitLocal%WAMIT%WAMITULEN = InitLocal%WAMITULEN (1) - InitLocal%WAMIT%PtfmRefxt (1) = InitLocal%PtfmRefxt (1) - InitLocal%WAMIT%PtfmRefyt (1) = InitLocal%PtfmRefyt (1) - InitLocal%WAMIT%PtfmRefzt (1) = InitLocal%PtfmRefzt (1) - InitLocal%WAMIT%PtfmRefztRot(1) = InitLocal%PtfmRefztRot(1) - InitLocal%WAMIT%PtfmCOBxt (1) = InitLocal%PtfmCOBxt (1) - InitLocal%WAMIT%PtfmCOByt (1) = InitLocal%PtfmCOByt (1) + call AllocAry( InputFileData%WAMIT%PtfmVol0 , 1, "PtfmVol0" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmRefxt , 1, "PtfmRefxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmRefyt , 1, "PtfmRefyt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmRefzt , 1, "PtfmRefzt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmRefztRot, 1, "PtfmRefztRot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmCOBxt , 1, "PtfmCOBxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%PtfmCOByt , 1, "PtfmCOByt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + allocate( p%WAMIT( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array p%WAMIT.', ErrStat, ErrMsg, RoutineName ) + allocate( x%WAMIT( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array x%WAMIT.', ErrStat, ErrMsg, RoutineName ) + allocate( xd%WAMIT( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array xd%WAMIT.', ErrStat, ErrMsg, RoutineName ) + allocate( OtherState%WAMIT(InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array OtherState%WAMIT.', ErrStat, ErrMsg, RoutineName ) + allocate( y%WAMIT( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array y%WAMIT.', ErrStat, ErrMsg, RoutineName ) + allocate( m%WAMIT( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%WAMIT.', ErrStat, ErrMsg, RoutineName ) + allocate( m%u_WAMIT( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%u_WAMIT.', ErrStat, ErrMsg, RoutineName ) + allocate( InitOut%WAMIT( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array InitOut%WAMIT.', ErrStat, ErrMsg, RoutineName ) + InputFileData%WAMIT%PtfmVol0 (1) = InputFileData%PtfmVol0 (1) + InputFileData%WAMIT%WAMITULEN = InputFileData%WAMITULEN (1) + InputFileData%WAMIT%PtfmRefxt (1) = InputFileData%PtfmRefxt (1) + InputFileData%WAMIT%PtfmRefyt (1) = InputFileData%PtfmRefyt (1) + InputFileData%WAMIT%PtfmRefzt (1) = InputFileData%PtfmRefzt (1) + InputFileData%WAMIT%PtfmRefztRot(1) = InputFileData%PtfmRefztRot(1) + InputFileData%WAMIT%PtfmCOBxt (1) = InputFileData%PtfmCOBxt (1) + InputFileData%WAMIT%PtfmCOByt (1) = InputFileData%PtfmCOByt (1) end if @@ -924,23 +931,23 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Copy Waves initialization output into the initialization input type for the WAMIT module - InitLocal%WAMIT%RhoXg = Waves_InitOut%RhoXg - InitLocal%WAMIT%NStepWave = Waves_InitOut%NStepWave - InitLocal%WAMIT%NStepWave2 = Waves_InitOut%NStepWave2 - InitLocal%WAMIT%WaveDirMin = Waves_InitOut%WaveDirMin - InitLocal%WAMIT%WaveDirMax = Waves_InitOut%WaveDirMax - InitLocal%WAMIT%WaveDOmega = Waves_InitOut%WaveDOmega + InputFileData%WAMIT%RhoXg = Waves_InitOut%RhoXg + InputFileData%WAMIT%NStepWave = Waves_InitOut%NStepWave + InputFileData%WAMIT%NStepWave2 = Waves_InitOut%NStepWave2 + InputFileData%WAMIT%WaveDirMin = Waves_InitOut%WaveDirMin + InputFileData%WAMIT%WaveDirMax = Waves_InitOut%WaveDirMax + InputFileData%WAMIT%WaveDOmega = Waves_InitOut%WaveDOmega ! Init inputs for the SS_Excitation model (set this just in case it will be used) - InitLocal%WAMIT%WaveDir = Waves_InitOut%WaveDir - CALL MOVE_ALLOC(Waves_InitOut%WaveElev0, InitLocal%WAMIT%WaveElev0) + InputFileData%WAMIT%WaveDir = Waves_InitOut%WaveDir + CALL MOVE_ALLOC(Waves_InitOut%WaveElev0, InputFileData%WAMIT%WaveElev0) ! Temporarily move arrays to init input for WAMIT (save some space) - CALL MOVE_ALLOC(p%WaveTime, InitLocal%WAMIT%WaveTime) - CALL MOVE_ALLOC(Waves_InitOut%WaveElevC0, InitLocal%WAMIT%WaveElevC0) - CALL MOVE_ALLOC(Waves_InitOut%WaveDirArr, InitLocal%WAMIT%WaveDirArr) + CALL MOVE_ALLOC(p%WaveTime, InputFileData%WAMIT%WaveTime) + CALL MOVE_ALLOC(Waves_InitOut%WaveElevC0, InputFileData%WAMIT%WaveElevC0) + CALL MOVE_ALLOC(Waves_InitOut%WaveDirArr, InputFileData%WAMIT%WaveDirArr) - CALL WAMIT_Init(InitLocal%WAMIT, m%u_WAMIT(1), p%WAMIT(1), x%WAMIT(1), xd%WAMIT(1), z%WAMIT, OtherState%WAMIT(1), & + CALL WAMIT_Init(InputFileData%WAMIT, m%u_WAMIT(1), p%WAMIT(1), x%WAMIT(1), xd%WAMIT(1), z%WAMIT, OtherState%WAMIT(1), & y%WAMIT(1), m%WAMIT(1), Interval, InitOut%WAMIT(1), ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -954,17 +961,17 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I !----------------------------------------- ! Initialize the WAMIT Calculations !----------------------------------------- - InitLocal%WAMIT%WAMITFile = InitLocal%PotFile (i) - InitLocal%WAMIT%PtfmVol0 (1) = InitLocal%PtfmVol0 (i) - InitLocal%WAMIT%WAMITULEN = InitLocal%WAMITULEN (i) - InitLocal%WAMIT%PtfmRefxt (1) = InitLocal%PtfmRefxt (i) - InitLocal%WAMIT%PtfmRefyt (1) = InitLocal%PtfmRefyt (i) - InitLocal%WAMIT%PtfmRefzt (1) = InitLocal%PtfmRefzt (i) - InitLocal%WAMIT%PtfmRefztRot(1) = InitLocal%PtfmRefztRot(i) - InitLocal%WAMIT%PtfmCOBxt (1) = InitLocal%PtfmCOBxt (i) - InitLocal%WAMIT%PtfmCOByt (1) = InitLocal%PtfmCOByt (i) + InputFileData%WAMIT%WAMITFile = InputFileData%PotFile (i) + InputFileData%WAMIT%PtfmVol0 (1) = InputFileData%PtfmVol0 (i) + InputFileData%WAMIT%WAMITULEN = InputFileData%WAMITULEN (i) + InputFileData%WAMIT%PtfmRefxt (1) = InputFileData%PtfmRefxt (i) + InputFileData%WAMIT%PtfmRefyt (1) = InputFileData%PtfmRefyt (i) + InputFileData%WAMIT%PtfmRefzt (1) = InputFileData%PtfmRefzt (i) + InputFileData%WAMIT%PtfmRefztRot(1) = InputFileData%PtfmRefztRot(i) + InputFileData%WAMIT%PtfmCOBxt (1) = InputFileData%PtfmCOBxt (i) + InputFileData%WAMIT%PtfmCOByt (1) = InputFileData%PtfmCOByt (i) - CALL WAMIT_Init(InitLocal%WAMIT, m%u_WAMIT(i), p%WAMIT(i), x%WAMIT(i), xd%WAMIT(i), z%WAMIT, OtherState%WAMIT(i), & + CALL WAMIT_Init(InputFileData%WAMIT, m%u_WAMIT(i), p%WAMIT(i), x%WAMIT(i), xd%WAMIT(i), z%WAMIT, OtherState%WAMIT(i), & y%WAMIT(i), m%WAMIT(i), Interval, InitOut%WAMIT(i), ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -975,18 +982,18 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Generate Summary file information for WAMIT module ! Compute the load contribution from hydrostatics: - IF ( InitLocal%UnSum > 0 ) THEN - do iBody = 1, InitLocal%NBody - WRITE( InitLocal%UnSum, '(A18,I5)') 'WAMIT Model - Body',iBody - WRITE( InitLocal%UnSum, '(A18)') '------------------' - WRITE( InitLocal%UnSum, '(A42,2X,ES15.6)') 'Displaced volume (m^3) :', InitLocal%PtfmVol0(iBody) - WRITE( InitLocal%UnSum, '(A42,2X,ES15.6)') 'X-offset of the center of buoyancy (m) :', InitLocal%PtfmCOBxt(iBody) - WRITE( InitLocal%UnSum, '(A42,2X,ES15.6)') 'Y-offset of the center of buoyancy (m) :', InitLocal%PtfmCOByt(iBody) - WRITE( InitLocal%UnSum, '(/)' ) - WRITE( InitLocal%UnSum, '(A81)' ) 'Buoyancy loads from members modelled with WAMIT, summed about ( 0.0, 0.0, 0.0 )' - WRITE( InitLocal%UnSum, '(18x,6(2X,A20))' ) ' BuoyFxi ', ' BuoyFyi ', ' BuoyFzi ', ' BuoyMxi ', ' BuoyMyi ', ' BuoyMzi ' - WRITE( InitLocal%UnSum, '(18x,6(2X,A20))' ) ' (N) ', ' (N) ', ' (N) ', ' (N-m) ', ' (N-m) ', ' (N-m) ' - WRITE( InitLocal%UnSum, '(A18,6(2X,ES20.6))') ' External: ',0.0,0.0,InitLocal%WAMIT%RhoXg*InitLocal%PtfmVol0(iBody),InitLocal%WAMIT%RhoXg*InitLocal%PtfmVol0(iBody)*InitLocal%PtfmCOByt(iBody), -InitLocal%WAMIT%RhoXg*InitLocal%PtfmVol0(iBody)*InitLocal%PtfmCOBxt(iBody), 0.0 ! and the moment about Y due to the COB being offset from the WAMIT reference point + IF ( InputFileData%UnSum > 0 ) THEN + do iBody = 1, InputFileData%NBody + WRITE( InputFileData%UnSum, '(A18,I5)') 'WAMIT Model - Body',iBody + WRITE( InputFileData%UnSum, '(A18)') '------------------' + WRITE( InputFileData%UnSum, '(A42,2X,ES15.6)') 'Displaced volume (m^3) :', InputFileData%PtfmVol0(iBody) + WRITE( InputFileData%UnSum, '(A42,2X,ES15.6)') 'X-offset of the center of buoyancy (m) :', InputFileData%PtfmCOBxt(iBody) + WRITE( InputFileData%UnSum, '(A42,2X,ES15.6)') 'Y-offset of the center of buoyancy (m) :', InputFileData%PtfmCOByt(iBody) + WRITE( InputFileData%UnSum, '(/)' ) + WRITE( InputFileData%UnSum, '(A81)' ) 'Buoyancy loads from members modelled with WAMIT, summed about ( 0.0, 0.0, 0.0 )' + WRITE( InputFileData%UnSum, '(18x,6(2X,A20))' ) ' BuoyFxi ', ' BuoyFyi ', ' BuoyFzi ', ' BuoyMxi ', ' BuoyMyi ', ' BuoyMzi ' + WRITE( InputFileData%UnSum, '(18x,6(2X,A20))' ) ' (N) ', ' (N) ', ' (N) ', ' (N-m) ', ' (N-m) ', ' (N-m) ' + WRITE( InputFileData%UnSum, '(A18,6(2X,ES20.6))') ' External: ',0.0,0.0,InputFileData%WAMIT%RhoXg*InputFileData%PtfmVol0(iBody),InputFileData%WAMIT%RhoXg*InputFileData%PtfmVol0(iBody)*InputFileData%PtfmCOByt(iBody), -InputFileData%WAMIT%RhoXg*InputFileData%PtfmVol0(iBody)*InputFileData%PtfmCOBxt(iBody), 0.0 ! and the moment about Y due to the COB being offset from the WAMIT reference point end do END IF @@ -1001,9 +1008,9 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! move arrays back - CALL MOVE_ALLOC(InitLocal%WAMIT%WaveTime, p%WaveTime ) - CALL MOVE_ALLOC(InitLocal%WAMIT%WaveElevC0, Waves_InitOut%WaveElevC0) - CALL MOVE_ALLOC(InitLocal%WAMIT%WaveDirArr, Waves_InitOut%WaveDirArr) + CALL MOVE_ALLOC(InputFileData%WAMIT%WaveTime, p%WaveTime ) + CALL MOVE_ALLOC(InputFileData%WAMIT%WaveElevC0, Waves_InitOut%WaveElevC0) + CALL MOVE_ALLOC(InputFileData%WAMIT%WaveDirArr, Waves_InitOut%WaveDirArr) !----------------------------------------- @@ -1011,39 +1018,39 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I !----------------------------------------- ! Only call the WAMIT2_Init if one of the flags is set for a calculation - IF ( InitLocal%WAMIT2%MnDriftF .OR. InitLocal%WAMIT2%NewmanAppF .OR. InitLocal%WAMIT2%DiffQTFF .OR. InitLocal%WAMIT2%SumQTFF ) THEN + IF ( InputFileData%WAMIT2%MnDriftF .OR. InputFileData%WAMIT2%NewmanAppF .OR. InputFileData%WAMIT2%DiffQTFF .OR. InputFileData%WAMIT2%SumQTFF ) THEN ! Flag required for indicating when to try using arrays that are allocated p%WAMIT2used = .TRUE. ! Temporarily move arrays to init input for WAMIT2 (save some space) - CALL MOVE_ALLOC(p%WaveTime, InitLocal%WAMIT2%WaveTime) - CALL MOVE_ALLOC(Waves_InitOut%WaveElevC0, InitLocal%WAMIT2%WaveElevC0) - CALL MOVE_ALLOC(Waves_InitOut%WaveDirArr, InitLocal%WAMIT2%WaveDirArr) + CALL MOVE_ALLOC(p%WaveTime, InputFileData%WAMIT2%WaveTime) + CALL MOVE_ALLOC(Waves_InitOut%WaveElevC0, InputFileData%WAMIT2%WaveElevC0) + CALL MOVE_ALLOC(Waves_InitOut%WaveDirArr, InputFileData%WAMIT2%WaveDirArr) ! Copy Waves initialization output into the initialization input type for the WAMIT module - InitLocal%WAMIT2%RhoXg = Waves_InitOut%RhoXg - InitLocal%WAMIT2%NStepWave = Waves_InitOut%NStepWave - InitLocal%WAMIT2%NStepWave2 = Waves_InitOut%NStepWave2 - InitLocal%WAMIT2%WaveDirMin = Waves_InitOut%WaveDirMin - InitLocal%WAMIT2%WaveDirMax = Waves_InitOut%WaveDirMax - InitLocal%WAMIT2%WaveDOmega = Waves_InitOut%WaveDOmega - InitLocal%WAMIT2%Gravity = InitLocal%Gravity - InitLocal%WAMIT2%WtrDpth = InitLocal%Morison%WtrDpth ! The data in InitLocal%Morison%WtrDpth was directly placed there when we parsed the HydroDyn input file + InputFileData%WAMIT2%RhoXg = Waves_InitOut%RhoXg + InputFileData%WAMIT2%NStepWave = Waves_InitOut%NStepWave + InputFileData%WAMIT2%NStepWave2 = Waves_InitOut%NStepWave2 + InputFileData%WAMIT2%WaveDirMin = Waves_InitOut%WaveDirMin + InputFileData%WAMIT2%WaveDirMax = Waves_InitOut%WaveDirMax + InputFileData%WAMIT2%WaveDOmega = Waves_InitOut%WaveDOmega + InputFileData%WAMIT2%Gravity = InitInp%Gravity + InputFileData%WAMIT2%WtrDpth = InputFileData%Morison%WtrDpth ! The data in InputFileData%Morison%WtrDpth was directly placed there when we parsed the HydroDyn input file ! Set values for all NBodyMods - InitLocal%WAMIT2%NBodyMod = InitLocal%NBodyMod ! There are restrictions in WAMIT2 on which files may be used for MnDriftF or NewmanAppF for BodyMod > 1 - InitLocal%WAMIT2%WAMITULEN = InitLocal%WAMITULEN(1) + InputFileData%WAMIT2%NBodyMod = InputFileData%NBodyMod ! There are restrictions in WAMIT2 on which files may be used for MnDriftF or NewmanAppF for BodyMod > 1 + InputFileData%WAMIT2%WAMITULEN = InputFileData%WAMITULEN(1) ! Determine how many WAMIT2 modules we need based on NBody and NBodyMod if (p%NBodyMod == 1) then - InitLocal%WAMIT2%NBody = InitLocal%NBody ! The WAMIT2 object will contain all NBody WAMIT2 bodies + InputFileData%WAMIT2%NBody = InputFileData%NBody ! The WAMIT2 object will contain all NBody WAMIT2 bodies ! Allocate WAMIT2 InitInp arrays based on NBodyMod and copy the inputfile data into the WAMIT2 init data (entire arrays' worth for NBodyMod=1 - call AllocAry( InitLocal%WAMIT2%PtfmRefxt , InitLocal%NBody, "PtfmRefxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT2%PtfmRefyt , InitLocal%NBody, "PtfmRefyt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT2%PtfmRefzt , InitLocal%NBody, "PtfmRefzt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT2%PtfmRefztRot, InitLocal%NBody, "PtfmRefztRot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT2%PtfmRefxt , InputFileData%NBody, "PtfmRefxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT2%PtfmRefyt , InputFileData%NBody, "PtfmRefyt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT2%PtfmRefzt , InputFileData%NBody, "PtfmRefzt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT2%PtfmRefztRot, InputFileData%NBody, "PtfmRefztRot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) allocate( p%WAMIT2( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array p%WAMIT2.', ErrStat, ErrMsg, RoutineName ) allocate( x%WAMIT2( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array x%WAMIT2.', ErrStat, ErrMsg, RoutineName ) allocate( xd%WAMIT2( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array xd%WAMIT2.', ErrStat, ErrMsg, RoutineName ) @@ -1052,31 +1059,31 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I allocate( m%WAMIT2( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%WAMIT2.', ErrStat, ErrMsg, RoutineName ) allocate( m%u_WAMIT2( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%u_WAMIT2.', ErrStat, ErrMsg, RoutineName ) allocate( InitOut%WAMIT2( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array InitOut%WAMIT2.', ErrStat, ErrMsg, RoutineName ) - InitLocal%WAMIT2%PtfmRefxt = InitLocal%PtfmRefxt - InitLocal%WAMIT2%PtfmRefyt = InitLocal%PtfmRefyt - InitLocal%WAMIT2%PtfmRefzt = InitLocal%PtfmRefzt - InitLocal%WAMIT2%PtfmRefztRot = InitLocal%PtfmRefztRot + InputFileData%WAMIT2%PtfmRefxt = InputFileData%PtfmRefxt + InputFileData%WAMIT2%PtfmRefyt = InputFileData%PtfmRefyt + InputFileData%WAMIT2%PtfmRefzt = InputFileData%PtfmRefzt + InputFileData%WAMIT2%PtfmRefztRot = InputFileData%PtfmRefztRot else - InitLocal%WAMIT2%NBody = 1_IntKi ! The WAMIT2 object will contain all NBody WAMIT2 bodies + InputFileData%WAMIT2%NBody = 1_IntKi ! The WAMIT2 object will contain all NBody WAMIT2 bodies ! Allocate WAMIT2 InitInp arrays based on NBodyMod and copy the inputfile data into the 1st WAMIT body init data for NBodyMod > 1 - call AllocAry( InitLocal%WAMIT2%PtfmRefxt , 1, "PtfmRefxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT2%PtfmRefyt , 1, "PtfmRefyt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT2%PtfmRefzt , 1, "PtfmRefzt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( InitLocal%WAMIT2%PtfmRefztRot, 1, "PtfmRefztRot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - allocate( p%WAMIT2( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array p%WAMIT2.', ErrStat, ErrMsg, RoutineName ) - allocate( x%WAMIT2( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array x%WAMIT2.', ErrStat, ErrMsg, RoutineName ) - allocate( xd%WAMIT2( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array xd%WAMIT2.', ErrStat, ErrMsg, RoutineName ) - allocate( OtherState%WAMIT2(InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array OtherState%WAMIT2.', ErrStat, ErrMsg, RoutineName ) - allocate( y%WAMIT2( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array y%WAMIT2.', ErrStat, ErrMsg, RoutineName ) - allocate( m%WAMIT2( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%WAMIT2.', ErrStat, ErrMsg, RoutineName ) - allocate( m%u_WAMIT2( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%u_WAMIT2.', ErrStat, ErrMsg, RoutineName ) - allocate( InitOut%WAMIT2( InitLocal%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array InitOut%WAMIT2.', ErrStat, ErrMsg, RoutineName ) - InitLocal%WAMIT2%PtfmRefxt (1) = InitLocal%PtfmRefxt (1) - InitLocal%WAMIT2%PtfmRefyt (1) = InitLocal%PtfmRefyt (1) - InitLocal%WAMIT2%PtfmRefzt (1) = InitLocal%PtfmRefzt (1) - InitLocal%WAMIT2%PtfmRefztRot(1) = InitLocal%PtfmRefztRot(1) + call AllocAry( InputFileData%WAMIT2%PtfmRefxt , 1, "PtfmRefxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT2%PtfmRefyt , 1, "PtfmRefyt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT2%PtfmRefzt , 1, "PtfmRefzt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT2%PtfmRefztRot, 1, "PtfmRefztRot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + allocate( p%WAMIT2( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array p%WAMIT2.', ErrStat, ErrMsg, RoutineName ) + allocate( x%WAMIT2( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array x%WAMIT2.', ErrStat, ErrMsg, RoutineName ) + allocate( xd%WAMIT2( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array xd%WAMIT2.', ErrStat, ErrMsg, RoutineName ) + allocate( OtherState%WAMIT2(InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array OtherState%WAMIT2.', ErrStat, ErrMsg, RoutineName ) + allocate( y%WAMIT2( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array y%WAMIT2.', ErrStat, ErrMsg, RoutineName ) + allocate( m%WAMIT2( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%WAMIT2.', ErrStat, ErrMsg, RoutineName ) + allocate( m%u_WAMIT2( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array m%u_WAMIT2.', ErrStat, ErrMsg, RoutineName ) + allocate( InitOut%WAMIT2( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array InitOut%WAMIT2.', ErrStat, ErrMsg, RoutineName ) + InputFileData%WAMIT2%PtfmRefxt (1) = InputFileData%PtfmRefxt (1) + InputFileData%WAMIT2%PtfmRefyt (1) = InputFileData%PtfmRefyt (1) + InputFileData%WAMIT2%PtfmRefzt (1) = InputFileData%PtfmRefzt (1) + InputFileData%WAMIT2%PtfmRefztRot(1) = InputFileData%PtfmRefztRot(1) endif @@ -1085,7 +1092,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I return end if - CALL WAMIT2_Init(InitLocal%WAMIT2, m%u_WAMIT2(1), p%WAMIT2(1), x%WAMIT2(1), xd%WAMIT2(1), z%WAMIT2, OtherState%WAMIT2(1), & + CALL WAMIT2_Init(InputFileData%WAMIT2, m%u_WAMIT2(1), p%WAMIT2(1), x%WAMIT2(1), xd%WAMIT2(1), z%WAMIT2, OtherState%WAMIT2(1), & y%WAMIT2(1), m%WAMIT2(1), Interval, InitOut%WAMIT2(1), ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -1095,14 +1102,14 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! For NBodyMod > 1 and NBody > 1, set the body info and init the WAMIT2 body do i = 2, p%nWAMITObj - InitLocal%WAMIT2%WAMITFile = InitLocal%PotFile (i) - InitLocal%WAMIT2%WAMITULEN = InitLocal%WAMITULEN (i) - InitLocal%WAMIT2%PtfmRefxt (1) = InitLocal%PtfmRefxt (i) - InitLocal%WAMIT2%PtfmRefyt (1) = InitLocal%PtfmRefyt (i) - InitLocal%WAMIT2%PtfmRefzt (1) = InitLocal%PtfmRefzt (i) - InitLocal%WAMIT2%PtfmRefztRot(1) = InitLocal%PtfmRefztRot(i) - - CALL WAMIT2_Init(InitLocal%WAMIT2, m%u_WAMIT2(i), p%WAMIT2(i), x%WAMIT2(i), xd%WAMIT2(i), z%WAMIT2, OtherState%WAMIT2(i), & + InputFileData%WAMIT2%WAMITFile = InputFileData%PotFile (i) + InputFileData%WAMIT2%WAMITULEN = InputFileData%WAMITULEN (i) + InputFileData%WAMIT2%PtfmRefxt (1) = InputFileData%PtfmRefxt (i) + InputFileData%WAMIT2%PtfmRefyt (1) = InputFileData%PtfmRefyt (i) + InputFileData%WAMIT2%PtfmRefzt (1) = InputFileData%PtfmRefzt (i) + InputFileData%WAMIT2%PtfmRefztRot(1) = InputFileData%PtfmRefztRot(i) + + CALL WAMIT2_Init(InputFileData%WAMIT2, m%u_WAMIT2(i), p%WAMIT2(i), x%WAMIT2(i), xd%WAMIT2(i), z%WAMIT2, OtherState%WAMIT2(i), & y%WAMIT2(i), m%WAMIT2(i), Interval, InitOut%WAMIT2(i), ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -1113,9 +1120,9 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! move arrays back - CALL MOVE_ALLOC(InitLocal%WAMIT2%WaveTime, p%WaveTime ) - CALL MOVE_ALLOC(InitLocal%WAMIT2%WaveElevC0, Waves_InitOut%WaveElevC0) - CALL MOVE_ALLOC(InitLocal%WAMIT2%WaveDirArr, Waves_InitOut%WaveDirArr) + CALL MOVE_ALLOC(InputFileData%WAMIT2%WaveTime, p%WaveTime ) + CALL MOVE_ALLOC(InputFileData%WAMIT2%WaveElevC0, Waves_InitOut%WaveElevC0) + CALL MOVE_ALLOC(InputFileData%WAMIT2%WaveDirArr, Waves_InitOut%WaveDirArr) ! Verify that WAMIT2_Init() did not request a different Interval! @@ -1139,14 +1146,14 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ENDIF #ifdef USE_FIT - ELSE IF ( InitLocal%PotMod == 2 ) THEN ! FIT + ELSE IF ( InputFileData%PotMod == 2 ) THEN ! FIT ! Set up the Initialization data for FIT ! General - FITInitData%InputFile = InitLocal%PotFile - FITInitData%Gravity = InitLocal%Gravity - FITInitData%Rho = InitLocal%Waves%WtrDens - FITInitData%time_end = InitLocal%TMax - FITInitData%dtime = InitLocal%Waves%WaveDT ! Set the FIT module's timestep equal to the WaveDT timestep, this was checked earlier to make sure it is an integer muliple of the glue-code timestep! + FITInitData%InputFile = InputFileData%PotFile + FITInitData%Gravity = InputFileData%Gravity + FITInitData%Rho = InputFileData%Waves%WtrDens + FITInitData%time_end = InitInp%TMax + FITInitData%dtime = InputFileData%Waves%WaveDT ! Set the FIT module's timestep equal to the WaveDT timestep, this was checked earlier to make sure it is an integer muliple of the glue-code timestep! ! Waves ! Need to pre-process the incoming wave data to be compatible with FIT @@ -1175,14 +1182,14 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I dftimag = Waves_InitOut%WaveElevC0( 2, ABS(I ) )*SIGN(1,I) FITInitData%Wave_amp (I) = sqrt( dftreal**2 + dftimag**2 ) * 2.0 / Np FITInitData%Wave_omega (I) = I*Waves_InitOut%WaveDOmega - FITInitData%Wave_number(I) = I*Waves_InitOut%WaveDOmega**2. / InitLocal%Gravity + FITInitData%Wave_number(I) = I*Waves_InitOut%WaveDOmega**2. / InputFileData%Gravity FITInitData%Wave_phase (I) = atan2( dftimag, dftreal ) END DO ! Output - FITInitData%RootName = trim(InitLocal%OutRootName)//'.FIT' + FITInitData%RootName = trim(InputFileData%OutRootName)//'.FIT' CALL FIT_Init(FITInitData, u%FIT, p%FIT, FIT_x, xd%FIT, FIT_z, OtherState%FIT, y%FIT, Interval, FIT_InitOut, ErrStat2, ErrMsg2 ) @@ -1197,22 +1204,22 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Are there Morison elements? - IF ( InitLocal%Morison%NMembers > 0 ) THEN + IF ( InputFileData%Morison%NMembers > 0 ) THEN ! Copy Waves initialization output into the initialization input type for the Morison module - InitLocal%Morison%NStepWave = Waves_InitOut%NStepWave + InputFileData%Morison%NStepWave = Waves_InitOut%NStepWave ! Temporarily move array to init input for Morison (save some space) - CALL MOVE_ALLOC( p%WaveTime, InitLocal%Morison%WaveTime ) + CALL MOVE_ALLOC( p%WaveTime, InputFileData%Morison%WaveTime ) ! Permanently move these wave values to Morison init input (and note they are potentially modified by 2nd order stuff before being sent to Morison) - CALL MOVE_ALLOC( Waves_InitOut%WaveAcc, InitLocal%Morison%WaveAcc ) - CALL MOVE_ALLOC( Waves_InitOut%WaveDynP, InitLocal%Morison%WaveDynP ) - CALL MOVE_ALLOC( Waves_InitOut%WaveVel, InitLocal%Morison%WaveVel ) - CALL MOVE_ALLOC( Waves_InitOut%nodeInWater,InitLocal%Morison%nodeInWater ) ! moved to Morison%p%nodeInWater in the init routine + CALL MOVE_ALLOC( Waves_InitOut%WaveAcc, InputFileData%Morison%WaveAcc ) + CALL MOVE_ALLOC( Waves_InitOut%WaveDynP, InputFileData%Morison%WaveDynP ) + CALL MOVE_ALLOC( Waves_InitOut%WaveVel, InputFileData%Morison%WaveVel ) + CALL MOVE_ALLOC( Waves_InitOut%nodeInWater,InputFileData%Morison%nodeInWater ) ! moved to Morison%p%nodeInWater in the init routine ! If we did some second order wave kinematics corrections to the acceleration, velocity or @@ -1223,47 +1230,47 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I IF ( p%Waves2%WvDiffQTFF ) THEN ! Dynamic pressure -- difference frequency terms - IF ( SIZE(InitLocal%Morison%WaveDynP,DIM=1) /= SIZE(InitOut%Waves2%WaveDynP2D,DIM=1) .OR. & - SIZE(InitLocal%Morison%WaveDynP,DIM=2) /= SIZE(InitOut%Waves2%WaveDynP2D,DIM=2)) THEN + IF ( SIZE(InputFileData%Morison%WaveDynP,DIM=1) /= SIZE(InitOut%Waves2%WaveDynP2D,DIM=1) .OR. & + SIZE(InputFileData%Morison%WaveDynP,DIM=2) /= SIZE(InitOut%Waves2%WaveDynP2D,DIM=2)) THEN CALL SetErrStat(ErrID_Fatal, & ' WaveDynP arrays for first and second order wave elevations are of different sizes. '//NewLine// & - 'Morrison: '// TRIM(Num2LStr(SIZE(InitLocal%Morison%WaveDynP,DIM=1)))//'x'// & - TRIM(Num2LStr(SIZE(InitLocal%Morison%WaveDynP,DIM=2)))//NewLine// & + 'Morrison: '// TRIM(Num2LStr(SIZE(InputFileData%Morison%WaveDynP,DIM=1)))//'x'// & + TRIM(Num2LStr(SIZE(InputFileData%Morison%WaveDynP,DIM=2)))//NewLine// & 'Waves2: '// TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=1)))//'x'// & TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=2))), & ErrStat,ErrMsg,RoutineName) CALL CleanUp() RETURN ELSE - InitLocal%Morison%WaveDynP = InitLocal%Morison%WaveDynP + InitOut%Waves2%WaveDynP2D - IF (InitLocal%Waves%WaveStMod > 0 ) WaveDynP0 = WaveDynP0 + WaveDynP2D0 + InputFileData%Morison%WaveDynP = InputFileData%Morison%WaveDynP + InitOut%Waves2%WaveDynP2D + IF (InputFileData%Waves%WaveStMod > 0 ) WaveDynP0 = WaveDynP0 + WaveDynP2D0 ENDIF ! Particle velocity -- difference frequency terms - IF ( SIZE(InitLocal%Morison%WaveVel,DIM=1) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=1) .OR. & - SIZE(InitLocal%Morison%WaveVel,DIM=2) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=2) .OR. & - SIZE(InitLocal%Morison%WaveVel,DIM=3) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=3)) THEN + IF ( SIZE(InputFileData%Morison%WaveVel,DIM=1) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=1) .OR. & + SIZE(InputFileData%Morison%WaveVel,DIM=2) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=2) .OR. & + SIZE(InputFileData%Morison%WaveVel,DIM=3) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=3)) THEN CALL SetErrStat(ErrID_Fatal, & ' WaveVel arrays for first and second order wave elevations are of different sizes.',ErrStat,ErrMsg,RoutineName) CALL CleanUp() RETURN ELSE - InitLocal%Morison%WaveVel = InitLocal%Morison%WaveVel + InitOut%Waves2%WaveVel2D - IF (InitLocal%Waves%WaveStMod > 0 ) WaveVel0 = WaveVel0 + WaveVel2D0 + InputFileData%Morison%WaveVel = InputFileData%Morison%WaveVel + InitOut%Waves2%WaveVel2D + IF (InputFileData%Waves%WaveStMod > 0 ) WaveVel0 = WaveVel0 + WaveVel2D0 ENDIF ! Particle acceleration -- difference frequency terms - IF ( SIZE(InitLocal%Morison%WaveAcc,DIM=1) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=1) .OR. & - SIZE(InitLocal%Morison%WaveAcc,DIM=2) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=2) .OR. & - SIZE(InitLocal%Morison%WaveAcc,DIM=3) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=3)) THEN + IF ( SIZE(InputFileData%Morison%WaveAcc,DIM=1) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=1) .OR. & + SIZE(InputFileData%Morison%WaveAcc,DIM=2) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=2) .OR. & + SIZE(InputFileData%Morison%WaveAcc,DIM=3) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=3)) THEN CALL SetErrStat(ErrID_Fatal, & ' WaveAcc arrays for first and second order wave elevations are of different sizes.',ErrStat,ErrMsg,RoutineName) CALL CleanUp() RETURN ELSE - InitLocal%Morison%WaveAcc = InitLocal%Morison%WaveAcc + InitOut%Waves2%WaveAcc2D - IF (InitLocal%Waves%WaveStMod > 0 ) WaveAcc0 = WaveAcc0 + WaveAcc2D0 + InputFileData%Morison%WaveAcc = InputFileData%Morison%WaveAcc + InitOut%Waves2%WaveAcc2D + IF (InputFileData%Waves%WaveStMod > 0 ) WaveAcc0 = WaveAcc0 + WaveAcc2D0 ENDIF ENDIF ! second order wave kinematics difference frequency results @@ -1272,46 +1279,46 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I IF ( p%Waves2%WvSumQTFF ) THEN ! Dynamic pressure -- sum frequency terms - IF ( SIZE(InitLocal%Morison%WaveDynP,DIM=1) /= SIZE(InitOut%Waves2%WaveDynP2S,DIM=1) .OR. & - SIZE(InitLocal%Morison%WaveDynP,DIM=2) /= SIZE(InitOut%Waves2%WaveDynP2S,DIM=2)) THEN + IF ( SIZE(InputFileData%Morison%WaveDynP,DIM=1) /= SIZE(InitOut%Waves2%WaveDynP2S,DIM=1) .OR. & + SIZE(InputFileData%Morison%WaveDynP,DIM=2) /= SIZE(InitOut%Waves2%WaveDynP2S,DIM=2)) THEN CALL SetErrStat(ErrID_Fatal, & ' WaveDynP arrays for first and second order wave elevations are of different sizes. '//NewLine// & - 'Morrison: '// TRIM(Num2LStr(SIZE(InitLocal%Morison%WaveDynP,DIM=1)))//'x'// & - TRIM(Num2LStr(SIZE(InitLocal%Morison%WaveDynP,DIM=2)))//NewLine// & + 'Morrison: '// TRIM(Num2LStr(SIZE(InputFileData%Morison%WaveDynP,DIM=1)))//'x'// & + TRIM(Num2LStr(SIZE(InputFileData%Morison%WaveDynP,DIM=2)))//NewLine// & 'Waves2: '// TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=1)))//'x'// & TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=2))), & ErrStat,ErrMsg,RoutineName) CALL CleanUp() RETURN ELSE - InitLocal%Morison%WaveDynP = InitLocal%Morison%WaveDynP + InitOut%Waves2%WaveDynP2S - IF (InitLocal%Waves%WaveStMod > 0 ) WaveDynP0 = WaveDynP0 + WaveDynP2S0 + InputFileData%Morison%WaveDynP = InputFileData%Morison%WaveDynP + InitOut%Waves2%WaveDynP2S + IF (InputFileData%Waves%WaveStMod > 0 ) WaveDynP0 = WaveDynP0 + WaveDynP2S0 ENDIF ! Particle velocity -- sum frequency terms - IF ( SIZE(InitLocal%Morison%WaveVel,DIM=1) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=1) .OR. & - SIZE(InitLocal%Morison%WaveVel,DIM=2) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=2) .OR. & - SIZE(InitLocal%Morison%WaveVel,DIM=3) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=3)) THEN + IF ( SIZE(InputFileData%Morison%WaveVel,DIM=1) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=1) .OR. & + SIZE(InputFileData%Morison%WaveVel,DIM=2) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=2) .OR. & + SIZE(InputFileData%Morison%WaveVel,DIM=3) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=3)) THEN CALL SetErrStat(ErrID_Fatal, & ' WaveVel arrays for first and second order wave elevations are of different sizes.',ErrStat,ErrMsg,RoutineName) CALL CleanUp() RETURN ELSE - InitLocal%Morison%WaveVel = InitLocal%Morison%WaveVel + InitOut%Waves2%WaveVel2S - IF (InitLocal%Waves%WaveStMod > 0 ) WaveVel0 = WaveVel0 + WaveVel2S0 + InputFileData%Morison%WaveVel = InputFileData%Morison%WaveVel + InitOut%Waves2%WaveVel2S + IF (InputFileData%Waves%WaveStMod > 0 ) WaveVel0 = WaveVel0 + WaveVel2S0 ENDIF ! Particle velocity -- sum frequency terms - IF ( SIZE(InitLocal%Morison%WaveAcc,DIM=1) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=1) .OR. & - SIZE(InitLocal%Morison%WaveAcc,DIM=2) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=2) .OR. & - SIZE(InitLocal%Morison%WaveAcc,DIM=3) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=3)) THEN + IF ( SIZE(InputFileData%Morison%WaveAcc,DIM=1) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=1) .OR. & + SIZE(InputFileData%Morison%WaveAcc,DIM=2) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=2) .OR. & + SIZE(InputFileData%Morison%WaveAcc,DIM=3) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=3)) THEN CALL SetErrStat(ErrID_Fatal, & ' WaveAcc arrays for first and second order wave elevations are of different sizes.',ErrStat,ErrMsg,RoutineName) CALL CleanUp() RETURN ELSE - InitLocal%Morison%WaveAcc = InitLocal%Morison%WaveAcc + InitOut%Waves2%WaveAcc2S - IF (InitLocal%Waves%WaveStMod > 0 ) WaveAcc0 = WaveAcc0 + WaveAcc2S0 + InputFileData%Morison%WaveAcc = InputFileData%Morison%WaveAcc + InitOut%Waves2%WaveAcc2S + IF (InputFileData%Waves%WaveStMod > 0 ) WaveAcc0 = WaveAcc0 + WaveAcc2S0 ENDIF ENDIF ! second order wave kinematics sum frequency results @@ -1322,13 +1329,13 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! We will call a new subroutine to perform this work. ! As an input, this code needs the kinematics at the (X,Y,0) location which in a Z-line above/below all the nodes where kinematics are computed. ! This code will alter the kinematics for stretching AND alter the nodeInWater array based on the combined wave elevation information - IF (InitLocal%Waves%WaveStMod > 0 ) THEN - call WvStretch_Init( InitLocal%Waves%WaveStMod, InitLocal%Waves%WtrDpth, InitLocal%Morison%NStepWave, InitLocal%Morison%NNodes, & - p%NWaveElev, WaveElevSt, InitLocal%Waves%WaveKinzi, InitLocal%Morison%WaveTime, & + IF (InputFileData%Waves%WaveStMod > 0 ) THEN + call WvStretch_Init( InputFileData%Waves%WaveStMod, InputFileData%Waves%WtrDpth, InputFileData%Morison%NStepWave, InputFileData%Morison%NNodes, & + p%NWaveElev, WaveElevSt, InputFileData%Waves%WaveKinzi, InputFileData%Morison%WaveTime, & WaveVel0, WaveAcc0, WaveDynP0, & Waves_InitOut%PWaveVel0, Waves_InitOut%PWaveAcc0, Waves_InitOut%PWaveDynP0, & - InitLocal%Morison%WaveVel, InitLocal%Morison%WaveAcc, InitLocal%Morison%WaveDynP, & - InitLocal%Morison%nodeInWater, ErrStat, ErrMsg ) + InputFileData%Morison%WaveVel, InputFileData%Morison%WaveAcc, InputFileData%Morison%WaveDynP, & + InputFileData%Morison%nodeInWater, ErrStat, ErrMsg ) DEALLOCATE(WaveElevSt) DEALLOCATE(WaveVel0) DEALLOCATE(WaveAcc0) @@ -1336,15 +1343,15 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I END IF !============================================================================== ! In this version, this can only be TRUE if the precomiler flag WRITE_WV_KIN set and WaveMod not equal to 5 or 6 and WvKinFile is a valid string - IF ( ( InitLocal%Waves%WaveMod == 5 .OR. InitLocal%Waves%WaveMod == 6 ) .AND. InitLocal%Echo ) THEN - call HDOut_WriteWvKinFiles( TRIM(InitLocal%Waves%WvKinFile)//'_ech', HydroDyn_ProgDesc, InitLocal%Morison%NStepWave, InitLocal%Morison%NNodes, & - p%NWaveElev, InitLocal%Morison%nodeInWater, p%WaveElev, InitLocal%Waves%WaveKinzi, InitLocal%Morison%WaveTime, & - InitLocal%Morison%WaveVel, InitLocal%Morison%WaveAcc, InitLocal%Morison%WaveDynP, & + IF ( ( InputFileData%Waves%WaveMod == 5 .OR. InputFileData%Waves%WaveMod == 6 ) .AND. InputFileData%Echo ) THEN + call HDOut_WriteWvKinFiles( TRIM(InputFileData%Waves%WvKinFile)//'_ech', HydroDyn_ProgDesc, InputFileData%Morison%NStepWave, InputFileData%Morison%NNodes, & + p%NWaveElev, InputFileData%Morison%nodeInWater, p%WaveElev, InputFileData%Waves%WaveKinzi, InputFileData%Morison%WaveTime, & + InputFileData%Morison%WaveVel, InputFileData%Morison%WaveAcc, InputFileData%Morison%WaveDynP, & ErrStat, ErrMsg ) - ELSE IF (InitLocal%Waves%WriteWvKin ) THEN - call HDOut_WriteWvKinFiles( TRIM(InitLocal%Waves%WvKinFile), HydroDyn_ProgDesc, InitLocal%Morison%NStepWave, InitLocal%Morison%NNodes, & - p%NWaveElev, InitLocal%Morison%nodeInWater, p%WaveElev, InitLocal%Waves%WaveKinzi, InitLocal%Morison%WaveTime, & - InitLocal%Morison%WaveVel, InitLocal%Morison%WaveAcc, InitLocal%Morison%WaveDynP, & + ELSE IF (InputFileData%Waves%WriteWvKin ) THEN + call HDOut_WriteWvKinFiles( TRIM(InputFileData%Waves%WvKinFile), HydroDyn_ProgDesc, InputFileData%Morison%NStepWave, InputFileData%Morison%NNodes, & + p%NWaveElev, InputFileData%Morison%nodeInWater, p%WaveElev, InputFileData%Waves%WaveKinzi, InputFileData%Morison%WaveTime, & + InputFileData%Morison%WaveVel, InputFileData%Morison%WaveAcc, InputFileData%Morison%WaveDynP, & ErrStat, ErrMsg ) END IF @@ -1354,15 +1361,15 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Check the output switch to see if Morison is needing to send outputs back to HydroDyn via the WriteOutput array - IF ( InitLocal%OutSwtch > 0 ) THEN - InitLocal%Morison%OutSwtch = 2 ! only HydroDyn or the Driver code will write outputs to the file, that's why we are forcing this to 2. + IF ( InputFileData%OutSwtch > 0 ) THEN + InputFileData%Morison%OutSwtch = 2 ! only HydroDyn or the Driver code will write outputs to the file, that's why we are forcing this to 2. ELSE - InitLocal%Morison%OutSwtch = 0 + InputFileData%Morison%OutSwtch = 0 END IF ! Initialize the Morison Element Calculations - CALL Morison_Init(InitLocal%Morison, u%Morison, p%Morison, x%Morison, xd%Morison, z%Morison, OtherState%Morison, & + CALL Morison_Init(InputFileData%Morison, u%Morison, p%Morison, x%Morison, xd%Morison, z%Morison, OtherState%Morison, & y%Morison, m%Morison, Interval, InitOut%Morison, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN @@ -1371,7 +1378,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I END IF ! move array back - CALL MOVE_ALLOC( InitLocal%Morison%WaveTime, p%WaveTime ) + CALL MOVE_ALLOC( InputFileData%Morison%WaveTime, p%WaveTime ) IF ( u%Morison%Mesh%Committed ) THEN @@ -1401,90 +1408,90 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I RETURN END IF - END IF ! ( InitLocal%Morison%NMembers > 0 ) + END IF ! ( InputFileData%Morison%NMembers > 0 ) !=============================================== - p%PotMod = InitLocal%Potmod - IF ( InitLocal%UnSum > 0 ) THEN + p%PotMod = InputFileData%Potmod + IF ( InputFileData%UnSum > 0 ) THEN - IF (InitLocal%Waves%WaveMod /= 0 .AND. InitLocal%Waves%WaveMod /= 6) THEN + IF (InputFileData%Waves%WaveMod /= 0 .AND. InputFileData%Waves%WaveMod /= 6) THEN ! Write the header for this section - WRITE( InitLocal%UnSum, '(//)' ) - WRITE( InitLocal%UnSum, '(1X,A15)' ) 'Wave Kinematics' - WRITE( InitLocal%UnSum, '(/)' ) - WRITE( InitLocal%UnSum, '(1X,A10,2X,A14,2X,A14,2X,A14,2X,A19,2X,A19)' ) & + WRITE( InputFileData%UnSum, '(//)' ) + WRITE( InputFileData%UnSum, '(1X,A15)' ) 'Wave Kinematics' + WRITE( InputFileData%UnSum, '(/)' ) + WRITE( InputFileData%UnSum, '(1X,A10,2X,A14,2X,A14,2X,A14,2X,A19,2X,A19)' ) & ' m ', ' k ', ' Omega[m] ', ' Direction ', 'REAL(DFT{WaveElev})','IMAG(DFT{WaveElev})' - WRITE( InitLocal%UnSum, '(1X,A10,2X,A14,2X,A14,2X,A14,2X,A19,2X,A19)' ) & + WRITE( InputFileData%UnSum, '(1X,A10,2X,A14,2X,A14,2X,A14,2X,A19,2X,A19)' ) & ' (-) ', ' (1/m) ', ' (rad/s) ', ' (deg) ', ' (m) ',' (m) ' ! Write the data DO I = -1*Waves_InitOut%NStepWave2+1,Waves_InitOut%NStepWave2 - WaveNmbr = WaveNumber ( I*Waves_InitOut%WaveDOmega, InitLocal%Gravity, InitLocal%Waves%WtrDpth ) - WRITE( InitLocal%UnSum, '(1X,I10,2X,ES14.5,2X,ES14.5,2X,ES14.5,2X,ES14.5,7X,ES14.5)' ) I, WaveNmbr, I*Waves_InitOut%WaveDOmega, & + WaveNmbr = WaveNumber ( I*Waves_InitOut%WaveDOmega, InitInp%Gravity, InputFileData%Waves%WtrDpth ) + WRITE( InputFileData%UnSum, '(1X,I10,2X,ES14.5,2X,ES14.5,2X,ES14.5,2X,ES14.5,7X,ES14.5)' ) I, WaveNmbr, I*Waves_InitOut%WaveDOmega, & Waves_InitOut%WaveDirArr(ABS(I)), Waves_InitOut%WaveElevC0( 1,ABS(I ) ) , Waves_InitOut%WaveElevC0( 2, ABS(I ) )*SIGN(1,I) END DO END IF - IF ( InitLocal%PotMod == 1 .AND. InitLocal%WAMIT%RdtnMod == 1) THEN + IF ( InputFileData%PotMod == 1 .AND. InputFileData%WAMIT%RdtnMod == 1) THEN ! Write the header for this section: Note: When NBodyMod = 1 the kernel is now 6*NBody by 6*Nbody in size, ! and we have NBody 6 by 6 kernels for NBodyMod=2 or 3 if (p%NBodyMod == 1) then ! NBodyMod=1 kernel printout which is 6*NBody x 6*NBody long - WRITE( InitLocal%UnSum, '(//)' ) - WRITE( InitLocal%UnSum, '(A)' ) 'Radiation memory effect kernel' - WRITE( InitLocal%UnSum, '(//)' ) + WRITE( InputFileData%UnSum, '(//)' ) + WRITE( InputFileData%UnSum, '(A)' ) 'Radiation memory effect kernel' + WRITE( InputFileData%UnSum, '(//)' ) - WRITE( InitLocal%UnSum, '(1X,A10,2X,A10)',ADVANCE='no' ) ' n ' , ' t ' + WRITE( InputFileData%UnSum, '(1X,A10,2X,A10)',ADVANCE='no' ) ' n ' , ' t ' do i = 1,6*p%NBody do j = 1,6*p%NBody - WRITE( InitLocal%UnSum, '(2X,A16)',ADVANCE='no' ) 'K'//trim(num2lstr(i))//trim(num2lstr(j)) + WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) 'K'//trim(num2lstr(i))//trim(num2lstr(j)) end do end do - write(InitLocal%UnSum,'()') ! end of line character + write(InputFileData%UnSum,'()') ! end of line character - WRITE( InitLocal%UnSum, '(1X,A10,2X,A10)',ADVANCE='no' ) ' (-) ' , ' (s) ' + WRITE( InputFileData%UnSum, '(1X,A10,2X,A10)',ADVANCE='no' ) ' (-) ' , ' (s) ' do i = 1,6*p%NBody do j = 1,6*p%NBody if ( mod(i-1,6)+1 < 4 ) then if ( mod(j-1,6)+1 < 4 ) then - WRITE( InitLocal%UnSum, '(2X,A16)',ADVANCE='no' ) ' (kg/s^2) ' + WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) ' (kg/s^2) ' else - WRITE( InitLocal%UnSum, '(2X,A16)',ADVANCE='no' ) ' (kgm/s^2) ' + WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) ' (kgm/s^2) ' end if else if ( mod(j-1,6)+1 < 4 ) then - WRITE( InitLocal%UnSum, '(2X,A16)',ADVANCE='no' ) ' (kgm/s^2) ' + WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) ' (kgm/s^2) ' else - WRITE( InitLocal%UnSum, '(2X,A16)',ADVANCE='no' ) '(kgm^2/s^2)' + WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) '(kgm^2/s^2)' end if end if end do end do - write(InitLocal%UnSum,'()') ! end of line character + write(InputFileData%UnSum,'()') ! end of line character do k= 0,p%WAMIT(1)%Conv_Rdtn%NStepRdtn-1 - WRITE( InitLocal%UnSum, '(1X,I10,2X,E12.5)',ADVANCE='no' ) K, K*p%WAMIT(1)%Conv_Rdtn%RdtnDT + WRITE( InputFileData%UnSum, '(1X,I10,2X,E12.5)',ADVANCE='no' ) K, K*p%WAMIT(1)%Conv_Rdtn%RdtnDT do i = 1,6*p%NBody do j = 1,6*p%NBody - WRITE( InitLocal%UnSum, '(2X,ES16.5)',ADVANCE='no' ) p%WAMIT(1)%Conv_Rdtn%RdtnKrnl(k,i,j) + WRITE( InputFileData%UnSum, '(2X,ES16.5)',ADVANCE='no' ) p%WAMIT(1)%Conv_Rdtn%RdtnKrnl(k,i,j) end do end do - write(InitLocal%UnSum,'()') ! end of line character + write(InputFileData%UnSum,'()') ! end of line character end do else do j = 1,p%nWAMITObj - WRITE( InitLocal%UnSum, '(//)' ) - WRITE( InitLocal%UnSum, '(A)' ) 'Radiation memory effect kernel' - WRITE( InitLocal%UnSum, '(//)' ) - WRITE( InitLocal%UnSum, '(1X,A10,2X,A10,21(2X,A16))' ) ' n ' , ' t ', ' K11 ', ' K12 ', ' K13 ', ' K14 ', ' K15 ', ' K16 ', ' K22 ', ' K23 ', ' K24 ', ' K25 ', ' K26 ', ' K33 ', ' K34 ', ' K35 ', 'K36 ', ' K44 ', ' K45 ', ' K46 ', ' K55 ', ' K56 ', ' K66 ' - WRITE( InitLocal%UnSum, '(1X,A10,2X,A10,21(2X,A16))' ) ' (-) ' , ' (s) ', ' (kg/s^2) ', ' (kg/s^2) ', ' (kg/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kg/s^2) ', ' (kg/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kg/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)' + WRITE( InputFileData%UnSum, '(//)' ) + WRITE( InputFileData%UnSum, '(A)' ) 'Radiation memory effect kernel' + WRITE( InputFileData%UnSum, '(//)' ) + WRITE( InputFileData%UnSum, '(1X,A10,2X,A10,21(2X,A16))' ) ' n ' , ' t ', ' K11 ', ' K12 ', ' K13 ', ' K14 ', ' K15 ', ' K16 ', ' K22 ', ' K23 ', ' K24 ', ' K25 ', ' K26 ', ' K33 ', ' K34 ', ' K35 ', 'K36 ', ' K44 ', ' K45 ', ' K46 ', ' K55 ', ' K56 ', ' K66 ' + WRITE( InputFileData%UnSum, '(1X,A10,2X,A10,21(2X,A16))' ) ' (-) ' , ' (s) ', ' (kg/s^2) ', ' (kg/s^2) ', ' (kg/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kg/s^2) ', ' (kg/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kg/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)' ! Write the data DO I = 0,p%WAMIT(j)%Conv_Rdtn%NStepRdtn-1 - WRITE( InitLocal%UnSum, '(1X,I10,2X,E12.5,21(2X,ES16.5))' ) I, I*p%WAMIT(j)%Conv_Rdtn%RdtnDT, & + WRITE( InputFileData%UnSum, '(1X,I10,2X,E12.5,21(2X,ES16.5))' ) I, I*p%WAMIT(j)%Conv_Rdtn%RdtnDT, & p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,1), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,2), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,3), & p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,4), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,5), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,6), & p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,2,2), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,2,3), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,2,4), & @@ -1508,11 +1515,11 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I IF(ALLOCATED( Waves_InitOut%WaveTime )) DEALLOCATE( Waves_InitOut%WaveTime ) IF(ALLOCATED( Waves_InitOut%WaveVel )) DEALLOCATE( Waves_InitOut%WaveVel ) IF(ALLOCATED( Waves_InitOut%WaveElevC0 )) DEALLOCATE( Waves_InitOut%WaveElevC0 ) - !IF(ALLOCATED( InitLocal%WAMIT%WaveElevC0 )) DEALLOCATE( InitLocal%WAMIT%WaveElevC0) + !IF(ALLOCATED( InputFileData%WAMIT%WaveElevC0 )) DEALLOCATE( InputFileData%WAMIT%WaveElevC0) ! Close the summary file - IF ( InitLocal%HDSum ) THEN - CALL HDOut_CloseSum( InitLocal%UnSum, ErrStat2, ErrMsg2 ) + IF ( InputFileData%HDSum ) THEN + CALL HDOut_CloseSum( InputFileData%UnSum, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -1577,12 +1584,12 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) do iBody = 1, p%NBody - theta = (/ 0.0_R8Ki, 0.0_R8Ki, InitLocal%PtfmRefztRot(iBody)/) + theta = (/ 0.0_R8Ki, 0.0_R8Ki, InputFileData%PtfmRefztRot(iBody)/) orientation = EulerConstruct(theta) CALL MeshPositionNode (u%WAMITMesh & , iBody & - , (/InitLocal%PtfmRefxt(iBody), InitLocal%PtfmRefyt(iBody), InitLocal%PtfmRefzt(iBody)/) & + , (/InputFileData%PtfmRefxt(iBody), InputFileData%PtfmRefyt(iBody), InputFileData%PtfmRefzt(iBody)/) & , ErrStat2 & , ErrMsg2 & , orientation ) @@ -1663,15 +1670,15 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I m%AllHdroOrigin%RemapFlag = .TRUE. ! Create the Output file if requested - p%OutSwtch = InitLocal%OutSwtch + p%OutSwtch = InputFileData%OutSwtch p%Delim = '' !p%Morison%Delim = p%Delim ! Need to set this from within Morison to follow framework !p%WAMIT%Delim = p%Delim ! Need to set this from within Morison to follow framework - p%OutFmt = InitLocal%OutFmt - p%OutSFmt = InitLocal%OutSFmt - p%NumOuts = InitLocal%NumOuts + p%OutFmt = InputFileData%OutFmt + p%OutSFmt = InputFileData%OutSFmt + p%NumOuts = InputFileData%NumOuts - CALL HDOUT_Init( HydroDyn_ProgDesc, InitLocal, y, p, m, InitOut, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL HDOUT_Init( HydroDyn_ProgDesc, InitInp%OutRootName, InputFileData, y, p, m, InitOut, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() RETURN @@ -1693,13 +1700,13 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Define initialization-routine output here: InitOut%Ver = HydroDyn_ProgDesc ! These three come directly from processing the inputs, and so will exist even if not using Morison elements: - InitOut%WtrDens = InitLocal%Morison%WtrDens - InitOut%WtrDpth = InitLocal%Morison%WtrDpth - InitOut%MSL2SWL = InitLocal%Morison%MSL2SWL + InitOut%WtrDens = InputFileData%Morison%WtrDens + InitOut%WtrDpth = InputFileData%Morison%WtrDpth + InitOut%MSL2SWL = InputFileData%Morison%MSL2SWL p%WtrDpth = InitOut%WtrDpth - IF ( InitLocal%hasIce ) THEN - IF ((InitLocal%Waves%WaveMod /= 0) .OR. (InitLocal%Current%CurrMod /= 0) ) THEN + IF ( InitInp%hasIce ) THEN + IF ((InputFileData%Waves%WaveMod /= 0) .OR. (InputFileData%Current%CurrMod /= 0) ) THEN CALL SetErrStat(ErrID_Fatal,'Waves and Current must be turned off in HydroDyn when ice loading is computed. Set WaveMod=0 and CurrMod=0.',ErrStat,ErrMsg,RoutineName) END IF END IF @@ -1724,7 +1731,9 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I !................................ SUBROUTINE CleanUp() - CALL HydroDyn_DestroyInitInput( InitLocal, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL HydroDyn_DestroyInputFile( InputFileData, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL NWTC_Library_DestroyFileInfoType(InFileInfo,ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Waves_DestroyInitOutput( Waves_InitOut, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) CALL Current_DestroyInitOutput( Current_InitOut, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) @@ -1749,7 +1758,21 @@ SUBROUTINE CleanUp() CALL Current_DestroyOutput( Current_y, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) CALL Current_DestroyMisc( Current_m, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - + if (allocated(tmpWaveKinzi )) deallocate(tmpWaveKinzi ) + if (allocated(tmpWaveElevxi)) deallocate(tmpWaveElevxi) + if (allocated(tmpWaveElevyi)) deallocate(tmpWaveElevyi) + if (allocated(tmpWaveElevXY)) deallocate(tmpWaveElevXY) + if (allocated(WaveElevSt )) deallocate(WaveElevSt ) + if (allocated(WaveVel0 )) deallocate(WaveVel0 ) + if (allocated(WaveAcc0 )) deallocate(WaveAcc0 ) + if (allocated(WaveDynP0 )) deallocate(WaveDynP0 ) + if (allocated(WaveVel2S0 )) deallocate(WaveVel2S0 ) + if (allocated(WaveAcc2S0 )) deallocate(WaveAcc2S0 ) + if (allocated(WaveDynP2S0 )) deallocate(WaveDynP2S0 ) + if (allocated(WaveVel2D0 )) deallocate(WaveVel2D0 ) + if (allocated(WaveAcc2D0 )) deallocate(WaveAcc2D0 ) + if (allocated(WaveDynP2D0 )) deallocate(WaveDynP2D0 ) + END SUBROUTINE CleanUp !................................ END SUBROUTINE HydroDyn_Init diff --git a/modules/hydrodyn/src/HydroDyn.txt b/modules/hydrodyn/src/HydroDyn.txt index 494b0bc4a7..038fc676a1 100644 --- a/modules/hydrodyn/src/HydroDyn.txt +++ b/modules/hydrodyn/src/HydroDyn.txt @@ -24,21 +24,15 @@ usefrom WAMIT.txt usefrom WAMIT2.txt usefrom Morison.txt #usefrom FIT.txt + param HydroDyn/HydroDyn unused INTEGER MaxHDOutputs - 537 - "The maximum number of output channels supported by this module" - -typedef HydroDyn/HydroDyn InitInputType CHARACTER(1024) InputFile - - - "Supplied by Driver: full path and filename for the HydroDyn module" - -typedef ^ ^ LOGICAL UseInputFile - - - "Supplied by Driver: .TRUE. if using a input file, .FALSE. if all inputs are being passed in by the caller" - -typedef ^ ^ CHARACTER(1024) OutRootName - - - "Supplied by Driver: The name of the root file (without extension) including the full path" - -typedef ^ ^ Logical Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - -typedef ^ ^ DbKi DT - - - "Supplied by Driver: Simulation time step" "(sec)" -typedef ^ ^ ReKi Gravity - - - "Supplied by Driver: Gravitational acceleration" "(m/s^2)" -typedef ^ ^ ReKi defWtrDens - - - "Default water density from the driver; may be overwritten " "(kg/m^3)" -typedef ^ ^ ReKi defWtrDpth - - - "Default water depth from the driver; may be overwritten " "m" -typedef ^ ^ ReKi defMSL2SWL - - - "Default mean sea level to still water level from the driver; may be overwritten" "m" -typedef ^ ^ DbKi TMax - - - "Supplied by Driver: The total simulation time" "(sec)" -typedef ^ ^ LOGICAL HasIce - - - "Supplied by Driver: Whether this simulation has ice loading (flag)" - -typedef ^ ^ SiKi WaveElevXY {:}{:} - - "Supplied by Driver: X-Y locations for WaveElevation output (for visualization). First dimension is the X (1) and Y (2) coordinate. Second dimension is the point number." "m,-" -typedef ^ ^ ReKi PtfmLocationX - - - "Supplied by Driver: X coordinate of platform location in the wave field" "m" -typedef ^ ^ ReKi PtfmLocationY - - - "Supplied by Driver: Y coordinate of platform location in the wave field" "m" +param HydroDyn/HydroDyn unused INTEGER MaxUserOutputs - 4583 - " Total possible number of output channels: Waves2 = 18 + SS_Excitation = 7 + SS_Radiation = 7 + Morison= 4032 + HydroDyn=519 = 4583" - + +######################### +# ..... Input file data ........................................................................................................... +# This is data defined in the Input File for this module (or could otherwise be passed in) +# ..... Primary Input file data ................................................................................................... +typedef HydroDyn/HydroDyn HydroDyn_InputFile LOGICAL EchoFlag - - - "Echo the input file" - typedef ^ ^ ReKi AddF0 {:}{:} - - "Additional pre-load forces and moments (N,N,N,N-m,N-m,N-m)" - typedef ^ ^ ReKi AddCLin {:}{:}{:} - - "Additional stiffness matrix" - typedef ^ ^ ReKi AddBLin {:}{:}{:} - - "Additional linear damping matrix" - @@ -75,6 +69,23 @@ typedef ^ ^ LOGICAL typedef ^ ^ INTEGER UnSum - - - "File unit for the HydroDyn summary file [-1 = no summary file]" - typedef ^ ^ CHARACTER(20) OutFmt - - - "Output format for numerical results" - typedef ^ ^ CHARACTER(20) OutSFmt - - - "Output format for header strings" - + + + +typedef HydroDyn/HydroDyn InitInputType CHARACTER(1024) InputFile - - - "Supplied by Driver: full path and filename for the HydroDyn module" - +typedef ^ ^ LOGICAL UseInputFile - .TRUE. - "Supplied by Driver: .TRUE. if using a input file, .FALSE. if all inputs are being passed in by the caller" - +typedef ^ ^ FileInfoType PassedFileData - - - "If we don't use the input file, pass everything through this" - +typedef ^ ^ CHARACTER(1024) OutRootName - - - "Supplied by Driver: The name of the root file (without extension) including the full path" - +typedef ^ ^ Logical Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - +typedef ^ ^ ReKi Gravity - - - "Supplied by Driver: Gravitational acceleration" "(m/s^2)" +typedef ^ ^ ReKi defWtrDens - - - "Default water density from the driver; may be overwritten " "(kg/m^3)" +typedef ^ ^ ReKi defWtrDpth - - - "Default water depth from the driver; may be overwritten " "m" +typedef ^ ^ ReKi defMSL2SWL - - - "Default mean sea level to still water level from the driver; may be overwritten" "m" +typedef ^ ^ DbKi TMax - - - "Supplied by Driver: The total simulation time" "(sec)" +typedef ^ ^ LOGICAL HasIce - - - "Supplied by Driver: Whether this simulation has ice loading (flag)" - +typedef ^ ^ SiKi WaveElevXY {:}{:} - - "Supplied by Driver: X-Y locations for WaveElevation output (for visualization). First dimension is the X (1) and Y (2) coordinate. Second dimension is the point number." "m,-" +typedef ^ ^ ReKi PtfmLocationX - - - "Supplied by Driver: X coordinate of platform location in the wave field" "m" +typedef ^ ^ ReKi PtfmLocationY - - - "Supplied by Driver: Y coordinate of platform location in the wave field" "m" # # # Define outputs from the initialization routine here: diff --git a/modules/hydrodyn/src/HydroDyn_Input.f90 b/modules/hydrodyn/src/HydroDyn_Input.f90 index c4abb17752..3dadca82ba 100644 --- a/modules/hydrodyn/src/HydroDyn_Input.f90 +++ b/modules/hydrodyn/src/HydroDyn_Input.f90 @@ -31,71 +31,10 @@ MODULE HydroDyn_Input USE NWTC_RandomNumber IMPLICIT NONE - PRIVATE :: CleanupEchoFile PRIVATE :: CheckMeshOutput CONTAINS -SUBROUTINE ReadFileList ( UnIn, Fil, CharAry, AryName, AryDescr, ErrStat, ErrMsg, UnEc ) - - ! Argument declarations: - - INTEGER, INTENT(IN) :: UnIn !< I/O unit for input file. - INTEGER, INTENT(IN) :: UnEc !< I/O unit for echo file (if > 0). - INTEGER, INTENT(OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message - - CHARACTER(*), INTENT(INOUT) :: CharAry(:) !< Character array being read (calling routine dimensions it to max allowable size). - - CHARACTER(*), INTENT(IN) :: Fil !< Name of the input file. - CHARACTER(*), INTENT(IN) :: AryDescr !< Text string describing the variable. - CHARACTER(*), INTENT(IN) :: AryName !< Text string containing the variable name. - - - ! Local declarations: - - INTEGER :: MaxAryLen ! Maximum length of the array being read - INTEGER :: NumWords ! Number of words contained on a line - - CHARACTER(1000) :: OutLine ! Character string read from file, containing output list - CHARACTER(3) :: EndOfFile - - - ! Initialize some values - - ErrStat = ErrID_None - ErrMsg = '' - MaxAryLen = SIZE(CharAry) - - CharAry = '' - - ! Read the line containing output parameters and store them in CharAry(:). - - CALL ReadVar ( UnIn, Fil, OutLine, AryName, AryDescr, ErrStat, ErrMsg, UnEc ) - IF ( ErrStat >= AbortErrLev ) RETURN - - - NumWords = CountWords( OutLine ) ! The number of words in OutLine. - - - ! Check to see if we found the required number of words. - - IF ( NumWords < MaxAryLen ) THEN - - ErrStat = ErrID_Fatal - ErrMsg = 'ReadOutputList: Did not find the required number of Potfile strings on the input file line: only found '//TRIM( Int2LStr(NumWords) )//'.' - RETURN - - ELSE - - CALL GetWords ( OutLine, CharAry(1:NumWords), NumWords ) - - END IF - - RETURN - -END SUBROUTINE ReadFileList - !==================================================================================================== FUNCTION CheckMeshOutput( output, numMemberOut, MOutLst, numJointOut ) ! The routine @@ -216,886 +155,419 @@ SUBROUTINE PrintBadChannelWarning(NUserOutputs, UserOutputs , foundMask, ErrStat END IF END DO - - END SUBROUTINE PrintBadChannelWarning -!==================================================================================================== -SUBROUTINE CleanupEchoFile( EchoFlag, UnEcho) -! The routine cleans up the module echo file and resets the NWTC_Library, reattaching it to -! any existing echo information -!---------------------------------------------------------------------------------------------------- - LOGICAL, INTENT( IN ) :: EchoFlag ! local version of echo flag - INTEGER, INTENT( IN ) :: UnEcho ! echo unit number - - - ! Close this module's echo file - - IF ( EchoFlag ) THEN - CLOSE(UnEcho) - END IF - - - -END SUBROUTINE CleanupEchoFile - - - !==================================================================================================== -SUBROUTINE HydroDynInput_GetInput( InitInp, ErrStat, ErrMsg ) +SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDpth, defMSL2SWL, FileInfo_In, InputFileData, ErrStat, ErrMsg ) ! This public subroutine reads the input required for HydroDyn from the file whose name is an ! input parameter. !---------------------------------------------------------------------------------------------------- - ! Passed variables - - TYPE(HydroDyn_InitInputType), INTENT( INOUT ) :: InitInp ! the hydrodyn data - INTEGER, INTENT( OUT ) :: ErrStat ! returns a non-zero value when an error occurs - CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None - + CHARACTER(*), intent(in ) :: InputFileName !< The name of the input file, for putting in echo file. + CHARACTER(*), intent(in ) :: OutRootName !< The rootname of the echo file, possibly opened in this routine + real(ReKi), intent(in ) :: defWtrDens !< default value for water density + real(ReKi), intent(in ) :: defWtrDpth !< default value for water depth + real(ReKi), intent(in ) :: defMSL2SWL !< default value for mean sea level to still water level + TYPE(FileInfoType), INTENT(IN ) :: FileInfo_In !< The derived type for holding the file information + TYPE(HydroDyn_InputFile), INTENT(INOUT) :: InputFileData ! the hydrodyn input file data + INTEGER, INTENT( OUT) :: ErrStat ! returns a non-zero value when an error occurs + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None ! Local variables - - INTEGER :: I, j ! generic integer for counting - CHARACTER( 2) :: strI ! string version of the loop counter - INTEGER :: UnIn ! Unit number for the input file - INTEGER :: UnEchoLocal ! The local unit number for this module's echo file - CHARACTER(1024) :: EchoFile ! Name of HydroDyn echo file - CHARACTER(1024) :: Line ! String to temporarially hold value of read line - CHARACTER(1024) :: FileName ! Name of HydroDyn input file - CHARACTER( 35) :: Frmt ! Output format for logical parameters. (matches NWTC Subroutine Library format) - real(ReKi), ALLOCATABLE :: tmpVec1(:), tmpVec2(:) ! Temporary arrays for WAMIT data - integer(IntKi) :: startIndx, endIndx ! indices into working arrays - INTEGER, ALLOCATABLE :: tmpArray(:) ! Temporary array storage of the joint output list - CHARACTER(1) :: Line1 ! The first character of an input line - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - + INTEGER :: I, j ! generic integer for counting + CHARACTER( 2) :: strI ! string version of the loop counter + INTEGER :: UnEc ! The local unit number for this module's echo file + CHARACTER(1024) :: EchoFile ! Name of HydroDyn echo file + CHARACTER(1024) :: Line ! String to temporarially hold value of read line + real(ReKi), ALLOCATABLE :: tmpVec1(:), tmpVec2(:) ! Temporary arrays for WAMIT data + integer(IntKi) :: startIndx, endIndx ! indices into working arrays + INTEGER, ALLOCATABLE :: tmpArray(:) ! Temporary array storage of the joint output list + REAL(ReKi), ALLOCATABLE :: tmpReArray(:) ! Temporary array storage of the joint output list + CHARACTER(1) :: Line1 ! The first character of an input line + INTEGER(IntKi) :: CurLine !< Current entry in FileInfo_In%Lines array + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_ParaseInput' ! Initialize local data - - UnEchoLocal = -1 - Frmt = "( 2X, L11, 2X, A, T30, ' - ', A )" - ErrStat = ErrID_None - ErrMsg = "" - InitInp%Echo = .FALSE. ! initialize for error handling (cleanup() routine) + UnEc = -1 + ErrStat = ErrID_None + ErrMsg = "" + InputFileData%Echo = .FALSE. ! initialize for error handling (cleanup() routine) - !------------------------------------------------------------------------------------------------- - ! Open the file - !------------------------------------------------------------------------------------------------- - FileName = TRIM(InitInp%InputFile) - - CALL GetNewUnit( UnIn, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL OpenFInpFile( UnIn, FileName, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - - !CALL WrScr( 'Opening HydroDyn input file: '//FileName ) - !------------------------------------------------------------------------------------------------- - ! File header + ! General settings !------------------------------------------------------------------------------------------------- - CALL ReadCom( UnIn, FileName, 'HydroDyn input file header line 1', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - - CALL ReadCom( UnIn, FileName, 'HydroDyn input file header line 2', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - ! Echo Input Files. - - CALL ReadVar ( UnIn, FileName, InitInp%Echo, 'Echo', 'Echo Input', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - ! If we are Echoing the input then we should re-read the first three lines so that we can echo them - ! using the NWTC_Library routines. The echoing is done inside those routines via a global variable - ! which we must store, set, and then replace on error or completion. - - IF ( InitInp%Echo ) THEN - - EchoFile = TRIM(InitInp%OutRootName)//'.HD.ech' - CALL OpenEcho ( UnEchoLocal, TRIM(EchoFile), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - REWIND(UnIn) - - CALL ReadCom( UnIn, FileName, 'HydroDyn input file header line 1', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) + CurLine = 3 ! Skip the first three lines as they are known to be header lines and separators + call ParseVar( FileInfo_In, CurLine, 'Echo', InputFileData%Echo, ErrStat2, ErrMsg2 ) + if (Failed()) return; - CALL ReadCom( UnIn, FileName, 'HydroDyn input file header line 2', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) + if ( InputFileData%Echo ) then + EchoFile = TRIM(OutRootName)//'.HD.ech' + CALL OpenEcho ( UnEc, TRIM(EchoFile), ErrStat2, ErrMsg2 ) + if (Failed()) return; + WRITE(UnEc, '(A)') 'Echo file for AeroDyn 15 primary input file: '//trim(InputFileName) + ! Write the first three lines into the echo file + WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(1)) + WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(2)) - ! Echo Input Files. Note this line is prevented from being echoed by the ReadVar routine. (bjj: is that still true?) + CurLine = 3 + call ParseVar( FileInfo_In, CurLine, 'Echo', InputFileData%Echo, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return + endif - CALL ReadVar ( UnIn, FileName, InitInp%Echo, 'Echo', 'Echo the input file data', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - END IF !------------------------------------------------------------------------------------------------- ! Environmental conditions section !------------------------------------------------------------------------------------------------- - - ! Header - - CALL ReadCom( UnIn, FileName, 'Environmental conditions header', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 ! WtrDens - Water density. - - CALL ReadVarWDefault ( UnIn, FileName, InitInp%Waves%WtrDens, 'WtrDens', 'Water density', real(InitInp%defWtrDens,SiKi), ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + CALL ParseVarWDefault ( FileInfo_In, CurLine, 'WtrDens', InputFileData%Waves%WtrDens, real(defWtrDens,SiKi), ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WtrDpth - Water depth - - CALL ReadVarWDefault ( UnIn, FileName, InitInp%Morison%WtrDpth, 'WtrDpth', 'Water depth', InitInp%defWtrDpth, ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + CALL ParseVarWDefault ( FileInfo_In, CurLine, 'WtrDpth', InputFileData%Morison%WtrDpth, defWtrDpth, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! MSL2SWL - - CALL ReadVarWDefault ( UnIn, FileName, InitInp%Morison%MSL2SWL, 'MSL2SWL', 'MSL to SWL offset', InitInp%defMSL2SWL, ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + CALL ParseVarWDefault ( FileInfo_In, CurLine, 'MSL2SWL', InputFileData%Morison%MSL2SWL, defMSL2SWL, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; !------------------------------------------------------------------------------------------------- ! Data section for waves !------------------------------------------------------------------------------------------------- - - ! Header - - CALL ReadCom( UnIn, FileName, 'Wave header', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 ! WaveMod - Wave kinematics model switch. + call ParseVar( FileInfo_In, CurLine, 'WaveMod', InputFileData%Waves%WaveModChr, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveModChr, 'WaveMod', 'Wave kinematics model switch', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - CALL Conv2UC( InitInp%Waves%WaveModChr ) ! Convert Line to upper case. + CALL Conv2UC( InputFileData%Waves%WaveModChr ) ! Convert Line to upper case. - InitInp%Waves%WavePhase = 0.0 - InitInp%Waves%WaveNDAmp = .FALSE. + InputFileData%Waves%WavePhase = 0.0 + InputFileData%Waves%WaveNDAmp = .FALSE. ! WaveStMod - Model switch for stretching incident wave kinematics to instantaneous free surface. - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveStMod, 'WaveStMod', & - 'Model switch for stretching incident wave kinematics to instantaneous free surface', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - + call ParseVar( FileInfo_In, CurLine, 'WaveStMod', InputFileData%Waves%WaveStMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WaveTMax - Analysis time for incident wave calculations. - - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveTMax, 'WaveTMax', & - 'Analysis time for incident wave calculations', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'WaveTMax', InputFileData%Waves%WaveTMax, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WaveDT - Time step for incident wave calculations - - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveDT, 'WaveDT', & - 'Time step for incident wave calculations', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - + call ParseVar( FileInfo_In, CurLine, 'WaveDT', InputFileData%Waves%WaveDT, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WaveHs - Significant wave height - - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveHs, 'WaveHs', 'Significant wave height', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - + call ParseVar( FileInfo_In, CurLine, 'WaveHs', InputFileData%Waves%WaveHs, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WaveTp - Peak spectral period. - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveTp, 'WaveTp', 'Peak spectral period', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'WaveTp', InputFileData%Waves%WaveTp, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WavePkShp - Peak shape parameter. - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WavePkShpChr, 'WavePkShp', 'Peak shape parameter', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'WavePkShp', InputFileData%Waves%WavePkShpChr, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WvLowCOff - Low Cut-off frequency or lower frequency limit of the wave spectrum beyond which the wave spectrum is zeroed (rad/s). - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WvLowCOff, 'WvLowCOff', 'Lower wave cut-off frequency', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'WvLowCOff', InputFileData%Waves%WvLowCOff, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WvHiCOff - High Cut-off frequency or upper frequency limit of the wave spectrum beyond which the wave spectrum is zeroed (rad/s). - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WvHiCOff, 'WvHiCOff', 'Upper wave cut-off frequency', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'WvHiCOff', InputFileData%Waves%WvHiCOff, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WaveDir - Mean wave heading direction. - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveDir, 'WaveDir', 'Mean wave heading direction', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'WaveDir', InputFileData%Waves%WaveDir, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WaveDirMod - Directional spreading function {0: None, 1: COS2S} (-) [Used only if WaveMod=2] - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveDirMod, 'WaveDirMod', 'Directional spreading function', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'WaveDirMod', InputFileData%Waves%WaveDirMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WaveDirSpread - Spreading coefficient [only used if WaveMod=2 and WaveDirMod=1] - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveDirSpread, 'WaveDirSpread', 'Wave direction spreading coefficient', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'WaveDirSpread', InputFileData%Waves%WaveDirSpread, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WaveNDir - The number of wave directions to calculate [must be odd; only used if WaveDirMod=1] - - CALL ReadVar (UnIn, FileName, InitInp%Waves%WaveNDir, 'WaveNDir', 'Number of wave directions to calculate', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'WaveNDir', InputFileData%Waves%WaveNDir, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WaveDirRange - Full range of the wave directions from WaveDir - WaveDirRange/2 to WaveDir + WaveDirRange/2 (only used if WaveMod=2 and WaveDirMod=1) - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveDirRange, 'WaveDirRange', 'Maximum wave heading direction', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'WaveDirRange', InputFileData%Waves%WaveDirRange, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! Negative values should be treated as positive. - InitInp%Waves%WaveDirRange = ABS( InitInp%Waves%WaveDirRange ) + InputFileData%Waves%WaveDirRange = ABS( InputFileData%Waves%WaveDirRange ) ! WaveSeed(1) - CALL ReadVar( UnIn, FileName, InitInp%Waves%WaveSeed(1), 'WaveSeed(1)', "Random seed #1", ErrStat2, ErrMsg2, UnEchoLocal) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput') - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - InitInp%Waves%RNG%RandSeed(1) = InitInp%Waves%WaveSeed(1) + call ParseVar( FileInfo_In, CurLine, 'WaveSeed(1)', InputFileData%Waves%WaveSeed(1), ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + InputFileData%Waves%RNG%RandSeed(1) = InputFileData%Waves%WaveSeed(1) !WaveSeed(2) - CALL ReadVar( UnIn, FileName, Line, 'WaveSeed(2)', "Random seed #2", ErrStat2, ErrMsg2, UnEchoLocal) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput') - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'WaveSeed(2)', Line, ErrStat2, ErrMsg2, UnEc ) ! Read into a string and then parse + if (Failed()) return; READ (Line,*,IOSTAT=ErrStat2) Line1 ! check the first character to make sure we don't have T/F, which can be interpreted as 1/-1 or 0 in Fortran CALL Conv2UC( Line1 ) IF ( (Line1 == 'T') .OR. (Line1 == 'F') ) THEN - CALL SetErrStat( ErrID_Fatal, ' WaveSeed(2): Invalid RNG type.', ErrStat, ErrMsg, 'HydroDynInput_GetInput') - CALL Cleanup() - RETURN + ErrStat2 = ErrID_Fatal + ErrMsg2 = ' WaveSeed(2): Invalid RNG type.' + if (Failed()) return; ENDIF - READ (Line,*,IOSTAT=ErrStat2) InitInp%Waves%WaveSeed(2) - InitInp%Waves%RNG%RandSeed(2) = InitInp%Waves%WaveSeed(2) +!FIXME: there is something a little strange here. RandSeed(2) is an integer, but what if we get an error on the next read? + READ (Line,*,IOSTAT=ErrStat2) InputFileData%Waves%WaveSeed(2) + InputFileData%Waves%RNG%RandSeed(2) = InputFileData%Waves%WaveSeed(2) IF (ErrStat2 == 0) THEN ! the user entered a number - InitInp%Waves%RNG%RNG_type = "NORMAL" - InitInp%Waves%RNG%pRNG = pRNG_INTRINSIC + InputFileData%Waves%RNG%RNG_type = "NORMAL" + InputFileData%Waves%RNG%pRNG = pRNG_INTRINSIC ELSE - InitInp%Waves%RNG%RNG_type = ADJUSTL( Line ) - CALL Conv2UC( InitInp%Waves%RNG%RNG_type ) + InputFileData%Waves%RNG%RNG_type = ADJUSTL( Line ) + CALL Conv2UC( InputFileData%Waves%RNG%RNG_type ) - IF ( InitInp%Waves%RNG%RNG_type == "RANLUX") THEN - InitInp%Waves%RNG%pRNG = pRNG_RANLUX + IF ( InputFileData%Waves%RNG%RNG_type == "RANLUX") THEN + InputFileData%Waves%RNG%pRNG = pRNG_RANLUX ELSE - CALL SetErrStat( ErrID_Fatal, ' WaveSeed(2): Invalid alternative random number generator.', ErrStat, ErrMsg, 'HydroDynInput_GetInput') - CALL Cleanup() - RETURN + ErrStat2 = ErrID_Fatal + ErrMsg2 = ' WaveSeed(2): Invalid alternative random number generator.' + if (Failed()) return; ENDIF ENDIF - ! WaveNDAmp - Flag for normally distributed amplitudes. - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WaveNDAmp, 'WaveNDAmp', 'Normally distributed amplitudes', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + ! WaveNDAmp - Flag for normally distributed amplitudes. + call ParseVar( FileInfo_In, CurLine, 'WaveNDAmp', InputFileData%Waves%WaveNDAmp, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! WvKinFile - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%WvKinFile, 'WvKinFile', & - 'Root name of wave kinematics files', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - + call ParseVar( FileInfo_In, CurLine, 'WvKinFile', InputFileData%Waves%WvKinFile, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! NWaveElev - - CALL ReadVar ( UnIn, FileName, InitInp%Waves%NWaveElev, 'NWaveElev', & - 'Number of points where the incident wave elevations can be output', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'NWaveElev', InputFileData%Waves%NWaveElev, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! This check is needed here instead of being located in HydroDynInput_ProcessInputData() because ! we need to allocate arrays. If _GetInput() was skipped, then these array would already have ! been allocated and populated. - IF ( InitInp%Waves%NWaveElev < 0 .OR. InitInp%Waves%NWaveElev > 9 ) THEN + IF ( InputFileData%Waves%NWaveElev < 0 .OR. InputFileData%Waves%NWaveElev > 9 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'NWaveElev must be greater than or equal to zero and less than 10.' + if (Failed()) return; + END IF - CALL SetErrStat( ErrID_Fatal, 'NWaveElev must be greater than or equal to zero and less than 10.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN + ! allocate space for the output location arrays: + CALL AllocAry( InputFileData%Waves%WaveElevxi, InputFileData%Waves%NWaveElev, 'WaveElevxi' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%Waves%WaveElevyi, InputFileData%Waves%NWaveElev, 'WaveElevyi' , ErrStat2, ErrMsg2); if (Failed()) return; + + ! WaveElevxi + call ParseAry ( FileInfo_In, CurLine, 'WaveElevxi.', InputFileData%Waves%WaveElevxi, InputFileData%Waves%NWaveElev, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - ELSE + ! WaveElevyi + call ParseAry ( FileInfo_In, CurLine, 'WaveElevyi.', InputFileData%Waves%WaveElevyi, InputFileData%Waves%NWaveElev, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - ! allocate space for the output location arrays: - CALL AllocAry( InitInp%Waves%WaveElevxi, InitInp%Waves%NWaveElev, 'WaveElevxi' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%Waves%WaveElevyi, InitInp%Waves%NWaveElev, 'WaveElevyi' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - END IF + !------------------------------------------------------------------------------------------------- + ! Data section for 2nd Order Waves + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 - ! WaveElevxi + ! WvDiffQTFF - Second order waves -- difference forces + call ParseVar( FileInfo_In, CurLine, 'WvDiffQTF', InputFileData%Waves2%WvDiffQTFF, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - CALL ReadAry ( UnIn, FileName, InitInp%Waves%WaveElevxi, InitInp%Waves%NWaveElev, 'WaveElevxi', & - 'List of xi-coordinates for points where the incident wave elevations can be output', ErrStat2, ErrMsg2, UnEchoLocal) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + ! WvSumQTFF - Second order waves -- sum forces + call ParseVar( FileInfo_In, CurLine, 'WvSumQTF', InputFileData%Waves2%WvSumQTFF, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + ! WvLowCOffD -- Minimum frequency used in the difference methods (rad/s) [Only used if DiffQTF /= 0] + call ParseVar( FileInfo_In, CurLine, 'WvLowCOffD', InputFileData%Waves2%WvLowCOffD, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - ! WaveElevyi + ! WvHiCOffD -- Maximum frequency used in the difference methods (rad/s) [Only used if DiffQTF /= 0] + call ParseVar( FileInfo_In, CurLine, 'WvHiCOffD', InputFileData%Waves2%WvHiCOffD, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - CALL ReadAry ( UnIn, FileName, InitInp%Waves%WaveElevyi, InitInp%Waves%NWaveElev, 'WaveElevyi', & - 'List of yi-coordinates for points where the incident wave elevations can be output', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + ! WvLowCOffS -- Minimum frequency used in the sum-QTF (rad/s) [Only used if SumQTF /= 0] + call ParseVar( FileInfo_In, CurLine, 'WvLowCOffS', InputFileData%Waves2%WvLowCOffS, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + ! WvHiCOffS -- Maximum frequency used in the sum-QTF (rad/s) [Only used if SumQTF /= 0] + call ParseVar( FileInfo_In, CurLine, 'WvHiCOffS', InputFileData%Waves2%WvHiCOffS, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; !------------------------------------------------------------------------------------------------- - ! Data section for 2nd Order Waves + ! Data section for current !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 - ! Header + ! CurrMod - Current profile model switch + call ParseVar( FileInfo_In, CurLine, 'CurrMod', InputFileData%Current%CurrMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - CALL ReadCom( UnIn, FileName, 'Waves 2nd order', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + ! CurrSSV0 - Sub-surface current velocity at still water level + call ParseVar( FileInfo_In, CurLine, 'CurrSSV0', InputFileData%Current%CurrSSV0, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - ! WvDiffQTFF - Second order waves -- difference forces + ! CurrSSDirChr - Sub-surface current heading direction + call ParseVar( FileInfo_In, CurLine, 'CurrSSDir', InputFileData%Current%CurrSSDirChr, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - CALL ReadVar ( UnIn, FileName, InitInp%Waves2%WvDiffQTFF, 'WvDiffQTFF', 'Full difference QTF second order kinematic forces flag', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + CALL Conv2UC( InputFileData%Current%CurrSSDirChr ) ! Convert Line to upper case. - ! WvSumQTFF - Second order waves -- sum forces + ! CurrNSRef - Near-surface current reference depth. + call ParseVar( FileInfo_In, CurLine, 'CurrNSRef', InputFileData%Current%CurrNSRef, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - CALL ReadVar ( UnIn, FileName, InitInp%Waves2%WvSumQTFF, 'WvSumQTFF', 'Full sum QTF second order kinematic forces flag', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + ! CurrNSV0 - Near-surface current velocity at still water level. + call ParseVar( FileInfo_In, CurLine, 'CurrNSV0', InputFileData%Current%CurrNSV0, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + ! CurrNSDir - Near-surface current heading direction. + call ParseVar( FileInfo_In, CurLine, 'CurrNSDir', InputFileData%Current%CurrNSDir, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + ! CurrDIV - Depth-independent current velocity. + call ParseVar( FileInfo_In, CurLine, 'CurrDIV', InputFileData%Current%CurrDIV, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - ! WvLowCOffD -- Minimum frequency used in the difference methods (rad/s) [Only used if DiffQTF /= 0] - - CALL ReadVar ( UnIn, FileName, InitInp%Waves2%WvLowCOffD, 'WvLowCOffD', 'Minimum frequency used in second order difference forces', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! WvHiCOffD -- Maximum frequency used in the difference methods (rad/s) [Only used if DiffQTF /= 0] - - CALL ReadVar ( UnIn, FileName, InitInp%Waves2%WvHiCOffD, 'WvHiCOffD', 'Maximum frequency used in second order difference forces', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! WvLowCOffS -- Minimum frequency used in the sum-QTF (rad/s) [Only used if SumQTF /= 0] - - CALL ReadVar ( UnIn, FileName, InitInp%Waves2%WvLowCOffS, 'WvLowCOffS', 'Minimum frequency used in second order sum forces', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! WvHiCOffS -- Maximum frequency used in the sum-QTF (rad/s) [Only used if SumQTF /= 0] - - CALL ReadVar ( UnIn, FileName, InitInp%Waves2%WvHiCOffS, 'WvHiCOffS', 'Maximum frequency used in second order sum forces', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - - !------------------------------------------------------------------------------------------------- - ! Data section for current - !------------------------------------------------------------------------------------------------- - - ! Header - - CALL ReadCom( UnIn, FileName, 'Current header', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! CurrMod - Current profile model switch - - CALL ReadVar ( UnIn, FileName, InitInp%Current%CurrMod, 'CurrMod', 'Current profile model switch', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - - ! CurrSSV0 - Sub-surface current velocity at still water level - - CALL ReadVar ( UnIn, FileName, InitInp%Current%CurrSSV0, 'CurrSSV0', 'Sub-surface current velocity at still water level', & - ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - - ! CurrSSDirChr - Sub-surface current heading direction - - CALL ReadVar ( UnIn, FileName, InitInp%Current%CurrSSDirChr, 'CurrSSDirChr', 'Sub-surface current heading direction', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - CALL Conv2UC( InitInp%Current%CurrSSDirChr ) ! Convert Line to upper case. - - - ! CurrNSRef - Near-surface current reference depth. - - CALL ReadVar ( UnIn, FileName, InitInp%Current%CurrNSRef, 'CurrNSRef', 'Near-surface current reference depth', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! CurrNSV0 - Near-surface current velocity at still water level. - - CALL ReadVar ( UnIn, FileName, InitInp%Current%CurrNSV0, 'CurrNSV0', 'Near-surface current velocity at still water level', & - ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! CurrNSDir - Near-surface current heading direction. - - CALL ReadVar ( UnIn, FileName, InitInp%Current%CurrNSDir, 'CurrNSDir', 'Near-surface current heading direction', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! CurrDIV - Depth-independent current velocity. - - CALL ReadVar ( UnIn, FileName, InitInp%Current%CurrDIV, 'CurrDIV', 'Depth-independent current velocity', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! CurrDIDir - Depth-independent current heading direction. - - CALL ReadVar ( UnIn, FileName, InitInp%Current%CurrDIDir, 'CurrDIDir', 'Depth-independent current heading direction', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + ! CurrDIDir - Depth-independent current heading direction. + call ParseVar( FileInfo_In, CurLine, 'CurrDIDir', InputFileData%Current%CurrDIDir, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; !------------------------------------------------------------------------------------------------- ! Data section for floating platform !------------------------------------------------------------------------------------------------- - - ! Header - - CALL ReadCom( UnIn, FileName, 'Floating platform header', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 ! PotMod - State indicating potential flow model used in the simulation. 0=none, 1=WAMIT, 2=FIT - - CALL ReadVar ( UnIn, FileName, InitInp%PotMod, 'PotMod', 'Potential flow model', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'PotMod', InputFileData%PotMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! ExctnMod - Wave Excitation model {0: None, 1: DFT, 2: state-space} (switch) ! [STATE-SPACE REQUIRES *.ssexctn INPUT FILE] - - CALL ReadVar ( UnIn, FileName, InitInp%WAMIT%ExctnMod, 'ExctnMod', & - 'Wave Excitation model', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'ExctnMod', InputFileData%WAMIT%ExctnMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! RdtnMod - Radiation memory-effect model {1: convolution, 2: state-space} (switch) ! [STATE-SPACE REQUIRES *.ss INPUT FILE] - - CALL ReadVar ( UnIn, FileName, InitInp%WAMIT%RdtnMod, 'RdtnMod', & - 'Radiation memory-effect model', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'RdtnMod', InputFileData%WAMIT%RdtnMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! RdtnTMax - Analysis time for wave radiation kernel calculations ! NOTE: Use RdtnTMax = 0.0 to eliminate wave radiation damping - - CALL ReadVar ( UnIn, FileName, InitInp%WAMIT%RdtnTMax, 'RdtnTMax', & - 'Analysis time for wave radiation kernel calculations', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'RdtnTMax', InputFileData%WAMIT%RdtnTMax, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! RdtnDT - Time step for wave radiation kernel calculations - - - CALL ReadVar ( UnIn, FileName, InitInp%WAMIT%Conv_Rdtn%RdtnDTChr, 'RdtnDT', 'Time step for wave radiation kernel calculations', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'RdtnDT', InputFileData%WAMIT%Conv_Rdtn%RdtnDTChr, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! NBody - Number of WAMIT bodies to be used (-) [>=1; only used when PotMod=1. If NBodyMod=1, the WAMIT data ! contains a vector of size 6*NBody x 1 and matrices of size 6*NBody x 6*NBody; if NBodyMod>1, there ! are NBody sets of WAMIT data each with a vector of size 6 x 1 and matrices of size 6 x 6] - - CALL ReadVar ( UnIn, FileName, InitInp%NBody, 'NBody', 'Number of WAMIT bodies', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'NBody', InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! NBodyMod - Body coupling model {1: include coupling terms between each body and NBody in HydroDyn equals NBODY in WAMIT, ! 2: neglect coupling terms between each body and NBODY=1 with XBODY=0 in WAMIT, 3: Neglect coupling terms ! between each body and NBODY=1 with XBODY=/0 in WAMIT} (switch) [only used when PotMod=1] - - CALL ReadVar ( UnIn, FileName, InitInp%NBodyMod, 'NBodyMod', 'Body coupling model', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! PotFile - Root name of Potential flow data files (Could be WAMIT files or the FIT input file) + call ParseVar( FileInfo_In, CurLine, 'NBodyMod', InputFileData%NBodyMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! allocate space for the WAMIT-related data arrays: - - if ( InitInp%NBodyMod == 1 ) then - InitInp%nWAMITObj = 1 ! Special case where all data in a single WAMIT input file as opposed to InitInp%NBody number of separate input files. - InitInp%vecMultiplier = InitInp%NBody + if ( InputFileData%NBodyMod == 1 ) then + InputFileData%nWAMITObj = 1 ! Special case where all data in a single WAMIT input file as opposed to InputFileData%NBody number of separate input files. + InputFileData%vecMultiplier = InputFileData%NBody else - InitInp%nWAMITObj = InitInp%NBody - InitInp%vecMultiplier = 1 + InputFileData%nWAMITObj = InputFileData%NBody + InputFileData%vecMultiplier = 1 end if - CALL AllocAry( InitInp%PotFile , InitInp%nWAMITObj, 'PotFile' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%WAMITULEN, InitInp%nWAMITObj, 'WAMITULEN' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%PtfmRefxt, InitInp%NBody, 'PtfmRefxt' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%PtfmRefyt, InitInp%NBody, 'PtfmRefyt' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%PtfmRefzt, InitInp%NBody, 'PtfmRefzt' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%PtfmRefztRot, InitInp%NBody, 'PtfmRefztRot' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%PtfmVol0 , InitInp%NBody, 'PtfmVol0' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%PtfmCOBxt, InitInp%NBody, 'PtfmCOBxt' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%PtfmCOByt, InitInp%NBody, 'PtfmCOByt' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - call ReadFileList ( UnIn, FileName, InitInp%PotFile, 'PotFile', 'Root name of Potential flow model files', ErrStat2, ErrMsg2, UnEchoLocal ) - !CALL ReadAry ( UnIn, FileName, InitInp%PotFile, InitInp%nWAMITObj, 'PotFile', 'Root name of Potential flow model files', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + CALL AllocAry( InputFileData%PotFile , InputFileData%nWAMITObj, 'PotFile' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%WAMITULEN , InputFileData%nWAMITObj, 'WAMITULEN' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%PtfmRefxt , InputFileData%NBody, 'PtfmRefxt' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%PtfmRefyt , InputFileData%NBody, 'PtfmRefyt' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%PtfmRefzt , InputFileData%NBody, 'PtfmRefzt' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%PtfmRefztRot , InputFileData%NBody, 'PtfmRefztRot' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%PtfmVol0 , InputFileData%NBody, 'PtfmVol0' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%PtfmCOBxt , InputFileData%NBody, 'PtfmCOBxt' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%PtfmCOByt , InputFileData%NBody, 'PtfmCOByt' , ErrStat2, ErrMsg2); if (Failed()) return; - ! WAMITULEN - WAMIT characteristic body length scale - - CALL ReadAry ( UnIn, FileName, InitInp%WAMITULEN, InitInp%nWAMITObj, 'WAMITULEN', 'WAMIT characteristic body length scale', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - ! PtfmRefxt - The xt offset of the body reference point(s) from (0,0,0) (meters) + ! PotFile - Root name of Potential flow data files (Could be WAMIT files or the FIT input file) + call ParseAry( FileInfo_In, CurLine, 'PotFile', InputFileData%PotFile, InputFileData%nWAMITObj, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - CALL ReadAry ( UnIn, FileName, InitInp%PtfmRefxt, InitInp%NBody, 'PtfmRefxt', & - 'xt offset of the body reference point(s) from (0,0,0)', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + ! WAMITULEN - WAMIT characteristic body length scale + call ParseAry( FileInfo_In, CurLine, 'WAMITULEN', InputFileData%WAMITULEN, InputFileData%nWAMITObj, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + ! PtfmRefxt - The xt offset of the body reference point(s) from (0,0,0) (meters) + call ParseAry( FileInfo_In, CurLine, 'PtfmRefxt', InputFileData%PtfmRefxt, InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! PtfmRefyt - The yt offset of the body reference point(s) from (0,0,0) (meters) - - CALL ReadAry ( UnIn, FileName, InitInp%PtfmRefyt, InitInp%NBody, 'PtfmRefyt', & - 'yt offset of the body reference point(s) from (0,0,0)', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseAry( FileInfo_In, CurLine, 'PtfmRefyt', InputFileData%PtfmRefyt, InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! PtfmRefzt - The zt offset of the body reference point(s) from (0,0,0) (meters) - - CALL ReadAry ( UnIn, FileName, InitInp%PtfmRefzt, InitInp%NBody, 'PtfmRefzt', & - 'zt offset of the body reference point(s) from (0,0,0)', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseAry( FileInfo_In, CurLine, 'PtfmRefzt', InputFileData%PtfmRefzt, InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! PtfmRefztRot - The rotation about zt of the body reference frame(s) from xt/yt (deg) - - CALL ReadAry ( UnIn, FileName, InitInp%PtfmRefztRot, InitInp%NBody, 'PtfmRefzt', & - 'The rotation about zt of the body reference frame(s) from xt/yt', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - InitInp%PtfmRefztRot = InitInp%PtfmRefztRot*D2R_D ! Convert to radians + call ParseAry( FileInfo_In, CurLine, 'PtfmRefztRot', InputFileData%PtfmRefztRot, InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + InputFileData%PtfmRefztRot = InputFileData%PtfmRefztRot*D2R_D ! Convert to radians ! PtfmVol0 - Displaced volume of water when the platform is in its undisplaced position - - CALL ReadAry ( UnIn, FileName, InitInp%PtfmVol0, InitInp%NBody, 'PtfmVol0', & - 'Displaced volume of water when the platform is in its undisplaced position', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseAry( FileInfo_In, CurLine, 'PtfmVol0', InputFileData%PtfmVol0, InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! PtfmCOBxt - The xt offset of the center of buoyancy (COB) from the WAMIT reference point - - CALL ReadAry ( UnIn, FileName, InitInp%PtfmCOBxt, InitInp%NBody, 'PtfmCOBxt', & - 'xt offset of the center of buoyancy (COB) from the WAMIT reference point', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseAry( FileInfo_In, CurLine, 'PtfmCOBxt', InputFileData%PtfmCOBxt, InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! PtfmCOByt - The yt offset of the center of buoyancy (COB) from the WAMIT reference point - - CALL ReadAry ( UnIn, FileName, InitInp%PtfmCOByt, InitInp%NBody, 'PtfmCOByt', & - 'yt offset of the center of buoyancy (COB) from the WAMIT reference point', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - + call ParseAry( FileInfo_In, CurLine, 'PtfmCOByt', InputFileData%PtfmCOByt, InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + !bjj: should we add this? !test for numerical stability ! IF ( FP_InitData%RdtnDT <= FP_InitData%RdtnTMax*EPSILON(FP_InitData%RdtnDT) ) THEN ! Test RdtnDT and RdtnTMax to ensure numerical stability -- HINT: see the use of OnePlusEps." -! ErrMsg = ' RdtnDT must be greater than '//TRIM ( Num2LStr( RdtnTMax*EPSILON(RdtnDT) ) )//' seconds.' ! ErrStat = ErrID_Fatal -! CLOSE( UnIn ) -! RETURN +! ErrMsg2 = ' RdtnDT must be greater than '//TRIM ( Num2LStr( RdtnTMax*EPSILON(RdtnDT) ) )//' seconds.' +! if (Failed()) return; ! END IF @@ -1103,161 +575,93 @@ SUBROUTINE HydroDynInput_GetInput( InitInp, ErrStat, ErrMsg ) !------------------------------------------------------------------------------------------------- ! Data section for 2nd order WAMIT forces !------------------------------------------------------------------------------------------------- - - - ! Header - - CALL ReadCom( UnIn, FileName, '2nd order forces header (WAMIT2 module)', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 ! MnDrift -- Mean drift forces computed from WAMIT file: {0: No mean drift, [7, 8, 9, 10, 11, or 12]: WAMIT file to use} - - CALL ReadVar ( UnIn, FileName, InitInp%WAMIT2%MnDrift, 'MnDrift', 'Mean drift forces computed from WAMIT file: {0: No mean drift, [7, 8, 9, 10, 11, or 12]: WAMIT file to use}', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'MnDrift', InputFileData%WAMIT2%MnDrift, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! NewmanApp -- Slow drift forces computed with Newman's approximation from WAMIT file: {0: No mean drift, [7, 8, 9, 10, 11, or 12]: WAMIT file to use} - - CALL ReadVar ( UnIn, FileName, InitInp%WAMIT2%NewmanApp, 'NewmanApp', 'Mean drift forces computed from WAMIT file: {0: No mean drift, [7, 8, 9, 10, 11, or 12]: WAMIT file to use}', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'NewmanApp', InputFileData%WAMIT2%NewmanApp, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! DiffQTF -- Full Difference-Frequency forces computed with full QTFs from WAMIT file: {0: No difference-frequency forces, [10, 11, or 12]: WAMIT file to use} -- Only one of MnDrift, NewmanApp, or DiffQYT can be non-zero - - CALL ReadVar ( UnIn, FileName, InitInp%WAMIT2%DiffQTF, 'DiffQTF', 'Full Difference-Frequency forces computed with full QTFs from WAMIT file: '// & - '{0: No difference-frequency forces, [10, 11, or 12]: WAMIT file to use} -- Only one of MnDrift, NewmanApp, or DiffQYT can be non-zero', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'DiffQTF', InputFileData%WAMIT2%DiffQTF, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! SumQTF -- Full Sum-Frequency forces computed with full QTFs from WAMIT file: {0: No Sum-frequency forces, [10, 11, or 12]: WAMIT file to use} - - CALL ReadVar ( UnIn, FileName, InitInp%WAMIT2%SumQTF, 'SumQTF', 'Full Sum-Frequency forces computed with full QTFs from WAMIT file: {0: No Sum-frequency forces, [10, 11, or 12]: WAMIT file to use}', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'SumQTF', InputFileData%WAMIT2%SumQTF, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; !------------------------------------------------------------------------------------------------- ! Floating Platform Additional Stiffness and Damping Section !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + ! If NBodyMod = 1 then vecMultiplier = NBody and nWAMITObj = 1 ! Else vecMultiplier = 1 and nWAMITObj = NBody - CALL AllocAry( InitInp%AddF0, InitInp%vecMultiplier*6, InitInp%nWAMITObj, 'InitInp%AddF0' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%AddCLin, InitInp%vecMultiplier*6, InitInp%vecMultiplier*6, InitInp%nWAMITObj, 'InitInp%AddCLin' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%AddBLin, InitInp%vecMultiplier*6, InitInp%vecMultiplier*6, InitInp%nWAMITObj, 'InitInp%AddBLin' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%AddBQuad, InitInp%vecMultiplier*6, InitInp%vecMultiplier*6, InitInp%nWAMITObj, 'InitInp%AddBQuad' , ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( tmpVec1, InitInp%nWAMITObj, 'tmpVec1', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( tmpVec2, 6*InitInp%NBody, 'tmpVec2', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - - ! Header - - CALL ReadCom( UnIn, FileName, 'Additional stiffness and damping header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + CALL AllocAry( InputFileData%AddF0, InputFileData%vecMultiplier*6, InputFileData%nWAMITObj, 'InputFileData%AddF0' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%AddCLin, InputFileData%vecMultiplier*6, InputFileData%vecMultiplier*6, InputFileData%nWAMITObj, 'InputFileData%AddCLin' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%AddBLin, InputFileData%vecMultiplier*6, InputFileData%vecMultiplier*6, InputFileData%nWAMITObj, 'InputFileData%AddBLin' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( InputFileData%AddBQuad, InputFileData%vecMultiplier*6, InputFileData%vecMultiplier*6, InputFileData%nWAMITObj, 'InputFileData%AddBQuad' , ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( tmpVec1, InputFileData%nWAMITObj, 'tmpVec1', ErrStat2, ErrMsg2); if (Failed()) return; + CALL AllocAry( tmpVec2, 6*InputFileData%NBody, 'tmpVec2', ErrStat2, ErrMsg2); if (Failed()) return; ! AddF0 - Additional preload - do i = 1,6*InitInp%vecMultiplier - CALL ReadAry ( UnIn, FileName, tmpVec1, InitInp%nWAMITObj, 'AddF0', & - ' Additional preload vector', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - do j = 1, InitInp%nWAMITObj - InitInp%AddF0(i,j) = tmpVec1(j) + do i = 1,6*InputFileData%vecMultiplier + call ParseAry( FileInfo_In, CurLine, 'AddF0', tmpVec1, InputFileData%nWAMITObj, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + do j = 1, InputFileData%nWAMITObj + InputFileData%AddF0(i,j) = tmpVec1(j) end do end do ! AddCLin - - do i=1,6*InitInp%vecMultiplier + do i=1,6*InputFileData%vecMultiplier write(strI,'(I1)') i - call ReadAry ( UnIn, FileName, tmpVec2, 6*InitInp%NBody, 'AddCLin', & - ' Row '//strI//' of the additional linear stiffness matrix', ErrStat2, ErrMsg2, UnEchoLocal ) - - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - if (ErrStat >= AbortErrLev) then - call CleanUp() - return - end if - do j = 1, InitInp%nWAMITObj - startIndx = 6*InitInp%vecMultiplier*(j-1) + 1 - endIndx = startIndx + 6*InitInp%vecMultiplier - 1 - InitInp%AddCLin(i,:,j) = tmpVec2(startIndx:endIndx) + call ParseAry( FileInfo_In, CurLine, ' Row '//strI//' of the additional linear stiffness matrix', & + tmpVec2, 6*InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + do j = 1, InputFileData%nWAMITObj + startIndx = 6*InputFileData%vecMultiplier*(j-1) + 1 + endIndx = startIndx + 6*InputFileData%vecMultiplier - 1 + InputFileData%AddCLin(i,:,j) = tmpVec2(startIndx:endIndx) end do end do ! AddBLin + DO I=1,6*InputFileData%vecMultiplier - DO I=1,6*InitInp%vecMultiplier - - WRITE(strI,'(I1)') I - CALL ReadAry ( UnIn, FileName, tmpVec2, 6*InitInp%NBody, 'AddBLin', & - ' Row '//strI//' of the additional linear damping matrix', ErrStat2, ErrMsg2, UnEchoLocal ) + call ParseAry( FileInfo_In, CurLine, ' Row '//strI//' of the additional linear damping matrix', & + tmpVec2, 6*InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - do j = 1, InitInp%nWAMITObj - startIndx = 6*InitInp%vecMultiplier*(j-1) + 1 - endIndx = startIndx + 6*InitInp%vecMultiplier - 1 - InitInp%AddBLin(I,:,j) = tmpVec2(startIndx:endIndx) + do j = 1, InputFileData%nWAMITObj + startIndx = 6*InputFileData%vecMultiplier*(j-1) + 1 + endIndx = startIndx + 6*InputFileData%vecMultiplier - 1 + InputFileData%AddBLin(I,:,j) = tmpVec2(startIndx:endIndx) end do END DO ! AddBQuad + DO I=1,6*InputFileData%vecMultiplier - DO I=1,6*InitInp%vecMultiplier - - WRITE(strI,'(I1)') I - CALL ReadAry ( UnIn, FileName, tmpVec2, 6*InitInp%NBody, 'AddBQuad', & - ' Row '//strI//' of the additional quadratic damping matrix', ErrStat2, ErrMsg2, UnEchoLocal ) + call ParseAry( FileInfo_In, CurLine, ' Row '//strI//' of the additional quadratic damping matrix', & + tmpVec2, 6*InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - do j = 1, InitInp%nWAMITObj - startIndx = 6*InitInp%vecMultiplier*(j-1) + 1 - endIndx = startIndx + 6*InitInp%vecMultiplier - 1 - InitInp%AddBQuad(I,:,j) = tmpVec2(startIndx:endIndx) + do j = 1, InputFileData%nWAMITObj + startIndx = 6*InputFileData%vecMultiplier*(j-1) + 1 + endIndx = startIndx + 6*InputFileData%vecMultiplier - 1 + InputFileData%AddBQuad(I,:,j) = tmpVec2(startIndx:endIndx) end do END DO @@ -1265,1077 +669,602 @@ SUBROUTINE HydroDynInput_GetInput( InitInp, ErrStat, ErrMsg ) !------------------------------------------------------------------------------------------------- ! Axial Coefficients Section !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + ! NAxCoef - Number of axial coefficients + call ParseVar( FileInfo_In, CurLine, 'NAxCoef', InputFileData%Morison%NAxCoefs, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - ! Header + ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Axial coefficient table header line 1: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Axial coefficient table header line 2: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + + IF ( InputFileData%Morison%NAxCoefs > 0 ) THEN + CALL AllocAry( tmpReArray, 4, 'temporary array for AxialCoefs', ErrStat2, ErrMsg2 ) + if (Failed()) return; - CALL ReadCom( UnIn, FileName, 'Axial coefs header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN + ! Allocate memory for Axial Coef-related arrays + ALLOCATE ( InputFileData%Morison%AxialCoefs(InputFileData%Morison%NAxCoefs), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for AxialCoefs array.' + if (Failed()) return; END IF - - - ! NAxCoef - Number of axial coefficients - - CALL ReadVar ( UnIn, FileName, InitInp%Morison%NAxCoefs, 'NAxCoefs', 'Number of axial coefficients', ErrStat2, ErrMsg2, UnEchoLocal ) + + DO I = 1,InputFileData%Morison%NAxCoefs + ! read the table entries AxCoefID CdAx CaAx in the HydroDyn input file + call ParseAry( FileInfo_In, CurLine, ' axial coefficients line '//trim( Int2LStr(I)), tmpReArray, size(tmpReArray), ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + InputFileData%Morison%AxialCoefs(I)%AxCoefID = NINT(tmpReArray(1)) + InputFileData%Morison%AxialCoefs(I)%AxCd = tmpReArray(2) + InputFileData%Morison%AxialCoefs(I)%AxCa = tmpReArray(3) + InputFileData%Morison%AxialCoefs(I)%AxCp = tmpReArray(4) + END DO - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Axial coefficient table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Axial coefficient table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Morison%NAxCoefs > 0 ) THEN - - - ! Allocate memory for Axial Coef-related arrays - - ALLOCATE ( InitInp%Morison%AxialCoefs(InitInp%Morison%NAxCoefs), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for AxialCoefs array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - DO I = 1,InitInp%Morison%NAxCoefs - ! read the table entries AxCoefID CdAx CaAx in the HydroDyn input file - READ(UnIn,'(A)',IOSTAT=ErrStat2) Line !read into a line - - IF (ErrStat2 == 0) THEN - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%AxialCoefs(I)%AxCoefID, InitInp%Morison%AxialCoefs(I)%AxCd, InitInp%Morison%AxialCoefs(I)%AxCa, InitInp%Morison%AxialCoefs(I)%AxCp - END IF - - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read axial coefficients.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Echo ) THEN - WRITE( UnEchoLocal, '(A)' ) TRIM(Line) - END IF - - END DO - + if (allocated(tmpReArray)) deallocate(tmpReArray) END IF - + !------------------------------------------------------------------------------------------------- ! Member Joints Section !------------------------------------------------------------------------------------------------- - - - ! Header - - CALL ReadCom( UnIn, FileName, 'Member joints header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 ! NJoints - Number of member joints - - CALL ReadVar ( UnIn, FileName, InitInp%Morison%NJoints, 'NJoints', 'Number of member joints', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Member joints table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Member joints table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Morison%NJoints > 0 ) THEN - - - ! Allocate memory for Joint-related arrays - - ALLOCATE ( InitInp%Morison%InpJoints(InitInp%Morison%NJoints), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for InpJoints array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - DO I = 1,InitInp%Morison%NJoints - ! read the table entries JointID Jointxi Jointyi Jointzi JointAxID JointOvrlp in the HydroDyn input file - READ(UnIn,'(A)',IOSTAT=ErrStat2) Line !read into a line - - IF (ErrStat2 == 0) THEN - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%InpJoints(I)%JointID, InitInp%Morison%InpJoints(I)%Position(1), InitInp%Morison%InpJoints(I)%Position(2), InitInp%Morison%InpJoints(I)%Position(3), InitInp%Morison%InpJoints(I)%JointAxID, InitInp%Morison%InpJoints(I)%JointOvrlp - END IF - - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read joints.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Echo ) THEN - WRITE( UnEchoLocal, '(A)' ) TRIM(Line) - END IF - - END DO - - END IF - - - - - !------------------------------------------------------------------------------------------------- - ! Member Cross-section Properties Section - !------------------------------------------------------------------------------------------------- - - - ! Header - - CALL ReadCom( UnIn, FileName, 'Member cross-section properties header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! NPropSets - Number of member cross-section property sets - - CALL ReadVar ( UnIn, FileName, InitInp%Morison%NPropSets, 'NPropSets', 'Number of member cross-section property sets', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Member cross-section properties table header', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Member cross-section properties table header', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Morison%NPropSets > 0 ) THEN - - - ! Allocate memory for Member cross-section property set-related arrays - - ALLOCATE ( InitInp%Morison%MPropSets(InitInp%Morison%NPropSets), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for MPropSets array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - - DO I = 1,InitInp%Morison%NPropSets - - READ(UnIn,'(A)',IOSTAT=ErrStat2) Line !read into a line - - IF (ErrStat2 == 0) THEN - READ(Line,*,IOSTAT=ErrStat) InitInp%Morison%MPropSets(I)%PropSetID, InitInp%Morison%MPropSets(I)%PropD, InitInp%Morison%MPropSets(I)%PropThck - END IF - - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read member cross-section properties.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Echo ) THEN - WRITE( UnEchoLocal, '(A)' ) TRIM(Line) - END IF - - END DO - - END IF - - - - - - !------------------------------------------------------------------------------------------------- - ! Simple hydrodynamic coefficients Section - !------------------------------------------------------------------------------------------------- - - - ! Header - - CALL ReadCom( UnIn, FileName, 'Simple hydrodynamic coefficients header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Header - - CALL ReadCom( UnIn, FileName, 'Simple hydrodynamic coefficients table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Header - - CALL ReadCom( UnIn, FileName, 'Simple hydrodynamic coefficients table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - READ(UnIn,'(A)',IOSTAT=ErrStat2) Line !read into a line - - IF (ErrStat2 == 0) THEN - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%SimplCd, InitInp%Morison%SimplCdMG, InitInp%Morison%SimplCa, InitInp%Morison%SimplCaMG, InitInp%Morison%SimplCp, InitInp%Morison%SimplCpMG, InitInp%Morison%SimplAxCd, InitInp%Morison%SimplAxCdMG, InitInp%Morison%SimplAxCa, InitInp%Morison%SimplAxCaMG, InitInp%Morison%SimplAxCp, InitInp%Morison%SimplAxCpMG - END IF - - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read simple hydrodynamic coefficients.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Echo ) THEN - WRITE( UnEchoLocal, '(A)' ) TRIM(Line) - END IF - - - - - !------------------------------------------------------------------------------------------------- - ! Depth-based Hydrodynamic Coefficients Section - !------------------------------------------------------------------------------------------------- - - - ! Header - - CALL ReadCom( UnIn, FileName, 'Depth-based hydrodynamic coefficients header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! NCoefDpth - Number of depth-based hydrodynamic coefficient property sets - - CALL ReadVar ( UnIn, FileName, InitInp%Morison%NCoefDpth, 'NCoefDpth', 'Number of depth-based hydrodynamic coefficient property sets', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'NJoints', InputFileData%Morison%NJoints, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Joints table header line 1: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Joints table header line 2: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 - CALL ReadCom( UnIn, FileName, 'Depth-based hydrodynamic coefficients table header', ErrStat2, ErrMsg2, UnEchoLocal ) + IF ( InputFileData%Morison%NJoints > 0 ) THEN + CALL AllocAry( tmpReArray, 6, 'temporary array for InpJoints', ErrStat2, ErrMsg2 ) + if (Failed()) return; - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Depth-based hydrodynamic coefficients table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - IF ( InitInp%Morison%NCoefDpth > 0 ) THEN - - - ! Allocate memory for depth-based coefficient arrays - - ALLOCATE ( InitInp%Morison%CoefDpths(InitInp%Morison%NCoefDpth), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for CoefDpths array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - DO I = 1,InitInp%Morison%NCoefDpth - - READ(UnIn,'(A)',IOSTAT=ErrStat2) Line !read into a line - - IF (ErrStat2 == 0) THEN - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%CoefDpths(I)%Dpth, InitInp%Morison%CoefDpths(I)%DpthCd, InitInp%Morison%CoefDpths(I)%DpthCdMG, & - InitInp%Morison%CoefDpths(I)%DpthCa, InitInp%Morison%CoefDpths(I)%DpthCaMG, InitInp%Morison%CoefDpths(I)%DpthCp, InitInp%Morison%CoefDpths(I)%DpthCpMG, & - InitInp%Morison%CoefDpths(I)%DpthAxCd, InitInp%Morison%CoefDpths(I)%DpthAxCdMG, InitInp%Morison%CoefDpths(I)%DpthAxCa, & - InitInp%Morison%CoefDpths(I)%DpthAxCaMG, InitInp%Morison%CoefDpths(I)%DpthAxCp, InitInp%Morison%CoefDpths(I)%DpthAxCpMG - END IF - - IF (ErrStat2 /= 0) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read depth-based coefficient array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Echo ) THEN - WRITE( UnEchoLocal, '(A)' ) TRIM(Line) - END IF - - END DO - - END IF - - - !------------------------------------------------------------------------------------------------- - ! Member-based Hydrodynamic Coefficients Section - !------------------------------------------------------------------------------------------------- - - - ! Header - - CALL ReadCom( UnIn, FileName, 'Member-based hydrodynamic coefficients header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! NCoefMembers - Number of member-based hydrodynamic coefficient property sets - - CALL ReadVar ( UnIn, FileName, InitInp%Morison%NCoefMembers, 'NCoefMembers', 'Number of member-based hydrodynamic coefficient property sets', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Member-based hydrodynamic coefficients table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Member-based hydrodynamic coefficients table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - IF ( InitInp%Morison%NCoefMembers > 0 ) THEN - - - ! Allocate memory for Member-based coefficient arrays - - ALLOCATE ( InitInp%Morison%CoefMembers(InitInp%Morison%NCoefMembers), STAT = ErrStat2 ) + ! Allocate memory for Joint-related arrays + ALLOCATE ( InputFileData%Morison%InpJoints(InputFileData%Morison%NJoints), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for CoefMembers array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - DO I = 1,InitInp%Morison%NCoefMembers - - READ(UnIn,'(A)',IOSTAT=ErrStat2) Line !read into a line - - IF (ErrStat2 == 0) THEN - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%CoefMembers(I)%MemberID, & - InitInp%Morison%CoefMembers(I)%MemberCd1, InitInp%Morison%CoefMembers(I)%MemberCd2, & - InitInp%Morison%CoefMembers(I)%MemberCdMG1, InitInp%Morison%CoefMembers(I)%MemberCdMG2, & - InitInp%Morison%CoefMembers(I)%MemberCa1, InitInp%Morison%CoefMembers(I)%MemberCa2, & - InitInp%Morison%CoefMembers(I)%MemberCaMG1, InitInp%Morison%CoefMembers(I)%MemberCaMG2, & - InitInp%Morison%CoefMembers(I)%MemberCp1, InitInp%Morison%CoefMembers(I)%MemberCp2, & - InitInp%Morison%CoefMembers(I)%MemberCpMG1, InitInp%Morison%CoefMembers(I)%MemberCpMG2, & - InitInp%Morison%CoefMembers(I)%MemberAxCd1, InitInp%Morison%CoefMembers(I)%MemberAxCd2, & - InitInp%Morison%CoefMembers(I)%MemberAxCdMG1, InitInp%Morison%CoefMembers(I)%MemberAxCdMG2, & - InitInp%Morison%CoefMembers(I)%MemberAxCa1, InitInp%Morison%CoefMembers(I)%MemberAxCa2, & - InitInp%Morison%CoefMembers(I)%MemberAxCaMG1, InitInp%Morison%CoefMembers(I)%MemberAxCaMG2, & - InitInp%Morison%CoefMembers(I)%MemberAxCp1, InitInp%Morison%CoefMembers(I)%MemberAxCp2, & - InitInp%Morison%CoefMembers(I)%MemberAxCpMG1, InitInp%Morison%CoefMembers(I)%MemberAxCpMG2 - END IF - - - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read member cross-section properties.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Echo ) THEN - WRITE( UnEchoLocal, '(A)' ) TRIM(Line) - END IF - - END DO - - END IF - - - - !------------------------------------------------------------------------------------------------- - ! Members Section - !------------------------------------------------------------------------------------------------- - - - ! Header - - CALL ReadCom( UnIn, FileName, 'Members header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! NMembers - Number of members in the input file - - CALL ReadVar ( UnIn, FileName, InitInp%Morison%NMembers, 'NMembers', 'Number of members', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Members table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - ! Table header - - CALL ReadCom( UnIn, FileName, 'Members table header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - IF ( InitInp%Morison%NMembers > 0 ) THEN - - - ! Allocate memory for Members arrays - - ALLOCATE ( InitInp%Morison%InpMembers(InitInp%Morison%NMembers), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for InpMembers array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - DO I = 1,InitInp%Morison%NMembers - !ReadStr ( UnIn, Fil, Line, 'Joint table', VarDescr, ErrStat ) - READ(UnIn,'(A)',IOSTAT=ErrStat2) Line !read into a line - - IF (ErrStat2 == 0) THEN - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%InpMembers(I)%MemberID, InitInp%Morison%InpMembers(I)%MJointID1, & - InitInp%Morison%InpMembers(I)%MJointID2, InitInp%Morison%InpMembers(I)%MPropSetID1, & - InitInp%Morison%InpMembers(I)%MPropSetID2, InitInp%Morison%InpMembers(I)%MDivSize, & - InitInp%Morison%InpMembers(I)%MCoefMod, InitInp%Morison%InpMembers(I)%PropPot - END IF - - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read member properties.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Echo ) THEN - WRITE( UnEchoLocal, '(A)' ) TRIM(Line) - END IF - - END DO - - END IF - - - !------------------------------------------------------------------------------------------------- - ! Filled Members Section - !------------------------------------------------------------------------------------------------- - - - ! Header - - CALL ReadCom( UnIn, FileName, 'Filled members header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! NFillGroups - Number of fill groups - - CALL ReadVar ( UnIn, FileName, InitInp%Morison%NFillGroups, 'NFillGroups', 'Number of fill groups', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for InpJoints array.' + if (Failed()) return; END IF - ! Table header + DO I = 1,InputFileData%Morison%NJoints + ! read the table entries JointID Jointxi Jointyi Jointzi JointAxID JointOvrlp in the HydroDyn input file + call ParseAry( FileInfo_In, CurLine, ' joints table line '//trim( Int2LStr(I)), tmpReArray, size(tmpReArray), ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + InputFileData%Morison%InpJoints(I)%JointID = NINT(tmpReArray(1)) + InputFileData%Morison%InpJoints(I)%Position(1) = tmpReArray(2) + InputFileData%Morison%InpJoints(I)%Position(2) = tmpReArray(3) + InputFileData%Morison%InpJoints(I)%Position(3) = tmpReArray(4) + InputFileData%Morison%InpJoints(I)%JointAxID = NINT(tmpReArray(5)) + InputFileData%Morison%InpJoints(I)%JointOvrlp = NINT(tmpReArray(6)) + END DO + + if (allocated(tmpReArray)) deallocate(tmpReArray) + END IF - CALL ReadCom( UnIn, FileName, 'Fill groups table header', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + !------------------------------------------------------------------------------------------------- + ! Member Cross-section Properties Section + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + + ! NPropSets - Number of member cross-section property sets + call ParseVar( FileInfo_In, CurLine, 'NPropSets', InputFileData%Morison%NPropSets, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'MPropSets table header line 1: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'MPropSets table header line 2: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 - CALL ReadCom( UnIn, FileName, 'Fill groups table header', ErrStat2, ErrMsg2, UnEchoLocal ) + IF ( InputFileData%Morison%NPropSets > 0 ) THEN - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + CALL AllocAry( tmpReArray, 3, 'temporary array for MPropSets', ErrStat2, ErrMsg2 ) + if (Failed()) return; + ! Allocate memory for Member cross-section property set-related arrays + ALLOCATE ( InputFileData%Morison%MPropSets(InputFileData%Morison%NPropSets), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for MPropSets array.' + if (Failed()) return; + END IF - IF ( InitInp%Morison%NFillGroups > 0 ) THEN + DO I = 1,InputFileData%Morison%NPropSets + call ParseAry( FileInfo_In, CurLine, ' MPropSets line '//trim( Int2LStr(I)), tmpReArray, size(tmpReArray), ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + InputFileData%Morison%MPropSets(I)%PropSetID = NINT(tmpReArray(1)) + InputFileData%Morison%MPropSets(I)%PropD = tmpReArray(2) + InputFileData%Morison%MPropSets(I)%PropThck = tmpReArray(3) + END DO + if (allocated(tmpReArray)) deallocate(tmpReArray) + END IF - ! Allocate memory for filled group arrays - ALLOCATE ( InitInp%Morison%FilledGroups(InitInp%Morison%NFillGroups), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for FilledGroups array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF + !------------------------------------------------------------------------------------------------- + ! Simple hydrodynamic coefficients Section + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 - DO I = 1,InitInp%Morison%NFillGroups + ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Simple hydrodynamic coefficients table header line 1: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Simple hydrodynamic coefficients table header line 2: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 - READ(UnIn,'(A)',IOSTAT=ErrStat2) Line !read into a line + CALL AllocAry( tmpReArray, 12, 'temporary array for Simple hydrodynamic coefficients', ErrStat2, ErrMsg2 ) + if (Failed()) return; + call ParseAry( FileInfo_In, CurLine, 'Simple hydrodynamic coefficients table row '//trim( Int2LStr(I)), tmpReArray, size(tmpReArray), ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - IF (ErrStat2 == 0) THEN + InputFileData%Morison%SimplCd = tmpReArray( 1) + InputFileData%Morison%SimplCdMG = tmpReArray( 2) + InputFileData%Morison%SimplCa = tmpReArray( 3) + InputFileData%Morison%SimplCaMG = tmpReArray( 4) + InputFileData%Morison%SimplCp = tmpReArray( 5) + InputFileData%Morison%SimplCpMG = tmpReArray( 6) + InputFileData%Morison%SimplAxCd = tmpReArray( 7) + InputFileData%Morison%SimplAxCdMG = tmpReArray( 8) + InputFileData%Morison%SimplAxCa = tmpReArray( 9) + InputFileData%Morison%SimplAxCaMG = tmpReArray(10) + InputFileData%Morison%SimplAxCp = tmpReArray(11) + InputFileData%Morison%SimplAxCpMG = tmpReArray(12) - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%FilledGroups(I)%FillNumM - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read FillNumM.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF + if (allocated(tmpReArray)) deallocate(tmpReArray) - ALLOCATE ( InitInp%Morison%FilledGroups(I)%FillMList(InitInp%Morison%FilledGroups(I)%FillNumM), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for FillMList array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF + !------------------------------------------------------------------------------------------------- + ! Depth-based Hydrodynamic Coefficients Section + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + ! NCoefDpth - Number of depth-based hydrodynamic coefficient property sets + call ParseVar( FileInfo_In, CurLine, 'NCoefDpth', InputFileData%Morison%NCoefDpth, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%FilledGroups(I)%FillNumM, InitInp%Morison%FilledGroups(I)%FillMList, & - InitInp%Morison%FilledGroups(I)%FillFSLoc, InitInp%Morison%FilledGroups(I)%FillDensChr + ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Depth-based hydrodynamic coefficients table header line 1: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Depth-based hydrodynamic coefficients table header line 2: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read filled group properties.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Echo ) THEN - WRITE( UnEchoLocal, '(A)' ) TRIM(Line) - END IF + IF ( InputFileData%Morison%NCoefDpth > 0 ) THEN - END IF + CALL AllocAry( tmpReArray, 13, 'temporary array for CoefDpths', ErrStat2, ErrMsg2 ) + if (Failed()) return; + ! Allocate memory for depth-based coefficient arrays + ALLOCATE ( InputFileData%Morison%CoefDpths(InputFileData%Morison%NCoefDpth), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for CoefDpths array.' + if (Failed()) return; + END IF + + DO I = 1,InputFileData%Morison%NCoefDpth + call ParseAry( FileInfo_In, CurLine, ' CoefDpths coefficients table row '//trim( Int2LStr(I)), tmpReArray, size(tmpReArray), ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + InputFileData%Morison%CoefDpths(I)%Dpth = tmpReArray( 1) + InputFileData%Morison%CoefDpths(I)%DpthCd = tmpReArray( 2) + InputFileData%Morison%CoefDpths(I)%DpthCdMG = tmpReArray( 3) + InputFileData%Morison%CoefDpths(I)%DpthCa = tmpReArray( 4) + InputFileData%Morison%CoefDpths(I)%DpthCaMG = tmpReArray( 5) + InputFileData%Morison%CoefDpths(I)%DpthCp = tmpReArray( 6) + InputFileData%Morison%CoefDpths(I)%DpthCpMG = tmpReArray( 7) + InputFileData%Morison%CoefDpths(I)%DpthAxCd = tmpReArray( 8) + InputFileData%Morison%CoefDpths(I)%DpthAxCdMG = tmpReArray( 9) + InputFileData%Morison%CoefDpths(I)%DpthAxCa = tmpReArray(10) + InputFileData%Morison%CoefDpths(I)%DpthAxCaMG = tmpReArray(11) + InputFileData%Morison%CoefDpths(I)%DpthAxCp = tmpReArray(12) + InputFileData%Morison%CoefDpths(I)%DpthAxCpMG = tmpReArray(13) END DO + if (allocated(tmpReArray)) deallocate(tmpReArray) END IF !------------------------------------------------------------------------------------------------- - ! Marine Growth by Depth Section + ! Member-based Hydrodynamic Coefficients Section !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + ! NCoefMembers - Number of member-based hydrodynamic coefficient property sets + call ParseVar( FileInfo_In, CurLine, 'NCoefMembers', InputFileData%Morison%NCoefMembers, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - ! Header + ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Member-based hydrodynamic coefficients table header line 1: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Member-based hydrodynamic coefficients table header line 2: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 - CALL ReadCom( UnIn, FileName, 'Marine growth by depth header', ErrStat2, ErrMsg2, UnEchoLocal ) + IF ( InputFileData%Morison%NCoefMembers > 0 ) THEN - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + CALL AllocAry( tmpReArray, 25, 'temporary array for CoefMembers', ErrStat2, ErrMsg2 ) + if (Failed()) return; + ! Allocate memory for Member-based coefficient arrays + ALLOCATE ( InputFileData%Morison%CoefMembers(InputFileData%Morison%NCoefMembers), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for CoefMembers array.' + if (Failed()) return; + END IF + + DO I = 1,InputFileData%Morison%NCoefMembers + call ParseAry( FileInfo_In, CurLine, 'Member-based hydrodynamic coefficients table row '//trim( Int2LStr(I)), tmpReArray, size(tmpReArray), ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + InputFileData%Morison%CoefMembers(I)%MemberID = NINT(tmpReArray( 1)) + InputFileData%Morison%CoefMembers(I)%MemberCd1 = tmpReArray( 2) + InputFileData%Morison%CoefMembers(I)%MemberCd2 = tmpReArray( 3) + InputFileData%Morison%CoefMembers(I)%MemberCdMG1 = tmpReArray( 4) + InputFileData%Morison%CoefMembers(I)%MemberCdMG2 = tmpReArray( 5) + InputFileData%Morison%CoefMembers(I)%MemberCa1 = tmpReArray( 6) + InputFileData%Morison%CoefMembers(I)%MemberCa2 = tmpReArray( 7) + InputFileData%Morison%CoefMembers(I)%MemberCaMG1 = tmpReArray( 8) + InputFileData%Morison%CoefMembers(I)%MemberCaMG2 = tmpReArray( 9) + InputFileData%Morison%CoefMembers(I)%MemberCp1 = tmpReArray(10) + InputFileData%Morison%CoefMembers(I)%MemberCp2 = tmpReArray(11) + InputFileData%Morison%CoefMembers(I)%MemberCpMG1 = tmpReArray(12) + InputFileData%Morison%CoefMembers(I)%MemberCpMG2 = tmpReArray(13) + InputFileData%Morison%CoefMembers(I)%MemberAxCd1 = tmpReArray(14) + InputFileData%Morison%CoefMembers(I)%MemberAxCd2 = tmpReArray(15) + InputFileData%Morison%CoefMembers(I)%MemberAxCdMG1 = tmpReArray(16) + InputFileData%Morison%CoefMembers(I)%MemberAxCdMG2 = tmpReArray(17) + InputFileData%Morison%CoefMembers(I)%MemberAxCa1 = tmpReArray(18) + InputFileData%Morison%CoefMembers(I)%MemberAxCa2 = tmpReArray(19) + InputFileData%Morison%CoefMembers(I)%MemberAxCaMG1 = tmpReArray(20) + InputFileData%Morison%CoefMembers(I)%MemberAxCaMG2 = tmpReArray(21) + InputFileData%Morison%CoefMembers(I)%MemberAxCp1 = tmpReArray(22) + InputFileData%Morison%CoefMembers(I)%MemberAxCp2 = tmpReArray(23) + InputFileData%Morison%CoefMembers(I)%MemberAxCpMG1 = tmpReArray(24) + InputFileData%Morison%CoefMembers(I)%MemberAxCpMG2 = tmpReArray(25) + END DO + if (allocated(tmpReArray)) deallocate(tmpReArray) + END IF - ! NMGDepths - Number marine growth depths - CALL ReadVar ( UnIn, FileName, InitInp%Morison%NMGDepths, 'NMGDepths', 'Number marine growth depths', ErrStat2, ErrMsg2, UnEchoLocal ) + !------------------------------------------------------------------------------------------------- + ! Members Section + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + ! NMembers - Number of members in the input file + call ParseVar( FileInfo_In, CurLine, 'NMembers', InputFileData%Morison%NMembers, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Members table header line 1: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Members table header line 2: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 - CALL ReadCom( UnIn, FileName, 'Marine growth by depth table header', ErrStat2, ErrMsg2, UnEchoLocal ) + IF ( InputFileData%Morison%NMembers > 0 ) THEN - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + ! Allocate memory for Members arrays + ALLOCATE ( InputFileData%Morison%InpMembers(InputFileData%Morison%NMembers), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for InpMembers array.' + if (Failed()) return; + END IF + + DO I = 1,InputFileData%Morison%NMembers + ! We can't use the ParseAry here since PropPot is a logical + Line = FileInfo_In%Lines(CurLine) + READ(Line,*,IOSTAT=ErrStat2) InputFileData%Morison%InpMembers(I)%MemberID, InputFileData%Morison%InpMembers(I)%MJointID1, & + InputFileData%Morison%InpMembers(I)%MJointID2, InputFileData%Morison%InpMembers(I)%MPropSetID1, & + InputFileData%Morison%InpMembers(I)%MPropSetID2, InputFileData%Morison%InpMembers(I)%MDivSize, & + InputFileData%Morison%InpMembers(I)%MCoefMod, InputFileData%Morison%InpMembers(I)%PropPot + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error reading members table row '//trim( Int2LStr(I))//', line ' & + //trim( Int2LStr(FileInfo_In%FileLine(CurLine)))//' of file '//trim(FileInfo_In%FileList(FileInfo_In%FileIndx(CurLine))) + if (Failed()) return; + END IF - ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Echo this line + CurLine = CurLine+1 + END DO - CALL ReadCom( UnIn, FileName, 'Marine growth by depth table header', ErrStat2, ErrMsg2, UnEchoLocal ) + END IF - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + !------------------------------------------------------------------------------------------------- + ! Filled Members Section + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 - IF ( InitInp%Morison%NMGDepths > 0 ) THEN + ! NFillGroups - Number of fill groups + call ParseVar( FileInfo_In, CurLine, 'NFillGroups', InputFileData%Morison%NFillGroups, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Fill groups table header line 1: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Fill groups table header line 2: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 - ! Allocate memory for marine growth depths array + IF ( InputFileData%Morison%NFillGroups > 0 ) THEN - ALLOCATE ( InitInp%Morison%MGDepths(InitInp%Morison%NMGDepths), STAT = ErrStat2 ) + ! Allocate memory for filled group arrays + ALLOCATE ( InputFileData%Morison%FilledGroups(InputFileData%Morison%NFillGroups), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for MGDepths array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for FilledGroups array.' + if (Failed()) return; END IF - DO I = 1,InitInp%Morison%NMGDepths - - READ(UnIn,'(A)',IOSTAT=ErrStat2) Line !read into a line + DO I = 1,InputFileData%Morison%NFillGroups + ! We can't use the ParseAry here since the number of entries is indicated by the first entry + Line = FileInfo_In%Lines(CurLine) - IF (ErrStat2 == 0) THEN - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%MGDepths(I)%MGDpth, InitInp%Morison%MGDepths(I)%MGThck, InitInp%Morison%MGDepths(I)%MGDens + READ(Line,*,IOSTAT=ErrStat2) InputFileData%Morison%FilledGroups(I)%FillNumM + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Failed to read FillNumM.' + if (Failed()) return; END IF + ALLOCATE ( InputFileData%Morison%FilledGroups(I)%FillMList(InputFileData%Morison%FilledGroups(I)%FillNumM), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read marine growth depth properties.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for FillMList array.' + if (Failed()) return; END IF - - IF ( InitInp%Echo ) THEN - WRITE( UnEchoLocal, '(A)' ) TRIM(Line) + + READ(Line,*,IOSTAT=ErrStat2) InputFileData%Morison%FilledGroups(I)%FillNumM, InputFileData%Morison%FilledGroups(I)%FillMList, & + InputFileData%Morison%FilledGroups(I)%FillFSLoc, InputFileData%Morison%FilledGroups(I)%FillDensChr + + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Failed to read filled group properties.' + if (Failed()) return; END IF + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Echo this line + CurLine = CurLine+1 END DO END IF !------------------------------------------------------------------------------------------------- - ! Member Output List Section + ! Marine Growth by Depth Section !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 - ! Header - - CALL ReadCom( UnIn, FileName, 'Member output list header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - ! NMOutputs - Number of members to output - - CALL ReadVar ( UnIn, FileName, InitInp%Morison%NMOutputs, 'NMOutputs', 'Number of members to output', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + ! NMGDepths - Number marine growth depths + call ParseVar( FileInfo_In, CurLine, 'NMGDepths', InputFileData%Morison%NMGDepths, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Marine growth by depth table header line 1: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Marine growth by depth table header line 2: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 - CALL ReadCom( UnIn, FileName, 'Member output list table header', ErrStat2, ErrMsg2, UnEchoLocal ) + IF ( InputFileData%Morison%NMGDepths > 0 ) THEN + CALL AllocAry( tmpReArray, 3, 'temporary array for marine growth table', ErrStat2, ErrMsg2 ) + if (Failed()) return; - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN + ! Allocate memory for marine growth depths array + ALLOCATE ( InputFileData%Morison%MGDepths(InputFileData%Morison%NMGDepths), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for MGDepths array.' + if (Failed()) return; END IF - ! Table header + DO I = 1,InputFileData%Morison%NMGDepths + call ParseAry( FileInfo_In, CurLine, ' Marine growth table row '//trim( Int2LStr(I)), tmpReArray, size(tmpReArray), ErrStat2, ErrMsg2, UnEc ) + InputFileData%Morison%MGDepths(I)%MGDpth = tmpReArray(1) + InputFileData%Morison%MGDepths(I)%MGThck = tmpReArray(2) + InputFileData%Morison%MGDepths(I)%MGDens = tmpReArray(3) + END DO - CALL ReadCom( UnIn, FileName, 'Member output list table header', ErrStat2, ErrMsg2, UnEchoLocal ) + if (allocated(tmpReArray)) deallocate(tmpReArray) + END IF - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + !------------------------------------------------------------------------------------------------- + ! Member Output List Section + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + + ! NMOutputs - Number of members to output + call ParseVar( FileInfo_In, CurLine, 'NMOutputs', InputFileData%Morison%NMOutputs, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - IF ( InitInp%Morison%NMOutputs > 0 ) THEN + ! Table header + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Member output list table header line 1: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Member output list table header line 2: '//NewLine//trim(FileInfo_In%Lines(CurLine)) + CurLine = CurLine + 1 + IF ( InputFileData%Morison%NMOutputs > 0 ) THEN ! Allocate memory for filled group arrays - - ALLOCATE ( InitInp%Morison%MOutLst(InitInp%Morison%NMOutputs), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Morison%MOutLst(InputFileData%Morison%NMOutputs), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for MOutLst array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for MOutLst array.' + if (Failed()) return; END IF - DO I = 1,InitInp%Morison%NMOutputs + DO I = 1,InputFileData%Morison%NMOutputs - READ(UnIn,'(A)',IOSTAT=ErrStat2) Line !read into a line + ! We can't use the ParseAry here since the number of entries is indicated by the first entry + Line = FileInfo_In%Lines(CurLine) - IF (ErrStat2 == 0) THEN - - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%MOutLst(I)%MemberID, InitInp%Morison%MOutLst(I)%NOutLoc - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read NOutLoc.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - - ALLOCATE ( InitInp%Morison%MOutLst(I)%NodeLocs(InitInp%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for NodeLocs array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - - - ALLOCATE ( InitInp%Morison%MOutLst(I)%MeshIndx1(InitInp%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for %MeshIndx1 array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - ALLOCATE ( InitInp%Morison%MOutLst(I)%MemberIndx1(InitInp%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for %MemberIndx1 array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF + READ(Line,*,IOSTAT=ErrStat2) InputFileData%Morison%MOutLst(I)%MemberID, InputFileData%Morison%MOutLst(I)%NOutLoc + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Failed to read NOutLoc.' + if (Failed()) return; + END IF + + ALLOCATE ( InputFileData%Morison%MOutLst(I)%NodeLocs(InputFileData%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for NodeLocs array.' + if (Failed()) return; + END IF - ALLOCATE ( InitInp%Morison%MOutLst(I)%MeshIndx2(InitInp%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for %MeshIndx2 array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF - ALLOCATE ( InitInp%Morison%MOutLst(I)%MemberIndx2(InitInp%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for %MemberIndx2 array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF + ALLOCATE ( InputFileData%Morison%MOutLst(I)%MeshIndx1(InputFileData%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for %MeshIndx1 array.' + if (Failed()) return; + END IF - ALLOCATE ( InitInp%Morison%MOutLst(I)%s(InitInp%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Morison%MOutLst(I)%MemberIndx1(InputFileData%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for %MemberIndx1 array.' + if (Failed()) return; + END IF - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for s array.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF + ALLOCATE ( InputFileData%Morison%MOutLst(I)%MeshIndx2(InputFileData%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for %MeshIndx2 array.' + if (Failed()) return; + END IF - READ(Line,*,IOSTAT=ErrStat2) InitInp%Morison%MOutLst(I)%MemberID, InitInp%Morison%MOutLst(I)%NOutLoc, & - InitInp%Morison%MOutLst(I)%NodeLocs + ALLOCATE ( InputFileData%Morison%MOutLst(I)%MemberIndx2(InputFileData%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for %MemberIndx2 array.' + if (Failed()) return; + END IF - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to read member output list properties.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF + ALLOCATE ( InputFileData%Morison%MOutLst(I)%s(InputFileData%Morison%MOutLst(I)%NOutLoc), STAT = ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for s array.' + if (Failed()) return; + END IF - IF ( InitInp%Echo ) THEN - WRITE( UnEchoLocal, '(A)' ) TRIM(Line) - END IF + READ(Line,*,IOSTAT=ErrStat2) InputFileData%Morison%MOutLst(I)%MemberID, InputFileData%Morison%MOutLst(I)%NOutLoc, & + InputFileData%Morison%MOutLst(I)%NodeLocs + IF ( ErrStat2 /= 0 ) THEN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Failed to read member output list properties.' + if (Failed()) return; END IF + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Echo this line + CurLine = CurLine+1 END DO END IF + !------------------------------------------------------------------------------------------------- ! Joint Output List Section !------------------------------------------------------------------------------------------------- - - ! Header - - CALL ReadCom( UnIn, FileName, 'Joint output list header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 ! NJOutputs - Number of joints to output + call ParseVar( FileInfo_In, CurLine, 'NJOutputs', InputFileData%Morison%NJOutputs, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; - CALL ReadVar ( UnIn, FileName, InitInp%Morison%NJOutputs, 'NJOutputs', 'Number of joints to output', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - IF ( InitInp%Morison%NJOutputs > 0 ) THEN - - ALLOCATE ( InitInp%Morison%JOutLst(InitInp%Morison%NJOutputs), STAT = ErrStat2 ) + IF ( InputFileData%Morison%NJOutputs > 0 ) THEN + ALLOCATE ( InputFileData%Morison%JOutLst(InputFileData%Morison%NJOutputs), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for JOutLst data structures.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'Error allocating space for JOutLst data structures.' + if (Failed()) return; END IF - CALL AllocAry( tmpArray, InitInp%Morison%NJOutputs, 'temporary array for Joint outputs', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - CALL ReadAry ( UnIn, FileName, tmpArray, InitInp%Morison%NJOutputs, 'JOutLst', 'Joint output list', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - DO I = 1,InitInp%Morison%NJOutputs + CALL AllocAry( tmpArray, InputFileData%Morison%NJOutputs, 'temporary array for Joint outputs', ErrStat2, ErrMsg2 ) + if (Failed()) return; - InitInp%Morison%JOutLst(I)%JointID = tmpArray(I) + call ParseAry( FileInfo_In, CurLine, 'JOutLst table row '//trim( Int2LStr(I)), tmpArray, InputFileData%Morison%NJOutputs, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + DO I = 1,InputFileData%Morison%NJOutputs + InputFileData%Morison%JOutLst(I)%JointID = tmpArray(I) END DO DEALLOCATE(tmpArray) ELSE - ! There are no Joint Outputs, but there is a line to be parsed in the input file! - - ALLOCATE ( tmpArray(1), STAT = ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating space for temporary array for Joint outputs.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL Cleanup() - RETURN - END IF - - CALL ReadAry ( UnIn, FileName, tmpArray, 1, 'JOutLst', 'Joint output list', ErrStat2, ErrMsg2, UnEchoLocal ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - DEALLOCATE(tmpArray) - !we just want to read the line for echoing purposes when there are actually 0 Joint Outputs. - + ! There are no Joint Outputs, but there is a line here. We don't parse it since we don't want to error on it + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write line to echo + CurLine = CurLine + 1 + END IF + !------------------------------------------------------------------------------------------------- ! Data section for OUTPUT !------------------------------------------------------------------------------------------------- - - ! Header - - CALL ReadCom( UnIn, FileName, 'Output header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 ! HDSum - Whether or not to generate a summary file - - CALL ReadVar ( UnIn, FileName, InitInp%HDSum, 'HDSum', 'Generate a HydroDyn summary file', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'HDSum', InputFileData%HDSum, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! OutAll - Whether or not to output information for every member and joint - - CALL ReadVar ( UnIn, FileName, InitInp%OutAll, 'OutAll', 'Generate all member and joint outputs', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'OutAll', InputFileData%OutAll, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! OutSwtch - Specify how to write to an output file - - CALL ReadVar ( UnIn, FileName, InitInp%OutSwtch, 'OutSwtch', 'Specify how to write to an output file', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - + call ParseVar( FileInfo_In, CurLine, 'OutSwtch', InputFileData%OutSwtch, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! OutFmt - Format for numerical outputs - - CALL ReadVar ( UnIn, FileName, InitInp%OutFmt, 'OutFmt', 'Format for numerical outputs', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'OutFmt', InputFileData%OutFmt, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; ! OutSFmt - Format for output column headers - - CALL ReadVar ( UnIn, FileName, InitInp%OutSFmt, 'OutSFmt', 'Format for output column headers', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ParseVar( FileInfo_In, CurLine, 'OutSFmt', InputFileData%OutSFmt, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; !------------------------------------------------------------------------------------------------- ! Data section for FLOATING PLATFORM OUTPUTS !------------------------------------------------------------------------------------------------- - - ! Header - - !CALL ReadCom( UnIn, FileName, 'Floating Platform Outputs header', ErrStat2, ErrMsg2, UnEchoLocal ) - ! - ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - ! IF (ErrStat >= AbortErrLev) THEN - ! CALL CleanUp() - ! RETURN - ! END IF - CALL ReadCom( UnIn, FileName, 'Outputs header', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 - ! OutList - list of requested parameters to output to a file - - ALLOCATE( InitInp%UserOutputs(4583), Stat=ErrStat2) ! Total possible number of output channels: Waves2 = 18 + SS_Excitation = 7 + SS_Radiation = 7 + Morison= 4032 + HydroDyn=519 = 4583 - IF (ErrStat2 /= 0) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating UserOutputs.', ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL CleanUp() - RETURN - END IF + ! OutList - list of requested parameters to output to a file + call AllocAry( InputFileData%UserOutputs, MaxUserOutputs, 'InputFileData%UserOutputs', ErrStat2, ErrMsg2 ) ! MaxUserOutputs is set in registry + if (Failed()) return; - CALL ReadOutputList ( UnIn, FileName, InitInp%UserOutputs, InitInp%NUserOutputs, & - 'OutList', 'List of user requested outputs', ErrStat2, ErrMsg2, UnEchoLocal ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ReadOutputListFromFileInfo( FileInfo_In, CurLine, InputFileData%UserOutputs, & + InputFileData%NUserOutputs, 'OutList', "List of user-requested output channels", ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; !------------------------------------------------------------------------------------------------- @@ -2348,35 +1277,36 @@ SUBROUTINE HydroDynInput_GetInput( InitInp, ErrStat, ErrMsg ) CONTAINS !.............................. + logical function Failed() + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Failed = ErrStat >= AbortErrLev + if (Failed) call Cleanup() + end function Failed SUBROUTINE Cleanup() - - IF (ALLOCATED(tmpArray)) DEALLOCATE(tmpArray) - - ! Close input file - CLOSE ( UnIn ) - + IF (ALLOCATED(tmpArray )) DEALLOCATE(tmpArray ) + IF (ALLOCATED(tmpReArray)) DEALLOCATE(tmpReArray) + IF (ALLOCATED(tmpVec1 )) DEALLOCATE(tmpVec1 ) + IF (ALLOCATED(tmpVec2 )) DEALLOCATE(tmpVec2 ) ! Cleanup the Echo file and global variables - CALL CleanupEchoFile( InitInp%Echo, UnEchoLocal ) - - + if (UnEc > 0) close ( UnEc ) END SUBROUTINE Cleanup - - -END SUBROUTINE HydroDynInput_GetInput +END SUBROUTINE HydroDyn_ParseInput !==================================================================================================== -SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) +SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrStat, ErrMsg ) ! This private subroutine verifies the input required for HydroDyn is correctly specified. !---------------------------------------------------------------------------------------------------- ! Passed variables - TYPE(HydroDyn_InitInputType), INTENT( INOUT ) :: InitInp ! the hydrodyn data + TYPE(HydroDyn_InitInputType), INTENT( IN ) :: InitInp ! the hydrodyn data + REAL(DbKi), INTENT( IN ) :: Interval ! The DT supplied by the glue code/driver + TYPE(HydroDyn_InputFile), INTENT( INOUT ) :: InputFileData ! the hydrodyn input file data INTEGER, INTENT( OUT ) :: ErrStat ! returns a non-zero value when an error occurs CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -2418,7 +1348,7 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! WtrDens - Water density. - IF ( InitInp%Waves%WtrDens < 0.0 ) THEN + IF ( InputFileData%Waves%WtrDens < 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'WtrDens must not be negative.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -2427,9 +1357,9 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! WtrDpth - Water depth ! First adjust water depth based on MSL2SWL values - InitInp%Morison%WtrDpth = InitInp%Morison%WtrDpth + InitInp%Morison%MSL2SWL + InputFileData%Morison%WtrDpth = InputFileData%Morison%WtrDpth + InputFileData%Morison%MSL2SWL - IF ( InitInp%Morison%WtrDpth <= 0.0 ) THEN + IF ( InputFileData%Morison%WtrDpth <= 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'WtrDpth must be greater than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -2437,7 +1367,7 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! MSL2SWL - Mean sea level to still water level - IF ( InitInp%PotMod == 1 .AND. .NOT. EqualRealNos(InitInp%Morison%MSL2SWL, 0.0_ReKi) ) THEN + IF ( InputFileData%PotMod == 1 .AND. .NOT. EqualRealNos(InputFileData%Morison%MSL2SWL, 0.0_ReKi) ) THEN CALL SetErrStat( ErrID_Fatal,'MSL2SWL must be 0 when PotMod = 1 (WAMIT).',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -2445,18 +1375,18 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! WaveMod - Wave kinematics model switch. - IF ( LEN_TRIM(InitInp%Waves%WaveModChr) > 1 ) THEN + IF ( LEN_TRIM(InputFileData%Waves%WaveModChr) > 1 ) THEN - IF ( InitInp%Waves%WaveModChr(1:2) == '1P' ) THEN ! The user wants to specify the phase in place of a random phase + IF ( InputFileData%Waves%WaveModChr(1:2) == '1P' ) THEN ! The user wants to specify the phase in place of a random phase - READ (InitInp%Waves%WaveModChr(3:),*,IOSTAT=IOS ) InitInp%Waves%WavePhase + READ (InputFileData%Waves%WaveModChr(3:),*,IOSTAT=IOS ) InputFileData%Waves%WavePhase CALL CheckIOS ( IOS, "", 'WavePhase', NumType, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) RETURN WaveModIn = 1 - InitInp%Waves%WaveMod = 10 ! Internally define WaveMod = 10 to mean regular waves with a specified (nonrandom) phase - InitInp%Waves%WavePhase = InitInp%Waves%WavePhase*D2R ! Convert the phase from degrees to radians + InputFileData%Waves%WaveMod = 10 ! Internally define WaveMod = 10 to mean regular waves with a specified (nonrandom) phase + InputFileData%Waves%WavePhase = InputFileData%Waves%WavePhase*D2R ! Convert the phase from degrees to radians ELSE ! The user must have specified WaveMod incorrectly. CALL SetErrStat( ErrID_Fatal,'WaveMod incorrectly specified',ErrStat,ErrMsg,RoutineName) @@ -2465,23 +1395,23 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ELSE ! The line below only works for 1 digit reads - READ( InitInp%Waves%WaveModChr, *, IOSTAT=IOS ) InitInp%Waves%WaveMod + READ( InputFileData%Waves%WaveModChr, *, IOSTAT=IOS ) InputFileData%Waves%WaveMod CALL CheckIOS ( IOS, "", 'WaveMod', NumType, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) RETURN - WaveModIn = InitInp%Waves%WaveMod + WaveModIn = InputFileData%Waves%WaveMod - END IF ! LEN_TRIM(InitInp%Waves%WaveModChr) + END IF ! LEN_TRIM(InputFileData%Waves%WaveModChr) - IF ( (WaveModIn == 6) .AND. .NOT. EqualRealNos(InitInp%Morison%MSL2SWL, 0.0_ReKi) ) THEN + IF ( (WaveModIn == 6) .AND. .NOT. EqualRealNos(InputFileData%Morison%MSL2SWL, 0.0_ReKi) ) THEN CALL SetErrStat( ErrID_Fatal,'MSL2SWL must be 0 when WaveMod = 6.',ErrStat,ErrMsg,RoutineName) RETURN END IF IF ( WaveModIn < 0 .OR. WaveModIn > 6 ) THEN - IF ( InitInp%PotMod == 1 ) THEN + IF ( InputFileData%PotMod == 1 ) THEN CALL SetErrStat( ErrID_Fatal,'WaveMod must be 0, 1, 1P#, 2, 3, 4, 5, or 6.',ErrStat,ErrMsg,RoutineName) RETURN !ADP: This seems like a strange test on ErrStat... @@ -2496,14 +1426,14 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) !errors if: !if ( & ! (WaveModIn /= 0) .or. & - ! (InitInp%Waves2%WvDiffQTFF /= .false.) .or. & - ! (InitInp%Waves2%WvSumQTFF /= .false.) .or. & - ! (InitInp%PotMod /= 0 .or. InitInp%PotMod /=1) .or. & - ! (InitInp%WAMIT%ExctnMod /=0 .or. InitInp%WAMIT%ExctnMod /=2) .or. & - ! (InitInp%WAMIT%RdtnMod /=0 .or. InitInp%WAMIT%RdtnMod /=2) .or. & - ! (InitInp%WAMIT2%MnDrift /=0) .or. & - ! (InitInp%WAMIT2%NewmanApp /= 0) .or. & - ! (InitInp%WAMIT2%SumQTF /= 0 ) ) then + ! (InputFileData%Waves2%WvDiffQTFF /= .false.) .or. & + ! (InputFileData%Waves2%WvSumQTFF /= .false.) .or. & + ! (InputFileData%PotMod /= 0 .or. InputFileData%PotMod /=1) .or. & + ! (InputFileData%WAMIT%ExctnMod /=0 .or. InputFileData%WAMIT%ExctnMod /=2) .or. & + ! (InputFileData%WAMIT%RdtnMod /=0 .or. InputFileData%WAMIT%RdtnMod /=2) .or. & + ! (InputFileData%WAMIT2%MnDrift /=0) .or. & + ! (InputFileData%WAMIT2%NewmanApp /= 0) .or. & + ! (InputFileData%WAMIT2%SumQTF /= 0 ) ) then ! !end if @@ -2512,22 +1442,22 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! TODO: We are only implementing WaveStMod = 0 (No stretching) at this point in time. 1 Mar 2013 GJH - IF ( InitInp%Waves%WaveStMod /= 0 ) THEN + IF ( InputFileData%Waves%WaveStMod /= 0 ) THEN CALL SetErrStat( ErrID_Fatal,'WaveStMod must be 0. Future versions of HydroDyn will once again support other wave stretching models.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Waves%WaveMod /= 6 .AND. InitInp%Morison%NMembers > 0 .AND. InitInp%Waves%WaveMod > 0 ) THEN + IF ( InputFileData%Waves%WaveMod /= 6 .AND. InputFileData%Morison%NMembers > 0 .AND. InputFileData%Waves%WaveMod > 0 ) THEN - IF ( ( InitInp%Waves%WaveStMod /= 0 ) .AND. ( InitInp%Waves%WaveStMod /= 1 ) .AND. & - ( InitInp%Waves%WaveStMod /= 2 ) ) THEN ! (TODO: future version will support 3) .AND. ( InitInp%Waves%WaveStMod /= 3 ) ) THEN + IF ( ( InputFileData%Waves%WaveStMod /= 0 ) .AND. ( InputFileData%Waves%WaveStMod /= 1 ) .AND. & + ( InputFileData%Waves%WaveStMod /= 2 ) ) THEN ! (TODO: future version will support 3) .AND. ( InputFileData%Waves%WaveStMod /= 3 ) ) THEN ErrMsg = ' WaveStMod must be 0, 1, or 2.' !, or 3.' ErrStat = ErrID_Fatal RETURN END IF - !IF ( ( InitInp%Waves%WaveStMod /= 3 ) .AND. ( InitInp%Waves%WaveMod == 5 ) ) THEN + !IF ( ( InputFileData%Waves%WaveStMod /= 3 ) .AND. ( InputFileData%Waves%WaveMod == 5 ) ) THEN ! ErrMsg = ' WaveStMod must be set to 3 when WaveMod is set to 5.' ! ErrStat = ErrID_Fatal ! @@ -2546,31 +1476,31 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! drag term from Morison's equation is computed by integrating up to ! the MSL, regardless of the instantaneous free surface elevation. - InitInp%Waves%WaveStMod = 0 + InputFileData%Waves%WaveStMod = 0 END IF ! WaveTMax - Analysis time for incident wave calculations. - IF ( InitInp%Waves%WaveMod == 0 ) THEN ! .TRUE if we have incident waves. + IF ( InputFileData%Waves%WaveMod == 0 ) THEN ! .TRUE if we have incident waves. ! TODO: Issue warning if WaveTMax was not already 0.0 in this case. - IF ( .NOT. EqualRealNos(InitInp%Waves%WaveTMax, 0.0_DbKi) ) THEN + IF ( .NOT. EqualRealNos(InputFileData%Waves%WaveTMax, 0.0_DbKi) ) THEN CALL WrScr( ' Setting WaveTMax to 0.0 since WaveMod = 0' ) - InitInp%Waves%WaveTMax = 0.0 + InputFileData%Waves%WaveTMax = 0.0 END IF - IF ( .NOT. EqualRealNos(InitInp%Waves%WaveDir, 0.0_SiKi) ) THEN + IF ( .NOT. EqualRealNos(InputFileData%Waves%WaveDir, 0.0_SiKi) ) THEN CALL WrScr( ' Setting WaveDir to 0.0 since WaveMod = 0' ) - InitInp%Waves%WaveDir = 0.0 + InputFileData%Waves%WaveDir = 0.0 END IF - ELSEIF ( InitInp%Waves%WaveMod == 5 ) THEN ! User wave elevation file reading in - IF (InitInp%TMax > InitInp%Waves%WaveTMax ) THEN + ELSEIF ( InputFileData%Waves%WaveMod == 5 ) THEN ! User wave elevation file reading in + IF (InitInp%TMax > InputFileData%Waves%WaveTMax ) THEN CALL SetErrstat( ErrID_Fatal, ' WaveTMax must be larger than the simulation time for user wave elevations (WaveMod == 5).',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - IF (InitInp%TMax > InitInp%Waves%WaveTMax ) THEN + IF (InitInp%TMax > InputFileData%Waves%WaveTMax ) THEN CALL WrScr( ' WaveTMax is less then the simulation time. Wave data will repeat every WaveTMax seconds.') END IF END IF @@ -2578,74 +1508,74 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! WaveDT - Time step for incident wave calculations - IF ( InitInp%Waves%WaveMod > 0 ) THEN ! .TRUE if we have incident waves. + IF ( InputFileData%Waves%WaveMod > 0 ) THEN ! .TRUE if we have incident waves. - IF ( InitInp%Waves%WaveDT <= 0.0 ) THEN + IF ( InputFileData%Waves%WaveDT <= 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'WaveDT must be greater than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( (InitInp%Waves%WaveMod == 6) .AND. (.NOT. EqualRealNos(InitInp%Waves%WaveDT, InitInp%DT)) ) THEN + IF ( (InputFileData%Waves%WaveMod == 6) .AND. (.NOT. EqualRealNos(InputFileData%Waves%WaveDT, Interval)) ) THEN CALL SetErrStat( ErrID_Fatal,'WaveDT must equal the simulation DT value when WaveMod = 6.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - InitInp%Waves%WaveDT = 0.0 + InputFileData%Waves%WaveDT = 0.0 END IF ! WaveHs - Significant wave height - IF ( ( InitInp%Waves%WaveMod /= 0 ) .AND. ( InitInp%Waves%WaveMod /= 4 ) .AND. ( InitInp%Waves%WaveMod /= 5 ) ) THEN ! .TRUE. (when WaveMod = 1, 2, 3, or 10) if we have plane progressive (regular), JONSWAP/Pierson-Moskowitz spectrum (irregular) waves, or white-noise waves, but not user-defined or GH Bladed wave data. + IF ( ( InputFileData%Waves%WaveMod /= 0 ) .AND. ( InputFileData%Waves%WaveMod /= 4 ) .AND. ( InputFileData%Waves%WaveMod /= 5 ) ) THEN ! .TRUE. (when WaveMod = 1, 2, 3, or 10) if we have plane progressive (regular), JONSWAP/Pierson-Moskowitz spectrum (irregular) waves, or white-noise waves, but not user-defined or GH Bladed wave data. - IF ( InitInp%Waves%WaveHs <= 0.0 ) THEN + IF ( InputFileData%Waves%WaveHs <= 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'WaveHs must be greater than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - InitInp%Waves%WaveHs = 0.0 + InputFileData%Waves%WaveHs = 0.0 END IF ! WaveTp - Peak spectral period. ! We commented out the if else block due to a bug when WaveMod == 3, and then WaveTp is hence set to 0.0. See line 1092 of Waves.f90 (as of 11/24/2014) GJH - !IF ( ( InitInp%Waves%WaveMod == 1 ) .OR. ( InitInp%Waves%WaveMod == 2 ) .OR. ( InitInp%Waves%WaveMod == 10 ) ) THEN ! .TRUE. (when WaveMod = 1, 2, or 10) if we have plane progressive (regular), JONSWAP/Pierson-Moskowitz spectrum (irregular) waves. + !IF ( ( InputFileData%Waves%WaveMod == 1 ) .OR. ( InputFileData%Waves%WaveMod == 2 ) .OR. ( InputFileData%Waves%WaveMod == 10 ) ) THEN ! .TRUE. (when WaveMod = 1, 2, or 10) if we have plane progressive (regular), JONSWAP/Pierson-Moskowitz spectrum (irregular) waves. - IF ( InitInp%Waves%WaveTp <= 0.0 ) THEN + IF ( InputFileData%Waves%WaveTp <= 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'WaveTp must be greater than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF ! ELSE - ! InitInp%Waves%WaveTp = 0.0 + ! InputFileData%Waves%WaveTp = 0.0 ! END IF ! WavePkShp - Peak shape parameter. - CALL Conv2UC( InitInp%Waves%WavePkShpChr ) ! Convert Line to upper case. + CALL Conv2UC( InputFileData%Waves%WavePkShpChr ) ! Convert Line to upper case. - IF ( InitInp%Waves%WaveMod == 2 ) THEN ! .TRUE if we have JONSWAP/Pierson-Moskowitz spectrum (irregular) waves, but not GH Bladed wave data. + IF ( InputFileData%Waves%WaveMod == 2 ) THEN ! .TRUE if we have JONSWAP/Pierson-Moskowitz spectrum (irregular) waves, but not GH Bladed wave data. - IF ( TRIM(InitInp%Waves%WavePkShpChr) == 'DEFAULT' ) THEN ! .TRUE. when one wants to use the default value of the peak shape parameter, conditioned on significant wave height and peak spectral period. + IF ( TRIM(InputFileData%Waves%WavePkShpChr) == 'DEFAULT' ) THEN ! .TRUE. when one wants to use the default value of the peak shape parameter, conditioned on significant wave height and peak spectral period. - InitInp%Waves%WavePkShp = WavePkShpDefault ( InitInp%Waves%WaveHs, InitInp%Waves%WaveTp ) + InputFileData%Waves%WavePkShp = WavePkShpDefault ( InputFileData%Waves%WaveHs, InputFileData%Waves%WaveTp ) ELSE ! The input must have been specified numerically. - READ (InitInp%Waves%WavePkShpChr,*,IOSTAT=IOS) InitInp%Waves%WavePkShp + READ (InputFileData%Waves%WavePkShpChr,*,IOSTAT=IOS) InputFileData%Waves%WavePkShp CALL CheckIOS ( IOS, "", 'WavePkShp', NumType, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) RETURN - IF ( ( InitInp%Waves%WavePkShp < 1.0 ) .OR. ( InitInp%Waves%WavePkShp > 7.0 ) ) THEN + IF ( ( InputFileData%Waves%WavePkShp < 1.0 ) .OR. ( InputFileData%Waves%WavePkShp > 7.0 ) ) THEN CALL SetErrStat( ErrID_Fatal,'WavePkShp must be greater than or equal to 1 and less than or equal to 7.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -2654,50 +1584,50 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ELSE - InitInp%Waves%WavePkShp = 1.0 + InputFileData%Waves%WavePkShp = 1.0 END IF ! WvLowCOff and WvHiCOff - Wave Cut-off frequency - IF ( InitInp%Waves%WvLowCOff < 0 ) THEN + IF ( InputFileData%Waves%WvLowCOff < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'WvLowCOff must be greater than or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF ! Threshold upper cut-off based on sampling rate - IF ( EqualRealNos(InitInp%Waves%WaveDT, 0.0_DbKi) ) THEN - InitInp%Waves%WvHiCOff = 10000.0; ! This is not going to be used because WaveDT is zero. + IF ( EqualRealNos(InputFileData%Waves%WaveDT, 0.0_DbKi) ) THEN + InputFileData%Waves%WvHiCOff = 10000.0; ! This is not going to be used because WaveDT is zero. ELSE - InitInp%Waves%WvHiCOff = MIN( REAL( Pi/InitInp%Waves%WaveDT,SiKi), InitInp%Waves%WvHiCOff ) + InputFileData%Waves%WvHiCOff = MIN( REAL( Pi/InputFileData%Waves%WaveDT,SiKi), InputFileData%Waves%WvHiCOff ) END IF !TODO Issue warning if we changed WvHiCOff GJH 7/24/13 - IF ( InitInp%Waves%WvLowCOff >= InitInp%Waves%WvHiCOff ) THEN + IF ( InputFileData%Waves%WvLowCOff >= InputFileData%Waves%WvHiCOff ) THEN CALL SetErrSTat( ErrID_Fatal,'WvLowCOff must be less than WvHiCOff.',ErrStat,ErrMsg,RoutineName) RETURN END IF ! Copy over the first order frequency limits to the WAMIT2 module which needs them. - InitInp%WAMIT2%WvLowCOff = InitInp%Waves%WvLowCOff - InitInp%WAMIT2%WvHiCOff = InitInp%Waves%WvHiCOff + InputFileData%WAMIT2%WvLowCOff = InputFileData%Waves%WvLowCOff + InputFileData%WAMIT2%WvHiCOff = InputFileData%Waves%WvHiCOff ! WaveDir - Wave heading direction. - IF ( ( InitInp%Waves%WaveMod > 0 ) .AND. ( InitInp%Waves%WaveMod /= 6 ) ) THEN ! .TRUE if we have incident waves, but not user input wave data. + IF ( ( InputFileData%Waves%WaveMod > 0 ) .AND. ( InputFileData%Waves%WaveMod /= 6 ) ) THEN ! .TRUE if we have incident waves, but not user input wave data. - IF ( ( InitInp%Waves%WaveDir <= -180.0 ) .OR. ( InitInp%Waves%WaveDir > 180.0 ) ) THEN + IF ( ( InputFileData%Waves%WaveDir <= -180.0 ) .OR. ( InputFileData%Waves%WaveDir > 180.0 ) ) THEN CALL SetErrStat( ErrID_Fatal,'WaveDir must be greater than -180 and less than or equal to 180.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - InitInp%Waves%WaveDir = 0.0 + InputFileData%Waves%WaveDir = 0.0 END IF @@ -2705,35 +1635,35 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Multi-directional waves ! Check the WaveDirMod value - IF ( InitInp%Waves%WaveDirMod < 0 .OR. InitInp%Waves%WaveDirMod > 1 ) THEN + IF ( InputFileData%Waves%WaveDirMod < 0 .OR. InputFileData%Waves%WaveDirMod > 1 ) THEN CALL SetErrStat( ErrID_Fatal,'WaveDirMod must be either 0 (No spreading) or 1 (COS2S spreading function)',ErrStat,ErrMsg,RoutineName) RETURN END IF ! Check if we are doing multidirectional waves or not. ! We can only use multi directional waves on WaveMod=2,3,4 - InitInp%Waves%WaveMultiDir = .FALSE. ! Set flag to false to start - IF ( InitInp%Waves%WaveMod >= 2 .AND. InitInp%Waves%WaveMod <= 4 .AND. InitInp%Waves%WaveDirMod == 1 ) THEN - InitInp%Waves%WaveMultiDir = .TRUE. - ELSEIF ( (InitInp%Waves%WaveMod < 2 .OR. InitInp%Waves%WaveMod >4) .AND. InitInp%Waves%WaveDirMod == 1 ) THEN + InputFileData%Waves%WaveMultiDir = .FALSE. ! Set flag to false to start + IF ( InputFileData%Waves%WaveMod >= 2 .AND. InputFileData%Waves%WaveMod <= 4 .AND. InputFileData%Waves%WaveDirMod == 1 ) THEN + InputFileData%Waves%WaveMultiDir = .TRUE. + ELSEIF ( (InputFileData%Waves%WaveMod < 2 .OR. InputFileData%Waves%WaveMod >4) .AND. InputFileData%Waves%WaveDirMod == 1 ) THEN CALL SetErrStat( ErrID_Warn,'WaveDirMod unused unless WaveMod == 2, 3, or 4. Ignoring WaveDirMod.',ErrStat,ErrMsg,RoutineName) ENDIF ! Check to see if the for some reason the wave direction spreading range is set to zero. If it is, ! we don't have any spreading, so we will turn off the multidirectional waves. - IF ( InitInp%Waves%WaveMultiDir .AND. EqualRealNos( InitInp%Waves%WaveDirRange, 0.0_SiKi ) ) THEN + IF ( InputFileData%Waves%WaveMultiDir .AND. EqualRealNos( InputFileData%Waves%WaveDirRange, 0.0_SiKi ) ) THEN CALL SetErrStat( ErrID_Warn,' WaveDirRange set to zero, so multidirectional waves are turned off.',ErrStat,ErrMsg,RoutineName) - InitInp%Waves%WaveMultiDir = .FALSE. + InputFileData%Waves%WaveMultiDir = .FALSE. ENDIF ! We check the following only if we set WaveMultiDir to true, otherwise ignore them and set them to zero - IF ( InitInp%Waves%WaveMultiDir ) THEN + IF ( InputFileData%Waves%WaveMultiDir ) THEN ! Check WaveDirSpread - IF ( InitInp%Waves%WaveDirSpread <= 0.0 ) THEN + IF ( InputFileData%Waves%WaveDirSpread <= 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'WaveDirSpread cannot negative or zero.',ErrStat,ErrMsg,RoutineName) RETURN @@ -2744,38 +1674,38 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Check that the number of wave directions is a positive odd number. ! -> If it is less than 0, error out. ! -> If it is even, we will increment it by 1. - IF ( InitInp%Waves%WaveNDir <= 0_IntKi ) THEN + IF ( InputFileData%Waves%WaveNDir <= 0_IntKi ) THEN CALL SetErrStat( ErrID_Fatal,' WaveNDir must be an odd number greater than 0.',ErrStat,ErrMsg,RoutineName) RETURN ENDIF ! Check that the value for WaveNDir is odd - IF ( MODULO( InitInp%Waves%WaveNDir, 2_IntKi) == 0_IntKi ) THEN - InitInp%Waves%WaveNDir = InitInp%Waves%WaveNDir + 1 - CALL SetErrStat( ErrID_Warn,'WaveNDir must be odd. Changing the value to '//Num2LStr(InitInp%Waves%WaveNDir),ErrStat,ErrMsg,RoutineName) + IF ( MODULO( InputFileData%Waves%WaveNDir, 2_IntKi) == 0_IntKi ) THEN + InputFileData%Waves%WaveNDir = InputFileData%Waves%WaveNDir + 1 + CALL SetErrStat( ErrID_Warn,'WaveNDir must be odd. Changing the value to '//Num2LStr(InputFileData%Waves%WaveNDir),ErrStat,ErrMsg,RoutineName) ENDIF ! Now check that the WaveDirRange is less than 360 degrees (not sure why we would want that) - IF ( InitInp%Waves%WaveDirRange > 360.0_ReKi ) THEN + IF ( InputFileData%Waves%WaveDirRange > 360.0_ReKi ) THEN CALL SetErrStat( ErrID_Fatal,' WaveDirRange should be less than a full circle.',ErrStat,ErrMsg,RoutineName) ENDIF ELSE ! Set everything to zero if we aren't going to use it - InitInp%Waves%WaveNDir = 1 ! Only one direction set -- this shouldn't get used later anyhow - InitInp%Waves%WaveDirRange = PiBy2 ! This is so that the constant C=1 in the COS2S function (it shouldn't get called, but in case it does) - InitInp%Waves%WaveDirSpread = 0.0 + InputFileData%Waves%WaveNDir = 1 ! Only one direction set -- this shouldn't get used later anyhow + InputFileData%Waves%WaveDirRange = PiBy2 ! This is so that the constant C=1 in the COS2S function (it shouldn't get called, but in case it does) + InputFileData%Waves%WaveDirSpread = 0.0 END IF ! WaveSeed(1), !WaveSeed(2) - IF ( .NOT. ( ( InitInp%Waves%WaveMod > 0 ) .AND. ( InitInp%Waves%WaveMod /= 5 ) .AND. ( InitInp%Waves%WaveMod /= 10 ) ) ) THEN !.TRUE. for plane progressive (regular) with random phase or irregular wave + IF ( .NOT. ( ( InputFileData%Waves%WaveMod > 0 ) .AND. ( InputFileData%Waves%WaveMod /= 5 ) .AND. ( InputFileData%Waves%WaveMod /= 10 ) ) ) THEN !.TRUE. for plane progressive (regular) with random phase or irregular wave DO I = 1,2 - InitInp%Waves%WaveSeed(I) = 0 + InputFileData%Waves%WaveSeed(I) = 0 END DO !I @@ -2784,41 +1714,41 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! WvKinFile - IF ( InitInp%Waves%WaveMod == 5 .OR. InitInp%Waves%WaveMod == 6 ) THEN ! .TRUE if we are to read user-supplied wave elevation or wave kinematics file(s). + IF ( InputFileData%Waves%WaveMod == 5 .OR. InputFileData%Waves%WaveMod == 6 ) THEN ! .TRUE if we are to read user-supplied wave elevation or wave kinematics file(s). - IF ( LEN_TRIM( InitInp%Waves%WvKinFile ) == 0 ) THEN + IF ( LEN_TRIM( InputFileData%Waves%WvKinFile ) == 0 ) THEN CALL SetErrStat( ErrID_Fatal,'WvKinFile must not be an empty string.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( PathIsRelative( InitInp%Waves%WvKinFile ) ) THEN + IF ( PathIsRelative( InputFileData%Waves%WvKinFile ) ) THEN CALL GetPath( TRIM(InitInp%InputFile), TmpPath ) - InitInp%Waves%WvKinFile = TRIM(TmpPath)//TRIM(InitInp%Waves%WvKinFile) + InputFileData%Waves%WvKinFile = TRIM(TmpPath)//TRIM(InputFileData%Waves%WvKinFile) END IF - InitInp%Waves%WriteWvKin = .FALSE. + InputFileData%Waves%WriteWvKin = .FALSE. ELSE !don't use this one #ifdef WRITE_WV_KIN - IF ( LEN_TRIM( InitInp%Waves%WvKinFile ) == 0 ) THEN - InitInp%Waves%WriteWvKin = .FALSE. + IF ( LEN_TRIM( InputFileData%Waves%WvKinFile ) == 0 ) THEN + InputFileData%Waves%WriteWvKin = .FALSE. ELSE - InitInp%Waves%WriteWvKin = .TRUE. - IF ( PathIsRelative( InitInp%Waves%WvKinFile ) ) THEN - CALL GetPath( TRIM(InitInp%InputFile), TmpPath ) - InitInp%Waves%WvKinFile = TRIM(TmpPath)//TRIM(InitInp%Waves%WvKinFile) + InputFileData%Waves%WriteWvKin = .TRUE. + IF ( PathIsRelative( InputFileData%Waves%WvKinFile ) ) THEN + CALL GetPath( TRIM(InputFileData%InputFile), TmpPath ) + InputFileData%Waves%WvKinFile = TRIM(TmpPath)//TRIM(InputFileData%Waves%WvKinFile) END IF END IF #else - InitInp%Waves%WvKinFile = "" - InitInp%Waves%WriteWvKin = .FALSE. + InputFileData%Waves%WvKinFile = "" + InputFileData%Waves%WriteWvKin = .FALSE. #endif END IF ! NWaveElev - IF ( InitInp%Waves%NWaveElev < 0 ) THEN + IF ( InputFileData%Waves%NWaveElev < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'NWaveElev must not be negative.',ErrStat,ErrMsg,RoutineName) RETURN @@ -2835,13 +1765,13 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Difference frequency cutoffs ! WvLowCOffD and WvHiCOffD - Wave Cut-off frequency - IF ( InitInp%Waves2%WvLowCOffD < 0 ) THEN + IF ( InputFileData%Waves2%WvLowCOffD < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'WvLowCOffD must be greater than or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF ! Check that the order given makes sense. - IF ( InitInp%Waves2%WvLowCOffD >= InitInp%Waves2%WvHiCOffD ) THEN + IF ( InputFileData%Waves2%WvLowCOffD >= InputFileData%Waves2%WvHiCOffD ) THEN CALL SetErrStat( ErrID_Fatal,'WvLowCOffD must be less than WvHiCOffD.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -2850,23 +1780,23 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Sum frequency cutoffs ! WvLowCOffS and WvHiCOffD - Wave Cut-off frequency - IF ( InitInp%Waves2%WvLowCOffS < 0 ) THEN + IF ( InputFileData%Waves2%WvLowCOffS < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'WvLowCOffS must be greater than or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF ! Check that the order given makes sense. - IF ( InitInp%Waves2%WvLowCOffS >= InitInp%Waves2%WvHiCOffS ) THEN + IF ( InputFileData%Waves2%WvLowCOffS >= InputFileData%Waves2%WvHiCOffS ) THEN CALL SetErrStat( ErrID_Fatal,'WvLowCOffS must be less than WvHiCOffS.',ErrStat,ErrMsg,RoutineName) RETURN END IF ! Copy over the 2nd order limits to the WAMIT2 module which needs them. - InitInp%WAMIT2%WvLowCOffD = InitInp%Waves2%WvLowCOffD - InitInp%WAMIT2%WvHiCOffD = InitInp%Waves2%WvHiCOffD - InitInp%WAMIT2%WvLowCOffS = InitInp%Waves2%WvLowCOffS - InitInp%WAMIT2%WvHiCOffS = InitInp%Waves2%WvHiCOffS + InputFileData%WAMIT2%WvLowCOffD = InputFileData%Waves2%WvLowCOffD + InputFileData%WAMIT2%WvHiCOffD = InputFileData%Waves2%WvHiCOffD + InputFileData%WAMIT2%WvLowCOffS = InputFileData%Waves2%WvLowCOffS + InputFileData%WAMIT2%WvHiCOffS = InputFileData%Waves2%WvHiCOffS @@ -2877,12 +1807,12 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! CurrMod - Current profile model switch - IF ( ( InitInp%Current%CurrMod /= 0 ) .AND. ( InitInp%Current%CurrMod /= 1 ) .AND. ( InitInp%Current%CurrMod /= 2 ) ) THEN + IF ( ( InputFileData%Current%CurrMod /= 0 ) .AND. ( InputFileData%Current%CurrMod /= 1 ) .AND. ( InputFileData%Current%CurrMod /= 2 ) ) THEN CALL SetErrStat( ErrID_Fatal,'CurrMod must be 0, 1, or 2.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( ( InitInp%Current%CurrMod /= 0 ) .AND. ( InitInp%Waves%WaveMod == 6 ) ) THEN + IF ( ( InputFileData%Current%CurrMod /= 0 ) .AND. ( InputFileData%Waves%WaveMod == 6 ) ) THEN CALL SetErrStat( ErrID_Fatal,'CurrMod must be set to 0 when WaveMod is set to 6: user-input wave data.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -2890,42 +1820,42 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! CurrSSV0 - Sub-surface current velocity at still water level - IF ( InitInp%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. + IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - IF ( InitInp%Current%CurrSSV0 < 0.0 ) THEN + IF ( InputFileData%Current%CurrSSV0 < 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'CurrSSV0 must not be less than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - InitInp%Current%CurrSSV0 = 0.0 + InputFileData%Current%CurrSSV0 = 0.0 END IF ! CurrSSDirChr - Sub-surface current heading direction - IF ( InitInp%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. + IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - IF ( TRIM(InitInp%Current%CurrSSDirChr) == 'DEFAULT' ) THEN ! .TRUE. when one wants to use the default value of codirectionality between sub-surface current and incident wave propogation heading directions. + IF ( TRIM(InputFileData%Current%CurrSSDirChr) == 'DEFAULT' ) THEN ! .TRUE. when one wants to use the default value of codirectionality between sub-surface current and incident wave propogation heading directions. - IF ( InitInp%Waves%WaveMod == 0 ) THEN + IF ( InputFileData%Waves%WaveMod == 0 ) THEN CALL SetErrStat( ErrID_Fatal,'CurrSSDir must not be set to ''DEFAULT'' when WaveMod is set to 0.',ErrStat,ErrMsg,RoutineName) RETURN END IF - InitInp%Current%CurrSSDir = InitInp%Waves%WaveDir + InputFileData%Current%CurrSSDir = InputFileData%Waves%WaveDir ELSE ! The input must have been specified numerically. - READ (InitInp%Current%CurrSSDirChr,*,IOSTAT=IOS) InitInp%Current%CurrSSDir + READ (InputFileData%Current%CurrSSDirChr,*,IOSTAT=IOS) InputFileData%Current%CurrSSDir CALL CheckIOS ( IOS, "", 'CurrSSDir', NumType, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) RETURN - IF ( ( InitInp%Current%CurrSSDir <= -180.0 ) .OR. ( InitInp%Current%CurrSSDir > 180.0 ) ) THEN + IF ( ( InputFileData%Current%CurrSSDir <= -180.0 ) .OR. ( InputFileData%Current%CurrSSDir > 180.0 ) ) THEN CALL SetErrStat( ErrID_Fatal,'CurrSSDir must be greater than -180 and less than or equal to 180.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -2935,23 +1865,23 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ELSE - InitInp%Current%CurrSSDir = 0.0 + InputFileData%Current%CurrSSDir = 0.0 END IF ! CurrNSRef - Near-surface current reference depth. - IF ( InitInp%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. + IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - IF ( InitInp%Current%CurrNSRef <= 0.0 ) THEN + IF ( InputFileData%Current%CurrNSRef <= 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'CurrNSRef must be greater than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - InitInp%Current%CurrNSRef = 0.0 + InputFileData%Current%CurrNSRef = 0.0 END IF @@ -2959,72 +1889,72 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! CurrNSV0 - Near-surface current velocity at still water level. - IF ( InitInp%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. + IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - IF ( InitInp%Current%CurrNSV0 < 0.0 ) THEN + IF ( InputFileData%Current%CurrNSV0 < 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'CurrNSV0 must not be less than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - InitInp%Current%CurrNSV0 = 0.0 + InputFileData%Current%CurrNSV0 = 0.0 END IF ! CurrNSDir - Near-surface current heading direction. - IF ( InitInp%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. + IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - IF ( ( InitInp%Current%CurrNSDir <= -180.0 ) .OR. ( InitInp%Current%CurrNSDir > 180.0 ) ) THEN + IF ( ( InputFileData%Current%CurrNSDir <= -180.0 ) .OR. ( InputFileData%Current%CurrNSDir > 180.0 ) ) THEN CALL SetErrStat( ErrID_Fatal,'CurrNSDir must be greater than -180 and less than or equal to 180.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - InitInp%Current%CurrNSDir = 0.0 + InputFileData%Current%CurrNSDir = 0.0 END IF ! CurrDIV - Depth-independent current velocity. - IF ( InitInp%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. + IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - IF ( InitInp%Current%CurrDIV < 0.0 ) THEN + IF ( InputFileData%Current%CurrDIV < 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'CurrDIV must not be less than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - InitInp%Current%CurrDIV = 0.0 + InputFileData%Current%CurrDIV = 0.0 END IF ! CurrDIDir - Depth-independent current heading direction. - IF ( InitInp%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. + IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - IF ( ( InitInp%Current%CurrDIDir <= -180.0 ) .OR. ( InitInp%Current%CurrDIDir > 180.0 ) ) THEN + IF ( ( InputFileData%Current%CurrDIDir <= -180.0 ) .OR. ( InputFileData%Current%CurrDIDir > 180.0 ) ) THEN CALL SetErrStat( ErrID_Fatal,'CurrDIDir must be greater than -180 and less than or equal to 180.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - InitInp%Current%CurrDIDir = 0.0 + InputFileData%Current%CurrDIDir = 0.0 END IF ! PotFile - Root name of potential flow files - IF ( InitInp%PotMod > 0 ) THEN - do i = 1,InitInp%nWAMITObj - IF ( LEN_TRIM( InitInp%PotFile(i) ) == 0 ) THEN + IF ( InputFileData%PotMod > 0 ) THEN + do i = 1,InputFileData%nWAMITObj + IF ( LEN_TRIM( InputFileData%PotFile(i) ) == 0 ) THEN CALL SetErrStat( ErrID_Fatal,'PotFile must not be an empty string.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3032,69 +1962,69 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! if this is a relative path, let's make it relative to the location of the main input file ! tell the WAMIT and WAMIT2 modules what the filename is - IF ( PathIsRelative( InitInp%PotFile(i) ) ) THEN + IF ( PathIsRelative( InputFileData%PotFile(i) ) ) THEN CALL GetPath( TRIM(InitInp%InputFile), TmpPath ) - InitInp%PotFile(i) = TRIM(TmpPath)//TRIM(InitInp%PotFile(i)) + InputFileData%PotFile(i) = TRIM(TmpPath)//TRIM(InputFileData%PotFile(i)) END IF end do !TODO: Move this to where the WAMIT modules are initialized - InitInp%WAMIT%WAMITFile = InitInp%PotFile(1) - InitInp%WAMIT2%WAMITFile = InitInp%PotFile(1) + InputFileData%WAMIT%WAMITFile = InputFileData%PotFile(1) + InputFileData%WAMIT2%WAMITFile = InputFileData%PotFile(1) ! Set the flag for multidirectional waves for WAMIT2 module. It needs to know since the Newman approximation ! can only use uni-directional waves. - InitInp%WAMIT2%WaveMultiDir = InitInp%Waves%WaveMultiDir + InputFileData%WAMIT2%WaveMultiDir = InputFileData%Waves%WaveMultiDir ELSE - InitInp%PotFile = "" - InitInp%WAMIT%WAMITFile = "" - InitInp%WAMIT2%WAMITFile = "" + InputFileData%PotFile = "" + InputFileData%WAMIT%WAMITFile = "" + InputFileData%WAMIT2%WAMITFile = "" END IF ! Set the WAMIT file name on the Convolution module - InitInp%WAMIT%Conv_Rdtn%WAMITFile = InitInp%WAMIT%WAMITFile + InputFileData%WAMIT%Conv_Rdtn%WAMITFile = InputFileData%WAMIT%WAMITFile ! WAMITULEN - WAMIT characteristic body length scale - IF ( InitInp%PotMod == 1 ) THEN + IF ( InputFileData%PotMod == 1 ) THEN !TODO: Deal with WAMIT2 and check each WAMITULEN not just the first - InitInp%WAMIT2%WAMITULEN = InitInp%WAMITULEN(1) ! Copy to the WAMIT2 module info - do i = 1,InitInp%nWAMITObj - IF ( InitInp%WAMITULEN(i) < 0.0 ) THEN + InputFileData%WAMIT2%WAMITULEN = InputFileData%WAMITULEN(1) ! Copy to the WAMIT2 module info + do i = 1,InputFileData%nWAMITObj + IF ( InputFileData%WAMITULEN(i) < 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'WAMITULEN must be positive.',ErrStat,ErrMsg,RoutineName) RETURN END IF end do ELSE - InitInp%WAMITULEN = 1.0 - InitInp%WAMIT2%WAMITULEN = 1.0 + InputFileData%WAMITULEN = 1.0 + InputFileData%WAMIT2%WAMITULEN = 1.0 END IF ! PtfmVol0 - Displaced volume of water when the platform is in its undisplaced position - IF ( InitInp%PotMod == 1 ) THEN - do i = 1,InitInp%nWAMITObj - IF ( InitInp%PtfmVol0(i) < 0.0 ) THEN + IF ( InputFileData%PotMod == 1 ) THEN + do i = 1,InputFileData%nWAMITObj + IF ( InputFileData%PtfmVol0(i) < 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'PtfmVol0 must not be negative.',ErrStat,ErrMsg,RoutineName) RETURN END IF end do ELSE - InitInp%PtfmVol0 = 0.0 + InputFileData%PtfmVol0 = 0.0 END IF ! PtfmRefzt - The zt offset of the body reference point(s) from (0,0,0) (meters) [1 to NBody] ! NOTE: only used when PotMod=1. If NBodyMod=2,PtfmRefzt=0.0 - IF ( InitInp%PotMod == 1 .and. InitInp%NBodyMod == 2) THEN - do i = 1,InitInp%NBody - IF ( .not. EqualRealNos( InitInp%PtfmRefzt(i), 0.0_ReKi ) )THEN + IF ( InputFileData%PotMod == 1 .and. InputFileData%NBodyMod == 2) THEN + do i = 1,InputFileData%NBody + IF ( .not. EqualRealNos( InputFileData%PtfmRefzt(i), 0.0_ReKi ) )THEN CALL SetErrStat( ErrID_Fatal,'PtfmRefzt must be 0.0 for all WAMIT bodies when NBodyMod=2.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3104,51 +2034,51 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! RdtnTMax - Analysis time for wave radiation kernel calculations ! NOTE: Use RdtnTMax = 0.0 to eliminate wave radiation damping - IF ( InitInp%PotMod == 1 ) THEN + IF ( InputFileData%PotMod == 1 ) THEN - IF ( InitInp%WAMIT%RdtnTMax < 0.0 ) THEN + IF ( InputFileData%WAMIT%RdtnTMax < 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'RdtnTMax must not be negative.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE - InitInp%WAMIT%RdtnTMax = 0.0 + InputFileData%WAMIT%RdtnTMax = 0.0 END IF ! RdtnDT - Time step for wave radiation kernel calculations - IF ( InitInp%PotMod == 1 ) THEN + IF ( InputFileData%PotMod == 1 ) THEN - CALL Conv2UC( InitInp%WAMIT%Conv_Rdtn%RdtnDTChr ) ! Convert Line to upper case. + CALL Conv2UC( InputFileData%WAMIT%Conv_Rdtn%RdtnDTChr ) ! Convert Line to upper case. - IF ( TRIM(InitInp%WAMIT%Conv_Rdtn%RdtnDTChr) == 'DEFAULT' ) THEN ! .TRUE. when one wants to use the default value timestep provided by the glue code. + IF ( TRIM(InputFileData%WAMIT%Conv_Rdtn%RdtnDTChr) == 'DEFAULT' ) THEN ! .TRUE. when one wants to use the default value timestep provided by the glue code. - InitInp%WAMIT%Conv_Rdtn%RdtnDT = InitInp%DT + InputFileData%WAMIT%Conv_Rdtn%RdtnDT = Interval ELSE ! The input must have been specified numerically. - READ (InitInp%WAMIT%Conv_Rdtn%RdtnDTChr,*,IOSTAT=IOS) InitInp%WAMIT%Conv_Rdtn%RdtnDT + READ (InputFileData%WAMIT%Conv_Rdtn%RdtnDTChr,*,IOSTAT=IOS) InputFileData%WAMIT%Conv_Rdtn%RdtnDT CALL CheckIOS ( IOS, "", 'RdtnDT', NumType, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) RETURN END IF - - IF ( InitInp%WAMIT%Conv_Rdtn%RdtnDT <= 0.0 ) THEN + + IF ( InputFileData%WAMIT%Conv_Rdtn%RdtnDT <= 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'RdtnDT must be greater than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - if ( (.not. ( EqualRealNos(InitInp%DT, InitInp%WAMIT%Conv_Rdtn%RdtnDT) ) ) .and. ( (InitInp%WAMIT%ExctnMod > 1) .or. (InitInp%WAMIT%RdtnMod > 0) ) ) then + if ( (.not. ( EqualRealNos(Interval, InputFileData%WAMIT%Conv_Rdtn%RdtnDT) ) ) .and. ( (InputFileData%WAMIT%ExctnMod > 1) .or. (InputFileData%WAMIT%RdtnMod > 0) ) ) then call SetErrStat( ErrID_Fatal,'RdtnDT must be equal to the glue-code DT if PotMod = 1 and using RdtnMod > 0 or ExctnMod > 1.',ErrStat,ErrMsg,RoutineName) return end if ELSE - InitInp%WAMIT%Conv_Rdtn%RdtnDT = 0.0 + InputFileData%WAMIT%Conv_Rdtn%RdtnDT = 0.0 END IF @@ -3159,20 +2089,20 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Check that we only specified one of MnDrift, NewmanApp, or DiffQTF ! (compared pairwise -- if any two are both true, we have a problem) - IF ( ( InitInp%WAMIT2%MnDrift /= 0 .AND. InitInp%WAMIT2%NewmanApp /= 0 ) .OR. & - ( InitInp%WAMIT2%DiffQTF /= 0 .AND. InitInp%WAMIT2%NewmanApp /= 0 ) .OR. & - ( InitInp%WAMIT2%MnDrift /= 0 .AND. InitInp%WAMIT2%DiffQTF /= 0 ) ) THEN + IF ( ( InputFileData%WAMIT2%MnDrift /= 0 .AND. InputFileData%WAMIT2%NewmanApp /= 0 ) .OR. & + ( InputFileData%WAMIT2%DiffQTF /= 0 .AND. InputFileData%WAMIT2%NewmanApp /= 0 ) .OR. & + ( InputFileData%WAMIT2%MnDrift /= 0 .AND. InputFileData%WAMIT2%DiffQTF /= 0 ) ) THEN CALL SetErrStat( ErrID_Fatal,'Only one of MnDrift, NewmanApp, or DiffQTF can be non-zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - if ( InitInp%NBody > 1 .and. InitInp%WAMIT2%MnDrift == 8 ) then + if ( InputFileData%NBody > 1 .and. InputFileData%WAMIT2%MnDrift == 8 ) then call SetErrStat( ErrID_Fatal,'MnDrift cannot equal 8 when NBody > 1.',ErrStat,ErrMsg,RoutineName) return end if - if ( InitInp%NBody > 1 .and. InitInp%WAMIT2%NewmanApp == 8 ) then + if ( InputFileData%NBody > 1 .and. InputFileData%WAMIT2%NewmanApp == 8 ) then call SetErrStat( ErrID_Fatal,'NewmanApp cannot equal 8 when NBody > 1.',ErrStat,ErrMsg,RoutineName) return end if @@ -3181,15 +2111,15 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Check MnDrift and set the flag indicating WAMIT2 should perform the mean drift calculation. ! Also make sure we have a valid input value for the file extension - IF ( InitInp%WAMIT2%MnDrift == 0 ) THEN ! not using MnDrift - InitInp%WAMIT2%MnDriftF = .FALSE. - ELSE IF ( InitInp%WAMIT2%MnDrift == 7 .OR. InitInp%WAMIT2%MnDrift == 8 .OR. InitInp%WAMIT2%MnDrift == 9 .OR. & - InitInp%WAMIT2%MnDrift == 10 .OR. InitInp%WAMIT2%MnDrift == 11 .OR. InitInp%WAMIT2%MnDrift == 12 ) THEN ! Valid values for MnDrift - IF ( InitInp%PotMod /= 1 ) THEN + IF ( InputFileData%WAMIT2%MnDrift == 0 ) THEN ! not using MnDrift + InputFileData%WAMIT2%MnDriftF = .FALSE. + ELSE IF ( InputFileData%WAMIT2%MnDrift == 7 .OR. InputFileData%WAMIT2%MnDrift == 8 .OR. InputFileData%WAMIT2%MnDrift == 9 .OR. & + InputFileData%WAMIT2%MnDrift == 10 .OR. InputFileData%WAMIT2%MnDrift == 11 .OR. InputFileData%WAMIT2%MnDrift == 12 ) THEN ! Valid values for MnDrift + IF ( InputFileData%PotMod /= 1 ) THEN CALL SetErrStat( ErrID_warn,'MnDrift can only be used with PotMod==1. Turning off',ErrStat,ErrMsg,RoutineName) - InitInp%WAMIT2%MnDriftF = .FALSE. + InputFileData%WAMIT2%MnDriftF = .FALSE. ELSE - InitInp%WAMIT2%MnDriftF = .TRUE. + InputFileData%WAMIT2%MnDriftF = .TRUE. ENDIF ELSE ! Must have received an invalid value CALL SetErrStat( ErrID_Fatal,'MnDrift can only have values of 0, 7, 8, 9, 10, 11, or 12.',ErrStat,ErrMsg,RoutineName) @@ -3200,15 +2130,15 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Check NewmanApp and set the flag indicating WAMIT2 should perform the mean drift calculation. ! Also make sure we have a valid input value for the file extension - IF ( InitInp%WAMIT2%NewmanApp == 0 ) THEN ! not using NewmanApp - InitInp%WAMIT2%NewmanAppF = .FALSE. - ELSE IF ( InitInp%WAMIT2%NewmanApp == 7 .OR. InitInp%WAMIT2%NewmanApp == 8 .OR. InitInp%WAMIT2%NewmanApp == 9 .OR. & - InitInp%WAMIT2%NewmanApp == 10 .OR. InitInp%WAMIT2%NewmanApp == 11 .OR. InitInp%WAMIT2%NewmanApp == 12 ) THEN ! Valid values for NewmanApp - IF ( InitInp%PotMod /= 1 ) THEN + IF ( InputFileData%WAMIT2%NewmanApp == 0 ) THEN ! not using NewmanApp + InputFileData%WAMIT2%NewmanAppF = .FALSE. + ELSE IF ( InputFileData%WAMIT2%NewmanApp == 7 .OR. InputFileData%WAMIT2%NewmanApp == 8 .OR. InputFileData%WAMIT2%NewmanApp == 9 .OR. & + InputFileData%WAMIT2%NewmanApp == 10 .OR. InputFileData%WAMIT2%NewmanApp == 11 .OR. InputFileData%WAMIT2%NewmanApp == 12 ) THEN ! Valid values for NewmanApp + IF ( InputFileData%PotMod /= 1 ) THEN CALL SetErrStat( ErrID_warn,'NewmanApp can only be used with PotMod==1. Turning off',ErrStat,ErrMsg,RoutineName) - InitInp%WAMIT2%NewmanAppF = .FALSE. + InputFileData%WAMIT2%NewmanAppF = .FALSE. ELSE - InitInp%WAMIT2%NewmanAppF = .TRUE. + InputFileData%WAMIT2%NewmanAppF = .TRUE. ENDIF ELSE ! Must have received an invalid value CALL SetErrStat( ErrID_Fatal,'NewmanApp can only have values of 0, 7, 8, 9, 10, 11, or 12.',ErrStat,ErrMsg,RoutineName) @@ -3219,14 +2149,14 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Check DiffQTF and set the flag indicating WAMIT2 should perform the mean drift calculation. ! Also make sure we have a valid input value for the file extension - IF ( InitInp%WAMIT2%DiffQTF == 0 ) THEN ! not using DiffQTF method - InitInp%WAMIT2%DiffQTFF = .FALSE. - ELSE IF ( InitInp%WAMIT2%DiffQTF == 10 .OR. InitInp%WAMIT2%DiffQTF == 11 .OR. InitInp%WAMIT2%DiffQTF == 12 ) THEN ! Valid values for DiffQTF - IF ( InitInp%PotMod /= 1 ) THEN + IF ( InputFileData%WAMIT2%DiffQTF == 0 ) THEN ! not using DiffQTF method + InputFileData%WAMIT2%DiffQTFF = .FALSE. + ELSE IF ( InputFileData%WAMIT2%DiffQTF == 10 .OR. InputFileData%WAMIT2%DiffQTF == 11 .OR. InputFileData%WAMIT2%DiffQTF == 12 ) THEN ! Valid values for DiffQTF + IF ( InputFileData%PotMod /= 1 ) THEN CALL SetErrStat( ErrID_warn,'DiffQTF can only be used with PotMod==1. Turning off',ErrStat,ErrMsg,RoutineName) - InitInp%WAMIT2%DiffQTFF = .FALSE. + InputFileData%WAMIT2%DiffQTFF = .FALSE. ELSE - InitInp%WAMIT2%DiffQTFF = .TRUE. + InputFileData%WAMIT2%DiffQTFF = .TRUE. ENDIF ELSE CALL SetErrStat( ErrID_Fatal,'DiffQTF can only have values of 0, 10, 11, or 12.',ErrStat,ErrMsg,RoutineName) @@ -3237,14 +2167,14 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Check SumQTF and set the flag indicating WAMIT2 should perform the mean drift calculation. ! Also make sure we have a valid input value for the file extension - IF ( InitInp%WAMIT2%SumQTF == 0 ) THEN ! not using SumQTF method - InitInp%WAMIT2%SumQTFF = .FALSE. - ELSE IF ( InitInp%WAMIT2%SumQTF == 10 .OR. InitInp%WAMIT2%SumQTF == 11 .OR. InitInp%WAMIT2%SumQTF == 12 ) THEN ! Valid values for SumQTF - IF ( InitInp%PotMod /= 1 ) THEN + IF ( InputFileData%WAMIT2%SumQTF == 0 ) THEN ! not using SumQTF method + InputFileData%WAMIT2%SumQTFF = .FALSE. + ELSE IF ( InputFileData%WAMIT2%SumQTF == 10 .OR. InputFileData%WAMIT2%SumQTF == 11 .OR. InputFileData%WAMIT2%SumQTF == 12 ) THEN ! Valid values for SumQTF + IF ( InputFileData%PotMod /= 1 ) THEN CALL SetErrStat( ErrID_warn,'SumQTF can only be used with PotMod==1. Turning off',ErrStat,ErrMsg,RoutineName) - InitInp%WAMIT2%SumQTFF = .FALSE. + InputFileData%WAMIT2%SumQTFF = .FALSE. ELSE - InitInp%WAMIT2%SumQTFF = .TRUE. + InputFileData%WAMIT2%SumQTFF = .TRUE. ENDIF ELSE CALL SetErrStat( ErrID_Fatal,'SumQTF can only have values of 0, 10, 11, or 12.',ErrStat,ErrMsg,RoutineName) @@ -3253,79 +2183,79 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Check that the min / max diff frequencies make sense if using any DiffQTF method - IF ( InitInp%WAMIT2%DiffQTF /= 0 .OR. InitInp%WAMIT2%MnDrift /= 0 .OR. InitInp%WAMIT2%NewmanApp /=0 ) THEN - IF ( ( InitInp%WAMIT2%WvHiCOffD < InitInp%WAMIT2%WvLowCOffD ) .OR. ( InitInp%WAMIT2%WvLowCOffD < 0.0 ) ) THEN + IF ( InputFileData%WAMIT2%DiffQTF /= 0 .OR. InputFileData%WAMIT2%MnDrift /= 0 .OR. InputFileData%WAMIT2%NewmanApp /=0 ) THEN + IF ( ( InputFileData%WAMIT2%WvHiCOffD < InputFileData%WAMIT2%WvLowCOffD ) .OR. ( InputFileData%WAMIT2%WvLowCOffD < 0.0 ) ) THEN CALL SetErrStat( ErrID_Fatal,'WvHiCOffD must be larger than WvLowCOffD. Both must be positive.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE ! set to zero since we don't need them - InitInp%WAMIT2%WvLowCOffD = 0.0 - InitInp%WAMIT2%WvHiCOffD = 0.0 + InputFileData%WAMIT2%WvLowCOffD = 0.0 + InputFileData%WAMIT2%WvHiCOffD = 0.0 END IF ! Check that the min / max diff frequencies make sense if using SumQTF - IF ( InitInp%WAMIT2%SumQTF /= 0 ) THEN - IF ( ( InitInp%WAMIT2%WvHiCOffS < InitInp%WAMIT2%WvLowCOffS ) .OR. ( InitInp%WAMIT2%WvLowCOffS < 0.0 ) ) THEN + IF ( InputFileData%WAMIT2%SumQTF /= 0 ) THEN + IF ( ( InputFileData%WAMIT2%WvHiCOffS < InputFileData%WAMIT2%WvLowCOffS ) .OR. ( InputFileData%WAMIT2%WvLowCOffS < 0.0 ) ) THEN CALL SetErrStat( ErrID_Fatal,'WvHiCOffS must be larger than WvLowCOffS. Both must be positive.',ErrStat,ErrMsg,RoutineName) RETURN END IF ELSE ! set to zero since we don't need them - InitInp%WAMIT2%WvLowCOffS = 0.0 - InitInp%WAMIT2%WvHiCOffS = 0.0 + InputFileData%WAMIT2%WvLowCOffS = 0.0 + InputFileData%WAMIT2%WvHiCOffS = 0.0 END IF ! now that it has been established that the input parameters for second order are good, we check to make sure that the WAMIT files actually exist. ! Check MnDrift file - IF ( InitInp%WAMIT2%MnDriftF ) THEN + IF ( InputFileData%WAMIT2%MnDriftF ) THEN ! Check if using QTF file types (10d, 11d, 12d) or not (7,8,9) - IF ( InitInp%WAMIT2%MnDrift <= 9 ) THEN - TmpExtension = TRIM(Num2LStr(InitInp%WAMIT2%MnDrift)) - INQUIRE( file=TRIM(InitInp%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) + IF ( InputFileData%WAMIT2%MnDrift <= 9 ) THEN + TmpExtension = TRIM(Num2LStr(InputFileData%WAMIT2%MnDrift)) + INQUIRE( file=TRIM(InputFileData%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) ELSE ! 10, 11, 12 - TmpExtension = TRIM(Num2LStr(InitInp%WAMIT2%MnDrift))//'d' - INQUIRE( file=TRIM(InitInp%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) + TmpExtension = TRIM(Num2LStr(InputFileData%WAMIT2%MnDrift))//'d' + INQUIRE( file=TRIM(InputFileData%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) ENDIF IF ( .not. TmpFileExist ) THEN - CALL SetErrStat( ErrID_Fatal,'Cannot find the WAMIT file '//TRIM(InitInp%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension)// & + CALL SetErrStat( ErrID_Fatal,'Cannot find the WAMIT file '//TRIM(InputFileData%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension)// & ' required by the MnDrift option.',ErrStat,ErrMsg,RoutineName) RETURN END IF END IF ! Check existence of NewmanApp file - IF ( InitInp%WAMIT2%NewmanAppF ) THEN + IF ( InputFileData%WAMIT2%NewmanAppF ) THEN ! Check if using QTF file types (10d, 11d, 12d) or not (7,8,9) - IF ( InitInp%WAMIT2%NewmanApp <= 9 ) THEN - TmpExtension = TRIM(Num2LStr(InitInp%WAMIT2%NewmanApp)) - INQUIRE( file=TRIM(InitInp%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) + IF ( InputFileData%WAMIT2%NewmanApp <= 9 ) THEN + TmpExtension = TRIM(Num2LStr(InputFileData%WAMIT2%NewmanApp)) + INQUIRE( file=TRIM(InputFileData%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) ELSE ! 10, 11, 12 - TmpExtension = TRIM(Num2LStr(InitInp%WAMIT2%NewmanApp))//'d' - INQUIRE( file=TRIM(InitInp%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) + TmpExtension = TRIM(Num2LStr(InputFileData%WAMIT2%NewmanApp))//'d' + INQUIRE( file=TRIM(InputFileData%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) ENDIF IF ( .not. TmpFileExist ) THEN - CALL SetErrStat( ErrID_Fatal,'Cannot find the WAMIT file '//TRIM(InitInp%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension)// & + CALL SetErrStat( ErrID_Fatal,'Cannot find the WAMIT file '//TRIM(InputFileData%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension)// & ' required by the NewmanApp option.',ErrStat,ErrMsg,RoutineName) RETURN END IF END IF - IF ( InitInp%WAMIT2%DiffQTFF ) THEN - TmpExtension = TRIM(Num2LStr(InitInp%WAMIT2%DiffQTF))//'d' - INQUIRE( file=TRIM(InitInp%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) + IF ( InputFileData%WAMIT2%DiffQTFF ) THEN + TmpExtension = TRIM(Num2LStr(InputFileData%WAMIT2%DiffQTF))//'d' + INQUIRE( file=TRIM(InputFileData%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) IF ( .not. TmpFileExist ) THEN - CALL SetErrStat( ErrID_Fatal,'Cannot find the WAMIT file '//TRIM(InitInp%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension)// & + CALL SetErrStat( ErrID_Fatal,'Cannot find the WAMIT file '//TRIM(InputFileData%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension)// & ' required by the DiffQTF option.',ErrStat,ErrMsg,RoutineName) RETURN END IF END IF - IF ( InitInp%WAMIT2%SumQTFF ) THEN - TmpExtension = TRIM(Num2LStr(InitInp%WAMIT2%SumQTF))//'s' - INQUIRE( file=TRIM(InitInp%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) + IF ( InputFileData%WAMIT2%SumQTFF ) THEN + TmpExtension = TRIM(Num2LStr(InputFileData%WAMIT2%SumQTF))//'s' + INQUIRE( file=TRIM(InputFileData%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension), exist=TmpFileExist ) IF ( .not. TmpFileExist ) THEN - CALL SetErrStat( ErrID_Fatal,'Cannot find the WAMIT file '//TRIM(InitInp%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension)// & + CALL SetErrStat( ErrID_Fatal,'Cannot find the WAMIT file '//TRIM(InputFileData%WAMIT2%WAMITFile)//'.'//TRIM(TmpExtension)// & ' required by the SumQTF option.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3334,41 +2264,41 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) !.................. ! check for ExctnMod = 2 requirements !.................. - if ( (InitInp%WAMIT%ExctnMod == 2) ) then + if ( (InputFileData%WAMIT%ExctnMod == 2) ) then - if ( InitInp%Waves%WaveMod == 6 ) then + if ( InputFileData%Waves%WaveMod == 6 ) then call SetErrStat( ErrID_Fatal, 'Externally generated full wave-kinematics time series cannot be used with state-space wave excitations. Set WaveMod 0, 1, 1P#, 2, 3, 4, or 5.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%Waves%WaveDirMod /= 0 ) then + if ( InputFileData%Waves%WaveDirMod /= 0 ) then call SetErrStat( ErrID_Fatal, 'Directional spreading cannot be used with state-space wave excitations. Set WaveDirMod=0.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%Waves2%WvDiffQTFF ) then + if ( InputFileData%Waves2%WvDiffQTFF ) then call SetErrStat( ErrID_Fatal, 'Cannot use full difference-frequency 2nd-order wave kinematics with state-space wave excitations. Set WvDiffQTF=FALSE.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%Waves2%WvSumQTFF ) then + if ( InputFileData%Waves2%WvSumQTFF ) then call SetErrStat( ErrID_Fatal, 'Cannot use full summation-frequency 2nd-order wave kinematics with state-space wave excitations. Set WvSumQTF=FALSE.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%PotMod /= 1 ) then + if ( InputFileData%PotMod /= 1 ) then call SetErrStat( ErrID_Fatal, 'Potential-flow model via WAMIT must be used with state-space wave excitations. Set PotMod= 1.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%WAMIT2%MnDrift /= 0 ) then + if ( InputFileData%WAMIT2%MnDrift /= 0 ) then call SetErrStat( ErrID_Fatal, 'Mean-drift 2nd-order forces cannot be used with state-space wave excitations. Set MnDrift=0.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%WAMIT2%NewmanApp /= 0 ) then + if ( InputFileData%WAMIT2%NewmanApp /= 0 ) then call SetErrStat( ErrID_Fatal, "Mean- and slow-drift 2nd-order forces computed with Newman's approximation cannot be used with state-space wave excitations. Set NewmanApp=0.", ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%WAMIT2%DiffQTF /= 0 ) then + if ( InputFileData%WAMIT2%DiffQTF /= 0 ) then call SetErrStat( ErrID_Fatal, 'Full difference-frequency 2nd-order forces computed with full QTF cannot be used with state-space wave excitations. Set DiffQTF=0.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%WAMIT2%SumQTF /= 0 ) then + if ( InputFileData%WAMIT2%SumQTF /= 0 ) then call SetErrStat( ErrID_Fatal, 'Full summation-frequency 2nd-order forces computed with full QTF cannot be used with State-space wave excitations. Set SumQTF=0.', ErrStat, ErrMsg, RoutineName ) end if @@ -3379,47 +2309,47 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) !.................. if (InitInp%Linearize) then - if ( InitInp%Waves%WaveMod /= 0 ) then + if ( InputFileData%Waves%WaveMod /= 0 ) then call SetErrStat( ErrID_Fatal, 'Still water conditions must be used for linearization. Set WaveMod=0.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%Waves%WaveDirMod /= 0 ) then + if ( InputFileData%Waves%WaveDirMod /= 0 ) then call SetErrStat( ErrID_Fatal, 'No directional spreading must be used for linearization. Set WaveDirMod=0.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%Waves2%WvDiffQTFF ) then + if ( InputFileData%Waves2%WvDiffQTFF ) then call SetErrStat( ErrID_Fatal, 'Cannot use full difference-frequency 2nd-order wave kinematics for linearization. Set WvDiffQTF=FALSE.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%Waves2%WvSumQTFF ) then + if ( InputFileData%Waves2%WvSumQTFF ) then call SetErrStat( ErrID_Fatal, 'Cannot use full summation-frequency 2nd-order wave kinematics for linearization. Set WvSumQTF=FALSE.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%PotMod > 1 ) then + if ( InputFileData%PotMod > 1 ) then call SetErrStat( ErrID_Fatal, 'Potential-flow model cannot be set to FIT for linearization. Set PotMod= 0 or 1.', ErrStat, ErrMsg, RoutineName ) end if - if ( (InitInp%WAMIT%ExctnMod == 1) ) then + if ( (InputFileData%WAMIT%ExctnMod == 1) ) then call SetErrStat( ErrID_Fatal, 'Cannot set wave excitation model to DFT for linearization. Set ExctnMod=0 or 2.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%WAMIT%RdtnMod == 1 ) then + if ( InputFileData%WAMIT%RdtnMod == 1 ) then call SetErrStat( ErrID_Fatal, 'Cannot set wave radiation model to convolution for linearization. Set RdtnMod=0 or 2.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%WAMIT2%MnDrift /= 0 ) then + if ( InputFileData%WAMIT2%MnDrift /= 0 ) then call SetErrStat( ErrID_Fatal, 'Mean-drift 2nd-order forces cannot be used for linearization. Set MnDrift=0.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%WAMIT2%NewmanApp /= 0 ) then + if ( InputFileData%WAMIT2%NewmanApp /= 0 ) then call SetErrStat( ErrID_Fatal, "Mean- and slow-drift 2nd-order forces computed with Newman's approximation cannot be used for linearization. Set NewmanApp=0.", ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%WAMIT2%DiffQTF /= 0 ) then + if ( InputFileData%WAMIT2%DiffQTF /= 0 ) then call SetErrStat( ErrID_Fatal, 'Full difference-frequency 2nd-order forces computed with full QTF cannot be used for linearization. Set DiffQTF=0.', ErrStat, ErrMsg, RoutineName ) end if - if ( InitInp%WAMIT2%SumQTF /= 0 ) then + if ( InputFileData%WAMIT2%SumQTF /= 0 ) then call SetErrStat( ErrID_Fatal, 'Full summation-frequency 2nd-order forces computed with full QTF cannot be used for linearization. Set SumQTF=0.', ErrStat, ErrMsg, RoutineName ) end if @@ -3433,12 +2363,12 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Member Joints Section !------------------------------------------------------------------------------------------------- - IF ( InitInp%Morison%NJoints < 0 ) THEN + IF ( InputFileData%Morison%NJoints < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'NJoints parameter cannot be negative.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%NJoints == 1 ) THEN + IF ( InputFileData%Morison%NJoints == 1 ) THEN CALL SetErrStat( ErrID_Fatal,'NJoints parameter cannot be set to 1.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3446,22 +2376,22 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Check the axial coefs are >= 0 and IDs are unique - IF ( InitInp%Morison%NAxCoefs > 0 ) THEN + IF ( InputFileData%Morison%NAxCoefs > 0 ) THEN - DO I = 1,InitInp%Morison%NAxCoefs + DO I = 1,InputFileData%Morison%NAxCoefs - IF ( InitInp%Morison%AxialCoefs(I)%AxCd < 0 ) THEN + IF ( InputFileData%Morison%AxialCoefs(I)%AxCd < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'AxCd must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%AxialCoefs(I)%AxCa < 0 ) THEN + IF ( InputFileData%Morison%AxialCoefs(I)%AxCa < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'AxCa must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF ! Make sure that the current AxCoefID is not used elsewhere in the table. - DO J = I+1,InitInp%Morison%NAxCoefs - IF ( InitInp%Morison%AxialCoefs(I)%AxCoefID == InitInp%Morison%AxialCoefs(J)%AxCoefID ) THEN + DO J = I+1,InputFileData%Morison%NAxCoefs + IF ( InputFileData%Morison%AxialCoefs(I)%AxCoefID == InputFileData%Morison%AxialCoefs(J)%AxCoefID ) THEN CALL SetErrStat( ErrID_Fatal,'Duplicate AxCoefIDs were found in the Axial Coefficients table.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3475,40 +2405,40 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Check JointOvrlp values !NOTE: This is ignored in the current version of Morison. 3/15/2020 GJH - IF ( InitInp%Morison%NJoints > 1 ) THEN + IF ( InputFileData%Morison%NJoints > 1 ) THEN ! Initialize Joints - DO I = 1,InitInp%Morison%NJoints - InitInp%Morison%InpJoints(I)%NConnections = 0 + DO I = 1,InputFileData%Morison%NJoints + InputFileData%Morison%InpJoints(I)%NConnections = 0 END DO - DO I = 1,InitInp%Morison%NJoints + DO I = 1,InputFileData%Morison%NJoints ! Make sure that the current JointID is not used elsewhere in the table. - DO J = I+1,InitInp%Morison%NJoints - IF ( InitInp%Morison%InpJoints(I)%JointID == InitInp%Morison%InpJoints(J)%JointID ) THEN + DO J = I+1,InputFileData%Morison%NJoints + IF ( InputFileData%Morison%InpJoints(I)%JointID == InputFileData%Morison%InpJoints(J)%JointID ) THEN CALL SetErrStat( ErrID_Fatal,'Duplicate JointIDs were found in the Member Joints table.',ErrStat,ErrMsg,RoutineName) RETURN END IF END DO ! Add up total number of joints flagged with JoinOvrlp = 1 option - !IF ( InitInp%Morison%InpJoints(I)%JointOvrlp == 1 ) THEN - ! InitInp%Morison%TotalPossibleSuperMembers = InitInp%Morison%TotalPossibleSuperMembers + 1 + !IF ( InputFileData%Morison%InpJoints(I)%JointOvrlp == 1 ) THEN + ! InputFileData%Morison%TotalPossibleSuperMembers = InputFileData%Morison%TotalPossibleSuperMembers + 1 !END IF ! Check that every joint id is used at least once in the members table JointUsed = .FALSE. - DO J = 1, InitInp%Morison%NMembers + DO J = 1, InputFileData%Morison%NMembers - IF ( InitInp%Morison%InpMembers(J)%MJointID1 == InitInp%Morison%InpJoints(I)%JointID ) THEN + IF ( InputFileData%Morison%InpMembers(J)%MJointID1 == InputFileData%Morison%InpJoints(I)%JointID ) THEN JointUsed = .TRUE. EXIT END IF - IF ( InitInp%Morison%InpMembers(J)%MJointID2 == InitInp%Morison%InpJoints(I)%JointID ) THEN + IF ( InputFileData%Morison%InpMembers(J)%MJointID2 == InputFileData%Morison%InpJoints(I)%JointID ) THEN JointUsed = .TRUE. EXIT END IF @@ -3520,24 +2450,24 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) END IF ! TODO : Implement Super member elements. GJH 7/24/13 - IF ( InitInp%Morison%InpJoints(I)%JointOvrlp /= 0 ) THEN + IF ( InputFileData%Morison%InpJoints(I)%JointOvrlp /= 0 ) THEN CALL SetErrStat( ErrID_Fatal,'JointOvrlp parameter must be set to 0. Future versions of HydroDyn will support vales of 0 or 1.',ErrStat,ErrMsg,RoutineName) RETURN END IF - !IF ( ( InitInp%Morison%InpJoints(I)%JointOvrlp < 0 ) .OR. ( InitInp%Morison%InpJoints(I)%JointOvrlp > 1 ) ) THEN + !IF ( ( InputFileData%Morison%InpJoints(I)%JointOvrlp < 0 ) .OR. ( InputFileData%Morison%InpJoints(I)%JointOvrlp > 1 ) ) THEN ! ErrMsg = ' JointOvrlp parameter must be set to 0 or 1.' ! ErrStat = ErrID_Fatal ! RETURN !END IF ! Make sure the axial coef id appears in the Ax table - IF ( InitInp%Morison%NAxCoefs > 0 ) THEN - InitInp%Morison%InpJoints(I)%JointAxIDIndx = -1 - DO J = 1,InitInp%Morison%NAxCoefs - IF ( InitInp%Morison%InpJoints(I)%JointAxID == InitInp%Morison%AxialCoefs(J)%AxCoefID ) & - InitInp%Morison%InpJoints(I)%JointAxIDIndx = J + IF ( InputFileData%Morison%NAxCoefs > 0 ) THEN + InputFileData%Morison%InpJoints(I)%JointAxIDIndx = -1 + DO J = 1,InputFileData%Morison%NAxCoefs + IF ( InputFileData%Morison%InpJoints(I)%JointAxID == InputFileData%Morison%AxialCoefs(J)%AxCoefID ) & + InputFileData%Morison%InpJoints(I)%JointAxIDIndx = J END DO - IF ( InitInp%Morison%InpJoints(I)%JointAxIDIndx == -1 ) THEN + IF ( InputFileData%Morison%InpJoints(I)%JointAxIDIndx == -1 ) THEN CALL SetErrStat( ErrID_Fatal,'The specified JointAxID in the Joints Table does not appear in the Axial Coefficients table.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3553,24 +2483,24 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Member Cross-section Properties Section !------------------------------------------------------------------------------------------------- - IF ( InitInp%Morison%NPropSets < 0 ) THEN + IF ( InputFileData%Morison%NPropSets < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'Number of member cross-section property sets must be greater than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%NPropSets > 0 ) THEN + IF ( InputFileData%Morison%NPropSets > 0 ) THEN - DO I = 1,InitInp%Morison%NPropSets + DO I = 1,InputFileData%Morison%NPropSets ! Make sure that the current JointID is not used elsewhere in the table. - DO J = I+1,InitInp%Morison%NPropSets - IF ( InitInp%Morison%MPropSets(I)%PropSetID == InitInp%Morison%MPropSets(J)%PropSetID ) THEN + DO J = I+1,InputFileData%Morison%NPropSets + IF ( InputFileData%Morison%MPropSets(I)%PropSetID == InputFileData%Morison%MPropSets(J)%PropSetID ) THEN CALL SetErrStat( ErrID_Fatal,'Duplicate PropSetIDs were found in the Member Cross-section Properties table.',ErrStat,ErrMsg,RoutineName) RETURN END IF END DO - IF ( ( InitInp%Morison%MPropSets(I)%PropD < 0 ) .OR. ( InitInp%Morison%MPropSets(I)%PropThck < 0 ) .OR. ( ( InitInp%Morison%MPropSets(I)%PropD - InitInp%Morison%MPropSets(I)%PropThck / 2.0 ) < 0) ) THEN + IF ( ( InputFileData%Morison%MPropSets(I)%PropD < 0 ) .OR. ( InputFileData%Morison%MPropSets(I)%PropThck < 0 ) .OR. ( ( InputFileData%Morison%MPropSets(I)%PropD - InputFileData%Morison%MPropSets(I)%PropThck / 2.0 ) < 0) ) THEN CALL SetErrStat( ErrID_Fatal,'PropD and PropThck must be greater than zero and (PropD - propThck/2 ) must be greater than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3583,35 +2513,35 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Simple hydrodynamic coefficients Section !------------------------------------------------------------------------------------------------- - IF ( InitInp%Morison%SimplCd < 0 ) THEN + IF ( InputFileData%Morison%SimplCd < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'SimplCd must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%SimplCdMG < 0 ) THEN + IF ( InputFileData%Morison%SimplCdMG < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'SimplCdMG must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%SimplCa < 0 ) THEN + IF ( InputFileData%Morison%SimplCa < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'SimplCa must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%SimplCaMG < 0 ) THEN + IF ( InputFileData%Morison%SimplCaMG < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'SimplCaMG must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%SimplAxCd < 0 ) THEN + IF ( InputFileData%Morison%SimplAxCd < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'SimplAxCd must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%SimplAxCdMG < 0 ) THEN + IF ( InputFileData%Morison%SimplAxCdMG < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'SimplAxCdMG must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%SimplAxCa < 0 ) THEN + IF ( InputFileData%Morison%SimplAxCa < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'SimplAxCa must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%SimplAxCaMG < 0 ) THEN + IF ( InputFileData%Morison%SimplAxCaMG < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'SimplAxCaMG must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3621,74 +2551,74 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Depth-based Hydrodynamic Coefficients Section !------------------------------------------------------------------------------------------------- - IF ( InitInp%Morison%NCoefDpth < 0 ) THEN + IF ( InputFileData%Morison%NCoefDpth < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'NCoefDpth must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%NCoefDpth > 0 ) THEN + IF ( InputFileData%Morison%NCoefDpth > 0 ) THEN MinDepth = 99999999.0 MaxDepth = -99999999.0 - DO I = 1,InitInp%Morison%NCoefDpth + DO I = 1,InputFileData%Morison%NCoefDpth ! Record the minimum and maximum depths covered by this table. This will be used as part of a consistency check ! in the members table, below. - IF ( InitInp%Morison%CoefDpths(I)%Dpth < MinDepth ) THEN - MinDepth = InitInp%Morison%CoefDpths(I)%Dpth + IF ( InputFileData%Morison%CoefDpths(I)%Dpth < MinDepth ) THEN + MinDepth = InputFileData%Morison%CoefDpths(I)%Dpth ELSE CALL SetErrStat( ErrID_Fatal,'The rows of the Depth-based Hydrodynamic Coefficients table must be ordered with increasing depth (decreasing Z).',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefDpths(I)%Dpth > MaxDepth ) THEN - MaxDepth = InitInp%Morison%CoefDpths(I)%Dpth + IF ( InputFileData%Morison%CoefDpths(I)%Dpth > MaxDepth ) THEN + MaxDepth = InputFileData%Morison%CoefDpths(I)%Dpth END IF ! Make sure that the current Dpth is not used elsewhere in the table. - DO J = I+1,InitInp%Morison%NCoefDpth - IF ( EqualRealNos( InitInp%Morison%CoefDpths(I)%Dpth, InitInp%Morison%CoefDpths(J)%Dpth ) ) THEN + DO J = I+1,InputFileData%Morison%NCoefDpth + IF ( EqualRealNos( InputFileData%Morison%CoefDpths(I)%Dpth, InputFileData%Morison%CoefDpths(J)%Dpth ) ) THEN CALL SetErrStat( ErrID_Fatal,'Duplicate Dpths were found in the Depth-based Hydrodynamic Coefficients table.',ErrStat,ErrMsg,RoutineName) RETURN END IF END DO - IF ( InitInp%Morison%CoefDpths(I)%DpthCd < 0 ) THEN + IF ( InputFileData%Morison%CoefDpths(I)%DpthCd < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the Depth-based hydrodynamic coefficients table, DpthCd must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefDpths(I)%DpthCdMG < 0 ) THEN + IF ( InputFileData%Morison%CoefDpths(I)%DpthCdMG < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the Depth-based hydrodynamic coefficients table, DpthCdMG must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefDpths(I)%DpthCa < 0 ) THEN + IF ( InputFileData%Morison%CoefDpths(I)%DpthCa < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the Depth-based hydrodynamic coefficients table, DpthCa must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefDpths(I)%DpthCaMG < 0 ) THEN + IF ( InputFileData%Morison%CoefDpths(I)%DpthCaMG < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the Depth-based hydrodynamic coefficients table, DpthCaMG must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefDpths(I)%DpthAxCd < 0 ) THEN + IF ( InputFileData%Morison%CoefDpths(I)%DpthAxCd < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the Depth-based hydrodynamic coefficients table, DpthAxCd must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefDpths(I)%DpthAxCdMG < 0 ) THEN + IF ( InputFileData%Morison%CoefDpths(I)%DpthAxCdMG < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the Depth-based hydrodynamic coefficients table, DpthAxCdMG must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefDpths(I)%DpthAxCa < 0 ) THEN + IF ( InputFileData%Morison%CoefDpths(I)%DpthAxCa < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the Depth-based hydrodynamic coefficients table, DpthAxCa must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefDpths(I)%DpthAxCaMG < 0 ) THEN + IF ( InputFileData%Morison%CoefDpths(I)%DpthAxCaMG < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the Depth-based hydrodynamic coefficients table, DpthAxCaMG must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefDpths(I)%DpthAxCp < 0 ) THEN + IF ( InputFileData%Morison%CoefDpths(I)%DpthAxCp < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the Depth-based hydrodynamic coefficients table, DpthAxCp must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefDpths(I)%DpthAxCpMG < 0 ) THEN + IF ( InputFileData%Morison%CoefDpths(I)%DpthAxCpMG < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the Depth-based hydrodynamic coefficients table, DpthAxCpMG must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3703,18 +2633,18 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Member-based Hydrodynamic Coefficients Section !------------------------------------------------------------------------------------------------- - IF ( InitInp%Morison%NCoefMembers < 0 ) THEN + IF ( InputFileData%Morison%NCoefMembers < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'NCoefMembers must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%NCoefMembers > 0 ) THEN + IF ( InputFileData%Morison%NCoefMembers > 0 ) THEN - DO I = 1,InitInp%Morison%NCoefMembers + DO I = 1,InputFileData%Morison%NCoefMembers ! Make sure that the current MemberID is not used elsewhere in the table. - DO J = I+1,InitInp%Morison%NCoefMembers - IF ( InitInp%Morison%CoefMembers(I)%MemberID == InitInp%Morison%CoefMembers(J)%MemberID ) THEN + DO J = I+1,InputFileData%Morison%NCoefMembers + IF ( InputFileData%Morison%CoefMembers(I)%MemberID == InputFileData%Morison%CoefMembers(J)%MemberID ) THEN CALL SetErrStat( ErrID_Fatal,'Duplicate MemberIDs were found in the Member-based Hydrodynamic coefficients table.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3722,51 +2652,51 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) - IF ( InitInp%Morison%CoefMembers(I)%MemberCd1 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberCd1 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCd1 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberCd2 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberCd2 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCd2 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberCdMG1 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberCdMG1 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCdMG1 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberCdMG2 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberCdMG2 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCdMG2 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberCa1 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberCa1 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCa1 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberCa2 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberCa2 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCa2 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberCaMG1 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberCaMG1 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCaMG1 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberCaMG2 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberCaMG2 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCaMG2 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberAxCa1 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberAxCa1 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCa1 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberAxCa2 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberAxCa2 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCa2 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberAxCaMG1 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberAxCaMG1 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCaMG1 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%CoefMembers(I)%MemberAxCaMG2 < 0 ) THEN + IF ( InputFileData%Morison%CoefMembers(I)%MemberAxCaMG2 < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'In the member-based hydrodynamic coefficients table, MemberCaMG2 must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3779,59 +2709,59 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Members Section !------------------------------------------------------------------------------------------------- - IF ( InitInp%Morison%NMembers < 0 ) THEN + IF ( InputFileData%Morison%NMembers < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'NMembers in the Members table must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%NMembers > 0 ) THEN + IF ( InputFileData%Morison%NMembers > 0 ) THEN ! Initialize all member data - DO I = 1,InitInp%Morison%NMembers - InitInp%Morison%InpMembers(I)%MJointID1Indx = -1 - InitInp%Morison%InpMembers(I)%MJointID2Indx = -1 - InitInp%Morison%InpMembers(I)%MPropSetID1Indx = -1 - InitInp%Morison%InpMembers(I)%MPropSetID2Indx = -1 - InitInp%Morison%InpMembers(I)%MmbrFilledIDIndx = -1 - InitInp%Morison%InpMembers(I)%MmbrCoefIDIndx = -1 + DO I = 1,InputFileData%Morison%NMembers + InputFileData%Morison%InpMembers(I)%MJointID1Indx = -1 + InputFileData%Morison%InpMembers(I)%MJointID2Indx = -1 + InputFileData%Morison%InpMembers(I)%MPropSetID1Indx = -1 + InputFileData%Morison%InpMembers(I)%MPropSetID2Indx = -1 + InputFileData%Morison%InpMembers(I)%MmbrFilledIDIndx = -1 + InputFileData%Morison%InpMembers(I)%MmbrCoefIDIndx = -1 END DO - DO I = 1,InitInp%Morison%NMembers + DO I = 1,InputFileData%Morison%NMembers ! Make sure that the current MemberID is not used elsewhere in the table. - DO J = I+1,InitInp%Morison%NMembers - IF ( InitInp%Morison%InpMembers(I)%MemberID == InitInp%Morison%InpMembers(J)%MemberID ) THEN + DO J = I+1,InputFileData%Morison%NMembers + IF ( InputFileData%Morison%InpMembers(I)%MemberID == InputFileData%Morison%InpMembers(J)%MemberID ) THEN CALL SetErrStat( ErrID_Fatal,'Duplicate MemberIDs were found in the Members table.',ErrStat,ErrMsg,RoutineName) RETURN END IF END DO ! Find JointID1 and JointID2 in the Joint table and then record their index locations in the Joint table - DO J = 1,InitInp%Morison%NJoints - IF ( InitInp%Morison%InpMembers(I)%MJointID1 == InitInp%Morison%InpJoints(J)%JointID ) THEN - InitInp%Morison%InpMembers(I)%MJointID1Indx = J - InitInp%Morison%InpJoints(J)%NConnections = InitInp%Morison%InpJoints(J)%NConnections + 1 - InitInp%Morison%InpJoints(J)%ConnectionList(InitInp%Morison%InpJoints(J)%NConnections) = I + DO J = 1,InputFileData%Morison%NJoints + IF ( InputFileData%Morison%InpMembers(I)%MJointID1 == InputFileData%Morison%InpJoints(J)%JointID ) THEN + InputFileData%Morison%InpMembers(I)%MJointID1Indx = J + InputFileData%Morison%InpJoints(J)%NConnections = InputFileData%Morison%InpJoints(J)%NConnections + 1 + InputFileData%Morison%InpJoints(J)%ConnectionList(InputFileData%Morison%InpJoints(J)%NConnections) = I END IF - IF ( InitInp%Morison%InpMembers(I)%MJointID2 == InitInp%Morison%InpJoints(J)%JointID ) THEN - InitInp%Morison%InpMembers(I)%MJointID2Indx = J - InitInp%Morison%InpJoints(J)%NConnections = InitInp%Morison%InpJoints(J)%NConnections + 1 - InitInp%Morison%InpJoints(J)%ConnectionList(InitInp%Morison%InpJoints(J)%NConnections) = -I !TODO: Come up with a better method for this work GJH 4/6/20 + IF ( InputFileData%Morison%InpMembers(I)%MJointID2 == InputFileData%Morison%InpJoints(J)%JointID ) THEN + InputFileData%Morison%InpMembers(I)%MJointID2Indx = J + InputFileData%Morison%InpJoints(J)%NConnections = InputFileData%Morison%InpJoints(J)%NConnections + 1 + InputFileData%Morison%InpJoints(J)%ConnectionList(InputFileData%Morison%InpJoints(J)%NConnections) = -I !TODO: Come up with a better method for this work GJH 4/6/20 END IF END DO ! Make sure that a JointID entry in the Joints table was found - IF ( InitInp%Morison%InpMembers(I)%MJointID1Indx == -1 ) THEN + IF ( InputFileData%Morison%InpMembers(I)%MJointID1Indx == -1 ) THEN CALL SetErrStat( ErrID_Fatal,'JointID1 in the Members table does not appear in the Joints table.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%InpMembers(I)%MJointID2Indx == -1 ) THEN + IF ( InputFileData%Morison%InpMembers(I)%MJointID2Indx == -1 ) THEN CALL SetErrStat( ErrID_Fatal,'JointID2 in the Members table does not appear in the Joints table.',ErrStat,ErrMsg,RoutineName) RETURN END IF ! Make sure we do not have any zero length members - lvec = InitInp%Morison%InpJoints(InitInp%Morison%InpMembers(I)%MJointID1Indx)%Position - InitInp%Morison%InpJoints(InitInp%Morison%InpMembers(I)%MJointID2Indx)%Position + lvec = InputFileData%Morison%InpJoints(InputFileData%Morison%InpMembers(I)%MJointID1Indx)%Position - InputFileData%Morison%InpJoints(InputFileData%Morison%InpMembers(I)%MJointID2Indx)%Position l = sqrt( lvec(1)*lvec(1) + lvec(2)*lvec(2) + lvec(3)*lvec(3) ) IF ( EqualRealNos(0.0_ReKi, l) ) THEN CALL SetErrStat( ErrID_Fatal,'A member cannot have zero length.',ErrStat,ErrMsg,RoutineName) @@ -3839,24 +2769,24 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) END IF ! Find MPropSetID1 and MPropSetID2 in the Member cross-section properties table and then record their index locations - DO J = 1,InitInp%Morison%NPropSets + DO J = 1,InputFileData%Morison%NPropSets - IF ( InitInp%Morison%InpMembers(I)%MPropSetID1 == InitInp%Morison%MPropSets(J)%PropSetID ) THEN - InitInp%Morison%InpMembers(I)%MPropSetID1Indx = J + IF ( InputFileData%Morison%InpMembers(I)%MPropSetID1 == InputFileData%Morison%MPropSets(J)%PropSetID ) THEN + InputFileData%Morison%InpMembers(I)%MPropSetID1Indx = J END IF - IF ( InitInp%Morison%InpMembers(I)%MPropSetID2 == InitInp%Morison%MPropSets(J)%PropSetID ) THEN - InitInp%Morison%InpMembers(I)%MPropSetID2Indx = J + IF ( InputFileData%Morison%InpMembers(I)%MPropSetID2 == InputFileData%Morison%MPropSets(J)%PropSetID ) THEN + InputFileData%Morison%InpMembers(I)%MPropSetID2Indx = J END IF END DO ! Make sure that a PropSetID entry in the Member cross-section properties table was found - IF ( InitInp%Morison%InpMembers(I)%MPropSetID1Indx == -1 ) THEN + IF ( InputFileData%Morison%InpMembers(I)%MPropSetID1Indx == -1 ) THEN CALL SetErrStat( ErrID_Fatal,'MPropSetID1 in the Members table does not appear in the Member cross-section properties table.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%InpMembers(I)%MPropSetID2Indx == -1 ) THEN + IF ( InputFileData%Morison%InpMembers(I)%MPropSetID2Indx == -1 ) THEN CALL SetErrStat( ErrID_Fatal,'MPropSetID2 in the Members table does not appear in the Member cross-section properties table.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3864,26 +2794,26 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! NOTE: We cannot test that MDivSize > MemberLength yet because there may be a joint overlap which is going to alter the final length of this member - IF ( InitInp%Morison%InpMembers(I)%MDivSize <= 0 ) THEN + IF ( InputFileData%Morison%InpMembers(I)%MDivSize <= 0 ) THEN CALL SetErrStat( ErrID_Fatal,'MDivSize must be greater than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( ( InitInp%Morison%InpMembers(I)%MCoefMod /= 1 ) .AND. ( InitInp%Morison%InpMembers(I)%MCoefMod /= 2 ) .AND. ( InitInp%Morison%InpMembers(I)%MCoefMod /= 3 ) ) THEN + IF ( ( InputFileData%Morison%InpMembers(I)%MCoefMod /= 1 ) .AND. ( InputFileData%Morison%InpMembers(I)%MCoefMod /= 2 ) .AND. ( InputFileData%Morison%InpMembers(I)%MCoefMod /= 3 ) ) THEN CALL SetErrStat( ErrID_Fatal,'MCoefMod must be 1, 2, or 3.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%InpMembers(I)%MCoefMod == 2 ) THEN - IF ( InitInp%Morison%NCoefDpth == 0 ) THEN + IF ( InputFileData%Morison%InpMembers(I)%MCoefMod == 2 ) THEN + IF ( InputFileData%Morison%NCoefDpth == 0 ) THEN CALL SetErrStat( ErrID_Fatal,'NCoefDpth must be greater than zero when a member is using a depth-based coefficient model.',ErrStat,ErrMsg,RoutineName) RETURN END IF ! We will not extrapolate depth-based coefficient values, so make sure that the depth-based table has values that are outside the depth range of this member ! NOTE: This is actually potentially overly conservative because the final member may be shorter due to joint overlap handling. - z1 = InitInp%Morison%InpJoints( InitInp%Morison%InpMembers(I)%MJointID1Indx )%Position(3) - z2 = InitInp%Morison%InpJoints( InitInp%Morison%InpMembers(I)%MJointID2Indx )%Position(3) + z1 = InputFileData%Morison%InpJoints( InputFileData%Morison%InpMembers(I)%MJointID1Indx )%Position(3) + z2 = InputFileData%Morison%InpJoints( InputFileData%Morison%InpMembers(I)%MJointID2Indx )%Position(3) MinMembrDpth = min( z1, z2 ) MaxMembrDpth = max( z1, z2 ) IF ( ( MinMembrDpth < MinDepth ) .OR. ( MaxMembrDpth > MaxDepth ) ) THEN @@ -3894,17 +2824,17 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) END IF - IF ( InitInp%Morison%InpMembers(I)%MCoefMod == 3 ) THEN - IF ( InitInp%Morison%NCoefMembers == 0 ) THEN + IF ( InputFileData%Morison%InpMembers(I)%MCoefMod == 3 ) THEN + IF ( InputFileData%Morison%NCoefMembers == 0 ) THEN CALL SetErrStat( ErrID_Fatal,'NCoefMembers must be greater than zero when a member is using a member-based coefficient model.',ErrStat,ErrMsg,RoutineName) RETURN END IF ! Make sure this id appears in the Members table and mark it's location for future use FoundID = .FALSE. - DO J = 1,InitInp%Morison%NCoefMembers - IF ( InitInp%Morison%CoefMembers(J)%MemberID == InitInp%Morison%InpMembers(I)%MemberID ) THEN + DO J = 1,InputFileData%Morison%NCoefMembers + IF ( InputFileData%Morison%CoefMembers(J)%MemberID == InputFileData%Morison%InpMembers(I)%MemberID ) THEN FoundID = .TRUE. - InitInp%Morison%InpMembers(I)%MmbrCoefIDIndx = J + InputFileData%Morison%InpMembers(I)%MmbrCoefIDIndx = J END IF END DO @@ -3914,7 +2844,7 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) END IF END IF - IF ( InitInp%Morison%InpMembers(I)%PropPot .AND. InitInp%PotMod == 0 ) THEN + IF ( InputFileData%Morison%InpMembers(I)%PropPot .AND. InputFileData%PotMod == 0 ) THEN CALL SetErrStat( ErrID_Fatal,'A member cannot have PropPot set to TRUE if PotMod = 0 in the FLOATING PLATFORM section.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -3930,31 +2860,31 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Filled Members Section !------------------------------------------------------------------------------------------------- - IF ( InitInp%Morison%NFillGroups < 0 ) THEN + IF ( InputFileData%Morison%NFillGroups < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'NFillGroups in the Filled-members table must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%NFillGroups > 0 ) THEN + IF ( InputFileData%Morison%NFillGroups > 0 ) THEN - DO I = 1,InitInp%Morison%NFillGroups + DO I = 1,InputFileData%Morison%NFillGroups - IF ( InitInp%Morison%FilledGroups(I)%FillNumM < 1 ) THEN + IF ( InputFileData%Morison%FilledGroups(I)%FillNumM < 1 ) THEN CALL SetErrStat( ErrID_Fatal,'FillNumM in the Filled-members table must be greater than zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - DO J = 1,InitInp%Morison%FilledGroups(I)%FillNumM + DO J = 1,InputFileData%Morison%FilledGroups(I)%FillNumM - DO K=1,InitInp%Morison%NMembers - IF ( InitInp%Morison%FilledGroups(I)%FillMList(J) == InitInp%Morison%InpMembers(K)%MemberID ) THEN + DO K=1,InputFileData%Morison%NMembers + IF ( InputFileData%Morison%FilledGroups(I)%FillMList(J) == InputFileData%Morison%InpMembers(K)%MemberID ) THEN FoundID = .TRUE. ! Check to make sure this member is not already part of another fill group! - IF ( InitInp%Morison%InpMembers(K)%MmbrFilledIDIndx /= -1 ) THEN + IF ( InputFileData%Morison%InpMembers(K)%MmbrFilledIDIndx /= -1 ) THEN CALL SetErrStat( ErrID_Fatal,'A member cannot be a part of more than one fill group!',ErrStat,ErrMsg,RoutineName) END IF - InitInp%Morison%InpMembers(k)%MmbrFilledIDIndx = I + InputFileData%Morison%InpMembers(k)%MmbrFilledIDIndx = I END IF END DO @@ -3966,22 +2896,22 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Make sure that the filled group members are connected ! NOTE: This would be easier if the input mesh was already a FAST Framework mesh because then you could use the mesh routines to determine connectivity. - !InitInp%Morison%FilledGroups(I)%FillMList(J) + !InputFileData%Morison%FilledGroups(I)%FillMList(J) ! Make sure the FillFSLoc is within one of the group members - !InitInp%Morison%FilledGroups(I)%FillFSLoc + !InputFileData%Morison%FilledGroups(I)%FillFSLoc ! Deal with DEFAULT or create a REAL from the string - IF ( TRIM(InitInp%Morison%FilledGroups(I)%FillDensChr) /= 'DEFAULT' ) THEN + IF ( TRIM(InputFileData%Morison%FilledGroups(I)%FillDensChr) /= 'DEFAULT' ) THEN - READ (InitInp%Morison%FilledGroups(I)%FillDensChr,*,IOSTAT=IOS) InitInp%Morison%FilledGroups(I)%FillDens + READ (InputFileData%Morison%FilledGroups(I)%FillDensChr,*,IOSTAT=IOS) InputFileData%Morison%FilledGroups(I)%FillDens CALL CheckIOS ( IOS, "", 'FillDens', NumType, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) RETURN ELSE - InitInp%Morison%FilledGroups(I)%FillDens = InitInp%Waves%WtrDens + InputFileData%Morison%FilledGroups(I)%FillDens = InputFileData%Waves%WtrDens END IF END DO @@ -3993,42 +2923,42 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Marine Growth by Depth Section !------------------------------------------------------------------------------------------------- - IF ( InitInp%Morison%NMGDepths < 0 ) THEN + IF ( InputFileData%Morison%NMGDepths < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'NMGDepths in the Marine growth table must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%NMGDepths > 0 ) THEN + IF ( InputFileData%Morison%NMGDepths > 0 ) THEN - InitInp%Morison%MGTop = -999999.0 - InitInp%Morison%MGBottom = 999999.0 - - DO I = 1,InitInp%Morison%NMGDepths + InputFileData%Morison%MGTop = -999999.0 + InputFileData%Morison%MGBottom = 999999.0 + + DO I = 1,InputFileData%Morison%NMGDepths ! Store the boundaries of the marine growth zone - IF ( InitInp%Morison%MGDepths(I)%MGDpth > InitInp%Morison%MGTop ) THEN - InitInp%Morison%MGTop = InitInp%Morison%MGDepths(I)%MGDpth + IF ( InputFileData%Morison%MGDepths(I)%MGDpth > InputFileData%Morison%MGTop ) THEN + InputFileData%Morison%MGTop = InputFileData%Morison%MGDepths(I)%MGDpth END IF - IF ( InitInp%Morison%MGDepths(I)%MGDpth < InitInp%Morison%MGBottom ) THEN - InitInp%Morison%MGBottom = InitInp%Morison%MGDepths(I)%MGDpth + IF ( InputFileData%Morison%MGDepths(I)%MGDpth < InputFileData%Morison%MGBottom ) THEN + InputFileData%Morison%MGBottom = InputFileData%Morison%MGDepths(I)%MGDpth ELSE CALL SetErrStat( ErrID_Fatal,'The rows of the marine growth table must be ordered with increasing depth (decreasing Z).',ErrStat,ErrMsg,RoutineName) RETURN END IF ! Make sure that the current MGDpth is not used elsewhere in the table. - DO J = I+1,InitInp%Morison%NMGDepths - IF ( EqualRealNos( InitInp%Morison%MGDepths(I)%MGDpth, InitInp%Morison%MGDepths(J)%MGDpth ) ) THEN + DO J = I+1,InputFileData%Morison%NMGDepths + IF ( EqualRealNos( InputFileData%Morison%MGDepths(I)%MGDpth, InputFileData%Morison%MGDepths(J)%MGDpth ) ) THEN CALL SetErrStat( ErrID_Fatal,'Duplicate MGDpth were found in the Marine Growth table.',ErrStat,ErrMsg,RoutineName) RETURN END IF END DO - IF ( InitInp%Morison%MGDepths(I)%MGThck < 0 ) THEN + IF ( InputFileData%Morison%MGDepths(I)%MGThck < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'MGThck in the Marine growth table must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%MGDepths(I)%MGDens < 0 ) THEN + IF ( InputFileData%Morison%MGDepths(I)%MGDens < 0 ) THEN CALL SetErrStat( ErrID_Fatal,'MGDens in the Marine growth table must be greater or equal to zero.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -4042,38 +2972,38 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Member Output List Section !------------------------------------------------------------------------------------------------- - IF ( ( InitInp%Morison%NMOutputs < 0 ) .OR. ( InitInp%Morison%NMOutputs > 9 ) ) THEN + IF ( ( InputFileData%Morison%NMOutputs < 0 ) .OR. ( InputFileData%Morison%NMOutputs > 9 ) ) THEN CALL SetErrStat( ErrID_Fatal,'NMOutputs in the Member output list must be greater or equal to zero and less than 10.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%NMOutputs > 0 ) THEN + IF ( InputFileData%Morison%NMOutputs > 0 ) THEN - DO I = 1,InitInp%Morison%NMOutputs + DO I = 1,InputFileData%Morison%NMOutputs - InitInp%Morison%MOutLst(I)%MemberIDIndx = -1 + InputFileData%Morison%MOutLst(I)%MemberIDIndx = -1 ! Find MemberID in this Member output list table in the Members table - DO J = 1,InitInp%Morison%NMembers - IF ( InitInp%Morison%InpMembers(J)%MemberID == InitInp%Morison%MOutLst(I)%MemberID ) THEN - InitInp%Morison%MOutLst(I)%MemberIDIndx = J + DO J = 1,InputFileData%Morison%NMembers + IF ( InputFileData%Morison%InpMembers(J)%MemberID == InputFileData%Morison%MOutLst(I)%MemberID ) THEN + InputFileData%Morison%MOutLst(I)%MemberIDIndx = J END IF END DO ! Make sure that a PropSetID entry in the Member cross-section properties table was found - IF ( InitInp%Morison%MOutLst(I)%MemberIDIndx == -1 ) THEN + IF ( InputFileData%Morison%MOutLst(I)%MemberIDIndx == -1 ) THEN CALL SetErrStat( ErrID_Fatal,'MemberID in the Member output list table does not appear in the Members table.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( ( InitInp%Morison%MOutLst(I)%NOutLoc < 1 ) .OR. ( InitInp%Morison%MOutLst(I)%NOutLoc > 9) ) THEN + IF ( ( InputFileData%Morison%MOutLst(I)%NOutLoc < 1 ) .OR. ( InputFileData%Morison%MOutLst(I)%NOutLoc > 9) ) THEN CALL SetErrStat( ErrID_Fatal,'NOutLoc in the Member output list must be greater than zero and less than 10.',ErrStat,ErrMsg,RoutineName) RETURN END IF - DO J = 1,InitInp%Morison%MOutLst(I)%NOutLoc - IF ( ( InitInp%Morison%MOutLst(I)%NodeLocs(J) < 0.0 ) .OR. ( InitInp%Morison%MOutLst(I)%NodeLocs(J) > 1.0 ) ) THEN + DO J = 1,InputFileData%Morison%MOutLst(I)%NOutLoc + IF ( ( InputFileData%Morison%MOutLst(I)%NodeLocs(J) < 0.0 ) .OR. ( InputFileData%Morison%MOutLst(I)%NodeLocs(J) > 1.0 ) ) THEN CALL SetErrStat( ErrID_Fatal,'NodeLocs in the Member output list must be greater or equal to 0.0 and less than or equal to 1.0.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -4088,27 +3018,27 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Joint Output List Section !------------------------------------------------------------------------------------------------- - IF ( ( InitInp%Morison%NJOutputs < 0 ) .OR. ( InitInp%Morison%NMOutputs > 9 ) ) THEN + IF ( ( InputFileData%Morison%NJOutputs < 0 ) .OR. ( InputFileData%Morison%NMOutputs > 9 ) ) THEN CALL SetErrStat( ErrID_Fatal,'NJOutputs in the Joint output list must be greater or equal to zero and less than 10.',ErrStat,ErrMsg,RoutineName) RETURN END IF - IF ( InitInp%Morison%NJOutputs > 0 ) THEN + IF ( InputFileData%Morison%NJOutputs > 0 ) THEN - DO I=1,InitInp%Morison%NJOutputs + DO I=1,InputFileData%Morison%NJOutputs - InitInp%Morison%JOutLst(I)%JointIDIndx = -1 + InputFileData%Morison%JOutLst(I)%JointIDIndx = -1 ! Find MemberID in this Member output list table in the Members table - DO J = 1,InitInp%Morison%NJoints - IF ( InitInp%Morison%InpJoints(J)%JointID == InitInp%Morison%JOutLst(I)%JointID ) THEN - InitInp%Morison%JOutLst(I)%JointIDIndx = J + DO J = 1,InputFileData%Morison%NJoints + IF ( InputFileData%Morison%InpJoints(J)%JointID == InputFileData%Morison%JOutLst(I)%JointID ) THEN + InputFileData%Morison%JOutLst(I)%JointIDIndx = J EXIT END IF END DO ! Make sure that a Joint Output ID found in the JOutLst is in the Joints table - IF ( InitInp%Morison%JOutLst(I)%JointIDIndx == -1 ) THEN + IF ( InputFileData%Morison%JOutLst(I)%JointIDIndx == -1 ) THEN CALL SetErrStat( ErrID_Fatal,'JointID in the Joint output list table does not appear in the Joints table.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -4122,7 +3052,7 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! OutAll - output all member and joint data - IF ( InitInp%OutAll ) THEN !TODO: Alter this check once OutAll is supported + IF ( InputFileData%OutAll ) THEN !TODO: Alter this check once OutAll is supported CALL SetErrStat( ErrID_Fatal,'OutAll must be FALSE. Future versions of HydroDyn will once again support values of either TRUE or FALSE.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -4130,13 +3060,13 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! OutSwtch - output file switch - IF ( InitInp%OutSwtch /= 1 .AND. InitInp%OutSwtch /= 2 .AND. InitInp%OutSwtch /= 3 ) THEN + IF ( InputFileData%OutSwtch /= 1 .AND. InputFileData%OutSwtch /= 2 .AND. InputFileData%OutSwtch /= 3 ) THEN CALL SetErrStat( ErrID_Fatal,'OutSwitch must be set to 1, 2, or 3.',ErrStat,ErrMsg,RoutineName) RETURN END IF - !InitInp%OutFmt - !InitInp%OutSFmt + !InputFileData%OutFmt + !InputFileData%OutSFmt ! OutList - list of requested parameters to output to a file @@ -4148,8 +3078,8 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! First we need to extract module-specific output lists from the user-input list. ! Any unidentified channels will be attached to the HydroDyn module's output list. - IF ( InitInp%NUserOutputs > 0 ) THEN - ALLOCATE ( foundMask(InitInp%NUserOutputs) , STAT = ErrStat2 ) + IF ( InputFileData%NUserOutputs > 0 ) THEN + ALLOCATE ( foundMask(InputFileData%NUserOutputs) , STAT = ErrStat2 ) IF ( ErrStat2 /= ErrID_None ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for temporary array: foundMask in the HydroDynInput_GetInput subroutine.',ErrStat,ErrMsg,RoutineName) @@ -4157,20 +3087,20 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) END IF foundMask = .FALSE. ! Extract Waves2 list - InitInp%Waves2%NumOuts = GetWaves2Channels ( InitInp%NUserOutputs, InitInp%UserOutputs, InitInp%Waves2%OutList, foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + InputFileData%Waves2%NumOuts = GetWaves2Channels ( InputFileData%NUserOutputs, InputFileData%UserOutputs, InputFileData%Waves2%OutList, foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! ! Extract WAMIT2 list -! InitInp%WAMIT2%NumOuts = GetWAMIT2Channels ( InitInp%NUserOutputs, InitInp%UserOutputs, InitInp%WAMIT2%OutList, foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) +! InputFileData%WAMIT2%NumOuts = GetWAMIT2Channels ( InputFileData%NUserOutputs, InputFileData%UserOutputs, InputFileData%WAMIT2%OutList, foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! ! Extract Morison list !foundMask = .FALSE. - InitInp%Morison%NumOuts = GetMorisonChannels ( InitInp%NUserOutputs, InitInp%UserOutputs, InitInp%Morison%OutList, foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + InputFileData%Morison%NumOuts = GetMorisonChannels ( InputFileData%NUserOutputs, InputFileData%UserOutputs, InputFileData%Morison%OutList, foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! Attach remaining items to the HydroDyn list !foundMask = .FALSE. - call Allocary(InitInp%OutList, InitInp%NUserOutputs, "InitInp%OutList", ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - InitInp%NumOuts = HDOut_GetChannels ( InitInp%NUserOutputs, InitInp%UserOutputs, InitInp%OutList , foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL PrintBadChannelWarning(InitInp%NUserOutputs, InitInp%UserOutputs , foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call Allocary(InputFileData%OutList, InputFileData%NUserOutputs, "InputFileData%OutList", ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + InputFileData%NumOuts = HDOut_GetChannels ( InputFileData%NUserOutputs, InputFileData%UserOutputs, InputFileData%OutList , foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL PrintBadChannelWarning(InputFileData%NUserOutputs, InputFileData%UserOutputs , foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF (ErrStat >= AbortErrLev ) RETURN @@ -4186,18 +3116,18 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Mesh-related Output List !---------------------------------------------------------- - IF ( InitInp%Morison%NumOuts > 0 ) THEN + IF ( InputFileData%Morison%NumOuts > 0 ) THEN ! Create an output list for validated outputs - ALLOCATE ( InitInp%Morison%ValidOutList(InitInp%Morison%NumOuts), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Morison%ValidOutList(InputFileData%Morison%NumOuts), STAT = ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating valid output list array.',ErrStat,ErrMsg,RoutineName) RETURN END IF - DO I =1, InitInp%Morison%NumOuts + DO I =1, InputFileData%Morison%NumOuts - InitInp%Morison%ValidOutList(I) = CheckMeshOutput( InitInp%Morison%OutList(I), InitInp%Morison%NMOutputs, InitInp%Morison%MOutLst, InitInp%Morison%NJOutputs ) + InputFileData%Morison%ValidOutList(I) = CheckMeshOutput( InputFileData%Morison%OutList(I), InputFileData%Morison%NMOutputs, InputFileData%Morison%MOutLst, InputFileData%Morison%NJOutputs ) END DO @@ -4210,57 +3140,57 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Current ! For wave kinematic calculations, the effective water depth is the user input water depth (positive valued) + MSL2SWL (positive when SWL is above MSL). - InitInp%Current%WtrDpth = InitInp%Morison%WtrDpth ! already adjusted for the MSL2SWL. + InputFileData%Current%WtrDpth = InputFileData%Morison%WtrDpth ! already adjusted for the MSL2SWL. ! Waves - InitInp%Waves%Gravity = InitInp%Gravity - InitInp%Waves%UnSum = InitInp%UnSum + InputFileData%Waves%Gravity = InitInp%Gravity + InputFileData%Waves%UnSum = InputFileData%UnSum ! For wave kinematic calculations, the effective water depth is the user input water depth (positive valued) + MSL2SWL (positive when SWL is above MSL). - InitInp%Waves%WtrDpth = InitInp%Morison%WtrDpth ! already adjusted for the MSL2SWL. + InputFileData%Waves%WtrDpth = InputFileData%Morison%WtrDpth ! already adjusted for the MSL2SWL. ! Waves2 - IF (InitInp%Waves2%WvDiffQTFF .OR. InitInp%Waves2%WvSumQTFF ) THEN - InitInp%Waves2%WtrDens = InitInp%Waves%WtrDens - InitInp%Waves2%Gravity = InitInp%Gravity - InitInp%Waves2%UnSum = InitInp%UnSum - InitInp%Waves2%WtrDpth = InitInp%Waves%WtrDpth - InitInp%Waves2%WaveStMod = InitInp%Waves%WaveStMod - InitInp%Waves2%NWaveElev = InitInp%Waves%NWaveElev - CALL AllocAry( InitInp%Waves2%WaveElevxi, InitInp%Waves2%NWaveElev, 'WaveElevxi' , ErrStat2, ErrMsg2) + IF (InputFileData%Waves2%WvDiffQTFF .OR. InputFileData%Waves2%WvSumQTFF ) THEN + InputFileData%Waves2%WtrDens = InputFileData%Waves%WtrDens + InputFileData%Waves2%Gravity = InitInp%Gravity + InputFileData%Waves2%UnSum = InputFileData%UnSum + InputFileData%Waves2%WtrDpth = InputFileData%Waves%WtrDpth + InputFileData%Waves2%WaveStMod = InputFileData%Waves%WaveStMod + InputFileData%Waves2%NWaveElev = InputFileData%Waves%NWaveElev + CALL AllocAry( InputFileData%Waves2%WaveElevxi, InputFileData%Waves2%NWaveElev, 'WaveElevxi' , ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - CALL AllocAry( InitInp%Waves2%WaveElevyi, InitInp%Waves2%NWaveElev, 'WaveElevyi' , ErrStat2, ErrMsg2) + CALL AllocAry( InputFileData%Waves2%WaveElevyi, InputFileData%Waves2%NWaveElev, 'WaveElevyi' , ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) IF ( ErrStat >= AbortErrLev ) RETURN - InitInp%Waves2%WaveElevxi = InitInp%Waves%WaveElevxi - InitInp%Waves2%WaveElevyi = InitInp%Waves%WaveElevyi + InputFileData%Waves2%WaveElevxi = InputFileData%Waves%WaveElevxi + InputFileData%Waves2%WaveElevyi = InputFileData%Waves%WaveElevyi ENDIF ! WAMIT - InitInp%WAMIT%WtrDens = InitInp%Waves%WtrDens - InitInp%WAMIT%WaveMod = InitInp%Waves%WaveMod - InitInp%WAMIT%OutAll = InitInp%OutAll - InitInp%WAMIT%HasWAMIT = InitInp%PotMod == 1 + InputFileData%WAMIT%WtrDens = InputFileData%Waves%WtrDens + InputFileData%WAMIT%WaveMod = InputFileData%Waves%WaveMod + InputFileData%WAMIT%OutAll = InputFileData%OutAll + InputFileData%WAMIT%HasWAMIT = InputFileData%PotMod == 1 ! WAMIT2 - InitInp%WAMIT2%WtrDens = InitInp%Waves%WtrDens - InitInp%WAMIT2%WaveMod = InitInp%Waves%WaveMod - InitInp%WAMIT2%HasWAMIT = InitInp%PotMod == 1 + InputFileData%WAMIT2%WtrDens = InputFileData%Waves%WtrDens + InputFileData%WAMIT2%WaveMod = InputFileData%Waves%WaveMod + InputFileData%WAMIT2%HasWAMIT = InputFileData%PotMod == 1 ! Morison - InitInp%Morison%UnSum = InitInp%UnSum - InitInp%Morison%Gravity = InitInp%Gravity - InitInp%Morison%WtrDens = InitInp%Waves%WtrDens - InitInp%Morison%OutAll = InitInp%OutAll + InputFileData%Morison%UnSum = InputFileData%UnSum + InputFileData%Morison%Gravity = InitInp%Gravity + InputFileData%Morison%WtrDens = InputFileData%Waves%WtrDens + InputFileData%Morison%OutAll = InputFileData%OutAll ! Process the input geometry and generate the simulation mesh representation - call Morison_GenerateSimulationNodes( InitInp%Morison%MSL2SWL, InitInp%Morison%NJoints, InitInp%Morison%InpJoints, InitInp%Morison%NMembers, InitInp%Morison%InpMembers, InitInp%Morison%NNodes, InitInp%Morison%Nodes, errStat2, errMsg2 ) - !CALL Morison_ProcessMorisonGeometry( InitInp%Morison, ErrStat2, ErrMsg2 ) + call Morison_GenerateSimulationNodes( InputFileData%Morison%MSL2SWL, InputFileData%Morison%NJoints, InputFileData%Morison%InpJoints, InputFileData%Morison%NMembers, InputFileData%Morison%InpMembers, InputFileData%Morison%NNodes, InputFileData%Morison%Nodes, errStat2, errMsg2 ) + !CALL Morison_ProcessMorisonGeometry( InputFileData%Morison, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) IF ( ErrStat >= AbortErrLev ) RETURN ! Set the number and global Z locations for the X and Y components of the current velocities - InitInp%Current%NMorisonNodes = InitInp%Morison%NNodes + InputFileData%Current%NMorisonNodes = InputFileData%Morison%NNodes - ALLOCATE ( InitInp%Current%MorisonNodezi(InitInp%Morison%NNodes), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Current%MorisonNodezi(InputFileData%Morison%NNodes), STAT = ErrStat2 ) IF ( ErrStat2 /= ErrID_None ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for MorisonNodezi array.',ErrStat,ErrMsg,RoutineName) RETURN @@ -4269,54 +3199,54 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, ErrStat, ErrMsg ) ! Establish the number and locations where the wave kinematics will be computed - InitInp%Waves%NWaveKin = InitInp%Morison%NNodes ! Number of points where the incident wave kinematics will be computed (-) - ALLOCATE ( InitInp%Waves%WaveKinxi(InitInp%Waves%NWaveKin), STAT = ErrStat2 ) + InputFileData%Waves%NWaveKin = InputFileData%Morison%NNodes ! Number of points where the incident wave kinematics will be computed (-) + ALLOCATE ( InputFileData%Waves%WaveKinxi(InputFileData%Waves%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= ErrID_None ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for WaveKinxi array.',ErrStat,ErrMsg,RoutineName) RETURN END IF - ALLOCATE ( InitInp%Waves%WaveKinyi(InitInp%Waves%NWaveKin), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Waves%WaveKinyi(InputFileData%Waves%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= ErrID_None ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for WaveKinyi array.',ErrStat,ErrMsg,RoutineName) RETURN END IF - ALLOCATE ( InitInp%Waves%WaveKinzi(InitInp%Waves%NWaveKin), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Waves%WaveKinzi(InputFileData%Waves%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= ErrID_None ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for WaveKinzi array.',ErrStat,ErrMsg,RoutineName) RETURN END IF - DO I=1,InitInp%Morison%NNodes - InitInp%Waves%WaveKinxi(I) = InitInp%Morison%Nodes(I)%Position(1) ! xi-coordinates for points where the incident wave kinematics will be computed; - InitInp%Waves%WaveKinyi(I) = InitInp%Morison%Nodes(I)%Position(2) ! yi-coordinates for points where the incident wave kinematics will be computed; - InitInp%Waves%WaveKinzi(I) = InitInp%Morison%Nodes(I)%Position(3) ! zi-coordinates for points where the incident wave kinematics will be computed; - InitInp%Current%MorisonNodezi(I) = InitInp%Waves%WaveKinzi(I) + DO I=1,InputFileData%Morison%NNodes + InputFileData%Waves%WaveKinxi(I) = InputFileData%Morison%Nodes(I)%Position(1) ! xi-coordinates for points where the incident wave kinematics will be computed; + InputFileData%Waves%WaveKinyi(I) = InputFileData%Morison%Nodes(I)%Position(2) ! yi-coordinates for points where the incident wave kinematics will be computed; + InputFileData%Waves%WaveKinzi(I) = InputFileData%Morison%Nodes(I)%Position(3) ! zi-coordinates for points where the incident wave kinematics will be computed; + InputFileData%Current%MorisonNodezi(I) = InputFileData%Waves%WaveKinzi(I) END DO ! If we are using the Waves module, the node information must be copied over. - InitInp%Waves2%NWaveKin = InitInp%Waves%NWaveKin ! Number of points where the incident wave kinematics will be computed (-) - IF ( InitInp%Waves2%WvDiffQTFF .OR. InitInp%Waves2%WvSumQTFF ) THEN - ALLOCATE ( InitInp%Waves2%WaveKinxi(InitInp%Waves2%NWaveKin), STAT = ErrStat2 ) + InputFileData%Waves2%NWaveKin = InputFileData%Waves%NWaveKin ! Number of points where the incident wave kinematics will be computed (-) + IF ( InputFileData%Waves2%WvDiffQTFF .OR. InputFileData%Waves2%WvSumQTFF ) THEN + ALLOCATE ( InputFileData%Waves2%WaveKinxi(InputFileData%Waves2%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= ErrID_None ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for WaveKinxi array for Waves2 module.',ErrStat,ErrMsg,RoutineName) RETURN END IF - ALLOCATE ( InitInp%Waves2%WaveKinyi(InitInp%Waves2%NWaveKin), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Waves2%WaveKinyi(InputFileData%Waves2%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= ErrID_None ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for WaveKinyi array for Waves2 module.',ErrStat,ErrMsg,RoutineName) RETURN END IF - ALLOCATE ( InitInp%Waves2%WaveKinzi(InitInp%Waves2%NWaveKin), STAT = ErrStat2 ) + ALLOCATE ( InputFileData%Waves2%WaveKinzi(InputFileData%Waves2%NWaveKin), STAT = ErrStat2 ) IF ( ErrStat2 /= ErrID_None ) THEN CALL SetErrStat( ErrID_Fatal,'Error allocating space for WaveKinzi array for Waves2 module.',ErrStat,ErrMsg,RoutineName) RETURN END IF - InitInp%Waves2%WaveKinxi = InitInp%Waves%WaveKinxi - InitInp%Waves2%WaveKinyi = InitInp%Waves%WaveKinyi - InitInp%Waves2%WaveKinzi = InitInp%Waves%WaveKinzi + InputFileData%Waves2%WaveKinxi = InputFileData%Waves%WaveKinxi + InputFileData%Waves2%WaveKinyi = InputFileData%Waves%WaveKinyi + InputFileData%Waves2%WaveKinzi = InputFileData%Waves%WaveKinzi ENDIF diff --git a/modules/hydrodyn/src/HydroDyn_Output.f90 b/modules/hydrodyn/src/HydroDyn_Output.f90 index 845eddc397..590eeb1290 100644 --- a/modules/hydrodyn/src/HydroDyn_Output.f90 +++ b/modules/hydrodyn/src/HydroDyn_Output.f90 @@ -1279,7 +1279,7 @@ SUBROUTINE HDOut_WriteOutputs( Time, y, p, Decimate, ErrStat, ErrMsg ) END SUBROUTINE HDOut_WriteOutputs !==================================================================================================== -SUBROUTINE HDOUT_Init( HydroDyn_ProgDesc, InitInp, y, p, m, InitOut, ErrStat, ErrMsg ) +SUBROUTINE HDOUT_Init( HydroDyn_ProgDesc, OutRootName, InputFileData, y, p, m, InitOut, ErrStat, ErrMsg ) ! This subroutine initialized the output module, checking if the output parameter list (OutList) ! contains valid names, and opening the output file if there are any requested outputs ! NOTE: This routine must be called only after any sub-modules OUT_Init() subroutines have been called. @@ -1290,7 +1290,8 @@ SUBROUTINE HDOUT_Init( HydroDyn_ProgDesc, InitInp, y, p, m, InitOut, ErrStat, E ! Passed variables TYPE(ProgDesc), INTENT( IN ) :: HydroDyn_ProgDesc ! - TYPE(HydroDyn_InitInputType ), INTENT( IN ) :: InitInp ! data needed to initialize the output module + CHARACTER(1024), INTENT( IN ) :: OutRootName ! The name of the output file + TYPE(HydroDyn_InputFile ), INTENT( IN ) :: InputFileData ! data needed to initialize the output module TYPE(HydroDyn_OutputType), INTENT( INOUT ) :: y ! This module's internal data TYPE(HydroDyn_ParameterType), INTENT( INOUT ) :: p TYPE(HydroDyn_MiscVarType), INTENT( INOUT ) :: m @@ -1339,7 +1340,7 @@ SUBROUTINE HDOUT_Init( HydroDyn_ProgDesc, InitInp, y, p, m, InitOut, ErrStat, E !------------------------------------------------------------------------------------------------- - CALL HDOUT_ChkOutLst( InitInp%OutList(1:p%NumOuts), y, p, ErrStat, ErrMsg ) + CALL HDOUT_ChkOutLst( InputFileData%OutList(1:p%NumOuts), y, p, ErrStat, ErrMsg ) IF ( ErrStat /= 0 ) RETURN ! Aggregate the sub-module initialization outputs for the glue code @@ -1414,7 +1415,7 @@ SUBROUTINE HDOUT_Init( HydroDyn_ProgDesc, InitInp, y, p, m, InitOut, ErrStat, E END IF IF ( p%OutSwtch == 1 .OR. p%OutSwtch == 3 ) THEN - CALL HDOut_OpenOutput( HydroDyn_ProgDesc, InitInp%OutRootName, p, InitOut, ErrStat, ErrMsg ) + CALL HDOut_OpenOutput( HydroDyn_ProgDesc, OutRootName, p, InitOut, ErrStat, ErrMsg ) IF (ErrStat >= AbortErrLev ) RETURN END IF diff --git a/modules/hydrodyn/src/HydroDyn_Types.f90 b/modules/hydrodyn/src/HydroDyn_Types.f90 index 0b3a26632e..3397982a00 100644 --- a/modules/hydrodyn/src/HydroDyn_Types.f90 +++ b/modules/hydrodyn/src/HydroDyn_Types.f90 @@ -39,22 +39,10 @@ MODULE HydroDyn_Types USE NWTC_Library IMPLICIT NONE INTEGER(IntKi), PUBLIC, PARAMETER :: MaxHDOutputs = 537 ! The maximum number of output channels supported by this module [-] -! ========= HydroDyn_InitInputType ======= - TYPE, PUBLIC :: HydroDyn_InitInputType - CHARACTER(1024) :: InputFile !< Supplied by Driver: full path and filename for the HydroDyn module [-] - LOGICAL :: UseInputFile !< Supplied by Driver: .TRUE. if using a input file, .FALSE. if all inputs are being passed in by the caller [-] - CHARACTER(1024) :: OutRootName !< Supplied by Driver: The name of the root file (without extension) including the full path [-] - LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] - REAL(DbKi) :: DT !< Supplied by Driver: Simulation time step [(sec)] - REAL(ReKi) :: Gravity !< Supplied by Driver: Gravitational acceleration [(m/s^2)] - REAL(ReKi) :: defWtrDens !< Default water density from the driver; may be overwritten [(kg/m^3)] - REAL(ReKi) :: defWtrDpth !< Default water depth from the driver; may be overwritten [m] - REAL(ReKi) :: defMSL2SWL !< Default mean sea level to still water level from the driver; may be overwritten [m] - REAL(DbKi) :: TMax !< Supplied by Driver: The total simulation time [(sec)] - LOGICAL :: HasIce !< Supplied by Driver: Whether this simulation has ice loading (flag) [-] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevXY !< Supplied by Driver: X-Y locations for WaveElevation output (for visualization). First dimension is the X (1) and Y (2) coordinate. Second dimension is the point number. [m,-] - REAL(ReKi) :: PtfmLocationX !< Supplied by Driver: X coordinate of platform location in the wave field [m] - REAL(ReKi) :: PtfmLocationY !< Supplied by Driver: Y coordinate of platform location in the wave field [m] + INTEGER(IntKi), PUBLIC, PARAMETER :: MaxUserOutputs = 4583 ! Total possible number of output channels: Waves2 = 18 + SS_Excitation = 7 + SS_Radiation = 7 + Morison= 4032 + HydroDyn=519 = 4583 [-] +! ========= HydroDyn_InputFile ======= + TYPE, PUBLIC :: HydroDyn_InputFile + LOGICAL :: EchoFlag !< Echo the input file [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: AddF0 !< Additional pre-load forces and moments (N,N,N,N-m,N-m,N-m) [-] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: AddCLin !< Additional stiffness matrix [-] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: AddBLin !< Additional linear damping matrix [-] @@ -91,6 +79,24 @@ MODULE HydroDyn_Types INTEGER(IntKi) :: UnSum !< File unit for the HydroDyn summary file [-1 = no summary file] [-] CHARACTER(20) :: OutFmt !< Output format for numerical results [-] CHARACTER(20) :: OutSFmt !< Output format for header strings [-] + END TYPE HydroDyn_InputFile +! ======================= +! ========= HydroDyn_InitInputType ======= + TYPE, PUBLIC :: HydroDyn_InitInputType + CHARACTER(1024) :: InputFile !< Supplied by Driver: full path and filename for the HydroDyn module [-] + LOGICAL :: UseInputFile = .TRUE. !< Supplied by Driver: .TRUE. if using a input file, .FALSE. if all inputs are being passed in by the caller [-] + TYPE(FileInfoType) :: PassedFileData !< If we don't use the input file, pass everything through this [-] + CHARACTER(1024) :: OutRootName !< Supplied by Driver: The name of the root file (without extension) including the full path [-] + LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] + REAL(ReKi) :: Gravity !< Supplied by Driver: Gravitational acceleration [(m/s^2)] + REAL(ReKi) :: defWtrDens !< Default water density from the driver; may be overwritten [(kg/m^3)] + REAL(ReKi) :: defWtrDpth !< Default water depth from the driver; may be overwritten [m] + REAL(ReKi) :: defMSL2SWL !< Default mean sea level to still water level from the driver; may be overwritten [m] + REAL(DbKi) :: TMax !< Supplied by Driver: The total simulation time [(sec)] + LOGICAL :: HasIce !< Supplied by Driver: Whether this simulation has ice loading (flag) [-] + REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevXY !< Supplied by Driver: X-Y locations for WaveElevation output (for visualization). First dimension is the X (1) and Y (2) coordinate. Second dimension is the point number. [m,-] + REAL(ReKi) :: PtfmLocationX !< Supplied by Driver: X coordinate of platform location in the wave field [m] + REAL(ReKi) :: PtfmLocationY !< Supplied by Driver: Y coordinate of platform location in the wave field [m] END TYPE HydroDyn_InitInputType ! ======================= ! ========= HydroDyn_InitOutputType ======= @@ -232,9 +238,9 @@ MODULE HydroDyn_Types END TYPE HydroDyn_OutputType ! ======================= CONTAINS - SUBROUTINE HydroDyn_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(HydroDyn_InitInputType), INTENT(IN) :: SrcInitInputData - TYPE(HydroDyn_InitInputType), INTENT(INOUT) :: DstInitInputData + SUBROUTINE HydroDyn_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) + TYPE(HydroDyn_InputFile), INTENT(IN) :: SrcInputFileData + TYPE(HydroDyn_InputFile), INTENT(INOUT) :: DstInputFileData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -245,336 +251,307 @@ SUBROUTINE HydroDyn_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_CopyInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_CopyInputFile' ! ErrStat = ErrID_None ErrMsg = "" - DstInitInputData%InputFile = SrcInitInputData%InputFile - DstInitInputData%UseInputFile = SrcInitInputData%UseInputFile - DstInitInputData%OutRootName = SrcInitInputData%OutRootName - DstInitInputData%Linearize = SrcInitInputData%Linearize - DstInitInputData%DT = SrcInitInputData%DT - DstInitInputData%Gravity = SrcInitInputData%Gravity - DstInitInputData%defWtrDens = SrcInitInputData%defWtrDens - DstInitInputData%defWtrDpth = SrcInitInputData%defWtrDpth - DstInitInputData%defMSL2SWL = SrcInitInputData%defMSL2SWL - DstInitInputData%TMax = SrcInitInputData%TMax - DstInitInputData%HasIce = SrcInitInputData%HasIce -IF (ALLOCATED(SrcInitInputData%WaveElevXY)) THEN - i1_l = LBOUND(SrcInitInputData%WaveElevXY,1) - i1_u = UBOUND(SrcInitInputData%WaveElevXY,1) - i2_l = LBOUND(SrcInitInputData%WaveElevXY,2) - i2_u = UBOUND(SrcInitInputData%WaveElevXY,2) - IF (.NOT. ALLOCATED(DstInitInputData%WaveElevXY)) THEN - ALLOCATE(DstInitInputData%WaveElevXY(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveElevXY.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitInputData%WaveElevXY = SrcInitInputData%WaveElevXY -ENDIF - DstInitInputData%PtfmLocationX = SrcInitInputData%PtfmLocationX - DstInitInputData%PtfmLocationY = SrcInitInputData%PtfmLocationY -IF (ALLOCATED(SrcInitInputData%AddF0)) THEN - i1_l = LBOUND(SrcInitInputData%AddF0,1) - i1_u = UBOUND(SrcInitInputData%AddF0,1) - i2_l = LBOUND(SrcInitInputData%AddF0,2) - i2_u = UBOUND(SrcInitInputData%AddF0,2) - IF (.NOT. ALLOCATED(DstInitInputData%AddF0)) THEN - ALLOCATE(DstInitInputData%AddF0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + DstInputFileData%EchoFlag = SrcInputFileData%EchoFlag +IF (ALLOCATED(SrcInputFileData%AddF0)) THEN + i1_l = LBOUND(SrcInputFileData%AddF0,1) + i1_u = UBOUND(SrcInputFileData%AddF0,1) + i2_l = LBOUND(SrcInputFileData%AddF0,2) + i2_u = UBOUND(SrcInputFileData%AddF0,2) + IF (.NOT. ALLOCATED(DstInputFileData%AddF0)) THEN + ALLOCATE(DstInputFileData%AddF0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%AddF0.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%AddF0.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%AddF0 = SrcInitInputData%AddF0 + DstInputFileData%AddF0 = SrcInputFileData%AddF0 ENDIF -IF (ALLOCATED(SrcInitInputData%AddCLin)) THEN - i1_l = LBOUND(SrcInitInputData%AddCLin,1) - i1_u = UBOUND(SrcInitInputData%AddCLin,1) - i2_l = LBOUND(SrcInitInputData%AddCLin,2) - i2_u = UBOUND(SrcInitInputData%AddCLin,2) - i3_l = LBOUND(SrcInitInputData%AddCLin,3) - i3_u = UBOUND(SrcInitInputData%AddCLin,3) - IF (.NOT. ALLOCATED(DstInitInputData%AddCLin)) THEN - ALLOCATE(DstInitInputData%AddCLin(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInputFileData%AddCLin)) THEN + i1_l = LBOUND(SrcInputFileData%AddCLin,1) + i1_u = UBOUND(SrcInputFileData%AddCLin,1) + i2_l = LBOUND(SrcInputFileData%AddCLin,2) + i2_u = UBOUND(SrcInputFileData%AddCLin,2) + i3_l = LBOUND(SrcInputFileData%AddCLin,3) + i3_u = UBOUND(SrcInputFileData%AddCLin,3) + IF (.NOT. ALLOCATED(DstInputFileData%AddCLin)) THEN + ALLOCATE(DstInputFileData%AddCLin(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%AddCLin.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%AddCLin.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%AddCLin = SrcInitInputData%AddCLin + DstInputFileData%AddCLin = SrcInputFileData%AddCLin ENDIF -IF (ALLOCATED(SrcInitInputData%AddBLin)) THEN - i1_l = LBOUND(SrcInitInputData%AddBLin,1) - i1_u = UBOUND(SrcInitInputData%AddBLin,1) - i2_l = LBOUND(SrcInitInputData%AddBLin,2) - i2_u = UBOUND(SrcInitInputData%AddBLin,2) - i3_l = LBOUND(SrcInitInputData%AddBLin,3) - i3_u = UBOUND(SrcInitInputData%AddBLin,3) - IF (.NOT. ALLOCATED(DstInitInputData%AddBLin)) THEN - ALLOCATE(DstInitInputData%AddBLin(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInputFileData%AddBLin)) THEN + i1_l = LBOUND(SrcInputFileData%AddBLin,1) + i1_u = UBOUND(SrcInputFileData%AddBLin,1) + i2_l = LBOUND(SrcInputFileData%AddBLin,2) + i2_u = UBOUND(SrcInputFileData%AddBLin,2) + i3_l = LBOUND(SrcInputFileData%AddBLin,3) + i3_u = UBOUND(SrcInputFileData%AddBLin,3) + IF (.NOT. ALLOCATED(DstInputFileData%AddBLin)) THEN + ALLOCATE(DstInputFileData%AddBLin(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%AddBLin.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%AddBLin.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%AddBLin = SrcInitInputData%AddBLin + DstInputFileData%AddBLin = SrcInputFileData%AddBLin ENDIF -IF (ALLOCATED(SrcInitInputData%AddBQuad)) THEN - i1_l = LBOUND(SrcInitInputData%AddBQuad,1) - i1_u = UBOUND(SrcInitInputData%AddBQuad,1) - i2_l = LBOUND(SrcInitInputData%AddBQuad,2) - i2_u = UBOUND(SrcInitInputData%AddBQuad,2) - i3_l = LBOUND(SrcInitInputData%AddBQuad,3) - i3_u = UBOUND(SrcInitInputData%AddBQuad,3) - IF (.NOT. ALLOCATED(DstInitInputData%AddBQuad)) THEN - ALLOCATE(DstInitInputData%AddBQuad(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInputFileData%AddBQuad)) THEN + i1_l = LBOUND(SrcInputFileData%AddBQuad,1) + i1_u = UBOUND(SrcInputFileData%AddBQuad,1) + i2_l = LBOUND(SrcInputFileData%AddBQuad,2) + i2_u = UBOUND(SrcInputFileData%AddBQuad,2) + i3_l = LBOUND(SrcInputFileData%AddBQuad,3) + i3_u = UBOUND(SrcInputFileData%AddBQuad,3) + IF (.NOT. ALLOCATED(DstInputFileData%AddBQuad)) THEN + ALLOCATE(DstInputFileData%AddBQuad(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%AddBQuad.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%AddBQuad.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%AddBQuad = SrcInitInputData%AddBQuad + DstInputFileData%AddBQuad = SrcInputFileData%AddBQuad ENDIF - CALL Waves_CopyInitInput( SrcInitInputData%Waves, DstInitInputData%Waves, CtrlCode, ErrStat2, ErrMsg2 ) + CALL Waves_CopyInitInput( SrcInputFileData%Waves, DstInputFileData%Waves, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL Waves2_CopyInitInput( SrcInitInputData%Waves2, DstInitInputData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL Waves2_CopyInitInput( SrcInputFileData%Waves2, DstInputFileData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL Current_CopyInitInput( SrcInitInputData%Current, DstInitInputData%Current, CtrlCode, ErrStat2, ErrMsg2 ) + CALL Current_CopyInitInput( SrcInputFileData%Current, DstInputFileData%Current, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN -IF (ALLOCATED(SrcInitInputData%PotFile)) THEN - i1_l = LBOUND(SrcInitInputData%PotFile,1) - i1_u = UBOUND(SrcInitInputData%PotFile,1) - IF (.NOT. ALLOCATED(DstInitInputData%PotFile)) THEN - ALLOCATE(DstInitInputData%PotFile(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInputFileData%PotFile)) THEN + i1_l = LBOUND(SrcInputFileData%PotFile,1) + i1_u = UBOUND(SrcInputFileData%PotFile,1) + IF (.NOT. ALLOCATED(DstInputFileData%PotFile)) THEN + ALLOCATE(DstInputFileData%PotFile(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%PotFile.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PotFile.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%PotFile = SrcInitInputData%PotFile + DstInputFileData%PotFile = SrcInputFileData%PotFile ENDIF - DstInitInputData%nWAMITObj = SrcInitInputData%nWAMITObj - DstInitInputData%vecMultiplier = SrcInitInputData%vecMultiplier - DstInitInputData%NBody = SrcInitInputData%NBody - DstInitInputData%NBodyMod = SrcInitInputData%NBodyMod -IF (ALLOCATED(SrcInitInputData%PtfmVol0)) THEN - i1_l = LBOUND(SrcInitInputData%PtfmVol0,1) - i1_u = UBOUND(SrcInitInputData%PtfmVol0,1) - IF (.NOT. ALLOCATED(DstInitInputData%PtfmVol0)) THEN - ALLOCATE(DstInitInputData%PtfmVol0(i1_l:i1_u),STAT=ErrStat2) + DstInputFileData%nWAMITObj = SrcInputFileData%nWAMITObj + DstInputFileData%vecMultiplier = SrcInputFileData%vecMultiplier + DstInputFileData%NBody = SrcInputFileData%NBody + DstInputFileData%NBodyMod = SrcInputFileData%NBodyMod +IF (ALLOCATED(SrcInputFileData%PtfmVol0)) THEN + i1_l = LBOUND(SrcInputFileData%PtfmVol0,1) + i1_u = UBOUND(SrcInputFileData%PtfmVol0,1) + IF (.NOT. ALLOCATED(DstInputFileData%PtfmVol0)) THEN + ALLOCATE(DstInputFileData%PtfmVol0(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%PtfmVol0.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PtfmVol0.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%PtfmVol0 = SrcInitInputData%PtfmVol0 + DstInputFileData%PtfmVol0 = SrcInputFileData%PtfmVol0 ENDIF - DstInitInputData%HasWAMIT = SrcInitInputData%HasWAMIT -IF (ALLOCATED(SrcInitInputData%WAMITULEN)) THEN - i1_l = LBOUND(SrcInitInputData%WAMITULEN,1) - i1_u = UBOUND(SrcInitInputData%WAMITULEN,1) - IF (.NOT. ALLOCATED(DstInitInputData%WAMITULEN)) THEN - ALLOCATE(DstInitInputData%WAMITULEN(i1_l:i1_u),STAT=ErrStat2) + DstInputFileData%HasWAMIT = SrcInputFileData%HasWAMIT +IF (ALLOCATED(SrcInputFileData%WAMITULEN)) THEN + i1_l = LBOUND(SrcInputFileData%WAMITULEN,1) + i1_u = UBOUND(SrcInputFileData%WAMITULEN,1) + IF (.NOT. ALLOCATED(DstInputFileData%WAMITULEN)) THEN + ALLOCATE(DstInputFileData%WAMITULEN(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WAMITULEN.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%WAMITULEN.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%WAMITULEN = SrcInitInputData%WAMITULEN + DstInputFileData%WAMITULEN = SrcInputFileData%WAMITULEN ENDIF -IF (ALLOCATED(SrcInitInputData%PtfmRefxt)) THEN - i1_l = LBOUND(SrcInitInputData%PtfmRefxt,1) - i1_u = UBOUND(SrcInitInputData%PtfmRefxt,1) - IF (.NOT. ALLOCATED(DstInitInputData%PtfmRefxt)) THEN - ALLOCATE(DstInitInputData%PtfmRefxt(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInputFileData%PtfmRefxt)) THEN + i1_l = LBOUND(SrcInputFileData%PtfmRefxt,1) + i1_u = UBOUND(SrcInputFileData%PtfmRefxt,1) + IF (.NOT. ALLOCATED(DstInputFileData%PtfmRefxt)) THEN + ALLOCATE(DstInputFileData%PtfmRefxt(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%PtfmRefxt.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PtfmRefxt.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%PtfmRefxt = SrcInitInputData%PtfmRefxt + DstInputFileData%PtfmRefxt = SrcInputFileData%PtfmRefxt ENDIF -IF (ALLOCATED(SrcInitInputData%PtfmRefyt)) THEN - i1_l = LBOUND(SrcInitInputData%PtfmRefyt,1) - i1_u = UBOUND(SrcInitInputData%PtfmRefyt,1) - IF (.NOT. ALLOCATED(DstInitInputData%PtfmRefyt)) THEN - ALLOCATE(DstInitInputData%PtfmRefyt(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInputFileData%PtfmRefyt)) THEN + i1_l = LBOUND(SrcInputFileData%PtfmRefyt,1) + i1_u = UBOUND(SrcInputFileData%PtfmRefyt,1) + IF (.NOT. ALLOCATED(DstInputFileData%PtfmRefyt)) THEN + ALLOCATE(DstInputFileData%PtfmRefyt(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%PtfmRefyt.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PtfmRefyt.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%PtfmRefyt = SrcInitInputData%PtfmRefyt + DstInputFileData%PtfmRefyt = SrcInputFileData%PtfmRefyt ENDIF -IF (ALLOCATED(SrcInitInputData%PtfmRefzt)) THEN - i1_l = LBOUND(SrcInitInputData%PtfmRefzt,1) - i1_u = UBOUND(SrcInitInputData%PtfmRefzt,1) - IF (.NOT. ALLOCATED(DstInitInputData%PtfmRefzt)) THEN - ALLOCATE(DstInitInputData%PtfmRefzt(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInputFileData%PtfmRefzt)) THEN + i1_l = LBOUND(SrcInputFileData%PtfmRefzt,1) + i1_u = UBOUND(SrcInputFileData%PtfmRefzt,1) + IF (.NOT. ALLOCATED(DstInputFileData%PtfmRefzt)) THEN + ALLOCATE(DstInputFileData%PtfmRefzt(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%PtfmRefzt.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PtfmRefzt.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%PtfmRefzt = SrcInitInputData%PtfmRefzt + DstInputFileData%PtfmRefzt = SrcInputFileData%PtfmRefzt ENDIF -IF (ALLOCATED(SrcInitInputData%PtfmRefztRot)) THEN - i1_l = LBOUND(SrcInitInputData%PtfmRefztRot,1) - i1_u = UBOUND(SrcInitInputData%PtfmRefztRot,1) - IF (.NOT. ALLOCATED(DstInitInputData%PtfmRefztRot)) THEN - ALLOCATE(DstInitInputData%PtfmRefztRot(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInputFileData%PtfmRefztRot)) THEN + i1_l = LBOUND(SrcInputFileData%PtfmRefztRot,1) + i1_u = UBOUND(SrcInputFileData%PtfmRefztRot,1) + IF (.NOT. ALLOCATED(DstInputFileData%PtfmRefztRot)) THEN + ALLOCATE(DstInputFileData%PtfmRefztRot(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%PtfmRefztRot.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PtfmRefztRot.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%PtfmRefztRot = SrcInitInputData%PtfmRefztRot + DstInputFileData%PtfmRefztRot = SrcInputFileData%PtfmRefztRot ENDIF -IF (ALLOCATED(SrcInitInputData%PtfmCOBxt)) THEN - i1_l = LBOUND(SrcInitInputData%PtfmCOBxt,1) - i1_u = UBOUND(SrcInitInputData%PtfmCOBxt,1) - IF (.NOT. ALLOCATED(DstInitInputData%PtfmCOBxt)) THEN - ALLOCATE(DstInitInputData%PtfmCOBxt(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInputFileData%PtfmCOBxt)) THEN + i1_l = LBOUND(SrcInputFileData%PtfmCOBxt,1) + i1_u = UBOUND(SrcInputFileData%PtfmCOBxt,1) + IF (.NOT. ALLOCATED(DstInputFileData%PtfmCOBxt)) THEN + ALLOCATE(DstInputFileData%PtfmCOBxt(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%PtfmCOBxt.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PtfmCOBxt.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%PtfmCOBxt = SrcInitInputData%PtfmCOBxt + DstInputFileData%PtfmCOBxt = SrcInputFileData%PtfmCOBxt ENDIF -IF (ALLOCATED(SrcInitInputData%PtfmCOByt)) THEN - i1_l = LBOUND(SrcInitInputData%PtfmCOByt,1) - i1_u = UBOUND(SrcInitInputData%PtfmCOByt,1) - IF (.NOT. ALLOCATED(DstInitInputData%PtfmCOByt)) THEN - ALLOCATE(DstInitInputData%PtfmCOByt(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInputFileData%PtfmCOByt)) THEN + i1_l = LBOUND(SrcInputFileData%PtfmCOByt,1) + i1_u = UBOUND(SrcInputFileData%PtfmCOByt,1) + IF (.NOT. ALLOCATED(DstInputFileData%PtfmCOByt)) THEN + ALLOCATE(DstInputFileData%PtfmCOByt(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%PtfmCOByt.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PtfmCOByt.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%PtfmCOByt = SrcInitInputData%PtfmCOByt + DstInputFileData%PtfmCOByt = SrcInputFileData%PtfmCOByt ENDIF - CALL WAMIT_CopyInitInput( SrcInitInputData%WAMIT, DstInitInputData%WAMIT, CtrlCode, ErrStat2, ErrMsg2 ) + CALL WAMIT_CopyInitInput( SrcInputFileData%WAMIT, DstInputFileData%WAMIT, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL WAMIT2_CopyInitInput( SrcInitInputData%WAMIT2, DstInitInputData%WAMIT2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL WAMIT2_CopyInitInput( SrcInputFileData%WAMIT2, DstInputFileData%WAMIT2, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL Morison_CopyInitInput( SrcInitInputData%Morison, DstInitInputData%Morison, CtrlCode, ErrStat2, ErrMsg2 ) + CALL Morison_CopyInitInput( SrcInputFileData%Morison, DstInputFileData%Morison, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - DstInitInputData%Echo = SrcInitInputData%Echo - DstInitInputData%PotMod = SrcInitInputData%PotMod - DstInitInputData%NUserOutputs = SrcInitInputData%NUserOutputs -IF (ALLOCATED(SrcInitInputData%UserOutputs)) THEN - i1_l = LBOUND(SrcInitInputData%UserOutputs,1) - i1_u = UBOUND(SrcInitInputData%UserOutputs,1) - IF (.NOT. ALLOCATED(DstInitInputData%UserOutputs)) THEN - ALLOCATE(DstInitInputData%UserOutputs(i1_l:i1_u),STAT=ErrStat2) + DstInputFileData%Echo = SrcInputFileData%Echo + DstInputFileData%PotMod = SrcInputFileData%PotMod + DstInputFileData%NUserOutputs = SrcInputFileData%NUserOutputs +IF (ALLOCATED(SrcInputFileData%UserOutputs)) THEN + i1_l = LBOUND(SrcInputFileData%UserOutputs,1) + i1_u = UBOUND(SrcInputFileData%UserOutputs,1) + IF (.NOT. ALLOCATED(DstInputFileData%UserOutputs)) THEN + ALLOCATE(DstInputFileData%UserOutputs(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%UserOutputs.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%UserOutputs.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%UserOutputs = SrcInitInputData%UserOutputs + DstInputFileData%UserOutputs = SrcInputFileData%UserOutputs ENDIF - DstInitInputData%OutSwtch = SrcInitInputData%OutSwtch - DstInitInputData%OutAll = SrcInitInputData%OutAll - DstInitInputData%NumOuts = SrcInitInputData%NumOuts -IF (ALLOCATED(SrcInitInputData%OutList)) THEN - i1_l = LBOUND(SrcInitInputData%OutList,1) - i1_u = UBOUND(SrcInitInputData%OutList,1) - IF (.NOT. ALLOCATED(DstInitInputData%OutList)) THEN - ALLOCATE(DstInitInputData%OutList(i1_l:i1_u),STAT=ErrStat2) + DstInputFileData%OutSwtch = SrcInputFileData%OutSwtch + DstInputFileData%OutAll = SrcInputFileData%OutAll + DstInputFileData%NumOuts = SrcInputFileData%NumOuts +IF (ALLOCATED(SrcInputFileData%OutList)) THEN + i1_l = LBOUND(SrcInputFileData%OutList,1) + i1_u = UBOUND(SrcInputFileData%OutList,1) + IF (.NOT. ALLOCATED(DstInputFileData%OutList)) THEN + ALLOCATE(DstInputFileData%OutList(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%OutList.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%OutList.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%OutList = SrcInitInputData%OutList + DstInputFileData%OutList = SrcInputFileData%OutList ENDIF - DstInitInputData%HDSum = SrcInitInputData%HDSum - DstInitInputData%UnSum = SrcInitInputData%UnSum - DstInitInputData%OutFmt = SrcInitInputData%OutFmt - DstInitInputData%OutSFmt = SrcInitInputData%OutSFmt - END SUBROUTINE HydroDyn_CopyInitInput - - SUBROUTINE HydroDyn_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) - TYPE(HydroDyn_InitInputType), INTENT(INOUT) :: InitInputData + DstInputFileData%HDSum = SrcInputFileData%HDSum + DstInputFileData%UnSum = SrcInputFileData%UnSum + DstInputFileData%OutFmt = SrcInputFileData%OutFmt + DstInputFileData%OutSFmt = SrcInputFileData%OutSFmt + END SUBROUTINE HydroDyn_CopyInputFile + + SUBROUTINE HydroDyn_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) + TYPE(HydroDyn_InputFile), INTENT(INOUT) :: InputFileData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_DestroyInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_DestroyInputFile' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(InitInputData%WaveElevXY)) THEN - DEALLOCATE(InitInputData%WaveElevXY) +IF (ALLOCATED(InputFileData%AddF0)) THEN + DEALLOCATE(InputFileData%AddF0) ENDIF -IF (ALLOCATED(InitInputData%AddF0)) THEN - DEALLOCATE(InitInputData%AddF0) +IF (ALLOCATED(InputFileData%AddCLin)) THEN + DEALLOCATE(InputFileData%AddCLin) ENDIF -IF (ALLOCATED(InitInputData%AddCLin)) THEN - DEALLOCATE(InitInputData%AddCLin) +IF (ALLOCATED(InputFileData%AddBLin)) THEN + DEALLOCATE(InputFileData%AddBLin) ENDIF -IF (ALLOCATED(InitInputData%AddBLin)) THEN - DEALLOCATE(InitInputData%AddBLin) +IF (ALLOCATED(InputFileData%AddBQuad)) THEN + DEALLOCATE(InputFileData%AddBQuad) ENDIF -IF (ALLOCATED(InitInputData%AddBQuad)) THEN - DEALLOCATE(InitInputData%AddBQuad) + CALL Waves_DestroyInitInput( InputFileData%Waves, ErrStat, ErrMsg ) + CALL Waves2_DestroyInitInput( InputFileData%Waves2, ErrStat, ErrMsg ) + CALL Current_DestroyInitInput( InputFileData%Current, ErrStat, ErrMsg ) +IF (ALLOCATED(InputFileData%PotFile)) THEN + DEALLOCATE(InputFileData%PotFile) ENDIF - CALL Waves_DestroyInitInput( InitInputData%Waves, ErrStat, ErrMsg ) - CALL Waves2_DestroyInitInput( InitInputData%Waves2, ErrStat, ErrMsg ) - CALL Current_DestroyInitInput( InitInputData%Current, ErrStat, ErrMsg ) -IF (ALLOCATED(InitInputData%PotFile)) THEN - DEALLOCATE(InitInputData%PotFile) +IF (ALLOCATED(InputFileData%PtfmVol0)) THEN + DEALLOCATE(InputFileData%PtfmVol0) ENDIF -IF (ALLOCATED(InitInputData%PtfmVol0)) THEN - DEALLOCATE(InitInputData%PtfmVol0) +IF (ALLOCATED(InputFileData%WAMITULEN)) THEN + DEALLOCATE(InputFileData%WAMITULEN) ENDIF -IF (ALLOCATED(InitInputData%WAMITULEN)) THEN - DEALLOCATE(InitInputData%WAMITULEN) +IF (ALLOCATED(InputFileData%PtfmRefxt)) THEN + DEALLOCATE(InputFileData%PtfmRefxt) ENDIF -IF (ALLOCATED(InitInputData%PtfmRefxt)) THEN - DEALLOCATE(InitInputData%PtfmRefxt) +IF (ALLOCATED(InputFileData%PtfmRefyt)) THEN + DEALLOCATE(InputFileData%PtfmRefyt) ENDIF -IF (ALLOCATED(InitInputData%PtfmRefyt)) THEN - DEALLOCATE(InitInputData%PtfmRefyt) +IF (ALLOCATED(InputFileData%PtfmRefzt)) THEN + DEALLOCATE(InputFileData%PtfmRefzt) ENDIF -IF (ALLOCATED(InitInputData%PtfmRefzt)) THEN - DEALLOCATE(InitInputData%PtfmRefzt) +IF (ALLOCATED(InputFileData%PtfmRefztRot)) THEN + DEALLOCATE(InputFileData%PtfmRefztRot) ENDIF -IF (ALLOCATED(InitInputData%PtfmRefztRot)) THEN - DEALLOCATE(InitInputData%PtfmRefztRot) +IF (ALLOCATED(InputFileData%PtfmCOBxt)) THEN + DEALLOCATE(InputFileData%PtfmCOBxt) ENDIF -IF (ALLOCATED(InitInputData%PtfmCOBxt)) THEN - DEALLOCATE(InitInputData%PtfmCOBxt) +IF (ALLOCATED(InputFileData%PtfmCOByt)) THEN + DEALLOCATE(InputFileData%PtfmCOByt) ENDIF -IF (ALLOCATED(InitInputData%PtfmCOByt)) THEN - DEALLOCATE(InitInputData%PtfmCOByt) + CALL WAMIT_DestroyInitInput( InputFileData%WAMIT, ErrStat, ErrMsg ) + CALL WAMIT2_DestroyInitInput( InputFileData%WAMIT2, ErrStat, ErrMsg ) + CALL Morison_DestroyInitInput( InputFileData%Morison, ErrStat, ErrMsg ) +IF (ALLOCATED(InputFileData%UserOutputs)) THEN + DEALLOCATE(InputFileData%UserOutputs) ENDIF - CALL WAMIT_DestroyInitInput( InitInputData%WAMIT, ErrStat, ErrMsg ) - CALL WAMIT2_DestroyInitInput( InitInputData%WAMIT2, ErrStat, ErrMsg ) - CALL Morison_DestroyInitInput( InitInputData%Morison, ErrStat, ErrMsg ) -IF (ALLOCATED(InitInputData%UserOutputs)) THEN - DEALLOCATE(InitInputData%UserOutputs) +IF (ALLOCATED(InputFileData%OutList)) THEN + DEALLOCATE(InputFileData%OutList) ENDIF -IF (ALLOCATED(InitInputData%OutList)) THEN - DEALLOCATE(InitInputData%OutList) -ENDIF - END SUBROUTINE HydroDyn_DestroyInitInput + END SUBROUTINE HydroDyn_DestroyInputFile - SUBROUTINE HydroDyn_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE HydroDyn_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) REAL(ReKi), ALLOCATABLE, INTENT( OUT) :: ReKiBuf(:) REAL(DbKi), ALLOCATABLE, INTENT( OUT) :: DbKiBuf(:) INTEGER(IntKi), ALLOCATABLE, INTENT( OUT) :: IntKiBuf(:) - TYPE(HydroDyn_InitInputType), INTENT(IN) :: InData + TYPE(HydroDyn_InputFile), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -589,7 +566,7 @@ SUBROUTINE HydroDyn_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_PackInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_PackInputFile' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -605,24 +582,7 @@ SUBROUTINE HydroDyn_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Re_BufSz = 0 Db_BufSz = 0 Int_BufSz = 0 - Int_BufSz = Int_BufSz + 1*LEN(InData%InputFile) ! InputFile - Int_BufSz = Int_BufSz + 1 ! UseInputFile - Int_BufSz = Int_BufSz + 1*LEN(InData%OutRootName) ! OutRootName - Int_BufSz = Int_BufSz + 1 ! Linearize - Db_BufSz = Db_BufSz + 1 ! DT - Re_BufSz = Re_BufSz + 1 ! Gravity - Re_BufSz = Re_BufSz + 1 ! defWtrDens - Re_BufSz = Re_BufSz + 1 ! defWtrDpth - Re_BufSz = Re_BufSz + 1 ! defMSL2SWL - Db_BufSz = Db_BufSz + 1 ! TMax - Int_BufSz = Int_BufSz + 1 ! HasIce - Int_BufSz = Int_BufSz + 1 ! WaveElevXY allocated yes/no - IF ( ALLOCATED(InData%WaveElevXY) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveElevXY upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveElevXY) ! WaveElevXY - END IF - Re_BufSz = Re_BufSz + 1 ! PtfmLocationX - Re_BufSz = Re_BufSz + 1 ! PtfmLocationY + Int_BufSz = Int_BufSz + 1 ! EchoFlag Int_BufSz = Int_BufSz + 1 ! AddF0 allocated yes/no IF ( ALLOCATED(InData%AddF0) ) THEN Int_BufSz = Int_BufSz + 2*2 ! AddF0 upper/lower bounds for each dimension @@ -843,56 +803,8 @@ SUBROUTINE HydroDyn_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Db_Xferred = 1 Int_Xferred = 1 - DO I = 1, LEN(InData%InputFile) - IntKiBuf(Int_Xferred) = ICHAR(InData%InputFile(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - IntKiBuf(Int_Xferred) = TRANSFER(InData%UseInputFile, IntKiBuf(1)) - Int_Xferred = Int_Xferred + 1 - DO I = 1, LEN(InData%OutRootName) - IntKiBuf(Int_Xferred) = ICHAR(InData%OutRootName(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - IntKiBuf(Int_Xferred) = TRANSFER(InData%Linearize, IntKiBuf(1)) - Int_Xferred = Int_Xferred + 1 - DbKiBuf(Db_Xferred) = InData%DT - Db_Xferred = Db_Xferred + 1 - ReKiBuf(Re_Xferred) = InData%Gravity - Re_Xferred = Re_Xferred + 1 - ReKiBuf(Re_Xferred) = InData%defWtrDens - Re_Xferred = Re_Xferred + 1 - ReKiBuf(Re_Xferred) = InData%defWtrDpth - Re_Xferred = Re_Xferred + 1 - ReKiBuf(Re_Xferred) = InData%defMSL2SWL - Re_Xferred = Re_Xferred + 1 - DbKiBuf(Db_Xferred) = InData%TMax - Db_Xferred = Db_Xferred + 1 - IntKiBuf(Int_Xferred) = TRANSFER(InData%HasIce, IntKiBuf(1)) - Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveElevXY) ) THEN - IntKiBuf( Int_Xferred ) = 0 - Int_Xferred = Int_Xferred + 1 - ELSE - IntKiBuf( Int_Xferred ) = 1 + IntKiBuf(Int_Xferred) = TRANSFER(InData%EchoFlag, IntKiBuf(1)) Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevXY,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevXY,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevXY,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevXY,2) - Int_Xferred = Int_Xferred + 2 - - DO i2 = LBOUND(InData%WaveElevXY,2), UBOUND(InData%WaveElevXY,2) - DO i1 = LBOUND(InData%WaveElevXY,1), UBOUND(InData%WaveElevXY,1) - ReKiBuf(Re_Xferred) = InData%WaveElevXY(i1,i2) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - ReKiBuf(Re_Xferred) = InData%PtfmLocationX - Re_Xferred = Re_Xferred + 1 - ReKiBuf(Re_Xferred) = InData%PtfmLocationY - Re_Xferred = Re_Xferred + 1 IF ( .NOT. ALLOCATED(InData%AddF0) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -1361,13 +1273,13 @@ SUBROUTINE HydroDyn_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, IntKiBuf(Int_Xferred) = ICHAR(InData%OutSFmt(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I - END SUBROUTINE HydroDyn_PackInitInput + END SUBROUTINE HydroDyn_PackInputFile - SUBROUTINE HydroDyn_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE HydroDyn_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: ReKiBuf(:) REAL(DbKi), ALLOCATABLE, INTENT(IN ) :: DbKiBuf(:) INTEGER(IntKi), ALLOCATABLE, INTENT(IN ) :: IntKiBuf(:) - TYPE(HydroDyn_InitInputType), INTENT(INOUT) :: OutData + TYPE(HydroDyn_InputFile), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -1381,7 +1293,7 @@ SUBROUTINE HydroDyn_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_UnPackInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_UnPackInputFile' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1392,59 +1304,8 @@ SUBROUTINE HydroDyn_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 - DO I = 1, LEN(OutData%InputFile) - OutData%InputFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - OutData%UseInputFile = TRANSFER(IntKiBuf(Int_Xferred), OutData%UseInputFile) - Int_Xferred = Int_Xferred + 1 - DO I = 1, LEN(OutData%OutRootName) - OutData%OutRootName(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - OutData%Linearize = TRANSFER(IntKiBuf(Int_Xferred), OutData%Linearize) - Int_Xferred = Int_Xferred + 1 - OutData%DT = DbKiBuf(Db_Xferred) - Db_Xferred = Db_Xferred + 1 - OutData%Gravity = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 - OutData%defWtrDens = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 - OutData%defWtrDpth = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 - OutData%defMSL2SWL = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 - OutData%TMax = DbKiBuf(Db_Xferred) - Db_Xferred = Db_Xferred + 1 - OutData%HasIce = TRANSFER(IntKiBuf(Int_Xferred), OutData%HasIce) - Int_Xferred = Int_Xferred + 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevXY not allocated - Int_Xferred = Int_Xferred + 1 - ELSE + OutData%EchoFlag = TRANSFER(IntKiBuf(Int_Xferred), OutData%EchoFlag) Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - i2_l = IntKiBuf( Int_Xferred ) - i2_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveElevXY)) DEALLOCATE(OutData%WaveElevXY) - ALLOCATE(OutData%WaveElevXY(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevXY.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveElevXY,2), UBOUND(OutData%WaveElevXY,2) - DO i1 = LBOUND(OutData%WaveElevXY,1), UBOUND(OutData%WaveElevXY,1) - OutData%WaveElevXY(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - OutData%PtfmLocationX = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 - OutData%PtfmLocationY = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! AddF0 not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -2030,6 +1891,364 @@ SUBROUTINE HydroDyn_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta OutData%OutSFmt(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I + END SUBROUTINE HydroDyn_UnPackInputFile + + SUBROUTINE HydroDyn_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(HydroDyn_InitInputType), INTENT(IN) :: SrcInitInputData + TYPE(HydroDyn_InitInputType), INTENT(INOUT) :: DstInitInputData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_CopyInitInput' +! + ErrStat = ErrID_None + ErrMsg = "" + DstInitInputData%InputFile = SrcInitInputData%InputFile + DstInitInputData%UseInputFile = SrcInitInputData%UseInputFile + CALL NWTC_Library_Copyfileinfotype( SrcInitInputData%PassedFileData, DstInitInputData%PassedFileData, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + DstInitInputData%OutRootName = SrcInitInputData%OutRootName + DstInitInputData%Linearize = SrcInitInputData%Linearize + DstInitInputData%Gravity = SrcInitInputData%Gravity + DstInitInputData%defWtrDens = SrcInitInputData%defWtrDens + DstInitInputData%defWtrDpth = SrcInitInputData%defWtrDpth + DstInitInputData%defMSL2SWL = SrcInitInputData%defMSL2SWL + DstInitInputData%TMax = SrcInitInputData%TMax + DstInitInputData%HasIce = SrcInitInputData%HasIce +IF (ALLOCATED(SrcInitInputData%WaveElevXY)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElevXY,1) + i1_u = UBOUND(SrcInitInputData%WaveElevXY,1) + i2_l = LBOUND(SrcInitInputData%WaveElevXY,2) + i2_u = UBOUND(SrcInitInputData%WaveElevXY,2) + IF (.NOT. ALLOCATED(DstInitInputData%WaveElevXY)) THEN + ALLOCATE(DstInitInputData%WaveElevXY(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveElevXY.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElevXY = SrcInitInputData%WaveElevXY +ENDIF + DstInitInputData%PtfmLocationX = SrcInitInputData%PtfmLocationX + DstInitInputData%PtfmLocationY = SrcInitInputData%PtfmLocationY + END SUBROUTINE HydroDyn_CopyInitInput + + SUBROUTINE HydroDyn_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) + TYPE(HydroDyn_InitInputType), INTENT(INOUT) :: InitInputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_DestroyInitInput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL NWTC_Library_Destroyfileinfotype( InitInputData%PassedFileData, ErrStat, ErrMsg ) +IF (ALLOCATED(InitInputData%WaveElevXY)) THEN + DEALLOCATE(InitInputData%WaveElevXY) +ENDIF + END SUBROUTINE HydroDyn_DestroyInitInput + + SUBROUTINE HydroDyn_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + REAL(ReKi), ALLOCATABLE, INTENT( OUT) :: ReKiBuf(:) + REAL(DbKi), ALLOCATABLE, INTENT( OUT) :: DbKiBuf(:) + INTEGER(IntKi), ALLOCATABLE, INTENT( OUT) :: IntKiBuf(:) + TYPE(HydroDyn_InitInputType), INTENT(IN) :: InData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly + ! Local variables + INTEGER(IntKi) :: Re_BufSz + INTEGER(IntKi) :: Re_Xferred + INTEGER(IntKi) :: Db_BufSz + INTEGER(IntKi) :: Db_Xferred + INTEGER(IntKi) :: Int_BufSz + INTEGER(IntKi) :: Int_Xferred + INTEGER(IntKi) :: i,i1,i2,i3,i4,i5 + LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_PackInitInput' + ! buffers to store subtypes, if any + REAL(ReKi), ALLOCATABLE :: Re_Buf(:) + REAL(DbKi), ALLOCATABLE :: Db_Buf(:) + INTEGER(IntKi), ALLOCATABLE :: Int_Buf(:) + + OnlySize = .FALSE. + IF ( PRESENT(SizeOnly) ) THEN + OnlySize = SizeOnly + ENDIF + ! + ErrStat = ErrID_None + ErrMsg = "" + Re_BufSz = 0 + Db_BufSz = 0 + Int_BufSz = 0 + Int_BufSz = Int_BufSz + 1*LEN(InData%InputFile) ! InputFile + Int_BufSz = Int_BufSz + 1 ! UseInputFile + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! PassedFileData: size of buffers for each call to pack subtype + CALL NWTC_Library_Packfileinfotype( Re_Buf, Db_Buf, Int_Buf, InData%PassedFileData, ErrStat2, ErrMsg2, .TRUE. ) ! PassedFileData + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! PassedFileData + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! PassedFileData + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! PassedFileData + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 1*LEN(InData%OutRootName) ! OutRootName + Int_BufSz = Int_BufSz + 1 ! Linearize + Re_BufSz = Re_BufSz + 1 ! Gravity + Re_BufSz = Re_BufSz + 1 ! defWtrDens + Re_BufSz = Re_BufSz + 1 ! defWtrDpth + Re_BufSz = Re_BufSz + 1 ! defMSL2SWL + Db_BufSz = Db_BufSz + 1 ! TMax + Int_BufSz = Int_BufSz + 1 ! HasIce + Int_BufSz = Int_BufSz + 1 ! WaveElevXY allocated yes/no + IF ( ALLOCATED(InData%WaveElevXY) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! WaveElevXY upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevXY) ! WaveElevXY + END IF + Re_BufSz = Re_BufSz + 1 ! PtfmLocationX + Re_BufSz = Re_BufSz + 1 ! PtfmLocationY + IF ( Re_BufSz .GT. 0 ) THEN + ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating ReKiBuf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + IF ( Db_BufSz .GT. 0 ) THEN + ALLOCATE( DbKiBuf( Db_BufSz ), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DbKiBuf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + IF ( Int_BufSz .GT. 0 ) THEN + ALLOCATE( IntKiBuf( Int_BufSz ), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating IntKiBuf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + IF(OnlySize) RETURN ! return early if only trying to allocate buffers (not pack them) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + DO I = 1, LEN(InData%InputFile) + IntKiBuf(Int_Xferred) = ICHAR(InData%InputFile(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + IntKiBuf(Int_Xferred) = TRANSFER(InData%UseInputFile, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + CALL NWTC_Library_Packfileinfotype( Re_Buf, Db_Buf, Int_Buf, InData%PassedFileData, ErrStat2, ErrMsg2, OnlySize ) ! PassedFileData + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN + IntKiBuf( Int_Xferred ) = SIZE(Re_Buf); Int_Xferred = Int_Xferred + 1 + IF (SIZE(Re_Buf) > 0) ReKiBuf( Re_Xferred:Re_Xferred+SIZE(Re_Buf)-1 ) = Re_Buf + Re_Xferred = Re_Xferred + SIZE(Re_Buf) + DEALLOCATE(Re_Buf) + ELSE + IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 + ENDIF + IF(ALLOCATED(Db_Buf)) THEN + IntKiBuf( Int_Xferred ) = SIZE(Db_Buf); Int_Xferred = Int_Xferred + 1 + IF (SIZE(Db_Buf) > 0) DbKiBuf( Db_Xferred:Db_Xferred+SIZE(Db_Buf)-1 ) = Db_Buf + Db_Xferred = Db_Xferred + SIZE(Db_Buf) + DEALLOCATE(Db_Buf) + ELSE + IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 + ENDIF + IF(ALLOCATED(Int_Buf)) THEN + IntKiBuf( Int_Xferred ) = SIZE(Int_Buf); Int_Xferred = Int_Xferred + 1 + IF (SIZE(Int_Buf) > 0) IntKiBuf( Int_Xferred:Int_Xferred+SIZE(Int_Buf)-1 ) = Int_Buf + Int_Xferred = Int_Xferred + SIZE(Int_Buf) + DEALLOCATE(Int_Buf) + ELSE + IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 + ENDIF + DO I = 1, LEN(InData%OutRootName) + IntKiBuf(Int_Xferred) = ICHAR(InData%OutRootName(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + IntKiBuf(Int_Xferred) = TRANSFER(InData%Linearize, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%Gravity + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%defWtrDens + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%defWtrDpth + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%defMSL2SWL + Re_Xferred = Re_Xferred + 1 + DbKiBuf(Db_Xferred) = InData%TMax + Db_Xferred = Db_Xferred + 1 + IntKiBuf(Int_Xferred) = TRANSFER(InData%HasIce, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%WaveElevXY) ) THEN + IntKiBuf( Int_Xferred ) = 0 + Int_Xferred = Int_Xferred + 1 + ELSE + IntKiBuf( Int_Xferred ) = 1 + Int_Xferred = Int_Xferred + 1 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevXY,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevXY,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevXY,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevXY,2) + Int_Xferred = Int_Xferred + 2 + + DO i2 = LBOUND(InData%WaveElevXY,2), UBOUND(InData%WaveElevXY,2) + DO i1 = LBOUND(InData%WaveElevXY,1), UBOUND(InData%WaveElevXY,1) + ReKiBuf(Re_Xferred) = InData%WaveElevXY(i1,i2) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END IF + ReKiBuf(Re_Xferred) = InData%PtfmLocationX + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%PtfmLocationY + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE HydroDyn_PackInitInput + + SUBROUTINE HydroDyn_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: ReKiBuf(:) + REAL(DbKi), ALLOCATABLE, INTENT(IN ) :: DbKiBuf(:) + INTEGER(IntKi), ALLOCATABLE, INTENT(IN ) :: IntKiBuf(:) + TYPE(HydroDyn_InitInputType), INTENT(INOUT) :: OutData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + ! Local variables + INTEGER(IntKi) :: Buf_size + INTEGER(IntKi) :: Re_Xferred + INTEGER(IntKi) :: Db_Xferred + INTEGER(IntKi) :: Int_Xferred + INTEGER(IntKi) :: i + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_UnPackInitInput' + ! buffers to store meshes, if any + REAL(ReKi), ALLOCATABLE :: Re_Buf(:) + REAL(DbKi), ALLOCATABLE :: Db_Buf(:) + INTEGER(IntKi), ALLOCATABLE :: Int_Buf(:) + ! + ErrStat = ErrID_None + ErrMsg = "" + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + DO I = 1, LEN(OutData%InputFile) + OutData%InputFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + OutData%UseInputFile = TRANSFER(IntKiBuf(Int_Xferred), OutData%UseInputFile) + Int_Xferred = Int_Xferred + 1 + Buf_size=IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + IF(Buf_size > 0) THEN + ALLOCATE(Re_Buf(Buf_size),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating Re_Buf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + Re_Buf = ReKiBuf( Re_Xferred:Re_Xferred+Buf_size-1 ) + Re_Xferred = Re_Xferred + Buf_size + END IF + Buf_size=IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + IF(Buf_size > 0) THEN + ALLOCATE(Db_Buf(Buf_size),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating Db_Buf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + Db_Buf = DbKiBuf( Db_Xferred:Db_Xferred+Buf_size-1 ) + Db_Xferred = Db_Xferred + Buf_size + END IF + Buf_size=IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + IF(Buf_size > 0) THEN + ALLOCATE(Int_Buf(Buf_size),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating Int_Buf.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) + Int_Xferred = Int_Xferred + Buf_size + END IF + CALL NWTC_Library_Unpackfileinfotype( Re_Buf, Db_Buf, Int_Buf, OutData%PassedFileData, ErrStat2, ErrMsg2 ) ! PassedFileData + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) + IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) + IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) + DO I = 1, LEN(OutData%OutRootName) + OutData%OutRootName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + OutData%Linearize = TRANSFER(IntKiBuf(Int_Xferred), OutData%Linearize) + Int_Xferred = Int_Xferred + 1 + OutData%Gravity = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%defWtrDens = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%defWtrDpth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%defMSL2SWL = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%TMax = DbKiBuf(Db_Xferred) + Db_Xferred = Db_Xferred + 1 + OutData%HasIce = TRANSFER(IntKiBuf(Int_Xferred), OutData%HasIce) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevXY not allocated + Int_Xferred = Int_Xferred + 1 + ELSE + Int_Xferred = Int_Xferred + 1 + i1_l = IntKiBuf( Int_Xferred ) + i1_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%WaveElevXY)) DEALLOCATE(OutData%WaveElevXY) + ALLOCATE(OutData%WaveElevXY(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevXY.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i2 = LBOUND(OutData%WaveElevXY,2), UBOUND(OutData%WaveElevXY,2) + DO i1 = LBOUND(OutData%WaveElevXY,1), UBOUND(OutData%WaveElevXY,1) + OutData%WaveElevXY(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END IF + OutData%PtfmLocationX = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%PtfmLocationY = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 END SUBROUTINE HydroDyn_UnPackInitInput SUBROUTINE HydroDyn_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) diff --git a/modules/nwtc-library/src/NWTC_IO.f90 b/modules/nwtc-library/src/NWTC_IO.f90 index 11f718931b..81d768f82b 100644 --- a/modules/nwtc-library/src/NWTC_IO.f90 +++ b/modules/nwtc-library/src/NWTC_IO.f90 @@ -138,27 +138,30 @@ MODULE NWTC_IO !> \copydoc nwtc_io::parsechvar INTERFACE ParseVar ! Parses a character variable name and value from a string. MODULE PROCEDURE ParseChVar ! Parses a character string from a string. - MODULE PROCEDURE ParseDbVar ! Parses a double-precision REAL from a string. MODULE PROCEDURE ParseInVar ! Parses an INTEGER from a string. MODULE PROCEDURE ParseLoVar ! Parses an LOGICAL from a string. MODULE PROCEDURE ParseSiVar ! Parses a single-precision REAL from a string. + MODULE PROCEDURE ParseR8Var ! Parses a double-precision REAL from a string. + MODULE PROCEDURE ParseQuVar ! Parses a quad-precision REAL from a string. END INTERFACE !> \copydoc nwtc_io::parsechvarwdefault INTERFACE ParseVarWDefault ! Parses a character variable name and value from a string, potentially sets to a default value if "Default" is parsed. MODULE PROCEDURE ParseChVarWDefault ! Parses a character string from a string, potentially sets to a default value if "Default" is parsed. - MODULE PROCEDURE ParseDbVarWDefault ! Parses a double-precision REAL from a string, potentially sets to a default value if "Default" is parsed. MODULE PROCEDURE ParseInVarWDefault ! Parses an INTEGER from a string, potentially sets to a default value if "Default" is parsed. MODULE PROCEDURE ParseLoVarWDefault ! Parses an LOGICAL from a string, potentially sets to a default value if "Default" is parsed. MODULE PROCEDURE ParseSiVarWDefault ! Parses a single-precision REAL from a string, potentially sets to a default value if "Default" is parsed. + MODULE PROCEDURE ParseR8VarWDefault ! Parses a double-precision REAL from a string, potentially sets to a default value if "Default" is parsed. + MODULE PROCEDURE ParseQuVarWDefault ! Parses a quad-precision REAL from a string, potentially sets to a default value if "Default" is parsed. END INTERFACE !> \copydoc nwtc_io::parsedbary INTERFACE ParseAry ! Parse an array of numbers from a string. - MODULE PROCEDURE ParseDbAry ! Parse an array of double-precision REAL values. MODULE PROCEDURE ParseInAry ! Parse an array of whole numbers. MODULE PROCEDURE ParseLoAry ! Parse an array of LOGICAL values. MODULE PROCEDURE ParseSiAry ! Parse an array of single-precision REAL values. + MODULE PROCEDURE ParseR8Ary ! Parse an array of double-precision REAL values. + MODULE PROCEDURE ParseQuAry ! Parse an array of quad-precision REAL values. MODULE PROCEDURE ParseChAry END INTERFACE @@ -3603,13 +3606,13 @@ END SUBROUTINE ParseChVarWDefault !> This subroutine parses the specified line of text for AryLen REAL values. !! Generate an error message if the value is the wrong type. !! Use ParseAry (nwtc_io::parseary) instead of directly calling a specific routine in the generic interface. - SUBROUTINE ParseDbAry ( FileInfo, LineNum, AryName, Ary, AryLen, ErrStat, ErrMsg, UnEc ) + SUBROUTINE ParseR8Ary ( FileInfo, LineNum, AryName, Ary, AryLen, ErrStat, ErrMsg, UnEc ) ! Arguments declarations. INTEGER, INTENT(IN) :: AryLen !< The length of the array to parse. - REAL(DbKi), INTENT(OUT) :: Ary (AryLen) !< The array to receive the input values. + REAL(R8Ki), INTENT(OUT) :: Ary (AryLen) !< The array to receive the input values. INTEGER(IntKi), INTENT(OUT) :: ErrStat !< The error status. INTEGER(IntKi), INTENT(INOUT) :: LineNum !< The number of the line to parse. @@ -3627,7 +3630,7 @@ SUBROUTINE ParseDbAry ( FileInfo, LineNum, AryName, Ary, AryLen, ErrStat, ErrMsg INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. INTEGER(IntKi) :: i ! Error status local to this routine. - CHARACTER(*), PARAMETER :: RoutineName = 'ParseDbAry' + CHARACTER(*), PARAMETER :: RoutineName = 'ParseR8Ary' ErrStat = ErrID_None @@ -3665,14 +3668,14 @@ SUBROUTINE ParseDbAry ( FileInfo, LineNum, AryName, Ary, AryLen, ErrStat, ErrMsg RETURN - END SUBROUTINE ParseDbAry + END SUBROUTINE ParseR8Ary !======================================================================= !> \copydoc nwtc_io::parsechvar - SUBROUTINE ParseDbVar ( FileInfo, LineNum, ExpVarName, Var, ErrStat, ErrMsg, UnEc ) + SUBROUTINE ParseR8Var ( FileInfo, LineNum, ExpVarName, Var, ErrStat, ErrMsg, UnEc ) ! Arguments declarations. - REAL(DbKi), INTENT(OUT) :: Var ! The double-precision REAL variable to receive the input value. + REAL(R8Ki), INTENT(OUT) :: Var ! The double-precision REAL variable to receive the input value. INTEGER(IntKi), INTENT(OUT) :: ErrStat ! The error status. INTEGER(IntKi), INTENT(INOUT) :: LineNum ! The number of the line to parse. @@ -3692,7 +3695,7 @@ SUBROUTINE ParseDbVar ( FileInfo, LineNum, ExpVarName, Var, ErrStat, ErrMsg, UnE CHARACTER(NWTC_SizeOfNumWord) :: Words (2) ! The two "words" parsed from the line. CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'ParseDbVar' + CHARACTER(*), PARAMETER :: RoutineName = 'ParseR8Var' ErrStat = ErrID_None @@ -3732,10 +3735,10 @@ SUBROUTINE ParseDbVar ( FileInfo, LineNum, ExpVarName, Var, ErrStat, ErrMsg, UnE LineNum = LineNum + 1 RETURN - END SUBROUTINE ParseDbVar + END SUBROUTINE ParseR8Var !======================================================================= !> \copydoc nwtc_io::parsechvarwdefault - SUBROUTINE ParseDbVarWDefault ( FileInfo, LineNum, ExpVarName, Var, VarDefault, ErrStat, ErrMsg, UnEc ) + SUBROUTINE ParseR8VarWDefault ( FileInfo, LineNum, ExpVarName, Var, VarDefault, ErrStat, ErrMsg, UnEc ) ! Arguments declarations. @@ -3745,8 +3748,8 @@ SUBROUTINE ParseDbVarWDefault ( FileInfo, LineNum, ExpVarName, Var, VarDefault, INTEGER, INTENT(IN), OPTIONAL :: UnEc ! I/O unit for echo file. If present and > 0, write to UnEc. - REAL(DbKi), INTENT(OUT) :: Var ! The double-precision REAL variable to receive the input value. - REAL(DbKi), INTENT(IN) :: VarDefault ! The double-precision REAL used as the default. + REAL(R8Ki), INTENT(OUT) :: Var ! The double-precision REAL variable to receive the input value. + REAL(R8Ki), INTENT(IN) :: VarDefault ! The double-precision REAL used as the default. CHARACTER(*), INTENT(OUT) :: ErrMsg ! The error message, if ErrStat /= 0. CHARACTER(*), INTENT(IN) :: ExpVarName ! The expected variable name. @@ -3758,7 +3761,7 @@ SUBROUTINE ParseDbVarWDefault ( FileInfo, LineNum, ExpVarName, Var, VarDefault, INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'ParseDbVarDefault' + CHARACTER(*), PARAMETER :: RoutineName = 'ParseR8VarDefault' CHARACTER(20) :: defaultStr ErrStat=ErrID_None @@ -3778,7 +3781,187 @@ SUBROUTINE ParseDbVarWDefault ( FileInfo, LineNum, ExpVarName, Var, VarDefault, END IF RETURN - END SUBROUTINE ParseDbVarWDefault + END SUBROUTINE ParseR8VarWDefault +!======================================================================= +!> This subroutine parses the specified line of text for AryLen REAL values. +!! Generate an error message if the value is the wrong type. +!! Use ParseAry (nwtc_io::parseary) instead of directly calling a specific routine in the generic interface. + SUBROUTINE ParseQuAry ( FileInfo, LineNum, AryName, Ary, AryLen, ErrStat, ErrMsg, UnEc ) + + ! Arguments declarations. + + INTEGER, INTENT(IN) :: AryLen !< The length of the array to parse. + + REAL(QuKi), INTENT(OUT) :: Ary (AryLen) !< The array to receive the input values. + + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< The error status. + INTEGER(IntKi), INTENT(INOUT) :: LineNum !< The number of the line to parse. + + INTEGER, INTENT(IN), OPTIONAL :: UnEc !< I/O unit for echo file. If present and > 0, write to UnEc. + + CHARACTER(*), INTENT(In) :: AryName !< The array name we are trying to fill. + CHARACTER(*), INTENT(OUT) :: ErrMsg !< The error message, if ErrStat /= 0. + + TYPE (FileInfoType), INTENT(IN) :: FileInfo !< The derived type for holding the file information. + + + ! Local declarations. + + INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. + INTEGER(IntKi) :: i ! Error status local to this routine. + + CHARACTER(*), PARAMETER :: RoutineName = 'ParseQuAry' + + + ErrStat = ErrID_None + ErrMsg = "" + + IF (LineNum > size(FileInfo%Lines) ) THEN + CALL SetErrStat ( ErrID_Fatal, NewLine//' >> A fatal error occurred when parsing data.'//NewLine// & + ' >> The "'//TRIM( AryName )//'" array was not assigned because the file is too short.' & + , ErrStat, ErrMsg, RoutineName ) + RETURN + END IF + + + READ (FileInfo%Lines(LineNum),*,IOSTAT=ErrStatLcl) Ary + IF ( ErrStatLcl /= 0 ) THEN + CALL SetErrStat ( ErrID_Fatal, 'A fatal error occurred when parsing data from "' & + //TRIM( FileInfo%FileList(FileInfo%FileIndx(LineNum)) )//'".'//NewLine// & + ' >> The "'//TRIM( AryName )//'" array was not assigned valid REAL values on line #' & + //TRIM( Num2LStr( FileInfo%FileLine(LineNum) ) )//'.'//NewLine//' >> The text being parsed was :'//NewLine & + //' "'//TRIM( FileInfo%Lines(LineNum) )//'"',ErrStat,ErrMsg,RoutineName ) + RETURN + ENDIF + + DO i=1,AryLen + call CheckRealVar( Ary(i), AryName, ErrStat, ErrMsg ) + if (ErrStat>= AbortErrLev) return + END DO + + + IF ( PRESENT(UnEc) ) THEN + IF ( UnEc > 0 ) WRITE (UnEc,'(A)') TRIM( FileInfo%Lines(LineNum) ) + END IF + + LineNum = LineNum + 1 + + RETURN + + END SUBROUTINE ParseQuAry +!======================================================================= +!> \copydoc nwtc_io::parsechvar + SUBROUTINE ParseQuVar ( FileInfo, LineNum, ExpVarName, Var, ErrStat, ErrMsg, UnEc ) + + ! Arguments declarations. + + REAL(QuKi), INTENT(OUT) :: Var ! The double-precision REAL variable to receive the input value. + + INTEGER(IntKi), INTENT(OUT) :: ErrStat ! The error status. + INTEGER(IntKi), INTENT(INOUT) :: LineNum ! The number of the line to parse. + + INTEGER, INTENT(IN), OPTIONAL :: UnEc ! I/O unit for echo file. If present and > 0, write to UnEc. + + CHARACTER(*), INTENT(OUT) :: ErrMsg ! The error message, if ErrStat /= 0. + CHARACTER(*), INTENT(IN) :: ExpVarName ! The expected variable name. + + TYPE (FileInfoType), INTENT(IN) :: FileInfo ! The derived type for holding the file information. + + + ! Local declarations. + + INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. + INTEGER(IntKi) :: NameIndx ! The index into the Words array that points to the variable name. + + CHARACTER(NWTC_SizeOfNumWord) :: Words (2) ! The two "words" parsed from the line. + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'ParseQuVar' + + + ErrStat = ErrID_None + ErrMsg = "" + + IF (LineNum > size(FileInfo%Lines) ) THEN + CALL SetErrStat ( ErrID_Fatal, NewLine//' >> A fatal error occurred when parsing data.'//NewLine// & + ' >> The "'//TRIM( ExpVarName )//'" variable was not assigned because the file is too short.' & + , ErrStat, ErrMsg, RoutineName ) + RETURN + END IF + + CALL GetWords ( FileInfo%Lines(LineNum), Words, 2 ) ! Read the first two words in Line. + + CALL ChkParseData ( Words, ExpVarName, FileInfo%FileList(FileInfo%FileIndx(LineNum)) & + , FileInfo%FileLine(LineNum), NameIndx, ErrStatLcl, ErrMsg2 ) + CALL SetErrStat(ErrStatLcl, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) RETURN + + + READ (Words(3-NameIndx),*,IOSTAT=ErrStatLcl) Var + IF ( ErrStatLcl /= 0 ) THEN + CALL SetErrStat ( ErrID_Fatal, NewLine//'A fatal error occurred when parsing data from "' & + //TRIM( FileInfo%FileList(FileInfo%FileIndx(LineNum)) )//'".'//NewLine// & + ' >> The variable "'//TRIM( Words(NameIndx) )//'" was not assigned valid REAL value on line #' & + //TRIM( Num2LStr( LineNum ) )//'.'//NewLine//' >> The text being parsed was :'//& + NewLine//' "'//TRIM( FileInfo%Lines(LineNum) )//'"', ErrStat, ErrMsg, RoutineName) + RETURN + ENDIF + CALL CheckRealVar( Var, ExpVarName, ErrStatLcl, ErrMsg2) + CALL SetErrStat(ErrStatLcl, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + IF ( PRESENT(UnEc) ) THEN + IF ( UnEc > 0 ) WRITE (UnEc,'(1X,A15," = ",A20)') Words + END IF + + LineNum = LineNum + 1 + + RETURN + END SUBROUTINE ParseQuVar +!======================================================================= +!> \copydoc nwtc_io::parsechvarwdefault + SUBROUTINE ParseQuVarWDefault ( FileInfo, LineNum, ExpVarName, Var, VarDefault, ErrStat, ErrMsg, UnEc ) + + ! Arguments declarations. + + + INTEGER(IntKi), INTENT(OUT) :: ErrStat ! The error status. + INTEGER(IntKi), INTENT(INOUT) :: LineNum ! The number of the line to parse. + + INTEGER, INTENT(IN), OPTIONAL :: UnEc ! I/O unit for echo file. If present and > 0, write to UnEc. + + REAL(QuKi), INTENT(OUT) :: Var ! The double-precision REAL variable to receive the input value. + REAL(QuKi), INTENT(IN) :: VarDefault ! The double-precision REAL used as the default. + CHARACTER(*), INTENT(OUT) :: ErrMsg ! The error message, if ErrStat /= 0. + CHARACTER(*), INTENT(IN) :: ExpVarName ! The expected variable name. + + TYPE (FileInfoType), INTENT(IN) :: FileInfo ! The derived type for holding the file information. + + + ! Local declarations. + + INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. + + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'ParseQuVarDefault' + CHARACTER(20) :: defaultStr + + ErrStat=ErrID_None + ErrMsg = "" + + ! First parse this as a string + CALL ParseVar ( FileInfo, LineNum, ExpVarName, defaultStr, ErrStatLcl, ErrMsg2, UnEc ) + CALL SetErrStat(ErrStatLcl, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) RETURN + CALL Conv2UC( defaultStr ) + IF ( INDEX(defaultStr, "DEFAULT" ) /= 1 ) THEN ! If it's not "default", read this variable + LineNum = LineNum - 1 ! back up a line + CALL ParseVar ( FileInfo, LineNum, ExpVarName, Var, ErrStatLcl, ErrMsg2, UnEc ) + CALL SetErrStat( ErrStatLcl, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ELSE + Var = VarDefault ! "DEFAULT" value + END IF + + RETURN + END SUBROUTINE ParseQuVarWDefault !======================================================================= !> \copydoc nwtc_io::parsedbary SUBROUTINE ParseInAry ( FileInfo, LineNum, AryName, Ary, AryLen, ErrStat, ErrMsg, UnEc ) @@ -4269,7 +4452,7 @@ SUBROUTINE ParseSiAry ( FileInfo, LineNum, AryName, Ary, AryLen, ErrStat, ErrMsg INTEGER, INTENT(IN) :: AryLen ! The length of the array to parse. - REAL(ReKi), INTENT(OUT) :: Ary (AryLen) ! The single-precision REAL array to receive the input values. + REAL(SiKi), INTENT(OUT) :: Ary (AryLen) ! The single-precision REAL array to receive the input values. INTEGER(IntKi), INTENT(OUT) :: ErrStat ! The error status. INTEGER(IntKi), INTENT(INOUT) :: LineNum ! The number of the line to parse. @@ -4329,7 +4512,7 @@ SUBROUTINE ParseSiVar ( FileInfo, LineNum, ExpVarName, Var, ErrStat, ErrMsg, UnE ! Arguments declarations. - REAL(ReKi), INTENT(OUT) :: Var ! The single-precision REAL variable to receive the input value. + REAL(SiKi), INTENT(OUT) :: Var ! The single-precision REAL variable to receive the input value. INTEGER(IntKi), INTENT(OUT) :: ErrStat ! The error status. INTEGER(IntKi), INTENT(INOUT) :: LineNum ! The number of the line to parse. @@ -4402,8 +4585,8 @@ SUBROUTINE ParseSiVarWDefault ( FileInfo, LineNum, ExpVarName, Var, VarDefault, INTEGER, INTENT(IN), OPTIONAL :: UnEc ! I/O unit for echo file. If present and > 0, write to UnEc. - REAL(ReKi), INTENT(OUT) :: Var ! The single-precision REAL variable to receive the input value. - REAL(ReKi), INTENT(IN) :: VarDefault ! The single-precision REAL used as the default. + REAL(SiKi), INTENT(OUT) :: Var ! The single-precision REAL variable to receive the input value. + REAL(SiKi), INTENT(IN) :: VarDefault ! The single-precision REAL used as the default. CHARACTER(*), INTENT(OUT) :: ErrMsg ! The error message, if ErrStat /= 0. CHARACTER(*), INTENT(IN) :: ExpVarName ! The expected variable name. @@ -6334,7 +6517,7 @@ SUBROUTINE ReadOutputListFromFileInfo ( FileInfo, LineNum, CharAry, AryLenRead, DO IF ( PRESENT(UnEc) ) THEN - if (UnEc > 0) WRITE(UnEc, '(A)') FileInfo%Lines(LineNum) + if (UnEc > 0) WRITE(UnEc, '(A)') trim(FileInfo%Lines(LineNum)) ENDIF OutLine = adjustl(trim(FileInfo%Lines(LineNum))) ! remove leading whitespace diff --git a/reg_tests/r-test b/reg_tests/r-test index 4e017e130f..cf8afb8205 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 4e017e130f991e55b6632f0df151202db5f5c305 +Subproject commit cf8afb8205de5a53883a5650f5d5d63518740ec5