From 93492be4ee1836ab3213d33d9cc0f20ec0a28305 Mon Sep 17 00:00:00 2001 From: Greg Hayman Date: Tue, 21 Sep 2021 10:34:58 -0600 Subject: [PATCH 01/35] Reorganize HD src files for SeaState Module Move location of files which used in the new SeaState module --- modules/hydrodyn/src/Waves2_Output.f90 | 576 ------------------ .../{hydrodyn => seastate}/src/Current.f90 | 0 .../{hydrodyn => seastate}/src/Current.txt | 0 .../src/Current_Types.f90 | 0 .../{hydrodyn => seastate}/src/UserWaves.f90 | 0 modules/{hydrodyn => seastate}/src/Waves.f90 | 0 modules/{hydrodyn => seastate}/src/Waves.txt | 0 modules/{hydrodyn => seastate}/src/Waves2.f90 | 0 modules/{hydrodyn => seastate}/src/Waves2.txt | 0 .../src/Waves2_Types.f90 | 0 .../src/Waves_Types.f90 | 0 11 files changed, 576 deletions(-) delete mode 100644 modules/hydrodyn/src/Waves2_Output.f90 rename modules/{hydrodyn => seastate}/src/Current.f90 (100%) rename modules/{hydrodyn => seastate}/src/Current.txt (100%) rename modules/{hydrodyn => seastate}/src/Current_Types.f90 (100%) rename modules/{hydrodyn => seastate}/src/UserWaves.f90 (100%) rename modules/{hydrodyn => seastate}/src/Waves.f90 (100%) rename modules/{hydrodyn => seastate}/src/Waves.txt (100%) rename modules/{hydrodyn => seastate}/src/Waves2.f90 (100%) rename modules/{hydrodyn => seastate}/src/Waves2.txt (100%) rename modules/{hydrodyn => seastate}/src/Waves2_Types.f90 (100%) rename modules/{hydrodyn => seastate}/src/Waves_Types.f90 (100%) diff --git a/modules/hydrodyn/src/Waves2_Output.f90 b/modules/hydrodyn/src/Waves2_Output.f90 deleted file mode 100644 index 817ebc7272..0000000000 --- a/modules/hydrodyn/src/Waves2_Output.f90 +++ /dev/null @@ -1,576 +0,0 @@ -!********************************************************************************************************************************** -! LICENSING -! Copyright (C) 2013-2015 National Renewable Energy Laboratory -! -! This file is part of HydroDyn. -! -! Licensed under the Apache License, Version 2.0 (the "License"); -! you may not use this file except in compliance with the License. -! You may obtain a copy of the License at -! -! http://www.apache.org/licenses/LICENSE-2.0 -! -! Unless required by applicable law or agreed to in writing, software -! distributed under the License is distributed on an "AS IS" BASIS, -! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -! See the License for the specific language governing permissions and -! limitations under the License. -! -!********************************************************************************************************************************** -MODULE Waves2_Output - - ! This MODULE stores variables used for output. - - USE NWTC_Library - USE Waves2_Types - !USE HydroDyn_Output_Types -! USE Waves - IMPLICIT NONE - - PRIVATE - - ! Indices for computing output channels: - ! NOTES: - ! (1) These parameters are in the order stored in "OutListParameters.xlsx" - ! (2) Array AllOuts() must be dimensioned to the value of the largest output parameter - - INTEGER(IntKi), PARAMETER :: OutStrLenM1 = ChanLen - - ! Waves2 Body Forces: - - INTEGER(IntKi), PARAMETER :: Wave1Elv2 = 1 - INTEGER(IntKi), PARAMETER :: Wave2Elv2 = 2 - INTEGER(IntKi), PARAMETER :: Wave3Elv2 = 3 - INTEGER(IntKi), PARAMETER :: Wave4Elv2 = 4 - INTEGER(IntKi), PARAMETER :: Wave5Elv2 = 5 - INTEGER(IntKi), PARAMETER :: Wave6Elv2 = 6 - INTEGER(IntKi), PARAMETER :: Wave7Elv2 = 7 - INTEGER(IntKi), PARAMETER :: Wave8Elv2 = 8 - INTEGER(IntKi), PARAMETER :: Wave9Elv2 = 9 - - - -!End of code generated by Matlab script - - - INTEGER(IntKi), PARAMETER :: WaveElevi2(9) = (/Wave1Elv2,Wave2Elv2,Wave3Elv2,Wave4Elv2,Wave5Elv2,Wave6Elv2,Wave7Elv2,Wave8Elv2,Wave9Elv2/) - - - -! This code was generated by hand. - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(9) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "WAVE1ELV2","WAVE2ELV2","WAVE3ELV2","WAVE4ELV2","WAVE5ELV2","WAVE6ELV2","WAVE7ELV2","WAVE8ELV2","WAVE9ELV2"/) - INTEGER(IntKi), PARAMETER :: ParamIndxAry(9) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - Wave1Elv2 , Wave2Elv2 , Wave3Elv2 , Wave4Elv2 , Wave5Elv2 , Wave6Elv2 , Wave7Elv2 , Wave8Elv2 , Wave9Elv2 /) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(9) = (/ & ! This lists the units corresponding to the allowed parameters - "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) "/) - - - REAL(ReKi) :: AllOuts(MaxWaves2Outputs) ! Array of all possible outputs - - ! ..... Public Subroutines ................................................................................................... - PUBLIC :: Wvs2OUT_MapOutputs - PUBLIC :: Wvs2OUT_WriteOutputNames - PUBLIC :: Wvs2OUT_WriteOutputUnits - PUBLIC :: Wvs2OUT_WriteOutputs - PUBLIC :: Wvs2OUT_Init - PUBLIC :: Wvs2OUT_DestroyParam - PUBLIC :: GetWaves2Channels - -CONTAINS - - - - -!==================================================================================================== -SUBROUTINE Wvs2OUT_MapOutputs( CurrentTime, y, NWaveElev, WaveElev2, AllOuts, ErrStat, ErrMsg ) -! This subroutine writes the data stored in the y variable to the correct indexed postions in WriteOutput -! This is called by Waves2_CalcOutput() at each time step. -!---------------------------------------------------------------------------------------------------- - REAL(DbKi), INTENT( IN ) :: CurrentTime ! Current simulation time in seconds - TYPE(Waves2_OutputType), INTENT( INOUT ) :: y ! Waves2's output data - INTEGER, INTENT( IN ) :: NWaveElev ! Number of wave elevation locations to output - REAL(SiKi), INTENT( IN ) :: WaveElev2(:) ! Instantaneous second order correction to the elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - REAL(ReKi), INTENT( OUT ) :: AllOuts(MaxWaves2Outputs) - INTEGER(IntKi), INTENT( OUT ) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None - - INTEGER :: I - - ErrStat = ErrID_None - ErrMsg = "" - - - ! TODO: use y%mesh for the forces instead of individual parameters - - DO I=1,NWaveElev - AllOuts(WaveElevi2(I)) = WaveElev2(I) - END DO - - - -END SUBROUTINE Wvs2OUT_MapOutputs - - -!==================================================================================================== - -SUBROUTINE Wvs2OUT_WriteOutputNames( UnOutFile, p, ErrStat, ErrMsg ) - - INTEGER, INTENT( IN ) :: UnOutFile ! file unit for the output file - TYPE(Waves2_ParameterType), INTENT( IN ) :: p ! Waves2 module's parameter 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(200) :: Frmt ! a string to hold a format statement - INTEGER :: I ! Generic loop counter - - ErrStat = ErrID_None - ErrMsg = "" - - Frmt = '(A8,'//TRIM(Int2LStr(p%NumOuts))//'(:,A,'//TRIM( p%OutSFmt )//'))' - - WRITE(UnOutFile,Frmt) 'Time', ( p%Delim, TRIM( p%OutParam(I)%Name ), I=1,p%NumOuts ) - -END SUBROUTINE Wvs2OUT_WriteOutputNames - -!==================================================================================================== - - -SUBROUTINE Wvs2OUT_WriteOutputUnits( UnOutFile, p, ErrStat, ErrMsg ) - - INTEGER, INTENT( IN ) :: UnOutFile ! file unit for the output file - TYPE(Waves2_ParameterType), INTENT( IN ) :: p ! Waves2 module's parameter 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(200) :: Frmt ! a string to hold a format statement - INTEGER :: I ! Generic loop counter - - ErrStat = ErrID_None - ErrMsg = "" - - Frmt = '(A8,'//TRIM(Int2LStr(p%NumOuts))//'(:,A,'//TRIM( p%OutSFmt )//'))' - - WRITE(UnOutFile,Frmt) '(sec)', ( p%Delim, TRIM( p%OutParam(I)%Units ), I=1,p%NumOuts ) - -END SUBROUTINE Wvs2OUT_WriteOutputUnits - -!==================================================================================================== -SUBROUTINE Wvs2OUT_WriteOutputs( UnOutFile, Time, y, p, ErrStat, ErrMsg ) -! This subroutine writes the data stored in WriteOutputs (and indexed in OutParam) to the file -! opened in Wvs2OUT_Init() -!---------------------------------------------------------------------------------------------------- - - ! Passed variables - INTEGER , INTENT( IN ) :: UnOutFile - REAL(DbKi), INTENT( IN ) :: Time ! Time for this output - TYPE(Waves2_OutputType), INTENT( INOUT ) :: y ! Waves2's output data - TYPE(Waves2_ParameterType),INTENT( IN ) :: p ! Waves2 parameter 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 -! REAL(ReKi) :: OutData (0:p%NumOuts) ! an output array - INTEGER :: I ! Generic loop counter - CHARACTER(200) :: Frmt ! a string to hold a format statement - - - - ! Initialize ErrStat and determine if it makes any sense to write output - - IF ( .NOT. ALLOCATED( p%OutParam ) .OR. UnOutFile < 0 ) THEN - ErrMsg = ' No Waves2 outputs written. The OutParam array must be allocated and there must be a valid output file identifier before we can write outputs.' - ErrStat = ErrID_Warn - RETURN - ELSE - ErrStat = ErrID_None - ErrMsg = '' - END IF - - - - - - ! Write the output parameters to the file - - Frmt = '(F8.3,'//TRIM(Int2LStr(p%NumOuts))//'(:,A,'//TRIM( p%OutFmt )//'))' - !Frmt = '('//TRIM( p%OutFmt )//','//TRIM(Int2LStr(p%NumOuts))//'(:,A,'//TRIM( p%OutFmt )//'))' - - WRITE(UnOutFile,Frmt) Time, ( p%Delim, y%WriteOutput(I), I=1,p%NumOuts ) - - - RETURN - - -END SUBROUTINE Wvs2OUT_WriteOutputs - - - -!==================================================================================================== -SUBROUTINE Wvs2OUT_Init( InitInp, y, p, 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 -!---------------------------------------------------------------------------------------------------- - - - - ! Passed variables - - - TYPE(Waves2_InitInputType ), INTENT( IN ) :: InitInp ! data needed to initialize the output module - TYPE(Waves2_OutputType), INTENT( INOUT ) :: y ! This module's internal data - TYPE(Waves2_ParameterType), INTENT( INOUT ) :: p - TYPE(Waves2_InitOutputType), INTENT( OUT ) :: InitOut - INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred - CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None - - ! Local variables - INTEGER :: I ! Generic loop counter -! INTEGER :: J ! Generic loop counter -! INTEGER :: Indx ! Counts the current index into the WaveKinNd array -! CHARACTER(1024) :: OutFileName ! The name of the output file including the full path. -! CHARACTER(200) :: Frmt ! a string to hold a format statement - - CHARACTER(ErrMsgLen) :: ErrMsgTmp ! Temporary Error status - INTEGER(IntKi) :: ErrStatTmp ! Temporary Error message - - - !------------------------------------------------------------------------------------------------- - ! Initialize local variables - !------------------------------------------------------------------------------------------------- - - - ErrStat = ErrID_None - ErrStatTmp = ErrID_None - ErrMsg = "" - ErrMsgTmp = "" - - - - - !------------------------------------------------------------------------------------------------- - ! Check that the variables in OutList are valid - !------------------------------------------------------------------------------------------------- - - CALL Wvs2OUT_ChkOutLst( InitInp%OutList(1:p%NumOuts), y, p, ErrStatTmp, ErrMsg ) - CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,'Wvs2OUT_Init') - IF (ErrStat >= AbortErrLev ) RETURN - - IF ( ALLOCATED( p%OutParam ) .AND. p%NumOuts > 0 ) THEN ! Output has been requested so let's open an output file - - ALLOCATE( y%WriteOutput( p%NumOuts ), STAT = ErrStatTmp ) - IF ( ErrStattmp /= ErrID_None ) THEN - CALL SetErrStat(ErrID_Fatal,' Error allocating space for WriteOutput array.',ErrStat,ErrMsg,'Wvs2OUT_Init') - IF (ErrStat >= AbortErrLev ) RETURN - RETURN - END IF - y%WriteOutput = 0.0_ReKi - - ALLOCATE ( InitOut%WriteOutputHdr(p%NumOuts), STAT = ErrStatTmp ) - IF ( ErrStattmp /= ErrID_None ) THEN - CALL SetErrStat(ErrID_Fatal,' Error allocating space for WriteOutputHdr array.',ErrStat,ErrMsg,'Wvs2OUT_Init') - IF (ErrStat >= AbortErrLev ) RETURN - RETURN - END IF - - ALLOCATE ( InitOut%WriteOutputUnt(p%NumOuts), STAT = ErrStatTmp ) - IF ( ErrStattmp /= ErrID_None ) THEN - CALL SetErrStat(ErrID_Fatal,' Error allocating space for WriteOutputUnt array.',ErrStat,ErrMsg,'Wvs2OUT_Init') - IF (ErrStat >= AbortErrLev ) RETURN - RETURN - END IF - - DO I = 1,p%NumOuts - - InitOut%WriteOutputHdr(I) = TRIM( p%OutParam(I)%Name ) - InitOut%WriteOutputUnt(I) = TRIM( p%OutParam(I)%Units ) - - END DO - - END IF ! there are any requested outputs - - RETURN - -END SUBROUTINE Wvs2OUT_Init - - -!==================================================================================================== -FUNCTION GetWaves2Channels ( NUserOutputs, UserOutputs, OutList, foundMask, ErrStat, ErrMsg ) -! This routine checks the names of inputted output channels, checks to see if they -! below to the list of available Waves2 channels. - -!---------------------------------------------------------------------------------------------------- - INTEGER, INTENT( IN ) :: NUserOutputs ! Number of user-specified output channels - CHARACTER(ChanLen), INTENT( IN ) :: UserOutputs (:) ! An array holding the names of the requested output channels. - CHARACTER(ChanLen), INTENT( OUT ) :: OutList (:) ! An array holding the names of the matched Waves2 output channels. - LOGICAL, INTENT( INOUT ) :: foundMask (:) ! A mask indicating whether a user requested channel belongs to a module's output channels. - INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred - CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None - - INTEGER GetWaves2Channels ! The number of channels found in this module - - ! Local variables. - - INTEGER :: I ! Generic loop-counting index. - INTEGER :: count ! Generic loop-counting index. - INTEGER :: INDX ! Index for valid arrays - - CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I). - CHARACTER(28), PARAMETER :: OutPFmt = "( I4, 3X,A 10,1 X, A10 )" ! Output format parameter output list. -! LOGICAL :: InvalidOutput(MaxWaves2Outputs) ! This array determines if the output channel is valid for this configuration - LOGICAL :: CheckOutListAgain - - LOGICAL :: newFoundMask (NUserOutputs) ! A Mask indicating whether a user requested channel belongs to a modules output channels. - - ! Initialize ErrStat - - ErrStat = ErrID_None - ErrMsg = "" - GetWaves2Channels = 0 - - newFoundMask = .FALSE. - - - DO I = 1,NUserOutputs - IF (.NOT. foundMask(I) ) THEN - OutListTmp = UserOutputs(I) - - CheckOutListAgain = .FALSE. - - ! Reverse the sign (+/-) of the output channel if the user prefixed the - ! channel name with a '-', '_', 'm', or 'M' character indicating "minus". - - - - IF ( INDEX( '-_', OutListTmp(1:1) ) > 0 ) THEN - - OutListTmp = OutListTmp(2:) - ELSE IF ( INDEX( 'mM', OutListTmp(1:1) ) > 0 ) THEN ! We'll assume this is a variable name for now, (if not, we will check later if OutListTmp(2:) is also a variable name) - CheckOutListAgain = .TRUE. - - END IF - - CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case - - - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) - - IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again - ! ex, 'MTipDxc1' causes the sign of TipDxc1 to be switched. - OutListTmp = OutListTmp(2:) - - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) - END IF - - IF ( Indx > 0 ) THEN - newFoundMask(I) = .TRUE. - foundMask(I) = .TRUE. - GetWaves2Channels = GetWaves2Channels + 1 - - !ELSE - ! foundMask(I) = .FALSE. - END IF - END IF -END DO - - -IF ( GetWaves2Channels > 0 ) THEN - - count = 1 - ! ! Test that num channels does not exceed max possible channels due to size of OutList - ! ALLOCATE ( OutList(GetWaves2Channels) , STAT=ErrStat ) - ! IF ( ErrStat /= 0 ) THEN - ! ErrMsg = ' Error allocating memory for the OutList array in the GetWaves2Channels function.' - ! ErrStat = ErrID_Fatal - ! RETURN - ! END IF - - DO I = 1,NUserOutputs - IF ( newFoundMask(I) ) THEN - OutList(count) = UserOutputs(I) - count = count + 1 - END IF - - END DO - -END IF - - -END FUNCTION GetWaves2Channels - - - - -!==================================================================================================== -SUBROUTINE Wvs2OUT_ChkOutLst( OutList, y, p, ErrStat, ErrMsg ) -! This routine checks the names of inputted output channels, checks to see if any of them are ill- -! conditioned (returning an error if so), and assigns the OutputDataType settings (i.e, the index, -! name, and units of the output channels). -! Note that the Wamit module must be initialized prior to calling this function (if it -! is being used) so that it can correctly determine if the Lines outputs are valid. -!---------------------------------------------------------------------------------------------------- - - - - ! Passed variables - - TYPE(Waves2_OutputType), INTENT( INOUT ) :: y ! This module's internal data - TYPE(Waves2_ParameterType), INTENT( INOUT ) :: p ! parameter data for this instance of the Waves2 platform module - CHARACTER(ChanLen), INTENT( IN ) :: OutList (:) ! An array holding the names of the requested output channels. - INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred - CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None - - ! Local variables. - - CHARACTER(ErrMsgLen) :: ErrMsgTmp ! Temporary error message - INTEGER(IntKi) :: ErrStatTmp ! Temporary error status - - INTEGER :: I ! Generic loop-counting index. -! INTEGER :: J ! Generic loop-counting index. - INTEGER :: INDX ! Index for valid arrays - - CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I). - CHARACTER(28), PARAMETER :: OutPFmt = "( I4, 3X,A 10,1 X, A10 )" ! Output format parameter output list. - - - ! NOTE: The following lines of code were generated by a Matlab script called "Write_ChckOutLst.m" -! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these -! lines should be modified in the Matlab script and/or Excel worksheet as necessary. -! This code was generated by Write_ChckOutLst.m at 09-Jan-2013 14:53:03. - - LOGICAL :: InvalidOutput(MaxWaves2Outputs) ! This array determines if the output channel is valid for this configuration - - LOGICAL :: CheckOutListAgain - - ! Initialize ErrStat - - ErrStat = ErrID_None - ErrStatTmp = ErrID_None - ErrMsg = "" - ErrMsgTmp = "" - - InvalidOutput = .FALSE. - -!End of code generated by Matlab script - - !------------------------------------------------------------------------------------------------- - ! ALLOCATE the OutParam array - !------------------------------------------------------------------------------------------------- - - - ALLOCATE ( p%OutParam(p%NumOuts) , STAT=ErrStatTmp ) - IF ( ErrStatTmp /= 0 ) CALL SetErrStat(ErrID_Fatal,' Error allocating memory for the OutParam array.',ErrStat,ErrMsg,'Wvs2OUT_ChkOutLst') - IF ( ErrStat >= AbortErrLev ) RETURN - - - - - DO I = 1,p%NumOuts - - p%OutParam(I)%Name = OutList(I) - OutListTmp = OutList(I) - - - ! Reverse the sign (+/-) of the output channel if the user prefixed the - ! channel name with a '-', '_', 'm', or 'M' character indicating "minus". - - CheckOutListAgain = .FALSE. - - IF ( INDEX( '-_', OutListTmp(1:1) ) > 0 ) THEN - p%OutParam(I)%SignM = -1 ! ex, '-TipDxc1' causes the sign of TipDxc1 to be switched. - OutListTmp = OutListTmp(2:) - ELSE IF ( INDEX( 'mM', OutListTmp(1:1) ) > 0 ) THEN ! We'll assume this is a variable name for now, (if not, we will check later if OutListTmp(2:) is also a variable name) - CheckOutListAgain = .TRUE. - p%OutParam(I)%SignM = 1 - ELSE - p%OutParam(I)%SignM = 1 - END IF - - CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case - - - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) - - IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again - p%OutParam(I)%SignM = -1 ! ex, 'MTipDxc1' causes the sign of TipDxc1 to be switched. - OutListTmp = OutListTmp(2:) - - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) - END IF - - IF ( Indx > 0 ) THEN - p%OutParam(I)%Indx = ParamIndxAry(Indx) - IF ( InvalidOutput( ParamIndxAry(Indx) ) ) THEN - p%OutParam(I)%Units = 'INVALID' - p%OutParam(I)%Indx = 1 - p%OutParam(I)%SignM = 0 - ELSE - p%OutParam(I)%Units = ParamUnitsAry(Indx) - END IF - ELSE - ErrMsg = p%OutParam(I)%Name//' is not an available output channel.' - ErrStat = ErrID_Fatal - - p%OutParam(I)%Units = 'INVALID' - p%OutParam(I)%Indx = 1 - p%OutParam(I)%SignM = 0 ! this will print all zeros - END IF - - END DO - - - RETURN -END SUBROUTINE Wvs2OUT_ChkOutLst - - -!==================================================================================================== -SUBROUTINE Wvs2OUT_DestroyParam ( p, ErrStat, ErrMsg ) -! This function cleans up after running the Waves2 output module. It closes the output file, -! releases memory, and resets the number of outputs requested to 0. -!---------------------------------------------------------------------------------------------------- - - ! Passed variables - - TYPE(Waves2_ParameterType), INTENT( INOUT ) :: p ! parameter data for this instance of the Waves2 module - INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred - CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None - -! ! Internal variables - LOGICAL :: Err - - - !------------------------------------------------------------------------------------------------- - ! Initialize error information - !------------------------------------------------------------------------------------------------- - ErrStat = ErrID_None - ErrMsg = "" - Err = .FALSE. - - - - !------------------------------------------------------------------------------------------------- - ! Deallocate arrays - !------------------------------------------------------------------------------------------------- - IF ( ALLOCATED( p%OutParam ) ) DEALLOCATE ( p%OutParam, STAT=ErrStat ) - IF ( ErrStat /= 0 ) Err = .TRUE. - - !------------------------------------------------------------------------------------------------- - ! Reset number of outputs - !------------------------------------------------------------------------------------------------- - p%NumOuts = 0 - p%UnOutFile = -1 - - !p%WaveKinNd = -1 ! set this array to "invalid" - - !------------------------------------------------------------------------------------------------- - ! Make sure ErrStat is non-zero if an error occurred - !------------------------------------------------------------------------------------------------- - IF ( Err ) ErrStat = ErrID_Fatal - - RETURN - -END SUBROUTINE Wvs2OUT_DestroyParam -!==================================================================================================== - - -END MODULE Waves2_Output diff --git a/modules/hydrodyn/src/Current.f90 b/modules/seastate/src/Current.f90 similarity index 100% rename from modules/hydrodyn/src/Current.f90 rename to modules/seastate/src/Current.f90 diff --git a/modules/hydrodyn/src/Current.txt b/modules/seastate/src/Current.txt similarity index 100% rename from modules/hydrodyn/src/Current.txt rename to modules/seastate/src/Current.txt diff --git a/modules/hydrodyn/src/Current_Types.f90 b/modules/seastate/src/Current_Types.f90 similarity index 100% rename from modules/hydrodyn/src/Current_Types.f90 rename to modules/seastate/src/Current_Types.f90 diff --git a/modules/hydrodyn/src/UserWaves.f90 b/modules/seastate/src/UserWaves.f90 similarity index 100% rename from modules/hydrodyn/src/UserWaves.f90 rename to modules/seastate/src/UserWaves.f90 diff --git a/modules/hydrodyn/src/Waves.f90 b/modules/seastate/src/Waves.f90 similarity index 100% rename from modules/hydrodyn/src/Waves.f90 rename to modules/seastate/src/Waves.f90 diff --git a/modules/hydrodyn/src/Waves.txt b/modules/seastate/src/Waves.txt similarity index 100% rename from modules/hydrodyn/src/Waves.txt rename to modules/seastate/src/Waves.txt diff --git a/modules/hydrodyn/src/Waves2.f90 b/modules/seastate/src/Waves2.f90 similarity index 100% rename from modules/hydrodyn/src/Waves2.f90 rename to modules/seastate/src/Waves2.f90 diff --git a/modules/hydrodyn/src/Waves2.txt b/modules/seastate/src/Waves2.txt similarity index 100% rename from modules/hydrodyn/src/Waves2.txt rename to modules/seastate/src/Waves2.txt diff --git a/modules/hydrodyn/src/Waves2_Types.f90 b/modules/seastate/src/Waves2_Types.f90 similarity index 100% rename from modules/hydrodyn/src/Waves2_Types.f90 rename to modules/seastate/src/Waves2_Types.f90 diff --git a/modules/hydrodyn/src/Waves_Types.f90 b/modules/seastate/src/Waves_Types.f90 similarity index 100% rename from modules/hydrodyn/src/Waves_Types.f90 rename to modules/seastate/src/Waves_Types.f90 From 32b2e74b2047e88252ecf38931804c6f1bf8eb9c Mon Sep 17 00:00:00 2001 From: Greg Hayman Date: Tue, 21 Sep 2021 20:16:46 -0600 Subject: [PATCH 02/35] Initial SeaState Module Functionality Added SeaState Module. This includes a new SeaState input file and a stand alone SeasState driver program. SeaState encompasses the Current, Waves, UserWaves, and Waves2 modules, and a new interpolation module. The wave kinematics are now defined on a 3D grid and the physics modules obtain kinematics for any point by interpolating the grid data. --- docs/OtherSupporting/OutListParameters.xlsx | Bin 566317 -> 570113 bytes modules/seastate/CMakeLists.txt | 54 + modules/seastate/README.md | 9 + modules/seastate/src/Current.f90 | 10 +- modules/seastate/src/Current.txt | 4 +- modules/seastate/src/Current_Types.f90 | 60 +- modules/seastate/src/SeaState.f90 | 1505 +++++ modules/seastate/src/SeaState.txt | 159 + modules/seastate/src/SeaState_DriverCode.f90 | 717 +++ modules/seastate/src/SeaState_Input.f90 | 1409 +++++ .../seastate/src/SeaState_Interp_Types.f90 | 771 +++ modules/seastate/src/SeaState_Output.f90 | 1025 ++++ modules/seastate/src/SeaState_Types.f90 | 5303 +++++++++++++++++ modules/seastate/src/UserWaves.f90 | 131 +- modules/seastate/src/Waves.f90 | 275 +- modules/seastate/src/Waves.txt | 36 +- modules/seastate/src/Waves2.f90 | 216 +- modules/seastate/src/Waves2.txt | 69 +- modules/seastate/src/Waves2_Types.f90 | 1403 +---- modules/seastate/src/Waves_Types.f90 | 702 +-- modules/seastate/src/seastate_Interp.f90 | 634 ++ modules/seastate/src/seastate_Interp.txt | 41 + vs-build/RunRegistry.bat | 17 +- 23 files changed, 12506 insertions(+), 2044 deletions(-) create mode 100644 modules/seastate/CMakeLists.txt create mode 100644 modules/seastate/README.md create mode 100644 modules/seastate/src/SeaState.f90 create mode 100644 modules/seastate/src/SeaState.txt create mode 100644 modules/seastate/src/SeaState_DriverCode.f90 create mode 100644 modules/seastate/src/SeaState_Input.f90 create mode 100644 modules/seastate/src/SeaState_Interp_Types.f90 create mode 100644 modules/seastate/src/SeaState_Output.f90 create mode 100644 modules/seastate/src/SeaState_Types.f90 create mode 100644 modules/seastate/src/seastate_Interp.f90 create mode 100644 modules/seastate/src/seastate_Interp.txt diff --git a/docs/OtherSupporting/OutListParameters.xlsx b/docs/OtherSupporting/OutListParameters.xlsx index aeb7f5289c550def616c9b501c5bec5ba2c302f9..bbfcb4cadd028efc9484bf2510cd9dfe9e74a77f 100644 GIT binary patch literal 570113 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
g1D^LEh^Gx1;jEb(lHt$yhh{SdcSO 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
  • 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

    fJ^f+o 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

    3_TNpPzBeigZM*uReq$ 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

    k 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

    =0p~E9DA8 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 xr#HVd^X49Vz@cXhlP_TXmt#s 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

    8Yiw^*7IZ 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%0D6i7s2hCjdJT)19xpKCo--O5iW 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 z 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 RyU>HsfJ;~O*sBeQ{{sSbW?ldQ diff --git a/modules/seastate/CMakeLists.txt b/modules/seastate/CMakeLists.txt new file mode 100644 index 0000000000..acdef872ed --- /dev/null +++ b/modules/seastate/CMakeLists.txt @@ -0,0 +1,54 @@ +# +# Copyright 2021 National Renewable Energy Laboratory +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +if (GENERATE_TYPES) + generate_f90_types(src/Current.txt ${CMAKE_CURRENT_LIST_DIR}/src/Current_Types.f90) + generate_f90_types(src/Waves.txt ${CMAKE_CURRENT_LIST_DIR}/src/Waves_Types.f90) + generate_f90_types(src/Waves2.txt ${CMAKE_CURRENT_LIST_DIR}/src/Waves2_Types.f90 -noextrap) + generate_f90_types(src/seastate_interp.txt ${CMAKE_CURRENT_LIST_DIR}/src/SeaState_Interp_Types.f90 -noextrap) + generate_f90_types(src/SeaState.txt ${CMAKE_CURRENT_LIST_DIR}/src/SeaState_Types.f90 -noextrap) +endif() + +set(SEAST_SOURCES + src/Current.f90 + src/Waves.f90 + src/Waves2.f90 + src/UserWaves.f90 + src/seastate_interp.f90 + src/SeaState.f90 + src/SeaState_Output.f90 + src/Current_Types.f90 + src/Waves_Types.f90 + src/Waves2_Types.f90 + src/SeaState_Interp_Types.f90 + src/SeaState_Types.f90 +) + +add_library(seastlib ${SEAST_SOURCES}) +target_link_libraries(seastlib nwtclibs) + +set(SEAST_DRIVER_SOURCES + src/SeaState_DriverCode.f90 +) + +add_executable(seastate_driver ${SEAST_DRIVER_SOURCES}) +target_link_libraries(seastate_driver seastlib ${CMAKE_DL_LIBS}) + +install(TARGETS seastate_driver seastlib + EXPORT "${CMAKE_PROJECT_NAME}Libraries" + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) diff --git a/modules/seastate/README.md b/modules/seastate/README.md new file mode 100644 index 0000000000..57c6b9672c --- /dev/null +++ b/modules/seastate/README.md @@ -0,0 +1,9 @@ +# SeaState Module +The legacy version of this module was incorporated within the HydroDyn module. Additional documentation are available +at the [NWTC Software Portal](https://nwtc.nrel.gov/HydroDyn/). + +## Overview +SeaState is a module for modeling hydrodynamics. It has been coupled +into the OpenFAST multi-physics engineering tool to enable hydrodynamic +simulation of horizontal-axis wind turbines. SeaState can also be driven +as a standalone code to generate wave elevation and kinematic data uncoupled from OpenFAST. diff --git a/modules/seastate/src/Current.f90 b/modules/seastate/src/Current.f90 index a7415f6779..88440e0c5a 100644 --- a/modules/seastate/src/Current.f90 +++ b/modules/seastate/src/Current.f90 @@ -208,16 +208,16 @@ SUBROUTINE Current_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! IF there are Morison elements, then compute the current components at each morison node elevation - IF ( InitInp%NMorisonNodes > 0 ) THEN + IF ( InitInp%NGridPts > 0 ) THEN - ALLOCATE ( InitOut%CurrVxi( InitInp%NMorisonNodes ) , STAT=ErrStat ) + ALLOCATE ( InitOut%CurrVxi( InitInp%NGridPts ) , STAT=ErrStat ) IF ( ErrStat /= ErrID_None ) THEN ErrMsg = ' Error allocating memory for the CurrVxi array.' ErrStat = ErrID_Fatal RETURN END IF - ALLOCATE ( InitOut%CurrVyi( InitInp%NMorisonNodes ) , STAT=ErrStat ) + ALLOCATE ( InitOut%CurrVyi( InitInp%NGridPts ) , STAT=ErrStat ) IF ( ErrStat /= ErrID_None ) THEN ErrMsg = ' Error allocating memory for the CurrVyi array.' ErrStat = ErrID_Fatal @@ -227,9 +227,9 @@ SUBROUTINE Current_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Loop over all of the points where current information is required - DO I = 1, InitInp%NMorisonNodes + DO I = 1, InitInp%NGridPts - CALL Calc_Current( InitInp, InitInp%MorisonNodezi(I), InitInp%WtrDpth, InitInp%DirRoot, CurrVxi, CurrVyi ) + CALL Calc_Current( InitInp, InitInp%WaveKinzi(I), InitInp%WtrDpth, InitInp%DirRoot, CurrVxi, CurrVyi ) InitOut%CurrVxi(I) = CurrVxi InitOut%CurrVyi(I) = CurrVyi diff --git a/modules/seastate/src/Current.txt b/modules/seastate/src/Current.txt index 5008b1b0af..54db13cf13 100644 --- a/modules/seastate/src/Current.txt +++ b/modules/seastate/src/Current.txt @@ -28,8 +28,8 @@ typedef ^ ^ SiKi Cu typedef ^ ^ SiKi CurrDIDir - - - "" - typedef ^ ^ INTEGER CurrMod - - - "" - typedef ^ ^ SiKi WtrDpth - - - "" - -typedef ^ ^ SiKi MorisonNodezi {:} - - "" - -typedef ^ ^ INTEGER NMorisonNodes - - - "" - +typedef ^ ^ SiKi WaveKinzi {:} - - "" - +typedef ^ ^ INTEGER NGridPts - - - "" - typedef ^ ^ CHARACTER(1024) DirRoot - "" - "" - # # diff --git a/modules/seastate/src/Current_Types.f90 b/modules/seastate/src/Current_Types.f90 index f262434bca..5cc09396e6 100644 --- a/modules/seastate/src/Current_Types.f90 +++ b/modules/seastate/src/Current_Types.f90 @@ -45,8 +45,8 @@ MODULE Current_Types REAL(SiKi) :: CurrDIDir !< [-] INTEGER(IntKi) :: CurrMod !< [-] REAL(SiKi) :: WtrDpth !< [-] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: MorisonNodezi !< [-] - INTEGER(IntKi) :: NMorisonNodes !< [-] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinzi !< [-] + INTEGER(IntKi) :: NGridPts !< [-] CHARACTER(1024) :: DirRoot !< [-] END TYPE Current_InitInputType ! ======================= @@ -124,19 +124,19 @@ SUBROUTINE Current_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, DstInitInputData%CurrDIDir = SrcInitInputData%CurrDIDir DstInitInputData%CurrMod = SrcInitInputData%CurrMod DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth -IF (ALLOCATED(SrcInitInputData%MorisonNodezi)) THEN - i1_l = LBOUND(SrcInitInputData%MorisonNodezi,1) - i1_u = UBOUND(SrcInitInputData%MorisonNodezi,1) - IF (.NOT. ALLOCATED(DstInitInputData%MorisonNodezi)) THEN - ALLOCATE(DstInitInputData%MorisonNodezi(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcInitInputData%WaveKinzi)) THEN + i1_l = LBOUND(SrcInitInputData%WaveKinzi,1) + i1_u = UBOUND(SrcInitInputData%WaveKinzi,1) + IF (.NOT. ALLOCATED(DstInitInputData%WaveKinzi)) THEN + ALLOCATE(DstInitInputData%WaveKinzi(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%MorisonNodezi.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveKinzi.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstInitInputData%MorisonNodezi = SrcInitInputData%MorisonNodezi + DstInitInputData%WaveKinzi = SrcInitInputData%WaveKinzi ENDIF - DstInitInputData%NMorisonNodes = SrcInitInputData%NMorisonNodes + DstInitInputData%NGridPts = SrcInitInputData%NGridPts DstInitInputData%DirRoot = SrcInitInputData%DirRoot END SUBROUTINE Current_CopyInitInput @@ -149,8 +149,8 @@ SUBROUTINE Current_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(InitInputData%MorisonNodezi)) THEN - DEALLOCATE(InitInputData%MorisonNodezi) +IF (ALLOCATED(InitInputData%WaveKinzi)) THEN + DEALLOCATE(InitInputData%WaveKinzi) ENDIF END SUBROUTINE Current_DestroyInitInput @@ -199,12 +199,12 @@ SUBROUTINE Current_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Re_BufSz = Re_BufSz + 1 ! CurrDIDir Int_BufSz = Int_BufSz + 1 ! CurrMod Re_BufSz = Re_BufSz + 1 ! WtrDpth - Int_BufSz = Int_BufSz + 1 ! MorisonNodezi allocated yes/no - IF ( ALLOCATED(InData%MorisonNodezi) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! MorisonNodezi upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%MorisonNodezi) ! MorisonNodezi + Int_BufSz = Int_BufSz + 1 ! WaveKinzi allocated yes/no + IF ( ALLOCATED(InData%WaveKinzi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveKinzi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveKinzi) ! WaveKinzi END IF - Int_BufSz = Int_BufSz + 1 ! NMorisonNodes + Int_BufSz = Int_BufSz + 1 ! NGridPts Int_BufSz = Int_BufSz + 1*LEN(InData%DirRoot) ! DirRoot IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) @@ -255,22 +255,22 @@ SUBROUTINE Current_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 1 ReKiBuf(Re_Xferred) = InData%WtrDpth Re_Xferred = Re_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%MorisonNodezi) ) THEN + IF ( .NOT. ALLOCATED(InData%WaveKinzi) ) 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%MorisonNodezi,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%MorisonNodezi,1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveKinzi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveKinzi,1) Int_Xferred = Int_Xferred + 2 - DO i1 = LBOUND(InData%MorisonNodezi,1), UBOUND(InData%MorisonNodezi,1) - ReKiBuf(Re_Xferred) = InData%MorisonNodezi(i1) + DO i1 = LBOUND(InData%WaveKinzi,1), UBOUND(InData%WaveKinzi,1) + ReKiBuf(Re_Xferred) = InData%WaveKinzi(i1) Re_Xferred = Re_Xferred + 1 END DO END IF - IntKiBuf(Int_Xferred) = InData%NMorisonNodes + IntKiBuf(Int_Xferred) = InData%NGridPts Int_Xferred = Int_Xferred + 1 DO I = 1, LEN(InData%DirRoot) IntKiBuf(Int_Xferred) = ICHAR(InData%DirRoot(I:I), IntKi) @@ -327,25 +327,25 @@ SUBROUTINE Current_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Xferred = Int_Xferred + 1 OutData%WtrDpth = REAL(ReKiBuf(Re_Xferred), SiKi) Re_Xferred = Re_Xferred + 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! MorisonNodezi not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveKinzi 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 - IF (ALLOCATED(OutData%MorisonNodezi)) DEALLOCATE(OutData%MorisonNodezi) - ALLOCATE(OutData%MorisonNodezi(i1_l:i1_u),STAT=ErrStat2) + IF (ALLOCATED(OutData%WaveKinzi)) DEALLOCATE(OutData%WaveKinzi) + ALLOCATE(OutData%WaveKinzi(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%MorisonNodezi.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveKinzi.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i1 = LBOUND(OutData%MorisonNodezi,1), UBOUND(OutData%MorisonNodezi,1) - OutData%MorisonNodezi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + DO i1 = LBOUND(OutData%WaveKinzi,1), UBOUND(OutData%WaveKinzi,1) + OutData%WaveKinzi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) Re_Xferred = Re_Xferred + 1 END DO END IF - OutData%NMorisonNodes = IntKiBuf(Int_Xferred) + OutData%NGridPts = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 DO I = 1, LEN(OutData%DirRoot) OutData%DirRoot(I:I) = CHAR(IntKiBuf(Int_Xferred)) diff --git a/modules/seastate/src/SeaState.f90 b/modules/seastate/src/SeaState.f90 new file mode 100644 index 0000000000..479d5a5d0f --- /dev/null +++ b/modules/seastate/src/SeaState.f90 @@ -0,0 +1,1505 @@ +!********************************************************************************************************************************** +! The SeaState and SeaState_Types modules make up a template for creating user-defined calculations in the FAST Modularization +! Framework. HydroDyns_Types will be auto-generated based on a description of the variables for the module. +! +! "SeaState" should be replaced with the name of your module. Example: SeaState +! "SeaState" (in SeaState_*) should be replaced with the module name or an abbreviation of it. Example: HD +!.................................................................................................................................. +! LICENSING +! Copyright (C) 2013-2015 National Renewable Energy Laboratory +! +! This file is part of SeaState. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** +MODULE SeaState + + USE SeaState_Types + USE NWTC_Library + USE SeaState_Input + USE SeaState_Output + use SeaState_Interp + USE Current + USE Waves2 + + IMPLICIT NONE + + PRIVATE + + + TYPE(ProgDesc), PARAMETER :: SeaState_ProgDesc = ProgDesc( 'SeaState', '', '' ) + + + + + ! ..... Public Subroutines ................................................................................................... + + PUBLIC :: SeaState_Init ! Initialization routine + PUBLIC :: SeaState_End ! Ending routine (includes clean up) + + PUBLIC :: SeaState_UpdateStates ! Loose coupling routine for solving for constraint states, integrating + ! continuous states, and updating discrete states + PUBLIC :: SeaState_CalcOutput ! Routine for computing outputs + + PUBLIC :: SeaState_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual + PUBLIC :: SeaState_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states + !PUBLIC :: SeaState_UpdateDiscState ! Tight coupling routine for updating discrete states + + + CONTAINS +!---------------------------------------------------------------------------------------------------------------------------------- +!> This function returns a string describing the glue code and some of the compilation options we're using. +FUNCTION GetVersion(ThisProgVer) + + ! Passed Variables: + + TYPE(ProgDesc), INTENT( IN ) :: ThisProgVer !< program name/date/version description + CHARACTER(1024) :: GetVersion !< String containing a description of the compiled precision. + + CHARACTER(200) :: git_commit + + GetVersion = TRIM(GetNVD(ThisProgVer))//' was compiled' + + + + GetVersion = TRIM(GetVersion)//' as a '//TRIM(Num2LStr(BITS_IN_ADDR))//'-bit application using' + + ! determine precision + + IF ( ReKi == SiKi ) THEN ! Single precision + GetVersion = TRIM(GetVersion)//' single' + ELSEIF ( ReKi == R8Ki ) THEN ! Double precision + GetVersion = TRIM(GetVersion)// ' double' + ELSE ! Unknown precision + GetVersion = TRIM(GetVersion)//' unknown' + ENDIF + + +! GetVersion = TRIM(GetVersion)//' precision with '//OS_Desc + GetVersion = TRIM(GetVersion)//' precision' + + ! add git info + git_commit = QueryGitVersion() + GetVersion = TRIM(GetVersion)//' at commit '//git_commit + + RETURN +END FUNCTION GetVersion +!subroutine ConvertWaveDataToSeaStatePointers(Waves_InitOut, p, ErrStat, ErrMsg) +! TYPE(Waves_InitOutputType), INTENT(in ) :: Waves_InitOut !< Output from Waves initialization routine +! TYPE(SeaState_ParameterType), INTENT(inout) :: p !< SeaState Parameters +! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation +! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +! +! +! ! Local variables +! integer(IntKi) i,j,k,t, count ! counters +! INTEGER(IntKi) :: ErrStat2 ! local error status +! CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message +! CHARACTER(*), PARAMETER :: RoutineName = 'ConvertWaveDataToSeaStatePointers' +! +! +! +! ! Initialize ErrStat +! +! ErrStat = ErrID_None +! ErrStat2= ErrID_None +! ErrMsg = "" +! ErrMsg2 = "" +!! Waves data arrays (in order to avoid a rewrite of Waves.f90 are stored with indices: WaveTime, Node, 3D Vector component) +!! But Seastate arrays need to be stored: WaveTime, Xcoord, Ycoord, Zcoord, and now 3D components are stored separately +! +!! allocate seastate pointer data +!ALLOCATE ( p%WaveVelxNew (p%NGrid(1), p%NGrid(2), p%NGrid(3), p%NGrid(4) ) , STAT=ErrStat2 ) +! IF ( ErrStat2 /= 0 ) THEN +! CALL SetErrStat(ErrID_Fatal,'Error allocating memory for the SeaState WaveElev array.',ErrStat,ErrMsg,RoutineName) +! RETURN +! END IF +!ALLOCATE ( p%WaveVelyNew (p%NGrid(1), p%NGrid(2), p%NGrid(3), p%NGrid(4) ) , STAT=ErrStat2 ) +! IF ( ErrStat2 /= 0 ) THEN +! CALL SetErrStat(ErrID_Fatal,'Error allocating memory for the SeaState WaveElev array.',ErrStat,ErrMsg,RoutineName) +! RETURN +! END IF +!ALLOCATE ( p%WaveVelzNew (p%NGrid(1), p%NGrid(2), p%NGrid(3), p%NGrid(4) ) , STAT=ErrStat2 ) +! IF ( ErrStat2 /= 0 ) THEN +! CALL SetErrStat(ErrID_Fatal,'Error allocating memory for the SeaState WaveElev array.',ErrStat,ErrMsg,RoutineName) +! RETURN +! END IF +! count = 0 +! do k = 1,p%NGrid(4) +! do j = 1,p%NGrid(3) +! do i = 1,p%NGrid(2) +! do t = 1,p%NGrid(1) +! p%WaveVelxNew(t,i,j,k) = Waves_InitOut%WaveVel(t-1,count,1) +! p%WaveVelyNew(t,i,j,k) = Waves_InitOut%WaveVel(t-1,count,2) +! p%WaveVelzNew(t,i,j,k) = Waves_InitOut%WaveVel(t-1,count,3) +! count = count + 1 +! end do +! end do +! end do +! end do +! +!end subroutine ConvertWaveDataToSeaStatePointers +!TODO: This stretch needs the morison nodeInWater locations, which don't exist in SeaState module!!! +!SUBROUTINE WvStretch_Init(WaveStMod, WtrDpth, NStepWave, NNodes, & +! NWaveElev, WaveElev, WaveKinzi, WaveTime, & +! WaveVel0, WaveAcc0, WaveDynP0, & +! WavePVel0, WavePAcc0, WavePDynP0, & +! WaveVel , WaveAcc , WaveDynP , & +! nodeInWater, ErrStat, ErrMsg ) +! +! +! INTEGER, INTENT(IN ) :: WaveStMod +! REAL(SiKi), INTENT(IN ) :: WtrDpth +! INTEGER, INTENT(IN ) :: NStepWave +! INTEGER, INTENT(IN ) :: NNodes +! INTEGER, INTENT(IN ) :: NWaveElev +! REAL(SiKi), INTENT(IN ) :: WaveElev(0:,:) +! REAL(SiKi), INTENT(IN ) :: WaveKinzi(:) +! REAL(SiKi), INTENT(IN ) :: WaveTime(0:) +! REAL(SiKi), INTENT(IN ) :: WaveVel0(0:,:,:) !< Wave velocity in Global coordinate system at Z = 0. Each point in this array has a corresponding entry (same index #) in the WaveVel array +! REAL(SiKi), INTENT(IN ) :: WaveAcc0(0:,:,:) +! REAL(SiKi), INTENT(IN ) :: WaveDynP0(0:,:) +! REAL(SiKi), INTENT(IN ) :: WavePVel0(0:,:,:) !< Wave velocity in Global coordinate system at Z = 0. Each point in this array has a corresponding entry (same index #) in the WaveVel array +! REAL(SiKi), INTENT(IN ) :: WavePAcc0(0:,:,:) +! REAL(SiKi), INTENT(IN ) :: WavePDynP0(0:,:) +! REAL(SiKi), INTENT(INOUT) :: WaveVel(0:,:,:) +! REAL(SiKi), INTENT(INOUT) :: WaveAcc(0:,:,:) +! REAL(SiKi), INTENT(INOUT) :: WaveDynP(0:,:) +! INTEGER(IntKi), INTENT(INOUT) :: nodeInWater(0:,:) +! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation +! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +! +! ! Local variables +! INTEGER(IntKi) :: I, J !< Local loop counters +! REAL(SiKi) :: wavekinzloc ,WavePVel0loc +! +! ! Initialize ErrStat +! ErrStat = ErrID_None +! ErrMsg = "" +! +! +! DO I = 0,NStepWave-1 ! Loop through all time steps +! +! DO J = 1,NNodes +! +! SELECT CASE ( WaveStMod ) ! Which model are we using to extrapolate the incident wave kinematics to the instantaneous free surface? +! +! CASE ( 0 ) ! None = no stretching. +! ! Since we have no stretching, the wave kinematics between the seabed and +! ! the mean sea level are left unchanged; below the seabed or above the +! ! mean sea level, the wave kinematics are zero: +! IF ( ( WaveKinzi(J) < -WtrDpth ) .OR. ( WaveKinzi(J) > 0.0 ) ) THEN ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above mean sea level (exclusive) +! +! WaveDynP (I,J ) = 0.0 +! WaveVel (I,J,:) = 0.0 +! WaveAcc (I,J,:) = 0.0 +! nodeInWater(I,J ) = 0 +! ELSE +! nodeInWater(I,J ) = 1 +! END IF +! CASE ( 1 ) ! Vertical stretching. +! +! +! ! Vertical stretching says that the wave kinematics above the mean sea level +! ! equal the wave kinematics at the mean sea level. The wave kinematics +! ! below the mean sea level are left unchanged: +! IF ( ( WaveKinzi(J) < -WtrDpth ) .OR. ( WaveKinzi(J) > WaveElev(I,J) ) ) THEN ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above the instantaneous wave elevation (exclusive) +! +! WaveDynP (I,J ) = 0.0 +! WaveVel (I,J,:) = 0.0 +! WaveAcc (I,J,:) = 0.0 +! nodeInWater(I,J ) = 0 +! ELSE +! nodeInWater(I,J ) = 1 +! IF ( WaveKinzi(J) >= 0.0_ReKi ) THEN +! ! Set the wave kinematics to the kinematics at mean sea level for locations above MSL, but below the wave elevation. +! WaveDynP (I,J ) = WaveDynP0 (I,J ) +! WaveVel (I,J,:) = WaveVel0 (I,J,:) +! WaveAcc (I,J,:) = WaveAcc0 (I,J,:) +! END IF +! ! Otherwise, do nothing because the kinematics have already be set correctly via the various Waves modules +! END IF +! +! +! +! +! CASE ( 2 ) ! Extrapolation stretching. +! +! +! ! Extrapolation stretching uses a linear Taylor expansion of the wave +! ! kinematics (and their partial derivatives with respect to z) at the mean +! ! sea level to find the wave kinematics above the mean sea level. The +! ! wave kinematics below the mean sea level are left unchanged: +! +! +! IF ( ( WaveKinzi(J) < -WtrDpth ) .OR. ( WaveKinzi(J) > WaveElev(I,J) ) ) THEN ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above the instantaneous wave elevation (exclusive) +! +! WaveDynP (I,J ) = 0.0 +! WaveVel (I,J,:) = 0.0 +! WaveAcc (I,J,:) = 0.0 +! nodeInWater(I,J ) = 0 +! ELSE +! nodeInWater(I,J ) = 1 +! wavekinzloc = WaveKinzi(J) +! WavePVel0loc = WavePVel0 (I,J,1) +! IF ( WaveKinzi(J) >= 0.0_ReKi ) THEN +! ! Set the wave kinematics to the kinematics at mean sea level for locations above MSL, but below the wave elevation. +! WaveDynP (I,J ) = WaveDynP0 (I,J ) + WaveKinzi(J)*WavePDynP0 (I,J ) +! WaveVel (I,J,:) = WaveVel0 (I,J,:) + WaveKinzi(J)*WavePVel0 (I,J,:) +! WaveAcc (I,J,:) = WaveAcc0 (I,J,:) + WaveKinzi(J)*WavePAcc0 (I,J,:) +! END IF +! ! Otherwise, do nothing because the kinematics have already be set correctly via the various Waves modules +! END IF +! +! +! CASE ( 3 ) ! Wheeler stretching. +! +! +! ! Wheeler stretching says that wave kinematics calculated using Airy theory +! ! at the mean sea level should actually be applied at the instantaneous +! ! free surface and that Airy wave kinematics computed at locations between +! ! the seabed and the mean sea level should be shifted vertically to new +! ! locations in proportion to their elevation above the seabed. +! ! +! ! Computing the wave kinematics with Wheeler stretching requires that first +! ! say that the wave kinematics we computed at the elevations defined by +! ! the WaveKinzi0Prime(:) array are actual applied at the elevations found +! ! by stretching the elevations in the WaveKinzi0Prime(:) array using the +! ! instantaneous wave elevation--these new elevations are stored in the +! ! WaveKinzi0St(:) array. Next, we interpolate the wave kinematics +! ! computed without stretching to the desired elevations (defined in the +! ! WaveKinzi(:) array) using the WaveKinzi0St(:) array: +! +! +! ENDSELECT +! END DO ! J - All points where the incident wave kinematics will be computed +! END DO ! I - All time steps +! +! ! Set the ending timestep to the same as the first timestep +! WaveDynP (NStepWave,: ) = WaveDynP (0,: ) +! WaveVel (NStepWave,:,:) = WaveVel (0,:,:) +! WaveAcc (NStepWave,:,:) = WaveAcc (0,:,:) +! +!END SUBROUTINE WvStretch_Init + +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine is called at the start of the simulation to perform initialization steps. +!! The parameters are set here and not changed during the simulation. +!! The initial states and initial guess for the input are defined. +SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) +!.................................................................................................................................. + + TYPE(SeaState_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization routine. + TYPE(SeaState_InputType), INTENT( OUT) :: u !< An initial guess for the input; input mesh must be defined + TYPE(SeaState_ParameterType), INTENT( OUT) :: p !< Parameters + TYPE(SeaState_ContinuousStateType), INTENT( OUT) :: x !< Initial continuous states + TYPE(SeaState_DiscreteStateType), INTENT( OUT) :: xd !< Initial discrete states + TYPE(SeaState_ConstraintStateType), INTENT( OUT) :: z !< Initial guess of the constraint states + TYPE(SeaState_OtherStateType), INTENT( OUT) :: OtherState !< Initial other states + TYPE(SeaState_OutputType), INTENT( OUT) :: y !< Initial system outputs (outputs are not calculated; + !! only the output mesh is initialized) + TYPE(SeaState_MiscVarType), INTENT( OUT) :: m !< Initial misc/optimization variables + REAL(DbKi), INTENT(INOUT) :: Interval !< Coupling interval in seconds: the rate that + !! (1) SeaState_UpdateStates() is called in loose coupling & + !! (2) SeaState_UpdateDiscState() is called in tight coupling. + !! Input is the suggested time from the glue code; + !! Output is the actual coupling interval that will be used + !! by the glue code. + TYPE(SeaState_InitOutputType), INTENT( OUT) :: InitOut !< Output for initialization routine + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + ! Local variables + + CHARACTER(1024) :: SummaryName ! name of the SeaState summary file + TYPE(SeaState_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(SeaState_Interp_InitInputType) :: SeaSt_Interp_InitInp +! TYPE(Waves2_InitOutputType) :: Waves2_InitOut ! Initialization Outputs from the Waves2 module initialization + TYPE(Current_InitOutputType) :: Current_InitOut ! Initialization Outputs from the Current module initialization + INTEGER :: I, J, k, iBody ! Generic counters + REAL(SiKi) :: WaveNmbr ! Wavenumber of the current frequency component (1/meter) + ! These are dummy variables to satisfy the framework, but are not used + + TYPE(Waves_InputType) :: Waves_u ! Waves module initial guess for the input; the input mesh is not defined because it is not used by the waves module + TYPE(Waves_ParameterType) :: Waves_p ! Waves module parameters + TYPE(Waves_ContinuousStateType) :: Waves_x ! Waves module initial continuous states + TYPE(Waves_DiscreteStateType) :: Waves_xd ! Waves module discrete states + TYPE(Waves_ConstraintStateType) :: Waves_z ! Waves module initial guess of the constraint states + TYPE(Waves_OtherStateType) :: WavesOtherState ! Waves module other states + TYPE(Waves_MiscVarType) :: Waves_m ! Waves module misc/optimization data + TYPE(Waves_OutputType) :: Waves_y ! Waves module outputs + + + TYPE(Current_InputType) :: Current_u ! Current module initial guess for the input; the input mesh is not defined because it is not used by the Current module + TYPE(Current_ParameterType) :: Current_p ! Current module parameters + TYPE(Current_ContinuousStateType) :: Current_x ! Current module initial continuous states + TYPE(Current_DiscreteStateType) :: Current_xd ! Current module discrete states + TYPE(Current_ConstraintStateType) :: Current_z ! Current module initial guess of the constraint states + TYPE(Current_OtherStateType) :: CurrentOtherState ! Current module other states + TYPE(Current_OutputType) :: Current_y ! Current module outputs + TYPE(Current_MiscVarType) :: Current_m ! Current module misc/optimization data + + Real(ReKi) :: Np + Real(ReKi) :: dftreal + Real(ReKi) :: dftimag + + ! WAMIT Mesh + real(R8Ki) :: theta(3), orientation(3,3) + + ! Wave Stretching Data + REAL(SiKi), ALLOCATABLE :: tmpWaveKinzi(: ) + 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 (:,:,:) + ! REAL(SiKi), ALLOCATABLE :: WaveDynP0 (:,: ) + REAL(SiKi), ALLOCATABLE :: WaveVel2S0 (:,:,:) + REAL(SiKi), ALLOCATABLE :: WaveAcc2S0 (:,:,:) + REAL(SiKi), ALLOCATABLE :: WaveDynP2S0 (:,: ) + REAL(SiKi), ALLOCATABLE :: WaveVel2D0 (:,:,:) + REAL(SiKi), ALLOCATABLE :: WaveAcc2D0 (:,:,:) + REAL(SiKi), ALLOCATABLE :: WaveDynP2D0 (:,: ) + + CHARACTER(1024) :: versionStr + INTEGER(IntKi) :: ErrStat2 ! local error status + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Init' + + CHARACTER(64) :: Frmt + CHARACTER(2) :: Delim + + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + p%UnOutFile = -1 !bjj: this was being written to the screen when I had an error in my HD input file, so I'm going to initialize here. + +#ifdef BETA_BUILD + CALL DispBetaNotice( "This is a beta version of SeaState and is for testing purposes only."//NewLine//"This version includes user waves, WaveMod=6 and the ability to write example user waves." ) +#endif + + ! Initialize the NWTC Subroutine Library + + CALL NWTC_Init( ) + + + ! Display the module information + + CALL DispNVD( SeaState_ProgDesc ) + + + 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 SeaState-related input and populate the InputFileData structure + CALL SeaState_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 SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF + + p%DT = Interval + + ! Open a summary of the SeaState Initialization. Note: OutRootName must be set by the caller because there may not be an input file to obtain this rootname from. + + IF ( InputFileData%SeaStSum ) THEN + + SummaryName = TRIM(InitInp%OutRootName)//'.HD.sum' + CALL SeaStOut_OpenSum( InputFileData%UnSum, SummaryName, SeaState_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() + RETURN + END IF + + ELSE + + InputFileData%UnSum = -1 + + END IF + + ! Set summary unit number in Waves, Radiation, and Morison initialization input data + + InputFileData%Waves%UnSum = InputFileData%UnSum + + + ! Now call each sub-module's *_Init subroutine + ! to fully initialize each sub-module based on the necessary initialization data + + + ! Initialize Current module + + 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 + CALL CleanUp() + RETURN + END IF + + ! Verify that Current_Init() did not request a different Interval! + + IF ( p%DT /= Interval ) THEN + CALL SetErrStat(ErrID_Fatal,'Current Module attempted to change timestep interval, but this is not allowed. Current Module must use the SeaState Interval.',ErrStat,ErrMsg,RoutineName) + CALL CleanUp() + RETURN + END IF + + + ! 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, InputFileData%Waves%CurrVxi ) + IF (ALLOCATED(Current_InitOut%CurrVyi)) CALL Move_Alloc( Current_InitOut%CurrVyi, InputFileData%Waves%CurrVyi ) + + InputFileData%Waves%PCurrVxiPz0 = Current_InitOut%PCurrVxiPz0 + InputFileData%Waves%PCurrVyiPz0 = Current_InitOut%PCurrVyiPz0 + + + ! Copy the WaveElevXY data in from the SeaState 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 + + + ! Initialize Waves module + +!========================================================================== +! Initialize Wave Stretching data for 1st Order Waves +!========================================================================== + ! IF (InputFileData%Waves%WaveStMod > 0) THEN + ! ! Allocate the temporary storage array for the WvKinxi + ! 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() + ! RETURN + ! END IF + ! + ! + ! + ! 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 (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 ( 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 ( 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 + ! + ! InputFileData%Waves%NWaveElev = InputFileData%Waves%NWaveKin + ! InputFileData%Waves%WaveElevxi = InputFileData%Waves%WaveKinxi + ! InputFileData%Waves%WaveElevyi = InputFileData%Waves%WaveKinyi + ! + ! + ! 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 + ! CALL CleanUp() + ! RETURN + ! END IF + ! + ! ! Store the wave elevations coming out of the Waves_Init for use in the stretching calculations + ! 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() + ! RETURN + ! END IF + ! WaveElevSt = Waves_InitOut%WaveElev + ! + ! + ! ! We need to reset the wave elevation arrays + ! DEALLOCATE(InputFileData%Waves%WaveElevxi) + ! DEALLOCATE(InputFileData%Waves%WaveElevyi) + ! InputFileData%Waves%NWaveElev = tmpNWaveElev + ! + ! 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,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,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,InputFileData%Waves%NWaveKin,3), STAT=ErrStat2 ) + ! IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveAcc0.', ErrStat, ErrMsg, RoutineName) + ! + ! + ! IF ( ErrStat >= AbortErrLev ) THEN + ! CALL CleanUp() + ! RETURN + ! END IF + !!TODO: FIX Vertical Stretching DATA + ! ! Copy the init output arrays into the MSL versions + ! !WaveDynP0 = Waves_InitOut%WaveDynP + ! !WaveAcc0 = Waves_InitOut%WaveAcc + ! !WaveVel0 = Waves_InitOut%WaveVel + ! + ! + ! InputFileData%Waves%WaveKinzi = tmpWaveKinzi + ! + ! ! Deallocate data which will be allocated again within the Waves_Init routine + ! !DEALLOCATE( Waves_InitOut%WaveDynP ) + ! !DEALLOCATE( Waves_InitOut%WaveAcc ) + ! !DEALLOCATE( Waves_InitOut%WaveVel ) + ! !DEALLOCATE( Waves_InitOut%PWaveDynP0 ) + ! !DEALLOCATE( Waves_InitOut%PWaveAcc0 ) + ! !DEALLOCATE( Waves_InitOut%PWaveVel0 ) + ! DEALLOCATE( Waves_InitOut%WaveElevC0) + ! DEALLOCATE( Waves_InitOut%WaveDirArr) + ! ! DEALLOCATE( Waves_InitOut%WaveElev ) + ! !DEALLOCATE( Waves_InitOut%WaveTime ) + ! DEALLOCATE( Waves_InitOut%NodeInWater ) + ! END IF ! Wave Stretching data Init +!========================================================================== + + 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 + CALL CleanUp() + RETURN + END IF + + + ! Verify that Waves_Init() did not request a different Interval! + + IF ( p%DT /= Interval ) THEN + CALL SetErrStat(ErrID_Fatal,'Waves Module attempted to change timestep interval, but this is not allowed. Waves Module must use the SeaState Interval.',ErrStat,ErrMsg,RoutineName) + CALL CleanUp() + RETURN + END IF + + + + ! Copy Waves initialization output into the initialization input type for the WAMIT module + p%NWaveElev = InputFileData%NWaveElev + p%NStepWave = Waves_InitOut%NStepWave + p%WaveDT = InputFileData%Waves%WaveDT + p%WaveTime => Waves_InitOut%WaveTime + p%WaveElev1 => Waves_InitOut%WaveElev + p%WaveVel => Waves_InitOut%WaveVel + p%WaveAcc => Waves_InitOut%WaveAcc + p%WaveDynP => Waves_InitOut%WaveDynP + ! Store user-requested wave elevation locations + ALLOCATE ( p%WaveElevxi (InputFileData%NWaveElev), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveElevxi.', ErrStat, ErrMsg, RoutineName) + ALLOCATE ( p%WaveElevyi (InputFileData%NWaveElev), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveElevyi.', ErrStat, ErrMsg, RoutineName) + p%WaveElevxi = InputFileData%WaveElevxi + p%WaveElevyi = InputFileData%WaveElevyi + + ! Store user-requested wave kinematic locations + ALLOCATE ( p%WaveKinxi (InputFileData%Waves%NWaveKin), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveElevyi.', ErrStat, ErrMsg, RoutineName) + ALLOCATE ( p%WaveKinyi (InputFileData%Waves%NWaveKin), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveKinyi.', ErrStat, ErrMsg, RoutineName) + ALLOCATE ( p%WaveKinzi (InputFileData%Waves%NWaveKin), STAT=ErrStat2 ) + IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveKinzi.', ErrStat, ErrMsg, RoutineName) + p%NWaveKin = InputFileData%NWaveKin + p%WaveKinxi = InputFileData%WaveKinxi + p%WaveKinyi = InputFileData%WaveKinyi + p%WaveKinzi = InputFileData%WaveKinzi + + ! CALL MOVE_ALLOC( Waves_InitOut%WaveTime, p%WaveTime ) + ! CALL MOVE_ALLOC( Waves_InitOut%WaveElev, p%WaveElev1 ) ! allocate p%WaveElev1, set p%WaveElev1 = Waves_InitOut%WaveElev, and deallocate Waves_InitOut%WaveElev + + ! Copy the first order wave elevation information to p%WaveElev1 so that we can output the total, first, and second order wave elevation separately + ALLOCATE ( p%WaveElev (0:p%NStepWave, p%NGrid(1), p%NGrid(2) ) , STAT=ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + CALL SetErrStat(ErrID_Fatal,'Error allocating memory for the WaveElev array.',ErrStat,ErrMsg,RoutineName) + CALL CleanUp() + RETURN + END IF + ! Need to loop over all the elements and copy + p%WaveElev(:,:,:) = p%WaveElev1(:,:,:) + + + + m%LastIndWave = 1 + + + IF ( InputFileData%Waves%WaveMod /= 6 ) THEN + + !---------------------------------- + ! Initialize Waves2 module + !---------------------------------- + + + IF (InputFileData%Waves2%WvDiffQTFF .OR. InputFileData%Waves2%WvSumQTFF ) THEN + ! Set a few things from the Waves module output + 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 SeaState InputFileData + ! IF (ALLOCATED(tmpWaveElevXY)) CALL MOVE_ALLOC(tmpWaveElevXY, InputFileData%Waves2%WaveElevXY) + + ! assign pointer arrays to init input for Waves2 (save some space) + + InputFileData%Waves2%WaveTime => p%WaveTime + InputFileData%Waves2%WaveElevC0 => Waves_InitOut%WaveElevC0 + InputFileData%Waves2%WaveDirArr => Waves_InitOut%WaveDirArr + +!========================================================================== +! Initialize Wave Stretching data for 2nd Order Waves +!========================================================================== + !IF (InputFileData%Waves%WaveStMod > 0) THEN + ! ! Set the wave kinematics zi locations to zero to generate kinematics at MSL + ! 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 (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 ( 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 ( 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 + ! + ! InputFileData%Waves2%NWaveElev = InputFileData%Waves2%NWaveKin + ! InputFileData%Waves2%WaveElevxi = InputFileData%Waves2%WaveKinxi + ! InputFileData%Waves2%WaveElevyi = InputFileData%Waves2%WaveKinyi + ! + ! 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 + ! CALL CleanUp() + ! RETURN + ! END IF + ! + ! + ! ! Store the wave elevations coming out of the Waves_Init for use in the stretching calculations + ! ! WaveElevSt = WaveElevSt + p%Waves2%WaveElev2 + ! + ! ! We need to reset the wave elevation arrays + ! DEALLOCATE(InputFileData%Waves2%WaveElevxi) + ! DEALLOCATE(InputFileData%Waves2%WaveElevyi) + ! InputFileData%Waves2%NWaveElev = tmpNWaveElev + ! + ! 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,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,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,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,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,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,InputFileData%Waves%NWaveKin,3), STAT=ErrStat2 ) + ! IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveAcc2S0.', ErrStat, ErrMsg, RoutineName) + ! + ! IF ( ErrStat >= AbortErrLev ) THEN + ! CALL CleanUp() + ! RETURN + ! END IF + ! + ! ! Copy the init output arrays into the MSL versions + ! WaveDynP2D0 = InitOut%Waves2%WaveDynP2D + ! WaveAcc2D0 = InitOut%Waves2%WaveAcc2D + ! WaveVel2D0 = InitOut%Waves2%WaveVel2D + ! WaveDynP2S0 = InitOut%Waves2%WaveDynP2S + ! WaveAcc2S0 = InitOut%Waves2%WaveAcc2S + ! WaveVel2S0 = InitOut%Waves2%WaveVel2S + ! + ! ! Reset the wave kinematics zi locations + ! InputFileData%Waves2%WaveKinzi = InputFileData%Waves%WaveKinzi + ! + ! ! Deallocate arrays which will be re-allocated in the next call to Waves2_Init + ! DEALLOCATE ( p%Waves2%WaveElev2 ) + ! DEALLOCATE ( InitOut%Waves2%WaveVel2D ) + ! DEALLOCATE ( InitOut%Waves2%WaveAcc2D ) + ! DEALLOCATE ( InitOut%Waves2%WaveDynP2D ) + ! DEALLOCATE ( InitOut%Waves2%WaveVel2S ) + ! DEALLOCATE ( InitOut%Waves2%WaveAcc2S ) + ! DEALLOCATE ( InitOut%Waves2%WaveDynP2S ) + ! + !END IF +!========================================================================== + + 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 + CALL CleanUp() + RETURN + END IF + + ! nullify unneeded pointers + InputFileData%Waves2%WaveTime => NULL() + InputFileData%Waves2%WaveElevC0 => NULL() + InputFileData%Waves2%WaveDirArr => NULL() + + + ! Verify that Waves2_Init() did not request a different Interval! + + IF ( p%DT /= Interval ) THEN + CALL SetErrStat(ErrID_Fatal,'Waves2 Module attempted to change timestep interval, but this is not allowed. '// & + ' Waves2 Module must use the SeaState Interval.',ErrStat,ErrMsg,RoutineName) + CALL CleanUp() + RETURN + END IF + + ! If we calculated wave elevations, it is now stored in p%WaveElev. So we need to add the corrections. + IF (p%Waves2%NWaveElev > 0 ) THEN + ! Make sure the sizes of the two resulting arrays are identical... + IF ( SIZE(p%WaveElev,DIM=1) /= SIZE(p%Waves2%WaveElev2,DIM=1) .OR. & + SIZE(p%WaveElev,DIM=2) /= SIZE(p%Waves2%WaveElev2,DIM=2)) THEN + CALL SetErrStat(ErrID_Fatal,' WaveElev(NWaveElev) arrays for first and second order wave elevations are of different sizes.',ErrStat,ErrMsg,RoutineName) + CALL CleanUp() + RETURN + ELSE + + do k = 1, p%NGrid(2) + do J=1, p%NGrid(1) + do I = 0,p%NStepWave + p%WaveElev(I,J,k) = p%Waves2%WaveElev2(I,J,k) + p%WaveElev(I,J,k) + end do + end do + end do + !CALL MOVE_ALLOC(p%Waves2%WaveElev2,p%WaveElev2) + ENDIF + ENDIF + + ! The acceleration, velocity, and dynamic pressures will get added to the parts passed to the morrison module later... + ! Difference frequency results + IF ( p%Waves2%WvDiffQTFF ) THEN + + ! Dynamic pressure -- difference frequency terms + IF ( SIZE(p%WaveDynP,DIM=1) /= SIZE(InitOut%Waves2%WaveDynP2D,DIM=1) .OR. & + SIZE(p%WaveDynP,DIM=2) /= SIZE(InitOut%Waves2%WaveDynP2D,DIM=2).OR. & + SIZE(p%WaveDynP,DIM=3) /= SIZE(InitOut%Waves2%WaveDynP2D,DIM=3).OR. & + SIZE(p%WaveDynP,DIM=4) /= SIZE(InitOut%Waves2%WaveDynP2D,DIM=4)) THEN + CALL SetErrStat(ErrID_Fatal, & + ' WaveDynP arrays for first and second order wave elevations are of different sizes. '//NewLine// & + 'Waves: '// TRIM(Num2LStr(SIZE(p%WaveDynP,DIM=1)))//'x'// & + TRIM(Num2LStr(SIZE(p%WaveDynP,DIM=2)))//'x'// & + TRIM(Num2LStr(SIZE(p%WaveDynP,DIM=3)))//'x'// & + TRIM(Num2LStr(SIZE(p%WaveDynP,DIM=4)))//NewLine// & + 'Waves2: '// TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=1)))//'x'// & + TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=2)))//'x'// & + TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=3)))//'x'// & + TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=4))), & + ErrStat,ErrMsg,RoutineName) + CALL CleanUp() + RETURN + ELSE + p%WaveDynP = p%WaveDynP + InitOut%Waves2%WaveDynP2D + !IF (InputFileData%Waves%WaveStMod > 0 ) WaveDynP0 = WaveDynP0 + WaveDynP2D0 + ENDIF + + ! Particle velocity -- difference frequency terms + IF ( SIZE(p%WaveVel,DIM=1) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=1) .OR. & + SIZE(p%WaveVel,DIM=2) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=2) .OR. & + SIZE(p%WaveVel,DIM=3) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=3) .OR. & + SIZE(p%WaveVel,DIM=4) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=4) .OR. & + SIZE(p%WaveVel,DIM=5) /= SIZE(InitOut%Waves2%WaveVel2D,DIM=5)) 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 + p%WaveVel = p%WaveVel + InitOut%Waves2%WaveVel2D + !IF (InputFileData%Waves%WaveStMod > 0 ) WaveVel0 = WaveVel0 + WaveVel2D0 + ENDIF + + + ! Particle acceleration -- difference frequency terms + IF ( SIZE(p%WaveAcc,DIM=1) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=1) .OR. & + SIZE(p%WaveAcc,DIM=2) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=2) .OR. & + SIZE(p%WaveAcc,DIM=3) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=3) .OR. & + SIZE(p%WaveAcc,DIM=4) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=4) .OR. & + SIZE(p%WaveAcc,DIM=5) /= SIZE(InitOut%Waves2%WaveAcc2D,DIM=5)) 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 + p%WaveAcc = p%WaveAcc + InitOut%Waves2%WaveAcc2D + !IF (InputFileData%Waves%WaveStMod > 0 ) WaveAcc0 = WaveAcc0 + WaveAcc2D0 + ENDIF + + ENDIF ! second order wave kinematics difference frequency results + + ! Sum frequency results + IF ( p%Waves2%WvSumQTFF ) THEN + + ! Dynamic pressure -- sum frequency terms + IF ( SIZE(p%WaveDynP,DIM=1) /= SIZE(InitOut%Waves2%WaveDynP2S,DIM=1) .OR. & + SIZE(p%WaveDynP,DIM=2) /= SIZE(InitOut%Waves2%WaveDynP2S,DIM=2) .OR. & + SIZE(p%WaveDynP,DIM=3) /= SIZE(InitOut%Waves2%WaveDynP2S,DIM=3) .OR. & + SIZE(p%WaveDynP,DIM=4) /= SIZE(InitOut%Waves2%WaveDynP2S,DIM=4)) THEN + CALL SetErrStat(ErrID_Fatal, & + ' WaveDynP arrays for first and second order wave elevations are of different sizes. '//NewLine// & + 'Waves: '// TRIM(Num2LStr(SIZE(p%WaveDynP,DIM=1)))//'x'// & + TRIM(Num2LStr(SIZE(p%WaveDynP,DIM=2)))//'x'// & + TRIM(Num2LStr(SIZE(p%WaveDynP,DIM=3)))//'x'// & + TRIM(Num2LStr(SIZE(p%WaveDynP,DIM=4)))//NewLine// & + 'Waves2: '// TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=1)))//'x'// & + TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=2)))//'x'// & + TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=3)))//'x'// & + TRIM(Num2LStr(SIZE(InitOut%Waves2%WaveDynP2D,DIM=4))), & + ErrStat,ErrMsg,RoutineName) + CALL CleanUp() + RETURN + ELSE + p%WaveDynP = p%WaveDynP + InitOut%Waves2%WaveDynP2S + !IF (InputFileData%Waves%WaveStMod > 0 ) WaveDynP0 = WaveDynP0 + WaveDynP2S0 + ENDIF + + ! Particle velocity -- sum frequency terms + IF ( SIZE(p%WaveVel,DIM=1) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=1) .OR. & + SIZE(p%WaveVel,DIM=2) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=2) .OR. & + SIZE(p%WaveVel,DIM=3) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=3) .OR. & + SIZE(p%WaveVel,DIM=4) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=4) .OR. & + SIZE(p%WaveVel,DIM=5) /= SIZE(InitOut%Waves2%WaveVel2S,DIM=5)) 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 + p%WaveVel = p%WaveVel + InitOut%Waves2%WaveVel2S + !IF (InputFileData%Waves%WaveStMod > 0 ) WaveVel0 = WaveVel0 + WaveVel2S0 + ENDIF + + ! Particle velocity -- sum frequency terms + IF ( SIZE(p%WaveAcc,DIM=1) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=1) .OR. & + SIZE(p%WaveAcc,DIM=2) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=2) .OR. & + SIZE(p%WaveAcc,DIM=3) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=3) .OR. & + SIZE(p%WaveAcc,DIM=4) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=4) .OR. & + SIZE(p%WaveAcc,DIM=5) /= SIZE(InitOut%Waves2%WaveAcc2S,DIM=5)) 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 + p%WaveAcc = p%WaveAcc + InitOut%Waves2%WaveAcc2S + !IF (InputFileData%Waves%WaveStMod > 0 ) WaveAcc0 = WaveAcc0 + WaveAcc2S0 + ENDIF + + ENDIF ! second order wave kinematics sum frequency results + ELSE + ! these need to be set to zero since we don't have a UseWaves2 flag: + p%Waves2%NWaveElev = 0 + p%Waves2%WvDiffQTFF = .FALSE. + p%Waves2%WvSumQTFF = .FALSE. + + + ENDIF ! InputFileData%Waves2%WvDiffQTFF .OR. InputFileData%Waves2%WvSumQTFF + + + END IF ! Check for WaveMod = 6 + + + + ! Create the Output file if requested + 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 = InputFileData%OutFmt + p%OutSFmt = InputFileData%OutSFmt + p%NumOuts = InputFileData%NumOuts + + ! Define initialization-routine output here: + InitOut%Ver = SeaState_ProgDesc + ! These three come directly from processing the inputs, and so will exist even if not using Morison elements: + InitOut%WtrDens = InputFileData%Waves%WtrDens + InitOut%WtrDpth = InputFileData%Waves%WtrDpth + InitOut%MSL2SWL = InputFileData%MSL2SWL + p%WtrDpth = InitOut%WtrDpth + + CALL SeaStOut_Init( SeaState_ProgDesc, InitInp%OutRootName, InputFileData, y, p, m, InitOut, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF + + + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF + +!=============================================== + + IF ( InputFileData%UnSum > 0 ) THEN + versionStr = GetVersion(SeaState_ProgDesc) + WRITE( InputFileData%UnSum, '(A/)') versionStr + Delim = ' ' + IF (InputFileData%Waves%WaveMod /= 0 .AND. InputFileData%Waves%WaveMod /= 6) THEN + + WRITE( InputFileData%UnSum, '(1X,A61,F8.2,A4/)' ) 'The Mean Sea Level to Still Water Level (MSL2SWL) Offset is :',InitOut%MSL2SWL,' (m)' + ! WRITE( InputFileData%UnSum, '(1X,A/)' ) 'Note: The Water Depth and Z_Depth in this summary file are offset from the input file data by MSL2SWL' !, and Z coordinate(s) of the user-requested output location(s) + WRITE( InputFileData%UnSum, '(1X,A15,F8.2,A8)' ) 'Water Density: ', InitOut%WtrDens, '(kg/m^3)' + WRITE( InputFileData%UnSum, '(1X,A15,F8.2,A20,F8.2,A19)' ) 'Water Depth : ', p%WtrDpth - InitOut%MSL2SWL, '(m) relative to MSL; ', p%WtrDpth, '(m) relative to SWL' + WRITE( InputFileData%UnSum, '(1X,A15,F8.2,A20,F8.2,A19/)' ) 'Grid Z_Depth : ', InputFileData%Z_Depth - InitOut%MSL2SWL, '(m) relative to MSL; ', InputFileData%Z_Depth, '(m) relative to SWL' + Frmt = '(1X,ES18.4e2,A,ES18.4e2,A,ES18.4e2,A,ES18.4e2)' + + ! Write Kinematics grid point locations + ! WRITE( InputFileData%UnSum, '(/)' ) + WRITE( InputFileData%UnSum, '(1X,A31/)' ) 'Wave Kinematics Grid Points (m)' + ! WRITE( InputFileData%UnSum, '(/)' ) + WRITE( InputFileData%UnSum, '(1X,A78)' ) ' Xi Yi Zi relative to MSL Z relative to SWL' + do i= 1, p%NGridPts + WRITE(InputFileData%UnSum,Frmt) InputFileData%Waves%WaveKinxi(i),Delim, InputFileData%Waves%WaveKinyi(i),Delim, InputFileData%Waves%WaveKinzi(i) - InitOut%MSL2SWL,Delim, InputFileData%Waves%WaveKinzi(i) + end do + + !WRITE( InputFileData%UnSum, '(1X,A11)' ) 'Y-locations' + !do i= 1, p%NGrid(2) + ! WRITE(InputFileData%UnSum,Frmt,ADVANCE='no') Delim, InputFileData%Waves%WaveKinyi(i) + !end do + !WRITE (InputFileData%UnSum,'()', IOSTAT=ErrStat) ! write the line return + !WRITE( InputFileData%UnSum, '(1X,A11)' ) 'Z-locations' + !do i= 1, p%NGrid(3) + ! WRITE(InputFileData%UnSum,Frmt,ADVANCE='no') Delim, InputFileData%Waves%WaveKinzi(i) + !end do + !WRITE (InputFileData%UnSum,'()', IOSTAT=ErrStat) ! write the line return + ! ! Write User-requested Wave Kinematics locations + WRITE( InputFileData%UnSum, '(/)' ) + if (p%NWaveKin > 0) then + WRITE( InputFileData%UnSum, '(1X,A51/)' ) 'User-Requested Wave Kinematics Output Locations (m)' + ! WRITE( InputFileData%UnSum, '(/)' ) + WRITE( InputFileData%UnSum, '(2X,A84)' ) 'Index Xi Yi Zi relative to MSL Z relative to SWL' + Frmt = '(1X,I5, 2X,ES18.4e2,A,ES18.4e2,A,ES18.4e2,A,ES18.4e2)' + do i= 1, p%NWaveKin + WRITE(InputFileData%UnSum,Frmt) i, InputFileData%WaveKinxi(i),Delim, InputFileData%WaveKinyi(i),Delim, InputFileData%WaveKinzi(i) - InitOut%MSL2SWL,Delim, InputFileData%WaveKinzi(i) + end do + + else + WRITE( InputFileData%UnSum, '(1X,A50)' ) 'No User-Requested Wave Kinematics Output Channels' + end if + + ! Write User-requested Wave Elevations + WRITE( InputFileData%UnSum, '(/)' ) + if (p%NWaveElev > 0) then + WRITE( InputFileData%UnSum, '(1X,A50/)' ) 'User-Requested Wave Elevation Output Locations (m)' + ! WRITE( InputFileData%UnSum, '(/)' ) + WRITE( InputFileData%UnSum, '(2X,A25)' ) 'Index Xi Yi' + Frmt = '(1X,I5, 2X, ES11.4e2,A,ES11.4e2)' + do i= 1, p%NWaveElev + WRITE(InputFileData%UnSum,Frmt) i, InputFileData%WaveElevxi(i), Delim, InputFileData%WaveElevyi(i) + end do + + else + WRITE( InputFileData%UnSum, '(1X,A50)' ) 'No User-Requested Wave Elevation Output Channels' + end if + if (p%NumOuts > 0) then + WRITE( InputFileData%UnSum, '(//1X,A/)' ) 'Requested Output Channels' + do i = 1, p%NumOuts + WRITE( InputFileData%UnSum, '(4X,A)' ) InputFileData%OutList(i) + end do + end if + + ! Write wave kinematics at (0,0) + WRITE( InputFileData%UnSum, '(/)' ) + WRITE( InputFileData%UnSum, '(1X,A28/)' ) 'Wave Kinematics DFT at (0,0)' + ! WRITE( InputFileData%UnSum, '(/)' ) + WRITE( InputFileData%UnSum, '(1X,A10,2X,A14,2X,A14,2X,A14,2X,A19,2X,A19)' ) & + ' index ', ' k ', ' Omega ', ' Direction ', 'REAL(DFT{WaveElev})','IMAG(DFT{WaveElev})' + 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, 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 + + + END IF + +!========================================== +!TODO: FIX ME + ! Deallocate any remaining Waves Output data +! IF(ALLOCATED( Waves_InitOut%WaveElevC0 )) DEALLOCATE( Waves_InitOut%WaveElevC0 ) +! IF(ALLOCATED( Waves_InitOut%WaveAcc )) DEALLOCATE( Waves_InitOut%WaveAcc ) +! IF(ALLOCATED( Waves_InitOut%WaveDynP )) DEALLOCATE( Waves_InitOut%WaveDynP ) +! 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( InputFileData%WAMIT%WaveElevC0 )) DEALLOCATE( InputFileData%WAMIT%WaveElevC0) + + ! Close the summary file + IF ( InputFileData%SeaStSum ) THEN + CALL SeaStOut_CloseSum( InputFileData%UnSum, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF + END IF + + + + + + ! Setup the 4D grid information for the Interpolatin Module + SeaSt_Interp_InitInp%n = (/p%NStepWave+1,p%nGrid(1),p%nGrid(2),p%nGrid(3)/) + SeaSt_Interp_InitInp%delta = (/real(p%WaveDT,ReKi),p%deltaGrid(1),p%deltaGrid(2),p%deltaGrid(3)/) + SeaSt_Interp_InitInp%pZero(2) = -InputFileData%X_HalfWidth + SeaSt_Interp_InitInp%pZero(3) = -InputFileData%Y_HalfWidth + SeaSt_Interp_InitInp%pZero(1) = 0.0 !Time + SeaSt_Interp_InitInp%pZero(4) = -InputFileData%Z_Depth ! zi + SeaSt_Interp_InitInp%Z_Depth = InputFileData%Z_Depth + call SeaState_Interp_Init(SeaSt_Interp_InitInp, p%sea_interp_p, ErrStat2, ErrMsg2) + + IF ( p%OutSwtch == 1 ) THEN ! Only HD-level output writing + ! HACK WE can tell FAST not to write any HD outputs by simply deallocating the WriteOutputHdr array! + DEALLOCATE ( InitOut%WriteOutputHdr ) + END IF + + ! Destroy the local initialization data + CALL CleanUp() + +CONTAINS +!................................ + SUBROUTINE CleanUp() + + CALL SeaState_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) + + + ! These are dummy variables to satisfy the framework, but are not used again: + + CALL Waves_DestroyInput( Waves_u, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Waves_DestroyParam( Waves_p, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Waves_DestroyContState( Waves_x, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Waves_DestroyDiscState( Waves_xd, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Waves_DestroyConstrState( Waves_z, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Waves_DestroyOtherState( WavesOtherState, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Waves_DestroyOutput( Waves_y, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + + CALL Current_DestroyInput( Current_u, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Current_DestroyParam( Current_p, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Current_DestroyContState( Current_x, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Current_DestroyDiscState( Current_xd, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Current_DestroyConstrState( Current_z, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL Current_DestroyOtherState( CurrentOtherState, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + 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 SeaState_Init + + +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine is called at the end of the simulation. +SUBROUTINE SeaState_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) + + TYPE(SeaState_InputType), INTENT(INOUT) :: u !< System inputs + TYPE(SeaState_ParameterType), INTENT(INOUT) :: p !< Parameters + TYPE(SeaState_ContinuousStateType), INTENT(INOUT) :: x !< Continuous states + TYPE(SeaState_DiscreteStateType), INTENT(INOUT) :: xd !< Discrete states + TYPE(SeaState_ConstraintStateType), INTENT(INOUT) :: z !< Constraint states + TYPE(SeaState_OtherStateType), INTENT(INOUT) :: OtherState !< Other/optimization states + TYPE(SeaState_OutputType), INTENT(INOUT) :: y !< System outputs + TYPE(SeaState_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + + + ! Place any last minute operations or calculations here: + + + + ! Write the SeaState-level output file data if the user requested module-level output + ! and the current time has advanced since the last stored time step. + + IF ( p%OutSwtch == 1 .OR. p%OutSwtch == 3) THEN + CALL SeaStOut_WriteOutputs( m%LastOutTime, y, p, m%Decimate, ErrStat, ErrMsg ) + END IF + + ! Close files here: + CALL SeaStOut_CloseOutput( p, ErrStat, ErrMsg ) + + + ! Destroy the input data: + + CALL SeaState_DestroyInput( u, ErrStat, ErrMsg ) + + + ! Destroy the parameter data: + + CALL SeaState_DestroyParam( p, ErrStat, ErrMsg ) + + + ! Destroy the state data: + + CALL SeaState_DestroyContState( x, ErrStat, ErrMsg ) + CALL SeaState_DestroyDiscState( xd, ErrStat, ErrMsg ) + CALL SeaState_DestroyConstrState( z, ErrStat, ErrMsg ) + CALL SeaState_DestroyOtherState( OtherState, ErrStat, ErrMsg ) + + ! Destroy misc variables: + + CALL SeaState_DestroyMisc( m, ErrStat, ErrMsg ) + + ! Destroy the output data: + + CALL SeaState_DestroyOutput( y, ErrStat, ErrMsg ) + + +END SUBROUTINE SeaState_End + + +!---------------------------------------------------------------------------------------------------------------------------------- +!> Loose coupling routine for solving constraint states, integrating continuous states, and updating discrete states. +!! Continuous, constraint, and discrete states are updated to values at t + Interval. +SUBROUTINE SeaState_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) + + REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds + INTEGER(IntKi), INTENT(IN ) :: n !< Current step of the simulation: t = n*Interval + TYPE(SeaState_InputType), INTENT(INOUT ) :: Inputs(:) !< Inputs at InputTimes + REAL(DbKi), INTENT(IN ) :: InputTimes(:) !< Times in seconds associated with Inputs + TYPE(SeaState_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaState_ContinuousStateType), INTENT(INOUT) :: x !< Input: Continuous states at t; + !! Output: Continuous states at t + Interval + TYPE(SeaState_DiscreteStateType), INTENT(INOUT) :: xd !< Input: Discrete states at t; + !! Output: Discrete states at t + Interval + TYPE(SeaState_ConstraintStateType), INTENT(INOUT) :: z !< Input: Constraint states at t; + !! Output: Constraint states at t + Interval + TYPE(SeaState_OtherStateType), INTENT(INOUT) :: OtherState !< Other states: Other states at t; + !! Output: Other states at t + Interval + TYPE(SeaState_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + ! Initialize variables + + ErrStat = ErrID_None ! no error has occurred + ErrMsg = "" + + + + +END SUBROUTINE SeaState_UpdateStates + + +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine for computing outputs, used in both loose and tight coupling. +SUBROUTINE SeaState_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) + + REAL(DbKi), INTENT(IN ) :: Time !< Current simulation time in seconds + TYPE(SeaState_InputType), INTENT(INOUT) :: u !< Inputs at Time (note that this is intent out because we're copying the u%WAMITMesh into m%u_wamit%mesh) + TYPE(SeaState_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaState_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time + TYPE(SeaState_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at Time + TYPE(SeaState_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at Time + TYPE(SeaState_OtherStateType), INTENT(IN ) :: OtherState !< Other states at Time + TYPE(SeaState_OutputType), INTENT(INOUT) :: y !< Outputs computed at Time (Input only so that mesh con- + !! nectivity information does not have to be recalculated) + TYPE(SeaState_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat !! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !! Error message if ErrStat /= ErrID_None + + INTEGER :: I, J ! Generic counters + + INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (secondary error) + CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None + + + REAL(SiKi) :: WaveElev (p%NWaveElev) ! Instantaneous total elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(SiKi) :: WaveElev1(p%NWaveElev) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(SiKi) :: WaveElev2(p%NWaveElev) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(SiKi) :: WaveVel(3,p%NWaveKin) + REAL(SiKi) :: WaveAcc(3,p%NWaveKin) + REAL(SiKi) :: WaveDynP(p%NWaveKin) + REAL(ReKi) :: AllOuts(MaxSeaStOutputs) + integer(IntKi) :: iBody, indxStart, indxEnd, iWAMIT ! Counters + real(ReKi) :: positionXYZ(3), positionXY(2) + + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + WaveElev = 0.0_ReKi + WaveElev1 = 0.0_ReKi + WaveElev2 = 0.0_ReKi ! In case we don't use 2nd order waves + ErrStat2 = ErrID_None + ErrMsg = "" + + ! Compute outputs here: + + ! These Outputs are only used for generated user-requested output channel results. + ! If the user did not request any outputs, then we can simply return + if ( p%NumOuts > 0 ) then + + !------------------------------------------------------------------- + ! Additional stiffness, damping forces. These need to be placed on a point mesh which is located at the WAMIT reference point (WRP). + ! This mesh will need to get mapped by the glue code for use by either ElastoDyn or SubDyn. + !------------------------------------------------------------------- + + ! Deal with any output from the Waves2 module.... + !IF (p%Waves2%WvDiffQTFF .OR. p%Waves2%WvSumQTFF ) THEN + ! + ! ! Waves2_CalcOutput is called only so that the wave elevations can be output (if requested). + ! CALL Waves2_CalcOutput( Time, m%u_Waves2, p%Waves2, x%Waves2, xd%Waves2, & + ! z%Waves2, OtherState%Waves2, y%Waves2, m%Waves2, ErrStat2, ErrMsg2 ) + ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + !END IF + + + do i = 1, p%NWaveKin + positionXYZ = (/p%WaveKinxi(i),p%WaveKinyi(i),p%WaveKinzi(i)/) + call SeaState_Interp_Setup( Time, positionXYZ, p%sea_interp_p, m%sea_interp_m, ErrStat, ErrMsg ) + WaveVel(:,i) = SeaState_Interp_4D_Vec( p%WaveVel, m%sea_interp_m, ErrStat, ErrMsg ) + WaveAcc(:,i) = SeaState_Interp_4D_Vec( p%WaveAcc, m%sea_interp_m, ErrStat, ErrMsg ) + WaveDynP(i) = SeaState_Interp_4D ( p%WaveDynP, m%sea_interp_m, ErrStat, ErrMsg ) + + end do + + ! Compute the wave elevations at the requested output locations for this time. Note that p%WaveElev has the second order added to it already. + + do i = 1, p%NWaveElev + positionXY = (/p%WaveElevxi(i),p%WaveElevyi(i)/) + ! TODO: Why interp the WaveElev. Instead just add 1 + 2 if Waves2 is being used? + WaveElev(i) = SeaState_Interp_3D( Time, positionXY, p%WaveElev, p%sea_interp_p, ErrStat, ErrMsg ) + WaveElev1(i) = SeaState_Interp_3D( Time, positionXY, p%WaveElev1, p%sea_interp_p, ErrStat, ErrMsg ) + if (allocated(p%Waves2%WaveElev2)) then + WaveElev2(i) = SeaState_Interp_3D( Time, positionXY, p%Waves2%WaveElev2, p%sea_interp_p, ErrStat, ErrMsg ) + end if + + end do + + + + ! Write the SeaState-level output file data if the user requested module-level output + ! and the current time has advanced since the last stored time step. + + IF ( (p%OutSwtch == 1 .OR. p%OutSwtch == 3) .AND. ( Time > m%LastOutTime ) ) THEN + CALL SeaStOut_WriteOutputs( m%LastOutTime, y, p, m%Decimate, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + END IF + + ! Map calculated results into the AllOuts Array + CALL SeaStOut_MapOutputs( Time, p, p%NWaveElev, WaveElev, WaveElev1, WaveElev2, p%NWaveKin, WaveVel, WaveAcc, WaveDynP, AllOuts, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + + DO I = 1,p%NumOuts + y%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) + END DO + + ! ! Aggregate the sub-module outputs + ! + !IF ( p%OutSwtch > 0) THEN + ! + ! J = p%NumOuts + 1 + ! + ! IF (ALLOCATED( p%Waves2%OutParam ) .AND. p%Waves2%NumOuts > 0) THEN + ! DO I=1, p%Waves2%NumOuts + ! y%WriteOutput(J) = y%Waves2%WriteOutput(I) + ! J = J + 1 + ! END DO + ! END IF + ! + ! + ! + !END IF + + m%LastOutTime = Time + end if + +END SUBROUTINE SeaState_CalcOutput + + +!---------------------------------------------------------------------------------------------------------------------------------- +!> Tight coupling routine for computing derivatives of continuous states +SUBROUTINE SeaState_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) + + REAL(DbKi), INTENT(IN ) :: Time !< Current simulation time in seconds + TYPE(SeaState_InputType), INTENT(INOUT) :: u !< Inputs at Time (intent OUT only because we're copying the input mesh) + TYPE(SeaState_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaState_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time + TYPE(SeaState_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at Time + TYPE(SeaState_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at Time + TYPE(SeaState_OtherStateType), INTENT(IN ) :: OtherState !< Other states + TYPE(SeaState_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables + TYPE(SeaState_ContinuousStateType), INTENT( OUT) :: dxdt !< Continuous state derivatives at Time + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + integer(IntKi) :: iWAMIT ! loop counter + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CalcContStateDeriv' + + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + + + +END SUBROUTINE SeaState_CalcContStateDeriv + + + + +!---------------------------------------------------------------------------------------------------------------------------------- +!> Tight coupling routine for solving for the residual of the constraint state equations +SUBROUTINE SeaState_CalcConstrStateResidual( Time, u, p, x, xd, z, OtherState, m, z_residual, ErrStat, ErrMsg ) + + REAL(DbKi), INTENT(IN ) :: Time !< Current simulation time in seconds + TYPE(SeaState_InputType), INTENT(INOUT) :: u !< Inputs at Time (intent OUT only because we're copying the input mesh) + TYPE(SeaState_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaState_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time + TYPE(SeaState_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at Time + TYPE(SeaState_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at Time (possibly a guess) + TYPE(SeaState_OtherStateType), INTENT(IN ) :: OtherState !< Other/optimization states + TYPE(SeaState_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables + TYPE(SeaState_ConstraintStateType), INTENT( OUT) :: z_residual !< Residual of the constraint state equations using + !! the input values described above + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + + ! Nothing to do here since none of the sub-modules have contraint states + z_residual = z + + ! Solve for the constraint states here: + + +END SUBROUTINE SeaState_CalcConstrStateResidual + + + + + +!---------------------------------------------------------------------------------------------------------------------------------- +END MODULE SeaState +!********************************************************************************************************************************** diff --git a/modules/seastate/src/SeaState.txt b/modules/seastate/src/SeaState.txt new file mode 100644 index 0000000000..5e543e5244 --- /dev/null +++ b/modules/seastate/src/SeaState.txt @@ -0,0 +1,159 @@ +################################################################################################################################### +################################################################################################################################### +# Registry for SeaState in the FAST Modularization Framework +# This Registry file is used to create MODULE SeaState which contains all of the user-defined types needed in SeaState. +# It also contains copy, destroy, pack, and unpack routines associated with each defined data types. +# See NWTC Programmer's Handbook for further information on the format/contents of this file. +# +# Entries are of the form +# +# +# Use ^ as a shortcut for the value in the same column from the previous line. +################################################################################################################################### +# +# ...... Include files (definitions from NWTC Library) ............................................................................ +# make sure that the file name does not have any trailing white spaces! +include Registry_NWTC_Library.txt +usefrom Current.txt +usefrom Waves.txt +usefrom Waves2.txt +usefrom SeaState_Interp.txt +# +param SeaState/SeaState unused INTEGER MaxSeaStOutputs - 90 - "The maximum number of output channels supported by this module" - +# +typedef SeaState/SeaState SeaState_InputFile LOGICAL EchoFlag - - - "Echo the input file" +typedef ^ ^ ReKi MSL2SWL - - - "Mean Sea Level to Still Water Level offset" m +typedef ^ ^ ReKi X_HalfWidth - - - "Half-width of the domain in the X direction" m +typedef ^ ^ ReKi Y_HalfWidth - - - "Half-width of the domain in the Y direction" m +typedef ^ ^ ReKi Z_Depth - - - "Depth of the domain the Z direction" m +typedef ^ ^ INTEGER NX - - - "Number of nodes in half of the X-direction domain" +typedef ^ ^ INTEGER NY - - - "Number of nodes in half of the Y-direction domain" +typedef ^ ^ INTEGER NZ - - - "Number of nodes in half of the Z-direction domain" +typedef ^ ^ Waves_InitInputType Waves - - - "Initialization data for Waves module" - +typedef ^ ^ Waves2_InitInputType Waves2 - - - "Initialization data for Waves2 module" - +typedef ^ ^ Current_InitInputType Current - - - "Initialization data for Current module" - +typedef ^ ^ LOGICAL Echo - - - "Echo the input files to a file with the same name as the input but with a .echo extension [T/F]" - +typedef ^ ^ INTEGER NWaveElev - - - "Number of points where the incident wave elevations can be output" - +typedef ^ ^ SiKi WaveElevxi {:} - - "xi-coordinates for points where the incident wave elevations can be output" (meters) +typedef ^ ^ SiKi WaveElevyi {:} - - "yi-coordinates for points where the incident wave elevations can be output" (meters) +typedef ^ ^ INTEGER NWaveKin - - - "Number of points where the incident wave kinematics will be computed" - +typedef ^ ^ SiKi WaveKinxi {:} - - "xi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level" (meters) +typedef ^ ^ SiKi WaveKinyi {:} - - "yi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level" (meters) +typedef ^ ^ SiKi WaveKinzi {:} - - "zi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level" (meters) +typedef ^ ^ INTEGER NUserOutputs - - - "Number of SeaState-level requested output channels" - +typedef ^ ^ CHARACTER(ChanLen) UserOutputs {:} - - "This should really be dimensioned with MaxOutPts" - +typedef ^ ^ INTEGER OutSwtch - - - "Output requested channels to: [1=SeaState.out 2=GlueCode.out 3=both files]" - +typedef ^ ^ LOGICAL OutAll - - - "Output all user-specified member and joint loads (only at each member end, not interior locations) [T/F]" - +typedef ^ ^ INTEGER NumOuts - - - "The number of outputs for this module as requested in the input file" - +typedef ^ ^ CHARACTER(ChanLen) OutList {:} - - "The user-requested output channel labels for this modules. This should really be dimensioned with MaxOutPts" - +typedef ^ ^ LOGICAL SeaStSum - - - "Generate a SeaState summary file [T/F]" - +typedef ^ ^ INTEGER UnSum - - - "File unit for the SeaState 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 SeaState/SeaState InitInputType CHARACTER(1024) InputFile - - - "Supplied by Driver: full path and filename for the SeaState 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 ^ ^ 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 ^ ^ 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: +# +typedef ^ InitOutputType Waves2_InitOutputType Waves2 - - - "Initialization output from the Waves2 module" - +typedef ^ ^ CHARACTER(ChanLen) WriteOutputHdr {:} - - "The is the list of all HD-related output channel header strings (includes all sub-module channels)" - +typedef ^ ^ CHARACTER(ChanLen) WriteOutputUnt {:} - - "The is the list of all HD-related output channel unit strings (includes all sub-module channels)" - +typedef ^ ^ SiKi WaveElevSeries {:}{:} - - "Wave elevation time-series at each of the points given by WaveElevXY. First dimension is the timestep. Second dimension is XY point number corresponding to second dimension of WaveElevXY." (m) +typedef ^ ^ ProgDesc Ver - - - "Version of SeaState" +typedef ^ ^ ReKi WtrDens - - - "Water density, this is necessary to inform glue-code what the module is using for WtrDens (may not be the glue-code's default)" (kg/m^3) +typedef ^ ^ ReKi WtrDpth - - - "Water depth, this is necessary to inform glue-code what the module is using for WtrDpth (may not be the glue-code's default)" (m) +typedef ^ ^ ReKi MSL2SWL - - - "Offset between still-water level and mean sea level, this is necessary to inform glue-code what the module is using for MSL2SWL (may not be the glue-code's default)" (m) +# +# +# ..... States .................................................................................................................... +# Define continuous (differentiable) states here: +typedef ^ ContinuousStateType Waves2_ContinuousStateType Waves2 - - - "continuous states from the waves2 module" - +# +# +# Define discrete (nondifferentiable) states here: +typedef ^ DiscreteStateType Waves2_DiscreteStateType Waves2 - - - "discrete states from the waves2 module" - +# +# +# Define constraint states here: +typedef ^ ConstraintStateType Waves2_ConstraintStateType Waves2 - - - "constraint states from the waves2 module" - +# +# +# Define any other states, including integer or logical states here: +typedef ^ OtherStateType Waves2_OtherStateType Waves2 - - - "OtherState information from the Waves2 module" - +# +# ..... Misc/Optimization variables................................................................................................. +# Define any data that are used only for efficiency purposes (these variables are not associated with time): +# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. +typedef ^ MiscVarType INTEGER Decimate - - - "The output decimation counter" - +typedef ^ ^ DbKi LastOutTime - - - "Last time step which was written to the output file (sec)" - +typedef ^ ^ INTEGER LastIndWave - - - "The last index used in the wave kinematics arrays, used to optimize interpolation" - +typedef ^ ^ SeaState_Interp_MiscVarType Sea_Interp_m - - - "misc var information from the SeaState Interpolation module" - +typedef ^ ^ Waves2_MiscVarType Waves2 - - - "misc var information from the Waves2 module" - +typedef ^ ^ Waves2_InputType u_Waves2 - - - "Waves2 module inputs" - +# ..... Parameters ................................................................................................................ +# Define parameters here: +# Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: +# +typedef ^ ParameterType Waves2_ParameterType Waves2 - - - "Parameter data for the Waves2 module" - +typedef ^ ^ SiKi WaveTime {*} - - "Array of time samples, (sec)" - +typedef ^ ^ DbKi WaveDT - - - "Wave DT" sec +typedef ^ ^ INTEGER NGridPts - - - "Number of data points in the wave kinematics grid" - +typedef ^ ^ INTEGER NGrid 3 - - "Number of grid entries in x, y, and z" +typedef ^ ^ ReKi deltaGrid 3 - - "delta between grid points in x, y, and theta (for z)" m,m,rad +#typedef ^ ^ ReKi gridDX - - - "distance between kinematics grid points along the xi direction" m +#typedef ^ ^ ReKi gridDY - - - "distance between kinematics grid points along the yi direction" m +#typedef ^ ^ ReKi gridDTheta - - - "delta angle used for cosine-spaced zi direction kinematic grid points" rad +typedef ^ ^ INTEGER NStepWave - - - "Number of data points in the wave kinematics arrays" - +typedef ^ ^ INTEGER NWaveElev - - - "Number of wave elevation outputs" - +typedef ^ ^ SiKi WaveElevxi {:} - - "xi-coordinates for points where the incident wave elevations can be output" (meters) +typedef ^ ^ SiKi WaveElevyi {:} - - "yi-coordinates for points where the incident wave elevations can be output" (meters) +typedef ^ ^ SiKi WaveElev {*}{*}{*} - - "Total wave elevation" - +typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" - +typedef ^ ^ SiKi WaveElev2 {*}{*}{*} - - "Second order wave elevation" - +#typedef ^ ^ SiKi PWaveDynP0 {*}{*}{*}{*} - - "Instantaneous dynamic pressure of incident waves , at the location (xi,yi,0), at each of the NWaveKin points where the incident wave kinematics will be computed" (N/m^2) +typedef ^ ^ SiKi WaveDynP {*}{*}{*}{*} - - "Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed" (N/m^2) +typedef ^ ^ SiKi WaveAcc {*}{*}{*}{*}{*} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed" (m/s^2) +#typedef ^ ^ SiKi PWaveAcc0 {*}{*}{*}{*}{*} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin points where the incident wave kinematics will be computed" (m/s^2) +typedef ^ ^ SiKi WaveVel {*}{*}{*}{*}{*} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) +#typedef ^ ^ SiKi PWaveVel0 {*}{*}{*}{*}{*} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) +#typedef ^ ^ SiKi WaveElev0 {*} - - "Instantaneous elevation time-series of incident waves at the platform reference point" (meters) +typedef ^ ^ INTEGER NWaveKin - - - "Number of points where the incident wave kinematics can be output" - +typedef ^ ^ SiKi WaveKinxi {:} - - "xi-coordinates for points where the incident wave kinematics can be output; these are relative to the mean sea level" (meters) +typedef ^ ^ SiKi WaveKinyi {:} - - "yi-coordinates for points where the incident wave kinematics can be output; these are relative to the mean sea level" (meters) +typedef ^ ^ SiKi WaveKinzi {:} - - "zi-coordinates for points where the incident wave kinematics can be output; these are relative to the mean sea level" (meters) +typedef ^ ^ ReKi WtrDpth - - - "Water depth" (m) +typedef ^ ^ DbKi DT - - - "Time step in seconds for integration of continuous states (if a fixed-step integrator is used) and update of discrete states" - +typedef ^ ^ OutParmType OutParam {:} - - "" - +typedef ^ ^ INTEGER NumOuts - - - "Number of SeaState module-level outputs (not the total number including sub-modules" - +typedef ^ ^ INTEGER NumTotalOuts - - - "Number of all requested outputs including sub-modules" - +typedef ^ ^ INTEGER OutSwtch - - - "Output requested channels to: [1=SeaState.out 2=GlueCode.out 3=both files]" - +typedef ^ ^ CHARACTER(20) OutFmt - - - "Output format for numerical results" - +typedef ^ ^ CHARACTER(20) OutSFmt - - - "Output format for header strings" - +typedef ^ ^ CHARACTER(ChanLen) Delim - - - "Delimiter string for outputs, defaults to tab-delimiters" - +typedef ^ ^ INTEGER UnOutFile - - - "File unit for the SeaState outputs" - +typedef ^ ^ INTEGER OutDec - - - "Write every OutDec time steps" - +typedef ^ ^ SeaState_Interp_ParameterType Sea_Interp_p - - - "parameter information from the SeaState Interpolation module" - +# +# +# ..... Inputs .................................................................................................................... +# Define inputs that are contained on the mesh here: +# +typedef ^ InputType SiKi DummyInput - - - "Remove this variable if you have discrete states" - +# +# +# ..... Outputs ................................................................................................................... +# Define outputs that are contained on the mesh here: +typedef ^ OutputType ReKi WriteOutput {:} - - "Outputs to be written to the output file(s)" - +typedef ^ ^ Waves2_OutputType Waves2 - - - "Waves2 module outputs" - \ No newline at end of file diff --git a/modules/seastate/src/SeaState_DriverCode.f90 b/modules/seastate/src/SeaState_DriverCode.f90 new file mode 100644 index 0000000000..138bfa2ac1 --- /dev/null +++ b/modules/seastate/src/SeaState_DriverCode.f90 @@ -0,0 +1,717 @@ +!********************************************************************************************************************************** +! SeaState_DriverCode: This code tests the template modules +!.................................................................................................................................. +! LICENSING +! Copyright (C) 2012-2015 National Renewable Energy Laboratory +! +! This file is part of SeaState. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** + +program SeaStateDriver + + use NWTC_Library + use SeaState + use SeaState_Types + use SeaState_Output + use ModMesh_Types + use VersionInfo + + implicit none + + type SeaSt_Drvr_InitInput + logical :: Echo + real(ReKi) :: Gravity + real(ReKi) :: WtrDens + real(ReKi) :: WtrDpth + real(ReKi) :: MSL2SWL + character(1024) :: SeaStateInputFile + character(1024) :: OutRootName + integer :: NSteps + real(DbKi) :: TimeInterval + logical :: WaveElevSeriesFlag !< Should we put together a wave elevation series and save it to file? + real(ReKi) :: WaveElevdX !< Spacing in the X direction for wave elevation series (m) + real(ReKi) :: WaveElevdY !< Spacing in the Y direction for the wave elevation series (m) + integer(IntKi) :: WaveElevNX !< Number of points in the X direction for the wave elevation series (-) + integer(IntKi) :: WaveElevNY !< Number of points in the X direction for the wave elevation series (-) + end type SeaSt_Drvr_InitInput + +! ----------------------------------------------------------------------------------- +! NOTE: this module and the ModMesh.f90 modules must use the Fortran compiler flag: +! /fpp because of they both have preprocessor statements +! ----------------------------------------------------------------------------------- + + INTEGER(IntKi), PARAMETER :: NumInp = 1 ! Number of inputs sent to HydroDyn_UpdateStates + + ! Program variables + + real(DbKi) :: Time ! Variable for storing time, in seconds + + real(DbKi) :: InputTime(NumInp) ! Variable for storing time associated with inputs, in seconds + real(DbKi) :: Interval ! HD module requested time interval + integer(B1Ki), allocatable :: SaveAry(:) ! Array to store packed data structure + + type(SeaState_InitInputType) :: InitInData ! Input data for initialization + type(SeaState_InitOutputType) :: InitOutData ! Output data from initialization + + type(SeaState_ContinuousStateType) :: x ! Continuous states + type(SeaState_ContinuousStateType) :: x_new ! Continuous states at updated time + type(SeaState_DiscreteStateType) :: xd ! Discrete states + type(SeaState_DiscreteStateType) :: xd_new ! Discrete states at updated time + type(SeaState_ConstraintStateType) :: z ! Constraint states + type(SeaState_ConstraintStateType) :: z_residual ! Residual of the constraint state equations (Z) + type(SeaState_OtherStateType) :: OtherState ! Other states + type(SeaState_MiscVarType) :: m ! Misc/optimization variables + + type(SeaState_ParameterType) :: p ! Parameters + !type(SeaState_InputType) :: u ! System inputs [OLD STYLE] + type(SeaState_InputType) :: u(NumInp) ! System inputs + type(SeaState_OutputType) :: y ! System outputs + + type(SeaState_ContinuousStateType) :: dxdt ! First time derivatives of the continuous states + + integer(IntKi) :: UnSeaSt_Out ! Output file identifier + integer(IntKi) :: I ! Generic loop counter + integer(IntKi) :: J ! Generic loop counter + integer(IntKi) :: n ! Loop counter (for time step) + integer(IntKi) :: ErrStat,ErrStat2 ! Status of error message + character(1024) :: ErrMsg,ErrMsg2 ! Error message if ErrStat /= ErrID_None + real(R8Ki) :: dcm (3,3) ! The resulting transformation matrix from X to x, (-). + character(1024) :: drvrFilename ! Filename and path for the driver input file. This is passed in as a command line argument when running the Driver exe. + type(SeaSt_Drvr_InitInput) :: drvrInitInp ! Initialization data for the driver program + + integer :: StrtTime (8) ! Start time of simulation (including intialization) + integer :: SimStrtTime (8) ! Start time of simulation (after initialization) + real(ReKi) :: PrevClockTime ! Clock time at start of simulation in seconds + real(ReKi) :: UsrTime1 ! User CPU time for simulation initialization + real(ReKi) :: UsrTime2 ! User CPU time for simulation (without intialization) + real(DbKi) :: TiLstPrn ! The simulation time of the last print + real(DbKi) :: t_global ! Current simulation time (for global/FAST simulation) + real(DbKi) :: SttsTime ! Amount of time between screen status messages (sec) + integer :: n_SttsTime ! Number of time steps between screen status messages (-) + + + ! For testing + logical :: DoTight = .FALSE. + + + + character(20) :: FlagArg ! Flag argument from command line + character(200) :: git_commit ! String containing the current git commit hash + + type(ProgDesc), parameter :: version = ProgDesc( 'SeaState Driver', '', '' ) ! The version number of this program. + + ! Variables Init + Time = -99999 + + !............................................................................................................................... + ! Routines called in initialization + !............................................................................................................................... + + + + ! TODO: Need to think some more about how to pass DRIVER-level initialization data to the SeaState module because if UseInputFile = .FALSE. + ! then the input processing code will still be querying the *Chr input data to look for the use of the 'DEFAULT' string and to set that + ! data to the driver's version instead of using a module-specific version. + ! Currently, these variables are: + ! InitInp%Waves%WavePkShpChr + ! InitInp%Current%CurrSSDirChr + ! InitInp%PtfmSgFChr + ! InitInp%PtfmSwFChr + ! InitInp%PtfmHvFChr + ! InitInp%PtfmRFChr + ! InitInp%PtfmPFChr + ! InitInp%PtfmYFChr + ! InitInp%Morison%InpMembers(k)%FillDensChr + ! + ! + + call NWTC_Init( ProgNameIn=version%Name ) + + drvrFilename = '' + call CheckArgs( drvrFilename, Flag=FlagArg ) + if ( LEN( TRIM(FlagArg) ) > 0 ) call NormStop() + + ! Display the copyright notice + call DispCopyrightLicense( version%Name ) + ! Obtain OpenFAST git commit hash + git_commit = QueryGitVersion() + ! Tell our users what they're running + call WrScr( ' Running '//TRIM( version%Name )//' a part of OpenFAST - '//TRIM(git_commit)//NewLine//' linked with '//TRIM( NWTC_Ver%Name )//NewLine ) + + ! Parse the driver input file and run the simulation based on that file + call ReadDriverInputFile( drvrFilename, drvrInitInp, ErrStat, ErrMsg ) + if ( ErrStat /= 0 ) then + call WrScr( ErrMsg ) + stop + end if + InitInData%Gravity = drvrInitInp%Gravity + InitInData%defWtrDens = drvrInitInp%WtrDens + InitInData%defWtrDpth = drvrInitInp%WtrDpth + InitInData%defMSL2SWL = drvrInitInp%MSL2SWL + InitInData%UseInputFile = .TRUE. + InitInData%InputFile = drvrInitInp%SeaStateInputFile + InitInData%OutRootName = drvrInitInp%OutRootName + InitInData%TMax = drvrInitInp%NSteps * drvrInitInp%TimeInterval + + ! Get the current time + call date_and_time ( Values=StrtTime ) ! Let's time the whole simulation + call cpu_time ( UsrTime1 ) ! Initial time (this zeros the start time when used as a MATLAB function) + SttsTime = 1.0 ! seconds + + ! figure out how many time steps we should go before writing screen output: + n_SttsTime = MAX( 1, NINT( SttsTime / drvrInitInp%TimeInterval ) ) ! this may not be the final TimeInterval, though!!! GJH 8/14/14 + + +!------------------------------------------------------------------------------------- +! Begin Simulation Setup +!------------------------------------------------------------------------------------- + + ! Setup the arrays for the wave elevation timeseries if requested by the driver input file + !if ( drvrInitInp%WaveElevSeriesFlag ) then + ! ALLOCATE ( InitInData%WaveElevXY(2,drvrInitInp%WaveElevNX*drvrInitInp%WaveElevNY), STAT=ErrStat ) + ! if ( ErrStat >= ErrID_Fatal ) then + ! call SeaState_End( u(1), p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) + ! if ( ErrStat /= ErrID_None ) then + ! call WrScr( ErrMsg ) + ! end if + ! stop + ! end if + ! + ! ! Set the values + ! n = 0 ! Dummy counter we are using to get the current point number + ! do I = 0,drvrInitInp%WaveElevNX-1 + ! do J = 0, drvrInitInp%WaveElevNY-1 + ! n = n+1 + ! ! X dimension + ! InitInData%WaveElevXY(1,n) = drvrInitInp%WaveElevDX*(I - 0.5*(drvrInitInp%WaveElevNX-1)) + ! ! Y dimension + ! InitInData%WaveElevXY(2,n) = drvrInitInp%WaveElevDY*(J - 0.5*(drvrInitInp%WaveElevNY-1)) + ! ENDDO + ! ENDDO + !endif + + ! Initialize the module + Interval = drvrInitInp%TimeInterval + call SeaState_Init( InitInData, u(1), p, x, xd, z, OtherState, y, m, Interval, InitOutData, ErrStat, ErrMsg ) + if (errStat >= AbortErrLev) then + ! Clean up and exit + call SeaSt_DvrCleanup() + end if + + if ( Interval /= drvrInitInp%TimeInterval) then + call WrScr('The SeaState Module attempted to change timestep interval, but this is not allowed. The SeaState Module must use the Driver Interval.') + call SeaSt_DvrCleanup() + + end if + + + ! Write the gridded wave elevation data to a file + + if ( drvrInitInp%WaveElevSeriesFlag ) call WaveElevGrid_Output (drvrInitInp, InitInData, InitOutData, p, ErrStat, ErrMsg) + if (errStat >= AbortErrLev) then + ! Clean up and exit + call SeaSt_DvrCleanup() + end if + + + ! Destroy initialization data + + call SeaState_DestroyInitInput( InitInData, ErrStat, ErrMsg ) + call SeaState_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) + + + + + + + !............................................................................................................................... + ! Routines called in loose coupling -- the glue code may implement this in various ways + !............................................................................................................................... + Time = 0.0 + call SimStatus_FirstTime( TiLstPrn, PrevClockTime, SimStrtTime, UsrTime2, time, InitInData%TMax ) + + ! loop through time steps + + + do n = 1, drvrInitInp%NSteps + + Time = (n-1) * drvrInitInp%TimeInterval + InputTime(1) = Time + + ! Calculate outputs at n + + call SeaState_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) + if (errStat >= AbortErrLev) then + ! Clean up and exit + call SeaSt_DvrCleanup() + end if + + + if ( MOD( n + 1, n_SttsTime ) == 0 ) then + + call SimStatus( TiLstPrn, PrevClockTime, time, InitInData%TMax ) + + endif + + ! Write output to a file which is managed by the driver program and not the individual modules + ! TODO + + end do + + + +! For now, finish here. +call SeaSt_DvrCleanup() + + + + contains + + +!==================================================================================================== +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 SeaSt_DvrCleanup() + + ! Local variables + character(len(errMsg)) :: errMsg2 ! temporary Error message if ErrStat /= ErrID_None + integer(IntKi) :: errStat2 ! temporary Error status of the operation + + errStat2 = ErrID_None + errMsg2 = "" + + call SeaState_DestroyInitInput( InitInData, errStat2, errMsg2 ) + call SetErrStat( errStat2, errMsg2, errStat, errMsg, 'SeaSt_DvrCleanup' ) + + call SeaState_End( u(1), p, x, xd, z, OtherState, y, m, errStat2, errMsg2 ) + call SetErrStat( errStat2, errMsg2, errStat, errMsg, 'SeaSt_DvrCleanup' ) + + if ( ErrStat /= ErrID_None ) then !This assumes PRESENT(ErrID) is also .TRUE. : + call WrScr(NewLine//NewLine//'Error status and messages after execution:'//NewLine//' ErrStat: '// & + TRIM(Num2LStr(ErrStat))//NewLine//' ErrMsg returned: '//TRIM(ErrMsg)//NewLine) + if ( time < 0.0 ) then + ErrMsg = 'at initialization' + else if ( time > InitInData%TMax ) then + ErrMsg = 'after computing the solution' + else + ErrMsg = 'at simulation time '//trim(Num2LStr(time))//' of '//trim(Num2LStr(InitInData%TMax))//' seconds' + end if + + + call ProgAbort( 'SeaState encountered an error '//trim(errMsg)//'.'//NewLine//' Simulation error level: '& + //trim(GetErrStr(errStat)), TrapErrors=.FALSE., TimeWait=3._ReKi ) ! wait 3 seconds (in case they double-clicked and got an error) + end if + + call RunTimes( StrtTime, real(UsrTime1,ReKi), SimStrtTime, real(UsrTime2,ReKi), time ) + call NormStop() + +end subroutine SeaSt_DvrCleanup + + +SUBROUTINE ReadDriverInputFile( inputFile, InitInp, ErrStat, ErrMsg ) + + character(1024), intent( in ) :: inputFile + type(SeaSt_Drvr_InitInput), intent( out ) :: InitInp + 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 ! generic integer for counting + integer :: 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 SeaState echo file + character(1024) :: Line ! String to temporarially hold value of read line + character(1024) :: TmpPath ! Temporary storage for relative path name + character(1024) :: TmpFmt ! Temporary storage for format statement + character(1024) :: FileName ! Name of SeaState input file + + real(ReKi) :: TmpRealVar2(2) !< Temporary real array size 2 + integer(IntKi) :: TmpIntVar2(2) !< Temporary integer array size 2 + + + + ! Initialize the echo file unit to -1 which is the default to prevent echoing, we will alter this based on user input + UnEchoLocal = -1 + + FileName = TRIM(inputFile) + + call GetNewUnit( UnIn ) + call OpenFInpFile ( UnIn, FileName, ErrStat, ErrMsg ) + if (ErrStat >=AbortErrLev) then + call WrScr( ErrMsg ) + stop + endif + + + call WrScr( 'Opening SeaState Driver input file: '//FileName ) + + + !------------------------------------------------------------------------------------------------- + ! File header + !------------------------------------------------------------------------------------------------- + + call ReadCom( UnIn, FileName, 'SeaState Driver input file header line 1', ErrStat, ErrMsg ) + + if ( ErrStat /= ErrID_None ) then + ErrStat = ErrID_Fatal + close( UnIn ) + return + end if + + + call ReadCom( UnIn, FileName, 'SeaState Driver input file header line 2', ErrStat, ErrMsg ) + + if ( ErrStat /= ErrID_None ) then + ErrStat = ErrID_Fatal + close( UnIn ) + return + end if + + + ! Echo Input Files. + + call ReadVar ( UnIn, FileName, InitInp%Echo, 'Echo', 'Echo Input', ErrStat, ErrMsg ) + + if ( ErrStat /= ErrID_None ) then + ErrStat = ErrID_Fatal + close( UnIn ) + 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(FileName)//'.ech' + call GetNewUnit( UnEchoLocal ) + call OpenEcho ( UnEchoLocal, EchoFile, ErrStat, ErrMsg ) + if ( ErrStat /= ErrID_None ) then + !ErrMsg = ' Failed to open Echo file.' + ErrStat = ErrID_Fatal + close( UnIn ) + return + end if + + REWIND(UnIn) + + call ReadCom( UnIn, FileName, 'SeaState Driver input file header line 1', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read SeaState Driver input file header line 1.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + + call ReadCom( UnIn, FileName, 'SeaState Driver input file header line 2', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read SeaState Driver input file header line 2.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + + ! Echo Input Files. Note this line is prevented from being echoed by the ReadVar routine. + + call ReadVar ( UnIn, FileName, InitInp%Echo, 'Echo', 'Echo the input file data', ErrStat, ErrMsg, UnEchoLocal ) + !write (UnEchoLocal,Frmt ) InitInp%Echo, 'Echo', 'Echo input file' + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read Echo parameter.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + end if + !------------------------------------------------------------------------------------------------- + ! Environmental conditions section + !------------------------------------------------------------------------------------------------- + + ! Header + + call ReadCom( UnIn, FileName, 'Environmental conditions header', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read Comment line.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + + ! Gravity - Gravity. + + call ReadVar ( UnIn, FileName, InitInp%Gravity, 'Gravity', 'Gravity', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read Gravity parameter.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + ! WtrDens - Water density. + + call ReadVar ( UnIn, FileName, InitInp%WtrDens, 'WtrDens', 'Water density', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read WtrDens parameter.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + ! WtrDpth - Water depth. + + call ReadVar ( UnIn, FileName, InitInp%WtrDpth, 'WtrDpth', 'Water depth', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read WtrDpth parameter.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + ! MSL2SWL - Offset between still-water level and mean sea level. + + call ReadVar ( UnIn, FileName, InitInp%MSL2SWL, 'MSL2SWL', 'Offset between still-water level and mean sea level', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read MSL2SWL parameter.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + !------------------------------------------------------------------------------------------------- + ! SeaState section + !------------------------------------------------------------------------------------------------- + + ! Header + + call ReadCom( UnIn, FileName, 'SeaState header', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read Comment line.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + + ! HDInputFile + + call ReadVar ( UnIn, FileName, InitInp%SeaStateInputFile, 'SeaStateInputFile', & + 'SeaState input filename', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read SeaStateInputFile parameter.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + + ! OutRootName + + call ReadVar ( UnIn, FileName, InitInp%OutRootName, 'OutRootName', & + 'SeaState output root filename', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read OutRootName parameter.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + + ! NSteps + + call ReadVar ( UnIn, FileName, InitInp%NSteps, 'NSteps', & + 'Number of time steps in the SeaState simulation', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read NSteps parameter.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + + ! TimeInterval + + call ReadVar ( UnIn, FileName, InitInp%TimeInterval, 'TimeInterval', & + 'Time interval for any SeaState inputs', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read TimeInterval parameter.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + + !------------------------------------------------------------------------------------------------- + !> ### Waves elevation series section + !------------------------------------------------------------------------------------------------- + + !> Header + +call ReadCom( UnIn, FileName, 'Waves multipoint elevation output header', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read Comment line.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + !> WaveElevSeriesFlag -- are we doing multipoint wave elevation output? + call ReadVar ( UnIn, FileName, InitInp%WaveElevSeriesFlag, 'WaveElevSeriesFlag', 'WaveElevSeriesFlag', ErrStat, ErrMsg ) + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read WaveElevSeriesFlag parameter.' + ErrStat = ErrID_Fatal + close( UnIn ) + return + end if + + + + + + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + +end SUBROUTINE ReadDriverInputFile + +SUBROUTINE WaveElevGrid_Output (drvrInitInp, SeaStateInitInp, SeaStateInitOut, SeaState_p, ErrStat, ErrMsg) + + type(SeaSt_drvr_InitInput), intent( in ) :: drvrInitInp + type(SeaState_InitInputType), intent( in ) :: SeaStateInitInp + type(SeaState_InitOutputType), intent( in ) :: SeaStateInitOut ! Output data from initialization + type(SeaState_ParameterType), intent( in ) :: SeaState_p ! Output data from initialization + integer, intent( out ) :: ErrStat ! returns a non-zero value when an error occurs + character(*), intent( out ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + ! Temporary local variables + integer(IntKi) :: ErrStatTmp !< Temporary variable for the status of error message + character(1024) :: ErrMsgTmp !< Temporary variable for the error message + + integer(IntKi) :: WaveElevFileUn !< Number for the output file for the wave elevation series + character(1024) :: WaveElevFileName !< Name for the output file for the wave elevation series + character(128) :: WaveElevFmt !< Format specifier for the output file for wave elevation series + real(ReKi) :: xpos, ypos + integer(IntKi) :: i,j,k + + WaveElevFmt = "(F14.7,3x,F14.7,3x,F14.7)" + + ErrMsg = "" + ErrStat = ErrID_None + ErrMsgTmp = "" + ErrStatTmp = ErrID_None + + + ! If we calculated the wave elevation at a set of coordinates for use with making movies, put it into an output file + WaveElevFileName = TRIM(drvrInitInp%OutRootName)//".WaveElev.out" + call GetNewUnit( WaveElevFileUn ) + + call OpenFOutFile( WaveElevFileUn, WaveElevFileName, ErrStat, ErrMsg ) + if ( ErrStat /= ErrID_None) then + if ( ErrStat >= AbortErrLev ) return + end if + + ! Write some useful header information +! write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## This file was generated by '//TRIM(GetNVD(SeaState_Drv_ProgDesc))// & +! ' on '//CurDate()//' at '//CurTime()//'.' + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## This file was generated on '//CurDate()//' at '//CurTime()//'.' + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## This file contains the wave elevations at a series of points '// & + 'through the entire timeseries.' + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## It is arranged as blocks of X,Y,Elevation at each timestep' + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## Each block is separated by two blank lines for use in gnuplot' + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# ' + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# WaveTMax = '//TRIM(Num2LStr(SeaState_p%WaveTime(SeaState_P%NStepWave))) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# NStepWave = '//TRIM(Num2LStr(SeaState_p%NStepWave)) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridXPoints = '//TRIM(Num2LStr(SeaState_p%NGrid(1))) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridYPoints = '//TRIM(Num2LStr(SeaState_p%NGrid(2))) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridDX = '//TRIM(Num2LStr(SeaState_p%deltaGrid(1))) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridDY = '//TRIM(Num2LStr(SeaState_p%deltaGrid(2))) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# MaxWaveElev = '//TRIM(Num2LStr(MAXVAL(SeaState_p%WaveElev))) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# MinWaveElev = '//TRIM(Num2LStr(MINVAL(SeaState_p%WaveElev))) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# ' + + ! Timestep looping + do i = 0,SeaState_p%NStepWave + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) NewLine + write (WaveElevFileUn,'(A8,F10.3)', IOSTAT=ErrStatTmp ) '# Time: ',SeaState_p%WaveTime(I) + ! Now output the X,Y, Elev info for this timestep + do j=1,SeaState_p%NGrid(1) + xpos = -SeaState_p%deltaGrid(1)*(SeaState_p%NGrid(1)-1)/2.0 + (J-1)*SeaState_p%deltaGrid(1) + do k=1, SeaState_p%NGrid(2) + ypos = -SeaState_p%deltaGrid(2)*(SeaState_p%NGrid(2)-1)/2.0 + (K-1)*SeaState_p%deltaGrid(2) + write (WaveElevFileUn,WaveElevFmt, IOSTAT=ErrStatTmp ) xpos, ypos,SeaState_p%WaveElev(I,J,K) + end do + end do + end do + + ! Done. Close the file + close (WaveElevFileUn) + +end SUBROUTINE WaveElevGrid_Output + +!---------------------------------------------------------------------------------------------------------------------------------- + +end PROGRAM SeaStateDriver + diff --git a/modules/seastate/src/SeaState_Input.f90 b/modules/seastate/src/SeaState_Input.f90 new file mode 100644 index 0000000000..4cba91a727 --- /dev/null +++ b/modules/seastate/src/SeaState_Input.f90 @@ -0,0 +1,1409 @@ +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2013-2021 National Renewable Energy Laboratory +! +! This file is part of SeaState. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** +module SeaState_Input + use NWTC_Library + use SeaState_Types + use SeaState_Output + use Waves + use NWTC_RandomNumber + + implicit none + + contains + +!==================================================================================================== +SUBROUTINE PrintBadChannelWarning(NUserOutputs, UserOutputs , foundMask, ErrStat, ErrMsg ) +! The routine prints out warning messages if the user has requested invalid output channel names +! The errstat is set to ErrID_Warning if any element in foundMask is .FALSE. +!---------------------------------------------------------------------------------------------------- + INTEGER, INTENT( IN ) :: NUserOutputs ! Number of user-specified output channels + CHARACTER(ChanLen), INTENT( IN ) :: UserOutputs (:) ! An array holding the names of the requested output channels. + LOGICAL, INTENT( IN ) :: foundMask (:) ! A mask indicating whether a user requested channel belongs to a module's output channels. + INTEGER, INTENT( OUT ) :: ErrStat ! returns a non-zero value when an error occurs + CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + INTEGER :: I + + ErrStat = ErrID_None + ErrMsg = '' + + DO I = 1, NUserOutputs + IF (.NOT. foundMask(I)) THEN + ErrMsg = ' A requested output channel is invalid' + CALL ProgWarn( 'The requested output channel is invalid: ' // UserOutputs(I) ) + ErrStat = ErrID_Warn + END IF + END DO + +END SUBROUTINE PrintBadChannelWarning + + !==================================================================================================== +subroutine SeaState_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDpth, defMSL2SWL, FileInfo_In, InputFileData, ErrStat, ErrMsg ) +! This public subroutine reads the input required for SeaState from the file whose name is an +! input parameter. +!---------------------------------------------------------------------------------------------------- + + ! Passed variables + 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(SeaState_InputFile), INTENT(INOUT) :: InputFileData ! the SeaState 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, k, count ! 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 SeaState 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 = 'SeaState_ParaseInput' + + ! Initialize local data + UnEc = -1 + ErrStat = ErrID_None + ErrMsg = "" + InputFileData%Echo = .FALSE. ! initialize for error handling (cleanup() routine) + + + !------------------------------------------------------------------------------------------------- + ! General settings + !------------------------------------------------------------------------------------------------- + + 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; + + if ( InputFileData%Echo ) then + EchoFile = trim(OutRootName)//'.SEA.ech' + call OpenEcho ( UnEc, trim(EchoFile), ErrStat2, ErrMsg2 ) + if (Failed()) return; + write(UnEc, '(A)') 'Echo file for SeaState 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)) + + CurLine = 3 + call ParseVar( FileInfo_In, CurLine, 'Echo', InputFileData%Echo, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return + endif + + + !------------------------------------------------------------------------------------------------- + ! Environmental conditions section + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) write(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + + ! WtrDens - Water density. + call ParseVarWDefault ( FileInfo_In, CurLine, 'WtrDens', InputFileData%Waves%WtrDens, defWtrDens, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WtrDpth - Water depth + call ParseVarWDefault ( FileInfo_In, CurLine, 'WtrDpth', InputFileData%Waves%WtrDpth, defWtrDpth, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! MSL2SWL + call ParseVarWDefault ( FileInfo_In, CurLine, 'MSL2SWL', InputFileData%MSL2SWL, defMSL2SWL, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + !------------------------------------------------------------------------------------------------- + ! Data section for Wave Kinematics data grid spatial discretization + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) write(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + + ! X_HalfWidth - Half-width of the domain in the X direction. + call ParseVar( FileInfo_In, CurLine, 'X_HalfWidth', InputFileData%X_HalfWidth, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! Y_HalfWidth - Half-width of the domain in the Y direction. + call ParseVar( FileInfo_In, CurLine, 'Y_HalfWidth', InputFileData%Y_HalfWidth, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! Z_Depth - Depth of the domain the Z direction. + call ParseVarWDefault ( FileInfo_In, CurLine, 'Z_Depth', InputFileData%Z_Depth, defWtrDpth, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! NX - Number of nodes in half of the X-direction domain. + call ParseVar( FileInfo_In, CurLine, 'NX', InputFileData%NX, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! NY - Number of nodes in half of the Y-direction domain. + call ParseVar( FileInfo_In, CurLine, 'NY', InputFileData%NY, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! NZ - Number of nodes in the Z-direction domain. + call ParseVar( FileInfo_In, CurLine, 'NZ', InputFileData%NZ, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + !------------------------------------------------------------------------------------------------- + ! Data section for waves + !------------------------------------------------------------------------------------------------- + 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 Conv2UC( InputFileData%Waves%WaveModChr ) ! Convert Line to upper case. + + InputFileData%Waves%WavePhase = 0.0 + InputFileData%Waves%WaveNDAmp = .FALSE. + + + ! WaveStMod - Model switch for stretching incident wave kinematics to instantaneous free surface. + call ParseVar( FileInfo_In, CurLine, 'WaveStMod', InputFileData%Waves%WaveStMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WaveTMax - Analysis time for incident wave calculations. + call ParseVar( FileInfo_In, CurLine, 'WaveTMax', InputFileData%Waves%WaveTMax, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WaveDT - Time step for incident wave calculations + call ParseVar( FileInfo_In, CurLine, 'WaveDT', InputFileData%Waves%WaveDT, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WaveHs - Significant wave height + call ParseVar( FileInfo_In, CurLine, 'WaveHs', InputFileData%Waves%WaveHs, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WaveTp - Peak spectral period. + call ParseVar( FileInfo_In, CurLine, 'WaveTp', InputFileData%Waves%WaveTp, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WavePkShp - Peak shape parameter. + 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 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 ParseVar( FileInfo_In, CurLine, 'WvHiCOff', InputFileData%Waves%WvHiCOff, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WaveDir - Mean wave heading direction. + 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 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 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 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 ParseVar( FileInfo_In, CurLine, 'WaveDirRange', InputFileData%Waves%WaveDirRange, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! Negative values should be treated as positive. + InputFileData%Waves%WaveDirRange = abs( InputFileData%Waves%WaveDirRange ) + + + ! 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 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 + ErrStat2 = ErrID_Fatal + ErrMsg2 = ' WaveSeed(2): Invalid RNG type.' + if (Failed()) return; + endif + +!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 + InputFileData%Waves%RNG%RNG_type = "NORMAL" + InputFileData%Waves%RNG%pRNG = pRNG_INTRINSIC + + else + + InputFileData%Waves%RNG%RNG_type = adjustl( Line ) + call Conv2UC( InputFileData%Waves%RNG%RNG_type ) + + if ( InputFileData%Waves%RNG%RNG_type == "RANLUX") then + InputFileData%Waves%RNG%pRNG = pRNG_RANLUX + else + ErrStat2 = ErrID_Fatal + ErrMsg2 = ' WaveSeed(2): Invalid alternative random number generator.' + if (Failed()) return; + endif + + endif + + + ! WaveNDAmp - Flag for normally distributed amplitudes. + call ParseVar( FileInfo_In, CurLine, 'WaveNDAmp', InputFileData%Waves%WaveNDAmp, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WvKinFile + call ParseVar( FileInfo_In, CurLine, 'WvKinFile', InputFileData%Waves%WvKinFile, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + !------------------------------------------------------------------------------------------------- + ! 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 + + ! WvDiffQTFF - Second order waves -- difference forces + call ParseVar( FileInfo_In, CurLine, 'WvDiffQTF', InputFileData%Waves2%WvDiffQTFF, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! 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; + + ! 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; + + ! 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 current + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) write(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + + ! CurrMod - Current profile model switch + call ParseVar( FileInfo_In, CurLine, 'CurrMod', InputFileData%Current%CurrMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! CurrSSV0 - Sub-surface current velocity at still water level + call ParseVar( FileInfo_In, CurLine, 'CurrSSV0', InputFileData%Current%CurrSSV0, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + + ! CurrSSDirChr - Sub-surface current heading direction + call ParseVar( FileInfo_In, CurLine, 'CurrSSDir', InputFileData%Current%CurrSSDirChr, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + call Conv2UC( InputFileData%Current%CurrSSDirChr ) ! Convert Line to upper case. + + + ! CurrNSRef - Near-surface current reference depth. + call ParseVar( FileInfo_In, CurLine, 'CurrNSRef', InputFileData%Current%CurrNSRef, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! 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; + + ! CurrDIDir - Depth-independent current heading direction. + call ParseVar( FileInfo_In, CurLine, 'CurrDIDir', InputFileData%Current%CurrDIDir, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + + !------------------------------------------------------------------------------------------------- + ! Data section for OUTPUT + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) write(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + + ! SeaSum - Whether or not to generate a summary file + call ParseVar( FileInfo_In, CurLine, 'SeaStSum', InputFileData%SeaStSum, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! OutSwtch - Specify how to write to an output file + call ParseVar( FileInfo_In, CurLine, 'OutSwtch', InputFileData%OutSwtch, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! OutFmt - Format for numerical outputs + call ParseVar( FileInfo_In, CurLine, 'OutFmt', InputFileData%OutFmt, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! OutSFmt - Format for output column headers + call ParseVar( FileInfo_In, CurLine, 'OutSFmt', InputFileData%OutSFmt, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! NWaveElev - Number of Wave elevations to output + call ParseVar( FileInfo_In, CurLine, 'NWaveElev', InputFileData%NWaveElev, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + + ! This check is needed here instead of being located in SeaStateInput_ProcessInputData() because + ! we need to allocate arrays. If _GetInput() was skipped, then these array would already have + ! been allocated and populated. + + if ( InputFileData%NWaveElev < 0 .OR. InputFileData%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 + + ! allocate space for the output location arrays: + call AllocAry( InputFileData%WaveElevxi, InputFileData%NWaveElev, 'WaveElevxi' , ErrStat2, ErrMsg2); if (Failed()) return; + call AllocAry( InputFileData%WaveElevyi, InputFileData%NWaveElev, 'WaveElevyi' , ErrStat2, ErrMsg2); if (Failed()) return; + + ! WaveElevxi + call ParseAry ( FileInfo_In, CurLine, 'WaveElevxi.', InputFileData%WaveElevxi, InputFileData%NWaveElev, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WaveElevyi + call ParseAry ( FileInfo_In, CurLine, 'WaveElevyi.', InputFileData%WaveElevyi, InputFileData%NWaveElev, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! NWaveKin + call ParseVar( FileInfo_In, CurLine, 'NWaveKin', InputFileData%NWaveKin, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + + ! This check is needed here instead of being located in SeaStateInput_ProcessInputData() because + ! we need to allocate arrays. If _GetInput() was skipped, then these array would already have + ! been allocated and populated. + + if ( InputFileData%NWaveKin < 0 .OR. InputFileData%NWaveKin > 9 ) then + ErrStat2 = ErrID_Fatal + ErrMsg2 = 'NWaveKin must be greater than or equal to zero and less than 10.' + if (Failed()) return; + end if + + ! allocate space for the output location arrays: + call AllocAry( InputFileData%WaveKinxi, InputFileData%NWaveKin, 'WaveKinxi' , ErrStat2, ErrMsg2); if (Failed()) return; + call AllocAry( InputFileData%WaveKinyi, InputFileData%NWaveKin, 'WaveKinyi' , ErrStat2, ErrMsg2); if (Failed()) return; + call AllocAry( InputFileData%WaveKinzi, InputFileData%NWaveKin, 'WaveKinzi' , ErrStat2, ErrMsg2); if (Failed()) return; + + ! WaveKinxi + call ParseAry ( FileInfo_In, CurLine, 'WaveKinxi.', InputFileData%WaveKinxi, InputFileData%NWaveKin, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WaveKinyi + call ParseAry ( FileInfo_In, CurLine, 'WaveKinyi.', InputFileData%WaveKinyi, InputFileData%NWaveKin, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + ! WaveKinzi + call ParseAry ( FileInfo_In, CurLine, 'WaveKinzi.', InputFileData%WaveKinzi, InputFileData%NWaveKin, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + + !------------------------------------------------------------------------------------------------- + ! Data section for OUTPUT CHANNELS + !------------------------------------------------------------------------------------------------- + + 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 + call AllocAry( InputFileData%UserOutputs, MaxSeaStOutputs, 'InputFileData%UserOutputs', ErrStat2, ErrMsg2 ) ! MaxUserOutputs is set in registry + if (Failed()) return; + + call ReadOutputListFromFileInfo( FileInfo_In, CurLine, InputFileData%UserOutputs, & + InputFileData%NUserOutputs, 'OutList', "List of user-requested output channels", ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + +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 ) + if (allocated(tmpReArray)) deallocate(tmpReArray) + if (allocated(tmpVec1 )) deallocate(tmpVec1 ) + if (allocated(tmpVec2 )) deallocate(tmpVec2 ) + ! Cleanup the Echo file and global variables + if (UnEc > 0) close ( UnEc ) + end subroutine Cleanup + +end subroutine SeaState_ParseInput + +!==================================================================================================== +subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, ErrStat, ErrMsg ) +! This private subroutine verifies the input required for HydroDyn is correctly specified. +!---------------------------------------------------------------------------------------------------- + + + ! Passed variables + + type(SeaState_InitInputType), intent( in ) :: InitInp ! the SeaState data + type(SeaState_ParameterType), intent( inout ) :: p ! the SeaState parameter data + real(DbKi), intent( in ) :: Interval ! The DT supplied by the glue code/driver + type(SeaState_InputFile), intent( inout ) :: InputFileData ! the SeaState 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 + + integer :: I, count ! Generic loop counter index + integer :: J ! Generic loop counter index + integer :: K ! Generic loop counter index + character(1024) :: TmpPath ! Temporary storage for relative path name + logical :: FoundID ! Boolean flag indicating whether an ID from one tables is found in one of the other input table + real(ReKi) :: MinDepth ! The minimum depth entry in the Depth-based Hydrodynamic coefficents table + real(ReKi) :: MaxDepth ! The maximum depth entry in the Depth-based Hydrodynamic coefficents table + real(ReKi) :: z1 + real(ReKi) :: z2 + real(ReKi) :: MinMembrDpth + real(ReKi) :: MaxMembrDpth +! CHARACTER(ChanLen), ALLOCATABLE :: tmpOutLst(:) ! + logical :: TmpFileExist ! Temporary variable in checking the existance of an input file. + real(ReKi) :: l, xpos, ypos, zpos + real(ReKi) :: lvec(3) + logical, allocatable :: foundMask(:) + integer :: WaveModIn + + integer(IntKi) :: ErrStat2, IOS + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SeaStateInput_ProcessInitData' + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrStat2 = ErrID_None + ErrMsg = "" + ErrMsg2 = "" + + + !------------------------------------------------------------------------- + ! Check environmental conditions + !------------------------------------------------------------------------- + + + ! WtrDens - Water density. + + if ( InputFileData%Waves%WtrDens < 0.0 ) then + call SetErrStat( ErrID_Fatal,'WtrDens must not be negative.',ErrStat,ErrMsg,RoutineName) + return + end if + + + ! WtrDpth - Water depth + + ! First adjust water depth based on MSL2SWL values + InputFileData%Waves%WtrDpth = InputFileData%Waves%WtrDpth + InputFileData%MSL2SWL + + if ( InputFileData%Waves%WtrDpth <= 0.0 ) then + call SetErrStat( ErrID_Fatal,'WtrDpth + MSL2SWL must be greater than zero.',ErrStat,ErrMsg,RoutineName) + return + end if + +!TODO: This is now a HD input check only + ! ! MSL2SWL - Mean sea level to still water level + ! + !if ( InputFileData%PotMod == 1 .AND. .NOT. EqualRealNos(InputFileData%MSL2SWL, 0.0_ReKi) ) then + ! call SetErrStat( ErrID_Fatal,'MSL2SWL must be 0 when PotMod = 1 (WAMIT).',ErrStat,ErrMsg,RoutineName) + ! return + !end if + + + ! X_HalfWidth - Half-width of the domain in the X direction (m) + if ( InputFileData%X_HalfWidth <= 0.0_ReKi ) then + call SetErrStat( ErrID_Fatal,'X_HalfWidth must be greater than zero.',ErrStat,ErrMsg,RoutineName) + return + end if + + ! Y_HalfWidth - Half-width of the domain in the Y direction (m) + if ( InputFileData%Y_HalfWidth <= 0.0_ReKi ) then + call SetErrStat( ErrID_Fatal,'Y_HalfWidth must be greater than zero.',ErrStat,ErrMsg,RoutineName) + return + end if + + ! Z_Depth - Depth of the domain the Z direction (m) + !TODO: I'm not sure we want to offset this grid depth value. Check with Jason. + InputFileData%Z_Depth = InputFileData%Z_Depth + InputFileData%MSL2SWL + if ( ( InputFileData%Z_Depth <= 0.0_ReKi ) .or. ( InputFileData%Z_Depth > InputFileData%Waves%WtrDpth ) ) then + call SetErrStat( ErrID_Fatal,'Z_Depth must be greater than zero and less than or equal to the WtrDpth + MSL2SWL.',ErrStat,ErrMsg,RoutineName) + return + end if + + ! NX - Number of nodes in half of the X-direction domain + if ( InputFileData%NX < 2 ) then + call SetErrStat( ErrID_Fatal,'NX must be greater than or equal to 2.',ErrStat,ErrMsg,RoutineName) + return + end if + + ! NY - Number of nodes in half of the Y-direction domain + if ( InputFileData%NY < 2 ) then + call SetErrStat( ErrID_Fatal,'NY must be greater than or equal to 2.',ErrStat,ErrMsg,RoutineName) + return + end if + + ! NZ - Number of nodes in the Z-direction domain + if ( InputFileData%NZ < 2 ) then + call SetErrStat( ErrID_Fatal,'NZ must be greater than or equal to 2.',ErrStat,ErrMsg,RoutineName) + return + end if + + + ! WaveMod - Wave kinematics model switch. + + if ( LEN_TRIM(InputFileData%Waves%WaveModChr) > 1 ) then + + if ( InputFileData%Waves%WaveModChr(1:2) == '1P' ) then ! The user wants to specify the phase in place of a random phase + + 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 + 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) + return + end if + + else + ! The line below only works for 1 digit reads + 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 = InputFileData%Waves%WaveMod + + end if ! LEN_TRIM(InputFileData%Waves%WaveModChr) + + if ( (WaveModIn == 6) .AND. .NOT. EqualRealNos(InputFileData%MSL2SWL, 0.0_ReKi) ) then + call SetErrStat( ErrID_Fatal,'MSL2SWL must be 0 when WaveMod = 6.',ErrStat,ErrMsg,RoutineName) + return + end if + +!TODO: THese tests need to be done by HD GJH 7/11/21 +! if ( WaveModIn < 0 .OR. WaveModIn > 6 ) 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... +! else if ( ErrStat /= ErrID_None .OR. WaveModIn /= 5) then +! call SetErrStat( ErrID_Fatal,'WaveMod must be 0, 1, 1P#, 2, 3, 4, or 5.',ErrStat,ErrMsg,RoutineName) +! return +! end if +! end if + + ! Linearization Checks + ! LIN-TODO: + !errors if: + !if ( & + ! (WaveModIn /= 0) .or. & + ! (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 + + + ! WaveStMod - Model switch for stretching incident wave kinematics to instantaneous free surface. + + ! TODO: We are only implementing WaveStMod = 0 (No stretching) at this point in time. 1 Mar 2013 GJH + + if ( InputFileData%Waves%WaveStMod /= 0 ) then + call SetErrStat( ErrID_Fatal,'WaveStMod must be 0. Future versions of SeaState will once again support other wave stretching models.',ErrStat,ErrMsg,RoutineName) + return + end if + ! + !if ( InputFileData%Waves%WaveMod /= 6 .AND. InputFileData%Morison%NMembers > 0 .AND. InputFileData%Waves%WaveMod > 0 ) 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 ( ( 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 + ! ! + ! ! return + ! !end if + ! + ! + ! + !else !don't use this one + ! + ! ! NOTE: Do not read in WaveStMod for floating platforms since it is + ! ! inconsistent to use stretching (which is a nonlinear correction) for + ! ! the viscous drag term in Morison's equation while not accounting for + ! ! stretching in the diffraction and radiation problems (according to + ! ! Paul Sclavounos, there are such corrections). Instead, the viscous + ! ! drag term from Morison's equation is computed by integrating up to + ! ! the MSL, regardless of the instantaneous free surface elevation. + ! + ! InputFileData%Waves%WaveStMod = 0 + ! + !end if + + + ! WaveTMax - Analysis time for incident wave calculations. + + 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(InputFileData%Waves%WaveTMax, 0.0_DbKi) ) then + call WrScr( ' Setting WaveTMax to 0.0 since WaveMod = 0' ) + InputFileData%Waves%WaveTMax = 0.0 + end if + if ( .NOT. EqualRealNos(InputFileData%Waves%WaveDir, 0.0_SiKi) ) then + call WrScr( ' Setting WaveDir to 0.0 since WaveMod = 0' ) + InputFileData%Waves%WaveDir = 0.0 + end if + 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 > InputFileData%Waves%WaveTMax ) then + call WrScr( ' WaveTMax is less then the simulation time. Wave data will repeat every WaveTMax seconds.') + end if + end if + + + ! WaveDT - Time step for incident wave calculations + + if ( InputFileData%Waves%WaveMod > 0 ) then ! .TRUE if we have incident waves. + + if ( InputFileData%Waves%WaveDT <= 0.0 ) then + call SetErrStat( ErrID_Fatal,'WaveDT must be greater than zero.',ErrStat,ErrMsg,RoutineName) + return + end if + + 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 + + InputFileData%Waves%WaveDT = 0.0 + + end if + + + ! WaveHs - Significant wave height + + 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 ( InputFileData%Waves%WaveHs <= 0.0 ) then + call SetErrStat( ErrID_Fatal,'WaveHs must be greater than zero.',ErrStat,ErrMsg,RoutineName) + return + end if + + else + + 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 ( ( 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 ( InputFileData%Waves%WaveTp <= 0.0 ) then + call SetErrStat( ErrID_Fatal,'WaveTp must be greater than zero.',ErrStat,ErrMsg,RoutineName) + return + end if + + ! else + + ! InputFileData%Waves%WaveTp = 0.0 + + ! end if + + + ! WavePkShp - Peak shape parameter. + + call Conv2UC( InputFileData%Waves%WavePkShpChr ) ! Convert Line to upper case. + + if ( InputFileData%Waves%WaveMod == 2 ) then ! .TRUE if we have JONSWAP/Pierson-Moskowitz spectrum (irregular) waves, but not GH Bladed wave data. + + 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. + + InputFileData%Waves%WavePkShp = WavePkShpDefault ( InputFileData%Waves%WaveHs, InputFileData%Waves%WaveTp ) + + else ! The input must have been specified numerically. + + 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 ( ( 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 + + end if + + else + + InputFileData%Waves%WavePkShp = 1.0 + + end if + + + ! WvLowCOff and WvHiCOff - Wave Cut-off frequency + + 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(InputFileData%Waves%WaveDT, 0.0_DbKi) ) then + InputFileData%Waves%WvHiCOff = 10000.0; ! This is not going to be used because WaveDT is zero. + else + 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 ( InputFileData%Waves%WvLowCOff >= InputFileData%Waves%WvHiCOff ) then + call SetErrSTat( ErrID_Fatal,'WvLowCOff must be less than WvHiCOff.',ErrStat,ErrMsg,RoutineName) + return + end if + +!TODO: THis needs to be done by HD : Does that mean the WvLowCOff and WvHiCOff need to be InitOut now? + ! ! Copy over the first order frequency limits to the WAMIT2 module which needs them. + !InputFileData%WAMIT2%WvLowCOff = InputFileData%Waves%WvLowCOff + !InputFileData%WAMIT2%WvHiCOff = InputFileData%Waves%WvHiCOff + + + ! WaveDir - Wave heading direction. + + if ( ( InputFileData%Waves%WaveMod > 0 ) .AND. ( InputFileData%Waves%WaveMod /= 6 ) ) then ! .TRUE if we have incident waves, but not user input wave data. + + 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 + + InputFileData%Waves%WaveDir = 0.0 + + end if + + + ! Multi-directional waves + + ! Check the WaveDirMod value + 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 + 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 ( 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) + 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 ( InputFileData%Waves%WaveMultiDir ) then + + ! Check WaveDirSpread + if ( InputFileData%Waves%WaveDirSpread <= 0.0 ) then + + call SetErrStat( ErrID_Fatal,'WaveDirSpread cannot negative or zero.',ErrStat,ErrMsg,RoutineName) + return + + ENDIF + + + ! 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 ( 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( 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 ( 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 + + 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. ( ( 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 + + InputFileData%Waves%WaveSeed(I) = 0 + + end DO !I + + end if + + + ! WvKinFile + + 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( InputFileData%Waves%WvKinFile ) == 0 ) then + call SetErrStat( ErrID_Fatal,'WvKinFile must not be an empty string.',ErrStat,ErrMsg,RoutineName) + return + end if + + if ( PathIsRelative( InputFileData%Waves%WvKinFile ) ) then + call GetPath( TRIM(InitInp%InputFile), TmpPath ) + InputFileData%Waves%WvKinFile = TRIM(TmpPath)//TRIM(InputFileData%Waves%WvKinFile) + end if + InputFileData%Waves%WriteWvKin = .FALSE. + else !don't use this one + +#ifdef WRITE_WV_KIN + if ( LEN_TRIM( InputFileData%Waves%WvKinFile ) == 0 ) then + InputFileData%Waves%WriteWvKin = .FALSE. + else + 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 + InputFileData%Waves%WvKinFile = "" + InputFileData%Waves%WriteWvKin = .FALSE. +#endif + end if + + + ! NWaveElev + + if ( InputFileData%Waves%NWaveElev < 0 ) then + + call SetErrStat( ErrID_Fatal,'NWaveElev must not be negative.',ErrStat,ErrMsg,RoutineName) + return + + end if + + + + !------------------------------------------------------------------------- + ! Check 2nd Order Waves section + !------------------------------------------------------------------------- + + + ! Difference frequency cutoffs + + ! WvLowCOffD and WvHiCOffD - Wave Cut-off frequency + 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 ( InputFileData%Waves2%WvLowCOffD >= InputFileData%Waves2%WvHiCOffD ) then + call SetErrStat( ErrID_Fatal,'WvLowCOffD must be less than WvHiCOffD.',ErrStat,ErrMsg,RoutineName) + return + end if + + + ! Sum frequency cutoffs + + ! WvLowCOffS and WvHiCOffD - Wave Cut-off frequency + 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 ( InputFileData%Waves2%WvLowCOffS >= InputFileData%Waves2%WvHiCOffS ) then + call SetErrStat( ErrID_Fatal,'WvLowCOffS must be less than WvHiCOffS.',ErrStat,ErrMsg,RoutineName) + return + end if + +!TODO: This needs to be handled by HD + ! ! Copy over the 2nd order limits to the WAMIT2 module which needs them. + !InputFileData%WAMIT2%WvLowCOffD = InputFileData%Waves2%WvLowCOffD + !InputFileData%WAMIT2%WvHiCOffD = InputFileData%Waves2%WvHiCOffD + !InputFileData%WAMIT2%WvLowCOffS = InputFileData%Waves2%WvLowCOffS + !InputFileData%WAMIT2%WvHiCOffS = InputFileData%Waves2%WvHiCOffS + + + + !------------------------------------------------------------------------- + ! Check Current section + !------------------------------------------------------------------------- + + + ! CurrMod - Current profile model switch + + 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 ( ( 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 + + + ! CurrSSV0 - Sub-surface current velocity at still water level + + if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. + + 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 + + InputFileData%Current%CurrSSV0 = 0.0 + + end if + + + ! CurrSSDirChr - Sub-surface current heading direction + + if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. + + + 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 ( 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 + + InputFileData%Current%CurrSSDir = InputFileData%Waves%WaveDir + + else ! The input must have been specified numerically. + + 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 ( ( 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 + + end if + + + else + + InputFileData%Current%CurrSSDir = 0.0 + + end if + + + ! CurrNSRef - Near-surface current reference depth. + + if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. + + if ( InputFileData%Current%CurrNSRef <= 0.0 ) then + call SetErrStat( ErrID_Fatal,'CurrNSRef must be greater than zero.',ErrStat,ErrMsg,RoutineName) + return + end if + + else + + InputFileData%Current%CurrNSRef = 0.0 + + end if + + + + ! CurrNSV0 - Near-surface current velocity at still water level. + + if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. + + 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 + + InputFileData%Current%CurrNSV0 = 0.0 + + end if + + + ! CurrNSDir - Near-surface current heading direction. + + if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. + + 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 + + InputFileData%Current%CurrNSDir = 0.0 + + end if + + + ! CurrDIV - Depth-independent current velocity. + + if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. + + 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 + + InputFileData%Current%CurrDIV = 0.0 + + end if + + + ! CurrDIDir - Depth-independent current heading direction. + + if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. + + 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 + + InputFileData%Current%CurrDIDir = 0.0 + + end if + + !TODO: Move these to HD + !.................. + ! check for linearization + !.................. + !if (InitInp%Linearize) 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 ( 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 ( 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 ( 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 ( 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 ( (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 ( 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 ( 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 ( 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 ( 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 ( 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 + ! + !end if + + + + !------------------------------------------------------------------------------------------------- + ! Data section for OUTPUT + !------------------------------------------------------------------------------------------------- + + + ! OutSwtch - output file switch + + 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 + + !InputFileData%OutFmt + !InputFileData%OutSFmt + + + ! OutList - list of requested parameters to output to a file + + + !---------------------------------------------------------- + ! Output List + !---------------------------------------------------------- + + ! 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 ( 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) + + return + end if + foundMask = .FALSE. + + ! Attach remaining items to the SeaState list + !foundMask = .FALSE. + call Allocary(InputFileData%OutList, InputFileData%NUserOutputs, "InputFileData%OutList", ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + InputFileData%NumOuts = SeaStOut_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 + + DEALLOCATE(foundMask) + + end if + ! Now that we have the sub-lists organized, lets do some additional validation. + + + + + + !---------------------------------------------------------- + ! Populate data in sub-types from parent or other module types + !---------------------------------------------------------- + + ! Current + ! For wave kinematic calculations, the effective water depth is the user input water depth (positive valued) + MSL2SWL (positive when SWL is above MSL). + InputFileData%Current%WtrDpth = InputFileData%Waves%WtrDpth ! already adjusted for the MSL2SWL. + + + ! Waves + 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). + + + + +!TODO: This is now set with the grid points? GJH 7/11/21 + + p%NGrid(1) = InputFileData%NX*2+1 + p%NGrid(2) = InputFileData%NY*2+1 + p%NGrid(3) = InputFileData%NZ + p%NGridPts = p%NGrid(1) * p%NGrid(2) * p%NGrid(3) + InputFileData%Waves%NGrid = p%NGrid + InputFileData%Current%NGridPts = p%NGridPts + + ALLOCATE ( InputFileData%Current%WaveKinzi(p%NGridPts), STAT = ErrStat2 ) + if ( ErrStat2 /= ErrID_None ) then + call SetErrStat( ErrID_Fatal,'Error allocating space for WaveKinzi array.',ErrStat,ErrMsg,RoutineName) + return + end if + + +!TODO: This is now set with the grid points? GJH 7/11/21 + ! Establish the number and locations where the wave kinematics will be computed + InputFileData%Waves%NWaveKin = p%NGridPts ! Number of points where the incident wave kinematics will be computed (-) + InputFileData%Waves%NWaveElev = p%NGrid(1)*p%NGrid(2) ! Number of XY grid points where the wave elevations are computed + ALLOCATE ( InputFileData%Waves%WaveKinxi(p%NGridPts), STAT = ErrStat2 ) + if ( ErrStat2 /= ErrID_None ) then + call SetErrStat( ErrID_Fatal,'Error allocating space for WaveKinxi array.',ErrStat,ErrMsg,RoutineName) + return + end if + ALLOCATE ( InputFileData%Waves%WaveKinyi(p%NGridPts), STAT = ErrStat2 ) + if ( ErrStat2 /= ErrID_None ) then + call SetErrStat( ErrID_Fatal,'Error allocating space for WaveKinyi array.',ErrStat,ErrMsg,RoutineName) + return + end if + ALLOCATE ( InputFileData%Waves%WaveKinzi(p%NGridPts), STAT = ErrStat2 ) + if ( ErrStat2 /= ErrID_None ) then + call SetErrStat( ErrID_Fatal,'Error allocating space for WaveKinzi array.',ErrStat,ErrMsg,RoutineName) + return + end if + + ALLOCATE ( InputFileData%Waves%WaveElevxi(InputFileData%Waves%NWaveElev), STAT = ErrStat2 ) + if ( ErrStat2 /= ErrID_None ) then + call SetErrStat( ErrID_Fatal,'Error allocating space for WaveElevxi array.',ErrStat,ErrMsg,RoutineName) + return + end if + ALLOCATE ( InputFileData%Waves%WaveElevyi(InputFileData%Waves%NWaveElev), STAT = ErrStat2 ) + if ( ErrStat2 /= ErrID_None ) then + call SetErrStat( ErrID_Fatal,'Error allocating space for WaveElevyi array.',ErrStat,ErrMsg,RoutineName) + return + end if + + ! Generate grid points + p%deltaGrid(1) = InputFileData%X_HalfWidth/(InputFileData%NX) + p%deltaGrid(2)= InputFileData%Y_HalfWidth/(InputFileData%NY) + p%deltaGrid(3) = PI / ( 2*(InputFileData%NZ-1) ) + count = 1 + do k = 0, p%NGrid(3) - 1 + zpos = - ( 1.0 - cos( real((p%NGrid(3) - 1) - k, ReKi) * p%deltaGrid(3) ) ) * InputFileData%Z_Depth + print*,zpos + do j = 0, p%NGrid(2)-1 + ypos = -InputFileData%Y_HalfWidth + p%deltaGrid(2)*j + do i= 0, p%NGrid(1)-1 + xpos = -InputFileData%X_HalfWidth + p%deltaGrid(1)*i + InputFileData%Waves%WaveKinxi(count) = xpos ! xi-coordinates for points where the incident wave kinematics will be computed; + InputFileData%Waves%WaveKinyi(count) = ypos ! yi-coordinates for points where the incident wave kinematics will be computed; + + InputFileData%Waves%WaveKinzi(count) = zpos ! zi-coordinates for points where the incident wave kinematics will be computed; + InputFileData%Current%WaveKinzi(count) = InputFileData%Waves%WaveKinzi(count) + + if ( k == 0 ) then + InputFileData%Waves%WaveElevxi(count) = xpos ! xi-coordinates for points where the incident wave kinematics will be computed; + InputFileData%Waves%WaveElevyi(count) = ypos ! yi-coordinates for points where the incident wave kinematics will be computed; + end if + count = count + 1 + end do + end do + end do + + ! Waves2 + + ! If we are using the Waves module, the node information must be copied over. + 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 + 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%NGrid = p%NGrid + 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( InputFileData%Waves2%WaveElevyi, InputFileData%Waves2%NWaveElev, 'WaveElevyi' , ErrStat2, ErrMsg2) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) + if ( ErrStat >= AbortErrLev ) return + InputFileData%Waves2%WaveElevxi = InputFileData%Waves%WaveElevxi + InputFileData%Waves2%WaveElevyi = InputFileData%Waves%WaveElevyi + + 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 ( 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 ( 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 + + InputFileData%Waves2%WaveKinxi = InputFileData%Waves%WaveKinxi + InputFileData%Waves2%WaveKinyi = InputFileData%Waves%WaveKinyi + InputFileData%Waves2%WaveKinzi = InputFileData%Waves%WaveKinzi + + ENDIF + +end subroutine SeaStateInput_ProcessInitData + +end module SeaState_Input \ No newline at end of file diff --git a/modules/seastate/src/SeaState_Interp_Types.f90 b/modules/seastate/src/SeaState_Interp_Types.f90 new file mode 100644 index 0000000000..ad581bdc43 --- /dev/null +++ b/modules/seastate/src/SeaState_Interp_Types.f90 @@ -0,0 +1,771 @@ +!STARTOFREGISTRYGENERATEDFILE 'SeaState_Interp_Types.f90' +! +! WARNING This file is generated automatically by the FAST registry. +! Do not edit. Your changes to this file will be lost. +! +! FAST Registry +!********************************************************************************************************************************* +! SeaState_Interp_Types +!................................................................................................................................. +! This file is part of SeaState_Interp. +! +! Copyright (C) 2012-2016 National Renewable Energy Laboratory +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +! +! W A R N I N G : This file was automatically generated from the FAST registry. Changes made to this file may be lost. +! +!********************************************************************************************************************************* +!> This module contains the user-defined types needed in SeaState_Interp. It also contains copy, destroy, pack, and +!! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. +MODULE SeaState_Interp_Types +!--------------------------------------------------------------------------------------------------------------------------------- +USE NWTC_Library +IMPLICIT NONE +! ========= SeaState_Interp_InitInputType ======= + TYPE, PUBLIC :: SeaState_Interp_InitInputType + INTEGER(IntKi) , DIMENSION(1:4) :: n !< number of grid points in the x, y, z, and t directions [-] + REAL(ReKi) , DIMENSION(1:4) :: delta !< size between 2 consecutive grid points in each grid direction [m,m,m,s] + REAL(ReKi) , DIMENSION(1:4) :: pZero !< fixed position of the XYZ grid (i.e., XYZ coordinates of m%V(:,1,1,1,:)) [m] + REAL(ReKi) :: Z_Depth !< grid depth [m] + END TYPE SeaState_Interp_InitInputType +! ======================= +! ========= SeaState_Interp_InitOutputType ======= + TYPE, PUBLIC :: SeaState_Interp_InitOutputType + TYPE(ProgDesc) :: Ver !< Version information of this submodule [-] + END TYPE SeaState_Interp_InitOutputType +! ======================= +! ========= SeaState_Interp_MiscVarType ======= + TYPE, PUBLIC :: SeaState_Interp_MiscVarType + REAL(SiKi) , DIMENSION(1:8) :: N3D !< this is the 3-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field [-] + REAL(SiKi) , DIMENSION(1:16) :: N4D !< this is the 4-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field [-] + INTEGER(IntKi) , DIMENSION(1:4) :: Indx_Lo !< this is the 4-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field [-] + INTEGER(IntKi) , DIMENSION(1:4) :: Indx_Hi !< this is the 4-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field [-] + END TYPE SeaState_Interp_MiscVarType +! ======================= +! ========= SeaState_Interp_ParameterType ======= + TYPE, PUBLIC :: SeaState_Interp_ParameterType + INTEGER(IntKi) , DIMENSION(1:4) :: n !< number of evenly-spaced grid points in the x, y, z, and t directions [-] + REAL(ReKi) , DIMENSION(1:4) :: delta !< size between 2 consecutive grid points in each grid direction [m,m,m,s] + REAL(ReKi) , DIMENSION(1:4) :: pZero !< fixed position of the XYZ grid (i.e., XYZ coordinates of m%V(:,1,1,1,:)) [m] + REAL(ReKi) :: Z_Depth !< grid depth [m] + END TYPE SeaState_Interp_ParameterType +! ======================= +CONTAINS + SUBROUTINE SeaState_Interp_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_Interp_InitInputType), INTENT(IN) :: SrcInitInputData + TYPE(SeaState_Interp_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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_CopyInitInput' +! + ErrStat = ErrID_None + ErrMsg = "" + DstInitInputData%n = SrcInitInputData%n + DstInitInputData%delta = SrcInitInputData%delta + DstInitInputData%pZero = SrcInitInputData%pZero + DstInitInputData%Z_Depth = SrcInitInputData%Z_Depth + END SUBROUTINE SeaState_Interp_CopyInitInput + + SUBROUTINE SeaState_Interp_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) + TYPE(SeaState_Interp_InitInputType), INTENT(INOUT) :: InitInputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_DestroyInitInput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE SeaState_Interp_DestroyInitInput + + SUBROUTINE SeaState_Interp_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(SeaState_Interp_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 = 'SeaState_Interp_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 + SIZE(InData%n) ! n + Re_BufSz = Re_BufSz + SIZE(InData%delta) ! delta + Re_BufSz = Re_BufSz + SIZE(InData%pZero) ! pZero + Re_BufSz = Re_BufSz + 1 ! Z_Depth + 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 i1 = LBOUND(InData%n,1), UBOUND(InData%n,1) + IntKiBuf(Int_Xferred) = InData%n(i1) + Int_Xferred = Int_Xferred + 1 + END DO + DO i1 = LBOUND(InData%delta,1), UBOUND(InData%delta,1) + ReKiBuf(Re_Xferred) = InData%delta(i1) + Re_Xferred = Re_Xferred + 1 + END DO + DO i1 = LBOUND(InData%pZero,1), UBOUND(InData%pZero,1) + ReKiBuf(Re_Xferred) = InData%pZero(i1) + Re_Xferred = Re_Xferred + 1 + END DO + ReKiBuf(Re_Xferred) = InData%Z_Depth + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE SeaState_Interp_PackInitInput + + SUBROUTINE SeaState_Interp_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(SeaState_Interp_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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_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 + i1_l = LBOUND(OutData%n,1) + i1_u = UBOUND(OutData%n,1) + DO i1 = LBOUND(OutData%n,1), UBOUND(OutData%n,1) + OutData%n(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + END DO + i1_l = LBOUND(OutData%delta,1) + i1_u = UBOUND(OutData%delta,1) + DO i1 = LBOUND(OutData%delta,1), UBOUND(OutData%delta,1) + OutData%delta(i1) = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END DO + i1_l = LBOUND(OutData%pZero,1) + i1_u = UBOUND(OutData%pZero,1) + DO i1 = LBOUND(OutData%pZero,1), UBOUND(OutData%pZero,1) + OutData%pZero(i1) = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END DO + OutData%Z_Depth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE SeaState_Interp_UnPackInitInput + + SUBROUTINE SeaState_Interp_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_Interp_InitOutputType), INTENT(IN) :: SrcInitOutputData + TYPE(SeaState_Interp_InitOutputType), INTENT(INOUT) :: DstInitOutputData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_CopyInitOutput' +! + ErrStat = ErrID_None + ErrMsg = "" + CALL NWTC_Library_Copyprogdesc( SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + END SUBROUTINE SeaState_Interp_CopyInitOutput + + SUBROUTINE SeaState_Interp_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) + TYPE(SeaState_Interp_InitOutputType), INTENT(INOUT) :: InitOutputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_DestroyInitOutput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL NWTC_Library_Destroyprogdesc( InitOutputData%Ver, ErrStat, ErrMsg ) + END SUBROUTINE SeaState_Interp_DestroyInitOutput + + SUBROUTINE SeaState_Interp_PackInitOutput( 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(SeaState_Interp_InitOutputType), 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 = 'SeaState_Interp_PackInitOutput' + ! 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 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Ver: size of buffers for each call to pack subtype + CALL NWTC_Library_Packprogdesc( Re_Buf, Db_Buf, Int_Buf, InData%Ver, ErrStat2, ErrMsg2, .TRUE. ) ! Ver + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Ver + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Ver + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Ver + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + 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 + + CALL NWTC_Library_Packprogdesc( Re_Buf, Db_Buf, Int_Buf, InData%Ver, ErrStat2, ErrMsg2, OnlySize ) ! Ver + 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 + END SUBROUTINE SeaState_Interp_PackInitOutput + + SUBROUTINE SeaState_Interp_UnPackInitOutput( 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(SeaState_Interp_InitOutputType), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_UnPackInitOutput' + ! 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 + 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_Unpackprogdesc( Re_Buf, Db_Buf, Int_Buf, OutData%Ver, ErrStat2, ErrMsg2 ) ! Ver + 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) + END SUBROUTINE SeaState_Interp_UnPackInitOutput + + SUBROUTINE SeaState_Interp_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_Interp_MiscVarType), INTENT(IN) :: SrcMiscData + TYPE(SeaState_Interp_MiscVarType), INTENT(INOUT) :: DstMiscData + 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_CopyMisc' +! + ErrStat = ErrID_None + ErrMsg = "" + DstMiscData%N3D = SrcMiscData%N3D + DstMiscData%N4D = SrcMiscData%N4D + DstMiscData%Indx_Lo = SrcMiscData%Indx_Lo + DstMiscData%Indx_Hi = SrcMiscData%Indx_Hi + END SUBROUTINE SeaState_Interp_CopyMisc + + SUBROUTINE SeaState_Interp_DestroyMisc( MiscData, ErrStat, ErrMsg ) + TYPE(SeaState_Interp_MiscVarType), INTENT(INOUT) :: MiscData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_DestroyMisc' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE SeaState_Interp_DestroyMisc + + SUBROUTINE SeaState_Interp_PackMisc( 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(SeaState_Interp_MiscVarType), 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 = 'SeaState_Interp_PackMisc' + ! 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 + Re_BufSz = Re_BufSz + SIZE(InData%N3D) ! N3D + Re_BufSz = Re_BufSz + SIZE(InData%N4D) ! N4D + Int_BufSz = Int_BufSz + SIZE(InData%Indx_Lo) ! Indx_Lo + Int_BufSz = Int_BufSz + SIZE(InData%Indx_Hi) ! Indx_Hi + 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 i1 = LBOUND(InData%N3D,1), UBOUND(InData%N3D,1) + ReKiBuf(Re_Xferred) = InData%N3D(i1) + Re_Xferred = Re_Xferred + 1 + END DO + DO i1 = LBOUND(InData%N4D,1), UBOUND(InData%N4D,1) + ReKiBuf(Re_Xferred) = InData%N4D(i1) + Re_Xferred = Re_Xferred + 1 + END DO + DO i1 = LBOUND(InData%Indx_Lo,1), UBOUND(InData%Indx_Lo,1) + IntKiBuf(Int_Xferred) = InData%Indx_Lo(i1) + Int_Xferred = Int_Xferred + 1 + END DO + DO i1 = LBOUND(InData%Indx_Hi,1), UBOUND(InData%Indx_Hi,1) + IntKiBuf(Int_Xferred) = InData%Indx_Hi(i1) + Int_Xferred = Int_Xferred + 1 + END DO + END SUBROUTINE SeaState_Interp_PackMisc + + SUBROUTINE SeaState_Interp_UnPackMisc( 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(SeaState_Interp_MiscVarType), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_UnPackMisc' + ! 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 + i1_l = LBOUND(OutData%N3D,1) + i1_u = UBOUND(OutData%N3D,1) + DO i1 = LBOUND(OutData%N3D,1), UBOUND(OutData%N3D,1) + OutData%N3D(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + i1_l = LBOUND(OutData%N4D,1) + i1_u = UBOUND(OutData%N4D,1) + DO i1 = LBOUND(OutData%N4D,1), UBOUND(OutData%N4D,1) + OutData%N4D(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + i1_l = LBOUND(OutData%Indx_Lo,1) + i1_u = UBOUND(OutData%Indx_Lo,1) + DO i1 = LBOUND(OutData%Indx_Lo,1), UBOUND(OutData%Indx_Lo,1) + OutData%Indx_Lo(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + END DO + i1_l = LBOUND(OutData%Indx_Hi,1) + i1_u = UBOUND(OutData%Indx_Hi,1) + DO i1 = LBOUND(OutData%Indx_Hi,1), UBOUND(OutData%Indx_Hi,1) + OutData%Indx_Hi(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + END DO + END SUBROUTINE SeaState_Interp_UnPackMisc + + SUBROUTINE SeaState_Interp_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_Interp_ParameterType), INTENT(IN) :: SrcParamData + TYPE(SeaState_Interp_ParameterType), INTENT(INOUT) :: DstParamData + 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_CopyParam' +! + ErrStat = ErrID_None + ErrMsg = "" + DstParamData%n = SrcParamData%n + DstParamData%delta = SrcParamData%delta + DstParamData%pZero = SrcParamData%pZero + DstParamData%Z_Depth = SrcParamData%Z_Depth + END SUBROUTINE SeaState_Interp_CopyParam + + SUBROUTINE SeaState_Interp_DestroyParam( ParamData, ErrStat, ErrMsg ) + TYPE(SeaState_Interp_ParameterType), INTENT(INOUT) :: ParamData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_DestroyParam' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE SeaState_Interp_DestroyParam + + SUBROUTINE SeaState_Interp_PackParam( 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(SeaState_Interp_ParameterType), 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 = 'SeaState_Interp_PackParam' + ! 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 + SIZE(InData%n) ! n + Re_BufSz = Re_BufSz + SIZE(InData%delta) ! delta + Re_BufSz = Re_BufSz + SIZE(InData%pZero) ! pZero + Re_BufSz = Re_BufSz + 1 ! Z_Depth + 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 i1 = LBOUND(InData%n,1), UBOUND(InData%n,1) + IntKiBuf(Int_Xferred) = InData%n(i1) + Int_Xferred = Int_Xferred + 1 + END DO + DO i1 = LBOUND(InData%delta,1), UBOUND(InData%delta,1) + ReKiBuf(Re_Xferred) = InData%delta(i1) + Re_Xferred = Re_Xferred + 1 + END DO + DO i1 = LBOUND(InData%pZero,1), UBOUND(InData%pZero,1) + ReKiBuf(Re_Xferred) = InData%pZero(i1) + Re_Xferred = Re_Xferred + 1 + END DO + ReKiBuf(Re_Xferred) = InData%Z_Depth + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE SeaState_Interp_PackParam + + SUBROUTINE SeaState_Interp_UnPackParam( 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(SeaState_Interp_ParameterType), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_UnPackParam' + ! 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 + i1_l = LBOUND(OutData%n,1) + i1_u = UBOUND(OutData%n,1) + DO i1 = LBOUND(OutData%n,1), UBOUND(OutData%n,1) + OutData%n(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + END DO + i1_l = LBOUND(OutData%delta,1) + i1_u = UBOUND(OutData%delta,1) + DO i1 = LBOUND(OutData%delta,1), UBOUND(OutData%delta,1) + OutData%delta(i1) = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END DO + i1_l = LBOUND(OutData%pZero,1) + i1_u = UBOUND(OutData%pZero,1) + DO i1 = LBOUND(OutData%pZero,1), UBOUND(OutData%pZero,1) + OutData%pZero(i1) = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END DO + OutData%Z_Depth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE SeaState_Interp_UnPackParam + +END MODULE SeaState_Interp_Types +!ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/SeaState_Output.f90 b/modules/seastate/src/SeaState_Output.f90 new file mode 100644 index 0000000000..0001c2c672 --- /dev/null +++ b/modules/seastate/src/SeaState_Output.f90 @@ -0,0 +1,1025 @@ +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2013-2015 National Renewable Energy Laboratory +! +! This file is part of SeaState. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** +MODULE SeaState_Output + + ! This MODULE stores variables used for output. + + USE NWTC_Library + USE SeaState_Types + USE Waves + IMPLICIT NONE + + PRIVATE + +! =================================================================================================== +! NOTE: The following lines of code were generated by a Matlab script called "Write_ChckOutLst.m" +! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these +! lines should be modified in the Matlab script and/or Excel worksheet as necessary. +! =================================================================================================== +! This code was generated by Write_ChckOutLst.m at 26-Jul-2021 14:11:49. + + + ! Parameters related to output length (number of characters allowed in the output data headers): + + INTEGER(IntKi), PARAMETER :: OutStrLenM1 = ChanLen - 1 + + + ! Indices for computing output channels: + ! NOTES: + ! (1) These parameters are in the order stored in "OutListParameters.xlsx" + ! (2) Array AllOuts() must be dimensioned to the value of the largest output parameter + + ! Time: + + INTEGER(IntKi), PARAMETER :: Time = 0 + + + ! Wave Elevations: + + INTEGER(IntKi), PARAMETER :: Wave1Elev = 1 + INTEGER(IntKi), PARAMETER :: Wave2Elev = 2 + INTEGER(IntKi), PARAMETER :: Wave3Elev = 3 + INTEGER(IntKi), PARAMETER :: Wave4Elev = 4 + INTEGER(IntKi), PARAMETER :: Wave5Elev = 5 + INTEGER(IntKi), PARAMETER :: Wave6Elev = 6 + INTEGER(IntKi), PARAMETER :: Wave7Elev = 7 + INTEGER(IntKi), PARAMETER :: Wave8Elev = 8 + INTEGER(IntKi), PARAMETER :: Wave9Elev = 9 + INTEGER(IntKi), PARAMETER :: Wave1Elv1 = 10 + INTEGER(IntKi), PARAMETER :: Wave2Elv1 = 11 + INTEGER(IntKi), PARAMETER :: Wave3Elv1 = 12 + INTEGER(IntKi), PARAMETER :: Wave4Elv1 = 13 + INTEGER(IntKi), PARAMETER :: Wave5Elv1 = 14 + INTEGER(IntKi), PARAMETER :: Wave6Elv1 = 15 + INTEGER(IntKi), PARAMETER :: Wave7Elv1 = 16 + INTEGER(IntKi), PARAMETER :: Wave8Elv1 = 17 + INTEGER(IntKi), PARAMETER :: Wave9Elv1 = 18 + INTEGER(IntKi), PARAMETER :: Wave1Elv2 = 19 + INTEGER(IntKi), PARAMETER :: Wave2Elv2 = 20 + INTEGER(IntKi), PARAMETER :: Wave3Elv2 = 21 + INTEGER(IntKi), PARAMETER :: Wave4Elv2 = 22 + INTEGER(IntKi), PARAMETER :: Wave5Elv2 = 23 + INTEGER(IntKi), PARAMETER :: Wave6Elv2 = 24 + INTEGER(IntKi), PARAMETER :: Wave7Elv2 = 25 + INTEGER(IntKi), PARAMETER :: Wave8Elv2 = 26 + INTEGER(IntKi), PARAMETER :: Wave9Elv2 = 27 + + + ! Wave Kinematics : + + INTEGER(IntKi), PARAMETER :: FVel1xi = 28 + INTEGER(IntKi), PARAMETER :: FVel2xi = 29 + INTEGER(IntKi), PARAMETER :: FVel3xi = 30 + INTEGER(IntKi), PARAMETER :: FVel4xi = 31 + INTEGER(IntKi), PARAMETER :: FVel5xi = 32 + INTEGER(IntKi), PARAMETER :: FVel6xi = 33 + INTEGER(IntKi), PARAMETER :: FVel7xi = 34 + INTEGER(IntKi), PARAMETER :: FVel8xi = 35 + INTEGER(IntKi), PARAMETER :: FVel9xi = 36 + INTEGER(IntKi), PARAMETER :: FVel1yi = 37 + INTEGER(IntKi), PARAMETER :: FVel2yi = 38 + INTEGER(IntKi), PARAMETER :: FVel3yi = 39 + INTEGER(IntKi), PARAMETER :: FVel4yi = 40 + INTEGER(IntKi), PARAMETER :: FVel5yi = 41 + INTEGER(IntKi), PARAMETER :: FVel6yi = 42 + INTEGER(IntKi), PARAMETER :: FVel7yi = 43 + INTEGER(IntKi), PARAMETER :: FVel8yi = 44 + INTEGER(IntKi), PARAMETER :: FVel9yi = 45 + INTEGER(IntKi), PARAMETER :: FVel1zi = 46 + INTEGER(IntKi), PARAMETER :: FVel2zi = 47 + INTEGER(IntKi), PARAMETER :: FVel3zi = 48 + INTEGER(IntKi), PARAMETER :: FVel4zi = 49 + INTEGER(IntKi), PARAMETER :: FVel5zi = 50 + INTEGER(IntKi), PARAMETER :: FVel6zi = 51 + INTEGER(IntKi), PARAMETER :: FVel7zi = 52 + INTEGER(IntKi), PARAMETER :: FVel8zi = 53 + INTEGER(IntKi), PARAMETER :: FVel9zi = 54 + INTEGER(IntKi), PARAMETER :: FAcc1xi = 55 + INTEGER(IntKi), PARAMETER :: FAcc2xi = 56 + INTEGER(IntKi), PARAMETER :: FAcc3xi = 57 + INTEGER(IntKi), PARAMETER :: FAcc4xi = 58 + INTEGER(IntKi), PARAMETER :: FAcc5xi = 59 + INTEGER(IntKi), PARAMETER :: FAcc6xi = 60 + INTEGER(IntKi), PARAMETER :: FAcc7xi = 61 + INTEGER(IntKi), PARAMETER :: FAcc8xi = 62 + INTEGER(IntKi), PARAMETER :: FAcc9xi = 63 + INTEGER(IntKi), PARAMETER :: FAcc1yi = 64 + INTEGER(IntKi), PARAMETER :: FAcc2yi = 65 + INTEGER(IntKi), PARAMETER :: FAcc3yi = 66 + INTEGER(IntKi), PARAMETER :: FAcc4yi = 67 + INTEGER(IntKi), PARAMETER :: FAcc5yi = 68 + INTEGER(IntKi), PARAMETER :: FAcc6yi = 69 + INTEGER(IntKi), PARAMETER :: FAcc7yi = 70 + INTEGER(IntKi), PARAMETER :: FAcc8yi = 71 + INTEGER(IntKi), PARAMETER :: FAcc9yi = 72 + INTEGER(IntKi), PARAMETER :: FAcc1zi = 73 + INTEGER(IntKi), PARAMETER :: FAcc2zi = 74 + INTEGER(IntKi), PARAMETER :: FAcc3zi = 75 + INTEGER(IntKi), PARAMETER :: FAcc4zi = 76 + INTEGER(IntKi), PARAMETER :: FAcc5zi = 77 + INTEGER(IntKi), PARAMETER :: FAcc6zi = 78 + INTEGER(IntKi), PARAMETER :: FAcc7zi = 79 + INTEGER(IntKi), PARAMETER :: FAcc8zi = 80 + INTEGER(IntKi), PARAMETER :: FAcc9zi = 81 + INTEGER(IntKi), PARAMETER :: FDynP1 = 82 + INTEGER(IntKi), PARAMETER :: FDynP2 = 83 + INTEGER(IntKi), PARAMETER :: FDynP3 = 84 + INTEGER(IntKi), PARAMETER :: FDynP4 = 85 + INTEGER(IntKi), PARAMETER :: FDynP5 = 86 + INTEGER(IntKi), PARAMETER :: FDynP6 = 87 + INTEGER(IntKi), PARAMETER :: FDynP7 = 88 + INTEGER(IntKi), PARAMETER :: FDynP8 = 89 + INTEGER(IntKi), PARAMETER :: FDynP9 = 90 + + + ! The maximum number of output channels which can be output by the code. + INTEGER(IntKi), PARAMETER :: MaxOutPts = 90 + +!End of code generated by Matlab script +! =================================================================================================== + + + REAL(ReKi) :: AllOuts(MaxSeaStOutputs) ! Array of all possible outputs + + + + INTEGER, PARAMETER :: WaveElevi(9) = (/Wave1Elev,Wave2Elev,Wave3Elev,Wave4Elev,Wave5Elev,Wave6Elev,Wave7Elev,Wave8Elev,Wave9Elev/) + INTEGER, PARAMETER :: WaveElevi1(9) = (/Wave1Elv1,Wave2Elv1,Wave3Elv1,Wave4Elv1,Wave5Elv1,Wave6Elv1,Wave7Elv1,Wave8Elv1,Wave9Elv1/) + INTEGER, PARAMETER :: WaveElevi2(9) = (/Wave1Elv2,Wave2Elv2,Wave3Elv2,Wave4Elv2,Wave5Elv2,Wave6Elv2,Wave7Elv2,Wave8Elv2,Wave9Elv2/) + + INTEGER, PARAMETER :: FVel(3,9) = reshape((/FVel1xi,FVel1yi,FVel1zi, & + FVel2xi,FVel2yi,FVel2zi, & + FVel3xi,FVel3yi,FVel3zi, & + FVel4xi,FVel4yi,FVel4zi, & + FVel5xi,FVel5yi,FVel5zi, & + FVel6xi,FVel6yi,FVel6zi, & + FVel7xi,FVel7yi,FVel7zi, & + FVel8xi,FVel8yi,FVel8zi, & + FVel9xi,FVel9yi,FVel9zi/), & + (/3,9/)) + INTEGER, PARAMETER :: FAcc(3,9) = reshape((/FAcc1xi,FAcc1yi,FAcc1zi, & + FAcc2xi,FAcc2yi,FAcc2zi, & + FAcc3xi,FAcc3yi,FAcc3zi, & + FAcc4xi,FAcc4yi,FAcc4zi, & + FAcc5xi,FAcc5yi,FAcc5zi, & + FAcc6xi,FAcc6yi,FAcc6zi, & + FAcc7xi,FAcc7yi,FAcc7zi, & + FAcc8xi,FAcc8yi,FAcc8zi, & + FAcc9xi,FAcc9yi,FAcc9zi/), & + (/3,9/)) + INTEGER, PARAMETER :: FDynP(9) = (/FDynP1,FDynP2,FDynP3,FDynP4,FDynP5,FDynP6,FDynP7,FDynP8,FDynP9/) + + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(90) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "FACC1XI ","FACC1YI ","FACC1ZI ","FACC2XI ","FACC2YI ","FACC2ZI ","FACC3XI ","FACC3YI ", & + "FACC3ZI ","FACC4XI ","FACC4YI ","FACC4ZI ","FACC5XI ","FACC5YI ","FACC5ZI ","FACC6XI ", & + "FACC6YI ","FACC6ZI ","FACC7XI ","FACC7YI ","FACC7ZI ","FACC8XI ","FACC8YI ","FACC8ZI ", & + "FACC9XI ","FACC9YI ","FACC9ZI ","FDYNP1 ","FDYNP2 ","FDYNP3 ","FDYNP4 ","FDYNP5 ", & + "FDYNP6 ","FDYNP7 ","FDYNP8 ","FDYNP9 ","FVEL1XI ","FVEL1YI ","FVEL1ZI ","FVEL2XI ", & + "FVEL2YI ","FVEL2ZI ","FVEL3XI ","FVEL3YI ","FVEL3ZI ","FVEL4XI ","FVEL4YI ","FVEL4ZI ", & + "FVEL5XI ","FVEL5YI ","FVEL5ZI ","FVEL6XI ","FVEL6YI ","FVEL6ZI ","FVEL7XI ","FVEL7YI ", & + "FVEL7ZI ","FVEL8XI ","FVEL8YI ","FVEL8ZI ","FVEL9XI ","FVEL9YI ","FVEL9ZI ","WAVE1ELEV", & + "WAVE1ELV1","WAVE1ELV2","WAVE2ELEV","WAVE2ELV1","WAVE2ELV2","WAVE3ELEV","WAVE3ELV1","WAVE3ELV2", & + "WAVE4ELEV","WAVE4ELV1","WAVE4ELV2","WAVE5ELEV","WAVE5ELV1","WAVE5ELV2","WAVE6ELEV","WAVE6ELV1", & + "WAVE6ELV2","WAVE7ELEV","WAVE7ELV1","WAVE7ELV2","WAVE8ELEV","WAVE8ELV1","WAVE8ELV2","WAVE9ELEV", & + "WAVE9ELV1","WAVE9ELV2"/) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(90) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + FAcc1xi , FAcc1yi , FAcc1zi , FAcc2xi , FAcc2yi , FAcc2zi , FAcc3xi , FAcc3yi , & + FAcc3zi , FAcc4xi , FAcc4yi , FAcc4zi , FAcc5xi , FAcc5yi , FAcc5zi , FAcc6xi , & + FAcc6yi , FAcc6zi , FAcc7xi , FAcc7yi , FAcc7zi , FAcc8xi , FAcc8yi , FAcc8zi , & + FAcc9xi , FAcc9yi , FAcc9zi , FDynP1 , FDynP2 , FDynP3 , FDynP4 , FDynP5 , & + FDynP6 , FDynP7 , FDynP8 , FDynP9 , FVel1xi , FVel1yi , FVel1zi , FVel2xi , & + FVel2yi , FVel2zi , FVel3xi , FVel3yi , FVel3zi , FVel4xi , FVel4yi , FVel4zi , & + FVel5xi , FVel5yi , FVel5zi , FVel6xi , FVel6yi , FVel6zi , FVel7xi , FVel7yi , & + FVel7zi , FVel8xi , FVel8yi , FVel8zi , FVel9xi , FVel9yi , FVel9zi , Wave1Elev , & + Wave1Elv1 , Wave1Elv2 , Wave2Elev , Wave2Elv1 , Wave2Elv2 , Wave3Elev , Wave3Elv1 , Wave3Elv2 , & + Wave4Elev , Wave4Elv1 , Wave4Elv2 , Wave5Elev , Wave5Elv1 , Wave5Elv2 , Wave6Elev , Wave6Elv1 , & + Wave6Elv2 , Wave7Elev , Wave7Elv1 , Wave7Elv2 , Wave8Elev , Wave8Elv1 , Wave8Elv2 , Wave9Elev , & + Wave9Elv1 , Wave9Elv2 /) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(90) = (/ & ! This lists the units corresponding to the allowed parameters + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(Pa) ","(Pa) ","(Pa) ","(Pa) ", & + "(Pa) ","(Pa) ","(Pa) ","(Pa) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & + "(m) ","(m) "/) + + + + ! ..... Public Subroutines ................................................................................................... + PUBLIC :: SeaStOut_CloseSum + PUBLIC :: SeaStOut_OpenSum + PUBLIC :: SeaStOut_MapOutputs + PUBLIC :: SeaStOut_WriteOutputs + PUBLIC :: SeaStOut_OpenOutput + PUBLIC :: SeaStOut_CloseOutput + PUBLIC :: SeaStOut_GetChannels + PUBLIC :: SeaStOut_Init + PUBLIC :: SeaStOut_WriteWvKinFiles + + CONTAINS + + + +!==================================================================================================== +SUBROUTINE SeaStOut_CloseSum( UnSum, ErrStat, ErrMsg ) + + + ! Passed variables + + INTEGER, INTENT( IN ) :: UnSum ! the unit number for the SeaState summary file + 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 + LOGICAL :: Err ! determines if an error exists + + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + + Err = .FALSE. + + ! Write any closing information in the summary file + + IF ( UnSum > 0 ) THEN + WRITE (UnSum,'(/,A/)', IOSTAT=ErrStat) 'This summary file was closed on '//CurDate()//' at '//CurTime()//'.' + IF (ErrStat /= 0) THEN + Err = .TRUE. + ErrMsg = 'Problem writing to summary file' + END IF + END IF + + ! Close the file + + CLOSE( UnSum, IOSTAT=ErrStat ) + IF (ErrStat /= 0) THEN + Err = .TRUE. + ErrMsg = 'Problem closing summary file' + END IF + + IF ( Err ) ErrStat = ErrID_Fatal + + +END SUBROUTINE SeaStOut_CloseSum + +!==================================================================================================== +SUBROUTINE SeaStOut_OpenSum( UnSum, SummaryName, SeaSt_Prog, ErrStat, ErrMsg ) + + + ! Passed variables + + INTEGER, INTENT( OUT ) :: UnSum ! the unit number for the SeaState summary file + CHARACTER(*), INTENT( IN ) :: SummaryName ! the name of the SeaState summary file + TYPE(ProgDesc), INTENT( IN ) :: SeaSt_Prog ! the name/version/date of the SeaState program + INTEGER, INTENT( OUT ) :: ErrStat ! returns a non-zero value when an error occurs + CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + + + CALL GetNewUnit( UnSum ) + + CALL OpenFOutFile ( UnSum, SummaryName, ErrStat, ErrMsg ) + IF (ErrStat >=AbortErrLev) RETURN + + + ! Write the summary file header + + WRITE (UnSum,'(/,A/)', IOSTAT=ErrStat) 'This summary file was generated by '//TRIM( SeaSt_Prog%Name )//& + ' '//TRIM( SeaSt_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' + +END SUBROUTINE SeaStOut_OpenSum + +!==================================================================================================== +SUBROUTINE SeaStOut_WriteWvKinFiles( Rootname, SeaSt_Prog, NStepWave, NNodes, NWaveElev, nodeInWater, WaveElev, WaveKinzi, & + WaveTime, WaveVel, WaveAcc, WaveDynP, ErrStat, ErrMsg ) +!TODO: Modifiy for writing grid instead of nodes + ! Passed variables + CHARACTER(*), INTENT( IN ) :: Rootname ! filename including full path, minus any file extension. + TYPE(ProgDesc), INTENT( IN ) :: SeaSt_Prog ! the name/version/date of the SeaState program + INTEGER, INTENT( IN ) :: NStepWave ! Number of time steps for the wave kinematics arrays + INTEGER, INTENT( IN ) :: NNodes ! Number of simulation nodes for the wave kinematics arrays + INTEGER, INTENT( IN ) :: NWaveElev ! Number of locations where wave elevations were requested + INTEGER, INTENT( IN ) :: nodeInWater(0:,: ) ! + REAL(SiKi), INTENT( IN ) :: WaveElev (0:,: ) ! Instantaneous wave elevations at requested locations + REAL(SiKi), INTENT( IN ) :: WaveKinzi(: ) ! The z-location of all the nodes + REAL(SiKi), INTENT( IN ) :: WaveTime (0: ) ! The time values for the wave kinematics (time) + REAL(SiKi), INTENT( IN ) :: WaveVel (0:,:,:) ! The wave velocities (time,node,component) + REAL(SiKi), INTENT( IN ) :: WaveAcc (0:,:,:) ! The wave accelerations (time,node,component) + REAL(SiKi), INTENT( IN ) :: WaveDynP(0:,:) ! The wave dynamic pressure (time,node) + 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 :: UnWv ! file unit for writing the various wave kinematics files + CHARACTER(1024) :: WvName ! complete filename for one of the output files + CHARACTER(5) :: extension(7) + INTEGER :: i, j, iFile + CHARACTER(64) :: Frmt, Sfrmt + CHARACTER(ChanLen) :: Delim + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + + extension = (/'.Vxi ','.Vyi ','.Vzi ','.Axi ','.Ayi ','.Azi ','.DynP'/) + Delim = '' + !Frmt = '('//TRIM(Int2LStr(NNodes))//'(:,A,ES11.4e2))' + Frmt = '(:,A,ES11.4e2)' + Sfrmt = '(:,A,A11)' + + + + DO iFile = 1,7 + + CALL GetNewUnit( UnWv ) + + WvName = Rootname // TRIM(extension(iFile)) + CALL OpenFOutFile ( UnWv, WvName, ErrStat, ErrMsg ) + IF (ErrStat >=AbortErrLev) RETURN + + + + ! Write the summary file header + ! WRITE (UnWv,'(/,A/)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( HD_Prog%Name )//& + WRITE (UnWv,'(A)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( SeaSt_Prog%Name )//& + ' '//TRIM( SeaSt_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' + + + DO i= 0,NStepWave-1 + DO j = 1, NNodes + IF ( nodeInWater(i,j) == 0 ) THEN + WRITE(UnWv,Sfrmt,ADVANCE='no') Delim, '##########' + ELSE + + SELECT CASE (iFile) + CASE (1) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (i,j,1) + CASE (2) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (i,j,2) + CASE (3) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (i,j,3) + CASE (4) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (i,j,1) + CASE (5) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (i,j,2) + CASE (6) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (i,j,3) + CASE (7) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveDynP(i,j ) + END SELECT + END IF + END DO + WRITE (UnWv,'()', IOSTAT=ErrStat) ! write the line return + END DO + + CLOSE( UnWv, IOSTAT=ErrStat ) + IF (ErrStat /= 0) THEN + ErrStat = ErrID_Fatal + ErrMsg = 'Problem closing wave kinematics file' + RETURN + END IF + END DO + + IF ( NWaveElev > 0 ) THEN + + CALL GetNewUnit( UnWv ) + + WvName = Rootname // '.Elev' + CALL OpenFOutFile ( UnWv, WvName, ErrStat, ErrMsg ) + IF (ErrStat >=AbortErrLev) RETURN + + + + ! Write the summary file header + WRITE (UnWv,'(A)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( SeaSt_Prog%Name )//& + ' '//TRIM( SeaSt_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' + + + DO i= 0,NStepWave-1 + + Frmt = '('//TRIM(Int2LStr(NWaveElev))//'(:,A,ES11.4e2))' + WRITE(UnWv,Frmt) ( Delim, WaveElev(i,j) , j=1,NWaveElev ) + + END DO + + CLOSE( UnWv, IOSTAT=ErrStat ) + IF (ErrStat /= 0) THEN + ErrStat = ErrID_Fatal + ErrMsg = 'Problem closing wave elevations file' + RETURN + END IF + + END IF + + +END SUBROUTINE SeaStOut_WriteWvKinFiles + +!==================================================================================================== +subroutine SeaStOut_MapOutputs( CurrentTime, p, NWaveElev, WaveElev, WaveElev1, WaveElev2, NWaveKin, WaveVel, WaveAcc, WaveDynP, AllOuts, ErrStat, ErrMsg ) +! This subroutine writes the data stored in the y variable to the correct indexed postions in WriteOutput +! This is called by SeaState_CalcOutput() at each time step. +!---------------------------------------------------------------------------------------------------- + REAL(DbKi), intent( in ) :: CurrentTime ! Current simulation time in seconds + TYPE(SeaState_ParameterType), intent( in ) :: p ! SeaState's parameter data + INTEGER, intent( in ) :: NWaveElev ! Number of wave elevation locations to output + REAL(ReKi), intent( in ) :: WaveElev(:) ! Instantaneous total elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(ReKi), intent( in ) :: WaveElev1(:) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(ReKi), intent( in ) :: WaveElev2(:) ! Instantaneous second order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + INTEGER, intent( in ) :: NWaveKin ! Number of wave elevation locations to output + REAL(ReKi), intent( in ) :: WaveVel(:,:) ! Instantaneous total elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(ReKi), intent( in ) :: WaveAcc(:,:) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(ReKi), intent( in ) :: WaveDynP(:) ! Instantaneous second order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(ReKi), intent( out ) :: AllOuts(MaxSeaStOutputs) + INTEGER(IntKi), intent( out ) :: ErrStat ! Error status of the operation + CHARACTER(*), intent( out ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + integer :: I, iBody, startIndx, endIndx + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + real(ReKi) :: rotdisp(3) + + ErrStat = ErrID_None + ErrMsg = "" + + ! Initialize all unused channels to zero (in case they don't get set, but are still requested) + AllOuts = 0.0_ReKi + + do I=1,NWaveElev + AllOuts(WaveElevi(I)) = WaveElev(I) + AllOuts(WaveElevi1(I))= WaveElev1(I) + AllOuts(WaveElevi2(I))= WaveElev2(I) + end do + + do I=1,NWaveKin + AllOuts(FVel(:,I)) = WaveVel(1:3,I) + AllOuts(FAcc(:,I))= WaveAcc(1:3,I) + AllOuts(FDynP(I))= WaveDynP(I) + end do + + +end subroutine SeaStOut_MapOutputs + +!==================================================================================================== +SUBROUTINE SeaStOut_WriteOutputs( Time, y, p, Decimate, ErrStat, ErrMsg ) +! This subroutine writes the data stored in WriteOutputs (and indexed in OutParam) to the file +! opened in SeaStOut_Init() +!---------------------------------------------------------------------------------------------------- + + ! Passed variables + REAL(DbKi), INTENT( IN ) :: Time + TYPE(SeaState_OutputType), INTENT( INOUT ) :: y ! SeaState's output data + TYPE(SeaState_ParameterType), INTENT( IN ) :: p ! SeaState parameter data + INTEGER, INTENT( INOUT ) :: Decimate ! Output decimatation counter + 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 ! Generic loop counter + CHARACTER(200) :: Frmt ! a string to hold a format statement + + + IF (p%UnOutFile < 0 ) RETURN + + ! Initialize ErrStat and determine if it makes any sense to write output +!TODO: We should not have this check here, once per timestep! This should be resolved during initialization. GJH 7/7/2014 + IF ( .NOT. ALLOCATED( p%OutParam ) ) THEN + ErrStat = ErrID_Warn + ErrMsg = ' Cannot write output to file because there are not a valid output list.' + RETURN + ELSE + ErrStat = ErrID_None + ErrMsg = '' + END IF + + + ! Write the output parameters to the file + + !Frmt = '(F8.3,'//TRIM(Int2LStr(p%WAMIT%NumOuts+p%Morison%NumOuts))//'(:,A,'//TRIM( p%OutFmt )//'))' + !Frmt = '('//TRIM( p%OutFmt )//','//TRIM(Int2LStr(p%NumOuts))//'(:,A,'//TRIM( p%OutFmt )//'))' + + !WRITE(p%UnOutFile,Frmt) Time, ( p%Delim, y%WAMIT%WriteOutput(I), I=1,p%WAMIT%NumOuts), ( p%Delim, y%Morison%WriteOutput(I), I=1,p%Morison%NumOuts) + + IF ((Decimate .EQ. p%OutDec) .OR. (Decimate .EQ. 0)) THEN + + Decimate = 1 !reset counter +!TODO: Fix formatting + Frmt = '(F10.4)' + + WRITE(p%UnOutFile,Frmt,ADVANCE='no') Time + + IF ( p%NumTotalOuts > 0 ) THEN + Frmt = '('//TRIM(Int2LStr(p%NumTotalOuts))//'(:,A,'//TRIM( p%OutFmt )//'))' + WRITE(p%UnOutFile,Frmt,ADVANCE='no') ( p%Delim, y%WriteOutput(I) , I=1,p%NumTotalOuts ) + END IF + + WRITE (p%UnOutFile,'()', IOSTAT=ErrStat) ! write the line return + + ELSE + Decimate = Decimate + 1 + ENDIF + + RETURN + +END SUBROUTINE SeaStOut_WriteOutputs + +!==================================================================================================== +SUBROUTINE SeaStOut_Init( SeaState_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. +!---------------------------------------------------------------------------------------------------- + + + + ! Passed variables + + TYPE(ProgDesc), INTENT( IN ) :: SeaState_ProgDesc ! + CHARACTER(1024), INTENT( IN ) :: OutRootName ! The name of the output file + TYPE(SeaState_InputFile ), INTENT( IN ) :: InputFileData ! data needed to initialize the output module + TYPE(SeaState_OutputType), INTENT( INOUT ) :: y ! This module's internal data + TYPE(SeaState_ParameterType), INTENT( INOUT ) :: p + TYPE(SeaState_MiscVarType), INTENT( INOUT ) :: m + TYPE(SeaState_InitOutputType), INTENT( INOUT ) :: InitOut + INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred + CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + ! Local variables + INTEGER :: I ! Generic loop counter + INTEGER :: J ! Generic loop counter +! INTEGER :: Indx ! Counts the current index into the WaveKinNd array +! CHARACTER(1024) :: OutFileName ! The name of the output file including the full path. +! CHARACTER(200) :: Frmt ! a string to hold a format statement + LOGICAL :: hasWaves2Outs ! Are there any WAMIT-related outputs + + + + + + !------------------------------------------------------------------------------------------------- + ! Initialize local variables + !------------------------------------------------------------------------------------------------- + + + ErrStat = ErrID_None + ErrMsg = "" + + ! Sanity check that we didn't have an issue during the programing of this module. The auto + ! generated outlist at the top of this file sets the MaxOutPts value, but HD does not use + ! that value, but rather has the maximum outputs hard coded in the HD registry file. This + ! next test will hopefully help the developer catch any issues. + if ( MaxOutPts /= MaxSeaStOutputs ) then + call SetErrStat(ErrID_Fatal, ' SeaState outputs: the number of outputs given by the Write_ChckOutList.m '// & + 'script using the xlsx file does not match the number of outputs given by the SeaState.txt registry '// & + 'file.', ErrStat, ErrMsg, 'SeaStOUT_Init') + return + endif + + + !------------------------------------------------------------------------------------------------- + ! Check that the variables in OutList are valid + !------------------------------------------------------------------------------------------------- + + + CALL SeaStOUT_ChkOutLst( InputFileData%OutList(1:p%NumOuts), y, p, ErrStat, ErrMsg ) + IF ( ErrStat /= 0 ) RETURN + + ! Aggregate the sub-module initialization outputs for the glue code + + p%NumTotalOuts = p%NumOuts + m%LastOutTime = 0.0_DbKi + m%Decimate = 0 + p%OutDec = 1 !TODO: Remove this once the parameter has been added to the HD input file GJH 7/8/2014 + + + ! Allocate the aggregate arrays + + ALLOCATE ( InitOut%WriteOutputHdr ( p%NumTotalOuts ) , STAT=ErrStat ) + IF ( ErrStat /= 0 ) THEN + ErrMsg = ' Error allocating memory for the WriteOutputHdr array.' + ErrStat = ErrID_Fatal + RETURN + END IF + + ALLOCATE ( InitOut%WriteOutputUnt ( p%NumTotalOuts ) , STAT=ErrStat ) + IF ( ErrStat /= 0 ) THEN + ErrMsg = ' Error allocating memory for the WriteOutputUnt array.' + ErrStat = ErrID_Fatal + RETURN + END IF + + ALLOCATE ( y%WriteOutput ( p%NumTotalOuts ) , STAT=ErrStat ) + IF ( ErrStat /= 0 ) THEN + ErrMsg = ' Error allocating memory for the WriteOutput array.' + ErrStat = ErrID_Fatal + RETURN + END IF + y%WriteOutput = 0.0_ReKi ! bjj added this only so the Intel Inspector wouldn't complain about uninitialized memory access (was harmless) + + + ! Initialize the HD-level Hdr and Unt elements + DO I = 1,p%NumOuts + + InitOut%WriteOutputHdr(I) = TRIM( p%OutParam(I)%Name ) + InitOut%WriteOutputUnt(I) = TRIM( p%OutParam(I)%Units ) + + END DO + + + J = p%NumOuts + 1 + + + IF ( p%OutSwtch == 1 .OR. p%OutSwtch == 3 ) THEN + CALL SeaStOut_OpenOutput( SeaState_ProgDesc, OutRootName, p, InitOut, ErrStat, ErrMsg ) + IF (ErrStat >= AbortErrLev ) RETURN + END IF + + + + RETURN + +END SUBROUTINE SeaStOUT_Init + +!==================================================================================================== +SUBROUTINE SeaStOut_OpenOutput( SeaState_ProgDesc, OutRootName, p, 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 +!---------------------------------------------------------------------------------------------------- + + + + ! Passed variables + + TYPE(ProgDesc) , INTENT( IN ) :: SeaState_ProgDesc + CHARACTER(1024), INTENT( IN ) :: OutRootName ! Root name for the output file + TYPE(SeaState_ParameterType), INTENT( INOUT ) :: p + TYPE(SeaState_InitOutPutType ),INTENT( IN ) :: InitOut ! + INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred + CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + ! Local variables + INTEGER :: I ! Generic loop counter +! INTEGER :: Indx ! Counts the current index into the WaveKinNd array + CHARACTER(1024) :: OutFileName ! The name of the output file including the full path. + CHARACTER(200) :: Frmt ! a string to hold a format statement + + !------------------------------------------------------------------------------------------------- + ! Initialize local variables + !------------------------------------------------------------------------------------------------- + ErrStat = ErrID_None + ErrMsg = "" + + + + !------------------------------------------------------------------------------------------------- + ! Open the output file, if necessary, and write the header + !------------------------------------------------------------------------------------------------- + p%UnOutFile = -1 + IF ( ALLOCATED( p%OutParam ) .AND. p%NumOuts > 0 ) THEN ! Output has been requested so let's open an output file + + ! Open the file for output + OutFileName = TRIM(OutRootName)//'.SeaSt.out' + CALL GetNewUnit( p%UnOutFile ) + + CALL OpenFOutFile ( p%UnOutFile, OutFileName, ErrStat, ErrMsg ) + IF (ErrStat >=AbortErrLev) RETURN + + + ! Write the output file header + + WRITE (p%UnOutFile,'(/,A/)', IOSTAT=ErrStat) 'These predictions were generated by '//TRIM(SeaState_ProgDesc%Name)//& + ' on '//CurDate()//' at '//CurTime()//'.' + + ! Write three empty lines + WRITE (p%UnOutFile,'()', IOSTAT=ErrStat) + WRITE (p%UnOutFile,'()', IOSTAT=ErrStat) + WRITE (p%UnOutFile,'()', IOSTAT=ErrStat) + + ! Write the names of the output parameters: + Frmt = '(A10)' + WRITE(p%UnOutFile,Frmt,ADVANCE='no') TRIM( 'Time' ) + + IF (ALLOCATED( p%OutParam ) .AND. p%NumOuts > 0) THEN + Frmt = '('//TRIM(Int2LStr(p%NumOuts))//'(:,A,'//TRIM( p%OutSFmt )//'))' + WRITE(p%UnOutFile,Frmt,ADVANCE='no') ( p%Delim, TRIM( InitOut%WriteOutputHdr(I) ), I=1,p%NumOuts ) + END IF + + WRITE (p%UnOutFile,'()', IOSTAT=ErrStat) ! write the line return + + + ! Write the units of the output parameters: + + + Frmt = '(A8)' + WRITE(p%UnOutFile,Frmt,ADVANCE='no') TRIM( '(sec)' ) + + IF (ALLOCATED( p%OutParam ) .AND. p%NumOuts > 0) THEN + Frmt = '('//TRIM(Int2LStr(p%NumOuts))//'(:,A,'//TRIM( p%OutSFmt )//'))' + WRITE(p%UnOutFile,Frmt,ADVANCE='no') ( p%Delim, TRIM( InitOut%WriteOutputUnt(I) ), I=1,p%NumOuts ) + END IF + + + WRITE (p%UnOutFile,'()', IOSTAT=ErrStat) ! write the line return + + + + + END IF ! there are any requested outputs + + RETURN + +END SUBROUTINE SeaStOut_OpenOutput + +!==================================================================================================== +FUNCTION SeaStOut_GetChannels ( NUserOutputs, UserOutputs, OutList, foundMask, ErrStat, ErrMsg ) +! This routine checks the names of inputted output channels, checks to see if they +! below to the list of available Morison channels. + +!---------------------------------------------------------------------------------------------------- + INTEGER, INTENT( IN ) :: NUserOutputs ! Number of user-specified output channels + CHARACTER(ChanLen), INTENT( IN ) :: UserOutputs (:) ! An array holding the names of the requested output channels. + CHARACTER(ChanLen), INTENT( OUT ) :: OutList (:) ! An array holding the names of the matched WAMIT output channels. + LOGICAL, INTENT( INOUT ) :: foundMask (:) ! A mask indicating whether a user requested channel belongs to a module's output channels. + INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred + CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + INTEGER SeaStOut_GetChannels ! The number of channels found in this module + + ! Local variables. + + INTEGER :: I ! Generic loop-counting index. + INTEGER :: count ! Generic loop-counting index. + INTEGER :: INDX ! Index for valid arrays + + CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I). + CHARACTER(28), PARAMETER :: OutPFmt = "( I4, 3X,A 10,1 X, A10 )" ! Output format parameter output list. + LOGICAL :: CheckOutListAgain + LOGICAL :: newFoundMask (NUserOutputs) ! A mask indicating whether a user requested channel belongs to a module's output channels. + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + SeaStOut_GetChannels = 0 + + newFoundMask = .FALSE. + + DO I = 1,NUserOutputs + IF (.NOT. foundMask(I) ) THEN + OutListTmp = UserOutputs(I) + + CheckOutListAgain = .FALSE. + + ! Reverse the sign (+/-) of the output channel if the user prefixed the + ! channel name with a '-', '_', 'm', or 'M' character indicating "minus". + + + + IF ( INDEX( '-_', OutListTmp(1:1) ) > 0 ) THEN + + OutListTmp = OutListTmp(2:) + ELSE IF ( INDEX( 'mM', OutListTmp(1:1) ) > 0 ) THEN ! We'll assume this is a variable name for now, (if not, we will check later if OutListTmp(2:) is also a variable name) + CheckOutListAgain = .TRUE. + + END IF + + CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case + + + Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) + + IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again + ! ex, 'MTipDxc1' causes the sign of TipDxc1 to be switched. + OutListTmp = OutListTmp(2:) + + Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) + END IF + + IF ( Indx > 0 ) THEN + newFoundMask(I) = .TRUE. + foundMask(I) = .TRUE. + SeaStOut_GetChannels = SeaStOut_GetChannels + 1 + + !ELSE + ! foundMask(I) = .FALSE. + END IF + END IF +END DO + +IF ( SeaStOut_GetChannels > 0 ) THEN + + count = 1 + + IF ( ErrStat /= 0 ) THEN + ErrMsg = ' Error allocating memory for the OutList array in the GetSeaStateChannels function.' + ErrStat = ErrID_Fatal + RETURN + END IF + + DO I = 1,NUserOutputs + IF ( newFoundMask(I) ) THEN + + OutList(count) = UserOutputs(I) + count = count + 1 + END IF + + END DO + +END IF + +END FUNCTION SeaStOut_GetChannels + +!==================================================================================================== +SUBROUTINE SeaStOut_ChkOutLst( OutList, y, p, ErrStat, ErrMsg ) +! This routine checks the names of inputted output channels, checks to see if any of them are ill- +! conditioned (returning an error if so), and assigns the OutputDataType settings (i.e, the index, +! name, and units of the output channels). +! Note that the SeaState module must be initialized prior to calling this function (if it +! is being used) so that it can correctly determine if the Lines outputs are valid. +!---------------------------------------------------------------------------------------------------- + + + + ! Passed variables + + TYPE(SeaState_OutputType), INTENT( INOUT ) :: y ! This module's internal data + TYPE(SeaState_ParameterType), INTENT( INOUT ) :: p ! parameter data for this instance of the HD module +! INTEGER, INTENT(IN ) :: NumMemberNodes(*) ! the number of nodes on each of the first 9 members + CHARACTER(ChanLen), INTENT( IN ) :: OutList (:) ! An array holding the names of the requested output channels. + INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred + CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + ! Local variables. + + INTEGER :: I ! Generic loop-counting index. +! INTEGER :: J ! Generic loop-counting index. + INTEGER :: INDX ! Index for valid arrays + + CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I). + CHARACTER(28), PARAMETER :: OutPFmt = "( I4, 3X,A 10,1 X, A10 )" ! Output format parameter output list. + LOGICAL :: InvalidOutput(MaxSeaStOutputs) ! This array determines if the output channel is valid for this configuration + LOGICAL :: CheckOutListAgain + + !------------------------------------------------------------------------------------------------- + ! Allocate and set index, name, and units for the output channels + ! If a selected output channel is not available in this module, set error flag. + !------------------------------------------------------------------------------------------------- + + ALLOCATE ( p%OutParam(0:p%NumOuts) , STAT=ErrStat ) + IF ( ErrStat /= 0_IntKi ) THEN + ErrStat = ErrID_Fatal + ErrMsg = "Error allocating memory for the SeaState OutParam array." + RETURN + ELSE + ErrStat = ErrID_None + ErrMsg = "" + ENDIF + + InvalidOutput = .FALSE. + + + ! Set index, name, and units for all of the output channels. + ! If a selected output channel is not available by this module set ErrStat = ErrID_Warn. + + DO I = 1,p%NumOuts + + p%OutParam(I)%Name = OutList(I) + OutListTmp = OutList(I) + + ! Reverse the sign (+/-) of the output channel if the user prefixed the + ! channel name with a "-", "_", "m", or "M" character indicating "minus". + + + CheckOutListAgain = .FALSE. + + IF ( INDEX( "-_", OutListTmp(1:1) ) > 0 ) THEN + p%OutParam(I)%SignM = -1 ! ex, "-TipDxc1" causes the sign of TipDxc1 to be switched. + OutListTmp = OutListTmp(2:) + ELSE IF ( INDEX( "mM", OutListTmp(1:1) ) > 0 ) THEN ! We'll assume this is a variable name for now, (if not, we will check later if OutListTmp(2:) is also a variable name) + CheckOutListAgain = .TRUE. + p%OutParam(I)%SignM = 1 + ELSE + p%OutParam(I)%SignM = 1 + END IF + + CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case + + + Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) + + + ! If it started with an "M" (CheckOutListAgain) we didn't find the value in our list (Indx < 1) + + IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again + p%OutParam(I)%SignM = -1 ! ex, "MTipDxc1" causes the sign of TipDxc1 to be switched. + OutListTmp = OutListTmp(2:) + + Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) + END IF + + + IF ( Indx > 0 ) THEN ! we found the channel name + p%OutParam(I)%Indx = ParamIndxAry(Indx) + IF ( InvalidOutput( ParamIndxAry(Indx) ) ) THEN ! but, it isn't valid for these settings + p%OutParam(I)%Units = "INVALID" + p%OutParam(I)%SignM = 0 + ELSE + p%OutParam(I)%Units = ParamUnitsAry(Indx) ! it's a valid output + END IF + ELSE ! this channel isn't valid + p%OutParam(I)%Indx = 1 ! pick any valid channel + p%OutParam(I)%Units = "INVALID" + p%OutParam(I)%SignM = 0 ! multiply all results by zero + + ErrStat = ErrID_Warn + ErrMsg = p%OutParam(I)%Name//" is not an available output channel. "//TRIM(ErrMsg) + END IF + + END DO + + RETURN + +END SUBROUTINE SeaStOut_ChkOutLst + + +!==================================================================================================== +SUBROUTINE SeaStOut_CloseOutput ( p, ErrStat, ErrMsg ) +! This function cleans up after running the SeaState output module. It closes the output file, +! releases memory, and resets the number of outputs requested to 0. +!---------------------------------------------------------------------------------------------------- + + ! Passed variables + + TYPE(SeaState_ParameterType), INTENT( INOUT ) :: p ! parameter data for this instance of the SeaState module + INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred + CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + +! ! Internal variables + LOGICAL :: Err + + + !------------------------------------------------------------------------------------------------- + ! Initialize error information + !------------------------------------------------------------------------------------------------- + + + ErrStat = ErrID_None + ErrMsg = "" + + Err = .FALSE. + + ! Write the summary file header + IF ( p%UnOutFile > -1 ) THEN + ! WRITE (p%UnOutFile,'(/,A/)', IOSTAT=ErrStat) 'This output file was closed on '//CurDate()//' at '//CurTime()//'.' + + !------------------------------------------------------------------------------------------------- + ! Close our output file + !------------------------------------------------------------------------------------------------- + CLOSE( p%UnOutFile, IOSTAT = ErrStat ) + IF ( ErrStat /= 0 ) Err = .TRUE. + + END IF + + !------------------------------------------------------------------------------------------------- + ! Make sure ErrStat is non-zero if an error occurred + !------------------------------------------------------------------------------------------------- + IF ( Err ) THEN + ErrStat = ErrID_Fatal + ErrMsg = ' Error closing SeaState output file.' + END IF + + RETURN + +END SUBROUTINE SeaStOut_CloseOutput +!==================================================================================================== + + +!==================================================================================================== +END MODULE SeaState_Output diff --git a/modules/seastate/src/SeaState_Types.f90 b/modules/seastate/src/SeaState_Types.f90 new file mode 100644 index 0000000000..60f0703b81 --- /dev/null +++ b/modules/seastate/src/SeaState_Types.f90 @@ -0,0 +1,5303 @@ +!STARTOFREGISTRYGENERATEDFILE 'SeaState_Types.f90' +! +! WARNING This file is generated automatically by the FAST registry. +! Do not edit. Your changes to this file will be lost. +! +! FAST Registry +!********************************************************************************************************************************* +! SeaState_Types +!................................................................................................................................. +! This file is part of SeaState. +! +! Copyright (C) 2012-2016 National Renewable Energy Laboratory +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +! +! W A R N I N G : This file was automatically generated from the FAST registry. Changes made to this file may be lost. +! +!********************************************************************************************************************************* +!> This module contains the user-defined types needed in SeaState. It also contains copy, destroy, pack, and +!! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. +MODULE SeaState_Types +!--------------------------------------------------------------------------------------------------------------------------------- +USE Current_Types +USE Waves_Types +USE Waves2_Types +USE SeaState_Interp_Types +USE NWTC_Library +IMPLICIT NONE + INTEGER(IntKi), PUBLIC, PARAMETER :: MaxSeaStOutputs = 90 ! The maximum number of output channels supported by this module [-] +! ========= SeaState_InputFile ======= + TYPE, PUBLIC :: SeaState_InputFile + LOGICAL :: EchoFlag !< Echo the input file [-] + REAL(ReKi) :: MSL2SWL !< Mean Sea Level to Still Water Level offset [m] + REAL(ReKi) :: X_HalfWidth !< Half-width of the domain in the X direction [m] + REAL(ReKi) :: Y_HalfWidth !< Half-width of the domain in the Y direction [m] + REAL(ReKi) :: Z_Depth !< Depth of the domain the Z direction [m] + INTEGER(IntKi) :: NX !< Number of nodes in half of the X-direction domain [-] + INTEGER(IntKi) :: NY !< Number of nodes in half of the Y-direction domain [-] + INTEGER(IntKi) :: NZ !< Number of nodes in half of the Z-direction domain [-] + TYPE(Waves_InitInputType) :: Waves !< Initialization data for Waves module [-] + TYPE(Waves2_InitInputType) :: Waves2 !< Initialization data for Waves2 module [-] + TYPE(Current_InitInputType) :: Current !< Initialization data for Current module [-] + LOGICAL :: Echo !< Echo the input files to a file with the same name as the input but with a .echo extension [T/F] [-] + INTEGER(IntKi) :: NWaveElev !< Number of points where the incident wave elevations can be output [-] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevxi !< xi-coordinates for points where the incident wave elevations can be output [(meters)] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevyi !< yi-coordinates for points where the incident wave elevations can be output [(meters)] + INTEGER(IntKi) :: NWaveKin !< Number of points where the incident wave kinematics will be computed [-] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinxi !< xi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level [(meters)] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinyi !< yi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level [(meters)] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinzi !< zi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level [(meters)] + INTEGER(IntKi) :: NUserOutputs !< Number of SeaState-level requested output channels [-] + CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: UserOutputs !< This should really be dimensioned with MaxOutPts [-] + INTEGER(IntKi) :: OutSwtch !< Output requested channels to: [1=SeaState.out 2=GlueCode.out 3=both files] [-] + LOGICAL :: OutAll !< Output all user-specified member and joint loads (only at each member end, not interior locations) [T/F] [-] + INTEGER(IntKi) :: NumOuts !< The number of outputs for this module as requested in the input file [-] + CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: OutList !< The user-requested output channel labels for this modules. This should really be dimensioned with MaxOutPts [-] + LOGICAL :: SeaStSum !< Generate a SeaState summary file [T/F] [-] + INTEGER(IntKi) :: UnSum !< File unit for the SeaState summary file [-1 = no summary file] [-] + CHARACTER(20) :: OutFmt !< Output format for numerical results [-] + CHARACTER(20) :: OutSFmt !< Output format for header strings [-] + END TYPE SeaState_InputFile +! ======================= +! ========= SeaState_InitInputType ======= + TYPE, PUBLIC :: SeaState_InitInputType + CHARACTER(1024) :: InputFile !< Supplied by Driver: full path and filename for the SeaState 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 [-] + 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)] + 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 SeaState_InitInputType +! ======================= +! ========= SeaState_InitOutputType ======= + TYPE, PUBLIC :: SeaState_InitOutputType + TYPE(Waves2_InitOutputType) :: Waves2 !< Initialization output from the Waves2 module [-] + CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< The is the list of all HD-related output channel header strings (includes all sub-module channels) [-] + CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< The is the list of all HD-related output channel unit strings (includes all sub-module channels) [-] + REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevSeries !< Wave elevation time-series at each of the points given by WaveElevXY. First dimension is the timestep. Second dimension is XY point number corresponding to second dimension of WaveElevXY. [(m)] + TYPE(ProgDesc) :: Ver !< Version of SeaState [-] + REAL(ReKi) :: WtrDens !< Water density, this is necessary to inform glue-code what the module is using for WtrDens (may not be the glue-code's default) [(kg/m^3)] + REAL(ReKi) :: WtrDpth !< Water depth, this is necessary to inform glue-code what the module is using for WtrDpth (may not be the glue-code's default) [(m)] + REAL(ReKi) :: MSL2SWL !< Offset between still-water level and mean sea level, this is necessary to inform glue-code what the module is using for MSL2SWL (may not be the glue-code's default) [(m)] + END TYPE SeaState_InitOutputType +! ======================= +! ========= SeaState_ContinuousStateType ======= + TYPE, PUBLIC :: SeaState_ContinuousStateType + TYPE(Waves2_ContinuousStateType) :: Waves2 !< continuous states from the waves2 module [-] + END TYPE SeaState_ContinuousStateType +! ======================= +! ========= SeaState_DiscreteStateType ======= + TYPE, PUBLIC :: SeaState_DiscreteStateType + TYPE(Waves2_DiscreteStateType) :: Waves2 !< discrete states from the waves2 module [-] + END TYPE SeaState_DiscreteStateType +! ======================= +! ========= SeaState_ConstraintStateType ======= + TYPE, PUBLIC :: SeaState_ConstraintStateType + TYPE(Waves2_ConstraintStateType) :: Waves2 !< constraint states from the waves2 module [-] + END TYPE SeaState_ConstraintStateType +! ======================= +! ========= SeaState_OtherStateType ======= + TYPE, PUBLIC :: SeaState_OtherStateType + TYPE(Waves2_OtherStateType) :: Waves2 !< OtherState information from the Waves2 module [-] + END TYPE SeaState_OtherStateType +! ======================= +! ========= SeaState_MiscVarType ======= + TYPE, PUBLIC :: SeaState_MiscVarType + INTEGER(IntKi) :: Decimate !< The output decimation counter [-] + REAL(DbKi) :: LastOutTime !< Last time step which was written to the output file (sec) [-] + INTEGER(IntKi) :: LastIndWave !< The last index used in the wave kinematics arrays, used to optimize interpolation [-] + TYPE(SeaState_Interp_MiscVarType) :: Sea_Interp_m !< misc var information from the SeaState Interpolation module [-] + TYPE(Waves2_MiscVarType) :: Waves2 !< misc var information from the Waves2 module [-] + TYPE(Waves2_InputType) :: u_Waves2 !< Waves2 module inputs [-] + END TYPE SeaState_MiscVarType +! ======================= +! ========= SeaState_ParameterType ======= + TYPE, PUBLIC :: SeaState_ParameterType + TYPE(Waves2_ParameterType) :: Waves2 !< Parameter data for the Waves2 module [-] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Array of time samples, (sec) [-] + REAL(DbKi) :: WaveDT !< Wave DT [sec] + INTEGER(IntKi) :: NGridPts !< Number of data points in the wave kinematics grid [-] + INTEGER(IntKi) , DIMENSION(1:3) :: NGrid !< Number of grid entries in x, y, and z [-] + REAL(ReKi) , DIMENSION(1:3) :: deltaGrid !< delta between grid points in x, y, and theta (for z) [m,m,rad] + INTEGER(IntKi) :: NStepWave !< Number of data points in the wave kinematics arrays [-] + INTEGER(IntKi) :: NWaveElev !< Number of wave elevation outputs [-] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevxi !< xi-coordinates for points where the incident wave elevations can be output [(meters)] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevyi !< yi-coordinates for points where the incident wave elevations can be output [(meters)] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev => NULL() !< Total wave elevation [-] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [-] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev2 => NULL() !< Second order wave elevation [-] + REAL(SiKi) , DIMENSION(:,:,:,:), POINTER :: WaveDynP => NULL() !< Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed [(N/m^2)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveAcc => NULL() !< Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed [(m/s^2)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveVel => NULL() !< Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.) [(m/s)] + INTEGER(IntKi) :: NWaveKin !< Number of points where the incident wave kinematics can be output [-] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinxi !< xi-coordinates for points where the incident wave kinematics can be output; these are relative to the mean sea level [(meters)] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinyi !< yi-coordinates for points where the incident wave kinematics can be output; these are relative to the mean sea level [(meters)] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinzi !< zi-coordinates for points where the incident wave kinematics can be output; these are relative to the mean sea level [(meters)] + REAL(ReKi) :: WtrDpth !< Water depth [(m)] + REAL(DbKi) :: DT !< Time step in seconds for integration of continuous states (if a fixed-step integrator is used) and update of discrete states [-] + TYPE(OutParmType) , DIMENSION(:), ALLOCATABLE :: OutParam !< [-] + INTEGER(IntKi) :: NumOuts !< Number of SeaState module-level outputs (not the total number including sub-modules [-] + INTEGER(IntKi) :: NumTotalOuts !< Number of all requested outputs including sub-modules [-] + INTEGER(IntKi) :: OutSwtch !< Output requested channels to: [1=SeaState.out 2=GlueCode.out 3=both files] [-] + CHARACTER(20) :: OutFmt !< Output format for numerical results [-] + CHARACTER(20) :: OutSFmt !< Output format for header strings [-] + CHARACTER(ChanLen) :: Delim !< Delimiter string for outputs, defaults to tab-delimiters [-] + INTEGER(IntKi) :: UnOutFile !< File unit for the SeaState outputs [-] + INTEGER(IntKi) :: OutDec !< Write every OutDec time steps [-] + TYPE(SeaState_Interp_ParameterType) :: Sea_Interp_p !< parameter information from the SeaState Interpolation module [-] + END TYPE SeaState_ParameterType +! ======================= +! ========= SeaState_InputType ======= + TYPE, PUBLIC :: SeaState_InputType + REAL(SiKi) :: DummyInput !< Remove this variable if you have discrete states [-] + END TYPE SeaState_InputType +! ======================= +! ========= SeaState_OutputType ======= + TYPE, PUBLIC :: SeaState_OutputType + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Outputs to be written to the output file(s) [-] + TYPE(Waves2_OutputType) :: Waves2 !< Waves2 module outputs [-] + END TYPE SeaState_OutputType +! ======================= +CONTAINS + SUBROUTINE SeaState_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_InputFile), INTENT(IN) :: SrcInputFileData + TYPE(SeaState_InputFile), INTENT(INOUT) :: DstInputFileData + 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyInputFile' +! + ErrStat = ErrID_None + ErrMsg = "" + DstInputFileData%EchoFlag = SrcInputFileData%EchoFlag + DstInputFileData%MSL2SWL = SrcInputFileData%MSL2SWL + DstInputFileData%X_HalfWidth = SrcInputFileData%X_HalfWidth + DstInputFileData%Y_HalfWidth = SrcInputFileData%Y_HalfWidth + DstInputFileData%Z_Depth = SrcInputFileData%Z_Depth + DstInputFileData%NX = SrcInputFileData%NX + DstInputFileData%NY = SrcInputFileData%NY + DstInputFileData%NZ = SrcInputFileData%NZ + CALL Waves_CopyInitInput( SrcInputFileData%Waves, DstInputFileData%Waves, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL Waves2_CopyInitInput( SrcInputFileData%Waves2, DstInputFileData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL Current_CopyInitInput( SrcInputFileData%Current, DstInputFileData%Current, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + DstInputFileData%Echo = SrcInputFileData%Echo + DstInputFileData%NWaveElev = SrcInputFileData%NWaveElev +IF (ALLOCATED(SrcInputFileData%WaveElevxi)) THEN + i1_l = LBOUND(SrcInputFileData%WaveElevxi,1) + i1_u = UBOUND(SrcInputFileData%WaveElevxi,1) + IF (.NOT. ALLOCATED(DstInputFileData%WaveElevxi)) THEN + ALLOCATE(DstInputFileData%WaveElevxi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%WaveElevxi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%WaveElevxi = SrcInputFileData%WaveElevxi +ENDIF +IF (ALLOCATED(SrcInputFileData%WaveElevyi)) THEN + i1_l = LBOUND(SrcInputFileData%WaveElevyi,1) + i1_u = UBOUND(SrcInputFileData%WaveElevyi,1) + IF (.NOT. ALLOCATED(DstInputFileData%WaveElevyi)) THEN + ALLOCATE(DstInputFileData%WaveElevyi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%WaveElevyi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%WaveElevyi = SrcInputFileData%WaveElevyi +ENDIF + DstInputFileData%NWaveKin = SrcInputFileData%NWaveKin +IF (ALLOCATED(SrcInputFileData%WaveKinxi)) THEN + i1_l = LBOUND(SrcInputFileData%WaveKinxi,1) + i1_u = UBOUND(SrcInputFileData%WaveKinxi,1) + IF (.NOT. ALLOCATED(DstInputFileData%WaveKinxi)) THEN + ALLOCATE(DstInputFileData%WaveKinxi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%WaveKinxi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%WaveKinxi = SrcInputFileData%WaveKinxi +ENDIF +IF (ALLOCATED(SrcInputFileData%WaveKinyi)) THEN + i1_l = LBOUND(SrcInputFileData%WaveKinyi,1) + i1_u = UBOUND(SrcInputFileData%WaveKinyi,1) + IF (.NOT. ALLOCATED(DstInputFileData%WaveKinyi)) THEN + ALLOCATE(DstInputFileData%WaveKinyi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%WaveKinyi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%WaveKinyi = SrcInputFileData%WaveKinyi +ENDIF +IF (ALLOCATED(SrcInputFileData%WaveKinzi)) THEN + i1_l = LBOUND(SrcInputFileData%WaveKinzi,1) + i1_u = UBOUND(SrcInputFileData%WaveKinzi,1) + IF (.NOT. ALLOCATED(DstInputFileData%WaveKinzi)) THEN + ALLOCATE(DstInputFileData%WaveKinzi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%WaveKinzi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%WaveKinzi = SrcInputFileData%WaveKinzi +ENDIF + 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 DstInputFileData%UserOutputs.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%UserOutputs = SrcInputFileData%UserOutputs +ENDIF + 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 DstInputFileData%OutList.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%OutList = SrcInputFileData%OutList +ENDIF + DstInputFileData%SeaStSum = SrcInputFileData%SeaStSum + DstInputFileData%UnSum = SrcInputFileData%UnSum + DstInputFileData%OutFmt = SrcInputFileData%OutFmt + DstInputFileData%OutSFmt = SrcInputFileData%OutSFmt + END SUBROUTINE SeaState_CopyInputFile + + SUBROUTINE SeaState_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) + TYPE(SeaState_InputFile), INTENT(INOUT) :: InputFileData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyInputFile' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves_DestroyInitInput( InputFileData%Waves, ErrStat, ErrMsg ) + CALL Waves2_DestroyInitInput( InputFileData%Waves2, ErrStat, ErrMsg ) + CALL Current_DestroyInitInput( InputFileData%Current, ErrStat, ErrMsg ) +IF (ALLOCATED(InputFileData%WaveElevxi)) THEN + DEALLOCATE(InputFileData%WaveElevxi) +ENDIF +IF (ALLOCATED(InputFileData%WaveElevyi)) THEN + DEALLOCATE(InputFileData%WaveElevyi) +ENDIF +IF (ALLOCATED(InputFileData%WaveKinxi)) THEN + DEALLOCATE(InputFileData%WaveKinxi) +ENDIF +IF (ALLOCATED(InputFileData%WaveKinyi)) THEN + DEALLOCATE(InputFileData%WaveKinyi) +ENDIF +IF (ALLOCATED(InputFileData%WaveKinzi)) THEN + DEALLOCATE(InputFileData%WaveKinzi) +ENDIF +IF (ALLOCATED(InputFileData%UserOutputs)) THEN + DEALLOCATE(InputFileData%UserOutputs) +ENDIF +IF (ALLOCATED(InputFileData%OutList)) THEN + DEALLOCATE(InputFileData%OutList) +ENDIF + END SUBROUTINE SeaState_DestroyInputFile + + SUBROUTINE SeaState_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(SeaState_InputFile), 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 = 'SeaState_PackInputFile' + ! 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 ! EchoFlag + Re_BufSz = Re_BufSz + 1 ! MSL2SWL + Re_BufSz = Re_BufSz + 1 ! X_HalfWidth + Re_BufSz = Re_BufSz + 1 ! Y_HalfWidth + Re_BufSz = Re_BufSz + 1 ! Z_Depth + Int_BufSz = Int_BufSz + 1 ! NX + Int_BufSz = Int_BufSz + 1 ! NY + Int_BufSz = Int_BufSz + 1 ! NZ + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Waves: size of buffers for each call to pack subtype + CALL Waves_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Waves, ErrStat2, ErrMsg2, .TRUE. ) ! Waves + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Waves + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Waves + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Waves + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype + CALL Waves2_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Waves2 + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Waves2 + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Waves2 + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! Current: size of buffers for each call to pack subtype + CALL Current_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Current, ErrStat2, ErrMsg2, .TRUE. ) ! Current + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Current + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Current + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Current + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 1 ! Echo + Int_BufSz = Int_BufSz + 1 ! NWaveElev + Int_BufSz = Int_BufSz + 1 ! WaveElevxi allocated yes/no + IF ( ALLOCATED(InData%WaveElevxi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveElevxi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevxi) ! WaveElevxi + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElevyi allocated yes/no + IF ( ALLOCATED(InData%WaveElevyi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveElevyi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevyi) ! WaveElevyi + END IF + Int_BufSz = Int_BufSz + 1 ! NWaveKin + Int_BufSz = Int_BufSz + 1 ! WaveKinxi allocated yes/no + IF ( ALLOCATED(InData%WaveKinxi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveKinxi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveKinxi) ! WaveKinxi + END IF + Int_BufSz = Int_BufSz + 1 ! WaveKinyi allocated yes/no + IF ( ALLOCATED(InData%WaveKinyi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveKinyi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveKinyi) ! WaveKinyi + END IF + Int_BufSz = Int_BufSz + 1 ! WaveKinzi allocated yes/no + IF ( ALLOCATED(InData%WaveKinzi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveKinzi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveKinzi) ! WaveKinzi + END IF + Int_BufSz = Int_BufSz + 1 ! NUserOutputs + Int_BufSz = Int_BufSz + 1 ! UserOutputs allocated yes/no + IF ( ALLOCATED(InData%UserOutputs) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! UserOutputs upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%UserOutputs)*LEN(InData%UserOutputs) ! UserOutputs + END IF + Int_BufSz = Int_BufSz + 1 ! OutSwtch + Int_BufSz = Int_BufSz + 1 ! OutAll + Int_BufSz = Int_BufSz + 1 ! NumOuts + Int_BufSz = Int_BufSz + 1 ! OutList allocated yes/no + IF ( ALLOCATED(InData%OutList) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! OutList upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%OutList)*LEN(InData%OutList) ! OutList + END IF + Int_BufSz = Int_BufSz + 1 ! SeaStSum + Int_BufSz = Int_BufSz + 1 ! UnSum + Int_BufSz = Int_BufSz + 1*LEN(InData%OutFmt) ! OutFmt + Int_BufSz = Int_BufSz + 1*LEN(InData%OutSFmt) ! OutSFmt + 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 + + IntKiBuf(Int_Xferred) = TRANSFER(InData%EchoFlag, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%MSL2SWL + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%X_HalfWidth + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%Y_HalfWidth + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%Z_Depth + Re_Xferred = Re_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NX + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NY + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NZ + Int_Xferred = Int_Xferred + 1 + CALL Waves_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Waves, ErrStat2, ErrMsg2, OnlySize ) ! Waves + 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 + CALL Waves2_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + 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 + CALL Current_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Current, ErrStat2, ErrMsg2, OnlySize ) ! Current + 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 + IntKiBuf(Int_Xferred) = TRANSFER(InData%Echo, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NWaveElev + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%WaveElevxi) ) 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%WaveElevxi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevxi,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveElevxi,1), UBOUND(InData%WaveElevxi,1) + ReKiBuf(Re_Xferred) = InData%WaveElevxi(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveElevyi) ) 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%WaveElevyi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevyi,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveElevyi,1), UBOUND(InData%WaveElevyi,1) + ReKiBuf(Re_Xferred) = InData%WaveElevyi(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IntKiBuf(Int_Xferred) = InData%NWaveKin + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%WaveKinxi) ) 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%WaveKinxi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveKinxi,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveKinxi,1), UBOUND(InData%WaveKinxi,1) + ReKiBuf(Re_Xferred) = InData%WaveKinxi(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveKinyi) ) 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%WaveKinyi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveKinyi,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveKinyi,1), UBOUND(InData%WaveKinyi,1) + ReKiBuf(Re_Xferred) = InData%WaveKinyi(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveKinzi) ) 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%WaveKinzi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveKinzi,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveKinzi,1), UBOUND(InData%WaveKinzi,1) + ReKiBuf(Re_Xferred) = InData%WaveKinzi(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IntKiBuf(Int_Xferred) = InData%NUserOutputs + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%UserOutputs) ) 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%UserOutputs,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%UserOutputs,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%UserOutputs,1), UBOUND(InData%UserOutputs,1) + DO I = 1, LEN(InData%UserOutputs) + IntKiBuf(Int_Xferred) = ICHAR(InData%UserOutputs(i1)(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO + END IF + IntKiBuf(Int_Xferred) = InData%OutSwtch + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = TRANSFER(InData%OutAll, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NumOuts + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%OutList) ) 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%OutList,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%OutList,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%OutList,1), UBOUND(InData%OutList,1) + DO I = 1, LEN(InData%OutList) + IntKiBuf(Int_Xferred) = ICHAR(InData%OutList(i1)(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO + END IF + IntKiBuf(Int_Xferred) = TRANSFER(InData%SeaStSum, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%UnSum + Int_Xferred = Int_Xferred + 1 + DO I = 1, LEN(InData%OutFmt) + IntKiBuf(Int_Xferred) = ICHAR(InData%OutFmt(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(InData%OutSFmt) + IntKiBuf(Int_Xferred) = ICHAR(InData%OutSFmt(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END SUBROUTINE SeaState_PackInputFile + + SUBROUTINE SeaState_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(SeaState_InputFile), 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackInputFile' + ! 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 + OutData%EchoFlag = TRANSFER(IntKiBuf(Int_Xferred), OutData%EchoFlag) + Int_Xferred = Int_Xferred + 1 + OutData%MSL2SWL = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%X_HalfWidth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%Y_HalfWidth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%Z_Depth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%NX = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%NY = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%NZ = IntKiBuf(Int_Xferred) + 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 Waves_UnpackInitInput( Re_Buf, Db_Buf, Int_Buf, OutData%Waves, ErrStat2, ErrMsg2 ) ! Waves + 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) + 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 Waves2_UnpackInitInput( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 + 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) + 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 Current_UnpackInitInput( Re_Buf, Db_Buf, Int_Buf, OutData%Current, ErrStat2, ErrMsg2 ) ! Current + 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) + OutData%Echo = TRANSFER(IntKiBuf(Int_Xferred), OutData%Echo) + Int_Xferred = Int_Xferred + 1 + OutData%NWaveElev = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevxi 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 + IF (ALLOCATED(OutData%WaveElevxi)) DEALLOCATE(OutData%WaveElevxi) + ALLOCATE(OutData%WaveElevxi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevxi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveElevxi,1), UBOUND(OutData%WaveElevxi,1) + OutData%WaveElevxi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevyi 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 + IF (ALLOCATED(OutData%WaveElevyi)) DEALLOCATE(OutData%WaveElevyi) + ALLOCATE(OutData%WaveElevyi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevyi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveElevyi,1), UBOUND(OutData%WaveElevyi,1) + OutData%WaveElevyi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + OutData%NWaveKin = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveKinxi 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 + IF (ALLOCATED(OutData%WaveKinxi)) DEALLOCATE(OutData%WaveKinxi) + ALLOCATE(OutData%WaveKinxi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveKinxi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveKinxi,1), UBOUND(OutData%WaveKinxi,1) + OutData%WaveKinxi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveKinyi 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 + IF (ALLOCATED(OutData%WaveKinyi)) DEALLOCATE(OutData%WaveKinyi) + ALLOCATE(OutData%WaveKinyi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveKinyi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveKinyi,1), UBOUND(OutData%WaveKinyi,1) + OutData%WaveKinyi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveKinzi 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 + IF (ALLOCATED(OutData%WaveKinzi)) DEALLOCATE(OutData%WaveKinzi) + ALLOCATE(OutData%WaveKinzi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveKinzi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveKinzi,1), UBOUND(OutData%WaveKinzi,1) + OutData%WaveKinzi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + OutData%NUserOutputs = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! UserOutputs 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 + IF (ALLOCATED(OutData%UserOutputs)) DEALLOCATE(OutData%UserOutputs) + ALLOCATE(OutData%UserOutputs(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%UserOutputs.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%UserOutputs,1), UBOUND(OutData%UserOutputs,1) + DO I = 1, LEN(OutData%UserOutputs) + OutData%UserOutputs(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO + END IF + OutData%OutSwtch = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%OutAll = TRANSFER(IntKiBuf(Int_Xferred), OutData%OutAll) + Int_Xferred = Int_Xferred + 1 + OutData%NumOuts = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! OutList 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 + IF (ALLOCATED(OutData%OutList)) DEALLOCATE(OutData%OutList) + ALLOCATE(OutData%OutList(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutList.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%OutList,1), UBOUND(OutData%OutList,1) + DO I = 1, LEN(OutData%OutList) + OutData%OutList(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO + END IF + OutData%SeaStSum = TRANSFER(IntKiBuf(Int_Xferred), OutData%SeaStSum) + Int_Xferred = Int_Xferred + 1 + OutData%UnSum = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + DO I = 1, LEN(OutData%OutFmt) + OutData%OutFmt(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(OutData%OutSFmt) + OutData%OutSFmt(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END SUBROUTINE SeaState_UnPackInputFile + + SUBROUTINE SeaState_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_InitInputType), INTENT(IN) :: SrcInitInputData + TYPE(SeaState_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 = 'SeaState_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%Gravity = SrcInitInputData%Gravity + DstInitInputData%defWtrDens = SrcInitInputData%defWtrDens + DstInitInputData%defWtrDpth = SrcInitInputData%defWtrDpth + DstInitInputData%defMSL2SWL = SrcInitInputData%defMSL2SWL + DstInitInputData%TMax = SrcInitInputData%TMax +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 SeaState_CopyInitInput + + SUBROUTINE SeaState_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) + TYPE(SeaState_InitInputType), INTENT(INOUT) :: InitInputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_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 SeaState_DestroyInitInput + + SUBROUTINE SeaState_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(SeaState_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 = 'SeaState_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 + 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 ! 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 + 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 + 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 SeaState_PackInitInput + + SUBROUTINE SeaState_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(SeaState_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 = 'SeaState_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%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 + 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 SeaState_UnPackInitInput + + SUBROUTINE SeaState_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_InitOutputType), INTENT(IN) :: SrcInitOutputData + TYPE(SeaState_InitOutputType), INTENT(INOUT) :: DstInitOutputData + 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 = 'SeaState_CopyInitOutput' +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_CopyInitOutput( SrcInitOutputData%Waves2, DstInitOutputData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN +IF (ALLOCATED(SrcInitOutputData%WriteOutputHdr)) THEN + i1_l = LBOUND(SrcInitOutputData%WriteOutputHdr,1) + i1_u = UBOUND(SrcInitOutputData%WriteOutputHdr,1) + IF (.NOT. ALLOCATED(DstInitOutputData%WriteOutputHdr)) THEN + ALLOCATE(DstInitOutputData%WriteOutputHdr(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WriteOutputHdr.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WriteOutputHdr = SrcInitOutputData%WriteOutputHdr +ENDIF +IF (ALLOCATED(SrcInitOutputData%WriteOutputUnt)) THEN + i1_l = LBOUND(SrcInitOutputData%WriteOutputUnt,1) + i1_u = UBOUND(SrcInitOutputData%WriteOutputUnt,1) + IF (.NOT. ALLOCATED(DstInitOutputData%WriteOutputUnt)) THEN + ALLOCATE(DstInitOutputData%WriteOutputUnt(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WriteOutputUnt.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WriteOutputUnt = SrcInitOutputData%WriteOutputUnt +ENDIF +IF (ALLOCATED(SrcInitOutputData%WaveElevSeries)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveElevSeries,1) + i1_u = UBOUND(SrcInitOutputData%WaveElevSeries,1) + i2_l = LBOUND(SrcInitOutputData%WaveElevSeries,2) + i2_u = UBOUND(SrcInitOutputData%WaveElevSeries,2) + IF (.NOT. ALLOCATED(DstInitOutputData%WaveElevSeries)) THEN + ALLOCATE(DstInitOutputData%WaveElevSeries(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElevSeries.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveElevSeries = SrcInitOutputData%WaveElevSeries +ENDIF + CALL NWTC_Library_Copyprogdesc( SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + DstInitOutputData%WtrDens = SrcInitOutputData%WtrDens + DstInitOutputData%WtrDpth = SrcInitOutputData%WtrDpth + DstInitOutputData%MSL2SWL = SrcInitOutputData%MSL2SWL + END SUBROUTINE SeaState_CopyInitOutput + + SUBROUTINE SeaState_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) + TYPE(SeaState_InitOutputType), INTENT(INOUT) :: InitOutputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyInitOutput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_DestroyInitOutput( InitOutputData%Waves2, ErrStat, ErrMsg ) +IF (ALLOCATED(InitOutputData%WriteOutputHdr)) THEN + DEALLOCATE(InitOutputData%WriteOutputHdr) +ENDIF +IF (ALLOCATED(InitOutputData%WriteOutputUnt)) THEN + DEALLOCATE(InitOutputData%WriteOutputUnt) +ENDIF +IF (ALLOCATED(InitOutputData%WaveElevSeries)) THEN + DEALLOCATE(InitOutputData%WaveElevSeries) +ENDIF + CALL NWTC_Library_Destroyprogdesc( InitOutputData%Ver, ErrStat, ErrMsg ) + END SUBROUTINE SeaState_DestroyInitOutput + + SUBROUTINE SeaState_PackInitOutput( 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(SeaState_InitOutputType), 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 = 'SeaState_PackInitOutput' + ! 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 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype + CALL Waves2_PackInitOutput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Waves2 + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Waves2 + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Waves2 + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 1 ! WriteOutputHdr allocated yes/no + IF ( ALLOCATED(InData%WriteOutputHdr) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WriteOutputHdr upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%WriteOutputHdr)*LEN(InData%WriteOutputHdr) ! WriteOutputHdr + END IF + Int_BufSz = Int_BufSz + 1 ! WriteOutputUnt allocated yes/no + IF ( ALLOCATED(InData%WriteOutputUnt) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WriteOutputUnt upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%WriteOutputUnt)*LEN(InData%WriteOutputUnt) ! WriteOutputUnt + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElevSeries allocated yes/no + IF ( ALLOCATED(InData%WaveElevSeries) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! WaveElevSeries upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevSeries) ! WaveElevSeries + END IF + Int_BufSz = Int_BufSz + 3 ! Ver: size of buffers for each call to pack subtype + CALL NWTC_Library_Packprogdesc( Re_Buf, Db_Buf, Int_Buf, InData%Ver, ErrStat2, ErrMsg2, .TRUE. ) ! Ver + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Ver + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Ver + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Ver + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Re_BufSz = Re_BufSz + 1 ! WtrDens + Re_BufSz = Re_BufSz + 1 ! WtrDpth + Re_BufSz = Re_BufSz + 1 ! MSL2SWL + 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 + + CALL Waves2_PackInitOutput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + 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 + IF ( .NOT. ALLOCATED(InData%WriteOutputHdr) ) 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%WriteOutputHdr,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WriteOutputHdr,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WriteOutputHdr,1), UBOUND(InData%WriteOutputHdr,1) + DO I = 1, LEN(InData%WriteOutputHdr) + IntKiBuf(Int_Xferred) = ICHAR(InData%WriteOutputHdr(i1)(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WriteOutputUnt) ) 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%WriteOutputUnt,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WriteOutputUnt,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WriteOutputUnt,1), UBOUND(InData%WriteOutputUnt,1) + DO I = 1, LEN(InData%WriteOutputUnt) + IntKiBuf(Int_Xferred) = ICHAR(InData%WriteOutputUnt(i1)(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveElevSeries) ) 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%WaveElevSeries,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevSeries,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevSeries,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevSeries,2) + Int_Xferred = Int_Xferred + 2 + + DO i2 = LBOUND(InData%WaveElevSeries,2), UBOUND(InData%WaveElevSeries,2) + DO i1 = LBOUND(InData%WaveElevSeries,1), UBOUND(InData%WaveElevSeries,1) + ReKiBuf(Re_Xferred) = InData%WaveElevSeries(i1,i2) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END IF + CALL NWTC_Library_Packprogdesc( Re_Buf, Db_Buf, Int_Buf, InData%Ver, ErrStat2, ErrMsg2, OnlySize ) ! Ver + 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 + ReKiBuf(Re_Xferred) = InData%WtrDens + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WtrDpth + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%MSL2SWL + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE SeaState_PackInitOutput + + SUBROUTINE SeaState_UnPackInitOutput( 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(SeaState_InitOutputType), 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 = 'SeaState_UnPackInitOutput' + ! 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 + 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 Waves2_UnpackInitOutput( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 + 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) + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutputHdr 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 + IF (ALLOCATED(OutData%WriteOutputHdr)) DEALLOCATE(OutData%WriteOutputHdr) + ALLOCATE(OutData%WriteOutputHdr(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutputHdr.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WriteOutputHdr,1), UBOUND(OutData%WriteOutputHdr,1) + DO I = 1, LEN(OutData%WriteOutputHdr) + OutData%WriteOutputHdr(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutputUnt 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 + IF (ALLOCATED(OutData%WriteOutputUnt)) DEALLOCATE(OutData%WriteOutputUnt) + ALLOCATE(OutData%WriteOutputUnt(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutputUnt.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WriteOutputUnt,1), UBOUND(OutData%WriteOutputUnt,1) + DO I = 1, LEN(OutData%WriteOutputUnt) + OutData%WriteOutputUnt(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevSeries 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%WaveElevSeries)) DEALLOCATE(OutData%WaveElevSeries) + ALLOCATE(OutData%WaveElevSeries(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevSeries.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i2 = LBOUND(OutData%WaveElevSeries,2), UBOUND(OutData%WaveElevSeries,2) + DO i1 = LBOUND(OutData%WaveElevSeries,1), UBOUND(OutData%WaveElevSeries,1) + OutData%WaveElevSeries(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END IF + 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_Unpackprogdesc( Re_Buf, Db_Buf, Int_Buf, OutData%Ver, ErrStat2, ErrMsg2 ) ! Ver + 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) + OutData%WtrDens = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%WtrDpth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%MSL2SWL = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE SeaState_UnPackInitOutput + + SUBROUTINE SeaState_CopyContState( SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_ContinuousStateType), INTENT(IN) :: SrcContStateData + TYPE(SeaState_ContinuousStateType), INTENT(INOUT) :: DstContStateData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyContState' +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_CopyContState( SrcContStateData%Waves2, DstContStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + END SUBROUTINE SeaState_CopyContState + + SUBROUTINE SeaState_DestroyContState( ContStateData, ErrStat, ErrMsg ) + TYPE(SeaState_ContinuousStateType), INTENT(INOUT) :: ContStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyContState' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_DestroyContState( ContStateData%Waves2, ErrStat, ErrMsg ) + END SUBROUTINE SeaState_DestroyContState + + SUBROUTINE SeaState_PackContState( 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(SeaState_ContinuousStateType), 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 = 'SeaState_PackContState' + ! 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 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype + CALL Waves2_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Waves2 + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Waves2 + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Waves2 + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + 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 + + CALL Waves2_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + 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 + END SUBROUTINE SeaState_PackContState + + SUBROUTINE SeaState_UnPackContState( 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(SeaState_ContinuousStateType), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackContState' + ! 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 + 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 Waves2_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 + 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) + END SUBROUTINE SeaState_UnPackContState + + SUBROUTINE SeaState_CopyDiscState( SrcDiscStateData, DstDiscStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_DiscreteStateType), INTENT(IN) :: SrcDiscStateData + TYPE(SeaState_DiscreteStateType), INTENT(INOUT) :: DstDiscStateData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyDiscState' +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_CopyDiscState( SrcDiscStateData%Waves2, DstDiscStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + END SUBROUTINE SeaState_CopyDiscState + + SUBROUTINE SeaState_DestroyDiscState( DiscStateData, ErrStat, ErrMsg ) + TYPE(SeaState_DiscreteStateType), INTENT(INOUT) :: DiscStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyDiscState' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_DestroyDiscState( DiscStateData%Waves2, ErrStat, ErrMsg ) + END SUBROUTINE SeaState_DestroyDiscState + + SUBROUTINE SeaState_PackDiscState( 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(SeaState_DiscreteStateType), 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 = 'SeaState_PackDiscState' + ! 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 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype + CALL Waves2_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Waves2 + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Waves2 + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Waves2 + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + 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 + + CALL Waves2_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + 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 + END SUBROUTINE SeaState_PackDiscState + + SUBROUTINE SeaState_UnPackDiscState( 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(SeaState_DiscreteStateType), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackDiscState' + ! 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 + 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 Waves2_UnpackDiscState( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 + 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) + END SUBROUTINE SeaState_UnPackDiscState + + SUBROUTINE SeaState_CopyConstrState( SrcConstrStateData, DstConstrStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_ConstraintStateType), INTENT(IN) :: SrcConstrStateData + TYPE(SeaState_ConstraintStateType), INTENT(INOUT) :: DstConstrStateData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyConstrState' +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_CopyConstrState( SrcConstrStateData%Waves2, DstConstrStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + END SUBROUTINE SeaState_CopyConstrState + + SUBROUTINE SeaState_DestroyConstrState( ConstrStateData, ErrStat, ErrMsg ) + TYPE(SeaState_ConstraintStateType), INTENT(INOUT) :: ConstrStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyConstrState' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_DestroyConstrState( ConstrStateData%Waves2, ErrStat, ErrMsg ) + END SUBROUTINE SeaState_DestroyConstrState + + SUBROUTINE SeaState_PackConstrState( 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(SeaState_ConstraintStateType), 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 = 'SeaState_PackConstrState' + ! 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 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype + CALL Waves2_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Waves2 + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Waves2 + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Waves2 + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + 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 + + CALL Waves2_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + 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 + END SUBROUTINE SeaState_PackConstrState + + SUBROUTINE SeaState_UnPackConstrState( 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(SeaState_ConstraintStateType), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackConstrState' + ! 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 + 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 Waves2_UnpackConstrState( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 + 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) + END SUBROUTINE SeaState_UnPackConstrState + + SUBROUTINE SeaState_CopyOtherState( SrcOtherStateData, DstOtherStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_OtherStateType), INTENT(IN) :: SrcOtherStateData + TYPE(SeaState_OtherStateType), INTENT(INOUT) :: DstOtherStateData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyOtherState' +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_CopyOtherState( SrcOtherStateData%Waves2, DstOtherStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + END SUBROUTINE SeaState_CopyOtherState + + SUBROUTINE SeaState_DestroyOtherState( OtherStateData, ErrStat, ErrMsg ) + TYPE(SeaState_OtherStateType), INTENT(INOUT) :: OtherStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyOtherState' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_DestroyOtherState( OtherStateData%Waves2, ErrStat, ErrMsg ) + END SUBROUTINE SeaState_DestroyOtherState + + SUBROUTINE SeaState_PackOtherState( 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(SeaState_OtherStateType), 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 = 'SeaState_PackOtherState' + ! 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 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype + CALL Waves2_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Waves2 + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Waves2 + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Waves2 + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + 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 + + CALL Waves2_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + 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 + END SUBROUTINE SeaState_PackOtherState + + SUBROUTINE SeaState_UnPackOtherState( 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(SeaState_OtherStateType), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackOtherState' + ! 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 + 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 Waves2_UnpackOtherState( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 + 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) + END SUBROUTINE SeaState_UnPackOtherState + + SUBROUTINE SeaState_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_MiscVarType), INTENT(IN) :: SrcMiscData + TYPE(SeaState_MiscVarType), INTENT(INOUT) :: DstMiscData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyMisc' +! + ErrStat = ErrID_None + ErrMsg = "" + DstMiscData%Decimate = SrcMiscData%Decimate + DstMiscData%LastOutTime = SrcMiscData%LastOutTime + DstMiscData%LastIndWave = SrcMiscData%LastIndWave + CALL SeaState_Interp_CopyMisc( SrcMiscData%Sea_Interp_m, DstMiscData%Sea_Interp_m, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL Waves2_CopyMisc( SrcMiscData%Waves2, DstMiscData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL Waves2_CopyInput( SrcMiscData%u_Waves2, DstMiscData%u_Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + END SUBROUTINE SeaState_CopyMisc + + SUBROUTINE SeaState_DestroyMisc( MiscData, ErrStat, ErrMsg ) + TYPE(SeaState_MiscVarType), INTENT(INOUT) :: MiscData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyMisc' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL SeaState_Interp_DestroyMisc( MiscData%Sea_Interp_m, ErrStat, ErrMsg ) + CALL Waves2_DestroyMisc( MiscData%Waves2, ErrStat, ErrMsg ) + CALL Waves2_DestroyInput( MiscData%u_Waves2, ErrStat, ErrMsg ) + END SUBROUTINE SeaState_DestroyMisc + + SUBROUTINE SeaState_PackMisc( 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(SeaState_MiscVarType), 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 = 'SeaState_PackMisc' + ! 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 ! Decimate + Db_BufSz = Db_BufSz + 1 ! LastOutTime + Int_BufSz = Int_BufSz + 1 ! LastIndWave + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Sea_Interp_m: size of buffers for each call to pack subtype + CALL SeaState_Interp_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%Sea_Interp_m, ErrStat2, ErrMsg2, .TRUE. ) ! Sea_Interp_m + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Sea_Interp_m + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Sea_Interp_m + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Sea_Interp_m + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype + CALL Waves2_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Waves2 + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Waves2 + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Waves2 + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! u_Waves2: size of buffers for each call to pack subtype + CALL Waves2_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u_Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! u_Waves2 + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! u_Waves2 + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! u_Waves2 + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! u_Waves2 + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + 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 + + IntKiBuf(Int_Xferred) = InData%Decimate + Int_Xferred = Int_Xferred + 1 + DbKiBuf(Db_Xferred) = InData%LastOutTime + Db_Xferred = Db_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%LastIndWave + Int_Xferred = Int_Xferred + 1 + CALL SeaState_Interp_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%Sea_Interp_m, ErrStat2, ErrMsg2, OnlySize ) ! Sea_Interp_m + 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 + CALL Waves2_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + 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 + CALL Waves2_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u_Waves2, ErrStat2, ErrMsg2, OnlySize ) ! u_Waves2 + 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 + END SUBROUTINE SeaState_PackMisc + + SUBROUTINE SeaState_UnPackMisc( 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(SeaState_MiscVarType), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackMisc' + ! 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 + OutData%Decimate = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%LastOutTime = DbKiBuf(Db_Xferred) + Db_Xferred = Db_Xferred + 1 + OutData%LastIndWave = IntKiBuf(Int_Xferred) + 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 SeaState_Interp_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%Sea_Interp_m, ErrStat2, ErrMsg2 ) ! Sea_Interp_m + 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) + 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 Waves2_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 + 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) + 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 Waves2_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%u_Waves2, ErrStat2, ErrMsg2 ) ! u_Waves2 + 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) + END SUBROUTINE SeaState_UnPackMisc + + SUBROUTINE SeaState_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_ParameterType), INTENT(IN) :: SrcParamData + TYPE(SeaState_ParameterType), INTENT(INOUT) :: DstParamData + 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyParam' +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_CopyParam( SrcParamData%Waves2, DstParamData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN +IF (ASSOCIATED(SrcParamData%WaveTime)) THEN + i1_l = LBOUND(SrcParamData%WaveTime,1) + i1_u = UBOUND(SrcParamData%WaveTime,1) + IF (.NOT. ASSOCIATED(DstParamData%WaveTime)) THEN + ALLOCATE(DstParamData%WaveTime(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveTime.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveTime = SrcParamData%WaveTime +ENDIF + DstParamData%WaveDT = SrcParamData%WaveDT + DstParamData%NGridPts = SrcParamData%NGridPts + DstParamData%NGrid = SrcParamData%NGrid + DstParamData%deltaGrid = SrcParamData%deltaGrid + DstParamData%NStepWave = SrcParamData%NStepWave + DstParamData%NWaveElev = SrcParamData%NWaveElev +IF (ALLOCATED(SrcParamData%WaveElevxi)) THEN + i1_l = LBOUND(SrcParamData%WaveElevxi,1) + i1_u = UBOUND(SrcParamData%WaveElevxi,1) + IF (.NOT. ALLOCATED(DstParamData%WaveElevxi)) THEN + ALLOCATE(DstParamData%WaveElevxi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElevxi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveElevxi = SrcParamData%WaveElevxi +ENDIF +IF (ALLOCATED(SrcParamData%WaveElevyi)) THEN + i1_l = LBOUND(SrcParamData%WaveElevyi,1) + i1_u = UBOUND(SrcParamData%WaveElevyi,1) + IF (.NOT. ALLOCATED(DstParamData%WaveElevyi)) THEN + ALLOCATE(DstParamData%WaveElevyi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElevyi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveElevyi = SrcParamData%WaveElevyi +ENDIF +IF (ASSOCIATED(SrcParamData%WaveElev)) THEN + i1_l = LBOUND(SrcParamData%WaveElev,1) + i1_u = UBOUND(SrcParamData%WaveElev,1) + i2_l = LBOUND(SrcParamData%WaveElev,2) + i2_u = UBOUND(SrcParamData%WaveElev,2) + i3_l = LBOUND(SrcParamData%WaveElev,3) + i3_u = UBOUND(SrcParamData%WaveElev,3) + IF (.NOT. ASSOCIATED(DstParamData%WaveElev)) THEN + ALLOCATE(DstParamData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveElev = SrcParamData%WaveElev +ENDIF +IF (ASSOCIATED(SrcParamData%WaveElev1)) THEN + i1_l = LBOUND(SrcParamData%WaveElev1,1) + i1_u = UBOUND(SrcParamData%WaveElev1,1) + i2_l = LBOUND(SrcParamData%WaveElev1,2) + i2_u = UBOUND(SrcParamData%WaveElev1,2) + i3_l = LBOUND(SrcParamData%WaveElev1,3) + i3_u = UBOUND(SrcParamData%WaveElev1,3) + IF (.NOT. ASSOCIATED(DstParamData%WaveElev1)) THEN + ALLOCATE(DstParamData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveElev1 = SrcParamData%WaveElev1 +ENDIF +IF (ASSOCIATED(SrcParamData%WaveElev2)) THEN + i1_l = LBOUND(SrcParamData%WaveElev2,1) + i1_u = UBOUND(SrcParamData%WaveElev2,1) + i2_l = LBOUND(SrcParamData%WaveElev2,2) + i2_u = UBOUND(SrcParamData%WaveElev2,2) + i3_l = LBOUND(SrcParamData%WaveElev2,3) + i3_u = UBOUND(SrcParamData%WaveElev2,3) + IF (.NOT. ASSOCIATED(DstParamData%WaveElev2)) THEN + ALLOCATE(DstParamData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveElev2 = SrcParamData%WaveElev2 +ENDIF +IF (ASSOCIATED(SrcParamData%WaveDynP)) THEN + i1_l = LBOUND(SrcParamData%WaveDynP,1) + i1_u = UBOUND(SrcParamData%WaveDynP,1) + i2_l = LBOUND(SrcParamData%WaveDynP,2) + i2_u = UBOUND(SrcParamData%WaveDynP,2) + i3_l = LBOUND(SrcParamData%WaveDynP,3) + i3_u = UBOUND(SrcParamData%WaveDynP,3) + i4_l = LBOUND(SrcParamData%WaveDynP,4) + i4_u = UBOUND(SrcParamData%WaveDynP,4) + IF (.NOT. ASSOCIATED(DstParamData%WaveDynP)) THEN + ALLOCATE(DstParamData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveDynP.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveDynP = SrcParamData%WaveDynP +ENDIF +IF (ASSOCIATED(SrcParamData%WaveAcc)) THEN + i1_l = LBOUND(SrcParamData%WaveAcc,1) + i1_u = UBOUND(SrcParamData%WaveAcc,1) + i2_l = LBOUND(SrcParamData%WaveAcc,2) + i2_u = UBOUND(SrcParamData%WaveAcc,2) + i3_l = LBOUND(SrcParamData%WaveAcc,3) + i3_u = UBOUND(SrcParamData%WaveAcc,3) + i4_l = LBOUND(SrcParamData%WaveAcc,4) + i4_u = UBOUND(SrcParamData%WaveAcc,4) + i5_l = LBOUND(SrcParamData%WaveAcc,5) + i5_u = UBOUND(SrcParamData%WaveAcc,5) + IF (.NOT. ASSOCIATED(DstParamData%WaveAcc)) THEN + ALLOCATE(DstParamData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveAcc.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveAcc = SrcParamData%WaveAcc +ENDIF +IF (ASSOCIATED(SrcParamData%WaveVel)) THEN + i1_l = LBOUND(SrcParamData%WaveVel,1) + i1_u = UBOUND(SrcParamData%WaveVel,1) + i2_l = LBOUND(SrcParamData%WaveVel,2) + i2_u = UBOUND(SrcParamData%WaveVel,2) + i3_l = LBOUND(SrcParamData%WaveVel,3) + i3_u = UBOUND(SrcParamData%WaveVel,3) + i4_l = LBOUND(SrcParamData%WaveVel,4) + i4_u = UBOUND(SrcParamData%WaveVel,4) + i5_l = LBOUND(SrcParamData%WaveVel,5) + i5_u = UBOUND(SrcParamData%WaveVel,5) + IF (.NOT. ASSOCIATED(DstParamData%WaveVel)) THEN + ALLOCATE(DstParamData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveVel.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveVel = SrcParamData%WaveVel +ENDIF + DstParamData%NWaveKin = SrcParamData%NWaveKin +IF (ALLOCATED(SrcParamData%WaveKinxi)) THEN + i1_l = LBOUND(SrcParamData%WaveKinxi,1) + i1_u = UBOUND(SrcParamData%WaveKinxi,1) + IF (.NOT. ALLOCATED(DstParamData%WaveKinxi)) THEN + ALLOCATE(DstParamData%WaveKinxi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveKinxi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveKinxi = SrcParamData%WaveKinxi +ENDIF +IF (ALLOCATED(SrcParamData%WaveKinyi)) THEN + i1_l = LBOUND(SrcParamData%WaveKinyi,1) + i1_u = UBOUND(SrcParamData%WaveKinyi,1) + IF (.NOT. ALLOCATED(DstParamData%WaveKinyi)) THEN + ALLOCATE(DstParamData%WaveKinyi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveKinyi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveKinyi = SrcParamData%WaveKinyi +ENDIF +IF (ALLOCATED(SrcParamData%WaveKinzi)) THEN + i1_l = LBOUND(SrcParamData%WaveKinzi,1) + i1_u = UBOUND(SrcParamData%WaveKinzi,1) + IF (.NOT. ALLOCATED(DstParamData%WaveKinzi)) THEN + ALLOCATE(DstParamData%WaveKinzi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveKinzi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveKinzi = SrcParamData%WaveKinzi +ENDIF + DstParamData%WtrDpth = SrcParamData%WtrDpth + DstParamData%DT = SrcParamData%DT +IF (ALLOCATED(SrcParamData%OutParam)) THEN + i1_l = LBOUND(SrcParamData%OutParam,1) + i1_u = UBOUND(SrcParamData%OutParam,1) + IF (.NOT. ALLOCATED(DstParamData%OutParam)) THEN + ALLOCATE(DstParamData%OutParam(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DO i1 = LBOUND(SrcParamData%OutParam,1), UBOUND(SrcParamData%OutParam,1) + CALL NWTC_Library_Copyoutparmtype( SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO +ENDIF + DstParamData%NumOuts = SrcParamData%NumOuts + DstParamData%NumTotalOuts = SrcParamData%NumTotalOuts + DstParamData%OutSwtch = SrcParamData%OutSwtch + DstParamData%OutFmt = SrcParamData%OutFmt + DstParamData%OutSFmt = SrcParamData%OutSFmt + DstParamData%Delim = SrcParamData%Delim + DstParamData%UnOutFile = SrcParamData%UnOutFile + DstParamData%OutDec = SrcParamData%OutDec + CALL SeaState_Interp_CopyParam( SrcParamData%Sea_Interp_p, DstParamData%Sea_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + END SUBROUTINE SeaState_CopyParam + + SUBROUTINE SeaState_DestroyParam( ParamData, ErrStat, ErrMsg ) + TYPE(SeaState_ParameterType), INTENT(INOUT) :: ParamData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyParam' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL Waves2_DestroyParam( ParamData%Waves2, ErrStat, ErrMsg ) +IF (ASSOCIATED(ParamData%WaveTime)) THEN + DEALLOCATE(ParamData%WaveTime) + ParamData%WaveTime => NULL() +ENDIF +IF (ALLOCATED(ParamData%WaveElevxi)) THEN + DEALLOCATE(ParamData%WaveElevxi) +ENDIF +IF (ALLOCATED(ParamData%WaveElevyi)) THEN + DEALLOCATE(ParamData%WaveElevyi) +ENDIF +IF (ASSOCIATED(ParamData%WaveElev)) THEN + DEALLOCATE(ParamData%WaveElev) + ParamData%WaveElev => NULL() +ENDIF +IF (ASSOCIATED(ParamData%WaveElev1)) THEN + DEALLOCATE(ParamData%WaveElev1) + ParamData%WaveElev1 => NULL() +ENDIF +IF (ASSOCIATED(ParamData%WaveElev2)) THEN + DEALLOCATE(ParamData%WaveElev2) + ParamData%WaveElev2 => NULL() +ENDIF +IF (ASSOCIATED(ParamData%WaveDynP)) THEN + DEALLOCATE(ParamData%WaveDynP) + ParamData%WaveDynP => NULL() +ENDIF +IF (ASSOCIATED(ParamData%WaveAcc)) THEN + DEALLOCATE(ParamData%WaveAcc) + ParamData%WaveAcc => NULL() +ENDIF +IF (ASSOCIATED(ParamData%WaveVel)) THEN + DEALLOCATE(ParamData%WaveVel) + ParamData%WaveVel => NULL() +ENDIF +IF (ALLOCATED(ParamData%WaveKinxi)) THEN + DEALLOCATE(ParamData%WaveKinxi) +ENDIF +IF (ALLOCATED(ParamData%WaveKinyi)) THEN + DEALLOCATE(ParamData%WaveKinyi) +ENDIF +IF (ALLOCATED(ParamData%WaveKinzi)) THEN + DEALLOCATE(ParamData%WaveKinzi) +ENDIF +IF (ALLOCATED(ParamData%OutParam)) THEN +DO i1 = LBOUND(ParamData%OutParam,1), UBOUND(ParamData%OutParam,1) + CALL NWTC_Library_Destroyoutparmtype( ParamData%OutParam(i1), ErrStat, ErrMsg ) +ENDDO + DEALLOCATE(ParamData%OutParam) +ENDIF + CALL SeaState_Interp_DestroyParam( ParamData%Sea_Interp_p, ErrStat, ErrMsg ) + END SUBROUTINE SeaState_DestroyParam + + SUBROUTINE SeaState_PackParam( 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(SeaState_ParameterType), 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 = 'SeaState_PackParam' + ! 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 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype + CALL Waves2_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Waves2 + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Waves2 + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Waves2 + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no + IF ( ASSOCIATED(InData%WaveTime) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime + END IF + Db_BufSz = Db_BufSz + 1 ! WaveDT + Int_BufSz = Int_BufSz + 1 ! NGridPts + Int_BufSz = Int_BufSz + SIZE(InData%NGrid) ! NGrid + Re_BufSz = Re_BufSz + SIZE(InData%deltaGrid) ! deltaGrid + Int_BufSz = Int_BufSz + 1 ! NStepWave + Int_BufSz = Int_BufSz + 1 ! NWaveElev + Int_BufSz = Int_BufSz + 1 ! WaveElevxi allocated yes/no + IF ( ALLOCATED(InData%WaveElevxi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveElevxi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevxi) ! WaveElevxi + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElevyi allocated yes/no + IF ( ALLOCATED(InData%WaveElevyi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveElevyi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevyi) ! WaveElevyi + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no + IF ( ASSOCIATED(InData%WaveElev) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev1) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev1) ! WaveElev1 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev2 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev2) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev2 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev2) ! WaveElev2 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveDynP allocated yes/no + IF ( ASSOCIATED(InData%WaveDynP) ) THEN + Int_BufSz = Int_BufSz + 2*4 ! WaveDynP upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveDynP) ! WaveDynP + END IF + Int_BufSz = Int_BufSz + 1 ! WaveAcc allocated yes/no + IF ( ASSOCIATED(InData%WaveAcc) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveAcc upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveAcc) ! WaveAcc + END IF + Int_BufSz = Int_BufSz + 1 ! WaveVel allocated yes/no + IF ( ASSOCIATED(InData%WaveVel) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveVel upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveVel) ! WaveVel + END IF + Int_BufSz = Int_BufSz + 1 ! NWaveKin + Int_BufSz = Int_BufSz + 1 ! WaveKinxi allocated yes/no + IF ( ALLOCATED(InData%WaveKinxi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveKinxi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveKinxi) ! WaveKinxi + END IF + Int_BufSz = Int_BufSz + 1 ! WaveKinyi allocated yes/no + IF ( ALLOCATED(InData%WaveKinyi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveKinyi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveKinyi) ! WaveKinyi + END IF + Int_BufSz = Int_BufSz + 1 ! WaveKinzi allocated yes/no + IF ( ALLOCATED(InData%WaveKinzi) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveKinzi upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveKinzi) ! WaveKinzi + END IF + Re_BufSz = Re_BufSz + 1 ! WtrDpth + Db_BufSz = Db_BufSz + 1 ! DT + Int_BufSz = Int_BufSz + 1 ! OutParam allocated yes/no + IF ( ALLOCATED(InData%OutParam) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! OutParam upper/lower bounds for each dimension + DO i1 = LBOUND(InData%OutParam,1), UBOUND(InData%OutParam,1) + Int_BufSz = Int_BufSz + 3 ! OutParam: size of buffers for each call to pack subtype + CALL NWTC_Library_Packoutparmtype( Re_Buf, Db_Buf, Int_Buf, InData%OutParam(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OutParam + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! OutParam + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! OutParam + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! OutParam + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + END IF + Int_BufSz = Int_BufSz + 1 ! NumOuts + Int_BufSz = Int_BufSz + 1 ! NumTotalOuts + Int_BufSz = Int_BufSz + 1 ! OutSwtch + Int_BufSz = Int_BufSz + 1*LEN(InData%OutFmt) ! OutFmt + Int_BufSz = Int_BufSz + 1*LEN(InData%OutSFmt) ! OutSFmt + Int_BufSz = Int_BufSz + 1*LEN(InData%Delim) ! Delim + Int_BufSz = Int_BufSz + 1 ! UnOutFile + Int_BufSz = Int_BufSz + 1 ! OutDec + Int_BufSz = Int_BufSz + 3 ! Sea_Interp_p: size of buffers for each call to pack subtype + CALL SeaState_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%Sea_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! Sea_Interp_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Sea_Interp_p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Sea_Interp_p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Sea_Interp_p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + 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 + + CALL Waves2_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + 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 + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) 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%WaveTime,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveTime,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveTime,1), UBOUND(InData%WaveTime,1) + ReKiBuf(Re_Xferred) = InData%WaveTime(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + DbKiBuf(Db_Xferred) = InData%WaveDT + Db_Xferred = Db_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NGridPts + Int_Xferred = Int_Xferred + 1 + DO i1 = LBOUND(InData%NGrid,1), UBOUND(InData%NGrid,1) + IntKiBuf(Int_Xferred) = InData%NGrid(i1) + Int_Xferred = Int_Xferred + 1 + END DO + DO i1 = LBOUND(InData%deltaGrid,1), UBOUND(InData%deltaGrid,1) + ReKiBuf(Re_Xferred) = InData%deltaGrid(i1) + Re_Xferred = Re_Xferred + 1 + END DO + IntKiBuf(Int_Xferred) = InData%NStepWave + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NWaveElev + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%WaveElevxi) ) 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%WaveElevxi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevxi,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveElevxi,1), UBOUND(InData%WaveElevxi,1) + ReKiBuf(Re_Xferred) = InData%WaveElevxi(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveElevyi) ) 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%WaveElevyi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevyi,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveElevyi,1), UBOUND(InData%WaveElevyi,1) + ReKiBuf(Re_Xferred) = InData%WaveElevyi(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev) ) 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%WaveElev,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev,3), UBOUND(InData%WaveElev,3) + DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) + DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) + ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) 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%WaveElev1,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev1,3), UBOUND(InData%WaveElev1,3) + DO i2 = LBOUND(InData%WaveElev1,2), UBOUND(InData%WaveElev1,2) + DO i1 = LBOUND(InData%WaveElev1,1), UBOUND(InData%WaveElev1,1) + ReKiBuf(Re_Xferred) = InData%WaveElev1(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev2) ) 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%WaveElev2,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev2,3), UBOUND(InData%WaveElev2,3) + DO i2 = LBOUND(InData%WaveElev2,2), UBOUND(InData%WaveElev2,2) + DO i1 = LBOUND(InData%WaveElev2,1), UBOUND(InData%WaveElev2,1) + ReKiBuf(Re_Xferred) = InData%WaveElev2(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveDynP) ) 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%WaveDynP,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,4) + Int_Xferred = Int_Xferred + 2 + + DO i4 = LBOUND(InData%WaveDynP,4), UBOUND(InData%WaveDynP,4) + DO i3 = LBOUND(InData%WaveDynP,3), UBOUND(InData%WaveDynP,3) + DO i2 = LBOUND(InData%WaveDynP,2), UBOUND(InData%WaveDynP,2) + DO i1 = LBOUND(InData%WaveDynP,1), UBOUND(InData%WaveDynP,1) + ReKiBuf(Re_Xferred) = InData%WaveDynP(i1,i2,i3,i4) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveAcc) ) 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%WaveAcc,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,5) + Int_Xferred = Int_Xferred + 2 + + DO i5 = LBOUND(InData%WaveAcc,5), UBOUND(InData%WaveAcc,5) + DO i4 = LBOUND(InData%WaveAcc,4), UBOUND(InData%WaveAcc,4) + DO i3 = LBOUND(InData%WaveAcc,3), UBOUND(InData%WaveAcc,3) + DO i2 = LBOUND(InData%WaveAcc,2), UBOUND(InData%WaveAcc,2) + DO i1 = LBOUND(InData%WaveAcc,1), UBOUND(InData%WaveAcc,1) + ReKiBuf(Re_Xferred) = InData%WaveAcc(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveVel) ) 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%WaveVel,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,5) + Int_Xferred = Int_Xferred + 2 + + DO i5 = LBOUND(InData%WaveVel,5), UBOUND(InData%WaveVel,5) + DO i4 = LBOUND(InData%WaveVel,4), UBOUND(InData%WaveVel,4) + DO i3 = LBOUND(InData%WaveVel,3), UBOUND(InData%WaveVel,3) + DO i2 = LBOUND(InData%WaveVel,2), UBOUND(InData%WaveVel,2) + DO i1 = LBOUND(InData%WaveVel,1), UBOUND(InData%WaveVel,1) + ReKiBuf(Re_Xferred) = InData%WaveVel(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IntKiBuf(Int_Xferred) = InData%NWaveKin + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%WaveKinxi) ) 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%WaveKinxi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveKinxi,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveKinxi,1), UBOUND(InData%WaveKinxi,1) + ReKiBuf(Re_Xferred) = InData%WaveKinxi(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveKinyi) ) 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%WaveKinyi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveKinyi,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveKinyi,1), UBOUND(InData%WaveKinyi,1) + ReKiBuf(Re_Xferred) = InData%WaveKinyi(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveKinzi) ) 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%WaveKinzi,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveKinzi,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveKinzi,1), UBOUND(InData%WaveKinzi,1) + ReKiBuf(Re_Xferred) = InData%WaveKinzi(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + ReKiBuf(Re_Xferred) = InData%WtrDpth + Re_Xferred = Re_Xferred + 1 + DbKiBuf(Db_Xferred) = InData%DT + Db_Xferred = Db_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%OutParam) ) 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%OutParam,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%OutParam,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%OutParam,1), UBOUND(InData%OutParam,1) + CALL NWTC_Library_Packoutparmtype( Re_Buf, Db_Buf, Int_Buf, InData%OutParam(i1), ErrStat2, ErrMsg2, OnlySize ) ! OutParam + 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 + END DO + END IF + IntKiBuf(Int_Xferred) = InData%NumOuts + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NumTotalOuts + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%OutSwtch + Int_Xferred = Int_Xferred + 1 + DO I = 1, LEN(InData%OutFmt) + IntKiBuf(Int_Xferred) = ICHAR(InData%OutFmt(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(InData%OutSFmt) + IntKiBuf(Int_Xferred) = ICHAR(InData%OutSFmt(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(InData%Delim) + IntKiBuf(Int_Xferred) = ICHAR(InData%Delim(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + IntKiBuf(Int_Xferred) = InData%UnOutFile + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%OutDec + Int_Xferred = Int_Xferred + 1 + CALL SeaState_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%Sea_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! Sea_Interp_p + 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 + END SUBROUTINE SeaState_PackParam + + SUBROUTINE SeaState_UnPackParam( 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(SeaState_ParameterType), 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackParam' + ! 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 + 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 Waves2_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 + 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) + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime 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 + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveTime,1), UBOUND(OutData%WaveTime,1) + OutData%WaveTime(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + OutData%WaveDT = DbKiBuf(Db_Xferred) + Db_Xferred = Db_Xferred + 1 + OutData%NGridPts = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + i1_l = LBOUND(OutData%NGrid,1) + i1_u = UBOUND(OutData%NGrid,1) + DO i1 = LBOUND(OutData%NGrid,1), UBOUND(OutData%NGrid,1) + OutData%NGrid(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + END DO + i1_l = LBOUND(OutData%deltaGrid,1) + i1_u = UBOUND(OutData%deltaGrid,1) + DO i1 = LBOUND(OutData%deltaGrid,1), UBOUND(OutData%deltaGrid,1) + OutData%deltaGrid(i1) = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END DO + OutData%NStepWave = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%NWaveElev = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevxi 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 + IF (ALLOCATED(OutData%WaveElevxi)) DEALLOCATE(OutData%WaveElevxi) + ALLOCATE(OutData%WaveElevxi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevxi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveElevxi,1), UBOUND(OutData%WaveElevxi,1) + OutData%WaveElevxi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevyi 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 + IF (ALLOCATED(OutData%WaveElevyi)) DEALLOCATE(OutData%WaveElevyi) + ALLOCATE(OutData%WaveElevyi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevyi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveElevyi,1), UBOUND(OutData%WaveElevyi,1) + OutData%WaveElevyi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev)) DEALLOCATE(OutData%WaveElev) + ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev,3), UBOUND(OutData%WaveElev,3) + DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) + DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) + OutData%WaveElev(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev1)) DEALLOCATE(OutData%WaveElev1) + ALLOCATE(OutData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev1,3), UBOUND(OutData%WaveElev1,3) + DO i2 = LBOUND(OutData%WaveElev1,2), UBOUND(OutData%WaveElev1,2) + DO i1 = LBOUND(OutData%WaveElev1,1), UBOUND(OutData%WaveElev1,1) + OutData%WaveElev1(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev2 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev2)) DEALLOCATE(OutData%WaveElev2) + ALLOCATE(OutData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev2,3), UBOUND(OutData%WaveElev2,3) + DO i2 = LBOUND(OutData%WaveElev2,2), UBOUND(OutData%WaveElev2,2) + DO i1 = LBOUND(OutData%WaveElev2,1), UBOUND(OutData%WaveElev2,1) + OutData%WaveElev2(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDynP 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveDynP)) DEALLOCATE(OutData%WaveDynP) + ALLOCATE(OutData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i4 = LBOUND(OutData%WaveDynP,4), UBOUND(OutData%WaveDynP,4) + DO i3 = LBOUND(OutData%WaveDynP,3), UBOUND(OutData%WaveDynP,3) + DO i2 = LBOUND(OutData%WaveDynP,2), UBOUND(OutData%WaveDynP,2) + DO i1 = LBOUND(OutData%WaveDynP,1), UBOUND(OutData%WaveDynP,1) + OutData%WaveDynP(i1,i2,i3,i4) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveAcc 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveAcc)) DEALLOCATE(OutData%WaveAcc) + ALLOCATE(OutData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i5 = LBOUND(OutData%WaveAcc,5), UBOUND(OutData%WaveAcc,5) + DO i4 = LBOUND(OutData%WaveAcc,4), UBOUND(OutData%WaveAcc,4) + DO i3 = LBOUND(OutData%WaveAcc,3), UBOUND(OutData%WaveAcc,3) + DO i2 = LBOUND(OutData%WaveAcc,2), UBOUND(OutData%WaveAcc,2) + DO i1 = LBOUND(OutData%WaveAcc,1), UBOUND(OutData%WaveAcc,1) + OutData%WaveAcc(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveVel 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveVel)) DEALLOCATE(OutData%WaveVel) + ALLOCATE(OutData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i5 = LBOUND(OutData%WaveVel,5), UBOUND(OutData%WaveVel,5) + DO i4 = LBOUND(OutData%WaveVel,4), UBOUND(OutData%WaveVel,4) + DO i3 = LBOUND(OutData%WaveVel,3), UBOUND(OutData%WaveVel,3) + DO i2 = LBOUND(OutData%WaveVel,2), UBOUND(OutData%WaveVel,2) + DO i1 = LBOUND(OutData%WaveVel,1), UBOUND(OutData%WaveVel,1) + OutData%WaveVel(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + OutData%NWaveKin = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveKinxi 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 + IF (ALLOCATED(OutData%WaveKinxi)) DEALLOCATE(OutData%WaveKinxi) + ALLOCATE(OutData%WaveKinxi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveKinxi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveKinxi,1), UBOUND(OutData%WaveKinxi,1) + OutData%WaveKinxi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveKinyi 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 + IF (ALLOCATED(OutData%WaveKinyi)) DEALLOCATE(OutData%WaveKinyi) + ALLOCATE(OutData%WaveKinyi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveKinyi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveKinyi,1), UBOUND(OutData%WaveKinyi,1) + OutData%WaveKinyi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveKinzi 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 + IF (ALLOCATED(OutData%WaveKinzi)) DEALLOCATE(OutData%WaveKinzi) + ALLOCATE(OutData%WaveKinzi(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveKinzi.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveKinzi,1), UBOUND(OutData%WaveKinzi,1) + OutData%WaveKinzi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + OutData%WtrDpth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%DT = DbKiBuf(Db_Xferred) + Db_Xferred = Db_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! OutParam 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 + IF (ALLOCATED(OutData%OutParam)) DEALLOCATE(OutData%OutParam) + ALLOCATE(OutData%OutParam(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutParam.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%OutParam,1), UBOUND(OutData%OutParam,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_Unpackoutparmtype( Re_Buf, Db_Buf, Int_Buf, OutData%OutParam(i1), ErrStat2, ErrMsg2 ) ! OutParam + 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) + END DO + END IF + OutData%NumOuts = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%NumTotalOuts = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%OutSwtch = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + DO I = 1, LEN(OutData%OutFmt) + OutData%OutFmt(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(OutData%OutSFmt) + OutData%OutSFmt(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(OutData%Delim) + OutData%Delim(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + OutData%UnOutFile = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%OutDec = IntKiBuf(Int_Xferred) + 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 SeaState_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%Sea_Interp_p, ErrStat2, ErrMsg2 ) ! Sea_Interp_p + 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) + END SUBROUTINE SeaState_UnPackParam + + SUBROUTINE SeaState_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_InputType), INTENT(IN) :: SrcInputData + TYPE(SeaState_InputType), INTENT(INOUT) :: DstInputData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyInput' +! + ErrStat = ErrID_None + ErrMsg = "" + DstInputData%DummyInput = SrcInputData%DummyInput + END SUBROUTINE SeaState_CopyInput + + SUBROUTINE SeaState_DestroyInput( InputData, ErrStat, ErrMsg ) + TYPE(SeaState_InputType), INTENT(INOUT) :: InputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyInput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE SeaState_DestroyInput + + SUBROUTINE SeaState_PackInput( 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(SeaState_InputType), 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 = 'SeaState_PackInput' + ! 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 + Re_BufSz = Re_BufSz + 1 ! DummyInput + 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 + + ReKiBuf(Re_Xferred) = InData%DummyInput + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE SeaState_PackInput + + SUBROUTINE SeaState_UnPackInput( 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(SeaState_InputType), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackInput' + ! 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 + OutData%DummyInput = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE SeaState_UnPackInput + + SUBROUTINE SeaState_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_OutputType), INTENT(IN) :: SrcOutputData + TYPE(SeaState_OutputType), INTENT(INOUT) :: DstOutputData + 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyOutput' +! + ErrStat = ErrID_None + ErrMsg = "" +IF (ALLOCATED(SrcOutputData%WriteOutput)) THEN + i1_l = LBOUND(SrcOutputData%WriteOutput,1) + i1_u = UBOUND(SrcOutputData%WriteOutput,1) + IF (.NOT. ALLOCATED(DstOutputData%WriteOutput)) THEN + ALLOCATE(DstOutputData%WriteOutput(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstOutputData%WriteOutput = SrcOutputData%WriteOutput +ENDIF + CALL Waves2_CopyOutput( SrcOutputData%Waves2, DstOutputData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + END SUBROUTINE SeaState_CopyOutput + + SUBROUTINE SeaState_DestroyOutput( OutputData, ErrStat, ErrMsg ) + TYPE(SeaState_OutputType), INTENT(INOUT) :: OutputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyOutput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" +IF (ALLOCATED(OutputData%WriteOutput)) THEN + DEALLOCATE(OutputData%WriteOutput) +ENDIF + CALL Waves2_DestroyOutput( OutputData%Waves2, ErrStat, ErrMsg ) + END SUBROUTINE SeaState_DestroyOutput + + SUBROUTINE SeaState_PackOutput( 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(SeaState_OutputType), 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 = 'SeaState_PackOutput' + ! 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 ! WriteOutput allocated yes/no + IF ( ALLOCATED(InData%WriteOutput) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WriteOutput upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WriteOutput) ! WriteOutput + END IF + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype + CALL Waves2_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Waves2 + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Waves2 + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Waves2 + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + 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 + + IF ( .NOT. ALLOCATED(InData%WriteOutput) ) 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%WriteOutput,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WriteOutput,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WriteOutput,1), UBOUND(InData%WriteOutput,1) + ReKiBuf(Re_Xferred) = InData%WriteOutput(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + CALL Waves2_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + 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 + END SUBROUTINE SeaState_PackOutput + + SUBROUTINE SeaState_UnPackOutput( 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(SeaState_OutputType), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackOutput' + ! 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 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutput 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 + IF (ALLOCATED(OutData%WriteOutput)) DEALLOCATE(OutData%WriteOutput) + ALLOCATE(OutData%WriteOutput(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutput.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WriteOutput,1), UBOUND(OutData%WriteOutput,1) + OutData%WriteOutput(i1) = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + 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 Waves2_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 + 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) + END SUBROUTINE SeaState_UnPackOutput + + + SUBROUTINE SeaState_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is given by the size of u +! +! expressions below based on either +! +! f(t) = a +! f(t) = a + b * t, or +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = u1, f(t2) = u2, f(t3) = u3 (as appropriate) +! +!.................................................................................................................................. + + TYPE(SeaState_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 + REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Inputs + TYPE(SeaState_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Input_ExtrapInterp' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + if ( size(t) .ne. size(u)) then + CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(u)',ErrStat,ErrMsg,RoutineName) + RETURN + endif + order = SIZE(u) - 1 + IF ( order .eq. 0 ) THEN + CALL SeaState_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 1 ) THEN + CALL SeaState_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 2 ) THEN + CALL SeaState_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE + CALL SetErrStat(ErrID_Fatal,'size(u) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) + RETURN + ENDIF + END SUBROUTINE SeaState_Input_ExtrapInterp + + + SUBROUTINE SeaState_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is 1. +! +! f(t) = a + b * t, or +! +! where a and b are determined as the solution to +! f(t1) = u1, f(t2) = u2 +! +!.................................................................................................................................. + + TYPE(SeaState_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 + TYPE(SeaState_InputType), INTENT(IN) :: u2 ! Input at t2 + REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Inputs + TYPE(SeaState_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(2) ! Times associated with the Inputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Input_ExtrapInterp1' + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / t(2) + b = -(u1%DummyInput - u2%DummyInput) + u_out%DummyInput = u1%DummyInput + b * ScaleFactor + END SUBROUTINE SeaState_Input_ExtrapInterp1 + + + SUBROUTINE SeaState_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is 2. +! +! expressions below based on either +! +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = u1, f(t2) = u2, f(t3) = u3 +! +!.................................................................................................................................. + + TYPE(SeaState_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 + TYPE(SeaState_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 + TYPE(SeaState_InputType), INTENT(IN) :: u3 ! Input at t3 + REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Inputs + TYPE(SeaState_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(3) ! Times associated with the Inputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: c ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Input_ExtrapInterp2' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) + b = (t(3)**2*(u1%DummyInput - u2%DummyInput) + t(2)**2*(-u1%DummyInput + u3%DummyInput))* scaleFactor + c = ( (t(2)-t(3))*u1%DummyInput + t(3)*u2%DummyInput - t(2)*u3%DummyInput ) * scaleFactor + u_out%DummyInput = u1%DummyInput + b + c * t_out + END SUBROUTINE SeaState_Input_ExtrapInterp2 + + + SUBROUTINE SeaState_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is given by the size of y +! +! expressions below based on either +! +! f(t) = a +! f(t) = a + b * t, or +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = y1, f(t2) = y2, f(t3) = y3 (as appropriate) +! +!.................................................................................................................................. + + TYPE(SeaState_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 + REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Outputs + TYPE(SeaState_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Output_ExtrapInterp' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + if ( size(t) .ne. size(y)) then + CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(y)',ErrStat,ErrMsg,RoutineName) + RETURN + endif + order = SIZE(y) - 1 + IF ( order .eq. 0 ) THEN + CALL SeaState_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 1 ) THEN + CALL SeaState_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 2 ) THEN + CALL SeaState_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE + CALL SetErrStat(ErrID_Fatal,'size(y) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) + RETURN + ENDIF + END SUBROUTINE SeaState_Output_ExtrapInterp + + + SUBROUTINE SeaState_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is 1. +! +! f(t) = a + b * t, or +! +! where a and b are determined as the solution to +! f(t1) = y1, f(t2) = y2 +! +!.................................................................................................................................. + + TYPE(SeaState_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 + TYPE(SeaState_OutputType), INTENT(IN) :: y2 ! Output at t2 + REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Outputs + TYPE(SeaState_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(2) ! Times associated with the Outputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Output_ExtrapInterp1' + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / t(2) +IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN + DO i1 = LBOUND(y_out%WriteOutput,1),UBOUND(y_out%WriteOutput,1) + b = -(y1%WriteOutput(i1) - y2%WriteOutput(i1)) + y_out%WriteOutput(i1) = y1%WriteOutput(i1) + b * ScaleFactor + END DO +END IF ! check if allocated + CALL Waves2_Output_ExtrapInterp1( y1%Waves2, y2%Waves2, tin, y_out%Waves2, tin_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END SUBROUTINE SeaState_Output_ExtrapInterp1 + + + SUBROUTINE SeaState_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is 2. +! +! expressions below based on either +! +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = y1, f(t2) = y2, f(t3) = y3 +! +!.................................................................................................................................. + + TYPE(SeaState_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 + TYPE(SeaState_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 + TYPE(SeaState_OutputType), INTENT(IN) :: y3 ! Output at t3 + REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Outputs + TYPE(SeaState_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(3) ! Times associated with the Outputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: c ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Output_ExtrapInterp2' + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) +IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN + DO i1 = LBOUND(y_out%WriteOutput,1),UBOUND(y_out%WriteOutput,1) + b = (t(3)**2*(y1%WriteOutput(i1) - y2%WriteOutput(i1)) + t(2)**2*(-y1%WriteOutput(i1) + y3%WriteOutput(i1)))* scaleFactor + c = ( (t(2)-t(3))*y1%WriteOutput(i1) + t(3)*y2%WriteOutput(i1) - t(2)*y3%WriteOutput(i1) ) * scaleFactor + y_out%WriteOutput(i1) = y1%WriteOutput(i1) + b + c * t_out + END DO +END IF ! check if allocated + CALL Waves2_Output_ExtrapInterp2( y1%Waves2, y2%Waves2, y3%Waves2, tin, y_out%Waves2, tin_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END SUBROUTINE SeaState_Output_ExtrapInterp2 + +END MODULE SeaState_Types +!ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/UserWaves.f90 b/modules/seastate/src/UserWaves.f90 index a979b5df93..a9de2b957f 100644 --- a/modules/seastate/src/UserWaves.f90 +++ b/modules/seastate/src/UserWaves.f90 @@ -658,7 +658,7 @@ SUBROUTINE CleanUp IF (ALLOCATED( WaveElevData%WaveElev )) DEALLOCATE( WaveElevData%WaveElev, STAT=ErrStatTmp) IF (ALLOCATED( WaveElevData%WaveTime )) DEALLOCATE( WaveElevData%WaveTime, STAT=ErrStatTmp) IF (ALLOCATED( TmpFFTWaveElev )) DEALLOCATE( TmpFFTWaveElev, STAT=ErrStatTmp) - IF (ALLOCATED( InitOut%WaveElevC0 )) DEALLOCATE( InitOut%WaveElevC0, STAT=ErrStatTmp) + ! IF (ALLOCATED( InitOut%WaveElevC0 )) DEALLOCATE( InitOut%WaveElevC0, STAT=ErrStatTmp) END SUBROUTINE CleanUp @@ -735,19 +735,19 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) ALLOCATE ( InitOut%WaveTime (0:InitOut%NStepWave ) , STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveTime.', ErrStat,ErrMsg,RoutineName) - ALLOCATE ( InitOut%WaveElev (0:InitOut%NStepWave,InitInp%NWaveElev ) , STAT=ErrStatTmp ) + ALLOCATE ( InitOut%WaveElev (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2) ) , STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev.', ErrStat,ErrMsg,RoutineName) InitOut%WaveElev = 0.0_SiKi - ALLOCATE ( InitOut%WaveDynP (0:InitOut%NStepWave,InitInp%NWaveKin ) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveDynP.', ErrStat,ErrMsg,RoutineName) + ALLOCATE ( InitOut%WaveDynP (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3) ), STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveDynP.', ErrStat,ErrMsg,'VariousWaves_Init') - ALLOCATE ( InitOut%WaveVel (0:InitOut%NStepWave,InitInp%NWaveKin,3) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveVel.', ErrStat,ErrMsg,RoutineName) - - ALLOCATE ( InitOut%WaveAcc (0:InitOut%NStepWave,InitInp%NWaveKin,3) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveAcc.', ErrStat,ErrMsg,RoutineName) + ALLOCATE ( InitOut%WaveVel (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveVel.', ErrStat,ErrMsg,'VariousWaves_Init') + ALLOCATE ( InitOut%WaveAcc (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveAcc.', ErrStat,ErrMsg,'VariousWaves_Init') + ! Now check if all the allocations worked properly @@ -801,8 +801,8 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) END DO END DO - - InitOut%WaveVel (:,:,1) = WaveData(:,:) + !TODO: Rework onto grid + ! InitOut%WaveVel (:,:,1) = WaveData(:,:) ! Now read the remaining files and check that the elements are consistent with the first file DO iFile = 2,7 @@ -853,20 +853,21 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) END DO SELECT CASE (iFile) - CASE (1) - InitOut%WaveVel (:,:,1) = WaveData(:,:) - CASE (2) - InitOut%WaveVel (:,:,2) = WaveData(:,:) - CASE (3) - InitOut%WaveVel (:,:,3) = WaveData(:,:) - CASE (4) - InitOut%WaveAcc (:,:,1) = WaveData(:,:) - CASE (5) - InitOut%WaveAcc (:,:,2) = WaveData(:,:) - CASE (6) - InitOut%WaveAcc (:,:,3) = WaveData(:,:) - CASE (7) - InitOut%WaveDynP = WaveData + !TODO: Rework onto grid points + !CASE (1) + ! InitOut%WaveVel (:,:,1) = WaveData(:,:) + !CASE (2) + ! InitOut%WaveVel (:,:,2) = WaveData(:,:) + !CASE (3) + ! InitOut%WaveVel (:,:,3) = WaveData(:,:) + !CASE (4) + ! InitOut%WaveAcc (:,:,1) = WaveData(:,:) + !CASE (5) + ! InitOut%WaveAcc (:,:,2) = WaveData(:,:) + !CASE (6) + ! InitOut%WaveAcc (:,:,3) = WaveData(:,:) + !CASE (7) + ! InitOut%WaveDynP = WaveData END SELECT CLOSE(UnWv) @@ -878,61 +879,43 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) END DO ! WaveElev - IF ( InitInp%NWaveElev > 0 ) THEN - CALL GetNewUnit( UnWv ) - - FileName = TRIM(InitInp%WvKinFile) // '.Elev' - - CALL OpenFInpFile ( UnWv, FileName, ErrStat, ErrMsg ) - IF ( ErrStat /= 0 ) THEN - ErrStat = ErrID_Fatal - ErrMsg = 'Failed to open wave elevations file, ' // TRIM(FileName) - RETURN - END IF - - Frmt = '('//TRIM(Int2LStr(InitInp%NWaveElev))//'(:,A,ES11.4e2))' - - CALL ReadCom( UnWv, FileName, 'HydroDyn wave elevations file header line 1', ErrStatTmp, ErrMsgTmp ) - CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - DO i = 0,InitOut%NStepWave-1 - Read(UnWv,Frmt) ( Delim, InitOut%WaveElev(i,j) , j=1,InitInp%NWaveElev ) - END DO - CLOSE(UnWv) - END IF +!TODO FIX for new grid of XY wave elevations +! IF ( InitInp%NWaveElev > 0 ) THEN +! CALL GetNewUnit( UnWv ) +! +! FileName = TRIM(InitInp%WvKinFile) // '.Elev' +! +! CALL OpenFInpFile ( UnWv, FileName, ErrStat, ErrMsg ) +! IF ( ErrStat /= 0 ) THEN +! ErrStat = ErrID_Fatal +! ErrMsg = 'Failed to open wave elevations file, ' // TRIM(FileName) +! RETURN +! END IF +! +! Frmt = '('//TRIM(Int2LStr(InitInp%NWaveElev))//'(:,A,ES11.4e2))' +! +! CALL ReadCom( UnWv, FileName, 'HydroDyn wave elevations file header line 1', ErrStatTmp, ErrMsgTmp ) +! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName ) +! IF (ErrStat >= AbortErrLev) THEN +! CALL Cleanup() +! RETURN +! END IF +!!TODO: FIX WaveElev based on grid now. +! !DO t = 0,InitOut%NStepWave-1 +! ! Read(UnWv,Frmt) ( Delim, InitOut%WaveElev(t,i,j) , j=1,InitInp%NWaveElev ) +! !END DO +! CLOSE(UnWv) +! END IF CALL CleanUp( ) ! Need to append the first time step record to the end of each array for periodic waves - InitOut%WaveVel (InitOut%NStepWave,:,:) = InitOut%WaveVel (0,:,:) - InitOut%WaveAcc (InitOut%NStepWave,:,:) = InitOut%WaveAcc (0,:,:) - InitOut%WaveDynP(InitOut%NStepWave,:) = InitOut%WaveDynP(0,: ) - InitOut%WaveElev(InitOut%NStepWave,:) = InitOut%WaveElev(0,:) + InitOut%WaveVel (InitOut%NStepWave,:,:,:,:) = InitOut%WaveVel (0,:,:,:,:) + InitOut%WaveAcc (InitOut%NStepWave,:,:,:,:) = InitOut%WaveAcc (0,:,:,:,:) + InitOut%WaveDynP(InitOut%NStepWave,:,:,:) = InitOut%WaveDynP(0,:,:,: ) + InitOut%WaveElev(InitOut%NStepWave,:,:) = InitOut%WaveElev(0,:,:) InitOut%nodeInWater(InitOut%NStepWave,:) = InitOut%nodeInWater(0,:) - - ! For creating animations of the sea surface, the WaveElevXY array is passed in with a series of x,y coordinates - ! (index 1). The second index corresponds to the number of points passed in. A two dimensional time series - ! is created with the first index corresponding to the timestep, and second index corresponding to the second - ! index of the WaveElevXY array. - IF ( ALLOCATED(InitInp%WaveElevXY)) THEN - ALLOCATE ( InitOut%WaveElevSeries (0:InitOut%NStepWave, 1:SIZE(InitInp%WaveElevXY, DIM=2)) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) THEN - CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElevSeries.',ErrStat,ErrMsg,'VariousWaves_Init') - RETURN - END IF - ! Calculate the wave elevation at all points requested in the array WaveElevXY - DO I = 0,InitOut%NStepWave - DO J = 1,SIZE(InitInp%WaveElevXY, DIM=2) - InitOut%WaveElevSeries(I,J) = 0.0_ReKi ! TODO, these values should be interpolated based on inputs - ENDDO - ENDDO - ENDIF - CONTAINS diff --git a/modules/seastate/src/Waves.f90 b/modules/seastate/src/Waves.f90 index 5358c49a49..3c47b8add3 100644 --- a/modules/seastate/src/Waves.f90 +++ b/modules/seastate/src/Waves.f90 @@ -555,7 +555,7 @@ SUBROUTINE StillWaterWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None ! Local Variables - INTEGER :: I, J ! Generic index + INTEGER :: I, J,k, count ! Generic index INTEGER(IntKi) :: ErrStatTmp ! Temporary error status ! Initialize ErrStat @@ -572,31 +572,31 @@ SUBROUTINE StillWaterWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) ALLOCATE ( InitOut%WaveTime (0:InitOut%NStepWave ) , STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveTime.', ErrStat,ErrMsg,'StillWaterWaves_Init') - ALLOCATE ( InitOut%WaveElev0 (0:InitOut%NStepWave ), STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev0.', ErrStat,ErrMsg,'StillWaterWaves_Init') + !ALLOCATE ( InitOut%WaveElev0 (0:InitOut%NStepWave ), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev0.', ErrStat,ErrMsg,'StillWaterWaves_Init') ALLOCATE ( InitOut%WaveElevC0 (2, 0:InitOut%NStepWave2 ) , STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElevC0.',ErrStat,ErrMsg,'StillWaterWaves_Init') - ALLOCATE ( InitOut%WaveElev (0:InitOut%NStepWave,InitInp%NWaveElev ) , STAT=ErrStatTmp ) + ALLOCATE ( InitOut%WaveElev (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2) ) , STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev.', ErrStat,ErrMsg,'StillWaterWaves_Init') - ALLOCATE ( InitOut%WaveDynP (0:InitOut%NStepWave,InitInp%NWaveKin ) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveDynP.', ErrStat,ErrMsg,'StillWaterWaves_Init') + ALLOCATE ( InitOut%WaveDynP (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3) ), STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveDynP.', ErrStat,ErrMsg,'VariousWaves_Init') - ALLOCATE ( InitOut%WaveVel (0:InitOut%NStepWave,InitInp%NWaveKin,3) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveVel.', ErrStat,ErrMsg,'StillWaterWaves_Init') + ALLOCATE ( InitOut%WaveVel (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveVel.', ErrStat,ErrMsg,'VariousWaves_Init') - ALLOCATE ( InitOut%WaveAcc (0:InitOut%NStepWave,InitInp%NWaveKin,3) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveAcc.', ErrStat,ErrMsg,'StillWaterWaves_Init') + ALLOCATE ( InitOut%WaveAcc (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveAcc.', ErrStat,ErrMsg,'VariousWaves_Init') - ALLOCATE ( InitOut%PWaveDynP0 (0:InitOut%NStepWave,InitInp%NWaveKin ) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveDynP0.', ErrStat,ErrMsg,'StillWaterWaves_Init') - - ALLOCATE ( InitOut%PWaveVel0 (0:InitOut%NStepWave,InitInp%NWaveKin,3) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveVel0.', ErrStat,ErrMsg,'StillWaterWaves_Init') - - ALLOCATE ( InitOut%PWaveAcc0 (0:InitOut%NStepWave,InitInp%NWaveKin,3) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveAcc0.', ErrStat,ErrMsg,'StillWaterWaves_Init') + !ALLOCATE ( InitOut%PWaveDynP0 (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3) ), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveDynP0.', ErrStat,ErrMsg,'VariousWaves_Init') + ! + !ALLOCATE ( InitOut%PWaveVel0 (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveVel0.', ErrStat,ErrMsg,'VariousWaves_Init') + ! + !ALLOCATE ( InitOut%PWaveAcc0 (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveAcc0.', ErrStat,ErrMsg,'VariousWaves_Init') ALLOCATE ( InitOut%nodeInWater(0:InitOut%NStepWave,InitInp%NWaveKin ) , STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%nodeInWater.', ErrStat,ErrMsg,'StillWaterWaves_Init') @@ -609,49 +609,41 @@ SUBROUTINE StillWaterWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) InitOut%WaveDOmega = 0.0 InitOut%WaveTime = (/ 0.0_DbKi, 1.0_DbKi, 2.0_DbKi /) ! We must have at least two different time steps in the interpolation - InitOut%WaveElev0 = 0.0 + ! InitOut%WaveElev0 = 0.0 InitOut%WaveElevC0 = 0.0 InitOut%WaveElev = 0.0 - InitOut%PWaveDynP0 = 0.0 - InitOut%PWaveVel0 = 0.0 - InitOut%PWaveAcc0 = 0.0 + !InitOut%PWaveDynP0 = 0.0 + !InitOut%PWaveVel0 = 0.0 + !InitOut%PWaveAcc0 = 0.0 InitOut%WaveDynP = 0.0 InitOut%WaveVel = 0.0 InitOut%WaveAcc = 0.0 InitOut%WaveDirArr = 0.0 - - ! For creating animations of the sea surface, the WaveElevXY array is passed in with a series of x,y coordinates - ! (index 1). The second index corresponds to the number of points passed in. A two dimensional time series - ! is created with the first index corresponding to the timestep, and second index corresponding to the second - ! index of the WaveElevXY array. - IF ( ALLOCATED(InitInp%WaveElevXY)) THEN - ALLOCATE ( InitOut%WaveElevSeries (0:InitOut%NStepWave, 1:SIZE(InitInp%WaveElevXY, DIM=2)) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) THEN - CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElevSeries.',ErrStat,ErrMsg,'VariousWaves_Init') - RETURN - END IF - ! Calculate the wave elevation at all points requested in the array WaveElevXY - DO I = 0,InitOut%NStepWave - DO J = 1,SIZE(InitInp%WaveElevXY, DIM=2) - InitOut%WaveElevSeries(I,J) = 0.0_ReKi - ENDDO - ENDDO - ENDIF + ! Add the current velocities to the wave velocities: - DO J = 1,InitInp%NWaveKin ! Loop through all Morison element nodes where the incident wave kinematics will be computed - - InitOut%WaveVel(:,J,1) = InitInp%CurrVxi(J) ! xi-direction - InitOut%WaveVel(:,J,2) = InitInp%CurrVyi(J) ! yi-direction - IF ( InitInp%WaveKinzi(J) >= -InitInp%WtrDpth .AND. InitInp%WaveKinzi(J) <= 0 ) THEN + + count = 1 + + !DO J = 1,InitInp%NWaveKin ! Loop through all points where the incident wave kinematics will be computed + do k = 1, InitInp%NGrid(3) + do j = 1, InitInp%NGrid(2) + do i = 1, InitInp%NGrid(1) + InitOut%WaveVel(:,i,j,k,1) = InitInp%CurrVxi(count) ! xi-direction + InitOut%WaveVel(:,i,j,k,2) = InitInp%CurrVyi(count) ! yi-direction + IF ( InitInp%WaveKinzi(count) >= -InitInp%WtrDpth .AND. InitInp%WaveKinzi(count) <= 0 ) THEN - InitOut%nodeInWater(:, J) = 1 - ELSE - InitOut%nodeInWater(:, J) = 0 - END IF - END DO ! J - All points where the incident wave kinematics will be computed + InitOut%nodeInWater(:,count) = 1 + ELSE + InitOut%nodeInWater(:, count) = 0 + END IF + end do + end do + end do + + ! END DO ! J - All points where the incident wave kinematics will be computed END SUBROUTINE StillWaterWaves_Init @@ -762,15 +754,16 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) ! REAL(SiKi) :: WGNC_Fact ! INTEGER :: GHNStepWave ! Total number of time steps in the GH Bladed wave data files. ! INTEGER :: GHNWvDpth ! Number of vertical locations in GH Bladed wave data files. - INTEGER :: I ! Generic index + INTEGER :: I,count ! Generic index ! INTEGER :: I_Orig ! The index of the time step from original (input) part of data INTEGER :: I_WaveTp ! The index of the frequency component nearest to WaveTp - INTEGER :: J ! Generic index + INTEGER :: J ,jj,kk,ii ! Generic index INTEGER :: J_Min ! The minimum value of index J such that WaveKinzi(J) >= -WtrDpth INTEGER :: K ! Generic index INTEGER :: LastInd ! Index into the arrays saved from the last call as a starting point for this call INTEGER :: nSeeds ! number of seeds required to initialize the intrinsic random number generator INTEGER :: NWaveKin0Prime ! Number of points where the incident wave kinematics will be computed before applying stretching to the instantaneous free surface (-) + integer :: primeCount ! Counter for locations before applying stretching INTEGER, ALLOCATABLE :: TmpWaveSeeds (:) ! A temporary array used for portability. IVF/CVF use a random number generator initialized with 2 seeds; other platforms can use different implementations (e.g. gfortran needs 8 or 12 seeds) COMPLEX(SiKi) :: tmpComplex ! A temporary varible to hold the complex value of the wave elevation before storing it into a REAL array COMPLEX(SiKi),ALLOCATABLE :: tmpComplexArr(:) ! A temporary array (0:NStepWave2-1) for FFT use. @@ -1089,10 +1082,10 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) !ALLOCATE ( PWaveAccC0VPz0 (0:InitOut%NStepWave2 ,InitInp%NWaveKin ), STAT=ErrStatTmp ) !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array PWaveAccC0VPz0.', ErrStat,ErrMsg,'VariousWaves_Init') - ALLOCATE ( InitOut%WaveElev0 (0:InitOut%NStepWave ), STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveElev0.', ErrStat,ErrMsg,'VariousWaves_Init') + !ALLOCATE ( InitOut%WaveElev0 (0:InitOut%NStepWave ), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveElev0.', ErrStat,ErrMsg,'VariousWaves_Init') - ALLOCATE ( InitOut%WaveElev (0:InitOut%NStepWave,InitInp%NWaveElev ), STAT=ErrStatTmp ) + ALLOCATE ( InitOut%WaveElev (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2) ), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev.', ErrStat,ErrMsg,'VariousWaves_Init') ALLOCATE ( WaveDynP0B (0:InitOut%NStepWave-1,NWaveKin0Prime ), STAT=ErrStatTmp ) @@ -1137,25 +1130,45 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) !ALLOCATE ( PWaveAcc0VPz0 (0:InitOut%NStepWave-1,InitInp%NWaveKin ), STAT=ErrStatTmp ) !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array PWaveAcc0VPz0.', ErrStat,ErrMsg,'VariousWaves_Init') - ALLOCATE ( InitOut%WaveDynP (0:InitOut%NStepWave,InitInp%NWaveKin ), STAT=ErrStatTmp ) +!TODO: These InitOut arrays now need to be organized for the grid points + + ALLOCATE ( InitOut%WaveDynP (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3) ), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveDynP.', ErrStat,ErrMsg,'VariousWaves_Init') - ALLOCATE ( InitOut%WaveVel (0:InitOut%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) + ALLOCATE ( InitOut%WaveVel (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveVel.', ErrStat,ErrMsg,'VariousWaves_Init') - ALLOCATE ( InitOut%WaveAcc (0:InitOut%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) + ALLOCATE ( InitOut%WaveAcc (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveAcc.', ErrStat,ErrMsg,'VariousWaves_Init') - ALLOCATE ( InitOut%PWaveDynP0 (0:InitOut%NStepWave,InitInp%NWaveKin ), STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveDynP0.', ErrStat,ErrMsg,'VariousWaves_Init') - - ALLOCATE ( InitOut%PWaveVel0 (0:InitOut%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveVel0.', ErrStat,ErrMsg,'VariousWaves_Init') - - ALLOCATE ( InitOut%PWaveAcc0 (0:InitOut%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveAcc0.', ErrStat,ErrMsg,'VariousWaves_Init') - + !ALLOCATE ( InitOut%PWaveDynP0 (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3) ), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveDynP0.', ErrStat,ErrMsg,'VariousWaves_Init') + ! + !ALLOCATE ( InitOut%PWaveVel0 (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveVel0.', ErrStat,ErrMsg,'VariousWaves_Init') + ! + !ALLOCATE ( InitOut%PWaveAcc0 (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveAcc0.', ErrStat,ErrMsg,'VariousWaves_Init') + ! + !ALLOCATE ( InitOut%WaveDynP (0:InitOut%NStepWave,InitInp%NWaveKin ), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveDynP.', ErrStat,ErrMsg,'VariousWaves_Init') + ! + !ALLOCATE ( InitOut%WaveVel (0:InitOut%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveVel.', ErrStat,ErrMsg,'VariousWaves_Init') + ! + !ALLOCATE ( InitOut%WaveAcc (0:InitOut%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveAcc.', ErrStat,ErrMsg,'VariousWaves_Init') + ! + !ALLOCATE ( InitOut%PWaveDynP0 (0:InitOut%NStepWave,InitInp%NWaveKin ), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveDynP0.', ErrStat,ErrMsg,'VariousWaves_Init') + ! + !ALLOCATE ( InitOut%PWaveVel0 (0:InitOut%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveVel0.', ErrStat,ErrMsg,'VariousWaves_Init') + ! + !ALLOCATE ( InitOut%PWaveAcc0 (0:InitOut%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) + !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%PWaveAcc0.', ErrStat,ErrMsg,'VariousWaves_Init') +! END TODO SECTION ALLOCATE ( InitOut%nodeInWater(0:InitOut%NStepWave,InitInp%NWaveKin ) , STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%nodeInWater.', ErrStat,ErrMsg,'VariousWaves_Init') @@ -1764,16 +1777,18 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) END IF ! We'll need the following for wave stretching once we implement it. - CALL ApplyFFT_cx ( InitOut%WaveElev0 (0:InitOut%NStepWave-1), tmpComplexArr (: ), FFT_Data, ErrStatTmp ) - CALL SetErrStat(ErrStatTmp,'Error occured while applying the FFT to WaveElev0.',ErrStat,ErrMsg,'VariousWaves_Init') - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - DO J = 1,InitInp%NWaveElev ! Loop through all points where the incident wave elevations can be output + ! CALL ApplyFFT_cx ( InitOut%WaveElev0 (0:InitOut%NStepWave-1), tmpComplexArr (: ), FFT_Data, ErrStatTmp ) + !CALL SetErrStat(ErrStatTmp,'Error occured while applying the FFT to WaveElev0.',ErrStat,ErrMsg,'VariousWaves_Init') + !IF ( ErrStat >= AbortErrLev ) THEN + ! CALL CleanUp() + ! RETURN + !END IF +!TODO: FIX ME For generating grid elevations + DO k = 1,InitInp%NWaveElev ! Loop through all points where the incident wave elevations are to be computed (normally all the XY grid points) ! This subroutine call applies the FFT at the correct location. - CALL WaveElevTimeSeriesAtXY( InitInp%WaveElevxi(J), InitInp%WaveElevyi(J), InitOut%WaveElev(:,J), ErrStatTmp, ErrMsgTmp ) + i = mod(k-1, InitInp%NGrid(1)) + 1 + j = (k-1) / InitInp%NGrid(2) + 1 + CALL WaveElevTimeSeriesAtXY( InitInp%WaveElevxi(k), InitInp%WaveElevyi(k), InitOut%WaveElev(:,i,j), ErrStatTmp, ErrMsgTmp ) CALL SetErrStat(ErrStatTmp,'Error occured while applying the FFT to InitOut%WaveElev.',ErrStat,ErrMsg,'VariousWaves_Init') IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -1782,28 +1797,6 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) END DO ! J - All points where the incident wave elevations can be output - ! For creating animations of the sea surface, the WaveElevXY array is passed in with a series of x,y coordinates - ! (index 1). The second index corresponds to the number of points passed in. A two dimensional time series - ! is created with the first index corresponding to the timestep, and second index corresponding to the second - ! index of the WaveElevXY array. - IF ( ALLOCATED(InitInp%WaveElevXY)) THEN - ALLOCATE ( InitOut%WaveElevSeries (0:InitOut%NStepWave, 1:SIZE(InitInp%WaveElevXY, DIM=2)) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) THEN - CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElevSeries.',ErrStat,ErrMsg,'VariousWaves_Init') - CALL CleanUp() - RETURN - END IF - ! Calculate the wave elevation at all points requested in the array WaveElevXY - DO J = 1,SIZE(InitInp%WaveElevXY, DIM=2) - ! This subroutine call applies the FFT at the correct location. - CALL WaveElevTimeSeriesAtXY( InitInp%WaveElevXY(1,J), InitInp%WaveElevXY(2,J), InitOut%WaveElevSeries(0:InitOut%NStepWave,J), ErrStatTmp, ErrMsgTmp ) - CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,'VariousWaves_Init') - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - ENDDO - ENDIF ! User requested data points -- Do all the FFT calls first, then return if something failed. @@ -1922,34 +1915,47 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) ! the mean sea level are left unchanged; below the seabed or above the ! mean sea level, the wave kinematics are zero: - InitOut%PWaveDynP0(:,:) = 0.0 - InitOut%PWaveVel0 (:,:,:) = 0.0 - InitOut%PWaveAcc0 (:,:,:) = 0.0 - K = 1 - DO J = 1,InitInp%NWaveKin ! Loop through all points where the incident wave kinematics will be computed - - IF ( ( InitInp%WaveKinzi(J) < -InitInp%WtrDpth ) .OR. ( InitInp%WaveKinzi(J) > 0.0 ) ) THEN - ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above mean sea level (exclusive) - ! NOTE: We test to 0 instead of MSL2SWL because the locations of WaveKinzi and WtrDpth have already been adjusted using MSL2SWL - - InitOut%WaveDynP(:,J ) = 0.0 - InitOut%WaveVel (:,J,:) = 0.0 - InitOut%WaveAcc (:,J,:) = 0.0 - - ELSE - ! The elevation of the point defined by WaveKinzi(J) must lie between the seabed and the mean sea level (inclusive) - - InitOut%WaveDynP(0:InitOut%NStepWave-1,J ) = WaveDynP0B( 0:InitOut%NStepWave-1,K) - InitOut%WaveVel (0:InitOut%NStepWave-1,J,1) = WaveVel0Hxi(0:InitOut%NStepWave-1,K) - InitOut%WaveVel (0:InitOut%NStepWave-1,J,2) = WaveVel0Hyi(0:InitOut%NStepWave-1,K) - InitOut%WaveVel (0:InitOut%NStepWave-1,J,3) = WaveVel0V( 0:InitOut%NStepWave-1,K) - InitOut%WaveAcc (0:InitOut%NStepWave-1,J,1) = WaveAcc0Hxi(0:InitOut%NStepWave-1,K) - InitOut%WaveAcc (0:InitOut%NStepWave-1,J,2) = WaveAcc0Hyi(0:InitOut%NStepWave-1,K) - InitOut%WaveAcc (0:InitOut%NStepWave-1,J,3) = WaveAcc0V( 0:InitOut%NStepWave-1,K) - K = K + 1 - END IF - - END DO ! J - All points where the incident wave kinematics will be computed + ! InitOut%PWaveDynP0(:,:,:,:) = 0.0 + ! InitOut%PWaveVel0 (:,:,:,:,:) = 0.0 + ! InitOut%PWaveAcc0 (:,:,:,:,:) = 0.0 + + primeCount = 1 + count = 1 + !DO J = 1,InitInp%NWaveKin ! Loop through all points where the incident wave kinematics will be computed + do k = 1, InitInp%NGrid(3) + do j = 1, InitInp%NGrid(2) + do i = 1, InitInp%NGrid(1) + + ! ii = mod(count-1, InitInp%NGrid(1)) + 1 + ! jj = mod( (count-1) /InitInp%NGrid(1), InitInp%NGrid(2) ) + 1 + ! kk = (count-1) / (InitInp%NGrid(1)*InitInp%NGrid(2)) + 1 + + IF ( ( InitInp%WaveKinzi(count) < -InitInp%WtrDpth ) .OR. ( InitInp%WaveKinzi(count) > 0.0 ) ) THEN + ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above mean sea level (exclusive) + ! NOTE: We test to 0 instead of MSL2SWL because the locations of WaveKinzi and WtrDpth have already been adjusted using MSL2SWL + + InitOut%WaveDynP(:,i,j,k ) = 0.0 + InitOut%WaveVel (:,i,j,k,:) = 0.0 + InitOut%WaveAcc (:,i,j,k,:) = 0.0 + + ELSE + ! The elevation of the point defined by WaveKinzi(J) must lie between the seabed and the mean sea level (inclusive) + + InitOut%WaveDynP(0:InitOut%NStepWave-1,i,j,k ) = WaveDynP0B( 0:InitOut%NStepWave-1,primeCount) + InitOut%WaveVel (0:InitOut%NStepWave-1,i,j,k,1) = WaveVel0Hxi(0:InitOut%NStepWave-1,primeCount) + InitOut%WaveVel (0:InitOut%NStepWave-1,i,j,k,2) = WaveVel0Hyi(0:InitOut%NStepWave-1,primeCount) + InitOut%WaveVel (0:InitOut%NStepWave-1,i,j,k,3) = WaveVel0V( 0:InitOut%NStepWave-1,primeCount) + InitOut%WaveAcc (0:InitOut%NStepWave-1,i,j,k,1) = WaveAcc0Hxi(0:InitOut%NStepWave-1,primeCount) + InitOut%WaveAcc (0:InitOut%NStepWave-1,i,j,k,2) = WaveAcc0Hyi(0:InitOut%NStepWave-1,primeCount) + InitOut%WaveAcc (0:InitOut%NStepWave-1,i,j,k,3) = WaveAcc0V( 0:InitOut%NStepWave-1,primeCount) + primeCount = primeCount + 1 + END IF + count = count + 1 + end do + end do + end do + + ! END DO ! J - All points where the incident wave kinematics will be computed ! CASE ( 1 ) ! Vertical stretching. @@ -1998,13 +2004,13 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) ! ENDSELECT ! Set the ending timestep to the same as the first timestep - InitOut%WaveDynP(InitOut%NStepWave,: ) = InitOut%WaveDynP(0,: ) - InitOut%WaveVel (InitOut%NStepWave,:,:) = InitOut%WaveVel (0,:,:) - InitOut%WaveAcc (InitOut%NStepWave,:,:) = InitOut%WaveAcc (0,:,:) - InitOut%PWaveDynP0(InitOut%NStepWave,: ) = InitOut%PWaveDynP0(0,: ) - InitOut%PWaveVel0 (InitOut%NStepWave,:,:) = InitOut%PWaveVel0 (0,:,:) - InitOut%PWaveAcc0 (InitOut%NStepWave,:,:) = InitOut%PWaveAcc0 (0,:,:) - InitOut%WaveElev0 (InitOut%NStepWave) = InitOut%WaveElev0 (0 ) + InitOut%WaveDynP(InitOut%NStepWave,:,:,: ) = InitOut%WaveDynP(0,:,:,: ) + InitOut%WaveVel (InitOut%NStepWave,:,:,:,:) = InitOut%WaveVel (0,:,:,:,:) + InitOut%WaveAcc (InitOut%NStepWave,:,:,:,:) = InitOut%WaveAcc (0,:,:,:,:) + ! InitOut%PWaveDynP0(InitOut%NStepWave,:,:,: ) = InitOut%PWaveDynP0(0,:,:,: ) + ! InitOut%PWaveVel0 (InitOut%NStepWave,:,:,:,:) = InitOut%PWaveVel0 (0,:,:,:,:) + ! InitOut%PWaveAcc0 (InitOut%NStepWave,:,:,:,:) = InitOut%PWaveAcc0 (0,:,:,:,:) + ! InitOut%WaveElev0 (InitOut%NStepWave) = InitOut%WaveElev0 (0 ) @@ -2041,7 +2047,7 @@ SUBROUTINE WaveElevTimeSeriesAtXY(Xcoord,Ycoord, WaveElevSeriesAtXY, ErrStatLcl, ENDDO CALL ApplyFFT_cx ( WaveElevSeriesAtXY(0:InitOut%NStepWave-1), tmpComplexArr, FFT_Data, ErrStatLcl2 ) - CALL SetErrStat(ErrStatLcl2,'Error occured while applying the FFT to InitOut%WaveElevSeries.',ErrStatLcl,ErrMsgLcl,'WaveElevTimeSeriesAtXY') + CALL SetErrStat(ErrStatLcl2,'Error occured while applying the FFT to InitOut%WaveElev.',ErrStatLcl,ErrMsgLcl,'WaveElevTimeSeriesAtXY') ! Append first datpoint as the last as aid for repeated wave data WaveElevSeriesAtXY(InitOut%NStepWave) = WaveElevSeriesAtXY(0) @@ -2173,6 +2179,7 @@ SUBROUTINE Waves_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init InitOut%WaveDir = InitInp%WaveDir ! Not sure why there are so many copies of this variable, but InitOut%WaveDir must be set, and isn't in all cases otherwise. + ! Initialize the variables associated with the incident wave: SELECT CASE ( InitInp%WaveMod ) ! Which incident wave kinematics model are we using? diff --git a/modules/seastate/src/Waves.txt b/modules/seastate/src/Waves.txt index bf66a4742a..53bc5bd26a 100644 --- a/modules/seastate/src/Waves.txt +++ b/modules/seastate/src/Waves.txt @@ -25,6 +25,7 @@ typedef ^ ^ LOGICAL WriteWvKin typedef ^ ^ INTEGER UnSum - - - "The unit number for the HydroDyn summary file" - typedef ^ ^ ReKi Gravity - - - "Gravitational acceleration" (m/s^2) typedef ^ ^ ReKi MSL2SWL - - - "Offset between still-water level and mean sea level [positive upward; must be zero if using WAMIT]" (meters) +typedef ^ ^ integer nGrid 3 - - "Grid dimensions" typedef ^ ^ SiKi WvLowCOff - - - "Low cut-off frequency or lower frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4]" (rad/s) typedef ^ ^ SiKi WvHiCOff - - - "High cut-off frequency or upper frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4]" (rad/s) typedef ^ ^ SiKi WaveDir - - - "Mean incident wave propagation heading direction" (degrees) @@ -47,14 +48,14 @@ typedef ^ ^ DbKi WaveTMax typedef ^ ^ SiKi WaveTp - - - "Peak spectral period of incident waves" (sec) typedef ^ ^ ReKi WtrDens - - - "Water density" (kg/m^3) typedef ^ ^ SiKi WtrDpth - - - "Water depth" (meters) -typedef ^ ^ INTEGER NWaveElev - - - "Number of points where the incident wave elevations can be output" - +typedef ^ ^ INTEGER NWaveElev - - - "Number of points where the incident wave elevations are computed (the XY grid point locations)" - typedef ^ ^ SiKi WaveElevxi {:} - - "xi-coordinates for points where the incident wave elevations can be output" (meters) typedef ^ ^ SiKi WaveElevyi {:} - - "yi-coordinates for points where the incident wave elevations can be output" (meters) -typedef ^ ^ SiKi WaveElevXY {:}{:} - - "Supplied by Driver: X-Y locations for WaveElevation output (for visualization). Index 1 corresponds to X or Y coordinate. Index 2 corresponds to point number." - +#typedef ^ ^ SiKi WaveElevXY {:}{:} - - "Supplied by Driver: X-Y locations for WaveElevation output (for visualization). Index 1 corresponds to X or Y coordinate. Index 2 corresponds to point number." - typedef ^ ^ INTEGER NWaveKin - - - "Number of points where the incident wave kinematics will be computed" - -typedef ^ ^ SiKi WaveKinxi {:} - - "xi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level" (meters) -typedef ^ ^ SiKi WaveKinyi {:} - - "yi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level" (meters) -typedef ^ ^ SiKi WaveKinzi {:} - - "zi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level" (meters) +typedef ^ ^ SiKi WaveKinxi {:} - - "xi-coordinates for points where the incident wave kinematics will be computed (grid points); these are relative to the mean sea level" (meters) +typedef ^ ^ SiKi WaveKinyi {:} - - "yi-coordinates for points where the incident wave kinematics will be computed (grid points); these are relative to the mean sea level" (meters) +typedef ^ ^ SiKi WaveKinzi {:} - - "zi-coordinates for points where the incident wave kinematics will be computed (grid points); these are relative to the mean sea level" (meters) typedef ^ ^ SiKi CurrVxi {:} - - "xi-component of the current velocity at elevation i" (m/s) typedef ^ ^ SiKi CurrVyi {:} - - "yi-component of the current velocity at elevation i" (m/s) typedef ^ ^ SiKi PCurrVxiPz0 - - - "xi-component of the partial derivative of the current velocity at elevation near mean sea level" (m/s) @@ -64,8 +65,8 @@ typedef ^ ^ NWTC_RandomNumber_ParameterType R # Define outputs from the initialization routine here: # -typedef ^ InitOutputType SiKi WaveElevC0 {:}{:} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) -typedef ^ ^ SiKi WaveDirArr {:} - - "Wave direction array. Each frequency has a unique direction of WaveNDir > 1" (degrees) +typedef ^ InitOutputType SiKi WaveElevC0 {*}{*} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) +typedef ^ ^ SiKi WaveDirArr {*} - - "Wave direction array. Each frequency has a unique direction of WaveNDir > 1" (degrees) typedef ^ ^ SiKi WaveDirMin - - - "Minimum wave direction." (degrees) typedef ^ ^ SiKi WaveDirMax - - - "Maximum wave direction." (degrees) typedef ^ ^ SiKi WaveDir - - - "Incident wave propagation heading direction" (degrees) @@ -73,18 +74,15 @@ typedef ^ ^ INTEGER WaveNDir typedef ^ ^ LOGICAL WaveMultiDir - - - "Indicates the waves are multidirectional -- set by HydroDyn_Input" - typedef ^ ^ SiKi WaveDOmega - - - "Frequency step for incident wave calculations" (rad/s) typedef ^ ^ SiKi WaveKinzi {:} - - "zi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean see level" (meters) -typedef ^ ^ SiKi PWaveDynP0 {:}{:} - - "Instantaneous dynamic pressure of incident waves , at the location (xi,yi,0), at each of the NWaveKin points where the incident wave kinematics will be computed" (N/m^2) -typedef ^ ^ SiKi WaveDynP {:}{:} - - "Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed" (N/m^2) -typedef ^ ^ SiKi WaveAcc {:}{:}{:} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed" (m/s^2) -typedef ^ ^ SiKi PWaveAcc0 {:}{:}{:} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin points where the incident wave kinematics will be computed" (m/s^2) -typedef ^ ^ SiKi WaveVel {:}{:}{:} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) -typedef ^ ^ SiKi PWaveVel0 {:}{:}{:} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) -typedef ^ ^ SiKi WaveElev {:}{:} - - "Instantaneous elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output" (meters) -typedef ^ ^ SiKi WaveElev0 {:} - - "Instantaneous elevation time-series of incident waves at the platform reference point" (meters) - -typedef ^ ^ SiKi WaveElevSeries {:}{:} - - "Instantaneous elevation time-series at each of the points given by WaveElevXY. Used for making movies of the waves. First index is the timestep. Second index is XY point number corresponding to second index of WaveElevXY." (m) - -typedef ^ ^ SiKi WaveTime {:} - - "Simulation times at which the instantaneous elevation of, velocity of, acceleration of, and loads associated with the incident waves are determined" (sec) +typedef ^ ^ SiKi WaveDynP {*}{*}{*}{*} - - "Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (N/m^2) +typedef ^ ^ SiKi WaveAcc {*}{*}{*}{*}{*} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (m/s^2) +typedef ^ ^ SiKi WaveVel {*}{*}{*}{*}{*} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) +#typedef ^ ^ SiKi PWaveDynP0 {*}{*}{*}{*} - - "Instantaneous dynamic pressure of incident waves , at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (N/m^2) +#typedef ^ ^ SiKi PWaveAcc0 {*}{*}{*}{*}{*} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (m/s^2) +#typedef ^ ^ SiKi PWaveVel0 {*}{*}{*}{*}{*} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) +typedef ^ ^ SiKi WaveElev {*}{*}{*} - - "Instantaneous elevation time-series of incident waves at each of the XY grid points" (meters) +#typedef ^ ^ SiKi WaveElev0 {*} - - "Instantaneous elevation time-series of incident waves at the platform reference point" (meters) +typedef ^ ^ SiKi WaveTime {*} - - "Simulation times at which the instantaneous elevation of, velocity of, acceleration of, and loads associated with the incident waves are determined" (sec) typedef ^ ^ DbKi WaveTMax - - - "Analysis time for incident wave calculations; the actual analysis time may be larger than this value in order for the maintain an effecient FFT" (sec) typedef ^ ^ INTEGER nodeInWater {:}{:} - - "Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated" - typedef ^ ^ SiKi RhoXg - - - "= WtrDens*Gravity" - diff --git a/modules/seastate/src/Waves2.f90 b/modules/seastate/src/Waves2.f90 index 743e87708f..36a19e7be9 100644 --- a/modules/seastate/src/Waves2.f90 +++ b/modules/seastate/src/Waves2.f90 @@ -33,8 +33,6 @@ MODULE Waves2 !! USE Waves2_Types -! USE WAMIT_Interp - USE Waves2_Output USE NWTC_Library USE NWTC_FFTPACK USE Waves, ONLY : WaveNumber @@ -91,8 +89,9 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, ! Local Variables COMPLEX(SiKi) :: ImagNmbr = (0.0,1.0) !< The imaginary number, \f$ \sqrt{-1.0} \f$ - INTEGER(IntKi) :: I !< Generic counter - INTEGER(IntKi) :: J !< Generic counter + INTEGER(IntKi) :: I,ii !< Generic counters + INTEGER(IntKi) :: J, jj,k,kk !< Generic counters + integer(IntKi) :: masterCount !< Counter from 1 to NWaveKin INTEGER(IntKi) :: n !< Generic counter for calculations INTEGER(IntKi) :: m !< Generic counter for calculations INTEGER(IntKi) :: mu_minus !< Generic counter for difference kinematics calculations @@ -314,9 +313,7 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, ! Allocate array for the WaveTime information -- array of times to generate output for. NOTE: can't use MOVE_ALLOC since InitInp is intent in. - CALL AllocAry( p%WaveTime, SIZE(InitInp%WaveTime,DIM=1), 'array to hold WaveTime', ErrStatTmp, ErrMsgTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveTime.',ErrStat,ErrMsg,'Waves2_Init') - p%WaveTime = InitInp%WaveTime + ! Difference QTF p%WvDiffQTFF = InitInp%WvDiffQTFF ! Flag for calculation @@ -325,19 +322,6 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, p%WvSumQTFF = InitInp%WvSumQTFF ! Flag for calculation - ! Initialize the channel outputs - p%NumOuts = InitInp%NumOuts - p%NumOutAll = InitInp%NumOutAll - - CALL Wvs2OUT_Init( InitInp, y, p, InitOut, ErrStatTmp, ErrMsgTmp ) - CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'Waves2_Init') - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp - RETURN - END IF - - - ! The wave elevation information in frequency space -- we need to normalize this by NStepWave2 ALLOCATE ( WaveElevC0Norm(0:InitInp%NStepWave2) , STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveElevC0Norm.',ErrStat,ErrMsg,'Waves2_Init') @@ -437,26 +421,26 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, ! Setup the output arrays !-------------------------------------------------------------------------------- - - ALLOCATE ( p%WaveElev2 (0:InitInp%NStepWave,InitInp%NWaveElev ), STAT=ErrStatTmp ) + ALLOCATE ( p%WaveElev2 (0:InitInp%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2) ) , STAT=ErrStatTmp ) + ! ALLOCATE ( p%WaveElev2 (0:InitInp%NStepWave,InitInp%NWaveElev ), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array p%WaveElev2.', ErrStat,ErrMsg,'Waves2_Init') - ALLOCATE ( InitOut%WaveVel2D (0:InitInp%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) + ALLOCATE ( InitOut%WaveVel2D (0:InitInp%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveVel2D.', ErrStat,ErrMsg,'Waves2_Init') - - ALLOCATE ( InitOut%WaveAcc2D (0:InitInp%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) + + ALLOCATE ( InitOut%WaveAcc2D (0:InitInp%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveAcc2D.', ErrStat,ErrMsg,'Waves2_Init') - - ALLOCATE ( InitOut%WaveDynP2D (0:InitInp%NStepWave,InitInp%NWaveKin ), STAT=ErrStatTmp ) + + ALLOCATE ( InitOut%WaveDynP2D (0:InitInp%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3) ), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveDynP2D.', ErrStat,ErrMsg,'Waves2_Init') - - ALLOCATE ( InitOut%WaveVel2S (0:InitInp%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) + + ALLOCATE ( InitOut%WaveVel2S (0:InitInp%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveVel2S.', ErrStat,ErrMsg,'Waves2_Init') - - ALLOCATE ( InitOut%WaveAcc2S (0:InitInp%NStepWave,InitInp%NWaveKin,3), STAT=ErrStatTmp ) + + ALLOCATE ( InitOut%WaveAcc2S (0:InitInp%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveAcc2S.', ErrStat,ErrMsg,'Waves2_Init') - - ALLOCATE ( InitOut%WaveDynP2S (0:InitInp%NStepWave,InitInp%NWaveKin ), STAT=ErrStatTmp ) + + ALLOCATE ( InitOut%WaveDynP2S (0:InitInp%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3) ), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveDynP2S.', ErrStat,ErrMsg,'Waves2_Init') ! Now check if all the allocations worked properly @@ -477,19 +461,6 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, - ! For creating animations of the sea surface, the WaveElevXY array is passed in with a series of x,y coordinates - ! (index 1). The second index corresponds to the number of points passed in. A two dimensional time series - ! is created with the first index corresponding to the timestep, and second index corresponding to the second - ! index of the WaveElevXY array. - IF ( ALLOCATED(InitInp%WaveElevXY)) THEN - ALLOCATE ( InitOut%WaveElevSeries2 (0:InitInp%NStepWave, 1:SIZE(InitInp%WaveElevXY, DIM=2)) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) THEN - CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElevSeries2.',ErrStat,ErrMsg,'Waves2_Init') - CALL CleanUp() - RETURN - END IF - ENDIF - ! For calculating the 2nd-order wave elevation corrections, we need a temporary array to hold the information. ALLOCATE ( TmpTimeSeries(0:InitInp%NStepWave), STAT=ErrStatTmp ) @@ -605,32 +576,20 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, !-------------------------------------------------------------------------------- ! Step through the requested points - DO I=1,InitInp%NWaveElev - CALL WaveElevTimeSeriesAtXY_Diff(InitInp%WaveElevxi(I), InitInp%WaveElevyi(I), TmpTimeSeries, ErrStatTmp, ErrMsgTmp ) + DO k = 1,InitInp%NWaveElev ! Loop through all points where the incident wave elevations are to be computed (normally all the XY grid points) + ! This subroutine call applies the FFT at the correct location. + i = mod(k-1, InitInp%NGrid(1)) + 1 + j = (k-1) / InitInp%NGrid(2) + 1 + CALL WaveElevTimeSeriesAtXY_Diff(InitInp%WaveElevxi(k), InitInp%WaveElevyi(k), TmpTimeSeries, ErrStatTmp, ErrMsgTmp ) CALL SetErrStat(ErrStatTmp,'Error occured while applying the FFT to InitOut%WaveElev.',ErrStat,ErrMsg,'Waves2_Init') IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() RETURN END IF - p%WaveElev2(:,I) = TmpTimeSeries(:) + p%WaveElev2(:,I,J) = TmpTimeSeries(:) ENDDO ! Wave elevation points requested - ! Calculate the wave elevation at all points requested in the array WaveElevXY - IF ( ALLOCATED(InitInp%WaveElevXY) ) THEN - DO I = 1,SIZE(InitInp%WaveElevXY, DIM=2) - ! This subroutine call applies the FFT at the correct location. - CALL WaveElevTimeSeriesAtXY_Diff( InitInp%WaveElevXY(1,I), InitInp%WaveElevXY(2,I), TmpTimeSeries, ErrStatTmp, ErrMsgTmp ) - CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,'Waves2_Init') - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - InitOut%WaveElevSeries2(:,I) = TmpTimeSeries(:) - ENDDO - ENDIF - - !-------------------------------------------------------------------------------- !> ## Calculate the second order velocity, acceleration, and pressure corrections for all joints below surface. ## @@ -639,7 +598,7 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, ! NWaveKin0Prime loop start DO I=1,NWaveKin0Prime - + masterCount = WaveKinPrimeMap(I) ! Reset the \f$ H_{\mu^-} \f$ terms to zero before calculating. WaveVel2xCDiff = CMPLX(0.0_SiKi, 0.0_SiKi, SiKi) @@ -683,8 +642,8 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, !! + \left( |\vec{k_n}| \sin \theta_n - |\vec{k_m}| sin \theta_m \right) ~ y \right] \right) \f$ WaveElevxyPrime0 = exp( - ImagNmbr & - * ( ( k_n * COS( D2R_S*InitInp%WaveDirArr(n) ) - k_m * COS( D2R_S*InitInp%WaveDirArr(m) ) ) * InitInp%WaveKinxi(WaveKinPrimeMap(I)) & - + ( k_n * SIN( D2R_S*InitInp%WaveDirArr(n) ) - k_m * SIN( D2R_S*InitInp%WaveDirArr(m) ) ) * InitInp%WaveKinyi(WaveKinPrimeMap(I)) )) + * ( ( k_n * COS( D2R_S*InitInp%WaveDirArr(n) ) - k_m * COS( D2R_S*InitInp%WaveDirArr(m) ) ) * InitInp%WaveKinxi(masterCount) & + + ( k_n * SIN( D2R_S*InitInp%WaveDirArr(n) ) - k_m * SIN( D2R_S*InitInp%WaveDirArr(m) ) ) * InitInp%WaveKinyi(masterCount) )) ! Get value for \f$ B^- \f$ for the n,m index pair @@ -791,32 +750,37 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, ! Copy the results to the output - InitOut%WaveVel2D(:,WaveKinPrimeMap(I),1) = 2.0_SiKi * WaveVel2xDiff(:) ! x-component of velocity - InitOut%WaveVel2D(:,WaveKinPrimeMap(I),2) = 2.0_SiKi * WaveVel2yDiff(:) ! y-component of velocity - InitOut%WaveVel2D(:,WaveKinPrimeMap(I),3) = 2.0_SiKi * WaveVel2zDiff(:) ! z-component of velocity + ii = mod(masterCount-1, InitInp%NGrid(1)) + 1 + jj = mod( (masterCount-1) /InitInp%NGrid(1), InitInp%NGrid(2) ) + 1 + kk = (masterCount-1) / (InitInp%NGrid(1)*InitInp%NGrid(2)) + 1 + + InitOut%WaveVel2D(:,ii,jj,kk,1) = 2.0_SiKi * WaveVel2xDiff(:) ! x-component of velocity + InitOut%WaveVel2D(:,ii,jj,kk,2) = 2.0_SiKi * WaveVel2yDiff(:) ! y-component of velocity + InitOut%WaveVel2D(:,ii,jj,kk,3) = 2.0_SiKi * WaveVel2zDiff(:) ! z-component of velocity - InitOut%WaveAcc2D(:,WaveKinPrimeMap(I),1) = 2.0_SiKi * WaveAcc2xDiff(:) ! x-component of acceleration - InitOut%WaveAcc2D(:,WaveKinPrimeMap(I),2) = 2.0_SiKi * WaveAcc2yDiff(:) ! y-component of acceleration - InitOut%WaveAcc2D(:,WaveKinPrimeMap(I),3) = 2.0_SiKi * WaveAcc2zDiff(:) ! z-component of acceleration + InitOut%WaveAcc2D(:,ii,jj,kk,1) = 2.0_SiKi * WaveAcc2xDiff(:) ! x-component of acceleration + InitOut%WaveAcc2D(:,ii,jj,kk,2) = 2.0_SiKi * WaveAcc2yDiff(:) ! y-component of acceleration + InitOut%WaveAcc2D(:,ii,jj,kk,3) = 2.0_SiKi * WaveAcc2zDiff(:) ! z-component of acceleration - InitOut%WaveDynP2D(:,WaveKinPrimeMap(I)) = 2.0_SiKi * WaveDynP2Diff(:) ! Dynamic pressure + InitOut%WaveDynP2D(:,ii,jj,kk) = 2.0_SiKi * WaveDynP2Diff(:) ! Dynamic pressure ! Copy the first point to the last to make it easier. - InitOut%WaveVel2D(InitInp%NStepWave,WaveKinPrimeMap(I),1) = WaveVel2xDiff(0) - InitOut%WaveVel2D(InitInp%NStepWave,WaveKinPrimeMap(I),2) = WaveVel2yDiff(0) - InitOut%WaveVel2D(InitInp%NStepWave,WaveKinPrimeMap(I),3) = WaveVel2zDiff(0) + ! TODO: Why don't these have the 2.0 multipler?? GJH 9/8/21 + InitOut%WaveVel2D(InitInp%NStepWave,ii,jj,kk,1) = WaveVel2xDiff(0) + InitOut%WaveVel2D(InitInp%NStepWave,ii,jj,kk,2) = WaveVel2yDiff(0) + InitOut%WaveVel2D(InitInp%NStepWave,ii,jj,kk,3) = WaveVel2zDiff(0) - InitOut%WaveAcc2D(InitInp%NStepWave,WaveKinPrimeMap(I),1) = WaveAcc2xDiff(0) - InitOut%WaveAcc2D(InitInp%NStepWave,WaveKinPrimeMap(I),2) = WaveAcc2yDiff(0) - InitOut%WaveAcc2D(InitInp%NStepWave,WaveKinPrimeMap(I),3) = WaveAcc2zDiff(0) + InitOut%WaveAcc2D(InitInp%NStepWave,ii,jj,kk,1) = WaveAcc2xDiff(0) + InitOut%WaveAcc2D(InitInp%NStepWave,ii,jj,kk,2) = WaveAcc2yDiff(0) + InitOut%WaveAcc2D(InitInp%NStepWave,ii,jj,kk,3) = WaveAcc2zDiff(0) - InitOut%WaveDynP2D(InitInp%NStepWave,WaveKinPrimeMap(I)) = WaveDynP2Diff(0) + InitOut%WaveDynP2D(InitInp%NStepWave,ii,jj,kk) = WaveDynP2Diff(0) ENDDO ! I=1,NWaveKin0Prime loop end - + ! Deallocate working arrays. IF (ALLOCATED(WaveVel2xCDiff)) DEALLOCATE(WaveVel2xCDiff, STAT=ErrStatTmp) IF (ALLOCATED(WaveVel2yCDiff)) DEALLOCATE(WaveVel2yCDiff, STAT=ErrStatTmp) @@ -974,43 +938,28 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, !! that point. The results are added to the wave elevation results from the diff !! frequency calculations earlier in the code. !-------------------------------------------------------------------------------- - +!TODO: This is all grid points ! Step through the requested points - DO I=1,InitInp%NWaveElev - CALL WaveElevTimeSeriesAtXY_Sum(InitInp%WaveElevxi(I), InitInp%WaveElevyi(I), TmpTimeSeries, ErrStatTmp, ErrMsgTmp ) + DO k = 1,InitInp%NWaveElev ! Loop through all points where the incident wave elevations are to be computed (normally all the XY grid points) + ! This subroutine call applies the FFT at the correct location. + i = mod(k-1, InitInp%NGrid(1)) + 1 + j = (k-1) / InitInp%NGrid(2) + 1 + CALL WaveElevTimeSeriesAtXY_Sum(InitInp%WaveElevxi(k), InitInp%WaveElevyi(k), TmpTimeSeries, ErrStatTmp, ErrMsgTmp ) CALL SetErrStat(ErrStatTmp,'Error occured while applying the FFT to InitOut%WaveElev.',ErrStat,ErrMsg,'Waves2_Init') IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() RETURN END IF ! Add to the series since the difference is already included - p%WaveElev2(:,I) = p%WaveElev2(:,I) + TmpTimeSeries(:) + p%WaveElev2(:,I,J) = p%WaveElev2(:,I,J) + TmpTimeSeries(:) ENDDO ! Wave elevation points requested - - ! Calculate the wave elevation at all points requested in the array WaveElevXY - IF ( ALLOCATED(InitInp%WaveElevXY) ) THEN - DO I = 1,SIZE(InitInp%WaveElevXY, DIM=2) - ! This subroutine call applies the FFT at the correct location. - CALL WaveElevTimeSeriesAtXY_Sum( InitInp%WaveElevXY(1,I), InitInp%WaveElevXY(2,I), TmpTimeSeries, ErrStatTmp, ErrMsgTmp ) - CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,'Waves2_Init') - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - ! Add to the series since the difference is already included - InitOut%WaveElevSeries2(:,I) = InitOut%WaveElevSeries2(:,I) + TmpTimeSeries(:) - ENDDO - ENDIF - - - !-------------------------------------------------------------------------------- !> ## Calculate the second order velocity, acceleration, and pressure corrections for all joints below surface. ## !-------------------------------------------------------------------------------- ! NWaveKin0Prime loop start DO I=1,NWaveKin0Prime - + masterCount = WaveKinPrimeMap(I) ! Reset the \f$ H_{\mu^+} \f$ terms to zero before calculating. WaveVel2xCSumT1 = CMPLX(0.0_SiKi, 0.0_SiKi, SiKi) @@ -1069,8 +1018,8 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, !! + |\vec{k_n}| \sin \theta_n ~ y \right] \right) \f$ WaveElevxyPrime0 = exp( - ImagNmbr & - * ( 2.0_SiKi * k_n * COS( D2R_S*InitInp%WaveDirArr(n) ) * InitInp%WaveKinxi(WaveKinPrimeMap(I)) & - + 2.0_SiKi * k_n * SIN( D2R_S*InitInp%WaveDirArr(n) ) * InitInp%WaveKinyi(WaveKinPrimeMap(I)) )) + * ( 2.0_SiKi * k_n * COS( D2R_S*InitInp%WaveDirArr(n) ) * InitInp%WaveKinxi(masterCount) & + + 2.0_SiKi * k_n * SIN( D2R_S*InitInp%WaveDirArr(n) ) * InitInp%WaveKinyi(masterCount) )) ! Get value for \f$ B+ \f$ for the n,m index pair @@ -1171,8 +1120,8 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, !! + \left( |\vec{k_n}| \sin \theta_n + |\vec{k_m}| sin \theta_m \right) ~ y \right] \right) \f$ WaveElevxyPrime0 = exp( - ImagNmbr & - * ( ( k_n * COS( D2R_S*InitInp%WaveDirArr(n) ) + k_m * COS( D2R_S*InitInp%WaveDirArr(m) ) ) * InitInp%WaveKinxi(WaveKinPrimeMap(I)) & - + ( k_n * SIN( D2R_S*InitInp%WaveDirArr(n) ) + k_m * SIN( D2R_S*InitInp%WaveDirArr(m) ) ) * InitInp%WaveKinyi(WaveKinPrimeMap(I)) )) + * ( ( k_n * COS( D2R_S*InitInp%WaveDirArr(n) ) + k_m * COS( D2R_S*InitInp%WaveDirArr(m) ) ) * InitInp%WaveKinxi(masterCount) & + + ( k_n * SIN( D2R_S*InitInp%WaveDirArr(n) ) + k_m * SIN( D2R_S*InitInp%WaveDirArr(m) ) ) * InitInp%WaveKinyi(masterCount) )) ! Get value for \f$ B+ \f$ for the n,m index pair @@ -1302,21 +1251,25 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, ! Add the results to the output - InitOut%WaveVel2S(:,WaveKinPrimeMap(I),1) = WaveVel2xSumT1(:) + 2.0_SiKi * WaveVel2xSumT2(:) ! x-component of velocity - InitOut%WaveVel2S(:,WaveKinPrimeMap(I),2) = WaveVel2ySumT1(:) + 2.0_SiKi * WaveVel2ySumT2(:) ! y-component of velocity - InitOut%WaveVel2S(:,WaveKinPrimeMap(I),3) = WaveVel2zSumT1(:) + 2.0_SiKi * WaveVel2zSumT2(:) ! z-component of velocity + ii = mod(masterCount-1, InitInp%NGrid(1)) + 1 + jj = mod( (masterCount-1) /InitInp%NGrid(1), InitInp%NGrid(2) ) + 1 + kk = (masterCount-1) / (InitInp%NGrid(1)*InitInp%NGrid(2)) + 1 + + InitOut%WaveVel2S(:,ii,jj,kk,1) = WaveVel2xSumT1(:) + 2.0_SiKi * WaveVel2xSumT2(:) ! x-component of velocity + InitOut%WaveVel2S(:,ii,jj,kk,2) = WaveVel2ySumT1(:) + 2.0_SiKi * WaveVel2ySumT2(:) ! y-component of velocity + InitOut%WaveVel2S(:,ii,jj,kk,3) = WaveVel2zSumT1(:) + 2.0_SiKi * WaveVel2zSumT2(:) ! z-component of velocity - InitOut%WaveAcc2S(:,WaveKinPrimeMap(I),1) = WaveAcc2xSumT1(:) + 2.0_SiKi * WaveAcc2xSumT2(:) ! x-component of acceleration - InitOut%WaveAcc2S(:,WaveKinPrimeMap(I),2) = WaveAcc2ySumT1(:) + 2.0_SiKi * WaveAcc2ySumT2(:) ! y-component of acceleration - InitOut%WaveAcc2S(:,WaveKinPrimeMap(I),3) = WaveAcc2zSumT1(:) + 2.0_SiKi * WaveAcc2zSumT2(:) ! z-component of acceleration + InitOut%WaveAcc2S(:,ii,jj,kk,1) = WaveAcc2xSumT1(:) + 2.0_SiKi * WaveAcc2xSumT2(:) ! x-component of acceleration + InitOut%WaveAcc2S(:,ii,jj,kk,2) = WaveAcc2ySumT1(:) + 2.0_SiKi * WaveAcc2ySumT2(:) ! y-component of acceleration + InitOut%WaveAcc2S(:,ii,jj,kk,3) = WaveAcc2zSumT1(:) + 2.0_SiKi * WaveAcc2zSumT2(:) ! z-component of acceleration - InitOut%WaveDynP2S(:,WaveKinPrimeMap(I)) = WaveDynP2SumT1(:) + 2.0_SiKi * WaveDynP2SumT2(:) ! Dynamic pressure + InitOut%WaveDynP2S(:,ii,jj,kk) = WaveDynP2SumT1(:) + 2.0_SiKi * WaveDynP2SumT2(:) ! Dynamic pressure ! Copy the first point to the last to make it easier. - InitOut%WaveVel2S(InitInp%NStepWave,WaveKinPrimeMap(I),:) = InitOut%WaveVel2S(0,WaveKinPrimeMap(I),:) - InitOut%WaveAcc2S(InitInp%NStepWave,WaveKinPrimeMap(I),:) = InitOut%WaveAcc2S(0,WaveKinPrimeMap(I),:) - InitOut%WaveDynP2S(InitInp%NStepWave,WaveKinPrimeMap(I)) = InitOut%WaveDynP2S(0,WaveKinPrimeMap(I)) + InitOut%WaveVel2S(InitInp%NStepWave,ii,jj,kk,:) = InitOut%WaveVel2S(0,ii,jj,kk,:) + InitOut%WaveAcc2S(InitInp%NStepWave,ii,jj,kk,:) = InitOut%WaveAcc2S(0,ii,jj,kk,:) + InitOut%WaveDynP2S(InitInp%NStepWave,ii,jj,kk) = InitOut%WaveDynP2S(0,ii,jj,kk) ENDDO ! I=1,NWaveKin0Prime loop end @@ -2285,31 +2238,6 @@ SUBROUTINE Waves2_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, E ErrMsg = "" - - - ! Abort if the Waves2 module did not calculate anything - - IF ( .NOT. ALLOCATED ( p%WaveElev2 ) ) RETURN - IF ( p%NumOuts < 1 ) RETURN - - - DO I=1,p%NWaveElev - WaveElev2Temp(I) = InterpWrappedStpReal ( REAL(Time, SiKi), p%WaveTime(:), p%WaveElev2(:,I), & - m%LastIndWave, p%NStepWave + 1 ) - ENDDO - - ! Map the calculated results into the AllOuts Array - CALL Wvs2Out_MapOutputs(Time, y, p%NWaveElev, WaveElev2Temp, AllOuts, ErrStat, ErrMsg) - - - - ! Put the output data in the OutData array - DO I = 1,p%NumOuts - y%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) - END DO - - - END SUBROUTINE Waves2_CalcOutput diff --git a/modules/seastate/src/Waves2.txt b/modules/seastate/src/Waves2.txt index 71aa3c56ad..e185ca0b6c 100644 --- a/modules/seastate/src/Waves2.txt +++ b/modules/seastate/src/Waves2.txt @@ -32,10 +32,11 @@ typedef ^ ^ SiKi WaveDOmega typedef ^ ^ INTEGER WaveStMod - - - "Model for stretching incident wave kinematics to instantaneous free surface {0: none=no stretching, 1: vertical stretching, 2: extrapolation stretching, 3: Wheeler stretching}" - typedef ^ ^ LOGICAL WaveMultiDir - - - "Indicates the waves are multidirectional -- set by HydroDyn_Input" - -typedef ^ ^ SiKi WaveDirArr {:} - - "Wave direction array. Each frequency has a unique direction of WaveNDir > 1" (degrees) -typedef ^ ^ SiKi WaveElevC0 {:}{:} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) -typedef ^ ^ SiKi WaveTime {:} - - "Simulation times at which the instantaneous second order loads associated with the incident waves are determined" sec +typedef ^ ^ SiKi WaveDirArr {*} - - "Wave direction array. Each frequency has a unique direction of WaveNDir > 1" (degrees) +typedef ^ ^ SiKi WaveElevC0 {*}{*} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) +typedef ^ ^ SiKi WaveTime {*} - - "Simulation times at which the instantaneous second order loads associated with the incident waves are determined" sec +typedef ^ ^ integer nGrid 3 - - "Grid dimensions" typedef ^ ^ INTEGER NWaveElev - - - "Number of points where the incident wave elevations can be output" - typedef ^ ^ SiKi WaveElevxi {:} - - "xi-coordinates for points where the incident wave elevations can be output" (meters) typedef ^ ^ SiKi WaveElevyi {:} - - "yi-coordinates for points where the incident wave elevations can be output" (meters) @@ -54,41 +55,40 @@ typedef ^ ^ SiKi WvHiCOffD typedef ^ ^ SiKi WvLowCOffS - - - "Minimum frequency used in the sum-QTF method [Ignored if SumQTF = 0]" (rad/s) typedef ^ ^ SiKi WvHiCOffS - - - "Maximum frequency used in the sum-QTF method [Ignored if SumQTF = 0]" (rad/s) -typedef ^ ^ CHARACTER(ChanLen) OutList {18} - - "This should really be dimensioned with MaxOutPts" - -typedef ^ ^ LOGICAL OutAll - - - "" - -typedef ^ ^ INTEGER NumOuts - - - "" - -typedef ^ ^ INTEGER NumOutAll - - - "" - +#typedef ^ ^ CHARACTER(ChanLen) OutList {18} - - "This should really be dimensioned with MaxOutPts" - +#typedef ^ ^ LOGICAL OutAll - - - "" - +#typedef ^ ^ INTEGER NumOuts - - - "" - +#typedef ^ ^ INTEGER NumOutAll - - - "" - # Define outputs from the initialization routine here: # -typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "" - -typedef ^ ^ CHARACTER(ChanLen) WriteOutputUnt {:} - - "" - -typedef ^ ^ SiKi WaveElevSeries2 {:}{:} - - "" (m) +#typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "" - +#typedef ^ ^ CHARACTER(ChanLen) WriteOutputUnt {:} - - "" - # "Instantaneous elevation time-series at each of the points given by WaveElevXY. Used for making movies of the waves. First index is the timestep. Second index is XY point number corresponding to second index of WaveElevXY." (m) -typedef ^ ^ SiKi WaveAcc2D {:}{:}{:} - - "" (m/s^2) +typedef ^ InitOutputType SiKi WaveAcc2D {:}{:}{:}{:}{:} - - "" (m/s^2) # "Instantaneous 2nd-order difference frequency correction for the acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at each of the NWaveKin points where the incident wave kinematics will be computed" (m/s^2) -typedef ^ ^ SiKi WaveDynP2D {:}{:} - - "" (N/m^2) +typedef ^ ^ SiKi WaveDynP2D {:}{:}{:}{:} - - "" (N/m^2) # "Instantaneous 2nd-order difference frequency correction for the dynamic pressure of incident waves , at each of the NWaveKin points where the incident wave kinematics will be computed" (N/m^2) -typedef ^ ^ SiKi WaveAcc2S {:}{:}{:} - - "" (m/s^2) +typedef ^ ^ SiKi WaveAcc2S {:}{:}{:}{:}{:} - - "" (m/s^2) # "Instantaneous 2nd-order sum frequency correction for the acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at each of the NWaveKin points where the incident wave kinematics will be computed" (m/s^2) -typedef ^ ^ SiKi WaveDynP2S {:}{:} - - "" (N/m^2) +typedef ^ ^ SiKi WaveDynP2S {:}{:}{:}{:} - - "" (N/m^2) # "Instantaneous 2nd-order sum frequency correction for the dynamic pressure of incident waves , at each of the NWaveKin points where the incident wave kinematics will be computed" (N/m^2) -typedef ^ ^ SiKi WaveVel2D {:}{:}{:} - - "" (m/s) +typedef ^ ^ SiKi WaveVel2D {:}{:}{:}{:}{:} - - "" (m/s) # "Instantaneous 2nd-order difference frequency correction for the velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) -typedef ^ ^ SiKi WaveVel2S {:}{:}{:} - - "" (m/s) +typedef ^ ^ SiKi WaveVel2S {:}{:}{:}{:}{:} - - "" (m/s) # "Instantaneous 2nd-order sum frequency correction for the velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) -typedef ^ ^ SiKi WaveAcc2D0 {:}{:}{:} - - "" (m/s^2) +#typedef ^ ^ SiKi WaveAcc2D0 {:}{:}{:}{:}{:} - - "" (m/s^2) # "Instantaneous 2nd-order difference frequency correction for the acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), for each of the NWaveKin points where the incident wave kinematics will be computed" (m/s^2) -typedef ^ ^ SiKi WaveDynP2D0 {:}{:} - - "" (N/m^2) +#typedef ^ ^ SiKi WaveDynP2D0 {:}{:}{:}{:} - - "" (N/m^2) # "Instantaneous 2nd-order difference frequency correction for the dynamic pressure of incident waves , at the location (xi,yi,0), for each of the NWaveKin points where the incident wave kinematics will be computed" (N/m^2) -typedef ^ ^ SiKi WaveAcc2S0 {:}{:}{:} - - "" (m/s^2) +#typedef ^ ^ SiKi WaveAcc2S0 {:}{:}{:}{:}{:} - - "" (m/s^2) # "Instantaneous 2nd-order sum frequency correction for the acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), for each of the NWaveKin points where the incident wave kinematics will be computed" (m/s^2) -typedef ^ ^ SiKi WaveDynP2S0 {:}{:} - - "" (N/m^2) +#typedef ^ ^ SiKi WaveDynP2S0 {:}{:}{:}{:} - - "" (N/m^2) # "Instantaneous 2nd-order sum frequency correction for the dynamic pressure of incident waves , at the location (xi,yi,0), for each of the NWaveKin points where the incident wave kinematics will be computed" (N/m^2) -typedef ^ ^ SiKi WaveVel2D0 {:}{:}{:} - - "" (m/s) +#typedef ^ ^ SiKi WaveVel2D0 {:}{:}{:}{:}{:} - - "" (m/s) # "Instantaneous 2nd-order difference frequency correction for the velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), for each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) -typedef ^ ^ SiKi WaveVel2S0 {:}{:}{:} - - "" (m/s) +#typedef ^ ^ SiKi WaveVel2S0 {:}{:}{:}{:}{:} - - "" (m/s) # "Instantaneous 2nd-order sum frequency correction for the velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), for each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) @@ -126,19 +126,19 @@ typedef ^ ^ LOGICAL WvSumQTFF typedef ^ ^ INTEGER NWaveElev - - - "Number of points where the incident wave elevations can be output" - typedef ^ ^ INTEGER NStepWave - - - "Total number of frequency components = total number of time steps in the incident wave" - typedef ^ ^ INTEGER NStepWave2 - - - "NStepWave / 2" - -typedef ^ ^ SiKi WaveTime {:} - - "Simulation times at which the instantaneous second order loads associated with the incident waves are determined" sec -typedef ^ ^ SiKi WaveElev2 {:}{:} - - "Instantaneous elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output" (meters) -#typedef ^ ^ SiKi WaveElev2D {:}{:} - - "" (m) +#typedef ^ ^ SiKi WaveTime {:} - - "Simulation times at which the instantaneous second order loads associated with the incident waves are determined" sec +typedef ^ ^ SiKi WaveElev2 {:}{:}{:} - - "Instantaneous elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output" (meters) +#typedef ^ ^ SiKi WaveElev2D {:}{:}{:} - - "" (m) # "Instantaneous 2nd-order difference frequency correction for the elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output" (meters) -#typedef ^ ^ SiKi WaveElev2S {:}{:} - - "" (m) +#typedef ^ ^ SiKi WaveElev2S {:}{:}{:} - - "" (m) # "Instantaneous 2nd-order sum frequency correction for the elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output" (meters) -typedef ^ ^ OutParmType OutParam {:} - - "" - -typedef ^ ^ INTEGER NumOuts - - - "" - -typedef ^ ^ INTEGER NumOutAll - - - "" - -typedef ^ ^ CHARACTER(20) OutFmt - - - "" - -typedef ^ ^ CHARACTER(20) OutSFmt - - - "" - -typedef ^ ^ CHARACTER(ChanLen) Delim - - - "" - -typedef ^ ^ INTEGER UnOutFile - - - "" - +#typedef ^ ^ OutParmType OutParam {:} - - "" - +#typedef ^ ^ INTEGER NumOuts - - - "" - +#typedef ^ ^ INTEGER NumOutAll - - - "" - +#typedef ^ ^ CHARACTER(20) OutFmt - - - "" - +#typedef ^ ^ CHARACTER(20) OutSFmt - - - "" - +#typedef ^ ^ CHARACTER(ChanLen) Delim - - - "" - +#typedef ^ ^ INTEGER UnOutFile - - - "" - @@ -151,4 +151,5 @@ typedef ^ InputType SiKi DummyInput # ..... Outputs ................................................................................................................... # Define outputs that are contained on the mesh here: -typedef ^ OutputType ReKi WriteOutput {:} - - "" - +typedef ^ OutputType SiKi DummyOutput - - - "Remove this variable if you have output data" - +#typedef ^ OutputType ReKi WriteOutput {:} - - "" - diff --git a/modules/seastate/src/Waves2_Types.f90 b/modules/seastate/src/Waves2_Types.f90 index affe3fdc41..99bc7eeb53 100644 --- a/modules/seastate/src/Waves2_Types.f90 +++ b/modules/seastate/src/Waves2_Types.f90 @@ -45,9 +45,10 @@ MODULE Waves2_Types REAL(SiKi) :: WaveDOmega !< Frequency step for incident wave calculations [(rad/s)] INTEGER(IntKi) :: WaveStMod !< Model for stretching incident wave kinematics to instantaneous free surface {0: none=no stretching, 1: vertical stretching, 2: extrapolation stretching, 3: Wheeler stretching} [-] LOGICAL :: WaveMultiDir !< Indicates the waves are multidirectional -- set by HydroDyn_Input [-] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveDirArr !< Wave direction array. Each frequency has a unique direction of WaveNDir > 1 [(degrees)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevC0 !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< Simulation times at which the instantaneous second order loads associated with the incident waves are determined [sec] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveDirArr => NULL() !< Wave direction array. Each frequency has a unique direction of WaveNDir > 1 [(degrees)] + REAL(SiKi) , DIMENSION(:,:), POINTER :: WaveElevC0 => NULL() !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Simulation times at which the instantaneous second order loads associated with the incident waves are determined [sec] + INTEGER(IntKi) , DIMENSION(1:3) :: nGrid !< Grid dimensions [-] INTEGER(IntKi) :: NWaveElev !< Number of points where the incident wave elevations can be output [-] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevxi !< xi-coordinates for points where the incident wave elevations can be output [(meters)] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevyi !< yi-coordinates for points where the incident wave elevations can be output [(meters)] @@ -62,29 +63,16 @@ MODULE Waves2_Types REAL(SiKi) :: WvHiCOffD !< Maximum frequency used in the difference methods [Ignored if all difference methods = 0] [(rad/s)] REAL(SiKi) :: WvLowCOffS !< Minimum frequency used in the sum-QTF method [Ignored if SumQTF = 0] [(rad/s)] REAL(SiKi) :: WvHiCOffS !< Maximum frequency used in the sum-QTF method [Ignored if SumQTF = 0] [(rad/s)] - CHARACTER(ChanLen) , DIMENSION(1:18) :: OutList !< This should really be dimensioned with MaxOutPts [-] - LOGICAL :: OutAll !< [-] - INTEGER(IntKi) :: NumOuts !< [-] - INTEGER(IntKi) :: NumOutAll !< [-] END TYPE Waves2_InitInputType ! ======================= ! ========= Waves2_InitOutputType ======= TYPE, PUBLIC :: Waves2_InitOutputType - CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< [-] - CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< [-] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevSeries2 !< [(m)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveAcc2D !< [(m/s^2)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveDynP2D !< [(N/m^2)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveAcc2S !< [(m/s^2)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveDynP2S !< [(N/m^2)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveVel2D !< [(m/s)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveVel2S !< [(m/s)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveAcc2D0 !< [(m/s^2)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveDynP2D0 !< [(N/m^2)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveAcc2S0 !< [(m/s^2)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveDynP2S0 !< [(N/m^2)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveVel2D0 !< [(m/s)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveVel2S0 !< [(m/s)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), ALLOCATABLE :: WaveAcc2D !< [(m/s^2)] + REAL(SiKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: WaveDynP2D !< [(N/m^2)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), ALLOCATABLE :: WaveAcc2S !< [(m/s^2)] + REAL(SiKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: WaveDynP2S !< [(N/m^2)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), ALLOCATABLE :: WaveVel2D !< [(m/s)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), ALLOCATABLE :: WaveVel2S !< [(m/s)] END TYPE Waves2_InitOutputType ! ======================= ! ========= Waves2_ContinuousStateType ======= @@ -120,15 +108,7 @@ MODULE Waves2_Types INTEGER(IntKi) :: NWaveElev !< Number of points where the incident wave elevations can be output [-] INTEGER(IntKi) :: NStepWave !< Total number of frequency components = total number of time steps in the incident wave [-] INTEGER(IntKi) :: NStepWave2 !< NStepWave / 2 [-] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< Simulation times at which the instantaneous second order loads associated with the incident waves are determined [sec] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElev2 !< Instantaneous elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output [(meters)] - TYPE(OutParmType) , DIMENSION(:), ALLOCATABLE :: OutParam !< [-] - INTEGER(IntKi) :: NumOuts !< [-] - INTEGER(IntKi) :: NumOutAll !< [-] - CHARACTER(20) :: OutFmt !< [-] - CHARACTER(20) :: OutSFmt !< [-] - CHARACTER(ChanLen) :: Delim !< [-] - INTEGER(IntKi) :: UnOutFile !< [-] + REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveElev2 !< Instantaneous elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output [(meters)] END TYPE Waves2_ParameterType ! ======================= ! ========= Waves2_InputType ======= @@ -138,7 +118,7 @@ MODULE Waves2_Types ! ======================= ! ========= Waves2_OutputType ======= TYPE, PUBLIC :: Waves2_OutputType - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< [-] + REAL(SiKi) :: DummyOutput !< Remove this variable if you have output data [-] END TYPE Waves2_OutputType ! ======================= CONTAINS @@ -153,6 +133,8 @@ SUBROUTINE Waves2_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_CopyInitInput' @@ -168,10 +150,10 @@ SUBROUTINE Waves2_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E DstInitInputData%WaveDOmega = SrcInitInputData%WaveDOmega DstInitInputData%WaveStMod = SrcInitInputData%WaveStMod DstInitInputData%WaveMultiDir = SrcInitInputData%WaveMultiDir -IF (ALLOCATED(SrcInitInputData%WaveDirArr)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveDirArr)) THEN i1_l = LBOUND(SrcInitInputData%WaveDirArr,1) i1_u = UBOUND(SrcInitInputData%WaveDirArr,1) - IF (.NOT. ALLOCATED(DstInitInputData%WaveDirArr)) THEN + IF (.NOT. ASSOCIATED(DstInitInputData%WaveDirArr)) THEN ALLOCATE(DstInitInputData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) @@ -180,12 +162,12 @@ SUBROUTINE Waves2_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E END IF DstInitInputData%WaveDirArr = SrcInitInputData%WaveDirArr ENDIF -IF (ALLOCATED(SrcInitInputData%WaveElevC0)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveElevC0)) THEN i1_l = LBOUND(SrcInitInputData%WaveElevC0,1) i1_u = UBOUND(SrcInitInputData%WaveElevC0,1) i2_l = LBOUND(SrcInitInputData%WaveElevC0,2) i2_u = UBOUND(SrcInitInputData%WaveElevC0,2) - IF (.NOT. ALLOCATED(DstInitInputData%WaveElevC0)) THEN + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElevC0)) THEN ALLOCATE(DstInitInputData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) @@ -194,10 +176,10 @@ SUBROUTINE Waves2_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E END IF DstInitInputData%WaveElevC0 = SrcInitInputData%WaveElevC0 ENDIF -IF (ALLOCATED(SrcInitInputData%WaveTime)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveTime)) THEN i1_l = LBOUND(SrcInitInputData%WaveTime,1) i1_u = UBOUND(SrcInitInputData%WaveTime,1) - IF (.NOT. ALLOCATED(DstInitInputData%WaveTime)) THEN + IF (.NOT. ASSOCIATED(DstInitInputData%WaveTime)) THEN ALLOCATE(DstInitInputData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -206,6 +188,7 @@ SUBROUTINE Waves2_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E END IF DstInitInputData%WaveTime = SrcInitInputData%WaveTime ENDIF + DstInitInputData%nGrid = SrcInitInputData%nGrid DstInitInputData%NWaveElev = SrcInitInputData%NWaveElev IF (ALLOCATED(SrcInitInputData%WaveElevxi)) THEN i1_l = LBOUND(SrcInitInputData%WaveElevxi,1) @@ -288,10 +271,6 @@ SUBROUTINE Waves2_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E DstInitInputData%WvHiCOffD = SrcInitInputData%WvHiCOffD DstInitInputData%WvLowCOffS = SrcInitInputData%WvLowCOffS DstInitInputData%WvHiCOffS = SrcInitInputData%WvHiCOffS - DstInitInputData%OutList = SrcInitInputData%OutList - DstInitInputData%OutAll = SrcInitInputData%OutAll - DstInitInputData%NumOuts = SrcInitInputData%NumOuts - DstInitInputData%NumOutAll = SrcInitInputData%NumOutAll END SUBROUTINE Waves2_CopyInitInput SUBROUTINE Waves2_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -303,14 +282,17 @@ SUBROUTINE Waves2_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(InitInputData%WaveDirArr)) THEN +IF (ASSOCIATED(InitInputData%WaveDirArr)) THEN DEALLOCATE(InitInputData%WaveDirArr) + InitInputData%WaveDirArr => NULL() ENDIF -IF (ALLOCATED(InitInputData%WaveElevC0)) THEN +IF (ASSOCIATED(InitInputData%WaveElevC0)) THEN DEALLOCATE(InitInputData%WaveElevC0) + InitInputData%WaveElevC0 => NULL() ENDIF -IF (ALLOCATED(InitInputData%WaveTime)) THEN +IF (ASSOCIATED(InitInputData%WaveTime)) THEN DEALLOCATE(InitInputData%WaveTime) + InitInputData%WaveTime => NULL() ENDIF IF (ALLOCATED(InitInputData%WaveElevxi)) THEN DEALLOCATE(InitInputData%WaveElevxi) @@ -377,20 +359,21 @@ SUBROUTINE Waves2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_BufSz = Int_BufSz + 1 ! WaveStMod Int_BufSz = Int_BufSz + 1 ! WaveMultiDir Int_BufSz = Int_BufSz + 1 ! WaveDirArr allocated yes/no - IF ( ALLOCATED(InData%WaveDirArr) ) THEN + IF ( ASSOCIATED(InData%WaveDirArr) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveDirArr upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveDirArr) ! WaveDirArr END IF Int_BufSz = Int_BufSz + 1 ! WaveElevC0 allocated yes/no - IF ( ALLOCATED(InData%WaveElevC0) ) THEN + IF ( ASSOCIATED(InData%WaveElevC0) ) THEN Int_BufSz = Int_BufSz + 2*2 ! WaveElevC0 upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC0) ! WaveElevC0 END IF Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN + IF ( ASSOCIATED(InData%WaveTime) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime END IF + Int_BufSz = Int_BufSz + SIZE(InData%nGrid) ! nGrid Int_BufSz = Int_BufSz + 1 ! NWaveElev Int_BufSz = Int_BufSz + 1 ! WaveElevxi allocated yes/no IF ( ALLOCATED(InData%WaveElevxi) ) THEN @@ -429,10 +412,6 @@ SUBROUTINE Waves2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_BufSz = Re_BufSz + 1 ! WvHiCOffD Re_BufSz = Re_BufSz + 1 ! WvLowCOffS Re_BufSz = Re_BufSz + 1 ! WvHiCOffS - Int_BufSz = Int_BufSz + SIZE(InData%OutList)*LEN(InData%OutList) ! OutList - Int_BufSz = Int_BufSz + 1 ! OutAll - Int_BufSz = Int_BufSz + 1 ! NumOuts - Int_BufSz = Int_BufSz + 1 ! NumOutAll IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -478,7 +457,7 @@ SUBROUTINE Waves2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = TRANSFER(InData%WaveMultiDir, IntKiBuf(1)) Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveDirArr) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveDirArr) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -493,7 +472,7 @@ SUBROUTINE Waves2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_Xferred = Re_Xferred + 1 END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveElevC0) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveElevC0) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -513,7 +492,7 @@ SUBROUTINE Waves2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveTime) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -528,6 +507,10 @@ SUBROUTINE Waves2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_Xferred = Re_Xferred + 1 END DO END IF + DO i1 = LBOUND(InData%nGrid,1), UBOUND(InData%nGrid,1) + IntKiBuf(Int_Xferred) = InData%nGrid(i1) + Int_Xferred = Int_Xferred + 1 + END DO IntKiBuf(Int_Xferred) = InData%NWaveElev Int_Xferred = Int_Xferred + 1 IF ( .NOT. ALLOCATED(InData%WaveElevxi) ) THEN @@ -639,18 +622,6 @@ SUBROUTINE Waves2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_Xferred = Re_Xferred + 1 ReKiBuf(Re_Xferred) = InData%WvHiCOffS Re_Xferred = Re_Xferred + 1 - DO i1 = LBOUND(InData%OutList,1), UBOUND(InData%OutList,1) - DO I = 1, LEN(InData%OutList) - IntKiBuf(Int_Xferred) = ICHAR(InData%OutList(i1)(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - END DO - IntKiBuf(Int_Xferred) = TRANSFER(InData%OutAll, IntKiBuf(1)) - Int_Xferred = Int_Xferred + 1 - IntKiBuf(Int_Xferred) = InData%NumOuts - Int_Xferred = Int_Xferred + 1 - IntKiBuf(Int_Xferred) = InData%NumOutAll - Int_Xferred = Int_Xferred + 1 END SUBROUTINE Waves2_PackInitInput SUBROUTINE Waves2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -669,6 +640,8 @@ SUBROUTINE Waves2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_UnPackInitInput' @@ -707,7 +680,7 @@ SUBROUTINE Waves2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveDirArr)) DEALLOCATE(OutData%WaveDirArr) + IF (ASSOCIATED(OutData%WaveDirArr)) DEALLOCATE(OutData%WaveDirArr) ALLOCATE(OutData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) @@ -728,7 +701,7 @@ SUBROUTINE Waves2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i2_l = IntKiBuf( Int_Xferred ) i2_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveElevC0)) DEALLOCATE(OutData%WaveElevC0) + IF (ASSOCIATED(OutData%WaveElevC0)) DEALLOCATE(OutData%WaveElevC0) ALLOCATE(OutData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) @@ -748,7 +721,7 @@ SUBROUTINE Waves2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -759,6 +732,12 @@ SUBROUTINE Waves2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 END DO END IF + i1_l = LBOUND(OutData%nGrid,1) + i1_u = UBOUND(OutData%nGrid,1) + DO i1 = LBOUND(OutData%nGrid,1), UBOUND(OutData%nGrid,1) + OutData%nGrid(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + END DO OutData%NWaveElev = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevxi not allocated @@ -888,20 +867,6 @@ SUBROUTINE Waves2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 OutData%WvHiCOffS = REAL(ReKiBuf(Re_Xferred), SiKi) Re_Xferred = Re_Xferred + 1 - i1_l = LBOUND(OutData%OutList,1) - i1_u = UBOUND(OutData%OutList,1) - DO i1 = LBOUND(OutData%OutList,1), UBOUND(OutData%OutList,1) - DO I = 1, LEN(OutData%OutList) - OutData%OutList(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - END DO - OutData%OutAll = TRANSFER(IntKiBuf(Int_Xferred), OutData%OutAll) - Int_Xferred = Int_Xferred + 1 - OutData%NumOuts = IntKiBuf(Int_Xferred) - Int_Xferred = Int_Xferred + 1 - OutData%NumOutAll = IntKiBuf(Int_Xferred) - Int_Xferred = Int_Xferred + 1 END SUBROUTINE Waves2_UnPackInitInput SUBROUTINE Waves2_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) @@ -915,50 +880,14 @@ SUBROUTINE Waves2_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_CopyInitOutput' ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(SrcInitOutputData%WriteOutputHdr)) THEN - i1_l = LBOUND(SrcInitOutputData%WriteOutputHdr,1) - i1_u = UBOUND(SrcInitOutputData%WriteOutputHdr,1) - IF (.NOT. ALLOCATED(DstInitOutputData%WriteOutputHdr)) THEN - ALLOCATE(DstInitOutputData%WriteOutputHdr(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WriteOutputHdr.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WriteOutputHdr = SrcInitOutputData%WriteOutputHdr -ENDIF -IF (ALLOCATED(SrcInitOutputData%WriteOutputUnt)) THEN - i1_l = LBOUND(SrcInitOutputData%WriteOutputUnt,1) - i1_u = UBOUND(SrcInitOutputData%WriteOutputUnt,1) - IF (.NOT. ALLOCATED(DstInitOutputData%WriteOutputUnt)) THEN - ALLOCATE(DstInitOutputData%WriteOutputUnt(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WriteOutputUnt.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WriteOutputUnt = SrcInitOutputData%WriteOutputUnt -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveElevSeries2)) THEN - i1_l = LBOUND(SrcInitOutputData%WaveElevSeries2,1) - i1_u = UBOUND(SrcInitOutputData%WaveElevSeries2,1) - i2_l = LBOUND(SrcInitOutputData%WaveElevSeries2,2) - i2_u = UBOUND(SrcInitOutputData%WaveElevSeries2,2) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveElevSeries2)) THEN - ALLOCATE(DstInitOutputData%WaveElevSeries2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElevSeries2.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WaveElevSeries2 = SrcInitOutputData%WaveElevSeries2 -ENDIF IF (ALLOCATED(SrcInitOutputData%WaveAcc2D)) THEN i1_l = LBOUND(SrcInitOutputData%WaveAcc2D,1) i1_u = UBOUND(SrcInitOutputData%WaveAcc2D,1) @@ -966,8 +895,12 @@ SUBROUTINE Waves2_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode i2_u = UBOUND(SrcInitOutputData%WaveAcc2D,2) i3_l = LBOUND(SrcInitOutputData%WaveAcc2D,3) i3_u = UBOUND(SrcInitOutputData%WaveAcc2D,3) + i4_l = LBOUND(SrcInitOutputData%WaveAcc2D,4) + i4_u = UBOUND(SrcInitOutputData%WaveAcc2D,4) + i5_l = LBOUND(SrcInitOutputData%WaveAcc2D,5) + i5_u = UBOUND(SrcInitOutputData%WaveAcc2D,5) IF (.NOT. ALLOCATED(DstInitOutputData%WaveAcc2D)) THEN - ALLOCATE(DstInitOutputData%WaveAcc2D(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + ALLOCATE(DstInitOutputData%WaveAcc2D(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveAcc2D.', ErrStat, ErrMsg,RoutineName) RETURN @@ -980,8 +913,12 @@ SUBROUTINE Waves2_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode i1_u = UBOUND(SrcInitOutputData%WaveDynP2D,1) i2_l = LBOUND(SrcInitOutputData%WaveDynP2D,2) i2_u = UBOUND(SrcInitOutputData%WaveDynP2D,2) + i3_l = LBOUND(SrcInitOutputData%WaveDynP2D,3) + i3_u = UBOUND(SrcInitOutputData%WaveDynP2D,3) + i4_l = LBOUND(SrcInitOutputData%WaveDynP2D,4) + i4_u = UBOUND(SrcInitOutputData%WaveDynP2D,4) IF (.NOT. ALLOCATED(DstInitOutputData%WaveDynP2D)) THEN - ALLOCATE(DstInitOutputData%WaveDynP2D(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + ALLOCATE(DstInitOutputData%WaveDynP2D(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveDynP2D.', ErrStat, ErrMsg,RoutineName) RETURN @@ -996,8 +933,12 @@ SUBROUTINE Waves2_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode i2_u = UBOUND(SrcInitOutputData%WaveAcc2S,2) i3_l = LBOUND(SrcInitOutputData%WaveAcc2S,3) i3_u = UBOUND(SrcInitOutputData%WaveAcc2S,3) + i4_l = LBOUND(SrcInitOutputData%WaveAcc2S,4) + i4_u = UBOUND(SrcInitOutputData%WaveAcc2S,4) + i5_l = LBOUND(SrcInitOutputData%WaveAcc2S,5) + i5_u = UBOUND(SrcInitOutputData%WaveAcc2S,5) IF (.NOT. ALLOCATED(DstInitOutputData%WaveAcc2S)) THEN - ALLOCATE(DstInitOutputData%WaveAcc2S(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + ALLOCATE(DstInitOutputData%WaveAcc2S(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveAcc2S.', ErrStat, ErrMsg,RoutineName) RETURN @@ -1010,8 +951,12 @@ SUBROUTINE Waves2_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode i1_u = UBOUND(SrcInitOutputData%WaveDynP2S,1) i2_l = LBOUND(SrcInitOutputData%WaveDynP2S,2) i2_u = UBOUND(SrcInitOutputData%WaveDynP2S,2) + i3_l = LBOUND(SrcInitOutputData%WaveDynP2S,3) + i3_u = UBOUND(SrcInitOutputData%WaveDynP2S,3) + i4_l = LBOUND(SrcInitOutputData%WaveDynP2S,4) + i4_u = UBOUND(SrcInitOutputData%WaveDynP2S,4) IF (.NOT. ALLOCATED(DstInitOutputData%WaveDynP2S)) THEN - ALLOCATE(DstInitOutputData%WaveDynP2S(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + ALLOCATE(DstInitOutputData%WaveDynP2S(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveDynP2S.', ErrStat, ErrMsg,RoutineName) RETURN @@ -1026,8 +971,12 @@ SUBROUTINE Waves2_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode i2_u = UBOUND(SrcInitOutputData%WaveVel2D,2) i3_l = LBOUND(SrcInitOutputData%WaveVel2D,3) i3_u = UBOUND(SrcInitOutputData%WaveVel2D,3) + i4_l = LBOUND(SrcInitOutputData%WaveVel2D,4) + i4_u = UBOUND(SrcInitOutputData%WaveVel2D,4) + i5_l = LBOUND(SrcInitOutputData%WaveVel2D,5) + i5_u = UBOUND(SrcInitOutputData%WaveVel2D,5) IF (.NOT. ALLOCATED(DstInitOutputData%WaveVel2D)) THEN - ALLOCATE(DstInitOutputData%WaveVel2D(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + ALLOCATE(DstInitOutputData%WaveVel2D(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveVel2D.', ErrStat, ErrMsg,RoutineName) RETURN @@ -1042,106 +991,18 @@ SUBROUTINE Waves2_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode i2_u = UBOUND(SrcInitOutputData%WaveVel2S,2) i3_l = LBOUND(SrcInitOutputData%WaveVel2S,3) i3_u = UBOUND(SrcInitOutputData%WaveVel2S,3) + i4_l = LBOUND(SrcInitOutputData%WaveVel2S,4) + i4_u = UBOUND(SrcInitOutputData%WaveVel2S,4) + i5_l = LBOUND(SrcInitOutputData%WaveVel2S,5) + i5_u = UBOUND(SrcInitOutputData%WaveVel2S,5) IF (.NOT. ALLOCATED(DstInitOutputData%WaveVel2S)) THEN - ALLOCATE(DstInitOutputData%WaveVel2S(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + ALLOCATE(DstInitOutputData%WaveVel2S(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveVel2S.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF DstInitOutputData%WaveVel2S = SrcInitOutputData%WaveVel2S -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveAcc2D0)) THEN - i1_l = LBOUND(SrcInitOutputData%WaveAcc2D0,1) - i1_u = UBOUND(SrcInitOutputData%WaveAcc2D0,1) - i2_l = LBOUND(SrcInitOutputData%WaveAcc2D0,2) - i2_u = UBOUND(SrcInitOutputData%WaveAcc2D0,2) - i3_l = LBOUND(SrcInitOutputData%WaveAcc2D0,3) - i3_u = UBOUND(SrcInitOutputData%WaveAcc2D0,3) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveAcc2D0)) THEN - ALLOCATE(DstInitOutputData%WaveAcc2D0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveAcc2D0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WaveAcc2D0 = SrcInitOutputData%WaveAcc2D0 -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveDynP2D0)) THEN - i1_l = LBOUND(SrcInitOutputData%WaveDynP2D0,1) - i1_u = UBOUND(SrcInitOutputData%WaveDynP2D0,1) - i2_l = LBOUND(SrcInitOutputData%WaveDynP2D0,2) - i2_u = UBOUND(SrcInitOutputData%WaveDynP2D0,2) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveDynP2D0)) THEN - ALLOCATE(DstInitOutputData%WaveDynP2D0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveDynP2D0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WaveDynP2D0 = SrcInitOutputData%WaveDynP2D0 -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveAcc2S0)) THEN - i1_l = LBOUND(SrcInitOutputData%WaveAcc2S0,1) - i1_u = UBOUND(SrcInitOutputData%WaveAcc2S0,1) - i2_l = LBOUND(SrcInitOutputData%WaveAcc2S0,2) - i2_u = UBOUND(SrcInitOutputData%WaveAcc2S0,2) - i3_l = LBOUND(SrcInitOutputData%WaveAcc2S0,3) - i3_u = UBOUND(SrcInitOutputData%WaveAcc2S0,3) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveAcc2S0)) THEN - ALLOCATE(DstInitOutputData%WaveAcc2S0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveAcc2S0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WaveAcc2S0 = SrcInitOutputData%WaveAcc2S0 -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveDynP2S0)) THEN - i1_l = LBOUND(SrcInitOutputData%WaveDynP2S0,1) - i1_u = UBOUND(SrcInitOutputData%WaveDynP2S0,1) - i2_l = LBOUND(SrcInitOutputData%WaveDynP2S0,2) - i2_u = UBOUND(SrcInitOutputData%WaveDynP2S0,2) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveDynP2S0)) THEN - ALLOCATE(DstInitOutputData%WaveDynP2S0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveDynP2S0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WaveDynP2S0 = SrcInitOutputData%WaveDynP2S0 -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveVel2D0)) THEN - i1_l = LBOUND(SrcInitOutputData%WaveVel2D0,1) - i1_u = UBOUND(SrcInitOutputData%WaveVel2D0,1) - i2_l = LBOUND(SrcInitOutputData%WaveVel2D0,2) - i2_u = UBOUND(SrcInitOutputData%WaveVel2D0,2) - i3_l = LBOUND(SrcInitOutputData%WaveVel2D0,3) - i3_u = UBOUND(SrcInitOutputData%WaveVel2D0,3) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveVel2D0)) THEN - ALLOCATE(DstInitOutputData%WaveVel2D0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveVel2D0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WaveVel2D0 = SrcInitOutputData%WaveVel2D0 -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveVel2S0)) THEN - i1_l = LBOUND(SrcInitOutputData%WaveVel2S0,1) - i1_u = UBOUND(SrcInitOutputData%WaveVel2S0,1) - i2_l = LBOUND(SrcInitOutputData%WaveVel2S0,2) - i2_u = UBOUND(SrcInitOutputData%WaveVel2S0,2) - i3_l = LBOUND(SrcInitOutputData%WaveVel2S0,3) - i3_u = UBOUND(SrcInitOutputData%WaveVel2S0,3) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveVel2S0)) THEN - ALLOCATE(DstInitOutputData%WaveVel2S0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveVel2S0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WaveVel2S0 = SrcInitOutputData%WaveVel2S0 ENDIF END SUBROUTINE Waves2_CopyInitOutput @@ -1154,15 +1015,6 @@ SUBROUTINE Waves2_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(InitOutputData%WriteOutputHdr)) THEN - DEALLOCATE(InitOutputData%WriteOutputHdr) -ENDIF -IF (ALLOCATED(InitOutputData%WriteOutputUnt)) THEN - DEALLOCATE(InitOutputData%WriteOutputUnt) -ENDIF -IF (ALLOCATED(InitOutputData%WaveElevSeries2)) THEN - DEALLOCATE(InitOutputData%WaveElevSeries2) -ENDIF IF (ALLOCATED(InitOutputData%WaveAcc2D)) THEN DEALLOCATE(InitOutputData%WaveAcc2D) ENDIF @@ -1180,24 +1032,6 @@ SUBROUTINE Waves2_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) ENDIF IF (ALLOCATED(InitOutputData%WaveVel2S)) THEN DEALLOCATE(InitOutputData%WaveVel2S) -ENDIF -IF (ALLOCATED(InitOutputData%WaveAcc2D0)) THEN - DEALLOCATE(InitOutputData%WaveAcc2D0) -ENDIF -IF (ALLOCATED(InitOutputData%WaveDynP2D0)) THEN - DEALLOCATE(InitOutputData%WaveDynP2D0) -ENDIF -IF (ALLOCATED(InitOutputData%WaveAcc2S0)) THEN - DEALLOCATE(InitOutputData%WaveAcc2S0) -ENDIF -IF (ALLOCATED(InitOutputData%WaveDynP2S0)) THEN - DEALLOCATE(InitOutputData%WaveDynP2S0) -ENDIF -IF (ALLOCATED(InitOutputData%WaveVel2D0)) THEN - DEALLOCATE(InitOutputData%WaveVel2D0) -ENDIF -IF (ALLOCATED(InitOutputData%WaveVel2S0)) THEN - DEALLOCATE(InitOutputData%WaveVel2S0) ENDIF END SUBROUTINE Waves2_DestroyInitOutput @@ -1236,81 +1070,36 @@ SUBROUTINE Waves2_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Re_BufSz = 0 Db_BufSz = 0 Int_BufSz = 0 - Int_BufSz = Int_BufSz + 1 ! WriteOutputHdr allocated yes/no - IF ( ALLOCATED(InData%WriteOutputHdr) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! WriteOutputHdr upper/lower bounds for each dimension - Int_BufSz = Int_BufSz + SIZE(InData%WriteOutputHdr)*LEN(InData%WriteOutputHdr) ! WriteOutputHdr - END IF - Int_BufSz = Int_BufSz + 1 ! WriteOutputUnt allocated yes/no - IF ( ALLOCATED(InData%WriteOutputUnt) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! WriteOutputUnt upper/lower bounds for each dimension - Int_BufSz = Int_BufSz + SIZE(InData%WriteOutputUnt)*LEN(InData%WriteOutputUnt) ! WriteOutputUnt - END IF - Int_BufSz = Int_BufSz + 1 ! WaveElevSeries2 allocated yes/no - IF ( ALLOCATED(InData%WaveElevSeries2) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveElevSeries2 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveElevSeries2) ! WaveElevSeries2 - END IF Int_BufSz = Int_BufSz + 1 ! WaveAcc2D allocated yes/no IF ( ALLOCATED(InData%WaveAcc2D) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveAcc2D upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + 2*5 ! WaveAcc2D upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveAcc2D) ! WaveAcc2D END IF Int_BufSz = Int_BufSz + 1 ! WaveDynP2D allocated yes/no IF ( ALLOCATED(InData%WaveDynP2D) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveDynP2D upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + 2*4 ! WaveDynP2D upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveDynP2D) ! WaveDynP2D END IF Int_BufSz = Int_BufSz + 1 ! WaveAcc2S allocated yes/no IF ( ALLOCATED(InData%WaveAcc2S) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveAcc2S upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + 2*5 ! WaveAcc2S upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveAcc2S) ! WaveAcc2S END IF Int_BufSz = Int_BufSz + 1 ! WaveDynP2S allocated yes/no IF ( ALLOCATED(InData%WaveDynP2S) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveDynP2S upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + 2*4 ! WaveDynP2S upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveDynP2S) ! WaveDynP2S END IF Int_BufSz = Int_BufSz + 1 ! WaveVel2D allocated yes/no IF ( ALLOCATED(InData%WaveVel2D) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveVel2D upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + 2*5 ! WaveVel2D upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveVel2D) ! WaveVel2D END IF Int_BufSz = Int_BufSz + 1 ! WaveVel2S allocated yes/no IF ( ALLOCATED(InData%WaveVel2S) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveVel2S upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + 2*5 ! WaveVel2S upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveVel2S) ! WaveVel2S END IF - Int_BufSz = Int_BufSz + 1 ! WaveAcc2D0 allocated yes/no - IF ( ALLOCATED(InData%WaveAcc2D0) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveAcc2D0 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveAcc2D0) ! WaveAcc2D0 - END IF - Int_BufSz = Int_BufSz + 1 ! WaveDynP2D0 allocated yes/no - IF ( ALLOCATED(InData%WaveDynP2D0) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveDynP2D0 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveDynP2D0) ! WaveDynP2D0 - END IF - Int_BufSz = Int_BufSz + 1 ! WaveAcc2S0 allocated yes/no - IF ( ALLOCATED(InData%WaveAcc2S0) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveAcc2S0 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveAcc2S0) ! WaveAcc2S0 - END IF - Int_BufSz = Int_BufSz + 1 ! WaveDynP2S0 allocated yes/no - IF ( ALLOCATED(InData%WaveDynP2S0) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveDynP2S0 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveDynP2S0) ! WaveDynP2S0 - END IF - Int_BufSz = Int_BufSz + 1 ! WaveVel2D0 allocated yes/no - IF ( ALLOCATED(InData%WaveVel2D0) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveVel2D0 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveVel2D0) ! WaveVel2D0 - END IF - Int_BufSz = Int_BufSz + 1 ! WaveVel2S0 allocated yes/no - IF ( ALLOCATED(InData%WaveVel2S0) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveVel2S0 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveVel2S0) ! WaveVel2S0 - END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1338,60 +1127,6 @@ SUBROUTINE Waves2_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Db_Xferred = 1 Int_Xferred = 1 - IF ( .NOT. ALLOCATED(InData%WriteOutputHdr) ) 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%WriteOutputHdr,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WriteOutputHdr,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%WriteOutputHdr,1), UBOUND(InData%WriteOutputHdr,1) - DO I = 1, LEN(InData%WriteOutputHdr) - IntKiBuf(Int_Xferred) = ICHAR(InData%WriteOutputHdr(i1)(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WriteOutputUnt) ) 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%WriteOutputUnt,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WriteOutputUnt,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%WriteOutputUnt,1), UBOUND(InData%WriteOutputUnt,1) - DO I = 1, LEN(InData%WriteOutputUnt) - IntKiBuf(Int_Xferred) = ICHAR(InData%WriteOutputUnt(i1)(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveElevSeries2) ) 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%WaveElevSeries2,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevSeries2,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevSeries2,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevSeries2,2) - Int_Xferred = Int_Xferred + 2 - - DO i2 = LBOUND(InData%WaveElevSeries2,2), UBOUND(InData%WaveElevSeries2,2) - DO i1 = LBOUND(InData%WaveElevSeries2,1), UBOUND(InData%WaveElevSeries2,1) - ReKiBuf(Re_Xferred) = InData%WaveElevSeries2(i1,i2) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF IF ( .NOT. ALLOCATED(InData%WaveAcc2D) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -1406,13 +1141,23 @@ SUBROUTINE Waves2_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc2D,3) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2D,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc2D,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2D,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc2D,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2D,5) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%WaveAcc2D,3), UBOUND(InData%WaveAcc2D,3) - DO i2 = LBOUND(InData%WaveAcc2D,2), UBOUND(InData%WaveAcc2D,2) - DO i1 = LBOUND(InData%WaveAcc2D,1), UBOUND(InData%WaveAcc2D,1) - ReKiBuf(Re_Xferred) = InData%WaveAcc2D(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(InData%WaveAcc2D,5), UBOUND(InData%WaveAcc2D,5) + DO i4 = LBOUND(InData%WaveAcc2D,4), UBOUND(InData%WaveAcc2D,4) + DO i3 = LBOUND(InData%WaveAcc2D,3), UBOUND(InData%WaveAcc2D,3) + DO i2 = LBOUND(InData%WaveAcc2D,2), UBOUND(InData%WaveAcc2D,2) + DO i1 = LBOUND(InData%WaveAcc2D,1), UBOUND(InData%WaveAcc2D,1) + ReKiBuf(Re_Xferred) = InData%WaveAcc2D(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -1428,12 +1173,22 @@ SUBROUTINE Waves2_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP2D,2) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP2D,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP2D,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP2D,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP2D,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP2D,4) Int_Xferred = Int_Xferred + 2 - DO i2 = LBOUND(InData%WaveDynP2D,2), UBOUND(InData%WaveDynP2D,2) - DO i1 = LBOUND(InData%WaveDynP2D,1), UBOUND(InData%WaveDynP2D,1) - ReKiBuf(Re_Xferred) = InData%WaveDynP2D(i1,i2) - Re_Xferred = Re_Xferred + 1 + DO i4 = LBOUND(InData%WaveDynP2D,4), UBOUND(InData%WaveDynP2D,4) + DO i3 = LBOUND(InData%WaveDynP2D,3), UBOUND(InData%WaveDynP2D,3) + DO i2 = LBOUND(InData%WaveDynP2D,2), UBOUND(InData%WaveDynP2D,2) + DO i1 = LBOUND(InData%WaveDynP2D,1), UBOUND(InData%WaveDynP2D,1) + ReKiBuf(Re_Xferred) = InData%WaveDynP2D(i1,i2,i3,i4) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END IF @@ -1451,13 +1206,23 @@ SUBROUTINE Waves2_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc2S,3) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2S,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc2S,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2S,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc2S,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2S,5) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%WaveAcc2S,3), UBOUND(InData%WaveAcc2S,3) - DO i2 = LBOUND(InData%WaveAcc2S,2), UBOUND(InData%WaveAcc2S,2) - DO i1 = LBOUND(InData%WaveAcc2S,1), UBOUND(InData%WaveAcc2S,1) - ReKiBuf(Re_Xferred) = InData%WaveAcc2S(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(InData%WaveAcc2S,5), UBOUND(InData%WaveAcc2S,5) + DO i4 = LBOUND(InData%WaveAcc2S,4), UBOUND(InData%WaveAcc2S,4) + DO i3 = LBOUND(InData%WaveAcc2S,3), UBOUND(InData%WaveAcc2S,3) + DO i2 = LBOUND(InData%WaveAcc2S,2), UBOUND(InData%WaveAcc2S,2) + DO i1 = LBOUND(InData%WaveAcc2S,1), UBOUND(InData%WaveAcc2S,1) + ReKiBuf(Re_Xferred) = InData%WaveAcc2S(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -1473,12 +1238,22 @@ SUBROUTINE Waves2_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP2S,2) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP2S,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP2S,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP2S,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP2S,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP2S,4) Int_Xferred = Int_Xferred + 2 - DO i2 = LBOUND(InData%WaveDynP2S,2), UBOUND(InData%WaveDynP2S,2) - DO i1 = LBOUND(InData%WaveDynP2S,1), UBOUND(InData%WaveDynP2S,1) - ReKiBuf(Re_Xferred) = InData%WaveDynP2S(i1,i2) - Re_Xferred = Re_Xferred + 1 + DO i4 = LBOUND(InData%WaveDynP2S,4), UBOUND(InData%WaveDynP2S,4) + DO i3 = LBOUND(InData%WaveDynP2S,3), UBOUND(InData%WaveDynP2S,3) + DO i2 = LBOUND(InData%WaveDynP2S,2), UBOUND(InData%WaveDynP2S,2) + DO i1 = LBOUND(InData%WaveDynP2S,1), UBOUND(InData%WaveDynP2S,1) + ReKiBuf(Re_Xferred) = InData%WaveDynP2S(i1,i2,i3,i4) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END IF @@ -1496,13 +1271,23 @@ SUBROUTINE Waves2_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel2D,3) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2D,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel2D,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2D,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel2D,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2D,5) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%WaveVel2D,3), UBOUND(InData%WaveVel2D,3) - DO i2 = LBOUND(InData%WaveVel2D,2), UBOUND(InData%WaveVel2D,2) - DO i1 = LBOUND(InData%WaveVel2D,1), UBOUND(InData%WaveVel2D,1) - ReKiBuf(Re_Xferred) = InData%WaveVel2D(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(InData%WaveVel2D,5), UBOUND(InData%WaveVel2D,5) + DO i4 = LBOUND(InData%WaveVel2D,4), UBOUND(InData%WaveVel2D,4) + DO i3 = LBOUND(InData%WaveVel2D,3), UBOUND(InData%WaveVel2D,3) + DO i2 = LBOUND(InData%WaveVel2D,2), UBOUND(InData%WaveVel2D,2) + DO i1 = LBOUND(InData%WaveVel2D,1), UBOUND(InData%WaveVel2D,1) + ReKiBuf(Re_Xferred) = InData%WaveVel2D(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -1522,152 +1307,22 @@ SUBROUTINE Waves2_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel2S,3) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2S,3) Int_Xferred = Int_Xferred + 2 - - DO i3 = LBOUND(InData%WaveVel2S,3), UBOUND(InData%WaveVel2S,3) - DO i2 = LBOUND(InData%WaveVel2S,2), UBOUND(InData%WaveVel2S,2) - DO i1 = LBOUND(InData%WaveVel2S,1), UBOUND(InData%WaveVel2S,1) - ReKiBuf(Re_Xferred) = InData%WaveVel2S(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveAcc2D0) ) 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%WaveAcc2D0,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2D0,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc2D0,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2D0,2) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel2S,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2S,4) Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc2D0,3) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2D0,3) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel2S,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2S,5) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%WaveAcc2D0,3), UBOUND(InData%WaveAcc2D0,3) - DO i2 = LBOUND(InData%WaveAcc2D0,2), UBOUND(InData%WaveAcc2D0,2) - DO i1 = LBOUND(InData%WaveAcc2D0,1), UBOUND(InData%WaveAcc2D0,1) - ReKiBuf(Re_Xferred) = InData%WaveAcc2D0(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveDynP2D0) ) 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%WaveDynP2D0,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP2D0,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP2D0,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP2D0,2) - Int_Xferred = Int_Xferred + 2 - - DO i2 = LBOUND(InData%WaveDynP2D0,2), UBOUND(InData%WaveDynP2D0,2) - DO i1 = LBOUND(InData%WaveDynP2D0,1), UBOUND(InData%WaveDynP2D0,1) - ReKiBuf(Re_Xferred) = InData%WaveDynP2D0(i1,i2) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveAcc2S0) ) 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%WaveAcc2S0,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2S0,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc2S0,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2S0,2) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc2S0,3) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc2S0,3) - Int_Xferred = Int_Xferred + 2 - - DO i3 = LBOUND(InData%WaveAcc2S0,3), UBOUND(InData%WaveAcc2S0,3) - DO i2 = LBOUND(InData%WaveAcc2S0,2), UBOUND(InData%WaveAcc2S0,2) - DO i1 = LBOUND(InData%WaveAcc2S0,1), UBOUND(InData%WaveAcc2S0,1) - ReKiBuf(Re_Xferred) = InData%WaveAcc2S0(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveDynP2S0) ) 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%WaveDynP2S0,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP2S0,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP2S0,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP2S0,2) - Int_Xferred = Int_Xferred + 2 - - DO i2 = LBOUND(InData%WaveDynP2S0,2), UBOUND(InData%WaveDynP2S0,2) - DO i1 = LBOUND(InData%WaveDynP2S0,1), UBOUND(InData%WaveDynP2S0,1) - ReKiBuf(Re_Xferred) = InData%WaveDynP2S0(i1,i2) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveVel2D0) ) 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%WaveVel2D0,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2D0,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel2D0,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2D0,2) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel2D0,3) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2D0,3) - Int_Xferred = Int_Xferred + 2 - - DO i3 = LBOUND(InData%WaveVel2D0,3), UBOUND(InData%WaveVel2D0,3) - DO i2 = LBOUND(InData%WaveVel2D0,2), UBOUND(InData%WaveVel2D0,2) - DO i1 = LBOUND(InData%WaveVel2D0,1), UBOUND(InData%WaveVel2D0,1) - ReKiBuf(Re_Xferred) = InData%WaveVel2D0(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveVel2S0) ) 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%WaveVel2S0,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2S0,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel2S0,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2S0,2) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel2S0,3) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel2S0,3) - Int_Xferred = Int_Xferred + 2 - - DO i3 = LBOUND(InData%WaveVel2S0,3), UBOUND(InData%WaveVel2S0,3) - DO i2 = LBOUND(InData%WaveVel2S0,2), UBOUND(InData%WaveVel2S0,2) - DO i1 = LBOUND(InData%WaveVel2S0,1), UBOUND(InData%WaveVel2S0,1) - ReKiBuf(Re_Xferred) = InData%WaveVel2S0(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(InData%WaveVel2S,5), UBOUND(InData%WaveVel2S,5) + DO i4 = LBOUND(InData%WaveVel2S,4), UBOUND(InData%WaveVel2S,4) + DO i3 = LBOUND(InData%WaveVel2S,3), UBOUND(InData%WaveVel2S,3) + DO i2 = LBOUND(InData%WaveVel2S,2), UBOUND(InData%WaveVel2S,2) + DO i1 = LBOUND(InData%WaveVel2S,1), UBOUND(InData%WaveVel2S,1) + ReKiBuf(Re_Xferred) = InData%WaveVel2S(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -1690,6 +1345,8 @@ SUBROUTINE Waves2_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_UnPackInitOutput' @@ -1703,69 +1360,6 @@ SUBROUTINE Waves2_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutputHdr 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 - IF (ALLOCATED(OutData%WriteOutputHdr)) DEALLOCATE(OutData%WriteOutputHdr) - ALLOCATE(OutData%WriteOutputHdr(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutputHdr.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%WriteOutputHdr,1), UBOUND(OutData%WriteOutputHdr,1) - DO I = 1, LEN(OutData%WriteOutputHdr) - OutData%WriteOutputHdr(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutputUnt 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 - IF (ALLOCATED(OutData%WriteOutputUnt)) DEALLOCATE(OutData%WriteOutputUnt) - ALLOCATE(OutData%WriteOutputUnt(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutputUnt.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%WriteOutputUnt,1), UBOUND(OutData%WriteOutputUnt,1) - DO I = 1, LEN(OutData%WriteOutputUnt) - OutData%WriteOutputUnt(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevSeries2 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%WaveElevSeries2)) DEALLOCATE(OutData%WaveElevSeries2) - ALLOCATE(OutData%WaveElevSeries2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevSeries2.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveElevSeries2,2), UBOUND(OutData%WaveElevSeries2,2) - DO i1 = LBOUND(OutData%WaveElevSeries2,1), UBOUND(OutData%WaveElevSeries2,1) - OutData%WaveElevSeries2(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveAcc2D not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -1779,17 +1373,27 @@ SUBROUTINE Waves2_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 IF (ALLOCATED(OutData%WaveAcc2D)) DEALLOCATE(OutData%WaveAcc2D) - ALLOCATE(OutData%WaveAcc2D(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + ALLOCATE(OutData%WaveAcc2D(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc2D.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%WaveAcc2D,3), UBOUND(OutData%WaveAcc2D,3) - DO i2 = LBOUND(OutData%WaveAcc2D,2), UBOUND(OutData%WaveAcc2D,2) - DO i1 = LBOUND(OutData%WaveAcc2D,1), UBOUND(OutData%WaveAcc2D,1) - OutData%WaveAcc2D(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(OutData%WaveAcc2D,5), UBOUND(OutData%WaveAcc2D,5) + DO i4 = LBOUND(OutData%WaveAcc2D,4), UBOUND(OutData%WaveAcc2D,4) + DO i3 = LBOUND(OutData%WaveAcc2D,3), UBOUND(OutData%WaveAcc2D,3) + DO i2 = LBOUND(OutData%WaveAcc2D,2), UBOUND(OutData%WaveAcc2D,2) + DO i1 = LBOUND(OutData%WaveAcc2D,1), UBOUND(OutData%WaveAcc2D,1) + OutData%WaveAcc2D(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -1804,16 +1408,26 @@ SUBROUTINE Waves2_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat i2_l = IntKiBuf( Int_Xferred ) i2_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 IF (ALLOCATED(OutData%WaveDynP2D)) DEALLOCATE(OutData%WaveDynP2D) - ALLOCATE(OutData%WaveDynP2D(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + ALLOCATE(OutData%WaveDynP2D(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP2D.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i2 = LBOUND(OutData%WaveDynP2D,2), UBOUND(OutData%WaveDynP2D,2) - DO i1 = LBOUND(OutData%WaveDynP2D,1), UBOUND(OutData%WaveDynP2D,1) - OutData%WaveDynP2D(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i4 = LBOUND(OutData%WaveDynP2D,4), UBOUND(OutData%WaveDynP2D,4) + DO i3 = LBOUND(OutData%WaveDynP2D,3), UBOUND(OutData%WaveDynP2D,3) + DO i2 = LBOUND(OutData%WaveDynP2D,2), UBOUND(OutData%WaveDynP2D,2) + DO i1 = LBOUND(OutData%WaveDynP2D,1), UBOUND(OutData%WaveDynP2D,1) + OutData%WaveDynP2D(i1,i2,i3,i4) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END IF @@ -1830,46 +1444,33 @@ SUBROUTINE Waves2_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 IF (ALLOCATED(OutData%WaveAcc2S)) DEALLOCATE(OutData%WaveAcc2S) - ALLOCATE(OutData%WaveAcc2S(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + ALLOCATE(OutData%WaveAcc2S(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc2S.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%WaveAcc2S,3), UBOUND(OutData%WaveAcc2S,3) - DO i2 = LBOUND(OutData%WaveAcc2S,2), UBOUND(OutData%WaveAcc2S,2) - DO i1 = LBOUND(OutData%WaveAcc2S,1), UBOUND(OutData%WaveAcc2S,1) - OutData%WaveAcc2S(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(OutData%WaveAcc2S,5), UBOUND(OutData%WaveAcc2S,5) + DO i4 = LBOUND(OutData%WaveAcc2S,4), UBOUND(OutData%WaveAcc2S,4) + DO i3 = LBOUND(OutData%WaveAcc2S,3), UBOUND(OutData%WaveAcc2S,3) + DO i2 = LBOUND(OutData%WaveAcc2S,2), UBOUND(OutData%WaveAcc2S,2) + DO i1 = LBOUND(OutData%WaveAcc2S,1), UBOUND(OutData%WaveAcc2S,1) + OutData%WaveAcc2S(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDynP2S 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%WaveDynP2S)) DEALLOCATE(OutData%WaveDynP2S) - ALLOCATE(OutData%WaveDynP2S(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP2S.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveDynP2S,2), UBOUND(OutData%WaveDynP2S,2) - DO i1 = LBOUND(OutData%WaveDynP2S,1), UBOUND(OutData%WaveDynP2S,1) - OutData%WaveDynP2S(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveVel2D not allocated - Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 i1_l = IntKiBuf( Int_Xferred ) @@ -1881,50 +1482,27 @@ SUBROUTINE Waves2_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveVel2D)) DEALLOCATE(OutData%WaveVel2D) - ALLOCATE(OutData%WaveVel2D(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel2D.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i3 = LBOUND(OutData%WaveVel2D,3), UBOUND(OutData%WaveVel2D,3) - DO i2 = LBOUND(OutData%WaveVel2D,2), UBOUND(OutData%WaveVel2D,2) - DO i1 = LBOUND(OutData%WaveVel2D,1), UBOUND(OutData%WaveVel2D,1) - OutData%WaveVel2D(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveVel2S 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 - i3_l = IntKiBuf( Int_Xferred ) - i3_u = IntKiBuf( Int_Xferred + 1) + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveVel2S)) DEALLOCATE(OutData%WaveVel2S) - ALLOCATE(OutData%WaveVel2S(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ALLOCATED(OutData%WaveDynP2S)) DEALLOCATE(OutData%WaveDynP2S) + ALLOCATE(OutData%WaveDynP2S(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel2S.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP2S.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%WaveVel2S,3), UBOUND(OutData%WaveVel2S,3) - DO i2 = LBOUND(OutData%WaveVel2S,2), UBOUND(OutData%WaveVel2S,2) - DO i1 = LBOUND(OutData%WaveVel2S,1), UBOUND(OutData%WaveVel2S,1) - OutData%WaveVel2S(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i4 = LBOUND(OutData%WaveDynP2S,4), UBOUND(OutData%WaveDynP2S,4) + DO i3 = LBOUND(OutData%WaveDynP2S,3), UBOUND(OutData%WaveDynP2S,3) + DO i2 = LBOUND(OutData%WaveDynP2S,2), UBOUND(OutData%WaveDynP2S,2) + DO i1 = LBOUND(OutData%WaveDynP2S,1), UBOUND(OutData%WaveDynP2S,1) + OutData%WaveDynP2S(i1,i2,i3,i4) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO END DO END DO END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveAcc2D0 not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveVel2D not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 @@ -1937,96 +1515,32 @@ SUBROUTINE Waves2_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveAcc2D0)) DEALLOCATE(OutData%WaveAcc2D0) - ALLOCATE(OutData%WaveAcc2D0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc2D0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i3 = LBOUND(OutData%WaveAcc2D0,3), UBOUND(OutData%WaveAcc2D0,3) - DO i2 = LBOUND(OutData%WaveAcc2D0,2), UBOUND(OutData%WaveAcc2D0,2) - DO i1 = LBOUND(OutData%WaveAcc2D0,1), UBOUND(OutData%WaveAcc2D0,1) - OutData%WaveAcc2D0(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDynP2D0 not allocated - Int_Xferred = Int_Xferred + 1 - ELSE - Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - i2_l = IntKiBuf( Int_Xferred ) - i2_u = IntKiBuf( Int_Xferred + 1) + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveDynP2D0)) DEALLOCATE(OutData%WaveDynP2D0) - ALLOCATE(OutData%WaveDynP2D0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP2D0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveDynP2D0,2), UBOUND(OutData%WaveDynP2D0,2) - DO i1 = LBOUND(OutData%WaveDynP2D0,1), UBOUND(OutData%WaveDynP2D0,1) - OutData%WaveDynP2D0(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveAcc2S0 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 - i3_l = IntKiBuf( Int_Xferred ) - i3_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveAcc2S0)) DEALLOCATE(OutData%WaveAcc2S0) - ALLOCATE(OutData%WaveAcc2S0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ALLOCATED(OutData%WaveVel2D)) DEALLOCATE(OutData%WaveVel2D) + ALLOCATE(OutData%WaveVel2D(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc2S0.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel2D.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%WaveAcc2S0,3), UBOUND(OutData%WaveAcc2S0,3) - DO i2 = LBOUND(OutData%WaveAcc2S0,2), UBOUND(OutData%WaveAcc2S0,2) - DO i1 = LBOUND(OutData%WaveAcc2S0,1), UBOUND(OutData%WaveAcc2S0,1) - OutData%WaveAcc2S0(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(OutData%WaveVel2D,5), UBOUND(OutData%WaveVel2D,5) + DO i4 = LBOUND(OutData%WaveVel2D,4), UBOUND(OutData%WaveVel2D,4) + DO i3 = LBOUND(OutData%WaveVel2D,3), UBOUND(OutData%WaveVel2D,3) + DO i2 = LBOUND(OutData%WaveVel2D,2), UBOUND(OutData%WaveVel2D,2) + DO i1 = LBOUND(OutData%WaveVel2D,1), UBOUND(OutData%WaveVel2D,1) + OutData%WaveVel2D(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDynP2S0 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%WaveDynP2S0)) DEALLOCATE(OutData%WaveDynP2S0) - ALLOCATE(OutData%WaveDynP2S0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP2S0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveDynP2S0,2), UBOUND(OutData%WaveDynP2S0,2) - DO i1 = LBOUND(OutData%WaveDynP2S0,1), UBOUND(OutData%WaveDynP2S0,1) - OutData%WaveDynP2S0(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveVel2D0 not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveVel2S not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 @@ -2039,45 +1553,27 @@ SUBROUTINE Waves2_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveVel2D0)) DEALLOCATE(OutData%WaveVel2D0) - ALLOCATE(OutData%WaveVel2D0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel2D0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i3 = LBOUND(OutData%WaveVel2D0,3), UBOUND(OutData%WaveVel2D0,3) - DO i2 = LBOUND(OutData%WaveVel2D0,2), UBOUND(OutData%WaveVel2D0,2) - DO i1 = LBOUND(OutData%WaveVel2D0,1), UBOUND(OutData%WaveVel2D0,1) - OutData%WaveVel2D0(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveVel2S0 not allocated - Int_Xferred = Int_Xferred + 1 - ELSE - Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - i2_l = IntKiBuf( Int_Xferred ) - i2_u = IntKiBuf( Int_Xferred + 1) + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - i3_l = IntKiBuf( Int_Xferred ) - i3_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveVel2S0)) DEALLOCATE(OutData%WaveVel2S0) - ALLOCATE(OutData%WaveVel2S0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ALLOCATED(OutData%WaveVel2S)) DEALLOCATE(OutData%WaveVel2S) + ALLOCATE(OutData%WaveVel2S(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel2S0.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel2S.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%WaveVel2S0,3), UBOUND(OutData%WaveVel2S0,3) - DO i2 = LBOUND(OutData%WaveVel2S0,2), UBOUND(OutData%WaveVel2S0,2) - DO i1 = LBOUND(OutData%WaveVel2S0,1), UBOUND(OutData%WaveVel2S0,1) - OutData%WaveVel2S0(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(OutData%WaveVel2S,5), UBOUND(OutData%WaveVel2S,5) + DO i4 = LBOUND(OutData%WaveVel2S,4), UBOUND(OutData%WaveVel2S,4) + DO i3 = LBOUND(OutData%WaveVel2S,3), UBOUND(OutData%WaveVel2S,3) + DO i2 = LBOUND(OutData%WaveVel2S,2), UBOUND(OutData%WaveVel2S,2) + DO i1 = LBOUND(OutData%WaveVel2S,1), UBOUND(OutData%WaveVel2S,1) + OutData%WaveVel2S(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -2719,6 +2215,7 @@ SUBROUTINE Waves2_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_CopyParam' @@ -2731,25 +2228,15 @@ SUBROUTINE Waves2_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM DstParamData%NWaveElev = SrcParamData%NWaveElev DstParamData%NStepWave = SrcParamData%NStepWave DstParamData%NStepWave2 = SrcParamData%NStepWave2 -IF (ALLOCATED(SrcParamData%WaveTime)) THEN - i1_l = LBOUND(SrcParamData%WaveTime,1) - i1_u = UBOUND(SrcParamData%WaveTime,1) - IF (.NOT. ALLOCATED(DstParamData%WaveTime)) THEN - ALLOCATE(DstParamData%WaveTime(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveTime.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstParamData%WaveTime = SrcParamData%WaveTime -ENDIF IF (ALLOCATED(SrcParamData%WaveElev2)) THEN i1_l = LBOUND(SrcParamData%WaveElev2,1) i1_u = UBOUND(SrcParamData%WaveElev2,1) i2_l = LBOUND(SrcParamData%WaveElev2,2) i2_u = UBOUND(SrcParamData%WaveElev2,2) + i3_l = LBOUND(SrcParamData%WaveElev2,3) + i3_u = UBOUND(SrcParamData%WaveElev2,3) IF (.NOT. ALLOCATED(DstParamData%WaveElev2)) THEN - ALLOCATE(DstParamData%WaveElev2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + ALLOCATE(DstParamData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev2.', ErrStat, ErrMsg,RoutineName) RETURN @@ -2757,28 +2244,6 @@ SUBROUTINE Waves2_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM END IF DstParamData%WaveElev2 = SrcParamData%WaveElev2 ENDIF -IF (ALLOCATED(SrcParamData%OutParam)) THEN - i1_l = LBOUND(SrcParamData%OutParam,1) - i1_u = UBOUND(SrcParamData%OutParam,1) - IF (.NOT. ALLOCATED(DstParamData%OutParam)) THEN - ALLOCATE(DstParamData%OutParam(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DO i1 = LBOUND(SrcParamData%OutParam,1), UBOUND(SrcParamData%OutParam,1) - CALL NWTC_Library_Copyoutparmtype( SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN - ENDDO -ENDIF - DstParamData%NumOuts = SrcParamData%NumOuts - DstParamData%NumOutAll = SrcParamData%NumOutAll - DstParamData%OutFmt = SrcParamData%OutFmt - DstParamData%OutSFmt = SrcParamData%OutSFmt - DstParamData%Delim = SrcParamData%Delim - DstParamData%UnOutFile = SrcParamData%UnOutFile END SUBROUTINE Waves2_CopyParam SUBROUTINE Waves2_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -2790,17 +2255,8 @@ SUBROUTINE Waves2_DestroyParam( ParamData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(ParamData%WaveTime)) THEN - DEALLOCATE(ParamData%WaveTime) -ENDIF IF (ALLOCATED(ParamData%WaveElev2)) THEN DEALLOCATE(ParamData%WaveElev2) -ENDIF -IF (ALLOCATED(ParamData%OutParam)) THEN -DO i1 = LBOUND(ParamData%OutParam,1), UBOUND(ParamData%OutParam,1) - CALL NWTC_Library_Destroyoutparmtype( ParamData%OutParam(i1), ErrStat, ErrMsg ) -ENDDO - DEALLOCATE(ParamData%OutParam) ENDIF END SUBROUTINE Waves2_DestroyParam @@ -2845,46 +2301,11 @@ SUBROUTINE Waves2_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Int_BufSz = Int_BufSz + 1 ! NWaveElev Int_BufSz = Int_BufSz + 1 ! NStepWave Int_BufSz = Int_BufSz + 1 ! NStepWave2 - Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime - END IF Int_BufSz = Int_BufSz + 1 ! WaveElev2 allocated yes/no IF ( ALLOCATED(InData%WaveElev2) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveElev2 upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + 2*3 ! WaveElev2 upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElev2) ! WaveElev2 END IF - Int_BufSz = Int_BufSz + 1 ! OutParam allocated yes/no - IF ( ALLOCATED(InData%OutParam) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! OutParam upper/lower bounds for each dimension - ! Allocate buffers for subtypes, if any (we'll get sizes from these) - DO i1 = LBOUND(InData%OutParam,1), UBOUND(InData%OutParam,1) - Int_BufSz = Int_BufSz + 3 ! OutParam: size of buffers for each call to pack subtype - CALL NWTC_Library_Packoutparmtype( Re_Buf, Db_Buf, Int_Buf, InData%OutParam(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OutParam - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! OutParam - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! OutParam - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! OutParam - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF - END DO - END IF - Int_BufSz = Int_BufSz + 1 ! NumOuts - Int_BufSz = Int_BufSz + 1 ! NumOutAll - Int_BufSz = Int_BufSz + 1*LEN(InData%OutFmt) ! OutFmt - Int_BufSz = Int_BufSz + 1*LEN(InData%OutSFmt) ! OutSFmt - Int_BufSz = Int_BufSz + 1*LEN(InData%Delim) ! Delim - Int_BufSz = Int_BufSz + 1 ! UnOutFile IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2924,21 +2345,6 @@ SUBROUTINE Waves2_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NStepWave2 Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveTime) ) 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%WaveTime,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveTime,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%WaveTime,1), UBOUND(InData%WaveTime,1) - ReKiBuf(Re_Xferred) = InData%WaveTime(i1) - Re_Xferred = Re_Xferred + 1 - END DO - END IF IF ( .NOT. ALLOCATED(InData%WaveElev2) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -2950,74 +2356,20 @@ SUBROUTINE Waves2_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,2) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,3) Int_Xferred = Int_Xferred + 2 - DO i2 = LBOUND(InData%WaveElev2,2), UBOUND(InData%WaveElev2,2) - DO i1 = LBOUND(InData%WaveElev2,1), UBOUND(InData%WaveElev2,1) - ReKiBuf(Re_Xferred) = InData%WaveElev2(i1,i2) - Re_Xferred = Re_Xferred + 1 + DO i3 = LBOUND(InData%WaveElev2,3), UBOUND(InData%WaveElev2,3) + DO i2 = LBOUND(InData%WaveElev2,2), UBOUND(InData%WaveElev2,2) + DO i1 = LBOUND(InData%WaveElev2,1), UBOUND(InData%WaveElev2,1) + ReKiBuf(Re_Xferred) = InData%WaveElev2(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%OutParam) ) 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%OutParam,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%OutParam,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%OutParam,1), UBOUND(InData%OutParam,1) - CALL NWTC_Library_Packoutparmtype( Re_Buf, Db_Buf, Int_Buf, InData%OutParam(i1), ErrStat2, ErrMsg2, OnlySize ) ! OutParam - 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 - END DO - END IF - IntKiBuf(Int_Xferred) = InData%NumOuts - Int_Xferred = Int_Xferred + 1 - IntKiBuf(Int_Xferred) = InData%NumOutAll - Int_Xferred = Int_Xferred + 1 - DO I = 1, LEN(InData%OutFmt) - IntKiBuf(Int_Xferred) = ICHAR(InData%OutFmt(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - DO I = 1, LEN(InData%OutSFmt) - IntKiBuf(Int_Xferred) = ICHAR(InData%OutSFmt(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - DO I = 1, LEN(InData%Delim) - IntKiBuf(Int_Xferred) = ICHAR(InData%Delim(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - IntKiBuf(Int_Xferred) = InData%UnOutFile - Int_Xferred = Int_Xferred + 1 END SUBROUTINE Waves2_PackParam SUBROUTINE Waves2_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -3035,6 +2387,7 @@ SUBROUTINE Waves2_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_UnPackParam' @@ -3060,24 +2413,6 @@ SUBROUTINE Waves2_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err Int_Xferred = Int_Xferred + 1 OutData%NStepWave2 = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime 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 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) - ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%WaveTime,1), UBOUND(OutData%WaveTime,1) - OutData%WaveTime(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev2 not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -3088,93 +2423,24 @@ SUBROUTINE Waves2_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err i2_l = IntKiBuf( Int_Xferred ) i2_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 IF (ALLOCATED(OutData%WaveElev2)) DEALLOCATE(OutData%WaveElev2) - ALLOCATE(OutData%WaveElev2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + ALLOCATE(OutData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev2.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i2 = LBOUND(OutData%WaveElev2,2), UBOUND(OutData%WaveElev2,2) - DO i1 = LBOUND(OutData%WaveElev2,1), UBOUND(OutData%WaveElev2,1) - OutData%WaveElev2(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i3 = LBOUND(OutData%WaveElev2,3), UBOUND(OutData%WaveElev2,3) + DO i2 = LBOUND(OutData%WaveElev2,2), UBOUND(OutData%WaveElev2,2) + DO i1 = LBOUND(OutData%WaveElev2,1), UBOUND(OutData%WaveElev2,1) + OutData%WaveElev2(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO END DO END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! OutParam 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 - IF (ALLOCATED(OutData%OutParam)) DEALLOCATE(OutData%OutParam) - ALLOCATE(OutData%OutParam(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutParam.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%OutParam,1), UBOUND(OutData%OutParam,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_Unpackoutparmtype( Re_Buf, Db_Buf, Int_Buf, OutData%OutParam(i1), ErrStat2, ErrMsg2 ) ! OutParam - 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) - END DO - END IF - OutData%NumOuts = IntKiBuf(Int_Xferred) - Int_Xferred = Int_Xferred + 1 - OutData%NumOutAll = IntKiBuf(Int_Xferred) - Int_Xferred = Int_Xferred + 1 - DO I = 1, LEN(OutData%OutFmt) - OutData%OutFmt(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - DO I = 1, LEN(OutData%OutSFmt) - OutData%OutSFmt(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - DO I = 1, LEN(OutData%Delim) - OutData%Delim(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - OutData%UnOutFile = IntKiBuf(Int_Xferred) - Int_Xferred = Int_Xferred + 1 END SUBROUTINE Waves2_UnPackParam SUBROUTINE Waves2_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) @@ -3310,25 +2576,13 @@ SUBROUTINE Waves2_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, E 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) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_CopyOutput' ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(SrcOutputData%WriteOutput)) THEN - i1_l = LBOUND(SrcOutputData%WriteOutput,1) - i1_u = UBOUND(SrcOutputData%WriteOutput,1) - IF (.NOT. ALLOCATED(DstOutputData%WriteOutput)) THEN - ALLOCATE(DstOutputData%WriteOutput(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstOutputData%WriteOutput = SrcOutputData%WriteOutput -ENDIF + DstOutputData%DummyOutput = SrcOutputData%DummyOutput END SUBROUTINE Waves2_CopyOutput SUBROUTINE Waves2_DestroyOutput( OutputData, ErrStat, ErrMsg ) @@ -3340,9 +2594,6 @@ SUBROUTINE Waves2_DestroyOutput( OutputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(OutputData%WriteOutput)) THEN - DEALLOCATE(OutputData%WriteOutput) -ENDIF END SUBROUTINE Waves2_DestroyOutput SUBROUTINE Waves2_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -3380,11 +2631,7 @@ SUBROUTINE Waves2_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Re_BufSz = 0 Db_BufSz = 0 Int_BufSz = 0 - Int_BufSz = Int_BufSz + 1 ! WriteOutput allocated yes/no - IF ( ALLOCATED(InData%WriteOutput) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! WriteOutput upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WriteOutput) ! WriteOutput - END IF + Re_BufSz = Re_BufSz + 1 ! DummyOutput IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -3412,21 +2659,8 @@ SUBROUTINE Waves2_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_Xferred = 1 Int_Xferred = 1 - IF ( .NOT. ALLOCATED(InData%WriteOutput) ) 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%WriteOutput,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WriteOutput,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%WriteOutput,1), UBOUND(InData%WriteOutput,1) - ReKiBuf(Re_Xferred) = InData%WriteOutput(i1) - Re_Xferred = Re_Xferred + 1 - END DO - END IF + ReKiBuf(Re_Xferred) = InData%DummyOutput + Re_Xferred = Re_Xferred + 1 END SUBROUTINE Waves2_PackOutput SUBROUTINE Waves2_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -3442,7 +2676,6 @@ SUBROUTINE Waves2_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er 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) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_UnPackOutput' @@ -3456,24 +2689,8 @@ SUBROUTINE Waves2_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutput 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 - IF (ALLOCATED(OutData%WriteOutput)) DEALLOCATE(OutData%WriteOutput) - ALLOCATE(OutData%WriteOutput(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutput.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%WriteOutput,1), UBOUND(OutData%WriteOutput,1) - OutData%WriteOutput(i1) = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 - END DO - END IF + OutData%DummyOutput = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 END SUBROUTINE Waves2_UnPackOutput @@ -3710,8 +2927,6 @@ SUBROUTINE Waves2_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, Err REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts - INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -3726,12 +2941,8 @@ SUBROUTINE Waves2_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, Err END IF ScaleFactor = t_out / t(2) -IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN - DO i1 = LBOUND(y_out%WriteOutput,1),UBOUND(y_out%WriteOutput,1) - b = -(y1%WriteOutput(i1) - y2%WriteOutput(i1)) - y_out%WriteOutput(i1) = y1%WriteOutput(i1) + b * ScaleFactor - END DO -END IF ! check if allocated + b = -(y1%DummyOutput - y2%DummyOutput) + y_out%DummyOutput = y1%DummyOutput + b * ScaleFactor END SUBROUTINE Waves2_Output_ExtrapInterp1 @@ -3767,8 +2978,6 @@ SUBROUTINE Waves2_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Output_ExtrapInterp2' - INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts - INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -3789,13 +2998,9 @@ SUBROUTINE Waves2_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, END IF ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) -IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN - DO i1 = LBOUND(y_out%WriteOutput,1),UBOUND(y_out%WriteOutput,1) - b = (t(3)**2*(y1%WriteOutput(i1) - y2%WriteOutput(i1)) + t(2)**2*(-y1%WriteOutput(i1) + y3%WriteOutput(i1)))* scaleFactor - c = ( (t(2)-t(3))*y1%WriteOutput(i1) + t(3)*y2%WriteOutput(i1) - t(2)*y3%WriteOutput(i1) ) * scaleFactor - y_out%WriteOutput(i1) = y1%WriteOutput(i1) + b + c * t_out - END DO -END IF ! check if allocated + b = (t(3)**2*(y1%DummyOutput - y2%DummyOutput) + t(2)**2*(-y1%DummyOutput + y3%DummyOutput))* scaleFactor + c = ( (t(2)-t(3))*y1%DummyOutput + t(3)*y2%DummyOutput - t(2)*y3%DummyOutput ) * scaleFactor + y_out%DummyOutput = y1%DummyOutput + b + c * t_out END SUBROUTINE Waves2_Output_ExtrapInterp2 END MODULE Waves2_Types diff --git a/modules/seastate/src/Waves_Types.f90 b/modules/seastate/src/Waves_Types.f90 index c02e8c9f9e..1216b3f6c3 100644 --- a/modules/seastate/src/Waves_Types.f90 +++ b/modules/seastate/src/Waves_Types.f90 @@ -42,6 +42,7 @@ MODULE Waves_Types INTEGER(IntKi) :: UnSum !< The unit number for the HydroDyn summary file [-] REAL(ReKi) :: Gravity !< Gravitational acceleration [(m/s^2)] REAL(ReKi) :: MSL2SWL !< Offset between still-water level and mean sea level [positive upward; must be zero if using WAMIT] [(meters)] + INTEGER(IntKi) , DIMENSION(1:3) :: nGrid !< Grid dimensions [-] REAL(SiKi) :: WvLowCOff !< Low cut-off frequency or lower frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4] [(rad/s)] REAL(SiKi) :: WvHiCOff !< High cut-off frequency or upper frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4] [(rad/s)] REAL(SiKi) :: WaveDir !< Mean incident wave propagation heading direction [(degrees)] @@ -64,14 +65,13 @@ MODULE Waves_Types REAL(SiKi) :: WaveTp !< Peak spectral period of incident waves [(sec)] REAL(ReKi) :: WtrDens !< Water density [(kg/m^3)] REAL(SiKi) :: WtrDpth !< Water depth [(meters)] - INTEGER(IntKi) :: NWaveElev !< Number of points where the incident wave elevations can be output [-] + INTEGER(IntKi) :: NWaveElev !< Number of points where the incident wave elevations are computed (the XY grid point locations) [-] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevxi !< xi-coordinates for points where the incident wave elevations can be output [(meters)] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevyi !< yi-coordinates for points where the incident wave elevations can be output [(meters)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevXY !< Supplied by Driver: X-Y locations for WaveElevation output (for visualization). Index 1 corresponds to X or Y coordinate. Index 2 corresponds to point number. [-] INTEGER(IntKi) :: NWaveKin !< Number of points where the incident wave kinematics will be computed [-] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinxi !< xi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level [(meters)] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinyi !< yi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level [(meters)] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinzi !< zi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean sea level [(meters)] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinxi !< xi-coordinates for points where the incident wave kinematics will be computed (grid points); these are relative to the mean sea level [(meters)] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinyi !< yi-coordinates for points where the incident wave kinematics will be computed (grid points); these are relative to the mean sea level [(meters)] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinzi !< zi-coordinates for points where the incident wave kinematics will be computed (grid points); these are relative to the mean sea level [(meters)] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: CurrVxi !< xi-component of the current velocity at elevation i [(m/s)] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: CurrVyi !< yi-component of the current velocity at elevation i [(m/s)] REAL(SiKi) :: PCurrVxiPz0 !< xi-component of the partial derivative of the current velocity at elevation near mean sea level [(m/s)] @@ -81,8 +81,8 @@ MODULE Waves_Types ! ======================= ! ========= Waves_InitOutputType ======= TYPE, PUBLIC :: Waves_InitOutputType - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevC0 !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveDirArr !< Wave direction array. Each frequency has a unique direction of WaveNDir > 1 [(degrees)] + REAL(SiKi) , DIMENSION(:,:), POINTER :: WaveElevC0 => NULL() !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveDirArr => NULL() !< Wave direction array. Each frequency has a unique direction of WaveNDir > 1 [(degrees)] REAL(SiKi) :: WaveDirMin !< Minimum wave direction. [(degrees)] REAL(SiKi) :: WaveDirMax !< Maximum wave direction. [(degrees)] REAL(SiKi) :: WaveDir !< Incident wave propagation heading direction [(degrees)] @@ -90,16 +90,11 @@ MODULE Waves_Types LOGICAL :: WaveMultiDir !< Indicates the waves are multidirectional -- set by HydroDyn_Input [-] REAL(SiKi) :: WaveDOmega !< Frequency step for incident wave calculations [(rad/s)] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinzi !< zi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean see level [(meters)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: PWaveDynP0 !< Instantaneous dynamic pressure of incident waves , at the location (xi,yi,0), at each of the NWaveKin points where the incident wave kinematics will be computed [(N/m^2)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveDynP !< Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed [(N/m^2)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveAcc !< Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed [(m/s^2)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: PWaveAcc0 !< Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin points where the incident wave kinematics will be computed [(m/s^2)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveVel !< Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.) [(m/s)] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: PWaveVel0 !< Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.) [(m/s)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElev !< Instantaneous elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output [(meters)] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElev0 !< Instantaneous elevation time-series of incident waves at the platform reference point [(meters)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevSeries !< Instantaneous elevation time-series at each of the points given by WaveElevXY. Used for making movies of the waves. First index is the timestep. Second index is XY point number corresponding to second index of WaveElevXY. [(m)] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< Simulation times at which the instantaneous elevation of, velocity of, acceleration of, and loads associated with the incident waves are determined [(sec)] + REAL(SiKi) , DIMENSION(:,:,:,:), POINTER :: WaveDynP => NULL() !< Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed [(N/m^2)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveAcc => NULL() !< Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed [(m/s^2)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveVel => NULL() !< Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.) [(m/s)] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev => NULL() !< Instantaneous elevation time-series of incident waves at each of the XY grid points [(meters)] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Simulation times at which the instantaneous elevation of, velocity of, acceleration of, and loads associated with the incident waves are determined [(sec)] REAL(DbKi) :: WaveTMax !< Analysis time for incident wave calculations; the actual analysis time may be larger than this value in order for the maintain an effecient FFT [(sec)] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: nodeInWater !< Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated [-] REAL(SiKi) :: RhoXg !< = WtrDens*Gravity [-] @@ -163,6 +158,8 @@ SUBROUTINE Waves_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves_CopyInitInput' @@ -176,6 +173,7 @@ SUBROUTINE Waves_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er DstInitInputData%UnSum = SrcInitInputData%UnSum DstInitInputData%Gravity = SrcInitInputData%Gravity DstInitInputData%MSL2SWL = SrcInitInputData%MSL2SWL + DstInitInputData%nGrid = SrcInitInputData%nGrid DstInitInputData%WvLowCOff = SrcInitInputData%WvLowCOff DstInitInputData%WvHiCOff = SrcInitInputData%WvHiCOff DstInitInputData%WaveDir = SrcInitInputData%WaveDir @@ -222,20 +220,6 @@ SUBROUTINE Waves_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er END IF END IF DstInitInputData%WaveElevyi = SrcInitInputData%WaveElevyi -ENDIF -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%NWaveKin = SrcInitInputData%NWaveKin IF (ALLOCATED(SrcInitInputData%WaveKinxi)) THEN @@ -320,9 +304,6 @@ SUBROUTINE Waves_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitInputData%WaveElevyi)) THEN DEALLOCATE(InitInputData%WaveElevyi) ENDIF -IF (ALLOCATED(InitInputData%WaveElevXY)) THEN - DEALLOCATE(InitInputData%WaveElevXY) -ENDIF IF (ALLOCATED(InitInputData%WaveKinxi)) THEN DEALLOCATE(InitInputData%WaveKinxi) ENDIF @@ -383,6 +364,7 @@ SUBROUTINE Waves_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Int_BufSz = Int_BufSz + 1 ! UnSum Re_BufSz = Re_BufSz + 1 ! Gravity Re_BufSz = Re_BufSz + 1 ! MSL2SWL + Int_BufSz = Int_BufSz + SIZE(InData%nGrid) ! nGrid Re_BufSz = Re_BufSz + 1 ! WvLowCOff Re_BufSz = Re_BufSz + 1 ! WvHiCOff Re_BufSz = Re_BufSz + 1 ! WaveDir @@ -415,11 +397,6 @@ SUBROUTINE Waves_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err IF ( ALLOCATED(InData%WaveElevyi) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveElevyi upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElevyi) ! WaveElevyi - END IF - 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 Int_BufSz = Int_BufSz + 1 ! NWaveKin Int_BufSz = Int_BufSz + 1 ! WaveKinxi allocated yes/no @@ -514,6 +491,10 @@ SUBROUTINE Waves_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Re_Xferred = Re_Xferred + 1 ReKiBuf(Re_Xferred) = InData%MSL2SWL Re_Xferred = Re_Xferred + 1 + DO i1 = LBOUND(InData%nGrid,1), UBOUND(InData%nGrid,1) + IntKiBuf(Int_Xferred) = InData%nGrid(i1) + Int_Xferred = Int_Xferred + 1 + END DO ReKiBuf(Re_Xferred) = InData%WvLowCOff Re_Xferred = Re_Xferred + 1 ReKiBuf(Re_Xferred) = InData%WvHiCOff @@ -595,26 +576,6 @@ SUBROUTINE Waves_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err ReKiBuf(Re_Xferred) = InData%WaveElevyi(i1) Re_Xferred = Re_Xferred + 1 END DO - END IF - 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 IntKiBuf(Int_Xferred) = InData%NWaveKin Int_Xferred = Int_Xferred + 1 @@ -743,6 +704,8 @@ SUBROUTINE Waves_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves_UnPackInitInput' @@ -776,6 +739,12 @@ SUBROUTINE Waves_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 OutData%MSL2SWL = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 + i1_l = LBOUND(OutData%nGrid,1) + i1_u = UBOUND(OutData%nGrid,1) + DO i1 = LBOUND(OutData%nGrid,1), UBOUND(OutData%nGrid,1) + OutData%nGrid(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + END DO OutData%WvLowCOff = REAL(ReKiBuf(Re_Xferred), SiKi) Re_Xferred = Re_Xferred + 1 OutData%WvHiCOff = REAL(ReKiBuf(Re_Xferred), SiKi) @@ -865,29 +834,6 @@ SUBROUTINE Waves_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, OutData%WaveElevyi(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) Re_Xferred = Re_Xferred + 1 END DO - END IF - 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%NWaveKin = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 @@ -1038,18 +984,20 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves_CopyInitOutput' ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(SrcInitOutputData%WaveElevC0)) THEN +IF (ASSOCIATED(SrcInitOutputData%WaveElevC0)) THEN i1_l = LBOUND(SrcInitOutputData%WaveElevC0,1) i1_u = UBOUND(SrcInitOutputData%WaveElevC0,1) i2_l = LBOUND(SrcInitOutputData%WaveElevC0,2) i2_u = UBOUND(SrcInitOutputData%WaveElevC0,2) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveElevC0)) THEN + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveElevC0)) THEN ALLOCATE(DstInitOutputData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) @@ -1058,10 +1006,10 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WaveElevC0 = SrcInitOutputData%WaveElevC0 ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveDirArr)) THEN +IF (ASSOCIATED(SrcInitOutputData%WaveDirArr)) THEN i1_l = LBOUND(SrcInitOutputData%WaveDirArr,1) i1_u = UBOUND(SrcInitOutputData%WaveDirArr,1) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveDirArr)) THEN + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveDirArr)) THEN ALLOCATE(DstInitOutputData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) @@ -1088,27 +1036,17 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WaveKinzi = SrcInitOutputData%WaveKinzi ENDIF -IF (ALLOCATED(SrcInitOutputData%PWaveDynP0)) THEN - i1_l = LBOUND(SrcInitOutputData%PWaveDynP0,1) - i1_u = UBOUND(SrcInitOutputData%PWaveDynP0,1) - i2_l = LBOUND(SrcInitOutputData%PWaveDynP0,2) - i2_u = UBOUND(SrcInitOutputData%PWaveDynP0,2) - IF (.NOT. ALLOCATED(DstInitOutputData%PWaveDynP0)) THEN - ALLOCATE(DstInitOutputData%PWaveDynP0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%PWaveDynP0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%PWaveDynP0 = SrcInitOutputData%PWaveDynP0 -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveDynP)) THEN +IF (ASSOCIATED(SrcInitOutputData%WaveDynP)) THEN i1_l = LBOUND(SrcInitOutputData%WaveDynP,1) i1_u = UBOUND(SrcInitOutputData%WaveDynP,1) i2_l = LBOUND(SrcInitOutputData%WaveDynP,2) i2_u = UBOUND(SrcInitOutputData%WaveDynP,2) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveDynP)) THEN - ALLOCATE(DstInitOutputData%WaveDynP(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + i3_l = LBOUND(SrcInitOutputData%WaveDynP,3) + i3_u = UBOUND(SrcInitOutputData%WaveDynP,3) + i4_l = LBOUND(SrcInitOutputData%WaveDynP,4) + i4_u = UBOUND(SrcInitOutputData%WaveDynP,4) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveDynP)) THEN + ALLOCATE(DstInitOutputData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveDynP.', ErrStat, ErrMsg,RoutineName) RETURN @@ -1116,15 +1054,19 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WaveDynP = SrcInitOutputData%WaveDynP ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveAcc)) THEN +IF (ASSOCIATED(SrcInitOutputData%WaveAcc)) THEN i1_l = LBOUND(SrcInitOutputData%WaveAcc,1) i1_u = UBOUND(SrcInitOutputData%WaveAcc,1) i2_l = LBOUND(SrcInitOutputData%WaveAcc,2) i2_u = UBOUND(SrcInitOutputData%WaveAcc,2) i3_l = LBOUND(SrcInitOutputData%WaveAcc,3) i3_u = UBOUND(SrcInitOutputData%WaveAcc,3) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveAcc)) THEN - ALLOCATE(DstInitOutputData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = LBOUND(SrcInitOutputData%WaveAcc,4) + i4_u = UBOUND(SrcInitOutputData%WaveAcc,4) + i5_l = LBOUND(SrcInitOutputData%WaveAcc,5) + i5_u = UBOUND(SrcInitOutputData%WaveAcc,5) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveAcc)) THEN + ALLOCATE(DstInitOutputData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveAcc.', ErrStat, ErrMsg,RoutineName) RETURN @@ -1132,31 +1074,19 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WaveAcc = SrcInitOutputData%WaveAcc ENDIF -IF (ALLOCATED(SrcInitOutputData%PWaveAcc0)) THEN - i1_l = LBOUND(SrcInitOutputData%PWaveAcc0,1) - i1_u = UBOUND(SrcInitOutputData%PWaveAcc0,1) - i2_l = LBOUND(SrcInitOutputData%PWaveAcc0,2) - i2_u = UBOUND(SrcInitOutputData%PWaveAcc0,2) - i3_l = LBOUND(SrcInitOutputData%PWaveAcc0,3) - i3_u = UBOUND(SrcInitOutputData%PWaveAcc0,3) - IF (.NOT. ALLOCATED(DstInitOutputData%PWaveAcc0)) THEN - ALLOCATE(DstInitOutputData%PWaveAcc0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%PWaveAcc0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%PWaveAcc0 = SrcInitOutputData%PWaveAcc0 -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveVel)) THEN +IF (ASSOCIATED(SrcInitOutputData%WaveVel)) THEN i1_l = LBOUND(SrcInitOutputData%WaveVel,1) i1_u = UBOUND(SrcInitOutputData%WaveVel,1) i2_l = LBOUND(SrcInitOutputData%WaveVel,2) i2_u = UBOUND(SrcInitOutputData%WaveVel,2) i3_l = LBOUND(SrcInitOutputData%WaveVel,3) i3_u = UBOUND(SrcInitOutputData%WaveVel,3) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveVel)) THEN - ALLOCATE(DstInitOutputData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = LBOUND(SrcInitOutputData%WaveVel,4) + i4_u = UBOUND(SrcInitOutputData%WaveVel,4) + i5_l = LBOUND(SrcInitOutputData%WaveVel,5) + i5_u = UBOUND(SrcInitOutputData%WaveVel,5) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveVel)) THEN + ALLOCATE(DstInitOutputData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveVel.', ErrStat, ErrMsg,RoutineName) RETURN @@ -1164,29 +1094,15 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WaveVel = SrcInitOutputData%WaveVel ENDIF -IF (ALLOCATED(SrcInitOutputData%PWaveVel0)) THEN - i1_l = LBOUND(SrcInitOutputData%PWaveVel0,1) - i1_u = UBOUND(SrcInitOutputData%PWaveVel0,1) - i2_l = LBOUND(SrcInitOutputData%PWaveVel0,2) - i2_u = UBOUND(SrcInitOutputData%PWaveVel0,2) - i3_l = LBOUND(SrcInitOutputData%PWaveVel0,3) - i3_u = UBOUND(SrcInitOutputData%PWaveVel0,3) - IF (.NOT. ALLOCATED(DstInitOutputData%PWaveVel0)) THEN - ALLOCATE(DstInitOutputData%PWaveVel0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%PWaveVel0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%PWaveVel0 = SrcInitOutputData%PWaveVel0 -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveElev)) THEN +IF (ASSOCIATED(SrcInitOutputData%WaveElev)) THEN i1_l = LBOUND(SrcInitOutputData%WaveElev,1) i1_u = UBOUND(SrcInitOutputData%WaveElev,1) i2_l = LBOUND(SrcInitOutputData%WaveElev,2) i2_u = UBOUND(SrcInitOutputData%WaveElev,2) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveElev)) THEN - ALLOCATE(DstInitOutputData%WaveElev(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + i3_l = LBOUND(SrcInitOutputData%WaveElev,3) + i3_u = UBOUND(SrcInitOutputData%WaveElev,3) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveElev)) THEN + ALLOCATE(DstInitOutputData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElev.', ErrStat, ErrMsg,RoutineName) RETURN @@ -1194,36 +1110,10 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WaveElev = SrcInitOutputData%WaveElev ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveElev0)) THEN - i1_l = LBOUND(SrcInitOutputData%WaveElev0,1) - i1_u = UBOUND(SrcInitOutputData%WaveElev0,1) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveElev0)) THEN - ALLOCATE(DstInitOutputData%WaveElev0(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElev0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WaveElev0 = SrcInitOutputData%WaveElev0 -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveElevSeries)) THEN - i1_l = LBOUND(SrcInitOutputData%WaveElevSeries,1) - i1_u = UBOUND(SrcInitOutputData%WaveElevSeries,1) - i2_l = LBOUND(SrcInitOutputData%WaveElevSeries,2) - i2_u = UBOUND(SrcInitOutputData%WaveElevSeries,2) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveElevSeries)) THEN - ALLOCATE(DstInitOutputData%WaveElevSeries(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElevSeries.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WaveElevSeries = SrcInitOutputData%WaveElevSeries -ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveTime)) THEN +IF (ASSOCIATED(SrcInitOutputData%WaveTime)) THEN i1_l = LBOUND(SrcInitOutputData%WaveTime,1) i1_u = UBOUND(SrcInitOutputData%WaveTime,1) - IF (.NOT. ALLOCATED(DstInitOutputData%WaveTime)) THEN + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveTime)) THEN ALLOCATE(DstInitOutputData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -1261,44 +1151,36 @@ SUBROUTINE Waves_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(InitOutputData%WaveElevC0)) THEN +IF (ASSOCIATED(InitOutputData%WaveElevC0)) THEN DEALLOCATE(InitOutputData%WaveElevC0) + InitOutputData%WaveElevC0 => NULL() ENDIF -IF (ALLOCATED(InitOutputData%WaveDirArr)) THEN +IF (ASSOCIATED(InitOutputData%WaveDirArr)) THEN DEALLOCATE(InitOutputData%WaveDirArr) + InitOutputData%WaveDirArr => NULL() ENDIF IF (ALLOCATED(InitOutputData%WaveKinzi)) THEN DEALLOCATE(InitOutputData%WaveKinzi) ENDIF -IF (ALLOCATED(InitOutputData%PWaveDynP0)) THEN - DEALLOCATE(InitOutputData%PWaveDynP0) -ENDIF -IF (ALLOCATED(InitOutputData%WaveDynP)) THEN +IF (ASSOCIATED(InitOutputData%WaveDynP)) THEN DEALLOCATE(InitOutputData%WaveDynP) + InitOutputData%WaveDynP => NULL() ENDIF -IF (ALLOCATED(InitOutputData%WaveAcc)) THEN +IF (ASSOCIATED(InitOutputData%WaveAcc)) THEN DEALLOCATE(InitOutputData%WaveAcc) + InitOutputData%WaveAcc => NULL() ENDIF -IF (ALLOCATED(InitOutputData%PWaveAcc0)) THEN - DEALLOCATE(InitOutputData%PWaveAcc0) -ENDIF -IF (ALLOCATED(InitOutputData%WaveVel)) THEN +IF (ASSOCIATED(InitOutputData%WaveVel)) THEN DEALLOCATE(InitOutputData%WaveVel) + InitOutputData%WaveVel => NULL() ENDIF -IF (ALLOCATED(InitOutputData%PWaveVel0)) THEN - DEALLOCATE(InitOutputData%PWaveVel0) -ENDIF -IF (ALLOCATED(InitOutputData%WaveElev)) THEN +IF (ASSOCIATED(InitOutputData%WaveElev)) THEN DEALLOCATE(InitOutputData%WaveElev) + InitOutputData%WaveElev => NULL() ENDIF -IF (ALLOCATED(InitOutputData%WaveElev0)) THEN - DEALLOCATE(InitOutputData%WaveElev0) -ENDIF -IF (ALLOCATED(InitOutputData%WaveElevSeries)) THEN - DEALLOCATE(InitOutputData%WaveElevSeries) -ENDIF -IF (ALLOCATED(InitOutputData%WaveTime)) THEN +IF (ASSOCIATED(InitOutputData%WaveTime)) THEN DEALLOCATE(InitOutputData%WaveTime) + InitOutputData%WaveTime => NULL() ENDIF IF (ALLOCATED(InitOutputData%nodeInWater)) THEN DEALLOCATE(InitOutputData%nodeInWater) @@ -1341,12 +1223,12 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Db_BufSz = 0 Int_BufSz = 0 Int_BufSz = Int_BufSz + 1 ! WaveElevC0 allocated yes/no - IF ( ALLOCATED(InData%WaveElevC0) ) THEN + IF ( ASSOCIATED(InData%WaveElevC0) ) THEN Int_BufSz = Int_BufSz + 2*2 ! WaveElevC0 upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC0) ! WaveElevC0 END IF Int_BufSz = Int_BufSz + 1 ! WaveDirArr allocated yes/no - IF ( ALLOCATED(InData%WaveDirArr) ) THEN + IF ( ASSOCIATED(InData%WaveDirArr) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveDirArr upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveDirArr) ! WaveDirArr END IF @@ -1361,53 +1243,28 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_BufSz = Int_BufSz + 2*1 ! WaveKinzi upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveKinzi) ! WaveKinzi END IF - Int_BufSz = Int_BufSz + 1 ! PWaveDynP0 allocated yes/no - IF ( ALLOCATED(InData%PWaveDynP0) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! PWaveDynP0 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%PWaveDynP0) ! PWaveDynP0 - END IF Int_BufSz = Int_BufSz + 1 ! WaveDynP allocated yes/no - IF ( ALLOCATED(InData%WaveDynP) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveDynP upper/lower bounds for each dimension + IF ( ASSOCIATED(InData%WaveDynP) ) THEN + Int_BufSz = Int_BufSz + 2*4 ! WaveDynP upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveDynP) ! WaveDynP END IF Int_BufSz = Int_BufSz + 1 ! WaveAcc allocated yes/no - IF ( ALLOCATED(InData%WaveAcc) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveAcc upper/lower bounds for each dimension + IF ( ASSOCIATED(InData%WaveAcc) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveAcc upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveAcc) ! WaveAcc END IF - Int_BufSz = Int_BufSz + 1 ! PWaveAcc0 allocated yes/no - IF ( ALLOCATED(InData%PWaveAcc0) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! PWaveAcc0 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%PWaveAcc0) ! PWaveAcc0 - END IF Int_BufSz = Int_BufSz + 1 ! WaveVel allocated yes/no - IF ( ALLOCATED(InData%WaveVel) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveVel upper/lower bounds for each dimension + IF ( ASSOCIATED(InData%WaveVel) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveVel upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveVel) ! WaveVel END IF - Int_BufSz = Int_BufSz + 1 ! PWaveVel0 allocated yes/no - IF ( ALLOCATED(InData%PWaveVel0) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! PWaveVel0 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%PWaveVel0) ! PWaveVel0 - END IF Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no - IF ( ALLOCATED(InData%WaveElev) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveElev upper/lower bounds for each dimension + IF ( ASSOCIATED(InData%WaveElev) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev END IF - Int_BufSz = Int_BufSz + 1 ! WaveElev0 allocated yes/no - IF ( ALLOCATED(InData%WaveElev0) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! WaveElev0 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveElev0) ! WaveElev0 - END IF - Int_BufSz = Int_BufSz + 1 ! WaveElevSeries allocated yes/no - IF ( ALLOCATED(InData%WaveElevSeries) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveElevSeries upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveElevSeries) ! WaveElevSeries - END IF Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN + IF ( ASSOCIATED(InData%WaveTime) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime END IF @@ -1447,7 +1304,7 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Db_Xferred = 1 Int_Xferred = 1 - IF ( .NOT. ALLOCATED(InData%WaveElevC0) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveElevC0) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -1467,7 +1324,7 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveDirArr) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveDirArr) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -1509,27 +1366,7 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_Xferred = Re_Xferred + 1 END DO END IF - IF ( .NOT. ALLOCATED(InData%PWaveDynP0) ) 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%PWaveDynP0,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PWaveDynP0,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%PWaveDynP0,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PWaveDynP0,2) - Int_Xferred = Int_Xferred + 2 - - DO i2 = LBOUND(InData%PWaveDynP0,2), UBOUND(InData%PWaveDynP0,2) - DO i1 = LBOUND(InData%PWaveDynP0,1), UBOUND(InData%PWaveDynP0,1) - ReKiBuf(Re_Xferred) = InData%PWaveDynP0(i1,i2) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveDynP) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveDynP) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -1540,16 +1377,26 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,2) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,4) Int_Xferred = Int_Xferred + 2 - DO i2 = LBOUND(InData%WaveDynP,2), UBOUND(InData%WaveDynP,2) - DO i1 = LBOUND(InData%WaveDynP,1), UBOUND(InData%WaveDynP,1) - ReKiBuf(Re_Xferred) = InData%WaveDynP(i1,i2) - Re_Xferred = Re_Xferred + 1 + DO i4 = LBOUND(InData%WaveDynP,4), UBOUND(InData%WaveDynP,4) + DO i3 = LBOUND(InData%WaveDynP,3), UBOUND(InData%WaveDynP,3) + DO i2 = LBOUND(InData%WaveDynP,2), UBOUND(InData%WaveDynP,2) + DO i1 = LBOUND(InData%WaveDynP,1), UBOUND(InData%WaveDynP,1) + ReKiBuf(Re_Xferred) = InData%WaveDynP(i1,i2,i3,i4) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveAcc) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveAcc) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -1564,42 +1411,27 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,3) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,3) Int_Xferred = Int_Xferred + 2 - - DO i3 = LBOUND(InData%WaveAcc,3), UBOUND(InData%WaveAcc,3) - DO i2 = LBOUND(InData%WaveAcc,2), UBOUND(InData%WaveAcc,2) - DO i1 = LBOUND(InData%WaveAcc,1), UBOUND(InData%WaveAcc,1) - ReKiBuf(Re_Xferred) = InData%WaveAcc(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%PWaveAcc0) ) 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%PWaveAcc0,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PWaveAcc0,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%PWaveAcc0,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PWaveAcc0,2) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,4) Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%PWaveAcc0,3) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PWaveAcc0,3) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,5) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%PWaveAcc0,3), UBOUND(InData%PWaveAcc0,3) - DO i2 = LBOUND(InData%PWaveAcc0,2), UBOUND(InData%PWaveAcc0,2) - DO i1 = LBOUND(InData%PWaveAcc0,1), UBOUND(InData%PWaveAcc0,1) - ReKiBuf(Re_Xferred) = InData%PWaveAcc0(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(InData%WaveAcc,5), UBOUND(InData%WaveAcc,5) + DO i4 = LBOUND(InData%WaveAcc,4), UBOUND(InData%WaveAcc,4) + DO i3 = LBOUND(InData%WaveAcc,3), UBOUND(InData%WaveAcc,3) + DO i2 = LBOUND(InData%WaveAcc,2), UBOUND(InData%WaveAcc,2) + DO i1 = LBOUND(InData%WaveAcc,1), UBOUND(InData%WaveAcc,1) + ReKiBuf(Re_Xferred) = InData%WaveAcc(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveVel) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveVel) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -1614,42 +1446,27 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,3) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,3) Int_Xferred = Int_Xferred + 2 - - DO i3 = LBOUND(InData%WaveVel,3), UBOUND(InData%WaveVel,3) - DO i2 = LBOUND(InData%WaveVel,2), UBOUND(InData%WaveVel,2) - DO i1 = LBOUND(InData%WaveVel,1), UBOUND(InData%WaveVel,1) - ReKiBuf(Re_Xferred) = InData%WaveVel(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%PWaveVel0) ) 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%PWaveVel0,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PWaveVel0,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%PWaveVel0,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PWaveVel0,2) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,4) Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%PWaveVel0,3) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PWaveVel0,3) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,5) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%PWaveVel0,3), UBOUND(InData%PWaveVel0,3) - DO i2 = LBOUND(InData%PWaveVel0,2), UBOUND(InData%PWaveVel0,2) - DO i1 = LBOUND(InData%PWaveVel0,1), UBOUND(InData%PWaveVel0,1) - ReKiBuf(Re_Xferred) = InData%PWaveVel0(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(InData%WaveVel,5), UBOUND(InData%WaveVel,5) + DO i4 = LBOUND(InData%WaveVel,4), UBOUND(InData%WaveVel,4) + DO i3 = LBOUND(InData%WaveVel,3), UBOUND(InData%WaveVel,3) + DO i2 = LBOUND(InData%WaveVel,2), UBOUND(InData%WaveVel,2) + DO i1 = LBOUND(InData%WaveVel,1), UBOUND(InData%WaveVel,1) + ReKiBuf(Re_Xferred) = InData%WaveVel(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveElev) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveElev) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -1661,50 +1478,20 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,2) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,2) Int_Xferred = Int_Xferred + 2 - - DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) - DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) - ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveElev0) ) 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%WaveElev0,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev0,1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,3) Int_Xferred = Int_Xferred + 2 - DO i1 = LBOUND(InData%WaveElev0,1), UBOUND(InData%WaveElev0,1) - ReKiBuf(Re_Xferred) = InData%WaveElev0(i1) - Re_Xferred = Re_Xferred + 1 - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveElevSeries) ) 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%WaveElevSeries,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevSeries,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevSeries,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevSeries,2) - Int_Xferred = Int_Xferred + 2 - - DO i2 = LBOUND(InData%WaveElevSeries,2), UBOUND(InData%WaveElevSeries,2) - DO i1 = LBOUND(InData%WaveElevSeries,1), UBOUND(InData%WaveElevSeries,1) - ReKiBuf(Re_Xferred) = InData%WaveElevSeries(i1,i2) - Re_Xferred = Re_Xferred + 1 + DO i3 = LBOUND(InData%WaveElev,3), UBOUND(InData%WaveElev,3) + DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) + DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) + ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveTime) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -1765,6 +1552,8 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Waves_UnPackInitOutput' @@ -1788,7 +1577,7 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i2_l = IntKiBuf( Int_Xferred ) i2_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveElevC0)) DEALLOCATE(OutData%WaveElevC0) + IF (ASSOCIATED(OutData%WaveElevC0)) DEALLOCATE(OutData%WaveElevC0) ALLOCATE(OutData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) @@ -1808,7 +1597,7 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveDirArr)) DEALLOCATE(OutData%WaveDirArr) + IF (ASSOCIATED(OutData%WaveDirArr)) DEALLOCATE(OutData%WaveDirArr) ALLOCATE(OutData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) @@ -1849,7 +1638,7 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! PWaveDynP0 not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDynP not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 @@ -1859,39 +1648,26 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i2_l = IntKiBuf( Int_Xferred ) i2_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%PWaveDynP0)) DEALLOCATE(OutData%PWaveDynP0) - ALLOCATE(OutData%PWaveDynP0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%PWaveDynP0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%PWaveDynP0,2), UBOUND(OutData%PWaveDynP0,2) - DO i1 = LBOUND(OutData%PWaveDynP0,1), UBOUND(OutData%PWaveDynP0,1) - OutData%PWaveDynP0(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDynP not allocated - Int_Xferred = Int_Xferred + 1 - ELSE - Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - i2_l = IntKiBuf( Int_Xferred ) - i2_u = IntKiBuf( Int_Xferred + 1) + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveDynP)) DEALLOCATE(OutData%WaveDynP) - ALLOCATE(OutData%WaveDynP(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ASSOCIATED(OutData%WaveDynP)) DEALLOCATE(OutData%WaveDynP) + ALLOCATE(OutData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i2 = LBOUND(OutData%WaveDynP,2), UBOUND(OutData%WaveDynP,2) - DO i1 = LBOUND(OutData%WaveDynP,1), UBOUND(OutData%WaveDynP,1) - OutData%WaveDynP(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i4 = LBOUND(OutData%WaveDynP,4), UBOUND(OutData%WaveDynP,4) + DO i3 = LBOUND(OutData%WaveDynP,3), UBOUND(OutData%WaveDynP,3) + DO i2 = LBOUND(OutData%WaveDynP,2), UBOUND(OutData%WaveDynP,2) + DO i1 = LBOUND(OutData%WaveDynP,1), UBOUND(OutData%WaveDynP,1) + OutData%WaveDynP(i1,i2,i3,i4) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END IF @@ -1908,45 +1684,27 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveAcc)) DEALLOCATE(OutData%WaveAcc) - ALLOCATE(OutData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i3 = LBOUND(OutData%WaveAcc,3), UBOUND(OutData%WaveAcc,3) - DO i2 = LBOUND(OutData%WaveAcc,2), UBOUND(OutData%WaveAcc,2) - DO i1 = LBOUND(OutData%WaveAcc,1), UBOUND(OutData%WaveAcc,1) - OutData%WaveAcc(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! PWaveAcc0 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) + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - i3_l = IntKiBuf( Int_Xferred ) - i3_u = IntKiBuf( Int_Xferred + 1) + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%PWaveAcc0)) DEALLOCATE(OutData%PWaveAcc0) - ALLOCATE(OutData%PWaveAcc0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ASSOCIATED(OutData%WaveAcc)) DEALLOCATE(OutData%WaveAcc) + ALLOCATE(OutData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%PWaveAcc0.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%PWaveAcc0,3), UBOUND(OutData%PWaveAcc0,3) - DO i2 = LBOUND(OutData%PWaveAcc0,2), UBOUND(OutData%PWaveAcc0,2) - DO i1 = LBOUND(OutData%PWaveAcc0,1), UBOUND(OutData%PWaveAcc0,1) - OutData%PWaveAcc0(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(OutData%WaveAcc,5), UBOUND(OutData%WaveAcc,5) + DO i4 = LBOUND(OutData%WaveAcc,4), UBOUND(OutData%WaveAcc,4) + DO i3 = LBOUND(OutData%WaveAcc,3), UBOUND(OutData%WaveAcc,3) + DO i2 = LBOUND(OutData%WaveAcc,2), UBOUND(OutData%WaveAcc,2) + DO i1 = LBOUND(OutData%WaveAcc,1), UBOUND(OutData%WaveAcc,1) + OutData%WaveAcc(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -1964,22 +1722,32 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveVel)) DEALLOCATE(OutData%WaveVel) - ALLOCATE(OutData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveVel)) DEALLOCATE(OutData%WaveVel) + ALLOCATE(OutData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%WaveVel,3), UBOUND(OutData%WaveVel,3) - DO i2 = LBOUND(OutData%WaveVel,2), UBOUND(OutData%WaveVel,2) - DO i1 = LBOUND(OutData%WaveVel,1), UBOUND(OutData%WaveVel,1) - OutData%WaveVel(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(OutData%WaveVel,5), UBOUND(OutData%WaveVel,5) + DO i4 = LBOUND(OutData%WaveVel,4), UBOUND(OutData%WaveVel,4) + DO i3 = LBOUND(OutData%WaveVel,3), UBOUND(OutData%WaveVel,3) + DO i2 = LBOUND(OutData%WaveVel,2), UBOUND(OutData%WaveVel,2) + DO i1 = LBOUND(OutData%WaveVel,1), UBOUND(OutData%WaveVel,1) + OutData%WaveVel(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! PWaveVel0 not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 @@ -1992,85 +1760,21 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%PWaveVel0)) DEALLOCATE(OutData%PWaveVel0) - ALLOCATE(OutData%PWaveVel0(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ASSOCIATED(OutData%WaveElev)) DEALLOCATE(OutData%WaveElev) + ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%PWaveVel0.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%PWaveVel0,3), UBOUND(OutData%PWaveVel0,3) - DO i2 = LBOUND(OutData%PWaveVel0,2), UBOUND(OutData%PWaveVel0,2) - DO i1 = LBOUND(OutData%PWaveVel0,1), UBOUND(OutData%PWaveVel0,1) - OutData%PWaveVel0(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + DO i3 = LBOUND(OutData%WaveElev,3), UBOUND(OutData%WaveElev,3) + DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) + DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) + OutData%WaveElev(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) Re_Xferred = Re_Xferred + 1 END DO END DO END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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%WaveElev)) DEALLOCATE(OutData%WaveElev) - ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) - DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) - OutData%WaveElev(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev0 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 - IF (ALLOCATED(OutData%WaveElev0)) DEALLOCATE(OutData%WaveElev0) - ALLOCATE(OutData%WaveElev0(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev0.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%WaveElev0,1), UBOUND(OutData%WaveElev0,1) - OutData%WaveElev0(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevSeries 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%WaveElevSeries)) DEALLOCATE(OutData%WaveElevSeries) - ALLOCATE(OutData%WaveElevSeries(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevSeries.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveElevSeries,2), UBOUND(OutData%WaveElevSeries,2) - DO i1 = LBOUND(OutData%WaveElevSeries,1), UBOUND(OutData%WaveElevSeries,1) - OutData%WaveElevSeries(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -2078,7 +1782,7 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) diff --git a/modules/seastate/src/seastate_Interp.f90 b/modules/seastate/src/seastate_Interp.f90 new file mode 100644 index 0000000000..3d3a581b0b --- /dev/null +++ b/modules/seastate/src/seastate_Interp.f90 @@ -0,0 +1,634 @@ +!> This module is an interpolator for SeaState pointer arrays based on a 3D grid and time. +!! @note This module does not need to exactly conform to the FAST Modularization Framework standards. Three routines are required +!! though: +!! -- SeaState_Interp_Init -- Load or create any wind data. Only called at the start of FAST. +!! -- SeaState_Interp_CalcOutput -- This will be called at each timestep with a series of data points to give the wave kinematics. +!! -- SeaState_Interp_End -- clear out any stored stuff. Only called at the end of FAST. +MODULE SeaState_Interp +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2016 National Renewable Energy Laboratory +! +! This file is part of SeaState. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** + + USE NWTC_Library + USE SeaState_Interp_Types + + IMPLICIT NONE + PRIVATE + + TYPE(ProgDesc), PARAMETER :: SeaState_Interp_Ver = ProgDesc( 'SeaState_Interp', '', '' ) + + PUBLIC :: SeaState_Interp_Init + PUBLIC :: SeaState_Interp_End + PUBLIC :: SeaState_Interp_3D + PUBLIC :: SeaState_Interp_4D + PUBLIC :: SeaState_Interp_4D_Vec + public :: SeaState_Interp_Setup + +CONTAINS + +!==================================================================================================== + +!---------------------------------------------------------------------------------------------------- +!> A subroutine to initialize the SeaState 4D interpolator module. +!---------------------------------------------------------------------------------------------------- +SUBROUTINE SeaState_Interp_Init(InitInp, p, ErrStat, ErrMsg) + + + IMPLICIT NONE + + ! Passed Variables + + TYPE(SeaState_Interp_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization + TYPE(SeaState_Interp_ParameterType), INTENT( OUT) :: p !< Parameters + ! TYPE(SeaState_Interp_InitOutputType), INTENT( OUT) :: InitOut !< Initial output + + ! REAL(DbKi), INTENT(IN ) :: Interval !< Do not change this!! + + + + ! Error handling + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< determines if an error has been encountered + CHARACTER(*), INTENT( OUT) :: ErrMsg !< A message about the error. See NWTC_Library info for ErrID_* levels. + + ! local variables + ! Put local variables used during initializing your wind here. DO NOT USE GLOBAL VARIABLES EVER! + ! INTEGER(IntKi) :: UnitWind ! Use this unit number if you need to read in a file. + + ! Temporary variables for error handling + INTEGER(IntKi) :: ErrStat2 ! Temp variable for the error status + CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary error message + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_Init' + + !------------------------------------------------------------------------------------------------- + ! Set the Error handling variables + !------------------------------------------------------------------------------------------------- + + ErrStat = ErrID_None + ErrMsg = "" + + + !------------------------------------------------------------------------------------------------- + ! Copy things from the InitData to the ParamData. + !------------------------------------------------------------------------------------------------- + p%n = InitInp%n ! number of points on the evenly-spaced grid (in each direction) + p%delta = InitInp%delta ! distance between consecutive grid points in each direction + p%pZero = InitInp%pZero ! fixed location of first XYZ grid point (i.e., XYZ coordinates of m%V(:,1,1,1,:)) + p%Z_Depth = InitInp%Z_Depth + + + !------------------------------------------------------------------------------------------------- + ! Set the InitOutput information. Set any outputs here. + !------------------------------------------------------------------------------------------------- + + ! InitOut%Ver = SeaState_Interp_Ver + + RETURN + +END SUBROUTINE SeaState_Interp_Init + +!==================================================================================================== + +!------------------------------------------------------------------------------------------------- +!> This routine and its subroutines calculate the wind velocity at a set of points given in +!! PositionXYZ. The UVW velocities are returned in OutData%Velocity +!------------------------------------------------------------------------------------------------- +SUBROUTINE SeaState_Interp_CalcOutput(Time, PositionXYZ, p, pWaveKinXX, WaveKinVal, ErrStat, ErrMsg) + + IMPLICIT NONE + + CHARACTER(*), PARAMETER :: RoutineName="SeaState_Interp_CalcOutput" + + + ! Passed Variables + REAL(DbKi), INTENT(IN ) :: Time !< time from the start of the simulation + REAL(ReKi), INTENT(IN ) :: PositionXYZ(:,:) !< Array of XYZ coordinates, 3xN + TYPE(SeaState_Interp_ParameterType), INTENT(IN ) :: p !< Parameters + REAL(ReKi), INTENT(IN ) :: pWaveKinXX(:,:,:,:) !< Velocity output at Time (Set to INOUT so that array does not get deallocated) + REAL(ReKi), INTENT( out) :: WaveKinVal + ! Error handling + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< The error message + + + ! local counters + INTEGER(IntKi) :: PointNum ! a loop counter for the current point + + ! local variables + INTEGER(IntKi) :: NumPoints ! Number of points passed in + + ! temporary variables + INTEGER(IntKi) :: ErrStat2 ! temporary error status + CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary error message + + + + !------------------------------------------------------------------------------------------------- + ! Initialize some things + !------------------------------------------------------------------------------------------------- + + ErrStat = ErrID_None + ErrMsg = "" + + + ! The array is transposed so that the number of points is the second index, x/y/z is the first. + ! This is just in case we only have a single point, the SIZE command returns the correct number of points. + !NumPoints = SIZE(PositionXYZ,DIM=2) + ! + ! + ! ! Step through all the positions and get the velocities + !DO PointNum = 1, NumPoints + ! + ! + ! ! Calculate the velocity for the position + ! Velocity(:,PointNum) = Interp4D(Time, PositionXYZ(:,PointNum), p, m, ErrStat2, ErrMsg2 ) + ! + ! + ! ! Error handling + ! IF (ErrStat2 /= ErrID_None) THEN ! adding this so we don't have to convert numbers to strings every time + ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//" [position=("// & + ! TRIM(Num2LStr(PositionXYZ(1,PointNum)))//", "// & + ! TRIM(Num2LStr(PositionXYZ(2,PointNum)))//", "// & + ! TRIM(Num2LStr(PositionXYZ(3,PointNum)))//") in wind-file coordinates]" ) + ! IF (ErrStat >= AbortErrLev) RETURN + ! END IF + ! + ! + !ENDDO + + RETURN + +END SUBROUTINE SeaState_Interp_CalcOutput + +subroutine SetCartesianXYIndex(p, pZero, delta, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, ErrMsg) + REAL(ReKi), INTENT(IN ) :: p !< + REAL(ReKi), INTENT(IN ) :: pZero + REAL(ReKi), INTENT(IN ) :: delta + INTEGER(IntKi), INTENT(in ) :: nMax + INTEGER(IntKi), intent(inout) :: Indx_Lo + INTEGER(IntKi), intent(inout) :: Indx_Hi + real(ReKi), intent(inout) :: isopc + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + integer(IntKi) :: i + real(ReKi) :: Tmp + + ErrStat = ErrID_None + ErrMsg = "" + + isopc = -1.0 + Indx_Lo = 0 + Indx_Hi = 0 + + + Tmp = (p-pZero) / delta + Indx_Lo = INT( Tmp ) + 1 ! convert REAL to INTEGER, then add one since our grid indices start at 1, not 0 + isopc = 2.0_ReKi * (Tmp - REAL(Indx_Lo - 1, ReKi)) - 1.0_ReKi ! convert to value between -1 and 1 + + if ( Indx_Lo < 1 ) then + Indx_Lo = 1 + isopc = -1.0 + call SetErrStat(ErrID_Warn,'Position has been clamped to the grid boundary',ErrStat,ErrMsg,'SetCartesianIndex') !error out if time is outside the lower bounds + end if + + Indx_Hi = min( Indx_Lo + 1, nMax ) ! make sure it's a valid index, zero-based + + if ( Indx_Lo >= Indx_Hi ) then + ! Need to clamp to grid boundary + Indx_Lo = Indx_Hi - 1 + isopc = 1.0 + call SetErrStat(ErrID_Warn,'Position has been clamped to the grid boundary',ErrStat,ErrMsg,'SetCartesianIndex') !error out if time is outside the lower bounds + end if + + + + !------------------------------------------------------------------------------------------------- + ! to verify that we don't extrapolate, make sure isopc is bound between -1 and 1 (effectively nearest neighbor) + !------------------------------------------------------------------------------------------------- + isopc = min( 1.0_SiKi, isopc ) + isopc = max(-1.0_SiKi, isopc ) + + +end subroutine SetCartesianXYIndex + +subroutine SetCartesianZIndex(p, z_depth, delta, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, ErrMsg) + REAL(ReKi), INTENT(IN ) :: p !< time from the start of the simulation + REAL(ReKi), INTENT(IN ) :: z_depth + REAL(ReKi), INTENT(IN ) :: delta + INTEGER(IntKi), INTENT(in ) :: nMax + INTEGER(IntKi), intent(inout) :: Indx_Lo + INTEGER(IntKi), intent(inout) :: Indx_Hi + real(ReKi), intent(inout) :: isopc + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + integer(IntKi) :: i + real(ReKi) :: Tmp + + ErrStat = ErrID_None + ErrMsg = "" + + isopc = -1.0 + Indx_Lo = 0 + Indx_Hi = 0 + + + !Tmp = acos(-p / z_depth) / delta + Tmp = acos(1+(p / z_depth)) / delta + Tmp = nmax - 1 - Tmp + Indx_Lo = INT( Tmp ) + 1 ! convert REAL to INTEGER, then add one since our grid indices start at 1, not 0 + isopc = 2.0_ReKi * (Tmp - REAL(Indx_Lo - 1, ReKi)) - 1.0_ReKi ! convert to value between -1 and 1 + + if ( Indx_Lo < 1 ) then + Indx_Lo = 1 + isopc = -1.0 + call SetErrStat(ErrID_Warn,'Position has been clamped to the grid boundary',ErrStat,ErrMsg,'SetCartesianIndex') !error out if time is outside the lower bounds + end if + + Indx_Hi = min( Indx_Lo + 1, nMax ) ! make sure it's a valid index, one-based + + if ( Indx_Lo >= Indx_Hi ) then + ! Need to clamp to grid boundary + Indx_Lo = Indx_Hi - 1 + isopc = 1.0 + call SetErrStat(ErrID_Warn,'Position has been clamped to the grid boundary',ErrStat,ErrMsg,'SetCartesianIndex') !error out if time is outside the lower bounds + end if + + + + !------------------------------------------------------------------------------------------------- + ! to verify that we don't extrapolate, make sure isopc is bound between -1 and 1 (effectively nearest neighbor) + !------------------------------------------------------------------------------------------------- + isopc = min( 1.0_SiKi, isopc ) + isopc = max(-1.0_SiKi, isopc ) + + +end subroutine SetCartesianZIndex + +subroutine SetTimeIndex(Time, deltaT, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, ErrMsg) + REAL(DbKi), INTENT(IN ) :: Time !< time from the start of the simulation + REAL(ReKi), INTENT(IN ) :: deltaT + INTEGER(IntKi), INTENT(in ) :: nMax + INTEGER(IntKi), intent(inout) :: Indx_Lo + INTEGER(IntKi), intent(inout) :: Indx_Hi + real(ReKi), intent(inout) :: isopc + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + integer(IntKi) :: i + real(ReKi) :: Tmp + + ErrStat = ErrID_None + ErrMsg = "" + + isopc = -1.0 + Indx_Lo = 0 + Indx_Hi = 0 + if ( Time < 0.0_DbKi ) then + CALL SetErrStat(ErrID_Fatal,'Time value must be greater than or equal to zero!',ErrStat,ErrMsg,'SetTimeLoIndex') !error out if time is outside the lower bounds + RETURN + end if + + !TODO: Add mod to wrap time + Tmp = Time / deltaT + Indx_Lo = INT( Tmp ) ! convert REAL to INTEGER + + if (Indx_Lo >= (nMax-1)) then ! Wrap the time series back to the beginning of the signal + ! Indx_Lo = mod(Indx_Lo, nMax) + Indx_Lo = Indx_Lo - (nMax - 1) + Tmp = Tmp - real(nMax - 1, ReKi) + end if + isopc = 2.0_ReKi * (Tmp - REAL(Indx_Lo , ReKi)) - 1.0_ReKi ! convert to value between -1 and 1 + + !------------------------------------------------------------------------------------------------- + ! to verify that we don't extrapolate, make sure isopc is bound between -1 and 1 (effectively nearest neighbor) + !------------------------------------------------------------------------------------------------- + isopc = min( 1.0_SiKi, isopc ) + isopc = max(-1.0_SiKi, isopc ) + + Indx_Hi = min( Indx_Lo + 1, nMax - 1 ) ! make sure it's a valid index, zero-based + +end subroutine SetTimeIndex + + +!==================================================================================================== +!> This routine sets up interpolation of a 3-d or 4-d dataset. +!! This method is described here: http://rjwagner49.com/Mathematics/Interpolation.pdf +subroutine SeaState_Interp_Setup( Time, Position, p, m, ErrStat, ErrMsg ) + + ! I/O variables + + REAL(DbKi), INTENT(IN ) :: Time !< time from the start of the simulation + REAL(ReKi), INTENT(IN ) :: Position(3) !< Array of XYZ coordinates, 3 + TYPE(SeaState_Interp_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaState_Interp_MiscVarType), INTENT(INOUT) :: m !< MiscVars + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_Setup' + + ! Local variables + + INTEGER(IntKi) :: i ! loop counter + INTEGER(IntKi) :: ic ! wind-component counter + + REAL(SiKi) :: isopc(4) ! isoparametric coordinates + + REAL(SiKi) :: u(16) ! size 2^n + REAL(ReKi) :: Tmp ! temporary fraction of distance between two grid points + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = "" + + + !------------------------------------------------------------------------------------------------- + ! Find the bounding indices for time + !------------------------------------------------------------------------------------------------- + call SetTimeIndex(Time, p%delta(1), p%n(1), m%Indx_Lo(1), m%Indx_Hi(1), isopc(1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !error out if x,y,z, or time is outside the lower bounds + if (ErrStat >= AbortErrLev ) return + + + !------------------------------------------------------------------------------------------------- + ! Find the bounding indices for XY position + !------------------------------------------------------------------------------------------------- + do i=2,3 + call SetCartesianXYIndex(Position(i-1), p%pZero(i), p%delta(i), p%n(i), m%Indx_Lo(i), m%Indx_Hi(i), isopc(i), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !error out if x,y,z, or time is outside the lower bounds + enddo + + + if (ErrStat >= AbortErrLev ) return + + !------------------------------------------------------------------------------------------------- + ! Find the bounding indices for Z position + !------------------------------------------------------------------------------------------------- + i=4 + call SetCartesianZIndex(Position(i-1), p%Z_Depth, p%delta(i), p%n(i), m%Indx_Lo(i), m%Indx_Hi(i), isopc(i), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !error out if x,y,z, or time is outside the lower bounds + if (ErrStat >= AbortErrLev ) return + + !------------------------------------------------------------------------------------------------- + ! compute weighting factors + !------------------------------------------------------------------------------------------------- + + m%N4D( 1) = ( 1.0_SiKi - isopc(1) ) * ( 1.0_SiKi - isopc(2) ) * ( 1.0_SiKi - isopc(3) ) * ( 1.0_SiKi - isopc(4) ) + m%N4D( 2) = ( 1.0_SiKi - isopc(1) ) * ( 1.0_SiKi - isopc(2) ) * ( 1.0_SiKi - isopc(3) ) * ( 1.0_SiKi + isopc(4) ) + m%N4D( 3) = ( 1.0_SiKi - isopc(1) ) * ( 1.0_SiKi - isopc(2) ) * ( 1.0_SiKi + isopc(3) ) * ( 1.0_SiKi - isopc(4) ) + m%N4D( 4) = ( 1.0_SiKi - isopc(1) ) * ( 1.0_SiKi - isopc(2) ) * ( 1.0_SiKi + isopc(3) ) * ( 1.0_SiKi + isopc(4) ) + m%N4D( 5) = ( 1.0_SiKi - isopc(1) ) * ( 1.0_SiKi + isopc(2) ) * ( 1.0_SiKi - isopc(3) ) * ( 1.0_SiKi - isopc(4) ) + m%N4D( 6) = ( 1.0_SiKi - isopc(1) ) * ( 1.0_SiKi + isopc(2) ) * ( 1.0_SiKi - isopc(3) ) * ( 1.0_SiKi + isopc(4) ) + m%N4D( 7) = ( 1.0_SiKi - isopc(1) ) * ( 1.0_SiKi + isopc(2) ) * ( 1.0_SiKi + isopc(3) ) * ( 1.0_SiKi - isopc(4) ) + m%N4D( 8) = ( 1.0_SiKi - isopc(1) ) * ( 1.0_SiKi + isopc(2) ) * ( 1.0_SiKi + isopc(3) ) * ( 1.0_SiKi + isopc(4) ) + m%N4D( 9) = ( 1.0_SiKi + isopc(1) ) * ( 1.0_SiKi - isopc(2) ) * ( 1.0_SiKi - isopc(3) ) * ( 1.0_SiKi - isopc(4) ) + m%N4D(10) = ( 1.0_SiKi + isopc(1) ) * ( 1.0_SiKi - isopc(2) ) * ( 1.0_SiKi - isopc(3) ) * ( 1.0_SiKi + isopc(4) ) + m%N4D(11) = ( 1.0_SiKi + isopc(1) ) * ( 1.0_SiKi - isopc(2) ) * ( 1.0_SiKi + isopc(3) ) * ( 1.0_SiKi - isopc(4) ) + m%N4D(12) = ( 1.0_SiKi + isopc(1) ) * ( 1.0_SiKi - isopc(2) ) * ( 1.0_SiKi + isopc(3) ) * ( 1.0_SiKi + isopc(4) ) + m%N4D(13) = ( 1.0_SiKi + isopc(1) ) * ( 1.0_SiKi + isopc(2) ) * ( 1.0_SiKi - isopc(3) ) * ( 1.0_SiKi - isopc(4) ) + m%N4D(14) = ( 1.0_SiKi + isopc(1) ) * ( 1.0_SiKi + isopc(2) ) * ( 1.0_SiKi - isopc(3) ) * ( 1.0_SiKi + isopc(4) ) + m%N4D(15) = ( 1.0_SiKi + isopc(1) ) * ( 1.0_SiKi + isopc(2) ) * ( 1.0_SiKi + isopc(3) ) * ( 1.0_SiKi - isopc(4) ) + m%N4D(16) = ( 1.0_SiKi + isopc(1) ) * ( 1.0_SiKi + isopc(2) ) * ( 1.0_SiKi + isopc(3) ) * ( 1.0_SiKi + isopc(4) ) + m%N4D = m%N4D / REAL( SIZE(m%N4D), SiKi ) ! normalize + + +END Subroutine SeaState_Interp_Setup + +!==================================================================================================== +!> This routine interpolates a 4-d dataset. +!! This method is described here: http://rjwagner49.com/Mathematics/Interpolation.pdf +FUNCTION SeaState_Interp_4D( pKinXX, m, ErrStat, ErrMsg ) + + ! I/O variables + + real(SiKi), intent(in ) :: pKinXX(0:,:,:,:) + TYPE(SeaState_Interp_MiscVarType), INTENT(IN ) :: m !< Parameters + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_PointSetup' + Real(SiKi) :: SeaState_Interp_4D + ! Local variables + + REAL(SiKi) :: u(16) ! size 2^n + + + SeaState_Interp_4D = 0.0_SiKi + ErrStat = ErrID_None + ErrMsg = "" + + !------------------------------------------------------------------------------------------------- + ! interpolate + !------------------------------------------------------------------------------------------------- + + u( 1) = pKinXX( m%Indx_Lo(1), m%Indx_Lo(2), m%Indx_Lo(3), m%Indx_Lo(4) ) + u( 2) = pKinXX( m%Indx_Lo(1), m%Indx_Lo(2), m%Indx_Lo(3), m%Indx_Hi(4) ) + u( 3) = pKinXX( m%Indx_Lo(1), m%Indx_Lo(2), m%Indx_Hi(3), m%Indx_Lo(4) ) + u( 4) = pKinXX( m%Indx_Lo(1), m%Indx_Lo(2), m%Indx_Hi(3), m%Indx_Hi(4) ) + u( 5) = pKinXX( m%Indx_Lo(1), m%Indx_Hi(2), m%Indx_Lo(3), m%Indx_Lo(4) ) + u( 6) = pKinXX( m%Indx_Lo(1), m%Indx_Hi(2), m%Indx_Lo(3), m%Indx_Hi(4) ) + u( 7) = pKinXX( m%Indx_Lo(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Lo(4) ) + u( 8) = pKinXX( m%Indx_Lo(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Hi(4) ) + u( 9) = pKinXX( m%Indx_Hi(1), m%Indx_Lo(2), m%Indx_Lo(3), m%Indx_Lo(4) ) + u(10) = pKinXX( m%Indx_Hi(1), m%Indx_Lo(2), m%Indx_Lo(3), m%Indx_Hi(4) ) + u(11) = pKinXX( m%Indx_Hi(1), m%Indx_Lo(2), m%Indx_Hi(3), m%Indx_Lo(4) ) + u(12) = pKinXX( m%Indx_Hi(1), m%Indx_Lo(2), m%Indx_Hi(3), m%Indx_Hi(4) ) + u(13) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Lo(3), m%Indx_Lo(4) ) + u(14) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Lo(3), m%Indx_Hi(4) ) + u(15) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Lo(4) ) + u(16) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Hi(4) ) + + SeaState_Interp_4D = SUM ( m%N4D * u ) + +END FUNCTION SeaState_Interp_4D + +!==================================================================================================== +!> This routine interpolates a 4-d dataset. +!! This method is described here: http://rjwagner49.com/Mathematics/Interpolation.pdf +FUNCTION SeaState_Interp_4D_Vec( pKinXX, m, ErrStat, ErrMsg ) + + ! I/O variables + + real(SiKi), intent(in ) :: pKinXX(0:,:,:,:,:) + TYPE(SeaState_Interp_MiscVarType), INTENT(IN ) :: m !< Parameters + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_PointSetup' + Real(SiKi) :: SeaState_Interp_4D_Vec(3) + ! Local variables + + REAL(SiKi) :: u(16) ! size 2^n + integer(IntKi) :: iDir + + SeaState_Interp_4D_Vec = 0.0_SiKi + ErrStat = ErrID_None + ErrMsg = "" + + !------------------------------------------------------------------------------------------------- + ! interpolate + !------------------------------------------------------------------------------------------------- + do iDir = 1,3 + u( 1) = pKinXX( m%Indx_Lo(1), m%Indx_Lo(2), m%Indx_Lo(3), m%Indx_Lo(4), iDir ) + u( 2) = pKinXX( m%Indx_Lo(1), m%Indx_Lo(2), m%Indx_Lo(3), m%Indx_Hi(4), iDir ) + u( 3) = pKinXX( m%Indx_Lo(1), m%Indx_Lo(2), m%Indx_Hi(3), m%Indx_Lo(4), iDir ) + u( 4) = pKinXX( m%Indx_Lo(1), m%Indx_Lo(2), m%Indx_Hi(3), m%Indx_Hi(4), iDir ) + u( 5) = pKinXX( m%Indx_Lo(1), m%Indx_Hi(2), m%Indx_Lo(3), m%Indx_Lo(4), iDir ) + u( 6) = pKinXX( m%Indx_Lo(1), m%Indx_Hi(2), m%Indx_Lo(3), m%Indx_Hi(4), iDir ) + u( 7) = pKinXX( m%Indx_Lo(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Lo(4), iDir ) + u( 8) = pKinXX( m%Indx_Lo(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Hi(4), iDir ) + u( 9) = pKinXX( m%Indx_Hi(1), m%Indx_Lo(2), m%Indx_Lo(3), m%Indx_Lo(4), iDir ) + u(10) = pKinXX( m%Indx_Hi(1), m%Indx_Lo(2), m%Indx_Lo(3), m%Indx_Hi(4), iDir ) + u(11) = pKinXX( m%Indx_Hi(1), m%Indx_Lo(2), m%Indx_Hi(3), m%Indx_Lo(4), iDir ) + u(12) = pKinXX( m%Indx_Hi(1), m%Indx_Lo(2), m%Indx_Hi(3), m%Indx_Hi(4), iDir ) + u(13) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Lo(3), m%Indx_Lo(4), iDir ) + u(14) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Lo(3), m%Indx_Hi(4), iDir ) + u(15) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Lo(4), iDir ) + u(16) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Hi(4), iDir ) + + SeaState_Interp_4D_Vec(iDir) = SUM ( m%N4D * u ) + end do +END FUNCTION SeaState_Interp_4D_Vec + + !==================================================================================================== +!> This routine interpolates a 3-d dataset with index 1 = time (zero-based indexing), 2 = x-coordinate (1-based indexing), 3 = y-coordinate (1-based indexing) +!! This method is described here: http://rjwagner49.com/Mathematics/Interpolation.pdf +FUNCTION SeaState_Interp_3D( Time, Position, pKinXX, p, ErrStat, ErrMsg ) + + ! I/O variables + REAL(DbKi), INTENT(IN ) :: Time !< time from the start of the simulation + REAL(ReKi), INTENT(IN ) :: Position(2) !< Array of XYZ coordinates, 3 + real(SiKi), intent(in ) :: pKinXX(0:,:,:) !< 3D Wave elevation data (SiKi for storage space reasons) + TYPE(SeaState_Interp_ParameterType), INTENT(IN ) :: p !< Parameters + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_3D' + Real(SiKi) :: SeaState_Interp_3D + ! Local variables + + REAL(SiKi) :: u(8) ! size 2^n + real(ReKi) :: N3D(8) + integer(IntKi) :: Indx_Lo(3), Indx_Hi(3) + INTEGER(IntKi) :: i ! loop counter + INTEGER(IntKi) :: ic ! wind-component counter + REAL(SiKi) :: isopc(3) ! isoparametric coordinates + REAL(ReKi) :: Tmp ! temporary fraction of distance between two grid points + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + SeaState_Interp_3D = 0.0_SiKi + ErrStat = ErrID_None + ErrMsg = "" + + !------------------------------------------------------------------------------------------------- + ! Find the bounding indices for time + !------------------------------------------------------------------------------------------------- + call SetTimeIndex(Time, p%delta(1), p%n(1), Indx_Lo(1), Indx_Hi(1), isopc(1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !error out if x,y,z, or time is outside the lower bounds + if (ErrStat >= AbortErrLev ) return + + !------------------------------------------------------------------------------------------------- + ! Find the bounding indices for XY position + !------------------------------------------------------------------------------------------------- + do i=2,3 + call SetCartesianXYIndex(Position(i-1), p%pZero(i), p%delta(i), p%n(i), Indx_Lo(i), Indx_Hi(i), isopc(i), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !error out if x,y,z, or time is outside the lower bounds + end do + if (ErrStat >= AbortErrLev ) return + + + + N3D(1) = ( 1.0_ReKi + isopc(1) )*( 1.0_ReKi - isopc(2) )*( 1.0_ReKi - isopc(3) ) + N3D(2) = ( 1.0_ReKi + isopc(1) )*( 1.0_ReKi + isopc(2) )*( 1.0_ReKi - isopc(3) ) + N3D(3) = ( 1.0_ReKi - isopc(1) )*( 1.0_ReKi + isopc(2) )*( 1.0_ReKi - isopc(3) ) + N3D(4) = ( 1.0_ReKi - isopc(1) )*( 1.0_ReKi - isopc(2) )*( 1.0_ReKi - isopc(3) ) + N3D(5) = ( 1.0_ReKi + isopc(1) )*( 1.0_ReKi - isopc(2) )*( 1.0_ReKi + isopc(3) ) + N3D(6) = ( 1.0_ReKi + isopc(1) )*( 1.0_ReKi + isopc(2) )*( 1.0_ReKi + isopc(3) ) + N3D(7) = ( 1.0_ReKi - isopc(1) )*( 1.0_ReKi + isopc(2) )*( 1.0_ReKi + isopc(3) ) + N3D(8) = ( 1.0_ReKi - isopc(1) )*( 1.0_ReKi - isopc(2) )*( 1.0_ReKi + isopc(3) ) + N3D = N3D / REAL( SIZE(N3D), ReKi ) ! normalize + + !------------------------------------------------------------------------------------------------- + ! interpolate + !------------------------------------------------------------------------------------------------- + + u(1) = pKinXX( Indx_Hi(1), Indx_Lo(2), Indx_Lo(3) ) + u(2) = pKinXX( Indx_Hi(1), Indx_Hi(2), Indx_Lo(3) ) + u(3) = pKinXX( Indx_Lo(1), Indx_Hi(2), Indx_Lo(3) ) + u(4) = pKinXX( Indx_Lo(1), Indx_Lo(2), Indx_Lo(3) ) + u(5) = pKinXX( Indx_Hi(1), Indx_Lo(2), Indx_Hi(3) ) + u(6) = pKinXX( Indx_Hi(1), Indx_Hi(2), Indx_Hi(3) ) + u(7) = pKinXX( Indx_Lo(1), Indx_Hi(2), Indx_Hi(3) ) + u(8) = pKinXX( Indx_Lo(1), Indx_Lo(2), Indx_Hi(3) ) + + SeaState_Interp_3D = SUM ( N3D * u ) + +END FUNCTION SeaState_Interp_3D + +!---------------------------------------------------------------------------------------------------- +!> This routine deallocates any memory in the FDext module. +SUBROUTINE SeaState_Interp_End( ParamData, MiscVars, ErrStat, ErrMsg) + + + IMPLICIT NONE + + CHARACTER(*), PARAMETER :: RoutineName="SeaState_Interp_End" + + + ! Passed Variables + TYPE(SeaState_Interp_ParameterType), INTENT(INOUT) :: ParamData !< Parameters + TYPE(SeaState_Interp_MiscVarType), INTENT(INOUT) :: MiscVars !< Misc variables for optimization (not copied in glue code) + + + ! Error Handling + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< determines if an error has been encountered + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Message about errors + + + ! Local Variables + INTEGER(IntKi) :: TmpErrStat ! temporary error status + CHARACTER(ErrMsgLen) :: TmpErrMsg ! temporary error message + + + ErrMsg = '' + ErrStat = ErrID_None + + + + ! Destroy parameter data + + CALL SeaState_Interp_DestroyParam( ParamData, TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + + ! Destroy the misc data + + CALL SeaState_Interp_DestroyMisc( MiscVars, TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + +END SUBROUTINE SeaState_Interp_End +!==================================================================================================== +END MODULE SeaState_Interp diff --git a/modules/seastate/src/seastate_Interp.txt b/modules/seastate/src/seastate_Interp.txt new file mode 100644 index 0000000000..130d2110b2 --- /dev/null +++ b/modules/seastate/src/seastate_Interp.txt @@ -0,0 +1,41 @@ +################################################################################################################################### +# Registry for SeaState_Interp, creates MODULE SeaState_Interp_Types +# Module SeaState_Interp_Types contains all of the user-defined types needed in SeaState_Interp. It also contains copy, destroy, pack, and +# unpack routines associated with each defined data types. +################################################################################################################################### +# Entries are of the form +# keyword +################################################################################################################################### + +include Registry_NWTC_Library.txt + + +######################### + +typedef SeaState_Interp/SeaState_Interp InitInputType IntKi n 4 - - "number of grid points in the x, y, z, and t directions" - +typedef ^ InitInputType ReKi delta 4 - - "size between 2 consecutive grid points in each grid direction" "m,m,m,s" +typedef ^ InitInputType ReKi pZero 4 - - "fixed position of the XYZ grid (i.e., XYZ coordinates of m%V(:,1,1,1,:))" "m" +typedef ^ InitInputType ReKi Z_Depth - - - "grid depth" m + +# Init Output +typedef ^ InitOutputType ProgDesc Ver - - - "Version information of this submodule" - + + +# ..... Misc/Optimization variables................................................................................................. +# Define any data that are used only for efficiency purposes (these variables are not associated with time): +# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. +typedef ^ MiscVarType SiKi N3D {8} - - "this is the 3-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field" - +typedef ^ MiscVarType SiKi N4D {16} - - "this is the 4-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field" - +typedef ^ MiscVarType integer Indx_Lo 4 - - "this is the 4-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field" - +typedef ^ MiscVarType integer Indx_Hi 4 - - "this is the 4-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field" - + +# ..... Parameters ................................................................................................................ +# Define parameters here: +# Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: +typedef ^ ParameterType IntKi n 4 - - "number of evenly-spaced grid points in the x, y, z, and t directions" - +typedef ^ ParameterType ReKi delta 4 - - "size between 2 consecutive grid points in each grid direction" "m,m,m,s" +typedef ^ ParameterType ReKi pZero 4 - - "fixed position of the XYZ grid (i.e., XYZ coordinates of m%V(:,1,1,1,:))" "m" +typedef ^ ParameterType ReKi Z_Depth - - - "grid depth" m + + + diff --git a/vs-build/RunRegistry.bat b/vs-build/RunRegistry.bat index c633832b3b..b558a7517d 100644 --- a/vs-build/RunRegistry.bat +++ b/vs-build/RunRegistry.bat @@ -28,6 +28,7 @@ SET ED_Loc=%Modules_Loc%\elastodyn\src SET AD14_Loc=%Modules_Loc%\aerodyn14\src SET IfW_Loc=%Modules_Loc%\inflowwind\src SET HD_Loc=%Modules_Loc%\hydrodyn\src +SET SEAST_Loc=%Modules_Loc%\seastate\src SET SD_Loc=%Modules_Loc%\subdyn\src SET MAP_Loc=%Modules_Loc%\map\src SET FEAM_Loc=%Modules_Loc%\feamooring\src @@ -49,7 +50,7 @@ SET Farm_Loc=%Root_Loc%\glue-codes\fast-farm\src SET ALL_FAST_Includes=-I "%FAST_Loc%" -I "%NWTC_Lib_Loc%" -I "%ED_Loc%" -I "%SrvD_Loc%" -I "%AD14_Loc%" -I^ "%AD_Loc%" -I "%BD_Loc%" -I "%SC_Loc%" -I^ - "%IfW_Loc%" -I "%SD_Loc%" -I "%HD_Loc%" -I "%MAP_Loc%" -I "%FEAM_Loc%" -I^ + "%IfW_Loc%" -I "%SD_Loc%" -I "%HD_Loc%" -I "%SEAST_Loc%" -I "%MAP_Loc%" -I "%FEAM_Loc%" -I^ "%IceF_Loc%" -I "%IceD_Loc%" -I "%MD_Loc%" -I "%OpFM_Loc%" -I "%Orca_Loc%" -I "%ExtPtfm_Loc%" @@ -187,9 +188,6 @@ SET Output_Loc=%CURR_LOC% GOTO checkError :HydroDyn -:Current -:Waves -:Waves2 :SS_Excitation :SS_Radiation :Conv_Radiation @@ -202,6 +200,17 @@ SET Output_Loc=%CURR_LOC% %REGISTRY% "%CURR_LOC%\%ModuleName%.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" GOTO checkError +:SeaState +:Current +:Waves +:Waves2 +:SeaState_Interp + +SET CURR_LOC=%SEAST_Loc% +SET Output_Loc=%CURR_LOC% +%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" +GOTO checkError + :SubDyn SET CURR_LOC=%SD_Loc% SET Output_Loc=%CURR_LOC% From 5fd9600fee258bb132644bd6ef1ba6dac93bc3ea Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Wed, 1 Dec 2021 09:50:42 -0700 Subject: [PATCH 03/35] Added Registry Pointers support --- modules/openfast-registry/src/data.h | 2 ++ modules/openfast-registry/src/gen_module_files.c | 2 +- modules/openfast-registry/src/reg_parse.c | 12 ++++++++++-- modules/openfast-registry/src/type.c | 4 +++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/modules/openfast-registry/src/data.h b/modules/openfast-registry/src/data.h index bc81980c73..4680d1539e 100644 --- a/modules/openfast-registry/src/data.h +++ b/modules/openfast-registry/src/data.h @@ -76,6 +76,8 @@ typedef struct node_struct { int is_interface_type ; +/* array pointer instead of allocatable*/ + int is_pointer; /* 0 = allocatable, 1 = pointer */ /* marker */ int mark ; diff --git a/modules/openfast-registry/src/gen_module_files.c b/modules/openfast-registry/src/gen_module_files.c index df4acfe9db..6edf86be4a 100644 --- a/modules/openfast-registry/src/gen_module_files.c +++ b/modules/openfast-registry/src/gen_module_files.c @@ -2126,7 +2126,7 @@ gen_module( FILE * fp , node_t * ModName, char * prog_ver ) } } - if ( is_pointer(r) ) { + if (sw_ccode && is_pointer(r) ) { fprintf(fp," %s ",c_types_binding(r->type->mapsto) ) ; } else { fprintf(fp," %s ",r->type->mapsto ) ; diff --git a/modules/openfast-registry/src/reg_parse.c b/modules/openfast-registry/src/reg_parse.c index 37d457abc2..82d33057ac 100644 --- a/modules/openfast-registry/src/reg_parse.c +++ b/modules/openfast-registry/src/reg_parse.c @@ -549,12 +549,13 @@ int set_dim_len ( char * dimspec , node_t * dim_entry ) { dim_entry->deferred = 0 ; + dim_entry->is_pointer = 0; if (!strcmp( dimspec , "standard_domain" )) { dim_entry->len_defined_how = DOMAIN_STANDARD ; } - else if (!strncmp( dimspec, "constant=" , 9 ) || isNum(dimspec[0]) || dimspec[0] == ':' || dimspec[0] == '(' ) + else if (!strncmp( dimspec, "constant=" , 9 ) || isNum(dimspec[0]) || dimspec[0] == ':' || dimspec[0] == '*' || dimspec[0] == '(' ) { char *p, *colon, *paren ; - p = (isNum(dimspec[0])||dimspec[0]==':'||dimspec[0]=='(')?dimspec:&(dimspec[9]) ; + p = (isNum(dimspec[0])||dimspec[0]==':'||dimspec[0]=='*'||dimspec[0]=='(')?dimspec:&(dimspec[9]) ; /* check for colon */ if (( colon = index(p,':')) != NULL ) { @@ -572,6 +573,13 @@ set_dim_len ( char * dimspec , node_t * dim_entry ) } dim_entry->coord_end = atoi(colon+1) ; } + else if ((colon = index(p, '*')) != NULL) + { + *colon = '\0'; + dim_entry->deferred = 1; + dim_entry->coord_end = atoi(colon + 1); + dim_entry->is_pointer = 1; + } else { dim_entry->coord_start = 1 ; diff --git a/modules/openfast-registry/src/type.c b/modules/openfast-registry/src/type.c index 310d7b793d..5c3f19ace2 100644 --- a/modules/openfast-registry/src/type.c +++ b/modules/openfast-registry/src/type.c @@ -137,7 +137,9 @@ assoc_or_allocated( node_t * r ) int is_pointer( node_t * r ) { - + if (r->ndims > 0 && r->dims[0]->is_pointer) { + return(1); + } if ( sw_ccode && r->ndims > 0 && r->dims[0]->deferred ){ if ( !strncmp( make_lower_temp(r-> name), "writeoutput", 11) ) { // this covers WriteOutput, WriteOutputHdr, and WriteOutputUnt return( 0 ); // we're going to use these in the glue code, so these will be a special case From fe4cc1d1844b858198556ad5e6bc3ba9313bb4dd Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Wed, 1 Dec 2021 09:55:39 -0700 Subject: [PATCH 04/35] ExctnDisp/WaveDisp functionality update for HD Added ExctnDisp support for WAMIT bodies Added WaveDisp support for Morison members Various bug fixes Changed SeaState abbrv. to SeaSt in registry --- modules/hydrodyn/src/HydroDyn.f90 | 1150 +- modules/hydrodyn/src/HydroDyn.txt | 77 +- modules/hydrodyn/src/HydroDyn_DriverCode.f90 | 333 +- modules/hydrodyn/src/HydroDyn_Input.f90 | 920 +- modules/hydrodyn/src/HydroDyn_Output.f90 | 104 +- modules/hydrodyn/src/HydroDyn_Types.f90 | 2587 ++- modules/hydrodyn/src/Morison.f90 | 103 +- modules/hydrodyn/src/Morison.txt | 39 +- modules/hydrodyn/src/Morison_Output.f90 | 13279 ++++++++-------- modules/hydrodyn/src/Morison_Types.f90 | 1365 +- modules/hydrodyn/src/SS_Excitation.f90 | 164 +- modules/hydrodyn/src/SS_Excitation.txt | 15 +- modules/hydrodyn/src/SS_Excitation_Types.f90 | 559 +- modules/hydrodyn/src/WAMIT.f90 | 399 +- modules/hydrodyn/src/WAMIT.txt | 16 +- modules/hydrodyn/src/WAMIT2.txt | 10 +- modules/hydrodyn/src/WAMIT2_Types.f90 | 138 +- modules/hydrodyn/src/WAMIT_Types.f90 | 496 +- modules/seastate/src/SeaState.f90 | 327 +- modules/seastate/src/SeaState.txt | 49 +- modules/seastate/src/SeaState_DriverCode.f90 | 52 +- modules/seastate/src/SeaState_Input.f90 | 38 +- .../seastate/src/SeaState_Interp_Types.f90 | 160 +- modules/seastate/src/SeaState_Output.f90 | 40 +- modules/seastate/src/SeaState_Types.f90 | 1887 ++- modules/seastate/src/Waves.f90 | 48 +- modules/seastate/src/Waves.txt | 3 +- modules/seastate/src/Waves_Types.f90 | 132 + modules/seastate/src/seastate_Interp.f90 | 195 +- modules/seastate/src/seastate_Interp.txt | 2 +- 30 files changed, 13362 insertions(+), 11325 deletions(-) diff --git a/modules/hydrodyn/src/HydroDyn.f90 b/modules/hydrodyn/src/HydroDyn.f90 index 3bddcb07db..b3e513a6ea 100644 --- a/modules/hydrodyn/src/HydroDyn.f90 +++ b/modules/hydrodyn/src/HydroDyn.f90 @@ -30,10 +30,10 @@ MODULE HydroDyn use Morison USE WAMIT USE WAMIT2 + use SeaState USE HydroDyn_Input USE HydroDyn_Output - USE Current - USE Waves2 + #ifdef USE_FIT USE FIT_MODULES USE FIT_Types @@ -76,147 +76,147 @@ MODULE HydroDyn CONTAINS -SUBROUTINE WvStretch_Init(WaveStMod, WtrDpth, NStepWave, NNodes, & - NWaveElev, WaveElev, WaveKinzi, WaveTime, & - WaveVel0, WaveAcc0, WaveDynP0, & - WavePVel0, WavePAcc0, WavePDynP0, & - WaveVel , WaveAcc , WaveDynP , & - nodeInWater, ErrStat, ErrMsg ) - - - INTEGER, INTENT(IN ) :: WaveStMod - REAL(SiKi), INTENT(IN ) :: WtrDpth - INTEGER, INTENT(IN ) :: NStepWave - INTEGER, INTENT(IN ) :: NNodes - INTEGER, INTENT(IN ) :: NWaveElev - REAL(SiKi), INTENT(IN ) :: WaveElev(0:,:) - REAL(SiKi), INTENT(IN ) :: WaveKinzi(:) - REAL(SiKi), INTENT(IN ) :: WaveTime(0:) - REAL(SiKi), INTENT(IN ) :: WaveVel0(0:,:,:) !< Wave velocity in Global coordinate system at Z = 0. Each point in this array has a corresponding entry (same index #) in the WaveVel array - REAL(SiKi), INTENT(IN ) :: WaveAcc0(0:,:,:) - REAL(SiKi), INTENT(IN ) :: WaveDynP0(0:,:) - REAL(SiKi), INTENT(IN ) :: WavePVel0(0:,:,:) !< Wave velocity in Global coordinate system at Z = 0. Each point in this array has a corresponding entry (same index #) in the WaveVel array - REAL(SiKi), INTENT(IN ) :: WavePAcc0(0:,:,:) - REAL(SiKi), INTENT(IN ) :: WavePDynP0(0:,:) - REAL(SiKi), INTENT(INOUT) :: WaveVel(0:,:,:) - REAL(SiKi), INTENT(INOUT) :: WaveAcc(0:,:,:) - REAL(SiKi), INTENT(INOUT) :: WaveDynP(0:,:) - INTEGER(IntKi), INTENT(INOUT) :: nodeInWater(0:,:) - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables - INTEGER(IntKi) :: I, J !< Local loop counters - REAL(SiKi) :: wavekinzloc ,WavePVel0loc - - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - - - DO I = 0,NStepWave-1 ! Loop through all time steps - - DO J = 1,NNodes - - SELECT CASE ( WaveStMod ) ! Which model are we using to extrapolate the incident wave kinematics to the instantaneous free surface? - - CASE ( 0 ) ! None = no stretching. - ! Since we have no stretching, the wave kinematics between the seabed and - ! the mean sea level are left unchanged; below the seabed or above the - ! mean sea level, the wave kinematics are zero: - IF ( ( WaveKinzi(J) < -WtrDpth ) .OR. ( WaveKinzi(J) > 0.0 ) ) THEN ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above mean sea level (exclusive) - - WaveDynP (I,J ) = 0.0 - WaveVel (I,J,:) = 0.0 - WaveAcc (I,J,:) = 0.0 - nodeInWater(I,J ) = 0 - ELSE - nodeInWater(I,J ) = 1 - END IF - CASE ( 1 ) ! Vertical stretching. - - - ! Vertical stretching says that the wave kinematics above the mean sea level - ! equal the wave kinematics at the mean sea level. The wave kinematics - ! below the mean sea level are left unchanged: - IF ( ( WaveKinzi(J) < -WtrDpth ) .OR. ( WaveKinzi(J) > WaveElev(I,J) ) ) THEN ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above the instantaneous wave elevation (exclusive) - - WaveDynP (I,J ) = 0.0 - WaveVel (I,J,:) = 0.0 - WaveAcc (I,J,:) = 0.0 - nodeInWater(I,J ) = 0 - ELSE - nodeInWater(I,J ) = 1 - IF ( WaveKinzi(J) >= 0.0_ReKi ) THEN - ! Set the wave kinematics to the kinematics at mean sea level for locations above MSL, but below the wave elevation. - WaveDynP (I,J ) = WaveDynP0 (I,J ) - WaveVel (I,J,:) = WaveVel0 (I,J,:) - WaveAcc (I,J,:) = WaveAcc0 (I,J,:) - END IF - ! Otherwise, do nothing because the kinematics have already be set correctly via the various Waves modules - END IF - - - - - CASE ( 2 ) ! Extrapolation stretching. - - - ! Extrapolation stretching uses a linear Taylor expansion of the wave - ! kinematics (and their partial derivatives with respect to z) at the mean - ! sea level to find the wave kinematics above the mean sea level. The - ! wave kinematics below the mean sea level are left unchanged: - - - IF ( ( WaveKinzi(J) < -WtrDpth ) .OR. ( WaveKinzi(J) > WaveElev(I,J) ) ) THEN ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above the instantaneous wave elevation (exclusive) - - WaveDynP (I,J ) = 0.0 - WaveVel (I,J,:) = 0.0 - WaveAcc (I,J,:) = 0.0 - nodeInWater(I,J ) = 0 - ELSE - nodeInWater(I,J ) = 1 - wavekinzloc = WaveKinzi(J) - WavePVel0loc = WavePVel0 (I,J,1) - IF ( WaveKinzi(J) >= 0.0_ReKi ) THEN - ! Set the wave kinematics to the kinematics at mean sea level for locations above MSL, but below the wave elevation. - WaveDynP (I,J ) = WaveDynP0 (I,J ) + WaveKinzi(J)*WavePDynP0 (I,J ) - WaveVel (I,J,:) = WaveVel0 (I,J,:) + WaveKinzi(J)*WavePVel0 (I,J,:) - WaveAcc (I,J,:) = WaveAcc0 (I,J,:) + WaveKinzi(J)*WavePAcc0 (I,J,:) - END IF - ! Otherwise, do nothing because the kinematics have already be set correctly via the various Waves modules - END IF - - - CASE ( 3 ) ! Wheeler stretching. - - - ! Wheeler stretching says that wave kinematics calculated using Airy theory - ! at the mean sea level should actually be applied at the instantaneous - ! free surface and that Airy wave kinematics computed at locations between - ! the seabed and the mean sea level should be shifted vertically to new - ! locations in proportion to their elevation above the seabed. - ! - ! Computing the wave kinematics with Wheeler stretching requires that first - ! say that the wave kinematics we computed at the elevations defined by - ! the WaveKinzi0Prime(:) array are actual applied at the elevations found - ! by stretching the elevations in the WaveKinzi0Prime(:) array using the - ! instantaneous wave elevation--these new elevations are stored in the - ! WaveKinzi0St(:) array. Next, we interpolate the wave kinematics - ! computed without stretching to the desired elevations (defined in the - ! WaveKinzi(:) array) using the WaveKinzi0St(:) array: - - - ENDSELECT - END DO ! J - All points where the incident wave kinematics will be computed - END DO ! I - All time steps - - ! Set the ending timestep to the same as the first timestep - WaveDynP (NStepWave,: ) = WaveDynP (0,: ) - WaveVel (NStepWave,:,:) = WaveVel (0,:,:) - WaveAcc (NStepWave,:,:) = WaveAcc (0,:,:) - -END SUBROUTINE WvStretch_Init +!SUBROUTINE WvStretch_Init(WaveStMod, WtrDpth, NStepWave, NNodes, & +! NWaveElev, WaveElev, WaveKinzi, WaveTime, & +! WaveVel0, WaveAcc0, WaveDynP0, & +! WavePVel0, WavePAcc0, WavePDynP0, & +! WaveVel , WaveAcc , WaveDynP , & +! nodeInWater, ErrStat, ErrMsg ) +! +! +! INTEGER, INTENT(IN ) :: WaveStMod +! REAL(SiKi), INTENT(IN ) :: WtrDpth +! INTEGER, INTENT(IN ) :: NStepWave +! INTEGER, INTENT(IN ) :: NNodes +! INTEGER, INTENT(IN ) :: NWaveElev +! REAL(SiKi), INTENT(IN ) :: WaveElev(0:,:) +! REAL(SiKi), INTENT(IN ) :: WaveKinzi(:) +! REAL(SiKi), INTENT(IN ) :: WaveTime(0:) +! REAL(SiKi), INTENT(IN ) :: WaveVel0(0:,:,:) !< Wave velocity in Global coordinate system at Z = 0. Each point in this array has a corresponding entry (same index #) in the WaveVel array +! REAL(SiKi), INTENT(IN ) :: WaveAcc0(0:,:,:) +! REAL(SiKi), INTENT(IN ) :: WaveDynP0(0:,:) +! REAL(SiKi), INTENT(IN ) :: WavePVel0(0:,:,:) !< Wave velocity in Global coordinate system at Z = 0. Each point in this array has a corresponding entry (same index #) in the WaveVel array +! REAL(SiKi), INTENT(IN ) :: WavePAcc0(0:,:,:) +! REAL(SiKi), INTENT(IN ) :: WavePDynP0(0:,:) +! REAL(SiKi), INTENT(INOUT) :: WaveVel(0:,:,:) +! REAL(SiKi), INTENT(INOUT) :: WaveAcc(0:,:,:) +! REAL(SiKi), INTENT(INOUT) :: WaveDynP(0:,:) +! INTEGER(IntKi), INTENT(INOUT) :: nodeInWater(0:,:) +! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation +! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +! +! ! Local variables +! INTEGER(IntKi) :: I, J !< Local loop counters +! REAL(SiKi) :: wavekinzloc ,WavePVel0loc +! +! ! Initialize ErrStat +! ErrStat = ErrID_None +! ErrMsg = "" +! +! +! DO I = 0,NStepWave-1 ! Loop through all time steps +! +! DO J = 1,NNodes +! +! SELECT CASE ( WaveStMod ) ! Which model are we using to extrapolate the incident wave kinematics to the instantaneous free surface? +! +! CASE ( 0 ) ! None = no stretching. +! ! Since we have no stretching, the wave kinematics between the seabed and +! ! the mean sea level are left unchanged; below the seabed or above the +! ! mean sea level, the wave kinematics are zero: +! IF ( ( WaveKinzi(J) < -WtrDpth ) .OR. ( WaveKinzi(J) > 0.0 ) ) THEN ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above mean sea level (exclusive) +! +! WaveDynP (I,J ) = 0.0 +! WaveVel (I,J,:) = 0.0 +! WaveAcc (I,J,:) = 0.0 +! nodeInWater(I,J ) = 0 +! ELSE +! nodeInWater(I,J ) = 1 +! END IF +! CASE ( 1 ) ! Vertical stretching. +! +! +! ! Vertical stretching says that the wave kinematics above the mean sea level +! ! equal the wave kinematics at the mean sea level. The wave kinematics +! ! below the mean sea level are left unchanged: +! IF ( ( WaveKinzi(J) < -WtrDpth ) .OR. ( WaveKinzi(J) > WaveElev(I,J) ) ) THEN ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above the instantaneous wave elevation (exclusive) +! +! WaveDynP (I,J ) = 0.0 +! WaveVel (I,J,:) = 0.0 +! WaveAcc (I,J,:) = 0.0 +! nodeInWater(I,J ) = 0 +! ELSE +! nodeInWater(I,J ) = 1 +! IF ( WaveKinzi(J) >= 0.0_ReKi ) THEN +! ! Set the wave kinematics to the kinematics at mean sea level for locations above MSL, but below the wave elevation. +! WaveDynP (I,J ) = WaveDynP0 (I,J ) +! WaveVel (I,J,:) = WaveVel0 (I,J,:) +! WaveAcc (I,J,:) = WaveAcc0 (I,J,:) +! END IF +! ! Otherwise, do nothing because the kinematics have already be set correctly via the various Waves modules +! END IF +! +! +! +! +! CASE ( 2 ) ! Extrapolation stretching. +! +! +! ! Extrapolation stretching uses a linear Taylor expansion of the wave +! ! kinematics (and their partial derivatives with respect to z) at the mean +! ! sea level to find the wave kinematics above the mean sea level. The +! ! wave kinematics below the mean sea level are left unchanged: +! +! +! IF ( ( WaveKinzi(J) < -WtrDpth ) .OR. ( WaveKinzi(J) > WaveElev(I,J) ) ) THEN ! .TRUE. if the elevation of the point defined by WaveKinzi(J) lies below the seabed or above the instantaneous wave elevation (exclusive) +! +! WaveDynP (I,J ) = 0.0 +! WaveVel (I,J,:) = 0.0 +! WaveAcc (I,J,:) = 0.0 +! nodeInWater(I,J ) = 0 +! ELSE +! nodeInWater(I,J ) = 1 +! wavekinzloc = WaveKinzi(J) +! WavePVel0loc = WavePVel0 (I,J,1) +! IF ( WaveKinzi(J) >= 0.0_ReKi ) THEN +! ! Set the wave kinematics to the kinematics at mean sea level for locations above MSL, but below the wave elevation. +! WaveDynP (I,J ) = WaveDynP0 (I,J ) + WaveKinzi(J)*WavePDynP0 (I,J ) +! WaveVel (I,J,:) = WaveVel0 (I,J,:) + WaveKinzi(J)*WavePVel0 (I,J,:) +! WaveAcc (I,J,:) = WaveAcc0 (I,J,:) + WaveKinzi(J)*WavePAcc0 (I,J,:) +! END IF +! ! Otherwise, do nothing because the kinematics have already be set correctly via the various Waves modules +! END IF +! +! +! CASE ( 3 ) ! Wheeler stretching. +! +! +! ! Wheeler stretching says that wave kinematics calculated using Airy theory +! ! at the mean sea level should actually be applied at the instantaneous +! ! free surface and that Airy wave kinematics computed at locations between +! ! the seabed and the mean sea level should be shifted vertically to new +! ! locations in proportion to their elevation above the seabed. +! ! +! ! Computing the wave kinematics with Wheeler stretching requires that first +! ! say that the wave kinematics we computed at the elevations defined by +! ! the WaveKinzi0Prime(:) array are actual applied at the elevations found +! ! by stretching the elevations in the WaveKinzi0Prime(:) array using the +! ! instantaneous wave elevation--these new elevations are stored in the +! ! WaveKinzi0St(:) array. Next, we interpolate the wave kinematics +! ! computed without stretching to the desired elevations (defined in the +! ! WaveKinzi(:) array) using the WaveKinzi0St(:) array: +! +! +! ENDSELECT +! END DO ! J - All points where the incident wave kinematics will be computed +! END DO ! I - All time steps +! +! ! Set the ending timestep to the same as the first timestep +! WaveDynP (NStepWave,: ) = WaveDynP (0,: ) +! WaveVel (NStepWave,:,:) = WaveVel (0,:,:) +! WaveAcc (NStepWave,:,:) = WaveAcc (0,:,:) +! +!END SUBROUTINE WvStretch_Init !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the start of the simulation to perform initialization steps. @@ -225,7 +225,7 @@ END SUBROUTINE WvStretch_Init SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) !.................................................................................................................................. - TYPE(HydroDyn_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization routine. + TYPE(HydroDyn_InitInputType), INTENT(INOUT) :: InitInp !< Input data for initialization routine. [INOUT because of a move_alloc() statement] TYPE(HydroDyn_InputType), INTENT( OUT) :: u !< An initial guess for the input; input mesh must be defined TYPE(HydroDyn_ParameterType), INTENT( OUT) :: p !< Parameters TYPE(HydroDyn_ContinuousStateType), INTENT( OUT) :: x !< Initial continuous states @@ -251,9 +251,6 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I CHARACTER(1024) :: SummaryName ! name of the HydroDyn summary file 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 ! LOGICAL :: hasWAMITOuts ! Are there any WAMIT-related outputs ! LOGICAL :: hasMorisonOuts ! Are there any Morison-related outputs ! INTEGER :: numHydroOuts ! total number of WAMIT and Morison outputs @@ -261,25 +258,6 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I REAL(SiKi) :: WaveNmbr ! Wavenumber of the current frequency component (1/meter) ! These are dummy variables to satisfy the framework, but are not used - TYPE(Waves_InputType) :: Waves_u ! Waves module initial guess for the input; the input mesh is not defined because it is not used by the waves module - TYPE(Waves_ParameterType) :: Waves_p ! Waves module parameters - TYPE(Waves_ContinuousStateType) :: Waves_x ! Waves module initial continuous states - TYPE(Waves_DiscreteStateType) :: Waves_xd ! Waves module discrete states - TYPE(Waves_ConstraintStateType) :: Waves_z ! Waves module initial guess of the constraint states - TYPE(Waves_OtherStateType) :: WavesOtherState ! Waves module other states - TYPE(Waves_MiscVarType) :: Waves_m ! Waves module misc/optimization data - TYPE(Waves_OutputType) :: Waves_y ! Waves module outputs - - - TYPE(Current_InputType) :: Current_u ! Current module initial guess for the input; the input mesh is not defined because it is not used by the Current module - TYPE(Current_ParameterType) :: Current_p ! Current module parameters - TYPE(Current_ContinuousStateType) :: Current_x ! Current module initial continuous states - TYPE(Current_DiscreteStateType) :: Current_xd ! Current module discrete states - TYPE(Current_ConstraintStateType) :: Current_z ! Current module initial guess of the constraint states - TYPE(Current_OtherStateType) :: CurrentOtherState ! Current module other states - TYPE(Current_OutputType) :: Current_y ! Current module outputs - TYPE(Current_MiscVarType) :: Current_m ! Current module misc/optimization data - #ifdef USE_FIT ! FIT - related data @@ -302,21 +280,21 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I real(R8Ki) :: theta(3), orientation(3,3) ! Wave Stretching Data - REAL(SiKi), ALLOCATABLE :: tmpWaveKinzi(: ) - 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 (:,:,:) - REAL(SiKi), ALLOCATABLE :: WaveDynP0 (:,: ) - REAL(SiKi), ALLOCATABLE :: WaveVel2S0 (:,:,:) - REAL(SiKi), ALLOCATABLE :: WaveAcc2S0 (:,:,:) - REAL(SiKi), ALLOCATABLE :: WaveDynP2S0 (:,: ) - REAL(SiKi), ALLOCATABLE :: WaveVel2D0 (:,:,:) - REAL(SiKi), ALLOCATABLE :: WaveAcc2D0 (:,:,:) - REAL(SiKi), ALLOCATABLE :: WaveDynP2D0 (:,: ) + !REAL(SiKi), ALLOCATABLE :: tmpWaveKinzi(: ) + !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 (:,:,:) + !REAL(SiKi), ALLOCATABLE :: WaveDynP0 (:,: ) + !REAL(SiKi), ALLOCATABLE :: WaveVel2S0 (:,:,:) + !REAL(SiKi), ALLOCATABLE :: WaveAcc2S0 (:,:,:) + !REAL(SiKi), ALLOCATABLE :: WaveDynP2S0 (:,: ) + !REAL(SiKi), ALLOCATABLE :: WaveVel2D0 (:,:,:) + !REAL(SiKi), ALLOCATABLE :: WaveAcc2D0 (:,:,:) + !REAL(SiKi), ALLOCATABLE :: WaveDynP2D0 (:,: ) INTEGER(IntKi) :: ErrStat2 ! local error status @@ -399,7 +377,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ELSE IF (Initlocal%PotMod == 2) THEN ! This is the FIT potential flow model and the time step needs to be >= the driver timestep, and and integer multiple if larger ! We example WaveDT for this timestep size because FIT is tied to WaveDT - IF ( ( .NOT. EqualRealNos(mod(real(Initlocal%Waves%WaveDT,ReKi), real(Interval,ReKi)) , 0.0_ReKi) ) .OR. Initlocal%Waves%WaveDT <= 0.0_DbKi ) THEn + IF ( ( .NOT. EqualRealNos(mod(real(Initlocal%WaveDT,ReKi), real(Interval,ReKi)) , 0.0_ReKi) ) .OR. Initlocal%WaveDT <= 0.0_DbKi ) THEn CALL SetErrStat(ErrID_Fatal,'The value of WaveDT is not greater than zero and an integer multiple of the glue code timestep.',ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -443,7 +421,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Set summary unit number in Waves, Radiation, and Morison initialization input data - InputFileData%Waves%UnSum = InputFileData%UnSum + ! InputFileData%Waves%UnSum = InputFileData%UnSum InputFileData%WAMIT%Conv_Rdtn%UnSum = InputFileData%UnSum InputFileData%Morison%UnSum = InputFileData%UnSum @@ -452,404 +430,24 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! to fully initialize each sub-module based on the necessary initialization data - ! Initialize Current module - - 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 - CALL CleanUp() - RETURN - END IF - - ! Verify that Current_Init() did not request a different Interval! - - IF ( p%DT /= Interval ) THEN - CALL SetErrStat(ErrID_Fatal,'Current Module attempted to change timestep interval, but this is not allowed. Current Module must use the HydroDyn Interval.',ErrStat,ErrMsg,RoutineName) - CALL CleanUp() - RETURN - END IF - - - ! 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, InputFileData%Waves%CurrVxi ) - IF (ALLOCATED(Current_InitOut%CurrVyi)) CALL Move_Alloc( Current_InitOut%CurrVyi, InputFileData%Waves%CurrVyi ) - - InputFileData%Waves%PCurrVxiPz0 = Current_InitOut%PCurrVxiPz0 - InputFileData%Waves%PCurrVyiPz0 = Current_InitOut%PCurrVyiPz0 - - - ! 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 - - - ! Initialize Waves module - -!========================================================================== -! Initialize Wave Stretching data for 1st Order Waves -!========================================================================== - IF (InputFileData%Waves%WaveStMod > 0) THEN - ! Allocate the temporary storage array for the WvKinxi - 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() - RETURN - END IF - - - - 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 (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 ( 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 ( 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 - - InputFileData%Waves%NWaveElev = InputFileData%Waves%NWaveKin - InputFileData%Waves%WaveElevxi = InputFileData%Waves%WaveKinxi - InputFileData%Waves%WaveElevyi = InputFileData%Waves%WaveKinyi - - - 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 - CALL CleanUp() - RETURN - END IF - - ! Store the wave elevations coming out of the Waves_Init for use in the stretching calculations - 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() - RETURN - END IF - WaveElevSt = Waves_InitOut%WaveElev - - - ! We need to reset the wave elevation arrays - DEALLOCATE(InputFileData%Waves%WaveElevxi) - DEALLOCATE(InputFileData%Waves%WaveElevyi) - InputFileData%Waves%NWaveElev = tmpNWaveElev - - 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,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,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,InputFileData%Waves%NWaveKin,3), STAT=ErrStat2 ) - IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveAcc0.', ErrStat, ErrMsg, RoutineName) - - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - ! Copy the init output arrays into the MSL versions - WaveDynP0 = Waves_InitOut%WaveDynP - WaveAcc0 = Waves_InitOut%WaveAcc - WaveVel0 = Waves_InitOut%WaveVel - - - InputFileData%Waves%WaveKinzi = tmpWaveKinzi - - ! Deallocate data which will be allocated again within the Waves_Init routine - DEALLOCATE( Waves_InitOut%WaveDynP ) - DEALLOCATE( Waves_InitOut%WaveAcc ) - DEALLOCATE( Waves_InitOut%WaveVel ) - DEALLOCATE( Waves_InitOut%PWaveDynP0 ) - DEALLOCATE( Waves_InitOut%PWaveAcc0 ) - DEALLOCATE( Waves_InitOut%PWaveVel0 ) - DEALLOCATE( Waves_InitOut%WaveElevC0) - DEALLOCATE( Waves_InitOut%WaveDirArr) - DEALLOCATE( Waves_InitOut%WaveElev ) - DEALLOCATE( Waves_InitOut%WaveTime ) - DEALLOCATE( Waves_InitOut%NodeInWater ) - END IF -!========================================================================== - - 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 - CALL CleanUp() - RETURN - END IF - - - ! Verify that Waves_Init() did not request a different Interval! - - IF ( p%DT /= Interval ) THEN - CALL SetErrStat(ErrID_Fatal,'Waves Module attempted to change timestep interval, but this is not allowed. Waves Module must use the HydroDyn Interval.',ErrStat,ErrMsg,RoutineName) - CALL CleanUp() - RETURN - END IF - - ! 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(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 = InputFileData%Waves%NWaveElev - p%NStepWave = Waves_InitOut%NStepWave + !p%NWaveElev = InputFileData%Waves%NWaveElev + p%NStepWave = InitInp%NStepWave - CALL MOVE_ALLOC( Waves_InitOut%WaveTime, p%WaveTime ) - CALL MOVE_ALLOC( Waves_InitOut%WaveElev, p%WaveElev1 ) ! allocate p%WaveElev1, set p%WaveElev1 = Waves_InitOut%WaveElev, and deallocate Waves_InitOut%WaveElev + p%WaveTime => InitInp%WaveTime + !CALL MOVE_ALLOC( Waves_InitOut%WaveElev, p%WaveElev1 ) ! allocate p%WaveElev1, set p%WaveElev1 = Waves_InitOut%WaveElev, and deallocate Waves_InitOut%WaveElev ! Copy the first order wave elevation information to p%WaveElev1 so that we can output the total, first, and second order wave elevation separately - ALLOCATE ( p%WaveElev (0:p%NStepWave, p%NWaveElev ) , STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat(ErrID_Fatal,'Error allocating memory for the WaveElev array.',ErrStat,ErrMsg,RoutineName) - CALL CleanUp() - RETURN - END IF - p%WaveElev = p%WaveElev1 + + !p%WaveElev = p%WaveElev1 m%LastIndWave = 1 - IF ( InputFileData%Waves%WaveMod /= 6 ) THEN - - !---------------------------------- - ! Initialize Waves2 module - !---------------------------------- - - - IF (InputFileData%Waves2%WvDiffQTFF .OR. InputFileData%Waves2%WvSumQTFF ) THEN - ! Set a few things from the Waves module output - 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 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, 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 (InputFileData%Waves%WaveStMod > 0) THEN - ! Set the wave kinematics zi locations to zero to generate kinematics at MSL - 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 (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 ( 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 ( 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 - - InputFileData%Waves2%NWaveElev = InputFileData%Waves2%NWaveKin - InputFileData%Waves2%WaveElevxi = InputFileData%Waves2%WaveKinxi - InputFileData%Waves2%WaveElevyi = InputFileData%Waves2%WaveKinyi - - 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 - CALL CleanUp() - RETURN - END IF - - - ! Store the wave elevations coming out of the Waves_Init for use in the stretching calculations - WaveElevSt = WaveElevSt + p%Waves2%WaveElev2 - - ! We need to reset the wave elevation arrays - DEALLOCATE(InputFileData%Waves2%WaveElevxi) - DEALLOCATE(InputFileData%Waves2%WaveElevyi) - InputFileData%Waves2%NWaveElev = tmpNWaveElev - - 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,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,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,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,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,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,InputFileData%Waves%NWaveKin,3), STAT=ErrStat2 ) - IF (ErrStat2 /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveAcc2S0.', ErrStat, ErrMsg, RoutineName) - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - ! Copy the init output arrays into the MSL versions - WaveDynP2D0 = InitOut%Waves2%WaveDynP2D - WaveAcc2D0 = InitOut%Waves2%WaveAcc2D - WaveVel2D0 = InitOut%Waves2%WaveVel2D - WaveDynP2S0 = InitOut%Waves2%WaveDynP2S - WaveAcc2S0 = InitOut%Waves2%WaveAcc2S - WaveVel2S0 = InitOut%Waves2%WaveVel2S - - ! Reset the wave kinematics zi locations - InputFileData%Waves2%WaveKinzi = InputFileData%Waves%WaveKinzi - - ! Deallocate arrays which will be re-allocated in the next call to Waves2_Init - DEALLOCATE ( p%Waves2%WaveElev2 ) - DEALLOCATE ( InitOut%Waves2%WaveVel2D ) - DEALLOCATE ( InitOut%Waves2%WaveAcc2D ) - DEALLOCATE ( InitOut%Waves2%WaveDynP2D ) - DEALLOCATE ( InitOut%Waves2%WaveVel2S ) - DEALLOCATE ( InitOut%Waves2%WaveAcc2S ) - DEALLOCATE ( InitOut%Waves2%WaveDynP2S ) - - END IF -!========================================================================== - - - - - - -!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(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 - CALL CleanUp() - RETURN - END IF - - ! move arrays back - 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! - - IF ( p%DT /= Interval ) THEN - CALL SetErrStat(ErrID_Fatal,'Waves2 Module attempted to change timestep interval, but this is not allowed. '// & - ' Waves2 Module must use the HydroDyn Interval.',ErrStat,ErrMsg,RoutineName) - CALL CleanUp() - RETURN - END IF - - - ! If we calculated the wave elevation series data (for visualization purposes), add the second order corrections to the first order. - 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 - CALL SetErrStat(ErrID_Fatal,' WaveElevSeries arrays for first and second order wave elevations are of different sizes.',ErrStat,ErrMsg,RoutineName) - CALL CleanUp() - RETURN - ELSE - DO J=1,SIZE(InitOut%WaveElevSeries,DIM=2) - DO I = 0,p%NStepWave - InitOut%WaveElevSeries(I,J) = InitOut%Waves2%WaveElevSeries2(I,J) + InitOut%WaveElevSeries(I,J) - ENDDO - ENDDO - ENDIF - ENDIF - - ! If we calculated wave elevations, it is now stored in p%WaveElev. So we need to add the corrections. - IF (p%Waves2%NWaveElev > 0 ) THEN - ! Make sure the sizes of the two resulting arrays are identical... - IF ( SIZE(p%WaveElev,DIM=1) /= SIZE(p%Waves2%WaveElev2,DIM=1) .OR. & - SIZE(p%WaveElev,DIM=2) /= SIZE(p%Waves2%WaveElev2,DIM=2)) THEN - CALL SetErrStat(ErrID_Fatal,' WaveElev(NWaveElev) arrays for first and second order wave elevations are of different sizes.',ErrStat,ErrMsg,RoutineName) - CALL CleanUp() - RETURN - ELSE - DO J=1,SIZE(p%Waves2%WaveElev2,DIM=2) - DO I = 0,p%NStepWave - p%WaveElev(I,J) = p%Waves2%WaveElev2(I,J) + p%WaveElev(I,J) - ENDDO - ENDDO - CALL MOVE_ALLOC(p%Waves2%WaveElev2,p%WaveElev2) - ENDIF - ENDIF - - ! The acceleration, velocity, and dynamic pressures will get added to the parts passed to the morrison module later... - - ELSE - ! these need to be set to zero since we don't have a UseWaves2 flag: - p%Waves2%NWaveElev = 0 - p%Waves2%WvDiffQTFF = .FALSE. - p%Waves2%WvSumQTFF = .FALSE. - p%Waves2%NumOuts = 0 - - ENDIF ! InputFileData%Waves2%WvDiffQTFF .OR. InputFileData%Waves2%WvSumQTFF - - - + ! Is there a WAMIT body? @@ -861,7 +459,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I 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 - + InputFileData%WAMIT%WaveElev1 => InitInp%WaveElev1 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 ) @@ -929,23 +527,26 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I return end if - ! Copy Waves initialization output into the initialization input type for the WAMIT module + ! Copy SeaState initialization output into the initialization input type for the WAMIT module - 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 + InputFileData%WAMIT%RhoXg = InitInp%RhoXg + InputFileData%WAMIT%NStepWave = InitInp%NStepWave + InputFileData%WAMIT%NStepWave2 = InitInp%NStepWave2 + InputFileData%WAMIT%WaveDirMin = InitInp%WaveDirMin + InputFileData%WAMIT%WaveDirMax = InitInp%WaveDirMax + InputFileData%WAMIT%WaveDOmega = InitInp%WaveDOmega ! Init inputs for the SS_Excitation model (set this just in case it will be used) - InputFileData%WAMIT%WaveDir = Waves_InitOut%WaveDir - CALL MOVE_ALLOC(Waves_InitOut%WaveElev0, InputFileData%WAMIT%WaveElev0) - + InputFileData%WAMIT%WaveDir = InitInp%WaveDir + !InputFileData%WAMIT%WaveElev0 => InitInp%WaveElev0 + CALL MOVE_ALLOC( InitInp%WaveElev0, InputFileData%WAMIT%WaveElev0 ) ! Temporarily move arrays to init input for WAMIT (save some space) - 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) + + InputFileData%WAMIT%WaveTime => InitInp%WaveTime + InputFileData%WAMIT%WaveElevC0 => InitInp%WaveElevC0 + CALL MOVE_ALLOC( InitInp%WaveElevC, InputFileData%WAMIT%WaveElevC ) + InputFileData%WAMIT%seast_interp_p = InitInp%seast_interp_p + InputFileData%WAMIT%WaveDirArr => InitInp%WaveDirArr 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 ) @@ -1006,12 +607,6 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I RETURN END IF - - ! move arrays back - 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) - !----------------------------------------- ! Initialize the WAMIT2 Calculations @@ -1023,18 +618,18 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! 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, InputFileData%WAMIT2%WaveTime) - CALL MOVE_ALLOC(Waves_InitOut%WaveElevC0, InputFileData%WAMIT2%WaveElevC0) - CALL MOVE_ALLOC(Waves_InitOut%WaveDirArr, InputFileData%WAMIT2%WaveDirArr) + ! init input for WAMIT2 pointers to save space + !InputFileData%WAMIT2%WaveTime => InitInp%WaveTime ! This isn't actually used within WAMIT2 GJH 9/30/2021 + InputFileData%WAMIT2%WaveElevC0 => InitInp%WaveElevC0 + InputFileData%WAMIT2%WaveDirArr => InitInp%WaveDirArr ! Copy Waves initialization output into the initialization input type for the WAMIT module - 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%RhoXg = InitInp%RhoXg + InputFileData%WAMIT2%NStepWave = InitInp%NStepWave + InputFileData%WAMIT2%NStepWave2 = InitInp%NStepWave2 + InputFileData%WAMIT2%WaveDirMin = InitInp%WaveDirMin + InputFileData%WAMIT2%WaveDirMax = InitInp%WaveDirMax + InputFileData%WAMIT2%WaveDOmega = InitInp%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 @@ -1119,12 +714,6 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I end do - ! move arrays back - 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! IF ( p%DT /= Interval ) THEN @@ -1151,14 +740,14 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! General FITInitData%InputFile = InputFileData%PotFile FITInitData%Gravity = InputFileData%Gravity - FITInitData%Rho = InputFileData%Waves%WtrDens + FITInitData%Rho = InputFileData%Morison%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! + FITInitData%dtime = InitInp%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 - FITInitData%N_omega = Waves_InitOut%NStepWave2 - FITInitData%Wave_angle = Waves_InitOut%WaveDir + FITInitData%N_omega = InitInp%NStepWave2 + FITInitData%Wave_angle = InitInp%WaveDir ! allocate waves data arrays for FIT CALL AllocAry( FITInitData%Wave_amp, FITInitData%N_omega, "Wave_amp", ErrStat2, ErrMsg2 ) @@ -1175,14 +764,14 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I END IF ! Populate wave arrays - Np = 2*(Waves_InitOut%WaveDOmega + 1) - DO I = 1 , Waves_InitOut%NStepWave2 + Np = 2*(InitInp%WaveDOmega + 1) + DO I = 1 , InitInp%NStepWave2 - dftreal = Waves_InitOut%WaveElevC0( 1,ABS(I ) ) - dftimag = Waves_InitOut%WaveElevC0( 2, ABS(I ) )*SIGN(1,I) + dftreal = InitInp%WaveElevC0( 1,ABS(I ) ) + dftimag = InitInp%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. / InputFileData%Gravity + FITInitData%Wave_omega (I) = I*InitInp%WaveDOmega + FITInitData%Wave_number(I) = I*InitInp%WaveDOmega**2. / InputFileData%Gravity FITInitData%Wave_phase (I) = atan2( dftimag, dftreal ) END DO @@ -1198,8 +787,6 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I END IF - - END IF ! Check for WaveMod = 6 ! Are there Morison elements? @@ -1209,155 +796,60 @@ 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 Morison module - InputFileData%Morison%NStepWave = Waves_InitOut%NStepWave - - - ! Temporarily move array to init input for Morison (save some space) - CALL MOVE_ALLOC( p%WaveTime, InputFileData%Morison%WaveTime ) + InputFileData%Morison%NStepWave = InitInp%NStepWave + InputFileData%Morison%WaveTime => InitInp%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, 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 + InputFileData%Morison%WaveAcc => InitInp%WaveAcc + InputFileData%Morison%WaveDynP => InitInp%WaveDynP + InputFileData%Morison%WaveVel => InitInp%WaveVel + InputFileData%Morison%WaveElev => InitInp%WaveElev + InputFileData%Morison%WaveElev1 => InitInp%WaveElev1 + InputFileData%Morison%WaveElev2 => InitInp%WaveElev2 +! 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 ! dynamic pressure using the Waves2 module, then we need to add these to the values that we ! will be passing into the Morrison module. - ! Difference frequency results - IF ( p%Waves2%WvDiffQTFF ) THEN - - ! Dynamic pressure -- difference frequency terms - 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(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 - 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(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 - 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(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 - 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 - - ! Sum frequency results - IF ( p%Waves2%WvSumQTFF ) THEN - - ! Dynamic pressure -- sum frequency terms - 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(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 - 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(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 - 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(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 - 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 - + !============================================================================== ! TODO: 1/29/2016 GJH ! This is where we need to perform Wave Stretching, now that the wave kinematics have been combined. ! 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 (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, & - InputFileData%Morison%WaveVel, InputFileData%Morison%WaveAcc, InputFileData%Morison%WaveDynP, & - InputFileData%Morison%nodeInWater, ErrStat, ErrMsg ) - DEALLOCATE(WaveElevSt) - DEALLOCATE(WaveVel0) - DEALLOCATE(WaveAcc0) - DEALLOCATE(WaveDynP0) - END IF + !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, & + ! InputFileData%Morison%WaveVel, InputFileData%Morison%WaveAcc, InputFileData%Morison%WaveDynP, & + ! InputFileData%Morison%nodeInWater, ErrStat, ErrMsg ) + ! DEALLOCATE(WaveElevSt) + ! DEALLOCATE(WaveVel0) + ! DEALLOCATE(WaveAcc0) + ! DEALLOCATE(WaveDynP0) + !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 ( ( 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 (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 - + !TODO: Where does this belong now GJH 9/24/2021 + !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 (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 + InputFileData%Morison%seast_interp_p = InitInp%seast_interp_p ! Check the output switch to see if Morison is needing to send outputs back to HydroDyn via the WriteOutput array @@ -1377,9 +869,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I RETURN END IF - ! move array back - CALL MOVE_ALLOC( InputFileData%Morison%WaveTime, p%WaveTime ) - + IF ( u%Morison%Mesh%Committed ) THEN ! we need the translation displacement mesh for loads transfer: @@ -1414,25 +904,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I p%PotMod = InputFileData%Potmod IF ( InputFileData%UnSum > 0 ) THEN - IF (InputFileData%Waves%WaveMod /= 0 .AND. InputFileData%Waves%WaveMod /= 6) THEN - ! Write the header for this section - 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( 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, 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 ( 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 @@ -1509,12 +981,12 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I !========================================== ! Deallocate any remaining Waves Output data - IF(ALLOCATED( Waves_InitOut%WaveElevC0 )) DEALLOCATE( Waves_InitOut%WaveElevC0 ) - IF(ALLOCATED( Waves_InitOut%WaveAcc )) DEALLOCATE( Waves_InitOut%WaveAcc ) - IF(ALLOCATED( Waves_InitOut%WaveDynP )) DEALLOCATE( Waves_InitOut%WaveDynP ) - 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( Waves_InitOut%WaveElevC0 )) DEALLOCATE( Waves_InitOut%WaveElevC0 ) + !IF(ALLOCATED( Waves_InitOut%WaveAcc )) DEALLOCATE( Waves_InitOut%WaveAcc ) + !IF(ALLOCATED( Waves_InitOut%WaveDynP )) DEALLOCATE( Waves_InitOut%WaveDynP ) + !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( InputFileData%WAMIT%WaveElevC0 )) DEALLOCATE( InputFileData%WAMIT%WaveElevC0) ! Close the summary file @@ -1706,7 +1178,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I p%WtrDpth = InitOut%WtrDpth IF ( InitInp%hasIce ) THEN - IF ((InputFileData%Waves%WaveMod /= 0) .OR. (InputFileData%Current%CurrMod /= 0) ) THEN + IF ((InitInp%WaveMod /= 0) .OR. (InitInp%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 @@ -1730,48 +1202,26 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I CONTAINS !................................ SUBROUTINE CleanUp() + ! Nullify pointers to avoid deallocation of data at the wrong time and by the wrong module + ! NOTE: All of this data originated in SeaState, and SeaState is responsible for deallocating the data + ! all other modules are responsible for nullifying their versions of the pointers when they are done with the data + + nullify(InputFileData%Morison%WaveDynP) + nullify(InputFileData%Morison%WaveAcc) + nullify(InputFileData%Morison%WaveVel) + nullify(InputFileData%Morison%WaveTime) + nullify(InputFileData%Morison%WaveElev) + nullify(InputFileData%Morison%WaveElev1) + nullify(InputFileData%Morison%WaveElev2) + nullify(InputFileData%WAMIT%WaveElevC0) + nullify(InputFileData%WAMIT%WaveDirArr) + nullify(InputFileData%WAMIT%WaveElev1) + nullify(InputFileData%WAMIT%WaveTime) + nullify(InputFileData%WAMIT2%WaveElevC0) + nullify(InputFileData%WAMIT2%WaveDirArr) 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) - - - ! These are dummy variables to satisfy the framework, but are not used again: - - CALL Waves_DestroyInput( Waves_u, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Waves_DestroyParam( Waves_p, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Waves_DestroyContState( Waves_x, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Waves_DestroyDiscState( Waves_xd, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Waves_DestroyConstrState( Waves_z, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Waves_DestroyOtherState( WavesOtherState, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Waves_DestroyOutput( Waves_y, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - CALL Current_DestroyInput( Current_u, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Current_DestroyParam( Current_p, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Current_DestroyContState( Current_x, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Current_DestroyDiscState( Current_xd, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Current_DestroyConstrState( Current_z, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL Current_DestroyOtherState( CurrentOtherState, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - 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 ) + CALL NWTC_Library_DestroyFileInfoType(InFileInfo,ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) END SUBROUTINE CleanUp !................................ @@ -1793,7 +1243,7 @@ SUBROUTINE HydroDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - + integer(IntKi) :: i ! Initialize ErrStat @@ -1823,6 +1273,21 @@ SUBROUTINE HydroDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! Destroy the parameter data: + ! First need to nullify pointers so that SeaState module data is not deallocation by HD + nullify(p%WaveTime) + !NOTE: Since we don't call Morison_End() here, we need to first nullify the Morison pointers, otherwise the Morison_DestroyParam() routine [ called by + ! Hydrodyn_DestroyParam ] would try to deallocate the data attached to the Morison versions, but since SeaState created the data, it needs to do the deallocation. + nullify(p%Morison%WaveTime) + nullify(p%Morison%WaveDynP) + nullify(p%Morison%WaveAcc) + nullify(p%Morison%WaveVel) + nullify(p%Morison%WaveElev) + nullify(p%Morison%WaveElev1) + nullify(p%Morison%WaveElev2) + do i = 1,p%NBody + nullify(p%WAMIT(i)%SS_Exctn%WaveElev1) + nullify(p%WAMIT(i)%SS_Exctn%WaveTime) + end do CALL HydroDyn_DestroyParam( p, ErrStat, ErrMsg ) @@ -2043,10 +1508,7 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, TYPE(FIT_ConstraintStateType) :: FIT_z ! Initial guess of the constraint states TYPE(FIT_InputType) :: Inputs_FIT #endif - REAL(ReKi) :: WaveElev (p%NWaveElev) ! Instantaneous total elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - REAL(ReKi) :: WaveElev1(p%NWaveElev) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - REAL(ReKi) :: WaveElev2(p%NWaveElev) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - + REAL(ReKi) :: q(6*p%NBody), qdot(6*p%NBody), qdotsq(6*p%NBody), qdotdot(6*p%NBody) REAL(ReKi) :: rotdisp(3) ! small angle rotational displacements REAL(ReKi) :: AllOuts(MaxHDOutputs) @@ -2056,9 +1518,7 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrStat = ErrID_None ErrMsg = "" - WaveElev1 = 0.0_ReKi - WaveElev2 = 0.0_ReKi ! In case we don't use 2nd order waves - + ! Compute outputs here: @@ -2068,15 +1528,6 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ! This mesh will need to get mapped by the glue code for use by either ElastoDyn or SubDyn. !------------------------------------------------------------------- - ! Deal with any output from the Waves2 module.... - IF (p%Waves2%WvDiffQTFF .OR. p%Waves2%WvSumQTFF ) THEN - - ! Waves2_CalcOutput is called only so that the wave elevations can be output (if requested). - CALL Waves2_CalcOutput( Time, m%u_Waves2, p%Waves2, x%Waves2, xd%Waves2, & - z%Waves2, OtherState%Waves2, y%Waves2, m%Waves2, ErrStat2, ErrMsg2 ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDyn_CalcOutput' ) - END IF if ( p%PotMod == 1 ) then @@ -2237,28 +1688,7 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ! Integrate all the mesh loads onto the platfrom reference Point (PRP) at (0,0,0) m%F_Hydro = CalcLoadsAtWRP( y, u, m%AllHdroOrigin, u%PRPMesh, m%MrsnMesh_position, m%HD_MeshMap, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDyn_CalcOutput' ) - - - ! Compute the wave elevations at the requested output locations for this time. Note that p%WaveElev has the second order added to it already. - - ! Second order wave elevation, if calculated (This array is split out for speed because of the if) - if (allocated(p%WaveElev2)) then - DO I=1,p%NWaveElev - WaveElev2(I) = InterpWrappedStpReal ( REAL(Time, SiKi), p%WaveTime(:), p%WaveElev2(:,I), & - m%LastIndWave, p%NStepWave + 1 ) - END DO - endif - - DO I=1,p%NWaveElev - WaveElev1(I) = InterpWrappedStpReal ( REAL(Time, SiKi), p%WaveTime(:), p%WaveElev1(:,I), & - m%LastIndWave, p%NStepWave + 1 ) - WaveElev(I) = InterpWrappedStpReal ( REAL(Time, SiKi), p%WaveTime(:), p%WaveElev(:,I), & - m%LastIndWave, p%NStepWave + 1 ) - - END DO - - - + ! Write the HydroDyn-level output file data if the user requested module-level output ! and the current time has advanced since the last stored time step. @@ -2270,7 +1700,7 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ! Map calculated results into the AllOuts Array - CALL HDOut_MapOutputs( Time, p, y, m%WAMIT, m%WAMIT2, p%NWaveElev, WaveElev, WaveElev1, WaveElev2, m%F_PtfmAdd, m%F_Waves, m%F_Hydro, u%PRPMesh, q, qdot, qdotdot, AllOuts, ErrStat2, ErrMsg2 ) + CALL HDOut_MapOutputs( Time, p, y, m%WAMIT, m%WAMIT2, m%F_PtfmAdd, m%F_Waves, m%F_Hydro, u%PRPMesh, q, qdot, qdotdot, AllOuts, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDyn_CalcOutput' ) DO I = 1,p%NumOuts @@ -2283,12 +1713,6 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, J = p%NumOuts + 1 - IF (ALLOCATED( p%Waves2%OutParam ) .AND. p%Waves2%NumOuts > 0) THEN - DO I=1, p%Waves2%NumOuts - y%WriteOutput(J) = y%Waves2%WriteOutput(I) - J = J + 1 - END DO - END IF IF (ALLOCATED( p%Morison%OutParam ) .AND. p%Morison%NumOuts > 0) THEN DO I=1, p%Morison%NumOuts diff --git a/modules/hydrodyn/src/HydroDyn.txt b/modules/hydrodyn/src/HydroDyn.txt index 038fc676a1..ed2455a174 100644 --- a/modules/hydrodyn/src/HydroDyn.txt +++ b/modules/hydrodyn/src/HydroDyn.txt @@ -14,19 +14,20 @@ # ...... Include files (definitions from NWTC Library) ............................................................................ # make sure that the file name does not have any trailing white spaces! include Registry_NWTC_Library.txt -usefrom Current.txt -usefrom Waves.txt -usefrom Waves2.txt +#usefrom Current.txt +#usefrom Waves.txt +#usefrom Waves2.txt usefrom Conv_Radiation.txt usefrom SS_Radiation.txt usefrom SS_Excitation.txt usefrom WAMIT.txt usefrom WAMIT2.txt usefrom Morison.txt +usefrom SeaState.txt #usefrom FIT.txt -param HydroDyn/HydroDyn unused INTEGER MaxHDOutputs - 537 - "The maximum number of output channels supported by this module" - -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" - +param HydroDyn/HydroDyn unused INTEGER MaxHDOutputs - 510 - "The maximum number of output channels supported by this module" - +param HydroDyn/HydroDyn unused INTEGER MaxUserOutputs - 5150 - " Total possible number of output channels: SS_Excitation = 7 + SS_Radiation = 7 + Morison= 4626 + HydroDyn=510 = 5150" - ######################### # ..... Input file data ........................................................................................................... @@ -37,9 +38,9 @@ typedef ^ ^ ReKi typedef ^ ^ ReKi AddCLin {:}{:}{:} - - "Additional stiffness matrix" - typedef ^ ^ ReKi AddBLin {:}{:}{:} - - "Additional linear damping matrix" - typedef ^ ^ ReKi AddBQuad {:}{:}{:} - - "Additional quadratic damping (drag) matrix" - -typedef ^ ^ Waves_InitInputType Waves - - - "Initialization data for Waves module" - -typedef ^ ^ Waves2_InitInputType Waves2 - - - "Initialization data for Waves module" - -typedef ^ ^ Current_InitInputType Current - - - "Initialization data for Current module" - +#typedef ^ ^ Waves_InitInputType Waves - - - "Initialization data for Waves module" - +#typedef ^ ^ Waves2_InitInputType Waves2 - - - "Initialization data for Waves module" - +typedef ^ ^ SeaSt_InitInputType SeaState - - - "Initialization data for SeaState module" - typedef ^ ^ CHARACTER(1024) PotFile {:} - - "The name of the root potential flow file (without extension for WAMIT, complete name for FIT)" - typedef ^ ^ INTEGER nWAMITObj - - - "number of WAMIT input files. If NBodyMod = 1 then nPotFiles will be 1 even if NBody > 1" - typedef ^ ^ INTEGER vecMultiplier - - - "multiplier for the WAMIT vectors and matrices. If NBodyMod=1 then this = NBody, else 1" - @@ -76,23 +77,57 @@ typedef HydroDyn/HydroDyn InitInputType CHARACTER(1 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 ^ ^ 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 ^ ^ SeaSt_InitOutputType SeaSt_InitOut - - - "SeaState Module InitOutput" - 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" # +typedef ^ ^ INTEGER NStepWave - - - "Total number of frequency components = total number of time steps in the incident wave" - +typedef ^ ^ INTEGER NStepWave2 - - - "NStepWave / 2" - +typedef ^ ^ SiKi RhoXg - - - "= WtrDens*Gravity" - +typedef ^ ^ INTEGER WaveMod - - - "Incident wave kinematics model {0: none=still water, 1: plane progressive (regular), 2: JONSWAP/Pierson-Moskowitz spectrum (irregular), 3: white-noise spectrum, 4: user-defind spectrum from routine UserWaveSpctrm (irregular), 5: GH BLADED }" - +typedef ^ ^ INTEGER CurrMod - - - "" - +typedef ^ ^ INTEGER WaveStMod - - - "Model for stretching incident wave kinematics to instantaneous free surface {0: none=no stretching, 1: vertical stretching, 2: extrapolation stretching, 3: Wheeler stretching}" - +typedef ^ ^ INTEGER WaveDirMod - - - "Directional wave spreading function {0: none, 1: COS2S} [only used if WaveMod=6]" - +typedef ^ ^ SiKi WvLowCOff - - - "Low cut-off frequency or lower frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4]" (rad/s) +typedef ^ ^ SiKi WvHiCOff - - - "High cut-off frequency or upper frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4]" (rad/s) +typedef ^ ^ SiKi WvLowCOffD - - - "Minimum frequency used in the difference methods [Ignored if all difference methods = 0]" (rad/s) +typedef ^ ^ SiKi WvHiCOffD - - - "Maximum frequency used in the difference methods [Ignored if all difference methods = 0]" (rad/s) +typedef ^ ^ SiKi WvLowCOffS - - - "Minimum frequency used in the sum-QTF method [Ignored if SumQTF = 0]" (rad/s) +typedef ^ ^ SiKi WvHiCOffS - - - "Maximum frequency used in the sum-QTF method [Ignored if SumQTF = 0]" (rad/s) +typedef ^ ^ LOGICAL WvDiffQTFF - - - "Full difference QTF second order forces flag" (-) +typedef ^ ^ LOGICAL WvSumQTFF - - - "Full sum QTF second order forces flag" (-) +typedef ^ ^ SiKi WaveElev {*}{*}{*} - - "Total wave elevation" - +typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" - +typedef ^ ^ SiKi WaveElev2 {*}{*}{*} - - "Second order wave elevation" - +typedef ^ ^ SiKi WaveElev0 {:} - - "Instantaneous elevation time-series of incident waves at the platform reference point" (meters) +typedef ^ ^ SiKi WaveTime {*} - - "Simulation times at which the instantaneous elevation of, velocity of, acceleration of, and loads associated with the incident waves are determined" (sec) +typedef ^ ^ SiKi WaveDynP {*}{*}{*}{*} - - "Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (N/m^2) +typedef ^ ^ SiKi WaveAcc {*}{*}{*}{*}{*} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (m/s^2) +typedef ^ ^ SiKi WaveVel {*}{*}{*}{*}{*} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) +typedef ^ ^ SiKi WaveElevC0 {*}{*} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) +typedef ^ ^ SiKi WaveElevC {:}{:}{:} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at all grid points. First column is real part, second column is imaginary part" (meters) +typedef ^ ^ SiKi WaveDirArr {*} - - "Wave direction array. Each frequency has a unique direction of WaveNDir > 1" (degrees) +typedef ^ ^ SiKi WaveDirMin - - - "Minimum wave direction." (degrees) +typedef ^ ^ SiKi WaveDirMax - - - "Maximum wave direction." (degrees) +typedef ^ ^ SiKi WaveDir - - - "Incident wave propagation heading direction" (degrees) +typedef ^ ^ LOGICAL WaveMultiDir - - - "Indicates the waves are multidirectional -- set by HydroDyn_Input" - +typedef ^ ^ SiKi WaveDOmega - - - "Frequency step for incident wave calculations" (rad/s) +typedef ^ ^ SeaSt_Interp_ParameterType SeaSt_Interp_p - - - "parameter information from the SeaState Interpolation module" - +# # # Define outputs from the initialization routine here: # typedef ^ InitOutputType WAMIT_InitOutputType WAMIT {:} - - "Initialization output from the WAMIT module" - typedef ^ InitOutputType WAMIT2_InitOutputType WAMIT2 {:} - - "Initialization output from the WAMIT2 module" - -typedef ^ InitOutputType Waves2_InitOutputType Waves2 - - - "Initialization output from the Waves2 module" - +#typedef ^ InitOutputType Waves2_InitOutputType Waves2 - - - "Initialization output from the Waves2 module" - typedef ^ ^ Morison_InitOutputType Morison - - - "Initialization output from the Morison module" - typedef ^ ^ CHARACTER(ChanLen) WriteOutputHdr {:} - - "The is the list of all HD-related output channel header strings (includes all sub-module channels)" - typedef ^ ^ CHARACTER(ChanLen) WriteOutputUnt {:} - - "The is the list of all HD-related output channel unit strings (includes all sub-module channels)" - @@ -120,7 +155,7 @@ typedef ^ HD_ModuleMapType MeshMapType # typedef ^ ContinuousStateType WAMIT_ContinuousStateType WAMIT {:} - - "continuous states from the wamit module" - typedef ^ ContinuousStateType WAMIT2_ContinuousStateType WAMIT2 {:} - - "continuous states from the wamit2 module" - -typedef ^ ContinuousStateType Waves2_ContinuousStateType Waves2 - - - "continuous states from the waves2 module" - +#typedef ^ ContinuousStateType Waves2_ContinuousStateType Waves2 - - - "continuous states from the waves2 module" - typedef ^ ContinuousStateType Morison_ContinuousStateType Morison - - - "continuous states from the Morison module" - # # @@ -129,7 +164,7 @@ typedef ^ ContinuousStateType Morison_Con typedef ^ DiscreteStateType WAMIT_DiscreteStateType WAMIT {:} - - "discrete states from the wamit module" - typedef ^ DiscreteStateType WAMIT2_DiscreteStateType WAMIT2 {:} - - "discrete states from the wamit2 module" - #typedef ^ DiscreteStateType FIT_DiscreteStateType FIT - - - "discrete states from the FIT module" - -typedef ^ DiscreteStateType Waves2_DiscreteStateType Waves2 - - - "discrete states from the waves2 module" - +#typedef ^ DiscreteStateType Waves2_DiscreteStateType Waves2 - - - "discrete states from the waves2 module" - typedef ^ DiscreteStateType Morison_DiscreteStateType Morison - - - "discrete states from the Morison module" - # # @@ -137,7 +172,7 @@ typedef ^ DiscreteStateType Morison_Dis # typedef ^ ConstraintStateType WAMIT_ConstraintStateType WAMIT - - - "constraint states from WAMIT (may be empty)" - typedef ^ ConstraintStateType WAMIT2_ConstraintStateType WAMIT2 - - - "constraint states from WAMIT2 (may be empty)" - -typedef ^ ConstraintStateType Waves2_ConstraintStateType Waves2 - - - "constraint states from the waves2 module" - +#typedef ^ ConstraintStateType Waves2_ConstraintStateType Waves2 - - - "constraint states from the waves2 module" - typedef ^ ConstraintStateType Morison_ConstraintStateType Morison - - - "constraint states from the Morison module" - # # @@ -146,7 +181,7 @@ typedef ^ ConstraintStateType Morison_Con typedef ^ OtherStateType WAMIT_OtherStateType WAMIT {:} - - "OtherState information from the WAMIT module" - typedef ^ OtherStateType WAMIT2_OtherStateType WAMIT2 {:} - - "OtherState information from the WAMIT2 module" - #typedef ^ OtherStateType FIT_OtherStateType FIT - - - "OtherState information from the FIT module" - -typedef ^ OtherStateType Waves2_OtherStateType Waves2 - - - "OtherState information from the Waves2 module" - +#typedef ^ OtherStateType Waves2_OtherStateType Waves2 - - - "OtherState information from the Waves2 module" - typedef ^ ^ Morison_OtherStateType Morison - - - "OtherState information from the Morison module" - # ..... Misc/Optimization variables................................................................................................. @@ -163,11 +198,11 @@ typedef ^ ^ ReKi typedef ^ ^ ReKi F_Waves {:} - - "The total waves forces on a WAMIT body calculated by first and second order methods (WAMIT and WAMIT2 modules)" - typedef ^ ^ WAMIT_MiscVarType WAMIT {:} - - "misc var information from the WAMIT module" - typedef ^ ^ WAMIT2_MiscVarType WAMIT2 {:} - - "misc var information from the WAMIT2 module" - -typedef ^ ^ Waves2_MiscVarType Waves2 - - - "misc var information from the Waves2 module" - +#typedef ^ ^ Waves2_MiscVarType Waves2 - - - "misc var information from the Waves2 module" - typedef ^ ^ Morison_MiscVarType Morison - - - "misc var information from the Morison module" - typedef ^ ^ WAMIT_InputType u_WAMIT {:} - - "WAMIT module inputs" - typedef ^ ^ WAMIT2_InputType u_WAMIT2 {:} - - "WAMIT2 module inputs" - -typedef ^ ^ Waves2_InputType u_Waves2 - - - "Waves2 module inputs" - +#typedef ^ ^ Waves2_InputType u_Waves2 - - - "Waves2 module inputs" - # ..... Parameters ................................................................................................................ # Define parameters here: # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: @@ -178,7 +213,7 @@ typedef ^ ^ WAMIT_Param typedef ^ ^ WAMIT2_ParameterType WAMIT2 {:} - - "Parameter data for the WAMIT2 module" - typedef ^ ^ LOGICAL WAMIT2used - .FALSE. - "Indicates when WAMIT2 is used. Shortcuts some calculations" - #typedef ^ ^ FIT_ParameterType FIT - - - "Parameter data for the FIT module" - -typedef ^ ^ Waves2_ParameterType Waves2 - - - "Parameter data for the Waves2 module" - +#typedef ^ ^ Waves2_ParameterType Waves2 - - - "Parameter data for the Waves2 module" - typedef ^ ^ Morison_ParameterType Morison - - - "Parameter data for the Morison module" - typedef ^ ^ INTEGER PotMod - - - "1 if using WAMIT model, 0 if no potential flow model, or 2 if FIT model" - typedef ^ ^ INTEGER NBody - - - "[>=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]" - @@ -186,12 +221,8 @@ typedef ^ ^ INTEGER typedef ^ ^ INTEGER totalStates - - - "Number of excitation and radiation states for all WAMIT bodies" - typedef ^ ^ INTEGER totalExctnStates - - - "Number of excitation states for all WAMIT bodies" - typedef ^ ^ INTEGER totalRdtnStates - - - "Number of radiation states for all WAMIT bodies" - -typedef ^ ^ SiKi WaveTime {:} - - "Array of time samples, (sec)" - +typedef ^ ^ SiKi WaveTime {*} - - "Array of time samples, (sec)" - typedef ^ ^ INTEGER NStepWave - - - "Number of data points in the wave kinematics arrays" - -typedef ^ ^ INTEGER NWaveElev - - - "Number of wave elevation outputs" - -typedef ^ ^ SiKi WaveElev {:}{:} - - "Total wave elevation" - -typedef ^ ^ SiKi WaveElev1 {:}{:} - - "First order wave elevation" - -typedef ^ ^ SiKi WaveElev2 {:}{:} - - "Second order wave elevation" - typedef ^ ^ ReKi WtrDpth - - - "Water depth" (m) typedef ^ ^ ReKi AddF0 {:}{:} - - "Additional pre-load forces and moments (N,N,N,N-m,N-m,N-m)" - typedef ^ ^ ReKi AddCLin {:}{:}{:} - - "Additional stiffness matrix" - @@ -225,7 +256,7 @@ typedef ^ InputType MeshType # Define outputs that are contained on the mesh here: typedef ^ OutputType WAMIT_OutputType WAMIT {:} - - "WAMIT module outputs" - typedef ^ OutputType WAMIT2_OutputType WAMIT2 {:} - - "WAMIT2 module outputs" - -typedef ^ OutputType Waves2_OutputType Waves2 - - - "Waves2 module outputs" - +#typedef ^ OutputType Waves2_OutputType Waves2 - - - "Waves2 module outputs" - typedef ^ ^ Morison_OutputType Morison - - - "Morison module outputs" - typedef ^ OutputType MeshType WAMITMesh - - - "Point Loads at the WAMIT reference point(s) in the inertial frame" - typedef ^ ^ ReKi WriteOutput {:} - - "Outputs to be written to the output file(s)" - diff --git a/modules/hydrodyn/src/HydroDyn_DriverCode.f90 b/modules/hydrodyn/src/HydroDyn_DriverCode.f90 index 2e186d5bca..0da07adfc7 100644 --- a/modules/hydrodyn/src/HydroDyn_DriverCode.f90 +++ b/modules/hydrodyn/src/HydroDyn_DriverCode.f90 @@ -23,6 +23,8 @@ PROGRAM HydroDynDriver USE NWTC_Library + use SeaState + use SeaState_Types USE HydroDyn USE HydroDyn_Types USE HydroDyn_Output @@ -38,6 +40,7 @@ PROGRAM HydroDynDriver REAL(ReKi) :: WtrDpth REAL(ReKi) :: MSL2SWL CHARACTER(1024) :: HDInputFile + CHARACTER(1024) :: SeaStateInputFile CHARACTER(1024) :: OutRootName LOGICAL :: Linearize INTEGER :: NSteps @@ -70,6 +73,26 @@ PROGRAM HydroDynDriver REAL(DbKi) :: Interval ! HD module requested time interval INTEGER(B1Ki), ALLOCATABLE :: SaveAry(:) ! Array to store packed data structure + type(SeaSt_InitInputType) :: InitInData_SeaSt ! Input data for initialization + type(SeaSt_InitOutputType) :: InitOutData_SeaSt ! Output data from initialization + + type(SeaSt_ContinuousStateType) :: x_SeaSt ! Continuous states + type(SeaSt_ContinuousStateType) :: x_new_SeaSt ! Continuous states at updated time + type(SeaSt_DiscreteStateType) :: xd_SeaSt ! Discrete states + type(SeaSt_DiscreteStateType) :: xd_new_SeaSt ! Discrete states at updated time + type(SeaSt_ConstraintStateType) :: z_SeaSt ! Constraint states + type(SeaSt_ConstraintStateType) :: z_residual_SeaSt ! Residual of the constraint state equations (Z) + type(SeaSt_OtherStateType) :: OtherState_SeaSt ! Other states + type(SeaSt_MiscVarType) :: m_SeaSt ! Misc/optimization variables + + type(SeaSt_ParameterType) :: p_SeaSt ! Parameters + !type(SeaSt_InputType) :: u ! System inputs [OLD STYLE] + type(SeaSt_InputType) :: u_SeaSt(NumInp) ! System inputs + type(SeaSt_OutputType) :: y_SeaSt ! System outputs + + type(SeaSt_ContinuousStateType) :: dxdt_SeaSt ! First time derivatives of the continuous states + + TYPE(HydroDyn_InitInputType) :: InitInData ! Input data for initialization TYPE(HydroDyn_InitOutputType) :: InitOutData ! Output data from initialization @@ -185,7 +208,7 @@ PROGRAM HydroDynDriver InitInData%UseInputFile = .TRUE. InitInData%InputFile = drvrInitInp%HDInputFile InitInData%OutRootName = drvrInitInp%OutRootName - InitInData%TMax = drvrInitInp%NSteps * drvrInitInp%TimeInterval + InitInData%TMax = (drvrInitInp%NSteps-1) * drvrInitInp%TimeInterval ! Starting time is always t = 0.0 InitInData%Linearize = drvrInitInp%Linearize ! Get the current time @@ -203,8 +226,86 @@ PROGRAM HydroDynDriver !------------------------------------------------------------------------------------- ! Begin Simulation Setup !------------------------------------------------------------------------------------- - + + ! Initialize the SeaState module + InitInData_SeaSt%Gravity = drvrInitInp%Gravity + InitInData_SeaSt%defWtrDens = drvrInitInp%WtrDens + InitInData_SeaSt%defWtrDpth = drvrInitInp%WtrDpth + InitInData_SeaSt%defMSL2SWL = drvrInitInp%MSL2SWL + InitInData_SeaSt%UseInputFile = .TRUE. + InitInData_SeaSt%InputFile = drvrInitInp%SeaStateInputFile + InitInData_SeaSt%OutRootName = drvrInitInp%OutRootName + InitInData_SeaSt%TMax = (drvrInitInp%NSteps-1) * drvrInitInp%TimeInterval ! Starting time is always t = 0.0 + Interval = drvrInitInp%TimeInterval + call SeaSt_Init( InitInData_SeaSt, u_SeaSt(1), p_SeaSt, x_SeaSt, xd_SeaSt, z_SeaSt, OtherState_SeaSt, y_SeaSt, m_SeaSt, Interval, InitOutData_SeaSt, ErrStat, ErrMsg ) + if (errStat >= AbortErrLev) then + ! Clean up and exit + call HD_DvrCleanup() + end if + + if ( Interval /= drvrInitInp%TimeInterval) then + call WrScr('The SeaState Module attempted to change timestep interval, but this is not allowed. The SeaState Module must use the Driver Interval.') + call HD_DvrCleanup() + + end if + ! Set HD Init Inputs based on SeaStates Init Outputs + InitInData%NStepWave = InitOutData_SeaSt%NStepWave + InitInData%NStepWave2 = InitOutData_SeaSt%NStepWave2 + InitInData%RhoXg = InitOutData_SeaSt%RhoXg + InitInData%WaveMod = InitOutData_SeaSt%WaveMod + InitInData%CurrMod = InitOutData_SeaSt%CurrMod + InitInData%WaveStMod = InitOutData_SeaSt%WaveStMod + InitInData%WaveDirMod = InitOutData_SeaSt%WaveDirMod + InitInData%WvLowCOff = InitOutData_SeaSt%WvLowCOff + InitInData%WvHiCOff = InitOutData_SeaSt%WvHiCOff + InitInData%WvLowCOffD = InitOutData_SeaSt%WvLowCOffD + InitInData%WvHiCOffD = InitOutData_SeaSt%WvHiCOffD + InitInData%WvLowCOffS = InitOutData_SeaSt%WvLowCOffS + InitInData%WvHiCOffS = InitOutData_SeaSt%WvHiCOffS + InitInData%WvDiffQTFF = InitOutData_SeaSt%WvDiffQTFF + InitInData%WvSumQTFF = InitOutData_SeaSt%WvSumQTFF + InitInData%WaveDirMin = InitOutData_SeaSt%WaveDirMin + InitInData%WaveDirMax = InitOutData_SeaSt%WaveDirMax + InitInData%WaveDir = InitOutData_SeaSt%WaveDir + InitInData%WaveMultiDir = InitOutData_SeaSt%WaveMultiDir + InitInData%WaveDOmega = InitOutData_SeaSt%WaveDOmega + !InitInData%WaveElev0 => InitOutData_SeaSt%WaveElev0 + CALL MOVE_ALLOC( InitOutData_SeaSt%WaveElev0, InitInData%WaveElev0 ) + InitInData%WaveTime => InitOutData_SeaSt%WaveTime + InitInData%WaveDynP => InitOutData_SeaSt%WaveDynP + InitInData%WaveAcc => InitOutData_SeaSt%WaveAcc + InitInData%WaveVel => InitOutData_SeaSt%WaveVel + InitInData%WaveElevC0 => InitOutData_SeaSt%WaveElevC0 + CALL MOVE_ALLOC( InitOutData_SeaSt%WaveElevC, InitInData%WaveElevC ) + InitInData%WaveDirArr => InitOutData_SeaSt%WaveDirArr + InitInData%WaveElev => InitOutData_SeaSt%WaveElev + InitInData%WaveElev1 => InitOutData_SeaSt%WaveElev1 + InitInData%WaveElev2 => InitOutData_SeaSt%WaveElev2 + + ! Nullify these pointers because they are no longer needed + nullify(InitOutData_SeaSt%WaveDynP) + nullify(InitOutData_SeaSt%WaveAcc) + nullify(InitOutData_SeaSt%WaveVel) + nullify(InitOutData_SeaSt%WaveTime) + nullify(InitOutData_SeaSt%WaveElevC0) + nullify(InitOutData_SeaSt%WaveDirArr) + nullify(InitOutData_SeaSt%WaveElev) + nullify(InitOutData_SeaSt%WaveElev1) + nullify(InitOutData_SeaSt%WaveElev2) + + call SeaSt_Interp_CopyParam(InitOutData_SeaSt%SeaSt_Interp_p, InitInData%SeaSt_Interp_p, 0, ErrStat, ErrMsg ) + + ! Destroy SeaState InitOutput + CALL SeaSt_DestroyInitOutput( InitOutData_SeaSt, ErrStat, ErrMsg ) + + if (errStat >= AbortErrLev) then + ! Clean up and exit + call HD_DvrCleanup() + end if + + + IF ( drvrInitInp%PRPInputsMod == 2 ) THEN ! Open the PRP inputs data file @@ -276,38 +377,27 @@ PROGRAM HydroDynDriver ELSE NBody = 0 END IF - - ! Setup the arrays for the wave elevation timeseries if requested by the driver input file - IF ( drvrInitInp%WaveElevSeriesFlag ) THEN - ALLOCATE ( InitInData%WaveElevXY(2,drvrInitInp%WaveElevNX*drvrInitInp%WaveElevNY), STAT=ErrStat ) - IF ( ErrStat >= ErrID_Fatal ) THEN - CALL HydroDyn_End( u(1), p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) - IF ( ErrStat /= ErrID_None ) THEN - CALL WrScr( ErrMsg ) - END IF - STOP - END IF - - ! Set the values - n = 0 ! Dummy counter we are using to get the current point number - DO I = 0,drvrInitInp%WaveElevNX-1 - DO J = 0, drvrInitInp%WaveElevNY-1 - n = n+1 - ! X dimension - InitInData%WaveElevXY(1,n) = drvrInitInp%WaveElevDX*(I - 0.5*(drvrInitInp%WaveElevNX-1)) - ! Y dimension - InitInData%WaveElevXY(2,n) = drvrInitInp%WaveElevDY*(J - 0.5*(drvrInitInp%WaveElevNY-1)) - ENDDO - ENDDO - ENDIF - ! Initialize the module Interval = drvrInitInp%TimeInterval CALL HydroDyn_Init( InitInData, u(1), p, x, xd, z, OtherState, y, m, Interval, InitOutData, ErrStat, ErrMsg ) + + ! 1) Nullify the HD Init Input pointers + ! 2) Now, when HydroDyn_DestroyInitInput is called and hence SeaSt_DestroyInitOutput, we will not deallocate data which is still in use because the is associated test will fail. + + nullify(InitInData%WaveElevC0) + nullify(InitInData%WaveDirArr) + nullify(InitInData%WaveDynP) + nullify(InitInData%WaveAcc) + nullify(InitInData%WaveVel) + nullify(InitInData%WaveTime) + nullify(InitInData%WaveElev) + nullify(InitInData%WaveElev1) + nullify(InitInData%WaveElev2) + if (errStat >= AbortErrLev) then - ! Clean up and exit + ! Clean up and exit call HD_DvrCleanup() end if @@ -320,19 +410,18 @@ PROGRAM HydroDynDriver ! Write the gridded wave elevation data to a file - IF ( drvrInitInp%WaveElevSeriesFlag ) CALL WaveElevGrid_Output (drvrInitInp, InitInData, InitOutData, p, ErrStat, ErrMsg) - if (errStat >= AbortErrLev) then - ! Clean up and exit - call HD_DvrCleanup() - end if - - - ! Destroy initialization data + CALL HydroDyn_DestroyInitInput( InitInData, ErrStat, ErrMsg ) CALL HydroDyn_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) +! Nullify unneeded SeaState pointers so that we can then destroy the InitOutput data structure without deallocated needed data + !nullify(InitOutData_SeaSt%WaveElev0) + !nullify(InitOutData_SeaSt%WaveElevC0) + !nullify(InitOutData_SeaSt%WaveDirArr) + + ! Create Mesh mappings if ( u(1)%WAMITMesh%Initialized ) then ! Create mesh mappings between (0,0,0) reference point mesh and the WAMIT body(ies) mesh [ 1 node per body ] @@ -519,13 +608,19 @@ PROGRAM HydroDynDriver end if END IF - END IF + END IF !@mhall: end of addition ! Calculate outputs at n + call SeaSt_CalcOutput( Time, u_SeaSt(1), p_SeaSt, x_SeaSt, xd_SeaSt, z_SeaSt, OtherState_SeaSt, y_SeaSt, m_SeaSt, ErrStat, ErrMsg ) + if (errStat >= AbortErrLev) then + ! Clean up and exit + call HD_DvrCleanup() + end if + CALL HydroDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) if (errStat >= AbortErrLev) then ! Clean up and exit @@ -594,7 +689,8 @@ subroutine HD_DvrCleanup() errMsg2 = "" - + call SeaSt_End( u_SeaSt(1), p_SeaSt, x_SeaSt, xd_SeaSt, z_SeaSt, OtherState_SeaSt, y_SeaSt, m_SeaSt, errStat2, errMsg2 ) + call SetErrStat( errStat2, errMsg2, errStat, errMsg, 'HD_DvrCleanup' ) call HydroDyn_DestroyInitInput( InitInData, errStat2, errMsg2 ) call SetErrStat( errStat2, errMsg2, errStat, errMsg, 'HD_DvrCleanup' ) call HydroDyn_DestroyDiscState( xd_new, errStat2, errMsg2 ) @@ -850,6 +946,18 @@ SUBROUTINE ReadDriverInputFile( inputFile, InitInp, ErrStat, ErrMsg ) RETURN END IF + ! SeaStInputFile + + CALL ReadVar ( UnIn, FileName, InitInp%SeaStateInputFile, 'SeaStateInputFile', & + 'SeaState input filename', ErrStat, ErrMsg, UnEchoLocal ) + + IF ( ErrStat /= ErrID_None ) THEN + ErrMsg = ' Failed to read SeaStateInputFile parameter.' + ErrStat = ErrID_Fatal + CALL CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + CLOSE( UnIn ) + RETURN + END IF ! OutRootName @@ -1015,85 +1123,6 @@ SUBROUTINE ReadDriverInputFile( inputFile, InitInp, ErrStat, ErrMsg ) InitInp%uDotPRPInSteady = 0.0 InitInp%uDotDotPRPInSteady = 0.0 END IF - - - !------------------------------------------------------------------------------------------------- - !> ### Waves elevation series section - !------------------------------------------------------------------------------------------------- - - !> Header - -CALL ReadCom( UnIn, FileName, 'Waves multipoint elevation output header', ErrStat, ErrMsg, UnEchoLocal ) - - IF ( ErrStat /= ErrID_None ) THEN - ErrMsg = ' Failed to read Comment line.' - ErrStat = ErrID_Fatal - CALL CleanupEchoFile( InitInp%Echo, UnEchoLocal ) - CLOSE( UnIn ) - RETURN - END IF - - !> WaveElevSeriesFlag -- are we doing multipoint wave elevation output? - CALL ReadVar ( UnIn, FileName, InitInp%WaveElevSeriesFlag, 'WaveElevSeriesFlag', 'WaveElevSeriesFlag', ErrStat, ErrMsg ) - IF ( ErrStat /= ErrID_None ) THEN - ErrMsg = ' Failed to read WaveElevSeries parameter.' - ErrStat = ErrID_Fatal - CLOSE( UnIn ) - RETURN - END IF - - - !> WaveElevDX and WaveElevNY -- point spacing (m) - CALL ReadAry ( UnIn, FileName, TmpRealVar2, 2, 'WaveElevDX WaveElevDY', & - 'WaveElevSeries spacing -- WaveElevDX WaveElevDY', ErrStat, ErrMsg, UnEchoLocal) - - IF ( ErrStat /= ErrID_None ) THEN - CALL SetErrStat( ErrID_Fatal,'Failed to read WaveElevDX and WaveElevDY parameters.',ErrStat,ErrMsg,'ReadDriverInputFile') - CALL CleanupEchoFile( InitInp%Echo, UnEchoLocal ) - CLOSE( UnIn ) - RETURN - END IF - - InitInp%WaveElevDX = TmpRealVar2(1) - InitInp%WaveElevDY = TmpRealVar2(2) - - - - !> WaveElevNX and WaveElevNY -- point spacing (m) - CALL ReadAry ( UnIn, FileName, TmpIntVar2, 2, 'WaveElevNX WaveElevNY', & - 'WaveElevSeries points -- WaveElevNX WaveElevNY', ErrStat, ErrMsg, UnEchoLocal) - - IF ( ErrStat /= ErrID_None ) THEN - CALL SetErrStat( ErrID_Fatal,' Failed to read WaveElevNX and WaveElevNY parameters.',ErrStat,ErrMsg,'ReadDriverInputFile') - CALL CleanupEchoFile( InitInp%Echo, UnEchoLocal ) - CLOSE( UnIn ) - RETURN - END IF - - - IF (MOD(TmpIntVar2(1),2) == 0) THEN - TmpIntVar2(1) = TmpIntVar2(1)+1 - CALL SetErrStat( ErrID_Warn, "Changing WaveElevNX to an odd number ("//TRIM(Num2LStr(TmpIntVar2(1)))// & - ") so that there is a point at the origin.",ErrStat,ErrMsg,'ReadDriverInputFile' ) - ENDIF - IF (MOD(TmpIntVar2(2),2) == 0) THEN - TmpIntVar2(2) = TmpIntVar2(2)+1 - CALL SetErrStat( ErrID_Warn, "Changing WaveElevNX to an odd number ("//TRIM(Num2LStr(TmpIntVar2(2)))// & - ") so that there is a point at the origin.",ErrStat,ErrMsg,'ReadDriverInputFile' ) - ENDIF - InitInp%WaveElevNX = TmpIntVar2(1) - InitInp%WaveElevNY = TmpIntVar2(2) - - - !> if the flag was false, set the spacing and number of points to 0 - IF ( .NOT. InitInp%WaveElevSeriesFlag ) THEN - InitInp%WaveElevDX = 0.0_ReKi - InitInp%WaveElevDY = 0.0_ReKi - InitInp%WaveElevNX = 0_IntKi - InitInp%WaveElevNY = 0_IntKi - ENDIF - - CALL CleanupEchoFile( InitInp%Echo, UnEchoLocal ) @@ -1101,76 +1130,6 @@ SUBROUTINE ReadDriverInputFile( inputFile, InitInp, ErrStat, ErrMsg ) END SUBROUTINE ReadDriverInputFile -SUBROUTINE WaveElevGrid_Output (drvrInitInp, HDynInitInp, HDynInitOut, HDyn_p, ErrStat, ErrMsg) - - TYPE(HD_drvr_InitInput), INTENT( IN ) :: drvrInitInp - TYPE(HydroDyn_InitInputType), INTENT( IN ) :: HDynInitInp - TYPE(HydroDyn_InitOutputType), INTENT( IN ) :: HDynInitOut ! Output data from initialization - TYPE(HydroDyn_ParameterType), INTENT( IN ) :: HDyn_p ! Output data from initialization - INTEGER, INTENT( OUT ) :: ErrStat ! returns a non-zero value when an error occurs - CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None - - ! Temporary local variables - INTEGER(IntKi) :: ErrStatTmp !< Temporary variable for the status of error message - CHARACTER(1024) :: ErrMsgTmp !< Temporary variable for the error message - - INTEGER(IntKi) :: WaveElevFileUn !< Number for the output file for the wave elevation series - CHARACTER(1024) :: WaveElevFileName !< Name for the output file for the wave elevation series - CHARACTER(128) :: WaveElevFmt !< Format specifier for the output file for wave elevation series - - - WaveElevFmt = "(F14.7,3x,F14.7,3x,F14.7)" - - ErrMsg = "" - ErrStat = ErrID_None - ErrMsgTmp = "" - ErrStatTmp = ErrID_None - - - ! If we calculated the wave elevation at a set of coordinates for use with making movies, put it into an output file - WaveElevFileName = TRIM(drvrInitInp%OutRootName)//".WaveElev.out" - CALL GetNewUnit( WaveElevFileUn ) - - CALL OpenFOutFile( WaveElevFileUn, WaveElevFileName, ErrStat, ErrMsg ) - IF ( ErrStat /= ErrID_None) THEN - IF ( ErrStat >= AbortErrLev ) RETURN - END IF - - ! Write some useful header information -! WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## This file was generated by '//TRIM(GetNVD(HDyn_Drv_ProgDesc))// & -! ' on '//CurDate()//' at '//CurTime()//'.' - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## This file was generated on '//CurDate()//' at '//CurTime()//'.' - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## This file contains the wave elevations at a series of points '// & - 'through the entire timeseries.' - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## It is arranged as blocks of X,Y,Elevation at each timestep' - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## Each block is separated by two blank lines for use in gnuplot' - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# ' - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# WaveTMax = '//TRIM(Num2LStr(HDyn_p%WaveTime(HDyn_P%NStepWave))) - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# NStepWave = '//TRIM(Num2LStr(HDyn_p%NStepWave)) - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridXPoints = '//TRIM(Num2LStr(drvrInitInp%WaveElevNX)) - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridYPoints = '//TRIM(Num2LStr(drvrInitInp%WaveElevNY)) - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridDX = '//TRIM(Num2LStr(drvrInitInp%WaveElevDX)) - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridDY = '//TRIM(Num2LStr(drvrInitInp%WaveElevDY)) - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# MaxWaveElev = '//TRIM(Num2LStr(MAXVAL(HDynInitOut%WaveElevSeries))) - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# MinWaveElev = '//TRIM(Num2LStr(MINVAL(HDynInitOut%WaveElevSeries))) - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# ' - - ! Timestep looping - DO I = 0,HDyn_p%NStepWave - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) NewLine - WRITE (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# Time: '//TRIM(Num2LStr(HDyn_p%WaveTime(I))) - ! Now output the X,Y, Elev info for this timestep - DO J=1,SIZE(HDynInitInp%WaveElevXY,DIM=2) - WRITE (WaveElevFileUn,WaveElevFmt, IOSTAT=ErrStatTmp ) HDynInitInp%WaveElevXY(1,J),& - HDynInitInp%WaveElevXY(2,J),HDynInitOut%WaveElevSeries(I,J) - ENDDO - - ENDDO - - ! Done. Close the file - CLOSE (WaveElevFileUn) - -END SUBROUTINE WaveElevGrid_Output !---------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/hydrodyn/src/HydroDyn_Input.f90 b/modules/hydrodyn/src/HydroDyn_Input.f90 index a427bba9a5..7f6c36b489 100644 --- a/modules/hydrodyn/src/HydroDyn_Input.f90 +++ b/modules/hydrodyn/src/HydroDyn_Input.f90 @@ -24,8 +24,7 @@ MODULE HydroDyn_Input USE NWTC_Library USE HydroDyn_Types USE HydroDyn_Output - USE Waves - USE Waves2_Output + USE SeaState USE Morison USE Morison_Output USE NWTC_RandomNumber @@ -229,7 +228,7 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDp CurLine = CurLine + 1 ! WtrDens - Water density. - CALL ParseVarWDefault ( FileInfo_In, CurLine, 'WtrDens', InputFileData%Waves%WtrDens, defWtrDens, ErrStat2, ErrMsg2, UnEc ) + CALL ParseVarWDefault ( FileInfo_In, CurLine, 'WtrDens', InputFileData%Morison%WtrDens, defWtrDens, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; ! WtrDpth - Water depth @@ -241,228 +240,7 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDp if (Failed()) return; - !------------------------------------------------------------------------------------------------- - ! Data section for waves - !------------------------------------------------------------------------------------------------- - 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 Conv2UC( InputFileData%Waves%WaveModChr ) ! Convert Line to upper case. - - InputFileData%Waves%WavePhase = 0.0 - InputFileData%Waves%WaveNDAmp = .FALSE. - - - ! WaveStMod - Model switch for stretching incident wave kinematics to instantaneous free surface. - call ParseVar( FileInfo_In, CurLine, 'WaveStMod', InputFileData%Waves%WaveStMod, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! WaveTMax - Analysis time for incident wave calculations. - call ParseVar( FileInfo_In, CurLine, 'WaveTMax', InputFileData%Waves%WaveTMax, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! WaveDT - Time step for incident wave calculations - call ParseVar( FileInfo_In, CurLine, 'WaveDT', InputFileData%Waves%WaveDT, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! WaveHs - Significant wave height - call ParseVar( FileInfo_In, CurLine, 'WaveHs', InputFileData%Waves%WaveHs, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! WaveTp - Peak spectral period. - call ParseVar( FileInfo_In, CurLine, 'WaveTp', InputFileData%Waves%WaveTp, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! WavePkShp - Peak shape parameter. - 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 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 ParseVar( FileInfo_In, CurLine, 'WvHiCOff', InputFileData%Waves%WvHiCOff, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - ! WaveDir - Mean wave heading direction. - 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 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 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 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 ParseVar( FileInfo_In, CurLine, 'WaveDirRange', InputFileData%Waves%WaveDirRange, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! Negative values should be treated as positive. - InputFileData%Waves%WaveDirRange = ABS( InputFileData%Waves%WaveDirRange ) - - - ! 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 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 - ErrStat2 = ErrID_Fatal - ErrMsg2 = ' WaveSeed(2): Invalid RNG type.' - if (Failed()) return; - ENDIF - -!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 - InputFileData%Waves%RNG%RNG_type = "NORMAL" - InputFileData%Waves%RNG%pRNG = pRNG_INTRINSIC - - ELSE - - InputFileData%Waves%RNG%RNG_type = ADJUSTL( Line ) - CALL Conv2UC( InputFileData%Waves%RNG%RNG_type ) - - IF ( InputFileData%Waves%RNG%RNG_type == "RANLUX") THEN - InputFileData%Waves%RNG%pRNG = pRNG_RANLUX - ELSE - ErrStat2 = ErrID_Fatal - ErrMsg2 = ' WaveSeed(2): Invalid alternative random number generator.' - if (Failed()) return; - ENDIF - - ENDIF - - - ! WaveNDAmp - Flag for normally distributed amplitudes. - call ParseVar( FileInfo_In, CurLine, 'WaveNDAmp', InputFileData%Waves%WaveNDAmp, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! WvKinFile - call ParseVar( FileInfo_In, CurLine, 'WvKinFile', InputFileData%Waves%WvKinFile, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! NWaveElev - 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 ( 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 - - ! 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; - - ! WaveElevyi - call ParseAry ( FileInfo_In, CurLine, 'WaveElevyi.', InputFileData%Waves%WaveElevyi, InputFileData%Waves%NWaveElev, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - - !------------------------------------------------------------------------------------------------- - ! 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 - - ! WvDiffQTFF - Second order waves -- difference forces - call ParseVar( FileInfo_In, CurLine, 'WvDiffQTF', InputFileData%Waves2%WvDiffQTFF, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! 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; - - ! 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; - - ! 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 current - !------------------------------------------------------------------------------------------------- - if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo - CurLine = CurLine + 1 - - ! CurrMod - Current profile model switch - call ParseVar( FileInfo_In, CurLine, 'CurrMod', InputFileData%Current%CurrMod, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! CurrSSV0 - Sub-surface current velocity at still water level - call ParseVar( FileInfo_In, CurLine, 'CurrSSV0', InputFileData%Current%CurrSSV0, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - - ! CurrSSDirChr - Sub-surface current heading direction - call ParseVar( FileInfo_In, CurLine, 'CurrSSDir', InputFileData%Current%CurrSSDirChr, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - CALL Conv2UC( InputFileData%Current%CurrSSDirChr ) ! Convert Line to upper case. - - - ! CurrNSRef - Near-surface current reference depth. - call ParseVar( FileInfo_In, CurLine, 'CurrNSRef', InputFileData%Current%CurrNSRef, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return; - - ! 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; - - ! 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 !------------------------------------------------------------------------------------------------- @@ -478,6 +256,10 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDp call ParseVar( FileInfo_In, CurLine, 'ExctnMod', InputFileData%WAMIT%ExctnMod, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; + ! ExctnDisp - Use body displacements to compute Wave Excitations {0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0]} (switch) + call ParseVar( FileInfo_In, CurLine, 'ExctnDisp', InputFileData%WAMIT%ExctnDisp, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + ! RdtnMod - Radiation memory-effect model {1: convolution, 2: state-space} (switch) ! [STATE-SPACE REQUIRES *.ss INPUT FILE] call ParseVar( FileInfo_In, CurLine, 'RdtnMod', InputFileData%WAMIT%RdtnMod, ErrStat2, ErrMsg2, UnEc ) @@ -665,7 +447,16 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDp end do END DO - + !------------------------------------------------------------------------------------------------- + ! Strip Theory Section + !------------------------------------------------------------------------------------------------- + if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Write section break to echo + CurLine = CurLine + 1 + + ! WaveDisp - Method of computing Wave Kinematics {0: use undisplaced position, 1: use displaced position) } (switch) + call ParseVar( FileInfo_In, CurLine, 'WaveDisp', InputFileData%Morison%WaveDisp, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + !------------------------------------------------------------------------------------------------- ! Axial Coefficients Section !------------------------------------------------------------------------------------------------- @@ -1348,7 +1139,7 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS ! WtrDens - Water density. - IF ( InputFileData%Waves%WtrDens < 0.0 ) THEN + IF ( InputFileData%Morison%WtrDens < 0.0 ) THEN CALL SetErrStat( ErrID_Fatal,'WtrDens must not be negative.',ErrStat,ErrMsg,RoutineName) RETURN END IF @@ -1366,59 +1157,23 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS ! MSL2SWL - Mean sea level to still water level - + +!TODO: Add check for InputFileData%Morison%MSL2SWL 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) + CALL SetErrStat( ErrID_Fatal,'SeaState MSL2SWL must be 0 when PotMod = 1 (WAMIT).',ErrStat,ErrMsg,RoutineName) RETURN END IF - - - ! WaveMod - Wave kinematics model switch. - - IF ( LEN_TRIM(InputFileData%Waves%WaveModChr) > 1 ) THEN - - IF ( InputFileData%Waves%WaveModChr(1:2) == '1P' ) THEN ! The user wants to specify the phase in place of a random phase - - 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 - 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) - RETURN - END IF - - ELSE - ! The line below only works for 1 digit reads - 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 = InputFileData%Waves%WaveMod - - END IF ! LEN_TRIM(InputFileData%Waves%WaveModChr) - - 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) + IF ( InputFileData%PotMod == 1 .AND. .NOT. EqualRealNos(InputFileData%Morison%MSL2SWL, 0.0_ReKi) ) THEN + CALL SetErrStat( ErrID_Fatal,'HydroDyn MSL2SWL must be 0 when PotMod = 1 (WAMIT).',ErrStat,ErrMsg,RoutineName) RETURN END IF + - - IF ( WaveModIn < 0 .OR. WaveModIn > 6 ) 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... - ELSE IF ( ErrStat /= ErrID_None .OR. WaveModIn /= 5) THEN - CALL SetErrStat( ErrID_Fatal,'WaveMod must be 0, 1, 1P#, 2, 3, 4, or 5.',ErrStat,ErrMsg,RoutineName) + ! WaveMod - Wave kinematics model switch. +!TODO: Verify this check + IF ( InputFileData%PotMod > 0 .and. InitInp%WaveMod == 6 ) THEN + CALL SetErrStat( ErrID_Fatal,'WaveMod must be 0, 1, 1P#, 2, 3, 4, or 5 when PotMod is not 0',ErrStat,ErrMsg,RoutineName) RETURN - END IF END IF ! Linearization Checks @@ -1442,22 +1197,17 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS ! TODO: We are only implementing WaveStMod = 0 (No stretching) at this point in time. 1 Mar 2013 GJH - 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 ( InputFileData%Waves%WaveMod /= 6 .AND. InputFileData%Morison%NMembers > 0 .AND. InputFileData%Waves%WaveMod > 0 ) THEN + IF ( InitInp%WaveMod /= 6 .AND. InputFileData%Morison%NMembers > 0 .AND. InitInp%WaveMod > 0 ) 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 + IF ( ( InitInp%WaveStMod /= 0 ) .AND. ( InitInp%WaveStMod /= 1 ) .AND. & + ( InitInp%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 ( ( InputFileData%Waves%WaveStMod /= 3 ) .AND. ( InputFileData%Waves%WaveMod == 5 ) ) THEN + !IF ( ( InitInp%WaveStMod /= 3 ) .AND. ( InitInp%WaveMod == 5 ) ) THEN ! ErrMsg = ' WaveStMod must be set to 3 when WaveMod is set to 5.' ! ErrStat = ErrID_Fatal ! @@ -1475,480 +1225,27 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS ! Paul Sclavounos, there are such corrections). Instead, the viscous ! drag term from Morison's equation is computed by integrating up to ! the MSL, regardless of the instantaneous free surface elevation. + ! TODO: The following can no longer be set because it is part of InitInp and SeaState Parameters. GJH 9/24/2021 + ! InitInp%WaveStMod = 0 - InputFileData%Waves%WaveStMod = 0 - - END IF - - - ! WaveTMax - Analysis time for incident wave calculations. - - 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(InputFileData%Waves%WaveTMax, 0.0_DbKi) ) THEN - CALL WrScr( ' Setting WaveTMax to 0.0 since WaveMod = 0' ) - InputFileData%Waves%WaveTMax = 0.0 - END IF - IF ( .NOT. EqualRealNos(InputFileData%Waves%WaveDir, 0.0_SiKi) ) THEN - CALL WrScr( ' Setting WaveDir to 0.0 since WaveMod = 0' ) - InputFileData%Waves%WaveDir = 0.0 - END IF - 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 > InputFileData%Waves%WaveTMax ) THEN - CALL WrScr( ' WaveTMax is less then the simulation time. Wave data will repeat every WaveTMax seconds.') - END IF - END IF - - - ! WaveDT - Time step for incident wave calculations - - IF ( InputFileData%Waves%WaveMod > 0 ) THEN ! .TRUE if we have incident waves. - - IF ( InputFileData%Waves%WaveDT <= 0.0 ) THEN - CALL SetErrStat( ErrID_Fatal,'WaveDT must be greater than zero.',ErrStat,ErrMsg,RoutineName) - RETURN - END IF - - 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 - - InputFileData%Waves%WaveDT = 0.0 - END IF - ! WaveHs - Significant wave height - - 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 ( InputFileData%Waves%WaveHs <= 0.0 ) THEN - CALL SetErrStat( ErrID_Fatal,'WaveHs must be greater than zero.',ErrStat,ErrMsg,RoutineName) - RETURN - END IF - - ELSE - - 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 ( ( 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 ( InputFileData%Waves%WaveTp <= 0.0 ) THEN - CALL SetErrStat( ErrID_Fatal,'WaveTp must be greater than zero.',ErrStat,ErrMsg,RoutineName) - RETURN - END IF - - ! ELSE - - ! InputFileData%Waves%WaveTp = 0.0 - - ! END IF - - - ! WavePkShp - Peak shape parameter. - - CALL Conv2UC( InputFileData%Waves%WavePkShpChr ) ! Convert Line to upper case. - - IF ( InputFileData%Waves%WaveMod == 2 ) THEN ! .TRUE if we have JONSWAP/Pierson-Moskowitz spectrum (irregular) waves, but not GH Bladed wave data. - - 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. - - InputFileData%Waves%WavePkShp = WavePkShpDefault ( InputFileData%Waves%WaveHs, InputFileData%Waves%WaveTp ) - - ELSE ! The input must have been specified numerically. - 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 ( ( 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 - - END IF - - ELSE - - InputFileData%Waves%WavePkShp = 1.0 - - END IF - - - ! WvLowCOff and WvHiCOff - Wave Cut-off frequency - - 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(InputFileData%Waves%WaveDT, 0.0_DbKi) ) THEN - InputFileData%Waves%WvHiCOff = 10000.0; ! This is not going to be used because WaveDT is zero. - ELSE - 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 ( 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. - InputFileData%WAMIT2%WvLowCOff = InputFileData%Waves%WvLowCOff - InputFileData%WAMIT2%WvHiCOff = InputFileData%Waves%WvHiCOff - - - ! WaveDir - Wave heading direction. - - IF ( ( InputFileData%Waves%WaveMod > 0 ) .AND. ( InputFileData%Waves%WaveMod /= 6 ) ) THEN ! .TRUE if we have incident waves, but not user input wave data. - - 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 - - InputFileData%Waves%WaveDir = 0.0 - - END IF - - - ! Multi-directional waves - - ! Check the WaveDirMod value - 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 - 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 ( 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) - 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 ( InputFileData%Waves%WaveMultiDir ) THEN - - ! Check WaveDirSpread - IF ( InputFileData%Waves%WaveDirSpread <= 0.0 ) THEN - - CALL SetErrStat( ErrID_Fatal,'WaveDirSpread cannot negative or zero.',ErrStat,ErrMsg,RoutineName) - RETURN - - ENDIF - - - ! 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 ( 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( 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 ( 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 - - 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. ( ( 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 - - InputFileData%Waves%WaveSeed(I) = 0 - - END DO !I - - END IF - - - ! WvKinFile - - 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( InputFileData%Waves%WvKinFile ) == 0 ) THEN - CALL SetErrStat( ErrID_Fatal,'WvKinFile must not be an empty string.',ErrStat,ErrMsg,RoutineName) - RETURN - END IF - - IF ( PathIsRelative( InputFileData%Waves%WvKinFile ) ) THEN - CALL GetPath( TRIM(InitInp%InputFile), TmpPath ) - InputFileData%Waves%WvKinFile = TRIM(TmpPath)//TRIM(InputFileData%Waves%WvKinFile) - END IF - InputFileData%Waves%WriteWvKin = .FALSE. - ELSE !don't use this one - -#ifdef WRITE_WV_KIN - IF ( LEN_TRIM( InputFileData%Waves%WvKinFile ) == 0 ) THEN - InputFileData%Waves%WriteWvKin = .FALSE. - ELSE - 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 - InputFileData%Waves%WvKinFile = "" - InputFileData%Waves%WriteWvKin = .FALSE. -#endif - END IF - - - ! NWaveElev - - IF ( InputFileData%Waves%NWaveElev < 0 ) THEN - - CALL SetErrStat( ErrID_Fatal,'NWaveElev must not be negative.',ErrStat,ErrMsg,RoutineName) - RETURN - - END IF - - - - !------------------------------------------------------------------------- - ! Check 2nd Order Waves section - !------------------------------------------------------------------------- - - - ! Difference frequency cutoffs - - ! WvLowCOffD and WvHiCOffD - Wave Cut-off frequency - 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 ( InputFileData%Waves2%WvLowCOffD >= InputFileData%Waves2%WvHiCOffD ) THEN - CALL SetErrStat( ErrID_Fatal,'WvLowCOffD must be less than WvHiCOffD.',ErrStat,ErrMsg,RoutineName) - RETURN - END IF - - - ! Sum frequency cutoffs - - ! WvLowCOffS and WvHiCOffD - Wave Cut-off frequency - 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 ( InputFileData%Waves2%WvLowCOffS >= InputFileData%Waves2%WvHiCOffS ) THEN - CALL SetErrStat( ErrID_Fatal,'WvLowCOffS must be less than WvHiCOffS.',ErrStat,ErrMsg,RoutineName) - RETURN - END IF + InputFileData%WAMIT2%WvLowCOff = InitInp%WvLowCOff + InputFileData%WAMIT2%WvHiCOff = InitInp%WvHiCOff ! Copy over the 2nd order limits to the WAMIT2 module which needs them. - InputFileData%WAMIT2%WvLowCOffD = InputFileData%Waves2%WvLowCOffD - InputFileData%WAMIT2%WvHiCOffD = InputFileData%Waves2%WvHiCOffD - InputFileData%WAMIT2%WvLowCOffS = InputFileData%Waves2%WvLowCOffS - InputFileData%WAMIT2%WvHiCOffS = InputFileData%Waves2%WvHiCOffS - - - - !------------------------------------------------------------------------- - ! Check Current section - !------------------------------------------------------------------------- - - - ! CurrMod - Current profile model switch - - 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 ( ( 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 - - - ! CurrSSV0 - Sub-surface current velocity at still water level - - IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - - 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 - - InputFileData%Current%CurrSSV0 = 0.0 - - END IF - - - ! CurrSSDirChr - Sub-surface current heading direction - - IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - + InputFileData%WAMIT2%WvLowCOffD = InitInp%WvLowCOffD + InputFileData%WAMIT2%WvHiCOffD = InitInp%WvHiCOffD + InputFileData%WAMIT2%WvLowCOffS = InitInp%WvLowCOffS + InputFileData%WAMIT2%WvHiCOffS = InitInp%WvHiCOffS - 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 ( 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 - - InputFileData%Current%CurrSSDir = InputFileData%Waves%WaveDir - - ELSE ! The input must have been specified numerically. - - 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 ( ( 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 - - END IF - - - ELSE - - InputFileData%Current%CurrSSDir = 0.0 - - END IF - - - ! CurrNSRef - Near-surface current reference depth. - - IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - - IF ( InputFileData%Current%CurrNSRef <= 0.0 ) THEN - CALL SetErrStat( ErrID_Fatal,'CurrNSRef must be greater than zero.',ErrStat,ErrMsg,RoutineName) - RETURN - END IF - - ELSE - - InputFileData%Current%CurrNSRef = 0.0 - - END IF - - - - ! CurrNSV0 - Near-surface current velocity at still water level. - - IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - - 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 - - InputFileData%Current%CurrNSV0 = 0.0 - - END IF - - - ! CurrNSDir - Near-surface current heading direction. - - IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - - 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 - - InputFileData%Current%CurrNSDir = 0.0 - - END IF - - - ! CurrDIV - Depth-independent current velocity. - - IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - - 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 - - InputFileData%Current%CurrDIV = 0.0 - - END IF - - - ! CurrDIDir - Depth-independent current heading direction. - - IF ( InputFileData%Current%CurrMod == 1 ) THEN ! .TRUE if we have standard current. - - 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 - - InputFileData%Current%CurrDIDir = 0.0 - - END IF ! PotFile - Root name of potential flow files @@ -1974,12 +1271,15 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS ! Set the flag for multidirectional waves for WAMIT2 module. It needs to know since the Newman approximation ! can only use uni-directional waves. - InputFileData%WAMIT2%WaveMultiDir = InputFileData%Waves%WaveMultiDir + InputFileData%WAMIT2%WaveMultiDir = InitInp%WaveMultiDir ELSE InputFileData%PotFile = "" InputFileData%WAMIT%WAMITFile = "" - InputFileData%WAMIT2%WAMITFile = "" + InputFileData%WAMIT2%WAMITFile = "" + ! These can be set to zero because they are only used if PotMod = 1 + InputFileData%WAMIT%ExctnMod = 0 + InputFileData%WAMIT%RdtnMod = 0 END IF ! Set the WAMIT file name on the Convolution module @@ -2002,8 +1302,12 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS InputFileData%WAMIT2%WAMITULEN = 1.0 END IF - - + + ! ExctnDisp - Method of computing Wave Excitation + if ( InputFileData%PotMod /= 1 .or. InputFileData%WAMIT%ExctnMod == 0 .or. InitInp%WaveMod == 0) then + InputFileData%WAMIT%ExctnDisp = 0 !Force ExctnDisp = 0, so that the Grid of Wave Excitation forces is not computed (saves time and memory) + end if + ! PtfmVol0 - Displaced volume of water when the platform is in its undisplaced position IF ( InputFileData%PotMod == 1 ) THEN @@ -2266,19 +1570,19 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS !.................. if ( (InputFileData%WAMIT%ExctnMod == 2) ) then - if ( InputFileData%Waves%WaveMod == 6 ) then + if ( InitInp%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 ( InputFileData%Waves%WaveDirMod /= 0 ) then + if ( InitInp%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 ( InputFileData%Waves2%WvDiffQTFF ) then + if ( InitInp%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 ( InputFileData%Waves2%WvSumQTFF ) then + if ( InitInp%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 @@ -2309,19 +1613,19 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS !.................. if (InitInp%Linearize) then - if ( InputFileData%Waves%WaveMod /= 0 ) then + if ( InitInp%WaveMod /= 0 ) then call SetErrStat( ErrID_Fatal, 'Still water conditions must be used for linearization. Set WaveMod=0.', ErrStat, ErrMsg, RoutineName ) end if - if ( InputFileData%Waves%WaveDirMod /= 0 ) then + if ( InitInp%WaveDirMod /= 0 ) then call SetErrStat( ErrID_Fatal, 'No directional spreading must be used for linearization. Set WaveDirMod=0.', ErrStat, ErrMsg, RoutineName ) end if - if ( InputFileData%Waves2%WvDiffQTFF ) then + if ( InitInp%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 ( InputFileData%Waves2%WvSumQTFF ) then + if ( InitInp%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 @@ -2911,7 +2215,7 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS CALL SetErrStat(ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) RETURN ELSE - InputFileData%Morison%FilledGroups(I)%FillDens = InputFileData%Waves%WtrDens + InputFileData%Morison%FilledGroups(I)%FillDens = InputFileData%Morison%WtrDens END IF END DO @@ -2931,10 +2235,10 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS IF ( InputFileData%Morison%NMGDepths > 0 ) THEN - InitInp%Morison%MGTop = -999999.0 - InitInp%Morison%MGBottom = 999999.0 + InputFileData%Morison%MGTop = -999999.0 + InputFileData%Morison%MGBottom = 999999.0 - DO I = 1,InitInp%Morison%NMGDepths + DO I = 1,InputFileData%Morison%NMGDepths ! Store the boundaries of the marine growth zone IF ( InputFileData%Morison%MGDepths(I)%MGDpth > InputFileData%Morison%MGTop ) THEN InputFileData%Morison%MGTop = InputFileData%Morison%MGDepths(I)%MGDpth @@ -3087,7 +2391,7 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS END IF foundMask = .FALSE. ! Extract Waves2 list - InputFileData%Waves2%NumOuts = GetWaves2Channels ( InputFileData%NUserOutputs, InputFileData%UserOutputs, InputFileData%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 ! InputFileData%WAMIT2%NumOuts = GetWAMIT2Channels ( InputFileData%NUserOutputs, InputFileData%UserOutputs, InputFileData%WAMIT2%OutList, foundMask, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) @@ -3138,47 +2442,21 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS ! Populate data in sub-types from parent or other module types !---------------------------------------------------------- - ! Current - ! For wave kinematic calculations, the effective water depth is the user input water depth (positive valued) + MSL2SWL (positive when SWL is above MSL). - InputFileData%Current%WtrDpth = InputFileData%Morison%WtrDpth ! already adjusted for the MSL2SWL. - - - ! Waves - 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). - InputFileData%Waves%WtrDpth = InputFileData%Morison%WtrDpth ! already adjusted for the MSL2SWL. + - ! Waves2 - 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( InputFileData%Waves2%WaveElevyi, InputFileData%Waves2%NWaveElev, 'WaveElevyi' , ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HydroDynInput_GetInput' ) - IF ( ErrStat >= AbortErrLev ) RETURN - InputFileData%Waves2%WaveElevxi = InputFileData%Waves%WaveElevxi - InputFileData%Waves2%WaveElevyi = InputFileData%Waves%WaveElevyi - ENDIF ! WAMIT - InputFileData%WAMIT%WtrDens = InputFileData%Waves%WtrDens - InputFileData%WAMIT%WaveMod = InputFileData%Waves%WaveMod + InputFileData%WAMIT%WtrDens = InputFileData%Morison%WtrDens + InputFileData%WAMIT%WaveMod = InitInp%WaveMod InputFileData%WAMIT%OutAll = InputFileData%OutAll InputFileData%WAMIT%HasWAMIT = InputFileData%PotMod == 1 ! WAMIT2 - InputFileData%WAMIT2%WtrDens = InputFileData%Waves%WtrDens - InputFileData%WAMIT2%WaveMod = InputFileData%Waves%WaveMod + InputFileData%WAMIT2%WtrDens = InputFileData%Morison%WtrDens + InputFileData%WAMIT2%WaveMod = InitInp%WaveMod InputFileData%WAMIT2%HasWAMIT = InputFileData%PotMod == 1 ! Morison 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 @@ -3187,68 +2465,6 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS 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 - InputFileData%Current%NMorisonNodes = InputFileData%Morison%NNodes - - 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 - END IF - - - - ! Establish the number and locations where the wave kinematics will be computed - 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 ( 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 ( 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,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. - 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 ( 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 ( 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 - - InputFileData%Waves2%WaveKinxi = InputFileData%Waves%WaveKinxi - InputFileData%Waves2%WaveKinyi = InputFileData%Waves%WaveKinyi - InputFileData%Waves2%WaveKinzi = InputFileData%Waves%WaveKinzi - - ENDIF END SUBROUTINE HydroDynInput_ProcessInitData diff --git a/modules/hydrodyn/src/HydroDyn_Output.f90 b/modules/hydrodyn/src/HydroDyn_Output.f90 index 590eeb1290..18555c3afe 100644 --- a/modules/hydrodyn/src/HydroDyn_Output.f90 +++ b/modules/hydrodyn/src/HydroDyn_Output.f90 @@ -578,39 +578,9 @@ MODULE HydroDyn_Output INTEGER(IntKi), PARAMETER :: B9WvsM2zi = 510 - ! Wave Elevations: - - INTEGER(IntKi), PARAMETER :: Wave1Elev = 511 - INTEGER(IntKi), PARAMETER :: Wave2Elev = 512 - INTEGER(IntKi), PARAMETER :: Wave3Elev = 513 - INTEGER(IntKi), PARAMETER :: Wave4Elev = 514 - INTEGER(IntKi), PARAMETER :: Wave5Elev = 515 - INTEGER(IntKi), PARAMETER :: Wave6Elev = 516 - INTEGER(IntKi), PARAMETER :: Wave7Elev = 517 - INTEGER(IntKi), PARAMETER :: Wave8Elev = 518 - INTEGER(IntKi), PARAMETER :: Wave9Elev = 519 - INTEGER(IntKi), PARAMETER :: Wave1Elv1 = 520 - INTEGER(IntKi), PARAMETER :: Wave2Elv1 = 521 - INTEGER(IntKi), PARAMETER :: Wave3Elv1 = 522 - INTEGER(IntKi), PARAMETER :: Wave4Elv1 = 523 - INTEGER(IntKi), PARAMETER :: Wave5Elv1 = 524 - INTEGER(IntKi), PARAMETER :: Wave6Elv1 = 525 - INTEGER(IntKi), PARAMETER :: Wave7Elv1 = 526 - INTEGER(IntKi), PARAMETER :: Wave8Elv1 = 527 - INTEGER(IntKi), PARAMETER :: Wave9Elv1 = 528 - INTEGER(IntKi), PARAMETER :: Wave1Elv2 = 529 - INTEGER(IntKi), PARAMETER :: Wave2Elv2 = 530 - INTEGER(IntKi), PARAMETER :: Wave3Elv2 = 531 - INTEGER(IntKi), PARAMETER :: Wave4Elv2 = 532 - INTEGER(IntKi), PARAMETER :: Wave5Elv2 = 533 - INTEGER(IntKi), PARAMETER :: Wave6Elv2 = 534 - INTEGER(IntKi), PARAMETER :: Wave7Elv2 = 535 - INTEGER(IntKi), PARAMETER :: Wave8Elv2 = 536 - INTEGER(IntKi), PARAMETER :: Wave9Elv2 = 537 - ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi), PARAMETER :: MaxOutPts = 537 + INTEGER(IntKi), PARAMETER :: MaxOutPts = 510 !End of code generated by Matlab script ! =================================================================================================== @@ -688,17 +658,13 @@ MODULE HydroDyn_Output B1RAzi,B2RAzi,B3RAzi,B4RAzi,B5RAzi,B6RAzi,B7RAzi,B8RAzi,B9RAzi/), & (/9,6/))) - INTEGER, PARAMETER :: WaveElevi(9) = (/Wave1Elev,Wave2Elev,Wave3Elev,Wave4Elev,Wave5Elev,Wave6Elev,Wave7Elev,Wave8Elev,Wave9Elev/) - INTEGER, PARAMETER :: WaveElevi1(9) = (/Wave1Elv1,Wave2Elv1,Wave3Elv1,Wave4Elv1,Wave5Elv1,Wave6Elv1,Wave7Elv1,Wave8Elv1,Wave9Elv1/) - INTEGER, PARAMETER :: WaveElevi2(9) = (/Wave1Elv2,Wave2Elv2,Wave3Elv2,Wave4Elv2,Wave5Elv2,Wave6Elv2,Wave7Elv2,Wave8Elv2,Wave9Elv2/) - - INTEGER, PARAMETER :: PRPMotions(6) = (/PRPSurge,PRPSway,PRPHeave,PRPRoll,PRPPitch,PRPYaw/) + INTEGER, PARAMETER :: PRPMotions(6) = (/PRPSurge,PRPSway,PRPHeave,PRPRoll,PRPPitch,PRPYaw/) INTEGER, PARAMETER :: PRPVel(6) = (/PRPTVxi, PRPTVyi,PRPTVzi, PRPRVxi,PRPRVyi, PRPRVzi/) INTEGER, PARAMETER :: PRPAcc(6) = (/PRPTAxi, PRPTAyi,PRPTAzi, PRPRAxi,PRPRAyi, PRPRAzi/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(537) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(510) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically "B1ADDFXI ","B1ADDFYI ","B1ADDFZI ","B1ADDMXI ","B1ADDMYI ","B1ADDMZI ","B1HDSFXI ","B1HDSFYI ", & "B1HDSFZI ","B1HDSMXI ","B1HDSMYI ","B1HDSMZI ","B1HEAVE ","B1PITCH ","B1RAXI ","B1RAYI ", & "B1RAZI ","B1RDTFXI ","B1RDTFYI ","B1RDTFZI ","B1RDTMXI ","B1RDTMYI ","B1RDTMZI ","B1ROLL ", & @@ -762,12 +728,8 @@ MODULE HydroDyn_Output "B9WVSM2YI","B9WVSM2ZI","B9WVSMXI ","B9WVSMYI ","B9WVSMZI ","B9YAW ","HYDROFXI ","HYDROFYI ", & "HYDROFZI ","HYDROMXI ","HYDROMYI ","HYDROMZI ","PRPHEAVE ","PRPPITCH ","PRPRAXI ","PRPRAYI ", & "PRPRAZI ","PRPROLL ","PRPRVXI ","PRPRVYI ","PRPRVZI ","PRPSURGE ","PRPSWAY ","PRPTAXI ", & - "PRPTAYI ","PRPTAZI ","PRPTVXI ","PRPTVYI ","PRPTVZI ","PRPYAW ","WAVE1ELEV","WAVE1ELV1", & - "WAVE1ELV2","WAVE2ELEV","WAVE2ELV1","WAVE2ELV2","WAVE3ELEV","WAVE3ELV1","WAVE3ELV2","WAVE4ELEV", & - "WAVE4ELV1","WAVE4ELV2","WAVE5ELEV","WAVE5ELV1","WAVE5ELV2","WAVE6ELEV","WAVE6ELV1","WAVE6ELV2", & - "WAVE7ELEV","WAVE7ELV1","WAVE7ELV2","WAVE8ELEV","WAVE8ELV1","WAVE8ELV2","WAVE9ELEV","WAVE9ELV1", & - "WAVE9ELV2"/) - INTEGER(IntKi), PARAMETER :: ParamIndxAry(537) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + "PRPTAYI ","PRPTAZI ","PRPTVXI ","PRPTVYI ","PRPTVZI ","PRPYAW "/) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(510) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) B1AddFxi , B1AddFyi , B1AddFzi , B1AddMxi , B1AddMyi , B1AddMzi , B1HdSFxi , B1HdSFyi , & B1HdSFzi , B1HdSMxi , B1HdSMyi , B1HdSMzi , B1Heave , B1Pitch , B1RAxi , B1RAyi , & B1RAzi , B1RdtFxi , B1RdtFyi , B1RdtFzi , B1RdtMxi , B1RdtMyi , B1RdtMzi , B1Roll , & @@ -831,12 +793,8 @@ MODULE HydroDyn_Output B9WvsM2yi , B9WvsM2zi , B9WvsMxi , B9WvsMyi , B9WvsMzi , B9Yaw , HydroFxi , HydroFyi , & HydroFzi , HydroMxi , HydroMyi , HydroMzi , PRPHeave , PRPPitch , PRPRAxi , PRPRAyi , & PRPRAzi , PRPRoll , PRPRVxi , PRPRVyi , PRPRVzi , PRPSurge , PRPSway , PRPTAxi , & - PRPTAyi , PRPTAzi , PRPTVxi , PRPTVyi , PRPTVzi , PRPYaw , Wave1Elev , Wave1Elv1 , & - Wave1Elv2 , Wave2Elev , Wave2Elv1 , Wave2Elv2 , Wave3Elev , Wave3Elv1 , Wave3Elv2 , Wave4Elev , & - Wave4Elv1 , Wave4Elv2 , Wave5Elev , Wave5Elv1 , Wave5Elv2 , Wave6Elev , Wave6Elv1 , Wave6Elv2 , & - Wave7Elev , Wave7Elv1 , Wave7Elv2 , Wave8Elev , Wave8Elv1 , Wave8Elv2 , Wave9Elev , Wave9Elv1 , & - Wave9Elv2 /) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(537) = (/ & ! This lists the units corresponding to the allowed parameters + PRPTAyi , PRPTAzi , PRPTVxi , PRPTVyi , PRPTVzi , PRPYaw /) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(510) = (/ & ! This lists the units corresponding to the allowed parameters "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ", & "(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)", & "(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(rad) ", & @@ -900,11 +858,7 @@ MODULE HydroDyn_Output "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(N) ","(N) ", & "(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)", & "(rad/s^2)","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(rad) ","(m) ","(m) ", & - "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & - "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & - "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & - "(m) "/) + "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(rad) "/) ! ..... Public Subroutines ................................................................................................... @@ -1123,7 +1077,7 @@ SUBROUTINE HDOut_WriteWvKinFiles( Rootname, HD_Prog, NStepWave, NNodes, NWaveEle END SUBROUTINE HDOut_WriteWvKinFiles !==================================================================================================== -SUBROUTINE HDOut_MapOutputs( CurrentTime, p, y, m_WAMIT, m_WAMIT2, NWaveElev, WaveElev, WaveElev1, WaveElev2, F_Add, F_Waves, F_Hydro, PRPmesh, q, qdot, qdotdot, AllOuts, ErrStat, ErrMsg ) +SUBROUTINE HDOut_MapOutputs( CurrentTime, p, y, m_WAMIT, m_WAMIT2, F_Add, F_Waves, F_Hydro, PRPmesh, q, qdot, qdotdot, AllOuts, ErrStat, ErrMsg ) ! This subroutine writes the data stored in the y variable to the correct indexed postions in WriteOutput ! This is called by HydroDyn_CalcOutput() at each time step. !---------------------------------------------------------------------------------------------------- @@ -1132,10 +1086,6 @@ SUBROUTINE HDOut_MapOutputs( CurrentTime, p, y, m_WAMIT, m_WAMIT2, NWaveElev, Wa TYPE(HydroDyn_OutputType), INTENT( INOUT ) :: y ! HydroDyn's output data type(WAMIT_MiscVarType), intent( in ) :: m_WAMIT(:) ! WAMIT object's MiscVar data type(WAMIT2_MiscVarType), intent( in ) :: m_WAMIT2(:) ! WAMIT2 object's MiscVar data - INTEGER, INTENT( IN ) :: NWaveElev ! Number of wave elevation locations to output - REAL(ReKi), INTENT( IN ) :: WaveElev(:) ! Instantaneous total elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - REAL(ReKi), INTENT( IN ) :: WaveElev1(:) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - REAL(ReKi), INTENT( IN ) :: WaveElev2(:) ! Instantaneous second order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) REAL(ReKi), INTENT( IN ) :: F_Add(:) REAL(ReKi), INTENT( IN ) :: F_Waves(:) REAL(ReKi), INTENT( IN ) :: F_Hydro(:) ! All hydrodynamic loads integrated at (0,0,0) in the global coordinate system @@ -1204,12 +1154,7 @@ SUBROUTINE HDOut_MapOutputs( CurrentTime, p, y, m_WAMIT, m_WAMIT2, NWaveElev, Wa AllOuts(FHydro ) = F_Hydro - DO I=1,NWaveElev - AllOuts(WaveElevi(I)) = WaveElev(I) - AllOuts(WaveElevi1(I))= WaveElev1(I) - AllOuts(WaveElevi2(I))= WaveElev2(I) - END DO - + END SUBROUTINE HDOut_MapOutputs @@ -1238,7 +1183,7 @@ SUBROUTINE HDOut_WriteOutputs( Time, y, p, Decimate, ErrStat, ErrMsg ) ! Initialize ErrStat and determine if it makes any sense to write output !TODO: We should not have this check here, once per timestep! This should be resolved during initialization. GJH 7/7/2014 IF ( ( (.NOT. ALLOCATED( p%OutParam )) .AND. (.NOT. ALLOCATED( p%WAMIT ) ) .AND. (.NOT. ALLOCATED( p%WAMIT2 ) )& - .AND. (.NOT. ALLOCATED( p%Waves2%OutParam ) ) .AND. ( .NOT. ALLOCATED( p%Morison%OutParam ) ) ) ) THEN + .AND. ( .NOT. ALLOCATED( p%Morison%OutParam ) ) ) ) THEN ErrStat = ErrID_Warn ErrMsg = ' Cannot write output to file because there are not a valid output list.' RETURN @@ -1346,17 +1291,13 @@ SUBROUTINE HDOUT_Init( HydroDyn_ProgDesc, OutRootName, InputFileData, y, p, m, ! Aggregate the sub-module initialization outputs for the glue code hasWAMIT2Outs = .FALSE. - hasWaves2Outs = .FALSE. hasMorisonOuts = .FALSE. p%NumTotalOuts = p%NumOuts m%LastOutTime = 0.0_DbKi m%Decimate = 0 p%OutDec = 1 !TODO: Remove this once the parameter has been added to the HD input file GJH 7/8/2014 - IF (ALLOCATED( p%Waves2%OutParam ) .AND. p%Waves2%NumOuts > 0) THEN - hasWaves2Outs = .TRUE. - p%NumTotalOuts = p%NumTotalOuts + p%Waves2%NumOuts - END IF + IF (ALLOCATED( p%Morison%OutParam ) .AND. p%Morison%NumOuts > 0) THEN hasMorisonOuts = .TRUE. p%NumTotalOuts = p%NumTotalOuts + p%Morison%NumOuts @@ -1397,15 +1338,7 @@ SUBROUTINE HDOUT_Init( HydroDyn_ProgDesc, OutRootName, InputFileData, y, p, m, J = p%NumOuts + 1 - - IF ( hasWaves2Outs ) THEN - DO I=1, p%Waves2%NumOuts - InitOut%WriteOutputHdr(J) = InitOut%Waves2%WriteOutputHdr(I) - InitOut%WriteOutputUnt(J) = InitOut%Waves2%WriteOutputUnt(I) - J = J + 1 - END DO - END IF - + IF ( hasMorisonOuts ) THEN DO I=1, p%Morison%NumOuts InitOut%WriteOutputHdr(J) = InitOut%Morison%WriteOutputHdr(I) @@ -1462,7 +1395,6 @@ SUBROUTINE HDOut_OpenOutput( HydroDyn_ProgDesc, OutRootName, p, InitOut, ErrSta !------------------------------------------------------------------------------------------------- p%UnOutFile = -1 IF ( (ALLOCATED( p%OutParam ) .AND. p%NumOuts > 0 ) .OR. & - (ALLOCATED( p%Waves2%OutParam ) .AND. p%Waves2%NumOuts > 0 ) .OR. & (ALLOCATED( p%Morison%OutParam ) .AND. p%Morison%NumOuts > 0 ) ) THEN ! Output has been requested so let's open an output file ! Open the file for output @@ -1492,11 +1424,6 @@ SUBROUTINE HDOut_OpenOutput( HydroDyn_ProgDesc, OutRootName, p, InitOut, ErrSta WRITE(p%UnOutFile,Frmt,ADVANCE='no') ( p%Delim, TRIM( InitOut%WriteOutputHdr(I) ), I=1,p%NumOuts ) END IF - IF (ALLOCATED( p%Waves2%OutParam ) .AND. p%Waves2%NumOuts > 0) THEN - Frmt = '('//TRIM(Int2LStr(p%Waves2%NumOuts))//'(:,A,'//TRIM( p%OutSFmt )//'))' - WRITE(p%UnOutFile,Frmt,ADVANCE='no') ( p%Delim, TRIM( InitOut%Waves2%WriteOutputHdr(I) ), I=1,p%Waves2%NumOuts ) - END IF - IF (ALLOCATED( p%Morison%OutParam ) .AND. p%Morison%NumOuts > 0) THEN Frmt = '('//TRIM(Int2LStr(p%Morison%NumOuts))//'(:,A,'//TRIM( p%OutSFmt )//'))' WRITE(p%UnOutFile,Frmt,ADVANCE='no') ( p%Delim, TRIM( InitOut%Morison%WriteOutputHdr(I) ), I=1,p%Morison%NumOuts ) @@ -1516,11 +1443,6 @@ SUBROUTINE HDOut_OpenOutput( HydroDyn_ProgDesc, OutRootName, p, InitOut, ErrSta Frmt = '('//TRIM(Int2LStr(p%NumOuts))//'(:,A,'//TRIM( p%OutSFmt )//'))' WRITE(p%UnOutFile,Frmt,ADVANCE='no') ( p%Delim, TRIM( InitOut%WriteOutputUnt(I) ), I=1,p%NumOuts ) END IF - - IF (ALLOCATED( p%Waves2%OutParam ) .AND. p%Waves2%NumOuts > 0) THEN - Frmt = '('//TRIM(Int2LStr(p%Waves2%NumOuts))//'(:,A,'//TRIM( p%OutSFmt )//'))' - WRITE(p%UnOutFile,Frmt,ADVANCE='no') ( p%Delim, TRIM( InitOut%Waves2%WriteOutputUnt(I) ), I=1,p%Waves2%NumOuts ) - END IF IF (ALLOCATED( p%Morison%OutParam ) .AND. p%Morison%NumOuts > 0) THEN Frmt = '('//TRIM(Int2LStr(p%Morison%NumOuts))//'(:,A,'//TRIM( p%OutSFmt )//'))' diff --git a/modules/hydrodyn/src/HydroDyn_Types.f90 b/modules/hydrodyn/src/HydroDyn_Types.f90 index 515a7836e7..e026cc05ec 100644 --- a/modules/hydrodyn/src/HydroDyn_Types.f90 +++ b/modules/hydrodyn/src/HydroDyn_Types.f90 @@ -31,19 +31,21 @@ !! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. MODULE HydroDyn_Types !--------------------------------------------------------------------------------------------------------------------------------- -USE Current_Types -USE Waves_Types -USE Waves2_Types USE Conv_Radiation_Types USE SS_Radiation_Types +USE SeaState_Interp_Types USE SS_Excitation_Types USE WAMIT_Types USE WAMIT2_Types USE Morison_Types +USE Current_Types +USE Waves_Types +USE Waves2_Types +USE SeaState_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: MaxHDOutputs = 537 ! The maximum number of output channels supported by this module [-] - 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 [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MaxHDOutputs = 510 ! The maximum number of output channels supported by this module [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MaxUserOutputs = 5150 ! Total possible number of output channels: SS_Excitation = 7 + SS_Radiation = 7 + Morison= 4626 + HydroDyn=510 = 5150 [-] ! ========= HydroDyn_InputFile ======= TYPE, PUBLIC :: HydroDyn_InputFile LOGICAL :: EchoFlag !< Echo the input file [-] @@ -51,9 +53,7 @@ MODULE HydroDyn_Types REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: AddCLin !< Additional stiffness matrix [-] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: AddBLin !< Additional linear damping matrix [-] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: AddBQuad !< Additional quadratic damping (drag) matrix [-] - TYPE(Waves_InitInputType) :: Waves !< Initialization data for Waves module [-] - TYPE(Waves2_InitInputType) :: Waves2 !< Initialization data for Waves module [-] - TYPE(Current_InitInputType) :: Current !< Initialization data for Current module [-] + TYPE(SeaSt_InitInputType) :: SeaState !< Initialization data for SeaState module [-] CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: PotFile !< The name of the root potential flow file (without extension for WAMIT, complete name for FIT) [-] INTEGER(IntKi) :: nWAMITObj !< number of WAMIT input files. If NBodyMod = 1 then nPotFiles will be 1 even if NBody > 1 [-] INTEGER(IntKi) :: vecMultiplier !< multiplier for the WAMIT vectors and matrices. If NBodyMod=1 then this = NBody, else 1 [-] @@ -101,13 +101,44 @@ MODULE HydroDyn_Types 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) :: NStepWave !< Total number of frequency components = total number of time steps in the incident wave [-] + INTEGER(IntKi) :: NStepWave2 !< NStepWave / 2 [-] + REAL(SiKi) :: RhoXg !< = WtrDens*Gravity [-] + INTEGER(IntKi) :: WaveMod !< Incident wave kinematics model {0: none=still water, 1: plane progressive (regular), 2: JONSWAP/Pierson-Moskowitz spectrum (irregular), 3: white-noise spectrum, 4: user-defind spectrum from routine UserWaveSpctrm (irregular), 5: GH BLADED } [-] + INTEGER(IntKi) :: CurrMod !< [-] + INTEGER(IntKi) :: WaveStMod !< Model for stretching incident wave kinematics to instantaneous free surface {0: none=no stretching, 1: vertical stretching, 2: extrapolation stretching, 3: Wheeler stretching} [-] + INTEGER(IntKi) :: WaveDirMod !< Directional wave spreading function {0: none, 1: COS2S} [only used if WaveMod=6] [-] + REAL(SiKi) :: WvLowCOff !< Low cut-off frequency or lower frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4] [(rad/s)] + REAL(SiKi) :: WvHiCOff !< High cut-off frequency or upper frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4] [(rad/s)] + REAL(SiKi) :: WvLowCOffD !< Minimum frequency used in the difference methods [Ignored if all difference methods = 0] [(rad/s)] + REAL(SiKi) :: WvHiCOffD !< Maximum frequency used in the difference methods [Ignored if all difference methods = 0] [(rad/s)] + REAL(SiKi) :: WvLowCOffS !< Minimum frequency used in the sum-QTF method [Ignored if SumQTF = 0] [(rad/s)] + REAL(SiKi) :: WvHiCOffS !< Maximum frequency used in the sum-QTF method [Ignored if SumQTF = 0] [(rad/s)] + LOGICAL :: WvDiffQTFF !< Full difference QTF second order forces flag [(-)] + LOGICAL :: WvSumQTFF !< Full sum QTF second order forces flag [(-)] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev => NULL() !< Total wave elevation [-] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [-] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev2 => NULL() !< Second order wave elevation [-] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElev0 !< Instantaneous elevation time-series of incident waves at the platform reference point [(meters)] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Simulation times at which the instantaneous elevation of, velocity of, acceleration of, and loads associated with the incident waves are determined [(sec)] + REAL(SiKi) , DIMENSION(:,:,:,:), POINTER :: WaveDynP => NULL() !< Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed [(N/m^2)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveAcc => NULL() !< Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed [(m/s^2)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveVel => NULL() !< Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.) [(m/s)] + REAL(SiKi) , DIMENSION(:,:), POINTER :: WaveElevC0 => NULL() !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] + REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveElevC !< Discrete Fourier transform of the instantaneous elevation of incident waves at all grid points. First column is real part, second column is imaginary part [(meters)] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveDirArr => NULL() !< Wave direction array. Each frequency has a unique direction of WaveNDir > 1 [(degrees)] + REAL(SiKi) :: WaveDirMin !< Minimum wave direction. [(degrees)] + REAL(SiKi) :: WaveDirMax !< Maximum wave direction. [(degrees)] + REAL(SiKi) :: WaveDir !< Incident wave propagation heading direction [(degrees)] + LOGICAL :: WaveMultiDir !< Indicates the waves are multidirectional -- set by HydroDyn_Input [-] + REAL(SiKi) :: WaveDOmega !< Frequency step for incident wave calculations [(rad/s)] + TYPE(SeaSt_Interp_ParameterType) :: SeaSt_Interp_p !< parameter information from the SeaState Interpolation module [-] END TYPE HydroDyn_InitInputType ! ======================= ! ========= HydroDyn_InitOutputType ======= TYPE, PUBLIC :: HydroDyn_InitOutputType TYPE(WAMIT_InitOutputType) , DIMENSION(:), ALLOCATABLE :: WAMIT !< Initialization output from the WAMIT module [-] TYPE(WAMIT2_InitOutputType) , DIMENSION(:), ALLOCATABLE :: WAMIT2 !< Initialization output from the WAMIT2 module [-] - TYPE(Waves2_InitOutputType) :: Waves2 !< Initialization output from the Waves2 module [-] TYPE(Morison_InitOutputType) :: Morison !< Initialization output from the Morison module [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< The is the list of all HD-related output channel header strings (includes all sub-module channels) [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< The is the list of all HD-related output channel unit strings (includes all sub-module channels) [-] @@ -134,7 +165,6 @@ MODULE HydroDyn_Types TYPE, PUBLIC :: HydroDyn_ContinuousStateType TYPE(WAMIT_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: WAMIT !< continuous states from the wamit module [-] TYPE(WAMIT2_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: WAMIT2 !< continuous states from the wamit2 module [-] - TYPE(Waves2_ContinuousStateType) :: Waves2 !< continuous states from the waves2 module [-] TYPE(Morison_ContinuousStateType) :: Morison !< continuous states from the Morison module [-] END TYPE HydroDyn_ContinuousStateType ! ======================= @@ -142,7 +172,6 @@ MODULE HydroDyn_Types TYPE, PUBLIC :: HydroDyn_DiscreteStateType TYPE(WAMIT_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: WAMIT !< discrete states from the wamit module [-] TYPE(WAMIT2_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: WAMIT2 !< discrete states from the wamit2 module [-] - TYPE(Waves2_DiscreteStateType) :: Waves2 !< discrete states from the waves2 module [-] TYPE(Morison_DiscreteStateType) :: Morison !< discrete states from the Morison module [-] END TYPE HydroDyn_DiscreteStateType ! ======================= @@ -150,7 +179,6 @@ MODULE HydroDyn_Types TYPE, PUBLIC :: HydroDyn_ConstraintStateType TYPE(WAMIT_ConstraintStateType) :: WAMIT !< constraint states from WAMIT (may be empty) [-] TYPE(WAMIT2_ConstraintStateType) :: WAMIT2 !< constraint states from WAMIT2 (may be empty) [-] - TYPE(Waves2_ConstraintStateType) :: Waves2 !< constraint states from the waves2 module [-] TYPE(Morison_ConstraintStateType) :: Morison !< constraint states from the Morison module [-] END TYPE HydroDyn_ConstraintStateType ! ======================= @@ -158,7 +186,6 @@ MODULE HydroDyn_Types TYPE, PUBLIC :: HydroDyn_OtherStateType TYPE(WAMIT_OtherStateType) , DIMENSION(:), ALLOCATABLE :: WAMIT !< OtherState information from the WAMIT module [-] TYPE(WAMIT2_OtherStateType) , DIMENSION(:), ALLOCATABLE :: WAMIT2 !< OtherState information from the WAMIT2 module [-] - TYPE(Waves2_OtherStateType) :: Waves2 !< OtherState information from the Waves2 module [-] TYPE(Morison_OtherStateType) :: Morison !< OtherState information from the Morison module [-] END TYPE HydroDyn_OtherStateType ! ======================= @@ -175,11 +202,9 @@ MODULE HydroDyn_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_Waves !< The total waves forces on a WAMIT body calculated by first and second order methods (WAMIT and WAMIT2 modules) [-] TYPE(WAMIT_MiscVarType) , DIMENSION(:), ALLOCATABLE :: WAMIT !< misc var information from the WAMIT module [-] TYPE(WAMIT2_MiscVarType) , DIMENSION(:), ALLOCATABLE :: WAMIT2 !< misc var information from the WAMIT2 module [-] - TYPE(Waves2_MiscVarType) :: Waves2 !< misc var information from the Waves2 module [-] TYPE(Morison_MiscVarType) :: Morison !< misc var information from the Morison module [-] TYPE(WAMIT_InputType) , DIMENSION(:), ALLOCATABLE :: u_WAMIT !< WAMIT module inputs [-] TYPE(WAMIT2_InputType) , DIMENSION(:), ALLOCATABLE :: u_WAMIT2 !< WAMIT2 module inputs [-] - TYPE(Waves2_InputType) :: u_Waves2 !< Waves2 module inputs [-] END TYPE HydroDyn_MiscVarType ! ======================= ! ========= HydroDyn_ParameterType ======= @@ -189,7 +214,6 @@ MODULE HydroDyn_Types TYPE(WAMIT_ParameterType) , DIMENSION(:), ALLOCATABLE :: WAMIT !< Parameter data for the WAMIT module [-] TYPE(WAMIT2_ParameterType) , DIMENSION(:), ALLOCATABLE :: WAMIT2 !< Parameter data for the WAMIT2 module [-] LOGICAL :: WAMIT2used = .FALSE. !< Indicates when WAMIT2 is used. Shortcuts some calculations [-] - TYPE(Waves2_ParameterType) :: Waves2 !< Parameter data for the Waves2 module [-] TYPE(Morison_ParameterType) :: Morison !< Parameter data for the Morison module [-] INTEGER(IntKi) :: PotMod !< 1 if using WAMIT model, 0 if no potential flow model, or 2 if FIT model [-] INTEGER(IntKi) :: NBody !< [>=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] [-] @@ -197,12 +221,8 @@ MODULE HydroDyn_Types INTEGER(IntKi) :: totalStates !< Number of excitation and radiation states for all WAMIT bodies [-] INTEGER(IntKi) :: totalExctnStates !< Number of excitation states for all WAMIT bodies [-] INTEGER(IntKi) :: totalRdtnStates !< Number of radiation states for all WAMIT bodies [-] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< Array of time samples, (sec) [-] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Array of time samples, (sec) [-] INTEGER(IntKi) :: NStepWave !< Number of data points in the wave kinematics arrays [-] - INTEGER(IntKi) :: NWaveElev !< Number of wave elevation outputs [-] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElev !< Total wave elevation [-] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElev1 !< First order wave elevation [-] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElev2 !< Second order wave elevation [-] REAL(ReKi) :: WtrDpth !< Water depth [(m)] 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 [-] @@ -235,7 +255,6 @@ MODULE HydroDyn_Types TYPE, PUBLIC :: HydroDyn_OutputType TYPE(WAMIT_OutputType) , DIMENSION(:), ALLOCATABLE :: WAMIT !< WAMIT module outputs [-] TYPE(WAMIT2_OutputType) , DIMENSION(:), ALLOCATABLE :: WAMIT2 !< WAMIT2 module outputs [-] - TYPE(Waves2_OutputType) :: Waves2 !< Waves2 module outputs [-] TYPE(Morison_OutputType) :: Morison !< Morison module outputs [-] TYPE(MeshType) :: WAMITMesh !< Point Loads at the WAMIT reference point(s) in the inertial frame [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Outputs to be written to the output file(s) [-] @@ -253,6 +272,8 @@ SUBROUTINE HydroDyn_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_CopyInputFile' @@ -322,13 +343,7 @@ SUBROUTINE HydroDyn_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, END IF DstInputFileData%AddBQuad = SrcInputFileData%AddBQuad ENDIF - CALL Waves_CopyInitInput( SrcInputFileData%Waves, DstInputFileData%Waves, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN - CALL Waves2_CopyInitInput( SrcInputFileData%Waves2, DstInputFileData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN - CALL Current_CopyInitInput( SrcInputFileData%Current, DstInputFileData%Current, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SeaSt_CopyInitInput( SrcInputFileData%SeaState, DstInputFileData%SeaState, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN IF (ALLOCATED(SrcInputFileData%PotFile)) THEN @@ -510,9 +525,7 @@ SUBROUTINE HydroDyn_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) IF (ALLOCATED(InputFileData%AddBQuad)) THEN DEALLOCATE(InputFileData%AddBQuad) ENDIF - CALL Waves_DestroyInitInput( InputFileData%Waves, ErrStat, ErrMsg ) - CALL Waves2_DestroyInitInput( InputFileData%Waves2, ErrStat, ErrMsg ) - CALL Current_DestroyInitInput( InputFileData%Current, ErrStat, ErrMsg ) + CALL SeaSt_DestroyInitInput( InputFileData%SeaState, ErrStat, ErrMsg ) IF (ALLOCATED(InputFileData%PotFile)) THEN DEALLOCATE(InputFileData%PotFile) ENDIF @@ -608,54 +621,20 @@ SUBROUTINE HydroDyn_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Re_BufSz = Re_BufSz + SIZE(InData%AddBQuad) ! AddBQuad END IF ! Allocate buffers for subtypes, if any (we'll get sizes from these) - Int_BufSz = Int_BufSz + 3 ! Waves: size of buffers for each call to pack subtype - CALL Waves_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Waves, ErrStat2, ErrMsg2, .TRUE. ) ! Waves - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Waves - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Waves - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF - Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype - CALL Waves2_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Waves2 - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves2 - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Waves2 - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF - Int_BufSz = Int_BufSz + 3 ! Current: size of buffers for each call to pack subtype - CALL Current_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Current, ErrStat2, ErrMsg2, .TRUE. ) ! Current + Int_BufSz = Int_BufSz + 3 ! SeaState: size of buffers for each call to pack subtype + CALL SeaSt_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%SeaState, ErrStat2, ErrMsg2, .TRUE. ) ! SeaState CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN - IF(ALLOCATED(Re_Buf)) THEN ! Current + IF(ALLOCATED(Re_Buf)) THEN ! SeaState Re_BufSz = Re_BufSz + SIZE( Re_Buf ) DEALLOCATE(Re_Buf) END IF - IF(ALLOCATED(Db_Buf)) THEN ! Current + IF(ALLOCATED(Db_Buf)) THEN ! SeaState Db_BufSz = Db_BufSz + SIZE( Db_Buf ) DEALLOCATE(Db_Buf) END IF - IF(ALLOCATED(Int_Buf)) THEN ! Current + IF(ALLOCATED(Int_Buf)) THEN ! SeaState Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF @@ -904,63 +883,7 @@ SUBROUTINE HydroDyn_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END DO END DO END IF - CALL Waves_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Waves, ErrStat2, ErrMsg2, OnlySize ) ! Waves - 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 - CALL Waves2_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 - 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 - CALL Current_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%Current, ErrStat2, ErrMsg2, OnlySize ) ! Current + CALL SeaSt_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%SeaState, ErrStat2, ErrMsg2, OnlySize ) ! SeaState CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -1295,6 +1218,8 @@ SUBROUTINE HydroDyn_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_UnPackInputFile' @@ -1450,87 +1375,7 @@ SUBROUTINE HydroDyn_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL Waves_UnpackInitInput( Re_Buf, Db_Buf, Int_Buf, OutData%Waves, ErrStat2, ErrMsg2 ) ! Waves - 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) - 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 Waves2_UnpackInitInput( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 - 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) - 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 Current_UnpackInitInput( Re_Buf, Db_Buf, Int_Buf, OutData%Current, ErrStat2, ErrMsg2 ) ! Current + CALL SeaSt_UnpackInitInput( Re_Buf, Db_Buf, Int_Buf, OutData%SeaState, ErrStat2, ErrMsg2 ) ! SeaState CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -1907,6 +1752,9 @@ SUBROUTINE HydroDyn_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_CopyInitInput' @@ -1942,6 +1790,201 @@ SUBROUTINE HydroDyn_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ENDIF DstInitInputData%PtfmLocationX = SrcInitInputData%PtfmLocationX DstInitInputData%PtfmLocationY = SrcInitInputData%PtfmLocationY + DstInitInputData%NStepWave = SrcInitInputData%NStepWave + DstInitInputData%NStepWave2 = SrcInitInputData%NStepWave2 + DstInitInputData%RhoXg = SrcInitInputData%RhoXg + DstInitInputData%WaveMod = SrcInitInputData%WaveMod + DstInitInputData%CurrMod = SrcInitInputData%CurrMod + DstInitInputData%WaveStMod = SrcInitInputData%WaveStMod + DstInitInputData%WaveDirMod = SrcInitInputData%WaveDirMod + DstInitInputData%WvLowCOff = SrcInitInputData%WvLowCOff + DstInitInputData%WvHiCOff = SrcInitInputData%WvHiCOff + DstInitInputData%WvLowCOffD = SrcInitInputData%WvLowCOffD + DstInitInputData%WvHiCOffD = SrcInitInputData%WvHiCOffD + DstInitInputData%WvLowCOffS = SrcInitInputData%WvLowCOffS + DstInitInputData%WvHiCOffS = SrcInitInputData%WvHiCOffS + DstInitInputData%WvDiffQTFF = SrcInitInputData%WvDiffQTFF + DstInitInputData%WvSumQTFF = SrcInitInputData%WvSumQTFF +IF (ASSOCIATED(SrcInitInputData%WaveElev)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElev,1) + i1_u = UBOUND(SrcInitInputData%WaveElev,1) + i2_l = LBOUND(SrcInitInputData%WaveElev,2) + i2_u = UBOUND(SrcInitInputData%WaveElev,2) + i3_l = LBOUND(SrcInitInputData%WaveElev,3) + i3_u = UBOUND(SrcInitInputData%WaveElev,3) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElev)) THEN + ALLOCATE(DstInitInputData%WaveElev(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%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElev = SrcInitInputData%WaveElev +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveElev1)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElev1,1) + i1_u = UBOUND(SrcInitInputData%WaveElev1,1) + i2_l = LBOUND(SrcInitInputData%WaveElev1,2) + i2_u = UBOUND(SrcInitInputData%WaveElev1,2) + i3_l = LBOUND(SrcInitInputData%WaveElev1,3) + i3_u = UBOUND(SrcInitInputData%WaveElev1,3) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElev1)) THEN + ALLOCATE(DstInitInputData%WaveElev1(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%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElev1 = SrcInitInputData%WaveElev1 +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveElev2)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElev2,1) + i1_u = UBOUND(SrcInitInputData%WaveElev2,1) + i2_l = LBOUND(SrcInitInputData%WaveElev2,2) + i2_u = UBOUND(SrcInitInputData%WaveElev2,2) + i3_l = LBOUND(SrcInitInputData%WaveElev2,3) + i3_u = UBOUND(SrcInitInputData%WaveElev2,3) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElev2)) THEN + ALLOCATE(DstInitInputData%WaveElev2(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%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElev2 = SrcInitInputData%WaveElev2 +ENDIF +IF (ALLOCATED(SrcInitInputData%WaveElev0)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElev0,1) + i1_u = UBOUND(SrcInitInputData%WaveElev0,1) + IF (.NOT. ALLOCATED(DstInitInputData%WaveElev0)) THEN + ALLOCATE(DstInitInputData%WaveElev0(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveElev0.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElev0 = SrcInitInputData%WaveElev0 +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveTime)) THEN + i1_l = LBOUND(SrcInitInputData%WaveTime,1) + i1_u = UBOUND(SrcInitInputData%WaveTime,1) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveTime)) THEN + ALLOCATE(DstInitInputData%WaveTime(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveTime.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveTime = SrcInitInputData%WaveTime +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveDynP)) THEN + i1_l = LBOUND(SrcInitInputData%WaveDynP,1) + i1_u = UBOUND(SrcInitInputData%WaveDynP,1) + i2_l = LBOUND(SrcInitInputData%WaveDynP,2) + i2_u = UBOUND(SrcInitInputData%WaveDynP,2) + i3_l = LBOUND(SrcInitInputData%WaveDynP,3) + i3_u = UBOUND(SrcInitInputData%WaveDynP,3) + i4_l = LBOUND(SrcInitInputData%WaveDynP,4) + i4_u = UBOUND(SrcInitInputData%WaveDynP,4) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveDynP)) THEN + ALLOCATE(DstInitInputData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveDynP.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveDynP = SrcInitInputData%WaveDynP +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveAcc)) THEN + i1_l = LBOUND(SrcInitInputData%WaveAcc,1) + i1_u = UBOUND(SrcInitInputData%WaveAcc,1) + i2_l = LBOUND(SrcInitInputData%WaveAcc,2) + i2_u = UBOUND(SrcInitInputData%WaveAcc,2) + i3_l = LBOUND(SrcInitInputData%WaveAcc,3) + i3_u = UBOUND(SrcInitInputData%WaveAcc,3) + i4_l = LBOUND(SrcInitInputData%WaveAcc,4) + i4_u = UBOUND(SrcInitInputData%WaveAcc,4) + i5_l = LBOUND(SrcInitInputData%WaveAcc,5) + i5_u = UBOUND(SrcInitInputData%WaveAcc,5) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveAcc)) THEN + ALLOCATE(DstInitInputData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveAcc.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveAcc = SrcInitInputData%WaveAcc +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveVel)) THEN + i1_l = LBOUND(SrcInitInputData%WaveVel,1) + i1_u = UBOUND(SrcInitInputData%WaveVel,1) + i2_l = LBOUND(SrcInitInputData%WaveVel,2) + i2_u = UBOUND(SrcInitInputData%WaveVel,2) + i3_l = LBOUND(SrcInitInputData%WaveVel,3) + i3_u = UBOUND(SrcInitInputData%WaveVel,3) + i4_l = LBOUND(SrcInitInputData%WaveVel,4) + i4_u = UBOUND(SrcInitInputData%WaveVel,4) + i5_l = LBOUND(SrcInitInputData%WaveVel,5) + i5_u = UBOUND(SrcInitInputData%WaveVel,5) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveVel)) THEN + ALLOCATE(DstInitInputData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveVel.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveVel = SrcInitInputData%WaveVel +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveElevC0)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElevC0,1) + i1_u = UBOUND(SrcInitInputData%WaveElevC0,1) + i2_l = LBOUND(SrcInitInputData%WaveElevC0,2) + i2_u = UBOUND(SrcInitInputData%WaveElevC0,2) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElevC0)) THEN + ALLOCATE(DstInitInputData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElevC0 = SrcInitInputData%WaveElevC0 +ENDIF +IF (ALLOCATED(SrcInitInputData%WaveElevC)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElevC,1) + i1_u = UBOUND(SrcInitInputData%WaveElevC,1) + i2_l = LBOUND(SrcInitInputData%WaveElevC,2) + i2_u = UBOUND(SrcInitInputData%WaveElevC,2) + i3_l = LBOUND(SrcInitInputData%WaveElevC,3) + i3_u = UBOUND(SrcInitInputData%WaveElevC,3) + IF (.NOT. ALLOCATED(DstInitInputData%WaveElevC)) THEN + ALLOCATE(DstInitInputData%WaveElevC(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%WaveElevC.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElevC = SrcInitInputData%WaveElevC +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveDirArr)) THEN + i1_l = LBOUND(SrcInitInputData%WaveDirArr,1) + i1_u = UBOUND(SrcInitInputData%WaveDirArr,1) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveDirArr)) THEN + ALLOCATE(DstInitInputData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveDirArr = SrcInitInputData%WaveDirArr +ENDIF + DstInitInputData%WaveDirMin = SrcInitInputData%WaveDirMin + DstInitInputData%WaveDirMax = SrcInitInputData%WaveDirMax + DstInitInputData%WaveDir = SrcInitInputData%WaveDir + DstInitInputData%WaveMultiDir = SrcInitInputData%WaveMultiDir + DstInitInputData%WaveDOmega = SrcInitInputData%WaveDOmega + CALL SeaSt_Interp_CopyParam( SrcInitInputData%SeaSt_Interp_p, DstInitInputData%SeaSt_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE HydroDyn_CopyInitInput SUBROUTINE HydroDyn_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -1957,6 +2000,49 @@ SUBROUTINE HydroDyn_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitInputData%WaveElevXY)) THEN DEALLOCATE(InitInputData%WaveElevXY) ENDIF +IF (ASSOCIATED(InitInputData%WaveElev)) THEN + DEALLOCATE(InitInputData%WaveElev) + InitInputData%WaveElev => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveElev1)) THEN + DEALLOCATE(InitInputData%WaveElev1) + InitInputData%WaveElev1 => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveElev2)) THEN + DEALLOCATE(InitInputData%WaveElev2) + InitInputData%WaveElev2 => NULL() +ENDIF +IF (ALLOCATED(InitInputData%WaveElev0)) THEN + DEALLOCATE(InitInputData%WaveElev0) +ENDIF +IF (ASSOCIATED(InitInputData%WaveTime)) THEN + DEALLOCATE(InitInputData%WaveTime) + InitInputData%WaveTime => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveDynP)) THEN + DEALLOCATE(InitInputData%WaveDynP) + InitInputData%WaveDynP => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveAcc)) THEN + DEALLOCATE(InitInputData%WaveAcc) + InitInputData%WaveAcc => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveVel)) THEN + DEALLOCATE(InitInputData%WaveVel) + InitInputData%WaveVel => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveElevC0)) THEN + DEALLOCATE(InitInputData%WaveElevC0) + InitInputData%WaveElevC0 => NULL() +ENDIF +IF (ALLOCATED(InitInputData%WaveElevC)) THEN + DEALLOCATE(InitInputData%WaveElevC) +ENDIF +IF (ASSOCIATED(InitInputData%WaveDirArr)) THEN + DEALLOCATE(InitInputData%WaveDirArr) + InitInputData%WaveDirArr => NULL() +ENDIF + CALL SeaSt_Interp_DestroyParam( InitInputData%SeaSt_Interp_p, ErrStat, ErrMsg ) END SUBROUTINE HydroDyn_DestroyInitInput SUBROUTINE HydroDyn_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -2029,24 +2115,116 @@ SUBROUTINE HydroDyn_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, 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 + Int_BufSz = Int_BufSz + 1 ! NStepWave + Int_BufSz = Int_BufSz + 1 ! NStepWave2 + Re_BufSz = Re_BufSz + 1 ! RhoXg + Int_BufSz = Int_BufSz + 1 ! WaveMod + Int_BufSz = Int_BufSz + 1 ! CurrMod + Int_BufSz = Int_BufSz + 1 ! WaveStMod + Int_BufSz = Int_BufSz + 1 ! WaveDirMod + Re_BufSz = Re_BufSz + 1 ! WvLowCOff + Re_BufSz = Re_BufSz + 1 ! WvHiCOff + Re_BufSz = Re_BufSz + 1 ! WvLowCOffD + Re_BufSz = Re_BufSz + 1 ! WvHiCOffD + Re_BufSz = Re_BufSz + 1 ! WvLowCOffS + Re_BufSz = Re_BufSz + 1 ! WvHiCOffS + Int_BufSz = Int_BufSz + 1 ! WvDiffQTFF + Int_BufSz = Int_BufSz + 1 ! WvSumQTFF + Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no + IF ( ASSOCIATED(InData%WaveElev) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev 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 + Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev1) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev1) ! WaveElev1 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) + Int_BufSz = Int_BufSz + 1 ! WaveElev2 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev2) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev2 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev2) ! WaveElev2 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev0 allocated yes/no + IF ( ALLOCATED(InData%WaveElev0) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveElev0 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev0) ! WaveElev0 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no + IF ( ASSOCIATED(InData%WaveTime) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime + END IF + Int_BufSz = Int_BufSz + 1 ! WaveDynP allocated yes/no + IF ( ASSOCIATED(InData%WaveDynP) ) THEN + Int_BufSz = Int_BufSz + 2*4 ! WaveDynP upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveDynP) ! WaveDynP + END IF + Int_BufSz = Int_BufSz + 1 ! WaveAcc allocated yes/no + IF ( ASSOCIATED(InData%WaveAcc) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveAcc upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveAcc) ! WaveAcc + END IF + Int_BufSz = Int_BufSz + 1 ! WaveVel allocated yes/no + IF ( ASSOCIATED(InData%WaveVel) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveVel upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveVel) ! WaveVel + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElevC0 allocated yes/no + IF ( ASSOCIATED(InData%WaveElevC0) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! WaveElevC0 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC0) ! WaveElevC0 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElevC allocated yes/no + IF ( ALLOCATED(InData%WaveElevC) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElevC upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC) ! WaveElevC + END IF + Int_BufSz = Int_BufSz + 1 ! WaveDirArr allocated yes/no + IF ( ASSOCIATED(InData%WaveDirArr) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveDirArr upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveDirArr) ! WaveDirArr + END IF + Re_BufSz = Re_BufSz + 1 ! WaveDirMin + Re_BufSz = Re_BufSz + 1 ! WaveDirMax + Re_BufSz = Re_BufSz + 1 ! WaveDir + Int_BufSz = Int_BufSz + 1 ! WaveMultiDir + Re_BufSz = Re_BufSz + 1 ! WaveDOmega + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_p: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + 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 @@ -2112,62 +2290,821 @@ SUBROUTINE HydroDyn_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE - IntKiBuf( Int_Xferred ) = 1 + 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 + IntKiBuf(Int_Xferred) = InData%NStepWave + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NStepWave2 + Int_Xferred = Int_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%RhoXg + Re_Xferred = Re_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%WaveMod + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%CurrMod + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%WaveStMod + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%WaveDirMod + Int_Xferred = Int_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvLowCOff + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvHiCOff + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvLowCOffD + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvHiCOffD + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvLowCOffS + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvHiCOffS + Re_Xferred = Re_Xferred + 1 + IntKiBuf(Int_Xferred) = TRANSFER(InData%WvDiffQTFF, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = TRANSFER(InData%WvSumQTFF, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ASSOCIATED(InData%WaveElev) ) 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%WaveElev,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev,3), UBOUND(InData%WaveElev,3) + DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) + DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) + ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) 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%WaveElev1,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev1,3), UBOUND(InData%WaveElev1,3) + DO i2 = LBOUND(InData%WaveElev1,2), UBOUND(InData%WaveElev1,2) + DO i1 = LBOUND(InData%WaveElev1,1), UBOUND(InData%WaveElev1,1) + ReKiBuf(Re_Xferred) = InData%WaveElev1(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev2) ) 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%WaveElev2,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev2,3), UBOUND(InData%WaveElev2,3) + DO i2 = LBOUND(InData%WaveElev2,2), UBOUND(InData%WaveElev2,2) + DO i1 = LBOUND(InData%WaveElev2,1), UBOUND(InData%WaveElev2,1) + ReKiBuf(Re_Xferred) = InData%WaveElev2(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveElev0) ) 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%WaveElev0,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev0,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveElev0,1), UBOUND(InData%WaveElev0,1) + ReKiBuf(Re_Xferred) = InData%WaveElev0(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) 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%WaveTime,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveTime,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveTime,1), UBOUND(InData%WaveTime,1) + ReKiBuf(Re_Xferred) = InData%WaveTime(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveDynP) ) 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%WaveDynP,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,4) + Int_Xferred = Int_Xferred + 2 + + DO i4 = LBOUND(InData%WaveDynP,4), UBOUND(InData%WaveDynP,4) + DO i3 = LBOUND(InData%WaveDynP,3), UBOUND(InData%WaveDynP,3) + DO i2 = LBOUND(InData%WaveDynP,2), UBOUND(InData%WaveDynP,2) + DO i1 = LBOUND(InData%WaveDynP,1), UBOUND(InData%WaveDynP,1) + ReKiBuf(Re_Xferred) = InData%WaveDynP(i1,i2,i3,i4) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveAcc) ) 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%WaveAcc,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,5) + Int_Xferred = Int_Xferred + 2 + + DO i5 = LBOUND(InData%WaveAcc,5), UBOUND(InData%WaveAcc,5) + DO i4 = LBOUND(InData%WaveAcc,4), UBOUND(InData%WaveAcc,4) + DO i3 = LBOUND(InData%WaveAcc,3), UBOUND(InData%WaveAcc,3) + DO i2 = LBOUND(InData%WaveAcc,2), UBOUND(InData%WaveAcc,2) + DO i1 = LBOUND(InData%WaveAcc,1), UBOUND(InData%WaveAcc,1) + ReKiBuf(Re_Xferred) = InData%WaveAcc(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveVel) ) 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%WaveVel,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,5) + Int_Xferred = Int_Xferred + 2 + + DO i5 = LBOUND(InData%WaveVel,5), UBOUND(InData%WaveVel,5) + DO i4 = LBOUND(InData%WaveVel,4), UBOUND(InData%WaveVel,4) + DO i3 = LBOUND(InData%WaveVel,3), UBOUND(InData%WaveVel,3) + DO i2 = LBOUND(InData%WaveVel,2), UBOUND(InData%WaveVel,2) + DO i1 = LBOUND(InData%WaveVel,1), UBOUND(InData%WaveVel,1) + ReKiBuf(Re_Xferred) = InData%WaveVel(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElevC0) ) 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%WaveElevC0,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC0,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC0,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC0,2) + Int_Xferred = Int_Xferred + 2 + + DO i2 = LBOUND(InData%WaveElevC0,2), UBOUND(InData%WaveElevC0,2) + DO i1 = LBOUND(InData%WaveElevC0,1), UBOUND(InData%WaveElevC0,1) + ReKiBuf(Re_Xferred) = InData%WaveElevC0(i1,i2) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveElevC) ) 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%WaveElevC,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElevC,3), UBOUND(InData%WaveElevC,3) + DO i2 = LBOUND(InData%WaveElevC,2), UBOUND(InData%WaveElevC,2) + DO i1 = LBOUND(InData%WaveElevC,1), UBOUND(InData%WaveElevC,1) + ReKiBuf(Re_Xferred) = InData%WaveElevC(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveDirArr) ) 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%WaveDirArr,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDirArr,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveDirArr,1), UBOUND(InData%WaveDirArr,1) + ReKiBuf(Re_Xferred) = InData%WaveDirArr(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + ReKiBuf(Re_Xferred) = InData%WaveDirMin + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WaveDirMax + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WaveDir + Re_Xferred = Re_Xferred + 1 + IntKiBuf(Int_Xferred) = TRANSFER(InData%WaveMultiDir, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WaveDOmega + Re_Xferred = Re_Xferred + 1 + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_p + 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 + 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 + 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 + OutData%NStepWave = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%NStepWave2 = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%RhoXg = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WaveMod = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%CurrMod = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%WaveStMod = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%WaveDirMod = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%WvLowCOff = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvHiCOff = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvLowCOffD = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvHiCOffD = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvLowCOffS = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvHiCOffS = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvDiffQTFF = TRANSFER(IntKiBuf(Int_Xferred), OutData%WvDiffQTFF) + Int_Xferred = Int_Xferred + 1 + OutData%WvSumQTFF = TRANSFER(IntKiBuf(Int_Xferred), OutData%WvSumQTFF) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev)) DEALLOCATE(OutData%WaveElev) + ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev,3), UBOUND(OutData%WaveElev,3) + DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) + DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) + OutData%WaveElev(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev1)) DEALLOCATE(OutData%WaveElev1) + ALLOCATE(OutData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev1,3), UBOUND(OutData%WaveElev1,3) + DO i2 = LBOUND(OutData%WaveElev1,2), UBOUND(OutData%WaveElev1,2) + DO i1 = LBOUND(OutData%WaveElev1,1), UBOUND(OutData%WaveElev1,1) + OutData%WaveElev1(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev2 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev2)) DEALLOCATE(OutData%WaveElev2) + ALLOCATE(OutData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev2,3), UBOUND(OutData%WaveElev2,3) + DO i2 = LBOUND(OutData%WaveElev2,2), UBOUND(OutData%WaveElev2,2) + DO i1 = LBOUND(OutData%WaveElev2,1), UBOUND(OutData%WaveElev2,1) + OutData%WaveElev2(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev0 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 + IF (ALLOCATED(OutData%WaveElev0)) DEALLOCATE(OutData%WaveElev0) + ALLOCATE(OutData%WaveElev0(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev0.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveElev0,1), UBOUND(OutData%WaveElev0,1) + OutData%WaveElev0(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime 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 + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveTime,1), UBOUND(OutData%WaveTime,1) + OutData%WaveTime(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDynP 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveDynP)) DEALLOCATE(OutData%WaveDynP) + ALLOCATE(OutData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i4 = LBOUND(OutData%WaveDynP,4), UBOUND(OutData%WaveDynP,4) + DO i3 = LBOUND(OutData%WaveDynP,3), UBOUND(OutData%WaveDynP,3) + DO i2 = LBOUND(OutData%WaveDynP,2), UBOUND(OutData%WaveDynP,2) + DO i1 = LBOUND(OutData%WaveDynP,1), UBOUND(OutData%WaveDynP,1) + OutData%WaveDynP(i1,i2,i3,i4) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveAcc 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveAcc)) DEALLOCATE(OutData%WaveAcc) + ALLOCATE(OutData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i5 = LBOUND(OutData%WaveAcc,5), UBOUND(OutData%WaveAcc,5) + DO i4 = LBOUND(OutData%WaveAcc,4), UBOUND(OutData%WaveAcc,4) + DO i3 = LBOUND(OutData%WaveAcc,3), UBOUND(OutData%WaveAcc,3) + DO i2 = LBOUND(OutData%WaveAcc,2), UBOUND(OutData%WaveAcc,2) + DO i1 = LBOUND(OutData%WaveAcc,1), UBOUND(OutData%WaveAcc,1) + OutData%WaveAcc(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveVel 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveVel)) DEALLOCATE(OutData%WaveVel) + ALLOCATE(OutData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i5 = LBOUND(OutData%WaveVel,5), UBOUND(OutData%WaveVel,5) + DO i4 = LBOUND(OutData%WaveVel,4), UBOUND(OutData%WaveVel,4) + DO i3 = LBOUND(OutData%WaveVel,3), UBOUND(OutData%WaveVel,3) + DO i2 = LBOUND(OutData%WaveVel,2), UBOUND(OutData%WaveVel,2) + DO i1 = LBOUND(OutData%WaveVel,1), UBOUND(OutData%WaveVel,1) + OutData%WaveVel(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevC0 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 (ASSOCIATED(OutData%WaveElevC0)) DEALLOCATE(OutData%WaveElevC0) + ALLOCATE(OutData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i2 = LBOUND(OutData%WaveElevC0,2), UBOUND(OutData%WaveElevC0,2) + DO i1 = LBOUND(OutData%WaveElevC0,1), UBOUND(OutData%WaveElevC0,1) + OutData%WaveElevC0(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevC not allocated + Int_Xferred = Int_Xferred + 1 + ELSE Int_Xferred = Int_Xferred + 1 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevXY,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevXY,1) + i1_l = IntKiBuf( Int_Xferred ) + i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevXY,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevXY,2) + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%WaveElevC)) DEALLOCATE(OutData%WaveElevC) + ALLOCATE(OutData%WaveElevC(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevC.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElevC,3), UBOUND(OutData%WaveElevC,3) + DO i2 = LBOUND(OutData%WaveElevC,2), UBOUND(OutData%WaveElevC,2) + DO i1 = LBOUND(OutData%WaveElevC,1), UBOUND(OutData%WaveElevC,1) + OutData%WaveElevC(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO END DO END DO END IF - ReKiBuf(Re_Xferred) = InData%PtfmLocationX + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDirArr 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 + IF (ASSOCIATED(OutData%WaveDirArr)) DEALLOCATE(OutData%WaveDirArr) + ALLOCATE(OutData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveDirArr,1), UBOUND(OutData%WaveDirArr,1) + OutData%WaveDirArr(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + OutData%WaveDirMin = REAL(ReKiBuf(Re_Xferred), SiKi) Re_Xferred = Re_Xferred + 1 - ReKiBuf(Re_Xferred) = InData%PtfmLocationY + OutData%WaveDirMax = REAL(ReKiBuf(Re_Xferred), SiKi) 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) + OutData%WaveDir = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WaveMultiDir = TRANSFER(IntKiBuf(Int_Xferred), OutData%WaveMultiDir) Int_Xferred = Int_Xferred + 1 + OutData%WaveDOmega = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -2201,58 +3138,13 @@ SUBROUTINE HydroDyn_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta 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 SeaSt_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_p, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_p 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 ) @@ -2303,9 +3195,6 @@ SUBROUTINE HydroDyn_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCo IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF - CALL Waves2_CopyInitOutput( SrcInitOutputData%Waves2, DstInitOutputData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN CALL Morison_CopyInitOutput( SrcInitOutputData%Morison, DstInitOutputData%Morison, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -2436,7 +3325,6 @@ SUBROUTINE HydroDyn_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(InitOutputData%WAMIT2) ENDIF - CALL Waves2_DestroyInitOutput( InitOutputData%Waves2, ErrStat, ErrMsg ) CALL Morison_DestroyInitOutput( InitOutputData%Morison, ErrStat, ErrMsg ) IF (ALLOCATED(InitOutputData%WriteOutputHdr)) THEN DEALLOCATE(InitOutputData%WriteOutputHdr) @@ -2547,23 +3435,6 @@ SUBROUTINE HydroDyn_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END IF END DO END IF - Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype - CALL Waves2_PackInitOutput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Waves2 - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves2 - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Waves2 - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF Int_BufSz = Int_BufSz + 3 ! Morison: size of buffers for each call to pack subtype CALL Morison_PackInitOutput( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, .TRUE. ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -2750,34 +3621,6 @@ SUBROUTINE HydroDyn_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ENDIF END DO END IF - CALL Waves2_PackInitOutput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 - 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 CALL Morison_PackInitOutput( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, OnlySize ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -3117,46 +3960,6 @@ SUBROUTINE HydroDyn_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSt IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF - 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 Waves2_UnpackInitOutput( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 - 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) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -3838,9 +4641,6 @@ SUBROUTINE HydroDyn_CopyContState( SrcContStateData, DstContStateData, CtrlCode, IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF - CALL Waves2_CopyContState( SrcContStateData%Waves2, DstContStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN CALL Morison_CopyContState( SrcContStateData%Morison, DstContStateData%Morison, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -3867,7 +4667,6 @@ SUBROUTINE HydroDyn_DestroyContState( ContStateData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(ContStateData%WAMIT2) ENDIF - CALL Waves2_DestroyContState( ContStateData%Waves2, ErrStat, ErrMsg ) CALL Morison_DestroyContState( ContStateData%Morison, ErrStat, ErrMsg ) END SUBROUTINE HydroDyn_DestroyContState @@ -3953,23 +4752,6 @@ SUBROUTINE HydroDyn_PackContState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END IF END DO END IF - Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype - CALL Waves2_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Waves2 - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves2 - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Waves2 - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF Int_BufSz = Int_BufSz + 3 ! Morison: size of buffers for each call to pack subtype CALL Morison_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, .TRUE. ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -4065,38 +4847,8 @@ SUBROUTINE HydroDyn_PackContState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WAMIT2,1) Int_Xferred = Int_Xferred + 2 - DO i1 = LBOUND(InData%WAMIT2,1), UBOUND(InData%WAMIT2,1) - CALL WAMIT2_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%WAMIT2(i1), ErrStat2, ErrMsg2, OnlySize ) ! WAMIT2 - 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 - END DO - END IF - CALL Waves2_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + DO i1 = LBOUND(InData%WAMIT2,1), UBOUND(InData%WAMIT2,1) + CALL WAMIT2_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%WAMIT2(i1), ErrStat2, ErrMsg2, OnlySize ) ! WAMIT2 CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -4124,6 +4876,8 @@ SUBROUTINE HydroDyn_PackContState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF + END DO + END IF CALL Morison_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, OnlySize ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -4293,46 +5047,6 @@ SUBROUTINE HydroDyn_UnPackContState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF - 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 Waves2_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 - 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) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -4422,9 +5136,6 @@ SUBROUTINE HydroDyn_CopyDiscState( SrcDiscStateData, DstDiscStateData, CtrlCode, IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF - CALL Waves2_CopyDiscState( SrcDiscStateData%Waves2, DstDiscStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN CALL Morison_CopyDiscState( SrcDiscStateData%Morison, DstDiscStateData%Morison, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -4451,7 +5162,6 @@ SUBROUTINE HydroDyn_DestroyDiscState( DiscStateData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(DiscStateData%WAMIT2) ENDIF - CALL Waves2_DestroyDiscState( DiscStateData%Waves2, ErrStat, ErrMsg ) CALL Morison_DestroyDiscState( DiscStateData%Morison, ErrStat, ErrMsg ) END SUBROUTINE HydroDyn_DestroyDiscState @@ -4537,23 +5247,6 @@ SUBROUTINE HydroDyn_PackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END IF END DO END IF - Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype - CALL Waves2_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Waves2 - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves2 - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Waves2 - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF Int_BufSz = Int_BufSz + 3 ! Morison: size of buffers for each call to pack subtype CALL Morison_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, .TRUE. ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -4680,34 +5373,6 @@ SUBROUTINE HydroDyn_PackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ENDIF END DO END IF - CALL Waves2_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 - 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 CALL Morison_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, OnlySize ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -4877,46 +5542,6 @@ SUBROUTINE HydroDyn_UnPackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF - 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 Waves2_UnpackDiscState( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 - 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) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -4979,9 +5604,6 @@ SUBROUTINE HydroDyn_CopyConstrState( SrcConstrStateData, DstConstrStateData, Ctr CALL WAMIT2_CopyConstrState( SrcConstrStateData%WAMIT2, DstConstrStateData%WAMIT2, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL Waves2_CopyConstrState( SrcConstrStateData%Waves2, DstConstrStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN CALL Morison_CopyConstrState( SrcConstrStateData%Morison, DstConstrStateData%Morison, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -4998,7 +5620,6 @@ SUBROUTINE HydroDyn_DestroyConstrState( ConstrStateData, ErrStat, ErrMsg ) ErrMsg = "" CALL WAMIT_DestroyConstrState( ConstrStateData%WAMIT, ErrStat, ErrMsg ) CALL WAMIT2_DestroyConstrState( ConstrStateData%WAMIT2, ErrStat, ErrMsg ) - CALL Waves2_DestroyConstrState( ConstrStateData%Waves2, ErrStat, ErrMsg ) CALL Morison_DestroyConstrState( ConstrStateData%Morison, ErrStat, ErrMsg ) END SUBROUTINE HydroDyn_DestroyConstrState @@ -5072,23 +5693,6 @@ SUBROUTINE HydroDyn_PackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF - Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype - CALL Waves2_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Waves2 - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves2 - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Waves2 - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF Int_BufSz = Int_BufSz + 3 ! Morison: size of buffers for each call to pack subtype CALL Morison_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, .TRUE. ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -5165,34 +5769,6 @@ SUBROUTINE HydroDyn_PackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat 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 - CALL Waves2_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 - 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 @@ -5350,46 +5926,6 @@ SUBROUTINE HydroDyn_UnPackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrS 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) - 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 Waves2_UnpackConstrState( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 - 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) @@ -5482,9 +6018,6 @@ SUBROUTINE HydroDyn_CopyOtherState( SrcOtherStateData, DstOtherStateData, CtrlCo IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF - CALL Waves2_CopyOtherState( SrcOtherStateData%Waves2, DstOtherStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN CALL Morison_CopyOtherState( SrcOtherStateData%Morison, DstOtherStateData%Morison, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -5511,7 +6044,6 @@ SUBROUTINE HydroDyn_DestroyOtherState( OtherStateData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(OtherStateData%WAMIT2) ENDIF - CALL Waves2_DestroyOtherState( OtherStateData%Waves2, ErrStat, ErrMsg ) CALL Morison_DestroyOtherState( OtherStateData%Morison, ErrStat, ErrMsg ) END SUBROUTINE HydroDyn_DestroyOtherState @@ -5597,23 +6129,6 @@ SUBROUTINE HydroDyn_PackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END IF END DO END IF - Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype - CALL Waves2_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Waves2 - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves2 - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Waves2 - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF Int_BufSz = Int_BufSz + 3 ! Morison: size of buffers for each call to pack subtype CALL Morison_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, .TRUE. ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -5701,46 +6216,16 @@ SUBROUTINE HydroDyn_PackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END IF IF ( .NOT. ALLOCATED(InData%WAMIT2) ) 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%WAMIT2,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WAMIT2,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%WAMIT2,1), UBOUND(InData%WAMIT2,1) - CALL WAMIT2_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%WAMIT2(i1), ErrStat2, ErrMsg2, OnlySize ) ! WAMIT2 - 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 - END DO - END IF - CALL Waves2_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 + Int_Xferred = Int_Xferred + 1 + ELSE + IntKiBuf( Int_Xferred ) = 1 + Int_Xferred = Int_Xferred + 1 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WAMIT2,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WAMIT2,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WAMIT2,1), UBOUND(InData%WAMIT2,1) + CALL WAMIT2_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%WAMIT2(i1), ErrStat2, ErrMsg2, OnlySize ) ! WAMIT2 CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -5768,6 +6253,8 @@ SUBROUTINE HydroDyn_PackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF + END DO + END IF CALL Morison_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, OnlySize ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -5937,46 +6424,6 @@ SUBROUTINE HydroDyn_UnPackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSt IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF - 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 Waves2_UnpackOtherState( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 - 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) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -6103,9 +6550,6 @@ SUBROUTINE HydroDyn_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMs IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF - CALL Waves2_CopyMisc( SrcMiscData%Waves2, DstMiscData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN CALL Morison_CopyMisc( SrcMiscData%Morison, DstMiscData%Morison, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -6141,9 +6585,6 @@ SUBROUTINE HydroDyn_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMs IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF - CALL Waves2_CopyInput( SrcMiscData%u_Waves2, DstMiscData%u_Waves2, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE HydroDyn_CopyMisc SUBROUTINE HydroDyn_DestroyMisc( MiscData, ErrStat, ErrMsg ) @@ -6176,7 +6617,6 @@ SUBROUTINE HydroDyn_DestroyMisc( MiscData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(MiscData%WAMIT2) ENDIF - CALL Waves2_DestroyMisc( MiscData%Waves2, ErrStat, ErrMsg ) CALL Morison_DestroyMisc( MiscData%Morison, ErrStat, ErrMsg ) IF (ALLOCATED(MiscData%u_WAMIT)) THEN DO i1 = LBOUND(MiscData%u_WAMIT,1), UBOUND(MiscData%u_WAMIT,1) @@ -6190,7 +6630,6 @@ SUBROUTINE HydroDyn_DestroyMisc( MiscData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(MiscData%u_WAMIT2) ENDIF - CALL Waves2_DestroyInput( MiscData%u_Waves2, ErrStat, ErrMsg ) END SUBROUTINE HydroDyn_DestroyMisc SUBROUTINE HydroDyn_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -6340,23 +6779,6 @@ SUBROUTINE HydroDyn_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END IF END DO END IF - Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype - CALL Waves2_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Waves2 - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves2 - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Waves2 - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF Int_BufSz = Int_BufSz + 3 ! Morison: size of buffers for each call to pack subtype CALL Morison_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, .TRUE. ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -6420,23 +6842,6 @@ SUBROUTINE HydroDyn_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END IF END DO END IF - Int_BufSz = Int_BufSz + 3 ! u_Waves2: size of buffers for each call to pack subtype - CALL Waves2_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u_Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! u_Waves2 - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! u_Waves2 - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! u_Waves2 - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! u_Waves2 - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -6670,34 +7075,6 @@ SUBROUTINE HydroDyn_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs ENDIF END DO END IF - CALL Waves2_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 - 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 CALL Morison_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, OnlySize ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -6808,34 +7185,6 @@ SUBROUTINE HydroDyn_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs ENDIF END DO END IF - CALL Waves2_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u_Waves2, ErrStat2, ErrMsg2, OnlySize ) ! u_Waves2 - 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 END SUBROUTINE HydroDyn_PackMisc SUBROUTINE HydroDyn_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -7145,46 +7494,6 @@ SUBROUTINE HydroDyn_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF - 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 Waves2_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 - 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) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -7337,46 +7646,6 @@ SUBROUTINE HydroDyn_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF - 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 Waves2_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%u_Waves2, ErrStat2, ErrMsg2 ) ! u_Waves2 - 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) END SUBROUTINE HydroDyn_UnPackMisc SUBROUTINE HydroDyn_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) @@ -7431,9 +7700,6 @@ SUBROUTINE HydroDyn_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Er ENDDO ENDIF DstParamData%WAMIT2used = SrcParamData%WAMIT2used - CALL Waves2_CopyParam( SrcParamData%Waves2, DstParamData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN CALL Morison_CopyParam( SrcParamData%Morison, DstParamData%Morison, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -7443,10 +7709,10 @@ SUBROUTINE HydroDyn_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Er DstParamData%totalStates = SrcParamData%totalStates DstParamData%totalExctnStates = SrcParamData%totalExctnStates DstParamData%totalRdtnStates = SrcParamData%totalRdtnStates -IF (ALLOCATED(SrcParamData%WaveTime)) THEN +IF (ASSOCIATED(SrcParamData%WaveTime)) THEN i1_l = LBOUND(SrcParamData%WaveTime,1) i1_u = UBOUND(SrcParamData%WaveTime,1) - IF (.NOT. ALLOCATED(DstParamData%WaveTime)) THEN + IF (.NOT. ASSOCIATED(DstParamData%WaveTime)) THEN ALLOCATE(DstParamData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -7456,49 +7722,6 @@ SUBROUTINE HydroDyn_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Er DstParamData%WaveTime = SrcParamData%WaveTime ENDIF DstParamData%NStepWave = SrcParamData%NStepWave - DstParamData%NWaveElev = SrcParamData%NWaveElev -IF (ALLOCATED(SrcParamData%WaveElev)) THEN - i1_l = LBOUND(SrcParamData%WaveElev,1) - i1_u = UBOUND(SrcParamData%WaveElev,1) - i2_l = LBOUND(SrcParamData%WaveElev,2) - i2_u = UBOUND(SrcParamData%WaveElev,2) - IF (.NOT. ALLOCATED(DstParamData%WaveElev)) THEN - ALLOCATE(DstParamData%WaveElev(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstParamData%WaveElev = SrcParamData%WaveElev -ENDIF -IF (ALLOCATED(SrcParamData%WaveElev1)) THEN - i1_l = LBOUND(SrcParamData%WaveElev1,1) - i1_u = UBOUND(SrcParamData%WaveElev1,1) - i2_l = LBOUND(SrcParamData%WaveElev1,2) - i2_u = UBOUND(SrcParamData%WaveElev1,2) - IF (.NOT. ALLOCATED(DstParamData%WaveElev1)) THEN - ALLOCATE(DstParamData%WaveElev1(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev1.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstParamData%WaveElev1 = SrcParamData%WaveElev1 -ENDIF -IF (ALLOCATED(SrcParamData%WaveElev2)) THEN - i1_l = LBOUND(SrcParamData%WaveElev2,1) - i1_u = UBOUND(SrcParamData%WaveElev2,1) - i2_l = LBOUND(SrcParamData%WaveElev2,2) - i2_u = UBOUND(SrcParamData%WaveElev2,2) - IF (.NOT. ALLOCATED(DstParamData%WaveElev2)) THEN - ALLOCATE(DstParamData%WaveElev2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev2.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstParamData%WaveElev2 = SrcParamData%WaveElev2 -ENDIF DstParamData%WtrDpth = SrcParamData%WtrDpth IF (ALLOCATED(SrcParamData%AddF0)) THEN i1_l = LBOUND(SrcParamData%AddF0,1) @@ -7649,19 +7872,10 @@ SUBROUTINE HydroDyn_DestroyParam( ParamData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(ParamData%WAMIT2) ENDIF - CALL Waves2_DestroyParam( ParamData%Waves2, ErrStat, ErrMsg ) CALL Morison_DestroyParam( ParamData%Morison, ErrStat, ErrMsg ) -IF (ALLOCATED(ParamData%WaveTime)) THEN +IF (ASSOCIATED(ParamData%WaveTime)) THEN DEALLOCATE(ParamData%WaveTime) -ENDIF -IF (ALLOCATED(ParamData%WaveElev)) THEN - DEALLOCATE(ParamData%WaveElev) -ENDIF -IF (ALLOCATED(ParamData%WaveElev1)) THEN - DEALLOCATE(ParamData%WaveElev1) -ENDIF -IF (ALLOCATED(ParamData%WaveElev2)) THEN - DEALLOCATE(ParamData%WaveElev2) + ParamData%WaveTime => NULL() ENDIF IF (ALLOCATED(ParamData%AddF0)) THEN DEALLOCATE(ParamData%AddF0) @@ -7777,23 +7991,6 @@ SUBROUTINE HydroDyn_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM END DO END IF Int_BufSz = Int_BufSz + 1 ! WAMIT2used - Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype - CALL Waves2_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Waves2 - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves2 - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Waves2 - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF Int_BufSz = Int_BufSz + 3 ! Morison: size of buffers for each call to pack subtype CALL Morison_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, .TRUE. ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -7817,28 +8014,12 @@ SUBROUTINE HydroDyn_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM Int_BufSz = Int_BufSz + 1 ! totalStates Int_BufSz = Int_BufSz + 1 ! totalExctnStates Int_BufSz = Int_BufSz + 1 ! totalRdtnStates - Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime - END IF - Int_BufSz = Int_BufSz + 1 ! NStepWave - Int_BufSz = Int_BufSz + 1 ! NWaveElev - Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no - IF ( ALLOCATED(InData%WaveElev) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveElev upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev - END IF - Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no - IF ( ALLOCATED(InData%WaveElev1) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveElev1 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveElev1) ! WaveElev1 - END IF - Int_BufSz = Int_BufSz + 1 ! WaveElev2 allocated yes/no - IF ( ALLOCATED(InData%WaveElev2) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveElev2 upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveElev2) ! WaveElev2 + Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no + IF ( ASSOCIATED(InData%WaveTime) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime END IF + Int_BufSz = Int_BufSz + 1 ! NStepWave Re_BufSz = Re_BufSz + 1 ! WtrDpth Int_BufSz = Int_BufSz + 1 ! AddF0 allocated yes/no IF ( ALLOCATED(InData%AddF0) ) THEN @@ -8023,34 +8204,6 @@ SUBROUTINE HydroDyn_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM END IF IntKiBuf(Int_Xferred) = TRANSFER(InData%WAMIT2used, IntKiBuf(1)) Int_Xferred = Int_Xferred + 1 - CALL Waves2_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 - 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 CALL Morison_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, OnlySize ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -8091,7 +8244,7 @@ SUBROUTINE HydroDyn_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%totalRdtnStates Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveTime) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -8108,68 +8261,6 @@ SUBROUTINE HydroDyn_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM END IF IntKiBuf(Int_Xferred) = InData%NStepWave Int_Xferred = Int_Xferred + 1 - IntKiBuf(Int_Xferred) = InData%NWaveElev - Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveElev) ) 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%WaveElev,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,2) - Int_Xferred = Int_Xferred + 2 - - DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) - DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) - ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveElev1) ) 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%WaveElev1,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,2) - Int_Xferred = Int_Xferred + 2 - - DO i2 = LBOUND(InData%WaveElev1,2), UBOUND(InData%WaveElev1,2) - DO i1 = LBOUND(InData%WaveElev1,1), UBOUND(InData%WaveElev1,1) - ReKiBuf(Re_Xferred) = InData%WaveElev1(i1,i2) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( .NOT. ALLOCATED(InData%WaveElev2) ) 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%WaveElev2,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,2) - Int_Xferred = Int_Xferred + 2 - - DO i2 = LBOUND(InData%WaveElev2,2), UBOUND(InData%WaveElev2,2) - DO i1 = LBOUND(InData%WaveElev2,1), UBOUND(InData%WaveElev2,1) - ReKiBuf(Re_Xferred) = InData%WaveElev2(i1,i2) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF ReKiBuf(Re_Xferred) = InData%WtrDpth Re_Xferred = Re_Xferred + 1 IF ( .NOT. ALLOCATED(InData%AddF0) ) THEN @@ -8533,46 +8624,6 @@ SUBROUTINE HydroDyn_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, E END IF OutData%WAMIT2used = TRANSFER(IntKiBuf(Int_Xferred), OutData%WAMIT2used) 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 Waves2_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 - 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) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -8632,7 +8683,7 @@ SUBROUTINE HydroDyn_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, E i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -8645,77 +8696,6 @@ SUBROUTINE HydroDyn_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, E END IF OutData%NStepWave = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 - OutData%NWaveElev = IntKiBuf(Int_Xferred) - Int_Xferred = Int_Xferred + 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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%WaveElev)) DEALLOCATE(OutData%WaveElev) - ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) - DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) - OutData%WaveElev(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 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%WaveElev1)) DEALLOCATE(OutData%WaveElev1) - ALLOCATE(OutData%WaveElev1(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev1.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveElev1,2), UBOUND(OutData%WaveElev1,2) - DO i1 = LBOUND(OutData%WaveElev1,1), UBOUND(OutData%WaveElev1,1) - OutData%WaveElev1(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev2 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%WaveElev2)) DEALLOCATE(OutData%WaveElev2) - ALLOCATE(OutData%WaveElev2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev2.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveElev2,2), UBOUND(OutData%WaveElev2,2) - DO i1 = LBOUND(OutData%WaveElev2,1), UBOUND(OutData%WaveElev2,1) - OutData%WaveElev2(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END IF OutData%WtrDpth = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! AddF0 not allocated @@ -9402,9 +9382,6 @@ SUBROUTINE HydroDyn_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF - CALL Waves2_CopyOutput( SrcOutputData%Waves2, DstOutputData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN CALL Morison_CopyOutput( SrcOutputData%Morison, DstOutputData%Morison, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -9446,7 +9423,6 @@ SUBROUTINE HydroDyn_DestroyOutput( OutputData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(OutputData%WAMIT2) ENDIF - CALL Waves2_DestroyOutput( OutputData%Waves2, ErrStat, ErrMsg ) CALL Morison_DestroyOutput( OutputData%Morison, ErrStat, ErrMsg ) CALL MeshDestroy( OutputData%WAMITMesh, ErrStat, ErrMsg ) IF (ALLOCATED(OutputData%WriteOutput)) THEN @@ -9536,23 +9512,6 @@ SUBROUTINE HydroDyn_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err END IF END DO END IF - Int_BufSz = Int_BufSz + 3 ! Waves2: size of buffers for each call to pack subtype - CALL Waves2_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, .TRUE. ) ! Waves2 - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Waves2 - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves2 - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Waves2 - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF Int_BufSz = Int_BufSz + 3 ! Morison: size of buffers for each call to pack subtype CALL Morison_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, .TRUE. ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -9701,34 +9660,6 @@ SUBROUTINE HydroDyn_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err ENDIF END DO END IF - CALL Waves2_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Waves2, ErrStat2, ErrMsg2, OnlySize ) ! Waves2 - 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 CALL Morison_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Morison, ErrStat2, ErrMsg2, OnlySize ) ! Morison CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -9941,46 +9872,6 @@ SUBROUTINE HydroDyn_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF - 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 Waves2_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 - 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) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -10350,8 +10241,6 @@ SUBROUTINE HydroDyn_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, E CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ENDDO END IF ! check if allocated - CALL Waves2_Output_ExtrapInterp1( y1%Waves2, y2%Waves2, tin, y_out%Waves2, tin_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL Morison_Output_ExtrapInterp1( y1%Morison, y2%Morison, tin, y_out%Morison, tin_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp1(y1%WAMITMesh, y2%WAMITMesh, tin, y_out%WAMITMesh, tin_out, ErrStat2, ErrMsg2 ) @@ -10431,8 +10320,6 @@ SUBROUTINE HydroDyn_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrSta CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ENDDO END IF ! check if allocated - CALL Waves2_Output_ExtrapInterp2( y1%Waves2, y2%Waves2, y3%Waves2, tin, y_out%Waves2, tin_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL Morison_Output_ExtrapInterp2( y1%Morison, y2%Morison, y3%Morison, tin, y_out%Morison, tin_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp2(y1%WAMITMesh, y2%WAMITMesh, y3%WAMITMesh, tin, y_out%WAMITMesh, tin_out, ErrStat2, ErrMsg2 ) diff --git a/modules/hydrodyn/src/Morison.f90 b/modules/hydrodyn/src/Morison.f90 index 1333c31d5c..78a5d31829 100644 --- a/modules/hydrodyn/src/Morison.f90 +++ b/modules/hydrodyn/src/Morison.f90 @@ -23,6 +23,7 @@ MODULE Morison USE Waves USE Morison_Types USE Morison_Output + use SeaState_Interp ! USE HydroDyn_Output_Types USE NWTC_Library @@ -1887,6 +1888,7 @@ SUBROUTINE Morison_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In p%NMOutputs = InitInp%NMOutputs ! Number of members to output [ >=0 and <10] p%OutSwtch = InitInp%OutSwtch p%MSL2SWL = InitInp%MSL2SWL + p%WaveDisp = InitInp%WaveDisp ALLOCATE ( p%MOutLst(p%NMOutputs), STAT = errStat ) IF ( errStat /= ErrID_None ) THEN @@ -2158,6 +2160,10 @@ SUBROUTINE Morison_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Define system output initializations (set up mesh) here: ! Define initialization-routine output here: + + ! Setup the 4D grid information for the Interpolatin Module + p%seast_interp_p = InitInp%seast_interp_p + ! Initialize the outputs IF ( p%OutSwtch > 0) then !@mhall: moved this "if" to after allocations @@ -2318,37 +2324,11 @@ SUBROUTINE AllocateNodeLoadVariables(InitInp, p, m, NNodes, errStat, errMsg ) p%F_WMG_End = 0.0 p%AM_End = 0.0 - allocate( p%WaveVel(0:p%NStepWave, p%NNodes, 3), STAT = errStat ) - IF ( errStat /= ErrID_None ) THEN - errMsg = ' Error allocating space for wave velocities array.' - errStat = ErrID_Fatal - RETURN - END IF - p%WaveVel = InitInp%WaveVel - - allocate( p%WaveAcc(0:p%NStepWave, p%NNodes, 3), STAT = errStat ) - IF ( errStat /= ErrID_None ) THEN - errMsg = ' Error allocating space for wave accelerations array.' - errStat = ErrID_Fatal - RETURN - END IF - p%WaveAcc = InitInp%WaveAcc - - allocate( p%WaveDynP(0:p%NStepWave, p%NNodes), STAT = errStat ) - IF ( errStat /= ErrID_None ) THEN - errMsg = ' Error allocating space for wave dynamic pressure array.' - errStat = ErrID_Fatal - RETURN - END IF - p%WaveDynP = InitInp%WaveDynP - - allocate( p%WaveTime(0:p%NStepWave), STAT = errStat ) - IF ( errStat /= ErrID_None ) THEN - errMsg = ' Error allocating space for wave time array.' - errStat = ErrID_Fatal - RETURN - END IF - p%WaveTime = InitInp%WaveTime + + p%WaveVel => InitInp%WaveVel + p%WaveAcc => InitInp%WaveAcc + p%WaveDynP => InitInp%WaveDynP + p%WaveTime => InitInp%WaveTime END SUBROUTINE AllocateNodeLoadVariables @@ -2399,7 +2379,14 @@ SUBROUTINE Morison_End( u, p, x, xd, z, OtherState, y, m, errStat, errMsg ) ! Destroy the parameter data: - + ! First need to nullify pointers so that SeaState module data is not deallocation by HD + nullify(p%WaveTime) + nullify(p%WaveDynP) + nullify(p%WaveAcc) + nullify(p%WaveVel) + nullify(p%WaveElev) + nullify(p%WaveElev1) + nullify(p%WaveElev2) CALL Morison_DestroyParam( p, errStat, errMsg ) @@ -2564,7 +2551,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, REAL(ReKi) :: D_AM_M(6,6) REAL(ReKi) :: nodeInWater REAL(ReKi) :: D_dragConst ! The distributed drag factor - REAL(ReKi) :: InterpolationSlope + ! REAL(ReKi) :: InterpolationSlope @@ -2631,23 +2618,43 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, Imat = 0.0_ReKi g = p%Gravity - InterpolationSlope = GetInterpolationSlope(Time, p, m, IntWrapIndx) + !InterpolationSlope = GetInterpolationSlope(Time, p, m, IntWrapIndx) !=============================================================================================== ! Calculate the fluid kinematics at all mesh nodes and store for use in the equations below do j = 1, p%NNodes - m%nodeInWater(j) = REAL( p%nodeInWater(IntWrapIndx,j), ReKi ) + !m%nodeInWater(j) = REAL( p%nodeInWater(IntWrapIndx,j), ReKi ) +! TODO: Update for Wave Kinematics grid + if (p%WaveDisp == 0 ) then + ! use the initial X,Y location and initial Z location + pos1(1) = u%Mesh%Position(1,j) + pos1(2) = u%Mesh%Position(2,j) + else + ! Use current X,Y location and initial Z location + pos1(1) = u%Mesh%TranslationDisp(1,j) + u%Mesh%Position(1,j) + pos1(2) = u%Mesh%TranslationDisp(2,j) + u%Mesh%Position(2,j) + end if + + pos1(3) = u%Mesh%Position(3,j) - p%MSL2SWL ! We are intentionally using the undisplaced Z position of the node. + if ( pos1(3) <= 0.0 ) then + ! Use location to obtain interpolated values of kinematics + call SeaSt_Interp_Setup( Time, pos1, p%seast_interp_p, m%seast_interp_m, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + m%FV(:,j) = SeaSt_Interp_4D_Vec( p%WaveVel, m%seast_interp_m, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + m%FA(:,j) = SeaSt_Interp_4D_Vec( p%WaveAcc, m%seast_interp_m, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + m%FDynP(j) = SeaSt_Interp_4D ( p%WaveDynP, m%seast_interp_m, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + else + m%FV(:,j) = 0.0 + m%FA(:,j) = 0.0 + m%FDynP(j) = 0.0 + end if + + m%vrel(:,j) = m%FV(:,j) - u%Mesh%TranslationVel(:,j) - ! Determine the dynamic pressure at the node - m%FDynP(j) = InterpolateWithSlope(InterpolationSlope, m%LastIndWave, p%WaveDynP(:,j)) - do i=1,3 - ! Determine the fluid acceleration and velocity and relative structural velocity at the node - m%FA(i,j) = InterpolateWithSlope(InterpolationSlope, m%LastIndWave, p%WaveAcc(:,j,i)) - - m%FV(i,j) = InterpolateWithSlope(InterpolationSlope, m%LastIndWave, p%WaveVel(:,j,i)) - m%vrel(i,j) = m%FV(i,j) - u%Mesh%TranslationVel(i,j) - end do end do ! ============================================================================================== @@ -2785,13 +2792,13 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, ! ------------------- buoyancy loads: sides: Sections 3.1 and 3.2 ------------------------ !TODO: What about elements which are buried in the seabed? This doesn't seem to be tested for - if (z1 < 0) then ! if segment is at least partially submerged ... - + if (z1 < 0.0_ReKi) then ! if segment is at least partially submerged ... - if (z1*z2 <= 0) then ! special calculation if the slice is partially submerged + + if (z2 >= 0) then ! special calculation if the slice is partially submerged ! Check that this is not the 1st element of the member - if ( i == 1 ) then + if (( i == 1 ) .and. (z2 > 0.0_ReKi)) then call SeterrStat(ErrID_Fatal, 'The lowest element of a Morison member has become partially submerged! This is not allowed. Please review your model and create a discretization such that even with displacements, the lowest element of a member does not become partially submerged.', errStat, errMsg, 'Morison_CalcOutput' ) return end if diff --git a/modules/hydrodyn/src/Morison.txt b/modules/hydrodyn/src/Morison.txt index 2943d32c35..1bc9039c3b 100644 --- a/modules/hydrodyn/src/Morison.txt +++ b/modules/hydrodyn/src/Morison.txt @@ -13,16 +13,17 @@ # ...... Include files (definitions from NWTC Library) ............................................................................ # make sure that the file name does not have any trailing white spaces! include Registry_NWTC_Library.txt +usefrom SeaState_Interp.txt # # -param Morison/Morison unused INTEGER MaxMrsnOutputs - 4599 - "Total number of possible Morison module output channels" - +param Morison/Morison unused INTEGER MaxMrsnOutputs - 4626 - "Total number of possible Morison module output channels" - typedef ^ Morison_JointType INTEGER JointID - - - "User-specified integer ID for the given joint" - typedef ^ ^ ReKi Position {3} - - "Undisplaced location of the joint in the platform coordinate system" m typedef ^ ^ INTEGER JointAxID - - - "Axial ID (found in the user-supplied Axial Coefficients Table) for this joint: used to determine axial coefs" - typedef ^ ^ INTEGER JointAxIDIndx - - - "The index into the Axial Coefs arrays corresponding to the above Axial ID" - typedef ^ ^ INTEGER JointOvrlp - - - "Joint overlap code [Unused" - typedef ^ ^ INTEGER NConnections - - - "Number of members connecting to this joint" - -typedef ^ ^ INTEGER ConnectionList {10} - - "List of Members connected to this joint. The member index is what is stored, not the Member ID" - +typedef ^ ^ INTEGER ConnectionList {50} - - "List of Members connected to this joint. The member index is what is stored, not the Member ID" - typedef ^ Morison_MemberPropType INTEGER PropSetID - - - "User-specified integer ID for this group of properties" - typedef ^ ^ ReKi PropD - - - "Diameter" m typedef ^ ^ ReKi PropThck - - - "Wall thickness" m @@ -73,7 +74,7 @@ typedef ^ ^ ReKi typedef ^ ^ INTEGER JointOvrlp - - - "" - typedef ^ ^ INTEGER JointAxIDIndx - - - "" - typedef ^ ^ INTEGER NConnections - - - "Number of elements connecting to this node" - -typedef ^ ^ INTEGER ConnectionList {10} - - "Indices of all the members connected to this node (positive if end 1, negative if end 2)" - +typedef ^ ^ INTEGER ConnectionList {50} - - "Indices of all the members connected to this node (positive if end 1, negative if end 2)" - typedef ^ ^ ReKi JAxCd - - - "Nodal lumped (joint) axial Cd" - typedef ^ ^ ReKi JAxCa - - - "Nodal lumped (joint) axial Cp" - typedef ^ ^ ReKi JAxCp - - - "Nodal lumped (joint) axial Ca" - @@ -206,6 +207,7 @@ typedef ^ InitInputType ReKi typedef ^ ^ ReKi WtrDens - - - "Water density" kg/m^3 typedef ^ ^ ReKi WtrDpth - - - "Water depth (positive-valued)" m typedef ^ ^ ReKi MSL2SWL - - - "Mean Sea Level to Still Water Level offset" m +typedef ^ ^ INTEGER WaveDisp - - - "Method of computing Wave Kinematics. (0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) " - typedef ^ ^ INTEGER NJoints - - - "Number of user-specified joints" - typedef ^ ^ INTEGER NNodes - - - "Total number of nodes in the final software model" - typedef ^ ^ Morison_JointType InpJoints {:} - - "Array of user-specified joints" - @@ -251,11 +253,15 @@ typedef ^ ^ CHARACTER(1 typedef ^ ^ INTEGER UnOutFile - - - "" - typedef ^ ^ INTEGER UnSum - - - "" - typedef ^ ^ INTEGER NStepWave - - - "" - -typedef ^ ^ SiKi WaveAcc {:}{:}{:} - - "" - -typedef ^ ^ SiKi WaveTime {:} - - "" - -typedef ^ ^ SiKi WaveDynP {:}{:} - - "" - -typedef ^ ^ SiKi WaveVel {:}{:}{:} - - "" - +typedef ^ ^ SiKi WaveElev {*}{*}{*} - - "Total wave elevation" - +typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" - +typedef ^ ^ SiKi WaveElev2 {*}{*}{*} - - "Second order wave elevation" - +typedef ^ ^ SiKi WaveAcc {*}{*}{*}{*}{*} - - "" - +typedef ^ ^ SiKi WaveTime {*} - - "" - +typedef ^ ^ SiKi WaveDynP {*}{*}{*}{*} - - "" - +typedef ^ ^ SiKi WaveVel {*}{*}{*}{*}{*} - - "" - typedef ^ ^ INTEGER nodeInWater {:}{:} - - "Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated" - +typedef ^ ^ SeaSt_Interp_ParameterType SeaSt_Interp_p - - - "parameter information from the SeaState Interpolation module" - # # # Define outputs from the initialization routine here: @@ -300,6 +306,9 @@ typedef ^ OtherStateType IntKi typedef ^ MiscVarType ReKi FV {:}{:} - - "Fluid velocity at line element node at time t, which may not correspond to the WaveTime array of times" - typedef ^ ^ ReKi FA {:}{:} - - "Fluid acceleration at line element node at time t, which may not correspond to the WaveTime array of times" - typedef ^ ^ ReKi FDynP {:} - - "Fluid dynamic pressure at line element node at time t, which may not correspond to the WaveTime array of times" - +typedef ^ ^ ReKi WaveElev {:} - - "Total wave elevation" m +typedef ^ ^ ReKi WaveElev1 {:} - - "First order wave elevation" m +typedef ^ ^ ReKi WaveElev2 {:} - - "Second order wave elevation" m typedef ^ ^ ReKi vrel {:}{:} - - "velocity of structural node relative to the water" m/s^2 typedef ^ ^ INTEGER nodeInWater {:} - - "Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated" - typedef ^ ^ Morison_MemberLoads memberLoads {:} - - "Array (NMembers long) of member-based side-effects load contributions" - @@ -310,6 +319,7 @@ typedef ^ ^ ReKi typedef ^ ^ ReKi F_A_End {:}{:} - - "Lumped added mass loads at time t, which may not correspond to the WaveTime array of times" - typedef ^ ^ ReKi F_BF_End {:}{:} - - "" - typedef ^ ^ INTEGER LastIndWave - - - "Last time index used in the wave kinematics arrays" - +typedef ^ ^ SeaSt_Interp_MiscVarType SeaSt_Interp_m - - - "misc var information from the SeaState Interpolation module" - # ..... Parameters ................................................................................................................ # Define parameters here: @@ -320,6 +330,7 @@ typedef ^ ^ ReKi typedef ^ ^ ReKi WtrDens - - - "Water density" kg/m^3 typedef ^ ^ ReKi WtrDpth - - - "Water depth (positive-valued)" m typedef ^ ^ ReKi MSL2SWL - - - "Mean Sea Level to Still Water Level offset" m +typedef ^ ^ INTEGER WaveDisp - - - "Method of computing Wave Kinematics. (0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) " - typedef ^ ^ INTEGER NMembers - - - "number of members" - typedef ^ ^ Morison_MemberType Members {:} - - "Array of Morison members used during simulation" - typedef ^ ^ INTEGER NNodes - - - "" - @@ -331,11 +342,14 @@ typedef ^ ^ ReKi typedef ^ ^ ReKi DP_Const_End {:}{:} - - "Constant part of Joint dynamic pressure term" N typedef ^ ^ ReKi Mass_MG_End {:} - - "Joint marine growth mass" kg typedef ^ ^ ReKi AM_End {:}{:}{:} - - "3x3 Joint added mass matrix, constant for all t" N -typedef ^ ^ SiKi WaveVel {:}{:}{:} - - "" - -typedef ^ ^ SiKi WaveAcc {:}{:}{:} - - "" - -typedef ^ ^ SiKi WaveDynP {:}{:} - - "" - -typedef ^ ^ SiKi WaveTime {:} - - "Times for which the wave kinematics are pre-computed" s -typedef ^ ^ INTEGER nodeInWater {:}{:} - - "Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated" - +typedef ^ ^ SiKi WaveElev {*}{*}{*} - - "Total wave elevation" m +typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" m +typedef ^ ^ SiKi WaveElev2 {*}{*}{*} - - "Second order wave elevation" m +typedef ^ ^ SiKi WaveVel {*}{*}{*}{*}{*} - - "" - +typedef ^ ^ SiKi WaveAcc {*}{*}{*}{*}{*} - - "" - +typedef ^ ^ SiKi WaveDynP {*}{*}{*}{*} - - "" - +typedef ^ ^ SiKi WaveTime {*} - - "Times for which the wave kinematics are pre-computed" s +typedef ^ ^ INTEGER nodeInWater {:}{:} - - "Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated" - typedef ^ ^ INTEGER NStepWave - - - "" - typedef ^ ^ INTEGER NMOutputs - - - "" - typedef ^ ^ Morison_MOutput MOutLst {:} - - "" - @@ -349,6 +363,7 @@ typedef ^ ^ INTEGER typedef ^ ^ CHARACTER(20) OutFmt - - - "" - typedef ^ ^ CHARACTER(20) OutSFmt - - - "" - typedef ^ ^ CHARACTER(ChanLen) Delim - - - "" - +typedef ^ ^ SeaSt_Interp_ParameterType SeaSt_Interp_p - - - "parameter information from the SeaState Interpolation module" - # # # ..... Inputs .................................................................................................................... diff --git a/modules/hydrodyn/src/Morison_Output.f90 b/modules/hydrodyn/src/Morison_Output.f90 index 8c8a2b2caf..7d4b2ae5f6 100644 --- a/modules/hydrodyn/src/Morison_Output.f90 +++ b/modules/hydrodyn/src/Morison_Output.f90 @@ -50,4620 +50,4646 @@ MODULE Morison_Output ! Time: INTEGER(IntKi), PARAMETER :: Time = 0 - ! Member-level Wave Kinematics : - INTEGER(IntKi), PARAMETER :: M1N1Axi = 1 - INTEGER(IntKi), PARAMETER :: M1N2Axi = 2 - INTEGER(IntKi), PARAMETER :: M1N3Axi = 3 - INTEGER(IntKi), PARAMETER :: M1N4Axi = 4 - INTEGER(IntKi), PARAMETER :: M1N5Axi = 5 - INTEGER(IntKi), PARAMETER :: M1N6Axi = 6 - INTEGER(IntKi), PARAMETER :: M1N7Axi = 7 - INTEGER(IntKi), PARAMETER :: M1N8Axi = 8 - INTEGER(IntKi), PARAMETER :: M1N9Axi = 9 - INTEGER(IntKi), PARAMETER :: M2N1Axi = 10 - INTEGER(IntKi), PARAMETER :: M2N2Axi = 11 - INTEGER(IntKi), PARAMETER :: M2N3Axi = 12 - INTEGER(IntKi), PARAMETER :: M2N4Axi = 13 - INTEGER(IntKi), PARAMETER :: M2N5Axi = 14 - INTEGER(IntKi), PARAMETER :: M2N6Axi = 15 - INTEGER(IntKi), PARAMETER :: M2N7Axi = 16 - INTEGER(IntKi), PARAMETER :: M2N8Axi = 17 - INTEGER(IntKi), PARAMETER :: M2N9Axi = 18 - INTEGER(IntKi), PARAMETER :: M3N1Axi = 19 - INTEGER(IntKi), PARAMETER :: M3N2Axi = 20 - INTEGER(IntKi), PARAMETER :: M3N3Axi = 21 - INTEGER(IntKi), PARAMETER :: M3N4Axi = 22 - INTEGER(IntKi), PARAMETER :: M3N5Axi = 23 - INTEGER(IntKi), PARAMETER :: M3N6Axi = 24 - INTEGER(IntKi), PARAMETER :: M3N7Axi = 25 - INTEGER(IntKi), PARAMETER :: M3N8Axi = 26 - INTEGER(IntKi), PARAMETER :: M3N9Axi = 27 - INTEGER(IntKi), PARAMETER :: M4N1Axi = 28 - INTEGER(IntKi), PARAMETER :: M4N2Axi = 29 - INTEGER(IntKi), PARAMETER :: M4N3Axi = 30 - INTEGER(IntKi), PARAMETER :: M4N4Axi = 31 - INTEGER(IntKi), PARAMETER :: M4N5Axi = 32 - INTEGER(IntKi), PARAMETER :: M4N6Axi = 33 - INTEGER(IntKi), PARAMETER :: M4N7Axi = 34 - INTEGER(IntKi), PARAMETER :: M4N8Axi = 35 - INTEGER(IntKi), PARAMETER :: M4N9Axi = 36 - INTEGER(IntKi), PARAMETER :: M5N1Axi = 37 - INTEGER(IntKi), PARAMETER :: M5N2Axi = 38 - INTEGER(IntKi), PARAMETER :: M5N3Axi = 39 - INTEGER(IntKi), PARAMETER :: M5N4Axi = 40 - INTEGER(IntKi), PARAMETER :: M5N5Axi = 41 - INTEGER(IntKi), PARAMETER :: M5N6Axi = 42 - INTEGER(IntKi), PARAMETER :: M5N7Axi = 43 - INTEGER(IntKi), PARAMETER :: M5N8Axi = 44 - INTEGER(IntKi), PARAMETER :: M5N9Axi = 45 - INTEGER(IntKi), PARAMETER :: M6N1Axi = 46 - INTEGER(IntKi), PARAMETER :: M6N2Axi = 47 - INTEGER(IntKi), PARAMETER :: M6N3Axi = 48 - INTEGER(IntKi), PARAMETER :: M6N4Axi = 49 - INTEGER(IntKi), PARAMETER :: M6N5Axi = 50 - INTEGER(IntKi), PARAMETER :: M6N6Axi = 51 - INTEGER(IntKi), PARAMETER :: M6N7Axi = 52 - INTEGER(IntKi), PARAMETER :: M6N8Axi = 53 - INTEGER(IntKi), PARAMETER :: M6N9Axi = 54 - INTEGER(IntKi), PARAMETER :: M7N1Axi = 55 - INTEGER(IntKi), PARAMETER :: M7N2Axi = 56 - INTEGER(IntKi), PARAMETER :: M7N3Axi = 57 - INTEGER(IntKi), PARAMETER :: M7N4Axi = 58 - INTEGER(IntKi), PARAMETER :: M7N5Axi = 59 - INTEGER(IntKi), PARAMETER :: M7N6Axi = 60 - INTEGER(IntKi), PARAMETER :: M7N7Axi = 61 - INTEGER(IntKi), PARAMETER :: M7N8Axi = 62 - INTEGER(IntKi), PARAMETER :: M7N9Axi = 63 - INTEGER(IntKi), PARAMETER :: M8N1Axi = 64 - INTEGER(IntKi), PARAMETER :: M8N2Axi = 65 - INTEGER(IntKi), PARAMETER :: M8N3Axi = 66 - INTEGER(IntKi), PARAMETER :: M8N4Axi = 67 - INTEGER(IntKi), PARAMETER :: M8N5Axi = 68 - INTEGER(IntKi), PARAMETER :: M8N6Axi = 69 - INTEGER(IntKi), PARAMETER :: M8N7Axi = 70 - INTEGER(IntKi), PARAMETER :: M8N8Axi = 71 - INTEGER(IntKi), PARAMETER :: M8N9Axi = 72 - INTEGER(IntKi), PARAMETER :: M9N1Axi = 73 - INTEGER(IntKi), PARAMETER :: M9N2Axi = 74 - INTEGER(IntKi), PARAMETER :: M9N3Axi = 75 - INTEGER(IntKi), PARAMETER :: M9N4Axi = 76 - INTEGER(IntKi), PARAMETER :: M9N5Axi = 77 - INTEGER(IntKi), PARAMETER :: M9N6Axi = 78 - INTEGER(IntKi), PARAMETER :: M9N7Axi = 79 - INTEGER(IntKi), PARAMETER :: M9N8Axi = 80 - INTEGER(IntKi), PARAMETER :: M9N9Axi = 81 - INTEGER(IntKi), PARAMETER :: M1N1Ayi = 82 - INTEGER(IntKi), PARAMETER :: M1N2Ayi = 83 - INTEGER(IntKi), PARAMETER :: M1N3Ayi = 84 - INTEGER(IntKi), PARAMETER :: M1N4Ayi = 85 - INTEGER(IntKi), PARAMETER :: M1N5Ayi = 86 - INTEGER(IntKi), PARAMETER :: M1N6Ayi = 87 - INTEGER(IntKi), PARAMETER :: M1N7Ayi = 88 - INTEGER(IntKi), PARAMETER :: M1N8Ayi = 89 - INTEGER(IntKi), PARAMETER :: M1N9Ayi = 90 - INTEGER(IntKi), PARAMETER :: M2N1Ayi = 91 - INTEGER(IntKi), PARAMETER :: M2N2Ayi = 92 - INTEGER(IntKi), PARAMETER :: M2N3Ayi = 93 - INTEGER(IntKi), PARAMETER :: M2N4Ayi = 94 - INTEGER(IntKi), PARAMETER :: M2N5Ayi = 95 - INTEGER(IntKi), PARAMETER :: M2N6Ayi = 96 - INTEGER(IntKi), PARAMETER :: M2N7Ayi = 97 - INTEGER(IntKi), PARAMETER :: M2N8Ayi = 98 - INTEGER(IntKi), PARAMETER :: M2N9Ayi = 99 - INTEGER(IntKi), PARAMETER :: M3N1Ayi = 100 - INTEGER(IntKi), PARAMETER :: M3N2Ayi = 101 - INTEGER(IntKi), PARAMETER :: M3N3Ayi = 102 - INTEGER(IntKi), PARAMETER :: M3N4Ayi = 103 - INTEGER(IntKi), PARAMETER :: M3N5Ayi = 104 - INTEGER(IntKi), PARAMETER :: M3N6Ayi = 105 - INTEGER(IntKi), PARAMETER :: M3N7Ayi = 106 - INTEGER(IntKi), PARAMETER :: M3N8Ayi = 107 - INTEGER(IntKi), PARAMETER :: M3N9Ayi = 108 - INTEGER(IntKi), PARAMETER :: M4N1Ayi = 109 - INTEGER(IntKi), PARAMETER :: M4N2Ayi = 110 - INTEGER(IntKi), PARAMETER :: M4N3Ayi = 111 - INTEGER(IntKi), PARAMETER :: M4N4Ayi = 112 - INTEGER(IntKi), PARAMETER :: M4N5Ayi = 113 - INTEGER(IntKi), PARAMETER :: M4N6Ayi = 114 - INTEGER(IntKi), PARAMETER :: M4N7Ayi = 115 - INTEGER(IntKi), PARAMETER :: M4N8Ayi = 116 - INTEGER(IntKi), PARAMETER :: M4N9Ayi = 117 - INTEGER(IntKi), PARAMETER :: M5N1Ayi = 118 - INTEGER(IntKi), PARAMETER :: M5N2Ayi = 119 - INTEGER(IntKi), PARAMETER :: M5N3Ayi = 120 - INTEGER(IntKi), PARAMETER :: M5N4Ayi = 121 - INTEGER(IntKi), PARAMETER :: M5N5Ayi = 122 - INTEGER(IntKi), PARAMETER :: M5N6Ayi = 123 - INTEGER(IntKi), PARAMETER :: M5N7Ayi = 124 - INTEGER(IntKi), PARAMETER :: M5N8Ayi = 125 - INTEGER(IntKi), PARAMETER :: M5N9Ayi = 126 - INTEGER(IntKi), PARAMETER :: M6N1Ayi = 127 - INTEGER(IntKi), PARAMETER :: M6N2Ayi = 128 - INTEGER(IntKi), PARAMETER :: M6N3Ayi = 129 - INTEGER(IntKi), PARAMETER :: M6N4Ayi = 130 - INTEGER(IntKi), PARAMETER :: M6N5Ayi = 131 - INTEGER(IntKi), PARAMETER :: M6N6Ayi = 132 - INTEGER(IntKi), PARAMETER :: M6N7Ayi = 133 - INTEGER(IntKi), PARAMETER :: M6N8Ayi = 134 - INTEGER(IntKi), PARAMETER :: M6N9Ayi = 135 - INTEGER(IntKi), PARAMETER :: M7N1Ayi = 136 - INTEGER(IntKi), PARAMETER :: M7N2Ayi = 137 - INTEGER(IntKi), PARAMETER :: M7N3Ayi = 138 - INTEGER(IntKi), PARAMETER :: M7N4Ayi = 139 - INTEGER(IntKi), PARAMETER :: M7N5Ayi = 140 - INTEGER(IntKi), PARAMETER :: M7N6Ayi = 141 - INTEGER(IntKi), PARAMETER :: M7N7Ayi = 142 - INTEGER(IntKi), PARAMETER :: M7N8Ayi = 143 - INTEGER(IntKi), PARAMETER :: M7N9Ayi = 144 - INTEGER(IntKi), PARAMETER :: M8N1Ayi = 145 - INTEGER(IntKi), PARAMETER :: M8N2Ayi = 146 - INTEGER(IntKi), PARAMETER :: M8N3Ayi = 147 - INTEGER(IntKi), PARAMETER :: M8N4Ayi = 148 - INTEGER(IntKi), PARAMETER :: M8N5Ayi = 149 - INTEGER(IntKi), PARAMETER :: M8N6Ayi = 150 - INTEGER(IntKi), PARAMETER :: M8N7Ayi = 151 - INTEGER(IntKi), PARAMETER :: M8N8Ayi = 152 - INTEGER(IntKi), PARAMETER :: M8N9Ayi = 153 - INTEGER(IntKi), PARAMETER :: M9N1Ayi = 154 - INTEGER(IntKi), PARAMETER :: M9N2Ayi = 155 - INTEGER(IntKi), PARAMETER :: M9N3Ayi = 156 - INTEGER(IntKi), PARAMETER :: M9N4Ayi = 157 - INTEGER(IntKi), PARAMETER :: M9N5Ayi = 158 - INTEGER(IntKi), PARAMETER :: M9N6Ayi = 159 - INTEGER(IntKi), PARAMETER :: M9N7Ayi = 160 - INTEGER(IntKi), PARAMETER :: M9N8Ayi = 161 - INTEGER(IntKi), PARAMETER :: M9N9Ayi = 162 - INTEGER(IntKi), PARAMETER :: M1N1Azi = 163 - INTEGER(IntKi), PARAMETER :: M1N2Azi = 164 - INTEGER(IntKi), PARAMETER :: M1N3Azi = 165 - INTEGER(IntKi), PARAMETER :: M1N4Azi = 166 - INTEGER(IntKi), PARAMETER :: M1N5Azi = 167 - INTEGER(IntKi), PARAMETER :: M1N6Azi = 168 - INTEGER(IntKi), PARAMETER :: M1N7Azi = 169 - INTEGER(IntKi), PARAMETER :: M1N8Azi = 170 - INTEGER(IntKi), PARAMETER :: M1N9Azi = 171 - INTEGER(IntKi), PARAMETER :: M2N1Azi = 172 - INTEGER(IntKi), PARAMETER :: M2N2Azi = 173 - INTEGER(IntKi), PARAMETER :: M2N3Azi = 174 - INTEGER(IntKi), PARAMETER :: M2N4Azi = 175 - INTEGER(IntKi), PARAMETER :: M2N5Azi = 176 - INTEGER(IntKi), PARAMETER :: M2N6Azi = 177 - INTEGER(IntKi), PARAMETER :: M2N7Azi = 178 - INTEGER(IntKi), PARAMETER :: M2N8Azi = 179 - INTEGER(IntKi), PARAMETER :: M2N9Azi = 180 - INTEGER(IntKi), PARAMETER :: M3N1Azi = 181 - INTEGER(IntKi), PARAMETER :: M3N2Azi = 182 - INTEGER(IntKi), PARAMETER :: M3N3Azi = 183 - INTEGER(IntKi), PARAMETER :: M3N4Azi = 184 - INTEGER(IntKi), PARAMETER :: M3N5Azi = 185 - INTEGER(IntKi), PARAMETER :: M3N6Azi = 186 - INTEGER(IntKi), PARAMETER :: M3N7Azi = 187 - INTEGER(IntKi), PARAMETER :: M3N8Azi = 188 - INTEGER(IntKi), PARAMETER :: M3N9Azi = 189 - INTEGER(IntKi), PARAMETER :: M4N1Azi = 190 - INTEGER(IntKi), PARAMETER :: M4N2Azi = 191 - INTEGER(IntKi), PARAMETER :: M4N3Azi = 192 - INTEGER(IntKi), PARAMETER :: M4N4Azi = 193 - INTEGER(IntKi), PARAMETER :: M4N5Azi = 194 - INTEGER(IntKi), PARAMETER :: M4N6Azi = 195 - INTEGER(IntKi), PARAMETER :: M4N7Azi = 196 - INTEGER(IntKi), PARAMETER :: M4N8Azi = 197 - INTEGER(IntKi), PARAMETER :: M4N9Azi = 198 - INTEGER(IntKi), PARAMETER :: M5N1Azi = 199 - INTEGER(IntKi), PARAMETER :: M5N2Azi = 200 - INTEGER(IntKi), PARAMETER :: M5N3Azi = 201 - INTEGER(IntKi), PARAMETER :: M5N4Azi = 202 - INTEGER(IntKi), PARAMETER :: M5N5Azi = 203 - INTEGER(IntKi), PARAMETER :: M5N6Azi = 204 - INTEGER(IntKi), PARAMETER :: M5N7Azi = 205 - INTEGER(IntKi), PARAMETER :: M5N8Azi = 206 - INTEGER(IntKi), PARAMETER :: M5N9Azi = 207 - INTEGER(IntKi), PARAMETER :: M6N1Azi = 208 - INTEGER(IntKi), PARAMETER :: M6N2Azi = 209 - INTEGER(IntKi), PARAMETER :: M6N3Azi = 210 - INTEGER(IntKi), PARAMETER :: M6N4Azi = 211 - INTEGER(IntKi), PARAMETER :: M6N5Azi = 212 - INTEGER(IntKi), PARAMETER :: M6N6Azi = 213 - INTEGER(IntKi), PARAMETER :: M6N7Azi = 214 - INTEGER(IntKi), PARAMETER :: M6N8Azi = 215 - INTEGER(IntKi), PARAMETER :: M6N9Azi = 216 - INTEGER(IntKi), PARAMETER :: M7N1Azi = 217 - INTEGER(IntKi), PARAMETER :: M7N2Azi = 218 - INTEGER(IntKi), PARAMETER :: M7N3Azi = 219 - INTEGER(IntKi), PARAMETER :: M7N4Azi = 220 - INTEGER(IntKi), PARAMETER :: M7N5Azi = 221 - INTEGER(IntKi), PARAMETER :: M7N6Azi = 222 - INTEGER(IntKi), PARAMETER :: M7N7Azi = 223 - INTEGER(IntKi), PARAMETER :: M7N8Azi = 224 - INTEGER(IntKi), PARAMETER :: M7N9Azi = 225 - INTEGER(IntKi), PARAMETER :: M8N1Azi = 226 - INTEGER(IntKi), PARAMETER :: M8N2Azi = 227 - INTEGER(IntKi), PARAMETER :: M8N3Azi = 228 - INTEGER(IntKi), PARAMETER :: M8N4Azi = 229 - INTEGER(IntKi), PARAMETER :: M8N5Azi = 230 - INTEGER(IntKi), PARAMETER :: M8N6Azi = 231 - INTEGER(IntKi), PARAMETER :: M8N7Azi = 232 - INTEGER(IntKi), PARAMETER :: M8N8Azi = 233 - INTEGER(IntKi), PARAMETER :: M8N9Azi = 234 - INTEGER(IntKi), PARAMETER :: M9N1Azi = 235 - INTEGER(IntKi), PARAMETER :: M9N2Azi = 236 - INTEGER(IntKi), PARAMETER :: M9N3Azi = 237 - INTEGER(IntKi), PARAMETER :: M9N4Azi = 238 - INTEGER(IntKi), PARAMETER :: M9N5Azi = 239 - INTEGER(IntKi), PARAMETER :: M9N6Azi = 240 - INTEGER(IntKi), PARAMETER :: M9N7Azi = 241 - INTEGER(IntKi), PARAMETER :: M9N8Azi = 242 - INTEGER(IntKi), PARAMETER :: M9N9Azi = 243 - INTEGER(IntKi), PARAMETER :: M1N1Vxi = 244 - INTEGER(IntKi), PARAMETER :: M1N2Vxi = 245 - INTEGER(IntKi), PARAMETER :: M1N3Vxi = 246 - INTEGER(IntKi), PARAMETER :: M1N4Vxi = 247 - INTEGER(IntKi), PARAMETER :: M1N5Vxi = 248 - INTEGER(IntKi), PARAMETER :: M1N6Vxi = 249 - INTEGER(IntKi), PARAMETER :: M1N7Vxi = 250 - INTEGER(IntKi), PARAMETER :: M1N8Vxi = 251 - INTEGER(IntKi), PARAMETER :: M1N9Vxi = 252 - INTEGER(IntKi), PARAMETER :: M2N1Vxi = 253 - INTEGER(IntKi), PARAMETER :: M2N2Vxi = 254 - INTEGER(IntKi), PARAMETER :: M2N3Vxi = 255 - INTEGER(IntKi), PARAMETER :: M2N4Vxi = 256 - INTEGER(IntKi), PARAMETER :: M2N5Vxi = 257 - INTEGER(IntKi), PARAMETER :: M2N6Vxi = 258 - INTEGER(IntKi), PARAMETER :: M2N7Vxi = 259 - INTEGER(IntKi), PARAMETER :: M2N8Vxi = 260 - INTEGER(IntKi), PARAMETER :: M2N9Vxi = 261 - INTEGER(IntKi), PARAMETER :: M3N1Vxi = 262 - INTEGER(IntKi), PARAMETER :: M3N2Vxi = 263 - INTEGER(IntKi), PARAMETER :: M3N3Vxi = 264 - INTEGER(IntKi), PARAMETER :: M3N4Vxi = 265 - INTEGER(IntKi), PARAMETER :: M3N5Vxi = 266 - INTEGER(IntKi), PARAMETER :: M3N6Vxi = 267 - INTEGER(IntKi), PARAMETER :: M3N7Vxi = 268 - INTEGER(IntKi), PARAMETER :: M3N8Vxi = 269 - INTEGER(IntKi), PARAMETER :: M3N9Vxi = 270 - INTEGER(IntKi), PARAMETER :: M4N1Vxi = 271 - INTEGER(IntKi), PARAMETER :: M4N2Vxi = 272 - INTEGER(IntKi), PARAMETER :: M4N3Vxi = 273 - INTEGER(IntKi), PARAMETER :: M4N4Vxi = 274 - INTEGER(IntKi), PARAMETER :: M4N5Vxi = 275 - INTEGER(IntKi), PARAMETER :: M4N6Vxi = 276 - INTEGER(IntKi), PARAMETER :: M4N7Vxi = 277 - INTEGER(IntKi), PARAMETER :: M4N8Vxi = 278 - INTEGER(IntKi), PARAMETER :: M4N9Vxi = 279 - INTEGER(IntKi), PARAMETER :: M5N1Vxi = 280 - INTEGER(IntKi), PARAMETER :: M5N2Vxi = 281 - INTEGER(IntKi), PARAMETER :: M5N3Vxi = 282 - INTEGER(IntKi), PARAMETER :: M5N4Vxi = 283 - INTEGER(IntKi), PARAMETER :: M5N5Vxi = 284 - INTEGER(IntKi), PARAMETER :: M5N6Vxi = 285 - INTEGER(IntKi), PARAMETER :: M5N7Vxi = 286 - INTEGER(IntKi), PARAMETER :: M5N8Vxi = 287 - INTEGER(IntKi), PARAMETER :: M5N9Vxi = 288 - INTEGER(IntKi), PARAMETER :: M6N1Vxi = 289 - INTEGER(IntKi), PARAMETER :: M6N2Vxi = 290 - INTEGER(IntKi), PARAMETER :: M6N3Vxi = 291 - INTEGER(IntKi), PARAMETER :: M6N4Vxi = 292 - INTEGER(IntKi), PARAMETER :: M6N5Vxi = 293 - INTEGER(IntKi), PARAMETER :: M6N6Vxi = 294 - INTEGER(IntKi), PARAMETER :: M6N7Vxi = 295 - INTEGER(IntKi), PARAMETER :: M6N8Vxi = 296 - INTEGER(IntKi), PARAMETER :: M6N9Vxi = 297 - INTEGER(IntKi), PARAMETER :: M7N1Vxi = 298 - INTEGER(IntKi), PARAMETER :: M7N2Vxi = 299 - INTEGER(IntKi), PARAMETER :: M7N3Vxi = 300 - INTEGER(IntKi), PARAMETER :: M7N4Vxi = 301 - INTEGER(IntKi), PARAMETER :: M7N5Vxi = 302 - INTEGER(IntKi), PARAMETER :: M7N6Vxi = 303 - INTEGER(IntKi), PARAMETER :: M7N7Vxi = 304 - INTEGER(IntKi), PARAMETER :: M7N8Vxi = 305 - INTEGER(IntKi), PARAMETER :: M7N9Vxi = 306 - INTEGER(IntKi), PARAMETER :: M8N1Vxi = 307 - INTEGER(IntKi), PARAMETER :: M8N2Vxi = 308 - INTEGER(IntKi), PARAMETER :: M8N3Vxi = 309 - INTEGER(IntKi), PARAMETER :: M8N4Vxi = 310 - INTEGER(IntKi), PARAMETER :: M8N5Vxi = 311 - INTEGER(IntKi), PARAMETER :: M8N6Vxi = 312 - INTEGER(IntKi), PARAMETER :: M8N7Vxi = 313 - INTEGER(IntKi), PARAMETER :: M8N8Vxi = 314 - INTEGER(IntKi), PARAMETER :: M8N9Vxi = 315 - INTEGER(IntKi), PARAMETER :: M9N1Vxi = 316 - INTEGER(IntKi), PARAMETER :: M9N2Vxi = 317 - INTEGER(IntKi), PARAMETER :: M9N3Vxi = 318 - INTEGER(IntKi), PARAMETER :: M9N4Vxi = 319 - INTEGER(IntKi), PARAMETER :: M9N5Vxi = 320 - INTEGER(IntKi), PARAMETER :: M9N6Vxi = 321 - INTEGER(IntKi), PARAMETER :: M9N7Vxi = 322 - INTEGER(IntKi), PARAMETER :: M9N8Vxi = 323 - INTEGER(IntKi), PARAMETER :: M9N9Vxi = 324 - INTEGER(IntKi), PARAMETER :: M1N1Vyi = 325 - INTEGER(IntKi), PARAMETER :: M1N2Vyi = 326 - INTEGER(IntKi), PARAMETER :: M1N3Vyi = 327 - INTEGER(IntKi), PARAMETER :: M1N4Vyi = 328 - INTEGER(IntKi), PARAMETER :: M1N5Vyi = 329 - INTEGER(IntKi), PARAMETER :: M1N6Vyi = 330 - INTEGER(IntKi), PARAMETER :: M1N7Vyi = 331 - INTEGER(IntKi), PARAMETER :: M1N8Vyi = 332 - INTEGER(IntKi), PARAMETER :: M1N9Vyi = 333 - INTEGER(IntKi), PARAMETER :: M2N1Vyi = 334 - INTEGER(IntKi), PARAMETER :: M2N2Vyi = 335 - INTEGER(IntKi), PARAMETER :: M2N3Vyi = 336 - INTEGER(IntKi), PARAMETER :: M2N4Vyi = 337 - INTEGER(IntKi), PARAMETER :: M2N5Vyi = 338 - INTEGER(IntKi), PARAMETER :: M2N6Vyi = 339 - INTEGER(IntKi), PARAMETER :: M2N7Vyi = 340 - INTEGER(IntKi), PARAMETER :: M2N8Vyi = 341 - INTEGER(IntKi), PARAMETER :: M2N9Vyi = 342 - INTEGER(IntKi), PARAMETER :: M3N1Vyi = 343 - INTEGER(IntKi), PARAMETER :: M3N2Vyi = 344 - INTEGER(IntKi), PARAMETER :: M3N3Vyi = 345 - INTEGER(IntKi), PARAMETER :: M3N4Vyi = 346 - INTEGER(IntKi), PARAMETER :: M3N5Vyi = 347 - INTEGER(IntKi), PARAMETER :: M3N6Vyi = 348 - INTEGER(IntKi), PARAMETER :: M3N7Vyi = 349 - INTEGER(IntKi), PARAMETER :: M3N8Vyi = 350 - INTEGER(IntKi), PARAMETER :: M3N9Vyi = 351 - INTEGER(IntKi), PARAMETER :: M4N1Vyi = 352 - INTEGER(IntKi), PARAMETER :: M4N2Vyi = 353 - INTEGER(IntKi), PARAMETER :: M4N3Vyi = 354 - INTEGER(IntKi), PARAMETER :: M4N4Vyi = 355 - INTEGER(IntKi), PARAMETER :: M4N5Vyi = 356 - INTEGER(IntKi), PARAMETER :: M4N6Vyi = 357 - INTEGER(IntKi), PARAMETER :: M4N7Vyi = 358 - INTEGER(IntKi), PARAMETER :: M4N8Vyi = 359 - INTEGER(IntKi), PARAMETER :: M4N9Vyi = 360 - INTEGER(IntKi), PARAMETER :: M5N1Vyi = 361 - INTEGER(IntKi), PARAMETER :: M5N2Vyi = 362 - INTEGER(IntKi), PARAMETER :: M5N3Vyi = 363 - INTEGER(IntKi), PARAMETER :: M5N4Vyi = 364 - INTEGER(IntKi), PARAMETER :: M5N5Vyi = 365 - INTEGER(IntKi), PARAMETER :: M5N6Vyi = 366 - INTEGER(IntKi), PARAMETER :: M5N7Vyi = 367 - INTEGER(IntKi), PARAMETER :: M5N8Vyi = 368 - INTEGER(IntKi), PARAMETER :: M5N9Vyi = 369 - INTEGER(IntKi), PARAMETER :: M6N1Vyi = 370 - INTEGER(IntKi), PARAMETER :: M6N2Vyi = 371 - INTEGER(IntKi), PARAMETER :: M6N3Vyi = 372 - INTEGER(IntKi), PARAMETER :: M6N4Vyi = 373 - INTEGER(IntKi), PARAMETER :: M6N5Vyi = 374 - INTEGER(IntKi), PARAMETER :: M6N6Vyi = 375 - INTEGER(IntKi), PARAMETER :: M6N7Vyi = 376 - INTEGER(IntKi), PARAMETER :: M6N8Vyi = 377 - INTEGER(IntKi), PARAMETER :: M6N9Vyi = 378 - INTEGER(IntKi), PARAMETER :: M7N1Vyi = 379 - INTEGER(IntKi), PARAMETER :: M7N2Vyi = 380 - INTEGER(IntKi), PARAMETER :: M7N3Vyi = 381 - INTEGER(IntKi), PARAMETER :: M7N4Vyi = 382 - INTEGER(IntKi), PARAMETER :: M7N5Vyi = 383 - INTEGER(IntKi), PARAMETER :: M7N6Vyi = 384 - INTEGER(IntKi), PARAMETER :: M7N7Vyi = 385 - INTEGER(IntKi), PARAMETER :: M7N8Vyi = 386 - INTEGER(IntKi), PARAMETER :: M7N9Vyi = 387 - INTEGER(IntKi), PARAMETER :: M8N1Vyi = 388 - INTEGER(IntKi), PARAMETER :: M8N2Vyi = 389 - INTEGER(IntKi), PARAMETER :: M8N3Vyi = 390 - INTEGER(IntKi), PARAMETER :: M8N4Vyi = 391 - INTEGER(IntKi), PARAMETER :: M8N5Vyi = 392 - INTEGER(IntKi), PARAMETER :: M8N6Vyi = 393 - INTEGER(IntKi), PARAMETER :: M8N7Vyi = 394 - INTEGER(IntKi), PARAMETER :: M8N8Vyi = 395 - INTEGER(IntKi), PARAMETER :: M8N9Vyi = 396 - INTEGER(IntKi), PARAMETER :: M9N1Vyi = 397 - INTEGER(IntKi), PARAMETER :: M9N2Vyi = 398 - INTEGER(IntKi), PARAMETER :: M9N3Vyi = 399 - INTEGER(IntKi), PARAMETER :: M9N4Vyi = 400 - INTEGER(IntKi), PARAMETER :: M9N5Vyi = 401 - INTEGER(IntKi), PARAMETER :: M9N6Vyi = 402 - INTEGER(IntKi), PARAMETER :: M9N7Vyi = 403 - INTEGER(IntKi), PARAMETER :: M9N8Vyi = 404 - INTEGER(IntKi), PARAMETER :: M9N9Vyi = 405 - INTEGER(IntKi), PARAMETER :: M1N1Vzi = 406 - INTEGER(IntKi), PARAMETER :: M1N2Vzi = 407 - INTEGER(IntKi), PARAMETER :: M1N3Vzi = 408 - INTEGER(IntKi), PARAMETER :: M1N4Vzi = 409 - INTEGER(IntKi), PARAMETER :: M1N5Vzi = 410 - INTEGER(IntKi), PARAMETER :: M1N6Vzi = 411 - INTEGER(IntKi), PARAMETER :: M1N7Vzi = 412 - INTEGER(IntKi), PARAMETER :: M1N8Vzi = 413 - INTEGER(IntKi), PARAMETER :: M1N9Vzi = 414 - INTEGER(IntKi), PARAMETER :: M2N1Vzi = 415 - INTEGER(IntKi), PARAMETER :: M2N2Vzi = 416 - INTEGER(IntKi), PARAMETER :: M2N3Vzi = 417 - INTEGER(IntKi), PARAMETER :: M2N4Vzi = 418 - INTEGER(IntKi), PARAMETER :: M2N5Vzi = 419 - INTEGER(IntKi), PARAMETER :: M2N6Vzi = 420 - INTEGER(IntKi), PARAMETER :: M2N7Vzi = 421 - INTEGER(IntKi), PARAMETER :: M2N8Vzi = 422 - INTEGER(IntKi), PARAMETER :: M2N9Vzi = 423 - INTEGER(IntKi), PARAMETER :: M3N1Vzi = 424 - INTEGER(IntKi), PARAMETER :: M3N2Vzi = 425 - INTEGER(IntKi), PARAMETER :: M3N3Vzi = 426 - INTEGER(IntKi), PARAMETER :: M3N4Vzi = 427 - INTEGER(IntKi), PARAMETER :: M3N5Vzi = 428 - INTEGER(IntKi), PARAMETER :: M3N6Vzi = 429 - INTEGER(IntKi), PARAMETER :: M3N7Vzi = 430 - INTEGER(IntKi), PARAMETER :: M3N8Vzi = 431 - INTEGER(IntKi), PARAMETER :: M3N9Vzi = 432 - INTEGER(IntKi), PARAMETER :: M4N1Vzi = 433 - INTEGER(IntKi), PARAMETER :: M4N2Vzi = 434 - INTEGER(IntKi), PARAMETER :: M4N3Vzi = 435 - INTEGER(IntKi), PARAMETER :: M4N4Vzi = 436 - INTEGER(IntKi), PARAMETER :: M4N5Vzi = 437 - INTEGER(IntKi), PARAMETER :: M4N6Vzi = 438 - INTEGER(IntKi), PARAMETER :: M4N7Vzi = 439 - INTEGER(IntKi), PARAMETER :: M4N8Vzi = 440 - INTEGER(IntKi), PARAMETER :: M4N9Vzi = 441 - INTEGER(IntKi), PARAMETER :: M5N1Vzi = 442 - INTEGER(IntKi), PARAMETER :: M5N2Vzi = 443 - INTEGER(IntKi), PARAMETER :: M5N3Vzi = 444 - INTEGER(IntKi), PARAMETER :: M5N4Vzi = 445 - INTEGER(IntKi), PARAMETER :: M5N5Vzi = 446 - INTEGER(IntKi), PARAMETER :: M5N6Vzi = 447 - INTEGER(IntKi), PARAMETER :: M5N7Vzi = 448 - INTEGER(IntKi), PARAMETER :: M5N8Vzi = 449 - INTEGER(IntKi), PARAMETER :: M5N9Vzi = 450 - INTEGER(IntKi), PARAMETER :: M6N1Vzi = 451 - INTEGER(IntKi), PARAMETER :: M6N2Vzi = 452 - INTEGER(IntKi), PARAMETER :: M6N3Vzi = 453 - INTEGER(IntKi), PARAMETER :: M6N4Vzi = 454 - INTEGER(IntKi), PARAMETER :: M6N5Vzi = 455 - INTEGER(IntKi), PARAMETER :: M6N6Vzi = 456 - INTEGER(IntKi), PARAMETER :: M6N7Vzi = 457 - INTEGER(IntKi), PARAMETER :: M6N8Vzi = 458 - INTEGER(IntKi), PARAMETER :: M6N9Vzi = 459 - INTEGER(IntKi), PARAMETER :: M7N1Vzi = 460 - INTEGER(IntKi), PARAMETER :: M7N2Vzi = 461 - INTEGER(IntKi), PARAMETER :: M7N3Vzi = 462 - INTEGER(IntKi), PARAMETER :: M7N4Vzi = 463 - INTEGER(IntKi), PARAMETER :: M7N5Vzi = 464 - INTEGER(IntKi), PARAMETER :: M7N6Vzi = 465 - INTEGER(IntKi), PARAMETER :: M7N7Vzi = 466 - INTEGER(IntKi), PARAMETER :: M7N8Vzi = 467 - INTEGER(IntKi), PARAMETER :: M7N9Vzi = 468 - INTEGER(IntKi), PARAMETER :: M8N1Vzi = 469 - INTEGER(IntKi), PARAMETER :: M8N2Vzi = 470 - INTEGER(IntKi), PARAMETER :: M8N3Vzi = 471 - INTEGER(IntKi), PARAMETER :: M8N4Vzi = 472 - INTEGER(IntKi), PARAMETER :: M8N5Vzi = 473 - INTEGER(IntKi), PARAMETER :: M8N6Vzi = 474 - INTEGER(IntKi), PARAMETER :: M8N7Vzi = 475 - INTEGER(IntKi), PARAMETER :: M8N8Vzi = 476 - INTEGER(IntKi), PARAMETER :: M8N9Vzi = 477 - INTEGER(IntKi), PARAMETER :: M9N1Vzi = 478 - INTEGER(IntKi), PARAMETER :: M9N2Vzi = 479 - INTEGER(IntKi), PARAMETER :: M9N3Vzi = 480 - INTEGER(IntKi), PARAMETER :: M9N4Vzi = 481 - INTEGER(IntKi), PARAMETER :: M9N5Vzi = 482 - INTEGER(IntKi), PARAMETER :: M9N6Vzi = 483 - INTEGER(IntKi), PARAMETER :: M9N7Vzi = 484 - INTEGER(IntKi), PARAMETER :: M9N8Vzi = 485 - INTEGER(IntKi), PARAMETER :: M9N9Vzi = 486 - INTEGER(IntKi), PARAMETER :: M1N1DynP = 487 - INTEGER(IntKi), PARAMETER :: M1N2DynP = 488 - INTEGER(IntKi), PARAMETER :: M1N3DynP = 489 - INTEGER(IntKi), PARAMETER :: M1N4DynP = 490 - INTEGER(IntKi), PARAMETER :: M1N5DynP = 491 - INTEGER(IntKi), PARAMETER :: M1N6DynP = 492 - INTEGER(IntKi), PARAMETER :: M1N7DynP = 493 - INTEGER(IntKi), PARAMETER :: M1N8DynP = 494 - INTEGER(IntKi), PARAMETER :: M1N9DynP = 495 - INTEGER(IntKi), PARAMETER :: M2N1DynP = 496 - INTEGER(IntKi), PARAMETER :: M2N2DynP = 497 - INTEGER(IntKi), PARAMETER :: M2N3DynP = 498 - INTEGER(IntKi), PARAMETER :: M2N4DynP = 499 - INTEGER(IntKi), PARAMETER :: M2N5DynP = 500 - INTEGER(IntKi), PARAMETER :: M2N6DynP = 501 - INTEGER(IntKi), PARAMETER :: M2N7DynP = 502 - INTEGER(IntKi), PARAMETER :: M2N8DynP = 503 - INTEGER(IntKi), PARAMETER :: M2N9DynP = 504 - INTEGER(IntKi), PARAMETER :: M3N1DynP = 505 - INTEGER(IntKi), PARAMETER :: M3N2DynP = 506 - INTEGER(IntKi), PARAMETER :: M3N3DynP = 507 - INTEGER(IntKi), PARAMETER :: M3N4DynP = 508 - INTEGER(IntKi), PARAMETER :: M3N5DynP = 509 - INTEGER(IntKi), PARAMETER :: M3N6DynP = 510 - INTEGER(IntKi), PARAMETER :: M3N7DynP = 511 - INTEGER(IntKi), PARAMETER :: M3N8DynP = 512 - INTEGER(IntKi), PARAMETER :: M3N9DynP = 513 - INTEGER(IntKi), PARAMETER :: M4N1DynP = 514 - INTEGER(IntKi), PARAMETER :: M4N2DynP = 515 - INTEGER(IntKi), PARAMETER :: M4N3DynP = 516 - INTEGER(IntKi), PARAMETER :: M4N4DynP = 517 - INTEGER(IntKi), PARAMETER :: M4N5DynP = 518 - INTEGER(IntKi), PARAMETER :: M4N6DynP = 519 - INTEGER(IntKi), PARAMETER :: M4N7DynP = 520 - INTEGER(IntKi), PARAMETER :: M4N8DynP = 521 - INTEGER(IntKi), PARAMETER :: M4N9DynP = 522 - INTEGER(IntKi), PARAMETER :: M5N1DynP = 523 - INTEGER(IntKi), PARAMETER :: M5N2DynP = 524 - INTEGER(IntKi), PARAMETER :: M5N3DynP = 525 - INTEGER(IntKi), PARAMETER :: M5N4DynP = 526 - INTEGER(IntKi), PARAMETER :: M5N5DynP = 527 - INTEGER(IntKi), PARAMETER :: M5N6DynP = 528 - INTEGER(IntKi), PARAMETER :: M5N7DynP = 529 - INTEGER(IntKi), PARAMETER :: M5N8DynP = 530 - INTEGER(IntKi), PARAMETER :: M5N9DynP = 531 - INTEGER(IntKi), PARAMETER :: M6N1DynP = 532 - INTEGER(IntKi), PARAMETER :: M6N2DynP = 533 - INTEGER(IntKi), PARAMETER :: M6N3DynP = 534 - INTEGER(IntKi), PARAMETER :: M6N4DynP = 535 - INTEGER(IntKi), PARAMETER :: M6N5DynP = 536 - INTEGER(IntKi), PARAMETER :: M6N6DynP = 537 - INTEGER(IntKi), PARAMETER :: M6N7DynP = 538 - INTEGER(IntKi), PARAMETER :: M6N8DynP = 539 - INTEGER(IntKi), PARAMETER :: M6N9DynP = 540 - INTEGER(IntKi), PARAMETER :: M7N1DynP = 541 - INTEGER(IntKi), PARAMETER :: M7N2DynP = 542 - INTEGER(IntKi), PARAMETER :: M7N3DynP = 543 - INTEGER(IntKi), PARAMETER :: M7N4DynP = 544 - INTEGER(IntKi), PARAMETER :: M7N5DynP = 545 - INTEGER(IntKi), PARAMETER :: M7N6DynP = 546 - INTEGER(IntKi), PARAMETER :: M7N7DynP = 547 - INTEGER(IntKi), PARAMETER :: M7N8DynP = 548 - INTEGER(IntKi), PARAMETER :: M7N9DynP = 549 - INTEGER(IntKi), PARAMETER :: M8N1DynP = 550 - INTEGER(IntKi), PARAMETER :: M8N2DynP = 551 - INTEGER(IntKi), PARAMETER :: M8N3DynP = 552 - INTEGER(IntKi), PARAMETER :: M8N4DynP = 553 - INTEGER(IntKi), PARAMETER :: M8N5DynP = 554 - INTEGER(IntKi), PARAMETER :: M8N6DynP = 555 - INTEGER(IntKi), PARAMETER :: M8N7DynP = 556 - INTEGER(IntKi), PARAMETER :: M8N8DynP = 557 - INTEGER(IntKi), PARAMETER :: M8N9DynP = 558 - INTEGER(IntKi), PARAMETER :: M9N1DynP = 559 - INTEGER(IntKi), PARAMETER :: M9N2DynP = 560 - INTEGER(IntKi), PARAMETER :: M9N3DynP = 561 - INTEGER(IntKi), PARAMETER :: M9N4DynP = 562 - INTEGER(IntKi), PARAMETER :: M9N5DynP = 563 - INTEGER(IntKi), PARAMETER :: M9N6DynP = 564 - INTEGER(IntKi), PARAMETER :: M9N7DynP = 565 - INTEGER(IntKi), PARAMETER :: M9N8DynP = 566 - INTEGER(IntKi), PARAMETER :: M9N9DynP = 567 - INTEGER(IntKi), PARAMETER :: M1N1STVxi = 568 - INTEGER(IntKi), PARAMETER :: M1N2STVxi = 569 - INTEGER(IntKi), PARAMETER :: M1N3STVxi = 570 - INTEGER(IntKi), PARAMETER :: M1N4STVxi = 571 - INTEGER(IntKi), PARAMETER :: M1N5STVxi = 572 - INTEGER(IntKi), PARAMETER :: M1N6STVxi = 573 - INTEGER(IntKi), PARAMETER :: M1N7STVxi = 574 - INTEGER(IntKi), PARAMETER :: M1N8STVxi = 575 - INTEGER(IntKi), PARAMETER :: M1N9STVxi = 576 - INTEGER(IntKi), PARAMETER :: M2N1STVxi = 577 - INTEGER(IntKi), PARAMETER :: M2N2STVxi = 578 - INTEGER(IntKi), PARAMETER :: M2N3STVxi = 579 - INTEGER(IntKi), PARAMETER :: M2N4STVxi = 580 - INTEGER(IntKi), PARAMETER :: M2N5STVxi = 581 - INTEGER(IntKi), PARAMETER :: M2N6STVxi = 582 - INTEGER(IntKi), PARAMETER :: M2N7STVxi = 583 - INTEGER(IntKi), PARAMETER :: M2N8STVxi = 584 - INTEGER(IntKi), PARAMETER :: M2N9STVxi = 585 - INTEGER(IntKi), PARAMETER :: M3N1STVxi = 586 - INTEGER(IntKi), PARAMETER :: M3N2STVxi = 587 - INTEGER(IntKi), PARAMETER :: M3N3STVxi = 588 - INTEGER(IntKi), PARAMETER :: M3N4STVxi = 589 - INTEGER(IntKi), PARAMETER :: M3N5STVxi = 590 - INTEGER(IntKi), PARAMETER :: M3N6STVxi = 591 - INTEGER(IntKi), PARAMETER :: M3N7STVxi = 592 - INTEGER(IntKi), PARAMETER :: M3N8STVxi = 593 - INTEGER(IntKi), PARAMETER :: M3N9STVxi = 594 - INTEGER(IntKi), PARAMETER :: M4N1STVxi = 595 - INTEGER(IntKi), PARAMETER :: M4N2STVxi = 596 - INTEGER(IntKi), PARAMETER :: M4N3STVxi = 597 - INTEGER(IntKi), PARAMETER :: M4N4STVxi = 598 - INTEGER(IntKi), PARAMETER :: M4N5STVxi = 599 - INTEGER(IntKi), PARAMETER :: M4N6STVxi = 600 - INTEGER(IntKi), PARAMETER :: M4N7STVxi = 601 - INTEGER(IntKi), PARAMETER :: M4N8STVxi = 602 - INTEGER(IntKi), PARAMETER :: M4N9STVxi = 603 - INTEGER(IntKi), PARAMETER :: M5N1STVxi = 604 - INTEGER(IntKi), PARAMETER :: M5N2STVxi = 605 - INTEGER(IntKi), PARAMETER :: M5N3STVxi = 606 - INTEGER(IntKi), PARAMETER :: M5N4STVxi = 607 - INTEGER(IntKi), PARAMETER :: M5N5STVxi = 608 - INTEGER(IntKi), PARAMETER :: M5N6STVxi = 609 - INTEGER(IntKi), PARAMETER :: M5N7STVxi = 610 - INTEGER(IntKi), PARAMETER :: M5N8STVxi = 611 - INTEGER(IntKi), PARAMETER :: M5N9STVxi = 612 - INTEGER(IntKi), PARAMETER :: M6N1STVxi = 613 - INTEGER(IntKi), PARAMETER :: M6N2STVxi = 614 - INTEGER(IntKi), PARAMETER :: M6N3STVxi = 615 - INTEGER(IntKi), PARAMETER :: M6N4STVxi = 616 - INTEGER(IntKi), PARAMETER :: M6N5STVxi = 617 - INTEGER(IntKi), PARAMETER :: M6N6STVxi = 618 - INTEGER(IntKi), PARAMETER :: M6N7STVxi = 619 - INTEGER(IntKi), PARAMETER :: M6N8STVxi = 620 - INTEGER(IntKi), PARAMETER :: M6N9STVxi = 621 - INTEGER(IntKi), PARAMETER :: M7N1STVxi = 622 - INTEGER(IntKi), PARAMETER :: M7N2STVxi = 623 - INTEGER(IntKi), PARAMETER :: M7N3STVxi = 624 - INTEGER(IntKi), PARAMETER :: M7N4STVxi = 625 - INTEGER(IntKi), PARAMETER :: M7N5STVxi = 626 - INTEGER(IntKi), PARAMETER :: M7N6STVxi = 627 - INTEGER(IntKi), PARAMETER :: M7N7STVxi = 628 - INTEGER(IntKi), PARAMETER :: M7N8STVxi = 629 - INTEGER(IntKi), PARAMETER :: M7N9STVxi = 630 - INTEGER(IntKi), PARAMETER :: M8N1STVxi = 631 - INTEGER(IntKi), PARAMETER :: M8N2STVxi = 632 - INTEGER(IntKi), PARAMETER :: M8N3STVxi = 633 - INTEGER(IntKi), PARAMETER :: M8N4STVxi = 634 - INTEGER(IntKi), PARAMETER :: M8N5STVxi = 635 - INTEGER(IntKi), PARAMETER :: M8N6STVxi = 636 - INTEGER(IntKi), PARAMETER :: M8N7STVxi = 637 - INTEGER(IntKi), PARAMETER :: M8N8STVxi = 638 - INTEGER(IntKi), PARAMETER :: M8N9STVxi = 639 - INTEGER(IntKi), PARAMETER :: M9N1STVxi = 640 - INTEGER(IntKi), PARAMETER :: M9N2STVxi = 641 - INTEGER(IntKi), PARAMETER :: M9N3STVxi = 642 - INTEGER(IntKi), PARAMETER :: M9N4STVxi = 643 - INTEGER(IntKi), PARAMETER :: M9N5STVxi = 644 - INTEGER(IntKi), PARAMETER :: M9N6STVxi = 645 - INTEGER(IntKi), PARAMETER :: M9N7STVxi = 646 - INTEGER(IntKi), PARAMETER :: M9N8STVxi = 647 - INTEGER(IntKi), PARAMETER :: M9N9STVxi = 648 - INTEGER(IntKi), PARAMETER :: M1N1STVyi = 649 - INTEGER(IntKi), PARAMETER :: M1N2STVyi = 650 - INTEGER(IntKi), PARAMETER :: M1N3STVyi = 651 - INTEGER(IntKi), PARAMETER :: M1N4STVyi = 652 - INTEGER(IntKi), PARAMETER :: M1N5STVyi = 653 - INTEGER(IntKi), PARAMETER :: M1N6STVyi = 654 - INTEGER(IntKi), PARAMETER :: M1N7STVyi = 655 - INTEGER(IntKi), PARAMETER :: M1N8STVyi = 656 - INTEGER(IntKi), PARAMETER :: M1N9STVyi = 657 - INTEGER(IntKi), PARAMETER :: M2N1STVyi = 658 - INTEGER(IntKi), PARAMETER :: M2N2STVyi = 659 - INTEGER(IntKi), PARAMETER :: M2N3STVyi = 660 - INTEGER(IntKi), PARAMETER :: M2N4STVyi = 661 - INTEGER(IntKi), PARAMETER :: M2N5STVyi = 662 - INTEGER(IntKi), PARAMETER :: M2N6STVyi = 663 - INTEGER(IntKi), PARAMETER :: M2N7STVyi = 664 - INTEGER(IntKi), PARAMETER :: M2N8STVyi = 665 - INTEGER(IntKi), PARAMETER :: M2N9STVyi = 666 - INTEGER(IntKi), PARAMETER :: M3N1STVyi = 667 - INTEGER(IntKi), PARAMETER :: M3N2STVyi = 668 - INTEGER(IntKi), PARAMETER :: M3N3STVyi = 669 - INTEGER(IntKi), PARAMETER :: M3N4STVyi = 670 - INTEGER(IntKi), PARAMETER :: M3N5STVyi = 671 - INTEGER(IntKi), PARAMETER :: M3N6STVyi = 672 - INTEGER(IntKi), PARAMETER :: M3N7STVyi = 673 - INTEGER(IntKi), PARAMETER :: M3N8STVyi = 674 - INTEGER(IntKi), PARAMETER :: M3N9STVyi = 675 - INTEGER(IntKi), PARAMETER :: M4N1STVyi = 676 - INTEGER(IntKi), PARAMETER :: M4N2STVyi = 677 - INTEGER(IntKi), PARAMETER :: M4N3STVyi = 678 - INTEGER(IntKi), PARAMETER :: M4N4STVyi = 679 - INTEGER(IntKi), PARAMETER :: M4N5STVyi = 680 - INTEGER(IntKi), PARAMETER :: M4N6STVyi = 681 - INTEGER(IntKi), PARAMETER :: M4N7STVyi = 682 - INTEGER(IntKi), PARAMETER :: M4N8STVyi = 683 - INTEGER(IntKi), PARAMETER :: M4N9STVyi = 684 - INTEGER(IntKi), PARAMETER :: M5N1STVyi = 685 - INTEGER(IntKi), PARAMETER :: M5N2STVyi = 686 - INTEGER(IntKi), PARAMETER :: M5N3STVyi = 687 - INTEGER(IntKi), PARAMETER :: M5N4STVyi = 688 - INTEGER(IntKi), PARAMETER :: M5N5STVyi = 689 - INTEGER(IntKi), PARAMETER :: M5N6STVyi = 690 - INTEGER(IntKi), PARAMETER :: M5N7STVyi = 691 - INTEGER(IntKi), PARAMETER :: M5N8STVyi = 692 - INTEGER(IntKi), PARAMETER :: M5N9STVyi = 693 - INTEGER(IntKi), PARAMETER :: M6N1STVyi = 694 - INTEGER(IntKi), PARAMETER :: M6N2STVyi = 695 - INTEGER(IntKi), PARAMETER :: M6N3STVyi = 696 - INTEGER(IntKi), PARAMETER :: M6N4STVyi = 697 - INTEGER(IntKi), PARAMETER :: M6N5STVyi = 698 - INTEGER(IntKi), PARAMETER :: M6N6STVyi = 699 - INTEGER(IntKi), PARAMETER :: M6N7STVyi = 700 - INTEGER(IntKi), PARAMETER :: M6N8STVyi = 701 - INTEGER(IntKi), PARAMETER :: M6N9STVyi = 702 - INTEGER(IntKi), PARAMETER :: M7N1STVyi = 703 - INTEGER(IntKi), PARAMETER :: M7N2STVyi = 704 - INTEGER(IntKi), PARAMETER :: M7N3STVyi = 705 - INTEGER(IntKi), PARAMETER :: M7N4STVyi = 706 - INTEGER(IntKi), PARAMETER :: M7N5STVyi = 707 - INTEGER(IntKi), PARAMETER :: M7N6STVyi = 708 - INTEGER(IntKi), PARAMETER :: M7N7STVyi = 709 - INTEGER(IntKi), PARAMETER :: M7N8STVyi = 710 - INTEGER(IntKi), PARAMETER :: M7N9STVyi = 711 - INTEGER(IntKi), PARAMETER :: M8N1STVyi = 712 - INTEGER(IntKi), PARAMETER :: M8N2STVyi = 713 - INTEGER(IntKi), PARAMETER :: M8N3STVyi = 714 - INTEGER(IntKi), PARAMETER :: M8N4STVyi = 715 - INTEGER(IntKi), PARAMETER :: M8N5STVyi = 716 - INTEGER(IntKi), PARAMETER :: M8N6STVyi = 717 - INTEGER(IntKi), PARAMETER :: M8N7STVyi = 718 - INTEGER(IntKi), PARAMETER :: M8N8STVyi = 719 - INTEGER(IntKi), PARAMETER :: M8N9STVyi = 720 - INTEGER(IntKi), PARAMETER :: M9N1STVyi = 721 - INTEGER(IntKi), PARAMETER :: M9N2STVyi = 722 - INTEGER(IntKi), PARAMETER :: M9N3STVyi = 723 - INTEGER(IntKi), PARAMETER :: M9N4STVyi = 724 - INTEGER(IntKi), PARAMETER :: M9N5STVyi = 725 - INTEGER(IntKi), PARAMETER :: M9N6STVyi = 726 - INTEGER(IntKi), PARAMETER :: M9N7STVyi = 727 - INTEGER(IntKi), PARAMETER :: M9N8STVyi = 728 - INTEGER(IntKi), PARAMETER :: M9N9STVyi = 729 - INTEGER(IntKi), PARAMETER :: M1N1STVzi = 730 - INTEGER(IntKi), PARAMETER :: M1N2STVzi = 731 - INTEGER(IntKi), PARAMETER :: M1N3STVzi = 732 - INTEGER(IntKi), PARAMETER :: M1N4STVzi = 733 - INTEGER(IntKi), PARAMETER :: M1N5STVzi = 734 - INTEGER(IntKi), PARAMETER :: M1N6STVzi = 735 - INTEGER(IntKi), PARAMETER :: M1N7STVzi = 736 - INTEGER(IntKi), PARAMETER :: M1N8STVzi = 737 - INTEGER(IntKi), PARAMETER :: M1N9STVzi = 738 - INTEGER(IntKi), PARAMETER :: M2N1STVzi = 739 - INTEGER(IntKi), PARAMETER :: M2N2STVzi = 740 - INTEGER(IntKi), PARAMETER :: M2N3STVzi = 741 - INTEGER(IntKi), PARAMETER :: M2N4STVzi = 742 - INTEGER(IntKi), PARAMETER :: M2N5STVzi = 743 - INTEGER(IntKi), PARAMETER :: M2N6STVzi = 744 - INTEGER(IntKi), PARAMETER :: M2N7STVzi = 745 - INTEGER(IntKi), PARAMETER :: M2N8STVzi = 746 - INTEGER(IntKi), PARAMETER :: M2N9STVzi = 747 - INTEGER(IntKi), PARAMETER :: M3N1STVzi = 748 - INTEGER(IntKi), PARAMETER :: M3N2STVzi = 749 - INTEGER(IntKi), PARAMETER :: M3N3STVzi = 750 - INTEGER(IntKi), PARAMETER :: M3N4STVzi = 751 - INTEGER(IntKi), PARAMETER :: M3N5STVzi = 752 - INTEGER(IntKi), PARAMETER :: M3N6STVzi = 753 - INTEGER(IntKi), PARAMETER :: M3N7STVzi = 754 - INTEGER(IntKi), PARAMETER :: M3N8STVzi = 755 - INTEGER(IntKi), PARAMETER :: M3N9STVzi = 756 - INTEGER(IntKi), PARAMETER :: M4N1STVzi = 757 - INTEGER(IntKi), PARAMETER :: M4N2STVzi = 758 - INTEGER(IntKi), PARAMETER :: M4N3STVzi = 759 - INTEGER(IntKi), PARAMETER :: M4N4STVzi = 760 - INTEGER(IntKi), PARAMETER :: M4N5STVzi = 761 - INTEGER(IntKi), PARAMETER :: M4N6STVzi = 762 - INTEGER(IntKi), PARAMETER :: M4N7STVzi = 763 - INTEGER(IntKi), PARAMETER :: M4N8STVzi = 764 - INTEGER(IntKi), PARAMETER :: M4N9STVzi = 765 - INTEGER(IntKi), PARAMETER :: M5N1STVzi = 766 - INTEGER(IntKi), PARAMETER :: M5N2STVzi = 767 - INTEGER(IntKi), PARAMETER :: M5N3STVzi = 768 - INTEGER(IntKi), PARAMETER :: M5N4STVzi = 769 - INTEGER(IntKi), PARAMETER :: M5N5STVzi = 770 - INTEGER(IntKi), PARAMETER :: M5N6STVzi = 771 - INTEGER(IntKi), PARAMETER :: M5N7STVzi = 772 - INTEGER(IntKi), PARAMETER :: M5N8STVzi = 773 - INTEGER(IntKi), PARAMETER :: M5N9STVzi = 774 - INTEGER(IntKi), PARAMETER :: M6N1STVzi = 775 - INTEGER(IntKi), PARAMETER :: M6N2STVzi = 776 - INTEGER(IntKi), PARAMETER :: M6N3STVzi = 777 - INTEGER(IntKi), PARAMETER :: M6N4STVzi = 778 - INTEGER(IntKi), PARAMETER :: M6N5STVzi = 779 - INTEGER(IntKi), PARAMETER :: M6N6STVzi = 780 - INTEGER(IntKi), PARAMETER :: M6N7STVzi = 781 - INTEGER(IntKi), PARAMETER :: M6N8STVzi = 782 - INTEGER(IntKi), PARAMETER :: M6N9STVzi = 783 - INTEGER(IntKi), PARAMETER :: M7N1STVzi = 784 - INTEGER(IntKi), PARAMETER :: M7N2STVzi = 785 - INTEGER(IntKi), PARAMETER :: M7N3STVzi = 786 - INTEGER(IntKi), PARAMETER :: M7N4STVzi = 787 - INTEGER(IntKi), PARAMETER :: M7N5STVzi = 788 - INTEGER(IntKi), PARAMETER :: M7N6STVzi = 789 - INTEGER(IntKi), PARAMETER :: M7N7STVzi = 790 - INTEGER(IntKi), PARAMETER :: M7N8STVzi = 791 - INTEGER(IntKi), PARAMETER :: M7N9STVzi = 792 - INTEGER(IntKi), PARAMETER :: M8N1STVzi = 793 - INTEGER(IntKi), PARAMETER :: M8N2STVzi = 794 - INTEGER(IntKi), PARAMETER :: M8N3STVzi = 795 - INTEGER(IntKi), PARAMETER :: M8N4STVzi = 796 - INTEGER(IntKi), PARAMETER :: M8N5STVzi = 797 - INTEGER(IntKi), PARAMETER :: M8N6STVzi = 798 - INTEGER(IntKi), PARAMETER :: M8N7STVzi = 799 - INTEGER(IntKi), PARAMETER :: M8N8STVzi = 800 - INTEGER(IntKi), PARAMETER :: M8N9STVzi = 801 - INTEGER(IntKi), PARAMETER :: M9N1STVzi = 802 - INTEGER(IntKi), PARAMETER :: M9N2STVzi = 803 - INTEGER(IntKi), PARAMETER :: M9N3STVzi = 804 - INTEGER(IntKi), PARAMETER :: M9N4STVzi = 805 - INTEGER(IntKi), PARAMETER :: M9N5STVzi = 806 - INTEGER(IntKi), PARAMETER :: M9N6STVzi = 807 - INTEGER(IntKi), PARAMETER :: M9N7STVzi = 808 - INTEGER(IntKi), PARAMETER :: M9N8STVzi = 809 - INTEGER(IntKi), PARAMETER :: M9N9STVzi = 810 - INTEGER(IntKi), PARAMETER :: M1N1STAxi = 811 - INTEGER(IntKi), PARAMETER :: M1N2STAxi = 812 - INTEGER(IntKi), PARAMETER :: M1N3STAxi = 813 - INTEGER(IntKi), PARAMETER :: M1N4STAxi = 814 - INTEGER(IntKi), PARAMETER :: M1N5STAxi = 815 - INTEGER(IntKi), PARAMETER :: M1N6STAxi = 816 - INTEGER(IntKi), PARAMETER :: M1N7STAxi = 817 - INTEGER(IntKi), PARAMETER :: M1N8STAxi = 818 - INTEGER(IntKi), PARAMETER :: M1N9STAxi = 819 - INTEGER(IntKi), PARAMETER :: M2N1STAxi = 820 - INTEGER(IntKi), PARAMETER :: M2N2STAxi = 821 - INTEGER(IntKi), PARAMETER :: M2N3STAxi = 822 - INTEGER(IntKi), PARAMETER :: M2N4STAxi = 823 - INTEGER(IntKi), PARAMETER :: M2N5STAxi = 824 - INTEGER(IntKi), PARAMETER :: M2N6STAxi = 825 - INTEGER(IntKi), PARAMETER :: M2N7STAxi = 826 - INTEGER(IntKi), PARAMETER :: M2N8STAxi = 827 - INTEGER(IntKi), PARAMETER :: M2N9STAxi = 828 - INTEGER(IntKi), PARAMETER :: M3N1STAxi = 829 - INTEGER(IntKi), PARAMETER :: M3N2STAxi = 830 - INTEGER(IntKi), PARAMETER :: M3N3STAxi = 831 - INTEGER(IntKi), PARAMETER :: M3N4STAxi = 832 - INTEGER(IntKi), PARAMETER :: M3N5STAxi = 833 - INTEGER(IntKi), PARAMETER :: M3N6STAxi = 834 - INTEGER(IntKi), PARAMETER :: M3N7STAxi = 835 - INTEGER(IntKi), PARAMETER :: M3N8STAxi = 836 - INTEGER(IntKi), PARAMETER :: M3N9STAxi = 837 - INTEGER(IntKi), PARAMETER :: M4N1STAxi = 838 - INTEGER(IntKi), PARAMETER :: M4N2STAxi = 839 - INTEGER(IntKi), PARAMETER :: M4N3STAxi = 840 - INTEGER(IntKi), PARAMETER :: M4N4STAxi = 841 - INTEGER(IntKi), PARAMETER :: M4N5STAxi = 842 - INTEGER(IntKi), PARAMETER :: M4N6STAxi = 843 - INTEGER(IntKi), PARAMETER :: M4N7STAxi = 844 - INTEGER(IntKi), PARAMETER :: M4N8STAxi = 845 - INTEGER(IntKi), PARAMETER :: M4N9STAxi = 846 - INTEGER(IntKi), PARAMETER :: M5N1STAxi = 847 - INTEGER(IntKi), PARAMETER :: M5N2STAxi = 848 - INTEGER(IntKi), PARAMETER :: M5N3STAxi = 849 - INTEGER(IntKi), PARAMETER :: M5N4STAxi = 850 - INTEGER(IntKi), PARAMETER :: M5N5STAxi = 851 - INTEGER(IntKi), PARAMETER :: M5N6STAxi = 852 - INTEGER(IntKi), PARAMETER :: M5N7STAxi = 853 - INTEGER(IntKi), PARAMETER :: M5N8STAxi = 854 - INTEGER(IntKi), PARAMETER :: M5N9STAxi = 855 - INTEGER(IntKi), PARAMETER :: M6N1STAxi = 856 - INTEGER(IntKi), PARAMETER :: M6N2STAxi = 857 - INTEGER(IntKi), PARAMETER :: M6N3STAxi = 858 - INTEGER(IntKi), PARAMETER :: M6N4STAxi = 859 - INTEGER(IntKi), PARAMETER :: M6N5STAxi = 860 - INTEGER(IntKi), PARAMETER :: M6N6STAxi = 861 - INTEGER(IntKi), PARAMETER :: M6N7STAxi = 862 - INTEGER(IntKi), PARAMETER :: M6N8STAxi = 863 - INTEGER(IntKi), PARAMETER :: M6N9STAxi = 864 - INTEGER(IntKi), PARAMETER :: M7N1STAxi = 865 - INTEGER(IntKi), PARAMETER :: M7N2STAxi = 866 - INTEGER(IntKi), PARAMETER :: M7N3STAxi = 867 - INTEGER(IntKi), PARAMETER :: M7N4STAxi = 868 - INTEGER(IntKi), PARAMETER :: M7N5STAxi = 869 - INTEGER(IntKi), PARAMETER :: M7N6STAxi = 870 - INTEGER(IntKi), PARAMETER :: M7N7STAxi = 871 - INTEGER(IntKi), PARAMETER :: M7N8STAxi = 872 - INTEGER(IntKi), PARAMETER :: M7N9STAxi = 873 - INTEGER(IntKi), PARAMETER :: M8N1STAxi = 874 - INTEGER(IntKi), PARAMETER :: M8N2STAxi = 875 - INTEGER(IntKi), PARAMETER :: M8N3STAxi = 876 - INTEGER(IntKi), PARAMETER :: M8N4STAxi = 877 - INTEGER(IntKi), PARAMETER :: M8N5STAxi = 878 - INTEGER(IntKi), PARAMETER :: M8N6STAxi = 879 - INTEGER(IntKi), PARAMETER :: M8N7STAxi = 880 - INTEGER(IntKi), PARAMETER :: M8N8STAxi = 881 - INTEGER(IntKi), PARAMETER :: M8N9STAxi = 882 - INTEGER(IntKi), PARAMETER :: M9N1STAxi = 883 - INTEGER(IntKi), PARAMETER :: M9N2STAxi = 884 - INTEGER(IntKi), PARAMETER :: M9N3STAxi = 885 - INTEGER(IntKi), PARAMETER :: M9N4STAxi = 886 - INTEGER(IntKi), PARAMETER :: M9N5STAxi = 887 - INTEGER(IntKi), PARAMETER :: M9N6STAxi = 888 - INTEGER(IntKi), PARAMETER :: M9N7STAxi = 889 - INTEGER(IntKi), PARAMETER :: M9N8STAxi = 890 - INTEGER(IntKi), PARAMETER :: M9N9STAxi = 891 - INTEGER(IntKi), PARAMETER :: M1N1STAyi = 892 - INTEGER(IntKi), PARAMETER :: M1N2STAyi = 893 - INTEGER(IntKi), PARAMETER :: M1N3STAyi = 894 - INTEGER(IntKi), PARAMETER :: M1N4STAyi = 895 - INTEGER(IntKi), PARAMETER :: M1N5STAyi = 896 - INTEGER(IntKi), PARAMETER :: M1N6STAyi = 897 - INTEGER(IntKi), PARAMETER :: M1N7STAyi = 898 - INTEGER(IntKi), PARAMETER :: M1N8STAyi = 899 - INTEGER(IntKi), PARAMETER :: M1N9STAyi = 900 - INTEGER(IntKi), PARAMETER :: M2N1STAyi = 901 - INTEGER(IntKi), PARAMETER :: M2N2STAyi = 902 - INTEGER(IntKi), PARAMETER :: M2N3STAyi = 903 - INTEGER(IntKi), PARAMETER :: M2N4STAyi = 904 - INTEGER(IntKi), PARAMETER :: M2N5STAyi = 905 - INTEGER(IntKi), PARAMETER :: M2N6STAyi = 906 - INTEGER(IntKi), PARAMETER :: M2N7STAyi = 907 - INTEGER(IntKi), PARAMETER :: M2N8STAyi = 908 - INTEGER(IntKi), PARAMETER :: M2N9STAyi = 909 - INTEGER(IntKi), PARAMETER :: M3N1STAyi = 910 - INTEGER(IntKi), PARAMETER :: M3N2STAyi = 911 - INTEGER(IntKi), PARAMETER :: M3N3STAyi = 912 - INTEGER(IntKi), PARAMETER :: M3N4STAyi = 913 - INTEGER(IntKi), PARAMETER :: M3N5STAyi = 914 - INTEGER(IntKi), PARAMETER :: M3N6STAyi = 915 - INTEGER(IntKi), PARAMETER :: M3N7STAyi = 916 - INTEGER(IntKi), PARAMETER :: M3N8STAyi = 917 - INTEGER(IntKi), PARAMETER :: M3N9STAyi = 918 - INTEGER(IntKi), PARAMETER :: M4N1STAyi = 919 - INTEGER(IntKi), PARAMETER :: M4N2STAyi = 920 - INTEGER(IntKi), PARAMETER :: M4N3STAyi = 921 - INTEGER(IntKi), PARAMETER :: M4N4STAyi = 922 - INTEGER(IntKi), PARAMETER :: M4N5STAyi = 923 - INTEGER(IntKi), PARAMETER :: M4N6STAyi = 924 - INTEGER(IntKi), PARAMETER :: M4N7STAyi = 925 - INTEGER(IntKi), PARAMETER :: M4N8STAyi = 926 - INTEGER(IntKi), PARAMETER :: M4N9STAyi = 927 - INTEGER(IntKi), PARAMETER :: M5N1STAyi = 928 - INTEGER(IntKi), PARAMETER :: M5N2STAyi = 929 - INTEGER(IntKi), PARAMETER :: M5N3STAyi = 930 - INTEGER(IntKi), PARAMETER :: M5N4STAyi = 931 - INTEGER(IntKi), PARAMETER :: M5N5STAyi = 932 - INTEGER(IntKi), PARAMETER :: M5N6STAyi = 933 - INTEGER(IntKi), PARAMETER :: M5N7STAyi = 934 - INTEGER(IntKi), PARAMETER :: M5N8STAyi = 935 - INTEGER(IntKi), PARAMETER :: M5N9STAyi = 936 - INTEGER(IntKi), PARAMETER :: M6N1STAyi = 937 - INTEGER(IntKi), PARAMETER :: M6N2STAyi = 938 - INTEGER(IntKi), PARAMETER :: M6N3STAyi = 939 - INTEGER(IntKi), PARAMETER :: M6N4STAyi = 940 - INTEGER(IntKi), PARAMETER :: M6N5STAyi = 941 - INTEGER(IntKi), PARAMETER :: M6N6STAyi = 942 - INTEGER(IntKi), PARAMETER :: M6N7STAyi = 943 - INTEGER(IntKi), PARAMETER :: M6N8STAyi = 944 - INTEGER(IntKi), PARAMETER :: M6N9STAyi = 945 - INTEGER(IntKi), PARAMETER :: M7N1STAyi = 946 - INTEGER(IntKi), PARAMETER :: M7N2STAyi = 947 - INTEGER(IntKi), PARAMETER :: M7N3STAyi = 948 - INTEGER(IntKi), PARAMETER :: M7N4STAyi = 949 - INTEGER(IntKi), PARAMETER :: M7N5STAyi = 950 - INTEGER(IntKi), PARAMETER :: M7N6STAyi = 951 - INTEGER(IntKi), PARAMETER :: M7N7STAyi = 952 - INTEGER(IntKi), PARAMETER :: M7N8STAyi = 953 - INTEGER(IntKi), PARAMETER :: M7N9STAyi = 954 - INTEGER(IntKi), PARAMETER :: M8N1STAyi = 955 - INTEGER(IntKi), PARAMETER :: M8N2STAyi = 956 - INTEGER(IntKi), PARAMETER :: M8N3STAyi = 957 - INTEGER(IntKi), PARAMETER :: M8N4STAyi = 958 - INTEGER(IntKi), PARAMETER :: M8N5STAyi = 959 - INTEGER(IntKi), PARAMETER :: M8N6STAyi = 960 - INTEGER(IntKi), PARAMETER :: M8N7STAyi = 961 - INTEGER(IntKi), PARAMETER :: M8N8STAyi = 962 - INTEGER(IntKi), PARAMETER :: M8N9STAyi = 963 - INTEGER(IntKi), PARAMETER :: M9N1STAyi = 964 - INTEGER(IntKi), PARAMETER :: M9N2STAyi = 965 - INTEGER(IntKi), PARAMETER :: M9N3STAyi = 966 - INTEGER(IntKi), PARAMETER :: M9N4STAyi = 967 - INTEGER(IntKi), PARAMETER :: M9N5STAyi = 968 - INTEGER(IntKi), PARAMETER :: M9N6STAyi = 969 - INTEGER(IntKi), PARAMETER :: M9N7STAyi = 970 - INTEGER(IntKi), PARAMETER :: M9N8STAyi = 971 - INTEGER(IntKi), PARAMETER :: M9N9STAyi = 972 - INTEGER(IntKi), PARAMETER :: M1N1STAzi = 973 - INTEGER(IntKi), PARAMETER :: M1N2STAzi = 974 - INTEGER(IntKi), PARAMETER :: M1N3STAzi = 975 - INTEGER(IntKi), PARAMETER :: M1N4STAzi = 976 - INTEGER(IntKi), PARAMETER :: M1N5STAzi = 977 - INTEGER(IntKi), PARAMETER :: M1N6STAzi = 978 - INTEGER(IntKi), PARAMETER :: M1N7STAzi = 979 - INTEGER(IntKi), PARAMETER :: M1N8STAzi = 980 - INTEGER(IntKi), PARAMETER :: M1N9STAzi = 981 - INTEGER(IntKi), PARAMETER :: M2N1STAzi = 982 - INTEGER(IntKi), PARAMETER :: M2N2STAzi = 983 - INTEGER(IntKi), PARAMETER :: M2N3STAzi = 984 - INTEGER(IntKi), PARAMETER :: M2N4STAzi = 985 - INTEGER(IntKi), PARAMETER :: M2N5STAzi = 986 - INTEGER(IntKi), PARAMETER :: M2N6STAzi = 987 - INTEGER(IntKi), PARAMETER :: M2N7STAzi = 988 - INTEGER(IntKi), PARAMETER :: M2N8STAzi = 989 - INTEGER(IntKi), PARAMETER :: M2N9STAzi = 990 - INTEGER(IntKi), PARAMETER :: M3N1STAzi = 991 - INTEGER(IntKi), PARAMETER :: M3N2STAzi = 992 - INTEGER(IntKi), PARAMETER :: M3N3STAzi = 993 - INTEGER(IntKi), PARAMETER :: M3N4STAzi = 994 - INTEGER(IntKi), PARAMETER :: M3N5STAzi = 995 - INTEGER(IntKi), PARAMETER :: M3N6STAzi = 996 - INTEGER(IntKi), PARAMETER :: M3N7STAzi = 997 - INTEGER(IntKi), PARAMETER :: M3N8STAzi = 998 - INTEGER(IntKi), PARAMETER :: M3N9STAzi = 999 - INTEGER(IntKi), PARAMETER :: M4N1STAzi = 1000 - INTEGER(IntKi), PARAMETER :: M4N2STAzi = 1001 - INTEGER(IntKi), PARAMETER :: M4N3STAzi = 1002 - INTEGER(IntKi), PARAMETER :: M4N4STAzi = 1003 - INTEGER(IntKi), PARAMETER :: M4N5STAzi = 1004 - INTEGER(IntKi), PARAMETER :: M4N6STAzi = 1005 - INTEGER(IntKi), PARAMETER :: M4N7STAzi = 1006 - INTEGER(IntKi), PARAMETER :: M4N8STAzi = 1007 - INTEGER(IntKi), PARAMETER :: M4N9STAzi = 1008 - INTEGER(IntKi), PARAMETER :: M5N1STAzi = 1009 - INTEGER(IntKi), PARAMETER :: M5N2STAzi = 1010 - INTEGER(IntKi), PARAMETER :: M5N3STAzi = 1011 - INTEGER(IntKi), PARAMETER :: M5N4STAzi = 1012 - INTEGER(IntKi), PARAMETER :: M5N5STAzi = 1013 - INTEGER(IntKi), PARAMETER :: M5N6STAzi = 1014 - INTEGER(IntKi), PARAMETER :: M5N7STAzi = 1015 - INTEGER(IntKi), PARAMETER :: M5N8STAzi = 1016 - INTEGER(IntKi), PARAMETER :: M5N9STAzi = 1017 - INTEGER(IntKi), PARAMETER :: M6N1STAzi = 1018 - INTEGER(IntKi), PARAMETER :: M6N2STAzi = 1019 - INTEGER(IntKi), PARAMETER :: M6N3STAzi = 1020 - INTEGER(IntKi), PARAMETER :: M6N4STAzi = 1021 - INTEGER(IntKi), PARAMETER :: M6N5STAzi = 1022 - INTEGER(IntKi), PARAMETER :: M6N6STAzi = 1023 - INTEGER(IntKi), PARAMETER :: M6N7STAzi = 1024 - INTEGER(IntKi), PARAMETER :: M6N8STAzi = 1025 - INTEGER(IntKi), PARAMETER :: M6N9STAzi = 1026 - INTEGER(IntKi), PARAMETER :: M7N1STAzi = 1027 - INTEGER(IntKi), PARAMETER :: M7N2STAzi = 1028 - INTEGER(IntKi), PARAMETER :: M7N3STAzi = 1029 - INTEGER(IntKi), PARAMETER :: M7N4STAzi = 1030 - INTEGER(IntKi), PARAMETER :: M7N5STAzi = 1031 - INTEGER(IntKi), PARAMETER :: M7N6STAzi = 1032 - INTEGER(IntKi), PARAMETER :: M7N7STAzi = 1033 - INTEGER(IntKi), PARAMETER :: M7N8STAzi = 1034 - INTEGER(IntKi), PARAMETER :: M7N9STAzi = 1035 - INTEGER(IntKi), PARAMETER :: M8N1STAzi = 1036 - INTEGER(IntKi), PARAMETER :: M8N2STAzi = 1037 - INTEGER(IntKi), PARAMETER :: M8N3STAzi = 1038 - INTEGER(IntKi), PARAMETER :: M8N4STAzi = 1039 - INTEGER(IntKi), PARAMETER :: M8N5STAzi = 1040 - INTEGER(IntKi), PARAMETER :: M8N6STAzi = 1041 - INTEGER(IntKi), PARAMETER :: M8N7STAzi = 1042 - INTEGER(IntKi), PARAMETER :: M8N8STAzi = 1043 - INTEGER(IntKi), PARAMETER :: M8N9STAzi = 1044 - INTEGER(IntKi), PARAMETER :: M9N1STAzi = 1045 - INTEGER(IntKi), PARAMETER :: M9N2STAzi = 1046 - INTEGER(IntKi), PARAMETER :: M9N3STAzi = 1047 - INTEGER(IntKi), PARAMETER :: M9N4STAzi = 1048 - INTEGER(IntKi), PARAMETER :: M9N5STAzi = 1049 - INTEGER(IntKi), PARAMETER :: M9N6STAzi = 1050 - INTEGER(IntKi), PARAMETER :: M9N7STAzi = 1051 - INTEGER(IntKi), PARAMETER :: M9N8STAzi = 1052 - INTEGER(IntKi), PARAMETER :: M9N9STAzi = 1053 + INTEGER(IntKi), PARAMETER :: M1N1Axi = 1 + INTEGER(IntKi), PARAMETER :: M1N2Axi = 2 + INTEGER(IntKi), PARAMETER :: M1N3Axi = 3 + INTEGER(IntKi), PARAMETER :: M1N4Axi = 4 + INTEGER(IntKi), PARAMETER :: M1N5Axi = 5 + INTEGER(IntKi), PARAMETER :: M1N6Axi = 6 + INTEGER(IntKi), PARAMETER :: M1N7Axi = 7 + INTEGER(IntKi), PARAMETER :: M1N8Axi = 8 + INTEGER(IntKi), PARAMETER :: M1N9Axi = 9 + INTEGER(IntKi), PARAMETER :: M2N1Axi = 10 + INTEGER(IntKi), PARAMETER :: M2N2Axi = 11 + INTEGER(IntKi), PARAMETER :: M2N3Axi = 12 + INTEGER(IntKi), PARAMETER :: M2N4Axi = 13 + INTEGER(IntKi), PARAMETER :: M2N5Axi = 14 + INTEGER(IntKi), PARAMETER :: M2N6Axi = 15 + INTEGER(IntKi), PARAMETER :: M2N7Axi = 16 + INTEGER(IntKi), PARAMETER :: M2N8Axi = 17 + INTEGER(IntKi), PARAMETER :: M2N9Axi = 18 + INTEGER(IntKi), PARAMETER :: M3N1Axi = 19 + INTEGER(IntKi), PARAMETER :: M3N2Axi = 20 + INTEGER(IntKi), PARAMETER :: M3N3Axi = 21 + INTEGER(IntKi), PARAMETER :: M3N4Axi = 22 + INTEGER(IntKi), PARAMETER :: M3N5Axi = 23 + INTEGER(IntKi), PARAMETER :: M3N6Axi = 24 + INTEGER(IntKi), PARAMETER :: M3N7Axi = 25 + INTEGER(IntKi), PARAMETER :: M3N8Axi = 26 + INTEGER(IntKi), PARAMETER :: M3N9Axi = 27 + INTEGER(IntKi), PARAMETER :: M4N1Axi = 28 + INTEGER(IntKi), PARAMETER :: M4N2Axi = 29 + INTEGER(IntKi), PARAMETER :: M4N3Axi = 30 + INTEGER(IntKi), PARAMETER :: M4N4Axi = 31 + INTEGER(IntKi), PARAMETER :: M4N5Axi = 32 + INTEGER(IntKi), PARAMETER :: M4N6Axi = 33 + INTEGER(IntKi), PARAMETER :: M4N7Axi = 34 + INTEGER(IntKi), PARAMETER :: M4N8Axi = 35 + INTEGER(IntKi), PARAMETER :: M4N9Axi = 36 + INTEGER(IntKi), PARAMETER :: M5N1Axi = 37 + INTEGER(IntKi), PARAMETER :: M5N2Axi = 38 + INTEGER(IntKi), PARAMETER :: M5N3Axi = 39 + INTEGER(IntKi), PARAMETER :: M5N4Axi = 40 + INTEGER(IntKi), PARAMETER :: M5N5Axi = 41 + INTEGER(IntKi), PARAMETER :: M5N6Axi = 42 + INTEGER(IntKi), PARAMETER :: M5N7Axi = 43 + INTEGER(IntKi), PARAMETER :: M5N8Axi = 44 + INTEGER(IntKi), PARAMETER :: M5N9Axi = 45 + INTEGER(IntKi), PARAMETER :: M6N1Axi = 46 + INTEGER(IntKi), PARAMETER :: M6N2Axi = 47 + INTEGER(IntKi), PARAMETER :: M6N3Axi = 48 + INTEGER(IntKi), PARAMETER :: M6N4Axi = 49 + INTEGER(IntKi), PARAMETER :: M6N5Axi = 50 + INTEGER(IntKi), PARAMETER :: M6N6Axi = 51 + INTEGER(IntKi), PARAMETER :: M6N7Axi = 52 + INTEGER(IntKi), PARAMETER :: M6N8Axi = 53 + INTEGER(IntKi), PARAMETER :: M6N9Axi = 54 + INTEGER(IntKi), PARAMETER :: M7N1Axi = 55 + INTEGER(IntKi), PARAMETER :: M7N2Axi = 56 + INTEGER(IntKi), PARAMETER :: M7N3Axi = 57 + INTEGER(IntKi), PARAMETER :: M7N4Axi = 58 + INTEGER(IntKi), PARAMETER :: M7N5Axi = 59 + INTEGER(IntKi), PARAMETER :: M7N6Axi = 60 + INTEGER(IntKi), PARAMETER :: M7N7Axi = 61 + INTEGER(IntKi), PARAMETER :: M7N8Axi = 62 + INTEGER(IntKi), PARAMETER :: M7N9Axi = 63 + INTEGER(IntKi), PARAMETER :: M8N1Axi = 64 + INTEGER(IntKi), PARAMETER :: M8N2Axi = 65 + INTEGER(IntKi), PARAMETER :: M8N3Axi = 66 + INTEGER(IntKi), PARAMETER :: M8N4Axi = 67 + INTEGER(IntKi), PARAMETER :: M8N5Axi = 68 + INTEGER(IntKi), PARAMETER :: M8N6Axi = 69 + INTEGER(IntKi), PARAMETER :: M8N7Axi = 70 + INTEGER(IntKi), PARAMETER :: M8N8Axi = 71 + INTEGER(IntKi), PARAMETER :: M8N9Axi = 72 + INTEGER(IntKi), PARAMETER :: M9N1Axi = 73 + INTEGER(IntKi), PARAMETER :: M9N2Axi = 74 + INTEGER(IntKi), PARAMETER :: M9N3Axi = 75 + INTEGER(IntKi), PARAMETER :: M9N4Axi = 76 + INTEGER(IntKi), PARAMETER :: M9N5Axi = 77 + INTEGER(IntKi), PARAMETER :: M9N6Axi = 78 + INTEGER(IntKi), PARAMETER :: M9N7Axi = 79 + INTEGER(IntKi), PARAMETER :: M9N8Axi = 80 + INTEGER(IntKi), PARAMETER :: M9N9Axi = 81 + INTEGER(IntKi), PARAMETER :: M1N1Ayi = 82 + INTEGER(IntKi), PARAMETER :: M1N2Ayi = 83 + INTEGER(IntKi), PARAMETER :: M1N3Ayi = 84 + INTEGER(IntKi), PARAMETER :: M1N4Ayi = 85 + INTEGER(IntKi), PARAMETER :: M1N5Ayi = 86 + INTEGER(IntKi), PARAMETER :: M1N6Ayi = 87 + INTEGER(IntKi), PARAMETER :: M1N7Ayi = 88 + INTEGER(IntKi), PARAMETER :: M1N8Ayi = 89 + INTEGER(IntKi), PARAMETER :: M1N9Ayi = 90 + INTEGER(IntKi), PARAMETER :: M2N1Ayi = 91 + INTEGER(IntKi), PARAMETER :: M2N2Ayi = 92 + INTEGER(IntKi), PARAMETER :: M2N3Ayi = 93 + INTEGER(IntKi), PARAMETER :: M2N4Ayi = 94 + INTEGER(IntKi), PARAMETER :: M2N5Ayi = 95 + INTEGER(IntKi), PARAMETER :: M2N6Ayi = 96 + INTEGER(IntKi), PARAMETER :: M2N7Ayi = 97 + INTEGER(IntKi), PARAMETER :: M2N8Ayi = 98 + INTEGER(IntKi), PARAMETER :: M2N9Ayi = 99 + INTEGER(IntKi), PARAMETER :: M3N1Ayi = 100 + INTEGER(IntKi), PARAMETER :: M3N2Ayi = 101 + INTEGER(IntKi), PARAMETER :: M3N3Ayi = 102 + INTEGER(IntKi), PARAMETER :: M3N4Ayi = 103 + INTEGER(IntKi), PARAMETER :: M3N5Ayi = 104 + INTEGER(IntKi), PARAMETER :: M3N6Ayi = 105 + INTEGER(IntKi), PARAMETER :: M3N7Ayi = 106 + INTEGER(IntKi), PARAMETER :: M3N8Ayi = 107 + INTEGER(IntKi), PARAMETER :: M3N9Ayi = 108 + INTEGER(IntKi), PARAMETER :: M4N1Ayi = 109 + INTEGER(IntKi), PARAMETER :: M4N2Ayi = 110 + INTEGER(IntKi), PARAMETER :: M4N3Ayi = 111 + INTEGER(IntKi), PARAMETER :: M4N4Ayi = 112 + INTEGER(IntKi), PARAMETER :: M4N5Ayi = 113 + INTEGER(IntKi), PARAMETER :: M4N6Ayi = 114 + INTEGER(IntKi), PARAMETER :: M4N7Ayi = 115 + INTEGER(IntKi), PARAMETER :: M4N8Ayi = 116 + INTEGER(IntKi), PARAMETER :: M4N9Ayi = 117 + INTEGER(IntKi), PARAMETER :: M5N1Ayi = 118 + INTEGER(IntKi), PARAMETER :: M5N2Ayi = 119 + INTEGER(IntKi), PARAMETER :: M5N3Ayi = 120 + INTEGER(IntKi), PARAMETER :: M5N4Ayi = 121 + INTEGER(IntKi), PARAMETER :: M5N5Ayi = 122 + INTEGER(IntKi), PARAMETER :: M5N6Ayi = 123 + INTEGER(IntKi), PARAMETER :: M5N7Ayi = 124 + INTEGER(IntKi), PARAMETER :: M5N8Ayi = 125 + INTEGER(IntKi), PARAMETER :: M5N9Ayi = 126 + INTEGER(IntKi), PARAMETER :: M6N1Ayi = 127 + INTEGER(IntKi), PARAMETER :: M6N2Ayi = 128 + INTEGER(IntKi), PARAMETER :: M6N3Ayi = 129 + INTEGER(IntKi), PARAMETER :: M6N4Ayi = 130 + INTEGER(IntKi), PARAMETER :: M6N5Ayi = 131 + INTEGER(IntKi), PARAMETER :: M6N6Ayi = 132 + INTEGER(IntKi), PARAMETER :: M6N7Ayi = 133 + INTEGER(IntKi), PARAMETER :: M6N8Ayi = 134 + INTEGER(IntKi), PARAMETER :: M6N9Ayi = 135 + INTEGER(IntKi), PARAMETER :: M7N1Ayi = 136 + INTEGER(IntKi), PARAMETER :: M7N2Ayi = 137 + INTEGER(IntKi), PARAMETER :: M7N3Ayi = 138 + INTEGER(IntKi), PARAMETER :: M7N4Ayi = 139 + INTEGER(IntKi), PARAMETER :: M7N5Ayi = 140 + INTEGER(IntKi), PARAMETER :: M7N6Ayi = 141 + INTEGER(IntKi), PARAMETER :: M7N7Ayi = 142 + INTEGER(IntKi), PARAMETER :: M7N8Ayi = 143 + INTEGER(IntKi), PARAMETER :: M7N9Ayi = 144 + INTEGER(IntKi), PARAMETER :: M8N1Ayi = 145 + INTEGER(IntKi), PARAMETER :: M8N2Ayi = 146 + INTEGER(IntKi), PARAMETER :: M8N3Ayi = 147 + INTEGER(IntKi), PARAMETER :: M8N4Ayi = 148 + INTEGER(IntKi), PARAMETER :: M8N5Ayi = 149 + INTEGER(IntKi), PARAMETER :: M8N6Ayi = 150 + INTEGER(IntKi), PARAMETER :: M8N7Ayi = 151 + INTEGER(IntKi), PARAMETER :: M8N8Ayi = 152 + INTEGER(IntKi), PARAMETER :: M8N9Ayi = 153 + INTEGER(IntKi), PARAMETER :: M9N1Ayi = 154 + INTEGER(IntKi), PARAMETER :: M9N2Ayi = 155 + INTEGER(IntKi), PARAMETER :: M9N3Ayi = 156 + INTEGER(IntKi), PARAMETER :: M9N4Ayi = 157 + INTEGER(IntKi), PARAMETER :: M9N5Ayi = 158 + INTEGER(IntKi), PARAMETER :: M9N6Ayi = 159 + INTEGER(IntKi), PARAMETER :: M9N7Ayi = 160 + INTEGER(IntKi), PARAMETER :: M9N8Ayi = 161 + INTEGER(IntKi), PARAMETER :: M9N9Ayi = 162 + INTEGER(IntKi), PARAMETER :: M1N1Azi = 163 + INTEGER(IntKi), PARAMETER :: M1N2Azi = 164 + INTEGER(IntKi), PARAMETER :: M1N3Azi = 165 + INTEGER(IntKi), PARAMETER :: M1N4Azi = 166 + INTEGER(IntKi), PARAMETER :: M1N5Azi = 167 + INTEGER(IntKi), PARAMETER :: M1N6Azi = 168 + INTEGER(IntKi), PARAMETER :: M1N7Azi = 169 + INTEGER(IntKi), PARAMETER :: M1N8Azi = 170 + INTEGER(IntKi), PARAMETER :: M1N9Azi = 171 + INTEGER(IntKi), PARAMETER :: M2N1Azi = 172 + INTEGER(IntKi), PARAMETER :: M2N2Azi = 173 + INTEGER(IntKi), PARAMETER :: M2N3Azi = 174 + INTEGER(IntKi), PARAMETER :: M2N4Azi = 175 + INTEGER(IntKi), PARAMETER :: M2N5Azi = 176 + INTEGER(IntKi), PARAMETER :: M2N6Azi = 177 + INTEGER(IntKi), PARAMETER :: M2N7Azi = 178 + INTEGER(IntKi), PARAMETER :: M2N8Azi = 179 + INTEGER(IntKi), PARAMETER :: M2N9Azi = 180 + INTEGER(IntKi), PARAMETER :: M3N1Azi = 181 + INTEGER(IntKi), PARAMETER :: M3N2Azi = 182 + INTEGER(IntKi), PARAMETER :: M3N3Azi = 183 + INTEGER(IntKi), PARAMETER :: M3N4Azi = 184 + INTEGER(IntKi), PARAMETER :: M3N5Azi = 185 + INTEGER(IntKi), PARAMETER :: M3N6Azi = 186 + INTEGER(IntKi), PARAMETER :: M3N7Azi = 187 + INTEGER(IntKi), PARAMETER :: M3N8Azi = 188 + INTEGER(IntKi), PARAMETER :: M3N9Azi = 189 + INTEGER(IntKi), PARAMETER :: M4N1Azi = 190 + INTEGER(IntKi), PARAMETER :: M4N2Azi = 191 + INTEGER(IntKi), PARAMETER :: M4N3Azi = 192 + INTEGER(IntKi), PARAMETER :: M4N4Azi = 193 + INTEGER(IntKi), PARAMETER :: M4N5Azi = 194 + INTEGER(IntKi), PARAMETER :: M4N6Azi = 195 + INTEGER(IntKi), PARAMETER :: M4N7Azi = 196 + INTEGER(IntKi), PARAMETER :: M4N8Azi = 197 + INTEGER(IntKi), PARAMETER :: M4N9Azi = 198 + INTEGER(IntKi), PARAMETER :: M5N1Azi = 199 + INTEGER(IntKi), PARAMETER :: M5N2Azi = 200 + INTEGER(IntKi), PARAMETER :: M5N3Azi = 201 + INTEGER(IntKi), PARAMETER :: M5N4Azi = 202 + INTEGER(IntKi), PARAMETER :: M5N5Azi = 203 + INTEGER(IntKi), PARAMETER :: M5N6Azi = 204 + INTEGER(IntKi), PARAMETER :: M5N7Azi = 205 + INTEGER(IntKi), PARAMETER :: M5N8Azi = 206 + INTEGER(IntKi), PARAMETER :: M5N9Azi = 207 + INTEGER(IntKi), PARAMETER :: M6N1Azi = 208 + INTEGER(IntKi), PARAMETER :: M6N2Azi = 209 + INTEGER(IntKi), PARAMETER :: M6N3Azi = 210 + INTEGER(IntKi), PARAMETER :: M6N4Azi = 211 + INTEGER(IntKi), PARAMETER :: M6N5Azi = 212 + INTEGER(IntKi), PARAMETER :: M6N6Azi = 213 + INTEGER(IntKi), PARAMETER :: M6N7Azi = 214 + INTEGER(IntKi), PARAMETER :: M6N8Azi = 215 + INTEGER(IntKi), PARAMETER :: M6N9Azi = 216 + INTEGER(IntKi), PARAMETER :: M7N1Azi = 217 + INTEGER(IntKi), PARAMETER :: M7N2Azi = 218 + INTEGER(IntKi), PARAMETER :: M7N3Azi = 219 + INTEGER(IntKi), PARAMETER :: M7N4Azi = 220 + INTEGER(IntKi), PARAMETER :: M7N5Azi = 221 + INTEGER(IntKi), PARAMETER :: M7N6Azi = 222 + INTEGER(IntKi), PARAMETER :: M7N7Azi = 223 + INTEGER(IntKi), PARAMETER :: M7N8Azi = 224 + INTEGER(IntKi), PARAMETER :: M7N9Azi = 225 + INTEGER(IntKi), PARAMETER :: M8N1Azi = 226 + INTEGER(IntKi), PARAMETER :: M8N2Azi = 227 + INTEGER(IntKi), PARAMETER :: M8N3Azi = 228 + INTEGER(IntKi), PARAMETER :: M8N4Azi = 229 + INTEGER(IntKi), PARAMETER :: M8N5Azi = 230 + INTEGER(IntKi), PARAMETER :: M8N6Azi = 231 + INTEGER(IntKi), PARAMETER :: M8N7Azi = 232 + INTEGER(IntKi), PARAMETER :: M8N8Azi = 233 + INTEGER(IntKi), PARAMETER :: M8N9Azi = 234 + INTEGER(IntKi), PARAMETER :: M9N1Azi = 235 + INTEGER(IntKi), PARAMETER :: M9N2Azi = 236 + INTEGER(IntKi), PARAMETER :: M9N3Azi = 237 + INTEGER(IntKi), PARAMETER :: M9N4Azi = 238 + INTEGER(IntKi), PARAMETER :: M9N5Azi = 239 + INTEGER(IntKi), PARAMETER :: M9N6Azi = 240 + INTEGER(IntKi), PARAMETER :: M9N7Azi = 241 + INTEGER(IntKi), PARAMETER :: M9N8Azi = 242 + INTEGER(IntKi), PARAMETER :: M9N9Azi = 243 + INTEGER(IntKi), PARAMETER :: M1N1Vxi = 244 + INTEGER(IntKi), PARAMETER :: M1N2Vxi = 245 + INTEGER(IntKi), PARAMETER :: M1N3Vxi = 246 + INTEGER(IntKi), PARAMETER :: M1N4Vxi = 247 + INTEGER(IntKi), PARAMETER :: M1N5Vxi = 248 + INTEGER(IntKi), PARAMETER :: M1N6Vxi = 249 + INTEGER(IntKi), PARAMETER :: M1N7Vxi = 250 + INTEGER(IntKi), PARAMETER :: M1N8Vxi = 251 + INTEGER(IntKi), PARAMETER :: M1N9Vxi = 252 + INTEGER(IntKi), PARAMETER :: M2N1Vxi = 253 + INTEGER(IntKi), PARAMETER :: M2N2Vxi = 254 + INTEGER(IntKi), PARAMETER :: M2N3Vxi = 255 + INTEGER(IntKi), PARAMETER :: M2N4Vxi = 256 + INTEGER(IntKi), PARAMETER :: M2N5Vxi = 257 + INTEGER(IntKi), PARAMETER :: M2N6Vxi = 258 + INTEGER(IntKi), PARAMETER :: M2N7Vxi = 259 + INTEGER(IntKi), PARAMETER :: M2N8Vxi = 260 + INTEGER(IntKi), PARAMETER :: M2N9Vxi = 261 + INTEGER(IntKi), PARAMETER :: M3N1Vxi = 262 + INTEGER(IntKi), PARAMETER :: M3N2Vxi = 263 + INTEGER(IntKi), PARAMETER :: M3N3Vxi = 264 + INTEGER(IntKi), PARAMETER :: M3N4Vxi = 265 + INTEGER(IntKi), PARAMETER :: M3N5Vxi = 266 + INTEGER(IntKi), PARAMETER :: M3N6Vxi = 267 + INTEGER(IntKi), PARAMETER :: M3N7Vxi = 268 + INTEGER(IntKi), PARAMETER :: M3N8Vxi = 269 + INTEGER(IntKi), PARAMETER :: M3N9Vxi = 270 + INTEGER(IntKi), PARAMETER :: M4N1Vxi = 271 + INTEGER(IntKi), PARAMETER :: M4N2Vxi = 272 + INTEGER(IntKi), PARAMETER :: M4N3Vxi = 273 + INTEGER(IntKi), PARAMETER :: M4N4Vxi = 274 + INTEGER(IntKi), PARAMETER :: M4N5Vxi = 275 + INTEGER(IntKi), PARAMETER :: M4N6Vxi = 276 + INTEGER(IntKi), PARAMETER :: M4N7Vxi = 277 + INTEGER(IntKi), PARAMETER :: M4N8Vxi = 278 + INTEGER(IntKi), PARAMETER :: M4N9Vxi = 279 + INTEGER(IntKi), PARAMETER :: M5N1Vxi = 280 + INTEGER(IntKi), PARAMETER :: M5N2Vxi = 281 + INTEGER(IntKi), PARAMETER :: M5N3Vxi = 282 + INTEGER(IntKi), PARAMETER :: M5N4Vxi = 283 + INTEGER(IntKi), PARAMETER :: M5N5Vxi = 284 + INTEGER(IntKi), PARAMETER :: M5N6Vxi = 285 + INTEGER(IntKi), PARAMETER :: M5N7Vxi = 286 + INTEGER(IntKi), PARAMETER :: M5N8Vxi = 287 + INTEGER(IntKi), PARAMETER :: M5N9Vxi = 288 + INTEGER(IntKi), PARAMETER :: M6N1Vxi = 289 + INTEGER(IntKi), PARAMETER :: M6N2Vxi = 290 + INTEGER(IntKi), PARAMETER :: M6N3Vxi = 291 + INTEGER(IntKi), PARAMETER :: M6N4Vxi = 292 + INTEGER(IntKi), PARAMETER :: M6N5Vxi = 293 + INTEGER(IntKi), PARAMETER :: M6N6Vxi = 294 + INTEGER(IntKi), PARAMETER :: M6N7Vxi = 295 + INTEGER(IntKi), PARAMETER :: M6N8Vxi = 296 + INTEGER(IntKi), PARAMETER :: M6N9Vxi = 297 + INTEGER(IntKi), PARAMETER :: M7N1Vxi = 298 + INTEGER(IntKi), PARAMETER :: M7N2Vxi = 299 + INTEGER(IntKi), PARAMETER :: M7N3Vxi = 300 + INTEGER(IntKi), PARAMETER :: M7N4Vxi = 301 + INTEGER(IntKi), PARAMETER :: M7N5Vxi = 302 + INTEGER(IntKi), PARAMETER :: M7N6Vxi = 303 + INTEGER(IntKi), PARAMETER :: M7N7Vxi = 304 + INTEGER(IntKi), PARAMETER :: M7N8Vxi = 305 + INTEGER(IntKi), PARAMETER :: M7N9Vxi = 306 + INTEGER(IntKi), PARAMETER :: M8N1Vxi = 307 + INTEGER(IntKi), PARAMETER :: M8N2Vxi = 308 + INTEGER(IntKi), PARAMETER :: M8N3Vxi = 309 + INTEGER(IntKi), PARAMETER :: M8N4Vxi = 310 + INTEGER(IntKi), PARAMETER :: M8N5Vxi = 311 + INTEGER(IntKi), PARAMETER :: M8N6Vxi = 312 + INTEGER(IntKi), PARAMETER :: M8N7Vxi = 313 + INTEGER(IntKi), PARAMETER :: M8N8Vxi = 314 + INTEGER(IntKi), PARAMETER :: M8N9Vxi = 315 + INTEGER(IntKi), PARAMETER :: M9N1Vxi = 316 + INTEGER(IntKi), PARAMETER :: M9N2Vxi = 317 + INTEGER(IntKi), PARAMETER :: M9N3Vxi = 318 + INTEGER(IntKi), PARAMETER :: M9N4Vxi = 319 + INTEGER(IntKi), PARAMETER :: M9N5Vxi = 320 + INTEGER(IntKi), PARAMETER :: M9N6Vxi = 321 + INTEGER(IntKi), PARAMETER :: M9N7Vxi = 322 + INTEGER(IntKi), PARAMETER :: M9N8Vxi = 323 + INTEGER(IntKi), PARAMETER :: M9N9Vxi = 324 + INTEGER(IntKi), PARAMETER :: M1N1Vyi = 325 + INTEGER(IntKi), PARAMETER :: M1N2Vyi = 326 + INTEGER(IntKi), PARAMETER :: M1N3Vyi = 327 + INTEGER(IntKi), PARAMETER :: M1N4Vyi = 328 + INTEGER(IntKi), PARAMETER :: M1N5Vyi = 329 + INTEGER(IntKi), PARAMETER :: M1N6Vyi = 330 + INTEGER(IntKi), PARAMETER :: M1N7Vyi = 331 + INTEGER(IntKi), PARAMETER :: M1N8Vyi = 332 + INTEGER(IntKi), PARAMETER :: M1N9Vyi = 333 + INTEGER(IntKi), PARAMETER :: M2N1Vyi = 334 + INTEGER(IntKi), PARAMETER :: M2N2Vyi = 335 + INTEGER(IntKi), PARAMETER :: M2N3Vyi = 336 + INTEGER(IntKi), PARAMETER :: M2N4Vyi = 337 + INTEGER(IntKi), PARAMETER :: M2N5Vyi = 338 + INTEGER(IntKi), PARAMETER :: M2N6Vyi = 339 + INTEGER(IntKi), PARAMETER :: M2N7Vyi = 340 + INTEGER(IntKi), PARAMETER :: M2N8Vyi = 341 + INTEGER(IntKi), PARAMETER :: M2N9Vyi = 342 + INTEGER(IntKi), PARAMETER :: M3N1Vyi = 343 + INTEGER(IntKi), PARAMETER :: M3N2Vyi = 344 + INTEGER(IntKi), PARAMETER :: M3N3Vyi = 345 + INTEGER(IntKi), PARAMETER :: M3N4Vyi = 346 + INTEGER(IntKi), PARAMETER :: M3N5Vyi = 347 + INTEGER(IntKi), PARAMETER :: M3N6Vyi = 348 + INTEGER(IntKi), PARAMETER :: M3N7Vyi = 349 + INTEGER(IntKi), PARAMETER :: M3N8Vyi = 350 + INTEGER(IntKi), PARAMETER :: M3N9Vyi = 351 + INTEGER(IntKi), PARAMETER :: M4N1Vyi = 352 + INTEGER(IntKi), PARAMETER :: M4N2Vyi = 353 + INTEGER(IntKi), PARAMETER :: M4N3Vyi = 354 + INTEGER(IntKi), PARAMETER :: M4N4Vyi = 355 + INTEGER(IntKi), PARAMETER :: M4N5Vyi = 356 + INTEGER(IntKi), PARAMETER :: M4N6Vyi = 357 + INTEGER(IntKi), PARAMETER :: M4N7Vyi = 358 + INTEGER(IntKi), PARAMETER :: M4N8Vyi = 359 + INTEGER(IntKi), PARAMETER :: M4N9Vyi = 360 + INTEGER(IntKi), PARAMETER :: M5N1Vyi = 361 + INTEGER(IntKi), PARAMETER :: M5N2Vyi = 362 + INTEGER(IntKi), PARAMETER :: M5N3Vyi = 363 + INTEGER(IntKi), PARAMETER :: M5N4Vyi = 364 + INTEGER(IntKi), PARAMETER :: M5N5Vyi = 365 + INTEGER(IntKi), PARAMETER :: M5N6Vyi = 366 + INTEGER(IntKi), PARAMETER :: M5N7Vyi = 367 + INTEGER(IntKi), PARAMETER :: M5N8Vyi = 368 + INTEGER(IntKi), PARAMETER :: M5N9Vyi = 369 + INTEGER(IntKi), PARAMETER :: M6N1Vyi = 370 + INTEGER(IntKi), PARAMETER :: M6N2Vyi = 371 + INTEGER(IntKi), PARAMETER :: M6N3Vyi = 372 + INTEGER(IntKi), PARAMETER :: M6N4Vyi = 373 + INTEGER(IntKi), PARAMETER :: M6N5Vyi = 374 + INTEGER(IntKi), PARAMETER :: M6N6Vyi = 375 + INTEGER(IntKi), PARAMETER :: M6N7Vyi = 376 + INTEGER(IntKi), PARAMETER :: M6N8Vyi = 377 + INTEGER(IntKi), PARAMETER :: M6N9Vyi = 378 + INTEGER(IntKi), PARAMETER :: M7N1Vyi = 379 + INTEGER(IntKi), PARAMETER :: M7N2Vyi = 380 + INTEGER(IntKi), PARAMETER :: M7N3Vyi = 381 + INTEGER(IntKi), PARAMETER :: M7N4Vyi = 382 + INTEGER(IntKi), PARAMETER :: M7N5Vyi = 383 + INTEGER(IntKi), PARAMETER :: M7N6Vyi = 384 + INTEGER(IntKi), PARAMETER :: M7N7Vyi = 385 + INTEGER(IntKi), PARAMETER :: M7N8Vyi = 386 + INTEGER(IntKi), PARAMETER :: M7N9Vyi = 387 + INTEGER(IntKi), PARAMETER :: M8N1Vyi = 388 + INTEGER(IntKi), PARAMETER :: M8N2Vyi = 389 + INTEGER(IntKi), PARAMETER :: M8N3Vyi = 390 + INTEGER(IntKi), PARAMETER :: M8N4Vyi = 391 + INTEGER(IntKi), PARAMETER :: M8N5Vyi = 392 + INTEGER(IntKi), PARAMETER :: M8N6Vyi = 393 + INTEGER(IntKi), PARAMETER :: M8N7Vyi = 394 + INTEGER(IntKi), PARAMETER :: M8N8Vyi = 395 + INTEGER(IntKi), PARAMETER :: M8N9Vyi = 396 + INTEGER(IntKi), PARAMETER :: M9N1Vyi = 397 + INTEGER(IntKi), PARAMETER :: M9N2Vyi = 398 + INTEGER(IntKi), PARAMETER :: M9N3Vyi = 399 + INTEGER(IntKi), PARAMETER :: M9N4Vyi = 400 + INTEGER(IntKi), PARAMETER :: M9N5Vyi = 401 + INTEGER(IntKi), PARAMETER :: M9N6Vyi = 402 + INTEGER(IntKi), PARAMETER :: M9N7Vyi = 403 + INTEGER(IntKi), PARAMETER :: M9N8Vyi = 404 + INTEGER(IntKi), PARAMETER :: M9N9Vyi = 405 + INTEGER(IntKi), PARAMETER :: M1N1Vzi = 406 + INTEGER(IntKi), PARAMETER :: M1N2Vzi = 407 + INTEGER(IntKi), PARAMETER :: M1N3Vzi = 408 + INTEGER(IntKi), PARAMETER :: M1N4Vzi = 409 + INTEGER(IntKi), PARAMETER :: M1N5Vzi = 410 + INTEGER(IntKi), PARAMETER :: M1N6Vzi = 411 + INTEGER(IntKi), PARAMETER :: M1N7Vzi = 412 + INTEGER(IntKi), PARAMETER :: M1N8Vzi = 413 + INTEGER(IntKi), PARAMETER :: M1N9Vzi = 414 + INTEGER(IntKi), PARAMETER :: M2N1Vzi = 415 + INTEGER(IntKi), PARAMETER :: M2N2Vzi = 416 + INTEGER(IntKi), PARAMETER :: M2N3Vzi = 417 + INTEGER(IntKi), PARAMETER :: M2N4Vzi = 418 + INTEGER(IntKi), PARAMETER :: M2N5Vzi = 419 + INTEGER(IntKi), PARAMETER :: M2N6Vzi = 420 + INTEGER(IntKi), PARAMETER :: M2N7Vzi = 421 + INTEGER(IntKi), PARAMETER :: M2N8Vzi = 422 + INTEGER(IntKi), PARAMETER :: M2N9Vzi = 423 + INTEGER(IntKi), PARAMETER :: M3N1Vzi = 424 + INTEGER(IntKi), PARAMETER :: M3N2Vzi = 425 + INTEGER(IntKi), PARAMETER :: M3N3Vzi = 426 + INTEGER(IntKi), PARAMETER :: M3N4Vzi = 427 + INTEGER(IntKi), PARAMETER :: M3N5Vzi = 428 + INTEGER(IntKi), PARAMETER :: M3N6Vzi = 429 + INTEGER(IntKi), PARAMETER :: M3N7Vzi = 430 + INTEGER(IntKi), PARAMETER :: M3N8Vzi = 431 + INTEGER(IntKi), PARAMETER :: M3N9Vzi = 432 + INTEGER(IntKi), PARAMETER :: M4N1Vzi = 433 + INTEGER(IntKi), PARAMETER :: M4N2Vzi = 434 + INTEGER(IntKi), PARAMETER :: M4N3Vzi = 435 + INTEGER(IntKi), PARAMETER :: M4N4Vzi = 436 + INTEGER(IntKi), PARAMETER :: M4N5Vzi = 437 + INTEGER(IntKi), PARAMETER :: M4N6Vzi = 438 + INTEGER(IntKi), PARAMETER :: M4N7Vzi = 439 + INTEGER(IntKi), PARAMETER :: M4N8Vzi = 440 + INTEGER(IntKi), PARAMETER :: M4N9Vzi = 441 + INTEGER(IntKi), PARAMETER :: M5N1Vzi = 442 + INTEGER(IntKi), PARAMETER :: M5N2Vzi = 443 + INTEGER(IntKi), PARAMETER :: M5N3Vzi = 444 + INTEGER(IntKi), PARAMETER :: M5N4Vzi = 445 + INTEGER(IntKi), PARAMETER :: M5N5Vzi = 446 + INTEGER(IntKi), PARAMETER :: M5N6Vzi = 447 + INTEGER(IntKi), PARAMETER :: M5N7Vzi = 448 + INTEGER(IntKi), PARAMETER :: M5N8Vzi = 449 + INTEGER(IntKi), PARAMETER :: M5N9Vzi = 450 + INTEGER(IntKi), PARAMETER :: M6N1Vzi = 451 + INTEGER(IntKi), PARAMETER :: M6N2Vzi = 452 + INTEGER(IntKi), PARAMETER :: M6N3Vzi = 453 + INTEGER(IntKi), PARAMETER :: M6N4Vzi = 454 + INTEGER(IntKi), PARAMETER :: M6N5Vzi = 455 + INTEGER(IntKi), PARAMETER :: M6N6Vzi = 456 + INTEGER(IntKi), PARAMETER :: M6N7Vzi = 457 + INTEGER(IntKi), PARAMETER :: M6N8Vzi = 458 + INTEGER(IntKi), PARAMETER :: M6N9Vzi = 459 + INTEGER(IntKi), PARAMETER :: M7N1Vzi = 460 + INTEGER(IntKi), PARAMETER :: M7N2Vzi = 461 + INTEGER(IntKi), PARAMETER :: M7N3Vzi = 462 + INTEGER(IntKi), PARAMETER :: M7N4Vzi = 463 + INTEGER(IntKi), PARAMETER :: M7N5Vzi = 464 + INTEGER(IntKi), PARAMETER :: M7N6Vzi = 465 + INTEGER(IntKi), PARAMETER :: M7N7Vzi = 466 + INTEGER(IntKi), PARAMETER :: M7N8Vzi = 467 + INTEGER(IntKi), PARAMETER :: M7N9Vzi = 468 + INTEGER(IntKi), PARAMETER :: M8N1Vzi = 469 + INTEGER(IntKi), PARAMETER :: M8N2Vzi = 470 + INTEGER(IntKi), PARAMETER :: M8N3Vzi = 471 + INTEGER(IntKi), PARAMETER :: M8N4Vzi = 472 + INTEGER(IntKi), PARAMETER :: M8N5Vzi = 473 + INTEGER(IntKi), PARAMETER :: M8N6Vzi = 474 + INTEGER(IntKi), PARAMETER :: M8N7Vzi = 475 + INTEGER(IntKi), PARAMETER :: M8N8Vzi = 476 + INTEGER(IntKi), PARAMETER :: M8N9Vzi = 477 + INTEGER(IntKi), PARAMETER :: M9N1Vzi = 478 + INTEGER(IntKi), PARAMETER :: M9N2Vzi = 479 + INTEGER(IntKi), PARAMETER :: M9N3Vzi = 480 + INTEGER(IntKi), PARAMETER :: M9N4Vzi = 481 + INTEGER(IntKi), PARAMETER :: M9N5Vzi = 482 + INTEGER(IntKi), PARAMETER :: M9N6Vzi = 483 + INTEGER(IntKi), PARAMETER :: M9N7Vzi = 484 + INTEGER(IntKi), PARAMETER :: M9N8Vzi = 485 + INTEGER(IntKi), PARAMETER :: M9N9Vzi = 486 + INTEGER(IntKi), PARAMETER :: M1N1DynP = 487 + INTEGER(IntKi), PARAMETER :: M1N2DynP = 488 + INTEGER(IntKi), PARAMETER :: M1N3DynP = 489 + INTEGER(IntKi), PARAMETER :: M1N4DynP = 490 + INTEGER(IntKi), PARAMETER :: M1N5DynP = 491 + INTEGER(IntKi), PARAMETER :: M1N6DynP = 492 + INTEGER(IntKi), PARAMETER :: M1N7DynP = 493 + INTEGER(IntKi), PARAMETER :: M1N8DynP = 494 + INTEGER(IntKi), PARAMETER :: M1N9DynP = 495 + INTEGER(IntKi), PARAMETER :: M2N1DynP = 496 + INTEGER(IntKi), PARAMETER :: M2N2DynP = 497 + INTEGER(IntKi), PARAMETER :: M2N3DynP = 498 + INTEGER(IntKi), PARAMETER :: M2N4DynP = 499 + INTEGER(IntKi), PARAMETER :: M2N5DynP = 500 + INTEGER(IntKi), PARAMETER :: M2N6DynP = 501 + INTEGER(IntKi), PARAMETER :: M2N7DynP = 502 + INTEGER(IntKi), PARAMETER :: M2N8DynP = 503 + INTEGER(IntKi), PARAMETER :: M2N9DynP = 504 + INTEGER(IntKi), PARAMETER :: M3N1DynP = 505 + INTEGER(IntKi), PARAMETER :: M3N2DynP = 506 + INTEGER(IntKi), PARAMETER :: M3N3DynP = 507 + INTEGER(IntKi), PARAMETER :: M3N4DynP = 508 + INTEGER(IntKi), PARAMETER :: M3N5DynP = 509 + INTEGER(IntKi), PARAMETER :: M3N6DynP = 510 + INTEGER(IntKi), PARAMETER :: M3N7DynP = 511 + INTEGER(IntKi), PARAMETER :: M3N8DynP = 512 + INTEGER(IntKi), PARAMETER :: M3N9DynP = 513 + INTEGER(IntKi), PARAMETER :: M4N1DynP = 514 + INTEGER(IntKi), PARAMETER :: M4N2DynP = 515 + INTEGER(IntKi), PARAMETER :: M4N3DynP = 516 + INTEGER(IntKi), PARAMETER :: M4N4DynP = 517 + INTEGER(IntKi), PARAMETER :: M4N5DynP = 518 + INTEGER(IntKi), PARAMETER :: M4N6DynP = 519 + INTEGER(IntKi), PARAMETER :: M4N7DynP = 520 + INTEGER(IntKi), PARAMETER :: M4N8DynP = 521 + INTEGER(IntKi), PARAMETER :: M4N9DynP = 522 + INTEGER(IntKi), PARAMETER :: M5N1DynP = 523 + INTEGER(IntKi), PARAMETER :: M5N2DynP = 524 + INTEGER(IntKi), PARAMETER :: M5N3DynP = 525 + INTEGER(IntKi), PARAMETER :: M5N4DynP = 526 + INTEGER(IntKi), PARAMETER :: M5N5DynP = 527 + INTEGER(IntKi), PARAMETER :: M5N6DynP = 528 + INTEGER(IntKi), PARAMETER :: M5N7DynP = 529 + INTEGER(IntKi), PARAMETER :: M5N8DynP = 530 + INTEGER(IntKi), PARAMETER :: M5N9DynP = 531 + INTEGER(IntKi), PARAMETER :: M6N1DynP = 532 + INTEGER(IntKi), PARAMETER :: M6N2DynP = 533 + INTEGER(IntKi), PARAMETER :: M6N3DynP = 534 + INTEGER(IntKi), PARAMETER :: M6N4DynP = 535 + INTEGER(IntKi), PARAMETER :: M6N5DynP = 536 + INTEGER(IntKi), PARAMETER :: M6N6DynP = 537 + INTEGER(IntKi), PARAMETER :: M6N7DynP = 538 + INTEGER(IntKi), PARAMETER :: M6N8DynP = 539 + INTEGER(IntKi), PARAMETER :: M6N9DynP = 540 + INTEGER(IntKi), PARAMETER :: M7N1DynP = 541 + INTEGER(IntKi), PARAMETER :: M7N2DynP = 542 + INTEGER(IntKi), PARAMETER :: M7N3DynP = 543 + INTEGER(IntKi), PARAMETER :: M7N4DynP = 544 + INTEGER(IntKi), PARAMETER :: M7N5DynP = 545 + INTEGER(IntKi), PARAMETER :: M7N6DynP = 546 + INTEGER(IntKi), PARAMETER :: M7N7DynP = 547 + INTEGER(IntKi), PARAMETER :: M7N8DynP = 548 + INTEGER(IntKi), PARAMETER :: M7N9DynP = 549 + INTEGER(IntKi), PARAMETER :: M8N1DynP = 550 + INTEGER(IntKi), PARAMETER :: M8N2DynP = 551 + INTEGER(IntKi), PARAMETER :: M8N3DynP = 552 + INTEGER(IntKi), PARAMETER :: M8N4DynP = 553 + INTEGER(IntKi), PARAMETER :: M8N5DynP = 554 + INTEGER(IntKi), PARAMETER :: M8N6DynP = 555 + INTEGER(IntKi), PARAMETER :: M8N7DynP = 556 + INTEGER(IntKi), PARAMETER :: M8N8DynP = 557 + INTEGER(IntKi), PARAMETER :: M8N9DynP = 558 + INTEGER(IntKi), PARAMETER :: M9N1DynP = 559 + INTEGER(IntKi), PARAMETER :: M9N2DynP = 560 + INTEGER(IntKi), PARAMETER :: M9N3DynP = 561 + INTEGER(IntKi), PARAMETER :: M9N4DynP = 562 + INTEGER(IntKi), PARAMETER :: M9N5DynP = 563 + INTEGER(IntKi), PARAMETER :: M9N6DynP = 564 + INTEGER(IntKi), PARAMETER :: M9N7DynP = 565 + INTEGER(IntKi), PARAMETER :: M9N8DynP = 566 + INTEGER(IntKi), PARAMETER :: M9N9DynP = 567 + INTEGER(IntKi), PARAMETER :: M1N1STVxi = 568 + INTEGER(IntKi), PARAMETER :: M1N2STVxi = 569 + INTEGER(IntKi), PARAMETER :: M1N3STVxi = 570 + INTEGER(IntKi), PARAMETER :: M1N4STVxi = 571 + INTEGER(IntKi), PARAMETER :: M1N5STVxi = 572 + INTEGER(IntKi), PARAMETER :: M1N6STVxi = 573 + INTEGER(IntKi), PARAMETER :: M1N7STVxi = 574 + INTEGER(IntKi), PARAMETER :: M1N8STVxi = 575 + INTEGER(IntKi), PARAMETER :: M1N9STVxi = 576 + INTEGER(IntKi), PARAMETER :: M2N1STVxi = 577 + INTEGER(IntKi), PARAMETER :: M2N2STVxi = 578 + INTEGER(IntKi), PARAMETER :: M2N3STVxi = 579 + INTEGER(IntKi), PARAMETER :: M2N4STVxi = 580 + INTEGER(IntKi), PARAMETER :: M2N5STVxi = 581 + INTEGER(IntKi), PARAMETER :: M2N6STVxi = 582 + INTEGER(IntKi), PARAMETER :: M2N7STVxi = 583 + INTEGER(IntKi), PARAMETER :: M2N8STVxi = 584 + INTEGER(IntKi), PARAMETER :: M2N9STVxi = 585 + INTEGER(IntKi), PARAMETER :: M3N1STVxi = 586 + INTEGER(IntKi), PARAMETER :: M3N2STVxi = 587 + INTEGER(IntKi), PARAMETER :: M3N3STVxi = 588 + INTEGER(IntKi), PARAMETER :: M3N4STVxi = 589 + INTEGER(IntKi), PARAMETER :: M3N5STVxi = 590 + INTEGER(IntKi), PARAMETER :: M3N6STVxi = 591 + INTEGER(IntKi), PARAMETER :: M3N7STVxi = 592 + INTEGER(IntKi), PARAMETER :: M3N8STVxi = 593 + INTEGER(IntKi), PARAMETER :: M3N9STVxi = 594 + INTEGER(IntKi), PARAMETER :: M4N1STVxi = 595 + INTEGER(IntKi), PARAMETER :: M4N2STVxi = 596 + INTEGER(IntKi), PARAMETER :: M4N3STVxi = 597 + INTEGER(IntKi), PARAMETER :: M4N4STVxi = 598 + INTEGER(IntKi), PARAMETER :: M4N5STVxi = 599 + INTEGER(IntKi), PARAMETER :: M4N6STVxi = 600 + INTEGER(IntKi), PARAMETER :: M4N7STVxi = 601 + INTEGER(IntKi), PARAMETER :: M4N8STVxi = 602 + INTEGER(IntKi), PARAMETER :: M4N9STVxi = 603 + INTEGER(IntKi), PARAMETER :: M5N1STVxi = 604 + INTEGER(IntKi), PARAMETER :: M5N2STVxi = 605 + INTEGER(IntKi), PARAMETER :: M5N3STVxi = 606 + INTEGER(IntKi), PARAMETER :: M5N4STVxi = 607 + INTEGER(IntKi), PARAMETER :: M5N5STVxi = 608 + INTEGER(IntKi), PARAMETER :: M5N6STVxi = 609 + INTEGER(IntKi), PARAMETER :: M5N7STVxi = 610 + INTEGER(IntKi), PARAMETER :: M5N8STVxi = 611 + INTEGER(IntKi), PARAMETER :: M5N9STVxi = 612 + INTEGER(IntKi), PARAMETER :: M6N1STVxi = 613 + INTEGER(IntKi), PARAMETER :: M6N2STVxi = 614 + INTEGER(IntKi), PARAMETER :: M6N3STVxi = 615 + INTEGER(IntKi), PARAMETER :: M6N4STVxi = 616 + INTEGER(IntKi), PARAMETER :: M6N5STVxi = 617 + INTEGER(IntKi), PARAMETER :: M6N6STVxi = 618 + INTEGER(IntKi), PARAMETER :: M6N7STVxi = 619 + INTEGER(IntKi), PARAMETER :: M6N8STVxi = 620 + INTEGER(IntKi), PARAMETER :: M6N9STVxi = 621 + INTEGER(IntKi), PARAMETER :: M7N1STVxi = 622 + INTEGER(IntKi), PARAMETER :: M7N2STVxi = 623 + INTEGER(IntKi), PARAMETER :: M7N3STVxi = 624 + INTEGER(IntKi), PARAMETER :: M7N4STVxi = 625 + INTEGER(IntKi), PARAMETER :: M7N5STVxi = 626 + INTEGER(IntKi), PARAMETER :: M7N6STVxi = 627 + INTEGER(IntKi), PARAMETER :: M7N7STVxi = 628 + INTEGER(IntKi), PARAMETER :: M7N8STVxi = 629 + INTEGER(IntKi), PARAMETER :: M7N9STVxi = 630 + INTEGER(IntKi), PARAMETER :: M8N1STVxi = 631 + INTEGER(IntKi), PARAMETER :: M8N2STVxi = 632 + INTEGER(IntKi), PARAMETER :: M8N3STVxi = 633 + INTEGER(IntKi), PARAMETER :: M8N4STVxi = 634 + INTEGER(IntKi), PARAMETER :: M8N5STVxi = 635 + INTEGER(IntKi), PARAMETER :: M8N6STVxi = 636 + INTEGER(IntKi), PARAMETER :: M8N7STVxi = 637 + INTEGER(IntKi), PARAMETER :: M8N8STVxi = 638 + INTEGER(IntKi), PARAMETER :: M8N9STVxi = 639 + INTEGER(IntKi), PARAMETER :: M9N1STVxi = 640 + INTEGER(IntKi), PARAMETER :: M9N2STVxi = 641 + INTEGER(IntKi), PARAMETER :: M9N3STVxi = 642 + INTEGER(IntKi), PARAMETER :: M9N4STVxi = 643 + INTEGER(IntKi), PARAMETER :: M9N5STVxi = 644 + INTEGER(IntKi), PARAMETER :: M9N6STVxi = 645 + INTEGER(IntKi), PARAMETER :: M9N7STVxi = 646 + INTEGER(IntKi), PARAMETER :: M9N8STVxi = 647 + INTEGER(IntKi), PARAMETER :: M9N9STVxi = 648 + INTEGER(IntKi), PARAMETER :: M1N1STVyi = 649 + INTEGER(IntKi), PARAMETER :: M1N2STVyi = 650 + INTEGER(IntKi), PARAMETER :: M1N3STVyi = 651 + INTEGER(IntKi), PARAMETER :: M1N4STVyi = 652 + INTEGER(IntKi), PARAMETER :: M1N5STVyi = 653 + INTEGER(IntKi), PARAMETER :: M1N6STVyi = 654 + INTEGER(IntKi), PARAMETER :: M1N7STVyi = 655 + INTEGER(IntKi), PARAMETER :: M1N8STVyi = 656 + INTEGER(IntKi), PARAMETER :: M1N9STVyi = 657 + INTEGER(IntKi), PARAMETER :: M2N1STVyi = 658 + INTEGER(IntKi), PARAMETER :: M2N2STVyi = 659 + INTEGER(IntKi), PARAMETER :: M2N3STVyi = 660 + INTEGER(IntKi), PARAMETER :: M2N4STVyi = 661 + INTEGER(IntKi), PARAMETER :: M2N5STVyi = 662 + INTEGER(IntKi), PARAMETER :: M2N6STVyi = 663 + INTEGER(IntKi), PARAMETER :: M2N7STVyi = 664 + INTEGER(IntKi), PARAMETER :: M2N8STVyi = 665 + INTEGER(IntKi), PARAMETER :: M2N9STVyi = 666 + INTEGER(IntKi), PARAMETER :: M3N1STVyi = 667 + INTEGER(IntKi), PARAMETER :: M3N2STVyi = 668 + INTEGER(IntKi), PARAMETER :: M3N3STVyi = 669 + INTEGER(IntKi), PARAMETER :: M3N4STVyi = 670 + INTEGER(IntKi), PARAMETER :: M3N5STVyi = 671 + INTEGER(IntKi), PARAMETER :: M3N6STVyi = 672 + INTEGER(IntKi), PARAMETER :: M3N7STVyi = 673 + INTEGER(IntKi), PARAMETER :: M3N8STVyi = 674 + INTEGER(IntKi), PARAMETER :: M3N9STVyi = 675 + INTEGER(IntKi), PARAMETER :: M4N1STVyi = 676 + INTEGER(IntKi), PARAMETER :: M4N2STVyi = 677 + INTEGER(IntKi), PARAMETER :: M4N3STVyi = 678 + INTEGER(IntKi), PARAMETER :: M4N4STVyi = 679 + INTEGER(IntKi), PARAMETER :: M4N5STVyi = 680 + INTEGER(IntKi), PARAMETER :: M4N6STVyi = 681 + INTEGER(IntKi), PARAMETER :: M4N7STVyi = 682 + INTEGER(IntKi), PARAMETER :: M4N8STVyi = 683 + INTEGER(IntKi), PARAMETER :: M4N9STVyi = 684 + INTEGER(IntKi), PARAMETER :: M5N1STVyi = 685 + INTEGER(IntKi), PARAMETER :: M5N2STVyi = 686 + INTEGER(IntKi), PARAMETER :: M5N3STVyi = 687 + INTEGER(IntKi), PARAMETER :: M5N4STVyi = 688 + INTEGER(IntKi), PARAMETER :: M5N5STVyi = 689 + INTEGER(IntKi), PARAMETER :: M5N6STVyi = 690 + INTEGER(IntKi), PARAMETER :: M5N7STVyi = 691 + INTEGER(IntKi), PARAMETER :: M5N8STVyi = 692 + INTEGER(IntKi), PARAMETER :: M5N9STVyi = 693 + INTEGER(IntKi), PARAMETER :: M6N1STVyi = 694 + INTEGER(IntKi), PARAMETER :: M6N2STVyi = 695 + INTEGER(IntKi), PARAMETER :: M6N3STVyi = 696 + INTEGER(IntKi), PARAMETER :: M6N4STVyi = 697 + INTEGER(IntKi), PARAMETER :: M6N5STVyi = 698 + INTEGER(IntKi), PARAMETER :: M6N6STVyi = 699 + INTEGER(IntKi), PARAMETER :: M6N7STVyi = 700 + INTEGER(IntKi), PARAMETER :: M6N8STVyi = 701 + INTEGER(IntKi), PARAMETER :: M6N9STVyi = 702 + INTEGER(IntKi), PARAMETER :: M7N1STVyi = 703 + INTEGER(IntKi), PARAMETER :: M7N2STVyi = 704 + INTEGER(IntKi), PARAMETER :: M7N3STVyi = 705 + INTEGER(IntKi), PARAMETER :: M7N4STVyi = 706 + INTEGER(IntKi), PARAMETER :: M7N5STVyi = 707 + INTEGER(IntKi), PARAMETER :: M7N6STVyi = 708 + INTEGER(IntKi), PARAMETER :: M7N7STVyi = 709 + INTEGER(IntKi), PARAMETER :: M7N8STVyi = 710 + INTEGER(IntKi), PARAMETER :: M7N9STVyi = 711 + INTEGER(IntKi), PARAMETER :: M8N1STVyi = 712 + INTEGER(IntKi), PARAMETER :: M8N2STVyi = 713 + INTEGER(IntKi), PARAMETER :: M8N3STVyi = 714 + INTEGER(IntKi), PARAMETER :: M8N4STVyi = 715 + INTEGER(IntKi), PARAMETER :: M8N5STVyi = 716 + INTEGER(IntKi), PARAMETER :: M8N6STVyi = 717 + INTEGER(IntKi), PARAMETER :: M8N7STVyi = 718 + INTEGER(IntKi), PARAMETER :: M8N8STVyi = 719 + INTEGER(IntKi), PARAMETER :: M8N9STVyi = 720 + INTEGER(IntKi), PARAMETER :: M9N1STVyi = 721 + INTEGER(IntKi), PARAMETER :: M9N2STVyi = 722 + INTEGER(IntKi), PARAMETER :: M9N3STVyi = 723 + INTEGER(IntKi), PARAMETER :: M9N4STVyi = 724 + INTEGER(IntKi), PARAMETER :: M9N5STVyi = 725 + INTEGER(IntKi), PARAMETER :: M9N6STVyi = 726 + INTEGER(IntKi), PARAMETER :: M9N7STVyi = 727 + INTEGER(IntKi), PARAMETER :: M9N8STVyi = 728 + INTEGER(IntKi), PARAMETER :: M9N9STVyi = 729 + INTEGER(IntKi), PARAMETER :: M1N1STVzi = 730 + INTEGER(IntKi), PARAMETER :: M1N2STVzi = 731 + INTEGER(IntKi), PARAMETER :: M1N3STVzi = 732 + INTEGER(IntKi), PARAMETER :: M1N4STVzi = 733 + INTEGER(IntKi), PARAMETER :: M1N5STVzi = 734 + INTEGER(IntKi), PARAMETER :: M1N6STVzi = 735 + INTEGER(IntKi), PARAMETER :: M1N7STVzi = 736 + INTEGER(IntKi), PARAMETER :: M1N8STVzi = 737 + INTEGER(IntKi), PARAMETER :: M1N9STVzi = 738 + INTEGER(IntKi), PARAMETER :: M2N1STVzi = 739 + INTEGER(IntKi), PARAMETER :: M2N2STVzi = 740 + INTEGER(IntKi), PARAMETER :: M2N3STVzi = 741 + INTEGER(IntKi), PARAMETER :: M2N4STVzi = 742 + INTEGER(IntKi), PARAMETER :: M2N5STVzi = 743 + INTEGER(IntKi), PARAMETER :: M2N6STVzi = 744 + INTEGER(IntKi), PARAMETER :: M2N7STVzi = 745 + INTEGER(IntKi), PARAMETER :: M2N8STVzi = 746 + INTEGER(IntKi), PARAMETER :: M2N9STVzi = 747 + INTEGER(IntKi), PARAMETER :: M3N1STVzi = 748 + INTEGER(IntKi), PARAMETER :: M3N2STVzi = 749 + INTEGER(IntKi), PARAMETER :: M3N3STVzi = 750 + INTEGER(IntKi), PARAMETER :: M3N4STVzi = 751 + INTEGER(IntKi), PARAMETER :: M3N5STVzi = 752 + INTEGER(IntKi), PARAMETER :: M3N6STVzi = 753 + INTEGER(IntKi), PARAMETER :: M3N7STVzi = 754 + INTEGER(IntKi), PARAMETER :: M3N8STVzi = 755 + INTEGER(IntKi), PARAMETER :: M3N9STVzi = 756 + INTEGER(IntKi), PARAMETER :: M4N1STVzi = 757 + INTEGER(IntKi), PARAMETER :: M4N2STVzi = 758 + INTEGER(IntKi), PARAMETER :: M4N3STVzi = 759 + INTEGER(IntKi), PARAMETER :: M4N4STVzi = 760 + INTEGER(IntKi), PARAMETER :: M4N5STVzi = 761 + INTEGER(IntKi), PARAMETER :: M4N6STVzi = 762 + INTEGER(IntKi), PARAMETER :: M4N7STVzi = 763 + INTEGER(IntKi), PARAMETER :: M4N8STVzi = 764 + INTEGER(IntKi), PARAMETER :: M4N9STVzi = 765 + INTEGER(IntKi), PARAMETER :: M5N1STVzi = 766 + INTEGER(IntKi), PARAMETER :: M5N2STVzi = 767 + INTEGER(IntKi), PARAMETER :: M5N3STVzi = 768 + INTEGER(IntKi), PARAMETER :: M5N4STVzi = 769 + INTEGER(IntKi), PARAMETER :: M5N5STVzi = 770 + INTEGER(IntKi), PARAMETER :: M5N6STVzi = 771 + INTEGER(IntKi), PARAMETER :: M5N7STVzi = 772 + INTEGER(IntKi), PARAMETER :: M5N8STVzi = 773 + INTEGER(IntKi), PARAMETER :: M5N9STVzi = 774 + INTEGER(IntKi), PARAMETER :: M6N1STVzi = 775 + INTEGER(IntKi), PARAMETER :: M6N2STVzi = 776 + INTEGER(IntKi), PARAMETER :: M6N3STVzi = 777 + INTEGER(IntKi), PARAMETER :: M6N4STVzi = 778 + INTEGER(IntKi), PARAMETER :: M6N5STVzi = 779 + INTEGER(IntKi), PARAMETER :: M6N6STVzi = 780 + INTEGER(IntKi), PARAMETER :: M6N7STVzi = 781 + INTEGER(IntKi), PARAMETER :: M6N8STVzi = 782 + INTEGER(IntKi), PARAMETER :: M6N9STVzi = 783 + INTEGER(IntKi), PARAMETER :: M7N1STVzi = 784 + INTEGER(IntKi), PARAMETER :: M7N2STVzi = 785 + INTEGER(IntKi), PARAMETER :: M7N3STVzi = 786 + INTEGER(IntKi), PARAMETER :: M7N4STVzi = 787 + INTEGER(IntKi), PARAMETER :: M7N5STVzi = 788 + INTEGER(IntKi), PARAMETER :: M7N6STVzi = 789 + INTEGER(IntKi), PARAMETER :: M7N7STVzi = 790 + INTEGER(IntKi), PARAMETER :: M7N8STVzi = 791 + INTEGER(IntKi), PARAMETER :: M7N9STVzi = 792 + INTEGER(IntKi), PARAMETER :: M8N1STVzi = 793 + INTEGER(IntKi), PARAMETER :: M8N2STVzi = 794 + INTEGER(IntKi), PARAMETER :: M8N3STVzi = 795 + INTEGER(IntKi), PARAMETER :: M8N4STVzi = 796 + INTEGER(IntKi), PARAMETER :: M8N5STVzi = 797 + INTEGER(IntKi), PARAMETER :: M8N6STVzi = 798 + INTEGER(IntKi), PARAMETER :: M8N7STVzi = 799 + INTEGER(IntKi), PARAMETER :: M8N8STVzi = 800 + INTEGER(IntKi), PARAMETER :: M8N9STVzi = 801 + INTEGER(IntKi), PARAMETER :: M9N1STVzi = 802 + INTEGER(IntKi), PARAMETER :: M9N2STVzi = 803 + INTEGER(IntKi), PARAMETER :: M9N3STVzi = 804 + INTEGER(IntKi), PARAMETER :: M9N4STVzi = 805 + INTEGER(IntKi), PARAMETER :: M9N5STVzi = 806 + INTEGER(IntKi), PARAMETER :: M9N6STVzi = 807 + INTEGER(IntKi), PARAMETER :: M9N7STVzi = 808 + INTEGER(IntKi), PARAMETER :: M9N8STVzi = 809 + INTEGER(IntKi), PARAMETER :: M9N9STVzi = 810 + INTEGER(IntKi), PARAMETER :: M1N1STAxi = 811 + INTEGER(IntKi), PARAMETER :: M1N2STAxi = 812 + INTEGER(IntKi), PARAMETER :: M1N3STAxi = 813 + INTEGER(IntKi), PARAMETER :: M1N4STAxi = 814 + INTEGER(IntKi), PARAMETER :: M1N5STAxi = 815 + INTEGER(IntKi), PARAMETER :: M1N6STAxi = 816 + INTEGER(IntKi), PARAMETER :: M1N7STAxi = 817 + INTEGER(IntKi), PARAMETER :: M1N8STAxi = 818 + INTEGER(IntKi), PARAMETER :: M1N9STAxi = 819 + INTEGER(IntKi), PARAMETER :: M2N1STAxi = 820 + INTEGER(IntKi), PARAMETER :: M2N2STAxi = 821 + INTEGER(IntKi), PARAMETER :: M2N3STAxi = 822 + INTEGER(IntKi), PARAMETER :: M2N4STAxi = 823 + INTEGER(IntKi), PARAMETER :: M2N5STAxi = 824 + INTEGER(IntKi), PARAMETER :: M2N6STAxi = 825 + INTEGER(IntKi), PARAMETER :: M2N7STAxi = 826 + INTEGER(IntKi), PARAMETER :: M2N8STAxi = 827 + INTEGER(IntKi), PARAMETER :: M2N9STAxi = 828 + INTEGER(IntKi), PARAMETER :: M3N1STAxi = 829 + INTEGER(IntKi), PARAMETER :: M3N2STAxi = 830 + INTEGER(IntKi), PARAMETER :: M3N3STAxi = 831 + INTEGER(IntKi), PARAMETER :: M3N4STAxi = 832 + INTEGER(IntKi), PARAMETER :: M3N5STAxi = 833 + INTEGER(IntKi), PARAMETER :: M3N6STAxi = 834 + INTEGER(IntKi), PARAMETER :: M3N7STAxi = 835 + INTEGER(IntKi), PARAMETER :: M3N8STAxi = 836 + INTEGER(IntKi), PARAMETER :: M3N9STAxi = 837 + INTEGER(IntKi), PARAMETER :: M4N1STAxi = 838 + INTEGER(IntKi), PARAMETER :: M4N2STAxi = 839 + INTEGER(IntKi), PARAMETER :: M4N3STAxi = 840 + INTEGER(IntKi), PARAMETER :: M4N4STAxi = 841 + INTEGER(IntKi), PARAMETER :: M4N5STAxi = 842 + INTEGER(IntKi), PARAMETER :: M4N6STAxi = 843 + INTEGER(IntKi), PARAMETER :: M4N7STAxi = 844 + INTEGER(IntKi), PARAMETER :: M4N8STAxi = 845 + INTEGER(IntKi), PARAMETER :: M4N9STAxi = 846 + INTEGER(IntKi), PARAMETER :: M5N1STAxi = 847 + INTEGER(IntKi), PARAMETER :: M5N2STAxi = 848 + INTEGER(IntKi), PARAMETER :: M5N3STAxi = 849 + INTEGER(IntKi), PARAMETER :: M5N4STAxi = 850 + INTEGER(IntKi), PARAMETER :: M5N5STAxi = 851 + INTEGER(IntKi), PARAMETER :: M5N6STAxi = 852 + INTEGER(IntKi), PARAMETER :: M5N7STAxi = 853 + INTEGER(IntKi), PARAMETER :: M5N8STAxi = 854 + INTEGER(IntKi), PARAMETER :: M5N9STAxi = 855 + INTEGER(IntKi), PARAMETER :: M6N1STAxi = 856 + INTEGER(IntKi), PARAMETER :: M6N2STAxi = 857 + INTEGER(IntKi), PARAMETER :: M6N3STAxi = 858 + INTEGER(IntKi), PARAMETER :: M6N4STAxi = 859 + INTEGER(IntKi), PARAMETER :: M6N5STAxi = 860 + INTEGER(IntKi), PARAMETER :: M6N6STAxi = 861 + INTEGER(IntKi), PARAMETER :: M6N7STAxi = 862 + INTEGER(IntKi), PARAMETER :: M6N8STAxi = 863 + INTEGER(IntKi), PARAMETER :: M6N9STAxi = 864 + INTEGER(IntKi), PARAMETER :: M7N1STAxi = 865 + INTEGER(IntKi), PARAMETER :: M7N2STAxi = 866 + INTEGER(IntKi), PARAMETER :: M7N3STAxi = 867 + INTEGER(IntKi), PARAMETER :: M7N4STAxi = 868 + INTEGER(IntKi), PARAMETER :: M7N5STAxi = 869 + INTEGER(IntKi), PARAMETER :: M7N6STAxi = 870 + INTEGER(IntKi), PARAMETER :: M7N7STAxi = 871 + INTEGER(IntKi), PARAMETER :: M7N8STAxi = 872 + INTEGER(IntKi), PARAMETER :: M7N9STAxi = 873 + INTEGER(IntKi), PARAMETER :: M8N1STAxi = 874 + INTEGER(IntKi), PARAMETER :: M8N2STAxi = 875 + INTEGER(IntKi), PARAMETER :: M8N3STAxi = 876 + INTEGER(IntKi), PARAMETER :: M8N4STAxi = 877 + INTEGER(IntKi), PARAMETER :: M8N5STAxi = 878 + INTEGER(IntKi), PARAMETER :: M8N6STAxi = 879 + INTEGER(IntKi), PARAMETER :: M8N7STAxi = 880 + INTEGER(IntKi), PARAMETER :: M8N8STAxi = 881 + INTEGER(IntKi), PARAMETER :: M8N9STAxi = 882 + INTEGER(IntKi), PARAMETER :: M9N1STAxi = 883 + INTEGER(IntKi), PARAMETER :: M9N2STAxi = 884 + INTEGER(IntKi), PARAMETER :: M9N3STAxi = 885 + INTEGER(IntKi), PARAMETER :: M9N4STAxi = 886 + INTEGER(IntKi), PARAMETER :: M9N5STAxi = 887 + INTEGER(IntKi), PARAMETER :: M9N6STAxi = 888 + INTEGER(IntKi), PARAMETER :: M9N7STAxi = 889 + INTEGER(IntKi), PARAMETER :: M9N8STAxi = 890 + INTEGER(IntKi), PARAMETER :: M9N9STAxi = 891 + INTEGER(IntKi), PARAMETER :: M1N1STAyi = 892 + INTEGER(IntKi), PARAMETER :: M1N2STAyi = 893 + INTEGER(IntKi), PARAMETER :: M1N3STAyi = 894 + INTEGER(IntKi), PARAMETER :: M1N4STAyi = 895 + INTEGER(IntKi), PARAMETER :: M1N5STAyi = 896 + INTEGER(IntKi), PARAMETER :: M1N6STAyi = 897 + INTEGER(IntKi), PARAMETER :: M1N7STAyi = 898 + INTEGER(IntKi), PARAMETER :: M1N8STAyi = 899 + INTEGER(IntKi), PARAMETER :: M1N9STAyi = 900 + INTEGER(IntKi), PARAMETER :: M2N1STAyi = 901 + INTEGER(IntKi), PARAMETER :: M2N2STAyi = 902 + INTEGER(IntKi), PARAMETER :: M2N3STAyi = 903 + INTEGER(IntKi), PARAMETER :: M2N4STAyi = 904 + INTEGER(IntKi), PARAMETER :: M2N5STAyi = 905 + INTEGER(IntKi), PARAMETER :: M2N6STAyi = 906 + INTEGER(IntKi), PARAMETER :: M2N7STAyi = 907 + INTEGER(IntKi), PARAMETER :: M2N8STAyi = 908 + INTEGER(IntKi), PARAMETER :: M2N9STAyi = 909 + INTEGER(IntKi), PARAMETER :: M3N1STAyi = 910 + INTEGER(IntKi), PARAMETER :: M3N2STAyi = 911 + INTEGER(IntKi), PARAMETER :: M3N3STAyi = 912 + INTEGER(IntKi), PARAMETER :: M3N4STAyi = 913 + INTEGER(IntKi), PARAMETER :: M3N5STAyi = 914 + INTEGER(IntKi), PARAMETER :: M3N6STAyi = 915 + INTEGER(IntKi), PARAMETER :: M3N7STAyi = 916 + INTEGER(IntKi), PARAMETER :: M3N8STAyi = 917 + INTEGER(IntKi), PARAMETER :: M3N9STAyi = 918 + INTEGER(IntKi), PARAMETER :: M4N1STAyi = 919 + INTEGER(IntKi), PARAMETER :: M4N2STAyi = 920 + INTEGER(IntKi), PARAMETER :: M4N3STAyi = 921 + INTEGER(IntKi), PARAMETER :: M4N4STAyi = 922 + INTEGER(IntKi), PARAMETER :: M4N5STAyi = 923 + INTEGER(IntKi), PARAMETER :: M4N6STAyi = 924 + INTEGER(IntKi), PARAMETER :: M4N7STAyi = 925 + INTEGER(IntKi), PARAMETER :: M4N8STAyi = 926 + INTEGER(IntKi), PARAMETER :: M4N9STAyi = 927 + INTEGER(IntKi), PARAMETER :: M5N1STAyi = 928 + INTEGER(IntKi), PARAMETER :: M5N2STAyi = 929 + INTEGER(IntKi), PARAMETER :: M5N3STAyi = 930 + INTEGER(IntKi), PARAMETER :: M5N4STAyi = 931 + INTEGER(IntKi), PARAMETER :: M5N5STAyi = 932 + INTEGER(IntKi), PARAMETER :: M5N6STAyi = 933 + INTEGER(IntKi), PARAMETER :: M5N7STAyi = 934 + INTEGER(IntKi), PARAMETER :: M5N8STAyi = 935 + INTEGER(IntKi), PARAMETER :: M5N9STAyi = 936 + INTEGER(IntKi), PARAMETER :: M6N1STAyi = 937 + INTEGER(IntKi), PARAMETER :: M6N2STAyi = 938 + INTEGER(IntKi), PARAMETER :: M6N3STAyi = 939 + INTEGER(IntKi), PARAMETER :: M6N4STAyi = 940 + INTEGER(IntKi), PARAMETER :: M6N5STAyi = 941 + INTEGER(IntKi), PARAMETER :: M6N6STAyi = 942 + INTEGER(IntKi), PARAMETER :: M6N7STAyi = 943 + INTEGER(IntKi), PARAMETER :: M6N8STAyi = 944 + INTEGER(IntKi), PARAMETER :: M6N9STAyi = 945 + INTEGER(IntKi), PARAMETER :: M7N1STAyi = 946 + INTEGER(IntKi), PARAMETER :: M7N2STAyi = 947 + INTEGER(IntKi), PARAMETER :: M7N3STAyi = 948 + INTEGER(IntKi), PARAMETER :: M7N4STAyi = 949 + INTEGER(IntKi), PARAMETER :: M7N5STAyi = 950 + INTEGER(IntKi), PARAMETER :: M7N6STAyi = 951 + INTEGER(IntKi), PARAMETER :: M7N7STAyi = 952 + INTEGER(IntKi), PARAMETER :: M7N8STAyi = 953 + INTEGER(IntKi), PARAMETER :: M7N9STAyi = 954 + INTEGER(IntKi), PARAMETER :: M8N1STAyi = 955 + INTEGER(IntKi), PARAMETER :: M8N2STAyi = 956 + INTEGER(IntKi), PARAMETER :: M8N3STAyi = 957 + INTEGER(IntKi), PARAMETER :: M8N4STAyi = 958 + INTEGER(IntKi), PARAMETER :: M8N5STAyi = 959 + INTEGER(IntKi), PARAMETER :: M8N6STAyi = 960 + INTEGER(IntKi), PARAMETER :: M8N7STAyi = 961 + INTEGER(IntKi), PARAMETER :: M8N8STAyi = 962 + INTEGER(IntKi), PARAMETER :: M8N9STAyi = 963 + INTEGER(IntKi), PARAMETER :: M9N1STAyi = 964 + INTEGER(IntKi), PARAMETER :: M9N2STAyi = 965 + INTEGER(IntKi), PARAMETER :: M9N3STAyi = 966 + INTEGER(IntKi), PARAMETER :: M9N4STAyi = 967 + INTEGER(IntKi), PARAMETER :: M9N5STAyi = 968 + INTEGER(IntKi), PARAMETER :: M9N6STAyi = 969 + INTEGER(IntKi), PARAMETER :: M9N7STAyi = 970 + INTEGER(IntKi), PARAMETER :: M9N8STAyi = 971 + INTEGER(IntKi), PARAMETER :: M9N9STAyi = 972 + INTEGER(IntKi), PARAMETER :: M1N1STAzi = 973 + INTEGER(IntKi), PARAMETER :: M1N2STAzi = 974 + INTEGER(IntKi), PARAMETER :: M1N3STAzi = 975 + INTEGER(IntKi), PARAMETER :: M1N4STAzi = 976 + INTEGER(IntKi), PARAMETER :: M1N5STAzi = 977 + INTEGER(IntKi), PARAMETER :: M1N6STAzi = 978 + INTEGER(IntKi), PARAMETER :: M1N7STAzi = 979 + INTEGER(IntKi), PARAMETER :: M1N8STAzi = 980 + INTEGER(IntKi), PARAMETER :: M1N9STAzi = 981 + INTEGER(IntKi), PARAMETER :: M2N1STAzi = 982 + INTEGER(IntKi), PARAMETER :: M2N2STAzi = 983 + INTEGER(IntKi), PARAMETER :: M2N3STAzi = 984 + INTEGER(IntKi), PARAMETER :: M2N4STAzi = 985 + INTEGER(IntKi), PARAMETER :: M2N5STAzi = 986 + INTEGER(IntKi), PARAMETER :: M2N6STAzi = 987 + INTEGER(IntKi), PARAMETER :: M2N7STAzi = 988 + INTEGER(IntKi), PARAMETER :: M2N8STAzi = 989 + INTEGER(IntKi), PARAMETER :: M2N9STAzi = 990 + INTEGER(IntKi), PARAMETER :: M3N1STAzi = 991 + INTEGER(IntKi), PARAMETER :: M3N2STAzi = 992 + INTEGER(IntKi), PARAMETER :: M3N3STAzi = 993 + INTEGER(IntKi), PARAMETER :: M3N4STAzi = 994 + INTEGER(IntKi), PARAMETER :: M3N5STAzi = 995 + INTEGER(IntKi), PARAMETER :: M3N6STAzi = 996 + INTEGER(IntKi), PARAMETER :: M3N7STAzi = 997 + INTEGER(IntKi), PARAMETER :: M3N8STAzi = 998 + INTEGER(IntKi), PARAMETER :: M3N9STAzi = 999 + INTEGER(IntKi), PARAMETER :: M4N1STAzi = 1000 + INTEGER(IntKi), PARAMETER :: M4N2STAzi = 1001 + INTEGER(IntKi), PARAMETER :: M4N3STAzi = 1002 + INTEGER(IntKi), PARAMETER :: M4N4STAzi = 1003 + INTEGER(IntKi), PARAMETER :: M4N5STAzi = 1004 + INTEGER(IntKi), PARAMETER :: M4N6STAzi = 1005 + INTEGER(IntKi), PARAMETER :: M4N7STAzi = 1006 + INTEGER(IntKi), PARAMETER :: M4N8STAzi = 1007 + INTEGER(IntKi), PARAMETER :: M4N9STAzi = 1008 + INTEGER(IntKi), PARAMETER :: M5N1STAzi = 1009 + INTEGER(IntKi), PARAMETER :: M5N2STAzi = 1010 + INTEGER(IntKi), PARAMETER :: M5N3STAzi = 1011 + INTEGER(IntKi), PARAMETER :: M5N4STAzi = 1012 + INTEGER(IntKi), PARAMETER :: M5N5STAzi = 1013 + INTEGER(IntKi), PARAMETER :: M5N6STAzi = 1014 + INTEGER(IntKi), PARAMETER :: M5N7STAzi = 1015 + INTEGER(IntKi), PARAMETER :: M5N8STAzi = 1016 + INTEGER(IntKi), PARAMETER :: M5N9STAzi = 1017 + INTEGER(IntKi), PARAMETER :: M6N1STAzi = 1018 + INTEGER(IntKi), PARAMETER :: M6N2STAzi = 1019 + INTEGER(IntKi), PARAMETER :: M6N3STAzi = 1020 + INTEGER(IntKi), PARAMETER :: M6N4STAzi = 1021 + INTEGER(IntKi), PARAMETER :: M6N5STAzi = 1022 + INTEGER(IntKi), PARAMETER :: M6N6STAzi = 1023 + INTEGER(IntKi), PARAMETER :: M6N7STAzi = 1024 + INTEGER(IntKi), PARAMETER :: M6N8STAzi = 1025 + INTEGER(IntKi), PARAMETER :: M6N9STAzi = 1026 + INTEGER(IntKi), PARAMETER :: M7N1STAzi = 1027 + INTEGER(IntKi), PARAMETER :: M7N2STAzi = 1028 + INTEGER(IntKi), PARAMETER :: M7N3STAzi = 1029 + INTEGER(IntKi), PARAMETER :: M7N4STAzi = 1030 + INTEGER(IntKi), PARAMETER :: M7N5STAzi = 1031 + INTEGER(IntKi), PARAMETER :: M7N6STAzi = 1032 + INTEGER(IntKi), PARAMETER :: M7N7STAzi = 1033 + INTEGER(IntKi), PARAMETER :: M7N8STAzi = 1034 + INTEGER(IntKi), PARAMETER :: M7N9STAzi = 1035 + INTEGER(IntKi), PARAMETER :: M8N1STAzi = 1036 + INTEGER(IntKi), PARAMETER :: M8N2STAzi = 1037 + INTEGER(IntKi), PARAMETER :: M8N3STAzi = 1038 + INTEGER(IntKi), PARAMETER :: M8N4STAzi = 1039 + INTEGER(IntKi), PARAMETER :: M8N5STAzi = 1040 + INTEGER(IntKi), PARAMETER :: M8N6STAzi = 1041 + INTEGER(IntKi), PARAMETER :: M8N7STAzi = 1042 + INTEGER(IntKi), PARAMETER :: M8N8STAzi = 1043 + INTEGER(IntKi), PARAMETER :: M8N9STAzi = 1044 + INTEGER(IntKi), PARAMETER :: M9N1STAzi = 1045 + INTEGER(IntKi), PARAMETER :: M9N2STAzi = 1046 + INTEGER(IntKi), PARAMETER :: M9N3STAzi = 1047 + INTEGER(IntKi), PARAMETER :: M9N4STAzi = 1048 + INTEGER(IntKi), PARAMETER :: M9N5STAzi = 1049 + INTEGER(IntKi), PARAMETER :: M9N6STAzi = 1050 + INTEGER(IntKi), PARAMETER :: M9N7STAzi = 1051 + INTEGER(IntKi), PARAMETER :: M9N8STAzi = 1052 + INTEGER(IntKi), PARAMETER :: M9N9STAzi = 1053 ! Morison Element Loads: - INTEGER(IntKi), PARAMETER :: M1N1FDxi = 1054 - INTEGER(IntKi), PARAMETER :: M1N2FDxi = 1055 - INTEGER(IntKi), PARAMETER :: M1N3FDxi = 1056 - INTEGER(IntKi), PARAMETER :: M1N4FDxi = 1057 - INTEGER(IntKi), PARAMETER :: M1N5FDxi = 1058 - INTEGER(IntKi), PARAMETER :: M1N6FDxi = 1059 - INTEGER(IntKi), PARAMETER :: M1N7FDxi = 1060 - INTEGER(IntKi), PARAMETER :: M1N8FDxi = 1061 - INTEGER(IntKi), PARAMETER :: M1N9FDxi = 1062 - INTEGER(IntKi), PARAMETER :: M2N1FDxi = 1063 - INTEGER(IntKi), PARAMETER :: M2N2FDxi = 1064 - INTEGER(IntKi), PARAMETER :: M2N3FDxi = 1065 - INTEGER(IntKi), PARAMETER :: M2N4FDxi = 1066 - INTEGER(IntKi), PARAMETER :: M2N5FDxi = 1067 - INTEGER(IntKi), PARAMETER :: M2N6FDxi = 1068 - INTEGER(IntKi), PARAMETER :: M2N7FDxi = 1069 - INTEGER(IntKi), PARAMETER :: M2N8FDxi = 1070 - INTEGER(IntKi), PARAMETER :: M2N9FDxi = 1071 - INTEGER(IntKi), PARAMETER :: M3N1FDxi = 1072 - INTEGER(IntKi), PARAMETER :: M3N2FDxi = 1073 - INTEGER(IntKi), PARAMETER :: M3N3FDxi = 1074 - INTEGER(IntKi), PARAMETER :: M3N4FDxi = 1075 - INTEGER(IntKi), PARAMETER :: M3N5FDxi = 1076 - INTEGER(IntKi), PARAMETER :: M3N6FDxi = 1077 - INTEGER(IntKi), PARAMETER :: M3N7FDxi = 1078 - INTEGER(IntKi), PARAMETER :: M3N8FDxi = 1079 - INTEGER(IntKi), PARAMETER :: M3N9FDxi = 1080 - INTEGER(IntKi), PARAMETER :: M4N1FDxi = 1081 - INTEGER(IntKi), PARAMETER :: M4N2FDxi = 1082 - INTEGER(IntKi), PARAMETER :: M4N3FDxi = 1083 - INTEGER(IntKi), PARAMETER :: M4N4FDxi = 1084 - INTEGER(IntKi), PARAMETER :: M4N5FDxi = 1085 - INTEGER(IntKi), PARAMETER :: M4N6FDxi = 1086 - INTEGER(IntKi), PARAMETER :: M4N7FDxi = 1087 - INTEGER(IntKi), PARAMETER :: M4N8FDxi = 1088 - INTEGER(IntKi), PARAMETER :: M4N9FDxi = 1089 - INTEGER(IntKi), PARAMETER :: M5N1FDxi = 1090 - INTEGER(IntKi), PARAMETER :: M5N2FDxi = 1091 - INTEGER(IntKi), PARAMETER :: M5N3FDxi = 1092 - INTEGER(IntKi), PARAMETER :: M5N4FDxi = 1093 - INTEGER(IntKi), PARAMETER :: M5N5FDxi = 1094 - INTEGER(IntKi), PARAMETER :: M5N6FDxi = 1095 - INTEGER(IntKi), PARAMETER :: M5N7FDxi = 1096 - INTEGER(IntKi), PARAMETER :: M5N8FDxi = 1097 - INTEGER(IntKi), PARAMETER :: M5N9FDxi = 1098 - INTEGER(IntKi), PARAMETER :: M6N1FDxi = 1099 - INTEGER(IntKi), PARAMETER :: M6N2FDxi = 1100 - INTEGER(IntKi), PARAMETER :: M6N3FDxi = 1101 - INTEGER(IntKi), PARAMETER :: M6N4FDxi = 1102 - INTEGER(IntKi), PARAMETER :: M6N5FDxi = 1103 - INTEGER(IntKi), PARAMETER :: M6N6FDxi = 1104 - INTEGER(IntKi), PARAMETER :: M6N7FDxi = 1105 - INTEGER(IntKi), PARAMETER :: M6N8FDxi = 1106 - INTEGER(IntKi), PARAMETER :: M6N9FDxi = 1107 - INTEGER(IntKi), PARAMETER :: M7N1FDxi = 1108 - INTEGER(IntKi), PARAMETER :: M7N2FDxi = 1109 - INTEGER(IntKi), PARAMETER :: M7N3FDxi = 1110 - INTEGER(IntKi), PARAMETER :: M7N4FDxi = 1111 - INTEGER(IntKi), PARAMETER :: M7N5FDxi = 1112 - INTEGER(IntKi), PARAMETER :: M7N6FDxi = 1113 - INTEGER(IntKi), PARAMETER :: M7N7FDxi = 1114 - INTEGER(IntKi), PARAMETER :: M7N8FDxi = 1115 - INTEGER(IntKi), PARAMETER :: M7N9FDxi = 1116 - INTEGER(IntKi), PARAMETER :: M8N1FDxi = 1117 - INTEGER(IntKi), PARAMETER :: M8N2FDxi = 1118 - INTEGER(IntKi), PARAMETER :: M8N3FDxi = 1119 - INTEGER(IntKi), PARAMETER :: M8N4FDxi = 1120 - INTEGER(IntKi), PARAMETER :: M8N5FDxi = 1121 - INTEGER(IntKi), PARAMETER :: M8N6FDxi = 1122 - INTEGER(IntKi), PARAMETER :: M8N7FDxi = 1123 - INTEGER(IntKi), PARAMETER :: M8N8FDxi = 1124 - INTEGER(IntKi), PARAMETER :: M8N9FDxi = 1125 - INTEGER(IntKi), PARAMETER :: M9N1FDxi = 1126 - INTEGER(IntKi), PARAMETER :: M9N2FDxi = 1127 - INTEGER(IntKi), PARAMETER :: M9N3FDxi = 1128 - INTEGER(IntKi), PARAMETER :: M9N4FDxi = 1129 - INTEGER(IntKi), PARAMETER :: M9N5FDxi = 1130 - INTEGER(IntKi), PARAMETER :: M9N6FDxi = 1131 - INTEGER(IntKi), PARAMETER :: M9N7FDxi = 1132 - INTEGER(IntKi), PARAMETER :: M9N8FDxi = 1133 - INTEGER(IntKi), PARAMETER :: M9N9FDxi = 1134 - INTEGER(IntKi), PARAMETER :: M1N1FDyi = 1135 - INTEGER(IntKi), PARAMETER :: M1N2FDyi = 1136 - INTEGER(IntKi), PARAMETER :: M1N3FDyi = 1137 - INTEGER(IntKi), PARAMETER :: M1N4FDyi = 1138 - INTEGER(IntKi), PARAMETER :: M1N5FDyi = 1139 - INTEGER(IntKi), PARAMETER :: M1N6FDyi = 1140 - INTEGER(IntKi), PARAMETER :: M1N7FDyi = 1141 - INTEGER(IntKi), PARAMETER :: M1N8FDyi = 1142 - INTEGER(IntKi), PARAMETER :: M1N9FDyi = 1143 - INTEGER(IntKi), PARAMETER :: M2N1FDyi = 1144 - INTEGER(IntKi), PARAMETER :: M2N2FDyi = 1145 - INTEGER(IntKi), PARAMETER :: M2N3FDyi = 1146 - INTEGER(IntKi), PARAMETER :: M2N4FDyi = 1147 - INTEGER(IntKi), PARAMETER :: M2N5FDyi = 1148 - INTEGER(IntKi), PARAMETER :: M2N6FDyi = 1149 - INTEGER(IntKi), PARAMETER :: M2N7FDyi = 1150 - INTEGER(IntKi), PARAMETER :: M2N8FDyi = 1151 - INTEGER(IntKi), PARAMETER :: M2N9FDyi = 1152 - INTEGER(IntKi), PARAMETER :: M3N1FDyi = 1153 - INTEGER(IntKi), PARAMETER :: M3N2FDyi = 1154 - INTEGER(IntKi), PARAMETER :: M3N3FDyi = 1155 - INTEGER(IntKi), PARAMETER :: M3N4FDyi = 1156 - INTEGER(IntKi), PARAMETER :: M3N5FDyi = 1157 - INTEGER(IntKi), PARAMETER :: M3N6FDyi = 1158 - INTEGER(IntKi), PARAMETER :: M3N7FDyi = 1159 - INTEGER(IntKi), PARAMETER :: M3N8FDyi = 1160 - INTEGER(IntKi), PARAMETER :: M3N9FDyi = 1161 - INTEGER(IntKi), PARAMETER :: M4N1FDyi = 1162 - INTEGER(IntKi), PARAMETER :: M4N2FDyi = 1163 - INTEGER(IntKi), PARAMETER :: M4N3FDyi = 1164 - INTEGER(IntKi), PARAMETER :: M4N4FDyi = 1165 - INTEGER(IntKi), PARAMETER :: M4N5FDyi = 1166 - INTEGER(IntKi), PARAMETER :: M4N6FDyi = 1167 - INTEGER(IntKi), PARAMETER :: M4N7FDyi = 1168 - INTEGER(IntKi), PARAMETER :: M4N8FDyi = 1169 - INTEGER(IntKi), PARAMETER :: M4N9FDyi = 1170 - INTEGER(IntKi), PARAMETER :: M5N1FDyi = 1171 - INTEGER(IntKi), PARAMETER :: M5N2FDyi = 1172 - INTEGER(IntKi), PARAMETER :: M5N3FDyi = 1173 - INTEGER(IntKi), PARAMETER :: M5N4FDyi = 1174 - INTEGER(IntKi), PARAMETER :: M5N5FDyi = 1175 - INTEGER(IntKi), PARAMETER :: M5N6FDyi = 1176 - INTEGER(IntKi), PARAMETER :: M5N7FDyi = 1177 - INTEGER(IntKi), PARAMETER :: M5N8FDyi = 1178 - INTEGER(IntKi), PARAMETER :: M5N9FDyi = 1179 - INTEGER(IntKi), PARAMETER :: M6N1FDyi = 1180 - INTEGER(IntKi), PARAMETER :: M6N2FDyi = 1181 - INTEGER(IntKi), PARAMETER :: M6N3FDyi = 1182 - INTEGER(IntKi), PARAMETER :: M6N4FDyi = 1183 - INTEGER(IntKi), PARAMETER :: M6N5FDyi = 1184 - INTEGER(IntKi), PARAMETER :: M6N6FDyi = 1185 - INTEGER(IntKi), PARAMETER :: M6N7FDyi = 1186 - INTEGER(IntKi), PARAMETER :: M6N8FDyi = 1187 - INTEGER(IntKi), PARAMETER :: M6N9FDyi = 1188 - INTEGER(IntKi), PARAMETER :: M7N1FDyi = 1189 - INTEGER(IntKi), PARAMETER :: M7N2FDyi = 1190 - INTEGER(IntKi), PARAMETER :: M7N3FDyi = 1191 - INTEGER(IntKi), PARAMETER :: M7N4FDyi = 1192 - INTEGER(IntKi), PARAMETER :: M7N5FDyi = 1193 - INTEGER(IntKi), PARAMETER :: M7N6FDyi = 1194 - INTEGER(IntKi), PARAMETER :: M7N7FDyi = 1195 - INTEGER(IntKi), PARAMETER :: M7N8FDyi = 1196 - INTEGER(IntKi), PARAMETER :: M7N9FDyi = 1197 - INTEGER(IntKi), PARAMETER :: M8N1FDyi = 1198 - INTEGER(IntKi), PARAMETER :: M8N2FDyi = 1199 - INTEGER(IntKi), PARAMETER :: M8N3FDyi = 1200 - INTEGER(IntKi), PARAMETER :: M8N4FDyi = 1201 - INTEGER(IntKi), PARAMETER :: M8N5FDyi = 1202 - INTEGER(IntKi), PARAMETER :: M8N6FDyi = 1203 - INTEGER(IntKi), PARAMETER :: M8N7FDyi = 1204 - INTEGER(IntKi), PARAMETER :: M8N8FDyi = 1205 - INTEGER(IntKi), PARAMETER :: M8N9FDyi = 1206 - INTEGER(IntKi), PARAMETER :: M9N1FDyi = 1207 - INTEGER(IntKi), PARAMETER :: M9N2FDyi = 1208 - INTEGER(IntKi), PARAMETER :: M9N3FDyi = 1209 - INTEGER(IntKi), PARAMETER :: M9N4FDyi = 1210 - INTEGER(IntKi), PARAMETER :: M9N5FDyi = 1211 - INTEGER(IntKi), PARAMETER :: M9N6FDyi = 1212 - INTEGER(IntKi), PARAMETER :: M9N7FDyi = 1213 - INTEGER(IntKi), PARAMETER :: M9N8FDyi = 1214 - INTEGER(IntKi), PARAMETER :: M9N9FDyi = 1215 - INTEGER(IntKi), PARAMETER :: M1N1FDzi = 1216 - INTEGER(IntKi), PARAMETER :: M1N2FDzi = 1217 - INTEGER(IntKi), PARAMETER :: M1N3FDzi = 1218 - INTEGER(IntKi), PARAMETER :: M1N4FDzi = 1219 - INTEGER(IntKi), PARAMETER :: M1N5FDzi = 1220 - INTEGER(IntKi), PARAMETER :: M1N6FDzi = 1221 - INTEGER(IntKi), PARAMETER :: M1N7FDzi = 1222 - INTEGER(IntKi), PARAMETER :: M1N8FDzi = 1223 - INTEGER(IntKi), PARAMETER :: M1N9FDzi = 1224 - INTEGER(IntKi), PARAMETER :: M2N1FDzi = 1225 - INTEGER(IntKi), PARAMETER :: M2N2FDzi = 1226 - INTEGER(IntKi), PARAMETER :: M2N3FDzi = 1227 - INTEGER(IntKi), PARAMETER :: M2N4FDzi = 1228 - INTEGER(IntKi), PARAMETER :: M2N5FDzi = 1229 - INTEGER(IntKi), PARAMETER :: M2N6FDzi = 1230 - INTEGER(IntKi), PARAMETER :: M2N7FDzi = 1231 - INTEGER(IntKi), PARAMETER :: M2N8FDzi = 1232 - INTEGER(IntKi), PARAMETER :: M2N9FDzi = 1233 - INTEGER(IntKi), PARAMETER :: M3N1FDzi = 1234 - INTEGER(IntKi), PARAMETER :: M3N2FDzi = 1235 - INTEGER(IntKi), PARAMETER :: M3N3FDzi = 1236 - INTEGER(IntKi), PARAMETER :: M3N4FDzi = 1237 - INTEGER(IntKi), PARAMETER :: M3N5FDzi = 1238 - INTEGER(IntKi), PARAMETER :: M3N6FDzi = 1239 - INTEGER(IntKi), PARAMETER :: M3N7FDzi = 1240 - INTEGER(IntKi), PARAMETER :: M3N8FDzi = 1241 - INTEGER(IntKi), PARAMETER :: M3N9FDzi = 1242 - INTEGER(IntKi), PARAMETER :: M4N1FDzi = 1243 - INTEGER(IntKi), PARAMETER :: M4N2FDzi = 1244 - INTEGER(IntKi), PARAMETER :: M4N3FDzi = 1245 - INTEGER(IntKi), PARAMETER :: M4N4FDzi = 1246 - INTEGER(IntKi), PARAMETER :: M4N5FDzi = 1247 - INTEGER(IntKi), PARAMETER :: M4N6FDzi = 1248 - INTEGER(IntKi), PARAMETER :: M4N7FDzi = 1249 - INTEGER(IntKi), PARAMETER :: M4N8FDzi = 1250 - INTEGER(IntKi), PARAMETER :: M4N9FDzi = 1251 - INTEGER(IntKi), PARAMETER :: M5N1FDzi = 1252 - INTEGER(IntKi), PARAMETER :: M5N2FDzi = 1253 - INTEGER(IntKi), PARAMETER :: M5N3FDzi = 1254 - INTEGER(IntKi), PARAMETER :: M5N4FDzi = 1255 - INTEGER(IntKi), PARAMETER :: M5N5FDzi = 1256 - INTEGER(IntKi), PARAMETER :: M5N6FDzi = 1257 - INTEGER(IntKi), PARAMETER :: M5N7FDzi = 1258 - INTEGER(IntKi), PARAMETER :: M5N8FDzi = 1259 - INTEGER(IntKi), PARAMETER :: M5N9FDzi = 1260 - INTEGER(IntKi), PARAMETER :: M6N1FDzi = 1261 - INTEGER(IntKi), PARAMETER :: M6N2FDzi = 1262 - INTEGER(IntKi), PARAMETER :: M6N3FDzi = 1263 - INTEGER(IntKi), PARAMETER :: M6N4FDzi = 1264 - INTEGER(IntKi), PARAMETER :: M6N5FDzi = 1265 - INTEGER(IntKi), PARAMETER :: M6N6FDzi = 1266 - INTEGER(IntKi), PARAMETER :: M6N7FDzi = 1267 - INTEGER(IntKi), PARAMETER :: M6N8FDzi = 1268 - INTEGER(IntKi), PARAMETER :: M6N9FDzi = 1269 - INTEGER(IntKi), PARAMETER :: M7N1FDzi = 1270 - INTEGER(IntKi), PARAMETER :: M7N2FDzi = 1271 - INTEGER(IntKi), PARAMETER :: M7N3FDzi = 1272 - INTEGER(IntKi), PARAMETER :: M7N4FDzi = 1273 - INTEGER(IntKi), PARAMETER :: M7N5FDzi = 1274 - INTEGER(IntKi), PARAMETER :: M7N6FDzi = 1275 - INTEGER(IntKi), PARAMETER :: M7N7FDzi = 1276 - INTEGER(IntKi), PARAMETER :: M7N8FDzi = 1277 - INTEGER(IntKi), PARAMETER :: M7N9FDzi = 1278 - INTEGER(IntKi), PARAMETER :: M8N1FDzi = 1279 - INTEGER(IntKi), PARAMETER :: M8N2FDzi = 1280 - INTEGER(IntKi), PARAMETER :: M8N3FDzi = 1281 - INTEGER(IntKi), PARAMETER :: M8N4FDzi = 1282 - INTEGER(IntKi), PARAMETER :: M8N5FDzi = 1283 - INTEGER(IntKi), PARAMETER :: M8N6FDzi = 1284 - INTEGER(IntKi), PARAMETER :: M8N7FDzi = 1285 - INTEGER(IntKi), PARAMETER :: M8N8FDzi = 1286 - INTEGER(IntKi), PARAMETER :: M8N9FDzi = 1287 - INTEGER(IntKi), PARAMETER :: M9N1FDzi = 1288 - INTEGER(IntKi), PARAMETER :: M9N2FDzi = 1289 - INTEGER(IntKi), PARAMETER :: M9N3FDzi = 1290 - INTEGER(IntKi), PARAMETER :: M9N4FDzi = 1291 - INTEGER(IntKi), PARAMETER :: M9N5FDzi = 1292 - INTEGER(IntKi), PARAMETER :: M9N6FDzi = 1293 - INTEGER(IntKi), PARAMETER :: M9N7FDzi = 1294 - INTEGER(IntKi), PARAMETER :: M9N8FDzi = 1295 - INTEGER(IntKi), PARAMETER :: M9N9FDzi = 1296 - INTEGER(IntKi), PARAMETER :: M1N1FIxi = 1297 - INTEGER(IntKi), PARAMETER :: M1N2FIxi = 1298 - INTEGER(IntKi), PARAMETER :: M1N3FIxi = 1299 - INTEGER(IntKi), PARAMETER :: M1N4FIxi = 1300 - INTEGER(IntKi), PARAMETER :: M1N5FIxi = 1301 - INTEGER(IntKi), PARAMETER :: M1N6FIxi = 1302 - INTEGER(IntKi), PARAMETER :: M1N7FIxi = 1303 - INTEGER(IntKi), PARAMETER :: M1N8FIxi = 1304 - INTEGER(IntKi), PARAMETER :: M1N9FIxi = 1305 - INTEGER(IntKi), PARAMETER :: M2N1FIxi = 1306 - INTEGER(IntKi), PARAMETER :: M2N2FIxi = 1307 - INTEGER(IntKi), PARAMETER :: M2N3FIxi = 1308 - INTEGER(IntKi), PARAMETER :: M2N4FIxi = 1309 - INTEGER(IntKi), PARAMETER :: M2N5FIxi = 1310 - INTEGER(IntKi), PARAMETER :: M2N6FIxi = 1311 - INTEGER(IntKi), PARAMETER :: M2N7FIxi = 1312 - INTEGER(IntKi), PARAMETER :: M2N8FIxi = 1313 - INTEGER(IntKi), PARAMETER :: M2N9FIxi = 1314 - INTEGER(IntKi), PARAMETER :: M3N1FIxi = 1315 - INTEGER(IntKi), PARAMETER :: M3N2FIxi = 1316 - INTEGER(IntKi), PARAMETER :: M3N3FIxi = 1317 - INTEGER(IntKi), PARAMETER :: M3N4FIxi = 1318 - INTEGER(IntKi), PARAMETER :: M3N5FIxi = 1319 - INTEGER(IntKi), PARAMETER :: M3N6FIxi = 1320 - INTEGER(IntKi), PARAMETER :: M3N7FIxi = 1321 - INTEGER(IntKi), PARAMETER :: M3N8FIxi = 1322 - INTEGER(IntKi), PARAMETER :: M3N9FIxi = 1323 - INTEGER(IntKi), PARAMETER :: M4N1FIxi = 1324 - INTEGER(IntKi), PARAMETER :: M4N2FIxi = 1325 - INTEGER(IntKi), PARAMETER :: M4N3FIxi = 1326 - INTEGER(IntKi), PARAMETER :: M4N4FIxi = 1327 - INTEGER(IntKi), PARAMETER :: M4N5FIxi = 1328 - INTEGER(IntKi), PARAMETER :: M4N6FIxi = 1329 - INTEGER(IntKi), PARAMETER :: M4N7FIxi = 1330 - INTEGER(IntKi), PARAMETER :: M4N8FIxi = 1331 - INTEGER(IntKi), PARAMETER :: M4N9FIxi = 1332 - INTEGER(IntKi), PARAMETER :: M5N1FIxi = 1333 - INTEGER(IntKi), PARAMETER :: M5N2FIxi = 1334 - INTEGER(IntKi), PARAMETER :: M5N3FIxi = 1335 - INTEGER(IntKi), PARAMETER :: M5N4FIxi = 1336 - INTEGER(IntKi), PARAMETER :: M5N5FIxi = 1337 - INTEGER(IntKi), PARAMETER :: M5N6FIxi = 1338 - INTEGER(IntKi), PARAMETER :: M5N7FIxi = 1339 - INTEGER(IntKi), PARAMETER :: M5N8FIxi = 1340 - INTEGER(IntKi), PARAMETER :: M5N9FIxi = 1341 - INTEGER(IntKi), PARAMETER :: M6N1FIxi = 1342 - INTEGER(IntKi), PARAMETER :: M6N2FIxi = 1343 - INTEGER(IntKi), PARAMETER :: M6N3FIxi = 1344 - INTEGER(IntKi), PARAMETER :: M6N4FIxi = 1345 - INTEGER(IntKi), PARAMETER :: M6N5FIxi = 1346 - INTEGER(IntKi), PARAMETER :: M6N6FIxi = 1347 - INTEGER(IntKi), PARAMETER :: M6N7FIxi = 1348 - INTEGER(IntKi), PARAMETER :: M6N8FIxi = 1349 - INTEGER(IntKi), PARAMETER :: M6N9FIxi = 1350 - INTEGER(IntKi), PARAMETER :: M7N1FIxi = 1351 - INTEGER(IntKi), PARAMETER :: M7N2FIxi = 1352 - INTEGER(IntKi), PARAMETER :: M7N3FIxi = 1353 - INTEGER(IntKi), PARAMETER :: M7N4FIxi = 1354 - INTEGER(IntKi), PARAMETER :: M7N5FIxi = 1355 - INTEGER(IntKi), PARAMETER :: M7N6FIxi = 1356 - INTEGER(IntKi), PARAMETER :: M7N7FIxi = 1357 - INTEGER(IntKi), PARAMETER :: M7N8FIxi = 1358 - INTEGER(IntKi), PARAMETER :: M7N9FIxi = 1359 - INTEGER(IntKi), PARAMETER :: M8N1FIxi = 1360 - INTEGER(IntKi), PARAMETER :: M8N2FIxi = 1361 - INTEGER(IntKi), PARAMETER :: M8N3FIxi = 1362 - INTEGER(IntKi), PARAMETER :: M8N4FIxi = 1363 - INTEGER(IntKi), PARAMETER :: M8N5FIxi = 1364 - INTEGER(IntKi), PARAMETER :: M8N6FIxi = 1365 - INTEGER(IntKi), PARAMETER :: M8N7FIxi = 1366 - INTEGER(IntKi), PARAMETER :: M8N8FIxi = 1367 - INTEGER(IntKi), PARAMETER :: M8N9FIxi = 1368 - INTEGER(IntKi), PARAMETER :: M9N1FIxi = 1369 - INTEGER(IntKi), PARAMETER :: M9N2FIxi = 1370 - INTEGER(IntKi), PARAMETER :: M9N3FIxi = 1371 - INTEGER(IntKi), PARAMETER :: M9N4FIxi = 1372 - INTEGER(IntKi), PARAMETER :: M9N5FIxi = 1373 - INTEGER(IntKi), PARAMETER :: M9N6FIxi = 1374 - INTEGER(IntKi), PARAMETER :: M9N7FIxi = 1375 - INTEGER(IntKi), PARAMETER :: M9N8FIxi = 1376 - INTEGER(IntKi), PARAMETER :: M9N9FIxi = 1377 - INTEGER(IntKi), PARAMETER :: M1N1FIyi = 1378 - INTEGER(IntKi), PARAMETER :: M1N2FIyi = 1379 - INTEGER(IntKi), PARAMETER :: M1N3FIyi = 1380 - INTEGER(IntKi), PARAMETER :: M1N4FIyi = 1381 - INTEGER(IntKi), PARAMETER :: M1N5FIyi = 1382 - INTEGER(IntKi), PARAMETER :: M1N6FIyi = 1383 - INTEGER(IntKi), PARAMETER :: M1N7FIyi = 1384 - INTEGER(IntKi), PARAMETER :: M1N8FIyi = 1385 - INTEGER(IntKi), PARAMETER :: M1N9FIyi = 1386 - INTEGER(IntKi), PARAMETER :: M2N1FIyi = 1387 - INTEGER(IntKi), PARAMETER :: M2N2FIyi = 1388 - INTEGER(IntKi), PARAMETER :: M2N3FIyi = 1389 - INTEGER(IntKi), PARAMETER :: M2N4FIyi = 1390 - INTEGER(IntKi), PARAMETER :: M2N5FIyi = 1391 - INTEGER(IntKi), PARAMETER :: M2N6FIyi = 1392 - INTEGER(IntKi), PARAMETER :: M2N7FIyi = 1393 - INTEGER(IntKi), PARAMETER :: M2N8FIyi = 1394 - INTEGER(IntKi), PARAMETER :: M2N9FIyi = 1395 - INTEGER(IntKi), PARAMETER :: M3N1FIyi = 1396 - INTEGER(IntKi), PARAMETER :: M3N2FIyi = 1397 - INTEGER(IntKi), PARAMETER :: M3N3FIyi = 1398 - INTEGER(IntKi), PARAMETER :: M3N4FIyi = 1399 - INTEGER(IntKi), PARAMETER :: M3N5FIyi = 1400 - INTEGER(IntKi), PARAMETER :: M3N6FIyi = 1401 - INTEGER(IntKi), PARAMETER :: M3N7FIyi = 1402 - INTEGER(IntKi), PARAMETER :: M3N8FIyi = 1403 - INTEGER(IntKi), PARAMETER :: M3N9FIyi = 1404 - INTEGER(IntKi), PARAMETER :: M4N1FIyi = 1405 - INTEGER(IntKi), PARAMETER :: M4N2FIyi = 1406 - INTEGER(IntKi), PARAMETER :: M4N3FIyi = 1407 - INTEGER(IntKi), PARAMETER :: M4N4FIyi = 1408 - INTEGER(IntKi), PARAMETER :: M4N5FIyi = 1409 - INTEGER(IntKi), PARAMETER :: M4N6FIyi = 1410 - INTEGER(IntKi), PARAMETER :: M4N7FIyi = 1411 - INTEGER(IntKi), PARAMETER :: M4N8FIyi = 1412 - INTEGER(IntKi), PARAMETER :: M4N9FIyi = 1413 - INTEGER(IntKi), PARAMETER :: M5N1FIyi = 1414 - INTEGER(IntKi), PARAMETER :: M5N2FIyi = 1415 - INTEGER(IntKi), PARAMETER :: M5N3FIyi = 1416 - INTEGER(IntKi), PARAMETER :: M5N4FIyi = 1417 - INTEGER(IntKi), PARAMETER :: M5N5FIyi = 1418 - INTEGER(IntKi), PARAMETER :: M5N6FIyi = 1419 - INTEGER(IntKi), PARAMETER :: M5N7FIyi = 1420 - INTEGER(IntKi), PARAMETER :: M5N8FIyi = 1421 - INTEGER(IntKi), PARAMETER :: M5N9FIyi = 1422 - INTEGER(IntKi), PARAMETER :: M6N1FIyi = 1423 - INTEGER(IntKi), PARAMETER :: M6N2FIyi = 1424 - INTEGER(IntKi), PARAMETER :: M6N3FIyi = 1425 - INTEGER(IntKi), PARAMETER :: M6N4FIyi = 1426 - INTEGER(IntKi), PARAMETER :: M6N5FIyi = 1427 - INTEGER(IntKi), PARAMETER :: M6N6FIyi = 1428 - INTEGER(IntKi), PARAMETER :: M6N7FIyi = 1429 - INTEGER(IntKi), PARAMETER :: M6N8FIyi = 1430 - INTEGER(IntKi), PARAMETER :: M6N9FIyi = 1431 - INTEGER(IntKi), PARAMETER :: M7N1FIyi = 1432 - INTEGER(IntKi), PARAMETER :: M7N2FIyi = 1433 - INTEGER(IntKi), PARAMETER :: M7N3FIyi = 1434 - INTEGER(IntKi), PARAMETER :: M7N4FIyi = 1435 - INTEGER(IntKi), PARAMETER :: M7N5FIyi = 1436 - INTEGER(IntKi), PARAMETER :: M7N6FIyi = 1437 - INTEGER(IntKi), PARAMETER :: M7N7FIyi = 1438 - INTEGER(IntKi), PARAMETER :: M7N8FIyi = 1439 - INTEGER(IntKi), PARAMETER :: M7N9FIyi = 1440 - INTEGER(IntKi), PARAMETER :: M8N1FIyi = 1441 - INTEGER(IntKi), PARAMETER :: M8N2FIyi = 1442 - INTEGER(IntKi), PARAMETER :: M8N3FIyi = 1443 - INTEGER(IntKi), PARAMETER :: M8N4FIyi = 1444 - INTEGER(IntKi), PARAMETER :: M8N5FIyi = 1445 - INTEGER(IntKi), PARAMETER :: M8N6FIyi = 1446 - INTEGER(IntKi), PARAMETER :: M8N7FIyi = 1447 - INTEGER(IntKi), PARAMETER :: M8N8FIyi = 1448 - INTEGER(IntKi), PARAMETER :: M8N9FIyi = 1449 - INTEGER(IntKi), PARAMETER :: M9N1FIyi = 1450 - INTEGER(IntKi), PARAMETER :: M9N2FIyi = 1451 - INTEGER(IntKi), PARAMETER :: M9N3FIyi = 1452 - INTEGER(IntKi), PARAMETER :: M9N4FIyi = 1453 - INTEGER(IntKi), PARAMETER :: M9N5FIyi = 1454 - INTEGER(IntKi), PARAMETER :: M9N6FIyi = 1455 - INTEGER(IntKi), PARAMETER :: M9N7FIyi = 1456 - INTEGER(IntKi), PARAMETER :: M9N8FIyi = 1457 - INTEGER(IntKi), PARAMETER :: M9N9FIyi = 1458 - INTEGER(IntKi), PARAMETER :: M1N1FIzi = 1459 - INTEGER(IntKi), PARAMETER :: M1N2FIzi = 1460 - INTEGER(IntKi), PARAMETER :: M1N3FIzi = 1461 - INTEGER(IntKi), PARAMETER :: M1N4FIzi = 1462 - INTEGER(IntKi), PARAMETER :: M1N5FIzi = 1463 - INTEGER(IntKi), PARAMETER :: M1N6FIzi = 1464 - INTEGER(IntKi), PARAMETER :: M1N7FIzi = 1465 - INTEGER(IntKi), PARAMETER :: M1N8FIzi = 1466 - INTEGER(IntKi), PARAMETER :: M1N9FIzi = 1467 - INTEGER(IntKi), PARAMETER :: M2N1FIzi = 1468 - INTEGER(IntKi), PARAMETER :: M2N2FIzi = 1469 - INTEGER(IntKi), PARAMETER :: M2N3FIzi = 1470 - INTEGER(IntKi), PARAMETER :: M2N4FIzi = 1471 - INTEGER(IntKi), PARAMETER :: M2N5FIzi = 1472 - INTEGER(IntKi), PARAMETER :: M2N6FIzi = 1473 - INTEGER(IntKi), PARAMETER :: M2N7FIzi = 1474 - INTEGER(IntKi), PARAMETER :: M2N8FIzi = 1475 - INTEGER(IntKi), PARAMETER :: M2N9FIzi = 1476 - INTEGER(IntKi), PARAMETER :: M3N1FIzi = 1477 - INTEGER(IntKi), PARAMETER :: M3N2FIzi = 1478 - INTEGER(IntKi), PARAMETER :: M3N3FIzi = 1479 - INTEGER(IntKi), PARAMETER :: M3N4FIzi = 1480 - INTEGER(IntKi), PARAMETER :: M3N5FIzi = 1481 - INTEGER(IntKi), PARAMETER :: M3N6FIzi = 1482 - INTEGER(IntKi), PARAMETER :: M3N7FIzi = 1483 - INTEGER(IntKi), PARAMETER :: M3N8FIzi = 1484 - INTEGER(IntKi), PARAMETER :: M3N9FIzi = 1485 - INTEGER(IntKi), PARAMETER :: M4N1FIzi = 1486 - INTEGER(IntKi), PARAMETER :: M4N2FIzi = 1487 - INTEGER(IntKi), PARAMETER :: M4N3FIzi = 1488 - INTEGER(IntKi), PARAMETER :: M4N4FIzi = 1489 - INTEGER(IntKi), PARAMETER :: M4N5FIzi = 1490 - INTEGER(IntKi), PARAMETER :: M4N6FIzi = 1491 - INTEGER(IntKi), PARAMETER :: M4N7FIzi = 1492 - INTEGER(IntKi), PARAMETER :: M4N8FIzi = 1493 - INTEGER(IntKi), PARAMETER :: M4N9FIzi = 1494 - INTEGER(IntKi), PARAMETER :: M5N1FIzi = 1495 - INTEGER(IntKi), PARAMETER :: M5N2FIzi = 1496 - INTEGER(IntKi), PARAMETER :: M5N3FIzi = 1497 - INTEGER(IntKi), PARAMETER :: M5N4FIzi = 1498 - INTEGER(IntKi), PARAMETER :: M5N5FIzi = 1499 - INTEGER(IntKi), PARAMETER :: M5N6FIzi = 1500 - INTEGER(IntKi), PARAMETER :: M5N7FIzi = 1501 - INTEGER(IntKi), PARAMETER :: M5N8FIzi = 1502 - INTEGER(IntKi), PARAMETER :: M5N9FIzi = 1503 - INTEGER(IntKi), PARAMETER :: M6N1FIzi = 1504 - INTEGER(IntKi), PARAMETER :: M6N2FIzi = 1505 - INTEGER(IntKi), PARAMETER :: M6N3FIzi = 1506 - INTEGER(IntKi), PARAMETER :: M6N4FIzi = 1507 - INTEGER(IntKi), PARAMETER :: M6N5FIzi = 1508 - INTEGER(IntKi), PARAMETER :: M6N6FIzi = 1509 - INTEGER(IntKi), PARAMETER :: M6N7FIzi = 1510 - INTEGER(IntKi), PARAMETER :: M6N8FIzi = 1511 - INTEGER(IntKi), PARAMETER :: M6N9FIzi = 1512 - INTEGER(IntKi), PARAMETER :: M7N1FIzi = 1513 - INTEGER(IntKi), PARAMETER :: M7N2FIzi = 1514 - INTEGER(IntKi), PARAMETER :: M7N3FIzi = 1515 - INTEGER(IntKi), PARAMETER :: M7N4FIzi = 1516 - INTEGER(IntKi), PARAMETER :: M7N5FIzi = 1517 - INTEGER(IntKi), PARAMETER :: M7N6FIzi = 1518 - INTEGER(IntKi), PARAMETER :: M7N7FIzi = 1519 - INTEGER(IntKi), PARAMETER :: M7N8FIzi = 1520 - INTEGER(IntKi), PARAMETER :: M7N9FIzi = 1521 - INTEGER(IntKi), PARAMETER :: M8N1FIzi = 1522 - INTEGER(IntKi), PARAMETER :: M8N2FIzi = 1523 - INTEGER(IntKi), PARAMETER :: M8N3FIzi = 1524 - INTEGER(IntKi), PARAMETER :: M8N4FIzi = 1525 - INTEGER(IntKi), PARAMETER :: M8N5FIzi = 1526 - INTEGER(IntKi), PARAMETER :: M8N6FIzi = 1527 - INTEGER(IntKi), PARAMETER :: M8N7FIzi = 1528 - INTEGER(IntKi), PARAMETER :: M8N8FIzi = 1529 - INTEGER(IntKi), PARAMETER :: M8N9FIzi = 1530 - INTEGER(IntKi), PARAMETER :: M9N1FIzi = 1531 - INTEGER(IntKi), PARAMETER :: M9N2FIzi = 1532 - INTEGER(IntKi), PARAMETER :: M9N3FIzi = 1533 - INTEGER(IntKi), PARAMETER :: M9N4FIzi = 1534 - INTEGER(IntKi), PARAMETER :: M9N5FIzi = 1535 - INTEGER(IntKi), PARAMETER :: M9N6FIzi = 1536 - INTEGER(IntKi), PARAMETER :: M9N7FIzi = 1537 - INTEGER(IntKi), PARAMETER :: M9N8FIzi = 1538 - INTEGER(IntKi), PARAMETER :: M9N9FIzi = 1539 - INTEGER(IntKi), PARAMETER :: M1N1FBxi = 1540 - INTEGER(IntKi), PARAMETER :: M1N2FBxi = 1541 - INTEGER(IntKi), PARAMETER :: M1N3FBxi = 1542 - INTEGER(IntKi), PARAMETER :: M1N4FBxi = 1543 - INTEGER(IntKi), PARAMETER :: M1N5FBxi = 1544 - INTEGER(IntKi), PARAMETER :: M1N6FBxi = 1545 - INTEGER(IntKi), PARAMETER :: M1N7FBxi = 1546 - INTEGER(IntKi), PARAMETER :: M1N8FBxi = 1547 - INTEGER(IntKi), PARAMETER :: M1N9FBxi = 1548 - INTEGER(IntKi), PARAMETER :: M2N1FBxi = 1549 - INTEGER(IntKi), PARAMETER :: M2N2FBxi = 1550 - INTEGER(IntKi), PARAMETER :: M2N3FBxi = 1551 - INTEGER(IntKi), PARAMETER :: M2N4FBxi = 1552 - INTEGER(IntKi), PARAMETER :: M2N5FBxi = 1553 - INTEGER(IntKi), PARAMETER :: M2N6FBxi = 1554 - INTEGER(IntKi), PARAMETER :: M2N7FBxi = 1555 - INTEGER(IntKi), PARAMETER :: M2N8FBxi = 1556 - INTEGER(IntKi), PARAMETER :: M2N9FBxi = 1557 - INTEGER(IntKi), PARAMETER :: M3N1FBxi = 1558 - INTEGER(IntKi), PARAMETER :: M3N2FBxi = 1559 - INTEGER(IntKi), PARAMETER :: M3N3FBxi = 1560 - INTEGER(IntKi), PARAMETER :: M3N4FBxi = 1561 - INTEGER(IntKi), PARAMETER :: M3N5FBxi = 1562 - INTEGER(IntKi), PARAMETER :: M3N6FBxi = 1563 - INTEGER(IntKi), PARAMETER :: M3N7FBxi = 1564 - INTEGER(IntKi), PARAMETER :: M3N8FBxi = 1565 - INTEGER(IntKi), PARAMETER :: M3N9FBxi = 1566 - INTEGER(IntKi), PARAMETER :: M4N1FBxi = 1567 - INTEGER(IntKi), PARAMETER :: M4N2FBxi = 1568 - INTEGER(IntKi), PARAMETER :: M4N3FBxi = 1569 - INTEGER(IntKi), PARAMETER :: M4N4FBxi = 1570 - INTEGER(IntKi), PARAMETER :: M4N5FBxi = 1571 - INTEGER(IntKi), PARAMETER :: M4N6FBxi = 1572 - INTEGER(IntKi), PARAMETER :: M4N7FBxi = 1573 - INTEGER(IntKi), PARAMETER :: M4N8FBxi = 1574 - INTEGER(IntKi), PARAMETER :: M4N9FBxi = 1575 - INTEGER(IntKi), PARAMETER :: M5N1FBxi = 1576 - INTEGER(IntKi), PARAMETER :: M5N2FBxi = 1577 - INTEGER(IntKi), PARAMETER :: M5N3FBxi = 1578 - INTEGER(IntKi), PARAMETER :: M5N4FBxi = 1579 - INTEGER(IntKi), PARAMETER :: M5N5FBxi = 1580 - INTEGER(IntKi), PARAMETER :: M5N6FBxi = 1581 - INTEGER(IntKi), PARAMETER :: M5N7FBxi = 1582 - INTEGER(IntKi), PARAMETER :: M5N8FBxi = 1583 - INTEGER(IntKi), PARAMETER :: M5N9FBxi = 1584 - INTEGER(IntKi), PARAMETER :: M6N1FBxi = 1585 - INTEGER(IntKi), PARAMETER :: M6N2FBxi = 1586 - INTEGER(IntKi), PARAMETER :: M6N3FBxi = 1587 - INTEGER(IntKi), PARAMETER :: M6N4FBxi = 1588 - INTEGER(IntKi), PARAMETER :: M6N5FBxi = 1589 - INTEGER(IntKi), PARAMETER :: M6N6FBxi = 1590 - INTEGER(IntKi), PARAMETER :: M6N7FBxi = 1591 - INTEGER(IntKi), PARAMETER :: M6N8FBxi = 1592 - INTEGER(IntKi), PARAMETER :: M6N9FBxi = 1593 - INTEGER(IntKi), PARAMETER :: M7N1FBxi = 1594 - INTEGER(IntKi), PARAMETER :: M7N2FBxi = 1595 - INTEGER(IntKi), PARAMETER :: M7N3FBxi = 1596 - INTEGER(IntKi), PARAMETER :: M7N4FBxi = 1597 - INTEGER(IntKi), PARAMETER :: M7N5FBxi = 1598 - INTEGER(IntKi), PARAMETER :: M7N6FBxi = 1599 - INTEGER(IntKi), PARAMETER :: M7N7FBxi = 1600 - INTEGER(IntKi), PARAMETER :: M7N8FBxi = 1601 - INTEGER(IntKi), PARAMETER :: M7N9FBxi = 1602 - INTEGER(IntKi), PARAMETER :: M8N1FBxi = 1603 - INTEGER(IntKi), PARAMETER :: M8N2FBxi = 1604 - INTEGER(IntKi), PARAMETER :: M8N3FBxi = 1605 - INTEGER(IntKi), PARAMETER :: M8N4FBxi = 1606 - INTEGER(IntKi), PARAMETER :: M8N5FBxi = 1607 - INTEGER(IntKi), PARAMETER :: M8N6FBxi = 1608 - INTEGER(IntKi), PARAMETER :: M8N7FBxi = 1609 - INTEGER(IntKi), PARAMETER :: M8N8FBxi = 1610 - INTEGER(IntKi), PARAMETER :: M8N9FBxi = 1611 - INTEGER(IntKi), PARAMETER :: M9N1FBxi = 1612 - INTEGER(IntKi), PARAMETER :: M9N2FBxi = 1613 - INTEGER(IntKi), PARAMETER :: M9N3FBxi = 1614 - INTEGER(IntKi), PARAMETER :: M9N4FBxi = 1615 - INTEGER(IntKi), PARAMETER :: M9N5FBxi = 1616 - INTEGER(IntKi), PARAMETER :: M9N6FBxi = 1617 - INTEGER(IntKi), PARAMETER :: M9N7FBxi = 1618 - INTEGER(IntKi), PARAMETER :: M9N8FBxi = 1619 - INTEGER(IntKi), PARAMETER :: M9N9FBxi = 1620 - INTEGER(IntKi), PARAMETER :: M1N1FByi = 1621 - INTEGER(IntKi), PARAMETER :: M1N2FByi = 1622 - INTEGER(IntKi), PARAMETER :: M1N3FByi = 1623 - INTEGER(IntKi), PARAMETER :: M1N4FByi = 1624 - INTEGER(IntKi), PARAMETER :: M1N5FByi = 1625 - INTEGER(IntKi), PARAMETER :: M1N6FByi = 1626 - INTEGER(IntKi), PARAMETER :: M1N7FByi = 1627 - INTEGER(IntKi), PARAMETER :: M1N8FByi = 1628 - INTEGER(IntKi), PARAMETER :: M1N9FByi = 1629 - INTEGER(IntKi), PARAMETER :: M2N1FByi = 1630 - INTEGER(IntKi), PARAMETER :: M2N2FByi = 1631 - INTEGER(IntKi), PARAMETER :: M2N3FByi = 1632 - INTEGER(IntKi), PARAMETER :: M2N4FByi = 1633 - INTEGER(IntKi), PARAMETER :: M2N5FByi = 1634 - INTEGER(IntKi), PARAMETER :: M2N6FByi = 1635 - INTEGER(IntKi), PARAMETER :: M2N7FByi = 1636 - INTEGER(IntKi), PARAMETER :: M2N8FByi = 1637 - INTEGER(IntKi), PARAMETER :: M2N9FByi = 1638 - INTEGER(IntKi), PARAMETER :: M3N1FByi = 1639 - INTEGER(IntKi), PARAMETER :: M3N2FByi = 1640 - INTEGER(IntKi), PARAMETER :: M3N3FByi = 1641 - INTEGER(IntKi), PARAMETER :: M3N4FByi = 1642 - INTEGER(IntKi), PARAMETER :: M3N5FByi = 1643 - INTEGER(IntKi), PARAMETER :: M3N6FByi = 1644 - INTEGER(IntKi), PARAMETER :: M3N7FByi = 1645 - INTEGER(IntKi), PARAMETER :: M3N8FByi = 1646 - INTEGER(IntKi), PARAMETER :: M3N9FByi = 1647 - INTEGER(IntKi), PARAMETER :: M4N1FByi = 1648 - INTEGER(IntKi), PARAMETER :: M4N2FByi = 1649 - INTEGER(IntKi), PARAMETER :: M4N3FByi = 1650 - INTEGER(IntKi), PARAMETER :: M4N4FByi = 1651 - INTEGER(IntKi), PARAMETER :: M4N5FByi = 1652 - INTEGER(IntKi), PARAMETER :: M4N6FByi = 1653 - INTEGER(IntKi), PARAMETER :: M4N7FByi = 1654 - INTEGER(IntKi), PARAMETER :: M4N8FByi = 1655 - INTEGER(IntKi), PARAMETER :: M4N9FByi = 1656 - INTEGER(IntKi), PARAMETER :: M5N1FByi = 1657 - INTEGER(IntKi), PARAMETER :: M5N2FByi = 1658 - INTEGER(IntKi), PARAMETER :: M5N3FByi = 1659 - INTEGER(IntKi), PARAMETER :: M5N4FByi = 1660 - INTEGER(IntKi), PARAMETER :: M5N5FByi = 1661 - INTEGER(IntKi), PARAMETER :: M5N6FByi = 1662 - INTEGER(IntKi), PARAMETER :: M5N7FByi = 1663 - INTEGER(IntKi), PARAMETER :: M5N8FByi = 1664 - INTEGER(IntKi), PARAMETER :: M5N9FByi = 1665 - INTEGER(IntKi), PARAMETER :: M6N1FByi = 1666 - INTEGER(IntKi), PARAMETER :: M6N2FByi = 1667 - INTEGER(IntKi), PARAMETER :: M6N3FByi = 1668 - INTEGER(IntKi), PARAMETER :: M6N4FByi = 1669 - INTEGER(IntKi), PARAMETER :: M6N5FByi = 1670 - INTEGER(IntKi), PARAMETER :: M6N6FByi = 1671 - INTEGER(IntKi), PARAMETER :: M6N7FByi = 1672 - INTEGER(IntKi), PARAMETER :: M6N8FByi = 1673 - INTEGER(IntKi), PARAMETER :: M6N9FByi = 1674 - INTEGER(IntKi), PARAMETER :: M7N1FByi = 1675 - INTEGER(IntKi), PARAMETER :: M7N2FByi = 1676 - INTEGER(IntKi), PARAMETER :: M7N3FByi = 1677 - INTEGER(IntKi), PARAMETER :: M7N4FByi = 1678 - INTEGER(IntKi), PARAMETER :: M7N5FByi = 1679 - INTEGER(IntKi), PARAMETER :: M7N6FByi = 1680 - INTEGER(IntKi), PARAMETER :: M7N7FByi = 1681 - INTEGER(IntKi), PARAMETER :: M7N8FByi = 1682 - INTEGER(IntKi), PARAMETER :: M7N9FByi = 1683 - INTEGER(IntKi), PARAMETER :: M8N1FByi = 1684 - INTEGER(IntKi), PARAMETER :: M8N2FByi = 1685 - INTEGER(IntKi), PARAMETER :: M8N3FByi = 1686 - INTEGER(IntKi), PARAMETER :: M8N4FByi = 1687 - INTEGER(IntKi), PARAMETER :: M8N5FByi = 1688 - INTEGER(IntKi), PARAMETER :: M8N6FByi = 1689 - INTEGER(IntKi), PARAMETER :: M8N7FByi = 1690 - INTEGER(IntKi), PARAMETER :: M8N8FByi = 1691 - INTEGER(IntKi), PARAMETER :: M8N9FByi = 1692 - INTEGER(IntKi), PARAMETER :: M9N1FByi = 1693 - INTEGER(IntKi), PARAMETER :: M9N2FByi = 1694 - INTEGER(IntKi), PARAMETER :: M9N3FByi = 1695 - INTEGER(IntKi), PARAMETER :: M9N4FByi = 1696 - INTEGER(IntKi), PARAMETER :: M9N5FByi = 1697 - INTEGER(IntKi), PARAMETER :: M9N6FByi = 1698 - INTEGER(IntKi), PARAMETER :: M9N7FByi = 1699 - INTEGER(IntKi), PARAMETER :: M9N8FByi = 1700 - INTEGER(IntKi), PARAMETER :: M9N9FByi = 1701 - INTEGER(IntKi), PARAMETER :: M1N1FBzi = 1702 - INTEGER(IntKi), PARAMETER :: M1N2FBzi = 1703 - INTEGER(IntKi), PARAMETER :: M1N3FBzi = 1704 - INTEGER(IntKi), PARAMETER :: M1N4FBzi = 1705 - INTEGER(IntKi), PARAMETER :: M1N5FBzi = 1706 - INTEGER(IntKi), PARAMETER :: M1N6FBzi = 1707 - INTEGER(IntKi), PARAMETER :: M1N7FBzi = 1708 - INTEGER(IntKi), PARAMETER :: M1N8FBzi = 1709 - INTEGER(IntKi), PARAMETER :: M1N9FBzi = 1710 - INTEGER(IntKi), PARAMETER :: M2N1FBzi = 1711 - INTEGER(IntKi), PARAMETER :: M2N2FBzi = 1712 - INTEGER(IntKi), PARAMETER :: M2N3FBzi = 1713 - INTEGER(IntKi), PARAMETER :: M2N4FBzi = 1714 - INTEGER(IntKi), PARAMETER :: M2N5FBzi = 1715 - INTEGER(IntKi), PARAMETER :: M2N6FBzi = 1716 - INTEGER(IntKi), PARAMETER :: M2N7FBzi = 1717 - INTEGER(IntKi), PARAMETER :: M2N8FBzi = 1718 - INTEGER(IntKi), PARAMETER :: M2N9FBzi = 1719 - INTEGER(IntKi), PARAMETER :: M3N1FBzi = 1720 - INTEGER(IntKi), PARAMETER :: M3N2FBzi = 1721 - INTEGER(IntKi), PARAMETER :: M3N3FBzi = 1722 - INTEGER(IntKi), PARAMETER :: M3N4FBzi = 1723 - INTEGER(IntKi), PARAMETER :: M3N5FBzi = 1724 - INTEGER(IntKi), PARAMETER :: M3N6FBzi = 1725 - INTEGER(IntKi), PARAMETER :: M3N7FBzi = 1726 - INTEGER(IntKi), PARAMETER :: M3N8FBzi = 1727 - INTEGER(IntKi), PARAMETER :: M3N9FBzi = 1728 - INTEGER(IntKi), PARAMETER :: M4N1FBzi = 1729 - INTEGER(IntKi), PARAMETER :: M4N2FBzi = 1730 - INTEGER(IntKi), PARAMETER :: M4N3FBzi = 1731 - INTEGER(IntKi), PARAMETER :: M4N4FBzi = 1732 - INTEGER(IntKi), PARAMETER :: M4N5FBzi = 1733 - INTEGER(IntKi), PARAMETER :: M4N6FBzi = 1734 - INTEGER(IntKi), PARAMETER :: M4N7FBzi = 1735 - INTEGER(IntKi), PARAMETER :: M4N8FBzi = 1736 - INTEGER(IntKi), PARAMETER :: M4N9FBzi = 1737 - INTEGER(IntKi), PARAMETER :: M5N1FBzi = 1738 - INTEGER(IntKi), PARAMETER :: M5N2FBzi = 1739 - INTEGER(IntKi), PARAMETER :: M5N3FBzi = 1740 - INTEGER(IntKi), PARAMETER :: M5N4FBzi = 1741 - INTEGER(IntKi), PARAMETER :: M5N5FBzi = 1742 - INTEGER(IntKi), PARAMETER :: M5N6FBzi = 1743 - INTEGER(IntKi), PARAMETER :: M5N7FBzi = 1744 - INTEGER(IntKi), PARAMETER :: M5N8FBzi = 1745 - INTEGER(IntKi), PARAMETER :: M5N9FBzi = 1746 - INTEGER(IntKi), PARAMETER :: M6N1FBzi = 1747 - INTEGER(IntKi), PARAMETER :: M6N2FBzi = 1748 - INTEGER(IntKi), PARAMETER :: M6N3FBzi = 1749 - INTEGER(IntKi), PARAMETER :: M6N4FBzi = 1750 - INTEGER(IntKi), PARAMETER :: M6N5FBzi = 1751 - INTEGER(IntKi), PARAMETER :: M6N6FBzi = 1752 - INTEGER(IntKi), PARAMETER :: M6N7FBzi = 1753 - INTEGER(IntKi), PARAMETER :: M6N8FBzi = 1754 - INTEGER(IntKi), PARAMETER :: M6N9FBzi = 1755 - INTEGER(IntKi), PARAMETER :: M7N1FBzi = 1756 - INTEGER(IntKi), PARAMETER :: M7N2FBzi = 1757 - INTEGER(IntKi), PARAMETER :: M7N3FBzi = 1758 - INTEGER(IntKi), PARAMETER :: M7N4FBzi = 1759 - INTEGER(IntKi), PARAMETER :: M7N5FBzi = 1760 - INTEGER(IntKi), PARAMETER :: M7N6FBzi = 1761 - INTEGER(IntKi), PARAMETER :: M7N7FBzi = 1762 - INTEGER(IntKi), PARAMETER :: M7N8FBzi = 1763 - INTEGER(IntKi), PARAMETER :: M7N9FBzi = 1764 - INTEGER(IntKi), PARAMETER :: M8N1FBzi = 1765 - INTEGER(IntKi), PARAMETER :: M8N2FBzi = 1766 - INTEGER(IntKi), PARAMETER :: M8N3FBzi = 1767 - INTEGER(IntKi), PARAMETER :: M8N4FBzi = 1768 - INTEGER(IntKi), PARAMETER :: M8N5FBzi = 1769 - INTEGER(IntKi), PARAMETER :: M8N6FBzi = 1770 - INTEGER(IntKi), PARAMETER :: M8N7FBzi = 1771 - INTEGER(IntKi), PARAMETER :: M8N8FBzi = 1772 - INTEGER(IntKi), PARAMETER :: M8N9FBzi = 1773 - INTEGER(IntKi), PARAMETER :: M9N1FBzi = 1774 - INTEGER(IntKi), PARAMETER :: M9N2FBzi = 1775 - INTEGER(IntKi), PARAMETER :: M9N3FBzi = 1776 - INTEGER(IntKi), PARAMETER :: M9N4FBzi = 1777 - INTEGER(IntKi), PARAMETER :: M9N5FBzi = 1778 - INTEGER(IntKi), PARAMETER :: M9N6FBzi = 1779 - INTEGER(IntKi), PARAMETER :: M9N7FBzi = 1780 - INTEGER(IntKi), PARAMETER :: M9N8FBzi = 1781 - INTEGER(IntKi), PARAMETER :: M9N9FBzi = 1782 - INTEGER(IntKi), PARAMETER :: M1N1MBxi = 1783 - INTEGER(IntKi), PARAMETER :: M1N2MBxi = 1784 - INTEGER(IntKi), PARAMETER :: M1N3MBxi = 1785 - INTEGER(IntKi), PARAMETER :: M1N4MBxi = 1786 - INTEGER(IntKi), PARAMETER :: M1N5MBxi = 1787 - INTEGER(IntKi), PARAMETER :: M1N6MBxi = 1788 - INTEGER(IntKi), PARAMETER :: M1N7MBxi = 1789 - INTEGER(IntKi), PARAMETER :: M1N8MBxi = 1790 - INTEGER(IntKi), PARAMETER :: M1N9MBxi = 1791 - INTEGER(IntKi), PARAMETER :: M2N1MBxi = 1792 - INTEGER(IntKi), PARAMETER :: M2N2MBxi = 1793 - INTEGER(IntKi), PARAMETER :: M2N3MBxi = 1794 - INTEGER(IntKi), PARAMETER :: M2N4MBxi = 1795 - INTEGER(IntKi), PARAMETER :: M2N5MBxi = 1796 - INTEGER(IntKi), PARAMETER :: M2N6MBxi = 1797 - INTEGER(IntKi), PARAMETER :: M2N7MBxi = 1798 - INTEGER(IntKi), PARAMETER :: M2N8MBxi = 1799 - INTEGER(IntKi), PARAMETER :: M2N9MBxi = 1800 - INTEGER(IntKi), PARAMETER :: M3N1MBxi = 1801 - INTEGER(IntKi), PARAMETER :: M3N2MBxi = 1802 - INTEGER(IntKi), PARAMETER :: M3N3MBxi = 1803 - INTEGER(IntKi), PARAMETER :: M3N4MBxi = 1804 - INTEGER(IntKi), PARAMETER :: M3N5MBxi = 1805 - INTEGER(IntKi), PARAMETER :: M3N6MBxi = 1806 - INTEGER(IntKi), PARAMETER :: M3N7MBxi = 1807 - INTEGER(IntKi), PARAMETER :: M3N8MBxi = 1808 - INTEGER(IntKi), PARAMETER :: M3N9MBxi = 1809 - INTEGER(IntKi), PARAMETER :: M4N1MBxi = 1810 - INTEGER(IntKi), PARAMETER :: M4N2MBxi = 1811 - INTEGER(IntKi), PARAMETER :: M4N3MBxi = 1812 - INTEGER(IntKi), PARAMETER :: M4N4MBxi = 1813 - INTEGER(IntKi), PARAMETER :: M4N5MBxi = 1814 - INTEGER(IntKi), PARAMETER :: M4N6MBxi = 1815 - INTEGER(IntKi), PARAMETER :: M4N7MBxi = 1816 - INTEGER(IntKi), PARAMETER :: M4N8MBxi = 1817 - INTEGER(IntKi), PARAMETER :: M4N9MBxi = 1818 - INTEGER(IntKi), PARAMETER :: M5N1MBxi = 1819 - INTEGER(IntKi), PARAMETER :: M5N2MBxi = 1820 - INTEGER(IntKi), PARAMETER :: M5N3MBxi = 1821 - INTEGER(IntKi), PARAMETER :: M5N4MBxi = 1822 - INTEGER(IntKi), PARAMETER :: M5N5MBxi = 1823 - INTEGER(IntKi), PARAMETER :: M5N6MBxi = 1824 - INTEGER(IntKi), PARAMETER :: M5N7MBxi = 1825 - INTEGER(IntKi), PARAMETER :: M5N8MBxi = 1826 - INTEGER(IntKi), PARAMETER :: M5N9MBxi = 1827 - INTEGER(IntKi), PARAMETER :: M6N1MBxi = 1828 - INTEGER(IntKi), PARAMETER :: M6N2MBxi = 1829 - INTEGER(IntKi), PARAMETER :: M6N3MBxi = 1830 - INTEGER(IntKi), PARAMETER :: M6N4MBxi = 1831 - INTEGER(IntKi), PARAMETER :: M6N5MBxi = 1832 - INTEGER(IntKi), PARAMETER :: M6N6MBxi = 1833 - INTEGER(IntKi), PARAMETER :: M6N7MBxi = 1834 - INTEGER(IntKi), PARAMETER :: M6N8MBxi = 1835 - INTEGER(IntKi), PARAMETER :: M6N9MBxi = 1836 - INTEGER(IntKi), PARAMETER :: M7N1MBxi = 1837 - INTEGER(IntKi), PARAMETER :: M7N2MBxi = 1838 - INTEGER(IntKi), PARAMETER :: M7N3MBxi = 1839 - INTEGER(IntKi), PARAMETER :: M7N4MBxi = 1840 - INTEGER(IntKi), PARAMETER :: M7N5MBxi = 1841 - INTEGER(IntKi), PARAMETER :: M7N6MBxi = 1842 - INTEGER(IntKi), PARAMETER :: M7N7MBxi = 1843 - INTEGER(IntKi), PARAMETER :: M7N8MBxi = 1844 - INTEGER(IntKi), PARAMETER :: M7N9MBxi = 1845 - INTEGER(IntKi), PARAMETER :: M8N1MBxi = 1846 - INTEGER(IntKi), PARAMETER :: M8N2MBxi = 1847 - INTEGER(IntKi), PARAMETER :: M8N3MBxi = 1848 - INTEGER(IntKi), PARAMETER :: M8N4MBxi = 1849 - INTEGER(IntKi), PARAMETER :: M8N5MBxi = 1850 - INTEGER(IntKi), PARAMETER :: M8N6MBxi = 1851 - INTEGER(IntKi), PARAMETER :: M8N7MBxi = 1852 - INTEGER(IntKi), PARAMETER :: M8N8MBxi = 1853 - INTEGER(IntKi), PARAMETER :: M8N9MBxi = 1854 - INTEGER(IntKi), PARAMETER :: M9N1MBxi = 1855 - INTEGER(IntKi), PARAMETER :: M9N2MBxi = 1856 - INTEGER(IntKi), PARAMETER :: M9N3MBxi = 1857 - INTEGER(IntKi), PARAMETER :: M9N4MBxi = 1858 - INTEGER(IntKi), PARAMETER :: M9N5MBxi = 1859 - INTEGER(IntKi), PARAMETER :: M9N6MBxi = 1860 - INTEGER(IntKi), PARAMETER :: M9N7MBxi = 1861 - INTEGER(IntKi), PARAMETER :: M9N8MBxi = 1862 - INTEGER(IntKi), PARAMETER :: M9N9MBxi = 1863 - INTEGER(IntKi), PARAMETER :: M1N1MByi = 1864 - INTEGER(IntKi), PARAMETER :: M1N2MByi = 1865 - INTEGER(IntKi), PARAMETER :: M1N3MByi = 1866 - INTEGER(IntKi), PARAMETER :: M1N4MByi = 1867 - INTEGER(IntKi), PARAMETER :: M1N5MByi = 1868 - INTEGER(IntKi), PARAMETER :: M1N6MByi = 1869 - INTEGER(IntKi), PARAMETER :: M1N7MByi = 1870 - INTEGER(IntKi), PARAMETER :: M1N8MByi = 1871 - INTEGER(IntKi), PARAMETER :: M1N9MByi = 1872 - INTEGER(IntKi), PARAMETER :: M2N1MByi = 1873 - INTEGER(IntKi), PARAMETER :: M2N2MByi = 1874 - INTEGER(IntKi), PARAMETER :: M2N3MByi = 1875 - INTEGER(IntKi), PARAMETER :: M2N4MByi = 1876 - INTEGER(IntKi), PARAMETER :: M2N5MByi = 1877 - INTEGER(IntKi), PARAMETER :: M2N6MByi = 1878 - INTEGER(IntKi), PARAMETER :: M2N7MByi = 1879 - INTEGER(IntKi), PARAMETER :: M2N8MByi = 1880 - INTEGER(IntKi), PARAMETER :: M2N9MByi = 1881 - INTEGER(IntKi), PARAMETER :: M3N1MByi = 1882 - INTEGER(IntKi), PARAMETER :: M3N2MByi = 1883 - INTEGER(IntKi), PARAMETER :: M3N3MByi = 1884 - INTEGER(IntKi), PARAMETER :: M3N4MByi = 1885 - INTEGER(IntKi), PARAMETER :: M3N5MByi = 1886 - INTEGER(IntKi), PARAMETER :: M3N6MByi = 1887 - INTEGER(IntKi), PARAMETER :: M3N7MByi = 1888 - INTEGER(IntKi), PARAMETER :: M3N8MByi = 1889 - INTEGER(IntKi), PARAMETER :: M3N9MByi = 1890 - INTEGER(IntKi), PARAMETER :: M4N1MByi = 1891 - INTEGER(IntKi), PARAMETER :: M4N2MByi = 1892 - INTEGER(IntKi), PARAMETER :: M4N3MByi = 1893 - INTEGER(IntKi), PARAMETER :: M4N4MByi = 1894 - INTEGER(IntKi), PARAMETER :: M4N5MByi = 1895 - INTEGER(IntKi), PARAMETER :: M4N6MByi = 1896 - INTEGER(IntKi), PARAMETER :: M4N7MByi = 1897 - INTEGER(IntKi), PARAMETER :: M4N8MByi = 1898 - INTEGER(IntKi), PARAMETER :: M4N9MByi = 1899 - INTEGER(IntKi), PARAMETER :: M5N1MByi = 1900 - INTEGER(IntKi), PARAMETER :: M5N2MByi = 1901 - INTEGER(IntKi), PARAMETER :: M5N3MByi = 1902 - INTEGER(IntKi), PARAMETER :: M5N4MByi = 1903 - INTEGER(IntKi), PARAMETER :: M5N5MByi = 1904 - INTEGER(IntKi), PARAMETER :: M5N6MByi = 1905 - INTEGER(IntKi), PARAMETER :: M5N7MByi = 1906 - INTEGER(IntKi), PARAMETER :: M5N8MByi = 1907 - INTEGER(IntKi), PARAMETER :: M5N9MByi = 1908 - INTEGER(IntKi), PARAMETER :: M6N1MByi = 1909 - INTEGER(IntKi), PARAMETER :: M6N2MByi = 1910 - INTEGER(IntKi), PARAMETER :: M6N3MByi = 1911 - INTEGER(IntKi), PARAMETER :: M6N4MByi = 1912 - INTEGER(IntKi), PARAMETER :: M6N5MByi = 1913 - INTEGER(IntKi), PARAMETER :: M6N6MByi = 1914 - INTEGER(IntKi), PARAMETER :: M6N7MByi = 1915 - INTEGER(IntKi), PARAMETER :: M6N8MByi = 1916 - INTEGER(IntKi), PARAMETER :: M6N9MByi = 1917 - INTEGER(IntKi), PARAMETER :: M7N1MByi = 1918 - INTEGER(IntKi), PARAMETER :: M7N2MByi = 1919 - INTEGER(IntKi), PARAMETER :: M7N3MByi = 1920 - INTEGER(IntKi), PARAMETER :: M7N4MByi = 1921 - INTEGER(IntKi), PARAMETER :: M7N5MByi = 1922 - INTEGER(IntKi), PARAMETER :: M7N6MByi = 1923 - INTEGER(IntKi), PARAMETER :: M7N7MByi = 1924 - INTEGER(IntKi), PARAMETER :: M7N8MByi = 1925 - INTEGER(IntKi), PARAMETER :: M7N9MByi = 1926 - INTEGER(IntKi), PARAMETER :: M8N1MByi = 1927 - INTEGER(IntKi), PARAMETER :: M8N2MByi = 1928 - INTEGER(IntKi), PARAMETER :: M8N3MByi = 1929 - INTEGER(IntKi), PARAMETER :: M8N4MByi = 1930 - INTEGER(IntKi), PARAMETER :: M8N5MByi = 1931 - INTEGER(IntKi), PARAMETER :: M8N6MByi = 1932 - INTEGER(IntKi), PARAMETER :: M8N7MByi = 1933 - INTEGER(IntKi), PARAMETER :: M8N8MByi = 1934 - INTEGER(IntKi), PARAMETER :: M8N9MByi = 1935 - INTEGER(IntKi), PARAMETER :: M9N1MByi = 1936 - INTEGER(IntKi), PARAMETER :: M9N2MByi = 1937 - INTEGER(IntKi), PARAMETER :: M9N3MByi = 1938 - INTEGER(IntKi), PARAMETER :: M9N4MByi = 1939 - INTEGER(IntKi), PARAMETER :: M9N5MByi = 1940 - INTEGER(IntKi), PARAMETER :: M9N6MByi = 1941 - INTEGER(IntKi), PARAMETER :: M9N7MByi = 1942 - INTEGER(IntKi), PARAMETER :: M9N8MByi = 1943 - INTEGER(IntKi), PARAMETER :: M9N9MByi = 1944 - INTEGER(IntKi), PARAMETER :: M1N1MBzi = 1945 - INTEGER(IntKi), PARAMETER :: M1N2MBzi = 1946 - INTEGER(IntKi), PARAMETER :: M1N3MBzi = 1947 - INTEGER(IntKi), PARAMETER :: M1N4MBzi = 1948 - INTEGER(IntKi), PARAMETER :: M1N5MBzi = 1949 - INTEGER(IntKi), PARAMETER :: M1N6MBzi = 1950 - INTEGER(IntKi), PARAMETER :: M1N7MBzi = 1951 - INTEGER(IntKi), PARAMETER :: M1N8MBzi = 1952 - INTEGER(IntKi), PARAMETER :: M1N9MBzi = 1953 - INTEGER(IntKi), PARAMETER :: M2N1MBzi = 1954 - INTEGER(IntKi), PARAMETER :: M2N2MBzi = 1955 - INTEGER(IntKi), PARAMETER :: M2N3MBzi = 1956 - INTEGER(IntKi), PARAMETER :: M2N4MBzi = 1957 - INTEGER(IntKi), PARAMETER :: M2N5MBzi = 1958 - INTEGER(IntKi), PARAMETER :: M2N6MBzi = 1959 - INTEGER(IntKi), PARAMETER :: M2N7MBzi = 1960 - INTEGER(IntKi), PARAMETER :: M2N8MBzi = 1961 - INTEGER(IntKi), PARAMETER :: M2N9MBzi = 1962 - INTEGER(IntKi), PARAMETER :: M3N1MBzi = 1963 - INTEGER(IntKi), PARAMETER :: M3N2MBzi = 1964 - INTEGER(IntKi), PARAMETER :: M3N3MBzi = 1965 - INTEGER(IntKi), PARAMETER :: M3N4MBzi = 1966 - INTEGER(IntKi), PARAMETER :: M3N5MBzi = 1967 - INTEGER(IntKi), PARAMETER :: M3N6MBzi = 1968 - INTEGER(IntKi), PARAMETER :: M3N7MBzi = 1969 - INTEGER(IntKi), PARAMETER :: M3N8MBzi = 1970 - INTEGER(IntKi), PARAMETER :: M3N9MBzi = 1971 - INTEGER(IntKi), PARAMETER :: M4N1MBzi = 1972 - INTEGER(IntKi), PARAMETER :: M4N2MBzi = 1973 - INTEGER(IntKi), PARAMETER :: M4N3MBzi = 1974 - INTEGER(IntKi), PARAMETER :: M4N4MBzi = 1975 - INTEGER(IntKi), PARAMETER :: M4N5MBzi = 1976 - INTEGER(IntKi), PARAMETER :: M4N6MBzi = 1977 - INTEGER(IntKi), PARAMETER :: M4N7MBzi = 1978 - INTEGER(IntKi), PARAMETER :: M4N8MBzi = 1979 - INTEGER(IntKi), PARAMETER :: M4N9MBzi = 1980 - INTEGER(IntKi), PARAMETER :: M5N1MBzi = 1981 - INTEGER(IntKi), PARAMETER :: M5N2MBzi = 1982 - INTEGER(IntKi), PARAMETER :: M5N3MBzi = 1983 - INTEGER(IntKi), PARAMETER :: M5N4MBzi = 1984 - INTEGER(IntKi), PARAMETER :: M5N5MBzi = 1985 - INTEGER(IntKi), PARAMETER :: M5N6MBzi = 1986 - INTEGER(IntKi), PARAMETER :: M5N7MBzi = 1987 - INTEGER(IntKi), PARAMETER :: M5N8MBzi = 1988 - INTEGER(IntKi), PARAMETER :: M5N9MBzi = 1989 - INTEGER(IntKi), PARAMETER :: M6N1MBzi = 1990 - INTEGER(IntKi), PARAMETER :: M6N2MBzi = 1991 - INTEGER(IntKi), PARAMETER :: M6N3MBzi = 1992 - INTEGER(IntKi), PARAMETER :: M6N4MBzi = 1993 - INTEGER(IntKi), PARAMETER :: M6N5MBzi = 1994 - INTEGER(IntKi), PARAMETER :: M6N6MBzi = 1995 - INTEGER(IntKi), PARAMETER :: M6N7MBzi = 1996 - INTEGER(IntKi), PARAMETER :: M6N8MBzi = 1997 - INTEGER(IntKi), PARAMETER :: M6N9MBzi = 1998 - INTEGER(IntKi), PARAMETER :: M7N1MBzi = 1999 - INTEGER(IntKi), PARAMETER :: M7N2MBzi = 2000 - INTEGER(IntKi), PARAMETER :: M7N3MBzi = 2001 - INTEGER(IntKi), PARAMETER :: M7N4MBzi = 2002 - INTEGER(IntKi), PARAMETER :: M7N5MBzi = 2003 - INTEGER(IntKi), PARAMETER :: M7N6MBzi = 2004 - INTEGER(IntKi), PARAMETER :: M7N7MBzi = 2005 - INTEGER(IntKi), PARAMETER :: M7N8MBzi = 2006 - INTEGER(IntKi), PARAMETER :: M7N9MBzi = 2007 - INTEGER(IntKi), PARAMETER :: M8N1MBzi = 2008 - INTEGER(IntKi), PARAMETER :: M8N2MBzi = 2009 - INTEGER(IntKi), PARAMETER :: M8N3MBzi = 2010 - INTEGER(IntKi), PARAMETER :: M8N4MBzi = 2011 - INTEGER(IntKi), PARAMETER :: M8N5MBzi = 2012 - INTEGER(IntKi), PARAMETER :: M8N6MBzi = 2013 - INTEGER(IntKi), PARAMETER :: M8N7MBzi = 2014 - INTEGER(IntKi), PARAMETER :: M8N8MBzi = 2015 - INTEGER(IntKi), PARAMETER :: M8N9MBzi = 2016 - INTEGER(IntKi), PARAMETER :: M9N1MBzi = 2017 - INTEGER(IntKi), PARAMETER :: M9N2MBzi = 2018 - INTEGER(IntKi), PARAMETER :: M9N3MBzi = 2019 - INTEGER(IntKi), PARAMETER :: M9N4MBzi = 2020 - INTEGER(IntKi), PARAMETER :: M9N5MBzi = 2021 - INTEGER(IntKi), PARAMETER :: M9N6MBzi = 2022 - INTEGER(IntKi), PARAMETER :: M9N7MBzi = 2023 - INTEGER(IntKi), PARAMETER :: M9N8MBzi = 2024 - INTEGER(IntKi), PARAMETER :: M9N9MBzi = 2025 - INTEGER(IntKi), PARAMETER :: M1N1FBFxi = 2026 - INTEGER(IntKi), PARAMETER :: M1N2FBFxi = 2027 - INTEGER(IntKi), PARAMETER :: M1N3FBFxi = 2028 - INTEGER(IntKi), PARAMETER :: M1N4FBFxi = 2029 - INTEGER(IntKi), PARAMETER :: M1N5FBFxi = 2030 - INTEGER(IntKi), PARAMETER :: M1N6FBFxi = 2031 - INTEGER(IntKi), PARAMETER :: M1N7FBFxi = 2032 - INTEGER(IntKi), PARAMETER :: M1N8FBFxi = 2033 - INTEGER(IntKi), PARAMETER :: M1N9FBFxi = 2034 - INTEGER(IntKi), PARAMETER :: M2N1FBFxi = 2035 - INTEGER(IntKi), PARAMETER :: M2N2FBFxi = 2036 - INTEGER(IntKi), PARAMETER :: M2N3FBFxi = 2037 - INTEGER(IntKi), PARAMETER :: M2N4FBFxi = 2038 - INTEGER(IntKi), PARAMETER :: M2N5FBFxi = 2039 - INTEGER(IntKi), PARAMETER :: M2N6FBFxi = 2040 - INTEGER(IntKi), PARAMETER :: M2N7FBFxi = 2041 - INTEGER(IntKi), PARAMETER :: M2N8FBFxi = 2042 - INTEGER(IntKi), PARAMETER :: M2N9FBFxi = 2043 - INTEGER(IntKi), PARAMETER :: M3N1FBFxi = 2044 - INTEGER(IntKi), PARAMETER :: M3N2FBFxi = 2045 - INTEGER(IntKi), PARAMETER :: M3N3FBFxi = 2046 - INTEGER(IntKi), PARAMETER :: M3N4FBFxi = 2047 - INTEGER(IntKi), PARAMETER :: M3N5FBFxi = 2048 - INTEGER(IntKi), PARAMETER :: M3N6FBFxi = 2049 - INTEGER(IntKi), PARAMETER :: M3N7FBFxi = 2050 - INTEGER(IntKi), PARAMETER :: M3N8FBFxi = 2051 - INTEGER(IntKi), PARAMETER :: M3N9FBFxi = 2052 - INTEGER(IntKi), PARAMETER :: M4N1FBFxi = 2053 - INTEGER(IntKi), PARAMETER :: M4N2FBFxi = 2054 - INTEGER(IntKi), PARAMETER :: M4N3FBFxi = 2055 - INTEGER(IntKi), PARAMETER :: M4N4FBFxi = 2056 - INTEGER(IntKi), PARAMETER :: M4N5FBFxi = 2057 - INTEGER(IntKi), PARAMETER :: M4N6FBFxi = 2058 - INTEGER(IntKi), PARAMETER :: M4N7FBFxi = 2059 - INTEGER(IntKi), PARAMETER :: M4N8FBFxi = 2060 - INTEGER(IntKi), PARAMETER :: M4N9FBFxi = 2061 - INTEGER(IntKi), PARAMETER :: M5N1FBFxi = 2062 - INTEGER(IntKi), PARAMETER :: M5N2FBFxi = 2063 - INTEGER(IntKi), PARAMETER :: M5N3FBFxi = 2064 - INTEGER(IntKi), PARAMETER :: M5N4FBFxi = 2065 - INTEGER(IntKi), PARAMETER :: M5N5FBFxi = 2066 - INTEGER(IntKi), PARAMETER :: M5N6FBFxi = 2067 - INTEGER(IntKi), PARAMETER :: M5N7FBFxi = 2068 - INTEGER(IntKi), PARAMETER :: M5N8FBFxi = 2069 - INTEGER(IntKi), PARAMETER :: M5N9FBFxi = 2070 - INTEGER(IntKi), PARAMETER :: M6N1FBFxi = 2071 - INTEGER(IntKi), PARAMETER :: M6N2FBFxi = 2072 - INTEGER(IntKi), PARAMETER :: M6N3FBFxi = 2073 - INTEGER(IntKi), PARAMETER :: M6N4FBFxi = 2074 - INTEGER(IntKi), PARAMETER :: M6N5FBFxi = 2075 - INTEGER(IntKi), PARAMETER :: M6N6FBFxi = 2076 - INTEGER(IntKi), PARAMETER :: M6N7FBFxi = 2077 - INTEGER(IntKi), PARAMETER :: M6N8FBFxi = 2078 - INTEGER(IntKi), PARAMETER :: M6N9FBFxi = 2079 - INTEGER(IntKi), PARAMETER :: M7N1FBFxi = 2080 - INTEGER(IntKi), PARAMETER :: M7N2FBFxi = 2081 - INTEGER(IntKi), PARAMETER :: M7N3FBFxi = 2082 - INTEGER(IntKi), PARAMETER :: M7N4FBFxi = 2083 - INTEGER(IntKi), PARAMETER :: M7N5FBFxi = 2084 - INTEGER(IntKi), PARAMETER :: M7N6FBFxi = 2085 - INTEGER(IntKi), PARAMETER :: M7N7FBFxi = 2086 - INTEGER(IntKi), PARAMETER :: M7N8FBFxi = 2087 - INTEGER(IntKi), PARAMETER :: M7N9FBFxi = 2088 - INTEGER(IntKi), PARAMETER :: M8N1FBFxi = 2089 - INTEGER(IntKi), PARAMETER :: M8N2FBFxi = 2090 - INTEGER(IntKi), PARAMETER :: M8N3FBFxi = 2091 - INTEGER(IntKi), PARAMETER :: M8N4FBFxi = 2092 - INTEGER(IntKi), PARAMETER :: M8N5FBFxi = 2093 - INTEGER(IntKi), PARAMETER :: M8N6FBFxi = 2094 - INTEGER(IntKi), PARAMETER :: M8N7FBFxi = 2095 - INTEGER(IntKi), PARAMETER :: M8N8FBFxi = 2096 - INTEGER(IntKi), PARAMETER :: M8N9FBFxi = 2097 - INTEGER(IntKi), PARAMETER :: M9N1FBFxi = 2098 - INTEGER(IntKi), PARAMETER :: M9N2FBFxi = 2099 - INTEGER(IntKi), PARAMETER :: M9N3FBFxi = 2100 - INTEGER(IntKi), PARAMETER :: M9N4FBFxi = 2101 - INTEGER(IntKi), PARAMETER :: M9N5FBFxi = 2102 - INTEGER(IntKi), PARAMETER :: M9N6FBFxi = 2103 - INTEGER(IntKi), PARAMETER :: M9N7FBFxi = 2104 - INTEGER(IntKi), PARAMETER :: M9N8FBFxi = 2105 - INTEGER(IntKi), PARAMETER :: M9N9FBFxi = 2106 - INTEGER(IntKi), PARAMETER :: M1N1FBFyi = 2107 - INTEGER(IntKi), PARAMETER :: M1N2FBFyi = 2108 - INTEGER(IntKi), PARAMETER :: M1N3FBFyi = 2109 - INTEGER(IntKi), PARAMETER :: M1N4FBFyi = 2110 - INTEGER(IntKi), PARAMETER :: M1N5FBFyi = 2111 - INTEGER(IntKi), PARAMETER :: M1N6FBFyi = 2112 - INTEGER(IntKi), PARAMETER :: M1N7FBFyi = 2113 - INTEGER(IntKi), PARAMETER :: M1N8FBFyi = 2114 - INTEGER(IntKi), PARAMETER :: M1N9FBFyi = 2115 - INTEGER(IntKi), PARAMETER :: M2N1FBFyi = 2116 - INTEGER(IntKi), PARAMETER :: M2N2FBFyi = 2117 - INTEGER(IntKi), PARAMETER :: M2N3FBFyi = 2118 - INTEGER(IntKi), PARAMETER :: M2N4FBFyi = 2119 - INTEGER(IntKi), PARAMETER :: M2N5FBFyi = 2120 - INTEGER(IntKi), PARAMETER :: M2N6FBFyi = 2121 - INTEGER(IntKi), PARAMETER :: M2N7FBFyi = 2122 - INTEGER(IntKi), PARAMETER :: M2N8FBFyi = 2123 - INTEGER(IntKi), PARAMETER :: M2N9FBFyi = 2124 - INTEGER(IntKi), PARAMETER :: M3N1FBFyi = 2125 - INTEGER(IntKi), PARAMETER :: M3N2FBFyi = 2126 - INTEGER(IntKi), PARAMETER :: M3N3FBFyi = 2127 - INTEGER(IntKi), PARAMETER :: M3N4FBFyi = 2128 - INTEGER(IntKi), PARAMETER :: M3N5FBFyi = 2129 - INTEGER(IntKi), PARAMETER :: M3N6FBFyi = 2130 - INTEGER(IntKi), PARAMETER :: M3N7FBFyi = 2131 - INTEGER(IntKi), PARAMETER :: M3N8FBFyi = 2132 - INTEGER(IntKi), PARAMETER :: M3N9FBFyi = 2133 - INTEGER(IntKi), PARAMETER :: M4N1FBFyi = 2134 - INTEGER(IntKi), PARAMETER :: M4N2FBFyi = 2135 - INTEGER(IntKi), PARAMETER :: M4N3FBFyi = 2136 - INTEGER(IntKi), PARAMETER :: M4N4FBFyi = 2137 - INTEGER(IntKi), PARAMETER :: M4N5FBFyi = 2138 - INTEGER(IntKi), PARAMETER :: M4N6FBFyi = 2139 - INTEGER(IntKi), PARAMETER :: M4N7FBFyi = 2140 - INTEGER(IntKi), PARAMETER :: M4N8FBFyi = 2141 - INTEGER(IntKi), PARAMETER :: M4N9FBFyi = 2142 - INTEGER(IntKi), PARAMETER :: M5N1FBFyi = 2143 - INTEGER(IntKi), PARAMETER :: M5N2FBFyi = 2144 - INTEGER(IntKi), PARAMETER :: M5N3FBFyi = 2145 - INTEGER(IntKi), PARAMETER :: M5N4FBFyi = 2146 - INTEGER(IntKi), PARAMETER :: M5N5FBFyi = 2147 - INTEGER(IntKi), PARAMETER :: M5N6FBFyi = 2148 - INTEGER(IntKi), PARAMETER :: M5N7FBFyi = 2149 - INTEGER(IntKi), PARAMETER :: M5N8FBFyi = 2150 - INTEGER(IntKi), PARAMETER :: M5N9FBFyi = 2151 - INTEGER(IntKi), PARAMETER :: M6N1FBFyi = 2152 - INTEGER(IntKi), PARAMETER :: M6N2FBFyi = 2153 - INTEGER(IntKi), PARAMETER :: M6N3FBFyi = 2154 - INTEGER(IntKi), PARAMETER :: M6N4FBFyi = 2155 - INTEGER(IntKi), PARAMETER :: M6N5FBFyi = 2156 - INTEGER(IntKi), PARAMETER :: M6N6FBFyi = 2157 - INTEGER(IntKi), PARAMETER :: M6N7FBFyi = 2158 - INTEGER(IntKi), PARAMETER :: M6N8FBFyi = 2159 - INTEGER(IntKi), PARAMETER :: M6N9FBFyi = 2160 - INTEGER(IntKi), PARAMETER :: M7N1FBFyi = 2161 - INTEGER(IntKi), PARAMETER :: M7N2FBFyi = 2162 - INTEGER(IntKi), PARAMETER :: M7N3FBFyi = 2163 - INTEGER(IntKi), PARAMETER :: M7N4FBFyi = 2164 - INTEGER(IntKi), PARAMETER :: M7N5FBFyi = 2165 - INTEGER(IntKi), PARAMETER :: M7N6FBFyi = 2166 - INTEGER(IntKi), PARAMETER :: M7N7FBFyi = 2167 - INTEGER(IntKi), PARAMETER :: M7N8FBFyi = 2168 - INTEGER(IntKi), PARAMETER :: M7N9FBFyi = 2169 - INTEGER(IntKi), PARAMETER :: M8N1FBFyi = 2170 - INTEGER(IntKi), PARAMETER :: M8N2FBFyi = 2171 - INTEGER(IntKi), PARAMETER :: M8N3FBFyi = 2172 - INTEGER(IntKi), PARAMETER :: M8N4FBFyi = 2173 - INTEGER(IntKi), PARAMETER :: M8N5FBFyi = 2174 - INTEGER(IntKi), PARAMETER :: M8N6FBFyi = 2175 - INTEGER(IntKi), PARAMETER :: M8N7FBFyi = 2176 - INTEGER(IntKi), PARAMETER :: M8N8FBFyi = 2177 - INTEGER(IntKi), PARAMETER :: M8N9FBFyi = 2178 - INTEGER(IntKi), PARAMETER :: M9N1FBFyi = 2179 - INTEGER(IntKi), PARAMETER :: M9N2FBFyi = 2180 - INTEGER(IntKi), PARAMETER :: M9N3FBFyi = 2181 - INTEGER(IntKi), PARAMETER :: M9N4FBFyi = 2182 - INTEGER(IntKi), PARAMETER :: M9N5FBFyi = 2183 - INTEGER(IntKi), PARAMETER :: M9N6FBFyi = 2184 - INTEGER(IntKi), PARAMETER :: M9N7FBFyi = 2185 - INTEGER(IntKi), PARAMETER :: M9N8FBFyi = 2186 - INTEGER(IntKi), PARAMETER :: M9N9FBFyi = 2187 - INTEGER(IntKi), PARAMETER :: M1N1FBFzi = 2188 - INTEGER(IntKi), PARAMETER :: M1N2FBFzi = 2189 - INTEGER(IntKi), PARAMETER :: M1N3FBFzi = 2190 - INTEGER(IntKi), PARAMETER :: M1N4FBFzi = 2191 - INTEGER(IntKi), PARAMETER :: M1N5FBFzi = 2192 - INTEGER(IntKi), PARAMETER :: M1N6FBFzi = 2193 - INTEGER(IntKi), PARAMETER :: M1N7FBFzi = 2194 - INTEGER(IntKi), PARAMETER :: M1N8FBFzi = 2195 - INTEGER(IntKi), PARAMETER :: M1N9FBFzi = 2196 - INTEGER(IntKi), PARAMETER :: M2N1FBFzi = 2197 - INTEGER(IntKi), PARAMETER :: M2N2FBFzi = 2198 - INTEGER(IntKi), PARAMETER :: M2N3FBFzi = 2199 - INTEGER(IntKi), PARAMETER :: M2N4FBFzi = 2200 - INTEGER(IntKi), PARAMETER :: M2N5FBFzi = 2201 - INTEGER(IntKi), PARAMETER :: M2N6FBFzi = 2202 - INTEGER(IntKi), PARAMETER :: M2N7FBFzi = 2203 - INTEGER(IntKi), PARAMETER :: M2N8FBFzi = 2204 - INTEGER(IntKi), PARAMETER :: M2N9FBFzi = 2205 - INTEGER(IntKi), PARAMETER :: M3N1FBFzi = 2206 - INTEGER(IntKi), PARAMETER :: M3N2FBFzi = 2207 - INTEGER(IntKi), PARAMETER :: M3N3FBFzi = 2208 - INTEGER(IntKi), PARAMETER :: M3N4FBFzi = 2209 - INTEGER(IntKi), PARAMETER :: M3N5FBFzi = 2210 - INTEGER(IntKi), PARAMETER :: M3N6FBFzi = 2211 - INTEGER(IntKi), PARAMETER :: M3N7FBFzi = 2212 - INTEGER(IntKi), PARAMETER :: M3N8FBFzi = 2213 - INTEGER(IntKi), PARAMETER :: M3N9FBFzi = 2214 - INTEGER(IntKi), PARAMETER :: M4N1FBFzi = 2215 - INTEGER(IntKi), PARAMETER :: M4N2FBFzi = 2216 - INTEGER(IntKi), PARAMETER :: M4N3FBFzi = 2217 - INTEGER(IntKi), PARAMETER :: M4N4FBFzi = 2218 - INTEGER(IntKi), PARAMETER :: M4N5FBFzi = 2219 - INTEGER(IntKi), PARAMETER :: M4N6FBFzi = 2220 - INTEGER(IntKi), PARAMETER :: M4N7FBFzi = 2221 - INTEGER(IntKi), PARAMETER :: M4N8FBFzi = 2222 - INTEGER(IntKi), PARAMETER :: M4N9FBFzi = 2223 - INTEGER(IntKi), PARAMETER :: M5N1FBFzi = 2224 - INTEGER(IntKi), PARAMETER :: M5N2FBFzi = 2225 - INTEGER(IntKi), PARAMETER :: M5N3FBFzi = 2226 - INTEGER(IntKi), PARAMETER :: M5N4FBFzi = 2227 - INTEGER(IntKi), PARAMETER :: M5N5FBFzi = 2228 - INTEGER(IntKi), PARAMETER :: M5N6FBFzi = 2229 - INTEGER(IntKi), PARAMETER :: M5N7FBFzi = 2230 - INTEGER(IntKi), PARAMETER :: M5N8FBFzi = 2231 - INTEGER(IntKi), PARAMETER :: M5N9FBFzi = 2232 - INTEGER(IntKi), PARAMETER :: M6N1FBFzi = 2233 - INTEGER(IntKi), PARAMETER :: M6N2FBFzi = 2234 - INTEGER(IntKi), PARAMETER :: M6N3FBFzi = 2235 - INTEGER(IntKi), PARAMETER :: M6N4FBFzi = 2236 - INTEGER(IntKi), PARAMETER :: M6N5FBFzi = 2237 - INTEGER(IntKi), PARAMETER :: M6N6FBFzi = 2238 - INTEGER(IntKi), PARAMETER :: M6N7FBFzi = 2239 - INTEGER(IntKi), PARAMETER :: M6N8FBFzi = 2240 - INTEGER(IntKi), PARAMETER :: M6N9FBFzi = 2241 - INTEGER(IntKi), PARAMETER :: M7N1FBFzi = 2242 - INTEGER(IntKi), PARAMETER :: M7N2FBFzi = 2243 - INTEGER(IntKi), PARAMETER :: M7N3FBFzi = 2244 - INTEGER(IntKi), PARAMETER :: M7N4FBFzi = 2245 - INTEGER(IntKi), PARAMETER :: M7N5FBFzi = 2246 - INTEGER(IntKi), PARAMETER :: M7N6FBFzi = 2247 - INTEGER(IntKi), PARAMETER :: M7N7FBFzi = 2248 - INTEGER(IntKi), PARAMETER :: M7N8FBFzi = 2249 - INTEGER(IntKi), PARAMETER :: M7N9FBFzi = 2250 - INTEGER(IntKi), PARAMETER :: M8N1FBFzi = 2251 - INTEGER(IntKi), PARAMETER :: M8N2FBFzi = 2252 - INTEGER(IntKi), PARAMETER :: M8N3FBFzi = 2253 - INTEGER(IntKi), PARAMETER :: M8N4FBFzi = 2254 - INTEGER(IntKi), PARAMETER :: M8N5FBFzi = 2255 - INTEGER(IntKi), PARAMETER :: M8N6FBFzi = 2256 - INTEGER(IntKi), PARAMETER :: M8N7FBFzi = 2257 - INTEGER(IntKi), PARAMETER :: M8N8FBFzi = 2258 - INTEGER(IntKi), PARAMETER :: M8N9FBFzi = 2259 - INTEGER(IntKi), PARAMETER :: M9N1FBFzi = 2260 - INTEGER(IntKi), PARAMETER :: M9N2FBFzi = 2261 - INTEGER(IntKi), PARAMETER :: M9N3FBFzi = 2262 - INTEGER(IntKi), PARAMETER :: M9N4FBFzi = 2263 - INTEGER(IntKi), PARAMETER :: M9N5FBFzi = 2264 - INTEGER(IntKi), PARAMETER :: M9N6FBFzi = 2265 - INTEGER(IntKi), PARAMETER :: M9N7FBFzi = 2266 - INTEGER(IntKi), PARAMETER :: M9N8FBFzi = 2267 - INTEGER(IntKi), PARAMETER :: M9N9FBFzi = 2268 - INTEGER(IntKi), PARAMETER :: M1N1MBFxi = 2269 - INTEGER(IntKi), PARAMETER :: M1N2MBFxi = 2270 - INTEGER(IntKi), PARAMETER :: M1N3MBFxi = 2271 - INTEGER(IntKi), PARAMETER :: M1N4MBFxi = 2272 - INTEGER(IntKi), PARAMETER :: M1N5MBFxi = 2273 - INTEGER(IntKi), PARAMETER :: M1N6MBFxi = 2274 - INTEGER(IntKi), PARAMETER :: M1N7MBFxi = 2275 - INTEGER(IntKi), PARAMETER :: M1N8MBFxi = 2276 - INTEGER(IntKi), PARAMETER :: M1N9MBFxi = 2277 - INTEGER(IntKi), PARAMETER :: M2N1MBFxi = 2278 - INTEGER(IntKi), PARAMETER :: M2N2MBFxi = 2279 - INTEGER(IntKi), PARAMETER :: M2N3MBFxi = 2280 - INTEGER(IntKi), PARAMETER :: M2N4MBFxi = 2281 - INTEGER(IntKi), PARAMETER :: M2N5MBFxi = 2282 - INTEGER(IntKi), PARAMETER :: M2N6MBFxi = 2283 - INTEGER(IntKi), PARAMETER :: M2N7MBFxi = 2284 - INTEGER(IntKi), PARAMETER :: M2N8MBFxi = 2285 - INTEGER(IntKi), PARAMETER :: M2N9MBFxi = 2286 - INTEGER(IntKi), PARAMETER :: M3N1MBFxi = 2287 - INTEGER(IntKi), PARAMETER :: M3N2MBFxi = 2288 - INTEGER(IntKi), PARAMETER :: M3N3MBFxi = 2289 - INTEGER(IntKi), PARAMETER :: M3N4MBFxi = 2290 - INTEGER(IntKi), PARAMETER :: M3N5MBFxi = 2291 - INTEGER(IntKi), PARAMETER :: M3N6MBFxi = 2292 - INTEGER(IntKi), PARAMETER :: M3N7MBFxi = 2293 - INTEGER(IntKi), PARAMETER :: M3N8MBFxi = 2294 - INTEGER(IntKi), PARAMETER :: M3N9MBFxi = 2295 - INTEGER(IntKi), PARAMETER :: M4N1MBFxi = 2296 - INTEGER(IntKi), PARAMETER :: M4N2MBFxi = 2297 - INTEGER(IntKi), PARAMETER :: M4N3MBFxi = 2298 - INTEGER(IntKi), PARAMETER :: M4N4MBFxi = 2299 - INTEGER(IntKi), PARAMETER :: M4N5MBFxi = 2300 - INTEGER(IntKi), PARAMETER :: M4N6MBFxi = 2301 - INTEGER(IntKi), PARAMETER :: M4N7MBFxi = 2302 - INTEGER(IntKi), PARAMETER :: M4N8MBFxi = 2303 - INTEGER(IntKi), PARAMETER :: M4N9MBFxi = 2304 - INTEGER(IntKi), PARAMETER :: M5N1MBFxi = 2305 - INTEGER(IntKi), PARAMETER :: M5N2MBFxi = 2306 - INTEGER(IntKi), PARAMETER :: M5N3MBFxi = 2307 - INTEGER(IntKi), PARAMETER :: M5N4MBFxi = 2308 - INTEGER(IntKi), PARAMETER :: M5N5MBFxi = 2309 - INTEGER(IntKi), PARAMETER :: M5N6MBFxi = 2310 - INTEGER(IntKi), PARAMETER :: M5N7MBFxi = 2311 - INTEGER(IntKi), PARAMETER :: M5N8MBFxi = 2312 - INTEGER(IntKi), PARAMETER :: M5N9MBFxi = 2313 - INTEGER(IntKi), PARAMETER :: M6N1MBFxi = 2314 - INTEGER(IntKi), PARAMETER :: M6N2MBFxi = 2315 - INTEGER(IntKi), PARAMETER :: M6N3MBFxi = 2316 - INTEGER(IntKi), PARAMETER :: M6N4MBFxi = 2317 - INTEGER(IntKi), PARAMETER :: M6N5MBFxi = 2318 - INTEGER(IntKi), PARAMETER :: M6N6MBFxi = 2319 - INTEGER(IntKi), PARAMETER :: M6N7MBFxi = 2320 - INTEGER(IntKi), PARAMETER :: M6N8MBFxi = 2321 - INTEGER(IntKi), PARAMETER :: M6N9MBFxi = 2322 - INTEGER(IntKi), PARAMETER :: M7N1MBFxi = 2323 - INTEGER(IntKi), PARAMETER :: M7N2MBFxi = 2324 - INTEGER(IntKi), PARAMETER :: M7N3MBFxi = 2325 - INTEGER(IntKi), PARAMETER :: M7N4MBFxi = 2326 - INTEGER(IntKi), PARAMETER :: M7N5MBFxi = 2327 - INTEGER(IntKi), PARAMETER :: M7N6MBFxi = 2328 - INTEGER(IntKi), PARAMETER :: M7N7MBFxi = 2329 - INTEGER(IntKi), PARAMETER :: M7N8MBFxi = 2330 - INTEGER(IntKi), PARAMETER :: M7N9MBFxi = 2331 - INTEGER(IntKi), PARAMETER :: M8N1MBFxi = 2332 - INTEGER(IntKi), PARAMETER :: M8N2MBFxi = 2333 - INTEGER(IntKi), PARAMETER :: M8N3MBFxi = 2334 - INTEGER(IntKi), PARAMETER :: M8N4MBFxi = 2335 - INTEGER(IntKi), PARAMETER :: M8N5MBFxi = 2336 - INTEGER(IntKi), PARAMETER :: M8N6MBFxi = 2337 - INTEGER(IntKi), PARAMETER :: M8N7MBFxi = 2338 - INTEGER(IntKi), PARAMETER :: M8N8MBFxi = 2339 - INTEGER(IntKi), PARAMETER :: M8N9MBFxi = 2340 - INTEGER(IntKi), PARAMETER :: M9N1MBFxi = 2341 - INTEGER(IntKi), PARAMETER :: M9N2MBFxi = 2342 - INTEGER(IntKi), PARAMETER :: M9N3MBFxi = 2343 - INTEGER(IntKi), PARAMETER :: M9N4MBFxi = 2344 - INTEGER(IntKi), PARAMETER :: M9N5MBFxi = 2345 - INTEGER(IntKi), PARAMETER :: M9N6MBFxi = 2346 - INTEGER(IntKi), PARAMETER :: M9N7MBFxi = 2347 - INTEGER(IntKi), PARAMETER :: M9N8MBFxi = 2348 - INTEGER(IntKi), PARAMETER :: M9N9MBFxi = 2349 - INTEGER(IntKi), PARAMETER :: M1N1MBFyi = 2350 - INTEGER(IntKi), PARAMETER :: M1N2MBFyi = 2351 - INTEGER(IntKi), PARAMETER :: M1N3MBFyi = 2352 - INTEGER(IntKi), PARAMETER :: M1N4MBFyi = 2353 - INTEGER(IntKi), PARAMETER :: M1N5MBFyi = 2354 - INTEGER(IntKi), PARAMETER :: M1N6MBFyi = 2355 - INTEGER(IntKi), PARAMETER :: M1N7MBFyi = 2356 - INTEGER(IntKi), PARAMETER :: M1N8MBFyi = 2357 - INTEGER(IntKi), PARAMETER :: M1N9MBFyi = 2358 - INTEGER(IntKi), PARAMETER :: M2N1MBFyi = 2359 - INTEGER(IntKi), PARAMETER :: M2N2MBFyi = 2360 - INTEGER(IntKi), PARAMETER :: M2N3MBFyi = 2361 - INTEGER(IntKi), PARAMETER :: M2N4MBFyi = 2362 - INTEGER(IntKi), PARAMETER :: M2N5MBFyi = 2363 - INTEGER(IntKi), PARAMETER :: M2N6MBFyi = 2364 - INTEGER(IntKi), PARAMETER :: M2N7MBFyi = 2365 - INTEGER(IntKi), PARAMETER :: M2N8MBFyi = 2366 - INTEGER(IntKi), PARAMETER :: M2N9MBFyi = 2367 - INTEGER(IntKi), PARAMETER :: M3N1MBFyi = 2368 - INTEGER(IntKi), PARAMETER :: M3N2MBFyi = 2369 - INTEGER(IntKi), PARAMETER :: M3N3MBFyi = 2370 - INTEGER(IntKi), PARAMETER :: M3N4MBFyi = 2371 - INTEGER(IntKi), PARAMETER :: M3N5MBFyi = 2372 - INTEGER(IntKi), PARAMETER :: M3N6MBFyi = 2373 - INTEGER(IntKi), PARAMETER :: M3N7MBFyi = 2374 - INTEGER(IntKi), PARAMETER :: M3N8MBFyi = 2375 - INTEGER(IntKi), PARAMETER :: M3N9MBFyi = 2376 - INTEGER(IntKi), PARAMETER :: M4N1MBFyi = 2377 - INTEGER(IntKi), PARAMETER :: M4N2MBFyi = 2378 - INTEGER(IntKi), PARAMETER :: M4N3MBFyi = 2379 - INTEGER(IntKi), PARAMETER :: M4N4MBFyi = 2380 - INTEGER(IntKi), PARAMETER :: M4N5MBFyi = 2381 - INTEGER(IntKi), PARAMETER :: M4N6MBFyi = 2382 - INTEGER(IntKi), PARAMETER :: M4N7MBFyi = 2383 - INTEGER(IntKi), PARAMETER :: M4N8MBFyi = 2384 - INTEGER(IntKi), PARAMETER :: M4N9MBFyi = 2385 - INTEGER(IntKi), PARAMETER :: M5N1MBFyi = 2386 - INTEGER(IntKi), PARAMETER :: M5N2MBFyi = 2387 - INTEGER(IntKi), PARAMETER :: M5N3MBFyi = 2388 - INTEGER(IntKi), PARAMETER :: M5N4MBFyi = 2389 - INTEGER(IntKi), PARAMETER :: M5N5MBFyi = 2390 - INTEGER(IntKi), PARAMETER :: M5N6MBFyi = 2391 - INTEGER(IntKi), PARAMETER :: M5N7MBFyi = 2392 - INTEGER(IntKi), PARAMETER :: M5N8MBFyi = 2393 - INTEGER(IntKi), PARAMETER :: M5N9MBFyi = 2394 - INTEGER(IntKi), PARAMETER :: M6N1MBFyi = 2395 - INTEGER(IntKi), PARAMETER :: M6N2MBFyi = 2396 - INTEGER(IntKi), PARAMETER :: M6N3MBFyi = 2397 - INTEGER(IntKi), PARAMETER :: M6N4MBFyi = 2398 - INTEGER(IntKi), PARAMETER :: M6N5MBFyi = 2399 - INTEGER(IntKi), PARAMETER :: M6N6MBFyi = 2400 - INTEGER(IntKi), PARAMETER :: M6N7MBFyi = 2401 - INTEGER(IntKi), PARAMETER :: M6N8MBFyi = 2402 - INTEGER(IntKi), PARAMETER :: M6N9MBFyi = 2403 - INTEGER(IntKi), PARAMETER :: M7N1MBFyi = 2404 - INTEGER(IntKi), PARAMETER :: M7N2MBFyi = 2405 - INTEGER(IntKi), PARAMETER :: M7N3MBFyi = 2406 - INTEGER(IntKi), PARAMETER :: M7N4MBFyi = 2407 - INTEGER(IntKi), PARAMETER :: M7N5MBFyi = 2408 - INTEGER(IntKi), PARAMETER :: M7N6MBFyi = 2409 - INTEGER(IntKi), PARAMETER :: M7N7MBFyi = 2410 - INTEGER(IntKi), PARAMETER :: M7N8MBFyi = 2411 - INTEGER(IntKi), PARAMETER :: M7N9MBFyi = 2412 - INTEGER(IntKi), PARAMETER :: M8N1MBFyi = 2413 - INTEGER(IntKi), PARAMETER :: M8N2MBFyi = 2414 - INTEGER(IntKi), PARAMETER :: M8N3MBFyi = 2415 - INTEGER(IntKi), PARAMETER :: M8N4MBFyi = 2416 - INTEGER(IntKi), PARAMETER :: M8N5MBFyi = 2417 - INTEGER(IntKi), PARAMETER :: M8N6MBFyi = 2418 - INTEGER(IntKi), PARAMETER :: M8N7MBFyi = 2419 - INTEGER(IntKi), PARAMETER :: M8N8MBFyi = 2420 - INTEGER(IntKi), PARAMETER :: M8N9MBFyi = 2421 - INTEGER(IntKi), PARAMETER :: M9N1MBFyi = 2422 - INTEGER(IntKi), PARAMETER :: M9N2MBFyi = 2423 - INTEGER(IntKi), PARAMETER :: M9N3MBFyi = 2424 - INTEGER(IntKi), PARAMETER :: M9N4MBFyi = 2425 - INTEGER(IntKi), PARAMETER :: M9N5MBFyi = 2426 - INTEGER(IntKi), PARAMETER :: M9N6MBFyi = 2427 - INTEGER(IntKi), PARAMETER :: M9N7MBFyi = 2428 - INTEGER(IntKi), PARAMETER :: M9N8MBFyi = 2429 - INTEGER(IntKi), PARAMETER :: M9N9MBFyi = 2430 - INTEGER(IntKi), PARAMETER :: M1N1MBFzi = 2431 - INTEGER(IntKi), PARAMETER :: M1N2MBFzi = 2432 - INTEGER(IntKi), PARAMETER :: M1N3MBFzi = 2433 - INTEGER(IntKi), PARAMETER :: M1N4MBFzi = 2434 - INTEGER(IntKi), PARAMETER :: M1N5MBFzi = 2435 - INTEGER(IntKi), PARAMETER :: M1N6MBFzi = 2436 - INTEGER(IntKi), PARAMETER :: M1N7MBFzi = 2437 - INTEGER(IntKi), PARAMETER :: M1N8MBFzi = 2438 - INTEGER(IntKi), PARAMETER :: M1N9MBFzi = 2439 - INTEGER(IntKi), PARAMETER :: M2N1MBFzi = 2440 - INTEGER(IntKi), PARAMETER :: M2N2MBFzi = 2441 - INTEGER(IntKi), PARAMETER :: M2N3MBFzi = 2442 - INTEGER(IntKi), PARAMETER :: M2N4MBFzi = 2443 - INTEGER(IntKi), PARAMETER :: M2N5MBFzi = 2444 - INTEGER(IntKi), PARAMETER :: M2N6MBFzi = 2445 - INTEGER(IntKi), PARAMETER :: M2N7MBFzi = 2446 - INTEGER(IntKi), PARAMETER :: M2N8MBFzi = 2447 - INTEGER(IntKi), PARAMETER :: M2N9MBFzi = 2448 - INTEGER(IntKi), PARAMETER :: M3N1MBFzi = 2449 - INTEGER(IntKi), PARAMETER :: M3N2MBFzi = 2450 - INTEGER(IntKi), PARAMETER :: M3N3MBFzi = 2451 - INTEGER(IntKi), PARAMETER :: M3N4MBFzi = 2452 - INTEGER(IntKi), PARAMETER :: M3N5MBFzi = 2453 - INTEGER(IntKi), PARAMETER :: M3N6MBFzi = 2454 - INTEGER(IntKi), PARAMETER :: M3N7MBFzi = 2455 - INTEGER(IntKi), PARAMETER :: M3N8MBFzi = 2456 - INTEGER(IntKi), PARAMETER :: M3N9MBFzi = 2457 - INTEGER(IntKi), PARAMETER :: M4N1MBFzi = 2458 - INTEGER(IntKi), PARAMETER :: M4N2MBFzi = 2459 - INTEGER(IntKi), PARAMETER :: M4N3MBFzi = 2460 - INTEGER(IntKi), PARAMETER :: M4N4MBFzi = 2461 - INTEGER(IntKi), PARAMETER :: M4N5MBFzi = 2462 - INTEGER(IntKi), PARAMETER :: M4N6MBFzi = 2463 - INTEGER(IntKi), PARAMETER :: M4N7MBFzi = 2464 - INTEGER(IntKi), PARAMETER :: M4N8MBFzi = 2465 - INTEGER(IntKi), PARAMETER :: M4N9MBFzi = 2466 - INTEGER(IntKi), PARAMETER :: M5N1MBFzi = 2467 - INTEGER(IntKi), PARAMETER :: M5N2MBFzi = 2468 - INTEGER(IntKi), PARAMETER :: M5N3MBFzi = 2469 - INTEGER(IntKi), PARAMETER :: M5N4MBFzi = 2470 - INTEGER(IntKi), PARAMETER :: M5N5MBFzi = 2471 - INTEGER(IntKi), PARAMETER :: M5N6MBFzi = 2472 - INTEGER(IntKi), PARAMETER :: M5N7MBFzi = 2473 - INTEGER(IntKi), PARAMETER :: M5N8MBFzi = 2474 - INTEGER(IntKi), PARAMETER :: M5N9MBFzi = 2475 - INTEGER(IntKi), PARAMETER :: M6N1MBFzi = 2476 - INTEGER(IntKi), PARAMETER :: M6N2MBFzi = 2477 - INTEGER(IntKi), PARAMETER :: M6N3MBFzi = 2478 - INTEGER(IntKi), PARAMETER :: M6N4MBFzi = 2479 - INTEGER(IntKi), PARAMETER :: M6N5MBFzi = 2480 - INTEGER(IntKi), PARAMETER :: M6N6MBFzi = 2481 - INTEGER(IntKi), PARAMETER :: M6N7MBFzi = 2482 - INTEGER(IntKi), PARAMETER :: M6N8MBFzi = 2483 - INTEGER(IntKi), PARAMETER :: M6N9MBFzi = 2484 - INTEGER(IntKi), PARAMETER :: M7N1MBFzi = 2485 - INTEGER(IntKi), PARAMETER :: M7N2MBFzi = 2486 - INTEGER(IntKi), PARAMETER :: M7N3MBFzi = 2487 - INTEGER(IntKi), PARAMETER :: M7N4MBFzi = 2488 - INTEGER(IntKi), PARAMETER :: M7N5MBFzi = 2489 - INTEGER(IntKi), PARAMETER :: M7N6MBFzi = 2490 - INTEGER(IntKi), PARAMETER :: M7N7MBFzi = 2491 - INTEGER(IntKi), PARAMETER :: M7N8MBFzi = 2492 - INTEGER(IntKi), PARAMETER :: M7N9MBFzi = 2493 - INTEGER(IntKi), PARAMETER :: M8N1MBFzi = 2494 - INTEGER(IntKi), PARAMETER :: M8N2MBFzi = 2495 - INTEGER(IntKi), PARAMETER :: M8N3MBFzi = 2496 - INTEGER(IntKi), PARAMETER :: M8N4MBFzi = 2497 - INTEGER(IntKi), PARAMETER :: M8N5MBFzi = 2498 - INTEGER(IntKi), PARAMETER :: M8N6MBFzi = 2499 - INTEGER(IntKi), PARAMETER :: M8N7MBFzi = 2500 - INTEGER(IntKi), PARAMETER :: M8N8MBFzi = 2501 - INTEGER(IntKi), PARAMETER :: M8N9MBFzi = 2502 - INTEGER(IntKi), PARAMETER :: M9N1MBFzi = 2503 - INTEGER(IntKi), PARAMETER :: M9N2MBFzi = 2504 - INTEGER(IntKi), PARAMETER :: M9N3MBFzi = 2505 - INTEGER(IntKi), PARAMETER :: M9N4MBFzi = 2506 - INTEGER(IntKi), PARAMETER :: M9N5MBFzi = 2507 - INTEGER(IntKi), PARAMETER :: M9N6MBFzi = 2508 - INTEGER(IntKi), PARAMETER :: M9N7MBFzi = 2509 - INTEGER(IntKi), PARAMETER :: M9N8MBFzi = 2510 - INTEGER(IntKi), PARAMETER :: M9N9MBFzi = 2511 - INTEGER(IntKi), PARAMETER :: M1N1FMGxi = 2512 - INTEGER(IntKi), PARAMETER :: M1N2FMGxi = 2513 - INTEGER(IntKi), PARAMETER :: M1N3FMGxi = 2514 - INTEGER(IntKi), PARAMETER :: M1N4FMGxi = 2515 - INTEGER(IntKi), PARAMETER :: M1N5FMGxi = 2516 - INTEGER(IntKi), PARAMETER :: M1N6FMGxi = 2517 - INTEGER(IntKi), PARAMETER :: M1N7FMGxi = 2518 - INTEGER(IntKi), PARAMETER :: M1N8FMGxi = 2519 - INTEGER(IntKi), PARAMETER :: M1N9FMGxi = 2520 - INTEGER(IntKi), PARAMETER :: M2N1FMGxi = 2521 - INTEGER(IntKi), PARAMETER :: M2N2FMGxi = 2522 - INTEGER(IntKi), PARAMETER :: M2N3FMGxi = 2523 - INTEGER(IntKi), PARAMETER :: M2N4FMGxi = 2524 - INTEGER(IntKi), PARAMETER :: M2N5FMGxi = 2525 - INTEGER(IntKi), PARAMETER :: M2N6FMGxi = 2526 - INTEGER(IntKi), PARAMETER :: M2N7FMGxi = 2527 - INTEGER(IntKi), PARAMETER :: M2N8FMGxi = 2528 - INTEGER(IntKi), PARAMETER :: M2N9FMGxi = 2529 - INTEGER(IntKi), PARAMETER :: M3N1FMGxi = 2530 - INTEGER(IntKi), PARAMETER :: M3N2FMGxi = 2531 - INTEGER(IntKi), PARAMETER :: M3N3FMGxi = 2532 - INTEGER(IntKi), PARAMETER :: M3N4FMGxi = 2533 - INTEGER(IntKi), PARAMETER :: M3N5FMGxi = 2534 - INTEGER(IntKi), PARAMETER :: M3N6FMGxi = 2535 - INTEGER(IntKi), PARAMETER :: M3N7FMGxi = 2536 - INTEGER(IntKi), PARAMETER :: M3N8FMGxi = 2537 - INTEGER(IntKi), PARAMETER :: M3N9FMGxi = 2538 - INTEGER(IntKi), PARAMETER :: M4N1FMGxi = 2539 - INTEGER(IntKi), PARAMETER :: M4N2FMGxi = 2540 - INTEGER(IntKi), PARAMETER :: M4N3FMGxi = 2541 - INTEGER(IntKi), PARAMETER :: M4N4FMGxi = 2542 - INTEGER(IntKi), PARAMETER :: M4N5FMGxi = 2543 - INTEGER(IntKi), PARAMETER :: M4N6FMGxi = 2544 - INTEGER(IntKi), PARAMETER :: M4N7FMGxi = 2545 - INTEGER(IntKi), PARAMETER :: M4N8FMGxi = 2546 - INTEGER(IntKi), PARAMETER :: M4N9FMGxi = 2547 - INTEGER(IntKi), PARAMETER :: M5N1FMGxi = 2548 - INTEGER(IntKi), PARAMETER :: M5N2FMGxi = 2549 - INTEGER(IntKi), PARAMETER :: M5N3FMGxi = 2550 - INTEGER(IntKi), PARAMETER :: M5N4FMGxi = 2551 - INTEGER(IntKi), PARAMETER :: M5N5FMGxi = 2552 - INTEGER(IntKi), PARAMETER :: M5N6FMGxi = 2553 - INTEGER(IntKi), PARAMETER :: M5N7FMGxi = 2554 - INTEGER(IntKi), PARAMETER :: M5N8FMGxi = 2555 - INTEGER(IntKi), PARAMETER :: M5N9FMGxi = 2556 - INTEGER(IntKi), PARAMETER :: M6N1FMGxi = 2557 - INTEGER(IntKi), PARAMETER :: M6N2FMGxi = 2558 - INTEGER(IntKi), PARAMETER :: M6N3FMGxi = 2559 - INTEGER(IntKi), PARAMETER :: M6N4FMGxi = 2560 - INTEGER(IntKi), PARAMETER :: M6N5FMGxi = 2561 - INTEGER(IntKi), PARAMETER :: M6N6FMGxi = 2562 - INTEGER(IntKi), PARAMETER :: M6N7FMGxi = 2563 - INTEGER(IntKi), PARAMETER :: M6N8FMGxi = 2564 - INTEGER(IntKi), PARAMETER :: M6N9FMGxi = 2565 - INTEGER(IntKi), PARAMETER :: M7N1FMGxi = 2566 - INTEGER(IntKi), PARAMETER :: M7N2FMGxi = 2567 - INTEGER(IntKi), PARAMETER :: M7N3FMGxi = 2568 - INTEGER(IntKi), PARAMETER :: M7N4FMGxi = 2569 - INTEGER(IntKi), PARAMETER :: M7N5FMGxi = 2570 - INTEGER(IntKi), PARAMETER :: M7N6FMGxi = 2571 - INTEGER(IntKi), PARAMETER :: M7N7FMGxi = 2572 - INTEGER(IntKi), PARAMETER :: M7N8FMGxi = 2573 - INTEGER(IntKi), PARAMETER :: M7N9FMGxi = 2574 - INTEGER(IntKi), PARAMETER :: M8N1FMGxi = 2575 - INTEGER(IntKi), PARAMETER :: M8N2FMGxi = 2576 - INTEGER(IntKi), PARAMETER :: M8N3FMGxi = 2577 - INTEGER(IntKi), PARAMETER :: M8N4FMGxi = 2578 - INTEGER(IntKi), PARAMETER :: M8N5FMGxi = 2579 - INTEGER(IntKi), PARAMETER :: M8N6FMGxi = 2580 - INTEGER(IntKi), PARAMETER :: M8N7FMGxi = 2581 - INTEGER(IntKi), PARAMETER :: M8N8FMGxi = 2582 - INTEGER(IntKi), PARAMETER :: M8N9FMGxi = 2583 - INTEGER(IntKi), PARAMETER :: M9N1FMGxi = 2584 - INTEGER(IntKi), PARAMETER :: M9N2FMGxi = 2585 - INTEGER(IntKi), PARAMETER :: M9N3FMGxi = 2586 - INTEGER(IntKi), PARAMETER :: M9N4FMGxi = 2587 - INTEGER(IntKi), PARAMETER :: M9N5FMGxi = 2588 - INTEGER(IntKi), PARAMETER :: M9N6FMGxi = 2589 - INTEGER(IntKi), PARAMETER :: M9N7FMGxi = 2590 - INTEGER(IntKi), PARAMETER :: M9N8FMGxi = 2591 - INTEGER(IntKi), PARAMETER :: M9N9FMGxi = 2592 - INTEGER(IntKi), PARAMETER :: M1N1FMGyi = 2593 - INTEGER(IntKi), PARAMETER :: M1N2FMGyi = 2594 - INTEGER(IntKi), PARAMETER :: M1N3FMGyi = 2595 - INTEGER(IntKi), PARAMETER :: M1N4FMGyi = 2596 - INTEGER(IntKi), PARAMETER :: M1N5FMGyi = 2597 - INTEGER(IntKi), PARAMETER :: M1N6FMGyi = 2598 - INTEGER(IntKi), PARAMETER :: M1N7FMGyi = 2599 - INTEGER(IntKi), PARAMETER :: M1N8FMGyi = 2600 - INTEGER(IntKi), PARAMETER :: M1N9FMGyi = 2601 - INTEGER(IntKi), PARAMETER :: M2N1FMGyi = 2602 - INTEGER(IntKi), PARAMETER :: M2N2FMGyi = 2603 - INTEGER(IntKi), PARAMETER :: M2N3FMGyi = 2604 - INTEGER(IntKi), PARAMETER :: M2N4FMGyi = 2605 - INTEGER(IntKi), PARAMETER :: M2N5FMGyi = 2606 - INTEGER(IntKi), PARAMETER :: M2N6FMGyi = 2607 - INTEGER(IntKi), PARAMETER :: M2N7FMGyi = 2608 - INTEGER(IntKi), PARAMETER :: M2N8FMGyi = 2609 - INTEGER(IntKi), PARAMETER :: M2N9FMGyi = 2610 - INTEGER(IntKi), PARAMETER :: M3N1FMGyi = 2611 - INTEGER(IntKi), PARAMETER :: M3N2FMGyi = 2612 - INTEGER(IntKi), PARAMETER :: M3N3FMGyi = 2613 - INTEGER(IntKi), PARAMETER :: M3N4FMGyi = 2614 - INTEGER(IntKi), PARAMETER :: M3N5FMGyi = 2615 - INTEGER(IntKi), PARAMETER :: M3N6FMGyi = 2616 - INTEGER(IntKi), PARAMETER :: M3N7FMGyi = 2617 - INTEGER(IntKi), PARAMETER :: M3N8FMGyi = 2618 - INTEGER(IntKi), PARAMETER :: M3N9FMGyi = 2619 - INTEGER(IntKi), PARAMETER :: M4N1FMGyi = 2620 - INTEGER(IntKi), PARAMETER :: M4N2FMGyi = 2621 - INTEGER(IntKi), PARAMETER :: M4N3FMGyi = 2622 - INTEGER(IntKi), PARAMETER :: M4N4FMGyi = 2623 - INTEGER(IntKi), PARAMETER :: M4N5FMGyi = 2624 - INTEGER(IntKi), PARAMETER :: M4N6FMGyi = 2625 - INTEGER(IntKi), PARAMETER :: M4N7FMGyi = 2626 - INTEGER(IntKi), PARAMETER :: M4N8FMGyi = 2627 - INTEGER(IntKi), PARAMETER :: M4N9FMGyi = 2628 - INTEGER(IntKi), PARAMETER :: M5N1FMGyi = 2629 - INTEGER(IntKi), PARAMETER :: M5N2FMGyi = 2630 - INTEGER(IntKi), PARAMETER :: M5N3FMGyi = 2631 - INTEGER(IntKi), PARAMETER :: M5N4FMGyi = 2632 - INTEGER(IntKi), PARAMETER :: M5N5FMGyi = 2633 - INTEGER(IntKi), PARAMETER :: M5N6FMGyi = 2634 - INTEGER(IntKi), PARAMETER :: M5N7FMGyi = 2635 - INTEGER(IntKi), PARAMETER :: M5N8FMGyi = 2636 - INTEGER(IntKi), PARAMETER :: M5N9FMGyi = 2637 - INTEGER(IntKi), PARAMETER :: M6N1FMGyi = 2638 - INTEGER(IntKi), PARAMETER :: M6N2FMGyi = 2639 - INTEGER(IntKi), PARAMETER :: M6N3FMGyi = 2640 - INTEGER(IntKi), PARAMETER :: M6N4FMGyi = 2641 - INTEGER(IntKi), PARAMETER :: M6N5FMGyi = 2642 - INTEGER(IntKi), PARAMETER :: M6N6FMGyi = 2643 - INTEGER(IntKi), PARAMETER :: M6N7FMGyi = 2644 - INTEGER(IntKi), PARAMETER :: M6N8FMGyi = 2645 - INTEGER(IntKi), PARAMETER :: M6N9FMGyi = 2646 - INTEGER(IntKi), PARAMETER :: M7N1FMGyi = 2647 - INTEGER(IntKi), PARAMETER :: M7N2FMGyi = 2648 - INTEGER(IntKi), PARAMETER :: M7N3FMGyi = 2649 - INTEGER(IntKi), PARAMETER :: M7N4FMGyi = 2650 - INTEGER(IntKi), PARAMETER :: M7N5FMGyi = 2651 - INTEGER(IntKi), PARAMETER :: M7N6FMGyi = 2652 - INTEGER(IntKi), PARAMETER :: M7N7FMGyi = 2653 - INTEGER(IntKi), PARAMETER :: M7N8FMGyi = 2654 - INTEGER(IntKi), PARAMETER :: M7N9FMGyi = 2655 - INTEGER(IntKi), PARAMETER :: M8N1FMGyi = 2656 - INTEGER(IntKi), PARAMETER :: M8N2FMGyi = 2657 - INTEGER(IntKi), PARAMETER :: M8N3FMGyi = 2658 - INTEGER(IntKi), PARAMETER :: M8N4FMGyi = 2659 - INTEGER(IntKi), PARAMETER :: M8N5FMGyi = 2660 - INTEGER(IntKi), PARAMETER :: M8N6FMGyi = 2661 - INTEGER(IntKi), PARAMETER :: M8N7FMGyi = 2662 - INTEGER(IntKi), PARAMETER :: M8N8FMGyi = 2663 - INTEGER(IntKi), PARAMETER :: M8N9FMGyi = 2664 - INTEGER(IntKi), PARAMETER :: M9N1FMGyi = 2665 - INTEGER(IntKi), PARAMETER :: M9N2FMGyi = 2666 - INTEGER(IntKi), PARAMETER :: M9N3FMGyi = 2667 - INTEGER(IntKi), PARAMETER :: M9N4FMGyi = 2668 - INTEGER(IntKi), PARAMETER :: M9N5FMGyi = 2669 - INTEGER(IntKi), PARAMETER :: M9N6FMGyi = 2670 - INTEGER(IntKi), PARAMETER :: M9N7FMGyi = 2671 - INTEGER(IntKi), PARAMETER :: M9N8FMGyi = 2672 - INTEGER(IntKi), PARAMETER :: M9N9FMGyi = 2673 - INTEGER(IntKi), PARAMETER :: M1N1FMGzi = 2674 - INTEGER(IntKi), PARAMETER :: M1N2FMGzi = 2675 - INTEGER(IntKi), PARAMETER :: M1N3FMGzi = 2676 - INTEGER(IntKi), PARAMETER :: M1N4FMGzi = 2677 - INTEGER(IntKi), PARAMETER :: M1N5FMGzi = 2678 - INTEGER(IntKi), PARAMETER :: M1N6FMGzi = 2679 - INTEGER(IntKi), PARAMETER :: M1N7FMGzi = 2680 - INTEGER(IntKi), PARAMETER :: M1N8FMGzi = 2681 - INTEGER(IntKi), PARAMETER :: M1N9FMGzi = 2682 - INTEGER(IntKi), PARAMETER :: M2N1FMGzi = 2683 - INTEGER(IntKi), PARAMETER :: M2N2FMGzi = 2684 - INTEGER(IntKi), PARAMETER :: M2N3FMGzi = 2685 - INTEGER(IntKi), PARAMETER :: M2N4FMGzi = 2686 - INTEGER(IntKi), PARAMETER :: M2N5FMGzi = 2687 - INTEGER(IntKi), PARAMETER :: M2N6FMGzi = 2688 - INTEGER(IntKi), PARAMETER :: M2N7FMGzi = 2689 - INTEGER(IntKi), PARAMETER :: M2N8FMGzi = 2690 - INTEGER(IntKi), PARAMETER :: M2N9FMGzi = 2691 - INTEGER(IntKi), PARAMETER :: M3N1FMGzi = 2692 - INTEGER(IntKi), PARAMETER :: M3N2FMGzi = 2693 - INTEGER(IntKi), PARAMETER :: M3N3FMGzi = 2694 - INTEGER(IntKi), PARAMETER :: M3N4FMGzi = 2695 - INTEGER(IntKi), PARAMETER :: M3N5FMGzi = 2696 - INTEGER(IntKi), PARAMETER :: M3N6FMGzi = 2697 - INTEGER(IntKi), PARAMETER :: M3N7FMGzi = 2698 - INTEGER(IntKi), PARAMETER :: M3N8FMGzi = 2699 - INTEGER(IntKi), PARAMETER :: M3N9FMGzi = 2700 - INTEGER(IntKi), PARAMETER :: M4N1FMGzi = 2701 - INTEGER(IntKi), PARAMETER :: M4N2FMGzi = 2702 - INTEGER(IntKi), PARAMETER :: M4N3FMGzi = 2703 - INTEGER(IntKi), PARAMETER :: M4N4FMGzi = 2704 - INTEGER(IntKi), PARAMETER :: M4N5FMGzi = 2705 - INTEGER(IntKi), PARAMETER :: M4N6FMGzi = 2706 - INTEGER(IntKi), PARAMETER :: M4N7FMGzi = 2707 - INTEGER(IntKi), PARAMETER :: M4N8FMGzi = 2708 - INTEGER(IntKi), PARAMETER :: M4N9FMGzi = 2709 - INTEGER(IntKi), PARAMETER :: M5N1FMGzi = 2710 - INTEGER(IntKi), PARAMETER :: M5N2FMGzi = 2711 - INTEGER(IntKi), PARAMETER :: M5N3FMGzi = 2712 - INTEGER(IntKi), PARAMETER :: M5N4FMGzi = 2713 - INTEGER(IntKi), PARAMETER :: M5N5FMGzi = 2714 - INTEGER(IntKi), PARAMETER :: M5N6FMGzi = 2715 - INTEGER(IntKi), PARAMETER :: M5N7FMGzi = 2716 - INTEGER(IntKi), PARAMETER :: M5N8FMGzi = 2717 - INTEGER(IntKi), PARAMETER :: M5N9FMGzi = 2718 - INTEGER(IntKi), PARAMETER :: M6N1FMGzi = 2719 - INTEGER(IntKi), PARAMETER :: M6N2FMGzi = 2720 - INTEGER(IntKi), PARAMETER :: M6N3FMGzi = 2721 - INTEGER(IntKi), PARAMETER :: M6N4FMGzi = 2722 - INTEGER(IntKi), PARAMETER :: M6N5FMGzi = 2723 - INTEGER(IntKi), PARAMETER :: M6N6FMGzi = 2724 - INTEGER(IntKi), PARAMETER :: M6N7FMGzi = 2725 - INTEGER(IntKi), PARAMETER :: M6N8FMGzi = 2726 - INTEGER(IntKi), PARAMETER :: M6N9FMGzi = 2727 - INTEGER(IntKi), PARAMETER :: M7N1FMGzi = 2728 - INTEGER(IntKi), PARAMETER :: M7N2FMGzi = 2729 - INTEGER(IntKi), PARAMETER :: M7N3FMGzi = 2730 - INTEGER(IntKi), PARAMETER :: M7N4FMGzi = 2731 - INTEGER(IntKi), PARAMETER :: M7N5FMGzi = 2732 - INTEGER(IntKi), PARAMETER :: M7N6FMGzi = 2733 - INTEGER(IntKi), PARAMETER :: M7N7FMGzi = 2734 - INTEGER(IntKi), PARAMETER :: M7N8FMGzi = 2735 - INTEGER(IntKi), PARAMETER :: M7N9FMGzi = 2736 - INTEGER(IntKi), PARAMETER :: M8N1FMGzi = 2737 - INTEGER(IntKi), PARAMETER :: M8N2FMGzi = 2738 - INTEGER(IntKi), PARAMETER :: M8N3FMGzi = 2739 - INTEGER(IntKi), PARAMETER :: M8N4FMGzi = 2740 - INTEGER(IntKi), PARAMETER :: M8N5FMGzi = 2741 - INTEGER(IntKi), PARAMETER :: M8N6FMGzi = 2742 - INTEGER(IntKi), PARAMETER :: M8N7FMGzi = 2743 - INTEGER(IntKi), PARAMETER :: M8N8FMGzi = 2744 - INTEGER(IntKi), PARAMETER :: M8N9FMGzi = 2745 - INTEGER(IntKi), PARAMETER :: M9N1FMGzi = 2746 - INTEGER(IntKi), PARAMETER :: M9N2FMGzi = 2747 - INTEGER(IntKi), PARAMETER :: M9N3FMGzi = 2748 - INTEGER(IntKi), PARAMETER :: M9N4FMGzi = 2749 - INTEGER(IntKi), PARAMETER :: M9N5FMGzi = 2750 - INTEGER(IntKi), PARAMETER :: M9N6FMGzi = 2751 - INTEGER(IntKi), PARAMETER :: M9N7FMGzi = 2752 - INTEGER(IntKi), PARAMETER :: M9N8FMGzi = 2753 - INTEGER(IntKi), PARAMETER :: M9N9FMGzi = 2754 - INTEGER(IntKi), PARAMETER :: M1N1MMGxi = 2755 - INTEGER(IntKi), PARAMETER :: M1N2MMGxi = 2756 - INTEGER(IntKi), PARAMETER :: M1N3MMGxi = 2757 - INTEGER(IntKi), PARAMETER :: M1N4MMGxi = 2758 - INTEGER(IntKi), PARAMETER :: M1N5MMGxi = 2759 - INTEGER(IntKi), PARAMETER :: M1N6MMGxi = 2760 - INTEGER(IntKi), PARAMETER :: M1N7MMGxi = 2761 - INTEGER(IntKi), PARAMETER :: M1N8MMGxi = 2762 - INTEGER(IntKi), PARAMETER :: M1N9MMGxi = 2763 - INTEGER(IntKi), PARAMETER :: M2N1MMGxi = 2764 - INTEGER(IntKi), PARAMETER :: M2N2MMGxi = 2765 - INTEGER(IntKi), PARAMETER :: M2N3MMGxi = 2766 - INTEGER(IntKi), PARAMETER :: M2N4MMGxi = 2767 - INTEGER(IntKi), PARAMETER :: M2N5MMGxi = 2768 - INTEGER(IntKi), PARAMETER :: M2N6MMGxi = 2769 - INTEGER(IntKi), PARAMETER :: M2N7MMGxi = 2770 - INTEGER(IntKi), PARAMETER :: M2N8MMGxi = 2771 - INTEGER(IntKi), PARAMETER :: M2N9MMGxi = 2772 - INTEGER(IntKi), PARAMETER :: M3N1MMGxi = 2773 - INTEGER(IntKi), PARAMETER :: M3N2MMGxi = 2774 - INTEGER(IntKi), PARAMETER :: M3N3MMGxi = 2775 - INTEGER(IntKi), PARAMETER :: M3N4MMGxi = 2776 - INTEGER(IntKi), PARAMETER :: M3N5MMGxi = 2777 - INTEGER(IntKi), PARAMETER :: M3N6MMGxi = 2778 - INTEGER(IntKi), PARAMETER :: M3N7MMGxi = 2779 - INTEGER(IntKi), PARAMETER :: M3N8MMGxi = 2780 - INTEGER(IntKi), PARAMETER :: M3N9MMGxi = 2781 - INTEGER(IntKi), PARAMETER :: M4N1MMGxi = 2782 - INTEGER(IntKi), PARAMETER :: M4N2MMGxi = 2783 - INTEGER(IntKi), PARAMETER :: M4N3MMGxi = 2784 - INTEGER(IntKi), PARAMETER :: M4N4MMGxi = 2785 - INTEGER(IntKi), PARAMETER :: M4N5MMGxi = 2786 - INTEGER(IntKi), PARAMETER :: M4N6MMGxi = 2787 - INTEGER(IntKi), PARAMETER :: M4N7MMGxi = 2788 - INTEGER(IntKi), PARAMETER :: M4N8MMGxi = 2789 - INTEGER(IntKi), PARAMETER :: M4N9MMGxi = 2790 - INTEGER(IntKi), PARAMETER :: M5N1MMGxi = 2791 - INTEGER(IntKi), PARAMETER :: M5N2MMGxi = 2792 - INTEGER(IntKi), PARAMETER :: M5N3MMGxi = 2793 - INTEGER(IntKi), PARAMETER :: M5N4MMGxi = 2794 - INTEGER(IntKi), PARAMETER :: M5N5MMGxi = 2795 - INTEGER(IntKi), PARAMETER :: M5N6MMGxi = 2796 - INTEGER(IntKi), PARAMETER :: M5N7MMGxi = 2797 - INTEGER(IntKi), PARAMETER :: M5N8MMGxi = 2798 - INTEGER(IntKi), PARAMETER :: M5N9MMGxi = 2799 - INTEGER(IntKi), PARAMETER :: M6N1MMGxi = 2800 - INTEGER(IntKi), PARAMETER :: M6N2MMGxi = 2801 - INTEGER(IntKi), PARAMETER :: M6N3MMGxi = 2802 - INTEGER(IntKi), PARAMETER :: M6N4MMGxi = 2803 - INTEGER(IntKi), PARAMETER :: M6N5MMGxi = 2804 - INTEGER(IntKi), PARAMETER :: M6N6MMGxi = 2805 - INTEGER(IntKi), PARAMETER :: M6N7MMGxi = 2806 - INTEGER(IntKi), PARAMETER :: M6N8MMGxi = 2807 - INTEGER(IntKi), PARAMETER :: M6N9MMGxi = 2808 - INTEGER(IntKi), PARAMETER :: M7N1MMGxi = 2809 - INTEGER(IntKi), PARAMETER :: M7N2MMGxi = 2810 - INTEGER(IntKi), PARAMETER :: M7N3MMGxi = 2811 - INTEGER(IntKi), PARAMETER :: M7N4MMGxi = 2812 - INTEGER(IntKi), PARAMETER :: M7N5MMGxi = 2813 - INTEGER(IntKi), PARAMETER :: M7N6MMGxi = 2814 - INTEGER(IntKi), PARAMETER :: M7N7MMGxi = 2815 - INTEGER(IntKi), PARAMETER :: M7N8MMGxi = 2816 - INTEGER(IntKi), PARAMETER :: M7N9MMGxi = 2817 - INTEGER(IntKi), PARAMETER :: M8N1MMGxi = 2818 - INTEGER(IntKi), PARAMETER :: M8N2MMGxi = 2819 - INTEGER(IntKi), PARAMETER :: M8N3MMGxi = 2820 - INTEGER(IntKi), PARAMETER :: M8N4MMGxi = 2821 - INTEGER(IntKi), PARAMETER :: M8N5MMGxi = 2822 - INTEGER(IntKi), PARAMETER :: M8N6MMGxi = 2823 - INTEGER(IntKi), PARAMETER :: M8N7MMGxi = 2824 - INTEGER(IntKi), PARAMETER :: M8N8MMGxi = 2825 - INTEGER(IntKi), PARAMETER :: M8N9MMGxi = 2826 - INTEGER(IntKi), PARAMETER :: M9N1MMGxi = 2827 - INTEGER(IntKi), PARAMETER :: M9N2MMGxi = 2828 - INTEGER(IntKi), PARAMETER :: M9N3MMGxi = 2829 - INTEGER(IntKi), PARAMETER :: M9N4MMGxi = 2830 - INTEGER(IntKi), PARAMETER :: M9N5MMGxi = 2831 - INTEGER(IntKi), PARAMETER :: M9N6MMGxi = 2832 - INTEGER(IntKi), PARAMETER :: M9N7MMGxi = 2833 - INTEGER(IntKi), PARAMETER :: M9N8MMGxi = 2834 - INTEGER(IntKi), PARAMETER :: M9N9MMGxi = 2835 - INTEGER(IntKi), PARAMETER :: M1N1MMGyi = 2836 - INTEGER(IntKi), PARAMETER :: M1N2MMGyi = 2837 - INTEGER(IntKi), PARAMETER :: M1N3MMGyi = 2838 - INTEGER(IntKi), PARAMETER :: M1N4MMGyi = 2839 - INTEGER(IntKi), PARAMETER :: M1N5MMGyi = 2840 - INTEGER(IntKi), PARAMETER :: M1N6MMGyi = 2841 - INTEGER(IntKi), PARAMETER :: M1N7MMGyi = 2842 - INTEGER(IntKi), PARAMETER :: M1N8MMGyi = 2843 - INTEGER(IntKi), PARAMETER :: M1N9MMGyi = 2844 - INTEGER(IntKi), PARAMETER :: M2N1MMGyi = 2845 - INTEGER(IntKi), PARAMETER :: M2N2MMGyi = 2846 - INTEGER(IntKi), PARAMETER :: M2N3MMGyi = 2847 - INTEGER(IntKi), PARAMETER :: M2N4MMGyi = 2848 - INTEGER(IntKi), PARAMETER :: M2N5MMGyi = 2849 - INTEGER(IntKi), PARAMETER :: M2N6MMGyi = 2850 - INTEGER(IntKi), PARAMETER :: M2N7MMGyi = 2851 - INTEGER(IntKi), PARAMETER :: M2N8MMGyi = 2852 - INTEGER(IntKi), PARAMETER :: M2N9MMGyi = 2853 - INTEGER(IntKi), PARAMETER :: M3N1MMGyi = 2854 - INTEGER(IntKi), PARAMETER :: M3N2MMGyi = 2855 - INTEGER(IntKi), PARAMETER :: M3N3MMGyi = 2856 - INTEGER(IntKi), PARAMETER :: M3N4MMGyi = 2857 - INTEGER(IntKi), PARAMETER :: M3N5MMGyi = 2858 - INTEGER(IntKi), PARAMETER :: M3N6MMGyi = 2859 - INTEGER(IntKi), PARAMETER :: M3N7MMGyi = 2860 - INTEGER(IntKi), PARAMETER :: M3N8MMGyi = 2861 - INTEGER(IntKi), PARAMETER :: M3N9MMGyi = 2862 - INTEGER(IntKi), PARAMETER :: M4N1MMGyi = 2863 - INTEGER(IntKi), PARAMETER :: M4N2MMGyi = 2864 - INTEGER(IntKi), PARAMETER :: M4N3MMGyi = 2865 - INTEGER(IntKi), PARAMETER :: M4N4MMGyi = 2866 - INTEGER(IntKi), PARAMETER :: M4N5MMGyi = 2867 - INTEGER(IntKi), PARAMETER :: M4N6MMGyi = 2868 - INTEGER(IntKi), PARAMETER :: M4N7MMGyi = 2869 - INTEGER(IntKi), PARAMETER :: M4N8MMGyi = 2870 - INTEGER(IntKi), PARAMETER :: M4N9MMGyi = 2871 - INTEGER(IntKi), PARAMETER :: M5N1MMGyi = 2872 - INTEGER(IntKi), PARAMETER :: M5N2MMGyi = 2873 - INTEGER(IntKi), PARAMETER :: M5N3MMGyi = 2874 - INTEGER(IntKi), PARAMETER :: M5N4MMGyi = 2875 - INTEGER(IntKi), PARAMETER :: M5N5MMGyi = 2876 - INTEGER(IntKi), PARAMETER :: M5N6MMGyi = 2877 - INTEGER(IntKi), PARAMETER :: M5N7MMGyi = 2878 - INTEGER(IntKi), PARAMETER :: M5N8MMGyi = 2879 - INTEGER(IntKi), PARAMETER :: M5N9MMGyi = 2880 - INTEGER(IntKi), PARAMETER :: M6N1MMGyi = 2881 - INTEGER(IntKi), PARAMETER :: M6N2MMGyi = 2882 - INTEGER(IntKi), PARAMETER :: M6N3MMGyi = 2883 - INTEGER(IntKi), PARAMETER :: M6N4MMGyi = 2884 - INTEGER(IntKi), PARAMETER :: M6N5MMGyi = 2885 - INTEGER(IntKi), PARAMETER :: M6N6MMGyi = 2886 - INTEGER(IntKi), PARAMETER :: M6N7MMGyi = 2887 - INTEGER(IntKi), PARAMETER :: M6N8MMGyi = 2888 - INTEGER(IntKi), PARAMETER :: M6N9MMGyi = 2889 - INTEGER(IntKi), PARAMETER :: M7N1MMGyi = 2890 - INTEGER(IntKi), PARAMETER :: M7N2MMGyi = 2891 - INTEGER(IntKi), PARAMETER :: M7N3MMGyi = 2892 - INTEGER(IntKi), PARAMETER :: M7N4MMGyi = 2893 - INTEGER(IntKi), PARAMETER :: M7N5MMGyi = 2894 - INTEGER(IntKi), PARAMETER :: M7N6MMGyi = 2895 - INTEGER(IntKi), PARAMETER :: M7N7MMGyi = 2896 - INTEGER(IntKi), PARAMETER :: M7N8MMGyi = 2897 - INTEGER(IntKi), PARAMETER :: M7N9MMGyi = 2898 - INTEGER(IntKi), PARAMETER :: M8N1MMGyi = 2899 - INTEGER(IntKi), PARAMETER :: M8N2MMGyi = 2900 - INTEGER(IntKi), PARAMETER :: M8N3MMGyi = 2901 - INTEGER(IntKi), PARAMETER :: M8N4MMGyi = 2902 - INTEGER(IntKi), PARAMETER :: M8N5MMGyi = 2903 - INTEGER(IntKi), PARAMETER :: M8N6MMGyi = 2904 - INTEGER(IntKi), PARAMETER :: M8N7MMGyi = 2905 - INTEGER(IntKi), PARAMETER :: M8N8MMGyi = 2906 - INTEGER(IntKi), PARAMETER :: M8N9MMGyi = 2907 - INTEGER(IntKi), PARAMETER :: M9N1MMGyi = 2908 - INTEGER(IntKi), PARAMETER :: M9N2MMGyi = 2909 - INTEGER(IntKi), PARAMETER :: M9N3MMGyi = 2910 - INTEGER(IntKi), PARAMETER :: M9N4MMGyi = 2911 - INTEGER(IntKi), PARAMETER :: M9N5MMGyi = 2912 - INTEGER(IntKi), PARAMETER :: M9N6MMGyi = 2913 - INTEGER(IntKi), PARAMETER :: M9N7MMGyi = 2914 - INTEGER(IntKi), PARAMETER :: M9N8MMGyi = 2915 - INTEGER(IntKi), PARAMETER :: M9N9MMGyi = 2916 - INTEGER(IntKi), PARAMETER :: M1N1MMGzi = 2917 - INTEGER(IntKi), PARAMETER :: M1N2MMGzi = 2918 - INTEGER(IntKi), PARAMETER :: M1N3MMGzi = 2919 - INTEGER(IntKi), PARAMETER :: M1N4MMGzi = 2920 - INTEGER(IntKi), PARAMETER :: M1N5MMGzi = 2921 - INTEGER(IntKi), PARAMETER :: M1N6MMGzi = 2922 - INTEGER(IntKi), PARAMETER :: M1N7MMGzi = 2923 - INTEGER(IntKi), PARAMETER :: M1N8MMGzi = 2924 - INTEGER(IntKi), PARAMETER :: M1N9MMGzi = 2925 - INTEGER(IntKi), PARAMETER :: M2N1MMGzi = 2926 - INTEGER(IntKi), PARAMETER :: M2N2MMGzi = 2927 - INTEGER(IntKi), PARAMETER :: M2N3MMGzi = 2928 - INTEGER(IntKi), PARAMETER :: M2N4MMGzi = 2929 - INTEGER(IntKi), PARAMETER :: M2N5MMGzi = 2930 - INTEGER(IntKi), PARAMETER :: M2N6MMGzi = 2931 - INTEGER(IntKi), PARAMETER :: M2N7MMGzi = 2932 - INTEGER(IntKi), PARAMETER :: M2N8MMGzi = 2933 - INTEGER(IntKi), PARAMETER :: M2N9MMGzi = 2934 - INTEGER(IntKi), PARAMETER :: M3N1MMGzi = 2935 - INTEGER(IntKi), PARAMETER :: M3N2MMGzi = 2936 - INTEGER(IntKi), PARAMETER :: M3N3MMGzi = 2937 - INTEGER(IntKi), PARAMETER :: M3N4MMGzi = 2938 - INTEGER(IntKi), PARAMETER :: M3N5MMGzi = 2939 - INTEGER(IntKi), PARAMETER :: M3N6MMGzi = 2940 - INTEGER(IntKi), PARAMETER :: M3N7MMGzi = 2941 - INTEGER(IntKi), PARAMETER :: M3N8MMGzi = 2942 - INTEGER(IntKi), PARAMETER :: M3N9MMGzi = 2943 - INTEGER(IntKi), PARAMETER :: M4N1MMGzi = 2944 - INTEGER(IntKi), PARAMETER :: M4N2MMGzi = 2945 - INTEGER(IntKi), PARAMETER :: M4N3MMGzi = 2946 - INTEGER(IntKi), PARAMETER :: M4N4MMGzi = 2947 - INTEGER(IntKi), PARAMETER :: M4N5MMGzi = 2948 - INTEGER(IntKi), PARAMETER :: M4N6MMGzi = 2949 - INTEGER(IntKi), PARAMETER :: M4N7MMGzi = 2950 - INTEGER(IntKi), PARAMETER :: M4N8MMGzi = 2951 - INTEGER(IntKi), PARAMETER :: M4N9MMGzi = 2952 - INTEGER(IntKi), PARAMETER :: M5N1MMGzi = 2953 - INTEGER(IntKi), PARAMETER :: M5N2MMGzi = 2954 - INTEGER(IntKi), PARAMETER :: M5N3MMGzi = 2955 - INTEGER(IntKi), PARAMETER :: M5N4MMGzi = 2956 - INTEGER(IntKi), PARAMETER :: M5N5MMGzi = 2957 - INTEGER(IntKi), PARAMETER :: M5N6MMGzi = 2958 - INTEGER(IntKi), PARAMETER :: M5N7MMGzi = 2959 - INTEGER(IntKi), PARAMETER :: M5N8MMGzi = 2960 - INTEGER(IntKi), PARAMETER :: M5N9MMGzi = 2961 - INTEGER(IntKi), PARAMETER :: M6N1MMGzi = 2962 - INTEGER(IntKi), PARAMETER :: M6N2MMGzi = 2963 - INTEGER(IntKi), PARAMETER :: M6N3MMGzi = 2964 - INTEGER(IntKi), PARAMETER :: M6N4MMGzi = 2965 - INTEGER(IntKi), PARAMETER :: M6N5MMGzi = 2966 - INTEGER(IntKi), PARAMETER :: M6N6MMGzi = 2967 - INTEGER(IntKi), PARAMETER :: M6N7MMGzi = 2968 - INTEGER(IntKi), PARAMETER :: M6N8MMGzi = 2969 - INTEGER(IntKi), PARAMETER :: M6N9MMGzi = 2970 - INTEGER(IntKi), PARAMETER :: M7N1MMGzi = 2971 - INTEGER(IntKi), PARAMETER :: M7N2MMGzi = 2972 - INTEGER(IntKi), PARAMETER :: M7N3MMGzi = 2973 - INTEGER(IntKi), PARAMETER :: M7N4MMGzi = 2974 - INTEGER(IntKi), PARAMETER :: M7N5MMGzi = 2975 - INTEGER(IntKi), PARAMETER :: M7N6MMGzi = 2976 - INTEGER(IntKi), PARAMETER :: M7N7MMGzi = 2977 - INTEGER(IntKi), PARAMETER :: M7N8MMGzi = 2978 - INTEGER(IntKi), PARAMETER :: M7N9MMGzi = 2979 - INTEGER(IntKi), PARAMETER :: M8N1MMGzi = 2980 - INTEGER(IntKi), PARAMETER :: M8N2MMGzi = 2981 - INTEGER(IntKi), PARAMETER :: M8N3MMGzi = 2982 - INTEGER(IntKi), PARAMETER :: M8N4MMGzi = 2983 - INTEGER(IntKi), PARAMETER :: M8N5MMGzi = 2984 - INTEGER(IntKi), PARAMETER :: M8N6MMGzi = 2985 - INTEGER(IntKi), PARAMETER :: M8N7MMGzi = 2986 - INTEGER(IntKi), PARAMETER :: M8N8MMGzi = 2987 - INTEGER(IntKi), PARAMETER :: M8N9MMGzi = 2988 - INTEGER(IntKi), PARAMETER :: M9N1MMGzi = 2989 - INTEGER(IntKi), PARAMETER :: M9N2MMGzi = 2990 - INTEGER(IntKi), PARAMETER :: M9N3MMGzi = 2991 - INTEGER(IntKi), PARAMETER :: M9N4MMGzi = 2992 - INTEGER(IntKi), PARAMETER :: M9N5MMGzi = 2993 - INTEGER(IntKi), PARAMETER :: M9N6MMGzi = 2994 - INTEGER(IntKi), PARAMETER :: M9N7MMGzi = 2995 - INTEGER(IntKi), PARAMETER :: M9N8MMGzi = 2996 - INTEGER(IntKi), PARAMETER :: M9N9MMGzi = 2997 - INTEGER(IntKi), PARAMETER :: M1N1FAMxi = 2998 - INTEGER(IntKi), PARAMETER :: M1N2FAMxi = 2999 - INTEGER(IntKi), PARAMETER :: M1N3FAMxi = 3000 - INTEGER(IntKi), PARAMETER :: M1N4FAMxi = 3001 - INTEGER(IntKi), PARAMETER :: M1N5FAMxi = 3002 - INTEGER(IntKi), PARAMETER :: M1N6FAMxi = 3003 - INTEGER(IntKi), PARAMETER :: M1N7FAMxi = 3004 - INTEGER(IntKi), PARAMETER :: M1N8FAMxi = 3005 - INTEGER(IntKi), PARAMETER :: M1N9FAMxi = 3006 - INTEGER(IntKi), PARAMETER :: M2N1FAMxi = 3007 - INTEGER(IntKi), PARAMETER :: M2N2FAMxi = 3008 - INTEGER(IntKi), PARAMETER :: M2N3FAMxi = 3009 - INTEGER(IntKi), PARAMETER :: M2N4FAMxi = 3010 - INTEGER(IntKi), PARAMETER :: M2N5FAMxi = 3011 - INTEGER(IntKi), PARAMETER :: M2N6FAMxi = 3012 - INTEGER(IntKi), PARAMETER :: M2N7FAMxi = 3013 - INTEGER(IntKi), PARAMETER :: M2N8FAMxi = 3014 - INTEGER(IntKi), PARAMETER :: M2N9FAMxi = 3015 - INTEGER(IntKi), PARAMETER :: M3N1FAMxi = 3016 - INTEGER(IntKi), PARAMETER :: M3N2FAMxi = 3017 - INTEGER(IntKi), PARAMETER :: M3N3FAMxi = 3018 - INTEGER(IntKi), PARAMETER :: M3N4FAMxi = 3019 - INTEGER(IntKi), PARAMETER :: M3N5FAMxi = 3020 - INTEGER(IntKi), PARAMETER :: M3N6FAMxi = 3021 - INTEGER(IntKi), PARAMETER :: M3N7FAMxi = 3022 - INTEGER(IntKi), PARAMETER :: M3N8FAMxi = 3023 - INTEGER(IntKi), PARAMETER :: M3N9FAMxi = 3024 - INTEGER(IntKi), PARAMETER :: M4N1FAMxi = 3025 - INTEGER(IntKi), PARAMETER :: M4N2FAMxi = 3026 - INTEGER(IntKi), PARAMETER :: M4N3FAMxi = 3027 - INTEGER(IntKi), PARAMETER :: M4N4FAMxi = 3028 - INTEGER(IntKi), PARAMETER :: M4N5FAMxi = 3029 - INTEGER(IntKi), PARAMETER :: M4N6FAMxi = 3030 - INTEGER(IntKi), PARAMETER :: M4N7FAMxi = 3031 - INTEGER(IntKi), PARAMETER :: M4N8FAMxi = 3032 - INTEGER(IntKi), PARAMETER :: M4N9FAMxi = 3033 - INTEGER(IntKi), PARAMETER :: M5N1FAMxi = 3034 - INTEGER(IntKi), PARAMETER :: M5N2FAMxi = 3035 - INTEGER(IntKi), PARAMETER :: M5N3FAMxi = 3036 - INTEGER(IntKi), PARAMETER :: M5N4FAMxi = 3037 - INTEGER(IntKi), PARAMETER :: M5N5FAMxi = 3038 - INTEGER(IntKi), PARAMETER :: M5N6FAMxi = 3039 - INTEGER(IntKi), PARAMETER :: M5N7FAMxi = 3040 - INTEGER(IntKi), PARAMETER :: M5N8FAMxi = 3041 - INTEGER(IntKi), PARAMETER :: M5N9FAMxi = 3042 - INTEGER(IntKi), PARAMETER :: M6N1FAMxi = 3043 - INTEGER(IntKi), PARAMETER :: M6N2FAMxi = 3044 - INTEGER(IntKi), PARAMETER :: M6N3FAMxi = 3045 - INTEGER(IntKi), PARAMETER :: M6N4FAMxi = 3046 - INTEGER(IntKi), PARAMETER :: M6N5FAMxi = 3047 - INTEGER(IntKi), PARAMETER :: M6N6FAMxi = 3048 - INTEGER(IntKi), PARAMETER :: M6N7FAMxi = 3049 - INTEGER(IntKi), PARAMETER :: M6N8FAMxi = 3050 - INTEGER(IntKi), PARAMETER :: M6N9FAMxi = 3051 - INTEGER(IntKi), PARAMETER :: M7N1FAMxi = 3052 - INTEGER(IntKi), PARAMETER :: M7N2FAMxi = 3053 - INTEGER(IntKi), PARAMETER :: M7N3FAMxi = 3054 - INTEGER(IntKi), PARAMETER :: M7N4FAMxi = 3055 - INTEGER(IntKi), PARAMETER :: M7N5FAMxi = 3056 - INTEGER(IntKi), PARAMETER :: M7N6FAMxi = 3057 - INTEGER(IntKi), PARAMETER :: M7N7FAMxi = 3058 - INTEGER(IntKi), PARAMETER :: M7N8FAMxi = 3059 - INTEGER(IntKi), PARAMETER :: M7N9FAMxi = 3060 - INTEGER(IntKi), PARAMETER :: M8N1FAMxi = 3061 - INTEGER(IntKi), PARAMETER :: M8N2FAMxi = 3062 - INTEGER(IntKi), PARAMETER :: M8N3FAMxi = 3063 - INTEGER(IntKi), PARAMETER :: M8N4FAMxi = 3064 - INTEGER(IntKi), PARAMETER :: M8N5FAMxi = 3065 - INTEGER(IntKi), PARAMETER :: M8N6FAMxi = 3066 - INTEGER(IntKi), PARAMETER :: M8N7FAMxi = 3067 - INTEGER(IntKi), PARAMETER :: M8N8FAMxi = 3068 - INTEGER(IntKi), PARAMETER :: M8N9FAMxi = 3069 - INTEGER(IntKi), PARAMETER :: M9N1FAMxi = 3070 - INTEGER(IntKi), PARAMETER :: M9N2FAMxi = 3071 - INTEGER(IntKi), PARAMETER :: M9N3FAMxi = 3072 - INTEGER(IntKi), PARAMETER :: M9N4FAMxi = 3073 - INTEGER(IntKi), PARAMETER :: M9N5FAMxi = 3074 - INTEGER(IntKi), PARAMETER :: M9N6FAMxi = 3075 - INTEGER(IntKi), PARAMETER :: M9N7FAMxi = 3076 - INTEGER(IntKi), PARAMETER :: M9N8FAMxi = 3077 - INTEGER(IntKi), PARAMETER :: M9N9FAMxi = 3078 - INTEGER(IntKi), PARAMETER :: M1N1FAMyi = 3079 - INTEGER(IntKi), PARAMETER :: M1N2FAMyi = 3080 - INTEGER(IntKi), PARAMETER :: M1N3FAMyi = 3081 - INTEGER(IntKi), PARAMETER :: M1N4FAMyi = 3082 - INTEGER(IntKi), PARAMETER :: M1N5FAMyi = 3083 - INTEGER(IntKi), PARAMETER :: M1N6FAMyi = 3084 - INTEGER(IntKi), PARAMETER :: M1N7FAMyi = 3085 - INTEGER(IntKi), PARAMETER :: M1N8FAMyi = 3086 - INTEGER(IntKi), PARAMETER :: M1N9FAMyi = 3087 - INTEGER(IntKi), PARAMETER :: M2N1FAMyi = 3088 - INTEGER(IntKi), PARAMETER :: M2N2FAMyi = 3089 - INTEGER(IntKi), PARAMETER :: M2N3FAMyi = 3090 - INTEGER(IntKi), PARAMETER :: M2N4FAMyi = 3091 - INTEGER(IntKi), PARAMETER :: M2N5FAMyi = 3092 - INTEGER(IntKi), PARAMETER :: M2N6FAMyi = 3093 - INTEGER(IntKi), PARAMETER :: M2N7FAMyi = 3094 - INTEGER(IntKi), PARAMETER :: M2N8FAMyi = 3095 - INTEGER(IntKi), PARAMETER :: M2N9FAMyi = 3096 - INTEGER(IntKi), PARAMETER :: M3N1FAMyi = 3097 - INTEGER(IntKi), PARAMETER :: M3N2FAMyi = 3098 - INTEGER(IntKi), PARAMETER :: M3N3FAMyi = 3099 - INTEGER(IntKi), PARAMETER :: M3N4FAMyi = 3100 - INTEGER(IntKi), PARAMETER :: M3N5FAMyi = 3101 - INTEGER(IntKi), PARAMETER :: M3N6FAMyi = 3102 - INTEGER(IntKi), PARAMETER :: M3N7FAMyi = 3103 - INTEGER(IntKi), PARAMETER :: M3N8FAMyi = 3104 - INTEGER(IntKi), PARAMETER :: M3N9FAMyi = 3105 - INTEGER(IntKi), PARAMETER :: M4N1FAMyi = 3106 - INTEGER(IntKi), PARAMETER :: M4N2FAMyi = 3107 - INTEGER(IntKi), PARAMETER :: M4N3FAMyi = 3108 - INTEGER(IntKi), PARAMETER :: M4N4FAMyi = 3109 - INTEGER(IntKi), PARAMETER :: M4N5FAMyi = 3110 - INTEGER(IntKi), PARAMETER :: M4N6FAMyi = 3111 - INTEGER(IntKi), PARAMETER :: M4N7FAMyi = 3112 - INTEGER(IntKi), PARAMETER :: M4N8FAMyi = 3113 - INTEGER(IntKi), PARAMETER :: M4N9FAMyi = 3114 - INTEGER(IntKi), PARAMETER :: M5N1FAMyi = 3115 - INTEGER(IntKi), PARAMETER :: M5N2FAMyi = 3116 - INTEGER(IntKi), PARAMETER :: M5N3FAMyi = 3117 - INTEGER(IntKi), PARAMETER :: M5N4FAMyi = 3118 - INTEGER(IntKi), PARAMETER :: M5N5FAMyi = 3119 - INTEGER(IntKi), PARAMETER :: M5N6FAMyi = 3120 - INTEGER(IntKi), PARAMETER :: M5N7FAMyi = 3121 - INTEGER(IntKi), PARAMETER :: M5N8FAMyi = 3122 - INTEGER(IntKi), PARAMETER :: M5N9FAMyi = 3123 - INTEGER(IntKi), PARAMETER :: M6N1FAMyi = 3124 - INTEGER(IntKi), PARAMETER :: M6N2FAMyi = 3125 - INTEGER(IntKi), PARAMETER :: M6N3FAMyi = 3126 - INTEGER(IntKi), PARAMETER :: M6N4FAMyi = 3127 - INTEGER(IntKi), PARAMETER :: M6N5FAMyi = 3128 - INTEGER(IntKi), PARAMETER :: M6N6FAMyi = 3129 - INTEGER(IntKi), PARAMETER :: M6N7FAMyi = 3130 - INTEGER(IntKi), PARAMETER :: M6N8FAMyi = 3131 - INTEGER(IntKi), PARAMETER :: M6N9FAMyi = 3132 - INTEGER(IntKi), PARAMETER :: M7N1FAMyi = 3133 - INTEGER(IntKi), PARAMETER :: M7N2FAMyi = 3134 - INTEGER(IntKi), PARAMETER :: M7N3FAMyi = 3135 - INTEGER(IntKi), PARAMETER :: M7N4FAMyi = 3136 - INTEGER(IntKi), PARAMETER :: M7N5FAMyi = 3137 - INTEGER(IntKi), PARAMETER :: M7N6FAMyi = 3138 - INTEGER(IntKi), PARAMETER :: M7N7FAMyi = 3139 - INTEGER(IntKi), PARAMETER :: M7N8FAMyi = 3140 - INTEGER(IntKi), PARAMETER :: M7N9FAMyi = 3141 - INTEGER(IntKi), PARAMETER :: M8N1FAMyi = 3142 - INTEGER(IntKi), PARAMETER :: M8N2FAMyi = 3143 - INTEGER(IntKi), PARAMETER :: M8N3FAMyi = 3144 - INTEGER(IntKi), PARAMETER :: M8N4FAMyi = 3145 - INTEGER(IntKi), PARAMETER :: M8N5FAMyi = 3146 - INTEGER(IntKi), PARAMETER :: M8N6FAMyi = 3147 - INTEGER(IntKi), PARAMETER :: M8N7FAMyi = 3148 - INTEGER(IntKi), PARAMETER :: M8N8FAMyi = 3149 - INTEGER(IntKi), PARAMETER :: M8N9FAMyi = 3150 - INTEGER(IntKi), PARAMETER :: M9N1FAMyi = 3151 - INTEGER(IntKi), PARAMETER :: M9N2FAMyi = 3152 - INTEGER(IntKi), PARAMETER :: M9N3FAMyi = 3153 - INTEGER(IntKi), PARAMETER :: M9N4FAMyi = 3154 - INTEGER(IntKi), PARAMETER :: M9N5FAMyi = 3155 - INTEGER(IntKi), PARAMETER :: M9N6FAMyi = 3156 - INTEGER(IntKi), PARAMETER :: M9N7FAMyi = 3157 - INTEGER(IntKi), PARAMETER :: M9N8FAMyi = 3158 - INTEGER(IntKi), PARAMETER :: M9N9FAMyi = 3159 - INTEGER(IntKi), PARAMETER :: M1N1FAMzi = 3160 - INTEGER(IntKi), PARAMETER :: M1N2FAMzi = 3161 - INTEGER(IntKi), PARAMETER :: M1N3FAMzi = 3162 - INTEGER(IntKi), PARAMETER :: M1N4FAMzi = 3163 - INTEGER(IntKi), PARAMETER :: M1N5FAMzi = 3164 - INTEGER(IntKi), PARAMETER :: M1N6FAMzi = 3165 - INTEGER(IntKi), PARAMETER :: M1N7FAMzi = 3166 - INTEGER(IntKi), PARAMETER :: M1N8FAMzi = 3167 - INTEGER(IntKi), PARAMETER :: M1N9FAMzi = 3168 - INTEGER(IntKi), PARAMETER :: M2N1FAMzi = 3169 - INTEGER(IntKi), PARAMETER :: M2N2FAMzi = 3170 - INTEGER(IntKi), PARAMETER :: M2N3FAMzi = 3171 - INTEGER(IntKi), PARAMETER :: M2N4FAMzi = 3172 - INTEGER(IntKi), PARAMETER :: M2N5FAMzi = 3173 - INTEGER(IntKi), PARAMETER :: M2N6FAMzi = 3174 - INTEGER(IntKi), PARAMETER :: M2N7FAMzi = 3175 - INTEGER(IntKi), PARAMETER :: M2N8FAMzi = 3176 - INTEGER(IntKi), PARAMETER :: M2N9FAMzi = 3177 - INTEGER(IntKi), PARAMETER :: M3N1FAMzi = 3178 - INTEGER(IntKi), PARAMETER :: M3N2FAMzi = 3179 - INTEGER(IntKi), PARAMETER :: M3N3FAMzi = 3180 - INTEGER(IntKi), PARAMETER :: M3N4FAMzi = 3181 - INTEGER(IntKi), PARAMETER :: M3N5FAMzi = 3182 - INTEGER(IntKi), PARAMETER :: M3N6FAMzi = 3183 - INTEGER(IntKi), PARAMETER :: M3N7FAMzi = 3184 - INTEGER(IntKi), PARAMETER :: M3N8FAMzi = 3185 - INTEGER(IntKi), PARAMETER :: M3N9FAMzi = 3186 - INTEGER(IntKi), PARAMETER :: M4N1FAMzi = 3187 - INTEGER(IntKi), PARAMETER :: M4N2FAMzi = 3188 - INTEGER(IntKi), PARAMETER :: M4N3FAMzi = 3189 - INTEGER(IntKi), PARAMETER :: M4N4FAMzi = 3190 - INTEGER(IntKi), PARAMETER :: M4N5FAMzi = 3191 - INTEGER(IntKi), PARAMETER :: M4N6FAMzi = 3192 - INTEGER(IntKi), PARAMETER :: M4N7FAMzi = 3193 - INTEGER(IntKi), PARAMETER :: M4N8FAMzi = 3194 - INTEGER(IntKi), PARAMETER :: M4N9FAMzi = 3195 - INTEGER(IntKi), PARAMETER :: M5N1FAMzi = 3196 - INTEGER(IntKi), PARAMETER :: M5N2FAMzi = 3197 - INTEGER(IntKi), PARAMETER :: M5N3FAMzi = 3198 - INTEGER(IntKi), PARAMETER :: M5N4FAMzi = 3199 - INTEGER(IntKi), PARAMETER :: M5N5FAMzi = 3200 - INTEGER(IntKi), PARAMETER :: M5N6FAMzi = 3201 - INTEGER(IntKi), PARAMETER :: M5N7FAMzi = 3202 - INTEGER(IntKi), PARAMETER :: M5N8FAMzi = 3203 - INTEGER(IntKi), PARAMETER :: M5N9FAMzi = 3204 - INTEGER(IntKi), PARAMETER :: M6N1FAMzi = 3205 - INTEGER(IntKi), PARAMETER :: M6N2FAMzi = 3206 - INTEGER(IntKi), PARAMETER :: M6N3FAMzi = 3207 - INTEGER(IntKi), PARAMETER :: M6N4FAMzi = 3208 - INTEGER(IntKi), PARAMETER :: M6N5FAMzi = 3209 - INTEGER(IntKi), PARAMETER :: M6N6FAMzi = 3210 - INTEGER(IntKi), PARAMETER :: M6N7FAMzi = 3211 - INTEGER(IntKi), PARAMETER :: M6N8FAMzi = 3212 - INTEGER(IntKi), PARAMETER :: M6N9FAMzi = 3213 - INTEGER(IntKi), PARAMETER :: M7N1FAMzi = 3214 - INTEGER(IntKi), PARAMETER :: M7N2FAMzi = 3215 - INTEGER(IntKi), PARAMETER :: M7N3FAMzi = 3216 - INTEGER(IntKi), PARAMETER :: M7N4FAMzi = 3217 - INTEGER(IntKi), PARAMETER :: M7N5FAMzi = 3218 - INTEGER(IntKi), PARAMETER :: M7N6FAMzi = 3219 - INTEGER(IntKi), PARAMETER :: M7N7FAMzi = 3220 - INTEGER(IntKi), PARAMETER :: M7N8FAMzi = 3221 - INTEGER(IntKi), PARAMETER :: M7N9FAMzi = 3222 - INTEGER(IntKi), PARAMETER :: M8N1FAMzi = 3223 - INTEGER(IntKi), PARAMETER :: M8N2FAMzi = 3224 - INTEGER(IntKi), PARAMETER :: M8N3FAMzi = 3225 - INTEGER(IntKi), PARAMETER :: M8N4FAMzi = 3226 - INTEGER(IntKi), PARAMETER :: M8N5FAMzi = 3227 - INTEGER(IntKi), PARAMETER :: M8N6FAMzi = 3228 - INTEGER(IntKi), PARAMETER :: M8N7FAMzi = 3229 - INTEGER(IntKi), PARAMETER :: M8N8FAMzi = 3230 - INTEGER(IntKi), PARAMETER :: M8N9FAMzi = 3231 - INTEGER(IntKi), PARAMETER :: M9N1FAMzi = 3232 - INTEGER(IntKi), PARAMETER :: M9N2FAMzi = 3233 - INTEGER(IntKi), PARAMETER :: M9N3FAMzi = 3234 - INTEGER(IntKi), PARAMETER :: M9N4FAMzi = 3235 - INTEGER(IntKi), PARAMETER :: M9N5FAMzi = 3236 - INTEGER(IntKi), PARAMETER :: M9N6FAMzi = 3237 - INTEGER(IntKi), PARAMETER :: M9N7FAMzi = 3238 - INTEGER(IntKi), PARAMETER :: M9N8FAMzi = 3239 - INTEGER(IntKi), PARAMETER :: M9N9FAMzi = 3240 - INTEGER(IntKi), PARAMETER :: M1N1FAGxi = 3241 - INTEGER(IntKi), PARAMETER :: M1N2FAGxi = 3242 - INTEGER(IntKi), PARAMETER :: M1N3FAGxi = 3243 - INTEGER(IntKi), PARAMETER :: M1N4FAGxi = 3244 - INTEGER(IntKi), PARAMETER :: M1N5FAGxi = 3245 - INTEGER(IntKi), PARAMETER :: M1N6FAGxi = 3246 - INTEGER(IntKi), PARAMETER :: M1N7FAGxi = 3247 - INTEGER(IntKi), PARAMETER :: M1N8FAGxi = 3248 - INTEGER(IntKi), PARAMETER :: M1N9FAGxi = 3249 - INTEGER(IntKi), PARAMETER :: M2N1FAGxi = 3250 - INTEGER(IntKi), PARAMETER :: M2N2FAGxi = 3251 - INTEGER(IntKi), PARAMETER :: M2N3FAGxi = 3252 - INTEGER(IntKi), PARAMETER :: M2N4FAGxi = 3253 - INTEGER(IntKi), PARAMETER :: M2N5FAGxi = 3254 - INTEGER(IntKi), PARAMETER :: M2N6FAGxi = 3255 - INTEGER(IntKi), PARAMETER :: M2N7FAGxi = 3256 - INTEGER(IntKi), PARAMETER :: M2N8FAGxi = 3257 - INTEGER(IntKi), PARAMETER :: M2N9FAGxi = 3258 - INTEGER(IntKi), PARAMETER :: M3N1FAGxi = 3259 - INTEGER(IntKi), PARAMETER :: M3N2FAGxi = 3260 - INTEGER(IntKi), PARAMETER :: M3N3FAGxi = 3261 - INTEGER(IntKi), PARAMETER :: M3N4FAGxi = 3262 - INTEGER(IntKi), PARAMETER :: M3N5FAGxi = 3263 - INTEGER(IntKi), PARAMETER :: M3N6FAGxi = 3264 - INTEGER(IntKi), PARAMETER :: M3N7FAGxi = 3265 - INTEGER(IntKi), PARAMETER :: M3N8FAGxi = 3266 - INTEGER(IntKi), PARAMETER :: M3N9FAGxi = 3267 - INTEGER(IntKi), PARAMETER :: M4N1FAGxi = 3268 - INTEGER(IntKi), PARAMETER :: M4N2FAGxi = 3269 - INTEGER(IntKi), PARAMETER :: M4N3FAGxi = 3270 - INTEGER(IntKi), PARAMETER :: M4N4FAGxi = 3271 - INTEGER(IntKi), PARAMETER :: M4N5FAGxi = 3272 - INTEGER(IntKi), PARAMETER :: M4N6FAGxi = 3273 - INTEGER(IntKi), PARAMETER :: M4N7FAGxi = 3274 - INTEGER(IntKi), PARAMETER :: M4N8FAGxi = 3275 - INTEGER(IntKi), PARAMETER :: M4N9FAGxi = 3276 - INTEGER(IntKi), PARAMETER :: M5N1FAGxi = 3277 - INTEGER(IntKi), PARAMETER :: M5N2FAGxi = 3278 - INTEGER(IntKi), PARAMETER :: M5N3FAGxi = 3279 - INTEGER(IntKi), PARAMETER :: M5N4FAGxi = 3280 - INTEGER(IntKi), PARAMETER :: M5N5FAGxi = 3281 - INTEGER(IntKi), PARAMETER :: M5N6FAGxi = 3282 - INTEGER(IntKi), PARAMETER :: M5N7FAGxi = 3283 - INTEGER(IntKi), PARAMETER :: M5N8FAGxi = 3284 - INTEGER(IntKi), PARAMETER :: M5N9FAGxi = 3285 - INTEGER(IntKi), PARAMETER :: M6N1FAGxi = 3286 - INTEGER(IntKi), PARAMETER :: M6N2FAGxi = 3287 - INTEGER(IntKi), PARAMETER :: M6N3FAGxi = 3288 - INTEGER(IntKi), PARAMETER :: M6N4FAGxi = 3289 - INTEGER(IntKi), PARAMETER :: M6N5FAGxi = 3290 - INTEGER(IntKi), PARAMETER :: M6N6FAGxi = 3291 - INTEGER(IntKi), PARAMETER :: M6N7FAGxi = 3292 - INTEGER(IntKi), PARAMETER :: M6N8FAGxi = 3293 - INTEGER(IntKi), PARAMETER :: M6N9FAGxi = 3294 - INTEGER(IntKi), PARAMETER :: M7N1FAGxi = 3295 - INTEGER(IntKi), PARAMETER :: M7N2FAGxi = 3296 - INTEGER(IntKi), PARAMETER :: M7N3FAGxi = 3297 - INTEGER(IntKi), PARAMETER :: M7N4FAGxi = 3298 - INTEGER(IntKi), PARAMETER :: M7N5FAGxi = 3299 - INTEGER(IntKi), PARAMETER :: M7N6FAGxi = 3300 - INTEGER(IntKi), PARAMETER :: M7N7FAGxi = 3301 - INTEGER(IntKi), PARAMETER :: M7N8FAGxi = 3302 - INTEGER(IntKi), PARAMETER :: M7N9FAGxi = 3303 - INTEGER(IntKi), PARAMETER :: M8N1FAGxi = 3304 - INTEGER(IntKi), PARAMETER :: M8N2FAGxi = 3305 - INTEGER(IntKi), PARAMETER :: M8N3FAGxi = 3306 - INTEGER(IntKi), PARAMETER :: M8N4FAGxi = 3307 - INTEGER(IntKi), PARAMETER :: M8N5FAGxi = 3308 - INTEGER(IntKi), PARAMETER :: M8N6FAGxi = 3309 - INTEGER(IntKi), PARAMETER :: M8N7FAGxi = 3310 - INTEGER(IntKi), PARAMETER :: M8N8FAGxi = 3311 - INTEGER(IntKi), PARAMETER :: M8N9FAGxi = 3312 - INTEGER(IntKi), PARAMETER :: M9N1FAGxi = 3313 - INTEGER(IntKi), PARAMETER :: M9N2FAGxi = 3314 - INTEGER(IntKi), PARAMETER :: M9N3FAGxi = 3315 - INTEGER(IntKi), PARAMETER :: M9N4FAGxi = 3316 - INTEGER(IntKi), PARAMETER :: M9N5FAGxi = 3317 - INTEGER(IntKi), PARAMETER :: M9N6FAGxi = 3318 - INTEGER(IntKi), PARAMETER :: M9N7FAGxi = 3319 - INTEGER(IntKi), PARAMETER :: M9N8FAGxi = 3320 - INTEGER(IntKi), PARAMETER :: M9N9FAGxi = 3321 - INTEGER(IntKi), PARAMETER :: M1N1FAGyi = 3322 - INTEGER(IntKi), PARAMETER :: M1N2FAGyi = 3323 - INTEGER(IntKi), PARAMETER :: M1N3FAGyi = 3324 - INTEGER(IntKi), PARAMETER :: M1N4FAGyi = 3325 - INTEGER(IntKi), PARAMETER :: M1N5FAGyi = 3326 - INTEGER(IntKi), PARAMETER :: M1N6FAGyi = 3327 - INTEGER(IntKi), PARAMETER :: M1N7FAGyi = 3328 - INTEGER(IntKi), PARAMETER :: M1N8FAGyi = 3329 - INTEGER(IntKi), PARAMETER :: M1N9FAGyi = 3330 - INTEGER(IntKi), PARAMETER :: M2N1FAGyi = 3331 - INTEGER(IntKi), PARAMETER :: M2N2FAGyi = 3332 - INTEGER(IntKi), PARAMETER :: M2N3FAGyi = 3333 - INTEGER(IntKi), PARAMETER :: M2N4FAGyi = 3334 - INTEGER(IntKi), PARAMETER :: M2N5FAGyi = 3335 - INTEGER(IntKi), PARAMETER :: M2N6FAGyi = 3336 - INTEGER(IntKi), PARAMETER :: M2N7FAGyi = 3337 - INTEGER(IntKi), PARAMETER :: M2N8FAGyi = 3338 - INTEGER(IntKi), PARAMETER :: M2N9FAGyi = 3339 - INTEGER(IntKi), PARAMETER :: M3N1FAGyi = 3340 - INTEGER(IntKi), PARAMETER :: M3N2FAGyi = 3341 - INTEGER(IntKi), PARAMETER :: M3N3FAGyi = 3342 - INTEGER(IntKi), PARAMETER :: M3N4FAGyi = 3343 - INTEGER(IntKi), PARAMETER :: M3N5FAGyi = 3344 - INTEGER(IntKi), PARAMETER :: M3N6FAGyi = 3345 - INTEGER(IntKi), PARAMETER :: M3N7FAGyi = 3346 - INTEGER(IntKi), PARAMETER :: M3N8FAGyi = 3347 - INTEGER(IntKi), PARAMETER :: M3N9FAGyi = 3348 - INTEGER(IntKi), PARAMETER :: M4N1FAGyi = 3349 - INTEGER(IntKi), PARAMETER :: M4N2FAGyi = 3350 - INTEGER(IntKi), PARAMETER :: M4N3FAGyi = 3351 - INTEGER(IntKi), PARAMETER :: M4N4FAGyi = 3352 - INTEGER(IntKi), PARAMETER :: M4N5FAGyi = 3353 - INTEGER(IntKi), PARAMETER :: M4N6FAGyi = 3354 - INTEGER(IntKi), PARAMETER :: M4N7FAGyi = 3355 - INTEGER(IntKi), PARAMETER :: M4N8FAGyi = 3356 - INTEGER(IntKi), PARAMETER :: M4N9FAGyi = 3357 - INTEGER(IntKi), PARAMETER :: M5N1FAGyi = 3358 - INTEGER(IntKi), PARAMETER :: M5N2FAGyi = 3359 - INTEGER(IntKi), PARAMETER :: M5N3FAGyi = 3360 - INTEGER(IntKi), PARAMETER :: M5N4FAGyi = 3361 - INTEGER(IntKi), PARAMETER :: M5N5FAGyi = 3362 - INTEGER(IntKi), PARAMETER :: M5N6FAGyi = 3363 - INTEGER(IntKi), PARAMETER :: M5N7FAGyi = 3364 - INTEGER(IntKi), PARAMETER :: M5N8FAGyi = 3365 - INTEGER(IntKi), PARAMETER :: M5N9FAGyi = 3366 - INTEGER(IntKi), PARAMETER :: M6N1FAGyi = 3367 - INTEGER(IntKi), PARAMETER :: M6N2FAGyi = 3368 - INTEGER(IntKi), PARAMETER :: M6N3FAGyi = 3369 - INTEGER(IntKi), PARAMETER :: M6N4FAGyi = 3370 - INTEGER(IntKi), PARAMETER :: M6N5FAGyi = 3371 - INTEGER(IntKi), PARAMETER :: M6N6FAGyi = 3372 - INTEGER(IntKi), PARAMETER :: M6N7FAGyi = 3373 - INTEGER(IntKi), PARAMETER :: M6N8FAGyi = 3374 - INTEGER(IntKi), PARAMETER :: M6N9FAGyi = 3375 - INTEGER(IntKi), PARAMETER :: M7N1FAGyi = 3376 - INTEGER(IntKi), PARAMETER :: M7N2FAGyi = 3377 - INTEGER(IntKi), PARAMETER :: M7N3FAGyi = 3378 - INTEGER(IntKi), PARAMETER :: M7N4FAGyi = 3379 - INTEGER(IntKi), PARAMETER :: M7N5FAGyi = 3380 - INTEGER(IntKi), PARAMETER :: M7N6FAGyi = 3381 - INTEGER(IntKi), PARAMETER :: M7N7FAGyi = 3382 - INTEGER(IntKi), PARAMETER :: M7N8FAGyi = 3383 - INTEGER(IntKi), PARAMETER :: M7N9FAGyi = 3384 - INTEGER(IntKi), PARAMETER :: M8N1FAGyi = 3385 - INTEGER(IntKi), PARAMETER :: M8N2FAGyi = 3386 - INTEGER(IntKi), PARAMETER :: M8N3FAGyi = 3387 - INTEGER(IntKi), PARAMETER :: M8N4FAGyi = 3388 - INTEGER(IntKi), PARAMETER :: M8N5FAGyi = 3389 - INTEGER(IntKi), PARAMETER :: M8N6FAGyi = 3390 - INTEGER(IntKi), PARAMETER :: M8N7FAGyi = 3391 - INTEGER(IntKi), PARAMETER :: M8N8FAGyi = 3392 - INTEGER(IntKi), PARAMETER :: M8N9FAGyi = 3393 - INTEGER(IntKi), PARAMETER :: M9N1FAGyi = 3394 - INTEGER(IntKi), PARAMETER :: M9N2FAGyi = 3395 - INTEGER(IntKi), PARAMETER :: M9N3FAGyi = 3396 - INTEGER(IntKi), PARAMETER :: M9N4FAGyi = 3397 - INTEGER(IntKi), PARAMETER :: M9N5FAGyi = 3398 - INTEGER(IntKi), PARAMETER :: M9N6FAGyi = 3399 - INTEGER(IntKi), PARAMETER :: M9N7FAGyi = 3400 - INTEGER(IntKi), PARAMETER :: M9N8FAGyi = 3401 - INTEGER(IntKi), PARAMETER :: M9N9FAGyi = 3402 - INTEGER(IntKi), PARAMETER :: M1N1FAGzi = 3403 - INTEGER(IntKi), PARAMETER :: M1N2FAGzi = 3404 - INTEGER(IntKi), PARAMETER :: M1N3FAGzi = 3405 - INTEGER(IntKi), PARAMETER :: M1N4FAGzi = 3406 - INTEGER(IntKi), PARAMETER :: M1N5FAGzi = 3407 - INTEGER(IntKi), PARAMETER :: M1N6FAGzi = 3408 - INTEGER(IntKi), PARAMETER :: M1N7FAGzi = 3409 - INTEGER(IntKi), PARAMETER :: M1N8FAGzi = 3410 - INTEGER(IntKi), PARAMETER :: M1N9FAGzi = 3411 - INTEGER(IntKi), PARAMETER :: M2N1FAGzi = 3412 - INTEGER(IntKi), PARAMETER :: M2N2FAGzi = 3413 - INTEGER(IntKi), PARAMETER :: M2N3FAGzi = 3414 - INTEGER(IntKi), PARAMETER :: M2N4FAGzi = 3415 - INTEGER(IntKi), PARAMETER :: M2N5FAGzi = 3416 - INTEGER(IntKi), PARAMETER :: M2N6FAGzi = 3417 - INTEGER(IntKi), PARAMETER :: M2N7FAGzi = 3418 - INTEGER(IntKi), PARAMETER :: M2N8FAGzi = 3419 - INTEGER(IntKi), PARAMETER :: M2N9FAGzi = 3420 - INTEGER(IntKi), PARAMETER :: M3N1FAGzi = 3421 - INTEGER(IntKi), PARAMETER :: M3N2FAGzi = 3422 - INTEGER(IntKi), PARAMETER :: M3N3FAGzi = 3423 - INTEGER(IntKi), PARAMETER :: M3N4FAGzi = 3424 - INTEGER(IntKi), PARAMETER :: M3N5FAGzi = 3425 - INTEGER(IntKi), PARAMETER :: M3N6FAGzi = 3426 - INTEGER(IntKi), PARAMETER :: M3N7FAGzi = 3427 - INTEGER(IntKi), PARAMETER :: M3N8FAGzi = 3428 - INTEGER(IntKi), PARAMETER :: M3N9FAGzi = 3429 - INTEGER(IntKi), PARAMETER :: M4N1FAGzi = 3430 - INTEGER(IntKi), PARAMETER :: M4N2FAGzi = 3431 - INTEGER(IntKi), PARAMETER :: M4N3FAGzi = 3432 - INTEGER(IntKi), PARAMETER :: M4N4FAGzi = 3433 - INTEGER(IntKi), PARAMETER :: M4N5FAGzi = 3434 - INTEGER(IntKi), PARAMETER :: M4N6FAGzi = 3435 - INTEGER(IntKi), PARAMETER :: M4N7FAGzi = 3436 - INTEGER(IntKi), PARAMETER :: M4N8FAGzi = 3437 - INTEGER(IntKi), PARAMETER :: M4N9FAGzi = 3438 - INTEGER(IntKi), PARAMETER :: M5N1FAGzi = 3439 - INTEGER(IntKi), PARAMETER :: M5N2FAGzi = 3440 - INTEGER(IntKi), PARAMETER :: M5N3FAGzi = 3441 - INTEGER(IntKi), PARAMETER :: M5N4FAGzi = 3442 - INTEGER(IntKi), PARAMETER :: M5N5FAGzi = 3443 - INTEGER(IntKi), PARAMETER :: M5N6FAGzi = 3444 - INTEGER(IntKi), PARAMETER :: M5N7FAGzi = 3445 - INTEGER(IntKi), PARAMETER :: M5N8FAGzi = 3446 - INTEGER(IntKi), PARAMETER :: M5N9FAGzi = 3447 - INTEGER(IntKi), PARAMETER :: M6N1FAGzi = 3448 - INTEGER(IntKi), PARAMETER :: M6N2FAGzi = 3449 - INTEGER(IntKi), PARAMETER :: M6N3FAGzi = 3450 - INTEGER(IntKi), PARAMETER :: M6N4FAGzi = 3451 - INTEGER(IntKi), PARAMETER :: M6N5FAGzi = 3452 - INTEGER(IntKi), PARAMETER :: M6N6FAGzi = 3453 - INTEGER(IntKi), PARAMETER :: M6N7FAGzi = 3454 - INTEGER(IntKi), PARAMETER :: M6N8FAGzi = 3455 - INTEGER(IntKi), PARAMETER :: M6N9FAGzi = 3456 - INTEGER(IntKi), PARAMETER :: M7N1FAGzi = 3457 - INTEGER(IntKi), PARAMETER :: M7N2FAGzi = 3458 - INTEGER(IntKi), PARAMETER :: M7N3FAGzi = 3459 - INTEGER(IntKi), PARAMETER :: M7N4FAGzi = 3460 - INTEGER(IntKi), PARAMETER :: M7N5FAGzi = 3461 - INTEGER(IntKi), PARAMETER :: M7N6FAGzi = 3462 - INTEGER(IntKi), PARAMETER :: M7N7FAGzi = 3463 - INTEGER(IntKi), PARAMETER :: M7N8FAGzi = 3464 - INTEGER(IntKi), PARAMETER :: M7N9FAGzi = 3465 - INTEGER(IntKi), PARAMETER :: M8N1FAGzi = 3466 - INTEGER(IntKi), PARAMETER :: M8N2FAGzi = 3467 - INTEGER(IntKi), PARAMETER :: M8N3FAGzi = 3468 - INTEGER(IntKi), PARAMETER :: M8N4FAGzi = 3469 - INTEGER(IntKi), PARAMETER :: M8N5FAGzi = 3470 - INTEGER(IntKi), PARAMETER :: M8N6FAGzi = 3471 - INTEGER(IntKi), PARAMETER :: M8N7FAGzi = 3472 - INTEGER(IntKi), PARAMETER :: M8N8FAGzi = 3473 - INTEGER(IntKi), PARAMETER :: M8N9FAGzi = 3474 - INTEGER(IntKi), PARAMETER :: M9N1FAGzi = 3475 - INTEGER(IntKi), PARAMETER :: M9N2FAGzi = 3476 - INTEGER(IntKi), PARAMETER :: M9N3FAGzi = 3477 - INTEGER(IntKi), PARAMETER :: M9N4FAGzi = 3478 - INTEGER(IntKi), PARAMETER :: M9N5FAGzi = 3479 - INTEGER(IntKi), PARAMETER :: M9N6FAGzi = 3480 - INTEGER(IntKi), PARAMETER :: M9N7FAGzi = 3481 - INTEGER(IntKi), PARAMETER :: M9N8FAGzi = 3482 - INTEGER(IntKi), PARAMETER :: M9N9FAGzi = 3483 - INTEGER(IntKi), PARAMETER :: M1N1MAGxi = 3484 - INTEGER(IntKi), PARAMETER :: M1N2MAGxi = 3485 - INTEGER(IntKi), PARAMETER :: M1N3MAGxi = 3486 - INTEGER(IntKi), PARAMETER :: M1N4MAGxi = 3487 - INTEGER(IntKi), PARAMETER :: M1N5MAGxi = 3488 - INTEGER(IntKi), PARAMETER :: M1N6MAGxi = 3489 - INTEGER(IntKi), PARAMETER :: M1N7MAGxi = 3490 - INTEGER(IntKi), PARAMETER :: M1N8MAGxi = 3491 - INTEGER(IntKi), PARAMETER :: M1N9MAGxi = 3492 - INTEGER(IntKi), PARAMETER :: M2N1MAGxi = 3493 - INTEGER(IntKi), PARAMETER :: M2N2MAGxi = 3494 - INTEGER(IntKi), PARAMETER :: M2N3MAGxi = 3495 - INTEGER(IntKi), PARAMETER :: M2N4MAGxi = 3496 - INTEGER(IntKi), PARAMETER :: M2N5MAGxi = 3497 - INTEGER(IntKi), PARAMETER :: M2N6MAGxi = 3498 - INTEGER(IntKi), PARAMETER :: M2N7MAGxi = 3499 - INTEGER(IntKi), PARAMETER :: M2N8MAGxi = 3500 - INTEGER(IntKi), PARAMETER :: M2N9MAGxi = 3501 - INTEGER(IntKi), PARAMETER :: M3N1MAGxi = 3502 - INTEGER(IntKi), PARAMETER :: M3N2MAGxi = 3503 - INTEGER(IntKi), PARAMETER :: M3N3MAGxi = 3504 - INTEGER(IntKi), PARAMETER :: M3N4MAGxi = 3505 - INTEGER(IntKi), PARAMETER :: M3N5MAGxi = 3506 - INTEGER(IntKi), PARAMETER :: M3N6MAGxi = 3507 - INTEGER(IntKi), PARAMETER :: M3N7MAGxi = 3508 - INTEGER(IntKi), PARAMETER :: M3N8MAGxi = 3509 - INTEGER(IntKi), PARAMETER :: M3N9MAGxi = 3510 - INTEGER(IntKi), PARAMETER :: M4N1MAGxi = 3511 - INTEGER(IntKi), PARAMETER :: M4N2MAGxi = 3512 - INTEGER(IntKi), PARAMETER :: M4N3MAGxi = 3513 - INTEGER(IntKi), PARAMETER :: M4N4MAGxi = 3514 - INTEGER(IntKi), PARAMETER :: M4N5MAGxi = 3515 - INTEGER(IntKi), PARAMETER :: M4N6MAGxi = 3516 - INTEGER(IntKi), PARAMETER :: M4N7MAGxi = 3517 - INTEGER(IntKi), PARAMETER :: M4N8MAGxi = 3518 - INTEGER(IntKi), PARAMETER :: M4N9MAGxi = 3519 - INTEGER(IntKi), PARAMETER :: M5N1MAGxi = 3520 - INTEGER(IntKi), PARAMETER :: M5N2MAGxi = 3521 - INTEGER(IntKi), PARAMETER :: M5N3MAGxi = 3522 - INTEGER(IntKi), PARAMETER :: M5N4MAGxi = 3523 - INTEGER(IntKi), PARAMETER :: M5N5MAGxi = 3524 - INTEGER(IntKi), PARAMETER :: M5N6MAGxi = 3525 - INTEGER(IntKi), PARAMETER :: M5N7MAGxi = 3526 - INTEGER(IntKi), PARAMETER :: M5N8MAGxi = 3527 - INTEGER(IntKi), PARAMETER :: M5N9MAGxi = 3528 - INTEGER(IntKi), PARAMETER :: M6N1MAGxi = 3529 - INTEGER(IntKi), PARAMETER :: M6N2MAGxi = 3530 - INTEGER(IntKi), PARAMETER :: M6N3MAGxi = 3531 - INTEGER(IntKi), PARAMETER :: M6N4MAGxi = 3532 - INTEGER(IntKi), PARAMETER :: M6N5MAGxi = 3533 - INTEGER(IntKi), PARAMETER :: M6N6MAGxi = 3534 - INTEGER(IntKi), PARAMETER :: M6N7MAGxi = 3535 - INTEGER(IntKi), PARAMETER :: M6N8MAGxi = 3536 - INTEGER(IntKi), PARAMETER :: M6N9MAGxi = 3537 - INTEGER(IntKi), PARAMETER :: M7N1MAGxi = 3538 - INTEGER(IntKi), PARAMETER :: M7N2MAGxi = 3539 - INTEGER(IntKi), PARAMETER :: M7N3MAGxi = 3540 - INTEGER(IntKi), PARAMETER :: M7N4MAGxi = 3541 - INTEGER(IntKi), PARAMETER :: M7N5MAGxi = 3542 - INTEGER(IntKi), PARAMETER :: M7N6MAGxi = 3543 - INTEGER(IntKi), PARAMETER :: M7N7MAGxi = 3544 - INTEGER(IntKi), PARAMETER :: M7N8MAGxi = 3545 - INTEGER(IntKi), PARAMETER :: M7N9MAGxi = 3546 - INTEGER(IntKi), PARAMETER :: M8N1MAGxi = 3547 - INTEGER(IntKi), PARAMETER :: M8N2MAGxi = 3548 - INTEGER(IntKi), PARAMETER :: M8N3MAGxi = 3549 - INTEGER(IntKi), PARAMETER :: M8N4MAGxi = 3550 - INTEGER(IntKi), PARAMETER :: M8N5MAGxi = 3551 - INTEGER(IntKi), PARAMETER :: M8N6MAGxi = 3552 - INTEGER(IntKi), PARAMETER :: M8N7MAGxi = 3553 - INTEGER(IntKi), PARAMETER :: M8N8MAGxi = 3554 - INTEGER(IntKi), PARAMETER :: M8N9MAGxi = 3555 - INTEGER(IntKi), PARAMETER :: M9N1MAGxi = 3556 - INTEGER(IntKi), PARAMETER :: M9N2MAGxi = 3557 - INTEGER(IntKi), PARAMETER :: M9N3MAGxi = 3558 - INTEGER(IntKi), PARAMETER :: M9N4MAGxi = 3559 - INTEGER(IntKi), PARAMETER :: M9N5MAGxi = 3560 - INTEGER(IntKi), PARAMETER :: M9N6MAGxi = 3561 - INTEGER(IntKi), PARAMETER :: M9N7MAGxi = 3562 - INTEGER(IntKi), PARAMETER :: M9N8MAGxi = 3563 - INTEGER(IntKi), PARAMETER :: M9N9MAGxi = 3564 - INTEGER(IntKi), PARAMETER :: M1N1MAGyi = 3565 - INTEGER(IntKi), PARAMETER :: M1N2MAGyi = 3566 - INTEGER(IntKi), PARAMETER :: M1N3MAGyi = 3567 - INTEGER(IntKi), PARAMETER :: M1N4MAGyi = 3568 - INTEGER(IntKi), PARAMETER :: M1N5MAGyi = 3569 - INTEGER(IntKi), PARAMETER :: M1N6MAGyi = 3570 - INTEGER(IntKi), PARAMETER :: M1N7MAGyi = 3571 - INTEGER(IntKi), PARAMETER :: M1N8MAGyi = 3572 - INTEGER(IntKi), PARAMETER :: M1N9MAGyi = 3573 - INTEGER(IntKi), PARAMETER :: M2N1MAGyi = 3574 - INTEGER(IntKi), PARAMETER :: M2N2MAGyi = 3575 - INTEGER(IntKi), PARAMETER :: M2N3MAGyi = 3576 - INTEGER(IntKi), PARAMETER :: M2N4MAGyi = 3577 - INTEGER(IntKi), PARAMETER :: M2N5MAGyi = 3578 - INTEGER(IntKi), PARAMETER :: M2N6MAGyi = 3579 - INTEGER(IntKi), PARAMETER :: M2N7MAGyi = 3580 - INTEGER(IntKi), PARAMETER :: M2N8MAGyi = 3581 - INTEGER(IntKi), PARAMETER :: M2N9MAGyi = 3582 - INTEGER(IntKi), PARAMETER :: M3N1MAGyi = 3583 - INTEGER(IntKi), PARAMETER :: M3N2MAGyi = 3584 - INTEGER(IntKi), PARAMETER :: M3N3MAGyi = 3585 - INTEGER(IntKi), PARAMETER :: M3N4MAGyi = 3586 - INTEGER(IntKi), PARAMETER :: M3N5MAGyi = 3587 - INTEGER(IntKi), PARAMETER :: M3N6MAGyi = 3588 - INTEGER(IntKi), PARAMETER :: M3N7MAGyi = 3589 - INTEGER(IntKi), PARAMETER :: M3N8MAGyi = 3590 - INTEGER(IntKi), PARAMETER :: M3N9MAGyi = 3591 - INTEGER(IntKi), PARAMETER :: M4N1MAGyi = 3592 - INTEGER(IntKi), PARAMETER :: M4N2MAGyi = 3593 - INTEGER(IntKi), PARAMETER :: M4N3MAGyi = 3594 - INTEGER(IntKi), PARAMETER :: M4N4MAGyi = 3595 - INTEGER(IntKi), PARAMETER :: M4N5MAGyi = 3596 - INTEGER(IntKi), PARAMETER :: M4N6MAGyi = 3597 - INTEGER(IntKi), PARAMETER :: M4N7MAGyi = 3598 - INTEGER(IntKi), PARAMETER :: M4N8MAGyi = 3599 - INTEGER(IntKi), PARAMETER :: M4N9MAGyi = 3600 - INTEGER(IntKi), PARAMETER :: M5N1MAGyi = 3601 - INTEGER(IntKi), PARAMETER :: M5N2MAGyi = 3602 - INTEGER(IntKi), PARAMETER :: M5N3MAGyi = 3603 - INTEGER(IntKi), PARAMETER :: M5N4MAGyi = 3604 - INTEGER(IntKi), PARAMETER :: M5N5MAGyi = 3605 - INTEGER(IntKi), PARAMETER :: M5N6MAGyi = 3606 - INTEGER(IntKi), PARAMETER :: M5N7MAGyi = 3607 - INTEGER(IntKi), PARAMETER :: M5N8MAGyi = 3608 - INTEGER(IntKi), PARAMETER :: M5N9MAGyi = 3609 - INTEGER(IntKi), PARAMETER :: M6N1MAGyi = 3610 - INTEGER(IntKi), PARAMETER :: M6N2MAGyi = 3611 - INTEGER(IntKi), PARAMETER :: M6N3MAGyi = 3612 - INTEGER(IntKi), PARAMETER :: M6N4MAGyi = 3613 - INTEGER(IntKi), PARAMETER :: M6N5MAGyi = 3614 - INTEGER(IntKi), PARAMETER :: M6N6MAGyi = 3615 - INTEGER(IntKi), PARAMETER :: M6N7MAGyi = 3616 - INTEGER(IntKi), PARAMETER :: M6N8MAGyi = 3617 - INTEGER(IntKi), PARAMETER :: M6N9MAGyi = 3618 - INTEGER(IntKi), PARAMETER :: M7N1MAGyi = 3619 - INTEGER(IntKi), PARAMETER :: M7N2MAGyi = 3620 - INTEGER(IntKi), PARAMETER :: M7N3MAGyi = 3621 - INTEGER(IntKi), PARAMETER :: M7N4MAGyi = 3622 - INTEGER(IntKi), PARAMETER :: M7N5MAGyi = 3623 - INTEGER(IntKi), PARAMETER :: M7N6MAGyi = 3624 - INTEGER(IntKi), PARAMETER :: M7N7MAGyi = 3625 - INTEGER(IntKi), PARAMETER :: M7N8MAGyi = 3626 - INTEGER(IntKi), PARAMETER :: M7N9MAGyi = 3627 - INTEGER(IntKi), PARAMETER :: M8N1MAGyi = 3628 - INTEGER(IntKi), PARAMETER :: M8N2MAGyi = 3629 - INTEGER(IntKi), PARAMETER :: M8N3MAGyi = 3630 - INTEGER(IntKi), PARAMETER :: M8N4MAGyi = 3631 - INTEGER(IntKi), PARAMETER :: M8N5MAGyi = 3632 - INTEGER(IntKi), PARAMETER :: M8N6MAGyi = 3633 - INTEGER(IntKi), PARAMETER :: M8N7MAGyi = 3634 - INTEGER(IntKi), PARAMETER :: M8N8MAGyi = 3635 - INTEGER(IntKi), PARAMETER :: M8N9MAGyi = 3636 - INTEGER(IntKi), PARAMETER :: M9N1MAGyi = 3637 - INTEGER(IntKi), PARAMETER :: M9N2MAGyi = 3638 - INTEGER(IntKi), PARAMETER :: M9N3MAGyi = 3639 - INTEGER(IntKi), PARAMETER :: M9N4MAGyi = 3640 - INTEGER(IntKi), PARAMETER :: M9N5MAGyi = 3641 - INTEGER(IntKi), PARAMETER :: M9N6MAGyi = 3642 - INTEGER(IntKi), PARAMETER :: M9N7MAGyi = 3643 - INTEGER(IntKi), PARAMETER :: M9N8MAGyi = 3644 - INTEGER(IntKi), PARAMETER :: M9N9MAGyi = 3645 - INTEGER(IntKi), PARAMETER :: M1N1MAGzi = 3646 - INTEGER(IntKi), PARAMETER :: M1N2MAGzi = 3647 - INTEGER(IntKi), PARAMETER :: M1N3MAGzi = 3648 - INTEGER(IntKi), PARAMETER :: M1N4MAGzi = 3649 - INTEGER(IntKi), PARAMETER :: M1N5MAGzi = 3650 - INTEGER(IntKi), PARAMETER :: M1N6MAGzi = 3651 - INTEGER(IntKi), PARAMETER :: M1N7MAGzi = 3652 - INTEGER(IntKi), PARAMETER :: M1N8MAGzi = 3653 - INTEGER(IntKi), PARAMETER :: M1N9MAGzi = 3654 - INTEGER(IntKi), PARAMETER :: M2N1MAGzi = 3655 - INTEGER(IntKi), PARAMETER :: M2N2MAGzi = 3656 - INTEGER(IntKi), PARAMETER :: M2N3MAGzi = 3657 - INTEGER(IntKi), PARAMETER :: M2N4MAGzi = 3658 - INTEGER(IntKi), PARAMETER :: M2N5MAGzi = 3659 - INTEGER(IntKi), PARAMETER :: M2N6MAGzi = 3660 - INTEGER(IntKi), PARAMETER :: M2N7MAGzi = 3661 - INTEGER(IntKi), PARAMETER :: M2N8MAGzi = 3662 - INTEGER(IntKi), PARAMETER :: M2N9MAGzi = 3663 - INTEGER(IntKi), PARAMETER :: M3N1MAGzi = 3664 - INTEGER(IntKi), PARAMETER :: M3N2MAGzi = 3665 - INTEGER(IntKi), PARAMETER :: M3N3MAGzi = 3666 - INTEGER(IntKi), PARAMETER :: M3N4MAGzi = 3667 - INTEGER(IntKi), PARAMETER :: M3N5MAGzi = 3668 - INTEGER(IntKi), PARAMETER :: M3N6MAGzi = 3669 - INTEGER(IntKi), PARAMETER :: M3N7MAGzi = 3670 - INTEGER(IntKi), PARAMETER :: M3N8MAGzi = 3671 - INTEGER(IntKi), PARAMETER :: M3N9MAGzi = 3672 - INTEGER(IntKi), PARAMETER :: M4N1MAGzi = 3673 - INTEGER(IntKi), PARAMETER :: M4N2MAGzi = 3674 - INTEGER(IntKi), PARAMETER :: M4N3MAGzi = 3675 - INTEGER(IntKi), PARAMETER :: M4N4MAGzi = 3676 - INTEGER(IntKi), PARAMETER :: M4N5MAGzi = 3677 - INTEGER(IntKi), PARAMETER :: M4N6MAGzi = 3678 - INTEGER(IntKi), PARAMETER :: M4N7MAGzi = 3679 - INTEGER(IntKi), PARAMETER :: M4N8MAGzi = 3680 - INTEGER(IntKi), PARAMETER :: M4N9MAGzi = 3681 - INTEGER(IntKi), PARAMETER :: M5N1MAGzi = 3682 - INTEGER(IntKi), PARAMETER :: M5N2MAGzi = 3683 - INTEGER(IntKi), PARAMETER :: M5N3MAGzi = 3684 - INTEGER(IntKi), PARAMETER :: M5N4MAGzi = 3685 - INTEGER(IntKi), PARAMETER :: M5N5MAGzi = 3686 - INTEGER(IntKi), PARAMETER :: M5N6MAGzi = 3687 - INTEGER(IntKi), PARAMETER :: M5N7MAGzi = 3688 - INTEGER(IntKi), PARAMETER :: M5N8MAGzi = 3689 - INTEGER(IntKi), PARAMETER :: M5N9MAGzi = 3690 - INTEGER(IntKi), PARAMETER :: M6N1MAGzi = 3691 - INTEGER(IntKi), PARAMETER :: M6N2MAGzi = 3692 - INTEGER(IntKi), PARAMETER :: M6N3MAGzi = 3693 - INTEGER(IntKi), PARAMETER :: M6N4MAGzi = 3694 - INTEGER(IntKi), PARAMETER :: M6N5MAGzi = 3695 - INTEGER(IntKi), PARAMETER :: M6N6MAGzi = 3696 - INTEGER(IntKi), PARAMETER :: M6N7MAGzi = 3697 - INTEGER(IntKi), PARAMETER :: M6N8MAGzi = 3698 - INTEGER(IntKi), PARAMETER :: M6N9MAGzi = 3699 - INTEGER(IntKi), PARAMETER :: M7N1MAGzi = 3700 - INTEGER(IntKi), PARAMETER :: M7N2MAGzi = 3701 - INTEGER(IntKi), PARAMETER :: M7N3MAGzi = 3702 - INTEGER(IntKi), PARAMETER :: M7N4MAGzi = 3703 - INTEGER(IntKi), PARAMETER :: M7N5MAGzi = 3704 - INTEGER(IntKi), PARAMETER :: M7N6MAGzi = 3705 - INTEGER(IntKi), PARAMETER :: M7N7MAGzi = 3706 - INTEGER(IntKi), PARAMETER :: M7N8MAGzi = 3707 - INTEGER(IntKi), PARAMETER :: M7N9MAGzi = 3708 - INTEGER(IntKi), PARAMETER :: M8N1MAGzi = 3709 - INTEGER(IntKi), PARAMETER :: M8N2MAGzi = 3710 - INTEGER(IntKi), PARAMETER :: M8N3MAGzi = 3711 - INTEGER(IntKi), PARAMETER :: M8N4MAGzi = 3712 - INTEGER(IntKi), PARAMETER :: M8N5MAGzi = 3713 - INTEGER(IntKi), PARAMETER :: M8N6MAGzi = 3714 - INTEGER(IntKi), PARAMETER :: M8N7MAGzi = 3715 - INTEGER(IntKi), PARAMETER :: M8N8MAGzi = 3716 - INTEGER(IntKi), PARAMETER :: M8N9MAGzi = 3717 - INTEGER(IntKi), PARAMETER :: M9N1MAGzi = 3718 - INTEGER(IntKi), PARAMETER :: M9N2MAGzi = 3719 - INTEGER(IntKi), PARAMETER :: M9N3MAGzi = 3720 - INTEGER(IntKi), PARAMETER :: M9N4MAGzi = 3721 - INTEGER(IntKi), PARAMETER :: M9N5MAGzi = 3722 - INTEGER(IntKi), PARAMETER :: M9N6MAGzi = 3723 - INTEGER(IntKi), PARAMETER :: M9N7MAGzi = 3724 - INTEGER(IntKi), PARAMETER :: M9N8MAGzi = 3725 - INTEGER(IntKi), PARAMETER :: M9N9MAGzi = 3726 - INTEGER(IntKi), PARAMETER :: M1N1FAFxi = 3727 - INTEGER(IntKi), PARAMETER :: M1N2FAFxi = 3728 - INTEGER(IntKi), PARAMETER :: M1N3FAFxi = 3729 - INTEGER(IntKi), PARAMETER :: M1N4FAFxi = 3730 - INTEGER(IntKi), PARAMETER :: M1N5FAFxi = 3731 - INTEGER(IntKi), PARAMETER :: M1N6FAFxi = 3732 - INTEGER(IntKi), PARAMETER :: M1N7FAFxi = 3733 - INTEGER(IntKi), PARAMETER :: M1N8FAFxi = 3734 - INTEGER(IntKi), PARAMETER :: M1N9FAFxi = 3735 - INTEGER(IntKi), PARAMETER :: M2N1FAFxi = 3736 - INTEGER(IntKi), PARAMETER :: M2N2FAFxi = 3737 - INTEGER(IntKi), PARAMETER :: M2N3FAFxi = 3738 - INTEGER(IntKi), PARAMETER :: M2N4FAFxi = 3739 - INTEGER(IntKi), PARAMETER :: M2N5FAFxi = 3740 - INTEGER(IntKi), PARAMETER :: M2N6FAFxi = 3741 - INTEGER(IntKi), PARAMETER :: M2N7FAFxi = 3742 - INTEGER(IntKi), PARAMETER :: M2N8FAFxi = 3743 - INTEGER(IntKi), PARAMETER :: M2N9FAFxi = 3744 - INTEGER(IntKi), PARAMETER :: M3N1FAFxi = 3745 - INTEGER(IntKi), PARAMETER :: M3N2FAFxi = 3746 - INTEGER(IntKi), PARAMETER :: M3N3FAFxi = 3747 - INTEGER(IntKi), PARAMETER :: M3N4FAFxi = 3748 - INTEGER(IntKi), PARAMETER :: M3N5FAFxi = 3749 - INTEGER(IntKi), PARAMETER :: M3N6FAFxi = 3750 - INTEGER(IntKi), PARAMETER :: M3N7FAFxi = 3751 - INTEGER(IntKi), PARAMETER :: M3N8FAFxi = 3752 - INTEGER(IntKi), PARAMETER :: M3N9FAFxi = 3753 - INTEGER(IntKi), PARAMETER :: M4N1FAFxi = 3754 - INTEGER(IntKi), PARAMETER :: M4N2FAFxi = 3755 - INTEGER(IntKi), PARAMETER :: M4N3FAFxi = 3756 - INTEGER(IntKi), PARAMETER :: M4N4FAFxi = 3757 - INTEGER(IntKi), PARAMETER :: M4N5FAFxi = 3758 - INTEGER(IntKi), PARAMETER :: M4N6FAFxi = 3759 - INTEGER(IntKi), PARAMETER :: M4N7FAFxi = 3760 - INTEGER(IntKi), PARAMETER :: M4N8FAFxi = 3761 - INTEGER(IntKi), PARAMETER :: M4N9FAFxi = 3762 - INTEGER(IntKi), PARAMETER :: M5N1FAFxi = 3763 - INTEGER(IntKi), PARAMETER :: M5N2FAFxi = 3764 - INTEGER(IntKi), PARAMETER :: M5N3FAFxi = 3765 - INTEGER(IntKi), PARAMETER :: M5N4FAFxi = 3766 - INTEGER(IntKi), PARAMETER :: M5N5FAFxi = 3767 - INTEGER(IntKi), PARAMETER :: M5N6FAFxi = 3768 - INTEGER(IntKi), PARAMETER :: M5N7FAFxi = 3769 - INTEGER(IntKi), PARAMETER :: M5N8FAFxi = 3770 - INTEGER(IntKi), PARAMETER :: M5N9FAFxi = 3771 - INTEGER(IntKi), PARAMETER :: M6N1FAFxi = 3772 - INTEGER(IntKi), PARAMETER :: M6N2FAFxi = 3773 - INTEGER(IntKi), PARAMETER :: M6N3FAFxi = 3774 - INTEGER(IntKi), PARAMETER :: M6N4FAFxi = 3775 - INTEGER(IntKi), PARAMETER :: M6N5FAFxi = 3776 - INTEGER(IntKi), PARAMETER :: M6N6FAFxi = 3777 - INTEGER(IntKi), PARAMETER :: M6N7FAFxi = 3778 - INTEGER(IntKi), PARAMETER :: M6N8FAFxi = 3779 - INTEGER(IntKi), PARAMETER :: M6N9FAFxi = 3780 - INTEGER(IntKi), PARAMETER :: M7N1FAFxi = 3781 - INTEGER(IntKi), PARAMETER :: M7N2FAFxi = 3782 - INTEGER(IntKi), PARAMETER :: M7N3FAFxi = 3783 - INTEGER(IntKi), PARAMETER :: M7N4FAFxi = 3784 - INTEGER(IntKi), PARAMETER :: M7N5FAFxi = 3785 - INTEGER(IntKi), PARAMETER :: M7N6FAFxi = 3786 - INTEGER(IntKi), PARAMETER :: M7N7FAFxi = 3787 - INTEGER(IntKi), PARAMETER :: M7N8FAFxi = 3788 - INTEGER(IntKi), PARAMETER :: M7N9FAFxi = 3789 - INTEGER(IntKi), PARAMETER :: M8N1FAFxi = 3790 - INTEGER(IntKi), PARAMETER :: M8N2FAFxi = 3791 - INTEGER(IntKi), PARAMETER :: M8N3FAFxi = 3792 - INTEGER(IntKi), PARAMETER :: M8N4FAFxi = 3793 - INTEGER(IntKi), PARAMETER :: M8N5FAFxi = 3794 - INTEGER(IntKi), PARAMETER :: M8N6FAFxi = 3795 - INTEGER(IntKi), PARAMETER :: M8N7FAFxi = 3796 - INTEGER(IntKi), PARAMETER :: M8N8FAFxi = 3797 - INTEGER(IntKi), PARAMETER :: M8N9FAFxi = 3798 - INTEGER(IntKi), PARAMETER :: M9N1FAFxi = 3799 - INTEGER(IntKi), PARAMETER :: M9N2FAFxi = 3800 - INTEGER(IntKi), PARAMETER :: M9N3FAFxi = 3801 - INTEGER(IntKi), PARAMETER :: M9N4FAFxi = 3802 - INTEGER(IntKi), PARAMETER :: M9N5FAFxi = 3803 - INTEGER(IntKi), PARAMETER :: M9N6FAFxi = 3804 - INTEGER(IntKi), PARAMETER :: M9N7FAFxi = 3805 - INTEGER(IntKi), PARAMETER :: M9N8FAFxi = 3806 - INTEGER(IntKi), PARAMETER :: M9N9FAFxi = 3807 - INTEGER(IntKi), PARAMETER :: M1N1FAFyi = 3808 - INTEGER(IntKi), PARAMETER :: M1N2FAFyi = 3809 - INTEGER(IntKi), PARAMETER :: M1N3FAFyi = 3810 - INTEGER(IntKi), PARAMETER :: M1N4FAFyi = 3811 - INTEGER(IntKi), PARAMETER :: M1N5FAFyi = 3812 - INTEGER(IntKi), PARAMETER :: M1N6FAFyi = 3813 - INTEGER(IntKi), PARAMETER :: M1N7FAFyi = 3814 - INTEGER(IntKi), PARAMETER :: M1N8FAFyi = 3815 - INTEGER(IntKi), PARAMETER :: M1N9FAFyi = 3816 - INTEGER(IntKi), PARAMETER :: M2N1FAFyi = 3817 - INTEGER(IntKi), PARAMETER :: M2N2FAFyi = 3818 - INTEGER(IntKi), PARAMETER :: M2N3FAFyi = 3819 - INTEGER(IntKi), PARAMETER :: M2N4FAFyi = 3820 - INTEGER(IntKi), PARAMETER :: M2N5FAFyi = 3821 - INTEGER(IntKi), PARAMETER :: M2N6FAFyi = 3822 - INTEGER(IntKi), PARAMETER :: M2N7FAFyi = 3823 - INTEGER(IntKi), PARAMETER :: M2N8FAFyi = 3824 - INTEGER(IntKi), PARAMETER :: M2N9FAFyi = 3825 - INTEGER(IntKi), PARAMETER :: M3N1FAFyi = 3826 - INTEGER(IntKi), PARAMETER :: M3N2FAFyi = 3827 - INTEGER(IntKi), PARAMETER :: M3N3FAFyi = 3828 - INTEGER(IntKi), PARAMETER :: M3N4FAFyi = 3829 - INTEGER(IntKi), PARAMETER :: M3N5FAFyi = 3830 - INTEGER(IntKi), PARAMETER :: M3N6FAFyi = 3831 - INTEGER(IntKi), PARAMETER :: M3N7FAFyi = 3832 - INTEGER(IntKi), PARAMETER :: M3N8FAFyi = 3833 - INTEGER(IntKi), PARAMETER :: M3N9FAFyi = 3834 - INTEGER(IntKi), PARAMETER :: M4N1FAFyi = 3835 - INTEGER(IntKi), PARAMETER :: M4N2FAFyi = 3836 - INTEGER(IntKi), PARAMETER :: M4N3FAFyi = 3837 - INTEGER(IntKi), PARAMETER :: M4N4FAFyi = 3838 - INTEGER(IntKi), PARAMETER :: M4N5FAFyi = 3839 - INTEGER(IntKi), PARAMETER :: M4N6FAFyi = 3840 - INTEGER(IntKi), PARAMETER :: M4N7FAFyi = 3841 - INTEGER(IntKi), PARAMETER :: M4N8FAFyi = 3842 - INTEGER(IntKi), PARAMETER :: M4N9FAFyi = 3843 - INTEGER(IntKi), PARAMETER :: M5N1FAFyi = 3844 - INTEGER(IntKi), PARAMETER :: M5N2FAFyi = 3845 - INTEGER(IntKi), PARAMETER :: M5N3FAFyi = 3846 - INTEGER(IntKi), PARAMETER :: M5N4FAFyi = 3847 - INTEGER(IntKi), PARAMETER :: M5N5FAFyi = 3848 - INTEGER(IntKi), PARAMETER :: M5N6FAFyi = 3849 - INTEGER(IntKi), PARAMETER :: M5N7FAFyi = 3850 - INTEGER(IntKi), PARAMETER :: M5N8FAFyi = 3851 - INTEGER(IntKi), PARAMETER :: M5N9FAFyi = 3852 - INTEGER(IntKi), PARAMETER :: M6N1FAFyi = 3853 - INTEGER(IntKi), PARAMETER :: M6N2FAFyi = 3854 - INTEGER(IntKi), PARAMETER :: M6N3FAFyi = 3855 - INTEGER(IntKi), PARAMETER :: M6N4FAFyi = 3856 - INTEGER(IntKi), PARAMETER :: M6N5FAFyi = 3857 - INTEGER(IntKi), PARAMETER :: M6N6FAFyi = 3858 - INTEGER(IntKi), PARAMETER :: M6N7FAFyi = 3859 - INTEGER(IntKi), PARAMETER :: M6N8FAFyi = 3860 - INTEGER(IntKi), PARAMETER :: M6N9FAFyi = 3861 - INTEGER(IntKi), PARAMETER :: M7N1FAFyi = 3862 - INTEGER(IntKi), PARAMETER :: M7N2FAFyi = 3863 - INTEGER(IntKi), PARAMETER :: M7N3FAFyi = 3864 - INTEGER(IntKi), PARAMETER :: M7N4FAFyi = 3865 - INTEGER(IntKi), PARAMETER :: M7N5FAFyi = 3866 - INTEGER(IntKi), PARAMETER :: M7N6FAFyi = 3867 - INTEGER(IntKi), PARAMETER :: M7N7FAFyi = 3868 - INTEGER(IntKi), PARAMETER :: M7N8FAFyi = 3869 - INTEGER(IntKi), PARAMETER :: M7N9FAFyi = 3870 - INTEGER(IntKi), PARAMETER :: M8N1FAFyi = 3871 - INTEGER(IntKi), PARAMETER :: M8N2FAFyi = 3872 - INTEGER(IntKi), PARAMETER :: M8N3FAFyi = 3873 - INTEGER(IntKi), PARAMETER :: M8N4FAFyi = 3874 - INTEGER(IntKi), PARAMETER :: M8N5FAFyi = 3875 - INTEGER(IntKi), PARAMETER :: M8N6FAFyi = 3876 - INTEGER(IntKi), PARAMETER :: M8N7FAFyi = 3877 - INTEGER(IntKi), PARAMETER :: M8N8FAFyi = 3878 - INTEGER(IntKi), PARAMETER :: M8N9FAFyi = 3879 - INTEGER(IntKi), PARAMETER :: M9N1FAFyi = 3880 - INTEGER(IntKi), PARAMETER :: M9N2FAFyi = 3881 - INTEGER(IntKi), PARAMETER :: M9N3FAFyi = 3882 - INTEGER(IntKi), PARAMETER :: M9N4FAFyi = 3883 - INTEGER(IntKi), PARAMETER :: M9N5FAFyi = 3884 - INTEGER(IntKi), PARAMETER :: M9N6FAFyi = 3885 - INTEGER(IntKi), PARAMETER :: M9N7FAFyi = 3886 - INTEGER(IntKi), PARAMETER :: M9N8FAFyi = 3887 - INTEGER(IntKi), PARAMETER :: M9N9FAFyi = 3888 - INTEGER(IntKi), PARAMETER :: M1N1FAFzi = 3889 - INTEGER(IntKi), PARAMETER :: M1N2FAFzi = 3890 - INTEGER(IntKi), PARAMETER :: M1N3FAFzi = 3891 - INTEGER(IntKi), PARAMETER :: M1N4FAFzi = 3892 - INTEGER(IntKi), PARAMETER :: M1N5FAFzi = 3893 - INTEGER(IntKi), PARAMETER :: M1N6FAFzi = 3894 - INTEGER(IntKi), PARAMETER :: M1N7FAFzi = 3895 - INTEGER(IntKi), PARAMETER :: M1N8FAFzi = 3896 - INTEGER(IntKi), PARAMETER :: M1N9FAFzi = 3897 - INTEGER(IntKi), PARAMETER :: M2N1FAFzi = 3898 - INTEGER(IntKi), PARAMETER :: M2N2FAFzi = 3899 - INTEGER(IntKi), PARAMETER :: M2N3FAFzi = 3900 - INTEGER(IntKi), PARAMETER :: M2N4FAFzi = 3901 - INTEGER(IntKi), PARAMETER :: M2N5FAFzi = 3902 - INTEGER(IntKi), PARAMETER :: M2N6FAFzi = 3903 - INTEGER(IntKi), PARAMETER :: M2N7FAFzi = 3904 - INTEGER(IntKi), PARAMETER :: M2N8FAFzi = 3905 - INTEGER(IntKi), PARAMETER :: M2N9FAFzi = 3906 - INTEGER(IntKi), PARAMETER :: M3N1FAFzi = 3907 - INTEGER(IntKi), PARAMETER :: M3N2FAFzi = 3908 - INTEGER(IntKi), PARAMETER :: M3N3FAFzi = 3909 - INTEGER(IntKi), PARAMETER :: M3N4FAFzi = 3910 - INTEGER(IntKi), PARAMETER :: M3N5FAFzi = 3911 - INTEGER(IntKi), PARAMETER :: M3N6FAFzi = 3912 - INTEGER(IntKi), PARAMETER :: M3N7FAFzi = 3913 - INTEGER(IntKi), PARAMETER :: M3N8FAFzi = 3914 - INTEGER(IntKi), PARAMETER :: M3N9FAFzi = 3915 - INTEGER(IntKi), PARAMETER :: M4N1FAFzi = 3916 - INTEGER(IntKi), PARAMETER :: M4N2FAFzi = 3917 - INTEGER(IntKi), PARAMETER :: M4N3FAFzi = 3918 - INTEGER(IntKi), PARAMETER :: M4N4FAFzi = 3919 - INTEGER(IntKi), PARAMETER :: M4N5FAFzi = 3920 - INTEGER(IntKi), PARAMETER :: M4N6FAFzi = 3921 - INTEGER(IntKi), PARAMETER :: M4N7FAFzi = 3922 - INTEGER(IntKi), PARAMETER :: M4N8FAFzi = 3923 - INTEGER(IntKi), PARAMETER :: M4N9FAFzi = 3924 - INTEGER(IntKi), PARAMETER :: M5N1FAFzi = 3925 - INTEGER(IntKi), PARAMETER :: M5N2FAFzi = 3926 - INTEGER(IntKi), PARAMETER :: M5N3FAFzi = 3927 - INTEGER(IntKi), PARAMETER :: M5N4FAFzi = 3928 - INTEGER(IntKi), PARAMETER :: M5N5FAFzi = 3929 - INTEGER(IntKi), PARAMETER :: M5N6FAFzi = 3930 - INTEGER(IntKi), PARAMETER :: M5N7FAFzi = 3931 - INTEGER(IntKi), PARAMETER :: M5N8FAFzi = 3932 - INTEGER(IntKi), PARAMETER :: M5N9FAFzi = 3933 - INTEGER(IntKi), PARAMETER :: M6N1FAFzi = 3934 - INTEGER(IntKi), PARAMETER :: M6N2FAFzi = 3935 - INTEGER(IntKi), PARAMETER :: M6N3FAFzi = 3936 - INTEGER(IntKi), PARAMETER :: M6N4FAFzi = 3937 - INTEGER(IntKi), PARAMETER :: M6N5FAFzi = 3938 - INTEGER(IntKi), PARAMETER :: M6N6FAFzi = 3939 - INTEGER(IntKi), PARAMETER :: M6N7FAFzi = 3940 - INTEGER(IntKi), PARAMETER :: M6N8FAFzi = 3941 - INTEGER(IntKi), PARAMETER :: M6N9FAFzi = 3942 - INTEGER(IntKi), PARAMETER :: M7N1FAFzi = 3943 - INTEGER(IntKi), PARAMETER :: M7N2FAFzi = 3944 - INTEGER(IntKi), PARAMETER :: M7N3FAFzi = 3945 - INTEGER(IntKi), PARAMETER :: M7N4FAFzi = 3946 - INTEGER(IntKi), PARAMETER :: M7N5FAFzi = 3947 - INTEGER(IntKi), PARAMETER :: M7N6FAFzi = 3948 - INTEGER(IntKi), PARAMETER :: M7N7FAFzi = 3949 - INTEGER(IntKi), PARAMETER :: M7N8FAFzi = 3950 - INTEGER(IntKi), PARAMETER :: M7N9FAFzi = 3951 - INTEGER(IntKi), PARAMETER :: M8N1FAFzi = 3952 - INTEGER(IntKi), PARAMETER :: M8N2FAFzi = 3953 - INTEGER(IntKi), PARAMETER :: M8N3FAFzi = 3954 - INTEGER(IntKi), PARAMETER :: M8N4FAFzi = 3955 - INTEGER(IntKi), PARAMETER :: M8N5FAFzi = 3956 - INTEGER(IntKi), PARAMETER :: M8N6FAFzi = 3957 - INTEGER(IntKi), PARAMETER :: M8N7FAFzi = 3958 - INTEGER(IntKi), PARAMETER :: M8N8FAFzi = 3959 - INTEGER(IntKi), PARAMETER :: M8N9FAFzi = 3960 - INTEGER(IntKi), PARAMETER :: M9N1FAFzi = 3961 - INTEGER(IntKi), PARAMETER :: M9N2FAFzi = 3962 - INTEGER(IntKi), PARAMETER :: M9N3FAFzi = 3963 - INTEGER(IntKi), PARAMETER :: M9N4FAFzi = 3964 - INTEGER(IntKi), PARAMETER :: M9N5FAFzi = 3965 - INTEGER(IntKi), PARAMETER :: M9N6FAFzi = 3966 - INTEGER(IntKi), PARAMETER :: M9N7FAFzi = 3967 - INTEGER(IntKi), PARAMETER :: M9N8FAFzi = 3968 - INTEGER(IntKi), PARAMETER :: M9N9FAFzi = 3969 - INTEGER(IntKi), PARAMETER :: M1N1MAFxi = 3970 - INTEGER(IntKi), PARAMETER :: M1N2MAFxi = 3971 - INTEGER(IntKi), PARAMETER :: M1N3MAFxi = 3972 - INTEGER(IntKi), PARAMETER :: M1N4MAFxi = 3973 - INTEGER(IntKi), PARAMETER :: M1N5MAFxi = 3974 - INTEGER(IntKi), PARAMETER :: M1N6MAFxi = 3975 - INTEGER(IntKi), PARAMETER :: M1N7MAFxi = 3976 - INTEGER(IntKi), PARAMETER :: M1N8MAFxi = 3977 - INTEGER(IntKi), PARAMETER :: M1N9MAFxi = 3978 - INTEGER(IntKi), PARAMETER :: M2N1MAFxi = 3979 - INTEGER(IntKi), PARAMETER :: M2N2MAFxi = 3980 - INTEGER(IntKi), PARAMETER :: M2N3MAFxi = 3981 - INTEGER(IntKi), PARAMETER :: M2N4MAFxi = 3982 - INTEGER(IntKi), PARAMETER :: M2N5MAFxi = 3983 - INTEGER(IntKi), PARAMETER :: M2N6MAFxi = 3984 - INTEGER(IntKi), PARAMETER :: M2N7MAFxi = 3985 - INTEGER(IntKi), PARAMETER :: M2N8MAFxi = 3986 - INTEGER(IntKi), PARAMETER :: M2N9MAFxi = 3987 - INTEGER(IntKi), PARAMETER :: M3N1MAFxi = 3988 - INTEGER(IntKi), PARAMETER :: M3N2MAFxi = 3989 - INTEGER(IntKi), PARAMETER :: M3N3MAFxi = 3990 - INTEGER(IntKi), PARAMETER :: M3N4MAFxi = 3991 - INTEGER(IntKi), PARAMETER :: M3N5MAFxi = 3992 - INTEGER(IntKi), PARAMETER :: M3N6MAFxi = 3993 - INTEGER(IntKi), PARAMETER :: M3N7MAFxi = 3994 - INTEGER(IntKi), PARAMETER :: M3N8MAFxi = 3995 - INTEGER(IntKi), PARAMETER :: M3N9MAFxi = 3996 - INTEGER(IntKi), PARAMETER :: M4N1MAFxi = 3997 - INTEGER(IntKi), PARAMETER :: M4N2MAFxi = 3998 - INTEGER(IntKi), PARAMETER :: M4N3MAFxi = 3999 - INTEGER(IntKi), PARAMETER :: M4N4MAFxi = 4000 - INTEGER(IntKi), PARAMETER :: M4N5MAFxi = 4001 - INTEGER(IntKi), PARAMETER :: M4N6MAFxi = 4002 - INTEGER(IntKi), PARAMETER :: M4N7MAFxi = 4003 - INTEGER(IntKi), PARAMETER :: M4N8MAFxi = 4004 - INTEGER(IntKi), PARAMETER :: M4N9MAFxi = 4005 - INTEGER(IntKi), PARAMETER :: M5N1MAFxi = 4006 - INTEGER(IntKi), PARAMETER :: M5N2MAFxi = 4007 - INTEGER(IntKi), PARAMETER :: M5N3MAFxi = 4008 - INTEGER(IntKi), PARAMETER :: M5N4MAFxi = 4009 - INTEGER(IntKi), PARAMETER :: M5N5MAFxi = 4010 - INTEGER(IntKi), PARAMETER :: M5N6MAFxi = 4011 - INTEGER(IntKi), PARAMETER :: M5N7MAFxi = 4012 - INTEGER(IntKi), PARAMETER :: M5N8MAFxi = 4013 - INTEGER(IntKi), PARAMETER :: M5N9MAFxi = 4014 - INTEGER(IntKi), PARAMETER :: M6N1MAFxi = 4015 - INTEGER(IntKi), PARAMETER :: M6N2MAFxi = 4016 - INTEGER(IntKi), PARAMETER :: M6N3MAFxi = 4017 - INTEGER(IntKi), PARAMETER :: M6N4MAFxi = 4018 - INTEGER(IntKi), PARAMETER :: M6N5MAFxi = 4019 - INTEGER(IntKi), PARAMETER :: M6N6MAFxi = 4020 - INTEGER(IntKi), PARAMETER :: M6N7MAFxi = 4021 - INTEGER(IntKi), PARAMETER :: M6N8MAFxi = 4022 - INTEGER(IntKi), PARAMETER :: M6N9MAFxi = 4023 - INTEGER(IntKi), PARAMETER :: M7N1MAFxi = 4024 - INTEGER(IntKi), PARAMETER :: M7N2MAFxi = 4025 - INTEGER(IntKi), PARAMETER :: M7N3MAFxi = 4026 - INTEGER(IntKi), PARAMETER :: M7N4MAFxi = 4027 - INTEGER(IntKi), PARAMETER :: M7N5MAFxi = 4028 - INTEGER(IntKi), PARAMETER :: M7N6MAFxi = 4029 - INTEGER(IntKi), PARAMETER :: M7N7MAFxi = 4030 - INTEGER(IntKi), PARAMETER :: M7N8MAFxi = 4031 - INTEGER(IntKi), PARAMETER :: M7N9MAFxi = 4032 - INTEGER(IntKi), PARAMETER :: M8N1MAFxi = 4033 - INTEGER(IntKi), PARAMETER :: M8N2MAFxi = 4034 - INTEGER(IntKi), PARAMETER :: M8N3MAFxi = 4035 - INTEGER(IntKi), PARAMETER :: M8N4MAFxi = 4036 - INTEGER(IntKi), PARAMETER :: M8N5MAFxi = 4037 - INTEGER(IntKi), PARAMETER :: M8N6MAFxi = 4038 - INTEGER(IntKi), PARAMETER :: M8N7MAFxi = 4039 - INTEGER(IntKi), PARAMETER :: M8N8MAFxi = 4040 - INTEGER(IntKi), PARAMETER :: M8N9MAFxi = 4041 - INTEGER(IntKi), PARAMETER :: M9N1MAFxi = 4042 - INTEGER(IntKi), PARAMETER :: M9N2MAFxi = 4043 - INTEGER(IntKi), PARAMETER :: M9N3MAFxi = 4044 - INTEGER(IntKi), PARAMETER :: M9N4MAFxi = 4045 - INTEGER(IntKi), PARAMETER :: M9N5MAFxi = 4046 - INTEGER(IntKi), PARAMETER :: M9N6MAFxi = 4047 - INTEGER(IntKi), PARAMETER :: M9N7MAFxi = 4048 - INTEGER(IntKi), PARAMETER :: M9N8MAFxi = 4049 - INTEGER(IntKi), PARAMETER :: M9N9MAFxi = 4050 - INTEGER(IntKi), PARAMETER :: M1N1MAFyi = 4051 - INTEGER(IntKi), PARAMETER :: M1N2MAFyi = 4052 - INTEGER(IntKi), PARAMETER :: M1N3MAFyi = 4053 - INTEGER(IntKi), PARAMETER :: M1N4MAFyi = 4054 - INTEGER(IntKi), PARAMETER :: M1N5MAFyi = 4055 - INTEGER(IntKi), PARAMETER :: M1N6MAFyi = 4056 - INTEGER(IntKi), PARAMETER :: M1N7MAFyi = 4057 - INTEGER(IntKi), PARAMETER :: M1N8MAFyi = 4058 - INTEGER(IntKi), PARAMETER :: M1N9MAFyi = 4059 - INTEGER(IntKi), PARAMETER :: M2N1MAFyi = 4060 - INTEGER(IntKi), PARAMETER :: M2N2MAFyi = 4061 - INTEGER(IntKi), PARAMETER :: M2N3MAFyi = 4062 - INTEGER(IntKi), PARAMETER :: M2N4MAFyi = 4063 - INTEGER(IntKi), PARAMETER :: M2N5MAFyi = 4064 - INTEGER(IntKi), PARAMETER :: M2N6MAFyi = 4065 - INTEGER(IntKi), PARAMETER :: M2N7MAFyi = 4066 - INTEGER(IntKi), PARAMETER :: M2N8MAFyi = 4067 - INTEGER(IntKi), PARAMETER :: M2N9MAFyi = 4068 - INTEGER(IntKi), PARAMETER :: M3N1MAFyi = 4069 - INTEGER(IntKi), PARAMETER :: M3N2MAFyi = 4070 - INTEGER(IntKi), PARAMETER :: M3N3MAFyi = 4071 - INTEGER(IntKi), PARAMETER :: M3N4MAFyi = 4072 - INTEGER(IntKi), PARAMETER :: M3N5MAFyi = 4073 - INTEGER(IntKi), PARAMETER :: M3N6MAFyi = 4074 - INTEGER(IntKi), PARAMETER :: M3N7MAFyi = 4075 - INTEGER(IntKi), PARAMETER :: M3N8MAFyi = 4076 - INTEGER(IntKi), PARAMETER :: M3N9MAFyi = 4077 - INTEGER(IntKi), PARAMETER :: M4N1MAFyi = 4078 - INTEGER(IntKi), PARAMETER :: M4N2MAFyi = 4079 - INTEGER(IntKi), PARAMETER :: M4N3MAFyi = 4080 - INTEGER(IntKi), PARAMETER :: M4N4MAFyi = 4081 - INTEGER(IntKi), PARAMETER :: M4N5MAFyi = 4082 - INTEGER(IntKi), PARAMETER :: M4N6MAFyi = 4083 - INTEGER(IntKi), PARAMETER :: M4N7MAFyi = 4084 - INTEGER(IntKi), PARAMETER :: M4N8MAFyi = 4085 - INTEGER(IntKi), PARAMETER :: M4N9MAFyi = 4086 - INTEGER(IntKi), PARAMETER :: M5N1MAFyi = 4087 - INTEGER(IntKi), PARAMETER :: M5N2MAFyi = 4088 - INTEGER(IntKi), PARAMETER :: M5N3MAFyi = 4089 - INTEGER(IntKi), PARAMETER :: M5N4MAFyi = 4090 - INTEGER(IntKi), PARAMETER :: M5N5MAFyi = 4091 - INTEGER(IntKi), PARAMETER :: M5N6MAFyi = 4092 - INTEGER(IntKi), PARAMETER :: M5N7MAFyi = 4093 - INTEGER(IntKi), PARAMETER :: M5N8MAFyi = 4094 - INTEGER(IntKi), PARAMETER :: M5N9MAFyi = 4095 - INTEGER(IntKi), PARAMETER :: M6N1MAFyi = 4096 - INTEGER(IntKi), PARAMETER :: M6N2MAFyi = 4097 - INTEGER(IntKi), PARAMETER :: M6N3MAFyi = 4098 - INTEGER(IntKi), PARAMETER :: M6N4MAFyi = 4099 - INTEGER(IntKi), PARAMETER :: M6N5MAFyi = 4100 - INTEGER(IntKi), PARAMETER :: M6N6MAFyi = 4101 - INTEGER(IntKi), PARAMETER :: M6N7MAFyi = 4102 - INTEGER(IntKi), PARAMETER :: M6N8MAFyi = 4103 - INTEGER(IntKi), PARAMETER :: M6N9MAFyi = 4104 - INTEGER(IntKi), PARAMETER :: M7N1MAFyi = 4105 - INTEGER(IntKi), PARAMETER :: M7N2MAFyi = 4106 - INTEGER(IntKi), PARAMETER :: M7N3MAFyi = 4107 - INTEGER(IntKi), PARAMETER :: M7N4MAFyi = 4108 - INTEGER(IntKi), PARAMETER :: M7N5MAFyi = 4109 - INTEGER(IntKi), PARAMETER :: M7N6MAFyi = 4110 - INTEGER(IntKi), PARAMETER :: M7N7MAFyi = 4111 - INTEGER(IntKi), PARAMETER :: M7N8MAFyi = 4112 - INTEGER(IntKi), PARAMETER :: M7N9MAFyi = 4113 - INTEGER(IntKi), PARAMETER :: M8N1MAFyi = 4114 - INTEGER(IntKi), PARAMETER :: M8N2MAFyi = 4115 - INTEGER(IntKi), PARAMETER :: M8N3MAFyi = 4116 - INTEGER(IntKi), PARAMETER :: M8N4MAFyi = 4117 - INTEGER(IntKi), PARAMETER :: M8N5MAFyi = 4118 - INTEGER(IntKi), PARAMETER :: M8N6MAFyi = 4119 - INTEGER(IntKi), PARAMETER :: M8N7MAFyi = 4120 - INTEGER(IntKi), PARAMETER :: M8N8MAFyi = 4121 - INTEGER(IntKi), PARAMETER :: M8N9MAFyi = 4122 - INTEGER(IntKi), PARAMETER :: M9N1MAFyi = 4123 - INTEGER(IntKi), PARAMETER :: M9N2MAFyi = 4124 - INTEGER(IntKi), PARAMETER :: M9N3MAFyi = 4125 - INTEGER(IntKi), PARAMETER :: M9N4MAFyi = 4126 - INTEGER(IntKi), PARAMETER :: M9N5MAFyi = 4127 - INTEGER(IntKi), PARAMETER :: M9N6MAFyi = 4128 - INTEGER(IntKi), PARAMETER :: M9N7MAFyi = 4129 - INTEGER(IntKi), PARAMETER :: M9N8MAFyi = 4130 - INTEGER(IntKi), PARAMETER :: M9N9MAFyi = 4131 - INTEGER(IntKi), PARAMETER :: M1N1MAFzi = 4132 - INTEGER(IntKi), PARAMETER :: M1N2MAFzi = 4133 - INTEGER(IntKi), PARAMETER :: M1N3MAFzi = 4134 - INTEGER(IntKi), PARAMETER :: M1N4MAFzi = 4135 - INTEGER(IntKi), PARAMETER :: M1N5MAFzi = 4136 - INTEGER(IntKi), PARAMETER :: M1N6MAFzi = 4137 - INTEGER(IntKi), PARAMETER :: M1N7MAFzi = 4138 - INTEGER(IntKi), PARAMETER :: M1N8MAFzi = 4139 - INTEGER(IntKi), PARAMETER :: M1N9MAFzi = 4140 - INTEGER(IntKi), PARAMETER :: M2N1MAFzi = 4141 - INTEGER(IntKi), PARAMETER :: M2N2MAFzi = 4142 - INTEGER(IntKi), PARAMETER :: M2N3MAFzi = 4143 - INTEGER(IntKi), PARAMETER :: M2N4MAFzi = 4144 - INTEGER(IntKi), PARAMETER :: M2N5MAFzi = 4145 - INTEGER(IntKi), PARAMETER :: M2N6MAFzi = 4146 - INTEGER(IntKi), PARAMETER :: M2N7MAFzi = 4147 - INTEGER(IntKi), PARAMETER :: M2N8MAFzi = 4148 - INTEGER(IntKi), PARAMETER :: M2N9MAFzi = 4149 - INTEGER(IntKi), PARAMETER :: M3N1MAFzi = 4150 - INTEGER(IntKi), PARAMETER :: M3N2MAFzi = 4151 - INTEGER(IntKi), PARAMETER :: M3N3MAFzi = 4152 - INTEGER(IntKi), PARAMETER :: M3N4MAFzi = 4153 - INTEGER(IntKi), PARAMETER :: M3N5MAFzi = 4154 - INTEGER(IntKi), PARAMETER :: M3N6MAFzi = 4155 - INTEGER(IntKi), PARAMETER :: M3N7MAFzi = 4156 - INTEGER(IntKi), PARAMETER :: M3N8MAFzi = 4157 - INTEGER(IntKi), PARAMETER :: M3N9MAFzi = 4158 - INTEGER(IntKi), PARAMETER :: M4N1MAFzi = 4159 - INTEGER(IntKi), PARAMETER :: M4N2MAFzi = 4160 - INTEGER(IntKi), PARAMETER :: M4N3MAFzi = 4161 - INTEGER(IntKi), PARAMETER :: M4N4MAFzi = 4162 - INTEGER(IntKi), PARAMETER :: M4N5MAFzi = 4163 - INTEGER(IntKi), PARAMETER :: M4N6MAFzi = 4164 - INTEGER(IntKi), PARAMETER :: M4N7MAFzi = 4165 - INTEGER(IntKi), PARAMETER :: M4N8MAFzi = 4166 - INTEGER(IntKi), PARAMETER :: M4N9MAFzi = 4167 - INTEGER(IntKi), PARAMETER :: M5N1MAFzi = 4168 - INTEGER(IntKi), PARAMETER :: M5N2MAFzi = 4169 - INTEGER(IntKi), PARAMETER :: M5N3MAFzi = 4170 - INTEGER(IntKi), PARAMETER :: M5N4MAFzi = 4171 - INTEGER(IntKi), PARAMETER :: M5N5MAFzi = 4172 - INTEGER(IntKi), PARAMETER :: M5N6MAFzi = 4173 - INTEGER(IntKi), PARAMETER :: M5N7MAFzi = 4174 - INTEGER(IntKi), PARAMETER :: M5N8MAFzi = 4175 - INTEGER(IntKi), PARAMETER :: M5N9MAFzi = 4176 - INTEGER(IntKi), PARAMETER :: M6N1MAFzi = 4177 - INTEGER(IntKi), PARAMETER :: M6N2MAFzi = 4178 - INTEGER(IntKi), PARAMETER :: M6N3MAFzi = 4179 - INTEGER(IntKi), PARAMETER :: M6N4MAFzi = 4180 - INTEGER(IntKi), PARAMETER :: M6N5MAFzi = 4181 - INTEGER(IntKi), PARAMETER :: M6N6MAFzi = 4182 - INTEGER(IntKi), PARAMETER :: M6N7MAFzi = 4183 - INTEGER(IntKi), PARAMETER :: M6N8MAFzi = 4184 - INTEGER(IntKi), PARAMETER :: M6N9MAFzi = 4185 - INTEGER(IntKi), PARAMETER :: M7N1MAFzi = 4186 - INTEGER(IntKi), PARAMETER :: M7N2MAFzi = 4187 - INTEGER(IntKi), PARAMETER :: M7N3MAFzi = 4188 - INTEGER(IntKi), PARAMETER :: M7N4MAFzi = 4189 - INTEGER(IntKi), PARAMETER :: M7N5MAFzi = 4190 - INTEGER(IntKi), PARAMETER :: M7N6MAFzi = 4191 - INTEGER(IntKi), PARAMETER :: M7N7MAFzi = 4192 - INTEGER(IntKi), PARAMETER :: M7N8MAFzi = 4193 - INTEGER(IntKi), PARAMETER :: M7N9MAFzi = 4194 - INTEGER(IntKi), PARAMETER :: M8N1MAFzi = 4195 - INTEGER(IntKi), PARAMETER :: M8N2MAFzi = 4196 - INTEGER(IntKi), PARAMETER :: M8N3MAFzi = 4197 - INTEGER(IntKi), PARAMETER :: M8N4MAFzi = 4198 - INTEGER(IntKi), PARAMETER :: M8N5MAFzi = 4199 - INTEGER(IntKi), PARAMETER :: M8N6MAFzi = 4200 - INTEGER(IntKi), PARAMETER :: M8N7MAFzi = 4201 - INTEGER(IntKi), PARAMETER :: M8N8MAFzi = 4202 - INTEGER(IntKi), PARAMETER :: M8N9MAFzi = 4203 - INTEGER(IntKi), PARAMETER :: M9N1MAFzi = 4204 - INTEGER(IntKi), PARAMETER :: M9N2MAFzi = 4205 - INTEGER(IntKi), PARAMETER :: M9N3MAFzi = 4206 - INTEGER(IntKi), PARAMETER :: M9N4MAFzi = 4207 - INTEGER(IntKi), PARAMETER :: M9N5MAFzi = 4208 - INTEGER(IntKi), PARAMETER :: M9N6MAFzi = 4209 - INTEGER(IntKi), PARAMETER :: M9N7MAFzi = 4210 - INTEGER(IntKi), PARAMETER :: M9N8MAFzi = 4211 - INTEGER(IntKi), PARAMETER :: M9N9MAFzi = 4212 + INTEGER(IntKi), PARAMETER :: M1N1FDxi = 1054 + INTEGER(IntKi), PARAMETER :: M1N2FDxi = 1055 + INTEGER(IntKi), PARAMETER :: M1N3FDxi = 1056 + INTEGER(IntKi), PARAMETER :: M1N4FDxi = 1057 + INTEGER(IntKi), PARAMETER :: M1N5FDxi = 1058 + INTEGER(IntKi), PARAMETER :: M1N6FDxi = 1059 + INTEGER(IntKi), PARAMETER :: M1N7FDxi = 1060 + INTEGER(IntKi), PARAMETER :: M1N8FDxi = 1061 + INTEGER(IntKi), PARAMETER :: M1N9FDxi = 1062 + INTEGER(IntKi), PARAMETER :: M2N1FDxi = 1063 + INTEGER(IntKi), PARAMETER :: M2N2FDxi = 1064 + INTEGER(IntKi), PARAMETER :: M2N3FDxi = 1065 + INTEGER(IntKi), PARAMETER :: M2N4FDxi = 1066 + INTEGER(IntKi), PARAMETER :: M2N5FDxi = 1067 + INTEGER(IntKi), PARAMETER :: M2N6FDxi = 1068 + INTEGER(IntKi), PARAMETER :: M2N7FDxi = 1069 + INTEGER(IntKi), PARAMETER :: M2N8FDxi = 1070 + INTEGER(IntKi), PARAMETER :: M2N9FDxi = 1071 + INTEGER(IntKi), PARAMETER :: M3N1FDxi = 1072 + INTEGER(IntKi), PARAMETER :: M3N2FDxi = 1073 + INTEGER(IntKi), PARAMETER :: M3N3FDxi = 1074 + INTEGER(IntKi), PARAMETER :: M3N4FDxi = 1075 + INTEGER(IntKi), PARAMETER :: M3N5FDxi = 1076 + INTEGER(IntKi), PARAMETER :: M3N6FDxi = 1077 + INTEGER(IntKi), PARAMETER :: M3N7FDxi = 1078 + INTEGER(IntKi), PARAMETER :: M3N8FDxi = 1079 + INTEGER(IntKi), PARAMETER :: M3N9FDxi = 1080 + INTEGER(IntKi), PARAMETER :: M4N1FDxi = 1081 + INTEGER(IntKi), PARAMETER :: M4N2FDxi = 1082 + INTEGER(IntKi), PARAMETER :: M4N3FDxi = 1083 + INTEGER(IntKi), PARAMETER :: M4N4FDxi = 1084 + INTEGER(IntKi), PARAMETER :: M4N5FDxi = 1085 + INTEGER(IntKi), PARAMETER :: M4N6FDxi = 1086 + INTEGER(IntKi), PARAMETER :: M4N7FDxi = 1087 + INTEGER(IntKi), PARAMETER :: M4N8FDxi = 1088 + INTEGER(IntKi), PARAMETER :: M4N9FDxi = 1089 + INTEGER(IntKi), PARAMETER :: M5N1FDxi = 1090 + INTEGER(IntKi), PARAMETER :: M5N2FDxi = 1091 + INTEGER(IntKi), PARAMETER :: M5N3FDxi = 1092 + INTEGER(IntKi), PARAMETER :: M5N4FDxi = 1093 + INTEGER(IntKi), PARAMETER :: M5N5FDxi = 1094 + INTEGER(IntKi), PARAMETER :: M5N6FDxi = 1095 + INTEGER(IntKi), PARAMETER :: M5N7FDxi = 1096 + INTEGER(IntKi), PARAMETER :: M5N8FDxi = 1097 + INTEGER(IntKi), PARAMETER :: M5N9FDxi = 1098 + INTEGER(IntKi), PARAMETER :: M6N1FDxi = 1099 + INTEGER(IntKi), PARAMETER :: M6N2FDxi = 1100 + INTEGER(IntKi), PARAMETER :: M6N3FDxi = 1101 + INTEGER(IntKi), PARAMETER :: M6N4FDxi = 1102 + INTEGER(IntKi), PARAMETER :: M6N5FDxi = 1103 + INTEGER(IntKi), PARAMETER :: M6N6FDxi = 1104 + INTEGER(IntKi), PARAMETER :: M6N7FDxi = 1105 + INTEGER(IntKi), PARAMETER :: M6N8FDxi = 1106 + INTEGER(IntKi), PARAMETER :: M6N9FDxi = 1107 + INTEGER(IntKi), PARAMETER :: M7N1FDxi = 1108 + INTEGER(IntKi), PARAMETER :: M7N2FDxi = 1109 + INTEGER(IntKi), PARAMETER :: M7N3FDxi = 1110 + INTEGER(IntKi), PARAMETER :: M7N4FDxi = 1111 + INTEGER(IntKi), PARAMETER :: M7N5FDxi = 1112 + INTEGER(IntKi), PARAMETER :: M7N6FDxi = 1113 + INTEGER(IntKi), PARAMETER :: M7N7FDxi = 1114 + INTEGER(IntKi), PARAMETER :: M7N8FDxi = 1115 + INTEGER(IntKi), PARAMETER :: M7N9FDxi = 1116 + INTEGER(IntKi), PARAMETER :: M8N1FDxi = 1117 + INTEGER(IntKi), PARAMETER :: M8N2FDxi = 1118 + INTEGER(IntKi), PARAMETER :: M8N3FDxi = 1119 + INTEGER(IntKi), PARAMETER :: M8N4FDxi = 1120 + INTEGER(IntKi), PARAMETER :: M8N5FDxi = 1121 + INTEGER(IntKi), PARAMETER :: M8N6FDxi = 1122 + INTEGER(IntKi), PARAMETER :: M8N7FDxi = 1123 + INTEGER(IntKi), PARAMETER :: M8N8FDxi = 1124 + INTEGER(IntKi), PARAMETER :: M8N9FDxi = 1125 + INTEGER(IntKi), PARAMETER :: M9N1FDxi = 1126 + INTEGER(IntKi), PARAMETER :: M9N2FDxi = 1127 + INTEGER(IntKi), PARAMETER :: M9N3FDxi = 1128 + INTEGER(IntKi), PARAMETER :: M9N4FDxi = 1129 + INTEGER(IntKi), PARAMETER :: M9N5FDxi = 1130 + INTEGER(IntKi), PARAMETER :: M9N6FDxi = 1131 + INTEGER(IntKi), PARAMETER :: M9N7FDxi = 1132 + INTEGER(IntKi), PARAMETER :: M9N8FDxi = 1133 + INTEGER(IntKi), PARAMETER :: M9N9FDxi = 1134 + INTEGER(IntKi), PARAMETER :: M1N1FDyi = 1135 + INTEGER(IntKi), PARAMETER :: M1N2FDyi = 1136 + INTEGER(IntKi), PARAMETER :: M1N3FDyi = 1137 + INTEGER(IntKi), PARAMETER :: M1N4FDyi = 1138 + INTEGER(IntKi), PARAMETER :: M1N5FDyi = 1139 + INTEGER(IntKi), PARAMETER :: M1N6FDyi = 1140 + INTEGER(IntKi), PARAMETER :: M1N7FDyi = 1141 + INTEGER(IntKi), PARAMETER :: M1N8FDyi = 1142 + INTEGER(IntKi), PARAMETER :: M1N9FDyi = 1143 + INTEGER(IntKi), PARAMETER :: M2N1FDyi = 1144 + INTEGER(IntKi), PARAMETER :: M2N2FDyi = 1145 + INTEGER(IntKi), PARAMETER :: M2N3FDyi = 1146 + INTEGER(IntKi), PARAMETER :: M2N4FDyi = 1147 + INTEGER(IntKi), PARAMETER :: M2N5FDyi = 1148 + INTEGER(IntKi), PARAMETER :: M2N6FDyi = 1149 + INTEGER(IntKi), PARAMETER :: M2N7FDyi = 1150 + INTEGER(IntKi), PARAMETER :: M2N8FDyi = 1151 + INTEGER(IntKi), PARAMETER :: M2N9FDyi = 1152 + INTEGER(IntKi), PARAMETER :: M3N1FDyi = 1153 + INTEGER(IntKi), PARAMETER :: M3N2FDyi = 1154 + INTEGER(IntKi), PARAMETER :: M3N3FDyi = 1155 + INTEGER(IntKi), PARAMETER :: M3N4FDyi = 1156 + INTEGER(IntKi), PARAMETER :: M3N5FDyi = 1157 + INTEGER(IntKi), PARAMETER :: M3N6FDyi = 1158 + INTEGER(IntKi), PARAMETER :: M3N7FDyi = 1159 + INTEGER(IntKi), PARAMETER :: M3N8FDyi = 1160 + INTEGER(IntKi), PARAMETER :: M3N9FDyi = 1161 + INTEGER(IntKi), PARAMETER :: M4N1FDyi = 1162 + INTEGER(IntKi), PARAMETER :: M4N2FDyi = 1163 + INTEGER(IntKi), PARAMETER :: M4N3FDyi = 1164 + INTEGER(IntKi), PARAMETER :: M4N4FDyi = 1165 + INTEGER(IntKi), PARAMETER :: M4N5FDyi = 1166 + INTEGER(IntKi), PARAMETER :: M4N6FDyi = 1167 + INTEGER(IntKi), PARAMETER :: M4N7FDyi = 1168 + INTEGER(IntKi), PARAMETER :: M4N8FDyi = 1169 + INTEGER(IntKi), PARAMETER :: M4N9FDyi = 1170 + INTEGER(IntKi), PARAMETER :: M5N1FDyi = 1171 + INTEGER(IntKi), PARAMETER :: M5N2FDyi = 1172 + INTEGER(IntKi), PARAMETER :: M5N3FDyi = 1173 + INTEGER(IntKi), PARAMETER :: M5N4FDyi = 1174 + INTEGER(IntKi), PARAMETER :: M5N5FDyi = 1175 + INTEGER(IntKi), PARAMETER :: M5N6FDyi = 1176 + INTEGER(IntKi), PARAMETER :: M5N7FDyi = 1177 + INTEGER(IntKi), PARAMETER :: M5N8FDyi = 1178 + INTEGER(IntKi), PARAMETER :: M5N9FDyi = 1179 + INTEGER(IntKi), PARAMETER :: M6N1FDyi = 1180 + INTEGER(IntKi), PARAMETER :: M6N2FDyi = 1181 + INTEGER(IntKi), PARAMETER :: M6N3FDyi = 1182 + INTEGER(IntKi), PARAMETER :: M6N4FDyi = 1183 + INTEGER(IntKi), PARAMETER :: M6N5FDyi = 1184 + INTEGER(IntKi), PARAMETER :: M6N6FDyi = 1185 + INTEGER(IntKi), PARAMETER :: M6N7FDyi = 1186 + INTEGER(IntKi), PARAMETER :: M6N8FDyi = 1187 + INTEGER(IntKi), PARAMETER :: M6N9FDyi = 1188 + INTEGER(IntKi), PARAMETER :: M7N1FDyi = 1189 + INTEGER(IntKi), PARAMETER :: M7N2FDyi = 1190 + INTEGER(IntKi), PARAMETER :: M7N3FDyi = 1191 + INTEGER(IntKi), PARAMETER :: M7N4FDyi = 1192 + INTEGER(IntKi), PARAMETER :: M7N5FDyi = 1193 + INTEGER(IntKi), PARAMETER :: M7N6FDyi = 1194 + INTEGER(IntKi), PARAMETER :: M7N7FDyi = 1195 + INTEGER(IntKi), PARAMETER :: M7N8FDyi = 1196 + INTEGER(IntKi), PARAMETER :: M7N9FDyi = 1197 + INTEGER(IntKi), PARAMETER :: M8N1FDyi = 1198 + INTEGER(IntKi), PARAMETER :: M8N2FDyi = 1199 + INTEGER(IntKi), PARAMETER :: M8N3FDyi = 1200 + INTEGER(IntKi), PARAMETER :: M8N4FDyi = 1201 + INTEGER(IntKi), PARAMETER :: M8N5FDyi = 1202 + INTEGER(IntKi), PARAMETER :: M8N6FDyi = 1203 + INTEGER(IntKi), PARAMETER :: M8N7FDyi = 1204 + INTEGER(IntKi), PARAMETER :: M8N8FDyi = 1205 + INTEGER(IntKi), PARAMETER :: M8N9FDyi = 1206 + INTEGER(IntKi), PARAMETER :: M9N1FDyi = 1207 + INTEGER(IntKi), PARAMETER :: M9N2FDyi = 1208 + INTEGER(IntKi), PARAMETER :: M9N3FDyi = 1209 + INTEGER(IntKi), PARAMETER :: M9N4FDyi = 1210 + INTEGER(IntKi), PARAMETER :: M9N5FDyi = 1211 + INTEGER(IntKi), PARAMETER :: M9N6FDyi = 1212 + INTEGER(IntKi), PARAMETER :: M9N7FDyi = 1213 + INTEGER(IntKi), PARAMETER :: M9N8FDyi = 1214 + INTEGER(IntKi), PARAMETER :: M9N9FDyi = 1215 + INTEGER(IntKi), PARAMETER :: M1N1FDzi = 1216 + INTEGER(IntKi), PARAMETER :: M1N2FDzi = 1217 + INTEGER(IntKi), PARAMETER :: M1N3FDzi = 1218 + INTEGER(IntKi), PARAMETER :: M1N4FDzi = 1219 + INTEGER(IntKi), PARAMETER :: M1N5FDzi = 1220 + INTEGER(IntKi), PARAMETER :: M1N6FDzi = 1221 + INTEGER(IntKi), PARAMETER :: M1N7FDzi = 1222 + INTEGER(IntKi), PARAMETER :: M1N8FDzi = 1223 + INTEGER(IntKi), PARAMETER :: M1N9FDzi = 1224 + INTEGER(IntKi), PARAMETER :: M2N1FDzi = 1225 + INTEGER(IntKi), PARAMETER :: M2N2FDzi = 1226 + INTEGER(IntKi), PARAMETER :: M2N3FDzi = 1227 + INTEGER(IntKi), PARAMETER :: M2N4FDzi = 1228 + INTEGER(IntKi), PARAMETER :: M2N5FDzi = 1229 + INTEGER(IntKi), PARAMETER :: M2N6FDzi = 1230 + INTEGER(IntKi), PARAMETER :: M2N7FDzi = 1231 + INTEGER(IntKi), PARAMETER :: M2N8FDzi = 1232 + INTEGER(IntKi), PARAMETER :: M2N9FDzi = 1233 + INTEGER(IntKi), PARAMETER :: M3N1FDzi = 1234 + INTEGER(IntKi), PARAMETER :: M3N2FDzi = 1235 + INTEGER(IntKi), PARAMETER :: M3N3FDzi = 1236 + INTEGER(IntKi), PARAMETER :: M3N4FDzi = 1237 + INTEGER(IntKi), PARAMETER :: M3N5FDzi = 1238 + INTEGER(IntKi), PARAMETER :: M3N6FDzi = 1239 + INTEGER(IntKi), PARAMETER :: M3N7FDzi = 1240 + INTEGER(IntKi), PARAMETER :: M3N8FDzi = 1241 + INTEGER(IntKi), PARAMETER :: M3N9FDzi = 1242 + INTEGER(IntKi), PARAMETER :: M4N1FDzi = 1243 + INTEGER(IntKi), PARAMETER :: M4N2FDzi = 1244 + INTEGER(IntKi), PARAMETER :: M4N3FDzi = 1245 + INTEGER(IntKi), PARAMETER :: M4N4FDzi = 1246 + INTEGER(IntKi), PARAMETER :: M4N5FDzi = 1247 + INTEGER(IntKi), PARAMETER :: M4N6FDzi = 1248 + INTEGER(IntKi), PARAMETER :: M4N7FDzi = 1249 + INTEGER(IntKi), PARAMETER :: M4N8FDzi = 1250 + INTEGER(IntKi), PARAMETER :: M4N9FDzi = 1251 + INTEGER(IntKi), PARAMETER :: M5N1FDzi = 1252 + INTEGER(IntKi), PARAMETER :: M5N2FDzi = 1253 + INTEGER(IntKi), PARAMETER :: M5N3FDzi = 1254 + INTEGER(IntKi), PARAMETER :: M5N4FDzi = 1255 + INTEGER(IntKi), PARAMETER :: M5N5FDzi = 1256 + INTEGER(IntKi), PARAMETER :: M5N6FDzi = 1257 + INTEGER(IntKi), PARAMETER :: M5N7FDzi = 1258 + INTEGER(IntKi), PARAMETER :: M5N8FDzi = 1259 + INTEGER(IntKi), PARAMETER :: M5N9FDzi = 1260 + INTEGER(IntKi), PARAMETER :: M6N1FDzi = 1261 + INTEGER(IntKi), PARAMETER :: M6N2FDzi = 1262 + INTEGER(IntKi), PARAMETER :: M6N3FDzi = 1263 + INTEGER(IntKi), PARAMETER :: M6N4FDzi = 1264 + INTEGER(IntKi), PARAMETER :: M6N5FDzi = 1265 + INTEGER(IntKi), PARAMETER :: M6N6FDzi = 1266 + INTEGER(IntKi), PARAMETER :: M6N7FDzi = 1267 + INTEGER(IntKi), PARAMETER :: M6N8FDzi = 1268 + INTEGER(IntKi), PARAMETER :: M6N9FDzi = 1269 + INTEGER(IntKi), PARAMETER :: M7N1FDzi = 1270 + INTEGER(IntKi), PARAMETER :: M7N2FDzi = 1271 + INTEGER(IntKi), PARAMETER :: M7N3FDzi = 1272 + INTEGER(IntKi), PARAMETER :: M7N4FDzi = 1273 + INTEGER(IntKi), PARAMETER :: M7N5FDzi = 1274 + INTEGER(IntKi), PARAMETER :: M7N6FDzi = 1275 + INTEGER(IntKi), PARAMETER :: M7N7FDzi = 1276 + INTEGER(IntKi), PARAMETER :: M7N8FDzi = 1277 + INTEGER(IntKi), PARAMETER :: M7N9FDzi = 1278 + INTEGER(IntKi), PARAMETER :: M8N1FDzi = 1279 + INTEGER(IntKi), PARAMETER :: M8N2FDzi = 1280 + INTEGER(IntKi), PARAMETER :: M8N3FDzi = 1281 + INTEGER(IntKi), PARAMETER :: M8N4FDzi = 1282 + INTEGER(IntKi), PARAMETER :: M8N5FDzi = 1283 + INTEGER(IntKi), PARAMETER :: M8N6FDzi = 1284 + INTEGER(IntKi), PARAMETER :: M8N7FDzi = 1285 + INTEGER(IntKi), PARAMETER :: M8N8FDzi = 1286 + INTEGER(IntKi), PARAMETER :: M8N9FDzi = 1287 + INTEGER(IntKi), PARAMETER :: M9N1FDzi = 1288 + INTEGER(IntKi), PARAMETER :: M9N2FDzi = 1289 + INTEGER(IntKi), PARAMETER :: M9N3FDzi = 1290 + INTEGER(IntKi), PARAMETER :: M9N4FDzi = 1291 + INTEGER(IntKi), PARAMETER :: M9N5FDzi = 1292 + INTEGER(IntKi), PARAMETER :: M9N6FDzi = 1293 + INTEGER(IntKi), PARAMETER :: M9N7FDzi = 1294 + INTEGER(IntKi), PARAMETER :: M9N8FDzi = 1295 + INTEGER(IntKi), PARAMETER :: M9N9FDzi = 1296 + INTEGER(IntKi), PARAMETER :: M1N1FIxi = 1297 + INTEGER(IntKi), PARAMETER :: M1N2FIxi = 1298 + INTEGER(IntKi), PARAMETER :: M1N3FIxi = 1299 + INTEGER(IntKi), PARAMETER :: M1N4FIxi = 1300 + INTEGER(IntKi), PARAMETER :: M1N5FIxi = 1301 + INTEGER(IntKi), PARAMETER :: M1N6FIxi = 1302 + INTEGER(IntKi), PARAMETER :: M1N7FIxi = 1303 + INTEGER(IntKi), PARAMETER :: M1N8FIxi = 1304 + INTEGER(IntKi), PARAMETER :: M1N9FIxi = 1305 + INTEGER(IntKi), PARAMETER :: M2N1FIxi = 1306 + INTEGER(IntKi), PARAMETER :: M2N2FIxi = 1307 + INTEGER(IntKi), PARAMETER :: M2N3FIxi = 1308 + INTEGER(IntKi), PARAMETER :: M2N4FIxi = 1309 + INTEGER(IntKi), PARAMETER :: M2N5FIxi = 1310 + INTEGER(IntKi), PARAMETER :: M2N6FIxi = 1311 + INTEGER(IntKi), PARAMETER :: M2N7FIxi = 1312 + INTEGER(IntKi), PARAMETER :: M2N8FIxi = 1313 + INTEGER(IntKi), PARAMETER :: M2N9FIxi = 1314 + INTEGER(IntKi), PARAMETER :: M3N1FIxi = 1315 + INTEGER(IntKi), PARAMETER :: M3N2FIxi = 1316 + INTEGER(IntKi), PARAMETER :: M3N3FIxi = 1317 + INTEGER(IntKi), PARAMETER :: M3N4FIxi = 1318 + INTEGER(IntKi), PARAMETER :: M3N5FIxi = 1319 + INTEGER(IntKi), PARAMETER :: M3N6FIxi = 1320 + INTEGER(IntKi), PARAMETER :: M3N7FIxi = 1321 + INTEGER(IntKi), PARAMETER :: M3N8FIxi = 1322 + INTEGER(IntKi), PARAMETER :: M3N9FIxi = 1323 + INTEGER(IntKi), PARAMETER :: M4N1FIxi = 1324 + INTEGER(IntKi), PARAMETER :: M4N2FIxi = 1325 + INTEGER(IntKi), PARAMETER :: M4N3FIxi = 1326 + INTEGER(IntKi), PARAMETER :: M4N4FIxi = 1327 + INTEGER(IntKi), PARAMETER :: M4N5FIxi = 1328 + INTEGER(IntKi), PARAMETER :: M4N6FIxi = 1329 + INTEGER(IntKi), PARAMETER :: M4N7FIxi = 1330 + INTEGER(IntKi), PARAMETER :: M4N8FIxi = 1331 + INTEGER(IntKi), PARAMETER :: M4N9FIxi = 1332 + INTEGER(IntKi), PARAMETER :: M5N1FIxi = 1333 + INTEGER(IntKi), PARAMETER :: M5N2FIxi = 1334 + INTEGER(IntKi), PARAMETER :: M5N3FIxi = 1335 + INTEGER(IntKi), PARAMETER :: M5N4FIxi = 1336 + INTEGER(IntKi), PARAMETER :: M5N5FIxi = 1337 + INTEGER(IntKi), PARAMETER :: M5N6FIxi = 1338 + INTEGER(IntKi), PARAMETER :: M5N7FIxi = 1339 + INTEGER(IntKi), PARAMETER :: M5N8FIxi = 1340 + INTEGER(IntKi), PARAMETER :: M5N9FIxi = 1341 + INTEGER(IntKi), PARAMETER :: M6N1FIxi = 1342 + INTEGER(IntKi), PARAMETER :: M6N2FIxi = 1343 + INTEGER(IntKi), PARAMETER :: M6N3FIxi = 1344 + INTEGER(IntKi), PARAMETER :: M6N4FIxi = 1345 + INTEGER(IntKi), PARAMETER :: M6N5FIxi = 1346 + INTEGER(IntKi), PARAMETER :: M6N6FIxi = 1347 + INTEGER(IntKi), PARAMETER :: M6N7FIxi = 1348 + INTEGER(IntKi), PARAMETER :: M6N8FIxi = 1349 + INTEGER(IntKi), PARAMETER :: M6N9FIxi = 1350 + INTEGER(IntKi), PARAMETER :: M7N1FIxi = 1351 + INTEGER(IntKi), PARAMETER :: M7N2FIxi = 1352 + INTEGER(IntKi), PARAMETER :: M7N3FIxi = 1353 + INTEGER(IntKi), PARAMETER :: M7N4FIxi = 1354 + INTEGER(IntKi), PARAMETER :: M7N5FIxi = 1355 + INTEGER(IntKi), PARAMETER :: M7N6FIxi = 1356 + INTEGER(IntKi), PARAMETER :: M7N7FIxi = 1357 + INTEGER(IntKi), PARAMETER :: M7N8FIxi = 1358 + INTEGER(IntKi), PARAMETER :: M7N9FIxi = 1359 + INTEGER(IntKi), PARAMETER :: M8N1FIxi = 1360 + INTEGER(IntKi), PARAMETER :: M8N2FIxi = 1361 + INTEGER(IntKi), PARAMETER :: M8N3FIxi = 1362 + INTEGER(IntKi), PARAMETER :: M8N4FIxi = 1363 + INTEGER(IntKi), PARAMETER :: M8N5FIxi = 1364 + INTEGER(IntKi), PARAMETER :: M8N6FIxi = 1365 + INTEGER(IntKi), PARAMETER :: M8N7FIxi = 1366 + INTEGER(IntKi), PARAMETER :: M8N8FIxi = 1367 + INTEGER(IntKi), PARAMETER :: M8N9FIxi = 1368 + INTEGER(IntKi), PARAMETER :: M9N1FIxi = 1369 + INTEGER(IntKi), PARAMETER :: M9N2FIxi = 1370 + INTEGER(IntKi), PARAMETER :: M9N3FIxi = 1371 + INTEGER(IntKi), PARAMETER :: M9N4FIxi = 1372 + INTEGER(IntKi), PARAMETER :: M9N5FIxi = 1373 + INTEGER(IntKi), PARAMETER :: M9N6FIxi = 1374 + INTEGER(IntKi), PARAMETER :: M9N7FIxi = 1375 + INTEGER(IntKi), PARAMETER :: M9N8FIxi = 1376 + INTEGER(IntKi), PARAMETER :: M9N9FIxi = 1377 + INTEGER(IntKi), PARAMETER :: M1N1FIyi = 1378 + INTEGER(IntKi), PARAMETER :: M1N2FIyi = 1379 + INTEGER(IntKi), PARAMETER :: M1N3FIyi = 1380 + INTEGER(IntKi), PARAMETER :: M1N4FIyi = 1381 + INTEGER(IntKi), PARAMETER :: M1N5FIyi = 1382 + INTEGER(IntKi), PARAMETER :: M1N6FIyi = 1383 + INTEGER(IntKi), PARAMETER :: M1N7FIyi = 1384 + INTEGER(IntKi), PARAMETER :: M1N8FIyi = 1385 + INTEGER(IntKi), PARAMETER :: M1N9FIyi = 1386 + INTEGER(IntKi), PARAMETER :: M2N1FIyi = 1387 + INTEGER(IntKi), PARAMETER :: M2N2FIyi = 1388 + INTEGER(IntKi), PARAMETER :: M2N3FIyi = 1389 + INTEGER(IntKi), PARAMETER :: M2N4FIyi = 1390 + INTEGER(IntKi), PARAMETER :: M2N5FIyi = 1391 + INTEGER(IntKi), PARAMETER :: M2N6FIyi = 1392 + INTEGER(IntKi), PARAMETER :: M2N7FIyi = 1393 + INTEGER(IntKi), PARAMETER :: M2N8FIyi = 1394 + INTEGER(IntKi), PARAMETER :: M2N9FIyi = 1395 + INTEGER(IntKi), PARAMETER :: M3N1FIyi = 1396 + INTEGER(IntKi), PARAMETER :: M3N2FIyi = 1397 + INTEGER(IntKi), PARAMETER :: M3N3FIyi = 1398 + INTEGER(IntKi), PARAMETER :: M3N4FIyi = 1399 + INTEGER(IntKi), PARAMETER :: M3N5FIyi = 1400 + INTEGER(IntKi), PARAMETER :: M3N6FIyi = 1401 + INTEGER(IntKi), PARAMETER :: M3N7FIyi = 1402 + INTEGER(IntKi), PARAMETER :: M3N8FIyi = 1403 + INTEGER(IntKi), PARAMETER :: M3N9FIyi = 1404 + INTEGER(IntKi), PARAMETER :: M4N1FIyi = 1405 + INTEGER(IntKi), PARAMETER :: M4N2FIyi = 1406 + INTEGER(IntKi), PARAMETER :: M4N3FIyi = 1407 + INTEGER(IntKi), PARAMETER :: M4N4FIyi = 1408 + INTEGER(IntKi), PARAMETER :: M4N5FIyi = 1409 + INTEGER(IntKi), PARAMETER :: M4N6FIyi = 1410 + INTEGER(IntKi), PARAMETER :: M4N7FIyi = 1411 + INTEGER(IntKi), PARAMETER :: M4N8FIyi = 1412 + INTEGER(IntKi), PARAMETER :: M4N9FIyi = 1413 + INTEGER(IntKi), PARAMETER :: M5N1FIyi = 1414 + INTEGER(IntKi), PARAMETER :: M5N2FIyi = 1415 + INTEGER(IntKi), PARAMETER :: M5N3FIyi = 1416 + INTEGER(IntKi), PARAMETER :: M5N4FIyi = 1417 + INTEGER(IntKi), PARAMETER :: M5N5FIyi = 1418 + INTEGER(IntKi), PARAMETER :: M5N6FIyi = 1419 + INTEGER(IntKi), PARAMETER :: M5N7FIyi = 1420 + INTEGER(IntKi), PARAMETER :: M5N8FIyi = 1421 + INTEGER(IntKi), PARAMETER :: M5N9FIyi = 1422 + INTEGER(IntKi), PARAMETER :: M6N1FIyi = 1423 + INTEGER(IntKi), PARAMETER :: M6N2FIyi = 1424 + INTEGER(IntKi), PARAMETER :: M6N3FIyi = 1425 + INTEGER(IntKi), PARAMETER :: M6N4FIyi = 1426 + INTEGER(IntKi), PARAMETER :: M6N5FIyi = 1427 + INTEGER(IntKi), PARAMETER :: M6N6FIyi = 1428 + INTEGER(IntKi), PARAMETER :: M6N7FIyi = 1429 + INTEGER(IntKi), PARAMETER :: M6N8FIyi = 1430 + INTEGER(IntKi), PARAMETER :: M6N9FIyi = 1431 + INTEGER(IntKi), PARAMETER :: M7N1FIyi = 1432 + INTEGER(IntKi), PARAMETER :: M7N2FIyi = 1433 + INTEGER(IntKi), PARAMETER :: M7N3FIyi = 1434 + INTEGER(IntKi), PARAMETER :: M7N4FIyi = 1435 + INTEGER(IntKi), PARAMETER :: M7N5FIyi = 1436 + INTEGER(IntKi), PARAMETER :: M7N6FIyi = 1437 + INTEGER(IntKi), PARAMETER :: M7N7FIyi = 1438 + INTEGER(IntKi), PARAMETER :: M7N8FIyi = 1439 + INTEGER(IntKi), PARAMETER :: M7N9FIyi = 1440 + INTEGER(IntKi), PARAMETER :: M8N1FIyi = 1441 + INTEGER(IntKi), PARAMETER :: M8N2FIyi = 1442 + INTEGER(IntKi), PARAMETER :: M8N3FIyi = 1443 + INTEGER(IntKi), PARAMETER :: M8N4FIyi = 1444 + INTEGER(IntKi), PARAMETER :: M8N5FIyi = 1445 + INTEGER(IntKi), PARAMETER :: M8N6FIyi = 1446 + INTEGER(IntKi), PARAMETER :: M8N7FIyi = 1447 + INTEGER(IntKi), PARAMETER :: M8N8FIyi = 1448 + INTEGER(IntKi), PARAMETER :: M8N9FIyi = 1449 + INTEGER(IntKi), PARAMETER :: M9N1FIyi = 1450 + INTEGER(IntKi), PARAMETER :: M9N2FIyi = 1451 + INTEGER(IntKi), PARAMETER :: M9N3FIyi = 1452 + INTEGER(IntKi), PARAMETER :: M9N4FIyi = 1453 + INTEGER(IntKi), PARAMETER :: M9N5FIyi = 1454 + INTEGER(IntKi), PARAMETER :: M9N6FIyi = 1455 + INTEGER(IntKi), PARAMETER :: M9N7FIyi = 1456 + INTEGER(IntKi), PARAMETER :: M9N8FIyi = 1457 + INTEGER(IntKi), PARAMETER :: M9N9FIyi = 1458 + INTEGER(IntKi), PARAMETER :: M1N1FIzi = 1459 + INTEGER(IntKi), PARAMETER :: M1N2FIzi = 1460 + INTEGER(IntKi), PARAMETER :: M1N3FIzi = 1461 + INTEGER(IntKi), PARAMETER :: M1N4FIzi = 1462 + INTEGER(IntKi), PARAMETER :: M1N5FIzi = 1463 + INTEGER(IntKi), PARAMETER :: M1N6FIzi = 1464 + INTEGER(IntKi), PARAMETER :: M1N7FIzi = 1465 + INTEGER(IntKi), PARAMETER :: M1N8FIzi = 1466 + INTEGER(IntKi), PARAMETER :: M1N9FIzi = 1467 + INTEGER(IntKi), PARAMETER :: M2N1FIzi = 1468 + INTEGER(IntKi), PARAMETER :: M2N2FIzi = 1469 + INTEGER(IntKi), PARAMETER :: M2N3FIzi = 1470 + INTEGER(IntKi), PARAMETER :: M2N4FIzi = 1471 + INTEGER(IntKi), PARAMETER :: M2N5FIzi = 1472 + INTEGER(IntKi), PARAMETER :: M2N6FIzi = 1473 + INTEGER(IntKi), PARAMETER :: M2N7FIzi = 1474 + INTEGER(IntKi), PARAMETER :: M2N8FIzi = 1475 + INTEGER(IntKi), PARAMETER :: M2N9FIzi = 1476 + INTEGER(IntKi), PARAMETER :: M3N1FIzi = 1477 + INTEGER(IntKi), PARAMETER :: M3N2FIzi = 1478 + INTEGER(IntKi), PARAMETER :: M3N3FIzi = 1479 + INTEGER(IntKi), PARAMETER :: M3N4FIzi = 1480 + INTEGER(IntKi), PARAMETER :: M3N5FIzi = 1481 + INTEGER(IntKi), PARAMETER :: M3N6FIzi = 1482 + INTEGER(IntKi), PARAMETER :: M3N7FIzi = 1483 + INTEGER(IntKi), PARAMETER :: M3N8FIzi = 1484 + INTEGER(IntKi), PARAMETER :: M3N9FIzi = 1485 + INTEGER(IntKi), PARAMETER :: M4N1FIzi = 1486 + INTEGER(IntKi), PARAMETER :: M4N2FIzi = 1487 + INTEGER(IntKi), PARAMETER :: M4N3FIzi = 1488 + INTEGER(IntKi), PARAMETER :: M4N4FIzi = 1489 + INTEGER(IntKi), PARAMETER :: M4N5FIzi = 1490 + INTEGER(IntKi), PARAMETER :: M4N6FIzi = 1491 + INTEGER(IntKi), PARAMETER :: M4N7FIzi = 1492 + INTEGER(IntKi), PARAMETER :: M4N8FIzi = 1493 + INTEGER(IntKi), PARAMETER :: M4N9FIzi = 1494 + INTEGER(IntKi), PARAMETER :: M5N1FIzi = 1495 + INTEGER(IntKi), PARAMETER :: M5N2FIzi = 1496 + INTEGER(IntKi), PARAMETER :: M5N3FIzi = 1497 + INTEGER(IntKi), PARAMETER :: M5N4FIzi = 1498 + INTEGER(IntKi), PARAMETER :: M5N5FIzi = 1499 + INTEGER(IntKi), PARAMETER :: M5N6FIzi = 1500 + INTEGER(IntKi), PARAMETER :: M5N7FIzi = 1501 + INTEGER(IntKi), PARAMETER :: M5N8FIzi = 1502 + INTEGER(IntKi), PARAMETER :: M5N9FIzi = 1503 + INTEGER(IntKi), PARAMETER :: M6N1FIzi = 1504 + INTEGER(IntKi), PARAMETER :: M6N2FIzi = 1505 + INTEGER(IntKi), PARAMETER :: M6N3FIzi = 1506 + INTEGER(IntKi), PARAMETER :: M6N4FIzi = 1507 + INTEGER(IntKi), PARAMETER :: M6N5FIzi = 1508 + INTEGER(IntKi), PARAMETER :: M6N6FIzi = 1509 + INTEGER(IntKi), PARAMETER :: M6N7FIzi = 1510 + INTEGER(IntKi), PARAMETER :: M6N8FIzi = 1511 + INTEGER(IntKi), PARAMETER :: M6N9FIzi = 1512 + INTEGER(IntKi), PARAMETER :: M7N1FIzi = 1513 + INTEGER(IntKi), PARAMETER :: M7N2FIzi = 1514 + INTEGER(IntKi), PARAMETER :: M7N3FIzi = 1515 + INTEGER(IntKi), PARAMETER :: M7N4FIzi = 1516 + INTEGER(IntKi), PARAMETER :: M7N5FIzi = 1517 + INTEGER(IntKi), PARAMETER :: M7N6FIzi = 1518 + INTEGER(IntKi), PARAMETER :: M7N7FIzi = 1519 + INTEGER(IntKi), PARAMETER :: M7N8FIzi = 1520 + INTEGER(IntKi), PARAMETER :: M7N9FIzi = 1521 + INTEGER(IntKi), PARAMETER :: M8N1FIzi = 1522 + INTEGER(IntKi), PARAMETER :: M8N2FIzi = 1523 + INTEGER(IntKi), PARAMETER :: M8N3FIzi = 1524 + INTEGER(IntKi), PARAMETER :: M8N4FIzi = 1525 + INTEGER(IntKi), PARAMETER :: M8N5FIzi = 1526 + INTEGER(IntKi), PARAMETER :: M8N6FIzi = 1527 + INTEGER(IntKi), PARAMETER :: M8N7FIzi = 1528 + INTEGER(IntKi), PARAMETER :: M8N8FIzi = 1529 + INTEGER(IntKi), PARAMETER :: M8N9FIzi = 1530 + INTEGER(IntKi), PARAMETER :: M9N1FIzi = 1531 + INTEGER(IntKi), PARAMETER :: M9N2FIzi = 1532 + INTEGER(IntKi), PARAMETER :: M9N3FIzi = 1533 + INTEGER(IntKi), PARAMETER :: M9N4FIzi = 1534 + INTEGER(IntKi), PARAMETER :: M9N5FIzi = 1535 + INTEGER(IntKi), PARAMETER :: M9N6FIzi = 1536 + INTEGER(IntKi), PARAMETER :: M9N7FIzi = 1537 + INTEGER(IntKi), PARAMETER :: M9N8FIzi = 1538 + INTEGER(IntKi), PARAMETER :: M9N9FIzi = 1539 + INTEGER(IntKi), PARAMETER :: M1N1FBxi = 1540 + INTEGER(IntKi), PARAMETER :: M1N2FBxi = 1541 + INTEGER(IntKi), PARAMETER :: M1N3FBxi = 1542 + INTEGER(IntKi), PARAMETER :: M1N4FBxi = 1543 + INTEGER(IntKi), PARAMETER :: M1N5FBxi = 1544 + INTEGER(IntKi), PARAMETER :: M1N6FBxi = 1545 + INTEGER(IntKi), PARAMETER :: M1N7FBxi = 1546 + INTEGER(IntKi), PARAMETER :: M1N8FBxi = 1547 + INTEGER(IntKi), PARAMETER :: M1N9FBxi = 1548 + INTEGER(IntKi), PARAMETER :: M2N1FBxi = 1549 + INTEGER(IntKi), PARAMETER :: M2N2FBxi = 1550 + INTEGER(IntKi), PARAMETER :: M2N3FBxi = 1551 + INTEGER(IntKi), PARAMETER :: M2N4FBxi = 1552 + INTEGER(IntKi), PARAMETER :: M2N5FBxi = 1553 + INTEGER(IntKi), PARAMETER :: M2N6FBxi = 1554 + INTEGER(IntKi), PARAMETER :: M2N7FBxi = 1555 + INTEGER(IntKi), PARAMETER :: M2N8FBxi = 1556 + INTEGER(IntKi), PARAMETER :: M2N9FBxi = 1557 + INTEGER(IntKi), PARAMETER :: M3N1FBxi = 1558 + INTEGER(IntKi), PARAMETER :: M3N2FBxi = 1559 + INTEGER(IntKi), PARAMETER :: M3N3FBxi = 1560 + INTEGER(IntKi), PARAMETER :: M3N4FBxi = 1561 + INTEGER(IntKi), PARAMETER :: M3N5FBxi = 1562 + INTEGER(IntKi), PARAMETER :: M3N6FBxi = 1563 + INTEGER(IntKi), PARAMETER :: M3N7FBxi = 1564 + INTEGER(IntKi), PARAMETER :: M3N8FBxi = 1565 + INTEGER(IntKi), PARAMETER :: M3N9FBxi = 1566 + INTEGER(IntKi), PARAMETER :: M4N1FBxi = 1567 + INTEGER(IntKi), PARAMETER :: M4N2FBxi = 1568 + INTEGER(IntKi), PARAMETER :: M4N3FBxi = 1569 + INTEGER(IntKi), PARAMETER :: M4N4FBxi = 1570 + INTEGER(IntKi), PARAMETER :: M4N5FBxi = 1571 + INTEGER(IntKi), PARAMETER :: M4N6FBxi = 1572 + INTEGER(IntKi), PARAMETER :: M4N7FBxi = 1573 + INTEGER(IntKi), PARAMETER :: M4N8FBxi = 1574 + INTEGER(IntKi), PARAMETER :: M4N9FBxi = 1575 + INTEGER(IntKi), PARAMETER :: M5N1FBxi = 1576 + INTEGER(IntKi), PARAMETER :: M5N2FBxi = 1577 + INTEGER(IntKi), PARAMETER :: M5N3FBxi = 1578 + INTEGER(IntKi), PARAMETER :: M5N4FBxi = 1579 + INTEGER(IntKi), PARAMETER :: M5N5FBxi = 1580 + INTEGER(IntKi), PARAMETER :: M5N6FBxi = 1581 + INTEGER(IntKi), PARAMETER :: M5N7FBxi = 1582 + INTEGER(IntKi), PARAMETER :: M5N8FBxi = 1583 + INTEGER(IntKi), PARAMETER :: M5N9FBxi = 1584 + INTEGER(IntKi), PARAMETER :: M6N1FBxi = 1585 + INTEGER(IntKi), PARAMETER :: M6N2FBxi = 1586 + INTEGER(IntKi), PARAMETER :: M6N3FBxi = 1587 + INTEGER(IntKi), PARAMETER :: M6N4FBxi = 1588 + INTEGER(IntKi), PARAMETER :: M6N5FBxi = 1589 + INTEGER(IntKi), PARAMETER :: M6N6FBxi = 1590 + INTEGER(IntKi), PARAMETER :: M6N7FBxi = 1591 + INTEGER(IntKi), PARAMETER :: M6N8FBxi = 1592 + INTEGER(IntKi), PARAMETER :: M6N9FBxi = 1593 + INTEGER(IntKi), PARAMETER :: M7N1FBxi = 1594 + INTEGER(IntKi), PARAMETER :: M7N2FBxi = 1595 + INTEGER(IntKi), PARAMETER :: M7N3FBxi = 1596 + INTEGER(IntKi), PARAMETER :: M7N4FBxi = 1597 + INTEGER(IntKi), PARAMETER :: M7N5FBxi = 1598 + INTEGER(IntKi), PARAMETER :: M7N6FBxi = 1599 + INTEGER(IntKi), PARAMETER :: M7N7FBxi = 1600 + INTEGER(IntKi), PARAMETER :: M7N8FBxi = 1601 + INTEGER(IntKi), PARAMETER :: M7N9FBxi = 1602 + INTEGER(IntKi), PARAMETER :: M8N1FBxi = 1603 + INTEGER(IntKi), PARAMETER :: M8N2FBxi = 1604 + INTEGER(IntKi), PARAMETER :: M8N3FBxi = 1605 + INTEGER(IntKi), PARAMETER :: M8N4FBxi = 1606 + INTEGER(IntKi), PARAMETER :: M8N5FBxi = 1607 + INTEGER(IntKi), PARAMETER :: M8N6FBxi = 1608 + INTEGER(IntKi), PARAMETER :: M8N7FBxi = 1609 + INTEGER(IntKi), PARAMETER :: M8N8FBxi = 1610 + INTEGER(IntKi), PARAMETER :: M8N9FBxi = 1611 + INTEGER(IntKi), PARAMETER :: M9N1FBxi = 1612 + INTEGER(IntKi), PARAMETER :: M9N2FBxi = 1613 + INTEGER(IntKi), PARAMETER :: M9N3FBxi = 1614 + INTEGER(IntKi), PARAMETER :: M9N4FBxi = 1615 + INTEGER(IntKi), PARAMETER :: M9N5FBxi = 1616 + INTEGER(IntKi), PARAMETER :: M9N6FBxi = 1617 + INTEGER(IntKi), PARAMETER :: M9N7FBxi = 1618 + INTEGER(IntKi), PARAMETER :: M9N8FBxi = 1619 + INTEGER(IntKi), PARAMETER :: M9N9FBxi = 1620 + INTEGER(IntKi), PARAMETER :: M1N1FByi = 1621 + INTEGER(IntKi), PARAMETER :: M1N2FByi = 1622 + INTEGER(IntKi), PARAMETER :: M1N3FByi = 1623 + INTEGER(IntKi), PARAMETER :: M1N4FByi = 1624 + INTEGER(IntKi), PARAMETER :: M1N5FByi = 1625 + INTEGER(IntKi), PARAMETER :: M1N6FByi = 1626 + INTEGER(IntKi), PARAMETER :: M1N7FByi = 1627 + INTEGER(IntKi), PARAMETER :: M1N8FByi = 1628 + INTEGER(IntKi), PARAMETER :: M1N9FByi = 1629 + INTEGER(IntKi), PARAMETER :: M2N1FByi = 1630 + INTEGER(IntKi), PARAMETER :: M2N2FByi = 1631 + INTEGER(IntKi), PARAMETER :: M2N3FByi = 1632 + INTEGER(IntKi), PARAMETER :: M2N4FByi = 1633 + INTEGER(IntKi), PARAMETER :: M2N5FByi = 1634 + INTEGER(IntKi), PARAMETER :: M2N6FByi = 1635 + INTEGER(IntKi), PARAMETER :: M2N7FByi = 1636 + INTEGER(IntKi), PARAMETER :: M2N8FByi = 1637 + INTEGER(IntKi), PARAMETER :: M2N9FByi = 1638 + INTEGER(IntKi), PARAMETER :: M3N1FByi = 1639 + INTEGER(IntKi), PARAMETER :: M3N2FByi = 1640 + INTEGER(IntKi), PARAMETER :: M3N3FByi = 1641 + INTEGER(IntKi), PARAMETER :: M3N4FByi = 1642 + INTEGER(IntKi), PARAMETER :: M3N5FByi = 1643 + INTEGER(IntKi), PARAMETER :: M3N6FByi = 1644 + INTEGER(IntKi), PARAMETER :: M3N7FByi = 1645 + INTEGER(IntKi), PARAMETER :: M3N8FByi = 1646 + INTEGER(IntKi), PARAMETER :: M3N9FByi = 1647 + INTEGER(IntKi), PARAMETER :: M4N1FByi = 1648 + INTEGER(IntKi), PARAMETER :: M4N2FByi = 1649 + INTEGER(IntKi), PARAMETER :: M4N3FByi = 1650 + INTEGER(IntKi), PARAMETER :: M4N4FByi = 1651 + INTEGER(IntKi), PARAMETER :: M4N5FByi = 1652 + INTEGER(IntKi), PARAMETER :: M4N6FByi = 1653 + INTEGER(IntKi), PARAMETER :: M4N7FByi = 1654 + INTEGER(IntKi), PARAMETER :: M4N8FByi = 1655 + INTEGER(IntKi), PARAMETER :: M4N9FByi = 1656 + INTEGER(IntKi), PARAMETER :: M5N1FByi = 1657 + INTEGER(IntKi), PARAMETER :: M5N2FByi = 1658 + INTEGER(IntKi), PARAMETER :: M5N3FByi = 1659 + INTEGER(IntKi), PARAMETER :: M5N4FByi = 1660 + INTEGER(IntKi), PARAMETER :: M5N5FByi = 1661 + INTEGER(IntKi), PARAMETER :: M5N6FByi = 1662 + INTEGER(IntKi), PARAMETER :: M5N7FByi = 1663 + INTEGER(IntKi), PARAMETER :: M5N8FByi = 1664 + INTEGER(IntKi), PARAMETER :: M5N9FByi = 1665 + INTEGER(IntKi), PARAMETER :: M6N1FByi = 1666 + INTEGER(IntKi), PARAMETER :: M6N2FByi = 1667 + INTEGER(IntKi), PARAMETER :: M6N3FByi = 1668 + INTEGER(IntKi), PARAMETER :: M6N4FByi = 1669 + INTEGER(IntKi), PARAMETER :: M6N5FByi = 1670 + INTEGER(IntKi), PARAMETER :: M6N6FByi = 1671 + INTEGER(IntKi), PARAMETER :: M6N7FByi = 1672 + INTEGER(IntKi), PARAMETER :: M6N8FByi = 1673 + INTEGER(IntKi), PARAMETER :: M6N9FByi = 1674 + INTEGER(IntKi), PARAMETER :: M7N1FByi = 1675 + INTEGER(IntKi), PARAMETER :: M7N2FByi = 1676 + INTEGER(IntKi), PARAMETER :: M7N3FByi = 1677 + INTEGER(IntKi), PARAMETER :: M7N4FByi = 1678 + INTEGER(IntKi), PARAMETER :: M7N5FByi = 1679 + INTEGER(IntKi), PARAMETER :: M7N6FByi = 1680 + INTEGER(IntKi), PARAMETER :: M7N7FByi = 1681 + INTEGER(IntKi), PARAMETER :: M7N8FByi = 1682 + INTEGER(IntKi), PARAMETER :: M7N9FByi = 1683 + INTEGER(IntKi), PARAMETER :: M8N1FByi = 1684 + INTEGER(IntKi), PARAMETER :: M8N2FByi = 1685 + INTEGER(IntKi), PARAMETER :: M8N3FByi = 1686 + INTEGER(IntKi), PARAMETER :: M8N4FByi = 1687 + INTEGER(IntKi), PARAMETER :: M8N5FByi = 1688 + INTEGER(IntKi), PARAMETER :: M8N6FByi = 1689 + INTEGER(IntKi), PARAMETER :: M8N7FByi = 1690 + INTEGER(IntKi), PARAMETER :: M8N8FByi = 1691 + INTEGER(IntKi), PARAMETER :: M8N9FByi = 1692 + INTEGER(IntKi), PARAMETER :: M9N1FByi = 1693 + INTEGER(IntKi), PARAMETER :: M9N2FByi = 1694 + INTEGER(IntKi), PARAMETER :: M9N3FByi = 1695 + INTEGER(IntKi), PARAMETER :: M9N4FByi = 1696 + INTEGER(IntKi), PARAMETER :: M9N5FByi = 1697 + INTEGER(IntKi), PARAMETER :: M9N6FByi = 1698 + INTEGER(IntKi), PARAMETER :: M9N7FByi = 1699 + INTEGER(IntKi), PARAMETER :: M9N8FByi = 1700 + INTEGER(IntKi), PARAMETER :: M9N9FByi = 1701 + INTEGER(IntKi), PARAMETER :: M1N1FBzi = 1702 + INTEGER(IntKi), PARAMETER :: M1N2FBzi = 1703 + INTEGER(IntKi), PARAMETER :: M1N3FBzi = 1704 + INTEGER(IntKi), PARAMETER :: M1N4FBzi = 1705 + INTEGER(IntKi), PARAMETER :: M1N5FBzi = 1706 + INTEGER(IntKi), PARAMETER :: M1N6FBzi = 1707 + INTEGER(IntKi), PARAMETER :: M1N7FBzi = 1708 + INTEGER(IntKi), PARAMETER :: M1N8FBzi = 1709 + INTEGER(IntKi), PARAMETER :: M1N9FBzi = 1710 + INTEGER(IntKi), PARAMETER :: M2N1FBzi = 1711 + INTEGER(IntKi), PARAMETER :: M2N2FBzi = 1712 + INTEGER(IntKi), PARAMETER :: M2N3FBzi = 1713 + INTEGER(IntKi), PARAMETER :: M2N4FBzi = 1714 + INTEGER(IntKi), PARAMETER :: M2N5FBzi = 1715 + INTEGER(IntKi), PARAMETER :: M2N6FBzi = 1716 + INTEGER(IntKi), PARAMETER :: M2N7FBzi = 1717 + INTEGER(IntKi), PARAMETER :: M2N8FBzi = 1718 + INTEGER(IntKi), PARAMETER :: M2N9FBzi = 1719 + INTEGER(IntKi), PARAMETER :: M3N1FBzi = 1720 + INTEGER(IntKi), PARAMETER :: M3N2FBzi = 1721 + INTEGER(IntKi), PARAMETER :: M3N3FBzi = 1722 + INTEGER(IntKi), PARAMETER :: M3N4FBzi = 1723 + INTEGER(IntKi), PARAMETER :: M3N5FBzi = 1724 + INTEGER(IntKi), PARAMETER :: M3N6FBzi = 1725 + INTEGER(IntKi), PARAMETER :: M3N7FBzi = 1726 + INTEGER(IntKi), PARAMETER :: M3N8FBzi = 1727 + INTEGER(IntKi), PARAMETER :: M3N9FBzi = 1728 + INTEGER(IntKi), PARAMETER :: M4N1FBzi = 1729 + INTEGER(IntKi), PARAMETER :: M4N2FBzi = 1730 + INTEGER(IntKi), PARAMETER :: M4N3FBzi = 1731 + INTEGER(IntKi), PARAMETER :: M4N4FBzi = 1732 + INTEGER(IntKi), PARAMETER :: M4N5FBzi = 1733 + INTEGER(IntKi), PARAMETER :: M4N6FBzi = 1734 + INTEGER(IntKi), PARAMETER :: M4N7FBzi = 1735 + INTEGER(IntKi), PARAMETER :: M4N8FBzi = 1736 + INTEGER(IntKi), PARAMETER :: M4N9FBzi = 1737 + INTEGER(IntKi), PARAMETER :: M5N1FBzi = 1738 + INTEGER(IntKi), PARAMETER :: M5N2FBzi = 1739 + INTEGER(IntKi), PARAMETER :: M5N3FBzi = 1740 + INTEGER(IntKi), PARAMETER :: M5N4FBzi = 1741 + INTEGER(IntKi), PARAMETER :: M5N5FBzi = 1742 + INTEGER(IntKi), PARAMETER :: M5N6FBzi = 1743 + INTEGER(IntKi), PARAMETER :: M5N7FBzi = 1744 + INTEGER(IntKi), PARAMETER :: M5N8FBzi = 1745 + INTEGER(IntKi), PARAMETER :: M5N9FBzi = 1746 + INTEGER(IntKi), PARAMETER :: M6N1FBzi = 1747 + INTEGER(IntKi), PARAMETER :: M6N2FBzi = 1748 + INTEGER(IntKi), PARAMETER :: M6N3FBzi = 1749 + INTEGER(IntKi), PARAMETER :: M6N4FBzi = 1750 + INTEGER(IntKi), PARAMETER :: M6N5FBzi = 1751 + INTEGER(IntKi), PARAMETER :: M6N6FBzi = 1752 + INTEGER(IntKi), PARAMETER :: M6N7FBzi = 1753 + INTEGER(IntKi), PARAMETER :: M6N8FBzi = 1754 + INTEGER(IntKi), PARAMETER :: M6N9FBzi = 1755 + INTEGER(IntKi), PARAMETER :: M7N1FBzi = 1756 + INTEGER(IntKi), PARAMETER :: M7N2FBzi = 1757 + INTEGER(IntKi), PARAMETER :: M7N3FBzi = 1758 + INTEGER(IntKi), PARAMETER :: M7N4FBzi = 1759 + INTEGER(IntKi), PARAMETER :: M7N5FBzi = 1760 + INTEGER(IntKi), PARAMETER :: M7N6FBzi = 1761 + INTEGER(IntKi), PARAMETER :: M7N7FBzi = 1762 + INTEGER(IntKi), PARAMETER :: M7N8FBzi = 1763 + INTEGER(IntKi), PARAMETER :: M7N9FBzi = 1764 + INTEGER(IntKi), PARAMETER :: M8N1FBzi = 1765 + INTEGER(IntKi), PARAMETER :: M8N2FBzi = 1766 + INTEGER(IntKi), PARAMETER :: M8N3FBzi = 1767 + INTEGER(IntKi), PARAMETER :: M8N4FBzi = 1768 + INTEGER(IntKi), PARAMETER :: M8N5FBzi = 1769 + INTEGER(IntKi), PARAMETER :: M8N6FBzi = 1770 + INTEGER(IntKi), PARAMETER :: M8N7FBzi = 1771 + INTEGER(IntKi), PARAMETER :: M8N8FBzi = 1772 + INTEGER(IntKi), PARAMETER :: M8N9FBzi = 1773 + INTEGER(IntKi), PARAMETER :: M9N1FBzi = 1774 + INTEGER(IntKi), PARAMETER :: M9N2FBzi = 1775 + INTEGER(IntKi), PARAMETER :: M9N3FBzi = 1776 + INTEGER(IntKi), PARAMETER :: M9N4FBzi = 1777 + INTEGER(IntKi), PARAMETER :: M9N5FBzi = 1778 + INTEGER(IntKi), PARAMETER :: M9N6FBzi = 1779 + INTEGER(IntKi), PARAMETER :: M9N7FBzi = 1780 + INTEGER(IntKi), PARAMETER :: M9N8FBzi = 1781 + INTEGER(IntKi), PARAMETER :: M9N9FBzi = 1782 + INTEGER(IntKi), PARAMETER :: M1N1MBxi = 1783 + INTEGER(IntKi), PARAMETER :: M1N2MBxi = 1784 + INTEGER(IntKi), PARAMETER :: M1N3MBxi = 1785 + INTEGER(IntKi), PARAMETER :: M1N4MBxi = 1786 + INTEGER(IntKi), PARAMETER :: M1N5MBxi = 1787 + INTEGER(IntKi), PARAMETER :: M1N6MBxi = 1788 + INTEGER(IntKi), PARAMETER :: M1N7MBxi = 1789 + INTEGER(IntKi), PARAMETER :: M1N8MBxi = 1790 + INTEGER(IntKi), PARAMETER :: M1N9MBxi = 1791 + INTEGER(IntKi), PARAMETER :: M2N1MBxi = 1792 + INTEGER(IntKi), PARAMETER :: M2N2MBxi = 1793 + INTEGER(IntKi), PARAMETER :: M2N3MBxi = 1794 + INTEGER(IntKi), PARAMETER :: M2N4MBxi = 1795 + INTEGER(IntKi), PARAMETER :: M2N5MBxi = 1796 + INTEGER(IntKi), PARAMETER :: M2N6MBxi = 1797 + INTEGER(IntKi), PARAMETER :: M2N7MBxi = 1798 + INTEGER(IntKi), PARAMETER :: M2N8MBxi = 1799 + INTEGER(IntKi), PARAMETER :: M2N9MBxi = 1800 + INTEGER(IntKi), PARAMETER :: M3N1MBxi = 1801 + INTEGER(IntKi), PARAMETER :: M3N2MBxi = 1802 + INTEGER(IntKi), PARAMETER :: M3N3MBxi = 1803 + INTEGER(IntKi), PARAMETER :: M3N4MBxi = 1804 + INTEGER(IntKi), PARAMETER :: M3N5MBxi = 1805 + INTEGER(IntKi), PARAMETER :: M3N6MBxi = 1806 + INTEGER(IntKi), PARAMETER :: M3N7MBxi = 1807 + INTEGER(IntKi), PARAMETER :: M3N8MBxi = 1808 + INTEGER(IntKi), PARAMETER :: M3N9MBxi = 1809 + INTEGER(IntKi), PARAMETER :: M4N1MBxi = 1810 + INTEGER(IntKi), PARAMETER :: M4N2MBxi = 1811 + INTEGER(IntKi), PARAMETER :: M4N3MBxi = 1812 + INTEGER(IntKi), PARAMETER :: M4N4MBxi = 1813 + INTEGER(IntKi), PARAMETER :: M4N5MBxi = 1814 + INTEGER(IntKi), PARAMETER :: M4N6MBxi = 1815 + INTEGER(IntKi), PARAMETER :: M4N7MBxi = 1816 + INTEGER(IntKi), PARAMETER :: M4N8MBxi = 1817 + INTEGER(IntKi), PARAMETER :: M4N9MBxi = 1818 + INTEGER(IntKi), PARAMETER :: M5N1MBxi = 1819 + INTEGER(IntKi), PARAMETER :: M5N2MBxi = 1820 + INTEGER(IntKi), PARAMETER :: M5N3MBxi = 1821 + INTEGER(IntKi), PARAMETER :: M5N4MBxi = 1822 + INTEGER(IntKi), PARAMETER :: M5N5MBxi = 1823 + INTEGER(IntKi), PARAMETER :: M5N6MBxi = 1824 + INTEGER(IntKi), PARAMETER :: M5N7MBxi = 1825 + INTEGER(IntKi), PARAMETER :: M5N8MBxi = 1826 + INTEGER(IntKi), PARAMETER :: M5N9MBxi = 1827 + INTEGER(IntKi), PARAMETER :: M6N1MBxi = 1828 + INTEGER(IntKi), PARAMETER :: M6N2MBxi = 1829 + INTEGER(IntKi), PARAMETER :: M6N3MBxi = 1830 + INTEGER(IntKi), PARAMETER :: M6N4MBxi = 1831 + INTEGER(IntKi), PARAMETER :: M6N5MBxi = 1832 + INTEGER(IntKi), PARAMETER :: M6N6MBxi = 1833 + INTEGER(IntKi), PARAMETER :: M6N7MBxi = 1834 + INTEGER(IntKi), PARAMETER :: M6N8MBxi = 1835 + INTEGER(IntKi), PARAMETER :: M6N9MBxi = 1836 + INTEGER(IntKi), PARAMETER :: M7N1MBxi = 1837 + INTEGER(IntKi), PARAMETER :: M7N2MBxi = 1838 + INTEGER(IntKi), PARAMETER :: M7N3MBxi = 1839 + INTEGER(IntKi), PARAMETER :: M7N4MBxi = 1840 + INTEGER(IntKi), PARAMETER :: M7N5MBxi = 1841 + INTEGER(IntKi), PARAMETER :: M7N6MBxi = 1842 + INTEGER(IntKi), PARAMETER :: M7N7MBxi = 1843 + INTEGER(IntKi), PARAMETER :: M7N8MBxi = 1844 + INTEGER(IntKi), PARAMETER :: M7N9MBxi = 1845 + INTEGER(IntKi), PARAMETER :: M8N1MBxi = 1846 + INTEGER(IntKi), PARAMETER :: M8N2MBxi = 1847 + INTEGER(IntKi), PARAMETER :: M8N3MBxi = 1848 + INTEGER(IntKi), PARAMETER :: M8N4MBxi = 1849 + INTEGER(IntKi), PARAMETER :: M8N5MBxi = 1850 + INTEGER(IntKi), PARAMETER :: M8N6MBxi = 1851 + INTEGER(IntKi), PARAMETER :: M8N7MBxi = 1852 + INTEGER(IntKi), PARAMETER :: M8N8MBxi = 1853 + INTEGER(IntKi), PARAMETER :: M8N9MBxi = 1854 + INTEGER(IntKi), PARAMETER :: M9N1MBxi = 1855 + INTEGER(IntKi), PARAMETER :: M9N2MBxi = 1856 + INTEGER(IntKi), PARAMETER :: M9N3MBxi = 1857 + INTEGER(IntKi), PARAMETER :: M9N4MBxi = 1858 + INTEGER(IntKi), PARAMETER :: M9N5MBxi = 1859 + INTEGER(IntKi), PARAMETER :: M9N6MBxi = 1860 + INTEGER(IntKi), PARAMETER :: M9N7MBxi = 1861 + INTEGER(IntKi), PARAMETER :: M9N8MBxi = 1862 + INTEGER(IntKi), PARAMETER :: M9N9MBxi = 1863 + INTEGER(IntKi), PARAMETER :: M1N1MByi = 1864 + INTEGER(IntKi), PARAMETER :: M1N2MByi = 1865 + INTEGER(IntKi), PARAMETER :: M1N3MByi = 1866 + INTEGER(IntKi), PARAMETER :: M1N4MByi = 1867 + INTEGER(IntKi), PARAMETER :: M1N5MByi = 1868 + INTEGER(IntKi), PARAMETER :: M1N6MByi = 1869 + INTEGER(IntKi), PARAMETER :: M1N7MByi = 1870 + INTEGER(IntKi), PARAMETER :: M1N8MByi = 1871 + INTEGER(IntKi), PARAMETER :: M1N9MByi = 1872 + INTEGER(IntKi), PARAMETER :: M2N1MByi = 1873 + INTEGER(IntKi), PARAMETER :: M2N2MByi = 1874 + INTEGER(IntKi), PARAMETER :: M2N3MByi = 1875 + INTEGER(IntKi), PARAMETER :: M2N4MByi = 1876 + INTEGER(IntKi), PARAMETER :: M2N5MByi = 1877 + INTEGER(IntKi), PARAMETER :: M2N6MByi = 1878 + INTEGER(IntKi), PARAMETER :: M2N7MByi = 1879 + INTEGER(IntKi), PARAMETER :: M2N8MByi = 1880 + INTEGER(IntKi), PARAMETER :: M2N9MByi = 1881 + INTEGER(IntKi), PARAMETER :: M3N1MByi = 1882 + INTEGER(IntKi), PARAMETER :: M3N2MByi = 1883 + INTEGER(IntKi), PARAMETER :: M3N3MByi = 1884 + INTEGER(IntKi), PARAMETER :: M3N4MByi = 1885 + INTEGER(IntKi), PARAMETER :: M3N5MByi = 1886 + INTEGER(IntKi), PARAMETER :: M3N6MByi = 1887 + INTEGER(IntKi), PARAMETER :: M3N7MByi = 1888 + INTEGER(IntKi), PARAMETER :: M3N8MByi = 1889 + INTEGER(IntKi), PARAMETER :: M3N9MByi = 1890 + INTEGER(IntKi), PARAMETER :: M4N1MByi = 1891 + INTEGER(IntKi), PARAMETER :: M4N2MByi = 1892 + INTEGER(IntKi), PARAMETER :: M4N3MByi = 1893 + INTEGER(IntKi), PARAMETER :: M4N4MByi = 1894 + INTEGER(IntKi), PARAMETER :: M4N5MByi = 1895 + INTEGER(IntKi), PARAMETER :: M4N6MByi = 1896 + INTEGER(IntKi), PARAMETER :: M4N7MByi = 1897 + INTEGER(IntKi), PARAMETER :: M4N8MByi = 1898 + INTEGER(IntKi), PARAMETER :: M4N9MByi = 1899 + INTEGER(IntKi), PARAMETER :: M5N1MByi = 1900 + INTEGER(IntKi), PARAMETER :: M5N2MByi = 1901 + INTEGER(IntKi), PARAMETER :: M5N3MByi = 1902 + INTEGER(IntKi), PARAMETER :: M5N4MByi = 1903 + INTEGER(IntKi), PARAMETER :: M5N5MByi = 1904 + INTEGER(IntKi), PARAMETER :: M5N6MByi = 1905 + INTEGER(IntKi), PARAMETER :: M5N7MByi = 1906 + INTEGER(IntKi), PARAMETER :: M5N8MByi = 1907 + INTEGER(IntKi), PARAMETER :: M5N9MByi = 1908 + INTEGER(IntKi), PARAMETER :: M6N1MByi = 1909 + INTEGER(IntKi), PARAMETER :: M6N2MByi = 1910 + INTEGER(IntKi), PARAMETER :: M6N3MByi = 1911 + INTEGER(IntKi), PARAMETER :: M6N4MByi = 1912 + INTEGER(IntKi), PARAMETER :: M6N5MByi = 1913 + INTEGER(IntKi), PARAMETER :: M6N6MByi = 1914 + INTEGER(IntKi), PARAMETER :: M6N7MByi = 1915 + INTEGER(IntKi), PARAMETER :: M6N8MByi = 1916 + INTEGER(IntKi), PARAMETER :: M6N9MByi = 1917 + INTEGER(IntKi), PARAMETER :: M7N1MByi = 1918 + INTEGER(IntKi), PARAMETER :: M7N2MByi = 1919 + INTEGER(IntKi), PARAMETER :: M7N3MByi = 1920 + INTEGER(IntKi), PARAMETER :: M7N4MByi = 1921 + INTEGER(IntKi), PARAMETER :: M7N5MByi = 1922 + INTEGER(IntKi), PARAMETER :: M7N6MByi = 1923 + INTEGER(IntKi), PARAMETER :: M7N7MByi = 1924 + INTEGER(IntKi), PARAMETER :: M7N8MByi = 1925 + INTEGER(IntKi), PARAMETER :: M7N9MByi = 1926 + INTEGER(IntKi), PARAMETER :: M8N1MByi = 1927 + INTEGER(IntKi), PARAMETER :: M8N2MByi = 1928 + INTEGER(IntKi), PARAMETER :: M8N3MByi = 1929 + INTEGER(IntKi), PARAMETER :: M8N4MByi = 1930 + INTEGER(IntKi), PARAMETER :: M8N5MByi = 1931 + INTEGER(IntKi), PARAMETER :: M8N6MByi = 1932 + INTEGER(IntKi), PARAMETER :: M8N7MByi = 1933 + INTEGER(IntKi), PARAMETER :: M8N8MByi = 1934 + INTEGER(IntKi), PARAMETER :: M8N9MByi = 1935 + INTEGER(IntKi), PARAMETER :: M9N1MByi = 1936 + INTEGER(IntKi), PARAMETER :: M9N2MByi = 1937 + INTEGER(IntKi), PARAMETER :: M9N3MByi = 1938 + INTEGER(IntKi), PARAMETER :: M9N4MByi = 1939 + INTEGER(IntKi), PARAMETER :: M9N5MByi = 1940 + INTEGER(IntKi), PARAMETER :: M9N6MByi = 1941 + INTEGER(IntKi), PARAMETER :: M9N7MByi = 1942 + INTEGER(IntKi), PARAMETER :: M9N8MByi = 1943 + INTEGER(IntKi), PARAMETER :: M9N9MByi = 1944 + INTEGER(IntKi), PARAMETER :: M1N1MBzi = 1945 + INTEGER(IntKi), PARAMETER :: M1N2MBzi = 1946 + INTEGER(IntKi), PARAMETER :: M1N3MBzi = 1947 + INTEGER(IntKi), PARAMETER :: M1N4MBzi = 1948 + INTEGER(IntKi), PARAMETER :: M1N5MBzi = 1949 + INTEGER(IntKi), PARAMETER :: M1N6MBzi = 1950 + INTEGER(IntKi), PARAMETER :: M1N7MBzi = 1951 + INTEGER(IntKi), PARAMETER :: M1N8MBzi = 1952 + INTEGER(IntKi), PARAMETER :: M1N9MBzi = 1953 + INTEGER(IntKi), PARAMETER :: M2N1MBzi = 1954 + INTEGER(IntKi), PARAMETER :: M2N2MBzi = 1955 + INTEGER(IntKi), PARAMETER :: M2N3MBzi = 1956 + INTEGER(IntKi), PARAMETER :: M2N4MBzi = 1957 + INTEGER(IntKi), PARAMETER :: M2N5MBzi = 1958 + INTEGER(IntKi), PARAMETER :: M2N6MBzi = 1959 + INTEGER(IntKi), PARAMETER :: M2N7MBzi = 1960 + INTEGER(IntKi), PARAMETER :: M2N8MBzi = 1961 + INTEGER(IntKi), PARAMETER :: M2N9MBzi = 1962 + INTEGER(IntKi), PARAMETER :: M3N1MBzi = 1963 + INTEGER(IntKi), PARAMETER :: M3N2MBzi = 1964 + INTEGER(IntKi), PARAMETER :: M3N3MBzi = 1965 + INTEGER(IntKi), PARAMETER :: M3N4MBzi = 1966 + INTEGER(IntKi), PARAMETER :: M3N5MBzi = 1967 + INTEGER(IntKi), PARAMETER :: M3N6MBzi = 1968 + INTEGER(IntKi), PARAMETER :: M3N7MBzi = 1969 + INTEGER(IntKi), PARAMETER :: M3N8MBzi = 1970 + INTEGER(IntKi), PARAMETER :: M3N9MBzi = 1971 + INTEGER(IntKi), PARAMETER :: M4N1MBzi = 1972 + INTEGER(IntKi), PARAMETER :: M4N2MBzi = 1973 + INTEGER(IntKi), PARAMETER :: M4N3MBzi = 1974 + INTEGER(IntKi), PARAMETER :: M4N4MBzi = 1975 + INTEGER(IntKi), PARAMETER :: M4N5MBzi = 1976 + INTEGER(IntKi), PARAMETER :: M4N6MBzi = 1977 + INTEGER(IntKi), PARAMETER :: M4N7MBzi = 1978 + INTEGER(IntKi), PARAMETER :: M4N8MBzi = 1979 + INTEGER(IntKi), PARAMETER :: M4N9MBzi = 1980 + INTEGER(IntKi), PARAMETER :: M5N1MBzi = 1981 + INTEGER(IntKi), PARAMETER :: M5N2MBzi = 1982 + INTEGER(IntKi), PARAMETER :: M5N3MBzi = 1983 + INTEGER(IntKi), PARAMETER :: M5N4MBzi = 1984 + INTEGER(IntKi), PARAMETER :: M5N5MBzi = 1985 + INTEGER(IntKi), PARAMETER :: M5N6MBzi = 1986 + INTEGER(IntKi), PARAMETER :: M5N7MBzi = 1987 + INTEGER(IntKi), PARAMETER :: M5N8MBzi = 1988 + INTEGER(IntKi), PARAMETER :: M5N9MBzi = 1989 + INTEGER(IntKi), PARAMETER :: M6N1MBzi = 1990 + INTEGER(IntKi), PARAMETER :: M6N2MBzi = 1991 + INTEGER(IntKi), PARAMETER :: M6N3MBzi = 1992 + INTEGER(IntKi), PARAMETER :: M6N4MBzi = 1993 + INTEGER(IntKi), PARAMETER :: M6N5MBzi = 1994 + INTEGER(IntKi), PARAMETER :: M6N6MBzi = 1995 + INTEGER(IntKi), PARAMETER :: M6N7MBzi = 1996 + INTEGER(IntKi), PARAMETER :: M6N8MBzi = 1997 + INTEGER(IntKi), PARAMETER :: M6N9MBzi = 1998 + INTEGER(IntKi), PARAMETER :: M7N1MBzi = 1999 + INTEGER(IntKi), PARAMETER :: M7N2MBzi = 2000 + INTEGER(IntKi), PARAMETER :: M7N3MBzi = 2001 + INTEGER(IntKi), PARAMETER :: M7N4MBzi = 2002 + INTEGER(IntKi), PARAMETER :: M7N5MBzi = 2003 + INTEGER(IntKi), PARAMETER :: M7N6MBzi = 2004 + INTEGER(IntKi), PARAMETER :: M7N7MBzi = 2005 + INTEGER(IntKi), PARAMETER :: M7N8MBzi = 2006 + INTEGER(IntKi), PARAMETER :: M7N9MBzi = 2007 + INTEGER(IntKi), PARAMETER :: M8N1MBzi = 2008 + INTEGER(IntKi), PARAMETER :: M8N2MBzi = 2009 + INTEGER(IntKi), PARAMETER :: M8N3MBzi = 2010 + INTEGER(IntKi), PARAMETER :: M8N4MBzi = 2011 + INTEGER(IntKi), PARAMETER :: M8N5MBzi = 2012 + INTEGER(IntKi), PARAMETER :: M8N6MBzi = 2013 + INTEGER(IntKi), PARAMETER :: M8N7MBzi = 2014 + INTEGER(IntKi), PARAMETER :: M8N8MBzi = 2015 + INTEGER(IntKi), PARAMETER :: M8N9MBzi = 2016 + INTEGER(IntKi), PARAMETER :: M9N1MBzi = 2017 + INTEGER(IntKi), PARAMETER :: M9N2MBzi = 2018 + INTEGER(IntKi), PARAMETER :: M9N3MBzi = 2019 + INTEGER(IntKi), PARAMETER :: M9N4MBzi = 2020 + INTEGER(IntKi), PARAMETER :: M9N5MBzi = 2021 + INTEGER(IntKi), PARAMETER :: M9N6MBzi = 2022 + INTEGER(IntKi), PARAMETER :: M9N7MBzi = 2023 + INTEGER(IntKi), PARAMETER :: M9N8MBzi = 2024 + INTEGER(IntKi), PARAMETER :: M9N9MBzi = 2025 + INTEGER(IntKi), PARAMETER :: M1N1FBFxi = 2026 + INTEGER(IntKi), PARAMETER :: M1N2FBFxi = 2027 + INTEGER(IntKi), PARAMETER :: M1N3FBFxi = 2028 + INTEGER(IntKi), PARAMETER :: M1N4FBFxi = 2029 + INTEGER(IntKi), PARAMETER :: M1N5FBFxi = 2030 + INTEGER(IntKi), PARAMETER :: M1N6FBFxi = 2031 + INTEGER(IntKi), PARAMETER :: M1N7FBFxi = 2032 + INTEGER(IntKi), PARAMETER :: M1N8FBFxi = 2033 + INTEGER(IntKi), PARAMETER :: M1N9FBFxi = 2034 + INTEGER(IntKi), PARAMETER :: M2N1FBFxi = 2035 + INTEGER(IntKi), PARAMETER :: M2N2FBFxi = 2036 + INTEGER(IntKi), PARAMETER :: M2N3FBFxi = 2037 + INTEGER(IntKi), PARAMETER :: M2N4FBFxi = 2038 + INTEGER(IntKi), PARAMETER :: M2N5FBFxi = 2039 + INTEGER(IntKi), PARAMETER :: M2N6FBFxi = 2040 + INTEGER(IntKi), PARAMETER :: M2N7FBFxi = 2041 + INTEGER(IntKi), PARAMETER :: M2N8FBFxi = 2042 + INTEGER(IntKi), PARAMETER :: M2N9FBFxi = 2043 + INTEGER(IntKi), PARAMETER :: M3N1FBFxi = 2044 + INTEGER(IntKi), PARAMETER :: M3N2FBFxi = 2045 + INTEGER(IntKi), PARAMETER :: M3N3FBFxi = 2046 + INTEGER(IntKi), PARAMETER :: M3N4FBFxi = 2047 + INTEGER(IntKi), PARAMETER :: M3N5FBFxi = 2048 + INTEGER(IntKi), PARAMETER :: M3N6FBFxi = 2049 + INTEGER(IntKi), PARAMETER :: M3N7FBFxi = 2050 + INTEGER(IntKi), PARAMETER :: M3N8FBFxi = 2051 + INTEGER(IntKi), PARAMETER :: M3N9FBFxi = 2052 + INTEGER(IntKi), PARAMETER :: M4N1FBFxi = 2053 + INTEGER(IntKi), PARAMETER :: M4N2FBFxi = 2054 + INTEGER(IntKi), PARAMETER :: M4N3FBFxi = 2055 + INTEGER(IntKi), PARAMETER :: M4N4FBFxi = 2056 + INTEGER(IntKi), PARAMETER :: M4N5FBFxi = 2057 + INTEGER(IntKi), PARAMETER :: M4N6FBFxi = 2058 + INTEGER(IntKi), PARAMETER :: M4N7FBFxi = 2059 + INTEGER(IntKi), PARAMETER :: M4N8FBFxi = 2060 + INTEGER(IntKi), PARAMETER :: M4N9FBFxi = 2061 + INTEGER(IntKi), PARAMETER :: M5N1FBFxi = 2062 + INTEGER(IntKi), PARAMETER :: M5N2FBFxi = 2063 + INTEGER(IntKi), PARAMETER :: M5N3FBFxi = 2064 + INTEGER(IntKi), PARAMETER :: M5N4FBFxi = 2065 + INTEGER(IntKi), PARAMETER :: M5N5FBFxi = 2066 + INTEGER(IntKi), PARAMETER :: M5N6FBFxi = 2067 + INTEGER(IntKi), PARAMETER :: M5N7FBFxi = 2068 + INTEGER(IntKi), PARAMETER :: M5N8FBFxi = 2069 + INTEGER(IntKi), PARAMETER :: M5N9FBFxi = 2070 + INTEGER(IntKi), PARAMETER :: M6N1FBFxi = 2071 + INTEGER(IntKi), PARAMETER :: M6N2FBFxi = 2072 + INTEGER(IntKi), PARAMETER :: M6N3FBFxi = 2073 + INTEGER(IntKi), PARAMETER :: M6N4FBFxi = 2074 + INTEGER(IntKi), PARAMETER :: M6N5FBFxi = 2075 + INTEGER(IntKi), PARAMETER :: M6N6FBFxi = 2076 + INTEGER(IntKi), PARAMETER :: M6N7FBFxi = 2077 + INTEGER(IntKi), PARAMETER :: M6N8FBFxi = 2078 + INTEGER(IntKi), PARAMETER :: M6N9FBFxi = 2079 + INTEGER(IntKi), PARAMETER :: M7N1FBFxi = 2080 + INTEGER(IntKi), PARAMETER :: M7N2FBFxi = 2081 + INTEGER(IntKi), PARAMETER :: M7N3FBFxi = 2082 + INTEGER(IntKi), PARAMETER :: M7N4FBFxi = 2083 + INTEGER(IntKi), PARAMETER :: M7N5FBFxi = 2084 + INTEGER(IntKi), PARAMETER :: M7N6FBFxi = 2085 + INTEGER(IntKi), PARAMETER :: M7N7FBFxi = 2086 + INTEGER(IntKi), PARAMETER :: M7N8FBFxi = 2087 + INTEGER(IntKi), PARAMETER :: M7N9FBFxi = 2088 + INTEGER(IntKi), PARAMETER :: M8N1FBFxi = 2089 + INTEGER(IntKi), PARAMETER :: M8N2FBFxi = 2090 + INTEGER(IntKi), PARAMETER :: M8N3FBFxi = 2091 + INTEGER(IntKi), PARAMETER :: M8N4FBFxi = 2092 + INTEGER(IntKi), PARAMETER :: M8N5FBFxi = 2093 + INTEGER(IntKi), PARAMETER :: M8N6FBFxi = 2094 + INTEGER(IntKi), PARAMETER :: M8N7FBFxi = 2095 + INTEGER(IntKi), PARAMETER :: M8N8FBFxi = 2096 + INTEGER(IntKi), PARAMETER :: M8N9FBFxi = 2097 + INTEGER(IntKi), PARAMETER :: M9N1FBFxi = 2098 + INTEGER(IntKi), PARAMETER :: M9N2FBFxi = 2099 + INTEGER(IntKi), PARAMETER :: M9N3FBFxi = 2100 + INTEGER(IntKi), PARAMETER :: M9N4FBFxi = 2101 + INTEGER(IntKi), PARAMETER :: M9N5FBFxi = 2102 + INTEGER(IntKi), PARAMETER :: M9N6FBFxi = 2103 + INTEGER(IntKi), PARAMETER :: M9N7FBFxi = 2104 + INTEGER(IntKi), PARAMETER :: M9N8FBFxi = 2105 + INTEGER(IntKi), PARAMETER :: M9N9FBFxi = 2106 + INTEGER(IntKi), PARAMETER :: M1N1FBFyi = 2107 + INTEGER(IntKi), PARAMETER :: M1N2FBFyi = 2108 + INTEGER(IntKi), PARAMETER :: M1N3FBFyi = 2109 + INTEGER(IntKi), PARAMETER :: M1N4FBFyi = 2110 + INTEGER(IntKi), PARAMETER :: M1N5FBFyi = 2111 + INTEGER(IntKi), PARAMETER :: M1N6FBFyi = 2112 + INTEGER(IntKi), PARAMETER :: M1N7FBFyi = 2113 + INTEGER(IntKi), PARAMETER :: M1N8FBFyi = 2114 + INTEGER(IntKi), PARAMETER :: M1N9FBFyi = 2115 + INTEGER(IntKi), PARAMETER :: M2N1FBFyi = 2116 + INTEGER(IntKi), PARAMETER :: M2N2FBFyi = 2117 + INTEGER(IntKi), PARAMETER :: M2N3FBFyi = 2118 + INTEGER(IntKi), PARAMETER :: M2N4FBFyi = 2119 + INTEGER(IntKi), PARAMETER :: M2N5FBFyi = 2120 + INTEGER(IntKi), PARAMETER :: M2N6FBFyi = 2121 + INTEGER(IntKi), PARAMETER :: M2N7FBFyi = 2122 + INTEGER(IntKi), PARAMETER :: M2N8FBFyi = 2123 + INTEGER(IntKi), PARAMETER :: M2N9FBFyi = 2124 + INTEGER(IntKi), PARAMETER :: M3N1FBFyi = 2125 + INTEGER(IntKi), PARAMETER :: M3N2FBFyi = 2126 + INTEGER(IntKi), PARAMETER :: M3N3FBFyi = 2127 + INTEGER(IntKi), PARAMETER :: M3N4FBFyi = 2128 + INTEGER(IntKi), PARAMETER :: M3N5FBFyi = 2129 + INTEGER(IntKi), PARAMETER :: M3N6FBFyi = 2130 + INTEGER(IntKi), PARAMETER :: M3N7FBFyi = 2131 + INTEGER(IntKi), PARAMETER :: M3N8FBFyi = 2132 + INTEGER(IntKi), PARAMETER :: M3N9FBFyi = 2133 + INTEGER(IntKi), PARAMETER :: M4N1FBFyi = 2134 + INTEGER(IntKi), PARAMETER :: M4N2FBFyi = 2135 + INTEGER(IntKi), PARAMETER :: M4N3FBFyi = 2136 + INTEGER(IntKi), PARAMETER :: M4N4FBFyi = 2137 + INTEGER(IntKi), PARAMETER :: M4N5FBFyi = 2138 + INTEGER(IntKi), PARAMETER :: M4N6FBFyi = 2139 + INTEGER(IntKi), PARAMETER :: M4N7FBFyi = 2140 + INTEGER(IntKi), PARAMETER :: M4N8FBFyi = 2141 + INTEGER(IntKi), PARAMETER :: M4N9FBFyi = 2142 + INTEGER(IntKi), PARAMETER :: M5N1FBFyi = 2143 + INTEGER(IntKi), PARAMETER :: M5N2FBFyi = 2144 + INTEGER(IntKi), PARAMETER :: M5N3FBFyi = 2145 + INTEGER(IntKi), PARAMETER :: M5N4FBFyi = 2146 + INTEGER(IntKi), PARAMETER :: M5N5FBFyi = 2147 + INTEGER(IntKi), PARAMETER :: M5N6FBFyi = 2148 + INTEGER(IntKi), PARAMETER :: M5N7FBFyi = 2149 + INTEGER(IntKi), PARAMETER :: M5N8FBFyi = 2150 + INTEGER(IntKi), PARAMETER :: M5N9FBFyi = 2151 + INTEGER(IntKi), PARAMETER :: M6N1FBFyi = 2152 + INTEGER(IntKi), PARAMETER :: M6N2FBFyi = 2153 + INTEGER(IntKi), PARAMETER :: M6N3FBFyi = 2154 + INTEGER(IntKi), PARAMETER :: M6N4FBFyi = 2155 + INTEGER(IntKi), PARAMETER :: M6N5FBFyi = 2156 + INTEGER(IntKi), PARAMETER :: M6N6FBFyi = 2157 + INTEGER(IntKi), PARAMETER :: M6N7FBFyi = 2158 + INTEGER(IntKi), PARAMETER :: M6N8FBFyi = 2159 + INTEGER(IntKi), PARAMETER :: M6N9FBFyi = 2160 + INTEGER(IntKi), PARAMETER :: M7N1FBFyi = 2161 + INTEGER(IntKi), PARAMETER :: M7N2FBFyi = 2162 + INTEGER(IntKi), PARAMETER :: M7N3FBFyi = 2163 + INTEGER(IntKi), PARAMETER :: M7N4FBFyi = 2164 + INTEGER(IntKi), PARAMETER :: M7N5FBFyi = 2165 + INTEGER(IntKi), PARAMETER :: M7N6FBFyi = 2166 + INTEGER(IntKi), PARAMETER :: M7N7FBFyi = 2167 + INTEGER(IntKi), PARAMETER :: M7N8FBFyi = 2168 + INTEGER(IntKi), PARAMETER :: M7N9FBFyi = 2169 + INTEGER(IntKi), PARAMETER :: M8N1FBFyi = 2170 + INTEGER(IntKi), PARAMETER :: M8N2FBFyi = 2171 + INTEGER(IntKi), PARAMETER :: M8N3FBFyi = 2172 + INTEGER(IntKi), PARAMETER :: M8N4FBFyi = 2173 + INTEGER(IntKi), PARAMETER :: M8N5FBFyi = 2174 + INTEGER(IntKi), PARAMETER :: M8N6FBFyi = 2175 + INTEGER(IntKi), PARAMETER :: M8N7FBFyi = 2176 + INTEGER(IntKi), PARAMETER :: M8N8FBFyi = 2177 + INTEGER(IntKi), PARAMETER :: M8N9FBFyi = 2178 + INTEGER(IntKi), PARAMETER :: M9N1FBFyi = 2179 + INTEGER(IntKi), PARAMETER :: M9N2FBFyi = 2180 + INTEGER(IntKi), PARAMETER :: M9N3FBFyi = 2181 + INTEGER(IntKi), PARAMETER :: M9N4FBFyi = 2182 + INTEGER(IntKi), PARAMETER :: M9N5FBFyi = 2183 + INTEGER(IntKi), PARAMETER :: M9N6FBFyi = 2184 + INTEGER(IntKi), PARAMETER :: M9N7FBFyi = 2185 + INTEGER(IntKi), PARAMETER :: M9N8FBFyi = 2186 + INTEGER(IntKi), PARAMETER :: M9N9FBFyi = 2187 + INTEGER(IntKi), PARAMETER :: M1N1FBFzi = 2188 + INTEGER(IntKi), PARAMETER :: M1N2FBFzi = 2189 + INTEGER(IntKi), PARAMETER :: M1N3FBFzi = 2190 + INTEGER(IntKi), PARAMETER :: M1N4FBFzi = 2191 + INTEGER(IntKi), PARAMETER :: M1N5FBFzi = 2192 + INTEGER(IntKi), PARAMETER :: M1N6FBFzi = 2193 + INTEGER(IntKi), PARAMETER :: M1N7FBFzi = 2194 + INTEGER(IntKi), PARAMETER :: M1N8FBFzi = 2195 + INTEGER(IntKi), PARAMETER :: M1N9FBFzi = 2196 + INTEGER(IntKi), PARAMETER :: M2N1FBFzi = 2197 + INTEGER(IntKi), PARAMETER :: M2N2FBFzi = 2198 + INTEGER(IntKi), PARAMETER :: M2N3FBFzi = 2199 + INTEGER(IntKi), PARAMETER :: M2N4FBFzi = 2200 + INTEGER(IntKi), PARAMETER :: M2N5FBFzi = 2201 + INTEGER(IntKi), PARAMETER :: M2N6FBFzi = 2202 + INTEGER(IntKi), PARAMETER :: M2N7FBFzi = 2203 + INTEGER(IntKi), PARAMETER :: M2N8FBFzi = 2204 + INTEGER(IntKi), PARAMETER :: M2N9FBFzi = 2205 + INTEGER(IntKi), PARAMETER :: M3N1FBFzi = 2206 + INTEGER(IntKi), PARAMETER :: M3N2FBFzi = 2207 + INTEGER(IntKi), PARAMETER :: M3N3FBFzi = 2208 + INTEGER(IntKi), PARAMETER :: M3N4FBFzi = 2209 + INTEGER(IntKi), PARAMETER :: M3N5FBFzi = 2210 + INTEGER(IntKi), PARAMETER :: M3N6FBFzi = 2211 + INTEGER(IntKi), PARAMETER :: M3N7FBFzi = 2212 + INTEGER(IntKi), PARAMETER :: M3N8FBFzi = 2213 + INTEGER(IntKi), PARAMETER :: M3N9FBFzi = 2214 + INTEGER(IntKi), PARAMETER :: M4N1FBFzi = 2215 + INTEGER(IntKi), PARAMETER :: M4N2FBFzi = 2216 + INTEGER(IntKi), PARAMETER :: M4N3FBFzi = 2217 + INTEGER(IntKi), PARAMETER :: M4N4FBFzi = 2218 + INTEGER(IntKi), PARAMETER :: M4N5FBFzi = 2219 + INTEGER(IntKi), PARAMETER :: M4N6FBFzi = 2220 + INTEGER(IntKi), PARAMETER :: M4N7FBFzi = 2221 + INTEGER(IntKi), PARAMETER :: M4N8FBFzi = 2222 + INTEGER(IntKi), PARAMETER :: M4N9FBFzi = 2223 + INTEGER(IntKi), PARAMETER :: M5N1FBFzi = 2224 + INTEGER(IntKi), PARAMETER :: M5N2FBFzi = 2225 + INTEGER(IntKi), PARAMETER :: M5N3FBFzi = 2226 + INTEGER(IntKi), PARAMETER :: M5N4FBFzi = 2227 + INTEGER(IntKi), PARAMETER :: M5N5FBFzi = 2228 + INTEGER(IntKi), PARAMETER :: M5N6FBFzi = 2229 + INTEGER(IntKi), PARAMETER :: M5N7FBFzi = 2230 + INTEGER(IntKi), PARAMETER :: M5N8FBFzi = 2231 + INTEGER(IntKi), PARAMETER :: M5N9FBFzi = 2232 + INTEGER(IntKi), PARAMETER :: M6N1FBFzi = 2233 + INTEGER(IntKi), PARAMETER :: M6N2FBFzi = 2234 + INTEGER(IntKi), PARAMETER :: M6N3FBFzi = 2235 + INTEGER(IntKi), PARAMETER :: M6N4FBFzi = 2236 + INTEGER(IntKi), PARAMETER :: M6N5FBFzi = 2237 + INTEGER(IntKi), PARAMETER :: M6N6FBFzi = 2238 + INTEGER(IntKi), PARAMETER :: M6N7FBFzi = 2239 + INTEGER(IntKi), PARAMETER :: M6N8FBFzi = 2240 + INTEGER(IntKi), PARAMETER :: M6N9FBFzi = 2241 + INTEGER(IntKi), PARAMETER :: M7N1FBFzi = 2242 + INTEGER(IntKi), PARAMETER :: M7N2FBFzi = 2243 + INTEGER(IntKi), PARAMETER :: M7N3FBFzi = 2244 + INTEGER(IntKi), PARAMETER :: M7N4FBFzi = 2245 + INTEGER(IntKi), PARAMETER :: M7N5FBFzi = 2246 + INTEGER(IntKi), PARAMETER :: M7N6FBFzi = 2247 + INTEGER(IntKi), PARAMETER :: M7N7FBFzi = 2248 + INTEGER(IntKi), PARAMETER :: M7N8FBFzi = 2249 + INTEGER(IntKi), PARAMETER :: M7N9FBFzi = 2250 + INTEGER(IntKi), PARAMETER :: M8N1FBFzi = 2251 + INTEGER(IntKi), PARAMETER :: M8N2FBFzi = 2252 + INTEGER(IntKi), PARAMETER :: M8N3FBFzi = 2253 + INTEGER(IntKi), PARAMETER :: M8N4FBFzi = 2254 + INTEGER(IntKi), PARAMETER :: M8N5FBFzi = 2255 + INTEGER(IntKi), PARAMETER :: M8N6FBFzi = 2256 + INTEGER(IntKi), PARAMETER :: M8N7FBFzi = 2257 + INTEGER(IntKi), PARAMETER :: M8N8FBFzi = 2258 + INTEGER(IntKi), PARAMETER :: M8N9FBFzi = 2259 + INTEGER(IntKi), PARAMETER :: M9N1FBFzi = 2260 + INTEGER(IntKi), PARAMETER :: M9N2FBFzi = 2261 + INTEGER(IntKi), PARAMETER :: M9N3FBFzi = 2262 + INTEGER(IntKi), PARAMETER :: M9N4FBFzi = 2263 + INTEGER(IntKi), PARAMETER :: M9N5FBFzi = 2264 + INTEGER(IntKi), PARAMETER :: M9N6FBFzi = 2265 + INTEGER(IntKi), PARAMETER :: M9N7FBFzi = 2266 + INTEGER(IntKi), PARAMETER :: M9N8FBFzi = 2267 + INTEGER(IntKi), PARAMETER :: M9N9FBFzi = 2268 + INTEGER(IntKi), PARAMETER :: M1N1MBFxi = 2269 + INTEGER(IntKi), PARAMETER :: M1N2MBFxi = 2270 + INTEGER(IntKi), PARAMETER :: M1N3MBFxi = 2271 + INTEGER(IntKi), PARAMETER :: M1N4MBFxi = 2272 + INTEGER(IntKi), PARAMETER :: M1N5MBFxi = 2273 + INTEGER(IntKi), PARAMETER :: M1N6MBFxi = 2274 + INTEGER(IntKi), PARAMETER :: M1N7MBFxi = 2275 + INTEGER(IntKi), PARAMETER :: M1N8MBFxi = 2276 + INTEGER(IntKi), PARAMETER :: M1N9MBFxi = 2277 + INTEGER(IntKi), PARAMETER :: M2N1MBFxi = 2278 + INTEGER(IntKi), PARAMETER :: M2N2MBFxi = 2279 + INTEGER(IntKi), PARAMETER :: M2N3MBFxi = 2280 + INTEGER(IntKi), PARAMETER :: M2N4MBFxi = 2281 + INTEGER(IntKi), PARAMETER :: M2N5MBFxi = 2282 + INTEGER(IntKi), PARAMETER :: M2N6MBFxi = 2283 + INTEGER(IntKi), PARAMETER :: M2N7MBFxi = 2284 + INTEGER(IntKi), PARAMETER :: M2N8MBFxi = 2285 + INTEGER(IntKi), PARAMETER :: M2N9MBFxi = 2286 + INTEGER(IntKi), PARAMETER :: M3N1MBFxi = 2287 + INTEGER(IntKi), PARAMETER :: M3N2MBFxi = 2288 + INTEGER(IntKi), PARAMETER :: M3N3MBFxi = 2289 + INTEGER(IntKi), PARAMETER :: M3N4MBFxi = 2290 + INTEGER(IntKi), PARAMETER :: M3N5MBFxi = 2291 + INTEGER(IntKi), PARAMETER :: M3N6MBFxi = 2292 + INTEGER(IntKi), PARAMETER :: M3N7MBFxi = 2293 + INTEGER(IntKi), PARAMETER :: M3N8MBFxi = 2294 + INTEGER(IntKi), PARAMETER :: M3N9MBFxi = 2295 + INTEGER(IntKi), PARAMETER :: M4N1MBFxi = 2296 + INTEGER(IntKi), PARAMETER :: M4N2MBFxi = 2297 + INTEGER(IntKi), PARAMETER :: M4N3MBFxi = 2298 + INTEGER(IntKi), PARAMETER :: M4N4MBFxi = 2299 + INTEGER(IntKi), PARAMETER :: M4N5MBFxi = 2300 + INTEGER(IntKi), PARAMETER :: M4N6MBFxi = 2301 + INTEGER(IntKi), PARAMETER :: M4N7MBFxi = 2302 + INTEGER(IntKi), PARAMETER :: M4N8MBFxi = 2303 + INTEGER(IntKi), PARAMETER :: M4N9MBFxi = 2304 + INTEGER(IntKi), PARAMETER :: M5N1MBFxi = 2305 + INTEGER(IntKi), PARAMETER :: M5N2MBFxi = 2306 + INTEGER(IntKi), PARAMETER :: M5N3MBFxi = 2307 + INTEGER(IntKi), PARAMETER :: M5N4MBFxi = 2308 + INTEGER(IntKi), PARAMETER :: M5N5MBFxi = 2309 + INTEGER(IntKi), PARAMETER :: M5N6MBFxi = 2310 + INTEGER(IntKi), PARAMETER :: M5N7MBFxi = 2311 + INTEGER(IntKi), PARAMETER :: M5N8MBFxi = 2312 + INTEGER(IntKi), PARAMETER :: M5N9MBFxi = 2313 + INTEGER(IntKi), PARAMETER :: M6N1MBFxi = 2314 + INTEGER(IntKi), PARAMETER :: M6N2MBFxi = 2315 + INTEGER(IntKi), PARAMETER :: M6N3MBFxi = 2316 + INTEGER(IntKi), PARAMETER :: M6N4MBFxi = 2317 + INTEGER(IntKi), PARAMETER :: M6N5MBFxi = 2318 + INTEGER(IntKi), PARAMETER :: M6N6MBFxi = 2319 + INTEGER(IntKi), PARAMETER :: M6N7MBFxi = 2320 + INTEGER(IntKi), PARAMETER :: M6N8MBFxi = 2321 + INTEGER(IntKi), PARAMETER :: M6N9MBFxi = 2322 + INTEGER(IntKi), PARAMETER :: M7N1MBFxi = 2323 + INTEGER(IntKi), PARAMETER :: M7N2MBFxi = 2324 + INTEGER(IntKi), PARAMETER :: M7N3MBFxi = 2325 + INTEGER(IntKi), PARAMETER :: M7N4MBFxi = 2326 + INTEGER(IntKi), PARAMETER :: M7N5MBFxi = 2327 + INTEGER(IntKi), PARAMETER :: M7N6MBFxi = 2328 + INTEGER(IntKi), PARAMETER :: M7N7MBFxi = 2329 + INTEGER(IntKi), PARAMETER :: M7N8MBFxi = 2330 + INTEGER(IntKi), PARAMETER :: M7N9MBFxi = 2331 + INTEGER(IntKi), PARAMETER :: M8N1MBFxi = 2332 + INTEGER(IntKi), PARAMETER :: M8N2MBFxi = 2333 + INTEGER(IntKi), PARAMETER :: M8N3MBFxi = 2334 + INTEGER(IntKi), PARAMETER :: M8N4MBFxi = 2335 + INTEGER(IntKi), PARAMETER :: M8N5MBFxi = 2336 + INTEGER(IntKi), PARAMETER :: M8N6MBFxi = 2337 + INTEGER(IntKi), PARAMETER :: M8N7MBFxi = 2338 + INTEGER(IntKi), PARAMETER :: M8N8MBFxi = 2339 + INTEGER(IntKi), PARAMETER :: M8N9MBFxi = 2340 + INTEGER(IntKi), PARAMETER :: M9N1MBFxi = 2341 + INTEGER(IntKi), PARAMETER :: M9N2MBFxi = 2342 + INTEGER(IntKi), PARAMETER :: M9N3MBFxi = 2343 + INTEGER(IntKi), PARAMETER :: M9N4MBFxi = 2344 + INTEGER(IntKi), PARAMETER :: M9N5MBFxi = 2345 + INTEGER(IntKi), PARAMETER :: M9N6MBFxi = 2346 + INTEGER(IntKi), PARAMETER :: M9N7MBFxi = 2347 + INTEGER(IntKi), PARAMETER :: M9N8MBFxi = 2348 + INTEGER(IntKi), PARAMETER :: M9N9MBFxi = 2349 + INTEGER(IntKi), PARAMETER :: M1N1MBFyi = 2350 + INTEGER(IntKi), PARAMETER :: M1N2MBFyi = 2351 + INTEGER(IntKi), PARAMETER :: M1N3MBFyi = 2352 + INTEGER(IntKi), PARAMETER :: M1N4MBFyi = 2353 + INTEGER(IntKi), PARAMETER :: M1N5MBFyi = 2354 + INTEGER(IntKi), PARAMETER :: M1N6MBFyi = 2355 + INTEGER(IntKi), PARAMETER :: M1N7MBFyi = 2356 + INTEGER(IntKi), PARAMETER :: M1N8MBFyi = 2357 + INTEGER(IntKi), PARAMETER :: M1N9MBFyi = 2358 + INTEGER(IntKi), PARAMETER :: M2N1MBFyi = 2359 + INTEGER(IntKi), PARAMETER :: M2N2MBFyi = 2360 + INTEGER(IntKi), PARAMETER :: M2N3MBFyi = 2361 + INTEGER(IntKi), PARAMETER :: M2N4MBFyi = 2362 + INTEGER(IntKi), PARAMETER :: M2N5MBFyi = 2363 + INTEGER(IntKi), PARAMETER :: M2N6MBFyi = 2364 + INTEGER(IntKi), PARAMETER :: M2N7MBFyi = 2365 + INTEGER(IntKi), PARAMETER :: M2N8MBFyi = 2366 + INTEGER(IntKi), PARAMETER :: M2N9MBFyi = 2367 + INTEGER(IntKi), PARAMETER :: M3N1MBFyi = 2368 + INTEGER(IntKi), PARAMETER :: M3N2MBFyi = 2369 + INTEGER(IntKi), PARAMETER :: M3N3MBFyi = 2370 + INTEGER(IntKi), PARAMETER :: M3N4MBFyi = 2371 + INTEGER(IntKi), PARAMETER :: M3N5MBFyi = 2372 + INTEGER(IntKi), PARAMETER :: M3N6MBFyi = 2373 + INTEGER(IntKi), PARAMETER :: M3N7MBFyi = 2374 + INTEGER(IntKi), PARAMETER :: M3N8MBFyi = 2375 + INTEGER(IntKi), PARAMETER :: M3N9MBFyi = 2376 + INTEGER(IntKi), PARAMETER :: M4N1MBFyi = 2377 + INTEGER(IntKi), PARAMETER :: M4N2MBFyi = 2378 + INTEGER(IntKi), PARAMETER :: M4N3MBFyi = 2379 + INTEGER(IntKi), PARAMETER :: M4N4MBFyi = 2380 + INTEGER(IntKi), PARAMETER :: M4N5MBFyi = 2381 + INTEGER(IntKi), PARAMETER :: M4N6MBFyi = 2382 + INTEGER(IntKi), PARAMETER :: M4N7MBFyi = 2383 + INTEGER(IntKi), PARAMETER :: M4N8MBFyi = 2384 + INTEGER(IntKi), PARAMETER :: M4N9MBFyi = 2385 + INTEGER(IntKi), PARAMETER :: M5N1MBFyi = 2386 + INTEGER(IntKi), PARAMETER :: M5N2MBFyi = 2387 + INTEGER(IntKi), PARAMETER :: M5N3MBFyi = 2388 + INTEGER(IntKi), PARAMETER :: M5N4MBFyi = 2389 + INTEGER(IntKi), PARAMETER :: M5N5MBFyi = 2390 + INTEGER(IntKi), PARAMETER :: M5N6MBFyi = 2391 + INTEGER(IntKi), PARAMETER :: M5N7MBFyi = 2392 + INTEGER(IntKi), PARAMETER :: M5N8MBFyi = 2393 + INTEGER(IntKi), PARAMETER :: M5N9MBFyi = 2394 + INTEGER(IntKi), PARAMETER :: M6N1MBFyi = 2395 + INTEGER(IntKi), PARAMETER :: M6N2MBFyi = 2396 + INTEGER(IntKi), PARAMETER :: M6N3MBFyi = 2397 + INTEGER(IntKi), PARAMETER :: M6N4MBFyi = 2398 + INTEGER(IntKi), PARAMETER :: M6N5MBFyi = 2399 + INTEGER(IntKi), PARAMETER :: M6N6MBFyi = 2400 + INTEGER(IntKi), PARAMETER :: M6N7MBFyi = 2401 + INTEGER(IntKi), PARAMETER :: M6N8MBFyi = 2402 + INTEGER(IntKi), PARAMETER :: M6N9MBFyi = 2403 + INTEGER(IntKi), PARAMETER :: M7N1MBFyi = 2404 + INTEGER(IntKi), PARAMETER :: M7N2MBFyi = 2405 + INTEGER(IntKi), PARAMETER :: M7N3MBFyi = 2406 + INTEGER(IntKi), PARAMETER :: M7N4MBFyi = 2407 + INTEGER(IntKi), PARAMETER :: M7N5MBFyi = 2408 + INTEGER(IntKi), PARAMETER :: M7N6MBFyi = 2409 + INTEGER(IntKi), PARAMETER :: M7N7MBFyi = 2410 + INTEGER(IntKi), PARAMETER :: M7N8MBFyi = 2411 + INTEGER(IntKi), PARAMETER :: M7N9MBFyi = 2412 + INTEGER(IntKi), PARAMETER :: M8N1MBFyi = 2413 + INTEGER(IntKi), PARAMETER :: M8N2MBFyi = 2414 + INTEGER(IntKi), PARAMETER :: M8N3MBFyi = 2415 + INTEGER(IntKi), PARAMETER :: M8N4MBFyi = 2416 + INTEGER(IntKi), PARAMETER :: M8N5MBFyi = 2417 + INTEGER(IntKi), PARAMETER :: M8N6MBFyi = 2418 + INTEGER(IntKi), PARAMETER :: M8N7MBFyi = 2419 + INTEGER(IntKi), PARAMETER :: M8N8MBFyi = 2420 + INTEGER(IntKi), PARAMETER :: M8N9MBFyi = 2421 + INTEGER(IntKi), PARAMETER :: M9N1MBFyi = 2422 + INTEGER(IntKi), PARAMETER :: M9N2MBFyi = 2423 + INTEGER(IntKi), PARAMETER :: M9N3MBFyi = 2424 + INTEGER(IntKi), PARAMETER :: M9N4MBFyi = 2425 + INTEGER(IntKi), PARAMETER :: M9N5MBFyi = 2426 + INTEGER(IntKi), PARAMETER :: M9N6MBFyi = 2427 + INTEGER(IntKi), PARAMETER :: M9N7MBFyi = 2428 + INTEGER(IntKi), PARAMETER :: M9N8MBFyi = 2429 + INTEGER(IntKi), PARAMETER :: M9N9MBFyi = 2430 + INTEGER(IntKi), PARAMETER :: M1N1MBFzi = 2431 + INTEGER(IntKi), PARAMETER :: M1N2MBFzi = 2432 + INTEGER(IntKi), PARAMETER :: M1N3MBFzi = 2433 + INTEGER(IntKi), PARAMETER :: M1N4MBFzi = 2434 + INTEGER(IntKi), PARAMETER :: M1N5MBFzi = 2435 + INTEGER(IntKi), PARAMETER :: M1N6MBFzi = 2436 + INTEGER(IntKi), PARAMETER :: M1N7MBFzi = 2437 + INTEGER(IntKi), PARAMETER :: M1N8MBFzi = 2438 + INTEGER(IntKi), PARAMETER :: M1N9MBFzi = 2439 + INTEGER(IntKi), PARAMETER :: M2N1MBFzi = 2440 + INTEGER(IntKi), PARAMETER :: M2N2MBFzi = 2441 + INTEGER(IntKi), PARAMETER :: M2N3MBFzi = 2442 + INTEGER(IntKi), PARAMETER :: M2N4MBFzi = 2443 + INTEGER(IntKi), PARAMETER :: M2N5MBFzi = 2444 + INTEGER(IntKi), PARAMETER :: M2N6MBFzi = 2445 + INTEGER(IntKi), PARAMETER :: M2N7MBFzi = 2446 + INTEGER(IntKi), PARAMETER :: M2N8MBFzi = 2447 + INTEGER(IntKi), PARAMETER :: M2N9MBFzi = 2448 + INTEGER(IntKi), PARAMETER :: M3N1MBFzi = 2449 + INTEGER(IntKi), PARAMETER :: M3N2MBFzi = 2450 + INTEGER(IntKi), PARAMETER :: M3N3MBFzi = 2451 + INTEGER(IntKi), PARAMETER :: M3N4MBFzi = 2452 + INTEGER(IntKi), PARAMETER :: M3N5MBFzi = 2453 + INTEGER(IntKi), PARAMETER :: M3N6MBFzi = 2454 + INTEGER(IntKi), PARAMETER :: M3N7MBFzi = 2455 + INTEGER(IntKi), PARAMETER :: M3N8MBFzi = 2456 + INTEGER(IntKi), PARAMETER :: M3N9MBFzi = 2457 + INTEGER(IntKi), PARAMETER :: M4N1MBFzi = 2458 + INTEGER(IntKi), PARAMETER :: M4N2MBFzi = 2459 + INTEGER(IntKi), PARAMETER :: M4N3MBFzi = 2460 + INTEGER(IntKi), PARAMETER :: M4N4MBFzi = 2461 + INTEGER(IntKi), PARAMETER :: M4N5MBFzi = 2462 + INTEGER(IntKi), PARAMETER :: M4N6MBFzi = 2463 + INTEGER(IntKi), PARAMETER :: M4N7MBFzi = 2464 + INTEGER(IntKi), PARAMETER :: M4N8MBFzi = 2465 + INTEGER(IntKi), PARAMETER :: M4N9MBFzi = 2466 + INTEGER(IntKi), PARAMETER :: M5N1MBFzi = 2467 + INTEGER(IntKi), PARAMETER :: M5N2MBFzi = 2468 + INTEGER(IntKi), PARAMETER :: M5N3MBFzi = 2469 + INTEGER(IntKi), PARAMETER :: M5N4MBFzi = 2470 + INTEGER(IntKi), PARAMETER :: M5N5MBFzi = 2471 + INTEGER(IntKi), PARAMETER :: M5N6MBFzi = 2472 + INTEGER(IntKi), PARAMETER :: M5N7MBFzi = 2473 + INTEGER(IntKi), PARAMETER :: M5N8MBFzi = 2474 + INTEGER(IntKi), PARAMETER :: M5N9MBFzi = 2475 + INTEGER(IntKi), PARAMETER :: M6N1MBFzi = 2476 + INTEGER(IntKi), PARAMETER :: M6N2MBFzi = 2477 + INTEGER(IntKi), PARAMETER :: M6N3MBFzi = 2478 + INTEGER(IntKi), PARAMETER :: M6N4MBFzi = 2479 + INTEGER(IntKi), PARAMETER :: M6N5MBFzi = 2480 + INTEGER(IntKi), PARAMETER :: M6N6MBFzi = 2481 + INTEGER(IntKi), PARAMETER :: M6N7MBFzi = 2482 + INTEGER(IntKi), PARAMETER :: M6N8MBFzi = 2483 + INTEGER(IntKi), PARAMETER :: M6N9MBFzi = 2484 + INTEGER(IntKi), PARAMETER :: M7N1MBFzi = 2485 + INTEGER(IntKi), PARAMETER :: M7N2MBFzi = 2486 + INTEGER(IntKi), PARAMETER :: M7N3MBFzi = 2487 + INTEGER(IntKi), PARAMETER :: M7N4MBFzi = 2488 + INTEGER(IntKi), PARAMETER :: M7N5MBFzi = 2489 + INTEGER(IntKi), PARAMETER :: M7N6MBFzi = 2490 + INTEGER(IntKi), PARAMETER :: M7N7MBFzi = 2491 + INTEGER(IntKi), PARAMETER :: M7N8MBFzi = 2492 + INTEGER(IntKi), PARAMETER :: M7N9MBFzi = 2493 + INTEGER(IntKi), PARAMETER :: M8N1MBFzi = 2494 + INTEGER(IntKi), PARAMETER :: M8N2MBFzi = 2495 + INTEGER(IntKi), PARAMETER :: M8N3MBFzi = 2496 + INTEGER(IntKi), PARAMETER :: M8N4MBFzi = 2497 + INTEGER(IntKi), PARAMETER :: M8N5MBFzi = 2498 + INTEGER(IntKi), PARAMETER :: M8N6MBFzi = 2499 + INTEGER(IntKi), PARAMETER :: M8N7MBFzi = 2500 + INTEGER(IntKi), PARAMETER :: M8N8MBFzi = 2501 + INTEGER(IntKi), PARAMETER :: M8N9MBFzi = 2502 + INTEGER(IntKi), PARAMETER :: M9N1MBFzi = 2503 + INTEGER(IntKi), PARAMETER :: M9N2MBFzi = 2504 + INTEGER(IntKi), PARAMETER :: M9N3MBFzi = 2505 + INTEGER(IntKi), PARAMETER :: M9N4MBFzi = 2506 + INTEGER(IntKi), PARAMETER :: M9N5MBFzi = 2507 + INTEGER(IntKi), PARAMETER :: M9N6MBFzi = 2508 + INTEGER(IntKi), PARAMETER :: M9N7MBFzi = 2509 + INTEGER(IntKi), PARAMETER :: M9N8MBFzi = 2510 + INTEGER(IntKi), PARAMETER :: M9N9MBFzi = 2511 + INTEGER(IntKi), PARAMETER :: M1N1FMGxi = 2512 + INTEGER(IntKi), PARAMETER :: M1N2FMGxi = 2513 + INTEGER(IntKi), PARAMETER :: M1N3FMGxi = 2514 + INTEGER(IntKi), PARAMETER :: M1N4FMGxi = 2515 + INTEGER(IntKi), PARAMETER :: M1N5FMGxi = 2516 + INTEGER(IntKi), PARAMETER :: M1N6FMGxi = 2517 + INTEGER(IntKi), PARAMETER :: M1N7FMGxi = 2518 + INTEGER(IntKi), PARAMETER :: M1N8FMGxi = 2519 + INTEGER(IntKi), PARAMETER :: M1N9FMGxi = 2520 + INTEGER(IntKi), PARAMETER :: M2N1FMGxi = 2521 + INTEGER(IntKi), PARAMETER :: M2N2FMGxi = 2522 + INTEGER(IntKi), PARAMETER :: M2N3FMGxi = 2523 + INTEGER(IntKi), PARAMETER :: M2N4FMGxi = 2524 + INTEGER(IntKi), PARAMETER :: M2N5FMGxi = 2525 + INTEGER(IntKi), PARAMETER :: M2N6FMGxi = 2526 + INTEGER(IntKi), PARAMETER :: M2N7FMGxi = 2527 + INTEGER(IntKi), PARAMETER :: M2N8FMGxi = 2528 + INTEGER(IntKi), PARAMETER :: M2N9FMGxi = 2529 + INTEGER(IntKi), PARAMETER :: M3N1FMGxi = 2530 + INTEGER(IntKi), PARAMETER :: M3N2FMGxi = 2531 + INTEGER(IntKi), PARAMETER :: M3N3FMGxi = 2532 + INTEGER(IntKi), PARAMETER :: M3N4FMGxi = 2533 + INTEGER(IntKi), PARAMETER :: M3N5FMGxi = 2534 + INTEGER(IntKi), PARAMETER :: M3N6FMGxi = 2535 + INTEGER(IntKi), PARAMETER :: M3N7FMGxi = 2536 + INTEGER(IntKi), PARAMETER :: M3N8FMGxi = 2537 + INTEGER(IntKi), PARAMETER :: M3N9FMGxi = 2538 + INTEGER(IntKi), PARAMETER :: M4N1FMGxi = 2539 + INTEGER(IntKi), PARAMETER :: M4N2FMGxi = 2540 + INTEGER(IntKi), PARAMETER :: M4N3FMGxi = 2541 + INTEGER(IntKi), PARAMETER :: M4N4FMGxi = 2542 + INTEGER(IntKi), PARAMETER :: M4N5FMGxi = 2543 + INTEGER(IntKi), PARAMETER :: M4N6FMGxi = 2544 + INTEGER(IntKi), PARAMETER :: M4N7FMGxi = 2545 + INTEGER(IntKi), PARAMETER :: M4N8FMGxi = 2546 + INTEGER(IntKi), PARAMETER :: M4N9FMGxi = 2547 + INTEGER(IntKi), PARAMETER :: M5N1FMGxi = 2548 + INTEGER(IntKi), PARAMETER :: M5N2FMGxi = 2549 + INTEGER(IntKi), PARAMETER :: M5N3FMGxi = 2550 + INTEGER(IntKi), PARAMETER :: M5N4FMGxi = 2551 + INTEGER(IntKi), PARAMETER :: M5N5FMGxi = 2552 + INTEGER(IntKi), PARAMETER :: M5N6FMGxi = 2553 + INTEGER(IntKi), PARAMETER :: M5N7FMGxi = 2554 + INTEGER(IntKi), PARAMETER :: M5N8FMGxi = 2555 + INTEGER(IntKi), PARAMETER :: M5N9FMGxi = 2556 + INTEGER(IntKi), PARAMETER :: M6N1FMGxi = 2557 + INTEGER(IntKi), PARAMETER :: M6N2FMGxi = 2558 + INTEGER(IntKi), PARAMETER :: M6N3FMGxi = 2559 + INTEGER(IntKi), PARAMETER :: M6N4FMGxi = 2560 + INTEGER(IntKi), PARAMETER :: M6N5FMGxi = 2561 + INTEGER(IntKi), PARAMETER :: M6N6FMGxi = 2562 + INTEGER(IntKi), PARAMETER :: M6N7FMGxi = 2563 + INTEGER(IntKi), PARAMETER :: M6N8FMGxi = 2564 + INTEGER(IntKi), PARAMETER :: M6N9FMGxi = 2565 + INTEGER(IntKi), PARAMETER :: M7N1FMGxi = 2566 + INTEGER(IntKi), PARAMETER :: M7N2FMGxi = 2567 + INTEGER(IntKi), PARAMETER :: M7N3FMGxi = 2568 + INTEGER(IntKi), PARAMETER :: M7N4FMGxi = 2569 + INTEGER(IntKi), PARAMETER :: M7N5FMGxi = 2570 + INTEGER(IntKi), PARAMETER :: M7N6FMGxi = 2571 + INTEGER(IntKi), PARAMETER :: M7N7FMGxi = 2572 + INTEGER(IntKi), PARAMETER :: M7N8FMGxi = 2573 + INTEGER(IntKi), PARAMETER :: M7N9FMGxi = 2574 + INTEGER(IntKi), PARAMETER :: M8N1FMGxi = 2575 + INTEGER(IntKi), PARAMETER :: M8N2FMGxi = 2576 + INTEGER(IntKi), PARAMETER :: M8N3FMGxi = 2577 + INTEGER(IntKi), PARAMETER :: M8N4FMGxi = 2578 + INTEGER(IntKi), PARAMETER :: M8N5FMGxi = 2579 + INTEGER(IntKi), PARAMETER :: M8N6FMGxi = 2580 + INTEGER(IntKi), PARAMETER :: M8N7FMGxi = 2581 + INTEGER(IntKi), PARAMETER :: M8N8FMGxi = 2582 + INTEGER(IntKi), PARAMETER :: M8N9FMGxi = 2583 + INTEGER(IntKi), PARAMETER :: M9N1FMGxi = 2584 + INTEGER(IntKi), PARAMETER :: M9N2FMGxi = 2585 + INTEGER(IntKi), PARAMETER :: M9N3FMGxi = 2586 + INTEGER(IntKi), PARAMETER :: M9N4FMGxi = 2587 + INTEGER(IntKi), PARAMETER :: M9N5FMGxi = 2588 + INTEGER(IntKi), PARAMETER :: M9N6FMGxi = 2589 + INTEGER(IntKi), PARAMETER :: M9N7FMGxi = 2590 + INTEGER(IntKi), PARAMETER :: M9N8FMGxi = 2591 + INTEGER(IntKi), PARAMETER :: M9N9FMGxi = 2592 + INTEGER(IntKi), PARAMETER :: M1N1FMGyi = 2593 + INTEGER(IntKi), PARAMETER :: M1N2FMGyi = 2594 + INTEGER(IntKi), PARAMETER :: M1N3FMGyi = 2595 + INTEGER(IntKi), PARAMETER :: M1N4FMGyi = 2596 + INTEGER(IntKi), PARAMETER :: M1N5FMGyi = 2597 + INTEGER(IntKi), PARAMETER :: M1N6FMGyi = 2598 + INTEGER(IntKi), PARAMETER :: M1N7FMGyi = 2599 + INTEGER(IntKi), PARAMETER :: M1N8FMGyi = 2600 + INTEGER(IntKi), PARAMETER :: M1N9FMGyi = 2601 + INTEGER(IntKi), PARAMETER :: M2N1FMGyi = 2602 + INTEGER(IntKi), PARAMETER :: M2N2FMGyi = 2603 + INTEGER(IntKi), PARAMETER :: M2N3FMGyi = 2604 + INTEGER(IntKi), PARAMETER :: M2N4FMGyi = 2605 + INTEGER(IntKi), PARAMETER :: M2N5FMGyi = 2606 + INTEGER(IntKi), PARAMETER :: M2N6FMGyi = 2607 + INTEGER(IntKi), PARAMETER :: M2N7FMGyi = 2608 + INTEGER(IntKi), PARAMETER :: M2N8FMGyi = 2609 + INTEGER(IntKi), PARAMETER :: M2N9FMGyi = 2610 + INTEGER(IntKi), PARAMETER :: M3N1FMGyi = 2611 + INTEGER(IntKi), PARAMETER :: M3N2FMGyi = 2612 + INTEGER(IntKi), PARAMETER :: M3N3FMGyi = 2613 + INTEGER(IntKi), PARAMETER :: M3N4FMGyi = 2614 + INTEGER(IntKi), PARAMETER :: M3N5FMGyi = 2615 + INTEGER(IntKi), PARAMETER :: M3N6FMGyi = 2616 + INTEGER(IntKi), PARAMETER :: M3N7FMGyi = 2617 + INTEGER(IntKi), PARAMETER :: M3N8FMGyi = 2618 + INTEGER(IntKi), PARAMETER :: M3N9FMGyi = 2619 + INTEGER(IntKi), PARAMETER :: M4N1FMGyi = 2620 + INTEGER(IntKi), PARAMETER :: M4N2FMGyi = 2621 + INTEGER(IntKi), PARAMETER :: M4N3FMGyi = 2622 + INTEGER(IntKi), PARAMETER :: M4N4FMGyi = 2623 + INTEGER(IntKi), PARAMETER :: M4N5FMGyi = 2624 + INTEGER(IntKi), PARAMETER :: M4N6FMGyi = 2625 + INTEGER(IntKi), PARAMETER :: M4N7FMGyi = 2626 + INTEGER(IntKi), PARAMETER :: M4N8FMGyi = 2627 + INTEGER(IntKi), PARAMETER :: M4N9FMGyi = 2628 + INTEGER(IntKi), PARAMETER :: M5N1FMGyi = 2629 + INTEGER(IntKi), PARAMETER :: M5N2FMGyi = 2630 + INTEGER(IntKi), PARAMETER :: M5N3FMGyi = 2631 + INTEGER(IntKi), PARAMETER :: M5N4FMGyi = 2632 + INTEGER(IntKi), PARAMETER :: M5N5FMGyi = 2633 + INTEGER(IntKi), PARAMETER :: M5N6FMGyi = 2634 + INTEGER(IntKi), PARAMETER :: M5N7FMGyi = 2635 + INTEGER(IntKi), PARAMETER :: M5N8FMGyi = 2636 + INTEGER(IntKi), PARAMETER :: M5N9FMGyi = 2637 + INTEGER(IntKi), PARAMETER :: M6N1FMGyi = 2638 + INTEGER(IntKi), PARAMETER :: M6N2FMGyi = 2639 + INTEGER(IntKi), PARAMETER :: M6N3FMGyi = 2640 + INTEGER(IntKi), PARAMETER :: M6N4FMGyi = 2641 + INTEGER(IntKi), PARAMETER :: M6N5FMGyi = 2642 + INTEGER(IntKi), PARAMETER :: M6N6FMGyi = 2643 + INTEGER(IntKi), PARAMETER :: M6N7FMGyi = 2644 + INTEGER(IntKi), PARAMETER :: M6N8FMGyi = 2645 + INTEGER(IntKi), PARAMETER :: M6N9FMGyi = 2646 + INTEGER(IntKi), PARAMETER :: M7N1FMGyi = 2647 + INTEGER(IntKi), PARAMETER :: M7N2FMGyi = 2648 + INTEGER(IntKi), PARAMETER :: M7N3FMGyi = 2649 + INTEGER(IntKi), PARAMETER :: M7N4FMGyi = 2650 + INTEGER(IntKi), PARAMETER :: M7N5FMGyi = 2651 + INTEGER(IntKi), PARAMETER :: M7N6FMGyi = 2652 + INTEGER(IntKi), PARAMETER :: M7N7FMGyi = 2653 + INTEGER(IntKi), PARAMETER :: M7N8FMGyi = 2654 + INTEGER(IntKi), PARAMETER :: M7N9FMGyi = 2655 + INTEGER(IntKi), PARAMETER :: M8N1FMGyi = 2656 + INTEGER(IntKi), PARAMETER :: M8N2FMGyi = 2657 + INTEGER(IntKi), PARAMETER :: M8N3FMGyi = 2658 + INTEGER(IntKi), PARAMETER :: M8N4FMGyi = 2659 + INTEGER(IntKi), PARAMETER :: M8N5FMGyi = 2660 + INTEGER(IntKi), PARAMETER :: M8N6FMGyi = 2661 + INTEGER(IntKi), PARAMETER :: M8N7FMGyi = 2662 + INTEGER(IntKi), PARAMETER :: M8N8FMGyi = 2663 + INTEGER(IntKi), PARAMETER :: M8N9FMGyi = 2664 + INTEGER(IntKi), PARAMETER :: M9N1FMGyi = 2665 + INTEGER(IntKi), PARAMETER :: M9N2FMGyi = 2666 + INTEGER(IntKi), PARAMETER :: M9N3FMGyi = 2667 + INTEGER(IntKi), PARAMETER :: M9N4FMGyi = 2668 + INTEGER(IntKi), PARAMETER :: M9N5FMGyi = 2669 + INTEGER(IntKi), PARAMETER :: M9N6FMGyi = 2670 + INTEGER(IntKi), PARAMETER :: M9N7FMGyi = 2671 + INTEGER(IntKi), PARAMETER :: M9N8FMGyi = 2672 + INTEGER(IntKi), PARAMETER :: M9N9FMGyi = 2673 + INTEGER(IntKi), PARAMETER :: M1N1FMGzi = 2674 + INTEGER(IntKi), PARAMETER :: M1N2FMGzi = 2675 + INTEGER(IntKi), PARAMETER :: M1N3FMGzi = 2676 + INTEGER(IntKi), PARAMETER :: M1N4FMGzi = 2677 + INTEGER(IntKi), PARAMETER :: M1N5FMGzi = 2678 + INTEGER(IntKi), PARAMETER :: M1N6FMGzi = 2679 + INTEGER(IntKi), PARAMETER :: M1N7FMGzi = 2680 + INTEGER(IntKi), PARAMETER :: M1N8FMGzi = 2681 + INTEGER(IntKi), PARAMETER :: M1N9FMGzi = 2682 + INTEGER(IntKi), PARAMETER :: M2N1FMGzi = 2683 + INTEGER(IntKi), PARAMETER :: M2N2FMGzi = 2684 + INTEGER(IntKi), PARAMETER :: M2N3FMGzi = 2685 + INTEGER(IntKi), PARAMETER :: M2N4FMGzi = 2686 + INTEGER(IntKi), PARAMETER :: M2N5FMGzi = 2687 + INTEGER(IntKi), PARAMETER :: M2N6FMGzi = 2688 + INTEGER(IntKi), PARAMETER :: M2N7FMGzi = 2689 + INTEGER(IntKi), PARAMETER :: M2N8FMGzi = 2690 + INTEGER(IntKi), PARAMETER :: M2N9FMGzi = 2691 + INTEGER(IntKi), PARAMETER :: M3N1FMGzi = 2692 + INTEGER(IntKi), PARAMETER :: M3N2FMGzi = 2693 + INTEGER(IntKi), PARAMETER :: M3N3FMGzi = 2694 + INTEGER(IntKi), PARAMETER :: M3N4FMGzi = 2695 + INTEGER(IntKi), PARAMETER :: M3N5FMGzi = 2696 + INTEGER(IntKi), PARAMETER :: M3N6FMGzi = 2697 + INTEGER(IntKi), PARAMETER :: M3N7FMGzi = 2698 + INTEGER(IntKi), PARAMETER :: M3N8FMGzi = 2699 + INTEGER(IntKi), PARAMETER :: M3N9FMGzi = 2700 + INTEGER(IntKi), PARAMETER :: M4N1FMGzi = 2701 + INTEGER(IntKi), PARAMETER :: M4N2FMGzi = 2702 + INTEGER(IntKi), PARAMETER :: M4N3FMGzi = 2703 + INTEGER(IntKi), PARAMETER :: M4N4FMGzi = 2704 + INTEGER(IntKi), PARAMETER :: M4N5FMGzi = 2705 + INTEGER(IntKi), PARAMETER :: M4N6FMGzi = 2706 + INTEGER(IntKi), PARAMETER :: M4N7FMGzi = 2707 + INTEGER(IntKi), PARAMETER :: M4N8FMGzi = 2708 + INTEGER(IntKi), PARAMETER :: M4N9FMGzi = 2709 + INTEGER(IntKi), PARAMETER :: M5N1FMGzi = 2710 + INTEGER(IntKi), PARAMETER :: M5N2FMGzi = 2711 + INTEGER(IntKi), PARAMETER :: M5N3FMGzi = 2712 + INTEGER(IntKi), PARAMETER :: M5N4FMGzi = 2713 + INTEGER(IntKi), PARAMETER :: M5N5FMGzi = 2714 + INTEGER(IntKi), PARAMETER :: M5N6FMGzi = 2715 + INTEGER(IntKi), PARAMETER :: M5N7FMGzi = 2716 + INTEGER(IntKi), PARAMETER :: M5N8FMGzi = 2717 + INTEGER(IntKi), PARAMETER :: M5N9FMGzi = 2718 + INTEGER(IntKi), PARAMETER :: M6N1FMGzi = 2719 + INTEGER(IntKi), PARAMETER :: M6N2FMGzi = 2720 + INTEGER(IntKi), PARAMETER :: M6N3FMGzi = 2721 + INTEGER(IntKi), PARAMETER :: M6N4FMGzi = 2722 + INTEGER(IntKi), PARAMETER :: M6N5FMGzi = 2723 + INTEGER(IntKi), PARAMETER :: M6N6FMGzi = 2724 + INTEGER(IntKi), PARAMETER :: M6N7FMGzi = 2725 + INTEGER(IntKi), PARAMETER :: M6N8FMGzi = 2726 + INTEGER(IntKi), PARAMETER :: M6N9FMGzi = 2727 + INTEGER(IntKi), PARAMETER :: M7N1FMGzi = 2728 + INTEGER(IntKi), PARAMETER :: M7N2FMGzi = 2729 + INTEGER(IntKi), PARAMETER :: M7N3FMGzi = 2730 + INTEGER(IntKi), PARAMETER :: M7N4FMGzi = 2731 + INTEGER(IntKi), PARAMETER :: M7N5FMGzi = 2732 + INTEGER(IntKi), PARAMETER :: M7N6FMGzi = 2733 + INTEGER(IntKi), PARAMETER :: M7N7FMGzi = 2734 + INTEGER(IntKi), PARAMETER :: M7N8FMGzi = 2735 + INTEGER(IntKi), PARAMETER :: M7N9FMGzi = 2736 + INTEGER(IntKi), PARAMETER :: M8N1FMGzi = 2737 + INTEGER(IntKi), PARAMETER :: M8N2FMGzi = 2738 + INTEGER(IntKi), PARAMETER :: M8N3FMGzi = 2739 + INTEGER(IntKi), PARAMETER :: M8N4FMGzi = 2740 + INTEGER(IntKi), PARAMETER :: M8N5FMGzi = 2741 + INTEGER(IntKi), PARAMETER :: M8N6FMGzi = 2742 + INTEGER(IntKi), PARAMETER :: M8N7FMGzi = 2743 + INTEGER(IntKi), PARAMETER :: M8N8FMGzi = 2744 + INTEGER(IntKi), PARAMETER :: M8N9FMGzi = 2745 + INTEGER(IntKi), PARAMETER :: M9N1FMGzi = 2746 + INTEGER(IntKi), PARAMETER :: M9N2FMGzi = 2747 + INTEGER(IntKi), PARAMETER :: M9N3FMGzi = 2748 + INTEGER(IntKi), PARAMETER :: M9N4FMGzi = 2749 + INTEGER(IntKi), PARAMETER :: M9N5FMGzi = 2750 + INTEGER(IntKi), PARAMETER :: M9N6FMGzi = 2751 + INTEGER(IntKi), PARAMETER :: M9N7FMGzi = 2752 + INTEGER(IntKi), PARAMETER :: M9N8FMGzi = 2753 + INTEGER(IntKi), PARAMETER :: M9N9FMGzi = 2754 + INTEGER(IntKi), PARAMETER :: M1N1MMGxi = 2755 + INTEGER(IntKi), PARAMETER :: M1N2MMGxi = 2756 + INTEGER(IntKi), PARAMETER :: M1N3MMGxi = 2757 + INTEGER(IntKi), PARAMETER :: M1N4MMGxi = 2758 + INTEGER(IntKi), PARAMETER :: M1N5MMGxi = 2759 + INTEGER(IntKi), PARAMETER :: M1N6MMGxi = 2760 + INTEGER(IntKi), PARAMETER :: M1N7MMGxi = 2761 + INTEGER(IntKi), PARAMETER :: M1N8MMGxi = 2762 + INTEGER(IntKi), PARAMETER :: M1N9MMGxi = 2763 + INTEGER(IntKi), PARAMETER :: M2N1MMGxi = 2764 + INTEGER(IntKi), PARAMETER :: M2N2MMGxi = 2765 + INTEGER(IntKi), PARAMETER :: M2N3MMGxi = 2766 + INTEGER(IntKi), PARAMETER :: M2N4MMGxi = 2767 + INTEGER(IntKi), PARAMETER :: M2N5MMGxi = 2768 + INTEGER(IntKi), PARAMETER :: M2N6MMGxi = 2769 + INTEGER(IntKi), PARAMETER :: M2N7MMGxi = 2770 + INTEGER(IntKi), PARAMETER :: M2N8MMGxi = 2771 + INTEGER(IntKi), PARAMETER :: M2N9MMGxi = 2772 + INTEGER(IntKi), PARAMETER :: M3N1MMGxi = 2773 + INTEGER(IntKi), PARAMETER :: M3N2MMGxi = 2774 + INTEGER(IntKi), PARAMETER :: M3N3MMGxi = 2775 + INTEGER(IntKi), PARAMETER :: M3N4MMGxi = 2776 + INTEGER(IntKi), PARAMETER :: M3N5MMGxi = 2777 + INTEGER(IntKi), PARAMETER :: M3N6MMGxi = 2778 + INTEGER(IntKi), PARAMETER :: M3N7MMGxi = 2779 + INTEGER(IntKi), PARAMETER :: M3N8MMGxi = 2780 + INTEGER(IntKi), PARAMETER :: M3N9MMGxi = 2781 + INTEGER(IntKi), PARAMETER :: M4N1MMGxi = 2782 + INTEGER(IntKi), PARAMETER :: M4N2MMGxi = 2783 + INTEGER(IntKi), PARAMETER :: M4N3MMGxi = 2784 + INTEGER(IntKi), PARAMETER :: M4N4MMGxi = 2785 + INTEGER(IntKi), PARAMETER :: M4N5MMGxi = 2786 + INTEGER(IntKi), PARAMETER :: M4N6MMGxi = 2787 + INTEGER(IntKi), PARAMETER :: M4N7MMGxi = 2788 + INTEGER(IntKi), PARAMETER :: M4N8MMGxi = 2789 + INTEGER(IntKi), PARAMETER :: M4N9MMGxi = 2790 + INTEGER(IntKi), PARAMETER :: M5N1MMGxi = 2791 + INTEGER(IntKi), PARAMETER :: M5N2MMGxi = 2792 + INTEGER(IntKi), PARAMETER :: M5N3MMGxi = 2793 + INTEGER(IntKi), PARAMETER :: M5N4MMGxi = 2794 + INTEGER(IntKi), PARAMETER :: M5N5MMGxi = 2795 + INTEGER(IntKi), PARAMETER :: M5N6MMGxi = 2796 + INTEGER(IntKi), PARAMETER :: M5N7MMGxi = 2797 + INTEGER(IntKi), PARAMETER :: M5N8MMGxi = 2798 + INTEGER(IntKi), PARAMETER :: M5N9MMGxi = 2799 + INTEGER(IntKi), PARAMETER :: M6N1MMGxi = 2800 + INTEGER(IntKi), PARAMETER :: M6N2MMGxi = 2801 + INTEGER(IntKi), PARAMETER :: M6N3MMGxi = 2802 + INTEGER(IntKi), PARAMETER :: M6N4MMGxi = 2803 + INTEGER(IntKi), PARAMETER :: M6N5MMGxi = 2804 + INTEGER(IntKi), PARAMETER :: M6N6MMGxi = 2805 + INTEGER(IntKi), PARAMETER :: M6N7MMGxi = 2806 + INTEGER(IntKi), PARAMETER :: M6N8MMGxi = 2807 + INTEGER(IntKi), PARAMETER :: M6N9MMGxi = 2808 + INTEGER(IntKi), PARAMETER :: M7N1MMGxi = 2809 + INTEGER(IntKi), PARAMETER :: M7N2MMGxi = 2810 + INTEGER(IntKi), PARAMETER :: M7N3MMGxi = 2811 + INTEGER(IntKi), PARAMETER :: M7N4MMGxi = 2812 + INTEGER(IntKi), PARAMETER :: M7N5MMGxi = 2813 + INTEGER(IntKi), PARAMETER :: M7N6MMGxi = 2814 + INTEGER(IntKi), PARAMETER :: M7N7MMGxi = 2815 + INTEGER(IntKi), PARAMETER :: M7N8MMGxi = 2816 + INTEGER(IntKi), PARAMETER :: M7N9MMGxi = 2817 + INTEGER(IntKi), PARAMETER :: M8N1MMGxi = 2818 + INTEGER(IntKi), PARAMETER :: M8N2MMGxi = 2819 + INTEGER(IntKi), PARAMETER :: M8N3MMGxi = 2820 + INTEGER(IntKi), PARAMETER :: M8N4MMGxi = 2821 + INTEGER(IntKi), PARAMETER :: M8N5MMGxi = 2822 + INTEGER(IntKi), PARAMETER :: M8N6MMGxi = 2823 + INTEGER(IntKi), PARAMETER :: M8N7MMGxi = 2824 + INTEGER(IntKi), PARAMETER :: M8N8MMGxi = 2825 + INTEGER(IntKi), PARAMETER :: M8N9MMGxi = 2826 + INTEGER(IntKi), PARAMETER :: M9N1MMGxi = 2827 + INTEGER(IntKi), PARAMETER :: M9N2MMGxi = 2828 + INTEGER(IntKi), PARAMETER :: M9N3MMGxi = 2829 + INTEGER(IntKi), PARAMETER :: M9N4MMGxi = 2830 + INTEGER(IntKi), PARAMETER :: M9N5MMGxi = 2831 + INTEGER(IntKi), PARAMETER :: M9N6MMGxi = 2832 + INTEGER(IntKi), PARAMETER :: M9N7MMGxi = 2833 + INTEGER(IntKi), PARAMETER :: M9N8MMGxi = 2834 + INTEGER(IntKi), PARAMETER :: M9N9MMGxi = 2835 + INTEGER(IntKi), PARAMETER :: M1N1MMGyi = 2836 + INTEGER(IntKi), PARAMETER :: M1N2MMGyi = 2837 + INTEGER(IntKi), PARAMETER :: M1N3MMGyi = 2838 + INTEGER(IntKi), PARAMETER :: M1N4MMGyi = 2839 + INTEGER(IntKi), PARAMETER :: M1N5MMGyi = 2840 + INTEGER(IntKi), PARAMETER :: M1N6MMGyi = 2841 + INTEGER(IntKi), PARAMETER :: M1N7MMGyi = 2842 + INTEGER(IntKi), PARAMETER :: M1N8MMGyi = 2843 + INTEGER(IntKi), PARAMETER :: M1N9MMGyi = 2844 + INTEGER(IntKi), PARAMETER :: M2N1MMGyi = 2845 + INTEGER(IntKi), PARAMETER :: M2N2MMGyi = 2846 + INTEGER(IntKi), PARAMETER :: M2N3MMGyi = 2847 + INTEGER(IntKi), PARAMETER :: M2N4MMGyi = 2848 + INTEGER(IntKi), PARAMETER :: M2N5MMGyi = 2849 + INTEGER(IntKi), PARAMETER :: M2N6MMGyi = 2850 + INTEGER(IntKi), PARAMETER :: M2N7MMGyi = 2851 + INTEGER(IntKi), PARAMETER :: M2N8MMGyi = 2852 + INTEGER(IntKi), PARAMETER :: M2N9MMGyi = 2853 + INTEGER(IntKi), PARAMETER :: M3N1MMGyi = 2854 + INTEGER(IntKi), PARAMETER :: M3N2MMGyi = 2855 + INTEGER(IntKi), PARAMETER :: M3N3MMGyi = 2856 + INTEGER(IntKi), PARAMETER :: M3N4MMGyi = 2857 + INTEGER(IntKi), PARAMETER :: M3N5MMGyi = 2858 + INTEGER(IntKi), PARAMETER :: M3N6MMGyi = 2859 + INTEGER(IntKi), PARAMETER :: M3N7MMGyi = 2860 + INTEGER(IntKi), PARAMETER :: M3N8MMGyi = 2861 + INTEGER(IntKi), PARAMETER :: M3N9MMGyi = 2862 + INTEGER(IntKi), PARAMETER :: M4N1MMGyi = 2863 + INTEGER(IntKi), PARAMETER :: M4N2MMGyi = 2864 + INTEGER(IntKi), PARAMETER :: M4N3MMGyi = 2865 + INTEGER(IntKi), PARAMETER :: M4N4MMGyi = 2866 + INTEGER(IntKi), PARAMETER :: M4N5MMGyi = 2867 + INTEGER(IntKi), PARAMETER :: M4N6MMGyi = 2868 + INTEGER(IntKi), PARAMETER :: M4N7MMGyi = 2869 + INTEGER(IntKi), PARAMETER :: M4N8MMGyi = 2870 + INTEGER(IntKi), PARAMETER :: M4N9MMGyi = 2871 + INTEGER(IntKi), PARAMETER :: M5N1MMGyi = 2872 + INTEGER(IntKi), PARAMETER :: M5N2MMGyi = 2873 + INTEGER(IntKi), PARAMETER :: M5N3MMGyi = 2874 + INTEGER(IntKi), PARAMETER :: M5N4MMGyi = 2875 + INTEGER(IntKi), PARAMETER :: M5N5MMGyi = 2876 + INTEGER(IntKi), PARAMETER :: M5N6MMGyi = 2877 + INTEGER(IntKi), PARAMETER :: M5N7MMGyi = 2878 + INTEGER(IntKi), PARAMETER :: M5N8MMGyi = 2879 + INTEGER(IntKi), PARAMETER :: M5N9MMGyi = 2880 + INTEGER(IntKi), PARAMETER :: M6N1MMGyi = 2881 + INTEGER(IntKi), PARAMETER :: M6N2MMGyi = 2882 + INTEGER(IntKi), PARAMETER :: M6N3MMGyi = 2883 + INTEGER(IntKi), PARAMETER :: M6N4MMGyi = 2884 + INTEGER(IntKi), PARAMETER :: M6N5MMGyi = 2885 + INTEGER(IntKi), PARAMETER :: M6N6MMGyi = 2886 + INTEGER(IntKi), PARAMETER :: M6N7MMGyi = 2887 + INTEGER(IntKi), PARAMETER :: M6N8MMGyi = 2888 + INTEGER(IntKi), PARAMETER :: M6N9MMGyi = 2889 + INTEGER(IntKi), PARAMETER :: M7N1MMGyi = 2890 + INTEGER(IntKi), PARAMETER :: M7N2MMGyi = 2891 + INTEGER(IntKi), PARAMETER :: M7N3MMGyi = 2892 + INTEGER(IntKi), PARAMETER :: M7N4MMGyi = 2893 + INTEGER(IntKi), PARAMETER :: M7N5MMGyi = 2894 + INTEGER(IntKi), PARAMETER :: M7N6MMGyi = 2895 + INTEGER(IntKi), PARAMETER :: M7N7MMGyi = 2896 + INTEGER(IntKi), PARAMETER :: M7N8MMGyi = 2897 + INTEGER(IntKi), PARAMETER :: M7N9MMGyi = 2898 + INTEGER(IntKi), PARAMETER :: M8N1MMGyi = 2899 + INTEGER(IntKi), PARAMETER :: M8N2MMGyi = 2900 + INTEGER(IntKi), PARAMETER :: M8N3MMGyi = 2901 + INTEGER(IntKi), PARAMETER :: M8N4MMGyi = 2902 + INTEGER(IntKi), PARAMETER :: M8N5MMGyi = 2903 + INTEGER(IntKi), PARAMETER :: M8N6MMGyi = 2904 + INTEGER(IntKi), PARAMETER :: M8N7MMGyi = 2905 + INTEGER(IntKi), PARAMETER :: M8N8MMGyi = 2906 + INTEGER(IntKi), PARAMETER :: M8N9MMGyi = 2907 + INTEGER(IntKi), PARAMETER :: M9N1MMGyi = 2908 + INTEGER(IntKi), PARAMETER :: M9N2MMGyi = 2909 + INTEGER(IntKi), PARAMETER :: M9N3MMGyi = 2910 + INTEGER(IntKi), PARAMETER :: M9N4MMGyi = 2911 + INTEGER(IntKi), PARAMETER :: M9N5MMGyi = 2912 + INTEGER(IntKi), PARAMETER :: M9N6MMGyi = 2913 + INTEGER(IntKi), PARAMETER :: M9N7MMGyi = 2914 + INTEGER(IntKi), PARAMETER :: M9N8MMGyi = 2915 + INTEGER(IntKi), PARAMETER :: M9N9MMGyi = 2916 + INTEGER(IntKi), PARAMETER :: M1N1MMGzi = 2917 + INTEGER(IntKi), PARAMETER :: M1N2MMGzi = 2918 + INTEGER(IntKi), PARAMETER :: M1N3MMGzi = 2919 + INTEGER(IntKi), PARAMETER :: M1N4MMGzi = 2920 + INTEGER(IntKi), PARAMETER :: M1N5MMGzi = 2921 + INTEGER(IntKi), PARAMETER :: M1N6MMGzi = 2922 + INTEGER(IntKi), PARAMETER :: M1N7MMGzi = 2923 + INTEGER(IntKi), PARAMETER :: M1N8MMGzi = 2924 + INTEGER(IntKi), PARAMETER :: M1N9MMGzi = 2925 + INTEGER(IntKi), PARAMETER :: M2N1MMGzi = 2926 + INTEGER(IntKi), PARAMETER :: M2N2MMGzi = 2927 + INTEGER(IntKi), PARAMETER :: M2N3MMGzi = 2928 + INTEGER(IntKi), PARAMETER :: M2N4MMGzi = 2929 + INTEGER(IntKi), PARAMETER :: M2N5MMGzi = 2930 + INTEGER(IntKi), PARAMETER :: M2N6MMGzi = 2931 + INTEGER(IntKi), PARAMETER :: M2N7MMGzi = 2932 + INTEGER(IntKi), PARAMETER :: M2N8MMGzi = 2933 + INTEGER(IntKi), PARAMETER :: M2N9MMGzi = 2934 + INTEGER(IntKi), PARAMETER :: M3N1MMGzi = 2935 + INTEGER(IntKi), PARAMETER :: M3N2MMGzi = 2936 + INTEGER(IntKi), PARAMETER :: M3N3MMGzi = 2937 + INTEGER(IntKi), PARAMETER :: M3N4MMGzi = 2938 + INTEGER(IntKi), PARAMETER :: M3N5MMGzi = 2939 + INTEGER(IntKi), PARAMETER :: M3N6MMGzi = 2940 + INTEGER(IntKi), PARAMETER :: M3N7MMGzi = 2941 + INTEGER(IntKi), PARAMETER :: M3N8MMGzi = 2942 + INTEGER(IntKi), PARAMETER :: M3N9MMGzi = 2943 + INTEGER(IntKi), PARAMETER :: M4N1MMGzi = 2944 + INTEGER(IntKi), PARAMETER :: M4N2MMGzi = 2945 + INTEGER(IntKi), PARAMETER :: M4N3MMGzi = 2946 + INTEGER(IntKi), PARAMETER :: M4N4MMGzi = 2947 + INTEGER(IntKi), PARAMETER :: M4N5MMGzi = 2948 + INTEGER(IntKi), PARAMETER :: M4N6MMGzi = 2949 + INTEGER(IntKi), PARAMETER :: M4N7MMGzi = 2950 + INTEGER(IntKi), PARAMETER :: M4N8MMGzi = 2951 + INTEGER(IntKi), PARAMETER :: M4N9MMGzi = 2952 + INTEGER(IntKi), PARAMETER :: M5N1MMGzi = 2953 + INTEGER(IntKi), PARAMETER :: M5N2MMGzi = 2954 + INTEGER(IntKi), PARAMETER :: M5N3MMGzi = 2955 + INTEGER(IntKi), PARAMETER :: M5N4MMGzi = 2956 + INTEGER(IntKi), PARAMETER :: M5N5MMGzi = 2957 + INTEGER(IntKi), PARAMETER :: M5N6MMGzi = 2958 + INTEGER(IntKi), PARAMETER :: M5N7MMGzi = 2959 + INTEGER(IntKi), PARAMETER :: M5N8MMGzi = 2960 + INTEGER(IntKi), PARAMETER :: M5N9MMGzi = 2961 + INTEGER(IntKi), PARAMETER :: M6N1MMGzi = 2962 + INTEGER(IntKi), PARAMETER :: M6N2MMGzi = 2963 + INTEGER(IntKi), PARAMETER :: M6N3MMGzi = 2964 + INTEGER(IntKi), PARAMETER :: M6N4MMGzi = 2965 + INTEGER(IntKi), PARAMETER :: M6N5MMGzi = 2966 + INTEGER(IntKi), PARAMETER :: M6N6MMGzi = 2967 + INTEGER(IntKi), PARAMETER :: M6N7MMGzi = 2968 + INTEGER(IntKi), PARAMETER :: M6N8MMGzi = 2969 + INTEGER(IntKi), PARAMETER :: M6N9MMGzi = 2970 + INTEGER(IntKi), PARAMETER :: M7N1MMGzi = 2971 + INTEGER(IntKi), PARAMETER :: M7N2MMGzi = 2972 + INTEGER(IntKi), PARAMETER :: M7N3MMGzi = 2973 + INTEGER(IntKi), PARAMETER :: M7N4MMGzi = 2974 + INTEGER(IntKi), PARAMETER :: M7N5MMGzi = 2975 + INTEGER(IntKi), PARAMETER :: M7N6MMGzi = 2976 + INTEGER(IntKi), PARAMETER :: M7N7MMGzi = 2977 + INTEGER(IntKi), PARAMETER :: M7N8MMGzi = 2978 + INTEGER(IntKi), PARAMETER :: M7N9MMGzi = 2979 + INTEGER(IntKi), PARAMETER :: M8N1MMGzi = 2980 + INTEGER(IntKi), PARAMETER :: M8N2MMGzi = 2981 + INTEGER(IntKi), PARAMETER :: M8N3MMGzi = 2982 + INTEGER(IntKi), PARAMETER :: M8N4MMGzi = 2983 + INTEGER(IntKi), PARAMETER :: M8N5MMGzi = 2984 + INTEGER(IntKi), PARAMETER :: M8N6MMGzi = 2985 + INTEGER(IntKi), PARAMETER :: M8N7MMGzi = 2986 + INTEGER(IntKi), PARAMETER :: M8N8MMGzi = 2987 + INTEGER(IntKi), PARAMETER :: M8N9MMGzi = 2988 + INTEGER(IntKi), PARAMETER :: M9N1MMGzi = 2989 + INTEGER(IntKi), PARAMETER :: M9N2MMGzi = 2990 + INTEGER(IntKi), PARAMETER :: M9N3MMGzi = 2991 + INTEGER(IntKi), PARAMETER :: M9N4MMGzi = 2992 + INTEGER(IntKi), PARAMETER :: M9N5MMGzi = 2993 + INTEGER(IntKi), PARAMETER :: M9N6MMGzi = 2994 + INTEGER(IntKi), PARAMETER :: M9N7MMGzi = 2995 + INTEGER(IntKi), PARAMETER :: M9N8MMGzi = 2996 + INTEGER(IntKi), PARAMETER :: M9N9MMGzi = 2997 + INTEGER(IntKi), PARAMETER :: M1N1FAMxi = 2998 + INTEGER(IntKi), PARAMETER :: M1N2FAMxi = 2999 + INTEGER(IntKi), PARAMETER :: M1N3FAMxi = 3000 + INTEGER(IntKi), PARAMETER :: M1N4FAMxi = 3001 + INTEGER(IntKi), PARAMETER :: M1N5FAMxi = 3002 + INTEGER(IntKi), PARAMETER :: M1N6FAMxi = 3003 + INTEGER(IntKi), PARAMETER :: M1N7FAMxi = 3004 + INTEGER(IntKi), PARAMETER :: M1N8FAMxi = 3005 + INTEGER(IntKi), PARAMETER :: M1N9FAMxi = 3006 + INTEGER(IntKi), PARAMETER :: M2N1FAMxi = 3007 + INTEGER(IntKi), PARAMETER :: M2N2FAMxi = 3008 + INTEGER(IntKi), PARAMETER :: M2N3FAMxi = 3009 + INTEGER(IntKi), PARAMETER :: M2N4FAMxi = 3010 + INTEGER(IntKi), PARAMETER :: M2N5FAMxi = 3011 + INTEGER(IntKi), PARAMETER :: M2N6FAMxi = 3012 + INTEGER(IntKi), PARAMETER :: M2N7FAMxi = 3013 + INTEGER(IntKi), PARAMETER :: M2N8FAMxi = 3014 + INTEGER(IntKi), PARAMETER :: M2N9FAMxi = 3015 + INTEGER(IntKi), PARAMETER :: M3N1FAMxi = 3016 + INTEGER(IntKi), PARAMETER :: M3N2FAMxi = 3017 + INTEGER(IntKi), PARAMETER :: M3N3FAMxi = 3018 + INTEGER(IntKi), PARAMETER :: M3N4FAMxi = 3019 + INTEGER(IntKi), PARAMETER :: M3N5FAMxi = 3020 + INTEGER(IntKi), PARAMETER :: M3N6FAMxi = 3021 + INTEGER(IntKi), PARAMETER :: M3N7FAMxi = 3022 + INTEGER(IntKi), PARAMETER :: M3N8FAMxi = 3023 + INTEGER(IntKi), PARAMETER :: M3N9FAMxi = 3024 + INTEGER(IntKi), PARAMETER :: M4N1FAMxi = 3025 + INTEGER(IntKi), PARAMETER :: M4N2FAMxi = 3026 + INTEGER(IntKi), PARAMETER :: M4N3FAMxi = 3027 + INTEGER(IntKi), PARAMETER :: M4N4FAMxi = 3028 + INTEGER(IntKi), PARAMETER :: M4N5FAMxi = 3029 + INTEGER(IntKi), PARAMETER :: M4N6FAMxi = 3030 + INTEGER(IntKi), PARAMETER :: M4N7FAMxi = 3031 + INTEGER(IntKi), PARAMETER :: M4N8FAMxi = 3032 + INTEGER(IntKi), PARAMETER :: M4N9FAMxi = 3033 + INTEGER(IntKi), PARAMETER :: M5N1FAMxi = 3034 + INTEGER(IntKi), PARAMETER :: M5N2FAMxi = 3035 + INTEGER(IntKi), PARAMETER :: M5N3FAMxi = 3036 + INTEGER(IntKi), PARAMETER :: M5N4FAMxi = 3037 + INTEGER(IntKi), PARAMETER :: M5N5FAMxi = 3038 + INTEGER(IntKi), PARAMETER :: M5N6FAMxi = 3039 + INTEGER(IntKi), PARAMETER :: M5N7FAMxi = 3040 + INTEGER(IntKi), PARAMETER :: M5N8FAMxi = 3041 + INTEGER(IntKi), PARAMETER :: M5N9FAMxi = 3042 + INTEGER(IntKi), PARAMETER :: M6N1FAMxi = 3043 + INTEGER(IntKi), PARAMETER :: M6N2FAMxi = 3044 + INTEGER(IntKi), PARAMETER :: M6N3FAMxi = 3045 + INTEGER(IntKi), PARAMETER :: M6N4FAMxi = 3046 + INTEGER(IntKi), PARAMETER :: M6N5FAMxi = 3047 + INTEGER(IntKi), PARAMETER :: M6N6FAMxi = 3048 + INTEGER(IntKi), PARAMETER :: M6N7FAMxi = 3049 + INTEGER(IntKi), PARAMETER :: M6N8FAMxi = 3050 + INTEGER(IntKi), PARAMETER :: M6N9FAMxi = 3051 + INTEGER(IntKi), PARAMETER :: M7N1FAMxi = 3052 + INTEGER(IntKi), PARAMETER :: M7N2FAMxi = 3053 + INTEGER(IntKi), PARAMETER :: M7N3FAMxi = 3054 + INTEGER(IntKi), PARAMETER :: M7N4FAMxi = 3055 + INTEGER(IntKi), PARAMETER :: M7N5FAMxi = 3056 + INTEGER(IntKi), PARAMETER :: M7N6FAMxi = 3057 + INTEGER(IntKi), PARAMETER :: M7N7FAMxi = 3058 + INTEGER(IntKi), PARAMETER :: M7N8FAMxi = 3059 + INTEGER(IntKi), PARAMETER :: M7N9FAMxi = 3060 + INTEGER(IntKi), PARAMETER :: M8N1FAMxi = 3061 + INTEGER(IntKi), PARAMETER :: M8N2FAMxi = 3062 + INTEGER(IntKi), PARAMETER :: M8N3FAMxi = 3063 + INTEGER(IntKi), PARAMETER :: M8N4FAMxi = 3064 + INTEGER(IntKi), PARAMETER :: M8N5FAMxi = 3065 + INTEGER(IntKi), PARAMETER :: M8N6FAMxi = 3066 + INTEGER(IntKi), PARAMETER :: M8N7FAMxi = 3067 + INTEGER(IntKi), PARAMETER :: M8N8FAMxi = 3068 + INTEGER(IntKi), PARAMETER :: M8N9FAMxi = 3069 + INTEGER(IntKi), PARAMETER :: M9N1FAMxi = 3070 + INTEGER(IntKi), PARAMETER :: M9N2FAMxi = 3071 + INTEGER(IntKi), PARAMETER :: M9N3FAMxi = 3072 + INTEGER(IntKi), PARAMETER :: M9N4FAMxi = 3073 + INTEGER(IntKi), PARAMETER :: M9N5FAMxi = 3074 + INTEGER(IntKi), PARAMETER :: M9N6FAMxi = 3075 + INTEGER(IntKi), PARAMETER :: M9N7FAMxi = 3076 + INTEGER(IntKi), PARAMETER :: M9N8FAMxi = 3077 + INTEGER(IntKi), PARAMETER :: M9N9FAMxi = 3078 + INTEGER(IntKi), PARAMETER :: M1N1FAMyi = 3079 + INTEGER(IntKi), PARAMETER :: M1N2FAMyi = 3080 + INTEGER(IntKi), PARAMETER :: M1N3FAMyi = 3081 + INTEGER(IntKi), PARAMETER :: M1N4FAMyi = 3082 + INTEGER(IntKi), PARAMETER :: M1N5FAMyi = 3083 + INTEGER(IntKi), PARAMETER :: M1N6FAMyi = 3084 + INTEGER(IntKi), PARAMETER :: M1N7FAMyi = 3085 + INTEGER(IntKi), PARAMETER :: M1N8FAMyi = 3086 + INTEGER(IntKi), PARAMETER :: M1N9FAMyi = 3087 + INTEGER(IntKi), PARAMETER :: M2N1FAMyi = 3088 + INTEGER(IntKi), PARAMETER :: M2N2FAMyi = 3089 + INTEGER(IntKi), PARAMETER :: M2N3FAMyi = 3090 + INTEGER(IntKi), PARAMETER :: M2N4FAMyi = 3091 + INTEGER(IntKi), PARAMETER :: M2N5FAMyi = 3092 + INTEGER(IntKi), PARAMETER :: M2N6FAMyi = 3093 + INTEGER(IntKi), PARAMETER :: M2N7FAMyi = 3094 + INTEGER(IntKi), PARAMETER :: M2N8FAMyi = 3095 + INTEGER(IntKi), PARAMETER :: M2N9FAMyi = 3096 + INTEGER(IntKi), PARAMETER :: M3N1FAMyi = 3097 + INTEGER(IntKi), PARAMETER :: M3N2FAMyi = 3098 + INTEGER(IntKi), PARAMETER :: M3N3FAMyi = 3099 + INTEGER(IntKi), PARAMETER :: M3N4FAMyi = 3100 + INTEGER(IntKi), PARAMETER :: M3N5FAMyi = 3101 + INTEGER(IntKi), PARAMETER :: M3N6FAMyi = 3102 + INTEGER(IntKi), PARAMETER :: M3N7FAMyi = 3103 + INTEGER(IntKi), PARAMETER :: M3N8FAMyi = 3104 + INTEGER(IntKi), PARAMETER :: M3N9FAMyi = 3105 + INTEGER(IntKi), PARAMETER :: M4N1FAMyi = 3106 + INTEGER(IntKi), PARAMETER :: M4N2FAMyi = 3107 + INTEGER(IntKi), PARAMETER :: M4N3FAMyi = 3108 + INTEGER(IntKi), PARAMETER :: M4N4FAMyi = 3109 + INTEGER(IntKi), PARAMETER :: M4N5FAMyi = 3110 + INTEGER(IntKi), PARAMETER :: M4N6FAMyi = 3111 + INTEGER(IntKi), PARAMETER :: M4N7FAMyi = 3112 + INTEGER(IntKi), PARAMETER :: M4N8FAMyi = 3113 + INTEGER(IntKi), PARAMETER :: M4N9FAMyi = 3114 + INTEGER(IntKi), PARAMETER :: M5N1FAMyi = 3115 + INTEGER(IntKi), PARAMETER :: M5N2FAMyi = 3116 + INTEGER(IntKi), PARAMETER :: M5N3FAMyi = 3117 + INTEGER(IntKi), PARAMETER :: M5N4FAMyi = 3118 + INTEGER(IntKi), PARAMETER :: M5N5FAMyi = 3119 + INTEGER(IntKi), PARAMETER :: M5N6FAMyi = 3120 + INTEGER(IntKi), PARAMETER :: M5N7FAMyi = 3121 + INTEGER(IntKi), PARAMETER :: M5N8FAMyi = 3122 + INTEGER(IntKi), PARAMETER :: M5N9FAMyi = 3123 + INTEGER(IntKi), PARAMETER :: M6N1FAMyi = 3124 + INTEGER(IntKi), PARAMETER :: M6N2FAMyi = 3125 + INTEGER(IntKi), PARAMETER :: M6N3FAMyi = 3126 + INTEGER(IntKi), PARAMETER :: M6N4FAMyi = 3127 + INTEGER(IntKi), PARAMETER :: M6N5FAMyi = 3128 + INTEGER(IntKi), PARAMETER :: M6N6FAMyi = 3129 + INTEGER(IntKi), PARAMETER :: M6N7FAMyi = 3130 + INTEGER(IntKi), PARAMETER :: M6N8FAMyi = 3131 + INTEGER(IntKi), PARAMETER :: M6N9FAMyi = 3132 + INTEGER(IntKi), PARAMETER :: M7N1FAMyi = 3133 + INTEGER(IntKi), PARAMETER :: M7N2FAMyi = 3134 + INTEGER(IntKi), PARAMETER :: M7N3FAMyi = 3135 + INTEGER(IntKi), PARAMETER :: M7N4FAMyi = 3136 + INTEGER(IntKi), PARAMETER :: M7N5FAMyi = 3137 + INTEGER(IntKi), PARAMETER :: M7N6FAMyi = 3138 + INTEGER(IntKi), PARAMETER :: M7N7FAMyi = 3139 + INTEGER(IntKi), PARAMETER :: M7N8FAMyi = 3140 + INTEGER(IntKi), PARAMETER :: M7N9FAMyi = 3141 + INTEGER(IntKi), PARAMETER :: M8N1FAMyi = 3142 + INTEGER(IntKi), PARAMETER :: M8N2FAMyi = 3143 + INTEGER(IntKi), PARAMETER :: M8N3FAMyi = 3144 + INTEGER(IntKi), PARAMETER :: M8N4FAMyi = 3145 + INTEGER(IntKi), PARAMETER :: M8N5FAMyi = 3146 + INTEGER(IntKi), PARAMETER :: M8N6FAMyi = 3147 + INTEGER(IntKi), PARAMETER :: M8N7FAMyi = 3148 + INTEGER(IntKi), PARAMETER :: M8N8FAMyi = 3149 + INTEGER(IntKi), PARAMETER :: M8N9FAMyi = 3150 + INTEGER(IntKi), PARAMETER :: M9N1FAMyi = 3151 + INTEGER(IntKi), PARAMETER :: M9N2FAMyi = 3152 + INTEGER(IntKi), PARAMETER :: M9N3FAMyi = 3153 + INTEGER(IntKi), PARAMETER :: M9N4FAMyi = 3154 + INTEGER(IntKi), PARAMETER :: M9N5FAMyi = 3155 + INTEGER(IntKi), PARAMETER :: M9N6FAMyi = 3156 + INTEGER(IntKi), PARAMETER :: M9N7FAMyi = 3157 + INTEGER(IntKi), PARAMETER :: M9N8FAMyi = 3158 + INTEGER(IntKi), PARAMETER :: M9N9FAMyi = 3159 + INTEGER(IntKi), PARAMETER :: M1N1FAMzi = 3160 + INTEGER(IntKi), PARAMETER :: M1N2FAMzi = 3161 + INTEGER(IntKi), PARAMETER :: M1N3FAMzi = 3162 + INTEGER(IntKi), PARAMETER :: M1N4FAMzi = 3163 + INTEGER(IntKi), PARAMETER :: M1N5FAMzi = 3164 + INTEGER(IntKi), PARAMETER :: M1N6FAMzi = 3165 + INTEGER(IntKi), PARAMETER :: M1N7FAMzi = 3166 + INTEGER(IntKi), PARAMETER :: M1N8FAMzi = 3167 + INTEGER(IntKi), PARAMETER :: M1N9FAMzi = 3168 + INTEGER(IntKi), PARAMETER :: M2N1FAMzi = 3169 + INTEGER(IntKi), PARAMETER :: M2N2FAMzi = 3170 + INTEGER(IntKi), PARAMETER :: M2N3FAMzi = 3171 + INTEGER(IntKi), PARAMETER :: M2N4FAMzi = 3172 + INTEGER(IntKi), PARAMETER :: M2N5FAMzi = 3173 + INTEGER(IntKi), PARAMETER :: M2N6FAMzi = 3174 + INTEGER(IntKi), PARAMETER :: M2N7FAMzi = 3175 + INTEGER(IntKi), PARAMETER :: M2N8FAMzi = 3176 + INTEGER(IntKi), PARAMETER :: M2N9FAMzi = 3177 + INTEGER(IntKi), PARAMETER :: M3N1FAMzi = 3178 + INTEGER(IntKi), PARAMETER :: M3N2FAMzi = 3179 + INTEGER(IntKi), PARAMETER :: M3N3FAMzi = 3180 + INTEGER(IntKi), PARAMETER :: M3N4FAMzi = 3181 + INTEGER(IntKi), PARAMETER :: M3N5FAMzi = 3182 + INTEGER(IntKi), PARAMETER :: M3N6FAMzi = 3183 + INTEGER(IntKi), PARAMETER :: M3N7FAMzi = 3184 + INTEGER(IntKi), PARAMETER :: M3N8FAMzi = 3185 + INTEGER(IntKi), PARAMETER :: M3N9FAMzi = 3186 + INTEGER(IntKi), PARAMETER :: M4N1FAMzi = 3187 + INTEGER(IntKi), PARAMETER :: M4N2FAMzi = 3188 + INTEGER(IntKi), PARAMETER :: M4N3FAMzi = 3189 + INTEGER(IntKi), PARAMETER :: M4N4FAMzi = 3190 + INTEGER(IntKi), PARAMETER :: M4N5FAMzi = 3191 + INTEGER(IntKi), PARAMETER :: M4N6FAMzi = 3192 + INTEGER(IntKi), PARAMETER :: M4N7FAMzi = 3193 + INTEGER(IntKi), PARAMETER :: M4N8FAMzi = 3194 + INTEGER(IntKi), PARAMETER :: M4N9FAMzi = 3195 + INTEGER(IntKi), PARAMETER :: M5N1FAMzi = 3196 + INTEGER(IntKi), PARAMETER :: M5N2FAMzi = 3197 + INTEGER(IntKi), PARAMETER :: M5N3FAMzi = 3198 + INTEGER(IntKi), PARAMETER :: M5N4FAMzi = 3199 + INTEGER(IntKi), PARAMETER :: M5N5FAMzi = 3200 + INTEGER(IntKi), PARAMETER :: M5N6FAMzi = 3201 + INTEGER(IntKi), PARAMETER :: M5N7FAMzi = 3202 + INTEGER(IntKi), PARAMETER :: M5N8FAMzi = 3203 + INTEGER(IntKi), PARAMETER :: M5N9FAMzi = 3204 + INTEGER(IntKi), PARAMETER :: M6N1FAMzi = 3205 + INTEGER(IntKi), PARAMETER :: M6N2FAMzi = 3206 + INTEGER(IntKi), PARAMETER :: M6N3FAMzi = 3207 + INTEGER(IntKi), PARAMETER :: M6N4FAMzi = 3208 + INTEGER(IntKi), PARAMETER :: M6N5FAMzi = 3209 + INTEGER(IntKi), PARAMETER :: M6N6FAMzi = 3210 + INTEGER(IntKi), PARAMETER :: M6N7FAMzi = 3211 + INTEGER(IntKi), PARAMETER :: M6N8FAMzi = 3212 + INTEGER(IntKi), PARAMETER :: M6N9FAMzi = 3213 + INTEGER(IntKi), PARAMETER :: M7N1FAMzi = 3214 + INTEGER(IntKi), PARAMETER :: M7N2FAMzi = 3215 + INTEGER(IntKi), PARAMETER :: M7N3FAMzi = 3216 + INTEGER(IntKi), PARAMETER :: M7N4FAMzi = 3217 + INTEGER(IntKi), PARAMETER :: M7N5FAMzi = 3218 + INTEGER(IntKi), PARAMETER :: M7N6FAMzi = 3219 + INTEGER(IntKi), PARAMETER :: M7N7FAMzi = 3220 + INTEGER(IntKi), PARAMETER :: M7N8FAMzi = 3221 + INTEGER(IntKi), PARAMETER :: M7N9FAMzi = 3222 + INTEGER(IntKi), PARAMETER :: M8N1FAMzi = 3223 + INTEGER(IntKi), PARAMETER :: M8N2FAMzi = 3224 + INTEGER(IntKi), PARAMETER :: M8N3FAMzi = 3225 + INTEGER(IntKi), PARAMETER :: M8N4FAMzi = 3226 + INTEGER(IntKi), PARAMETER :: M8N5FAMzi = 3227 + INTEGER(IntKi), PARAMETER :: M8N6FAMzi = 3228 + INTEGER(IntKi), PARAMETER :: M8N7FAMzi = 3229 + INTEGER(IntKi), PARAMETER :: M8N8FAMzi = 3230 + INTEGER(IntKi), PARAMETER :: M8N9FAMzi = 3231 + INTEGER(IntKi), PARAMETER :: M9N1FAMzi = 3232 + INTEGER(IntKi), PARAMETER :: M9N2FAMzi = 3233 + INTEGER(IntKi), PARAMETER :: M9N3FAMzi = 3234 + INTEGER(IntKi), PARAMETER :: M9N4FAMzi = 3235 + INTEGER(IntKi), PARAMETER :: M9N5FAMzi = 3236 + INTEGER(IntKi), PARAMETER :: M9N6FAMzi = 3237 + INTEGER(IntKi), PARAMETER :: M9N7FAMzi = 3238 + INTEGER(IntKi), PARAMETER :: M9N8FAMzi = 3239 + INTEGER(IntKi), PARAMETER :: M9N9FAMzi = 3240 + INTEGER(IntKi), PARAMETER :: M1N1FAGxi = 3241 + INTEGER(IntKi), PARAMETER :: M1N2FAGxi = 3242 + INTEGER(IntKi), PARAMETER :: M1N3FAGxi = 3243 + INTEGER(IntKi), PARAMETER :: M1N4FAGxi = 3244 + INTEGER(IntKi), PARAMETER :: M1N5FAGxi = 3245 + INTEGER(IntKi), PARAMETER :: M1N6FAGxi = 3246 + INTEGER(IntKi), PARAMETER :: M1N7FAGxi = 3247 + INTEGER(IntKi), PARAMETER :: M1N8FAGxi = 3248 + INTEGER(IntKi), PARAMETER :: M1N9FAGxi = 3249 + INTEGER(IntKi), PARAMETER :: M2N1FAGxi = 3250 + INTEGER(IntKi), PARAMETER :: M2N2FAGxi = 3251 + INTEGER(IntKi), PARAMETER :: M2N3FAGxi = 3252 + INTEGER(IntKi), PARAMETER :: M2N4FAGxi = 3253 + INTEGER(IntKi), PARAMETER :: M2N5FAGxi = 3254 + INTEGER(IntKi), PARAMETER :: M2N6FAGxi = 3255 + INTEGER(IntKi), PARAMETER :: M2N7FAGxi = 3256 + INTEGER(IntKi), PARAMETER :: M2N8FAGxi = 3257 + INTEGER(IntKi), PARAMETER :: M2N9FAGxi = 3258 + INTEGER(IntKi), PARAMETER :: M3N1FAGxi = 3259 + INTEGER(IntKi), PARAMETER :: M3N2FAGxi = 3260 + INTEGER(IntKi), PARAMETER :: M3N3FAGxi = 3261 + INTEGER(IntKi), PARAMETER :: M3N4FAGxi = 3262 + INTEGER(IntKi), PARAMETER :: M3N5FAGxi = 3263 + INTEGER(IntKi), PARAMETER :: M3N6FAGxi = 3264 + INTEGER(IntKi), PARAMETER :: M3N7FAGxi = 3265 + INTEGER(IntKi), PARAMETER :: M3N8FAGxi = 3266 + INTEGER(IntKi), PARAMETER :: M3N9FAGxi = 3267 + INTEGER(IntKi), PARAMETER :: M4N1FAGxi = 3268 + INTEGER(IntKi), PARAMETER :: M4N2FAGxi = 3269 + INTEGER(IntKi), PARAMETER :: M4N3FAGxi = 3270 + INTEGER(IntKi), PARAMETER :: M4N4FAGxi = 3271 + INTEGER(IntKi), PARAMETER :: M4N5FAGxi = 3272 + INTEGER(IntKi), PARAMETER :: M4N6FAGxi = 3273 + INTEGER(IntKi), PARAMETER :: M4N7FAGxi = 3274 + INTEGER(IntKi), PARAMETER :: M4N8FAGxi = 3275 + INTEGER(IntKi), PARAMETER :: M4N9FAGxi = 3276 + INTEGER(IntKi), PARAMETER :: M5N1FAGxi = 3277 + INTEGER(IntKi), PARAMETER :: M5N2FAGxi = 3278 + INTEGER(IntKi), PARAMETER :: M5N3FAGxi = 3279 + INTEGER(IntKi), PARAMETER :: M5N4FAGxi = 3280 + INTEGER(IntKi), PARAMETER :: M5N5FAGxi = 3281 + INTEGER(IntKi), PARAMETER :: M5N6FAGxi = 3282 + INTEGER(IntKi), PARAMETER :: M5N7FAGxi = 3283 + INTEGER(IntKi), PARAMETER :: M5N8FAGxi = 3284 + INTEGER(IntKi), PARAMETER :: M5N9FAGxi = 3285 + INTEGER(IntKi), PARAMETER :: M6N1FAGxi = 3286 + INTEGER(IntKi), PARAMETER :: M6N2FAGxi = 3287 + INTEGER(IntKi), PARAMETER :: M6N3FAGxi = 3288 + INTEGER(IntKi), PARAMETER :: M6N4FAGxi = 3289 + INTEGER(IntKi), PARAMETER :: M6N5FAGxi = 3290 + INTEGER(IntKi), PARAMETER :: M6N6FAGxi = 3291 + INTEGER(IntKi), PARAMETER :: M6N7FAGxi = 3292 + INTEGER(IntKi), PARAMETER :: M6N8FAGxi = 3293 + INTEGER(IntKi), PARAMETER :: M6N9FAGxi = 3294 + INTEGER(IntKi), PARAMETER :: M7N1FAGxi = 3295 + INTEGER(IntKi), PARAMETER :: M7N2FAGxi = 3296 + INTEGER(IntKi), PARAMETER :: M7N3FAGxi = 3297 + INTEGER(IntKi), PARAMETER :: M7N4FAGxi = 3298 + INTEGER(IntKi), PARAMETER :: M7N5FAGxi = 3299 + INTEGER(IntKi), PARAMETER :: M7N6FAGxi = 3300 + INTEGER(IntKi), PARAMETER :: M7N7FAGxi = 3301 + INTEGER(IntKi), PARAMETER :: M7N8FAGxi = 3302 + INTEGER(IntKi), PARAMETER :: M7N9FAGxi = 3303 + INTEGER(IntKi), PARAMETER :: M8N1FAGxi = 3304 + INTEGER(IntKi), PARAMETER :: M8N2FAGxi = 3305 + INTEGER(IntKi), PARAMETER :: M8N3FAGxi = 3306 + INTEGER(IntKi), PARAMETER :: M8N4FAGxi = 3307 + INTEGER(IntKi), PARAMETER :: M8N5FAGxi = 3308 + INTEGER(IntKi), PARAMETER :: M8N6FAGxi = 3309 + INTEGER(IntKi), PARAMETER :: M8N7FAGxi = 3310 + INTEGER(IntKi), PARAMETER :: M8N8FAGxi = 3311 + INTEGER(IntKi), PARAMETER :: M8N9FAGxi = 3312 + INTEGER(IntKi), PARAMETER :: M9N1FAGxi = 3313 + INTEGER(IntKi), PARAMETER :: M9N2FAGxi = 3314 + INTEGER(IntKi), PARAMETER :: M9N3FAGxi = 3315 + INTEGER(IntKi), PARAMETER :: M9N4FAGxi = 3316 + INTEGER(IntKi), PARAMETER :: M9N5FAGxi = 3317 + INTEGER(IntKi), PARAMETER :: M9N6FAGxi = 3318 + INTEGER(IntKi), PARAMETER :: M9N7FAGxi = 3319 + INTEGER(IntKi), PARAMETER :: M9N8FAGxi = 3320 + INTEGER(IntKi), PARAMETER :: M9N9FAGxi = 3321 + INTEGER(IntKi), PARAMETER :: M1N1FAGyi = 3322 + INTEGER(IntKi), PARAMETER :: M1N2FAGyi = 3323 + INTEGER(IntKi), PARAMETER :: M1N3FAGyi = 3324 + INTEGER(IntKi), PARAMETER :: M1N4FAGyi = 3325 + INTEGER(IntKi), PARAMETER :: M1N5FAGyi = 3326 + INTEGER(IntKi), PARAMETER :: M1N6FAGyi = 3327 + INTEGER(IntKi), PARAMETER :: M1N7FAGyi = 3328 + INTEGER(IntKi), PARAMETER :: M1N8FAGyi = 3329 + INTEGER(IntKi), PARAMETER :: M1N9FAGyi = 3330 + INTEGER(IntKi), PARAMETER :: M2N1FAGyi = 3331 + INTEGER(IntKi), PARAMETER :: M2N2FAGyi = 3332 + INTEGER(IntKi), PARAMETER :: M2N3FAGyi = 3333 + INTEGER(IntKi), PARAMETER :: M2N4FAGyi = 3334 + INTEGER(IntKi), PARAMETER :: M2N5FAGyi = 3335 + INTEGER(IntKi), PARAMETER :: M2N6FAGyi = 3336 + INTEGER(IntKi), PARAMETER :: M2N7FAGyi = 3337 + INTEGER(IntKi), PARAMETER :: M2N8FAGyi = 3338 + INTEGER(IntKi), PARAMETER :: M2N9FAGyi = 3339 + INTEGER(IntKi), PARAMETER :: M3N1FAGyi = 3340 + INTEGER(IntKi), PARAMETER :: M3N2FAGyi = 3341 + INTEGER(IntKi), PARAMETER :: M3N3FAGyi = 3342 + INTEGER(IntKi), PARAMETER :: M3N4FAGyi = 3343 + INTEGER(IntKi), PARAMETER :: M3N5FAGyi = 3344 + INTEGER(IntKi), PARAMETER :: M3N6FAGyi = 3345 + INTEGER(IntKi), PARAMETER :: M3N7FAGyi = 3346 + INTEGER(IntKi), PARAMETER :: M3N8FAGyi = 3347 + INTEGER(IntKi), PARAMETER :: M3N9FAGyi = 3348 + INTEGER(IntKi), PARAMETER :: M4N1FAGyi = 3349 + INTEGER(IntKi), PARAMETER :: M4N2FAGyi = 3350 + INTEGER(IntKi), PARAMETER :: M4N3FAGyi = 3351 + INTEGER(IntKi), PARAMETER :: M4N4FAGyi = 3352 + INTEGER(IntKi), PARAMETER :: M4N5FAGyi = 3353 + INTEGER(IntKi), PARAMETER :: M4N6FAGyi = 3354 + INTEGER(IntKi), PARAMETER :: M4N7FAGyi = 3355 + INTEGER(IntKi), PARAMETER :: M4N8FAGyi = 3356 + INTEGER(IntKi), PARAMETER :: M4N9FAGyi = 3357 + INTEGER(IntKi), PARAMETER :: M5N1FAGyi = 3358 + INTEGER(IntKi), PARAMETER :: M5N2FAGyi = 3359 + INTEGER(IntKi), PARAMETER :: M5N3FAGyi = 3360 + INTEGER(IntKi), PARAMETER :: M5N4FAGyi = 3361 + INTEGER(IntKi), PARAMETER :: M5N5FAGyi = 3362 + INTEGER(IntKi), PARAMETER :: M5N6FAGyi = 3363 + INTEGER(IntKi), PARAMETER :: M5N7FAGyi = 3364 + INTEGER(IntKi), PARAMETER :: M5N8FAGyi = 3365 + INTEGER(IntKi), PARAMETER :: M5N9FAGyi = 3366 + INTEGER(IntKi), PARAMETER :: M6N1FAGyi = 3367 + INTEGER(IntKi), PARAMETER :: M6N2FAGyi = 3368 + INTEGER(IntKi), PARAMETER :: M6N3FAGyi = 3369 + INTEGER(IntKi), PARAMETER :: M6N4FAGyi = 3370 + INTEGER(IntKi), PARAMETER :: M6N5FAGyi = 3371 + INTEGER(IntKi), PARAMETER :: M6N6FAGyi = 3372 + INTEGER(IntKi), PARAMETER :: M6N7FAGyi = 3373 + INTEGER(IntKi), PARAMETER :: M6N8FAGyi = 3374 + INTEGER(IntKi), PARAMETER :: M6N9FAGyi = 3375 + INTEGER(IntKi), PARAMETER :: M7N1FAGyi = 3376 + INTEGER(IntKi), PARAMETER :: M7N2FAGyi = 3377 + INTEGER(IntKi), PARAMETER :: M7N3FAGyi = 3378 + INTEGER(IntKi), PARAMETER :: M7N4FAGyi = 3379 + INTEGER(IntKi), PARAMETER :: M7N5FAGyi = 3380 + INTEGER(IntKi), PARAMETER :: M7N6FAGyi = 3381 + INTEGER(IntKi), PARAMETER :: M7N7FAGyi = 3382 + INTEGER(IntKi), PARAMETER :: M7N8FAGyi = 3383 + INTEGER(IntKi), PARAMETER :: M7N9FAGyi = 3384 + INTEGER(IntKi), PARAMETER :: M8N1FAGyi = 3385 + INTEGER(IntKi), PARAMETER :: M8N2FAGyi = 3386 + INTEGER(IntKi), PARAMETER :: M8N3FAGyi = 3387 + INTEGER(IntKi), PARAMETER :: M8N4FAGyi = 3388 + INTEGER(IntKi), PARAMETER :: M8N5FAGyi = 3389 + INTEGER(IntKi), PARAMETER :: M8N6FAGyi = 3390 + INTEGER(IntKi), PARAMETER :: M8N7FAGyi = 3391 + INTEGER(IntKi), PARAMETER :: M8N8FAGyi = 3392 + INTEGER(IntKi), PARAMETER :: M8N9FAGyi = 3393 + INTEGER(IntKi), PARAMETER :: M9N1FAGyi = 3394 + INTEGER(IntKi), PARAMETER :: M9N2FAGyi = 3395 + INTEGER(IntKi), PARAMETER :: M9N3FAGyi = 3396 + INTEGER(IntKi), PARAMETER :: M9N4FAGyi = 3397 + INTEGER(IntKi), PARAMETER :: M9N5FAGyi = 3398 + INTEGER(IntKi), PARAMETER :: M9N6FAGyi = 3399 + INTEGER(IntKi), PARAMETER :: M9N7FAGyi = 3400 + INTEGER(IntKi), PARAMETER :: M9N8FAGyi = 3401 + INTEGER(IntKi), PARAMETER :: M9N9FAGyi = 3402 + INTEGER(IntKi), PARAMETER :: M1N1FAGzi = 3403 + INTEGER(IntKi), PARAMETER :: M1N2FAGzi = 3404 + INTEGER(IntKi), PARAMETER :: M1N3FAGzi = 3405 + INTEGER(IntKi), PARAMETER :: M1N4FAGzi = 3406 + INTEGER(IntKi), PARAMETER :: M1N5FAGzi = 3407 + INTEGER(IntKi), PARAMETER :: M1N6FAGzi = 3408 + INTEGER(IntKi), PARAMETER :: M1N7FAGzi = 3409 + INTEGER(IntKi), PARAMETER :: M1N8FAGzi = 3410 + INTEGER(IntKi), PARAMETER :: M1N9FAGzi = 3411 + INTEGER(IntKi), PARAMETER :: M2N1FAGzi = 3412 + INTEGER(IntKi), PARAMETER :: M2N2FAGzi = 3413 + INTEGER(IntKi), PARAMETER :: M2N3FAGzi = 3414 + INTEGER(IntKi), PARAMETER :: M2N4FAGzi = 3415 + INTEGER(IntKi), PARAMETER :: M2N5FAGzi = 3416 + INTEGER(IntKi), PARAMETER :: M2N6FAGzi = 3417 + INTEGER(IntKi), PARAMETER :: M2N7FAGzi = 3418 + INTEGER(IntKi), PARAMETER :: M2N8FAGzi = 3419 + INTEGER(IntKi), PARAMETER :: M2N9FAGzi = 3420 + INTEGER(IntKi), PARAMETER :: M3N1FAGzi = 3421 + INTEGER(IntKi), PARAMETER :: M3N2FAGzi = 3422 + INTEGER(IntKi), PARAMETER :: M3N3FAGzi = 3423 + INTEGER(IntKi), PARAMETER :: M3N4FAGzi = 3424 + INTEGER(IntKi), PARAMETER :: M3N5FAGzi = 3425 + INTEGER(IntKi), PARAMETER :: M3N6FAGzi = 3426 + INTEGER(IntKi), PARAMETER :: M3N7FAGzi = 3427 + INTEGER(IntKi), PARAMETER :: M3N8FAGzi = 3428 + INTEGER(IntKi), PARAMETER :: M3N9FAGzi = 3429 + INTEGER(IntKi), PARAMETER :: M4N1FAGzi = 3430 + INTEGER(IntKi), PARAMETER :: M4N2FAGzi = 3431 + INTEGER(IntKi), PARAMETER :: M4N3FAGzi = 3432 + INTEGER(IntKi), PARAMETER :: M4N4FAGzi = 3433 + INTEGER(IntKi), PARAMETER :: M4N5FAGzi = 3434 + INTEGER(IntKi), PARAMETER :: M4N6FAGzi = 3435 + INTEGER(IntKi), PARAMETER :: M4N7FAGzi = 3436 + INTEGER(IntKi), PARAMETER :: M4N8FAGzi = 3437 + INTEGER(IntKi), PARAMETER :: M4N9FAGzi = 3438 + INTEGER(IntKi), PARAMETER :: M5N1FAGzi = 3439 + INTEGER(IntKi), PARAMETER :: M5N2FAGzi = 3440 + INTEGER(IntKi), PARAMETER :: M5N3FAGzi = 3441 + INTEGER(IntKi), PARAMETER :: M5N4FAGzi = 3442 + INTEGER(IntKi), PARAMETER :: M5N5FAGzi = 3443 + INTEGER(IntKi), PARAMETER :: M5N6FAGzi = 3444 + INTEGER(IntKi), PARAMETER :: M5N7FAGzi = 3445 + INTEGER(IntKi), PARAMETER :: M5N8FAGzi = 3446 + INTEGER(IntKi), PARAMETER :: M5N9FAGzi = 3447 + INTEGER(IntKi), PARAMETER :: M6N1FAGzi = 3448 + INTEGER(IntKi), PARAMETER :: M6N2FAGzi = 3449 + INTEGER(IntKi), PARAMETER :: M6N3FAGzi = 3450 + INTEGER(IntKi), PARAMETER :: M6N4FAGzi = 3451 + INTEGER(IntKi), PARAMETER :: M6N5FAGzi = 3452 + INTEGER(IntKi), PARAMETER :: M6N6FAGzi = 3453 + INTEGER(IntKi), PARAMETER :: M6N7FAGzi = 3454 + INTEGER(IntKi), PARAMETER :: M6N8FAGzi = 3455 + INTEGER(IntKi), PARAMETER :: M6N9FAGzi = 3456 + INTEGER(IntKi), PARAMETER :: M7N1FAGzi = 3457 + INTEGER(IntKi), PARAMETER :: M7N2FAGzi = 3458 + INTEGER(IntKi), PARAMETER :: M7N3FAGzi = 3459 + INTEGER(IntKi), PARAMETER :: M7N4FAGzi = 3460 + INTEGER(IntKi), PARAMETER :: M7N5FAGzi = 3461 + INTEGER(IntKi), PARAMETER :: M7N6FAGzi = 3462 + INTEGER(IntKi), PARAMETER :: M7N7FAGzi = 3463 + INTEGER(IntKi), PARAMETER :: M7N8FAGzi = 3464 + INTEGER(IntKi), PARAMETER :: M7N9FAGzi = 3465 + INTEGER(IntKi), PARAMETER :: M8N1FAGzi = 3466 + INTEGER(IntKi), PARAMETER :: M8N2FAGzi = 3467 + INTEGER(IntKi), PARAMETER :: M8N3FAGzi = 3468 + INTEGER(IntKi), PARAMETER :: M8N4FAGzi = 3469 + INTEGER(IntKi), PARAMETER :: M8N5FAGzi = 3470 + INTEGER(IntKi), PARAMETER :: M8N6FAGzi = 3471 + INTEGER(IntKi), PARAMETER :: M8N7FAGzi = 3472 + INTEGER(IntKi), PARAMETER :: M8N8FAGzi = 3473 + INTEGER(IntKi), PARAMETER :: M8N9FAGzi = 3474 + INTEGER(IntKi), PARAMETER :: M9N1FAGzi = 3475 + INTEGER(IntKi), PARAMETER :: M9N2FAGzi = 3476 + INTEGER(IntKi), PARAMETER :: M9N3FAGzi = 3477 + INTEGER(IntKi), PARAMETER :: M9N4FAGzi = 3478 + INTEGER(IntKi), PARAMETER :: M9N5FAGzi = 3479 + INTEGER(IntKi), PARAMETER :: M9N6FAGzi = 3480 + INTEGER(IntKi), PARAMETER :: M9N7FAGzi = 3481 + INTEGER(IntKi), PARAMETER :: M9N8FAGzi = 3482 + INTEGER(IntKi), PARAMETER :: M9N9FAGzi = 3483 + INTEGER(IntKi), PARAMETER :: M1N1MAGxi = 3484 + INTEGER(IntKi), PARAMETER :: M1N2MAGxi = 3485 + INTEGER(IntKi), PARAMETER :: M1N3MAGxi = 3486 + INTEGER(IntKi), PARAMETER :: M1N4MAGxi = 3487 + INTEGER(IntKi), PARAMETER :: M1N5MAGxi = 3488 + INTEGER(IntKi), PARAMETER :: M1N6MAGxi = 3489 + INTEGER(IntKi), PARAMETER :: M1N7MAGxi = 3490 + INTEGER(IntKi), PARAMETER :: M1N8MAGxi = 3491 + INTEGER(IntKi), PARAMETER :: M1N9MAGxi = 3492 + INTEGER(IntKi), PARAMETER :: M2N1MAGxi = 3493 + INTEGER(IntKi), PARAMETER :: M2N2MAGxi = 3494 + INTEGER(IntKi), PARAMETER :: M2N3MAGxi = 3495 + INTEGER(IntKi), PARAMETER :: M2N4MAGxi = 3496 + INTEGER(IntKi), PARAMETER :: M2N5MAGxi = 3497 + INTEGER(IntKi), PARAMETER :: M2N6MAGxi = 3498 + INTEGER(IntKi), PARAMETER :: M2N7MAGxi = 3499 + INTEGER(IntKi), PARAMETER :: M2N8MAGxi = 3500 + INTEGER(IntKi), PARAMETER :: M2N9MAGxi = 3501 + INTEGER(IntKi), PARAMETER :: M3N1MAGxi = 3502 + INTEGER(IntKi), PARAMETER :: M3N2MAGxi = 3503 + INTEGER(IntKi), PARAMETER :: M3N3MAGxi = 3504 + INTEGER(IntKi), PARAMETER :: M3N4MAGxi = 3505 + INTEGER(IntKi), PARAMETER :: M3N5MAGxi = 3506 + INTEGER(IntKi), PARAMETER :: M3N6MAGxi = 3507 + INTEGER(IntKi), PARAMETER :: M3N7MAGxi = 3508 + INTEGER(IntKi), PARAMETER :: M3N8MAGxi = 3509 + INTEGER(IntKi), PARAMETER :: M3N9MAGxi = 3510 + INTEGER(IntKi), PARAMETER :: M4N1MAGxi = 3511 + INTEGER(IntKi), PARAMETER :: M4N2MAGxi = 3512 + INTEGER(IntKi), PARAMETER :: M4N3MAGxi = 3513 + INTEGER(IntKi), PARAMETER :: M4N4MAGxi = 3514 + INTEGER(IntKi), PARAMETER :: M4N5MAGxi = 3515 + INTEGER(IntKi), PARAMETER :: M4N6MAGxi = 3516 + INTEGER(IntKi), PARAMETER :: M4N7MAGxi = 3517 + INTEGER(IntKi), PARAMETER :: M4N8MAGxi = 3518 + INTEGER(IntKi), PARAMETER :: M4N9MAGxi = 3519 + INTEGER(IntKi), PARAMETER :: M5N1MAGxi = 3520 + INTEGER(IntKi), PARAMETER :: M5N2MAGxi = 3521 + INTEGER(IntKi), PARAMETER :: M5N3MAGxi = 3522 + INTEGER(IntKi), PARAMETER :: M5N4MAGxi = 3523 + INTEGER(IntKi), PARAMETER :: M5N5MAGxi = 3524 + INTEGER(IntKi), PARAMETER :: M5N6MAGxi = 3525 + INTEGER(IntKi), PARAMETER :: M5N7MAGxi = 3526 + INTEGER(IntKi), PARAMETER :: M5N8MAGxi = 3527 + INTEGER(IntKi), PARAMETER :: M5N9MAGxi = 3528 + INTEGER(IntKi), PARAMETER :: M6N1MAGxi = 3529 + INTEGER(IntKi), PARAMETER :: M6N2MAGxi = 3530 + INTEGER(IntKi), PARAMETER :: M6N3MAGxi = 3531 + INTEGER(IntKi), PARAMETER :: M6N4MAGxi = 3532 + INTEGER(IntKi), PARAMETER :: M6N5MAGxi = 3533 + INTEGER(IntKi), PARAMETER :: M6N6MAGxi = 3534 + INTEGER(IntKi), PARAMETER :: M6N7MAGxi = 3535 + INTEGER(IntKi), PARAMETER :: M6N8MAGxi = 3536 + INTEGER(IntKi), PARAMETER :: M6N9MAGxi = 3537 + INTEGER(IntKi), PARAMETER :: M7N1MAGxi = 3538 + INTEGER(IntKi), PARAMETER :: M7N2MAGxi = 3539 + INTEGER(IntKi), PARAMETER :: M7N3MAGxi = 3540 + INTEGER(IntKi), PARAMETER :: M7N4MAGxi = 3541 + INTEGER(IntKi), PARAMETER :: M7N5MAGxi = 3542 + INTEGER(IntKi), PARAMETER :: M7N6MAGxi = 3543 + INTEGER(IntKi), PARAMETER :: M7N7MAGxi = 3544 + INTEGER(IntKi), PARAMETER :: M7N8MAGxi = 3545 + INTEGER(IntKi), PARAMETER :: M7N9MAGxi = 3546 + INTEGER(IntKi), PARAMETER :: M8N1MAGxi = 3547 + INTEGER(IntKi), PARAMETER :: M8N2MAGxi = 3548 + INTEGER(IntKi), PARAMETER :: M8N3MAGxi = 3549 + INTEGER(IntKi), PARAMETER :: M8N4MAGxi = 3550 + INTEGER(IntKi), PARAMETER :: M8N5MAGxi = 3551 + INTEGER(IntKi), PARAMETER :: M8N6MAGxi = 3552 + INTEGER(IntKi), PARAMETER :: M8N7MAGxi = 3553 + INTEGER(IntKi), PARAMETER :: M8N8MAGxi = 3554 + INTEGER(IntKi), PARAMETER :: M8N9MAGxi = 3555 + INTEGER(IntKi), PARAMETER :: M9N1MAGxi = 3556 + INTEGER(IntKi), PARAMETER :: M9N2MAGxi = 3557 + INTEGER(IntKi), PARAMETER :: M9N3MAGxi = 3558 + INTEGER(IntKi), PARAMETER :: M9N4MAGxi = 3559 + INTEGER(IntKi), PARAMETER :: M9N5MAGxi = 3560 + INTEGER(IntKi), PARAMETER :: M9N6MAGxi = 3561 + INTEGER(IntKi), PARAMETER :: M9N7MAGxi = 3562 + INTEGER(IntKi), PARAMETER :: M9N8MAGxi = 3563 + INTEGER(IntKi), PARAMETER :: M9N9MAGxi = 3564 + INTEGER(IntKi), PARAMETER :: M1N1MAGyi = 3565 + INTEGER(IntKi), PARAMETER :: M1N2MAGyi = 3566 + INTEGER(IntKi), PARAMETER :: M1N3MAGyi = 3567 + INTEGER(IntKi), PARAMETER :: M1N4MAGyi = 3568 + INTEGER(IntKi), PARAMETER :: M1N5MAGyi = 3569 + INTEGER(IntKi), PARAMETER :: M1N6MAGyi = 3570 + INTEGER(IntKi), PARAMETER :: M1N7MAGyi = 3571 + INTEGER(IntKi), PARAMETER :: M1N8MAGyi = 3572 + INTEGER(IntKi), PARAMETER :: M1N9MAGyi = 3573 + INTEGER(IntKi), PARAMETER :: M2N1MAGyi = 3574 + INTEGER(IntKi), PARAMETER :: M2N2MAGyi = 3575 + INTEGER(IntKi), PARAMETER :: M2N3MAGyi = 3576 + INTEGER(IntKi), PARAMETER :: M2N4MAGyi = 3577 + INTEGER(IntKi), PARAMETER :: M2N5MAGyi = 3578 + INTEGER(IntKi), PARAMETER :: M2N6MAGyi = 3579 + INTEGER(IntKi), PARAMETER :: M2N7MAGyi = 3580 + INTEGER(IntKi), PARAMETER :: M2N8MAGyi = 3581 + INTEGER(IntKi), PARAMETER :: M2N9MAGyi = 3582 + INTEGER(IntKi), PARAMETER :: M3N1MAGyi = 3583 + INTEGER(IntKi), PARAMETER :: M3N2MAGyi = 3584 + INTEGER(IntKi), PARAMETER :: M3N3MAGyi = 3585 + INTEGER(IntKi), PARAMETER :: M3N4MAGyi = 3586 + INTEGER(IntKi), PARAMETER :: M3N5MAGyi = 3587 + INTEGER(IntKi), PARAMETER :: M3N6MAGyi = 3588 + INTEGER(IntKi), PARAMETER :: M3N7MAGyi = 3589 + INTEGER(IntKi), PARAMETER :: M3N8MAGyi = 3590 + INTEGER(IntKi), PARAMETER :: M3N9MAGyi = 3591 + INTEGER(IntKi), PARAMETER :: M4N1MAGyi = 3592 + INTEGER(IntKi), PARAMETER :: M4N2MAGyi = 3593 + INTEGER(IntKi), PARAMETER :: M4N3MAGyi = 3594 + INTEGER(IntKi), PARAMETER :: M4N4MAGyi = 3595 + INTEGER(IntKi), PARAMETER :: M4N5MAGyi = 3596 + INTEGER(IntKi), PARAMETER :: M4N6MAGyi = 3597 + INTEGER(IntKi), PARAMETER :: M4N7MAGyi = 3598 + INTEGER(IntKi), PARAMETER :: M4N8MAGyi = 3599 + INTEGER(IntKi), PARAMETER :: M4N9MAGyi = 3600 + INTEGER(IntKi), PARAMETER :: M5N1MAGyi = 3601 + INTEGER(IntKi), PARAMETER :: M5N2MAGyi = 3602 + INTEGER(IntKi), PARAMETER :: M5N3MAGyi = 3603 + INTEGER(IntKi), PARAMETER :: M5N4MAGyi = 3604 + INTEGER(IntKi), PARAMETER :: M5N5MAGyi = 3605 + INTEGER(IntKi), PARAMETER :: M5N6MAGyi = 3606 + INTEGER(IntKi), PARAMETER :: M5N7MAGyi = 3607 + INTEGER(IntKi), PARAMETER :: M5N8MAGyi = 3608 + INTEGER(IntKi), PARAMETER :: M5N9MAGyi = 3609 + INTEGER(IntKi), PARAMETER :: M6N1MAGyi = 3610 + INTEGER(IntKi), PARAMETER :: M6N2MAGyi = 3611 + INTEGER(IntKi), PARAMETER :: M6N3MAGyi = 3612 + INTEGER(IntKi), PARAMETER :: M6N4MAGyi = 3613 + INTEGER(IntKi), PARAMETER :: M6N5MAGyi = 3614 + INTEGER(IntKi), PARAMETER :: M6N6MAGyi = 3615 + INTEGER(IntKi), PARAMETER :: M6N7MAGyi = 3616 + INTEGER(IntKi), PARAMETER :: M6N8MAGyi = 3617 + INTEGER(IntKi), PARAMETER :: M6N9MAGyi = 3618 + INTEGER(IntKi), PARAMETER :: M7N1MAGyi = 3619 + INTEGER(IntKi), PARAMETER :: M7N2MAGyi = 3620 + INTEGER(IntKi), PARAMETER :: M7N3MAGyi = 3621 + INTEGER(IntKi), PARAMETER :: M7N4MAGyi = 3622 + INTEGER(IntKi), PARAMETER :: M7N5MAGyi = 3623 + INTEGER(IntKi), PARAMETER :: M7N6MAGyi = 3624 + INTEGER(IntKi), PARAMETER :: M7N7MAGyi = 3625 + INTEGER(IntKi), PARAMETER :: M7N8MAGyi = 3626 + INTEGER(IntKi), PARAMETER :: M7N9MAGyi = 3627 + INTEGER(IntKi), PARAMETER :: M8N1MAGyi = 3628 + INTEGER(IntKi), PARAMETER :: M8N2MAGyi = 3629 + INTEGER(IntKi), PARAMETER :: M8N3MAGyi = 3630 + INTEGER(IntKi), PARAMETER :: M8N4MAGyi = 3631 + INTEGER(IntKi), PARAMETER :: M8N5MAGyi = 3632 + INTEGER(IntKi), PARAMETER :: M8N6MAGyi = 3633 + INTEGER(IntKi), PARAMETER :: M8N7MAGyi = 3634 + INTEGER(IntKi), PARAMETER :: M8N8MAGyi = 3635 + INTEGER(IntKi), PARAMETER :: M8N9MAGyi = 3636 + INTEGER(IntKi), PARAMETER :: M9N1MAGyi = 3637 + INTEGER(IntKi), PARAMETER :: M9N2MAGyi = 3638 + INTEGER(IntKi), PARAMETER :: M9N3MAGyi = 3639 + INTEGER(IntKi), PARAMETER :: M9N4MAGyi = 3640 + INTEGER(IntKi), PARAMETER :: M9N5MAGyi = 3641 + INTEGER(IntKi), PARAMETER :: M9N6MAGyi = 3642 + INTEGER(IntKi), PARAMETER :: M9N7MAGyi = 3643 + INTEGER(IntKi), PARAMETER :: M9N8MAGyi = 3644 + INTEGER(IntKi), PARAMETER :: M9N9MAGyi = 3645 + INTEGER(IntKi), PARAMETER :: M1N1MAGzi = 3646 + INTEGER(IntKi), PARAMETER :: M1N2MAGzi = 3647 + INTEGER(IntKi), PARAMETER :: M1N3MAGzi = 3648 + INTEGER(IntKi), PARAMETER :: M1N4MAGzi = 3649 + INTEGER(IntKi), PARAMETER :: M1N5MAGzi = 3650 + INTEGER(IntKi), PARAMETER :: M1N6MAGzi = 3651 + INTEGER(IntKi), PARAMETER :: M1N7MAGzi = 3652 + INTEGER(IntKi), PARAMETER :: M1N8MAGzi = 3653 + INTEGER(IntKi), PARAMETER :: M1N9MAGzi = 3654 + INTEGER(IntKi), PARAMETER :: M2N1MAGzi = 3655 + INTEGER(IntKi), PARAMETER :: M2N2MAGzi = 3656 + INTEGER(IntKi), PARAMETER :: M2N3MAGzi = 3657 + INTEGER(IntKi), PARAMETER :: M2N4MAGzi = 3658 + INTEGER(IntKi), PARAMETER :: M2N5MAGzi = 3659 + INTEGER(IntKi), PARAMETER :: M2N6MAGzi = 3660 + INTEGER(IntKi), PARAMETER :: M2N7MAGzi = 3661 + INTEGER(IntKi), PARAMETER :: M2N8MAGzi = 3662 + INTEGER(IntKi), PARAMETER :: M2N9MAGzi = 3663 + INTEGER(IntKi), PARAMETER :: M3N1MAGzi = 3664 + INTEGER(IntKi), PARAMETER :: M3N2MAGzi = 3665 + INTEGER(IntKi), PARAMETER :: M3N3MAGzi = 3666 + INTEGER(IntKi), PARAMETER :: M3N4MAGzi = 3667 + INTEGER(IntKi), PARAMETER :: M3N5MAGzi = 3668 + INTEGER(IntKi), PARAMETER :: M3N6MAGzi = 3669 + INTEGER(IntKi), PARAMETER :: M3N7MAGzi = 3670 + INTEGER(IntKi), PARAMETER :: M3N8MAGzi = 3671 + INTEGER(IntKi), PARAMETER :: M3N9MAGzi = 3672 + INTEGER(IntKi), PARAMETER :: M4N1MAGzi = 3673 + INTEGER(IntKi), PARAMETER :: M4N2MAGzi = 3674 + INTEGER(IntKi), PARAMETER :: M4N3MAGzi = 3675 + INTEGER(IntKi), PARAMETER :: M4N4MAGzi = 3676 + INTEGER(IntKi), PARAMETER :: M4N5MAGzi = 3677 + INTEGER(IntKi), PARAMETER :: M4N6MAGzi = 3678 + INTEGER(IntKi), PARAMETER :: M4N7MAGzi = 3679 + INTEGER(IntKi), PARAMETER :: M4N8MAGzi = 3680 + INTEGER(IntKi), PARAMETER :: M4N9MAGzi = 3681 + INTEGER(IntKi), PARAMETER :: M5N1MAGzi = 3682 + INTEGER(IntKi), PARAMETER :: M5N2MAGzi = 3683 + INTEGER(IntKi), PARAMETER :: M5N3MAGzi = 3684 + INTEGER(IntKi), PARAMETER :: M5N4MAGzi = 3685 + INTEGER(IntKi), PARAMETER :: M5N5MAGzi = 3686 + INTEGER(IntKi), PARAMETER :: M5N6MAGzi = 3687 + INTEGER(IntKi), PARAMETER :: M5N7MAGzi = 3688 + INTEGER(IntKi), PARAMETER :: M5N8MAGzi = 3689 + INTEGER(IntKi), PARAMETER :: M5N9MAGzi = 3690 + INTEGER(IntKi), PARAMETER :: M6N1MAGzi = 3691 + INTEGER(IntKi), PARAMETER :: M6N2MAGzi = 3692 + INTEGER(IntKi), PARAMETER :: M6N3MAGzi = 3693 + INTEGER(IntKi), PARAMETER :: M6N4MAGzi = 3694 + INTEGER(IntKi), PARAMETER :: M6N5MAGzi = 3695 + INTEGER(IntKi), PARAMETER :: M6N6MAGzi = 3696 + INTEGER(IntKi), PARAMETER :: M6N7MAGzi = 3697 + INTEGER(IntKi), PARAMETER :: M6N8MAGzi = 3698 + INTEGER(IntKi), PARAMETER :: M6N9MAGzi = 3699 + INTEGER(IntKi), PARAMETER :: M7N1MAGzi = 3700 + INTEGER(IntKi), PARAMETER :: M7N2MAGzi = 3701 + INTEGER(IntKi), PARAMETER :: M7N3MAGzi = 3702 + INTEGER(IntKi), PARAMETER :: M7N4MAGzi = 3703 + INTEGER(IntKi), PARAMETER :: M7N5MAGzi = 3704 + INTEGER(IntKi), PARAMETER :: M7N6MAGzi = 3705 + INTEGER(IntKi), PARAMETER :: M7N7MAGzi = 3706 + INTEGER(IntKi), PARAMETER :: M7N8MAGzi = 3707 + INTEGER(IntKi), PARAMETER :: M7N9MAGzi = 3708 + INTEGER(IntKi), PARAMETER :: M8N1MAGzi = 3709 + INTEGER(IntKi), PARAMETER :: M8N2MAGzi = 3710 + INTEGER(IntKi), PARAMETER :: M8N3MAGzi = 3711 + INTEGER(IntKi), PARAMETER :: M8N4MAGzi = 3712 + INTEGER(IntKi), PARAMETER :: M8N5MAGzi = 3713 + INTEGER(IntKi), PARAMETER :: M8N6MAGzi = 3714 + INTEGER(IntKi), PARAMETER :: M8N7MAGzi = 3715 + INTEGER(IntKi), PARAMETER :: M8N8MAGzi = 3716 + INTEGER(IntKi), PARAMETER :: M8N9MAGzi = 3717 + INTEGER(IntKi), PARAMETER :: M9N1MAGzi = 3718 + INTEGER(IntKi), PARAMETER :: M9N2MAGzi = 3719 + INTEGER(IntKi), PARAMETER :: M9N3MAGzi = 3720 + INTEGER(IntKi), PARAMETER :: M9N4MAGzi = 3721 + INTEGER(IntKi), PARAMETER :: M9N5MAGzi = 3722 + INTEGER(IntKi), PARAMETER :: M9N6MAGzi = 3723 + INTEGER(IntKi), PARAMETER :: M9N7MAGzi = 3724 + INTEGER(IntKi), PARAMETER :: M9N8MAGzi = 3725 + INTEGER(IntKi), PARAMETER :: M9N9MAGzi = 3726 + INTEGER(IntKi), PARAMETER :: M1N1FAFxi = 3727 + INTEGER(IntKi), PARAMETER :: M1N2FAFxi = 3728 + INTEGER(IntKi), PARAMETER :: M1N3FAFxi = 3729 + INTEGER(IntKi), PARAMETER :: M1N4FAFxi = 3730 + INTEGER(IntKi), PARAMETER :: M1N5FAFxi = 3731 + INTEGER(IntKi), PARAMETER :: M1N6FAFxi = 3732 + INTEGER(IntKi), PARAMETER :: M1N7FAFxi = 3733 + INTEGER(IntKi), PARAMETER :: M1N8FAFxi = 3734 + INTEGER(IntKi), PARAMETER :: M1N9FAFxi = 3735 + INTEGER(IntKi), PARAMETER :: M2N1FAFxi = 3736 + INTEGER(IntKi), PARAMETER :: M2N2FAFxi = 3737 + INTEGER(IntKi), PARAMETER :: M2N3FAFxi = 3738 + INTEGER(IntKi), PARAMETER :: M2N4FAFxi = 3739 + INTEGER(IntKi), PARAMETER :: M2N5FAFxi = 3740 + INTEGER(IntKi), PARAMETER :: M2N6FAFxi = 3741 + INTEGER(IntKi), PARAMETER :: M2N7FAFxi = 3742 + INTEGER(IntKi), PARAMETER :: M2N8FAFxi = 3743 + INTEGER(IntKi), PARAMETER :: M2N9FAFxi = 3744 + INTEGER(IntKi), PARAMETER :: M3N1FAFxi = 3745 + INTEGER(IntKi), PARAMETER :: M3N2FAFxi = 3746 + INTEGER(IntKi), PARAMETER :: M3N3FAFxi = 3747 + INTEGER(IntKi), PARAMETER :: M3N4FAFxi = 3748 + INTEGER(IntKi), PARAMETER :: M3N5FAFxi = 3749 + INTEGER(IntKi), PARAMETER :: M3N6FAFxi = 3750 + INTEGER(IntKi), PARAMETER :: M3N7FAFxi = 3751 + INTEGER(IntKi), PARAMETER :: M3N8FAFxi = 3752 + INTEGER(IntKi), PARAMETER :: M3N9FAFxi = 3753 + INTEGER(IntKi), PARAMETER :: M4N1FAFxi = 3754 + INTEGER(IntKi), PARAMETER :: M4N2FAFxi = 3755 + INTEGER(IntKi), PARAMETER :: M4N3FAFxi = 3756 + INTEGER(IntKi), PARAMETER :: M4N4FAFxi = 3757 + INTEGER(IntKi), PARAMETER :: M4N5FAFxi = 3758 + INTEGER(IntKi), PARAMETER :: M4N6FAFxi = 3759 + INTEGER(IntKi), PARAMETER :: M4N7FAFxi = 3760 + INTEGER(IntKi), PARAMETER :: M4N8FAFxi = 3761 + INTEGER(IntKi), PARAMETER :: M4N9FAFxi = 3762 + INTEGER(IntKi), PARAMETER :: M5N1FAFxi = 3763 + INTEGER(IntKi), PARAMETER :: M5N2FAFxi = 3764 + INTEGER(IntKi), PARAMETER :: M5N3FAFxi = 3765 + INTEGER(IntKi), PARAMETER :: M5N4FAFxi = 3766 + INTEGER(IntKi), PARAMETER :: M5N5FAFxi = 3767 + INTEGER(IntKi), PARAMETER :: M5N6FAFxi = 3768 + INTEGER(IntKi), PARAMETER :: M5N7FAFxi = 3769 + INTEGER(IntKi), PARAMETER :: M5N8FAFxi = 3770 + INTEGER(IntKi), PARAMETER :: M5N9FAFxi = 3771 + INTEGER(IntKi), PARAMETER :: M6N1FAFxi = 3772 + INTEGER(IntKi), PARAMETER :: M6N2FAFxi = 3773 + INTEGER(IntKi), PARAMETER :: M6N3FAFxi = 3774 + INTEGER(IntKi), PARAMETER :: M6N4FAFxi = 3775 + INTEGER(IntKi), PARAMETER :: M6N5FAFxi = 3776 + INTEGER(IntKi), PARAMETER :: M6N6FAFxi = 3777 + INTEGER(IntKi), PARAMETER :: M6N7FAFxi = 3778 + INTEGER(IntKi), PARAMETER :: M6N8FAFxi = 3779 + INTEGER(IntKi), PARAMETER :: M6N9FAFxi = 3780 + INTEGER(IntKi), PARAMETER :: M7N1FAFxi = 3781 + INTEGER(IntKi), PARAMETER :: M7N2FAFxi = 3782 + INTEGER(IntKi), PARAMETER :: M7N3FAFxi = 3783 + INTEGER(IntKi), PARAMETER :: M7N4FAFxi = 3784 + INTEGER(IntKi), PARAMETER :: M7N5FAFxi = 3785 + INTEGER(IntKi), PARAMETER :: M7N6FAFxi = 3786 + INTEGER(IntKi), PARAMETER :: M7N7FAFxi = 3787 + INTEGER(IntKi), PARAMETER :: M7N8FAFxi = 3788 + INTEGER(IntKi), PARAMETER :: M7N9FAFxi = 3789 + INTEGER(IntKi), PARAMETER :: M8N1FAFxi = 3790 + INTEGER(IntKi), PARAMETER :: M8N2FAFxi = 3791 + INTEGER(IntKi), PARAMETER :: M8N3FAFxi = 3792 + INTEGER(IntKi), PARAMETER :: M8N4FAFxi = 3793 + INTEGER(IntKi), PARAMETER :: M8N5FAFxi = 3794 + INTEGER(IntKi), PARAMETER :: M8N6FAFxi = 3795 + INTEGER(IntKi), PARAMETER :: M8N7FAFxi = 3796 + INTEGER(IntKi), PARAMETER :: M8N8FAFxi = 3797 + INTEGER(IntKi), PARAMETER :: M8N9FAFxi = 3798 + INTEGER(IntKi), PARAMETER :: M9N1FAFxi = 3799 + INTEGER(IntKi), PARAMETER :: M9N2FAFxi = 3800 + INTEGER(IntKi), PARAMETER :: M9N3FAFxi = 3801 + INTEGER(IntKi), PARAMETER :: M9N4FAFxi = 3802 + INTEGER(IntKi), PARAMETER :: M9N5FAFxi = 3803 + INTEGER(IntKi), PARAMETER :: M9N6FAFxi = 3804 + INTEGER(IntKi), PARAMETER :: M9N7FAFxi = 3805 + INTEGER(IntKi), PARAMETER :: M9N8FAFxi = 3806 + INTEGER(IntKi), PARAMETER :: M9N9FAFxi = 3807 + INTEGER(IntKi), PARAMETER :: M1N1FAFyi = 3808 + INTEGER(IntKi), PARAMETER :: M1N2FAFyi = 3809 + INTEGER(IntKi), PARAMETER :: M1N3FAFyi = 3810 + INTEGER(IntKi), PARAMETER :: M1N4FAFyi = 3811 + INTEGER(IntKi), PARAMETER :: M1N5FAFyi = 3812 + INTEGER(IntKi), PARAMETER :: M1N6FAFyi = 3813 + INTEGER(IntKi), PARAMETER :: M1N7FAFyi = 3814 + INTEGER(IntKi), PARAMETER :: M1N8FAFyi = 3815 + INTEGER(IntKi), PARAMETER :: M1N9FAFyi = 3816 + INTEGER(IntKi), PARAMETER :: M2N1FAFyi = 3817 + INTEGER(IntKi), PARAMETER :: M2N2FAFyi = 3818 + INTEGER(IntKi), PARAMETER :: M2N3FAFyi = 3819 + INTEGER(IntKi), PARAMETER :: M2N4FAFyi = 3820 + INTEGER(IntKi), PARAMETER :: M2N5FAFyi = 3821 + INTEGER(IntKi), PARAMETER :: M2N6FAFyi = 3822 + INTEGER(IntKi), PARAMETER :: M2N7FAFyi = 3823 + INTEGER(IntKi), PARAMETER :: M2N8FAFyi = 3824 + INTEGER(IntKi), PARAMETER :: M2N9FAFyi = 3825 + INTEGER(IntKi), PARAMETER :: M3N1FAFyi = 3826 + INTEGER(IntKi), PARAMETER :: M3N2FAFyi = 3827 + INTEGER(IntKi), PARAMETER :: M3N3FAFyi = 3828 + INTEGER(IntKi), PARAMETER :: M3N4FAFyi = 3829 + INTEGER(IntKi), PARAMETER :: M3N5FAFyi = 3830 + INTEGER(IntKi), PARAMETER :: M3N6FAFyi = 3831 + INTEGER(IntKi), PARAMETER :: M3N7FAFyi = 3832 + INTEGER(IntKi), PARAMETER :: M3N8FAFyi = 3833 + INTEGER(IntKi), PARAMETER :: M3N9FAFyi = 3834 + INTEGER(IntKi), PARAMETER :: M4N1FAFyi = 3835 + INTEGER(IntKi), PARAMETER :: M4N2FAFyi = 3836 + INTEGER(IntKi), PARAMETER :: M4N3FAFyi = 3837 + INTEGER(IntKi), PARAMETER :: M4N4FAFyi = 3838 + INTEGER(IntKi), PARAMETER :: M4N5FAFyi = 3839 + INTEGER(IntKi), PARAMETER :: M4N6FAFyi = 3840 + INTEGER(IntKi), PARAMETER :: M4N7FAFyi = 3841 + INTEGER(IntKi), PARAMETER :: M4N8FAFyi = 3842 + INTEGER(IntKi), PARAMETER :: M4N9FAFyi = 3843 + INTEGER(IntKi), PARAMETER :: M5N1FAFyi = 3844 + INTEGER(IntKi), PARAMETER :: M5N2FAFyi = 3845 + INTEGER(IntKi), PARAMETER :: M5N3FAFyi = 3846 + INTEGER(IntKi), PARAMETER :: M5N4FAFyi = 3847 + INTEGER(IntKi), PARAMETER :: M5N5FAFyi = 3848 + INTEGER(IntKi), PARAMETER :: M5N6FAFyi = 3849 + INTEGER(IntKi), PARAMETER :: M5N7FAFyi = 3850 + INTEGER(IntKi), PARAMETER :: M5N8FAFyi = 3851 + INTEGER(IntKi), PARAMETER :: M5N9FAFyi = 3852 + INTEGER(IntKi), PARAMETER :: M6N1FAFyi = 3853 + INTEGER(IntKi), PARAMETER :: M6N2FAFyi = 3854 + INTEGER(IntKi), PARAMETER :: M6N3FAFyi = 3855 + INTEGER(IntKi), PARAMETER :: M6N4FAFyi = 3856 + INTEGER(IntKi), PARAMETER :: M6N5FAFyi = 3857 + INTEGER(IntKi), PARAMETER :: M6N6FAFyi = 3858 + INTEGER(IntKi), PARAMETER :: M6N7FAFyi = 3859 + INTEGER(IntKi), PARAMETER :: M6N8FAFyi = 3860 + INTEGER(IntKi), PARAMETER :: M6N9FAFyi = 3861 + INTEGER(IntKi), PARAMETER :: M7N1FAFyi = 3862 + INTEGER(IntKi), PARAMETER :: M7N2FAFyi = 3863 + INTEGER(IntKi), PARAMETER :: M7N3FAFyi = 3864 + INTEGER(IntKi), PARAMETER :: M7N4FAFyi = 3865 + INTEGER(IntKi), PARAMETER :: M7N5FAFyi = 3866 + INTEGER(IntKi), PARAMETER :: M7N6FAFyi = 3867 + INTEGER(IntKi), PARAMETER :: M7N7FAFyi = 3868 + INTEGER(IntKi), PARAMETER :: M7N8FAFyi = 3869 + INTEGER(IntKi), PARAMETER :: M7N9FAFyi = 3870 + INTEGER(IntKi), PARAMETER :: M8N1FAFyi = 3871 + INTEGER(IntKi), PARAMETER :: M8N2FAFyi = 3872 + INTEGER(IntKi), PARAMETER :: M8N3FAFyi = 3873 + INTEGER(IntKi), PARAMETER :: M8N4FAFyi = 3874 + INTEGER(IntKi), PARAMETER :: M8N5FAFyi = 3875 + INTEGER(IntKi), PARAMETER :: M8N6FAFyi = 3876 + INTEGER(IntKi), PARAMETER :: M8N7FAFyi = 3877 + INTEGER(IntKi), PARAMETER :: M8N8FAFyi = 3878 + INTEGER(IntKi), PARAMETER :: M8N9FAFyi = 3879 + INTEGER(IntKi), PARAMETER :: M9N1FAFyi = 3880 + INTEGER(IntKi), PARAMETER :: M9N2FAFyi = 3881 + INTEGER(IntKi), PARAMETER :: M9N3FAFyi = 3882 + INTEGER(IntKi), PARAMETER :: M9N4FAFyi = 3883 + INTEGER(IntKi), PARAMETER :: M9N5FAFyi = 3884 + INTEGER(IntKi), PARAMETER :: M9N6FAFyi = 3885 + INTEGER(IntKi), PARAMETER :: M9N7FAFyi = 3886 + INTEGER(IntKi), PARAMETER :: M9N8FAFyi = 3887 + INTEGER(IntKi), PARAMETER :: M9N9FAFyi = 3888 + INTEGER(IntKi), PARAMETER :: M1N1FAFzi = 3889 + INTEGER(IntKi), PARAMETER :: M1N2FAFzi = 3890 + INTEGER(IntKi), PARAMETER :: M1N3FAFzi = 3891 + INTEGER(IntKi), PARAMETER :: M1N4FAFzi = 3892 + INTEGER(IntKi), PARAMETER :: M1N5FAFzi = 3893 + INTEGER(IntKi), PARAMETER :: M1N6FAFzi = 3894 + INTEGER(IntKi), PARAMETER :: M1N7FAFzi = 3895 + INTEGER(IntKi), PARAMETER :: M1N8FAFzi = 3896 + INTEGER(IntKi), PARAMETER :: M1N9FAFzi = 3897 + INTEGER(IntKi), PARAMETER :: M2N1FAFzi = 3898 + INTEGER(IntKi), PARAMETER :: M2N2FAFzi = 3899 + INTEGER(IntKi), PARAMETER :: M2N3FAFzi = 3900 + INTEGER(IntKi), PARAMETER :: M2N4FAFzi = 3901 + INTEGER(IntKi), PARAMETER :: M2N5FAFzi = 3902 + INTEGER(IntKi), PARAMETER :: M2N6FAFzi = 3903 + INTEGER(IntKi), PARAMETER :: M2N7FAFzi = 3904 + INTEGER(IntKi), PARAMETER :: M2N8FAFzi = 3905 + INTEGER(IntKi), PARAMETER :: M2N9FAFzi = 3906 + INTEGER(IntKi), PARAMETER :: M3N1FAFzi = 3907 + INTEGER(IntKi), PARAMETER :: M3N2FAFzi = 3908 + INTEGER(IntKi), PARAMETER :: M3N3FAFzi = 3909 + INTEGER(IntKi), PARAMETER :: M3N4FAFzi = 3910 + INTEGER(IntKi), PARAMETER :: M3N5FAFzi = 3911 + INTEGER(IntKi), PARAMETER :: M3N6FAFzi = 3912 + INTEGER(IntKi), PARAMETER :: M3N7FAFzi = 3913 + INTEGER(IntKi), PARAMETER :: M3N8FAFzi = 3914 + INTEGER(IntKi), PARAMETER :: M3N9FAFzi = 3915 + INTEGER(IntKi), PARAMETER :: M4N1FAFzi = 3916 + INTEGER(IntKi), PARAMETER :: M4N2FAFzi = 3917 + INTEGER(IntKi), PARAMETER :: M4N3FAFzi = 3918 + INTEGER(IntKi), PARAMETER :: M4N4FAFzi = 3919 + INTEGER(IntKi), PARAMETER :: M4N5FAFzi = 3920 + INTEGER(IntKi), PARAMETER :: M4N6FAFzi = 3921 + INTEGER(IntKi), PARAMETER :: M4N7FAFzi = 3922 + INTEGER(IntKi), PARAMETER :: M4N8FAFzi = 3923 + INTEGER(IntKi), PARAMETER :: M4N9FAFzi = 3924 + INTEGER(IntKi), PARAMETER :: M5N1FAFzi = 3925 + INTEGER(IntKi), PARAMETER :: M5N2FAFzi = 3926 + INTEGER(IntKi), PARAMETER :: M5N3FAFzi = 3927 + INTEGER(IntKi), PARAMETER :: M5N4FAFzi = 3928 + INTEGER(IntKi), PARAMETER :: M5N5FAFzi = 3929 + INTEGER(IntKi), PARAMETER :: M5N6FAFzi = 3930 + INTEGER(IntKi), PARAMETER :: M5N7FAFzi = 3931 + INTEGER(IntKi), PARAMETER :: M5N8FAFzi = 3932 + INTEGER(IntKi), PARAMETER :: M5N9FAFzi = 3933 + INTEGER(IntKi), PARAMETER :: M6N1FAFzi = 3934 + INTEGER(IntKi), PARAMETER :: M6N2FAFzi = 3935 + INTEGER(IntKi), PARAMETER :: M6N3FAFzi = 3936 + INTEGER(IntKi), PARAMETER :: M6N4FAFzi = 3937 + INTEGER(IntKi), PARAMETER :: M6N5FAFzi = 3938 + INTEGER(IntKi), PARAMETER :: M6N6FAFzi = 3939 + INTEGER(IntKi), PARAMETER :: M6N7FAFzi = 3940 + INTEGER(IntKi), PARAMETER :: M6N8FAFzi = 3941 + INTEGER(IntKi), PARAMETER :: M6N9FAFzi = 3942 + INTEGER(IntKi), PARAMETER :: M7N1FAFzi = 3943 + INTEGER(IntKi), PARAMETER :: M7N2FAFzi = 3944 + INTEGER(IntKi), PARAMETER :: M7N3FAFzi = 3945 + INTEGER(IntKi), PARAMETER :: M7N4FAFzi = 3946 + INTEGER(IntKi), PARAMETER :: M7N5FAFzi = 3947 + INTEGER(IntKi), PARAMETER :: M7N6FAFzi = 3948 + INTEGER(IntKi), PARAMETER :: M7N7FAFzi = 3949 + INTEGER(IntKi), PARAMETER :: M7N8FAFzi = 3950 + INTEGER(IntKi), PARAMETER :: M7N9FAFzi = 3951 + INTEGER(IntKi), PARAMETER :: M8N1FAFzi = 3952 + INTEGER(IntKi), PARAMETER :: M8N2FAFzi = 3953 + INTEGER(IntKi), PARAMETER :: M8N3FAFzi = 3954 + INTEGER(IntKi), PARAMETER :: M8N4FAFzi = 3955 + INTEGER(IntKi), PARAMETER :: M8N5FAFzi = 3956 + INTEGER(IntKi), PARAMETER :: M8N6FAFzi = 3957 + INTEGER(IntKi), PARAMETER :: M8N7FAFzi = 3958 + INTEGER(IntKi), PARAMETER :: M8N8FAFzi = 3959 + INTEGER(IntKi), PARAMETER :: M8N9FAFzi = 3960 + INTEGER(IntKi), PARAMETER :: M9N1FAFzi = 3961 + INTEGER(IntKi), PARAMETER :: M9N2FAFzi = 3962 + INTEGER(IntKi), PARAMETER :: M9N3FAFzi = 3963 + INTEGER(IntKi), PARAMETER :: M9N4FAFzi = 3964 + INTEGER(IntKi), PARAMETER :: M9N5FAFzi = 3965 + INTEGER(IntKi), PARAMETER :: M9N6FAFzi = 3966 + INTEGER(IntKi), PARAMETER :: M9N7FAFzi = 3967 + INTEGER(IntKi), PARAMETER :: M9N8FAFzi = 3968 + INTEGER(IntKi), PARAMETER :: M9N9FAFzi = 3969 + INTEGER(IntKi), PARAMETER :: M1N1MAFxi = 3970 + INTEGER(IntKi), PARAMETER :: M1N2MAFxi = 3971 + INTEGER(IntKi), PARAMETER :: M1N3MAFxi = 3972 + INTEGER(IntKi), PARAMETER :: M1N4MAFxi = 3973 + INTEGER(IntKi), PARAMETER :: M1N5MAFxi = 3974 + INTEGER(IntKi), PARAMETER :: M1N6MAFxi = 3975 + INTEGER(IntKi), PARAMETER :: M1N7MAFxi = 3976 + INTEGER(IntKi), PARAMETER :: M1N8MAFxi = 3977 + INTEGER(IntKi), PARAMETER :: M1N9MAFxi = 3978 + INTEGER(IntKi), PARAMETER :: M2N1MAFxi = 3979 + INTEGER(IntKi), PARAMETER :: M2N2MAFxi = 3980 + INTEGER(IntKi), PARAMETER :: M2N3MAFxi = 3981 + INTEGER(IntKi), PARAMETER :: M2N4MAFxi = 3982 + INTEGER(IntKi), PARAMETER :: M2N5MAFxi = 3983 + INTEGER(IntKi), PARAMETER :: M2N6MAFxi = 3984 + INTEGER(IntKi), PARAMETER :: M2N7MAFxi = 3985 + INTEGER(IntKi), PARAMETER :: M2N8MAFxi = 3986 + INTEGER(IntKi), PARAMETER :: M2N9MAFxi = 3987 + INTEGER(IntKi), PARAMETER :: M3N1MAFxi = 3988 + INTEGER(IntKi), PARAMETER :: M3N2MAFxi = 3989 + INTEGER(IntKi), PARAMETER :: M3N3MAFxi = 3990 + INTEGER(IntKi), PARAMETER :: M3N4MAFxi = 3991 + INTEGER(IntKi), PARAMETER :: M3N5MAFxi = 3992 + INTEGER(IntKi), PARAMETER :: M3N6MAFxi = 3993 + INTEGER(IntKi), PARAMETER :: M3N7MAFxi = 3994 + INTEGER(IntKi), PARAMETER :: M3N8MAFxi = 3995 + INTEGER(IntKi), PARAMETER :: M3N9MAFxi = 3996 + INTEGER(IntKi), PARAMETER :: M4N1MAFxi = 3997 + INTEGER(IntKi), PARAMETER :: M4N2MAFxi = 3998 + INTEGER(IntKi), PARAMETER :: M4N3MAFxi = 3999 + INTEGER(IntKi), PARAMETER :: M4N4MAFxi = 4000 + INTEGER(IntKi), PARAMETER :: M4N5MAFxi = 4001 + INTEGER(IntKi), PARAMETER :: M4N6MAFxi = 4002 + INTEGER(IntKi), PARAMETER :: M4N7MAFxi = 4003 + INTEGER(IntKi), PARAMETER :: M4N8MAFxi = 4004 + INTEGER(IntKi), PARAMETER :: M4N9MAFxi = 4005 + INTEGER(IntKi), PARAMETER :: M5N1MAFxi = 4006 + INTEGER(IntKi), PARAMETER :: M5N2MAFxi = 4007 + INTEGER(IntKi), PARAMETER :: M5N3MAFxi = 4008 + INTEGER(IntKi), PARAMETER :: M5N4MAFxi = 4009 + INTEGER(IntKi), PARAMETER :: M5N5MAFxi = 4010 + INTEGER(IntKi), PARAMETER :: M5N6MAFxi = 4011 + INTEGER(IntKi), PARAMETER :: M5N7MAFxi = 4012 + INTEGER(IntKi), PARAMETER :: M5N8MAFxi = 4013 + INTEGER(IntKi), PARAMETER :: M5N9MAFxi = 4014 + INTEGER(IntKi), PARAMETER :: M6N1MAFxi = 4015 + INTEGER(IntKi), PARAMETER :: M6N2MAFxi = 4016 + INTEGER(IntKi), PARAMETER :: M6N3MAFxi = 4017 + INTEGER(IntKi), PARAMETER :: M6N4MAFxi = 4018 + INTEGER(IntKi), PARAMETER :: M6N5MAFxi = 4019 + INTEGER(IntKi), PARAMETER :: M6N6MAFxi = 4020 + INTEGER(IntKi), PARAMETER :: M6N7MAFxi = 4021 + INTEGER(IntKi), PARAMETER :: M6N8MAFxi = 4022 + INTEGER(IntKi), PARAMETER :: M6N9MAFxi = 4023 + INTEGER(IntKi), PARAMETER :: M7N1MAFxi = 4024 + INTEGER(IntKi), PARAMETER :: M7N2MAFxi = 4025 + INTEGER(IntKi), PARAMETER :: M7N3MAFxi = 4026 + INTEGER(IntKi), PARAMETER :: M7N4MAFxi = 4027 + INTEGER(IntKi), PARAMETER :: M7N5MAFxi = 4028 + INTEGER(IntKi), PARAMETER :: M7N6MAFxi = 4029 + INTEGER(IntKi), PARAMETER :: M7N7MAFxi = 4030 + INTEGER(IntKi), PARAMETER :: M7N8MAFxi = 4031 + INTEGER(IntKi), PARAMETER :: M7N9MAFxi = 4032 + INTEGER(IntKi), PARAMETER :: M8N1MAFxi = 4033 + INTEGER(IntKi), PARAMETER :: M8N2MAFxi = 4034 + INTEGER(IntKi), PARAMETER :: M8N3MAFxi = 4035 + INTEGER(IntKi), PARAMETER :: M8N4MAFxi = 4036 + INTEGER(IntKi), PARAMETER :: M8N5MAFxi = 4037 + INTEGER(IntKi), PARAMETER :: M8N6MAFxi = 4038 + INTEGER(IntKi), PARAMETER :: M8N7MAFxi = 4039 + INTEGER(IntKi), PARAMETER :: M8N8MAFxi = 4040 + INTEGER(IntKi), PARAMETER :: M8N9MAFxi = 4041 + INTEGER(IntKi), PARAMETER :: M9N1MAFxi = 4042 + INTEGER(IntKi), PARAMETER :: M9N2MAFxi = 4043 + INTEGER(IntKi), PARAMETER :: M9N3MAFxi = 4044 + INTEGER(IntKi), PARAMETER :: M9N4MAFxi = 4045 + INTEGER(IntKi), PARAMETER :: M9N5MAFxi = 4046 + INTEGER(IntKi), PARAMETER :: M9N6MAFxi = 4047 + INTEGER(IntKi), PARAMETER :: M9N7MAFxi = 4048 + INTEGER(IntKi), PARAMETER :: M9N8MAFxi = 4049 + INTEGER(IntKi), PARAMETER :: M9N9MAFxi = 4050 + INTEGER(IntKi), PARAMETER :: M1N1MAFyi = 4051 + INTEGER(IntKi), PARAMETER :: M1N2MAFyi = 4052 + INTEGER(IntKi), PARAMETER :: M1N3MAFyi = 4053 + INTEGER(IntKi), PARAMETER :: M1N4MAFyi = 4054 + INTEGER(IntKi), PARAMETER :: M1N5MAFyi = 4055 + INTEGER(IntKi), PARAMETER :: M1N6MAFyi = 4056 + INTEGER(IntKi), PARAMETER :: M1N7MAFyi = 4057 + INTEGER(IntKi), PARAMETER :: M1N8MAFyi = 4058 + INTEGER(IntKi), PARAMETER :: M1N9MAFyi = 4059 + INTEGER(IntKi), PARAMETER :: M2N1MAFyi = 4060 + INTEGER(IntKi), PARAMETER :: M2N2MAFyi = 4061 + INTEGER(IntKi), PARAMETER :: M2N3MAFyi = 4062 + INTEGER(IntKi), PARAMETER :: M2N4MAFyi = 4063 + INTEGER(IntKi), PARAMETER :: M2N5MAFyi = 4064 + INTEGER(IntKi), PARAMETER :: M2N6MAFyi = 4065 + INTEGER(IntKi), PARAMETER :: M2N7MAFyi = 4066 + INTEGER(IntKi), PARAMETER :: M2N8MAFyi = 4067 + INTEGER(IntKi), PARAMETER :: M2N9MAFyi = 4068 + INTEGER(IntKi), PARAMETER :: M3N1MAFyi = 4069 + INTEGER(IntKi), PARAMETER :: M3N2MAFyi = 4070 + INTEGER(IntKi), PARAMETER :: M3N3MAFyi = 4071 + INTEGER(IntKi), PARAMETER :: M3N4MAFyi = 4072 + INTEGER(IntKi), PARAMETER :: M3N5MAFyi = 4073 + INTEGER(IntKi), PARAMETER :: M3N6MAFyi = 4074 + INTEGER(IntKi), PARAMETER :: M3N7MAFyi = 4075 + INTEGER(IntKi), PARAMETER :: M3N8MAFyi = 4076 + INTEGER(IntKi), PARAMETER :: M3N9MAFyi = 4077 + INTEGER(IntKi), PARAMETER :: M4N1MAFyi = 4078 + INTEGER(IntKi), PARAMETER :: M4N2MAFyi = 4079 + INTEGER(IntKi), PARAMETER :: M4N3MAFyi = 4080 + INTEGER(IntKi), PARAMETER :: M4N4MAFyi = 4081 + INTEGER(IntKi), PARAMETER :: M4N5MAFyi = 4082 + INTEGER(IntKi), PARAMETER :: M4N6MAFyi = 4083 + INTEGER(IntKi), PARAMETER :: M4N7MAFyi = 4084 + INTEGER(IntKi), PARAMETER :: M4N8MAFyi = 4085 + INTEGER(IntKi), PARAMETER :: M4N9MAFyi = 4086 + INTEGER(IntKi), PARAMETER :: M5N1MAFyi = 4087 + INTEGER(IntKi), PARAMETER :: M5N2MAFyi = 4088 + INTEGER(IntKi), PARAMETER :: M5N3MAFyi = 4089 + INTEGER(IntKi), PARAMETER :: M5N4MAFyi = 4090 + INTEGER(IntKi), PARAMETER :: M5N5MAFyi = 4091 + INTEGER(IntKi), PARAMETER :: M5N6MAFyi = 4092 + INTEGER(IntKi), PARAMETER :: M5N7MAFyi = 4093 + INTEGER(IntKi), PARAMETER :: M5N8MAFyi = 4094 + INTEGER(IntKi), PARAMETER :: M5N9MAFyi = 4095 + INTEGER(IntKi), PARAMETER :: M6N1MAFyi = 4096 + INTEGER(IntKi), PARAMETER :: M6N2MAFyi = 4097 + INTEGER(IntKi), PARAMETER :: M6N3MAFyi = 4098 + INTEGER(IntKi), PARAMETER :: M6N4MAFyi = 4099 + INTEGER(IntKi), PARAMETER :: M6N5MAFyi = 4100 + INTEGER(IntKi), PARAMETER :: M6N6MAFyi = 4101 + INTEGER(IntKi), PARAMETER :: M6N7MAFyi = 4102 + INTEGER(IntKi), PARAMETER :: M6N8MAFyi = 4103 + INTEGER(IntKi), PARAMETER :: M6N9MAFyi = 4104 + INTEGER(IntKi), PARAMETER :: M7N1MAFyi = 4105 + INTEGER(IntKi), PARAMETER :: M7N2MAFyi = 4106 + INTEGER(IntKi), PARAMETER :: M7N3MAFyi = 4107 + INTEGER(IntKi), PARAMETER :: M7N4MAFyi = 4108 + INTEGER(IntKi), PARAMETER :: M7N5MAFyi = 4109 + INTEGER(IntKi), PARAMETER :: M7N6MAFyi = 4110 + INTEGER(IntKi), PARAMETER :: M7N7MAFyi = 4111 + INTEGER(IntKi), PARAMETER :: M7N8MAFyi = 4112 + INTEGER(IntKi), PARAMETER :: M7N9MAFyi = 4113 + INTEGER(IntKi), PARAMETER :: M8N1MAFyi = 4114 + INTEGER(IntKi), PARAMETER :: M8N2MAFyi = 4115 + INTEGER(IntKi), PARAMETER :: M8N3MAFyi = 4116 + INTEGER(IntKi), PARAMETER :: M8N4MAFyi = 4117 + INTEGER(IntKi), PARAMETER :: M8N5MAFyi = 4118 + INTEGER(IntKi), PARAMETER :: M8N6MAFyi = 4119 + INTEGER(IntKi), PARAMETER :: M8N7MAFyi = 4120 + INTEGER(IntKi), PARAMETER :: M8N8MAFyi = 4121 + INTEGER(IntKi), PARAMETER :: M8N9MAFyi = 4122 + INTEGER(IntKi), PARAMETER :: M9N1MAFyi = 4123 + INTEGER(IntKi), PARAMETER :: M9N2MAFyi = 4124 + INTEGER(IntKi), PARAMETER :: M9N3MAFyi = 4125 + INTEGER(IntKi), PARAMETER :: M9N4MAFyi = 4126 + INTEGER(IntKi), PARAMETER :: M9N5MAFyi = 4127 + INTEGER(IntKi), PARAMETER :: M9N6MAFyi = 4128 + INTEGER(IntKi), PARAMETER :: M9N7MAFyi = 4129 + INTEGER(IntKi), PARAMETER :: M9N8MAFyi = 4130 + INTEGER(IntKi), PARAMETER :: M9N9MAFyi = 4131 + INTEGER(IntKi), PARAMETER :: M1N1MAFzi = 4132 + INTEGER(IntKi), PARAMETER :: M1N2MAFzi = 4133 + INTEGER(IntKi), PARAMETER :: M1N3MAFzi = 4134 + INTEGER(IntKi), PARAMETER :: M1N4MAFzi = 4135 + INTEGER(IntKi), PARAMETER :: M1N5MAFzi = 4136 + INTEGER(IntKi), PARAMETER :: M1N6MAFzi = 4137 + INTEGER(IntKi), PARAMETER :: M1N7MAFzi = 4138 + INTEGER(IntKi), PARAMETER :: M1N8MAFzi = 4139 + INTEGER(IntKi), PARAMETER :: M1N9MAFzi = 4140 + INTEGER(IntKi), PARAMETER :: M2N1MAFzi = 4141 + INTEGER(IntKi), PARAMETER :: M2N2MAFzi = 4142 + INTEGER(IntKi), PARAMETER :: M2N3MAFzi = 4143 + INTEGER(IntKi), PARAMETER :: M2N4MAFzi = 4144 + INTEGER(IntKi), PARAMETER :: M2N5MAFzi = 4145 + INTEGER(IntKi), PARAMETER :: M2N6MAFzi = 4146 + INTEGER(IntKi), PARAMETER :: M2N7MAFzi = 4147 + INTEGER(IntKi), PARAMETER :: M2N8MAFzi = 4148 + INTEGER(IntKi), PARAMETER :: M2N9MAFzi = 4149 + INTEGER(IntKi), PARAMETER :: M3N1MAFzi = 4150 + INTEGER(IntKi), PARAMETER :: M3N2MAFzi = 4151 + INTEGER(IntKi), PARAMETER :: M3N3MAFzi = 4152 + INTEGER(IntKi), PARAMETER :: M3N4MAFzi = 4153 + INTEGER(IntKi), PARAMETER :: M3N5MAFzi = 4154 + INTEGER(IntKi), PARAMETER :: M3N6MAFzi = 4155 + INTEGER(IntKi), PARAMETER :: M3N7MAFzi = 4156 + INTEGER(IntKi), PARAMETER :: M3N8MAFzi = 4157 + INTEGER(IntKi), PARAMETER :: M3N9MAFzi = 4158 + INTEGER(IntKi), PARAMETER :: M4N1MAFzi = 4159 + INTEGER(IntKi), PARAMETER :: M4N2MAFzi = 4160 + INTEGER(IntKi), PARAMETER :: M4N3MAFzi = 4161 + INTEGER(IntKi), PARAMETER :: M4N4MAFzi = 4162 + INTEGER(IntKi), PARAMETER :: M4N5MAFzi = 4163 + INTEGER(IntKi), PARAMETER :: M4N6MAFzi = 4164 + INTEGER(IntKi), PARAMETER :: M4N7MAFzi = 4165 + INTEGER(IntKi), PARAMETER :: M4N8MAFzi = 4166 + INTEGER(IntKi), PARAMETER :: M4N9MAFzi = 4167 + INTEGER(IntKi), PARAMETER :: M5N1MAFzi = 4168 + INTEGER(IntKi), PARAMETER :: M5N2MAFzi = 4169 + INTEGER(IntKi), PARAMETER :: M5N3MAFzi = 4170 + INTEGER(IntKi), PARAMETER :: M5N4MAFzi = 4171 + INTEGER(IntKi), PARAMETER :: M5N5MAFzi = 4172 + INTEGER(IntKi), PARAMETER :: M5N6MAFzi = 4173 + INTEGER(IntKi), PARAMETER :: M5N7MAFzi = 4174 + INTEGER(IntKi), PARAMETER :: M5N8MAFzi = 4175 + INTEGER(IntKi), PARAMETER :: M5N9MAFzi = 4176 + INTEGER(IntKi), PARAMETER :: M6N1MAFzi = 4177 + INTEGER(IntKi), PARAMETER :: M6N2MAFzi = 4178 + INTEGER(IntKi), PARAMETER :: M6N3MAFzi = 4179 + INTEGER(IntKi), PARAMETER :: M6N4MAFzi = 4180 + INTEGER(IntKi), PARAMETER :: M6N5MAFzi = 4181 + INTEGER(IntKi), PARAMETER :: M6N6MAFzi = 4182 + INTEGER(IntKi), PARAMETER :: M6N7MAFzi = 4183 + INTEGER(IntKi), PARAMETER :: M6N8MAFzi = 4184 + INTEGER(IntKi), PARAMETER :: M6N9MAFzi = 4185 + INTEGER(IntKi), PARAMETER :: M7N1MAFzi = 4186 + INTEGER(IntKi), PARAMETER :: M7N2MAFzi = 4187 + INTEGER(IntKi), PARAMETER :: M7N3MAFzi = 4188 + INTEGER(IntKi), PARAMETER :: M7N4MAFzi = 4189 + INTEGER(IntKi), PARAMETER :: M7N5MAFzi = 4190 + INTEGER(IntKi), PARAMETER :: M7N6MAFzi = 4191 + INTEGER(IntKi), PARAMETER :: M7N7MAFzi = 4192 + INTEGER(IntKi), PARAMETER :: M7N8MAFzi = 4193 + INTEGER(IntKi), PARAMETER :: M7N9MAFzi = 4194 + INTEGER(IntKi), PARAMETER :: M8N1MAFzi = 4195 + INTEGER(IntKi), PARAMETER :: M8N2MAFzi = 4196 + INTEGER(IntKi), PARAMETER :: M8N3MAFzi = 4197 + INTEGER(IntKi), PARAMETER :: M8N4MAFzi = 4198 + INTEGER(IntKi), PARAMETER :: M8N5MAFzi = 4199 + INTEGER(IntKi), PARAMETER :: M8N6MAFzi = 4200 + INTEGER(IntKi), PARAMETER :: M8N7MAFzi = 4201 + INTEGER(IntKi), PARAMETER :: M8N8MAFzi = 4202 + INTEGER(IntKi), PARAMETER :: M8N9MAFzi = 4203 + INTEGER(IntKi), PARAMETER :: M9N1MAFzi = 4204 + INTEGER(IntKi), PARAMETER :: M9N2MAFzi = 4205 + INTEGER(IntKi), PARAMETER :: M9N3MAFzi = 4206 + INTEGER(IntKi), PARAMETER :: M9N4MAFzi = 4207 + INTEGER(IntKi), PARAMETER :: M9N5MAFzi = 4208 + INTEGER(IntKi), PARAMETER :: M9N6MAFzi = 4209 + INTEGER(IntKi), PARAMETER :: M9N7MAFzi = 4210 + INTEGER(IntKi), PARAMETER :: M9N8MAFzi = 4211 + INTEGER(IntKi), PARAMETER :: M9N9MAFzi = 4212 ! Joint-level Wave Kinematics : - INTEGER(IntKi), PARAMETER :: J1Vxi = 4213 - INTEGER(IntKi), PARAMETER :: J2Vxi = 4214 - INTEGER(IntKi), PARAMETER :: J3Vxi = 4215 - INTEGER(IntKi), PARAMETER :: J4Vxi = 4216 - INTEGER(IntKi), PARAMETER :: J5Vxi = 4217 - INTEGER(IntKi), PARAMETER :: J6Vxi = 4218 - INTEGER(IntKi), PARAMETER :: J7Vxi = 4219 - INTEGER(IntKi), PARAMETER :: J8Vxi = 4220 - INTEGER(IntKi), PARAMETER :: J9Vxi = 4221 - INTEGER(IntKi), PARAMETER :: J1Vyi = 4222 - INTEGER(IntKi), PARAMETER :: J2Vyi = 4223 - INTEGER(IntKi), PARAMETER :: J3Vyi = 4224 - INTEGER(IntKi), PARAMETER :: J4Vyi = 4225 - INTEGER(IntKi), PARAMETER :: J5Vyi = 4226 - INTEGER(IntKi), PARAMETER :: J6Vyi = 4227 - INTEGER(IntKi), PARAMETER :: J7Vyi = 4228 - INTEGER(IntKi), PARAMETER :: J8Vyi = 4229 - INTEGER(IntKi), PARAMETER :: J9Vyi = 4230 - INTEGER(IntKi), PARAMETER :: J1Vzi = 4231 - INTEGER(IntKi), PARAMETER :: J2Vzi = 4232 - INTEGER(IntKi), PARAMETER :: J3Vzi = 4233 - INTEGER(IntKi), PARAMETER :: J4Vzi = 4234 - INTEGER(IntKi), PARAMETER :: J5Vzi = 4235 - INTEGER(IntKi), PARAMETER :: J6Vzi = 4236 - INTEGER(IntKi), PARAMETER :: J7Vzi = 4237 - INTEGER(IntKi), PARAMETER :: J8Vzi = 4238 - INTEGER(IntKi), PARAMETER :: J9Vzi = 4239 - INTEGER(IntKi), PARAMETER :: J1Axi = 4240 - INTEGER(IntKi), PARAMETER :: J2Axi = 4241 - INTEGER(IntKi), PARAMETER :: J3Axi = 4242 - INTEGER(IntKi), PARAMETER :: J4Axi = 4243 - INTEGER(IntKi), PARAMETER :: J5Axi = 4244 - INTEGER(IntKi), PARAMETER :: J6Axi = 4245 - INTEGER(IntKi), PARAMETER :: J7Axi = 4246 - INTEGER(IntKi), PARAMETER :: J8Axi = 4247 - INTEGER(IntKi), PARAMETER :: J9Axi = 4248 - INTEGER(IntKi), PARAMETER :: J1Ayi = 4249 - INTEGER(IntKi), PARAMETER :: J2Ayi = 4250 - INTEGER(IntKi), PARAMETER :: J3Ayi = 4251 - INTEGER(IntKi), PARAMETER :: J4Ayi = 4252 - INTEGER(IntKi), PARAMETER :: J5Ayi = 4253 - INTEGER(IntKi), PARAMETER :: J6Ayi = 4254 - INTEGER(IntKi), PARAMETER :: J7Ayi = 4255 - INTEGER(IntKi), PARAMETER :: J8Ayi = 4256 - INTEGER(IntKi), PARAMETER :: J9Ayi = 4257 - INTEGER(IntKi), PARAMETER :: J1Azi = 4258 - INTEGER(IntKi), PARAMETER :: J2Azi = 4259 - INTEGER(IntKi), PARAMETER :: J3Azi = 4260 - INTEGER(IntKi), PARAMETER :: J4Azi = 4261 - INTEGER(IntKi), PARAMETER :: J5Azi = 4262 - INTEGER(IntKi), PARAMETER :: J6Azi = 4263 - INTEGER(IntKi), PARAMETER :: J7Azi = 4264 - INTEGER(IntKi), PARAMETER :: J8Azi = 4265 - INTEGER(IntKi), PARAMETER :: J9Azi = 4266 - INTEGER(IntKi), PARAMETER :: J1DynP = 4267 - INTEGER(IntKi), PARAMETER :: J2DynP = 4268 - INTEGER(IntKi), PARAMETER :: J3DynP = 4269 - INTEGER(IntKi), PARAMETER :: J4DynP = 4270 - INTEGER(IntKi), PARAMETER :: J5DynP = 4271 - INTEGER(IntKi), PARAMETER :: J6DynP = 4272 - INTEGER(IntKi), PARAMETER :: J7DynP = 4273 - INTEGER(IntKi), PARAMETER :: J8DynP = 4274 - INTEGER(IntKi), PARAMETER :: J9DynP = 4275 - INTEGER(IntKi), PARAMETER :: J1STVxi = 4276 - INTEGER(IntKi), PARAMETER :: J2STVxi = 4277 - INTEGER(IntKi), PARAMETER :: J3STVxi = 4278 - INTEGER(IntKi), PARAMETER :: J4STVxi = 4279 - INTEGER(IntKi), PARAMETER :: J5STVxi = 4280 - INTEGER(IntKi), PARAMETER :: J6STVxi = 4281 - INTEGER(IntKi), PARAMETER :: J7STVxi = 4282 - INTEGER(IntKi), PARAMETER :: J8STVxi = 4283 - INTEGER(IntKi), PARAMETER :: J9STVxi = 4284 - INTEGER(IntKi), PARAMETER :: J1STVyi = 4285 - INTEGER(IntKi), PARAMETER :: J2STVyi = 4286 - INTEGER(IntKi), PARAMETER :: J3STVyi = 4287 - INTEGER(IntKi), PARAMETER :: J4STVyi = 4288 - INTEGER(IntKi), PARAMETER :: J5STVyi = 4289 - INTEGER(IntKi), PARAMETER :: J6STVyi = 4290 - INTEGER(IntKi), PARAMETER :: J7STVyi = 4291 - INTEGER(IntKi), PARAMETER :: J8STVyi = 4292 - INTEGER(IntKi), PARAMETER :: J9STVyi = 4293 - INTEGER(IntKi), PARAMETER :: J1STVzi = 4294 - INTEGER(IntKi), PARAMETER :: J2STVzi = 4295 - INTEGER(IntKi), PARAMETER :: J3STVzi = 4296 - INTEGER(IntKi), PARAMETER :: J4STVzi = 4297 - INTEGER(IntKi), PARAMETER :: J5STVzi = 4298 - INTEGER(IntKi), PARAMETER :: J6STVzi = 4299 - INTEGER(IntKi), PARAMETER :: J7STVzi = 4300 - INTEGER(IntKi), PARAMETER :: J8STVzi = 4301 - INTEGER(IntKi), PARAMETER :: J9STVzi = 4302 - INTEGER(IntKi), PARAMETER :: J1STAxi = 4303 - INTEGER(IntKi), PARAMETER :: J2STAxi = 4304 - INTEGER(IntKi), PARAMETER :: J3STAxi = 4305 - INTEGER(IntKi), PARAMETER :: J4STAxi = 4306 - INTEGER(IntKi), PARAMETER :: J5STAxi = 4307 - INTEGER(IntKi), PARAMETER :: J6STAxi = 4308 - INTEGER(IntKi), PARAMETER :: J7STAxi = 4309 - INTEGER(IntKi), PARAMETER :: J8STAxi = 4310 - INTEGER(IntKi), PARAMETER :: J9STAxi = 4311 - INTEGER(IntKi), PARAMETER :: J1STAyi = 4312 - INTEGER(IntKi), PARAMETER :: J2STAyi = 4313 - INTEGER(IntKi), PARAMETER :: J3STAyi = 4314 - INTEGER(IntKi), PARAMETER :: J4STAyi = 4315 - INTEGER(IntKi), PARAMETER :: J5STAyi = 4316 - INTEGER(IntKi), PARAMETER :: J6STAyi = 4317 - INTEGER(IntKi), PARAMETER :: J7STAyi = 4318 - INTEGER(IntKi), PARAMETER :: J8STAyi = 4319 - INTEGER(IntKi), PARAMETER :: J9STAyi = 4320 - INTEGER(IntKi), PARAMETER :: J1STAzi = 4321 - INTEGER(IntKi), PARAMETER :: J2STAzi = 4322 - INTEGER(IntKi), PARAMETER :: J3STAzi = 4323 - INTEGER(IntKi), PARAMETER :: J4STAzi = 4324 - INTEGER(IntKi), PARAMETER :: J5STAzi = 4325 - INTEGER(IntKi), PARAMETER :: J6STAzi = 4326 - INTEGER(IntKi), PARAMETER :: J7STAzi = 4327 - INTEGER(IntKi), PARAMETER :: J8STAzi = 4328 - INTEGER(IntKi), PARAMETER :: J9STAzi = 4329 + INTEGER(IntKi), PARAMETER :: J1Vxi = 4213 + INTEGER(IntKi), PARAMETER :: J2Vxi = 4214 + INTEGER(IntKi), PARAMETER :: J3Vxi = 4215 + INTEGER(IntKi), PARAMETER :: J4Vxi = 4216 + INTEGER(IntKi), PARAMETER :: J5Vxi = 4217 + INTEGER(IntKi), PARAMETER :: J6Vxi = 4218 + INTEGER(IntKi), PARAMETER :: J7Vxi = 4219 + INTEGER(IntKi), PARAMETER :: J8Vxi = 4220 + INTEGER(IntKi), PARAMETER :: J9Vxi = 4221 + INTEGER(IntKi), PARAMETER :: J1Vyi = 4222 + INTEGER(IntKi), PARAMETER :: J2Vyi = 4223 + INTEGER(IntKi), PARAMETER :: J3Vyi = 4224 + INTEGER(IntKi), PARAMETER :: J4Vyi = 4225 + INTEGER(IntKi), PARAMETER :: J5Vyi = 4226 + INTEGER(IntKi), PARAMETER :: J6Vyi = 4227 + INTEGER(IntKi), PARAMETER :: J7Vyi = 4228 + INTEGER(IntKi), PARAMETER :: J8Vyi = 4229 + INTEGER(IntKi), PARAMETER :: J9Vyi = 4230 + INTEGER(IntKi), PARAMETER :: J1Vzi = 4231 + INTEGER(IntKi), PARAMETER :: J2Vzi = 4232 + INTEGER(IntKi), PARAMETER :: J3Vzi = 4233 + INTEGER(IntKi), PARAMETER :: J4Vzi = 4234 + INTEGER(IntKi), PARAMETER :: J5Vzi = 4235 + INTEGER(IntKi), PARAMETER :: J6Vzi = 4236 + INTEGER(IntKi), PARAMETER :: J7Vzi = 4237 + INTEGER(IntKi), PARAMETER :: J8Vzi = 4238 + INTEGER(IntKi), PARAMETER :: J9Vzi = 4239 + INTEGER(IntKi), PARAMETER :: J1Axi = 4240 + INTEGER(IntKi), PARAMETER :: J2Axi = 4241 + INTEGER(IntKi), PARAMETER :: J3Axi = 4242 + INTEGER(IntKi), PARAMETER :: J4Axi = 4243 + INTEGER(IntKi), PARAMETER :: J5Axi = 4244 + INTEGER(IntKi), PARAMETER :: J6Axi = 4245 + INTEGER(IntKi), PARAMETER :: J7Axi = 4246 + INTEGER(IntKi), PARAMETER :: J8Axi = 4247 + INTEGER(IntKi), PARAMETER :: J9Axi = 4248 + INTEGER(IntKi), PARAMETER :: J1Ayi = 4249 + INTEGER(IntKi), PARAMETER :: J2Ayi = 4250 + INTEGER(IntKi), PARAMETER :: J3Ayi = 4251 + INTEGER(IntKi), PARAMETER :: J4Ayi = 4252 + INTEGER(IntKi), PARAMETER :: J5Ayi = 4253 + INTEGER(IntKi), PARAMETER :: J6Ayi = 4254 + INTEGER(IntKi), PARAMETER :: J7Ayi = 4255 + INTEGER(IntKi), PARAMETER :: J8Ayi = 4256 + INTEGER(IntKi), PARAMETER :: J9Ayi = 4257 + INTEGER(IntKi), PARAMETER :: J1Azi = 4258 + INTEGER(IntKi), PARAMETER :: J2Azi = 4259 + INTEGER(IntKi), PARAMETER :: J3Azi = 4260 + INTEGER(IntKi), PARAMETER :: J4Azi = 4261 + INTEGER(IntKi), PARAMETER :: J5Azi = 4262 + INTEGER(IntKi), PARAMETER :: J6Azi = 4263 + INTEGER(IntKi), PARAMETER :: J7Azi = 4264 + INTEGER(IntKi), PARAMETER :: J8Azi = 4265 + INTEGER(IntKi), PARAMETER :: J9Azi = 4266 + INTEGER(IntKi), PARAMETER :: J1DynP = 4267 + INTEGER(IntKi), PARAMETER :: J2DynP = 4268 + INTEGER(IntKi), PARAMETER :: J3DynP = 4269 + INTEGER(IntKi), PARAMETER :: J4DynP = 4270 + INTEGER(IntKi), PARAMETER :: J5DynP = 4271 + INTEGER(IntKi), PARAMETER :: J6DynP = 4272 + INTEGER(IntKi), PARAMETER :: J7DynP = 4273 + INTEGER(IntKi), PARAMETER :: J8DynP = 4274 + INTEGER(IntKi), PARAMETER :: J9DynP = 4275 + INTEGER(IntKi), PARAMETER :: J1WaveElev = 4276 + INTEGER(IntKi), PARAMETER :: J2WaveElev = 4277 + INTEGER(IntKi), PARAMETER :: J3WaveElev = 4278 + INTEGER(IntKi), PARAMETER :: J4WaveElev = 4279 + INTEGER(IntKi), PARAMETER :: J5WaveElev = 4280 + INTEGER(IntKi), PARAMETER :: J6WaveElev = 4281 + INTEGER(IntKi), PARAMETER :: J7WaveElev = 4282 + INTEGER(IntKi), PARAMETER :: J8WaveElev = 4283 + INTEGER(IntKi), PARAMETER :: J9WaveElev = 4284 + INTEGER(IntKi), PARAMETER :: J1WaveElv1 = 4285 + INTEGER(IntKi), PARAMETER :: J2WaveElv1 = 4286 + INTEGER(IntKi), PARAMETER :: J3WaveElv1 = 4287 + INTEGER(IntKi), PARAMETER :: J4WaveElv1 = 4288 + INTEGER(IntKi), PARAMETER :: J5WaveElv1 = 4289 + INTEGER(IntKi), PARAMETER :: J6WaveElv1 = 4290 + INTEGER(IntKi), PARAMETER :: J7WaveElv1 = 4291 + INTEGER(IntKi), PARAMETER :: J8WaveElv1 = 4292 + INTEGER(IntKi), PARAMETER :: J9WaveElv1 = 4293 + INTEGER(IntKi), PARAMETER :: J1WaveElv2 = 4294 + INTEGER(IntKi), PARAMETER :: J2WaveElv2 = 4295 + INTEGER(IntKi), PARAMETER :: J3WaveElv2 = 4296 + INTEGER(IntKi), PARAMETER :: J4WaveElv2 = 4297 + INTEGER(IntKi), PARAMETER :: J5WaveElv2 = 4298 + INTEGER(IntKi), PARAMETER :: J6WaveElv2 = 4299 + INTEGER(IntKi), PARAMETER :: J7WaveElv2 = 4300 + INTEGER(IntKi), PARAMETER :: J8WaveElv2 = 4301 + INTEGER(IntKi), PARAMETER :: J9WaveElv2 = 4302 + INTEGER(IntKi), PARAMETER :: J1STVxi = 4303 + INTEGER(IntKi), PARAMETER :: J2STVxi = 4304 + INTEGER(IntKi), PARAMETER :: J3STVxi = 4305 + INTEGER(IntKi), PARAMETER :: J4STVxi = 4306 + INTEGER(IntKi), PARAMETER :: J5STVxi = 4307 + INTEGER(IntKi), PARAMETER :: J6STVxi = 4308 + INTEGER(IntKi), PARAMETER :: J7STVxi = 4309 + INTEGER(IntKi), PARAMETER :: J8STVxi = 4310 + INTEGER(IntKi), PARAMETER :: J9STVxi = 4311 + INTEGER(IntKi), PARAMETER :: J1STVyi = 4312 + INTEGER(IntKi), PARAMETER :: J2STVyi = 4313 + INTEGER(IntKi), PARAMETER :: J3STVyi = 4314 + INTEGER(IntKi), PARAMETER :: J4STVyi = 4315 + INTEGER(IntKi), PARAMETER :: J5STVyi = 4316 + INTEGER(IntKi), PARAMETER :: J6STVyi = 4317 + INTEGER(IntKi), PARAMETER :: J7STVyi = 4318 + INTEGER(IntKi), PARAMETER :: J8STVyi = 4319 + INTEGER(IntKi), PARAMETER :: J9STVyi = 4320 + INTEGER(IntKi), PARAMETER :: J1STVzi = 4321 + INTEGER(IntKi), PARAMETER :: J2STVzi = 4322 + INTEGER(IntKi), PARAMETER :: J3STVzi = 4323 + INTEGER(IntKi), PARAMETER :: J4STVzi = 4324 + INTEGER(IntKi), PARAMETER :: J5STVzi = 4325 + INTEGER(IntKi), PARAMETER :: J6STVzi = 4326 + INTEGER(IntKi), PARAMETER :: J7STVzi = 4327 + INTEGER(IntKi), PARAMETER :: J8STVzi = 4328 + INTEGER(IntKi), PARAMETER :: J9STVzi = 4329 + INTEGER(IntKi), PARAMETER :: J1STAxi = 4330 + INTEGER(IntKi), PARAMETER :: J2STAxi = 4331 + INTEGER(IntKi), PARAMETER :: J3STAxi = 4332 + INTEGER(IntKi), PARAMETER :: J4STAxi = 4333 + INTEGER(IntKi), PARAMETER :: J5STAxi = 4334 + INTEGER(IntKi), PARAMETER :: J6STAxi = 4335 + INTEGER(IntKi), PARAMETER :: J7STAxi = 4336 + INTEGER(IntKi), PARAMETER :: J8STAxi = 4337 + INTEGER(IntKi), PARAMETER :: J9STAxi = 4338 + INTEGER(IntKi), PARAMETER :: J1STAyi = 4339 + INTEGER(IntKi), PARAMETER :: J2STAyi = 4340 + INTEGER(IntKi), PARAMETER :: J3STAyi = 4341 + INTEGER(IntKi), PARAMETER :: J4STAyi = 4342 + INTEGER(IntKi), PARAMETER :: J5STAyi = 4343 + INTEGER(IntKi), PARAMETER :: J6STAyi = 4344 + INTEGER(IntKi), PARAMETER :: J7STAyi = 4345 + INTEGER(IntKi), PARAMETER :: J8STAyi = 4346 + INTEGER(IntKi), PARAMETER :: J9STAyi = 4347 + INTEGER(IntKi), PARAMETER :: J1STAzi = 4348 + INTEGER(IntKi), PARAMETER :: J2STAzi = 4349 + INTEGER(IntKi), PARAMETER :: J3STAzi = 4350 + INTEGER(IntKi), PARAMETER :: J4STAzi = 4351 + INTEGER(IntKi), PARAMETER :: J5STAzi = 4352 + INTEGER(IntKi), PARAMETER :: J6STAzi = 4353 + INTEGER(IntKi), PARAMETER :: J7STAzi = 4354 + INTEGER(IntKi), PARAMETER :: J8STAzi = 4355 + INTEGER(IntKi), PARAMETER :: J9STAzi = 4356 ! Joint Loads: - INTEGER(IntKi), PARAMETER :: J1FDxi = 4330 - INTEGER(IntKi), PARAMETER :: J2FDxi = 4331 - INTEGER(IntKi), PARAMETER :: J3FDxi = 4332 - INTEGER(IntKi), PARAMETER :: J4FDxi = 4333 - INTEGER(IntKi), PARAMETER :: J5FDxi = 4334 - INTEGER(IntKi), PARAMETER :: J6FDxi = 4335 - INTEGER(IntKi), PARAMETER :: J7FDxi = 4336 - INTEGER(IntKi), PARAMETER :: J8FDxi = 4337 - INTEGER(IntKi), PARAMETER :: J9FDxi = 4338 - INTEGER(IntKi), PARAMETER :: J1FDyi = 4339 - INTEGER(IntKi), PARAMETER :: J2FDyi = 4340 - INTEGER(IntKi), PARAMETER :: J3FDyi = 4341 - INTEGER(IntKi), PARAMETER :: J4FDyi = 4342 - INTEGER(IntKi), PARAMETER :: J5FDyi = 4343 - INTEGER(IntKi), PARAMETER :: J6FDyi = 4344 - INTEGER(IntKi), PARAMETER :: J7FDyi = 4345 - INTEGER(IntKi), PARAMETER :: J8FDyi = 4346 - INTEGER(IntKi), PARAMETER :: J9FDyi = 4347 - INTEGER(IntKi), PARAMETER :: J1FDzi = 4348 - INTEGER(IntKi), PARAMETER :: J2FDzi = 4349 - INTEGER(IntKi), PARAMETER :: J3FDzi = 4350 - INTEGER(IntKi), PARAMETER :: J4FDzi = 4351 - INTEGER(IntKi), PARAMETER :: J5FDzi = 4352 - INTEGER(IntKi), PARAMETER :: J6FDzi = 4353 - INTEGER(IntKi), PARAMETER :: J7FDzi = 4354 - INTEGER(IntKi), PARAMETER :: J8FDzi = 4355 - INTEGER(IntKi), PARAMETER :: J9FDzi = 4356 - INTEGER(IntKi), PARAMETER :: J1FBxi = 4357 - INTEGER(IntKi), PARAMETER :: J2FBxi = 4358 - INTEGER(IntKi), PARAMETER :: J3FBxi = 4359 - INTEGER(IntKi), PARAMETER :: J4FBxi = 4360 - INTEGER(IntKi), PARAMETER :: J5FBxi = 4361 - INTEGER(IntKi), PARAMETER :: J6FBxi = 4362 - INTEGER(IntKi), PARAMETER :: J7FBxi = 4363 - INTEGER(IntKi), PARAMETER :: J8FBxi = 4364 - INTEGER(IntKi), PARAMETER :: J9FBxi = 4365 - INTEGER(IntKi), PARAMETER :: J1FByi = 4366 - INTEGER(IntKi), PARAMETER :: J2FByi = 4367 - INTEGER(IntKi), PARAMETER :: J3FByi = 4368 - INTEGER(IntKi), PARAMETER :: J4FByi = 4369 - INTEGER(IntKi), PARAMETER :: J5FByi = 4370 - INTEGER(IntKi), PARAMETER :: J6FByi = 4371 - INTEGER(IntKi), PARAMETER :: J7FByi = 4372 - INTEGER(IntKi), PARAMETER :: J8FByi = 4373 - INTEGER(IntKi), PARAMETER :: J9FByi = 4374 - INTEGER(IntKi), PARAMETER :: J1FBzi = 4375 - INTEGER(IntKi), PARAMETER :: J2FBzi = 4376 - INTEGER(IntKi), PARAMETER :: J3FBzi = 4377 - INTEGER(IntKi), PARAMETER :: J4FBzi = 4378 - INTEGER(IntKi), PARAMETER :: J5FBzi = 4379 - INTEGER(IntKi), PARAMETER :: J6FBzi = 4380 - INTEGER(IntKi), PARAMETER :: J7FBzi = 4381 - INTEGER(IntKi), PARAMETER :: J8FBzi = 4382 - INTEGER(IntKi), PARAMETER :: J9FBzi = 4383 - INTEGER(IntKi), PARAMETER :: J1MBxi = 4384 - INTEGER(IntKi), PARAMETER :: J2MBxi = 4385 - INTEGER(IntKi), PARAMETER :: J3MBxi = 4386 - INTEGER(IntKi), PARAMETER :: J4MBxi = 4387 - INTEGER(IntKi), PARAMETER :: J5MBxi = 4388 - INTEGER(IntKi), PARAMETER :: J6MBxi = 4389 - INTEGER(IntKi), PARAMETER :: J7MBxi = 4390 - INTEGER(IntKi), PARAMETER :: J8MBxi = 4391 - INTEGER(IntKi), PARAMETER :: J9MBxi = 4392 - INTEGER(IntKi), PARAMETER :: J1MByi = 4393 - INTEGER(IntKi), PARAMETER :: J2MByi = 4394 - INTEGER(IntKi), PARAMETER :: J3MByi = 4395 - INTEGER(IntKi), PARAMETER :: J4MByi = 4396 - INTEGER(IntKi), PARAMETER :: J5MByi = 4397 - INTEGER(IntKi), PARAMETER :: J6MByi = 4398 - INTEGER(IntKi), PARAMETER :: J7MByi = 4399 - INTEGER(IntKi), PARAMETER :: J8MByi = 4400 - INTEGER(IntKi), PARAMETER :: J9MByi = 4401 - INTEGER(IntKi), PARAMETER :: J1MBzi = 4402 - INTEGER(IntKi), PARAMETER :: J2MBzi = 4403 - INTEGER(IntKi), PARAMETER :: J3MBzi = 4404 - INTEGER(IntKi), PARAMETER :: J4MBzi = 4405 - INTEGER(IntKi), PARAMETER :: J5MBzi = 4406 - INTEGER(IntKi), PARAMETER :: J6MBzi = 4407 - INTEGER(IntKi), PARAMETER :: J7MBzi = 4408 - INTEGER(IntKi), PARAMETER :: J8MBzi = 4409 - INTEGER(IntKi), PARAMETER :: J9MBzi = 4410 - INTEGER(IntKi), PARAMETER :: J1FBFxi = 4411 - INTEGER(IntKi), PARAMETER :: J2FBFxi = 4412 - INTEGER(IntKi), PARAMETER :: J3FBFxi = 4413 - INTEGER(IntKi), PARAMETER :: J4FBFxi = 4414 - INTEGER(IntKi), PARAMETER :: J5FBFxi = 4415 - INTEGER(IntKi), PARAMETER :: J6FBFxi = 4416 - INTEGER(IntKi), PARAMETER :: J7FBFxi = 4417 - INTEGER(IntKi), PARAMETER :: J8FBFxi = 4418 - INTEGER(IntKi), PARAMETER :: J9FBFxi = 4419 - INTEGER(IntKi), PARAMETER :: J1FBFyi = 4420 - INTEGER(IntKi), PARAMETER :: J2FBFyi = 4421 - INTEGER(IntKi), PARAMETER :: J3FBFyi = 4422 - INTEGER(IntKi), PARAMETER :: J4FBFyi = 4423 - INTEGER(IntKi), PARAMETER :: J5FBFyi = 4424 - INTEGER(IntKi), PARAMETER :: J6FBFyi = 4425 - INTEGER(IntKi), PARAMETER :: J7FBFyi = 4426 - INTEGER(IntKi), PARAMETER :: J8FBFyi = 4427 - INTEGER(IntKi), PARAMETER :: J9FBFyi = 4428 - INTEGER(IntKi), PARAMETER :: J1FBFzi = 4429 - INTEGER(IntKi), PARAMETER :: J2FBFzi = 4430 - INTEGER(IntKi), PARAMETER :: J3FBFzi = 4431 - INTEGER(IntKi), PARAMETER :: J4FBFzi = 4432 - INTEGER(IntKi), PARAMETER :: J5FBFzi = 4433 - INTEGER(IntKi), PARAMETER :: J6FBFzi = 4434 - INTEGER(IntKi), PARAMETER :: J7FBFzi = 4435 - INTEGER(IntKi), PARAMETER :: J8FBFzi = 4436 - INTEGER(IntKi), PARAMETER :: J9FBFzi = 4437 - INTEGER(IntKi), PARAMETER :: J1MBFxi = 4438 - INTEGER(IntKi), PARAMETER :: J2MBFxi = 4439 - INTEGER(IntKi), PARAMETER :: J3MBFxi = 4440 - INTEGER(IntKi), PARAMETER :: J4MBFxi = 4441 - INTEGER(IntKi), PARAMETER :: J5MBFxi = 4442 - INTEGER(IntKi), PARAMETER :: J6MBFxi = 4443 - INTEGER(IntKi), PARAMETER :: J7MBFxi = 4444 - INTEGER(IntKi), PARAMETER :: J8MBFxi = 4445 - INTEGER(IntKi), PARAMETER :: J9MBFxi = 4446 - INTEGER(IntKi), PARAMETER :: J1MBFyi = 4447 - INTEGER(IntKi), PARAMETER :: J2MBFyi = 4448 - INTEGER(IntKi), PARAMETER :: J3MBFyi = 4449 - INTEGER(IntKi), PARAMETER :: J4MBFyi = 4450 - INTEGER(IntKi), PARAMETER :: J5MBFyi = 4451 - INTEGER(IntKi), PARAMETER :: J6MBFyi = 4452 - INTEGER(IntKi), PARAMETER :: J7MBFyi = 4453 - INTEGER(IntKi), PARAMETER :: J8MBFyi = 4454 - INTEGER(IntKi), PARAMETER :: J9MBFyi = 4455 - INTEGER(IntKi), PARAMETER :: J1MBFzi = 4456 - INTEGER(IntKi), PARAMETER :: J2MBFzi = 4457 - INTEGER(IntKi), PARAMETER :: J3MBFzi = 4458 - INTEGER(IntKi), PARAMETER :: J4MBFzi = 4459 - INTEGER(IntKi), PARAMETER :: J5MBFzi = 4460 - INTEGER(IntKi), PARAMETER :: J6MBFzi = 4461 - INTEGER(IntKi), PARAMETER :: J7MBFzi = 4462 - INTEGER(IntKi), PARAMETER :: J8MBFzi = 4463 - INTEGER(IntKi), PARAMETER :: J9MBFzi = 4464 - INTEGER(IntKi), PARAMETER :: J1FIxi = 4465 - INTEGER(IntKi), PARAMETER :: J2FIxi = 4466 - INTEGER(IntKi), PARAMETER :: J3FIxi = 4467 - INTEGER(IntKi), PARAMETER :: J4FIxi = 4468 - INTEGER(IntKi), PARAMETER :: J5FIxi = 4469 - INTEGER(IntKi), PARAMETER :: J6FIxi = 4470 - INTEGER(IntKi), PARAMETER :: J7FIxi = 4471 - INTEGER(IntKi), PARAMETER :: J8FIxi = 4472 - INTEGER(IntKi), PARAMETER :: J9FIxi = 4473 - INTEGER(IntKi), PARAMETER :: J1FIyi = 4474 - INTEGER(IntKi), PARAMETER :: J2FIyi = 4475 - INTEGER(IntKi), PARAMETER :: J3FIyi = 4476 - INTEGER(IntKi), PARAMETER :: J4FIyi = 4477 - INTEGER(IntKi), PARAMETER :: J5FIyi = 4478 - INTEGER(IntKi), PARAMETER :: J6FIyi = 4479 - INTEGER(IntKi), PARAMETER :: J7FIyi = 4480 - INTEGER(IntKi), PARAMETER :: J8FIyi = 4481 - INTEGER(IntKi), PARAMETER :: J9FIyi = 4482 - INTEGER(IntKi), PARAMETER :: J1FIzi = 4483 - INTEGER(IntKi), PARAMETER :: J2FIzi = 4484 - INTEGER(IntKi), PARAMETER :: J3FIzi = 4485 - INTEGER(IntKi), PARAMETER :: J4FIzi = 4486 - INTEGER(IntKi), PARAMETER :: J5FIzi = 4487 - INTEGER(IntKi), PARAMETER :: J6FIzi = 4488 - INTEGER(IntKi), PARAMETER :: J7FIzi = 4489 - INTEGER(IntKi), PARAMETER :: J8FIzi = 4490 - INTEGER(IntKi), PARAMETER :: J9FIzi = 4491 - INTEGER(IntKi), PARAMETER :: J1FAMxi = 4492 - INTEGER(IntKi), PARAMETER :: J2FAMxi = 4493 - INTEGER(IntKi), PARAMETER :: J3FAMxi = 4494 - INTEGER(IntKi), PARAMETER :: J4FAMxi = 4495 - INTEGER(IntKi), PARAMETER :: J5FAMxi = 4496 - INTEGER(IntKi), PARAMETER :: J6FAMxi = 4497 - INTEGER(IntKi), PARAMETER :: J7FAMxi = 4498 - INTEGER(IntKi), PARAMETER :: J8FAMxi = 4499 - INTEGER(IntKi), PARAMETER :: J9FAMxi = 4500 - INTEGER(IntKi), PARAMETER :: J1FAMyi = 4501 - INTEGER(IntKi), PARAMETER :: J2FAMyi = 4502 - INTEGER(IntKi), PARAMETER :: J3FAMyi = 4503 - INTEGER(IntKi), PARAMETER :: J4FAMyi = 4504 - INTEGER(IntKi), PARAMETER :: J5FAMyi = 4505 - INTEGER(IntKi), PARAMETER :: J6FAMyi = 4506 - INTEGER(IntKi), PARAMETER :: J7FAMyi = 4507 - INTEGER(IntKi), PARAMETER :: J8FAMyi = 4508 - INTEGER(IntKi), PARAMETER :: J9FAMyi = 4509 - INTEGER(IntKi), PARAMETER :: J1FAMzi = 4510 - INTEGER(IntKi), PARAMETER :: J2FAMzi = 4511 - INTEGER(IntKi), PARAMETER :: J3FAMzi = 4512 - INTEGER(IntKi), PARAMETER :: J4FAMzi = 4513 - INTEGER(IntKi), PARAMETER :: J5FAMzi = 4514 - INTEGER(IntKi), PARAMETER :: J6FAMzi = 4515 - INTEGER(IntKi), PARAMETER :: J7FAMzi = 4516 - INTEGER(IntKi), PARAMETER :: J8FAMzi = 4517 - INTEGER(IntKi), PARAMETER :: J9FAMzi = 4518 - INTEGER(IntKi), PARAMETER :: J1FAGxi = 4519 - INTEGER(IntKi), PARAMETER :: J2FAGxi = 4520 - INTEGER(IntKi), PARAMETER :: J3FAGxi = 4521 - INTEGER(IntKi), PARAMETER :: J4FAGxi = 4522 - INTEGER(IntKi), PARAMETER :: J5FAGxi = 4523 - INTEGER(IntKi), PARAMETER :: J6FAGxi = 4524 - INTEGER(IntKi), PARAMETER :: J7FAGxi = 4525 - INTEGER(IntKi), PARAMETER :: J8FAGxi = 4526 - INTEGER(IntKi), PARAMETER :: J9FAGxi = 4527 - INTEGER(IntKi), PARAMETER :: J1FAGyi = 4528 - INTEGER(IntKi), PARAMETER :: J2FAGyi = 4529 - INTEGER(IntKi), PARAMETER :: J3FAGyi = 4530 - INTEGER(IntKi), PARAMETER :: J4FAGyi = 4531 - INTEGER(IntKi), PARAMETER :: J5FAGyi = 4532 - INTEGER(IntKi), PARAMETER :: J6FAGyi = 4533 - INTEGER(IntKi), PARAMETER :: J7FAGyi = 4534 - INTEGER(IntKi), PARAMETER :: J8FAGyi = 4535 - INTEGER(IntKi), PARAMETER :: J9FAGyi = 4536 - INTEGER(IntKi), PARAMETER :: J1FAGzi = 4537 - INTEGER(IntKi), PARAMETER :: J2FAGzi = 4538 - INTEGER(IntKi), PARAMETER :: J3FAGzi = 4539 - INTEGER(IntKi), PARAMETER :: J4FAGzi = 4540 - INTEGER(IntKi), PARAMETER :: J5FAGzi = 4541 - INTEGER(IntKi), PARAMETER :: J6FAGzi = 4542 - INTEGER(IntKi), PARAMETER :: J7FAGzi = 4543 - INTEGER(IntKi), PARAMETER :: J8FAGzi = 4544 - INTEGER(IntKi), PARAMETER :: J9FAGzi = 4545 - INTEGER(IntKi), PARAMETER :: J1MAGxi = 4546 - INTEGER(IntKi), PARAMETER :: J2MAGxi = 4547 - INTEGER(IntKi), PARAMETER :: J3MAGxi = 4548 - INTEGER(IntKi), PARAMETER :: J4MAGxi = 4549 - INTEGER(IntKi), PARAMETER :: J5MAGxi = 4550 - INTEGER(IntKi), PARAMETER :: J6MAGxi = 4551 - INTEGER(IntKi), PARAMETER :: J7MAGxi = 4552 - INTEGER(IntKi), PARAMETER :: J8MAGxi = 4553 - INTEGER(IntKi), PARAMETER :: J9MAGxi = 4554 - INTEGER(IntKi), PARAMETER :: J1MAGyi = 4555 - INTEGER(IntKi), PARAMETER :: J2MAGyi = 4556 - INTEGER(IntKi), PARAMETER :: J3MAGyi = 4557 - INTEGER(IntKi), PARAMETER :: J4MAGyi = 4558 - INTEGER(IntKi), PARAMETER :: J5MAGyi = 4559 - INTEGER(IntKi), PARAMETER :: J6MAGyi = 4560 - INTEGER(IntKi), PARAMETER :: J7MAGyi = 4561 - INTEGER(IntKi), PARAMETER :: J8MAGyi = 4562 - INTEGER(IntKi), PARAMETER :: J9MAGyi = 4563 - INTEGER(IntKi), PARAMETER :: J1MAGzi = 4564 - INTEGER(IntKi), PARAMETER :: J2MAGzi = 4565 - INTEGER(IntKi), PARAMETER :: J3MAGzi = 4566 - INTEGER(IntKi), PARAMETER :: J4MAGzi = 4567 - INTEGER(IntKi), PARAMETER :: J5MAGzi = 4568 - INTEGER(IntKi), PARAMETER :: J6MAGzi = 4569 - INTEGER(IntKi), PARAMETER :: J7MAGzi = 4570 - INTEGER(IntKi), PARAMETER :: J8MAGzi = 4571 - INTEGER(IntKi), PARAMETER :: J9MAGzi = 4572 - INTEGER(IntKi), PARAMETER :: J1FMGxi = 4573 - INTEGER(IntKi), PARAMETER :: J2FMGxi = 4574 - INTEGER(IntKi), PARAMETER :: J3FMGxi = 4575 - INTEGER(IntKi), PARAMETER :: J4FMGxi = 4576 - INTEGER(IntKi), PARAMETER :: J5FMGxi = 4577 - INTEGER(IntKi), PARAMETER :: J6FMGxi = 4578 - INTEGER(IntKi), PARAMETER :: J7FMGxi = 4579 - INTEGER(IntKi), PARAMETER :: J8FMGxi = 4580 - INTEGER(IntKi), PARAMETER :: J9FMGxi = 4581 - INTEGER(IntKi), PARAMETER :: J1FMGyi = 4582 - INTEGER(IntKi), PARAMETER :: J2FMGyi = 4583 - INTEGER(IntKi), PARAMETER :: J3FMGyi = 4584 - INTEGER(IntKi), PARAMETER :: J4FMGyi = 4585 - INTEGER(IntKi), PARAMETER :: J5FMGyi = 4586 - INTEGER(IntKi), PARAMETER :: J6FMGyi = 4587 - INTEGER(IntKi), PARAMETER :: J7FMGyi = 4588 - INTEGER(IntKi), PARAMETER :: J8FMGyi = 4589 - INTEGER(IntKi), PARAMETER :: J9FMGyi = 4590 - INTEGER(IntKi), PARAMETER :: J1FMGzi = 4591 - INTEGER(IntKi), PARAMETER :: J2FMGzi = 4592 - INTEGER(IntKi), PARAMETER :: J3FMGzi = 4593 - INTEGER(IntKi), PARAMETER :: J4FMGzi = 4594 - INTEGER(IntKi), PARAMETER :: J5FMGzi = 4595 - INTEGER(IntKi), PARAMETER :: J6FMGzi = 4596 - INTEGER(IntKi), PARAMETER :: J7FMGzi = 4597 - INTEGER(IntKi), PARAMETER :: J8FMGzi = 4598 - INTEGER(IntKi), PARAMETER :: J9FMGzi = 4599 + INTEGER(IntKi), PARAMETER :: J1FDxi = 4357 + INTEGER(IntKi), PARAMETER :: J2FDxi = 4358 + INTEGER(IntKi), PARAMETER :: J3FDxi = 4359 + INTEGER(IntKi), PARAMETER :: J4FDxi = 4360 + INTEGER(IntKi), PARAMETER :: J5FDxi = 4361 + INTEGER(IntKi), PARAMETER :: J6FDxi = 4362 + INTEGER(IntKi), PARAMETER :: J7FDxi = 4363 + INTEGER(IntKi), PARAMETER :: J8FDxi = 4364 + INTEGER(IntKi), PARAMETER :: J9FDxi = 4365 + INTEGER(IntKi), PARAMETER :: J1FDyi = 4366 + INTEGER(IntKi), PARAMETER :: J2FDyi = 4367 + INTEGER(IntKi), PARAMETER :: J3FDyi = 4368 + INTEGER(IntKi), PARAMETER :: J4FDyi = 4369 + INTEGER(IntKi), PARAMETER :: J5FDyi = 4370 + INTEGER(IntKi), PARAMETER :: J6FDyi = 4371 + INTEGER(IntKi), PARAMETER :: J7FDyi = 4372 + INTEGER(IntKi), PARAMETER :: J8FDyi = 4373 + INTEGER(IntKi), PARAMETER :: J9FDyi = 4374 + INTEGER(IntKi), PARAMETER :: J1FDzi = 4375 + INTEGER(IntKi), PARAMETER :: J2FDzi = 4376 + INTEGER(IntKi), PARAMETER :: J3FDzi = 4377 + INTEGER(IntKi), PARAMETER :: J4FDzi = 4378 + INTEGER(IntKi), PARAMETER :: J5FDzi = 4379 + INTEGER(IntKi), PARAMETER :: J6FDzi = 4380 + INTEGER(IntKi), PARAMETER :: J7FDzi = 4381 + INTEGER(IntKi), PARAMETER :: J8FDzi = 4382 + INTEGER(IntKi), PARAMETER :: J9FDzi = 4383 + INTEGER(IntKi), PARAMETER :: J1FBxi = 4384 + INTEGER(IntKi), PARAMETER :: J2FBxi = 4385 + INTEGER(IntKi), PARAMETER :: J3FBxi = 4386 + INTEGER(IntKi), PARAMETER :: J4FBxi = 4387 + INTEGER(IntKi), PARAMETER :: J5FBxi = 4388 + INTEGER(IntKi), PARAMETER :: J6FBxi = 4389 + INTEGER(IntKi), PARAMETER :: J7FBxi = 4390 + INTEGER(IntKi), PARAMETER :: J8FBxi = 4391 + INTEGER(IntKi), PARAMETER :: J9FBxi = 4392 + INTEGER(IntKi), PARAMETER :: J1FByi = 4393 + INTEGER(IntKi), PARAMETER :: J2FByi = 4394 + INTEGER(IntKi), PARAMETER :: J3FByi = 4395 + INTEGER(IntKi), PARAMETER :: J4FByi = 4396 + INTEGER(IntKi), PARAMETER :: J5FByi = 4397 + INTEGER(IntKi), PARAMETER :: J6FByi = 4398 + INTEGER(IntKi), PARAMETER :: J7FByi = 4399 + INTEGER(IntKi), PARAMETER :: J8FByi = 4400 + INTEGER(IntKi), PARAMETER :: J9FByi = 4401 + INTEGER(IntKi), PARAMETER :: J1FBzi = 4402 + INTEGER(IntKi), PARAMETER :: J2FBzi = 4403 + INTEGER(IntKi), PARAMETER :: J3FBzi = 4404 + INTEGER(IntKi), PARAMETER :: J4FBzi = 4405 + INTEGER(IntKi), PARAMETER :: J5FBzi = 4406 + INTEGER(IntKi), PARAMETER :: J6FBzi = 4407 + INTEGER(IntKi), PARAMETER :: J7FBzi = 4408 + INTEGER(IntKi), PARAMETER :: J8FBzi = 4409 + INTEGER(IntKi), PARAMETER :: J9FBzi = 4410 + INTEGER(IntKi), PARAMETER :: J1MBxi = 4411 + INTEGER(IntKi), PARAMETER :: J2MBxi = 4412 + INTEGER(IntKi), PARAMETER :: J3MBxi = 4413 + INTEGER(IntKi), PARAMETER :: J4MBxi = 4414 + INTEGER(IntKi), PARAMETER :: J5MBxi = 4415 + INTEGER(IntKi), PARAMETER :: J6MBxi = 4416 + INTEGER(IntKi), PARAMETER :: J7MBxi = 4417 + INTEGER(IntKi), PARAMETER :: J8MBxi = 4418 + INTEGER(IntKi), PARAMETER :: J9MBxi = 4419 + INTEGER(IntKi), PARAMETER :: J1MByi = 4420 + INTEGER(IntKi), PARAMETER :: J2MByi = 4421 + INTEGER(IntKi), PARAMETER :: J3MByi = 4422 + INTEGER(IntKi), PARAMETER :: J4MByi = 4423 + INTEGER(IntKi), PARAMETER :: J5MByi = 4424 + INTEGER(IntKi), PARAMETER :: J6MByi = 4425 + INTEGER(IntKi), PARAMETER :: J7MByi = 4426 + INTEGER(IntKi), PARAMETER :: J8MByi = 4427 + INTEGER(IntKi), PARAMETER :: J9MByi = 4428 + INTEGER(IntKi), PARAMETER :: J1MBzi = 4429 + INTEGER(IntKi), PARAMETER :: J2MBzi = 4430 + INTEGER(IntKi), PARAMETER :: J3MBzi = 4431 + INTEGER(IntKi), PARAMETER :: J4MBzi = 4432 + INTEGER(IntKi), PARAMETER :: J5MBzi = 4433 + INTEGER(IntKi), PARAMETER :: J6MBzi = 4434 + INTEGER(IntKi), PARAMETER :: J7MBzi = 4435 + INTEGER(IntKi), PARAMETER :: J8MBzi = 4436 + INTEGER(IntKi), PARAMETER :: J9MBzi = 4437 + INTEGER(IntKi), PARAMETER :: J1FBFxi = 4438 + INTEGER(IntKi), PARAMETER :: J2FBFxi = 4439 + INTEGER(IntKi), PARAMETER :: J3FBFxi = 4440 + INTEGER(IntKi), PARAMETER :: J4FBFxi = 4441 + INTEGER(IntKi), PARAMETER :: J5FBFxi = 4442 + INTEGER(IntKi), PARAMETER :: J6FBFxi = 4443 + INTEGER(IntKi), PARAMETER :: J7FBFxi = 4444 + INTEGER(IntKi), PARAMETER :: J8FBFxi = 4445 + INTEGER(IntKi), PARAMETER :: J9FBFxi = 4446 + INTEGER(IntKi), PARAMETER :: J1FBFyi = 4447 + INTEGER(IntKi), PARAMETER :: J2FBFyi = 4448 + INTEGER(IntKi), PARAMETER :: J3FBFyi = 4449 + INTEGER(IntKi), PARAMETER :: J4FBFyi = 4450 + INTEGER(IntKi), PARAMETER :: J5FBFyi = 4451 + INTEGER(IntKi), PARAMETER :: J6FBFyi = 4452 + INTEGER(IntKi), PARAMETER :: J7FBFyi = 4453 + INTEGER(IntKi), PARAMETER :: J8FBFyi = 4454 + INTEGER(IntKi), PARAMETER :: J9FBFyi = 4455 + INTEGER(IntKi), PARAMETER :: J1FBFzi = 4456 + INTEGER(IntKi), PARAMETER :: J2FBFzi = 4457 + INTEGER(IntKi), PARAMETER :: J3FBFzi = 4458 + INTEGER(IntKi), PARAMETER :: J4FBFzi = 4459 + INTEGER(IntKi), PARAMETER :: J5FBFzi = 4460 + INTEGER(IntKi), PARAMETER :: J6FBFzi = 4461 + INTEGER(IntKi), PARAMETER :: J7FBFzi = 4462 + INTEGER(IntKi), PARAMETER :: J8FBFzi = 4463 + INTEGER(IntKi), PARAMETER :: J9FBFzi = 4464 + INTEGER(IntKi), PARAMETER :: J1MBFxi = 4465 + INTEGER(IntKi), PARAMETER :: J2MBFxi = 4466 + INTEGER(IntKi), PARAMETER :: J3MBFxi = 4467 + INTEGER(IntKi), PARAMETER :: J4MBFxi = 4468 + INTEGER(IntKi), PARAMETER :: J5MBFxi = 4469 + INTEGER(IntKi), PARAMETER :: J6MBFxi = 4470 + INTEGER(IntKi), PARAMETER :: J7MBFxi = 4471 + INTEGER(IntKi), PARAMETER :: J8MBFxi = 4472 + INTEGER(IntKi), PARAMETER :: J9MBFxi = 4473 + INTEGER(IntKi), PARAMETER :: J1MBFyi = 4474 + INTEGER(IntKi), PARAMETER :: J2MBFyi = 4475 + INTEGER(IntKi), PARAMETER :: J3MBFyi = 4476 + INTEGER(IntKi), PARAMETER :: J4MBFyi = 4477 + INTEGER(IntKi), PARAMETER :: J5MBFyi = 4478 + INTEGER(IntKi), PARAMETER :: J6MBFyi = 4479 + INTEGER(IntKi), PARAMETER :: J7MBFyi = 4480 + INTEGER(IntKi), PARAMETER :: J8MBFyi = 4481 + INTEGER(IntKi), PARAMETER :: J9MBFyi = 4482 + INTEGER(IntKi), PARAMETER :: J1MBFzi = 4483 + INTEGER(IntKi), PARAMETER :: J2MBFzi = 4484 + INTEGER(IntKi), PARAMETER :: J3MBFzi = 4485 + INTEGER(IntKi), PARAMETER :: J4MBFzi = 4486 + INTEGER(IntKi), PARAMETER :: J5MBFzi = 4487 + INTEGER(IntKi), PARAMETER :: J6MBFzi = 4488 + INTEGER(IntKi), PARAMETER :: J7MBFzi = 4489 + INTEGER(IntKi), PARAMETER :: J8MBFzi = 4490 + INTEGER(IntKi), PARAMETER :: J9MBFzi = 4491 + INTEGER(IntKi), PARAMETER :: J1FIxi = 4492 + INTEGER(IntKi), PARAMETER :: J2FIxi = 4493 + INTEGER(IntKi), PARAMETER :: J3FIxi = 4494 + INTEGER(IntKi), PARAMETER :: J4FIxi = 4495 + INTEGER(IntKi), PARAMETER :: J5FIxi = 4496 + INTEGER(IntKi), PARAMETER :: J6FIxi = 4497 + INTEGER(IntKi), PARAMETER :: J7FIxi = 4498 + INTEGER(IntKi), PARAMETER :: J8FIxi = 4499 + INTEGER(IntKi), PARAMETER :: J9FIxi = 4500 + INTEGER(IntKi), PARAMETER :: J1FIyi = 4501 + INTEGER(IntKi), PARAMETER :: J2FIyi = 4502 + INTEGER(IntKi), PARAMETER :: J3FIyi = 4503 + INTEGER(IntKi), PARAMETER :: J4FIyi = 4504 + INTEGER(IntKi), PARAMETER :: J5FIyi = 4505 + INTEGER(IntKi), PARAMETER :: J6FIyi = 4506 + INTEGER(IntKi), PARAMETER :: J7FIyi = 4507 + INTEGER(IntKi), PARAMETER :: J8FIyi = 4508 + INTEGER(IntKi), PARAMETER :: J9FIyi = 4509 + INTEGER(IntKi), PARAMETER :: J1FIzi = 4510 + INTEGER(IntKi), PARAMETER :: J2FIzi = 4511 + INTEGER(IntKi), PARAMETER :: J3FIzi = 4512 + INTEGER(IntKi), PARAMETER :: J4FIzi = 4513 + INTEGER(IntKi), PARAMETER :: J5FIzi = 4514 + INTEGER(IntKi), PARAMETER :: J6FIzi = 4515 + INTEGER(IntKi), PARAMETER :: J7FIzi = 4516 + INTEGER(IntKi), PARAMETER :: J8FIzi = 4517 + INTEGER(IntKi), PARAMETER :: J9FIzi = 4518 + INTEGER(IntKi), PARAMETER :: J1FAMxi = 4519 + INTEGER(IntKi), PARAMETER :: J2FAMxi = 4520 + INTEGER(IntKi), PARAMETER :: J3FAMxi = 4521 + INTEGER(IntKi), PARAMETER :: J4FAMxi = 4522 + INTEGER(IntKi), PARAMETER :: J5FAMxi = 4523 + INTEGER(IntKi), PARAMETER :: J6FAMxi = 4524 + INTEGER(IntKi), PARAMETER :: J7FAMxi = 4525 + INTEGER(IntKi), PARAMETER :: J8FAMxi = 4526 + INTEGER(IntKi), PARAMETER :: J9FAMxi = 4527 + INTEGER(IntKi), PARAMETER :: J1FAMyi = 4528 + INTEGER(IntKi), PARAMETER :: J2FAMyi = 4529 + INTEGER(IntKi), PARAMETER :: J3FAMyi = 4530 + INTEGER(IntKi), PARAMETER :: J4FAMyi = 4531 + INTEGER(IntKi), PARAMETER :: J5FAMyi = 4532 + INTEGER(IntKi), PARAMETER :: J6FAMyi = 4533 + INTEGER(IntKi), PARAMETER :: J7FAMyi = 4534 + INTEGER(IntKi), PARAMETER :: J8FAMyi = 4535 + INTEGER(IntKi), PARAMETER :: J9FAMyi = 4536 + INTEGER(IntKi), PARAMETER :: J1FAMzi = 4537 + INTEGER(IntKi), PARAMETER :: J2FAMzi = 4538 + INTEGER(IntKi), PARAMETER :: J3FAMzi = 4539 + INTEGER(IntKi), PARAMETER :: J4FAMzi = 4540 + INTEGER(IntKi), PARAMETER :: J5FAMzi = 4541 + INTEGER(IntKi), PARAMETER :: J6FAMzi = 4542 + INTEGER(IntKi), PARAMETER :: J7FAMzi = 4543 + INTEGER(IntKi), PARAMETER :: J8FAMzi = 4544 + INTEGER(IntKi), PARAMETER :: J9FAMzi = 4545 + INTEGER(IntKi), PARAMETER :: J1FAGxi = 4546 + INTEGER(IntKi), PARAMETER :: J2FAGxi = 4547 + INTEGER(IntKi), PARAMETER :: J3FAGxi = 4548 + INTEGER(IntKi), PARAMETER :: J4FAGxi = 4549 + INTEGER(IntKi), PARAMETER :: J5FAGxi = 4550 + INTEGER(IntKi), PARAMETER :: J6FAGxi = 4551 + INTEGER(IntKi), PARAMETER :: J7FAGxi = 4552 + INTEGER(IntKi), PARAMETER :: J8FAGxi = 4553 + INTEGER(IntKi), PARAMETER :: J9FAGxi = 4554 + INTEGER(IntKi), PARAMETER :: J1FAGyi = 4555 + INTEGER(IntKi), PARAMETER :: J2FAGyi = 4556 + INTEGER(IntKi), PARAMETER :: J3FAGyi = 4557 + INTEGER(IntKi), PARAMETER :: J4FAGyi = 4558 + INTEGER(IntKi), PARAMETER :: J5FAGyi = 4559 + INTEGER(IntKi), PARAMETER :: J6FAGyi = 4560 + INTEGER(IntKi), PARAMETER :: J7FAGyi = 4561 + INTEGER(IntKi), PARAMETER :: J8FAGyi = 4562 + INTEGER(IntKi), PARAMETER :: J9FAGyi = 4563 + INTEGER(IntKi), PARAMETER :: J1FAGzi = 4564 + INTEGER(IntKi), PARAMETER :: J2FAGzi = 4565 + INTEGER(IntKi), PARAMETER :: J3FAGzi = 4566 + INTEGER(IntKi), PARAMETER :: J4FAGzi = 4567 + INTEGER(IntKi), PARAMETER :: J5FAGzi = 4568 + INTEGER(IntKi), PARAMETER :: J6FAGzi = 4569 + INTEGER(IntKi), PARAMETER :: J7FAGzi = 4570 + INTEGER(IntKi), PARAMETER :: J8FAGzi = 4571 + INTEGER(IntKi), PARAMETER :: J9FAGzi = 4572 + INTEGER(IntKi), PARAMETER :: J1MAGxi = 4573 + INTEGER(IntKi), PARAMETER :: J2MAGxi = 4574 + INTEGER(IntKi), PARAMETER :: J3MAGxi = 4575 + INTEGER(IntKi), PARAMETER :: J4MAGxi = 4576 + INTEGER(IntKi), PARAMETER :: J5MAGxi = 4577 + INTEGER(IntKi), PARAMETER :: J6MAGxi = 4578 + INTEGER(IntKi), PARAMETER :: J7MAGxi = 4579 + INTEGER(IntKi), PARAMETER :: J8MAGxi = 4580 + INTEGER(IntKi), PARAMETER :: J9MAGxi = 4581 + INTEGER(IntKi), PARAMETER :: J1MAGyi = 4582 + INTEGER(IntKi), PARAMETER :: J2MAGyi = 4583 + INTEGER(IntKi), PARAMETER :: J3MAGyi = 4584 + INTEGER(IntKi), PARAMETER :: J4MAGyi = 4585 + INTEGER(IntKi), PARAMETER :: J5MAGyi = 4586 + INTEGER(IntKi), PARAMETER :: J6MAGyi = 4587 + INTEGER(IntKi), PARAMETER :: J7MAGyi = 4588 + INTEGER(IntKi), PARAMETER :: J8MAGyi = 4589 + INTEGER(IntKi), PARAMETER :: J9MAGyi = 4590 + INTEGER(IntKi), PARAMETER :: J1MAGzi = 4591 + INTEGER(IntKi), PARAMETER :: J2MAGzi = 4592 + INTEGER(IntKi), PARAMETER :: J3MAGzi = 4593 + INTEGER(IntKi), PARAMETER :: J4MAGzi = 4594 + INTEGER(IntKi), PARAMETER :: J5MAGzi = 4595 + INTEGER(IntKi), PARAMETER :: J6MAGzi = 4596 + INTEGER(IntKi), PARAMETER :: J7MAGzi = 4597 + INTEGER(IntKi), PARAMETER :: J8MAGzi = 4598 + INTEGER(IntKi), PARAMETER :: J9MAGzi = 4599 + INTEGER(IntKi), PARAMETER :: J1FMGxi = 4600 + INTEGER(IntKi), PARAMETER :: J2FMGxi = 4601 + INTEGER(IntKi), PARAMETER :: J3FMGxi = 4602 + INTEGER(IntKi), PARAMETER :: J4FMGxi = 4603 + INTEGER(IntKi), PARAMETER :: J5FMGxi = 4604 + INTEGER(IntKi), PARAMETER :: J6FMGxi = 4605 + INTEGER(IntKi), PARAMETER :: J7FMGxi = 4606 + INTEGER(IntKi), PARAMETER :: J8FMGxi = 4607 + INTEGER(IntKi), PARAMETER :: J9FMGxi = 4608 + INTEGER(IntKi), PARAMETER :: J1FMGyi = 4609 + INTEGER(IntKi), PARAMETER :: J2FMGyi = 4610 + INTEGER(IntKi), PARAMETER :: J3FMGyi = 4611 + INTEGER(IntKi), PARAMETER :: J4FMGyi = 4612 + INTEGER(IntKi), PARAMETER :: J5FMGyi = 4613 + INTEGER(IntKi), PARAMETER :: J6FMGyi = 4614 + INTEGER(IntKi), PARAMETER :: J7FMGyi = 4615 + INTEGER(IntKi), PARAMETER :: J8FMGyi = 4616 + INTEGER(IntKi), PARAMETER :: J9FMGyi = 4617 + INTEGER(IntKi), PARAMETER :: J1FMGzi = 4618 + INTEGER(IntKi), PARAMETER :: J2FMGzi = 4619 + INTEGER(IntKi), PARAMETER :: J3FMGzi = 4620 + INTEGER(IntKi), PARAMETER :: J4FMGzi = 4621 + INTEGER(IntKi), PARAMETER :: J5FMGzi = 4622 + INTEGER(IntKi), PARAMETER :: J6FMGzi = 4623 + INTEGER(IntKi), PARAMETER :: J7FMGzi = 4624 + INTEGER(IntKi), PARAMETER :: J8FMGzi = 4625 + INTEGER(IntKi), PARAMETER :: J9FMGzi = 4626 !End of code generated by Matlab script @@ -6264,6 +6290,18 @@ MODULE Morison_Output INTEGER, PARAMETER :: JDynP(9) = reshape((/J1DynP, J2DynP, J3DynP , & J4DynP, J5DynP, J6DynP , & J7DynP, J8DynP, J9DynP/), (/9/)) + INTEGER, PARAMETER :: JWaveElev(9) = reshape((/J1WaveElev, J2WaveElev, J3WaveElev , & + J4WaveElev, J5WaveElev, J6WaveElev , & + J7WaveElev, J8WaveElev, J9WaveElev/), (/9/)) + + INTEGER, PARAMETER :: JWaveElev1(9) = reshape((/J1WaveElv1, J2WaveElv1, J3WaveElv1 , & + J4WaveElv1, J5WaveElv1, J6WaveElv1 , & + J7WaveElv1, J8WaveElv1, J9WaveElv1/), (/9/)) + + INTEGER, PARAMETER :: JWaveElev2(9) = reshape((/J1WaveElv2, J2WaveElv2, J3WaveElv2 , & + J4WaveElv2, J5WaveElv2, J6WaveElv2 , & + J7WaveElv2, J8WaveElv2, J9WaveElv2/), (/9/)) + INTEGER, PARAMETER :: JSTVi(3,9) = reshape((/J1STVxi, J1STVyi, J1STVzi , & J2STVxi, J2STVyi, J2STVzi , & @@ -6391,9 +6429,9 @@ MODULE Morison_Output ! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these ! lines should be modified in the Matlab script and/or Excel worksheet as necessary. ! This code was generated by Write_ChckOutLst.m at 04-Jan-2014 12:13:30. - CHARACTER(OutStrLenM1) :: ValidParamAry(4599) ! This lists the names of the allowed parameters, which must be sorted alphabetically - INTEGER(IntKi) :: ParamIndxAry(4599) ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - CHARACTER(OutStrLenM1) :: ParamUnitsAry(4599) ! This lists the names of the allowed parameters, which must be sorted alphabetically + CHARACTER(OutStrLenM1) :: ValidParamAry(4626) ! This lists the names of the allowed parameters, which must be sorted alphabetically + INTEGER(IntKi) :: ParamIndxAry(4626) ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + CHARACTER(OutStrLenM1) :: ParamUnitsAry(4626) ! This lists the names of the allowed parameters, which must be sorted alphabetically ! ..... Public Subroutines ................................................................................................... @@ -6554,6 +6592,9 @@ SUBROUTINE MrsnOut_MapOutputs( CurrentTime, y, p, u, m, AllOuts, ErrStat, ErrMsg AllOuts(JVi (:,I)) = m%FV (1:3,m1) ! fluid velocity AllOuts(JAi (:,I)) = m%FA (1:3,m1) ! fluid acceleration AllOuts(JDynP( I)) = m%FDynP( m1) ! fluid dynamic pressure + AllOuts(JWaveElev( I)) = m%WaveElev( m1) ! total wave elevation + AllOuts(JWaveElev1( I)) = m%WaveElev1( m1) ! 1st order wave elevation effects + AllOuts(JWaveElev2( I)) = m%WaveElev2( m1) ! 2nd order wave elevation effects AllOuts(JSTVi (:,I)) = u%Mesh%TranslationVel(: ,m1) ! structural velocity AllOuts(JSTAi (:,I)) = u%Mesh%TranslationAcc(: ,m1) ! structural acceleration @@ -6988,2025 +7029,2019 @@ FUNCTION GetMorisonChannels ( NUserOutputs, UserOutputs, OutList, foundMask ErrStat = ErrID_None ErrMsg = "" - ValidParamAry(1:500) = (/ & - "J1AXI ","J1AYI ","J1AZI ","J1DYNP ","J1FAGXI ","J1FAGYI ","J1FAGZI ", & - "J1FAMXI ","J1FAMYI ","J1FAMZI ","J1FBFXI ","J1FBFYI ","J1FBFZI ","J1FBXI ", & - "J1FBYI ","J1FBZI ","J1FDXI ","J1FDYI ","J1FDZI ","J1FIXI ","J1FIYI ", & - "J1FIZI ","J1FMGXI ","J1FMGYI ","J1FMGZI ","J1MAGXI ","J1MAGYI ","J1MAGZI ", & - "J1MBFXI ","J1MBFYI ","J1MBFZI ","J1MBXI ","J1MBYI ","J1MBZI ","J1STAXI ", & - "J1STAYI ","J1STAZI ","J1STVXI ","J1STVYI ","J1STVZI ","J1VXI ","J1VYI ", & - "J1VZI ","J2AXI ","J2AYI ","J2AZI ","J2DYNP ","J2FAGXI ","J2FAGYI ", & - "J2FAGZI ","J2FAMXI ","J2FAMYI ","J2FAMZI ","J2FBFXI ","J2FBFYI ","J2FBFZI ", & - "J2FBXI ","J2FBYI ","J2FBZI ","J2FDXI ","J2FDYI ","J2FDZI ","J2FIXI ", & - "J2FIYI ","J2FIZI ","J2FMGXI ","J2FMGYI ","J2FMGZI ","J2MAGXI ","J2MAGYI ", & - "J2MAGZI ","J2MBFXI ","J2MBFYI ","J2MBFZI ","J2MBXI ","J2MBYI ","J2MBZI ", & - "J2STAXI ","J2STAYI ","J2STAZI ","J2STVXI ","J2STVYI ","J2STVZI ","J2VXI ", & - "J2VYI ","J2VZI ","J3AXI ","J3AYI ","J3AZI ","J3DYNP ","J3FAGXI ", & - "J3FAGYI ","J3FAGZI ","J3FAMXI ","J3FAMYI ","J3FAMZI ","J3FBFXI ","J3FBFYI ", & - "J3FBFZI ","J3FBXI ","J3FBYI ","J3FBZI ","J3FDXI ","J3FDYI ","J3FDZI ", & - "J3FIXI ","J3FIYI ","J3FIZI ","J3FMGXI ","J3FMGYI ","J3FMGZI ","J3MAGXI ", & - "J3MAGYI ","J3MAGZI ","J3MBFXI ","J3MBFYI ","J3MBFZI ","J3MBXI ","J3MBYI ", & - "J3MBZI ","J3STAXI ","J3STAYI ","J3STAZI ","J3STVXI ","J3STVYI ","J3STVZI ", & - "J3VXI ","J3VYI ","J3VZI ","J4AXI ","J4AYI ","J4AZI ","J4DYNP ", & - "J4FAGXI ","J4FAGYI ","J4FAGZI ","J4FAMXI ","J4FAMYI ","J4FAMZI ","J4FBFXI ", & - "J4FBFYI ","J4FBFZI ","J4FBXI ","J4FBYI ","J4FBZI ","J4FDXI ","J4FDYI ", & - "J4FDZI ","J4FIXI ","J4FIYI ","J4FIZI ","J4FMGXI ","J4FMGYI ","J4FMGZI ", & - "J4MAGXI ","J4MAGYI ","J4MAGZI ","J4MBFXI ","J4MBFYI ","J4MBFZI ","J4MBXI ", & - "J4MBYI ","J4MBZI ","J4STAXI ","J4STAYI ","J4STAZI ","J4STVXI ","J4STVYI ", & - "J4STVZI ","J4VXI ","J4VYI ","J4VZI ","J5AXI ","J5AYI ","J5AZI ", & - "J5DYNP ","J5FAGXI ","J5FAGYI ","J5FAGZI ","J5FAMXI ","J5FAMYI ","J5FAMZI ", & - "J5FBFXI ","J5FBFYI ","J5FBFZI ","J5FBXI ","J5FBYI ","J5FBZI ","J5FDXI ", & - "J5FDYI ","J5FDZI ","J5FIXI ","J5FIYI ","J5FIZI ","J5FMGXI ","J5FMGYI ", & - "J5FMGZI ","J5MAGXI ","J5MAGYI ","J5MAGZI ","J5MBFXI ","J5MBFYI ","J5MBFZI ", & - "J5MBXI ","J5MBYI ","J5MBZI ","J5STAXI ","J5STAYI ","J5STAZI ","J5STVXI ", & - "J5STVYI ","J5STVZI ","J5VXI ","J5VYI ","J5VZI ","J6AXI ","J6AYI ", & - "J6AZI ","J6DYNP ","J6FAGXI ","J6FAGYI ","J6FAGZI ","J6FAMXI ","J6FAMYI ", & - "J6FAMZI ","J6FBFXI ","J6FBFYI ","J6FBFZI ","J6FBXI ","J6FBYI ","J6FBZI ", & - "J6FDXI ","J6FDYI ","J6FDZI ","J6FIXI ","J6FIYI ","J6FIZI ","J6FMGXI ", & - "J6FMGYI ","J6FMGZI ","J6MAGXI ","J6MAGYI ","J6MAGZI ","J6MBFXI ","J6MBFYI ", & - "J6MBFZI ","J6MBXI ","J6MBYI ","J6MBZI ","J6STAXI ","J6STAYI ","J6STAZI ", & - "J6STVXI ","J6STVYI ","J6STVZI ","J6VXI ","J6VYI ","J6VZI ","J7AXI ", & - "J7AYI ","J7AZI ","J7DYNP ","J7FAGXI ","J7FAGYI ","J7FAGZI ","J7FAMXI ", & - "J7FAMYI ","J7FAMZI ","J7FBFXI ","J7FBFYI ","J7FBFZI ","J7FBXI ","J7FBYI ", & - "J7FBZI ","J7FDXI ","J7FDYI ","J7FDZI ","J7FIXI ","J7FIYI ","J7FIZI ", & - "J7FMGXI ","J7FMGYI ","J7FMGZI ","J7MAGXI ","J7MAGYI ","J7MAGZI ","J7MBFXI ", & - "J7MBFYI ","J7MBFZI ","J7MBXI ","J7MBYI ","J7MBZI ","J7STAXI ","J7STAYI ", & - "J7STAZI ","J7STVXI ","J7STVYI ","J7STVZI ","J7VXI ","J7VYI ","J7VZI ", & - "J8AXI ","J8AYI ","J8AZI ","J8DYNP ","J8FAGXI ","J8FAGYI ","J8FAGZI ", & - "J8FAMXI ","J8FAMYI ","J8FAMZI ","J8FBFXI ","J8FBFYI ","J8FBFZI ","J8FBXI ", & - "J8FBYI ","J8FBZI ","J8FDXI ","J8FDYI ","J8FDZI ","J8FIXI ","J8FIYI ", & - "J8FIZI ","J8FMGXI ","J8FMGYI ","J8FMGZI ","J8MAGXI ","J8MAGYI ","J8MAGZI ", & - "J8MBFXI ","J8MBFYI ","J8MBFZI ","J8MBXI ","J8MBYI ","J8MBZI ","J8STAXI ", & - "J8STAYI ","J8STAZI ","J8STVXI ","J8STVYI ","J8STVZI ","J8VXI ","J8VYI ", & - "J8VZI ","J9AXI ","J9AYI ","J9AZI ","J9DYNP ","J9FAGXI ","J9FAGYI ", & - "J9FAGZI ","J9FAMXI ","J9FAMYI ","J9FAMZI ","J9FBFXI ","J9FBFYI ","J9FBFZI ", & - "J9FBXI ","J9FBYI ","J9FBZI ","J9FDXI ","J9FDYI ","J9FDZI ","J9FIXI ", & - "J9FIYI ","J9FIZI ","J9FMGXI ","J9FMGYI ","J9FMGZI ","J9MAGXI ","J9MAGYI ", & - "J9MAGZI ","J9MBFXI ","J9MBFYI ","J9MBFZI ","J9MBXI ","J9MBYI ","J9MBZI ", & - "J9STAXI ","J9STAYI ","J9STAZI ","J9STVXI ","J9STVYI ","J9STVZI ","J9VXI ", & - "J9VYI ","J9VZI ","M1N1AXI ","M1N1AYI ","M1N1AZI ","M1N1DYNP ","M1N1FAFXI", & - "M1N1FAFYI","M1N1FAFZI","M1N1FAGXI","M1N1FAGYI","M1N1FAGZI","M1N1FAMXI","M1N1FAMYI", & - "M1N1FAMZI","M1N1FBFXI","M1N1FBFYI","M1N1FBFZI","M1N1FBXI ","M1N1FBYI ","M1N1FBZI ", & - "M1N1FDXI ","M1N1FDYI ","M1N1FDZI ","M1N1FIXI ","M1N1FIYI ","M1N1FIZI ","M1N1FMGXI", & - "M1N1FMGYI","M1N1FMGZI","M1N1MAFXI","M1N1MAFYI","M1N1MAFZI","M1N1MAGXI","M1N1MAGYI", & - "M1N1MAGZI","M1N1MBFXI","M1N1MBFYI","M1N1MBFZI","M1N1MBXI ","M1N1MBYI ","M1N1MBZI ", & - "M1N1MMGXI","M1N1MMGYI","M1N1MMGZI","M1N1STAXI","M1N1STAYI","M1N1STAZI","M1N1STVXI", & - "M1N1STVYI","M1N1STVZI","M1N1VXI ","M1N1VYI ","M1N1VZI ","M1N2AXI ","M1N2AYI ", & - "M1N2AZI ","M1N2DYNP ","M1N2FAFXI","M1N2FAFYI","M1N2FAFZI","M1N2FAGXI","M1N2FAGYI", & - "M1N2FAGZI","M1N2FAMXI","M1N2FAMYI","M1N2FAMZI","M1N2FBFXI","M1N2FBFYI","M1N2FBFZI", & - "M1N2FBXI ","M1N2FBYI ","M1N2FBZI ","M1N2FDXI ","M1N2FDYI ","M1N2FDZI ","M1N2FIXI ", & - "M1N2FIYI ","M1N2FIZI ","M1N2FMGXI","M1N2FMGYI","M1N2FMGZI","M1N2MAFXI","M1N2MAFYI", & - "M1N2MAFZI","M1N2MAGXI","M1N2MAGYI","M1N2MAGZI","M1N2MBFXI","M1N2MBFYI","M1N2MBFZI", & - "M1N2MBXI ","M1N2MBYI ","M1N2MBZI ","M1N2MMGXI","M1N2MMGYI","M1N2MMGZI","M1N2STAXI", & - "M1N2STAYI","M1N2STAZI","M1N2STVXI","M1N2STVYI","M1N2STVZI","M1N2VXI ","M1N2VYI ", & - "M1N2VZI ","M1N3AXI ","M1N3AYI ","M1N3AZI ","M1N3DYNP ","M1N3FAFXI","M1N3FAFYI", & - "M1N3FAFZI","M1N3FAGXI","M1N3FAGYI"/) - ValidParamAry(501:1000) = (/ & - "M1N3FAGZI","M1N3FAMXI","M1N3FAMYI","M1N3FAMZI","M1N3FBFXI","M1N3FBFYI","M1N3FBFZI", & - "M1N3FBXI ","M1N3FBYI ","M1N3FBZI ","M1N3FDXI ","M1N3FDYI ","M1N3FDZI ","M1N3FIXI ", & - "M1N3FIYI ","M1N3FIZI ","M1N3FMGXI","M1N3FMGYI","M1N3FMGZI","M1N3MAFXI","M1N3MAFYI", & - "M1N3MAFZI","M1N3MAGXI","M1N3MAGYI","M1N3MAGZI","M1N3MBFXI","M1N3MBFYI","M1N3MBFZI", & - "M1N3MBXI ","M1N3MBYI ","M1N3MBZI ","M1N3MMGXI","M1N3MMGYI","M1N3MMGZI","M1N3STAXI", & - "M1N3STAYI","M1N3STAZI","M1N3STVXI","M1N3STVYI","M1N3STVZI","M1N3VXI ","M1N3VYI ", & - "M1N3VZI ","M1N4AXI ","M1N4AYI ","M1N4AZI ","M1N4DYNP ","M1N4FAFXI","M1N4FAFYI", & - "M1N4FAFZI","M1N4FAGXI","M1N4FAGYI","M1N4FAGZI","M1N4FAMXI","M1N4FAMYI","M1N4FAMZI", & - "M1N4FBFXI","M1N4FBFYI","M1N4FBFZI","M1N4FBXI ","M1N4FBYI ","M1N4FBZI ","M1N4FDXI ", & - "M1N4FDYI ","M1N4FDZI ","M1N4FIXI ","M1N4FIYI ","M1N4FIZI ","M1N4FMGXI","M1N4FMGYI", & - "M1N4FMGZI","M1N4MAFXI","M1N4MAFYI","M1N4MAFZI","M1N4MAGXI","M1N4MAGYI","M1N4MAGZI", & - "M1N4MBFXI","M1N4MBFYI","M1N4MBFZI","M1N4MBXI ","M1N4MBYI ","M1N4MBZI ","M1N4MMGXI", & - "M1N4MMGYI","M1N4MMGZI","M1N4STAXI","M1N4STAYI","M1N4STAZI","M1N4STVXI","M1N4STVYI", & - "M1N4STVZI","M1N4VXI ","M1N4VYI ","M1N4VZI ","M1N5AXI ","M1N5AYI ","M1N5AZI ", & - "M1N5DYNP ","M1N5FAFXI","M1N5FAFYI","M1N5FAFZI","M1N5FAGXI","M1N5FAGYI","M1N5FAGZI", & - "M1N5FAMXI","M1N5FAMYI","M1N5FAMZI","M1N5FBFXI","M1N5FBFYI","M1N5FBFZI","M1N5FBXI ", & - "M1N5FBYI ","M1N5FBZI ","M1N5FDXI ","M1N5FDYI ","M1N5FDZI ","M1N5FIXI ","M1N5FIYI ", & - "M1N5FIZI ","M1N5FMGXI","M1N5FMGYI","M1N5FMGZI","M1N5MAFXI","M1N5MAFYI","M1N5MAFZI", & - "M1N5MAGXI","M1N5MAGYI","M1N5MAGZI","M1N5MBFXI","M1N5MBFYI","M1N5MBFZI","M1N5MBXI ", & - "M1N5MBYI ","M1N5MBZI ","M1N5MMGXI","M1N5MMGYI","M1N5MMGZI","M1N5STAXI","M1N5STAYI", & - "M1N5STAZI","M1N5STVXI","M1N5STVYI","M1N5STVZI","M1N5VXI ","M1N5VYI ","M1N5VZI ", & - "M1N6AXI ","M1N6AYI ","M1N6AZI ","M1N6DYNP ","M1N6FAFXI","M1N6FAFYI","M1N6FAFZI", & - "M1N6FAGXI","M1N6FAGYI","M1N6FAGZI","M1N6FAMXI","M1N6FAMYI","M1N6FAMZI","M1N6FBFXI", & - "M1N6FBFYI","M1N6FBFZI","M1N6FBXI ","M1N6FBYI ","M1N6FBZI ","M1N6FDXI ","M1N6FDYI ", & - "M1N6FDZI ","M1N6FIXI ","M1N6FIYI ","M1N6FIZI ","M1N6FMGXI","M1N6FMGYI","M1N6FMGZI", & - "M1N6MAFXI","M1N6MAFYI","M1N6MAFZI","M1N6MAGXI","M1N6MAGYI","M1N6MAGZI","M1N6MBFXI", & - "M1N6MBFYI","M1N6MBFZI","M1N6MBXI ","M1N6MBYI ","M1N6MBZI ","M1N6MMGXI","M1N6MMGYI", & - "M1N6MMGZI","M1N6STAXI","M1N6STAYI","M1N6STAZI","M1N6STVXI","M1N6STVYI","M1N6STVZI", & - "M1N6VXI ","M1N6VYI ","M1N6VZI ","M1N7AXI ","M1N7AYI ","M1N7AZI ","M1N7DYNP ", & - "M1N7FAFXI","M1N7FAFYI","M1N7FAFZI","M1N7FAGXI","M1N7FAGYI","M1N7FAGZI","M1N7FAMXI", & - "M1N7FAMYI","M1N7FAMZI","M1N7FBFXI","M1N7FBFYI","M1N7FBFZI","M1N7FBXI ","M1N7FBYI ", & - "M1N7FBZI ","M1N7FDXI ","M1N7FDYI ","M1N7FDZI ","M1N7FIXI ","M1N7FIYI ","M1N7FIZI ", & - "M1N7FMGXI","M1N7FMGYI","M1N7FMGZI","M1N7MAFXI","M1N7MAFYI","M1N7MAFZI","M1N7MAGXI", & - "M1N7MAGYI","M1N7MAGZI","M1N7MBFXI","M1N7MBFYI","M1N7MBFZI","M1N7MBXI ","M1N7MBYI ", & - "M1N7MBZI ","M1N7MMGXI","M1N7MMGYI","M1N7MMGZI","M1N7STAXI","M1N7STAYI","M1N7STAZI", & - "M1N7STVXI","M1N7STVYI","M1N7STVZI","M1N7VXI ","M1N7VYI ","M1N7VZI ","M1N8AXI ", & - "M1N8AYI ","M1N8AZI ","M1N8DYNP ","M1N8FAFXI","M1N8FAFYI","M1N8FAFZI","M1N8FAGXI", & - "M1N8FAGYI","M1N8FAGZI","M1N8FAMXI","M1N8FAMYI","M1N8FAMZI","M1N8FBFXI","M1N8FBFYI", & - "M1N8FBFZI","M1N8FBXI ","M1N8FBYI ","M1N8FBZI ","M1N8FDXI ","M1N8FDYI ","M1N8FDZI ", & - "M1N8FIXI ","M1N8FIYI ","M1N8FIZI ","M1N8FMGXI","M1N8FMGYI","M1N8FMGZI","M1N8MAFXI", & - "M1N8MAFYI","M1N8MAFZI","M1N8MAGXI","M1N8MAGYI","M1N8MAGZI","M1N8MBFXI","M1N8MBFYI", & - "M1N8MBFZI","M1N8MBXI ","M1N8MBYI ","M1N8MBZI ","M1N8MMGXI","M1N8MMGYI","M1N8MMGZI", & - "M1N8STAXI","M1N8STAYI","M1N8STAZI","M1N8STVXI","M1N8STVYI","M1N8STVZI","M1N8VXI ", & - "M1N8VYI ","M1N8VZI ","M1N9AXI ","M1N9AYI ","M1N9AZI ","M1N9DYNP ","M1N9FAFXI", & - "M1N9FAFYI","M1N9FAFZI","M1N9FAGXI","M1N9FAGYI","M1N9FAGZI","M1N9FAMXI","M1N9FAMYI", & - "M1N9FAMZI","M1N9FBFXI","M1N9FBFYI","M1N9FBFZI","M1N9FBXI ","M1N9FBYI ","M1N9FBZI ", & - "M1N9FDXI ","M1N9FDYI ","M1N9FDZI ","M1N9FIXI ","M1N9FIYI ","M1N9FIZI ","M1N9FMGXI", & - "M1N9FMGYI","M1N9FMGZI","M1N9MAFXI","M1N9MAFYI","M1N9MAFZI","M1N9MAGXI","M1N9MAGYI", & - "M1N9MAGZI","M1N9MBFXI","M1N9MBFYI","M1N9MBFZI","M1N9MBXI ","M1N9MBYI ","M1N9MBZI ", & - "M1N9MMGXI","M1N9MMGYI","M1N9MMGZI","M1N9STAXI","M1N9STAYI","M1N9STAZI","M1N9STVXI", & - "M1N9STVYI","M1N9STVZI","M1N9VXI ","M1N9VYI ","M1N9VZI ","M2N1AXI ","M2N1AYI ", & - "M2N1AZI ","M2N1DYNP ","M2N1FAFXI","M2N1FAFYI","M2N1FAFZI","M2N1FAGXI","M2N1FAGYI", & - "M2N1FAGZI","M2N1FAMXI","M2N1FAMYI","M2N1FAMZI","M2N1FBFXI","M2N1FBFYI","M2N1FBFZI", & - "M2N1FBXI ","M2N1FBYI ","M2N1FBZI ","M2N1FDXI ","M2N1FDYI ","M2N1FDZI ","M2N1FIXI ", & - "M2N1FIYI ","M2N1FIZI ","M2N1FMGXI","M2N1FMGYI","M2N1FMGZI","M2N1MAFXI","M2N1MAFYI", & - "M2N1MAFZI","M2N1MAGXI","M2N1MAGYI","M2N1MAGZI","M2N1MBFXI","M2N1MBFYI","M2N1MBFZI", & - "M2N1MBXI ","M2N1MBYI ","M2N1MBZI ","M2N1MMGXI","M2N1MMGYI","M2N1MMGZI","M2N1STAXI", & - "M2N1STAYI","M2N1STAZI","M2N1STVXI","M2N1STVYI","M2N1STVZI","M2N1VXI ","M2N1VYI ", & - "M2N1VZI ","M2N2AXI ","M2N2AYI ","M2N2AZI ","M2N2DYNP ","M2N2FAFXI","M2N2FAFYI", & - "M2N2FAFZI","M2N2FAGXI","M2N2FAGYI","M2N2FAGZI","M2N2FAMXI","M2N2FAMYI","M2N2FAMZI", & - "M2N2FBFXI","M2N2FBFYI","M2N2FBFZI","M2N2FBXI ","M2N2FBYI ","M2N2FBZI ","M2N2FDXI ", & - "M2N2FDYI ","M2N2FDZI ","M2N2FIXI ","M2N2FIYI ","M2N2FIZI ","M2N2FMGXI","M2N2FMGYI", & - "M2N2FMGZI","M2N2MAFXI","M2N2MAFYI","M2N2MAFZI","M2N2MAGXI","M2N2MAGYI","M2N2MAGZI", & - "M2N2MBFXI","M2N2MBFYI","M2N2MBFZI","M2N2MBXI ","M2N2MBYI ","M2N2MBZI ","M2N2MMGXI", & - "M2N2MMGYI","M2N2MMGZI","M2N2STAXI","M2N2STAYI","M2N2STAZI","M2N2STVXI","M2N2STVYI", & - "M2N2STVZI","M2N2VXI ","M2N2VYI ","M2N2VZI ","M2N3AXI ","M2N3AYI ","M2N3AZI ", & - "M2N3DYNP ","M2N3FAFXI","M2N3FAFYI","M2N3FAFZI","M2N3FAGXI","M2N3FAGYI","M2N3FAGZI", & - "M2N3FAMXI","M2N3FAMYI","M2N3FAMZI","M2N3FBFXI","M2N3FBFYI","M2N3FBFZI","M2N3FBXI ", & - "M2N3FBYI ","M2N3FBZI ","M2N3FDXI ","M2N3FDYI ","M2N3FDZI ","M2N3FIXI ","M2N3FIYI ", & - "M2N3FIZI ","M2N3FMGXI","M2N3FMGYI","M2N3FMGZI","M2N3MAFXI","M2N3MAFYI","M2N3MAFZI", & - "M2N3MAGXI","M2N3MAGYI","M2N3MAGZI","M2N3MBFXI","M2N3MBFYI","M2N3MBFZI","M2N3MBXI ", & - "M2N3MBYI ","M2N3MBZI ","M2N3MMGXI"/) - ValidParamAry(1001:1500) = (/ & - "M2N3MMGYI","M2N3MMGZI","M2N3STAXI","M2N3STAYI","M2N3STAZI","M2N3STVXI","M2N3STVYI", & - "M2N3STVZI","M2N3VXI ","M2N3VYI ","M2N3VZI ","M2N4AXI ","M2N4AYI ","M2N4AZI ", & - "M2N4DYNP ","M2N4FAFXI","M2N4FAFYI","M2N4FAFZI","M2N4FAGXI","M2N4FAGYI","M2N4FAGZI", & - "M2N4FAMXI","M2N4FAMYI","M2N4FAMZI","M2N4FBFXI","M2N4FBFYI","M2N4FBFZI","M2N4FBXI ", & - "M2N4FBYI ","M2N4FBZI ","M2N4FDXI ","M2N4FDYI ","M2N4FDZI ","M2N4FIXI ","M2N4FIYI ", & - "M2N4FIZI ","M2N4FMGXI","M2N4FMGYI","M2N4FMGZI","M2N4MAFXI","M2N4MAFYI","M2N4MAFZI", & - "M2N4MAGXI","M2N4MAGYI","M2N4MAGZI","M2N4MBFXI","M2N4MBFYI","M2N4MBFZI","M2N4MBXI ", & - "M2N4MBYI ","M2N4MBZI ","M2N4MMGXI","M2N4MMGYI","M2N4MMGZI","M2N4STAXI","M2N4STAYI", & - "M2N4STAZI","M2N4STVXI","M2N4STVYI","M2N4STVZI","M2N4VXI ","M2N4VYI ","M2N4VZI ", & - "M2N5AXI ","M2N5AYI ","M2N5AZI ","M2N5DYNP ","M2N5FAFXI","M2N5FAFYI","M2N5FAFZI", & - "M2N5FAGXI","M2N5FAGYI","M2N5FAGZI","M2N5FAMXI","M2N5FAMYI","M2N5FAMZI","M2N5FBFXI", & - "M2N5FBFYI","M2N5FBFZI","M2N5FBXI ","M2N5FBYI ","M2N5FBZI ","M2N5FDXI ","M2N5FDYI ", & - "M2N5FDZI ","M2N5FIXI ","M2N5FIYI ","M2N5FIZI ","M2N5FMGXI","M2N5FMGYI","M2N5FMGZI", & - "M2N5MAFXI","M2N5MAFYI","M2N5MAFZI","M2N5MAGXI","M2N5MAGYI","M2N5MAGZI","M2N5MBFXI", & - "M2N5MBFYI","M2N5MBFZI","M2N5MBXI ","M2N5MBYI ","M2N5MBZI ","M2N5MMGXI","M2N5MMGYI", & - "M2N5MMGZI","M2N5STAXI","M2N5STAYI","M2N5STAZI","M2N5STVXI","M2N5STVYI","M2N5STVZI", & - "M2N5VXI ","M2N5VYI ","M2N5VZI ","M2N6AXI ","M2N6AYI ","M2N6AZI ","M2N6DYNP ", & - "M2N6FAFXI","M2N6FAFYI","M2N6FAFZI","M2N6FAGXI","M2N6FAGYI","M2N6FAGZI","M2N6FAMXI", & - "M2N6FAMYI","M2N6FAMZI","M2N6FBFXI","M2N6FBFYI","M2N6FBFZI","M2N6FBXI ","M2N6FBYI ", & - "M2N6FBZI ","M2N6FDXI ","M2N6FDYI ","M2N6FDZI ","M2N6FIXI ","M2N6FIYI ","M2N6FIZI ", & - "M2N6FMGXI","M2N6FMGYI","M2N6FMGZI","M2N6MAFXI","M2N6MAFYI","M2N6MAFZI","M2N6MAGXI", & - "M2N6MAGYI","M2N6MAGZI","M2N6MBFXI","M2N6MBFYI","M2N6MBFZI","M2N6MBXI ","M2N6MBYI ", & - "M2N6MBZI ","M2N6MMGXI","M2N6MMGYI","M2N6MMGZI","M2N6STAXI","M2N6STAYI","M2N6STAZI", & - "M2N6STVXI","M2N6STVYI","M2N6STVZI","M2N6VXI ","M2N6VYI ","M2N6VZI ","M2N7AXI ", & - "M2N7AYI ","M2N7AZI ","M2N7DYNP ","M2N7FAFXI","M2N7FAFYI","M2N7FAFZI","M2N7FAGXI", & - "M2N7FAGYI","M2N7FAGZI","M2N7FAMXI","M2N7FAMYI","M2N7FAMZI","M2N7FBFXI","M2N7FBFYI", & - "M2N7FBFZI","M2N7FBXI ","M2N7FBYI ","M2N7FBZI ","M2N7FDXI ","M2N7FDYI ","M2N7FDZI ", & - "M2N7FIXI ","M2N7FIYI ","M2N7FIZI ","M2N7FMGXI","M2N7FMGYI","M2N7FMGZI","M2N7MAFXI", & - "M2N7MAFYI","M2N7MAFZI","M2N7MAGXI","M2N7MAGYI","M2N7MAGZI","M2N7MBFXI","M2N7MBFYI", & - "M2N7MBFZI","M2N7MBXI ","M2N7MBYI ","M2N7MBZI ","M2N7MMGXI","M2N7MMGYI","M2N7MMGZI", & - "M2N7STAXI","M2N7STAYI","M2N7STAZI","M2N7STVXI","M2N7STVYI","M2N7STVZI","M2N7VXI ", & - "M2N7VYI ","M2N7VZI ","M2N8AXI ","M2N8AYI ","M2N8AZI ","M2N8DYNP ","M2N8FAFXI", & - "M2N8FAFYI","M2N8FAFZI","M2N8FAGXI","M2N8FAGYI","M2N8FAGZI","M2N8FAMXI","M2N8FAMYI", & - "M2N8FAMZI","M2N8FBFXI","M2N8FBFYI","M2N8FBFZI","M2N8FBXI ","M2N8FBYI ","M2N8FBZI ", & - "M2N8FDXI ","M2N8FDYI ","M2N8FDZI ","M2N8FIXI ","M2N8FIYI ","M2N8FIZI ","M2N8FMGXI", & - "M2N8FMGYI","M2N8FMGZI","M2N8MAFXI","M2N8MAFYI","M2N8MAFZI","M2N8MAGXI","M2N8MAGYI", & - "M2N8MAGZI","M2N8MBFXI","M2N8MBFYI","M2N8MBFZI","M2N8MBXI ","M2N8MBYI ","M2N8MBZI ", & - "M2N8MMGXI","M2N8MMGYI","M2N8MMGZI","M2N8STAXI","M2N8STAYI","M2N8STAZI","M2N8STVXI", & - "M2N8STVYI","M2N8STVZI","M2N8VXI ","M2N8VYI ","M2N8VZI ","M2N9AXI ","M2N9AYI ", & - "M2N9AZI ","M2N9DYNP ","M2N9FAFXI","M2N9FAFYI","M2N9FAFZI","M2N9FAGXI","M2N9FAGYI", & - "M2N9FAGZI","M2N9FAMXI","M2N9FAMYI","M2N9FAMZI","M2N9FBFXI","M2N9FBFYI","M2N9FBFZI", & - "M2N9FBXI ","M2N9FBYI ","M2N9FBZI ","M2N9FDXI ","M2N9FDYI ","M2N9FDZI ","M2N9FIXI ", & - "M2N9FIYI ","M2N9FIZI ","M2N9FMGXI","M2N9FMGYI","M2N9FMGZI","M2N9MAFXI","M2N9MAFYI", & - "M2N9MAFZI","M2N9MAGXI","M2N9MAGYI","M2N9MAGZI","M2N9MBFXI","M2N9MBFYI","M2N9MBFZI", & - "M2N9MBXI ","M2N9MBYI ","M2N9MBZI ","M2N9MMGXI","M2N9MMGYI","M2N9MMGZI","M2N9STAXI", & - "M2N9STAYI","M2N9STAZI","M2N9STVXI","M2N9STVYI","M2N9STVZI","M2N9VXI ","M2N9VYI ", & - "M2N9VZI ","M3N1AXI ","M3N1AYI ","M3N1AZI ","M3N1DYNP ","M3N1FAFXI","M3N1FAFYI", & - "M3N1FAFZI","M3N1FAGXI","M3N1FAGYI","M3N1FAGZI","M3N1FAMXI","M3N1FAMYI","M3N1FAMZI", & - "M3N1FBFXI","M3N1FBFYI","M3N1FBFZI","M3N1FBXI ","M3N1FBYI ","M3N1FBZI ","M3N1FDXI ", & - "M3N1FDYI ","M3N1FDZI ","M3N1FIXI ","M3N1FIYI ","M3N1FIZI ","M3N1FMGXI","M3N1FMGYI", & - "M3N1FMGZI","M3N1MAFXI","M3N1MAFYI","M3N1MAFZI","M3N1MAGXI","M3N1MAGYI","M3N1MAGZI", & - "M3N1MBFXI","M3N1MBFYI","M3N1MBFZI","M3N1MBXI ","M3N1MBYI ","M3N1MBZI ","M3N1MMGXI", & - "M3N1MMGYI","M3N1MMGZI","M3N1STAXI","M3N1STAYI","M3N1STAZI","M3N1STVXI","M3N1STVYI", & - "M3N1STVZI","M3N1VXI ","M3N1VYI ","M3N1VZI ","M3N2AXI ","M3N2AYI ","M3N2AZI ", & - "M3N2DYNP ","M3N2FAFXI","M3N2FAFYI","M3N2FAFZI","M3N2FAGXI","M3N2FAGYI","M3N2FAGZI", & - "M3N2FAMXI","M3N2FAMYI","M3N2FAMZI","M3N2FBFXI","M3N2FBFYI","M3N2FBFZI","M3N2FBXI ", & - "M3N2FBYI ","M3N2FBZI ","M3N2FDXI ","M3N2FDYI ","M3N2FDZI ","M3N2FIXI ","M3N2FIYI ", & - "M3N2FIZI ","M3N2FMGXI","M3N2FMGYI","M3N2FMGZI","M3N2MAFXI","M3N2MAFYI","M3N2MAFZI", & - "M3N2MAGXI","M3N2MAGYI","M3N2MAGZI","M3N2MBFXI","M3N2MBFYI","M3N2MBFZI","M3N2MBXI ", & - "M3N2MBYI ","M3N2MBZI ","M3N2MMGXI","M3N2MMGYI","M3N2MMGZI","M3N2STAXI","M3N2STAYI", & - "M3N2STAZI","M3N2STVXI","M3N2STVYI","M3N2STVZI","M3N2VXI ","M3N2VYI ","M3N2VZI ", & - "M3N3AXI ","M3N3AYI ","M3N3AZI ","M3N3DYNP ","M3N3FAFXI","M3N3FAFYI","M3N3FAFZI", & - "M3N3FAGXI","M3N3FAGYI","M3N3FAGZI","M3N3FAMXI","M3N3FAMYI","M3N3FAMZI","M3N3FBFXI", & - "M3N3FBFYI","M3N3FBFZI","M3N3FBXI ","M3N3FBYI ","M3N3FBZI ","M3N3FDXI ","M3N3FDYI ", & - "M3N3FDZI ","M3N3FIXI ","M3N3FIYI ","M3N3FIZI ","M3N3FMGXI","M3N3FMGYI","M3N3FMGZI", & - "M3N3MAFXI","M3N3MAFYI","M3N3MAFZI","M3N3MAGXI","M3N3MAGYI","M3N3MAGZI","M3N3MBFXI", & - "M3N3MBFYI","M3N3MBFZI","M3N3MBXI ","M3N3MBYI ","M3N3MBZI ","M3N3MMGXI","M3N3MMGYI", & - "M3N3MMGZI","M3N3STAXI","M3N3STAYI","M3N3STAZI","M3N3STVXI","M3N3STVYI","M3N3STVZI", & - "M3N3VXI ","M3N3VYI ","M3N3VZI ","M3N4AXI ","M3N4AYI ","M3N4AZI ","M3N4DYNP ", & - "M3N4FAFXI","M3N4FAFYI","M3N4FAFZI","M3N4FAGXI","M3N4FAGYI","M3N4FAGZI","M3N4FAMXI", & - "M3N4FAMYI","M3N4FAMZI","M3N4FBFXI","M3N4FBFYI","M3N4FBFZI","M3N4FBXI ","M3N4FBYI ", & - "M3N4FBZI ","M3N4FDXI ","M3N4FDYI "/) - ValidParamAry(1501:2000) = (/ & - "M3N4FDZI ","M3N4FIXI ","M3N4FIYI ","M3N4FIZI ","M3N4FMGXI","M3N4FMGYI","M3N4FMGZI", & - "M3N4MAFXI","M3N4MAFYI","M3N4MAFZI","M3N4MAGXI","M3N4MAGYI","M3N4MAGZI","M3N4MBFXI", & - "M3N4MBFYI","M3N4MBFZI","M3N4MBXI ","M3N4MBYI ","M3N4MBZI ","M3N4MMGXI","M3N4MMGYI", & - "M3N4MMGZI","M3N4STAXI","M3N4STAYI","M3N4STAZI","M3N4STVXI","M3N4STVYI","M3N4STVZI", & - "M3N4VXI ","M3N4VYI ","M3N4VZI ","M3N5AXI ","M3N5AYI ","M3N5AZI ","M3N5DYNP ", & - "M3N5FAFXI","M3N5FAFYI","M3N5FAFZI","M3N5FAGXI","M3N5FAGYI","M3N5FAGZI","M3N5FAMXI", & - "M3N5FAMYI","M3N5FAMZI","M3N5FBFXI","M3N5FBFYI","M3N5FBFZI","M3N5FBXI ","M3N5FBYI ", & - "M3N5FBZI ","M3N5FDXI ","M3N5FDYI ","M3N5FDZI ","M3N5FIXI ","M3N5FIYI ","M3N5FIZI ", & - "M3N5FMGXI","M3N5FMGYI","M3N5FMGZI","M3N5MAFXI","M3N5MAFYI","M3N5MAFZI","M3N5MAGXI", & - "M3N5MAGYI","M3N5MAGZI","M3N5MBFXI","M3N5MBFYI","M3N5MBFZI","M3N5MBXI ","M3N5MBYI ", & - "M3N5MBZI ","M3N5MMGXI","M3N5MMGYI","M3N5MMGZI","M3N5STAXI","M3N5STAYI","M3N5STAZI", & - "M3N5STVXI","M3N5STVYI","M3N5STVZI","M3N5VXI ","M3N5VYI ","M3N5VZI ","M3N6AXI ", & - "M3N6AYI ","M3N6AZI ","M3N6DYNP ","M3N6FAFXI","M3N6FAFYI","M3N6FAFZI","M3N6FAGXI", & - "M3N6FAGYI","M3N6FAGZI","M3N6FAMXI","M3N6FAMYI","M3N6FAMZI","M3N6FBFXI","M3N6FBFYI", & - "M3N6FBFZI","M3N6FBXI ","M3N6FBYI ","M3N6FBZI ","M3N6FDXI ","M3N6FDYI ","M3N6FDZI ", & - "M3N6FIXI ","M3N6FIYI ","M3N6FIZI ","M3N6FMGXI","M3N6FMGYI","M3N6FMGZI","M3N6MAFXI", & - "M3N6MAFYI","M3N6MAFZI","M3N6MAGXI","M3N6MAGYI","M3N6MAGZI","M3N6MBFXI","M3N6MBFYI", & - "M3N6MBFZI","M3N6MBXI ","M3N6MBYI ","M3N6MBZI ","M3N6MMGXI","M3N6MMGYI","M3N6MMGZI", & - "M3N6STAXI","M3N6STAYI","M3N6STAZI","M3N6STVXI","M3N6STVYI","M3N6STVZI","M3N6VXI ", & - "M3N6VYI ","M3N6VZI ","M3N7AXI ","M3N7AYI ","M3N7AZI ","M3N7DYNP ","M3N7FAFXI", & - "M3N7FAFYI","M3N7FAFZI","M3N7FAGXI","M3N7FAGYI","M3N7FAGZI","M3N7FAMXI","M3N7FAMYI", & - "M3N7FAMZI","M3N7FBFXI","M3N7FBFYI","M3N7FBFZI","M3N7FBXI ","M3N7FBYI ","M3N7FBZI ", & - "M3N7FDXI ","M3N7FDYI ","M3N7FDZI ","M3N7FIXI ","M3N7FIYI ","M3N7FIZI ","M3N7FMGXI", & - "M3N7FMGYI","M3N7FMGZI","M3N7MAFXI","M3N7MAFYI","M3N7MAFZI","M3N7MAGXI","M3N7MAGYI", & - "M3N7MAGZI","M3N7MBFXI","M3N7MBFYI","M3N7MBFZI","M3N7MBXI ","M3N7MBYI ","M3N7MBZI ", & - "M3N7MMGXI","M3N7MMGYI","M3N7MMGZI","M3N7STAXI","M3N7STAYI","M3N7STAZI","M3N7STVXI", & - "M3N7STVYI","M3N7STVZI","M3N7VXI ","M3N7VYI ","M3N7VZI ","M3N8AXI ","M3N8AYI ", & - "M3N8AZI ","M3N8DYNP ","M3N8FAFXI","M3N8FAFYI","M3N8FAFZI","M3N8FAGXI","M3N8FAGYI", & - "M3N8FAGZI","M3N8FAMXI","M3N8FAMYI","M3N8FAMZI","M3N8FBFXI","M3N8FBFYI","M3N8FBFZI", & - "M3N8FBXI ","M3N8FBYI ","M3N8FBZI ","M3N8FDXI ","M3N8FDYI ","M3N8FDZI ","M3N8FIXI ", & - "M3N8FIYI ","M3N8FIZI ","M3N8FMGXI","M3N8FMGYI","M3N8FMGZI","M3N8MAFXI","M3N8MAFYI", & - "M3N8MAFZI","M3N8MAGXI","M3N8MAGYI","M3N8MAGZI","M3N8MBFXI","M3N8MBFYI","M3N8MBFZI", & - "M3N8MBXI ","M3N8MBYI ","M3N8MBZI ","M3N8MMGXI","M3N8MMGYI","M3N8MMGZI","M3N8STAXI", & - "M3N8STAYI","M3N8STAZI","M3N8STVXI","M3N8STVYI","M3N8STVZI","M3N8VXI ","M3N8VYI ", & - "M3N8VZI ","M3N9AXI ","M3N9AYI ","M3N9AZI ","M3N9DYNP ","M3N9FAFXI","M3N9FAFYI", & - "M3N9FAFZI","M3N9FAGXI","M3N9FAGYI","M3N9FAGZI","M3N9FAMXI","M3N9FAMYI","M3N9FAMZI", & - "M3N9FBFXI","M3N9FBFYI","M3N9FBFZI","M3N9FBXI ","M3N9FBYI ","M3N9FBZI ","M3N9FDXI ", & - "M3N9FDYI ","M3N9FDZI ","M3N9FIXI ","M3N9FIYI ","M3N9FIZI ","M3N9FMGXI","M3N9FMGYI", & - "M3N9FMGZI","M3N9MAFXI","M3N9MAFYI","M3N9MAFZI","M3N9MAGXI","M3N9MAGYI","M3N9MAGZI", & - "M3N9MBFXI","M3N9MBFYI","M3N9MBFZI","M3N9MBXI ","M3N9MBYI ","M3N9MBZI ","M3N9MMGXI", & - "M3N9MMGYI","M3N9MMGZI","M3N9STAXI","M3N9STAYI","M3N9STAZI","M3N9STVXI","M3N9STVYI", & - "M3N9STVZI","M3N9VXI ","M3N9VYI ","M3N9VZI ","M4N1AXI ","M4N1AYI ","M4N1AZI ", & - "M4N1DYNP ","M4N1FAFXI","M4N1FAFYI","M4N1FAFZI","M4N1FAGXI","M4N1FAGYI","M4N1FAGZI", & - "M4N1FAMXI","M4N1FAMYI","M4N1FAMZI","M4N1FBFXI","M4N1FBFYI","M4N1FBFZI","M4N1FBXI ", & - "M4N1FBYI ","M4N1FBZI ","M4N1FDXI ","M4N1FDYI ","M4N1FDZI ","M4N1FIXI ","M4N1FIYI ", & - "M4N1FIZI ","M4N1FMGXI","M4N1FMGYI","M4N1FMGZI","M4N1MAFXI","M4N1MAFYI","M4N1MAFZI", & - "M4N1MAGXI","M4N1MAGYI","M4N1MAGZI","M4N1MBFXI","M4N1MBFYI","M4N1MBFZI","M4N1MBXI ", & - "M4N1MBYI ","M4N1MBZI ","M4N1MMGXI","M4N1MMGYI","M4N1MMGZI","M4N1STAXI","M4N1STAYI", & - "M4N1STAZI","M4N1STVXI","M4N1STVYI","M4N1STVZI","M4N1VXI ","M4N1VYI ","M4N1VZI ", & - "M4N2AXI ","M4N2AYI ","M4N2AZI ","M4N2DYNP ","M4N2FAFXI","M4N2FAFYI","M4N2FAFZI", & - "M4N2FAGXI","M4N2FAGYI","M4N2FAGZI","M4N2FAMXI","M4N2FAMYI","M4N2FAMZI","M4N2FBFXI", & - "M4N2FBFYI","M4N2FBFZI","M4N2FBXI ","M4N2FBYI ","M4N2FBZI ","M4N2FDXI ","M4N2FDYI ", & - "M4N2FDZI ","M4N2FIXI ","M4N2FIYI ","M4N2FIZI ","M4N2FMGXI","M4N2FMGYI","M4N2FMGZI", & - "M4N2MAFXI","M4N2MAFYI","M4N2MAFZI","M4N2MAGXI","M4N2MAGYI","M4N2MAGZI","M4N2MBFXI", & - "M4N2MBFYI","M4N2MBFZI","M4N2MBXI ","M4N2MBYI ","M4N2MBZI ","M4N2MMGXI","M4N2MMGYI", & - "M4N2MMGZI","M4N2STAXI","M4N2STAYI","M4N2STAZI","M4N2STVXI","M4N2STVYI","M4N2STVZI", & - "M4N2VXI ","M4N2VYI ","M4N2VZI ","M4N3AXI ","M4N3AYI ","M4N3AZI ","M4N3DYNP ", & - "M4N3FAFXI","M4N3FAFYI","M4N3FAFZI","M4N3FAGXI","M4N3FAGYI","M4N3FAGZI","M4N3FAMXI", & - "M4N3FAMYI","M4N3FAMZI","M4N3FBFXI","M4N3FBFYI","M4N3FBFZI","M4N3FBXI ","M4N3FBYI ", & - "M4N3FBZI ","M4N3FDXI ","M4N3FDYI ","M4N3FDZI ","M4N3FIXI ","M4N3FIYI ","M4N3FIZI ", & - "M4N3FMGXI","M4N3FMGYI","M4N3FMGZI","M4N3MAFXI","M4N3MAFYI","M4N3MAFZI","M4N3MAGXI", & - "M4N3MAGYI","M4N3MAGZI","M4N3MBFXI","M4N3MBFYI","M4N3MBFZI","M4N3MBXI ","M4N3MBYI ", & - "M4N3MBZI ","M4N3MMGXI","M4N3MMGYI","M4N3MMGZI","M4N3STAXI","M4N3STAYI","M4N3STAZI", & - "M4N3STVXI","M4N3STVYI","M4N3STVZI","M4N3VXI ","M4N3VYI ","M4N3VZI ","M4N4AXI ", & - "M4N4AYI ","M4N4AZI ","M4N4DYNP ","M4N4FAFXI","M4N4FAFYI","M4N4FAFZI","M4N4FAGXI", & - "M4N4FAGYI","M4N4FAGZI","M4N4FAMXI","M4N4FAMYI","M4N4FAMZI","M4N4FBFXI","M4N4FBFYI", & - "M4N4FBFZI","M4N4FBXI ","M4N4FBYI ","M4N4FBZI ","M4N4FDXI ","M4N4FDYI ","M4N4FDZI ", & - "M4N4FIXI ","M4N4FIYI ","M4N4FIZI ","M4N4FMGXI","M4N4FMGYI","M4N4FMGZI","M4N4MAFXI", & - "M4N4MAFYI","M4N4MAFZI","M4N4MAGXI","M4N4MAGYI","M4N4MAGZI","M4N4MBFXI","M4N4MBFYI", & - "M4N4MBFZI","M4N4MBXI ","M4N4MBYI ","M4N4MBZI ","M4N4MMGXI","M4N4MMGYI","M4N4MMGZI", & - "M4N4STAXI","M4N4STAYI","M4N4STAZI","M4N4STVXI","M4N4STVYI","M4N4STVZI","M4N4VXI ", & - "M4N4VYI ","M4N4VZI ","M4N5AXI "/) - ValidParamAry(2001:2500) = (/ & - "M4N5AYI ","M4N5AZI ","M4N5DYNP ","M4N5FAFXI","M4N5FAFYI","M4N5FAFZI","M4N5FAGXI", & - "M4N5FAGYI","M4N5FAGZI","M4N5FAMXI","M4N5FAMYI","M4N5FAMZI","M4N5FBFXI","M4N5FBFYI", & - "M4N5FBFZI","M4N5FBXI ","M4N5FBYI ","M4N5FBZI ","M4N5FDXI ","M4N5FDYI ","M4N5FDZI ", & - "M4N5FIXI ","M4N5FIYI ","M4N5FIZI ","M4N5FMGXI","M4N5FMGYI","M4N5FMGZI","M4N5MAFXI", & - "M4N5MAFYI","M4N5MAFZI","M4N5MAGXI","M4N5MAGYI","M4N5MAGZI","M4N5MBFXI","M4N5MBFYI", & - "M4N5MBFZI","M4N5MBXI ","M4N5MBYI ","M4N5MBZI ","M4N5MMGXI","M4N5MMGYI","M4N5MMGZI", & - "M4N5STAXI","M4N5STAYI","M4N5STAZI","M4N5STVXI","M4N5STVYI","M4N5STVZI","M4N5VXI ", & - "M4N5VYI ","M4N5VZI ","M4N6AXI ","M4N6AYI ","M4N6AZI ","M4N6DYNP ","M4N6FAFXI", & - "M4N6FAFYI","M4N6FAFZI","M4N6FAGXI","M4N6FAGYI","M4N6FAGZI","M4N6FAMXI","M4N6FAMYI", & - "M4N6FAMZI","M4N6FBFXI","M4N6FBFYI","M4N6FBFZI","M4N6FBXI ","M4N6FBYI ","M4N6FBZI ", & - "M4N6FDXI ","M4N6FDYI ","M4N6FDZI ","M4N6FIXI ","M4N6FIYI ","M4N6FIZI ","M4N6FMGXI", & - "M4N6FMGYI","M4N6FMGZI","M4N6MAFXI","M4N6MAFYI","M4N6MAFZI","M4N6MAGXI","M4N6MAGYI", & - "M4N6MAGZI","M4N6MBFXI","M4N6MBFYI","M4N6MBFZI","M4N6MBXI ","M4N6MBYI ","M4N6MBZI ", & - "M4N6MMGXI","M4N6MMGYI","M4N6MMGZI","M4N6STAXI","M4N6STAYI","M4N6STAZI","M4N6STVXI", & - "M4N6STVYI","M4N6STVZI","M4N6VXI ","M4N6VYI ","M4N6VZI ","M4N7AXI ","M4N7AYI ", & - "M4N7AZI ","M4N7DYNP ","M4N7FAFXI","M4N7FAFYI","M4N7FAFZI","M4N7FAGXI","M4N7FAGYI", & - "M4N7FAGZI","M4N7FAMXI","M4N7FAMYI","M4N7FAMZI","M4N7FBFXI","M4N7FBFYI","M4N7FBFZI", & - "M4N7FBXI ","M4N7FBYI ","M4N7FBZI ","M4N7FDXI ","M4N7FDYI ","M4N7FDZI ","M4N7FIXI ", & - "M4N7FIYI ","M4N7FIZI ","M4N7FMGXI","M4N7FMGYI","M4N7FMGZI","M4N7MAFXI","M4N7MAFYI", & - "M4N7MAFZI","M4N7MAGXI","M4N7MAGYI","M4N7MAGZI","M4N7MBFXI","M4N7MBFYI","M4N7MBFZI", & - "M4N7MBXI ","M4N7MBYI ","M4N7MBZI ","M4N7MMGXI","M4N7MMGYI","M4N7MMGZI","M4N7STAXI", & - "M4N7STAYI","M4N7STAZI","M4N7STVXI","M4N7STVYI","M4N7STVZI","M4N7VXI ","M4N7VYI ", & - "M4N7VZI ","M4N8AXI ","M4N8AYI ","M4N8AZI ","M4N8DYNP ","M4N8FAFXI","M4N8FAFYI", & - "M4N8FAFZI","M4N8FAGXI","M4N8FAGYI","M4N8FAGZI","M4N8FAMXI","M4N8FAMYI","M4N8FAMZI", & - "M4N8FBFXI","M4N8FBFYI","M4N8FBFZI","M4N8FBXI ","M4N8FBYI ","M4N8FBZI ","M4N8FDXI ", & - "M4N8FDYI ","M4N8FDZI ","M4N8FIXI ","M4N8FIYI ","M4N8FIZI ","M4N8FMGXI","M4N8FMGYI", & - "M4N8FMGZI","M4N8MAFXI","M4N8MAFYI","M4N8MAFZI","M4N8MAGXI","M4N8MAGYI","M4N8MAGZI", & - "M4N8MBFXI","M4N8MBFYI","M4N8MBFZI","M4N8MBXI ","M4N8MBYI ","M4N8MBZI ","M4N8MMGXI", & - "M4N8MMGYI","M4N8MMGZI","M4N8STAXI","M4N8STAYI","M4N8STAZI","M4N8STVXI","M4N8STVYI", & - "M4N8STVZI","M4N8VXI ","M4N8VYI ","M4N8VZI ","M4N9AXI ","M4N9AYI ","M4N9AZI ", & - "M4N9DYNP ","M4N9FAFXI","M4N9FAFYI","M4N9FAFZI","M4N9FAGXI","M4N9FAGYI","M4N9FAGZI", & - "M4N9FAMXI","M4N9FAMYI","M4N9FAMZI","M4N9FBFXI","M4N9FBFYI","M4N9FBFZI","M4N9FBXI ", & - "M4N9FBYI ","M4N9FBZI ","M4N9FDXI ","M4N9FDYI ","M4N9FDZI ","M4N9FIXI ","M4N9FIYI ", & - "M4N9FIZI ","M4N9FMGXI","M4N9FMGYI","M4N9FMGZI","M4N9MAFXI","M4N9MAFYI","M4N9MAFZI", & - "M4N9MAGXI","M4N9MAGYI","M4N9MAGZI","M4N9MBFXI","M4N9MBFYI","M4N9MBFZI","M4N9MBXI ", & - "M4N9MBYI ","M4N9MBZI ","M4N9MMGXI","M4N9MMGYI","M4N9MMGZI","M4N9STAXI","M4N9STAYI", & - "M4N9STAZI","M4N9STVXI","M4N9STVYI","M4N9STVZI","M4N9VXI ","M4N9VYI ","M4N9VZI ", & - "M5N1AXI ","M5N1AYI ","M5N1AZI ","M5N1DYNP ","M5N1FAFXI","M5N1FAFYI","M5N1FAFZI", & - "M5N1FAGXI","M5N1FAGYI","M5N1FAGZI","M5N1FAMXI","M5N1FAMYI","M5N1FAMZI","M5N1FBFXI", & - "M5N1FBFYI","M5N1FBFZI","M5N1FBXI ","M5N1FBYI ","M5N1FBZI ","M5N1FDXI ","M5N1FDYI ", & - "M5N1FDZI ","M5N1FIXI ","M5N1FIYI ","M5N1FIZI ","M5N1FMGXI","M5N1FMGYI","M5N1FMGZI", & - "M5N1MAFXI","M5N1MAFYI","M5N1MAFZI","M5N1MAGXI","M5N1MAGYI","M5N1MAGZI","M5N1MBFXI", & - "M5N1MBFYI","M5N1MBFZI","M5N1MBXI ","M5N1MBYI ","M5N1MBZI ","M5N1MMGXI","M5N1MMGYI", & - "M5N1MMGZI","M5N1STAXI","M5N1STAYI","M5N1STAZI","M5N1STVXI","M5N1STVYI","M5N1STVZI", & - "M5N1VXI ","M5N1VYI ","M5N1VZI ","M5N2AXI ","M5N2AYI ","M5N2AZI ","M5N2DYNP ", & - "M5N2FAFXI","M5N2FAFYI","M5N2FAFZI","M5N2FAGXI","M5N2FAGYI","M5N2FAGZI","M5N2FAMXI", & - "M5N2FAMYI","M5N2FAMZI","M5N2FBFXI","M5N2FBFYI","M5N2FBFZI","M5N2FBXI ","M5N2FBYI ", & - "M5N2FBZI ","M5N2FDXI ","M5N2FDYI ","M5N2FDZI ","M5N2FIXI ","M5N2FIYI ","M5N2FIZI ", & - "M5N2FMGXI","M5N2FMGYI","M5N2FMGZI","M5N2MAFXI","M5N2MAFYI","M5N2MAFZI","M5N2MAGXI", & - "M5N2MAGYI","M5N2MAGZI","M5N2MBFXI","M5N2MBFYI","M5N2MBFZI","M5N2MBXI ","M5N2MBYI ", & - "M5N2MBZI ","M5N2MMGXI","M5N2MMGYI","M5N2MMGZI","M5N2STAXI","M5N2STAYI","M5N2STAZI", & - "M5N2STVXI","M5N2STVYI","M5N2STVZI","M5N2VXI ","M5N2VYI ","M5N2VZI ","M5N3AXI ", & - "M5N3AYI ","M5N3AZI ","M5N3DYNP ","M5N3FAFXI","M5N3FAFYI","M5N3FAFZI","M5N3FAGXI", & - "M5N3FAGYI","M5N3FAGZI","M5N3FAMXI","M5N3FAMYI","M5N3FAMZI","M5N3FBFXI","M5N3FBFYI", & - "M5N3FBFZI","M5N3FBXI ","M5N3FBYI ","M5N3FBZI ","M5N3FDXI ","M5N3FDYI ","M5N3FDZI ", & - "M5N3FIXI ","M5N3FIYI ","M5N3FIZI ","M5N3FMGXI","M5N3FMGYI","M5N3FMGZI","M5N3MAFXI", & - "M5N3MAFYI","M5N3MAFZI","M5N3MAGXI","M5N3MAGYI","M5N3MAGZI","M5N3MBFXI","M5N3MBFYI", & - "M5N3MBFZI","M5N3MBXI ","M5N3MBYI ","M5N3MBZI ","M5N3MMGXI","M5N3MMGYI","M5N3MMGZI", & - "M5N3STAXI","M5N3STAYI","M5N3STAZI","M5N3STVXI","M5N3STVYI","M5N3STVZI","M5N3VXI ", & - "M5N3VYI ","M5N3VZI ","M5N4AXI ","M5N4AYI ","M5N4AZI ","M5N4DYNP ","M5N4FAFXI", & - "M5N4FAFYI","M5N4FAFZI","M5N4FAGXI","M5N4FAGYI","M5N4FAGZI","M5N4FAMXI","M5N4FAMYI", & - "M5N4FAMZI","M5N4FBFXI","M5N4FBFYI","M5N4FBFZI","M5N4FBXI ","M5N4FBYI ","M5N4FBZI ", & - "M5N4FDXI ","M5N4FDYI ","M5N4FDZI ","M5N4FIXI ","M5N4FIYI ","M5N4FIZI ","M5N4FMGXI", & - "M5N4FMGYI","M5N4FMGZI","M5N4MAFXI","M5N4MAFYI","M5N4MAFZI","M5N4MAGXI","M5N4MAGYI", & - "M5N4MAGZI","M5N4MBFXI","M5N4MBFYI","M5N4MBFZI","M5N4MBXI ","M5N4MBYI ","M5N4MBZI ", & - "M5N4MMGXI","M5N4MMGYI","M5N4MMGZI","M5N4STAXI","M5N4STAYI","M5N4STAZI","M5N4STVXI", & - "M5N4STVYI","M5N4STVZI","M5N4VXI ","M5N4VYI ","M5N4VZI ","M5N5AXI ","M5N5AYI ", & - "M5N5AZI ","M5N5DYNP ","M5N5FAFXI","M5N5FAFYI","M5N5FAFZI","M5N5FAGXI","M5N5FAGYI", & - "M5N5FAGZI","M5N5FAMXI","M5N5FAMYI","M5N5FAMZI","M5N5FBFXI","M5N5FBFYI","M5N5FBFZI", & - "M5N5FBXI ","M5N5FBYI ","M5N5FBZI ","M5N5FDXI ","M5N5FDYI ","M5N5FDZI ","M5N5FIXI ", & - "M5N5FIYI ","M5N5FIZI ","M5N5FMGXI","M5N5FMGYI","M5N5FMGZI","M5N5MAFXI","M5N5MAFYI", & - "M5N5MAFZI","M5N5MAGXI","M5N5MAGYI"/) - ValidParamAry(2501:3000) = (/ & - "M5N5MAGZI","M5N5MBFXI","M5N5MBFYI","M5N5MBFZI","M5N5MBXI ","M5N5MBYI ","M5N5MBZI ", & - "M5N5MMGXI","M5N5MMGYI","M5N5MMGZI","M5N5STAXI","M5N5STAYI","M5N5STAZI","M5N5STVXI", & - "M5N5STVYI","M5N5STVZI","M5N5VXI ","M5N5VYI ","M5N5VZI ","M5N6AXI ","M5N6AYI ", & - "M5N6AZI ","M5N6DYNP ","M5N6FAFXI","M5N6FAFYI","M5N6FAFZI","M5N6FAGXI","M5N6FAGYI", & - "M5N6FAGZI","M5N6FAMXI","M5N6FAMYI","M5N6FAMZI","M5N6FBFXI","M5N6FBFYI","M5N6FBFZI", & - "M5N6FBXI ","M5N6FBYI ","M5N6FBZI ","M5N6FDXI ","M5N6FDYI ","M5N6FDZI ","M5N6FIXI ", & - "M5N6FIYI ","M5N6FIZI ","M5N6FMGXI","M5N6FMGYI","M5N6FMGZI","M5N6MAFXI","M5N6MAFYI", & - "M5N6MAFZI","M5N6MAGXI","M5N6MAGYI","M5N6MAGZI","M5N6MBFXI","M5N6MBFYI","M5N6MBFZI", & - "M5N6MBXI ","M5N6MBYI ","M5N6MBZI ","M5N6MMGXI","M5N6MMGYI","M5N6MMGZI","M5N6STAXI", & - "M5N6STAYI","M5N6STAZI","M5N6STVXI","M5N6STVYI","M5N6STVZI","M5N6VXI ","M5N6VYI ", & - "M5N6VZI ","M5N7AXI ","M5N7AYI ","M5N7AZI ","M5N7DYNP ","M5N7FAFXI","M5N7FAFYI", & - "M5N7FAFZI","M5N7FAGXI","M5N7FAGYI","M5N7FAGZI","M5N7FAMXI","M5N7FAMYI","M5N7FAMZI", & - "M5N7FBFXI","M5N7FBFYI","M5N7FBFZI","M5N7FBXI ","M5N7FBYI ","M5N7FBZI ","M5N7FDXI ", & - "M5N7FDYI ","M5N7FDZI ","M5N7FIXI ","M5N7FIYI ","M5N7FIZI ","M5N7FMGXI","M5N7FMGYI", & - "M5N7FMGZI","M5N7MAFXI","M5N7MAFYI","M5N7MAFZI","M5N7MAGXI","M5N7MAGYI","M5N7MAGZI", & - "M5N7MBFXI","M5N7MBFYI","M5N7MBFZI","M5N7MBXI ","M5N7MBYI ","M5N7MBZI ","M5N7MMGXI", & - "M5N7MMGYI","M5N7MMGZI","M5N7STAXI","M5N7STAYI","M5N7STAZI","M5N7STVXI","M5N7STVYI", & - "M5N7STVZI","M5N7VXI ","M5N7VYI ","M5N7VZI ","M5N8AXI ","M5N8AYI ","M5N8AZI ", & - "M5N8DYNP ","M5N8FAFXI","M5N8FAFYI","M5N8FAFZI","M5N8FAGXI","M5N8FAGYI","M5N8FAGZI", & - "M5N8FAMXI","M5N8FAMYI","M5N8FAMZI","M5N8FBFXI","M5N8FBFYI","M5N8FBFZI","M5N8FBXI ", & - "M5N8FBYI ","M5N8FBZI ","M5N8FDXI ","M5N8FDYI ","M5N8FDZI ","M5N8FIXI ","M5N8FIYI ", & - "M5N8FIZI ","M5N8FMGXI","M5N8FMGYI","M5N8FMGZI","M5N8MAFXI","M5N8MAFYI","M5N8MAFZI", & - "M5N8MAGXI","M5N8MAGYI","M5N8MAGZI","M5N8MBFXI","M5N8MBFYI","M5N8MBFZI","M5N8MBXI ", & - "M5N8MBYI ","M5N8MBZI ","M5N8MMGXI","M5N8MMGYI","M5N8MMGZI","M5N8STAXI","M5N8STAYI", & - "M5N8STAZI","M5N8STVXI","M5N8STVYI","M5N8STVZI","M5N8VXI ","M5N8VYI ","M5N8VZI ", & - "M5N9AXI ","M5N9AYI ","M5N9AZI ","M5N9DYNP ","M5N9FAFXI","M5N9FAFYI","M5N9FAFZI", & - "M5N9FAGXI","M5N9FAGYI","M5N9FAGZI","M5N9FAMXI","M5N9FAMYI","M5N9FAMZI","M5N9FBFXI", & - "M5N9FBFYI","M5N9FBFZI","M5N9FBXI ","M5N9FBYI ","M5N9FBZI ","M5N9FDXI ","M5N9FDYI ", & - "M5N9FDZI ","M5N9FIXI ","M5N9FIYI ","M5N9FIZI ","M5N9FMGXI","M5N9FMGYI","M5N9FMGZI", & - "M5N9MAFXI","M5N9MAFYI","M5N9MAFZI","M5N9MAGXI","M5N9MAGYI","M5N9MAGZI","M5N9MBFXI", & - "M5N9MBFYI","M5N9MBFZI","M5N9MBXI ","M5N9MBYI ","M5N9MBZI ","M5N9MMGXI","M5N9MMGYI", & - "M5N9MMGZI","M5N9STAXI","M5N9STAYI","M5N9STAZI","M5N9STVXI","M5N9STVYI","M5N9STVZI", & - "M5N9VXI ","M5N9VYI ","M5N9VZI ","M6N1AXI ","M6N1AYI ","M6N1AZI ","M6N1DYNP ", & - "M6N1FAFXI","M6N1FAFYI","M6N1FAFZI","M6N1FAGXI","M6N1FAGYI","M6N1FAGZI","M6N1FAMXI", & - "M6N1FAMYI","M6N1FAMZI","M6N1FBFXI","M6N1FBFYI","M6N1FBFZI","M6N1FBXI ","M6N1FBYI ", & - "M6N1FBZI ","M6N1FDXI ","M6N1FDYI ","M6N1FDZI ","M6N1FIXI ","M6N1FIYI ","M6N1FIZI ", & - "M6N1FMGXI","M6N1FMGYI","M6N1FMGZI","M6N1MAFXI","M6N1MAFYI","M6N1MAFZI","M6N1MAGXI", & - "M6N1MAGYI","M6N1MAGZI","M6N1MBFXI","M6N1MBFYI","M6N1MBFZI","M6N1MBXI ","M6N1MBYI ", & - "M6N1MBZI ","M6N1MMGXI","M6N1MMGYI","M6N1MMGZI","M6N1STAXI","M6N1STAYI","M6N1STAZI", & - "M6N1STVXI","M6N1STVYI","M6N1STVZI","M6N1VXI ","M6N1VYI ","M6N1VZI ","M6N2AXI ", & - "M6N2AYI ","M6N2AZI ","M6N2DYNP ","M6N2FAFXI","M6N2FAFYI","M6N2FAFZI","M6N2FAGXI", & - "M6N2FAGYI","M6N2FAGZI","M6N2FAMXI","M6N2FAMYI","M6N2FAMZI","M6N2FBFXI","M6N2FBFYI", & - "M6N2FBFZI","M6N2FBXI ","M6N2FBYI ","M6N2FBZI ","M6N2FDXI ","M6N2FDYI ","M6N2FDZI ", & - "M6N2FIXI ","M6N2FIYI ","M6N2FIZI ","M6N2FMGXI","M6N2FMGYI","M6N2FMGZI","M6N2MAFXI", & - "M6N2MAFYI","M6N2MAFZI","M6N2MAGXI","M6N2MAGYI","M6N2MAGZI","M6N2MBFXI","M6N2MBFYI", & - "M6N2MBFZI","M6N2MBXI ","M6N2MBYI ","M6N2MBZI ","M6N2MMGXI","M6N2MMGYI","M6N2MMGZI", & - "M6N2STAXI","M6N2STAYI","M6N2STAZI","M6N2STVXI","M6N2STVYI","M6N2STVZI","M6N2VXI ", & - "M6N2VYI ","M6N2VZI ","M6N3AXI ","M6N3AYI ","M6N3AZI ","M6N3DYNP ","M6N3FAFXI", & - "M6N3FAFYI","M6N3FAFZI","M6N3FAGXI","M6N3FAGYI","M6N3FAGZI","M6N3FAMXI","M6N3FAMYI", & - "M6N3FAMZI","M6N3FBFXI","M6N3FBFYI","M6N3FBFZI","M6N3FBXI ","M6N3FBYI ","M6N3FBZI ", & - "M6N3FDXI ","M6N3FDYI ","M6N3FDZI ","M6N3FIXI ","M6N3FIYI ","M6N3FIZI ","M6N3FMGXI", & - "M6N3FMGYI","M6N3FMGZI","M6N3MAFXI","M6N3MAFYI","M6N3MAFZI","M6N3MAGXI","M6N3MAGYI", & - "M6N3MAGZI","M6N3MBFXI","M6N3MBFYI","M6N3MBFZI","M6N3MBXI ","M6N3MBYI ","M6N3MBZI ", & - "M6N3MMGXI","M6N3MMGYI","M6N3MMGZI","M6N3STAXI","M6N3STAYI","M6N3STAZI","M6N3STVXI", & - "M6N3STVYI","M6N3STVZI","M6N3VXI ","M6N3VYI ","M6N3VZI ","M6N4AXI ","M6N4AYI ", & - "M6N4AZI ","M6N4DYNP ","M6N4FAFXI","M6N4FAFYI","M6N4FAFZI","M6N4FAGXI","M6N4FAGYI", & - "M6N4FAGZI","M6N4FAMXI","M6N4FAMYI","M6N4FAMZI","M6N4FBFXI","M6N4FBFYI","M6N4FBFZI", & - "M6N4FBXI ","M6N4FBYI ","M6N4FBZI ","M6N4FDXI ","M6N4FDYI ","M6N4FDZI ","M6N4FIXI ", & - "M6N4FIYI ","M6N4FIZI ","M6N4FMGXI","M6N4FMGYI","M6N4FMGZI","M6N4MAFXI","M6N4MAFYI", & - "M6N4MAFZI","M6N4MAGXI","M6N4MAGYI","M6N4MAGZI","M6N4MBFXI","M6N4MBFYI","M6N4MBFZI", & - "M6N4MBXI ","M6N4MBYI ","M6N4MBZI ","M6N4MMGXI","M6N4MMGYI","M6N4MMGZI","M6N4STAXI", & - "M6N4STAYI","M6N4STAZI","M6N4STVXI","M6N4STVYI","M6N4STVZI","M6N4VXI ","M6N4VYI ", & - "M6N4VZI ","M6N5AXI ","M6N5AYI ","M6N5AZI ","M6N5DYNP ","M6N5FAFXI","M6N5FAFYI", & - "M6N5FAFZI","M6N5FAGXI","M6N5FAGYI","M6N5FAGZI","M6N5FAMXI","M6N5FAMYI","M6N5FAMZI", & - "M6N5FBFXI","M6N5FBFYI","M6N5FBFZI","M6N5FBXI ","M6N5FBYI ","M6N5FBZI ","M6N5FDXI ", & - "M6N5FDYI ","M6N5FDZI ","M6N5FIXI ","M6N5FIYI ","M6N5FIZI ","M6N5FMGXI","M6N5FMGYI", & - "M6N5FMGZI","M6N5MAFXI","M6N5MAFYI","M6N5MAFZI","M6N5MAGXI","M6N5MAGYI","M6N5MAGZI", & - "M6N5MBFXI","M6N5MBFYI","M6N5MBFZI","M6N5MBXI ","M6N5MBYI ","M6N5MBZI ","M6N5MMGXI", & - "M6N5MMGYI","M6N5MMGZI","M6N5STAXI","M6N5STAYI","M6N5STAZI","M6N5STVXI","M6N5STVYI", & - "M6N5STVZI","M6N5VXI ","M6N5VYI ","M6N5VZI ","M6N6AXI ","M6N6AYI ","M6N6AZI ", & - "M6N6DYNP ","M6N6FAFXI","M6N6FAFYI","M6N6FAFZI","M6N6FAGXI","M6N6FAGYI","M6N6FAGZI", & - "M6N6FAMXI","M6N6FAMYI","M6N6FAMZI"/) - ValidParamAry(3001:3500) = (/ & - "M6N6FBFXI","M6N6FBFYI","M6N6FBFZI","M6N6FBXI ","M6N6FBYI ","M6N6FBZI ","M6N6FDXI ", & - "M6N6FDYI ","M6N6FDZI ","M6N6FIXI ","M6N6FIYI ","M6N6FIZI ","M6N6FMGXI","M6N6FMGYI", & - "M6N6FMGZI","M6N6MAFXI","M6N6MAFYI","M6N6MAFZI","M6N6MAGXI","M6N6MAGYI","M6N6MAGZI", & - "M6N6MBFXI","M6N6MBFYI","M6N6MBFZI","M6N6MBXI ","M6N6MBYI ","M6N6MBZI ","M6N6MMGXI", & - "M6N6MMGYI","M6N6MMGZI","M6N6STAXI","M6N6STAYI","M6N6STAZI","M6N6STVXI","M6N6STVYI", & - "M6N6STVZI","M6N6VXI ","M6N6VYI ","M6N6VZI ","M6N7AXI ","M6N7AYI ","M6N7AZI ", & - "M6N7DYNP ","M6N7FAFXI","M6N7FAFYI","M6N7FAFZI","M6N7FAGXI","M6N7FAGYI","M6N7FAGZI", & - "M6N7FAMXI","M6N7FAMYI","M6N7FAMZI","M6N7FBFXI","M6N7FBFYI","M6N7FBFZI","M6N7FBXI ", & - "M6N7FBYI ","M6N7FBZI ","M6N7FDXI ","M6N7FDYI ","M6N7FDZI ","M6N7FIXI ","M6N7FIYI ", & - "M6N7FIZI ","M6N7FMGXI","M6N7FMGYI","M6N7FMGZI","M6N7MAFXI","M6N7MAFYI","M6N7MAFZI", & - "M6N7MAGXI","M6N7MAGYI","M6N7MAGZI","M6N7MBFXI","M6N7MBFYI","M6N7MBFZI","M6N7MBXI ", & - "M6N7MBYI ","M6N7MBZI ","M6N7MMGXI","M6N7MMGYI","M6N7MMGZI","M6N7STAXI","M6N7STAYI", & - "M6N7STAZI","M6N7STVXI","M6N7STVYI","M6N7STVZI","M6N7VXI ","M6N7VYI ","M6N7VZI ", & - "M6N8AXI ","M6N8AYI ","M6N8AZI ","M6N8DYNP ","M6N8FAFXI","M6N8FAFYI","M6N8FAFZI", & - "M6N8FAGXI","M6N8FAGYI","M6N8FAGZI","M6N8FAMXI","M6N8FAMYI","M6N8FAMZI","M6N8FBFXI", & - "M6N8FBFYI","M6N8FBFZI","M6N8FBXI ","M6N8FBYI ","M6N8FBZI ","M6N8FDXI ","M6N8FDYI ", & - "M6N8FDZI ","M6N8FIXI ","M6N8FIYI ","M6N8FIZI ","M6N8FMGXI","M6N8FMGYI","M6N8FMGZI", & - "M6N8MAFXI","M6N8MAFYI","M6N8MAFZI","M6N8MAGXI","M6N8MAGYI","M6N8MAGZI","M6N8MBFXI", & - "M6N8MBFYI","M6N8MBFZI","M6N8MBXI ","M6N8MBYI ","M6N8MBZI ","M6N8MMGXI","M6N8MMGYI", & - "M6N8MMGZI","M6N8STAXI","M6N8STAYI","M6N8STAZI","M6N8STVXI","M6N8STVYI","M6N8STVZI", & - "M6N8VXI ","M6N8VYI ","M6N8VZI ","M6N9AXI ","M6N9AYI ","M6N9AZI ","M6N9DYNP ", & - "M6N9FAFXI","M6N9FAFYI","M6N9FAFZI","M6N9FAGXI","M6N9FAGYI","M6N9FAGZI","M6N9FAMXI", & - "M6N9FAMYI","M6N9FAMZI","M6N9FBFXI","M6N9FBFYI","M6N9FBFZI","M6N9FBXI ","M6N9FBYI ", & - "M6N9FBZI ","M6N9FDXI ","M6N9FDYI ","M6N9FDZI ","M6N9FIXI ","M6N9FIYI ","M6N9FIZI ", & - "M6N9FMGXI","M6N9FMGYI","M6N9FMGZI","M6N9MAFXI","M6N9MAFYI","M6N9MAFZI","M6N9MAGXI", & - "M6N9MAGYI","M6N9MAGZI","M6N9MBFXI","M6N9MBFYI","M6N9MBFZI","M6N9MBXI ","M6N9MBYI ", & - "M6N9MBZI ","M6N9MMGXI","M6N9MMGYI","M6N9MMGZI","M6N9STAXI","M6N9STAYI","M6N9STAZI", & - "M6N9STVXI","M6N9STVYI","M6N9STVZI","M6N9VXI ","M6N9VYI ","M6N9VZI ","M7N1AXI ", & - "M7N1AYI ","M7N1AZI ","M7N1DYNP ","M7N1FAFXI","M7N1FAFYI","M7N1FAFZI","M7N1FAGXI", & - "M7N1FAGYI","M7N1FAGZI","M7N1FAMXI","M7N1FAMYI","M7N1FAMZI","M7N1FBFXI","M7N1FBFYI", & - "M7N1FBFZI","M7N1FBXI ","M7N1FBYI ","M7N1FBZI ","M7N1FDXI ","M7N1FDYI ","M7N1FDZI ", & - "M7N1FIXI ","M7N1FIYI ","M7N1FIZI ","M7N1FMGXI","M7N1FMGYI","M7N1FMGZI","M7N1MAFXI", & - "M7N1MAFYI","M7N1MAFZI","M7N1MAGXI","M7N1MAGYI","M7N1MAGZI","M7N1MBFXI","M7N1MBFYI", & - "M7N1MBFZI","M7N1MBXI ","M7N1MBYI ","M7N1MBZI ","M7N1MMGXI","M7N1MMGYI","M7N1MMGZI", & - "M7N1STAXI","M7N1STAYI","M7N1STAZI","M7N1STVXI","M7N1STVYI","M7N1STVZI","M7N1VXI ", & - "M7N1VYI ","M7N1VZI ","M7N2AXI ","M7N2AYI ","M7N2AZI ","M7N2DYNP ","M7N2FAFXI", & - "M7N2FAFYI","M7N2FAFZI","M7N2FAGXI","M7N2FAGYI","M7N2FAGZI","M7N2FAMXI","M7N2FAMYI", & - "M7N2FAMZI","M7N2FBFXI","M7N2FBFYI","M7N2FBFZI","M7N2FBXI ","M7N2FBYI ","M7N2FBZI ", & - "M7N2FDXI ","M7N2FDYI ","M7N2FDZI ","M7N2FIXI ","M7N2FIYI ","M7N2FIZI ","M7N2FMGXI", & - "M7N2FMGYI","M7N2FMGZI","M7N2MAFXI","M7N2MAFYI","M7N2MAFZI","M7N2MAGXI","M7N2MAGYI", & - "M7N2MAGZI","M7N2MBFXI","M7N2MBFYI","M7N2MBFZI","M7N2MBXI ","M7N2MBYI ","M7N2MBZI ", & - "M7N2MMGXI","M7N2MMGYI","M7N2MMGZI","M7N2STAXI","M7N2STAYI","M7N2STAZI","M7N2STVXI", & - "M7N2STVYI","M7N2STVZI","M7N2VXI ","M7N2VYI ","M7N2VZI ","M7N3AXI ","M7N3AYI ", & - "M7N3AZI ","M7N3DYNP ","M7N3FAFXI","M7N3FAFYI","M7N3FAFZI","M7N3FAGXI","M7N3FAGYI", & - "M7N3FAGZI","M7N3FAMXI","M7N3FAMYI","M7N3FAMZI","M7N3FBFXI","M7N3FBFYI","M7N3FBFZI", & - "M7N3FBXI ","M7N3FBYI ","M7N3FBZI ","M7N3FDXI ","M7N3FDYI ","M7N3FDZI ","M7N3FIXI ", & - "M7N3FIYI ","M7N3FIZI ","M7N3FMGXI","M7N3FMGYI","M7N3FMGZI","M7N3MAFXI","M7N3MAFYI", & - "M7N3MAFZI","M7N3MAGXI","M7N3MAGYI","M7N3MAGZI","M7N3MBFXI","M7N3MBFYI","M7N3MBFZI", & - "M7N3MBXI ","M7N3MBYI ","M7N3MBZI ","M7N3MMGXI","M7N3MMGYI","M7N3MMGZI","M7N3STAXI", & - "M7N3STAYI","M7N3STAZI","M7N3STVXI","M7N3STVYI","M7N3STVZI","M7N3VXI ","M7N3VYI ", & - "M7N3VZI ","M7N4AXI ","M7N4AYI ","M7N4AZI ","M7N4DYNP ","M7N4FAFXI","M7N4FAFYI", & - "M7N4FAFZI","M7N4FAGXI","M7N4FAGYI","M7N4FAGZI","M7N4FAMXI","M7N4FAMYI","M7N4FAMZI", & - "M7N4FBFXI","M7N4FBFYI","M7N4FBFZI","M7N4FBXI ","M7N4FBYI ","M7N4FBZI ","M7N4FDXI ", & - "M7N4FDYI ","M7N4FDZI ","M7N4FIXI ","M7N4FIYI ","M7N4FIZI ","M7N4FMGXI","M7N4FMGYI", & - "M7N4FMGZI","M7N4MAFXI","M7N4MAFYI","M7N4MAFZI","M7N4MAGXI","M7N4MAGYI","M7N4MAGZI", & - "M7N4MBFXI","M7N4MBFYI","M7N4MBFZI","M7N4MBXI ","M7N4MBYI ","M7N4MBZI ","M7N4MMGXI", & - "M7N4MMGYI","M7N4MMGZI","M7N4STAXI","M7N4STAYI","M7N4STAZI","M7N4STVXI","M7N4STVYI", & - "M7N4STVZI","M7N4VXI ","M7N4VYI ","M7N4VZI ","M7N5AXI ","M7N5AYI ","M7N5AZI ", & - "M7N5DYNP ","M7N5FAFXI","M7N5FAFYI","M7N5FAFZI","M7N5FAGXI","M7N5FAGYI","M7N5FAGZI", & - "M7N5FAMXI","M7N5FAMYI","M7N5FAMZI","M7N5FBFXI","M7N5FBFYI","M7N5FBFZI","M7N5FBXI ", & - "M7N5FBYI ","M7N5FBZI ","M7N5FDXI ","M7N5FDYI ","M7N5FDZI ","M7N5FIXI ","M7N5FIYI ", & - "M7N5FIZI ","M7N5FMGXI","M7N5FMGYI","M7N5FMGZI","M7N5MAFXI","M7N5MAFYI","M7N5MAFZI", & - "M7N5MAGXI","M7N5MAGYI","M7N5MAGZI","M7N5MBFXI","M7N5MBFYI","M7N5MBFZI","M7N5MBXI ", & - "M7N5MBYI ","M7N5MBZI ","M7N5MMGXI","M7N5MMGYI","M7N5MMGZI","M7N5STAXI","M7N5STAYI", & - "M7N5STAZI","M7N5STVXI","M7N5STVYI","M7N5STVZI","M7N5VXI ","M7N5VYI ","M7N5VZI ", & - "M7N6AXI ","M7N6AYI ","M7N6AZI ","M7N6DYNP ","M7N6FAFXI","M7N6FAFYI","M7N6FAFZI", & - "M7N6FAGXI","M7N6FAGYI","M7N6FAGZI","M7N6FAMXI","M7N6FAMYI","M7N6FAMZI","M7N6FBFXI", & - "M7N6FBFYI","M7N6FBFZI","M7N6FBXI ","M7N6FBYI ","M7N6FBZI ","M7N6FDXI ","M7N6FDYI ", & - "M7N6FDZI ","M7N6FIXI ","M7N6FIYI ","M7N6FIZI ","M7N6FMGXI","M7N6FMGYI","M7N6FMGZI", & - "M7N6MAFXI","M7N6MAFYI","M7N6MAFZI","M7N6MAGXI","M7N6MAGYI","M7N6MAGZI","M7N6MBFXI", & - "M7N6MBFYI","M7N6MBFZI","M7N6MBXI ","M7N6MBYI ","M7N6MBZI ","M7N6MMGXI","M7N6MMGYI", & - "M7N6MMGZI","M7N6STAXI","M7N6STAYI"/) - ValidParamAry(3501:4000) = (/ & - "M7N6STAZI","M7N6STVXI","M7N6STVYI","M7N6STVZI","M7N6VXI ","M7N6VYI ","M7N6VZI ", & - "M7N7AXI ","M7N7AYI ","M7N7AZI ","M7N7DYNP ","M7N7FAFXI","M7N7FAFYI","M7N7FAFZI", & - "M7N7FAGXI","M7N7FAGYI","M7N7FAGZI","M7N7FAMXI","M7N7FAMYI","M7N7FAMZI","M7N7FBFXI", & - "M7N7FBFYI","M7N7FBFZI","M7N7FBXI ","M7N7FBYI ","M7N7FBZI ","M7N7FDXI ","M7N7FDYI ", & - "M7N7FDZI ","M7N7FIXI ","M7N7FIYI ","M7N7FIZI ","M7N7FMGXI","M7N7FMGYI","M7N7FMGZI", & - "M7N7MAFXI","M7N7MAFYI","M7N7MAFZI","M7N7MAGXI","M7N7MAGYI","M7N7MAGZI","M7N7MBFXI", & - "M7N7MBFYI","M7N7MBFZI","M7N7MBXI ","M7N7MBYI ","M7N7MBZI ","M7N7MMGXI","M7N7MMGYI", & - "M7N7MMGZI","M7N7STAXI","M7N7STAYI","M7N7STAZI","M7N7STVXI","M7N7STVYI","M7N7STVZI", & - "M7N7VXI ","M7N7VYI ","M7N7VZI ","M7N8AXI ","M7N8AYI ","M7N8AZI ","M7N8DYNP ", & - "M7N8FAFXI","M7N8FAFYI","M7N8FAFZI","M7N8FAGXI","M7N8FAGYI","M7N8FAGZI","M7N8FAMXI", & - "M7N8FAMYI","M7N8FAMZI","M7N8FBFXI","M7N8FBFYI","M7N8FBFZI","M7N8FBXI ","M7N8FBYI ", & - "M7N8FBZI ","M7N8FDXI ","M7N8FDYI ","M7N8FDZI ","M7N8FIXI ","M7N8FIYI ","M7N8FIZI ", & - "M7N8FMGXI","M7N8FMGYI","M7N8FMGZI","M7N8MAFXI","M7N8MAFYI","M7N8MAFZI","M7N8MAGXI", & - "M7N8MAGYI","M7N8MAGZI","M7N8MBFXI","M7N8MBFYI","M7N8MBFZI","M7N8MBXI ","M7N8MBYI ", & - "M7N8MBZI ","M7N8MMGXI","M7N8MMGYI","M7N8MMGZI","M7N8STAXI","M7N8STAYI","M7N8STAZI", & - "M7N8STVXI","M7N8STVYI","M7N8STVZI","M7N8VXI ","M7N8VYI ","M7N8VZI ","M7N9AXI ", & - "M7N9AYI ","M7N9AZI ","M7N9DYNP ","M7N9FAFXI","M7N9FAFYI","M7N9FAFZI","M7N9FAGXI", & - "M7N9FAGYI","M7N9FAGZI","M7N9FAMXI","M7N9FAMYI","M7N9FAMZI","M7N9FBFXI","M7N9FBFYI", & - "M7N9FBFZI","M7N9FBXI ","M7N9FBYI ","M7N9FBZI ","M7N9FDXI ","M7N9FDYI ","M7N9FDZI ", & - "M7N9FIXI ","M7N9FIYI ","M7N9FIZI ","M7N9FMGXI","M7N9FMGYI","M7N9FMGZI","M7N9MAFXI", & - "M7N9MAFYI","M7N9MAFZI","M7N9MAGXI","M7N9MAGYI","M7N9MAGZI","M7N9MBFXI","M7N9MBFYI", & - "M7N9MBFZI","M7N9MBXI ","M7N9MBYI ","M7N9MBZI ","M7N9MMGXI","M7N9MMGYI","M7N9MMGZI", & - "M7N9STAXI","M7N9STAYI","M7N9STAZI","M7N9STVXI","M7N9STVYI","M7N9STVZI","M7N9VXI ", & - "M7N9VYI ","M7N9VZI ","M8N1AXI ","M8N1AYI ","M8N1AZI ","M8N1DYNP ","M8N1FAFXI", & - "M8N1FAFYI","M8N1FAFZI","M8N1FAGXI","M8N1FAGYI","M8N1FAGZI","M8N1FAMXI","M8N1FAMYI", & - "M8N1FAMZI","M8N1FBFXI","M8N1FBFYI","M8N1FBFZI","M8N1FBXI ","M8N1FBYI ","M8N1FBZI ", & - "M8N1FDXI ","M8N1FDYI ","M8N1FDZI ","M8N1FIXI ","M8N1FIYI ","M8N1FIZI ","M8N1FMGXI", & - "M8N1FMGYI","M8N1FMGZI","M8N1MAFXI","M8N1MAFYI","M8N1MAFZI","M8N1MAGXI","M8N1MAGYI", & - "M8N1MAGZI","M8N1MBFXI","M8N1MBFYI","M8N1MBFZI","M8N1MBXI ","M8N1MBYI ","M8N1MBZI ", & - "M8N1MMGXI","M8N1MMGYI","M8N1MMGZI","M8N1STAXI","M8N1STAYI","M8N1STAZI","M8N1STVXI", & - "M8N1STVYI","M8N1STVZI","M8N1VXI ","M8N1VYI ","M8N1VZI ","M8N2AXI ","M8N2AYI ", & - "M8N2AZI ","M8N2DYNP ","M8N2FAFXI","M8N2FAFYI","M8N2FAFZI","M8N2FAGXI","M8N2FAGYI", & - "M8N2FAGZI","M8N2FAMXI","M8N2FAMYI","M8N2FAMZI","M8N2FBFXI","M8N2FBFYI","M8N2FBFZI", & - "M8N2FBXI ","M8N2FBYI ","M8N2FBZI ","M8N2FDXI ","M8N2FDYI ","M8N2FDZI ","M8N2FIXI ", & - "M8N2FIYI ","M8N2FIZI ","M8N2FMGXI","M8N2FMGYI","M8N2FMGZI","M8N2MAFXI","M8N2MAFYI", & - "M8N2MAFZI","M8N2MAGXI","M8N2MAGYI","M8N2MAGZI","M8N2MBFXI","M8N2MBFYI","M8N2MBFZI", & - "M8N2MBXI ","M8N2MBYI ","M8N2MBZI ","M8N2MMGXI","M8N2MMGYI","M8N2MMGZI","M8N2STAXI", & - "M8N2STAYI","M8N2STAZI","M8N2STVXI","M8N2STVYI","M8N2STVZI","M8N2VXI ","M8N2VYI ", & - "M8N2VZI ","M8N3AXI ","M8N3AYI ","M8N3AZI ","M8N3DYNP ","M8N3FAFXI","M8N3FAFYI", & - "M8N3FAFZI","M8N3FAGXI","M8N3FAGYI","M8N3FAGZI","M8N3FAMXI","M8N3FAMYI","M8N3FAMZI", & - "M8N3FBFXI","M8N3FBFYI","M8N3FBFZI","M8N3FBXI ","M8N3FBYI ","M8N3FBZI ","M8N3FDXI ", & - "M8N3FDYI ","M8N3FDZI ","M8N3FIXI ","M8N3FIYI ","M8N3FIZI ","M8N3FMGXI","M8N3FMGYI", & - "M8N3FMGZI","M8N3MAFXI","M8N3MAFYI","M8N3MAFZI","M8N3MAGXI","M8N3MAGYI","M8N3MAGZI", & - "M8N3MBFXI","M8N3MBFYI","M8N3MBFZI","M8N3MBXI ","M8N3MBYI ","M8N3MBZI ","M8N3MMGXI", & - "M8N3MMGYI","M8N3MMGZI","M8N3STAXI","M8N3STAYI","M8N3STAZI","M8N3STVXI","M8N3STVYI", & - "M8N3STVZI","M8N3VXI ","M8N3VYI ","M8N3VZI ","M8N4AXI ","M8N4AYI ","M8N4AZI ", & - "M8N4DYNP ","M8N4FAFXI","M8N4FAFYI","M8N4FAFZI","M8N4FAGXI","M8N4FAGYI","M8N4FAGZI", & - "M8N4FAMXI","M8N4FAMYI","M8N4FAMZI","M8N4FBFXI","M8N4FBFYI","M8N4FBFZI","M8N4FBXI ", & - "M8N4FBYI ","M8N4FBZI ","M8N4FDXI ","M8N4FDYI ","M8N4FDZI ","M8N4FIXI ","M8N4FIYI ", & - "M8N4FIZI ","M8N4FMGXI","M8N4FMGYI","M8N4FMGZI","M8N4MAFXI","M8N4MAFYI","M8N4MAFZI", & - "M8N4MAGXI","M8N4MAGYI","M8N4MAGZI","M8N4MBFXI","M8N4MBFYI","M8N4MBFZI","M8N4MBXI ", & - "M8N4MBYI ","M8N4MBZI ","M8N4MMGXI","M8N4MMGYI","M8N4MMGZI","M8N4STAXI","M8N4STAYI", & - "M8N4STAZI","M8N4STVXI","M8N4STVYI","M8N4STVZI","M8N4VXI ","M8N4VYI ","M8N4VZI ", & - "M8N5AXI ","M8N5AYI ","M8N5AZI ","M8N5DYNP ","M8N5FAFXI","M8N5FAFYI","M8N5FAFZI", & - "M8N5FAGXI","M8N5FAGYI","M8N5FAGZI","M8N5FAMXI","M8N5FAMYI","M8N5FAMZI","M8N5FBFXI", & - "M8N5FBFYI","M8N5FBFZI","M8N5FBXI ","M8N5FBYI ","M8N5FBZI ","M8N5FDXI ","M8N5FDYI ", & - "M8N5FDZI ","M8N5FIXI ","M8N5FIYI ","M8N5FIZI ","M8N5FMGXI","M8N5FMGYI","M8N5FMGZI", & - "M8N5MAFXI","M8N5MAFYI","M8N5MAFZI","M8N5MAGXI","M8N5MAGYI","M8N5MAGZI","M8N5MBFXI", & - "M8N5MBFYI","M8N5MBFZI","M8N5MBXI ","M8N5MBYI ","M8N5MBZI ","M8N5MMGXI","M8N5MMGYI", & - "M8N5MMGZI","M8N5STAXI","M8N5STAYI","M8N5STAZI","M8N5STVXI","M8N5STVYI","M8N5STVZI", & - "M8N5VXI ","M8N5VYI ","M8N5VZI ","M8N6AXI ","M8N6AYI ","M8N6AZI ","M8N6DYNP ", & - "M8N6FAFXI","M8N6FAFYI","M8N6FAFZI","M8N6FAGXI","M8N6FAGYI","M8N6FAGZI","M8N6FAMXI", & - "M8N6FAMYI","M8N6FAMZI","M8N6FBFXI","M8N6FBFYI","M8N6FBFZI","M8N6FBXI ","M8N6FBYI ", & - "M8N6FBZI ","M8N6FDXI ","M8N6FDYI ","M8N6FDZI ","M8N6FIXI ","M8N6FIYI ","M8N6FIZI ", & - "M8N6FMGXI","M8N6FMGYI","M8N6FMGZI","M8N6MAFXI","M8N6MAFYI","M8N6MAFZI","M8N6MAGXI", & - "M8N6MAGYI","M8N6MAGZI","M8N6MBFXI","M8N6MBFYI","M8N6MBFZI","M8N6MBXI ","M8N6MBYI ", & - "M8N6MBZI ","M8N6MMGXI","M8N6MMGYI","M8N6MMGZI","M8N6STAXI","M8N6STAYI","M8N6STAZI", & - "M8N6STVXI","M8N6STVYI","M8N6STVZI","M8N6VXI ","M8N6VYI ","M8N6VZI ","M8N7AXI ", & - "M8N7AYI ","M8N7AZI ","M8N7DYNP ","M8N7FAFXI","M8N7FAFYI","M8N7FAFZI","M8N7FAGXI", & - "M8N7FAGYI","M8N7FAGZI","M8N7FAMXI","M8N7FAMYI","M8N7FAMZI","M8N7FBFXI","M8N7FBFYI", & - "M8N7FBFZI","M8N7FBXI ","M8N7FBYI ","M8N7FBZI ","M8N7FDXI ","M8N7FDYI ","M8N7FDZI ", & - "M8N7FIXI ","M8N7FIYI ","M8N7FIZI "/) - ValidParamAry(4001:4500) = (/ & - "M8N7FMGXI","M8N7FMGYI","M8N7FMGZI","M8N7MAFXI","M8N7MAFYI","M8N7MAFZI","M8N7MAGXI", & - "M8N7MAGYI","M8N7MAGZI","M8N7MBFXI","M8N7MBFYI","M8N7MBFZI","M8N7MBXI ","M8N7MBYI ", & - "M8N7MBZI ","M8N7MMGXI","M8N7MMGYI","M8N7MMGZI","M8N7STAXI","M8N7STAYI","M8N7STAZI", & - "M8N7STVXI","M8N7STVYI","M8N7STVZI","M8N7VXI ","M8N7VYI ","M8N7VZI ","M8N8AXI ", & - "M8N8AYI ","M8N8AZI ","M8N8DYNP ","M8N8FAFXI","M8N8FAFYI","M8N8FAFZI","M8N8FAGXI", & - "M8N8FAGYI","M8N8FAGZI","M8N8FAMXI","M8N8FAMYI","M8N8FAMZI","M8N8FBFXI","M8N8FBFYI", & - "M8N8FBFZI","M8N8FBXI ","M8N8FBYI ","M8N8FBZI ","M8N8FDXI ","M8N8FDYI ","M8N8FDZI ", & - "M8N8FIXI ","M8N8FIYI ","M8N8FIZI ","M8N8FMGXI","M8N8FMGYI","M8N8FMGZI","M8N8MAFXI", & - "M8N8MAFYI","M8N8MAFZI","M8N8MAGXI","M8N8MAGYI","M8N8MAGZI","M8N8MBFXI","M8N8MBFYI", & - "M8N8MBFZI","M8N8MBXI ","M8N8MBYI ","M8N8MBZI ","M8N8MMGXI","M8N8MMGYI","M8N8MMGZI", & - "M8N8STAXI","M8N8STAYI","M8N8STAZI","M8N8STVXI","M8N8STVYI","M8N8STVZI","M8N8VXI ", & - "M8N8VYI ","M8N8VZI ","M8N9AXI ","M8N9AYI ","M8N9AZI ","M8N9DYNP ","M8N9FAFXI", & - "M8N9FAFYI","M8N9FAFZI","M8N9FAGXI","M8N9FAGYI","M8N9FAGZI","M8N9FAMXI","M8N9FAMYI", & - "M8N9FAMZI","M8N9FBFXI","M8N9FBFYI","M8N9FBFZI","M8N9FBXI ","M8N9FBYI ","M8N9FBZI ", & - "M8N9FDXI ","M8N9FDYI ","M8N9FDZI ","M8N9FIXI ","M8N9FIYI ","M8N9FIZI ","M8N9FMGXI", & - "M8N9FMGYI","M8N9FMGZI","M8N9MAFXI","M8N9MAFYI","M8N9MAFZI","M8N9MAGXI","M8N9MAGYI", & - "M8N9MAGZI","M8N9MBFXI","M8N9MBFYI","M8N9MBFZI","M8N9MBXI ","M8N9MBYI ","M8N9MBZI ", & - "M8N9MMGXI","M8N9MMGYI","M8N9MMGZI","M8N9STAXI","M8N9STAYI","M8N9STAZI","M8N9STVXI", & - "M8N9STVYI","M8N9STVZI","M8N9VXI ","M8N9VYI ","M8N9VZI ","M9N1AXI ","M9N1AYI ", & - "M9N1AZI ","M9N1DYNP ","M9N1FAFXI","M9N1FAFYI","M9N1FAFZI","M9N1FAGXI","M9N1FAGYI", & - "M9N1FAGZI","M9N1FAMXI","M9N1FAMYI","M9N1FAMZI","M9N1FBFXI","M9N1FBFYI","M9N1FBFZI", & - "M9N1FBXI ","M9N1FBYI ","M9N1FBZI ","M9N1FDXI ","M9N1FDYI ","M9N1FDZI ","M9N1FIXI ", & - "M9N1FIYI ","M9N1FIZI ","M9N1FMGXI","M9N1FMGYI","M9N1FMGZI","M9N1MAFXI","M9N1MAFYI", & - "M9N1MAFZI","M9N1MAGXI","M9N1MAGYI","M9N1MAGZI","M9N1MBFXI","M9N1MBFYI","M9N1MBFZI", & - "M9N1MBXI ","M9N1MBYI ","M9N1MBZI ","M9N1MMGXI","M9N1MMGYI","M9N1MMGZI","M9N1STAXI", & - "M9N1STAYI","M9N1STAZI","M9N1STVXI","M9N1STVYI","M9N1STVZI","M9N1VXI ","M9N1VYI ", & - "M9N1VZI ","M9N2AXI ","M9N2AYI ","M9N2AZI ","M9N2DYNP ","M9N2FAFXI","M9N2FAFYI", & - "M9N2FAFZI","M9N2FAGXI","M9N2FAGYI","M9N2FAGZI","M9N2FAMXI","M9N2FAMYI","M9N2FAMZI", & - "M9N2FBFXI","M9N2FBFYI","M9N2FBFZI","M9N2FBXI ","M9N2FBYI ","M9N2FBZI ","M9N2FDXI ", & - "M9N2FDYI ","M9N2FDZI ","M9N2FIXI ","M9N2FIYI ","M9N2FIZI ","M9N2FMGXI","M9N2FMGYI", & - "M9N2FMGZI","M9N2MAFXI","M9N2MAFYI","M9N2MAFZI","M9N2MAGXI","M9N2MAGYI","M9N2MAGZI", & - "M9N2MBFXI","M9N2MBFYI","M9N2MBFZI","M9N2MBXI ","M9N2MBYI ","M9N2MBZI ","M9N2MMGXI", & - "M9N2MMGYI","M9N2MMGZI","M9N2STAXI","M9N2STAYI","M9N2STAZI","M9N2STVXI","M9N2STVYI", & - "M9N2STVZI","M9N2VXI ","M9N2VYI ","M9N2VZI ","M9N3AXI ","M9N3AYI ","M9N3AZI ", & - "M9N3DYNP ","M9N3FAFXI","M9N3FAFYI","M9N3FAFZI","M9N3FAGXI","M9N3FAGYI","M9N3FAGZI", & - "M9N3FAMXI","M9N3FAMYI","M9N3FAMZI","M9N3FBFXI","M9N3FBFYI","M9N3FBFZI","M9N3FBXI ", & - "M9N3FBYI ","M9N3FBZI ","M9N3FDXI ","M9N3FDYI ","M9N3FDZI ","M9N3FIXI ","M9N3FIYI ", & - "M9N3FIZI ","M9N3FMGXI","M9N3FMGYI","M9N3FMGZI","M9N3MAFXI","M9N3MAFYI","M9N3MAFZI", & - "M9N3MAGXI","M9N3MAGYI","M9N3MAGZI","M9N3MBFXI","M9N3MBFYI","M9N3MBFZI","M9N3MBXI ", & - "M9N3MBYI ","M9N3MBZI ","M9N3MMGXI","M9N3MMGYI","M9N3MMGZI","M9N3STAXI","M9N3STAYI", & - "M9N3STAZI","M9N3STVXI","M9N3STVYI","M9N3STVZI","M9N3VXI ","M9N3VYI ","M9N3VZI ", & - "M9N4AXI ","M9N4AYI ","M9N4AZI ","M9N4DYNP ","M9N4FAFXI","M9N4FAFYI","M9N4FAFZI", & - "M9N4FAGXI","M9N4FAGYI","M9N4FAGZI","M9N4FAMXI","M9N4FAMYI","M9N4FAMZI","M9N4FBFXI", & - "M9N4FBFYI","M9N4FBFZI","M9N4FBXI ","M9N4FBYI ","M9N4FBZI ","M9N4FDXI ","M9N4FDYI ", & - "M9N4FDZI ","M9N4FIXI ","M9N4FIYI ","M9N4FIZI ","M9N4FMGXI","M9N4FMGYI","M9N4FMGZI", & - "M9N4MAFXI","M9N4MAFYI","M9N4MAFZI","M9N4MAGXI","M9N4MAGYI","M9N4MAGZI","M9N4MBFXI", & - "M9N4MBFYI","M9N4MBFZI","M9N4MBXI ","M9N4MBYI ","M9N4MBZI ","M9N4MMGXI","M9N4MMGYI", & - "M9N4MMGZI","M9N4STAXI","M9N4STAYI","M9N4STAZI","M9N4STVXI","M9N4STVYI","M9N4STVZI", & - "M9N4VXI ","M9N4VYI ","M9N4VZI ","M9N5AXI ","M9N5AYI ","M9N5AZI ","M9N5DYNP ", & - "M9N5FAFXI","M9N5FAFYI","M9N5FAFZI","M9N5FAGXI","M9N5FAGYI","M9N5FAGZI","M9N5FAMXI", & - "M9N5FAMYI","M9N5FAMZI","M9N5FBFXI","M9N5FBFYI","M9N5FBFZI","M9N5FBXI ","M9N5FBYI ", & - "M9N5FBZI ","M9N5FDXI ","M9N5FDYI ","M9N5FDZI ","M9N5FIXI ","M9N5FIYI ","M9N5FIZI ", & - "M9N5FMGXI","M9N5FMGYI","M9N5FMGZI","M9N5MAFXI","M9N5MAFYI","M9N5MAFZI","M9N5MAGXI", & - "M9N5MAGYI","M9N5MAGZI","M9N5MBFXI","M9N5MBFYI","M9N5MBFZI","M9N5MBXI ","M9N5MBYI ", & - "M9N5MBZI ","M9N5MMGXI","M9N5MMGYI","M9N5MMGZI","M9N5STAXI","M9N5STAYI","M9N5STAZI", & - "M9N5STVXI","M9N5STVYI","M9N5STVZI","M9N5VXI ","M9N5VYI ","M9N5VZI ","M9N6AXI ", & - "M9N6AYI ","M9N6AZI ","M9N6DYNP ","M9N6FAFXI","M9N6FAFYI","M9N6FAFZI","M9N6FAGXI", & - "M9N6FAGYI","M9N6FAGZI","M9N6FAMXI","M9N6FAMYI","M9N6FAMZI","M9N6FBFXI","M9N6FBFYI", & - "M9N6FBFZI","M9N6FBXI ","M9N6FBYI ","M9N6FBZI ","M9N6FDXI ","M9N6FDYI ","M9N6FDZI ", & - "M9N6FIXI ","M9N6FIYI ","M9N6FIZI ","M9N6FMGXI","M9N6FMGYI","M9N6FMGZI","M9N6MAFXI", & - "M9N6MAFYI","M9N6MAFZI","M9N6MAGXI","M9N6MAGYI","M9N6MAGZI","M9N6MBFXI","M9N6MBFYI", & - "M9N6MBFZI","M9N6MBXI ","M9N6MBYI ","M9N6MBZI ","M9N6MMGXI","M9N6MMGYI","M9N6MMGZI", & - "M9N6STAXI","M9N6STAYI","M9N6STAZI","M9N6STVXI","M9N6STVYI","M9N6STVZI","M9N6VXI ", & - "M9N6VYI ","M9N6VZI ","M9N7AXI ","M9N7AYI ","M9N7AZI ","M9N7DYNP ","M9N7FAFXI", & - "M9N7FAFYI","M9N7FAFZI","M9N7FAGXI","M9N7FAGYI","M9N7FAGZI","M9N7FAMXI","M9N7FAMYI", & - "M9N7FAMZI","M9N7FBFXI","M9N7FBFYI","M9N7FBFZI","M9N7FBXI ","M9N7FBYI ","M9N7FBZI ", & - "M9N7FDXI ","M9N7FDYI ","M9N7FDZI ","M9N7FIXI ","M9N7FIYI ","M9N7FIZI ","M9N7FMGXI", & - "M9N7FMGYI","M9N7FMGZI","M9N7MAFXI","M9N7MAFYI","M9N7MAFZI","M9N7MAGXI","M9N7MAGYI", & - "M9N7MAGZI","M9N7MBFXI","M9N7MBFYI","M9N7MBFZI","M9N7MBXI ","M9N7MBYI ","M9N7MBZI ", & - "M9N7MMGXI","M9N7MMGYI","M9N7MMGZI","M9N7STAXI","M9N7STAYI","M9N7STAZI","M9N7STVXI", & - "M9N7STVYI","M9N7STVZI","M9N7VXI ","M9N7VYI ","M9N7VZI ","M9N8AXI ","M9N8AYI ", & - "M9N8AZI ","M9N8DYNP ","M9N8FAFXI"/) - ValidParamAry(4501:4599) = (/ & - "M9N8FAFYI","M9N8FAFZI","M9N8FAGXI","M9N8FAGYI","M9N8FAGZI","M9N8FAMXI","M9N8FAMYI", & - "M9N8FAMZI","M9N8FBFXI","M9N8FBFYI","M9N8FBFZI","M9N8FBXI ","M9N8FBYI ","M9N8FBZI ", & - "M9N8FDXI ","M9N8FDYI ","M9N8FDZI ","M9N8FIXI ","M9N8FIYI ","M9N8FIZI ","M9N8FMGXI", & - "M9N8FMGYI","M9N8FMGZI","M9N8MAFXI","M9N8MAFYI","M9N8MAFZI","M9N8MAGXI","M9N8MAGYI", & - "M9N8MAGZI","M9N8MBFXI","M9N8MBFYI","M9N8MBFZI","M9N8MBXI ","M9N8MBYI ","M9N8MBZI ", & - "M9N8MMGXI","M9N8MMGYI","M9N8MMGZI","M9N8STAXI","M9N8STAYI","M9N8STAZI","M9N8STVXI", & - "M9N8STVYI","M9N8STVZI","M9N8VXI ","M9N8VYI ","M9N8VZI ","M9N9AXI ","M9N9AYI ", & - "M9N9AZI ","M9N9DYNP ","M9N9FAFXI","M9N9FAFYI","M9N9FAFZI","M9N9FAGXI","M9N9FAGYI", & - "M9N9FAGZI","M9N9FAMXI","M9N9FAMYI","M9N9FAMZI","M9N9FBFXI","M9N9FBFYI","M9N9FBFZI", & - "M9N9FBXI ","M9N9FBYI ","M9N9FBZI ","M9N9FDXI ","M9N9FDYI ","M9N9FDZI ","M9N9FIXI ", & - "M9N9FIYI ","M9N9FIZI ","M9N9FMGXI","M9N9FMGYI","M9N9FMGZI","M9N9MAFXI","M9N9MAFYI", & - "M9N9MAFZI","M9N9MAGXI","M9N9MAGYI","M9N9MAGZI","M9N9MBFXI","M9N9MBFYI","M9N9MBFZI", & - "M9N9MBXI ","M9N9MBYI ","M9N9MBZI ","M9N9MMGXI","M9N9MMGYI","M9N9MMGZI","M9N9STAXI", & - "M9N9STAYI","M9N9STAZI","M9N9STVXI","M9N9STVYI","M9N9STVZI","M9N9VXI ","M9N9VYI ", & - "M9N9VZI "/) - ParamIndxAry(1:500) = (/ & - J1Axi , J1Ayi , J1Azi , J1DynP , J1FAGxi , J1FAGyi , J1FAGzi , & - J1FAMxi , J1FAMyi , J1FAMzi , J1FBFxi , J1FBFyi , J1FBFzi , J1FBxi , & - J1FByi , J1FBzi , J1FDxi , J1FDyi , J1FDzi , J1FIxi , J1FIyi , & - J1FIzi , J1FMGxi , J1FMGyi , J1FMGzi , J1MAGxi , J1MAGyi , J1MAGzi , & - J1MBFxi , J1MBFyi , J1MBFzi , J1MBxi , J1MByi , J1MBzi , J1STAxi , & - J1STAyi , J1STAzi , J1STVxi , J1STVyi , J1STVzi , J1Vxi , J1Vyi , & - J1Vzi , J2Axi , J2Ayi , J2Azi , J2DynP , J2FAGxi , J2FAGyi , & - J2FAGzi , J2FAMxi , J2FAMyi , J2FAMzi , J2FBFxi , J2FBFyi , J2FBFzi , & - J2FBxi , J2FByi , J2FBzi , J2FDxi , J2FDyi , J2FDzi , J2FIxi , & - J2FIyi , J2FIzi , J2FMGxi , J2FMGyi , J2FMGzi , J2MAGxi , J2MAGyi , & - J2MAGzi , J2MBFxi , J2MBFyi , J2MBFzi , J2MBxi , J2MByi , J2MBzi , & - J2STAxi , J2STAyi , J2STAzi , J2STVxi , J2STVyi , J2STVzi , J2Vxi , & - J2Vyi , J2Vzi , J3Axi , J3Ayi , J3Azi , J3DynP , J3FAGxi , & - J3FAGyi , J3FAGzi , J3FAMxi , J3FAMyi , J3FAMzi , J3FBFxi , J3FBFyi , & - J3FBFzi , J3FBxi , J3FByi , J3FBzi , J3FDxi , J3FDyi , J3FDzi , & - J3FIxi , J3FIyi , J3FIzi , J3FMGxi , J3FMGyi , J3FMGzi , J3MAGxi , & - J3MAGyi , J3MAGzi , J3MBFxi , J3MBFyi , J3MBFzi , J3MBxi , J3MByi , & - J3MBzi , J3STAxi , J3STAyi , J3STAzi , J3STVxi , J3STVyi , J3STVzi , & - J3Vxi , J3Vyi , J3Vzi , J4Axi , J4Ayi , J4Azi , J4DynP , & - J4FAGxi , J4FAGyi , J4FAGzi , J4FAMxi , J4FAMyi , J4FAMzi , J4FBFxi , & - J4FBFyi , J4FBFzi , J4FBxi , J4FByi , J4FBzi , J4FDxi , J4FDyi , & - J4FDzi , J4FIxi , J4FIyi , J4FIzi , J4FMGxi , J4FMGyi , J4FMGzi , & - J4MAGxi , J4MAGyi , J4MAGzi , J4MBFxi , J4MBFyi , J4MBFzi , J4MBxi , & - J4MByi , J4MBzi , J4STAxi , J4STAyi , J4STAzi , J4STVxi , J4STVyi , & - J4STVzi , J4Vxi , J4Vyi , J4Vzi , J5Axi , J5Ayi , J5Azi , & - J5DynP , J5FAGxi , J5FAGyi , J5FAGzi , J5FAMxi , J5FAMyi , J5FAMzi , & - J5FBFxi , J5FBFyi , J5FBFzi , J5FBxi , J5FByi , J5FBzi , J5FDxi , & - J5FDyi , J5FDzi , J5FIxi , J5FIyi , J5FIzi , J5FMGxi , J5FMGyi , & - J5FMGzi , J5MAGxi , J5MAGyi , J5MAGzi , J5MBFxi , J5MBFyi , J5MBFzi , & - J5MBxi , J5MByi , J5MBzi , J5STAxi , J5STAyi , J5STAzi , J5STVxi , & - J5STVyi , J5STVzi , J5Vxi , J5Vyi , J5Vzi , J6Axi , J6Ayi , & - J6Azi , J6DynP , J6FAGxi , J6FAGyi , J6FAGzi , J6FAMxi , J6FAMyi , & - J6FAMzi , J6FBFxi , J6FBFyi , J6FBFzi , J6FBxi , J6FByi , J6FBzi , & - J6FDxi , J6FDyi , J6FDzi , J6FIxi , J6FIyi , J6FIzi , J6FMGxi , & - J6FMGyi , J6FMGzi , J6MAGxi , J6MAGyi , J6MAGzi , J6MBFxi , J6MBFyi , & - J6MBFzi , J6MBxi , J6MByi , J6MBzi , J6STAxi , J6STAyi , J6STAzi , & - J6STVxi , J6STVyi , J6STVzi , J6Vxi , J6Vyi , J6Vzi , J7Axi , & - J7Ayi , J7Azi , J7DynP , J7FAGxi , J7FAGyi , J7FAGzi , J7FAMxi , & - J7FAMyi , J7FAMzi , J7FBFxi , J7FBFyi , J7FBFzi , J7FBxi , J7FByi , & - J7FBzi , J7FDxi , J7FDyi , J7FDzi , J7FIxi , J7FIyi , J7FIzi , & - J7FMGxi , J7FMGyi , J7FMGzi , J7MAGxi , J7MAGyi , J7MAGzi , J7MBFxi , & - J7MBFyi , J7MBFzi , J7MBxi , J7MByi , J7MBzi , J7STAxi , J7STAyi , & - J7STAzi , J7STVxi , J7STVyi , J7STVzi , J7Vxi , J7Vyi , J7Vzi , & - J8Axi , J8Ayi , J8Azi , J8DynP , J8FAGxi , J8FAGyi , J8FAGzi , & - J8FAMxi , J8FAMyi , J8FAMzi , J8FBFxi , J8FBFyi , J8FBFzi , J8FBxi , & - J8FByi , J8FBzi , J8FDxi , J8FDyi , J8FDzi , J8FIxi , J8FIyi , & - J8FIzi , J8FMGxi , J8FMGyi , J8FMGzi , J8MAGxi , J8MAGyi , J8MAGzi , & - J8MBFxi , J8MBFyi , J8MBFzi , J8MBxi , J8MByi , J8MBzi , J8STAxi , & - J8STAyi , J8STAzi , J8STVxi , J8STVyi , J8STVzi , J8Vxi , J8Vyi , & - J8Vzi , J9Axi , J9Ayi , J9Azi , J9DynP , J9FAGxi , J9FAGyi , & - J9FAGzi , J9FAMxi , J9FAMyi , J9FAMzi , J9FBFxi , J9FBFyi , J9FBFzi , & - J9FBxi , J9FByi , J9FBzi , J9FDxi , J9FDyi , J9FDzi , J9FIxi , & - J9FIyi , J9FIzi , J9FMGxi , J9FMGyi , J9FMGzi , J9MAGxi , J9MAGyi , & - J9MAGzi , J9MBFxi , J9MBFyi , J9MBFzi , J9MBxi , J9MByi , J9MBzi , & - J9STAxi , J9STAyi , J9STAzi , J9STVxi , J9STVyi , J9STVzi , J9Vxi , & - J9Vyi , J9Vzi , M1N1Axi , M1N1Ayi , M1N1Azi , M1N1DynP , M1N1FAFxi , & - M1N1FAFyi , M1N1FAFzi , M1N1FAGxi , M1N1FAGyi , M1N1FAGzi , M1N1FAMxi , M1N1FAMyi , & - M1N1FAMzi , M1N1FBFxi , M1N1FBFyi , M1N1FBFzi , M1N1FBxi , M1N1FByi , M1N1FBzi , & - M1N1FDxi , M1N1FDyi , M1N1FDzi , M1N1FIxi , M1N1FIyi , M1N1FIzi , M1N1FMGxi , & - M1N1FMGyi , M1N1FMGzi , M1N1MAFxi , M1N1MAFyi , M1N1MAFzi , M1N1MAGxi , M1N1MAGyi , & - M1N1MAGzi , M1N1MBFxi , M1N1MBFyi , M1N1MBFzi , M1N1MBxi , M1N1MByi , M1N1MBzi , & - M1N1MMGxi , M1N1MMGyi , M1N1MMGzi , M1N1STAxi , M1N1STAyi , M1N1STAzi , M1N1STVxi , & - M1N1STVyi , M1N1STVzi , M1N1Vxi , M1N1Vyi , M1N1Vzi , M1N2Axi , M1N2Ayi , & - M1N2Azi , M1N2DynP , M1N2FAFxi , M1N2FAFyi , M1N2FAFzi , M1N2FAGxi , M1N2FAGyi , & - M1N2FAGzi , M1N2FAMxi , M1N2FAMyi , M1N2FAMzi , M1N2FBFxi , M1N2FBFyi , M1N2FBFzi , & - M1N2FBxi , M1N2FByi , M1N2FBzi , M1N2FDxi , M1N2FDyi , M1N2FDzi , M1N2FIxi , & - M1N2FIyi , M1N2FIzi , M1N2FMGxi , M1N2FMGyi , M1N2FMGzi , M1N2MAFxi , M1N2MAFyi , & - M1N2MAFzi , M1N2MAGxi , M1N2MAGyi , M1N2MAGzi , M1N2MBFxi , M1N2MBFyi , M1N2MBFzi , & - M1N2MBxi , M1N2MByi , M1N2MBzi , M1N2MMGxi , M1N2MMGyi , M1N2MMGzi , M1N2STAxi , & - M1N2STAyi , M1N2STAzi , M1N2STVxi , M1N2STVyi , M1N2STVzi , M1N2Vxi , M1N2Vyi , & - M1N2Vzi , M1N3Axi , M1N3Ayi , M1N3Azi , M1N3DynP , M1N3FAFxi , M1N3FAFyi , & - M1N3FAFzi , M1N3FAGxi , M1N3FAGyi /) - ParamIndxAry(501:1000) = (/ & - M1N3FAGzi , M1N3FAMxi , M1N3FAMyi , M1N3FAMzi , M1N3FBFxi , M1N3FBFyi , M1N3FBFzi , & - M1N3FBxi , M1N3FByi , M1N3FBzi , M1N3FDxi , M1N3FDyi , M1N3FDzi , M1N3FIxi , & - M1N3FIyi , M1N3FIzi , M1N3FMGxi , M1N3FMGyi , M1N3FMGzi , M1N3MAFxi , M1N3MAFyi , & - M1N3MAFzi , M1N3MAGxi , M1N3MAGyi , M1N3MAGzi , M1N3MBFxi , M1N3MBFyi , M1N3MBFzi , & - M1N3MBxi , M1N3MByi , M1N3MBzi , M1N3MMGxi , M1N3MMGyi , M1N3MMGzi , M1N3STAxi , & - M1N3STAyi , M1N3STAzi , M1N3STVxi , M1N3STVyi , M1N3STVzi , M1N3Vxi , M1N3Vyi , & - M1N3Vzi , M1N4Axi , M1N4Ayi , M1N4Azi , M1N4DynP , M1N4FAFxi , M1N4FAFyi , & - M1N4FAFzi , M1N4FAGxi , M1N4FAGyi , M1N4FAGzi , M1N4FAMxi , M1N4FAMyi , M1N4FAMzi , & - M1N4FBFxi , M1N4FBFyi , M1N4FBFzi , M1N4FBxi , M1N4FByi , M1N4FBzi , M1N4FDxi , & - M1N4FDyi , M1N4FDzi , M1N4FIxi , M1N4FIyi , M1N4FIzi , M1N4FMGxi , M1N4FMGyi , & - M1N4FMGzi , M1N4MAFxi , M1N4MAFyi , M1N4MAFzi , M1N4MAGxi , M1N4MAGyi , M1N4MAGzi , & - M1N4MBFxi , M1N4MBFyi , M1N4MBFzi , M1N4MBxi , M1N4MByi , M1N4MBzi , M1N4MMGxi , & - M1N4MMGyi , M1N4MMGzi , M1N4STAxi , M1N4STAyi , M1N4STAzi , M1N4STVxi , M1N4STVyi , & - M1N4STVzi , M1N4Vxi , M1N4Vyi , M1N4Vzi , M1N5Axi , M1N5Ayi , M1N5Azi , & - M1N5DynP , M1N5FAFxi , M1N5FAFyi , M1N5FAFzi , M1N5FAGxi , M1N5FAGyi , M1N5FAGzi , & - M1N5FAMxi , M1N5FAMyi , M1N5FAMzi , M1N5FBFxi , M1N5FBFyi , M1N5FBFzi , M1N5FBxi , & - M1N5FByi , M1N5FBzi , M1N5FDxi , M1N5FDyi , M1N5FDzi , M1N5FIxi , M1N5FIyi , & - M1N5FIzi , M1N5FMGxi , M1N5FMGyi , M1N5FMGzi , M1N5MAFxi , M1N5MAFyi , M1N5MAFzi , & - M1N5MAGxi , M1N5MAGyi , M1N5MAGzi , M1N5MBFxi , M1N5MBFyi , M1N5MBFzi , M1N5MBxi , & - M1N5MByi , M1N5MBzi , M1N5MMGxi , M1N5MMGyi , M1N5MMGzi , M1N5STAxi , M1N5STAyi , & - M1N5STAzi , M1N5STVxi , M1N5STVyi , M1N5STVzi , M1N5Vxi , M1N5Vyi , M1N5Vzi , & - M1N6Axi , M1N6Ayi , M1N6Azi , M1N6DynP , M1N6FAFxi , M1N6FAFyi , M1N6FAFzi , & - M1N6FAGxi , M1N6FAGyi , M1N6FAGzi , M1N6FAMxi , M1N6FAMyi , M1N6FAMzi , M1N6FBFxi , & - M1N6FBFyi , M1N6FBFzi , M1N6FBxi , M1N6FByi , M1N6FBzi , M1N6FDxi , M1N6FDyi , & - M1N6FDzi , M1N6FIxi , M1N6FIyi , M1N6FIzi , M1N6FMGxi , M1N6FMGyi , M1N6FMGzi , & - M1N6MAFxi , M1N6MAFyi , M1N6MAFzi , M1N6MAGxi , M1N6MAGyi , M1N6MAGzi , M1N6MBFxi , & - M1N6MBFyi , M1N6MBFzi , M1N6MBxi , M1N6MByi , M1N6MBzi , M1N6MMGxi , M1N6MMGyi , & - M1N6MMGzi , M1N6STAxi , M1N6STAyi , M1N6STAzi , M1N6STVxi , M1N6STVyi , M1N6STVzi , & - M1N6Vxi , M1N6Vyi , M1N6Vzi , M1N7Axi , M1N7Ayi , M1N7Azi , M1N7DynP , & - M1N7FAFxi , M1N7FAFyi , M1N7FAFzi , M1N7FAGxi , M1N7FAGyi , M1N7FAGzi , M1N7FAMxi , & - M1N7FAMyi , M1N7FAMzi , M1N7FBFxi , M1N7FBFyi , M1N7FBFzi , M1N7FBxi , M1N7FByi , & - M1N7FBzi , M1N7FDxi , M1N7FDyi , M1N7FDzi , M1N7FIxi , M1N7FIyi , M1N7FIzi , & - M1N7FMGxi , M1N7FMGyi , M1N7FMGzi , M1N7MAFxi , M1N7MAFyi , M1N7MAFzi , M1N7MAGxi , & - M1N7MAGyi , M1N7MAGzi , M1N7MBFxi , M1N7MBFyi , M1N7MBFzi , M1N7MBxi , M1N7MByi , & - M1N7MBzi , M1N7MMGxi , M1N7MMGyi , M1N7MMGzi , M1N7STAxi , M1N7STAyi , M1N7STAzi , & - M1N7STVxi , M1N7STVyi , M1N7STVzi , M1N7Vxi , M1N7Vyi , M1N7Vzi , M1N8Axi , & - M1N8Ayi , M1N8Azi , M1N8DynP , M1N8FAFxi , M1N8FAFyi , M1N8FAFzi , M1N8FAGxi , & - M1N8FAGyi , M1N8FAGzi , M1N8FAMxi , M1N8FAMyi , M1N8FAMzi , M1N8FBFxi , M1N8FBFyi , & - M1N8FBFzi , M1N8FBxi , M1N8FByi , M1N8FBzi , M1N8FDxi , M1N8FDyi , M1N8FDzi , & - M1N8FIxi , M1N8FIyi , M1N8FIzi , M1N8FMGxi , M1N8FMGyi , M1N8FMGzi , M1N8MAFxi , & - M1N8MAFyi , M1N8MAFzi , M1N8MAGxi , M1N8MAGyi , M1N8MAGzi , M1N8MBFxi , M1N8MBFyi , & - M1N8MBFzi , M1N8MBxi , M1N8MByi , M1N8MBzi , M1N8MMGxi , M1N8MMGyi , M1N8MMGzi , & - M1N8STAxi , M1N8STAyi , M1N8STAzi , M1N8STVxi , M1N8STVyi , M1N8STVzi , M1N8Vxi , & - M1N8Vyi , M1N8Vzi , M1N9Axi , M1N9Ayi , M1N9Azi , M1N9DynP , M1N9FAFxi , & - M1N9FAFyi , M1N9FAFzi , M1N9FAGxi , M1N9FAGyi , M1N9FAGzi , M1N9FAMxi , M1N9FAMyi , & - M1N9FAMzi , M1N9FBFxi , M1N9FBFyi , M1N9FBFzi , M1N9FBxi , M1N9FByi , M1N9FBzi , & - M1N9FDxi , M1N9FDyi , M1N9FDzi , M1N9FIxi , M1N9FIyi , M1N9FIzi , M1N9FMGxi , & - M1N9FMGyi , M1N9FMGzi , M1N9MAFxi , M1N9MAFyi , M1N9MAFzi , M1N9MAGxi , M1N9MAGyi , & - M1N9MAGzi , M1N9MBFxi , M1N9MBFyi , M1N9MBFzi , M1N9MBxi , M1N9MByi , M1N9MBzi , & - M1N9MMGxi , M1N9MMGyi , M1N9MMGzi , M1N9STAxi , M1N9STAyi , M1N9STAzi , M1N9STVxi , & - M1N9STVyi , M1N9STVzi , M1N9Vxi , M1N9Vyi , M1N9Vzi , M2N1Axi , M2N1Ayi , & - M2N1Azi , M2N1DynP , M2N1FAFxi , M2N1FAFyi , M2N1FAFzi , M2N1FAGxi , M2N1FAGyi , & - M2N1FAGzi , M2N1FAMxi , M2N1FAMyi , M2N1FAMzi , M2N1FBFxi , M2N1FBFyi , M2N1FBFzi , & - M2N1FBxi , M2N1FByi , M2N1FBzi , M2N1FDxi , M2N1FDyi , M2N1FDzi , M2N1FIxi , & - M2N1FIyi , M2N1FIzi , M2N1FMGxi , M2N1FMGyi , M2N1FMGzi , M2N1MAFxi , M2N1MAFyi , & - M2N1MAFzi , M2N1MAGxi , M2N1MAGyi , M2N1MAGzi , M2N1MBFxi , M2N1MBFyi , M2N1MBFzi , & - M2N1MBxi , M2N1MByi , M2N1MBzi , M2N1MMGxi , M2N1MMGyi , M2N1MMGzi , M2N1STAxi , & - M2N1STAyi , M2N1STAzi , M2N1STVxi , M2N1STVyi , M2N1STVzi , M2N1Vxi , M2N1Vyi , & - M2N1Vzi , M2N2Axi , M2N2Ayi , M2N2Azi , M2N2DynP , M2N2FAFxi , M2N2FAFyi , & - M2N2FAFzi , M2N2FAGxi , M2N2FAGyi , M2N2FAGzi , M2N2FAMxi , M2N2FAMyi , M2N2FAMzi , & - M2N2FBFxi , M2N2FBFyi , M2N2FBFzi , M2N2FBxi , M2N2FByi , M2N2FBzi , M2N2FDxi , & - M2N2FDyi , M2N2FDzi , M2N2FIxi , M2N2FIyi , M2N2FIzi , M2N2FMGxi , M2N2FMGyi , & - M2N2FMGzi , M2N2MAFxi , M2N2MAFyi , M2N2MAFzi , M2N2MAGxi , M2N2MAGyi , M2N2MAGzi , & - M2N2MBFxi , M2N2MBFyi , M2N2MBFzi , M2N2MBxi , M2N2MByi , M2N2MBzi , M2N2MMGxi , & - M2N2MMGyi , M2N2MMGzi , M2N2STAxi , M2N2STAyi , M2N2STAzi , M2N2STVxi , M2N2STVyi , & - M2N2STVzi , M2N2Vxi , M2N2Vyi , M2N2Vzi , M2N3Axi , M2N3Ayi , M2N3Azi , & - M2N3DynP , M2N3FAFxi , M2N3FAFyi , M2N3FAFzi , M2N3FAGxi , M2N3FAGyi , M2N3FAGzi , & - M2N3FAMxi , M2N3FAMyi , M2N3FAMzi , M2N3FBFxi , M2N3FBFyi , M2N3FBFzi , M2N3FBxi , & - M2N3FByi , M2N3FBzi , M2N3FDxi , M2N3FDyi , M2N3FDzi , M2N3FIxi , M2N3FIyi , & - M2N3FIzi , M2N3FMGxi , M2N3FMGyi , M2N3FMGzi , M2N3MAFxi , M2N3MAFyi , M2N3MAFzi , & - M2N3MAGxi , M2N3MAGyi , M2N3MAGzi , M2N3MBFxi , M2N3MBFyi , M2N3MBFzi , M2N3MBxi , & - M2N3MByi , M2N3MBzi , M2N3MMGxi /) - ParamIndxAry(1001:1500) = (/ & - M2N3MMGyi , M2N3MMGzi , M2N3STAxi , M2N3STAyi , M2N3STAzi , M2N3STVxi , M2N3STVyi , & - M2N3STVzi , M2N3Vxi , M2N3Vyi , M2N3Vzi , M2N4Axi , M2N4Ayi , M2N4Azi , & - M2N4DynP , M2N4FAFxi , M2N4FAFyi , M2N4FAFzi , M2N4FAGxi , M2N4FAGyi , M2N4FAGzi , & - M2N4FAMxi , M2N4FAMyi , M2N4FAMzi , M2N4FBFxi , M2N4FBFyi , M2N4FBFzi , M2N4FBxi , & - M2N4FByi , M2N4FBzi , M2N4FDxi , M2N4FDyi , M2N4FDzi , M2N4FIxi , M2N4FIyi , & - M2N4FIzi , M2N4FMGxi , M2N4FMGyi , M2N4FMGzi , M2N4MAFxi , M2N4MAFyi , M2N4MAFzi , & - M2N4MAGxi , M2N4MAGyi , M2N4MAGzi , M2N4MBFxi , M2N4MBFyi , M2N4MBFzi , M2N4MBxi , & - M2N4MByi , M2N4MBzi , M2N4MMGxi , M2N4MMGyi , M2N4MMGzi , M2N4STAxi , M2N4STAyi , & - M2N4STAzi , M2N4STVxi , M2N4STVyi , M2N4STVzi , M2N4Vxi , M2N4Vyi , M2N4Vzi , & - M2N5Axi , M2N5Ayi , M2N5Azi , M2N5DynP , M2N5FAFxi , M2N5FAFyi , M2N5FAFzi , & - M2N5FAGxi , M2N5FAGyi , M2N5FAGzi , M2N5FAMxi , M2N5FAMyi , M2N5FAMzi , M2N5FBFxi , & - M2N5FBFyi , M2N5FBFzi , M2N5FBxi , M2N5FByi , M2N5FBzi , M2N5FDxi , M2N5FDyi , & - M2N5FDzi , M2N5FIxi , M2N5FIyi , M2N5FIzi , M2N5FMGxi , M2N5FMGyi , M2N5FMGzi , & - M2N5MAFxi , M2N5MAFyi , M2N5MAFzi , M2N5MAGxi , M2N5MAGyi , M2N5MAGzi , M2N5MBFxi , & - M2N5MBFyi , M2N5MBFzi , M2N5MBxi , M2N5MByi , M2N5MBzi , M2N5MMGxi , M2N5MMGyi , & - M2N5MMGzi , M2N5STAxi , M2N5STAyi , M2N5STAzi , M2N5STVxi , M2N5STVyi , M2N5STVzi , & - M2N5Vxi , M2N5Vyi , M2N5Vzi , M2N6Axi , M2N6Ayi , M2N6Azi , M2N6DynP , & - M2N6FAFxi , M2N6FAFyi , M2N6FAFzi , M2N6FAGxi , M2N6FAGyi , M2N6FAGzi , M2N6FAMxi , & - M2N6FAMyi , M2N6FAMzi , M2N6FBFxi , M2N6FBFyi , M2N6FBFzi , M2N6FBxi , M2N6FByi , & - M2N6FBzi , M2N6FDxi , M2N6FDyi , M2N6FDzi , M2N6FIxi , M2N6FIyi , M2N6FIzi , & - M2N6FMGxi , M2N6FMGyi , M2N6FMGzi , M2N6MAFxi , M2N6MAFyi , M2N6MAFzi , M2N6MAGxi , & - M2N6MAGyi , M2N6MAGzi , M2N6MBFxi , M2N6MBFyi , M2N6MBFzi , M2N6MBxi , M2N6MByi , & - M2N6MBzi , M2N6MMGxi , M2N6MMGyi , M2N6MMGzi , M2N6STAxi , M2N6STAyi , M2N6STAzi , & - M2N6STVxi , M2N6STVyi , M2N6STVzi , M2N6Vxi , M2N6Vyi , M2N6Vzi , M2N7Axi , & - M2N7Ayi , M2N7Azi , M2N7DynP , M2N7FAFxi , M2N7FAFyi , M2N7FAFzi , M2N7FAGxi , & - M2N7FAGyi , M2N7FAGzi , M2N7FAMxi , M2N7FAMyi , M2N7FAMzi , M2N7FBFxi , M2N7FBFyi , & - M2N7FBFzi , M2N7FBxi , M2N7FByi , M2N7FBzi , M2N7FDxi , M2N7FDyi , M2N7FDzi , & - M2N7FIxi , M2N7FIyi , M2N7FIzi , M2N7FMGxi , M2N7FMGyi , M2N7FMGzi , M2N7MAFxi , & - M2N7MAFyi , M2N7MAFzi , M2N7MAGxi , M2N7MAGyi , M2N7MAGzi , M2N7MBFxi , M2N7MBFyi , & - M2N7MBFzi , M2N7MBxi , M2N7MByi , M2N7MBzi , M2N7MMGxi , M2N7MMGyi , M2N7MMGzi , & - M2N7STAxi , M2N7STAyi , M2N7STAzi , M2N7STVxi , M2N7STVyi , M2N7STVzi , M2N7Vxi , & - M2N7Vyi , M2N7Vzi , M2N8Axi , M2N8Ayi , M2N8Azi , M2N8DynP , M2N8FAFxi , & - M2N8FAFyi , M2N8FAFzi , M2N8FAGxi , M2N8FAGyi , M2N8FAGzi , M2N8FAMxi , M2N8FAMyi , & - M2N8FAMzi , M2N8FBFxi , M2N8FBFyi , M2N8FBFzi , M2N8FBxi , M2N8FByi , M2N8FBzi , & - M2N8FDxi , M2N8FDyi , M2N8FDzi , M2N8FIxi , M2N8FIyi , M2N8FIzi , M2N8FMGxi , & - M2N8FMGyi , M2N8FMGzi , M2N8MAFxi , M2N8MAFyi , M2N8MAFzi , M2N8MAGxi , M2N8MAGyi , & - M2N8MAGzi , M2N8MBFxi , M2N8MBFyi , M2N8MBFzi , M2N8MBxi , M2N8MByi , M2N8MBzi , & - M2N8MMGxi , M2N8MMGyi , M2N8MMGzi , M2N8STAxi , M2N8STAyi , M2N8STAzi , M2N8STVxi , & - M2N8STVyi , M2N8STVzi , M2N8Vxi , M2N8Vyi , M2N8Vzi , M2N9Axi , M2N9Ayi , & - M2N9Azi , M2N9DynP , M2N9FAFxi , M2N9FAFyi , M2N9FAFzi , M2N9FAGxi , M2N9FAGyi , & - M2N9FAGzi , M2N9FAMxi , M2N9FAMyi , M2N9FAMzi , M2N9FBFxi , M2N9FBFyi , M2N9FBFzi , & - M2N9FBxi , M2N9FByi , M2N9FBzi , M2N9FDxi , M2N9FDyi , M2N9FDzi , M2N9FIxi , & - M2N9FIyi , M2N9FIzi , M2N9FMGxi , M2N9FMGyi , M2N9FMGzi , M2N9MAFxi , M2N9MAFyi , & - M2N9MAFzi , M2N9MAGxi , M2N9MAGyi , M2N9MAGzi , M2N9MBFxi , M2N9MBFyi , M2N9MBFzi , & - M2N9MBxi , M2N9MByi , M2N9MBzi , M2N9MMGxi , M2N9MMGyi , M2N9MMGzi , M2N9STAxi , & - M2N9STAyi , M2N9STAzi , M2N9STVxi , M2N9STVyi , M2N9STVzi , M2N9Vxi , M2N9Vyi , & - M2N9Vzi , M3N1Axi , M3N1Ayi , M3N1Azi , M3N1DynP , M3N1FAFxi , M3N1FAFyi , & - M3N1FAFzi , M3N1FAGxi , M3N1FAGyi , M3N1FAGzi , M3N1FAMxi , M3N1FAMyi , M3N1FAMzi , & - M3N1FBFxi , M3N1FBFyi , M3N1FBFzi , M3N1FBxi , M3N1FByi , M3N1FBzi , M3N1FDxi , & - M3N1FDyi , M3N1FDzi , M3N1FIxi , M3N1FIyi , M3N1FIzi , M3N1FMGxi , M3N1FMGyi , & - M3N1FMGzi , M3N1MAFxi , M3N1MAFyi , M3N1MAFzi , M3N1MAGxi , M3N1MAGyi , M3N1MAGzi , & - M3N1MBFxi , M3N1MBFyi , M3N1MBFzi , M3N1MBxi , M3N1MByi , M3N1MBzi , M3N1MMGxi , & - M3N1MMGyi , M3N1MMGzi , M3N1STAxi , M3N1STAyi , M3N1STAzi , M3N1STVxi , M3N1STVyi , & - M3N1STVzi , M3N1Vxi , M3N1Vyi , M3N1Vzi , M3N2Axi , M3N2Ayi , M3N2Azi , & - M3N2DynP , M3N2FAFxi , M3N2FAFyi , M3N2FAFzi , M3N2FAGxi , M3N2FAGyi , M3N2FAGzi , & - M3N2FAMxi , M3N2FAMyi , M3N2FAMzi , M3N2FBFxi , M3N2FBFyi , M3N2FBFzi , M3N2FBxi , & - M3N2FByi , M3N2FBzi , M3N2FDxi , M3N2FDyi , M3N2FDzi , M3N2FIxi , M3N2FIyi , & - M3N2FIzi , M3N2FMGxi , M3N2FMGyi , M3N2FMGzi , M3N2MAFxi , M3N2MAFyi , M3N2MAFzi , & - M3N2MAGxi , M3N2MAGyi , M3N2MAGzi , M3N2MBFxi , M3N2MBFyi , M3N2MBFzi , M3N2MBxi , & - M3N2MByi , M3N2MBzi , M3N2MMGxi , M3N2MMGyi , M3N2MMGzi , M3N2STAxi , M3N2STAyi , & - M3N2STAzi , M3N2STVxi , M3N2STVyi , M3N2STVzi , M3N2Vxi , M3N2Vyi , M3N2Vzi , & - M3N3Axi , M3N3Ayi , M3N3Azi , M3N3DynP , M3N3FAFxi , M3N3FAFyi , M3N3FAFzi , & - M3N3FAGxi , M3N3FAGyi , M3N3FAGzi , M3N3FAMxi , M3N3FAMyi , M3N3FAMzi , M3N3FBFxi , & - M3N3FBFyi , M3N3FBFzi , M3N3FBxi , M3N3FByi , M3N3FBzi , M3N3FDxi , M3N3FDyi , & - M3N3FDzi , M3N3FIxi , M3N3FIyi , M3N3FIzi , M3N3FMGxi , M3N3FMGyi , M3N3FMGzi , & - M3N3MAFxi , M3N3MAFyi , M3N3MAFzi , M3N3MAGxi , M3N3MAGyi , M3N3MAGzi , M3N3MBFxi , & - M3N3MBFyi , M3N3MBFzi , M3N3MBxi , M3N3MByi , M3N3MBzi , M3N3MMGxi , M3N3MMGyi , & - M3N3MMGzi , M3N3STAxi , M3N3STAyi , M3N3STAzi , M3N3STVxi , M3N3STVyi , M3N3STVzi , & - M3N3Vxi , M3N3Vyi , M3N3Vzi , M3N4Axi , M3N4Ayi , M3N4Azi , M3N4DynP , & - M3N4FAFxi , M3N4FAFyi , M3N4FAFzi , M3N4FAGxi , M3N4FAGyi , M3N4FAGzi , M3N4FAMxi , & - M3N4FAMyi , M3N4FAMzi , M3N4FBFxi , M3N4FBFyi , M3N4FBFzi , M3N4FBxi , M3N4FByi , & - M3N4FBzi , M3N4FDxi , M3N4FDyi /) - ParamIndxAry(1501:2000) = (/ & - M3N4FDzi , M3N4FIxi , M3N4FIyi , M3N4FIzi , M3N4FMGxi , M3N4FMGyi , M3N4FMGzi , & - M3N4MAFxi , M3N4MAFyi , M3N4MAFzi , M3N4MAGxi , M3N4MAGyi , M3N4MAGzi , M3N4MBFxi , & - M3N4MBFyi , M3N4MBFzi , M3N4MBxi , M3N4MByi , M3N4MBzi , M3N4MMGxi , M3N4MMGyi , & - M3N4MMGzi , M3N4STAxi , M3N4STAyi , M3N4STAzi , M3N4STVxi , M3N4STVyi , M3N4STVzi , & - M3N4Vxi , M3N4Vyi , M3N4Vzi , M3N5Axi , M3N5Ayi , M3N5Azi , M3N5DynP , & - M3N5FAFxi , M3N5FAFyi , M3N5FAFzi , M3N5FAGxi , M3N5FAGyi , M3N5FAGzi , M3N5FAMxi , & - M3N5FAMyi , M3N5FAMzi , M3N5FBFxi , M3N5FBFyi , M3N5FBFzi , M3N5FBxi , M3N5FByi , & - M3N5FBzi , M3N5FDxi , M3N5FDyi , M3N5FDzi , M3N5FIxi , M3N5FIyi , M3N5FIzi , & - M3N5FMGxi , M3N5FMGyi , M3N5FMGzi , M3N5MAFxi , M3N5MAFyi , M3N5MAFzi , M3N5MAGxi , & - M3N5MAGyi , M3N5MAGzi , M3N5MBFxi , M3N5MBFyi , M3N5MBFzi , M3N5MBxi , M3N5MByi , & - M3N5MBzi , M3N5MMGxi , M3N5MMGyi , M3N5MMGzi , M3N5STAxi , M3N5STAyi , M3N5STAzi , & - M3N5STVxi , M3N5STVyi , M3N5STVzi , M3N5Vxi , M3N5Vyi , M3N5Vzi , M3N6Axi , & - M3N6Ayi , M3N6Azi , M3N6DynP , M3N6FAFxi , M3N6FAFyi , M3N6FAFzi , M3N6FAGxi , & - M3N6FAGyi , M3N6FAGzi , M3N6FAMxi , M3N6FAMyi , M3N6FAMzi , M3N6FBFxi , M3N6FBFyi , & - M3N6FBFzi , M3N6FBxi , M3N6FByi , M3N6FBzi , M3N6FDxi , M3N6FDyi , M3N6FDzi , & - M3N6FIxi , M3N6FIyi , M3N6FIzi , M3N6FMGxi , M3N6FMGyi , M3N6FMGzi , M3N6MAFxi , & - M3N6MAFyi , M3N6MAFzi , M3N6MAGxi , M3N6MAGyi , M3N6MAGzi , M3N6MBFxi , M3N6MBFyi , & - M3N6MBFzi , M3N6MBxi , M3N6MByi , M3N6MBzi , M3N6MMGxi , M3N6MMGyi , M3N6MMGzi , & - M3N6STAxi , M3N6STAyi , M3N6STAzi , M3N6STVxi , M3N6STVyi , M3N6STVzi , M3N6Vxi , & - M3N6Vyi , M3N6Vzi , M3N7Axi , M3N7Ayi , M3N7Azi , M3N7DynP , M3N7FAFxi , & - M3N7FAFyi , M3N7FAFzi , M3N7FAGxi , M3N7FAGyi , M3N7FAGzi , M3N7FAMxi , M3N7FAMyi , & - M3N7FAMzi , M3N7FBFxi , M3N7FBFyi , M3N7FBFzi , M3N7FBxi , M3N7FByi , M3N7FBzi , & - M3N7FDxi , M3N7FDyi , M3N7FDzi , M3N7FIxi , M3N7FIyi , M3N7FIzi , M3N7FMGxi , & - M3N7FMGyi , M3N7FMGzi , M3N7MAFxi , M3N7MAFyi , M3N7MAFzi , M3N7MAGxi , M3N7MAGyi , & - M3N7MAGzi , M3N7MBFxi , M3N7MBFyi , M3N7MBFzi , M3N7MBxi , M3N7MByi , M3N7MBzi , & - M3N7MMGxi , M3N7MMGyi , M3N7MMGzi , M3N7STAxi , M3N7STAyi , M3N7STAzi , M3N7STVxi , & - M3N7STVyi , M3N7STVzi , M3N7Vxi , M3N7Vyi , M3N7Vzi , M3N8Axi , M3N8Ayi , & - M3N8Azi , M3N8DynP , M3N8FAFxi , M3N8FAFyi , M3N8FAFzi , M3N8FAGxi , M3N8FAGyi , & - M3N8FAGzi , M3N8FAMxi , M3N8FAMyi , M3N8FAMzi , M3N8FBFxi , M3N8FBFyi , M3N8FBFzi , & - M3N8FBxi , M3N8FByi , M3N8FBzi , M3N8FDxi , M3N8FDyi , M3N8FDzi , M3N8FIxi , & - M3N8FIyi , M3N8FIzi , M3N8FMGxi , M3N8FMGyi , M3N8FMGzi , M3N8MAFxi , M3N8MAFyi , & - M3N8MAFzi , M3N8MAGxi , M3N8MAGyi , M3N8MAGzi , M3N8MBFxi , M3N8MBFyi , M3N8MBFzi , & - M3N8MBxi , M3N8MByi , M3N8MBzi , M3N8MMGxi , M3N8MMGyi , M3N8MMGzi , M3N8STAxi , & - M3N8STAyi , M3N8STAzi , M3N8STVxi , M3N8STVyi , M3N8STVzi , M3N8Vxi , M3N8Vyi , & - M3N8Vzi , M3N9Axi , M3N9Ayi , M3N9Azi , M3N9DynP , M3N9FAFxi , M3N9FAFyi , & - M3N9FAFzi , M3N9FAGxi , M3N9FAGyi , M3N9FAGzi , M3N9FAMxi , M3N9FAMyi , M3N9FAMzi , & - M3N9FBFxi , M3N9FBFyi , M3N9FBFzi , M3N9FBxi , M3N9FByi , M3N9FBzi , M3N9FDxi , & - M3N9FDyi , M3N9FDzi , M3N9FIxi , M3N9FIyi , M3N9FIzi , M3N9FMGxi , M3N9FMGyi , & - M3N9FMGzi , M3N9MAFxi , M3N9MAFyi , M3N9MAFzi , M3N9MAGxi , M3N9MAGyi , M3N9MAGzi , & - M3N9MBFxi , M3N9MBFyi , M3N9MBFzi , M3N9MBxi , M3N9MByi , M3N9MBzi , M3N9MMGxi , & - M3N9MMGyi , M3N9MMGzi , M3N9STAxi , M3N9STAyi , M3N9STAzi , M3N9STVxi , M3N9STVyi , & - M3N9STVzi , M3N9Vxi , M3N9Vyi , M3N9Vzi , M4N1Axi , M4N1Ayi , M4N1Azi , & - M4N1DynP , M4N1FAFxi , M4N1FAFyi , M4N1FAFzi , M4N1FAGxi , M4N1FAGyi , M4N1FAGzi , & - M4N1FAMxi , M4N1FAMyi , M4N1FAMzi , M4N1FBFxi , M4N1FBFyi , M4N1FBFzi , M4N1FBxi , & - M4N1FByi , M4N1FBzi , M4N1FDxi , M4N1FDyi , M4N1FDzi , M4N1FIxi , M4N1FIyi , & - M4N1FIzi , M4N1FMGxi , M4N1FMGyi , M4N1FMGzi , M4N1MAFxi , M4N1MAFyi , M4N1MAFzi , & - M4N1MAGxi , M4N1MAGyi , M4N1MAGzi , M4N1MBFxi , M4N1MBFyi , M4N1MBFzi , M4N1MBxi , & - M4N1MByi , M4N1MBzi , M4N1MMGxi , M4N1MMGyi , M4N1MMGzi , M4N1STAxi , M4N1STAyi , & - M4N1STAzi , M4N1STVxi , M4N1STVyi , M4N1STVzi , M4N1Vxi , M4N1Vyi , M4N1Vzi , & - M4N2Axi , M4N2Ayi , M4N2Azi , M4N2DynP , M4N2FAFxi , M4N2FAFyi , M4N2FAFzi , & - M4N2FAGxi , M4N2FAGyi , M4N2FAGzi , M4N2FAMxi , M4N2FAMyi , M4N2FAMzi , M4N2FBFxi , & - M4N2FBFyi , M4N2FBFzi , M4N2FBxi , M4N2FByi , M4N2FBzi , M4N2FDxi , M4N2FDyi , & - M4N2FDzi , M4N2FIxi , M4N2FIyi , M4N2FIzi , M4N2FMGxi , M4N2FMGyi , M4N2FMGzi , & - M4N2MAFxi , M4N2MAFyi , M4N2MAFzi , M4N2MAGxi , M4N2MAGyi , M4N2MAGzi , M4N2MBFxi , & - M4N2MBFyi , M4N2MBFzi , M4N2MBxi , M4N2MByi , M4N2MBzi , M4N2MMGxi , M4N2MMGyi , & - M4N2MMGzi , M4N2STAxi , M4N2STAyi , M4N2STAzi , M4N2STVxi , M4N2STVyi , M4N2STVzi , & - M4N2Vxi , M4N2Vyi , M4N2Vzi , M4N3Axi , M4N3Ayi , M4N3Azi , M4N3DynP , & - M4N3FAFxi , M4N3FAFyi , M4N3FAFzi , M4N3FAGxi , M4N3FAGyi , M4N3FAGzi , M4N3FAMxi , & - M4N3FAMyi , M4N3FAMzi , M4N3FBFxi , M4N3FBFyi , M4N3FBFzi , M4N3FBxi , M4N3FByi , & - M4N3FBzi , M4N3FDxi , M4N3FDyi , M4N3FDzi , M4N3FIxi , M4N3FIyi , M4N3FIzi , & - M4N3FMGxi , M4N3FMGyi , M4N3FMGzi , M4N3MAFxi , M4N3MAFyi , M4N3MAFzi , M4N3MAGxi , & - M4N3MAGyi , M4N3MAGzi , M4N3MBFxi , M4N3MBFyi , M4N3MBFzi , M4N3MBxi , M4N3MByi , & - M4N3MBzi , M4N3MMGxi , M4N3MMGyi , M4N3MMGzi , M4N3STAxi , M4N3STAyi , M4N3STAzi , & - M4N3STVxi , M4N3STVyi , M4N3STVzi , M4N3Vxi , M4N3Vyi , M4N3Vzi , M4N4Axi , & - M4N4Ayi , M4N4Azi , M4N4DynP , M4N4FAFxi , M4N4FAFyi , M4N4FAFzi , M4N4FAGxi , & - M4N4FAGyi , M4N4FAGzi , M4N4FAMxi , M4N4FAMyi , M4N4FAMzi , M4N4FBFxi , M4N4FBFyi , & - M4N4FBFzi , M4N4FBxi , M4N4FByi , M4N4FBzi , M4N4FDxi , M4N4FDyi , M4N4FDzi , & - M4N4FIxi , M4N4FIyi , M4N4FIzi , M4N4FMGxi , M4N4FMGyi , M4N4FMGzi , M4N4MAFxi , & - M4N4MAFyi , M4N4MAFzi , M4N4MAGxi , M4N4MAGyi , M4N4MAGzi , M4N4MBFxi , M4N4MBFyi , & - M4N4MBFzi , M4N4MBxi , M4N4MByi , M4N4MBzi , M4N4MMGxi , M4N4MMGyi , M4N4MMGzi , & - M4N4STAxi , M4N4STAyi , M4N4STAzi , M4N4STVxi , M4N4STVyi , M4N4STVzi , M4N4Vxi , & - M4N4Vyi , M4N4Vzi , M4N5Axi /) - ParamIndxAry(2001:2500) = (/ & - M4N5Ayi , M4N5Azi , M4N5DynP , M4N5FAFxi , M4N5FAFyi , M4N5FAFzi , M4N5FAGxi , & - M4N5FAGyi , M4N5FAGzi , M4N5FAMxi , M4N5FAMyi , M4N5FAMzi , M4N5FBFxi , M4N5FBFyi , & - M4N5FBFzi , M4N5FBxi , M4N5FByi , M4N5FBzi , M4N5FDxi , M4N5FDyi , M4N5FDzi , & - M4N5FIxi , M4N5FIyi , M4N5FIzi , M4N5FMGxi , M4N5FMGyi , M4N5FMGzi , M4N5MAFxi , & - M4N5MAFyi , M4N5MAFzi , M4N5MAGxi , M4N5MAGyi , M4N5MAGzi , M4N5MBFxi , M4N5MBFyi , & - M4N5MBFzi , M4N5MBxi , M4N5MByi , M4N5MBzi , M4N5MMGxi , M4N5MMGyi , M4N5MMGzi , & - M4N5STAxi , M4N5STAyi , M4N5STAzi , M4N5STVxi , M4N5STVyi , M4N5STVzi , M4N5Vxi , & - M4N5Vyi , M4N5Vzi , M4N6Axi , M4N6Ayi , M4N6Azi , M4N6DynP , M4N6FAFxi , & - M4N6FAFyi , M4N6FAFzi , M4N6FAGxi , M4N6FAGyi , M4N6FAGzi , M4N6FAMxi , M4N6FAMyi , & - M4N6FAMzi , M4N6FBFxi , M4N6FBFyi , M4N6FBFzi , M4N6FBxi , M4N6FByi , M4N6FBzi , & - M4N6FDxi , M4N6FDyi , M4N6FDzi , M4N6FIxi , M4N6FIyi , M4N6FIzi , M4N6FMGxi , & - M4N6FMGyi , M4N6FMGzi , M4N6MAFxi , M4N6MAFyi , M4N6MAFzi , M4N6MAGxi , M4N6MAGyi , & - M4N6MAGzi , M4N6MBFxi , M4N6MBFyi , M4N6MBFzi , M4N6MBxi , M4N6MByi , M4N6MBzi , & - M4N6MMGxi , M4N6MMGyi , M4N6MMGzi , M4N6STAxi , M4N6STAyi , M4N6STAzi , M4N6STVxi , & - M4N6STVyi , M4N6STVzi , M4N6Vxi , M4N6Vyi , M4N6Vzi , M4N7Axi , M4N7Ayi , & - M4N7Azi , M4N7DynP , M4N7FAFxi , M4N7FAFyi , M4N7FAFzi , M4N7FAGxi , M4N7FAGyi , & - M4N7FAGzi , M4N7FAMxi , M4N7FAMyi , M4N7FAMzi , M4N7FBFxi , M4N7FBFyi , M4N7FBFzi , & - M4N7FBxi , M4N7FByi , M4N7FBzi , M4N7FDxi , M4N7FDyi , M4N7FDzi , M4N7FIxi , & - M4N7FIyi , M4N7FIzi , M4N7FMGxi , M4N7FMGyi , M4N7FMGzi , M4N7MAFxi , M4N7MAFyi , & - M4N7MAFzi , M4N7MAGxi , M4N7MAGyi , M4N7MAGzi , M4N7MBFxi , M4N7MBFyi , M4N7MBFzi , & - M4N7MBxi , M4N7MByi , M4N7MBzi , M4N7MMGxi , M4N7MMGyi , M4N7MMGzi , M4N7STAxi , & - M4N7STAyi , M4N7STAzi , M4N7STVxi , M4N7STVyi , M4N7STVzi , M4N7Vxi , M4N7Vyi , & - M4N7Vzi , M4N8Axi , M4N8Ayi , M4N8Azi , M4N8DynP , M4N8FAFxi , M4N8FAFyi , & - M4N8FAFzi , M4N8FAGxi , M4N8FAGyi , M4N8FAGzi , M4N8FAMxi , M4N8FAMyi , M4N8FAMzi , & - M4N8FBFxi , M4N8FBFyi , M4N8FBFzi , M4N8FBxi , M4N8FByi , M4N8FBzi , M4N8FDxi , & - M4N8FDyi , M4N8FDzi , M4N8FIxi , M4N8FIyi , M4N8FIzi , M4N8FMGxi , M4N8FMGyi , & - M4N8FMGzi , M4N8MAFxi , M4N8MAFyi , M4N8MAFzi , M4N8MAGxi , M4N8MAGyi , M4N8MAGzi , & - M4N8MBFxi , M4N8MBFyi , M4N8MBFzi , M4N8MBxi , M4N8MByi , M4N8MBzi , M4N8MMGxi , & - M4N8MMGyi , M4N8MMGzi , M4N8STAxi , M4N8STAyi , M4N8STAzi , M4N8STVxi , M4N8STVyi , & - M4N8STVzi , M4N8Vxi , M4N8Vyi , M4N8Vzi , M4N9Axi , M4N9Ayi , M4N9Azi , & - M4N9DynP , M4N9FAFxi , M4N9FAFyi , M4N9FAFzi , M4N9FAGxi , M4N9FAGyi , M4N9FAGzi , & - M4N9FAMxi , M4N9FAMyi , M4N9FAMzi , M4N9FBFxi , M4N9FBFyi , M4N9FBFzi , M4N9FBxi , & - M4N9FByi , M4N9FBzi , M4N9FDxi , M4N9FDyi , M4N9FDzi , M4N9FIxi , M4N9FIyi , & - M4N9FIzi , M4N9FMGxi , M4N9FMGyi , M4N9FMGzi , M4N9MAFxi , M4N9MAFyi , M4N9MAFzi , & - M4N9MAGxi , M4N9MAGyi , M4N9MAGzi , M4N9MBFxi , M4N9MBFyi , M4N9MBFzi , M4N9MBxi , & - M4N9MByi , M4N9MBzi , M4N9MMGxi , M4N9MMGyi , M4N9MMGzi , M4N9STAxi , M4N9STAyi , & - M4N9STAzi , M4N9STVxi , M4N9STVyi , M4N9STVzi , M4N9Vxi , M4N9Vyi , M4N9Vzi , & - M5N1Axi , M5N1Ayi , M5N1Azi , M5N1DynP , M5N1FAFxi , M5N1FAFyi , M5N1FAFzi , & - M5N1FAGxi , M5N1FAGyi , M5N1FAGzi , M5N1FAMxi , M5N1FAMyi , M5N1FAMzi , M5N1FBFxi , & - M5N1FBFyi , M5N1FBFzi , M5N1FBxi , M5N1FByi , M5N1FBzi , M5N1FDxi , M5N1FDyi , & - M5N1FDzi , M5N1FIxi , M5N1FIyi , M5N1FIzi , M5N1FMGxi , M5N1FMGyi , M5N1FMGzi , & - M5N1MAFxi , M5N1MAFyi , M5N1MAFzi , M5N1MAGxi , M5N1MAGyi , M5N1MAGzi , M5N1MBFxi , & - M5N1MBFyi , M5N1MBFzi , M5N1MBxi , M5N1MByi , M5N1MBzi , M5N1MMGxi , M5N1MMGyi , & - M5N1MMGzi , M5N1STAxi , M5N1STAyi , M5N1STAzi , M5N1STVxi , M5N1STVyi , M5N1STVzi , & - M5N1Vxi , M5N1Vyi , M5N1Vzi , M5N2Axi , M5N2Ayi , M5N2Azi , M5N2DynP , & - M5N2FAFxi , M5N2FAFyi , M5N2FAFzi , M5N2FAGxi , M5N2FAGyi , M5N2FAGzi , M5N2FAMxi , & - M5N2FAMyi , M5N2FAMzi , M5N2FBFxi , M5N2FBFyi , M5N2FBFzi , M5N2FBxi , M5N2FByi , & - M5N2FBzi , M5N2FDxi , M5N2FDyi , M5N2FDzi , M5N2FIxi , M5N2FIyi , M5N2FIzi , & - M5N2FMGxi , M5N2FMGyi , M5N2FMGzi , M5N2MAFxi , M5N2MAFyi , M5N2MAFzi , M5N2MAGxi , & - M5N2MAGyi , M5N2MAGzi , M5N2MBFxi , M5N2MBFyi , M5N2MBFzi , M5N2MBxi , M5N2MByi , & - M5N2MBzi , M5N2MMGxi , M5N2MMGyi , M5N2MMGzi , M5N2STAxi , M5N2STAyi , M5N2STAzi , & - M5N2STVxi , M5N2STVyi , M5N2STVzi , M5N2Vxi , M5N2Vyi , M5N2Vzi , M5N3Axi , & - M5N3Ayi , M5N3Azi , M5N3DynP , M5N3FAFxi , M5N3FAFyi , M5N3FAFzi , M5N3FAGxi , & - M5N3FAGyi , M5N3FAGzi , M5N3FAMxi , M5N3FAMyi , M5N3FAMzi , M5N3FBFxi , M5N3FBFyi , & - M5N3FBFzi , M5N3FBxi , M5N3FByi , M5N3FBzi , M5N3FDxi , M5N3FDyi , M5N3FDzi , & - M5N3FIxi , M5N3FIyi , M5N3FIzi , M5N3FMGxi , M5N3FMGyi , M5N3FMGzi , M5N3MAFxi , & - M5N3MAFyi , M5N3MAFzi , M5N3MAGxi , M5N3MAGyi , M5N3MAGzi , M5N3MBFxi , M5N3MBFyi , & - M5N3MBFzi , M5N3MBxi , M5N3MByi , M5N3MBzi , M5N3MMGxi , M5N3MMGyi , M5N3MMGzi , & - M5N3STAxi , M5N3STAyi , M5N3STAzi , M5N3STVxi , M5N3STVyi , M5N3STVzi , M5N3Vxi , & - M5N3Vyi , M5N3Vzi , M5N4Axi , M5N4Ayi , M5N4Azi , M5N4DynP , M5N4FAFxi , & - M5N4FAFyi , M5N4FAFzi , M5N4FAGxi , M5N4FAGyi , M5N4FAGzi , M5N4FAMxi , M5N4FAMyi , & - M5N4FAMzi , M5N4FBFxi , M5N4FBFyi , M5N4FBFzi , M5N4FBxi , M5N4FByi , M5N4FBzi , & - M5N4FDxi , M5N4FDyi , M5N4FDzi , M5N4FIxi , M5N4FIyi , M5N4FIzi , M5N4FMGxi , & - M5N4FMGyi , M5N4FMGzi , M5N4MAFxi , M5N4MAFyi , M5N4MAFzi , M5N4MAGxi , M5N4MAGyi , & - M5N4MAGzi , M5N4MBFxi , M5N4MBFyi , M5N4MBFzi , M5N4MBxi , M5N4MByi , M5N4MBzi , & - M5N4MMGxi , M5N4MMGyi , M5N4MMGzi , M5N4STAxi , M5N4STAyi , M5N4STAzi , M5N4STVxi , & - M5N4STVyi , M5N4STVzi , M5N4Vxi , M5N4Vyi , M5N4Vzi , M5N5Axi , M5N5Ayi , & - M5N5Azi , M5N5DynP , M5N5FAFxi , M5N5FAFyi , M5N5FAFzi , M5N5FAGxi , M5N5FAGyi , & - M5N5FAGzi , M5N5FAMxi , M5N5FAMyi , M5N5FAMzi , M5N5FBFxi , M5N5FBFyi , M5N5FBFzi , & - M5N5FBxi , M5N5FByi , M5N5FBzi , M5N5FDxi , M5N5FDyi , M5N5FDzi , M5N5FIxi , & - M5N5FIyi , M5N5FIzi , M5N5FMGxi , M5N5FMGyi , M5N5FMGzi , M5N5MAFxi , M5N5MAFyi , & - M5N5MAFzi , M5N5MAGxi , M5N5MAGyi /) - ParamIndxAry(2501:3000) = (/ & - M5N5MAGzi , M5N5MBFxi , M5N5MBFyi , M5N5MBFzi , M5N5MBxi , M5N5MByi , M5N5MBzi , & - M5N5MMGxi , M5N5MMGyi , M5N5MMGzi , M5N5STAxi , M5N5STAyi , M5N5STAzi , M5N5STVxi , & - M5N5STVyi , M5N5STVzi , M5N5Vxi , M5N5Vyi , M5N5Vzi , M5N6Axi , M5N6Ayi , & - M5N6Azi , M5N6DynP , M5N6FAFxi , M5N6FAFyi , M5N6FAFzi , M5N6FAGxi , M5N6FAGyi , & - M5N6FAGzi , M5N6FAMxi , M5N6FAMyi , M5N6FAMzi , M5N6FBFxi , M5N6FBFyi , M5N6FBFzi , & - M5N6FBxi , M5N6FByi , M5N6FBzi , M5N6FDxi , M5N6FDyi , M5N6FDzi , M5N6FIxi , & - M5N6FIyi , M5N6FIzi , M5N6FMGxi , M5N6FMGyi , M5N6FMGzi , M5N6MAFxi , M5N6MAFyi , & - M5N6MAFzi , M5N6MAGxi , M5N6MAGyi , M5N6MAGzi , M5N6MBFxi , M5N6MBFyi , M5N6MBFzi , & - M5N6MBxi , M5N6MByi , M5N6MBzi , M5N6MMGxi , M5N6MMGyi , M5N6MMGzi , M5N6STAxi , & - M5N6STAyi , M5N6STAzi , M5N6STVxi , M5N6STVyi , M5N6STVzi , M5N6Vxi , M5N6Vyi , & - M5N6Vzi , M5N7Axi , M5N7Ayi , M5N7Azi , M5N7DynP , M5N7FAFxi , M5N7FAFyi , & - M5N7FAFzi , M5N7FAGxi , M5N7FAGyi , M5N7FAGzi , M5N7FAMxi , M5N7FAMyi , M5N7FAMzi , & - M5N7FBFxi , M5N7FBFyi , M5N7FBFzi , M5N7FBxi , M5N7FByi , M5N7FBzi , M5N7FDxi , & - M5N7FDyi , M5N7FDzi , M5N7FIxi , M5N7FIyi , M5N7FIzi , M5N7FMGxi , M5N7FMGyi , & - M5N7FMGzi , M5N7MAFxi , M5N7MAFyi , M5N7MAFzi , M5N7MAGxi , M5N7MAGyi , M5N7MAGzi , & - M5N7MBFxi , M5N7MBFyi , M5N7MBFzi , M5N7MBxi , M5N7MByi , M5N7MBzi , M5N7MMGxi , & - M5N7MMGyi , M5N7MMGzi , M5N7STAxi , M5N7STAyi , M5N7STAzi , M5N7STVxi , M5N7STVyi , & - M5N7STVzi , M5N7Vxi , M5N7Vyi , M5N7Vzi , M5N8Axi , M5N8Ayi , M5N8Azi , & - M5N8DynP , M5N8FAFxi , M5N8FAFyi , M5N8FAFzi , M5N8FAGxi , M5N8FAGyi , M5N8FAGzi , & - M5N8FAMxi , M5N8FAMyi , M5N8FAMzi , M5N8FBFxi , M5N8FBFyi , M5N8FBFzi , M5N8FBxi , & - M5N8FByi , M5N8FBzi , M5N8FDxi , M5N8FDyi , M5N8FDzi , M5N8FIxi , M5N8FIyi , & - M5N8FIzi , M5N8FMGxi , M5N8FMGyi , M5N8FMGzi , M5N8MAFxi , M5N8MAFyi , M5N8MAFzi , & - M5N8MAGxi , M5N8MAGyi , M5N8MAGzi , M5N8MBFxi , M5N8MBFyi , M5N8MBFzi , M5N8MBxi , & - M5N8MByi , M5N8MBzi , M5N8MMGxi , M5N8MMGyi , M5N8MMGzi , M5N8STAxi , M5N8STAyi , & - M5N8STAzi , M5N8STVxi , M5N8STVyi , M5N8STVzi , M5N8Vxi , M5N8Vyi , M5N8Vzi , & - M5N9Axi , M5N9Ayi , M5N9Azi , M5N9DynP , M5N9FAFxi , M5N9FAFyi , M5N9FAFzi , & - M5N9FAGxi , M5N9FAGyi , M5N9FAGzi , M5N9FAMxi , M5N9FAMyi , M5N9FAMzi , M5N9FBFxi , & - M5N9FBFyi , M5N9FBFzi , M5N9FBxi , M5N9FByi , M5N9FBzi , M5N9FDxi , M5N9FDyi , & - M5N9FDzi , M5N9FIxi , M5N9FIyi , M5N9FIzi , M5N9FMGxi , M5N9FMGyi , M5N9FMGzi , & - M5N9MAFxi , M5N9MAFyi , M5N9MAFzi , M5N9MAGxi , M5N9MAGyi , M5N9MAGzi , M5N9MBFxi , & - M5N9MBFyi , M5N9MBFzi , M5N9MBxi , M5N9MByi , M5N9MBzi , M5N9MMGxi , M5N9MMGyi , & - M5N9MMGzi , M5N9STAxi , M5N9STAyi , M5N9STAzi , M5N9STVxi , M5N9STVyi , M5N9STVzi , & - M5N9Vxi , M5N9Vyi , M5N9Vzi , M6N1Axi , M6N1Ayi , M6N1Azi , M6N1DynP , & - M6N1FAFxi , M6N1FAFyi , M6N1FAFzi , M6N1FAGxi , M6N1FAGyi , M6N1FAGzi , M6N1FAMxi , & - M6N1FAMyi , M6N1FAMzi , M6N1FBFxi , M6N1FBFyi , M6N1FBFzi , M6N1FBxi , M6N1FByi , & - M6N1FBzi , M6N1FDxi , M6N1FDyi , M6N1FDzi , M6N1FIxi , M6N1FIyi , M6N1FIzi , & - M6N1FMGxi , M6N1FMGyi , M6N1FMGzi , M6N1MAFxi , M6N1MAFyi , M6N1MAFzi , M6N1MAGxi , & - M6N1MAGyi , M6N1MAGzi , M6N1MBFxi , M6N1MBFyi , M6N1MBFzi , M6N1MBxi , M6N1MByi , & - M6N1MBzi , M6N1MMGxi , M6N1MMGyi , M6N1MMGzi , M6N1STAxi , M6N1STAyi , M6N1STAzi , & - M6N1STVxi , M6N1STVyi , M6N1STVzi , M6N1Vxi , M6N1Vyi , M6N1Vzi , M6N2Axi , & - M6N2Ayi , M6N2Azi , M6N2DynP , M6N2FAFxi , M6N2FAFyi , M6N2FAFzi , M6N2FAGxi , & - M6N2FAGyi , M6N2FAGzi , M6N2FAMxi , M6N2FAMyi , M6N2FAMzi , M6N2FBFxi , M6N2FBFyi , & - M6N2FBFzi , M6N2FBxi , M6N2FByi , M6N2FBzi , M6N2FDxi , M6N2FDyi , M6N2FDzi , & - M6N2FIxi , M6N2FIyi , M6N2FIzi , M6N2FMGxi , M6N2FMGyi , M6N2FMGzi , M6N2MAFxi , & - M6N2MAFyi , M6N2MAFzi , M6N2MAGxi , M6N2MAGyi , M6N2MAGzi , M6N2MBFxi , M6N2MBFyi , & - M6N2MBFzi , M6N2MBxi , M6N2MByi , M6N2MBzi , M6N2MMGxi , M6N2MMGyi , M6N2MMGzi , & - M6N2STAxi , M6N2STAyi , M6N2STAzi , M6N2STVxi , M6N2STVyi , M6N2STVzi , M6N2Vxi , & - M6N2Vyi , M6N2Vzi , M6N3Axi , M6N3Ayi , M6N3Azi , M6N3DynP , M6N3FAFxi , & - M6N3FAFyi , M6N3FAFzi , M6N3FAGxi , M6N3FAGyi , M6N3FAGzi , M6N3FAMxi , M6N3FAMyi , & - M6N3FAMzi , M6N3FBFxi , M6N3FBFyi , M6N3FBFzi , M6N3FBxi , M6N3FByi , M6N3FBzi , & - M6N3FDxi , M6N3FDyi , M6N3FDzi , M6N3FIxi , M6N3FIyi , M6N3FIzi , M6N3FMGxi , & - M6N3FMGyi , M6N3FMGzi , M6N3MAFxi , M6N3MAFyi , M6N3MAFzi , M6N3MAGxi , M6N3MAGyi , & - M6N3MAGzi , M6N3MBFxi , M6N3MBFyi , M6N3MBFzi , M6N3MBxi , M6N3MByi , M6N3MBzi , & - M6N3MMGxi , M6N3MMGyi , M6N3MMGzi , M6N3STAxi , M6N3STAyi , M6N3STAzi , M6N3STVxi , & - M6N3STVyi , M6N3STVzi , M6N3Vxi , M6N3Vyi , M6N3Vzi , M6N4Axi , M6N4Ayi , & - M6N4Azi , M6N4DynP , M6N4FAFxi , M6N4FAFyi , M6N4FAFzi , M6N4FAGxi , M6N4FAGyi , & - M6N4FAGzi , M6N4FAMxi , M6N4FAMyi , M6N4FAMzi , M6N4FBFxi , M6N4FBFyi , M6N4FBFzi , & - M6N4FBxi , M6N4FByi , M6N4FBzi , M6N4FDxi , M6N4FDyi , M6N4FDzi , M6N4FIxi , & - M6N4FIyi , M6N4FIzi , M6N4FMGxi , M6N4FMGyi , M6N4FMGzi , M6N4MAFxi , M6N4MAFyi , & - M6N4MAFzi , M6N4MAGxi , M6N4MAGyi , M6N4MAGzi , M6N4MBFxi , M6N4MBFyi , M6N4MBFzi , & - M6N4MBxi , M6N4MByi , M6N4MBzi , M6N4MMGxi , M6N4MMGyi , M6N4MMGzi , M6N4STAxi , & - M6N4STAyi , M6N4STAzi , M6N4STVxi , M6N4STVyi , M6N4STVzi , M6N4Vxi , M6N4Vyi , & - M6N4Vzi , M6N5Axi , M6N5Ayi , M6N5Azi , M6N5DynP , M6N5FAFxi , M6N5FAFyi , & - M6N5FAFzi , M6N5FAGxi , M6N5FAGyi , M6N5FAGzi , M6N5FAMxi , M6N5FAMyi , M6N5FAMzi , & - M6N5FBFxi , M6N5FBFyi , M6N5FBFzi , M6N5FBxi , M6N5FByi , M6N5FBzi , M6N5FDxi , & - M6N5FDyi , M6N5FDzi , M6N5FIxi , M6N5FIyi , M6N5FIzi , M6N5FMGxi , M6N5FMGyi , & - M6N5FMGzi , M6N5MAFxi , M6N5MAFyi , M6N5MAFzi , M6N5MAGxi , M6N5MAGyi , M6N5MAGzi , & - M6N5MBFxi , M6N5MBFyi , M6N5MBFzi , M6N5MBxi , M6N5MByi , M6N5MBzi , M6N5MMGxi , & - M6N5MMGyi , M6N5MMGzi , M6N5STAxi , M6N5STAyi , M6N5STAzi , M6N5STVxi , M6N5STVyi , & - M6N5STVzi , M6N5Vxi , M6N5Vyi , M6N5Vzi , M6N6Axi , M6N6Ayi , M6N6Azi , & - M6N6DynP , M6N6FAFxi , M6N6FAFyi , M6N6FAFzi , M6N6FAGxi , M6N6FAGyi , M6N6FAGzi , & - M6N6FAMxi , M6N6FAMyi , M6N6FAMzi /) - ParamIndxAry(3001:3500) = (/ & - M6N6FBFxi , M6N6FBFyi , M6N6FBFzi , M6N6FBxi , M6N6FByi , M6N6FBzi , M6N6FDxi , & - M6N6FDyi , M6N6FDzi , M6N6FIxi , M6N6FIyi , M6N6FIzi , M6N6FMGxi , M6N6FMGyi , & - M6N6FMGzi , M6N6MAFxi , M6N6MAFyi , M6N6MAFzi , M6N6MAGxi , M6N6MAGyi , M6N6MAGzi , & - M6N6MBFxi , M6N6MBFyi , M6N6MBFzi , M6N6MBxi , M6N6MByi , M6N6MBzi , M6N6MMGxi , & - M6N6MMGyi , M6N6MMGzi , M6N6STAxi , M6N6STAyi , M6N6STAzi , M6N6STVxi , M6N6STVyi , & - M6N6STVzi , M6N6Vxi , M6N6Vyi , M6N6Vzi , M6N7Axi , M6N7Ayi , M6N7Azi , & - M6N7DynP , M6N7FAFxi , M6N7FAFyi , M6N7FAFzi , M6N7FAGxi , M6N7FAGyi , M6N7FAGzi , & - M6N7FAMxi , M6N7FAMyi , M6N7FAMzi , M6N7FBFxi , M6N7FBFyi , M6N7FBFzi , M6N7FBxi , & - M6N7FByi , M6N7FBzi , M6N7FDxi , M6N7FDyi , M6N7FDzi , M6N7FIxi , M6N7FIyi , & - M6N7FIzi , M6N7FMGxi , M6N7FMGyi , M6N7FMGzi , M6N7MAFxi , M6N7MAFyi , M6N7MAFzi , & - M6N7MAGxi , M6N7MAGyi , M6N7MAGzi , M6N7MBFxi , M6N7MBFyi , M6N7MBFzi , M6N7MBxi , & - M6N7MByi , M6N7MBzi , M6N7MMGxi , M6N7MMGyi , M6N7MMGzi , M6N7STAxi , M6N7STAyi , & - M6N7STAzi , M6N7STVxi , M6N7STVyi , M6N7STVzi , M6N7Vxi , M6N7Vyi , M6N7Vzi , & - M6N8Axi , M6N8Ayi , M6N8Azi , M6N8DynP , M6N8FAFxi , M6N8FAFyi , M6N8FAFzi , & - M6N8FAGxi , M6N8FAGyi , M6N8FAGzi , M6N8FAMxi , M6N8FAMyi , M6N8FAMzi , M6N8FBFxi , & - M6N8FBFyi , M6N8FBFzi , M6N8FBxi , M6N8FByi , M6N8FBzi , M6N8FDxi , M6N8FDyi , & - M6N8FDzi , M6N8FIxi , M6N8FIyi , M6N8FIzi , M6N8FMGxi , M6N8FMGyi , M6N8FMGzi , & - M6N8MAFxi , M6N8MAFyi , M6N8MAFzi , M6N8MAGxi , M6N8MAGyi , M6N8MAGzi , M6N8MBFxi , & - M6N8MBFyi , M6N8MBFzi , M6N8MBxi , M6N8MByi , M6N8MBzi , M6N8MMGxi , M6N8MMGyi , & - M6N8MMGzi , M6N8STAxi , M6N8STAyi , M6N8STAzi , M6N8STVxi , M6N8STVyi , M6N8STVzi , & - M6N8Vxi , M6N8Vyi , M6N8Vzi , M6N9Axi , M6N9Ayi , M6N9Azi , M6N9DynP , & - M6N9FAFxi , M6N9FAFyi , M6N9FAFzi , M6N9FAGxi , M6N9FAGyi , M6N9FAGzi , M6N9FAMxi , & - M6N9FAMyi , M6N9FAMzi , M6N9FBFxi , M6N9FBFyi , M6N9FBFzi , M6N9FBxi , M6N9FByi , & - M6N9FBzi , M6N9FDxi , M6N9FDyi , M6N9FDzi , M6N9FIxi , M6N9FIyi , M6N9FIzi , & - M6N9FMGxi , M6N9FMGyi , M6N9FMGzi , M6N9MAFxi , M6N9MAFyi , M6N9MAFzi , M6N9MAGxi , & - M6N9MAGyi , M6N9MAGzi , M6N9MBFxi , M6N9MBFyi , M6N9MBFzi , M6N9MBxi , M6N9MByi , & - M6N9MBzi , M6N9MMGxi , M6N9MMGyi , M6N9MMGzi , M6N9STAxi , M6N9STAyi , M6N9STAzi , & - M6N9STVxi , M6N9STVyi , M6N9STVzi , M6N9Vxi , M6N9Vyi , M6N9Vzi , M7N1Axi , & - M7N1Ayi , M7N1Azi , M7N1DynP , M7N1FAFxi , M7N1FAFyi , M7N1FAFzi , M7N1FAGxi , & - M7N1FAGyi , M7N1FAGzi , M7N1FAMxi , M7N1FAMyi , M7N1FAMzi , M7N1FBFxi , M7N1FBFyi , & - M7N1FBFzi , M7N1FBxi , M7N1FByi , M7N1FBzi , M7N1FDxi , M7N1FDyi , M7N1FDzi , & - M7N1FIxi , M7N1FIyi , M7N1FIzi , M7N1FMGxi , M7N1FMGyi , M7N1FMGzi , M7N1MAFxi , & - M7N1MAFyi , M7N1MAFzi , M7N1MAGxi , M7N1MAGyi , M7N1MAGzi , M7N1MBFxi , M7N1MBFyi , & - M7N1MBFzi , M7N1MBxi , M7N1MByi , M7N1MBzi , M7N1MMGxi , M7N1MMGyi , M7N1MMGzi , & - M7N1STAxi , M7N1STAyi , M7N1STAzi , M7N1STVxi , M7N1STVyi , M7N1STVzi , M7N1Vxi , & - M7N1Vyi , M7N1Vzi , M7N2Axi , M7N2Ayi , M7N2Azi , M7N2DynP , M7N2FAFxi , & - M7N2FAFyi , M7N2FAFzi , M7N2FAGxi , M7N2FAGyi , M7N2FAGzi , M7N2FAMxi , M7N2FAMyi , & - M7N2FAMzi , M7N2FBFxi , M7N2FBFyi , M7N2FBFzi , M7N2FBxi , M7N2FByi , M7N2FBzi , & - M7N2FDxi , M7N2FDyi , M7N2FDzi , M7N2FIxi , M7N2FIyi , M7N2FIzi , M7N2FMGxi , & - M7N2FMGyi , M7N2FMGzi , M7N2MAFxi , M7N2MAFyi , M7N2MAFzi , M7N2MAGxi , M7N2MAGyi , & - M7N2MAGzi , M7N2MBFxi , M7N2MBFyi , M7N2MBFzi , M7N2MBxi , M7N2MByi , M7N2MBzi , & - M7N2MMGxi , M7N2MMGyi , M7N2MMGzi , M7N2STAxi , M7N2STAyi , M7N2STAzi , M7N2STVxi , & - M7N2STVyi , M7N2STVzi , M7N2Vxi , M7N2Vyi , M7N2Vzi , M7N3Axi , M7N3Ayi , & - M7N3Azi , M7N3DynP , M7N3FAFxi , M7N3FAFyi , M7N3FAFzi , M7N3FAGxi , M7N3FAGyi , & - M7N3FAGzi , M7N3FAMxi , M7N3FAMyi , M7N3FAMzi , M7N3FBFxi , M7N3FBFyi , M7N3FBFzi , & - M7N3FBxi , M7N3FByi , M7N3FBzi , M7N3FDxi , M7N3FDyi , M7N3FDzi , M7N3FIxi , & - M7N3FIyi , M7N3FIzi , M7N3FMGxi , M7N3FMGyi , M7N3FMGzi , M7N3MAFxi , M7N3MAFyi , & - M7N3MAFzi , M7N3MAGxi , M7N3MAGyi , M7N3MAGzi , M7N3MBFxi , M7N3MBFyi , M7N3MBFzi , & - M7N3MBxi , M7N3MByi , M7N3MBzi , M7N3MMGxi , M7N3MMGyi , M7N3MMGzi , M7N3STAxi , & - M7N3STAyi , M7N3STAzi , M7N3STVxi , M7N3STVyi , M7N3STVzi , M7N3Vxi , M7N3Vyi , & - M7N3Vzi , M7N4Axi , M7N4Ayi , M7N4Azi , M7N4DynP , M7N4FAFxi , M7N4FAFyi , & - M7N4FAFzi , M7N4FAGxi , M7N4FAGyi , M7N4FAGzi , M7N4FAMxi , M7N4FAMyi , M7N4FAMzi , & - M7N4FBFxi , M7N4FBFyi , M7N4FBFzi , M7N4FBxi , M7N4FByi , M7N4FBzi , M7N4FDxi , & - M7N4FDyi , M7N4FDzi , M7N4FIxi , M7N4FIyi , M7N4FIzi , M7N4FMGxi , M7N4FMGyi , & - M7N4FMGzi , M7N4MAFxi , M7N4MAFyi , M7N4MAFzi , M7N4MAGxi , M7N4MAGyi , M7N4MAGzi , & - M7N4MBFxi , M7N4MBFyi , M7N4MBFzi , M7N4MBxi , M7N4MByi , M7N4MBzi , M7N4MMGxi , & - M7N4MMGyi , M7N4MMGzi , M7N4STAxi , M7N4STAyi , M7N4STAzi , M7N4STVxi , M7N4STVyi , & - M7N4STVzi , M7N4Vxi , M7N4Vyi , M7N4Vzi , M7N5Axi , M7N5Ayi , M7N5Azi , & - M7N5DynP , M7N5FAFxi , M7N5FAFyi , M7N5FAFzi , M7N5FAGxi , M7N5FAGyi , M7N5FAGzi , & - M7N5FAMxi , M7N5FAMyi , M7N5FAMzi , M7N5FBFxi , M7N5FBFyi , M7N5FBFzi , M7N5FBxi , & - M7N5FByi , M7N5FBzi , M7N5FDxi , M7N5FDyi , M7N5FDzi , M7N5FIxi , M7N5FIyi , & - M7N5FIzi , M7N5FMGxi , M7N5FMGyi , M7N5FMGzi , M7N5MAFxi , M7N5MAFyi , M7N5MAFzi , & - M7N5MAGxi , M7N5MAGyi , M7N5MAGzi , M7N5MBFxi , M7N5MBFyi , M7N5MBFzi , M7N5MBxi , & - M7N5MByi , M7N5MBzi , M7N5MMGxi , M7N5MMGyi , M7N5MMGzi , M7N5STAxi , M7N5STAyi , & - M7N5STAzi , M7N5STVxi , M7N5STVyi , M7N5STVzi , M7N5Vxi , M7N5Vyi , M7N5Vzi , & - M7N6Axi , M7N6Ayi , M7N6Azi , M7N6DynP , M7N6FAFxi , M7N6FAFyi , M7N6FAFzi , & - M7N6FAGxi , M7N6FAGyi , M7N6FAGzi , M7N6FAMxi , M7N6FAMyi , M7N6FAMzi , M7N6FBFxi , & - M7N6FBFyi , M7N6FBFzi , M7N6FBxi , M7N6FByi , M7N6FBzi , M7N6FDxi , M7N6FDyi , & - M7N6FDzi , M7N6FIxi , M7N6FIyi , M7N6FIzi , M7N6FMGxi , M7N6FMGyi , M7N6FMGzi , & - M7N6MAFxi , M7N6MAFyi , M7N6MAFzi , M7N6MAGxi , M7N6MAGyi , M7N6MAGzi , M7N6MBFxi , & - M7N6MBFyi , M7N6MBFzi , M7N6MBxi , M7N6MByi , M7N6MBzi , M7N6MMGxi , M7N6MMGyi , & - M7N6MMGzi , M7N6STAxi , M7N6STAyi /) - ParamIndxAry(3501:4000) = (/ & - M7N6STAzi , M7N6STVxi , M7N6STVyi , M7N6STVzi , M7N6Vxi , M7N6Vyi , M7N6Vzi , & - M7N7Axi , M7N7Ayi , M7N7Azi , M7N7DynP , M7N7FAFxi , M7N7FAFyi , M7N7FAFzi , & - M7N7FAGxi , M7N7FAGyi , M7N7FAGzi , M7N7FAMxi , M7N7FAMyi , M7N7FAMzi , M7N7FBFxi , & - M7N7FBFyi , M7N7FBFzi , M7N7FBxi , M7N7FByi , M7N7FBzi , M7N7FDxi , M7N7FDyi , & - M7N7FDzi , M7N7FIxi , M7N7FIyi , M7N7FIzi , M7N7FMGxi , M7N7FMGyi , M7N7FMGzi , & - M7N7MAFxi , M7N7MAFyi , M7N7MAFzi , M7N7MAGxi , M7N7MAGyi , M7N7MAGzi , M7N7MBFxi , & - M7N7MBFyi , M7N7MBFzi , M7N7MBxi , M7N7MByi , M7N7MBzi , M7N7MMGxi , M7N7MMGyi , & - M7N7MMGzi , M7N7STAxi , M7N7STAyi , M7N7STAzi , M7N7STVxi , M7N7STVyi , M7N7STVzi , & - M7N7Vxi , M7N7Vyi , M7N7Vzi , M7N8Axi , M7N8Ayi , M7N8Azi , M7N8DynP , & - M7N8FAFxi , M7N8FAFyi , M7N8FAFzi , M7N8FAGxi , M7N8FAGyi , M7N8FAGzi , M7N8FAMxi , & - M7N8FAMyi , M7N8FAMzi , M7N8FBFxi , M7N8FBFyi , M7N8FBFzi , M7N8FBxi , M7N8FByi , & - M7N8FBzi , M7N8FDxi , M7N8FDyi , M7N8FDzi , M7N8FIxi , M7N8FIyi , M7N8FIzi , & - M7N8FMGxi , M7N8FMGyi , M7N8FMGzi , M7N8MAFxi , M7N8MAFyi , M7N8MAFzi , M7N8MAGxi , & - M7N8MAGyi , M7N8MAGzi , M7N8MBFxi , M7N8MBFyi , M7N8MBFzi , M7N8MBxi , M7N8MByi , & - M7N8MBzi , M7N8MMGxi , M7N8MMGyi , M7N8MMGzi , M7N8STAxi , M7N8STAyi , M7N8STAzi , & - M7N8STVxi , M7N8STVyi , M7N8STVzi , M7N8Vxi , M7N8Vyi , M7N8Vzi , M7N9Axi , & - M7N9Ayi , M7N9Azi , M7N9DynP , M7N9FAFxi , M7N9FAFyi , M7N9FAFzi , M7N9FAGxi , & - M7N9FAGyi , M7N9FAGzi , M7N9FAMxi , M7N9FAMyi , M7N9FAMzi , M7N9FBFxi , M7N9FBFyi , & - M7N9FBFzi , M7N9FBxi , M7N9FByi , M7N9FBzi , M7N9FDxi , M7N9FDyi , M7N9FDzi , & - M7N9FIxi , M7N9FIyi , M7N9FIzi , M7N9FMGxi , M7N9FMGyi , M7N9FMGzi , M7N9MAFxi , & - M7N9MAFyi , M7N9MAFzi , M7N9MAGxi , M7N9MAGyi , M7N9MAGzi , M7N9MBFxi , M7N9MBFyi , & - M7N9MBFzi , M7N9MBxi , M7N9MByi , M7N9MBzi , M7N9MMGxi , M7N9MMGyi , M7N9MMGzi , & - M7N9STAxi , M7N9STAyi , M7N9STAzi , M7N9STVxi , M7N9STVyi , M7N9STVzi , M7N9Vxi , & - M7N9Vyi , M7N9Vzi , M8N1Axi , M8N1Ayi , M8N1Azi , M8N1DynP , M8N1FAFxi , & - M8N1FAFyi , M8N1FAFzi , M8N1FAGxi , M8N1FAGyi , M8N1FAGzi , M8N1FAMxi , M8N1FAMyi , & - M8N1FAMzi , M8N1FBFxi , M8N1FBFyi , M8N1FBFzi , M8N1FBxi , M8N1FByi , M8N1FBzi , & - M8N1FDxi , M8N1FDyi , M8N1FDzi , M8N1FIxi , M8N1FIyi , M8N1FIzi , M8N1FMGxi , & - M8N1FMGyi , M8N1FMGzi , M8N1MAFxi , M8N1MAFyi , M8N1MAFzi , M8N1MAGxi , M8N1MAGyi , & - M8N1MAGzi , M8N1MBFxi , M8N1MBFyi , M8N1MBFzi , M8N1MBxi , M8N1MByi , M8N1MBzi , & - M8N1MMGxi , M8N1MMGyi , M8N1MMGzi , M8N1STAxi , M8N1STAyi , M8N1STAzi , M8N1STVxi , & - M8N1STVyi , M8N1STVzi , M8N1Vxi , M8N1Vyi , M8N1Vzi , M8N2Axi , M8N2Ayi , & - M8N2Azi , M8N2DynP , M8N2FAFxi , M8N2FAFyi , M8N2FAFzi , M8N2FAGxi , M8N2FAGyi , & - M8N2FAGzi , M8N2FAMxi , M8N2FAMyi , M8N2FAMzi , M8N2FBFxi , M8N2FBFyi , M8N2FBFzi , & - M8N2FBxi , M8N2FByi , M8N2FBzi , M8N2FDxi , M8N2FDyi , M8N2FDzi , M8N2FIxi , & - M8N2FIyi , M8N2FIzi , M8N2FMGxi , M8N2FMGyi , M8N2FMGzi , M8N2MAFxi , M8N2MAFyi , & - M8N2MAFzi , M8N2MAGxi , M8N2MAGyi , M8N2MAGzi , M8N2MBFxi , M8N2MBFyi , M8N2MBFzi , & - M8N2MBxi , M8N2MByi , M8N2MBzi , M8N2MMGxi , M8N2MMGyi , M8N2MMGzi , M8N2STAxi , & - M8N2STAyi , M8N2STAzi , M8N2STVxi , M8N2STVyi , M8N2STVzi , M8N2Vxi , M8N2Vyi , & - M8N2Vzi , M8N3Axi , M8N3Ayi , M8N3Azi , M8N3DynP , M8N3FAFxi , M8N3FAFyi , & - M8N3FAFzi , M8N3FAGxi , M8N3FAGyi , M8N3FAGzi , M8N3FAMxi , M8N3FAMyi , M8N3FAMzi , & - M8N3FBFxi , M8N3FBFyi , M8N3FBFzi , M8N3FBxi , M8N3FByi , M8N3FBzi , M8N3FDxi , & - M8N3FDyi , M8N3FDzi , M8N3FIxi , M8N3FIyi , M8N3FIzi , M8N3FMGxi , M8N3FMGyi , & - M8N3FMGzi , M8N3MAFxi , M8N3MAFyi , M8N3MAFzi , M8N3MAGxi , M8N3MAGyi , M8N3MAGzi , & - M8N3MBFxi , M8N3MBFyi , M8N3MBFzi , M8N3MBxi , M8N3MByi , M8N3MBzi , M8N3MMGxi , & - M8N3MMGyi , M8N3MMGzi , M8N3STAxi , M8N3STAyi , M8N3STAzi , M8N3STVxi , M8N3STVyi , & - M8N3STVzi , M8N3Vxi , M8N3Vyi , M8N3Vzi , M8N4Axi , M8N4Ayi , M8N4Azi , & - M8N4DynP , M8N4FAFxi , M8N4FAFyi , M8N4FAFzi , M8N4FAGxi , M8N4FAGyi , M8N4FAGzi , & - M8N4FAMxi , M8N4FAMyi , M8N4FAMzi , M8N4FBFxi , M8N4FBFyi , M8N4FBFzi , M8N4FBxi , & - M8N4FByi , M8N4FBzi , M8N4FDxi , M8N4FDyi , M8N4FDzi , M8N4FIxi , M8N4FIyi , & - M8N4FIzi , M8N4FMGxi , M8N4FMGyi , M8N4FMGzi , M8N4MAFxi , M8N4MAFyi , M8N4MAFzi , & - M8N4MAGxi , M8N4MAGyi , M8N4MAGzi , M8N4MBFxi , M8N4MBFyi , M8N4MBFzi , M8N4MBxi , & - M8N4MByi , M8N4MBzi , M8N4MMGxi , M8N4MMGyi , M8N4MMGzi , M8N4STAxi , M8N4STAyi , & - M8N4STAzi , M8N4STVxi , M8N4STVyi , M8N4STVzi , M8N4Vxi , M8N4Vyi , M8N4Vzi , & - M8N5Axi , M8N5Ayi , M8N5Azi , M8N5DynP , M8N5FAFxi , M8N5FAFyi , M8N5FAFzi , & - M8N5FAGxi , M8N5FAGyi , M8N5FAGzi , M8N5FAMxi , M8N5FAMyi , M8N5FAMzi , M8N5FBFxi , & - M8N5FBFyi , M8N5FBFzi , M8N5FBxi , M8N5FByi , M8N5FBzi , M8N5FDxi , M8N5FDyi , & - M8N5FDzi , M8N5FIxi , M8N5FIyi , M8N5FIzi , M8N5FMGxi , M8N5FMGyi , M8N5FMGzi , & - M8N5MAFxi , M8N5MAFyi , M8N5MAFzi , M8N5MAGxi , M8N5MAGyi , M8N5MAGzi , M8N5MBFxi , & - M8N5MBFyi , M8N5MBFzi , M8N5MBxi , M8N5MByi , M8N5MBzi , M8N5MMGxi , M8N5MMGyi , & - M8N5MMGzi , M8N5STAxi , M8N5STAyi , M8N5STAzi , M8N5STVxi , M8N5STVyi , M8N5STVzi , & - M8N5Vxi , M8N5Vyi , M8N5Vzi , M8N6Axi , M8N6Ayi , M8N6Azi , M8N6DynP , & - M8N6FAFxi , M8N6FAFyi , M8N6FAFzi , M8N6FAGxi , M8N6FAGyi , M8N6FAGzi , M8N6FAMxi , & - M8N6FAMyi , M8N6FAMzi , M8N6FBFxi , M8N6FBFyi , M8N6FBFzi , M8N6FBxi , M8N6FByi , & - M8N6FBzi , M8N6FDxi , M8N6FDyi , M8N6FDzi , M8N6FIxi , M8N6FIyi , M8N6FIzi , & - M8N6FMGxi , M8N6FMGyi , M8N6FMGzi , M8N6MAFxi , M8N6MAFyi , M8N6MAFzi , M8N6MAGxi , & - M8N6MAGyi , M8N6MAGzi , M8N6MBFxi , M8N6MBFyi , M8N6MBFzi , M8N6MBxi , M8N6MByi , & - M8N6MBzi , M8N6MMGxi , M8N6MMGyi , M8N6MMGzi , M8N6STAxi , M8N6STAyi , M8N6STAzi , & - M8N6STVxi , M8N6STVyi , M8N6STVzi , M8N6Vxi , M8N6Vyi , M8N6Vzi , M8N7Axi , & - M8N7Ayi , M8N7Azi , M8N7DynP , M8N7FAFxi , M8N7FAFyi , M8N7FAFzi , M8N7FAGxi , & - M8N7FAGyi , M8N7FAGzi , M8N7FAMxi , M8N7FAMyi , M8N7FAMzi , M8N7FBFxi , M8N7FBFyi , & - M8N7FBFzi , M8N7FBxi , M8N7FByi , M8N7FBzi , M8N7FDxi , M8N7FDyi , M8N7FDzi , & - M8N7FIxi , M8N7FIyi , M8N7FIzi /) - ParamIndxAry(4001:4500) = (/ & - M8N7FMGxi , M8N7FMGyi , M8N7FMGzi , M8N7MAFxi , M8N7MAFyi , M8N7MAFzi , M8N7MAGxi , & - M8N7MAGyi , M8N7MAGzi , M8N7MBFxi , M8N7MBFyi , M8N7MBFzi , M8N7MBxi , M8N7MByi , & - M8N7MBzi , M8N7MMGxi , M8N7MMGyi , M8N7MMGzi , M8N7STAxi , M8N7STAyi , M8N7STAzi , & - M8N7STVxi , M8N7STVyi , M8N7STVzi , M8N7Vxi , M8N7Vyi , M8N7Vzi , M8N8Axi , & - M8N8Ayi , M8N8Azi , M8N8DynP , M8N8FAFxi , M8N8FAFyi , M8N8FAFzi , M8N8FAGxi , & - M8N8FAGyi , M8N8FAGzi , M8N8FAMxi , M8N8FAMyi , M8N8FAMzi , M8N8FBFxi , M8N8FBFyi , & - M8N8FBFzi , M8N8FBxi , M8N8FByi , M8N8FBzi , M8N8FDxi , M8N8FDyi , M8N8FDzi , & - M8N8FIxi , M8N8FIyi , M8N8FIzi , M8N8FMGxi , M8N8FMGyi , M8N8FMGzi , M8N8MAFxi , & - M8N8MAFyi , M8N8MAFzi , M8N8MAGxi , M8N8MAGyi , M8N8MAGzi , M8N8MBFxi , M8N8MBFyi , & - M8N8MBFzi , M8N8MBxi , M8N8MByi , M8N8MBzi , M8N8MMGxi , M8N8MMGyi , M8N8MMGzi , & - M8N8STAxi , M8N8STAyi , M8N8STAzi , M8N8STVxi , M8N8STVyi , M8N8STVzi , M8N8Vxi , & - M8N8Vyi , M8N8Vzi , M8N9Axi , M8N9Ayi , M8N9Azi , M8N9DynP , M8N9FAFxi , & - M8N9FAFyi , M8N9FAFzi , M8N9FAGxi , M8N9FAGyi , M8N9FAGzi , M8N9FAMxi , M8N9FAMyi , & - M8N9FAMzi , M8N9FBFxi , M8N9FBFyi , M8N9FBFzi , M8N9FBxi , M8N9FByi , M8N9FBzi , & - M8N9FDxi , M8N9FDyi , M8N9FDzi , M8N9FIxi , M8N9FIyi , M8N9FIzi , M8N9FMGxi , & - M8N9FMGyi , M8N9FMGzi , M8N9MAFxi , M8N9MAFyi , M8N9MAFzi , M8N9MAGxi , M8N9MAGyi , & - M8N9MAGzi , M8N9MBFxi , M8N9MBFyi , M8N9MBFzi , M8N9MBxi , M8N9MByi , M8N9MBzi , & - M8N9MMGxi , M8N9MMGyi , M8N9MMGzi , M8N9STAxi , M8N9STAyi , M8N9STAzi , M8N9STVxi , & - M8N9STVyi , M8N9STVzi , M8N9Vxi , M8N9Vyi , M8N9Vzi , M9N1Axi , M9N1Ayi , & - M9N1Azi , M9N1DynP , M9N1FAFxi , M9N1FAFyi , M9N1FAFzi , M9N1FAGxi , M9N1FAGyi , & - M9N1FAGzi , M9N1FAMxi , M9N1FAMyi , M9N1FAMzi , M9N1FBFxi , M9N1FBFyi , M9N1FBFzi , & - M9N1FBxi , M9N1FByi , M9N1FBzi , M9N1FDxi , M9N1FDyi , M9N1FDzi , M9N1FIxi , & - M9N1FIyi , M9N1FIzi , M9N1FMGxi , M9N1FMGyi , M9N1FMGzi , M9N1MAFxi , M9N1MAFyi , & - M9N1MAFzi , M9N1MAGxi , M9N1MAGyi , M9N1MAGzi , M9N1MBFxi , M9N1MBFyi , M9N1MBFzi , & - M9N1MBxi , M9N1MByi , M9N1MBzi , M9N1MMGxi , M9N1MMGyi , M9N1MMGzi , M9N1STAxi , & - M9N1STAyi , M9N1STAzi , M9N1STVxi , M9N1STVyi , M9N1STVzi , M9N1Vxi , M9N1Vyi , & - M9N1Vzi , M9N2Axi , M9N2Ayi , M9N2Azi , M9N2DynP , M9N2FAFxi , M9N2FAFyi , & - M9N2FAFzi , M9N2FAGxi , M9N2FAGyi , M9N2FAGzi , M9N2FAMxi , M9N2FAMyi , M9N2FAMzi , & - M9N2FBFxi , M9N2FBFyi , M9N2FBFzi , M9N2FBxi , M9N2FByi , M9N2FBzi , M9N2FDxi , & - M9N2FDyi , M9N2FDzi , M9N2FIxi , M9N2FIyi , M9N2FIzi , M9N2FMGxi , M9N2FMGyi , & - M9N2FMGzi , M9N2MAFxi , M9N2MAFyi , M9N2MAFzi , M9N2MAGxi , M9N2MAGyi , M9N2MAGzi , & - M9N2MBFxi , M9N2MBFyi , M9N2MBFzi , M9N2MBxi , M9N2MByi , M9N2MBzi , M9N2MMGxi , & - M9N2MMGyi , M9N2MMGzi , M9N2STAxi , M9N2STAyi , M9N2STAzi , M9N2STVxi , M9N2STVyi , & - M9N2STVzi , M9N2Vxi , M9N2Vyi , M9N2Vzi , M9N3Axi , M9N3Ayi , M9N3Azi , & - M9N3DynP , M9N3FAFxi , M9N3FAFyi , M9N3FAFzi , M9N3FAGxi , M9N3FAGyi , M9N3FAGzi , & - M9N3FAMxi , M9N3FAMyi , M9N3FAMzi , M9N3FBFxi , M9N3FBFyi , M9N3FBFzi , M9N3FBxi , & - M9N3FByi , M9N3FBzi , M9N3FDxi , M9N3FDyi , M9N3FDzi , M9N3FIxi , M9N3FIyi , & - M9N3FIzi , M9N3FMGxi , M9N3FMGyi , M9N3FMGzi , M9N3MAFxi , M9N3MAFyi , M9N3MAFzi , & - M9N3MAGxi , M9N3MAGyi , M9N3MAGzi , M9N3MBFxi , M9N3MBFyi , M9N3MBFzi , M9N3MBxi , & - M9N3MByi , M9N3MBzi , M9N3MMGxi , M9N3MMGyi , M9N3MMGzi , M9N3STAxi , M9N3STAyi , & - M9N3STAzi , M9N3STVxi , M9N3STVyi , M9N3STVzi , M9N3Vxi , M9N3Vyi , M9N3Vzi , & - M9N4Axi , M9N4Ayi , M9N4Azi , M9N4DynP , M9N4FAFxi , M9N4FAFyi , M9N4FAFzi , & - M9N4FAGxi , M9N4FAGyi , M9N4FAGzi , M9N4FAMxi , M9N4FAMyi , M9N4FAMzi , M9N4FBFxi , & - M9N4FBFyi , M9N4FBFzi , M9N4FBxi , M9N4FByi , M9N4FBzi , M9N4FDxi , M9N4FDyi , & - M9N4FDzi , M9N4FIxi , M9N4FIyi , M9N4FIzi , M9N4FMGxi , M9N4FMGyi , M9N4FMGzi , & - M9N4MAFxi , M9N4MAFyi , M9N4MAFzi , M9N4MAGxi , M9N4MAGyi , M9N4MAGzi , M9N4MBFxi , & - M9N4MBFyi , M9N4MBFzi , M9N4MBxi , M9N4MByi , M9N4MBzi , M9N4MMGxi , M9N4MMGyi , & - M9N4MMGzi , M9N4STAxi , M9N4STAyi , M9N4STAzi , M9N4STVxi , M9N4STVyi , M9N4STVzi , & - M9N4Vxi , M9N4Vyi , M9N4Vzi , M9N5Axi , M9N5Ayi , M9N5Azi , M9N5DynP , & - M9N5FAFxi , M9N5FAFyi , M9N5FAFzi , M9N5FAGxi , M9N5FAGyi , M9N5FAGzi , M9N5FAMxi , & - M9N5FAMyi , M9N5FAMzi , M9N5FBFxi , M9N5FBFyi , M9N5FBFzi , M9N5FBxi , M9N5FByi , & - M9N5FBzi , M9N5FDxi , M9N5FDyi , M9N5FDzi , M9N5FIxi , M9N5FIyi , M9N5FIzi , & - M9N5FMGxi , M9N5FMGyi , M9N5FMGzi , M9N5MAFxi , M9N5MAFyi , M9N5MAFzi , M9N5MAGxi , & - M9N5MAGyi , M9N5MAGzi , M9N5MBFxi , M9N5MBFyi , M9N5MBFzi , M9N5MBxi , M9N5MByi , & - M9N5MBzi , M9N5MMGxi , M9N5MMGyi , M9N5MMGzi , M9N5STAxi , M9N5STAyi , M9N5STAzi , & - M9N5STVxi , M9N5STVyi , M9N5STVzi , M9N5Vxi , M9N5Vyi , M9N5Vzi , M9N6Axi , & - M9N6Ayi , M9N6Azi , M9N6DynP , M9N6FAFxi , M9N6FAFyi , M9N6FAFzi , M9N6FAGxi , & - M9N6FAGyi , M9N6FAGzi , M9N6FAMxi , M9N6FAMyi , M9N6FAMzi , M9N6FBFxi , M9N6FBFyi , & - M9N6FBFzi , M9N6FBxi , M9N6FByi , M9N6FBzi , M9N6FDxi , M9N6FDyi , M9N6FDzi , & - M9N6FIxi , M9N6FIyi , M9N6FIzi , M9N6FMGxi , M9N6FMGyi , M9N6FMGzi , M9N6MAFxi , & - M9N6MAFyi , M9N6MAFzi , M9N6MAGxi , M9N6MAGyi , M9N6MAGzi , M9N6MBFxi , M9N6MBFyi , & - M9N6MBFzi , M9N6MBxi , M9N6MByi , M9N6MBzi , M9N6MMGxi , M9N6MMGyi , M9N6MMGzi , & - M9N6STAxi , M9N6STAyi , M9N6STAzi , M9N6STVxi , M9N6STVyi , M9N6STVzi , M9N6Vxi , & - M9N6Vyi , M9N6Vzi , M9N7Axi , M9N7Ayi , M9N7Azi , M9N7DynP , M9N7FAFxi , & - M9N7FAFyi , M9N7FAFzi , M9N7FAGxi , M9N7FAGyi , M9N7FAGzi , M9N7FAMxi , M9N7FAMyi , & - M9N7FAMzi , M9N7FBFxi , M9N7FBFyi , M9N7FBFzi , M9N7FBxi , M9N7FByi , M9N7FBzi , & - M9N7FDxi , M9N7FDyi , M9N7FDzi , M9N7FIxi , M9N7FIyi , M9N7FIzi , M9N7FMGxi , & - M9N7FMGyi , M9N7FMGzi , M9N7MAFxi , M9N7MAFyi , M9N7MAFzi , M9N7MAGxi , M9N7MAGyi , & - M9N7MAGzi , M9N7MBFxi , M9N7MBFyi , M9N7MBFzi , M9N7MBxi , M9N7MByi , M9N7MBzi , & - M9N7MMGxi , M9N7MMGyi , M9N7MMGzi , M9N7STAxi , M9N7STAyi , M9N7STAzi , M9N7STVxi , & - M9N7STVyi , M9N7STVzi , M9N7Vxi , M9N7Vyi , M9N7Vzi , M9N8Axi , M9N8Ayi , & - M9N8Azi , M9N8DynP , M9N8FAFxi /) - ParamIndxAry(4501:4599) = (/ & - M9N8FAFyi , M9N8FAFzi , M9N8FAGxi , M9N8FAGyi , M9N8FAGzi , M9N8FAMxi , M9N8FAMyi , & - M9N8FAMzi , M9N8FBFxi , M9N8FBFyi , M9N8FBFzi , M9N8FBxi , M9N8FByi , M9N8FBzi , & - M9N8FDxi , M9N8FDyi , M9N8FDzi , M9N8FIxi , M9N8FIyi , M9N8FIzi , M9N8FMGxi , & - M9N8FMGyi , M9N8FMGzi , M9N8MAFxi , M9N8MAFyi , M9N8MAFzi , M9N8MAGxi , M9N8MAGyi , & - M9N8MAGzi , M9N8MBFxi , M9N8MBFyi , M9N8MBFzi , M9N8MBxi , M9N8MByi , M9N8MBzi , & - M9N8MMGxi , M9N8MMGyi , M9N8MMGzi , M9N8STAxi , M9N8STAyi , M9N8STAzi , M9N8STVxi , & - M9N8STVyi , M9N8STVzi , M9N8Vxi , M9N8Vyi , M9N8Vzi , M9N9Axi , M9N9Ayi , & - M9N9Azi , M9N9DynP , M9N9FAFxi , M9N9FAFyi , M9N9FAFzi , M9N9FAGxi , M9N9FAGyi , & - M9N9FAGzi , M9N9FAMxi , M9N9FAMyi , M9N9FAMzi , M9N9FBFxi , M9N9FBFyi , M9N9FBFzi , & - M9N9FBxi , M9N9FByi , M9N9FBzi , M9N9FDxi , M9N9FDyi , M9N9FDzi , M9N9FIxi , & - M9N9FIyi , M9N9FIzi , M9N9FMGxi , M9N9FMGyi , M9N9FMGzi , M9N9MAFxi , M9N9MAFyi , & - M9N9MAFzi , M9N9MAGxi , M9N9MAGyi , M9N9MAGzi , M9N9MBFxi , M9N9MBFyi , M9N9MBFzi , & - M9N9MBxi , M9N9MByi , M9N9MBzi , M9N9MMGxi , M9N9MMGyi , M9N9MMGzi , M9N9STAxi , & - M9N9STAyi , M9N9STAzi , M9N9STVxi , M9N9STVyi , M9N9STVzi , M9N9Vxi , M9N9Vyi , & - M9N9Vzi /) - ParamUnitsAry(1:500) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) "/) - ParamUnitsAry(501:1000) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) "/) - ParamUnitsAry(1001:1500) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) "/) - ParamUnitsAry(1501:2000) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) "/) - ParamUnitsAry(2001:2500) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) "/) - ParamUnitsAry(2501:3000) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) "/) - ParamUnitsAry(3001:3500) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) "/) - ParamUnitsAry(3501:4000) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) "/) - ParamUnitsAry(4001:4500) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(Pa) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) "/) - ParamUnitsAry(4501:4599) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) "/) + ValidParamAry(1:497) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "J1AXI ","J1AYI ","J1AZI ","J1DYNP ","J1FAGXI ","J1FAGYI ","J1FAGZI ", & + "J1FAMXI ","J1FAMYI ","J1FAMZI ","J1FBFXI ","J1FBFYI ","J1FBFZI ","J1FBXI ", & + "J1FBYI ","J1FBZI ","J1FDXI ","J1FDYI ","J1FDZI ","J1FIXI ","J1FIYI ", & + "J1FIZI ","J1FMGXI ","J1FMGYI ","J1FMGZI ","J1MAGXI ","J1MAGYI ","J1MAGZI ", & + "J1MBFXI ","J1MBFYI ","J1MBFZI ","J1MBXI ","J1MBYI ","J1MBZI ","J1STAXI ", & + "J1STAYI ","J1STAZI ","J1STVXI ","J1STVYI ","J1STVZI ","J1VXI ","J1VYI ", & + "J1VZI ","J1WAVEELEV","J1WAVEELV1","J1WAVEELV2","J2AXI ","J2AYI ","J2AZI ", & + "J2DYNP ","J2FAGXI ","J2FAGYI ","J2FAGZI ","J2FAMXI ","J2FAMYI ","J2FAMZI ", & + "J2FBFXI ","J2FBFYI ","J2FBFZI ","J2FBXI ","J2FBYI ","J2FBZI ","J2FDXI ", & + "J2FDYI ","J2FDZI ","J2FIXI ","J2FIYI ","J2FIZI ","J2FMGXI ","J2FMGYI ", & + "J2FMGZI ","J2MAGXI ","J2MAGYI ","J2MAGZI ","J2MBFXI ","J2MBFYI ","J2MBFZI ", & + "J2MBXI ","J2MBYI ","J2MBZI ","J2STAXI ","J2STAYI ","J2STAZI ","J2STVXI ", & + "J2STVYI ","J2STVZI ","J2VXI ","J2VYI ","J2VZI ","J2WAVEELEV","J2WAVEELV1", & + "J2WAVEELV2","J3AXI ","J3AYI ","J3AZI ","J3DYNP ","J3FAGXI ","J3FAGYI ", & + "J3FAGZI ","J3FAMXI ","J3FAMYI ","J3FAMZI ","J3FBFXI ","J3FBFYI ","J3FBFZI ", & + "J3FBXI ","J3FBYI ","J3FBZI ","J3FDXI ","J3FDYI ","J3FDZI ","J3FIXI ", & + "J3FIYI ","J3FIZI ","J3FMGXI ","J3FMGYI ","J3FMGZI ","J3MAGXI ","J3MAGYI ", & + "J3MAGZI ","J3MBFXI ","J3MBFYI ","J3MBFZI ","J3MBXI ","J3MBYI ","J3MBZI ", & + "J3STAXI ","J3STAYI ","J3STAZI ","J3STVXI ","J3STVYI ","J3STVZI ","J3VXI ", & + "J3VYI ","J3VZI ","J3WAVEELEV","J3WAVEELV1","J3WAVEELV2","J4AXI ","J4AYI ", & + "J4AZI ","J4DYNP ","J4FAGXI ","J4FAGYI ","J4FAGZI ","J4FAMXI ","J4FAMYI ", & + "J4FAMZI ","J4FBFXI ","J4FBFYI ","J4FBFZI ","J4FBXI ","J4FBYI ","J4FBZI ", & + "J4FDXI ","J4FDYI ","J4FDZI ","J4FIXI ","J4FIYI ","J4FIZI ","J4FMGXI ", & + "J4FMGYI ","J4FMGZI ","J4MAGXI ","J4MAGYI ","J4MAGZI ","J4MBFXI ","J4MBFYI ", & + "J4MBFZI ","J4MBXI ","J4MBYI ","J4MBZI ","J4STAXI ","J4STAYI ","J4STAZI ", & + "J4STVXI ","J4STVYI ","J4STVZI ","J4VXI ","J4VYI ","J4VZI ","J4WAVEELEV", & + "J4WAVEELV1","J4WAVEELV2","J5AXI ","J5AYI ","J5AZI ","J5DYNP ","J5FAGXI ", & + "J5FAGYI ","J5FAGZI ","J5FAMXI ","J5FAMYI ","J5FAMZI ","J5FBFXI ","J5FBFYI ", & + "J5FBFZI ","J5FBXI ","J5FBYI ","J5FBZI ","J5FDXI ","J5FDYI ","J5FDZI ", & + "J5FIXI ","J5FIYI ","J5FIZI ","J5FMGXI ","J5FMGYI ","J5FMGZI ","J5MAGXI ", & + "J5MAGYI ","J5MAGZI ","J5MBFXI ","J5MBFYI ","J5MBFZI ","J5MBXI ","J5MBYI ", & + "J5MBZI ","J5STAXI ","J5STAYI ","J5STAZI ","J5STVXI ","J5STVYI ","J5STVZI ", & + "J5VXI ","J5VYI ","J5VZI ","J5WAVEELEV","J5WAVEELV1","J5WAVEELV2","J6AXI ", & + "J6AYI ","J6AZI ","J6DYNP ","J6FAGXI ","J6FAGYI ","J6FAGZI ","J6FAMXI ", & + "J6FAMYI ","J6FAMZI ","J6FBFXI ","J6FBFYI ","J6FBFZI ","J6FBXI ","J6FBYI ", & + "J6FBZI ","J6FDXI ","J6FDYI ","J6FDZI ","J6FIXI ","J6FIYI ","J6FIZI ", & + "J6FMGXI ","J6FMGYI ","J6FMGZI ","J6MAGXI ","J6MAGYI ","J6MAGZI ","J6MBFXI ", & + "J6MBFYI ","J6MBFZI ","J6MBXI ","J6MBYI ","J6MBZI ","J6STAXI ","J6STAYI ", & + "J6STAZI ","J6STVXI ","J6STVYI ","J6STVZI ","J6VXI ","J6VYI ","J6VZI ", & + "J6WAVEELEV","J6WAVEELV1","J6WAVEELV2","J7AXI ","J7AYI ","J7AZI ","J7DYNP ", & + "J7FAGXI ","J7FAGYI ","J7FAGZI ","J7FAMXI ","J7FAMYI ","J7FAMZI ","J7FBFXI ", & + "J7FBFYI ","J7FBFZI ","J7FBXI ","J7FBYI ","J7FBZI ","J7FDXI ","J7FDYI ", & + "J7FDZI ","J7FIXI ","J7FIYI ","J7FIZI ","J7FMGXI ","J7FMGYI ","J7FMGZI ", & + "J7MAGXI ","J7MAGYI ","J7MAGZI ","J7MBFXI ","J7MBFYI ","J7MBFZI ","J7MBXI ", & + "J7MBYI ","J7MBZI ","J7STAXI ","J7STAYI ","J7STAZI ","J7STVXI ","J7STVYI ", & + "J7STVZI ","J7VXI ","J7VYI ","J7VZI ","J7WAVEELEV","J7WAVEELV1","J7WAVEELV2", & + "J8AXI ","J8AYI ","J8AZI ","J8DYNP ","J8FAGXI ","J8FAGYI ","J8FAGZI ", & + "J8FAMXI ","J8FAMYI ","J8FAMZI ","J8FBFXI ","J8FBFYI ","J8FBFZI ","J8FBXI ", & + "J8FBYI ","J8FBZI ","J8FDXI ","J8FDYI ","J8FDZI ","J8FIXI ","J8FIYI ", & + "J8FIZI ","J8FMGXI ","J8FMGYI ","J8FMGZI ","J8MAGXI ","J8MAGYI ","J8MAGZI ", & + "J8MBFXI ","J8MBFYI ","J8MBFZI ","J8MBXI ","J8MBYI ","J8MBZI ","J8STAXI ", & + "J8STAYI ","J8STAZI ","J8STVXI ","J8STVYI ","J8STVZI ","J8VXI ","J8VYI ", & + "J8VZI ","J8WAVEELEV","J8WAVEELV1","J8WAVEELV2","J9AXI ","J9AYI ","J9AZI ", & + "J9DYNP ","J9FAGXI ","J9FAGYI ","J9FAGZI ","J9FAMXI ","J9FAMYI ","J9FAMZI ", & + "J9FBFXI ","J9FBFYI ","J9FBFZI ","J9FBXI ","J9FBYI ","J9FBZI ","J9FDXI ", & + "J9FDYI ","J9FDZI ","J9FIXI ","J9FIYI ","J9FIZI ","J9FMGXI ","J9FMGYI ", & + "J9FMGZI ","J9MAGXI ","J9MAGYI ","J9MAGZI ","J9MBFXI ","J9MBFYI ","J9MBFZI ", & + "J9MBXI ","J9MBYI ","J9MBZI ","J9STAXI ","J9STAYI ","J9STAZI ","J9STVXI ", & + "J9STVYI ","J9STVZI ","J9VXI ","J9VYI ","J9VZI ","J9WAVEELEV","J9WAVEELV1", & + "J9WAVEELV2","M1N1AXI ","M1N1AYI ","M1N1AZI ","M1N1DYNP ","M1N1FAFXI ","M1N1FAFYI ", & + "M1N1FAFZI ","M1N1FAGXI ","M1N1FAGYI ","M1N1FAGZI ","M1N1FAMXI ","M1N1FAMYI ","M1N1FAMZI ", & + "M1N1FBFXI ","M1N1FBFYI ","M1N1FBFZI ","M1N1FBXI ","M1N1FBYI ","M1N1FBZI ","M1N1FDXI ", & + "M1N1FDYI ","M1N1FDZI ","M1N1FIXI ","M1N1FIYI ","M1N1FIZI ","M1N1FMGXI ","M1N1FMGYI ", & + "M1N1FMGZI ","M1N1MAFXI ","M1N1MAFYI ","M1N1MAFZI ","M1N1MAGXI ","M1N1MAGYI ","M1N1MAGZI ", & + "M1N1MBFXI ","M1N1MBFYI ","M1N1MBFZI ","M1N1MBXI ","M1N1MBYI ","M1N1MBZI ","M1N1MMGXI ", & + "M1N1MMGYI ","M1N1MMGZI ","M1N1STAXI ","M1N1STAYI ","M1N1STAZI ","M1N1STVXI ","M1N1STVYI ", & + "M1N1STVZI ","M1N1VXI ","M1N1VYI ","M1N1VZI ","M1N2AXI ","M1N2AYI ","M1N2AZI ", & + "M1N2DYNP ","M1N2FAFXI ","M1N2FAFYI ","M1N2FAFZI ","M1N2FAGXI ","M1N2FAGYI ","M1N2FAGZI ", & + "M1N2FAMXI ","M1N2FAMYI ","M1N2FAMZI ","M1N2FBFXI ","M1N2FBFYI ","M1N2FBFZI ","M1N2FBXI ", & + "M1N2FBYI ","M1N2FBZI ","M1N2FDXI ","M1N2FDYI ","M1N2FDZI ","M1N2FIXI ","M1N2FIYI ", & + "M1N2FIZI ","M1N2FMGXI ","M1N2FMGYI ","M1N2FMGZI ","M1N2MAFXI ","M1N2MAFYI ","M1N2MAFZI "/) + ValidParamAry(498:994) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M1N2MAGXI ","M1N2MAGYI ","M1N2MAGZI ","M1N2MBFXI ","M1N2MBFYI ","M1N2MBFZI ","M1N2MBXI ", & + "M1N2MBYI ","M1N2MBZI ","M1N2MMGXI ","M1N2MMGYI ","M1N2MMGZI ","M1N2STAXI ","M1N2STAYI ", & + "M1N2STAZI ","M1N2STVXI ","M1N2STVYI ","M1N2STVZI ","M1N2VXI ","M1N2VYI ","M1N2VZI ", & + "M1N3AXI ","M1N3AYI ","M1N3AZI ","M1N3DYNP ","M1N3FAFXI ","M1N3FAFYI ","M1N3FAFZI ", & + "M1N3FAGXI ","M1N3FAGYI ","M1N3FAGZI ","M1N3FAMXI ","M1N3FAMYI ","M1N3FAMZI ","M1N3FBFXI ", & + "M1N3FBFYI ","M1N3FBFZI ","M1N3FBXI ","M1N3FBYI ","M1N3FBZI ","M1N3FDXI ","M1N3FDYI ", & + "M1N3FDZI ","M1N3FIXI ","M1N3FIYI ","M1N3FIZI ","M1N3FMGXI ","M1N3FMGYI ","M1N3FMGZI ", & + "M1N3MAFXI ","M1N3MAFYI ","M1N3MAFZI ","M1N3MAGXI ","M1N3MAGYI ","M1N3MAGZI ","M1N3MBFXI ", & + "M1N3MBFYI ","M1N3MBFZI ","M1N3MBXI ","M1N3MBYI ","M1N3MBZI ","M1N3MMGXI ","M1N3MMGYI ", & + "M1N3MMGZI ","M1N3STAXI ","M1N3STAYI ","M1N3STAZI ","M1N3STVXI ","M1N3STVYI ","M1N3STVZI ", & + "M1N3VXI ","M1N3VYI ","M1N3VZI ","M1N4AXI ","M1N4AYI ","M1N4AZI ","M1N4DYNP ", & + "M1N4FAFXI ","M1N4FAFYI ","M1N4FAFZI ","M1N4FAGXI ","M1N4FAGYI ","M1N4FAGZI ","M1N4FAMXI ", & + "M1N4FAMYI ","M1N4FAMZI ","M1N4FBFXI ","M1N4FBFYI ","M1N4FBFZI ","M1N4FBXI ","M1N4FBYI ", & + "M1N4FBZI ","M1N4FDXI ","M1N4FDYI ","M1N4FDZI ","M1N4FIXI ","M1N4FIYI ","M1N4FIZI ", & + "M1N4FMGXI ","M1N4FMGYI ","M1N4FMGZI ","M1N4MAFXI ","M1N4MAFYI ","M1N4MAFZI ","M1N4MAGXI ", & + "M1N4MAGYI ","M1N4MAGZI ","M1N4MBFXI ","M1N4MBFYI ","M1N4MBFZI ","M1N4MBXI ","M1N4MBYI ", & + "M1N4MBZI ","M1N4MMGXI ","M1N4MMGYI ","M1N4MMGZI ","M1N4STAXI ","M1N4STAYI ","M1N4STAZI ", & + "M1N4STVXI ","M1N4STVYI ","M1N4STVZI ","M1N4VXI ","M1N4VYI ","M1N4VZI ","M1N5AXI ", & + "M1N5AYI ","M1N5AZI ","M1N5DYNP ","M1N5FAFXI ","M1N5FAFYI ","M1N5FAFZI ","M1N5FAGXI ", & + "M1N5FAGYI ","M1N5FAGZI ","M1N5FAMXI ","M1N5FAMYI ","M1N5FAMZI ","M1N5FBFXI ","M1N5FBFYI ", & + "M1N5FBFZI ","M1N5FBXI ","M1N5FBYI ","M1N5FBZI ","M1N5FDXI ","M1N5FDYI ","M1N5FDZI ", & + "M1N5FIXI ","M1N5FIYI ","M1N5FIZI ","M1N5FMGXI ","M1N5FMGYI ","M1N5FMGZI ","M1N5MAFXI ", & + "M1N5MAFYI ","M1N5MAFZI ","M1N5MAGXI ","M1N5MAGYI ","M1N5MAGZI ","M1N5MBFXI ","M1N5MBFYI ", & + "M1N5MBFZI ","M1N5MBXI ","M1N5MBYI ","M1N5MBZI ","M1N5MMGXI ","M1N5MMGYI ","M1N5MMGZI ", & + "M1N5STAXI ","M1N5STAYI ","M1N5STAZI ","M1N5STVXI ","M1N5STVYI ","M1N5STVZI ","M1N5VXI ", & + "M1N5VYI ","M1N5VZI ","M1N6AXI ","M1N6AYI ","M1N6AZI ","M1N6DYNP ","M1N6FAFXI ", & + "M1N6FAFYI ","M1N6FAFZI ","M1N6FAGXI ","M1N6FAGYI ","M1N6FAGZI ","M1N6FAMXI ","M1N6FAMYI ", & + "M1N6FAMZI ","M1N6FBFXI ","M1N6FBFYI ","M1N6FBFZI ","M1N6FBXI ","M1N6FBYI ","M1N6FBZI ", & + "M1N6FDXI ","M1N6FDYI ","M1N6FDZI ","M1N6FIXI ","M1N6FIYI ","M1N6FIZI ","M1N6FMGXI ", & + "M1N6FMGYI ","M1N6FMGZI ","M1N6MAFXI ","M1N6MAFYI ","M1N6MAFZI ","M1N6MAGXI ","M1N6MAGYI ", & + "M1N6MAGZI ","M1N6MBFXI ","M1N6MBFYI ","M1N6MBFZI ","M1N6MBXI ","M1N6MBYI ","M1N6MBZI ", & + "M1N6MMGXI ","M1N6MMGYI ","M1N6MMGZI ","M1N6STAXI ","M1N6STAYI ","M1N6STAZI ","M1N6STVXI ", & + "M1N6STVYI ","M1N6STVZI ","M1N6VXI ","M1N6VYI ","M1N6VZI ","M1N7AXI ","M1N7AYI ", & + "M1N7AZI ","M1N7DYNP ","M1N7FAFXI ","M1N7FAFYI ","M1N7FAFZI ","M1N7FAGXI ","M1N7FAGYI ", & + "M1N7FAGZI ","M1N7FAMXI ","M1N7FAMYI ","M1N7FAMZI ","M1N7FBFXI ","M1N7FBFYI ","M1N7FBFZI ", & + "M1N7FBXI ","M1N7FBYI ","M1N7FBZI ","M1N7FDXI ","M1N7FDYI ","M1N7FDZI ","M1N7FIXI ", & + "M1N7FIYI ","M1N7FIZI ","M1N7FMGXI ","M1N7FMGYI ","M1N7FMGZI ","M1N7MAFXI ","M1N7MAFYI ", & + "M1N7MAFZI ","M1N7MAGXI ","M1N7MAGYI ","M1N7MAGZI ","M1N7MBFXI ","M1N7MBFYI ","M1N7MBFZI ", & + "M1N7MBXI ","M1N7MBYI ","M1N7MBZI ","M1N7MMGXI ","M1N7MMGYI ","M1N7MMGZI ","M1N7STAXI ", & + "M1N7STAYI ","M1N7STAZI ","M1N7STVXI ","M1N7STVYI ","M1N7STVZI ","M1N7VXI ","M1N7VYI ", & + "M1N7VZI ","M1N8AXI ","M1N8AYI ","M1N8AZI ","M1N8DYNP ","M1N8FAFXI ","M1N8FAFYI ", & + "M1N8FAFZI ","M1N8FAGXI ","M1N8FAGYI ","M1N8FAGZI ","M1N8FAMXI ","M1N8FAMYI ","M1N8FAMZI ", & + "M1N8FBFXI ","M1N8FBFYI ","M1N8FBFZI ","M1N8FBXI ","M1N8FBYI ","M1N8FBZI ","M1N8FDXI ", & + "M1N8FDYI ","M1N8FDZI ","M1N8FIXI ","M1N8FIYI ","M1N8FIZI ","M1N8FMGXI ","M1N8FMGYI ", & + "M1N8FMGZI ","M1N8MAFXI ","M1N8MAFYI ","M1N8MAFZI ","M1N8MAGXI ","M1N8MAGYI ","M1N8MAGZI ", & + "M1N8MBFXI ","M1N8MBFYI ","M1N8MBFZI ","M1N8MBXI ","M1N8MBYI ","M1N8MBZI ","M1N8MMGXI ", & + "M1N8MMGYI ","M1N8MMGZI ","M1N8STAXI ","M1N8STAYI ","M1N8STAZI ","M1N8STVXI ","M1N8STVYI ", & + "M1N8STVZI ","M1N8VXI ","M1N8VYI ","M1N8VZI ","M1N9AXI ","M1N9AYI ","M1N9AZI ", & + "M1N9DYNP ","M1N9FAFXI ","M1N9FAFYI ","M1N9FAFZI ","M1N9FAGXI ","M1N9FAGYI ","M1N9FAGZI ", & + "M1N9FAMXI ","M1N9FAMYI ","M1N9FAMZI ","M1N9FBFXI ","M1N9FBFYI ","M1N9FBFZI ","M1N9FBXI ", & + "M1N9FBYI ","M1N9FBZI ","M1N9FDXI ","M1N9FDYI ","M1N9FDZI ","M1N9FIXI ","M1N9FIYI ", & + "M1N9FIZI ","M1N9FMGXI ","M1N9FMGYI ","M1N9FMGZI ","M1N9MAFXI ","M1N9MAFYI ","M1N9MAFZI ", & + "M1N9MAGXI ","M1N9MAGYI ","M1N9MAGZI ","M1N9MBFXI ","M1N9MBFYI ","M1N9MBFZI ","M1N9MBXI ", & + "M1N9MBYI ","M1N9MBZI ","M1N9MMGXI ","M1N9MMGYI ","M1N9MMGZI ","M1N9STAXI ","M1N9STAYI ", & + "M1N9STAZI ","M1N9STVXI ","M1N9STVYI ","M1N9STVZI ","M1N9VXI ","M1N9VYI ","M1N9VZI ", & + "M2N1AXI ","M2N1AYI ","M2N1AZI ","M2N1DYNP ","M2N1FAFXI ","M2N1FAFYI ","M2N1FAFZI ", & + "M2N1FAGXI ","M2N1FAGYI ","M2N1FAGZI ","M2N1FAMXI ","M2N1FAMYI ","M2N1FAMZI ","M2N1FBFXI ", & + "M2N1FBFYI ","M2N1FBFZI ","M2N1FBXI ","M2N1FBYI ","M2N1FBZI ","M2N1FDXI ","M2N1FDYI ", & + "M2N1FDZI ","M2N1FIXI ","M2N1FIYI ","M2N1FIZI ","M2N1FMGXI ","M2N1FMGYI ","M2N1FMGZI ", & + "M2N1MAFXI ","M2N1MAFYI ","M2N1MAFZI ","M2N1MAGXI ","M2N1MAGYI ","M2N1MAGZI ","M2N1MBFXI ", & + "M2N1MBFYI ","M2N1MBFZI ","M2N1MBXI ","M2N1MBYI ","M2N1MBZI ","M2N1MMGXI ","M2N1MMGYI ", & + "M2N1MMGZI ","M2N1STAXI ","M2N1STAYI ","M2N1STAZI ","M2N1STVXI ","M2N1STVYI ","M2N1STVZI ", & + "M2N1VXI ","M2N1VYI ","M2N1VZI ","M2N2AXI ","M2N2AYI ","M2N2AZI ","M2N2DYNP ", & + "M2N2FAFXI ","M2N2FAFYI ","M2N2FAFZI ","M2N2FAGXI ","M2N2FAGYI ","M2N2FAGZI ","M2N2FAMXI ", & + "M2N2FAMYI ","M2N2FAMZI ","M2N2FBFXI ","M2N2FBFYI ","M2N2FBFZI ","M2N2FBXI ","M2N2FBYI ", & + "M2N2FBZI ","M2N2FDXI ","M2N2FDYI ","M2N2FDZI ","M2N2FIXI ","M2N2FIYI ","M2N2FIZI ", & + "M2N2FMGXI ","M2N2FMGYI ","M2N2FMGZI ","M2N2MAFXI ","M2N2MAFYI ","M2N2MAFZI ","M2N2MAGXI ", & + "M2N2MAGYI ","M2N2MAGZI ","M2N2MBFXI ","M2N2MBFYI ","M2N2MBFZI ","M2N2MBXI ","M2N2MBYI ", & + "M2N2MBZI ","M2N2MMGXI ","M2N2MMGYI ","M2N2MMGZI ","M2N2STAXI ","M2N2STAYI ","M2N2STAZI ", & + "M2N2STVXI ","M2N2STVYI ","M2N2STVZI ","M2N2VXI ","M2N2VYI ","M2N2VZI ","M2N3AXI ", & + "M2N3AYI ","M2N3AZI ","M2N3DYNP ","M2N3FAFXI ","M2N3FAFYI ","M2N3FAFZI ","M2N3FAGXI "/) + ValidParamAry(995:1491) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M2N3FAGYI ","M2N3FAGZI ","M2N3FAMXI ","M2N3FAMYI ","M2N3FAMZI ","M2N3FBFXI ","M2N3FBFYI ", & + "M2N3FBFZI ","M2N3FBXI ","M2N3FBYI ","M2N3FBZI ","M2N3FDXI ","M2N3FDYI ","M2N3FDZI ", & + "M2N3FIXI ","M2N3FIYI ","M2N3FIZI ","M2N3FMGXI ","M2N3FMGYI ","M2N3FMGZI ","M2N3MAFXI ", & + "M2N3MAFYI ","M2N3MAFZI ","M2N3MAGXI ","M2N3MAGYI ","M2N3MAGZI ","M2N3MBFXI ","M2N3MBFYI ", & + "M2N3MBFZI ","M2N3MBXI ","M2N3MBYI ","M2N3MBZI ","M2N3MMGXI ","M2N3MMGYI ","M2N3MMGZI ", & + "M2N3STAXI ","M2N3STAYI ","M2N3STAZI ","M2N3STVXI ","M2N3STVYI ","M2N3STVZI ","M2N3VXI ", & + "M2N3VYI ","M2N3VZI ","M2N4AXI ","M2N4AYI ","M2N4AZI ","M2N4DYNP ","M2N4FAFXI ", & + "M2N4FAFYI ","M2N4FAFZI ","M2N4FAGXI ","M2N4FAGYI ","M2N4FAGZI ","M2N4FAMXI ","M2N4FAMYI ", & + "M2N4FAMZI ","M2N4FBFXI ","M2N4FBFYI ","M2N4FBFZI ","M2N4FBXI ","M2N4FBYI ","M2N4FBZI ", & + "M2N4FDXI ","M2N4FDYI ","M2N4FDZI ","M2N4FIXI ","M2N4FIYI ","M2N4FIZI ","M2N4FMGXI ", & + "M2N4FMGYI ","M2N4FMGZI ","M2N4MAFXI ","M2N4MAFYI ","M2N4MAFZI ","M2N4MAGXI ","M2N4MAGYI ", & + "M2N4MAGZI ","M2N4MBFXI ","M2N4MBFYI ","M2N4MBFZI ","M2N4MBXI ","M2N4MBYI ","M2N4MBZI ", & + "M2N4MMGXI ","M2N4MMGYI ","M2N4MMGZI ","M2N4STAXI ","M2N4STAYI ","M2N4STAZI ","M2N4STVXI ", & + "M2N4STVYI ","M2N4STVZI ","M2N4VXI ","M2N4VYI ","M2N4VZI ","M2N5AXI ","M2N5AYI ", & + "M2N5AZI ","M2N5DYNP ","M2N5FAFXI ","M2N5FAFYI ","M2N5FAFZI ","M2N5FAGXI ","M2N5FAGYI ", & + "M2N5FAGZI ","M2N5FAMXI ","M2N5FAMYI ","M2N5FAMZI ","M2N5FBFXI ","M2N5FBFYI ","M2N5FBFZI ", & + "M2N5FBXI ","M2N5FBYI ","M2N5FBZI ","M2N5FDXI ","M2N5FDYI ","M2N5FDZI ","M2N5FIXI ", & + "M2N5FIYI ","M2N5FIZI ","M2N5FMGXI ","M2N5FMGYI ","M2N5FMGZI ","M2N5MAFXI ","M2N5MAFYI ", & + "M2N5MAFZI ","M2N5MAGXI ","M2N5MAGYI ","M2N5MAGZI ","M2N5MBFXI ","M2N5MBFYI ","M2N5MBFZI ", & + "M2N5MBXI ","M2N5MBYI ","M2N5MBZI ","M2N5MMGXI ","M2N5MMGYI ","M2N5MMGZI ","M2N5STAXI ", & + "M2N5STAYI ","M2N5STAZI ","M2N5STVXI ","M2N5STVYI ","M2N5STVZI ","M2N5VXI ","M2N5VYI ", & + "M2N5VZI ","M2N6AXI ","M2N6AYI ","M2N6AZI ","M2N6DYNP ","M2N6FAFXI ","M2N6FAFYI ", & + "M2N6FAFZI ","M2N6FAGXI ","M2N6FAGYI ","M2N6FAGZI ","M2N6FAMXI ","M2N6FAMYI ","M2N6FAMZI ", & + "M2N6FBFXI ","M2N6FBFYI ","M2N6FBFZI ","M2N6FBXI ","M2N6FBYI ","M2N6FBZI ","M2N6FDXI ", & + "M2N6FDYI ","M2N6FDZI ","M2N6FIXI ","M2N6FIYI ","M2N6FIZI ","M2N6FMGXI ","M2N6FMGYI ", & + "M2N6FMGZI ","M2N6MAFXI ","M2N6MAFYI ","M2N6MAFZI ","M2N6MAGXI ","M2N6MAGYI ","M2N6MAGZI ", & + "M2N6MBFXI ","M2N6MBFYI ","M2N6MBFZI ","M2N6MBXI ","M2N6MBYI ","M2N6MBZI ","M2N6MMGXI ", & + "M2N6MMGYI ","M2N6MMGZI ","M2N6STAXI ","M2N6STAYI ","M2N6STAZI ","M2N6STVXI ","M2N6STVYI ", & + "M2N6STVZI ","M2N6VXI ","M2N6VYI ","M2N6VZI ","M2N7AXI ","M2N7AYI ","M2N7AZI ", & + "M2N7DYNP ","M2N7FAFXI ","M2N7FAFYI ","M2N7FAFZI ","M2N7FAGXI ","M2N7FAGYI ","M2N7FAGZI ", & + "M2N7FAMXI ","M2N7FAMYI ","M2N7FAMZI ","M2N7FBFXI ","M2N7FBFYI ","M2N7FBFZI ","M2N7FBXI ", & + "M2N7FBYI ","M2N7FBZI ","M2N7FDXI ","M2N7FDYI ","M2N7FDZI ","M2N7FIXI ","M2N7FIYI ", & + "M2N7FIZI ","M2N7FMGXI ","M2N7FMGYI ","M2N7FMGZI ","M2N7MAFXI ","M2N7MAFYI ","M2N7MAFZI ", & + "M2N7MAGXI ","M2N7MAGYI ","M2N7MAGZI ","M2N7MBFXI ","M2N7MBFYI ","M2N7MBFZI ","M2N7MBXI ", & + "M2N7MBYI ","M2N7MBZI ","M2N7MMGXI ","M2N7MMGYI ","M2N7MMGZI ","M2N7STAXI ","M2N7STAYI ", & + "M2N7STAZI ","M2N7STVXI ","M2N7STVYI ","M2N7STVZI ","M2N7VXI ","M2N7VYI ","M2N7VZI ", & + "M2N8AXI ","M2N8AYI ","M2N8AZI ","M2N8DYNP ","M2N8FAFXI ","M2N8FAFYI ","M2N8FAFZI ", & + "M2N8FAGXI ","M2N8FAGYI ","M2N8FAGZI ","M2N8FAMXI ","M2N8FAMYI ","M2N8FAMZI ","M2N8FBFXI ", & + "M2N8FBFYI ","M2N8FBFZI ","M2N8FBXI ","M2N8FBYI ","M2N8FBZI ","M2N8FDXI ","M2N8FDYI ", & + "M2N8FDZI ","M2N8FIXI ","M2N8FIYI ","M2N8FIZI ","M2N8FMGXI ","M2N8FMGYI ","M2N8FMGZI ", & + "M2N8MAFXI ","M2N8MAFYI ","M2N8MAFZI ","M2N8MAGXI ","M2N8MAGYI ","M2N8MAGZI ","M2N8MBFXI ", & + "M2N8MBFYI ","M2N8MBFZI ","M2N8MBXI ","M2N8MBYI ","M2N8MBZI ","M2N8MMGXI ","M2N8MMGYI ", & + "M2N8MMGZI ","M2N8STAXI ","M2N8STAYI ","M2N8STAZI ","M2N8STVXI ","M2N8STVYI ","M2N8STVZI ", & + "M2N8VXI ","M2N8VYI ","M2N8VZI ","M2N9AXI ","M2N9AYI ","M2N9AZI ","M2N9DYNP ", & + "M2N9FAFXI ","M2N9FAFYI ","M2N9FAFZI ","M2N9FAGXI ","M2N9FAGYI ","M2N9FAGZI ","M2N9FAMXI ", & + "M2N9FAMYI ","M2N9FAMZI ","M2N9FBFXI ","M2N9FBFYI ","M2N9FBFZI ","M2N9FBXI ","M2N9FBYI ", & + "M2N9FBZI ","M2N9FDXI ","M2N9FDYI ","M2N9FDZI ","M2N9FIXI ","M2N9FIYI ","M2N9FIZI ", & + "M2N9FMGXI ","M2N9FMGYI ","M2N9FMGZI ","M2N9MAFXI ","M2N9MAFYI ","M2N9MAFZI ","M2N9MAGXI ", & + "M2N9MAGYI ","M2N9MAGZI ","M2N9MBFXI ","M2N9MBFYI ","M2N9MBFZI ","M2N9MBXI ","M2N9MBYI ", & + "M2N9MBZI ","M2N9MMGXI ","M2N9MMGYI ","M2N9MMGZI ","M2N9STAXI ","M2N9STAYI ","M2N9STAZI ", & + "M2N9STVXI ","M2N9STVYI ","M2N9STVZI ","M2N9VXI ","M2N9VYI ","M2N9VZI ","M3N1AXI ", & + "M3N1AYI ","M3N1AZI ","M3N1DYNP ","M3N1FAFXI ","M3N1FAFYI ","M3N1FAFZI ","M3N1FAGXI ", & + "M3N1FAGYI ","M3N1FAGZI ","M3N1FAMXI ","M3N1FAMYI ","M3N1FAMZI ","M3N1FBFXI ","M3N1FBFYI ", & + "M3N1FBFZI ","M3N1FBXI ","M3N1FBYI ","M3N1FBZI ","M3N1FDXI ","M3N1FDYI ","M3N1FDZI ", & + "M3N1FIXI ","M3N1FIYI ","M3N1FIZI ","M3N1FMGXI ","M3N1FMGYI ","M3N1FMGZI ","M3N1MAFXI ", & + "M3N1MAFYI ","M3N1MAFZI ","M3N1MAGXI ","M3N1MAGYI ","M3N1MAGZI ","M3N1MBFXI ","M3N1MBFYI ", & + "M3N1MBFZI ","M3N1MBXI ","M3N1MBYI ","M3N1MBZI ","M3N1MMGXI ","M3N1MMGYI ","M3N1MMGZI ", & + "M3N1STAXI ","M3N1STAYI ","M3N1STAZI ","M3N1STVXI ","M3N1STVYI ","M3N1STVZI ","M3N1VXI ", & + "M3N1VYI ","M3N1VZI ","M3N2AXI ","M3N2AYI ","M3N2AZI ","M3N2DYNP ","M3N2FAFXI ", & + "M3N2FAFYI ","M3N2FAFZI ","M3N2FAGXI ","M3N2FAGYI ","M3N2FAGZI ","M3N2FAMXI ","M3N2FAMYI ", & + "M3N2FAMZI ","M3N2FBFXI ","M3N2FBFYI ","M3N2FBFZI ","M3N2FBXI ","M3N2FBYI ","M3N2FBZI ", & + "M3N2FDXI ","M3N2FDYI ","M3N2FDZI ","M3N2FIXI ","M3N2FIYI ","M3N2FIZI ","M3N2FMGXI ", & + "M3N2FMGYI ","M3N2FMGZI ","M3N2MAFXI ","M3N2MAFYI ","M3N2MAFZI ","M3N2MAGXI ","M3N2MAGYI ", & + "M3N2MAGZI ","M3N2MBFXI ","M3N2MBFYI ","M3N2MBFZI ","M3N2MBXI ","M3N2MBYI ","M3N2MBZI ", & + "M3N2MMGXI ","M3N2MMGYI ","M3N2MMGZI ","M3N2STAXI ","M3N2STAYI ","M3N2STAZI ","M3N2STVXI ", & + "M3N2STVYI ","M3N2STVZI ","M3N2VXI ","M3N2VYI ","M3N2VZI ","M3N3AXI ","M3N3AYI ", & + "M3N3AZI ","M3N3DYNP ","M3N3FAFXI ","M3N3FAFYI ","M3N3FAFZI ","M3N3FAGXI ","M3N3FAGYI ", & + "M3N3FAGZI ","M3N3FAMXI ","M3N3FAMYI ","M3N3FAMZI ","M3N3FBFXI ","M3N3FBFYI ","M3N3FBFZI ", & + "M3N3FBXI ","M3N3FBYI ","M3N3FBZI ","M3N3FDXI ","M3N3FDYI ","M3N3FDZI ","M3N3FIXI ", & + "M3N3FIYI ","M3N3FIZI ","M3N3FMGXI ","M3N3FMGYI ","M3N3FMGZI ","M3N3MAFXI ","M3N3MAFYI ", & + "M3N3MAFZI ","M3N3MAGXI ","M3N3MAGYI ","M3N3MAGZI ","M3N3MBFXI ","M3N3MBFYI ","M3N3MBFZI "/) + ValidParamAry(1492:1988) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M3N3MBXI ","M3N3MBYI ","M3N3MBZI ","M3N3MMGXI ","M3N3MMGYI ","M3N3MMGZI ","M3N3STAXI ", & + "M3N3STAYI ","M3N3STAZI ","M3N3STVXI ","M3N3STVYI ","M3N3STVZI ","M3N3VXI ","M3N3VYI ", & + "M3N3VZI ","M3N4AXI ","M3N4AYI ","M3N4AZI ","M3N4DYNP ","M3N4FAFXI ","M3N4FAFYI ", & + "M3N4FAFZI ","M3N4FAGXI ","M3N4FAGYI ","M3N4FAGZI ","M3N4FAMXI ","M3N4FAMYI ","M3N4FAMZI ", & + "M3N4FBFXI ","M3N4FBFYI ","M3N4FBFZI ","M3N4FBXI ","M3N4FBYI ","M3N4FBZI ","M3N4FDXI ", & + "M3N4FDYI ","M3N4FDZI ","M3N4FIXI ","M3N4FIYI ","M3N4FIZI ","M3N4FMGXI ","M3N4FMGYI ", & + "M3N4FMGZI ","M3N4MAFXI ","M3N4MAFYI ","M3N4MAFZI ","M3N4MAGXI ","M3N4MAGYI ","M3N4MAGZI ", & + "M3N4MBFXI ","M3N4MBFYI ","M3N4MBFZI ","M3N4MBXI ","M3N4MBYI ","M3N4MBZI ","M3N4MMGXI ", & + "M3N4MMGYI ","M3N4MMGZI ","M3N4STAXI ","M3N4STAYI ","M3N4STAZI ","M3N4STVXI ","M3N4STVYI ", & + "M3N4STVZI ","M3N4VXI ","M3N4VYI ","M3N4VZI ","M3N5AXI ","M3N5AYI ","M3N5AZI ", & + "M3N5DYNP ","M3N5FAFXI ","M3N5FAFYI ","M3N5FAFZI ","M3N5FAGXI ","M3N5FAGYI ","M3N5FAGZI ", & + "M3N5FAMXI ","M3N5FAMYI ","M3N5FAMZI ","M3N5FBFXI ","M3N5FBFYI ","M3N5FBFZI ","M3N5FBXI ", & + "M3N5FBYI ","M3N5FBZI ","M3N5FDXI ","M3N5FDYI ","M3N5FDZI ","M3N5FIXI ","M3N5FIYI ", & + "M3N5FIZI ","M3N5FMGXI ","M3N5FMGYI ","M3N5FMGZI ","M3N5MAFXI ","M3N5MAFYI ","M3N5MAFZI ", & + "M3N5MAGXI ","M3N5MAGYI ","M3N5MAGZI ","M3N5MBFXI ","M3N5MBFYI ","M3N5MBFZI ","M3N5MBXI ", & + "M3N5MBYI ","M3N5MBZI ","M3N5MMGXI ","M3N5MMGYI ","M3N5MMGZI ","M3N5STAXI ","M3N5STAYI ", & + "M3N5STAZI ","M3N5STVXI ","M3N5STVYI ","M3N5STVZI ","M3N5VXI ","M3N5VYI ","M3N5VZI ", & + "M3N6AXI ","M3N6AYI ","M3N6AZI ","M3N6DYNP ","M3N6FAFXI ","M3N6FAFYI ","M3N6FAFZI ", & + "M3N6FAGXI ","M3N6FAGYI ","M3N6FAGZI ","M3N6FAMXI ","M3N6FAMYI ","M3N6FAMZI ","M3N6FBFXI ", & + "M3N6FBFYI ","M3N6FBFZI ","M3N6FBXI ","M3N6FBYI ","M3N6FBZI ","M3N6FDXI ","M3N6FDYI ", & + "M3N6FDZI ","M3N6FIXI ","M3N6FIYI ","M3N6FIZI ","M3N6FMGXI ","M3N6FMGYI ","M3N6FMGZI ", & + "M3N6MAFXI ","M3N6MAFYI ","M3N6MAFZI ","M3N6MAGXI ","M3N6MAGYI ","M3N6MAGZI ","M3N6MBFXI ", & + "M3N6MBFYI ","M3N6MBFZI ","M3N6MBXI ","M3N6MBYI ","M3N6MBZI ","M3N6MMGXI ","M3N6MMGYI ", & + "M3N6MMGZI ","M3N6STAXI ","M3N6STAYI ","M3N6STAZI ","M3N6STVXI ","M3N6STVYI ","M3N6STVZI ", & + "M3N6VXI ","M3N6VYI ","M3N6VZI ","M3N7AXI ","M3N7AYI ","M3N7AZI ","M3N7DYNP ", & + "M3N7FAFXI ","M3N7FAFYI ","M3N7FAFZI ","M3N7FAGXI ","M3N7FAGYI ","M3N7FAGZI ","M3N7FAMXI ", & + "M3N7FAMYI ","M3N7FAMZI ","M3N7FBFXI ","M3N7FBFYI ","M3N7FBFZI ","M3N7FBXI ","M3N7FBYI ", & + "M3N7FBZI ","M3N7FDXI ","M3N7FDYI ","M3N7FDZI ","M3N7FIXI ","M3N7FIYI ","M3N7FIZI ", & + "M3N7FMGXI ","M3N7FMGYI ","M3N7FMGZI ","M3N7MAFXI ","M3N7MAFYI ","M3N7MAFZI ","M3N7MAGXI ", & + "M3N7MAGYI ","M3N7MAGZI ","M3N7MBFXI ","M3N7MBFYI ","M3N7MBFZI ","M3N7MBXI ","M3N7MBYI ", & + "M3N7MBZI ","M3N7MMGXI ","M3N7MMGYI ","M3N7MMGZI ","M3N7STAXI ","M3N7STAYI ","M3N7STAZI ", & + "M3N7STVXI ","M3N7STVYI ","M3N7STVZI ","M3N7VXI ","M3N7VYI ","M3N7VZI ","M3N8AXI ", & + "M3N8AYI ","M3N8AZI ","M3N8DYNP ","M3N8FAFXI ","M3N8FAFYI ","M3N8FAFZI ","M3N8FAGXI ", & + "M3N8FAGYI ","M3N8FAGZI ","M3N8FAMXI ","M3N8FAMYI ","M3N8FAMZI ","M3N8FBFXI ","M3N8FBFYI ", & + "M3N8FBFZI ","M3N8FBXI ","M3N8FBYI ","M3N8FBZI ","M3N8FDXI ","M3N8FDYI ","M3N8FDZI ", & + "M3N8FIXI ","M3N8FIYI ","M3N8FIZI ","M3N8FMGXI ","M3N8FMGYI ","M3N8FMGZI ","M3N8MAFXI ", & + "M3N8MAFYI ","M3N8MAFZI ","M3N8MAGXI ","M3N8MAGYI ","M3N8MAGZI ","M3N8MBFXI ","M3N8MBFYI ", & + "M3N8MBFZI ","M3N8MBXI ","M3N8MBYI ","M3N8MBZI ","M3N8MMGXI ","M3N8MMGYI ","M3N8MMGZI ", & + "M3N8STAXI ","M3N8STAYI ","M3N8STAZI ","M3N8STVXI ","M3N8STVYI ","M3N8STVZI ","M3N8VXI ", & + "M3N8VYI ","M3N8VZI ","M3N9AXI ","M3N9AYI ","M3N9AZI ","M3N9DYNP ","M3N9FAFXI ", & + "M3N9FAFYI ","M3N9FAFZI ","M3N9FAGXI ","M3N9FAGYI ","M3N9FAGZI ","M3N9FAMXI ","M3N9FAMYI ", & + "M3N9FAMZI ","M3N9FBFXI ","M3N9FBFYI ","M3N9FBFZI ","M3N9FBXI ","M3N9FBYI ","M3N9FBZI ", & + "M3N9FDXI ","M3N9FDYI ","M3N9FDZI ","M3N9FIXI ","M3N9FIYI ","M3N9FIZI ","M3N9FMGXI ", & + "M3N9FMGYI ","M3N9FMGZI ","M3N9MAFXI ","M3N9MAFYI ","M3N9MAFZI ","M3N9MAGXI ","M3N9MAGYI ", & + "M3N9MAGZI ","M3N9MBFXI ","M3N9MBFYI ","M3N9MBFZI ","M3N9MBXI ","M3N9MBYI ","M3N9MBZI ", & + "M3N9MMGXI ","M3N9MMGYI ","M3N9MMGZI ","M3N9STAXI ","M3N9STAYI ","M3N9STAZI ","M3N9STVXI ", & + "M3N9STVYI ","M3N9STVZI ","M3N9VXI ","M3N9VYI ","M3N9VZI ","M4N1AXI ","M4N1AYI ", & + "M4N1AZI ","M4N1DYNP ","M4N1FAFXI ","M4N1FAFYI ","M4N1FAFZI ","M4N1FAGXI ","M4N1FAGYI ", & + "M4N1FAGZI ","M4N1FAMXI ","M4N1FAMYI ","M4N1FAMZI ","M4N1FBFXI ","M4N1FBFYI ","M4N1FBFZI ", & + "M4N1FBXI ","M4N1FBYI ","M4N1FBZI ","M4N1FDXI ","M4N1FDYI ","M4N1FDZI ","M4N1FIXI ", & + "M4N1FIYI ","M4N1FIZI ","M4N1FMGXI ","M4N1FMGYI ","M4N1FMGZI ","M4N1MAFXI ","M4N1MAFYI ", & + "M4N1MAFZI ","M4N1MAGXI ","M4N1MAGYI ","M4N1MAGZI ","M4N1MBFXI ","M4N1MBFYI ","M4N1MBFZI ", & + "M4N1MBXI ","M4N1MBYI ","M4N1MBZI ","M4N1MMGXI ","M4N1MMGYI ","M4N1MMGZI ","M4N1STAXI ", & + "M4N1STAYI ","M4N1STAZI ","M4N1STVXI ","M4N1STVYI ","M4N1STVZI ","M4N1VXI ","M4N1VYI ", & + "M4N1VZI ","M4N2AXI ","M4N2AYI ","M4N2AZI ","M4N2DYNP ","M4N2FAFXI ","M4N2FAFYI ", & + "M4N2FAFZI ","M4N2FAGXI ","M4N2FAGYI ","M4N2FAGZI ","M4N2FAMXI ","M4N2FAMYI ","M4N2FAMZI ", & + "M4N2FBFXI ","M4N2FBFYI ","M4N2FBFZI ","M4N2FBXI ","M4N2FBYI ","M4N2FBZI ","M4N2FDXI ", & + "M4N2FDYI ","M4N2FDZI ","M4N2FIXI ","M4N2FIYI ","M4N2FIZI ","M4N2FMGXI ","M4N2FMGYI ", & + "M4N2FMGZI ","M4N2MAFXI ","M4N2MAFYI ","M4N2MAFZI ","M4N2MAGXI ","M4N2MAGYI ","M4N2MAGZI ", & + "M4N2MBFXI ","M4N2MBFYI ","M4N2MBFZI ","M4N2MBXI ","M4N2MBYI ","M4N2MBZI ","M4N2MMGXI ", & + "M4N2MMGYI ","M4N2MMGZI ","M4N2STAXI ","M4N2STAYI ","M4N2STAZI ","M4N2STVXI ","M4N2STVYI ", & + "M4N2STVZI ","M4N2VXI ","M4N2VYI ","M4N2VZI ","M4N3AXI ","M4N3AYI ","M4N3AZI ", & + "M4N3DYNP ","M4N3FAFXI ","M4N3FAFYI ","M4N3FAFZI ","M4N3FAGXI ","M4N3FAGYI ","M4N3FAGZI ", & + "M4N3FAMXI ","M4N3FAMYI ","M4N3FAMZI ","M4N3FBFXI ","M4N3FBFYI ","M4N3FBFZI ","M4N3FBXI ", & + "M4N3FBYI ","M4N3FBZI ","M4N3FDXI ","M4N3FDYI ","M4N3FDZI ","M4N3FIXI ","M4N3FIYI ", & + "M4N3FIZI ","M4N3FMGXI ","M4N3FMGYI ","M4N3FMGZI ","M4N3MAFXI ","M4N3MAFYI ","M4N3MAFZI ", & + "M4N3MAGXI ","M4N3MAGYI ","M4N3MAGZI ","M4N3MBFXI ","M4N3MBFYI ","M4N3MBFZI ","M4N3MBXI ", & + "M4N3MBYI ","M4N3MBZI ","M4N3MMGXI ","M4N3MMGYI ","M4N3MMGZI ","M4N3STAXI ","M4N3STAYI ", & + "M4N3STAZI ","M4N3STVXI ","M4N3STVYI ","M4N3STVZI ","M4N3VXI ","M4N3VYI ","M4N3VZI ", & + "M4N4AXI ","M4N4AYI ","M4N4AZI ","M4N4DYNP ","M4N4FAFXI ","M4N4FAFYI ","M4N4FAFZI ", & + "M4N4FAGXI ","M4N4FAGYI ","M4N4FAGZI ","M4N4FAMXI ","M4N4FAMYI ","M4N4FAMZI ","M4N4FBFXI "/) + ValidParamAry(1989:2485) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M4N4FBFYI ","M4N4FBFZI ","M4N4FBXI ","M4N4FBYI ","M4N4FBZI ","M4N4FDXI ","M4N4FDYI ", & + "M4N4FDZI ","M4N4FIXI ","M4N4FIYI ","M4N4FIZI ","M4N4FMGXI ","M4N4FMGYI ","M4N4FMGZI ", & + "M4N4MAFXI ","M4N4MAFYI ","M4N4MAFZI ","M4N4MAGXI ","M4N4MAGYI ","M4N4MAGZI ","M4N4MBFXI ", & + "M4N4MBFYI ","M4N4MBFZI ","M4N4MBXI ","M4N4MBYI ","M4N4MBZI ","M4N4MMGXI ","M4N4MMGYI ", & + "M4N4MMGZI ","M4N4STAXI ","M4N4STAYI ","M4N4STAZI ","M4N4STVXI ","M4N4STVYI ","M4N4STVZI ", & + "M4N4VXI ","M4N4VYI ","M4N4VZI ","M4N5AXI ","M4N5AYI ","M4N5AZI ","M4N5DYNP ", & + "M4N5FAFXI ","M4N5FAFYI ","M4N5FAFZI ","M4N5FAGXI ","M4N5FAGYI ","M4N5FAGZI ","M4N5FAMXI ", & + "M4N5FAMYI ","M4N5FAMZI ","M4N5FBFXI ","M4N5FBFYI ","M4N5FBFZI ","M4N5FBXI ","M4N5FBYI ", & + "M4N5FBZI ","M4N5FDXI ","M4N5FDYI ","M4N5FDZI ","M4N5FIXI ","M4N5FIYI ","M4N5FIZI ", & + "M4N5FMGXI ","M4N5FMGYI ","M4N5FMGZI ","M4N5MAFXI ","M4N5MAFYI ","M4N5MAFZI ","M4N5MAGXI ", & + "M4N5MAGYI ","M4N5MAGZI ","M4N5MBFXI ","M4N5MBFYI ","M4N5MBFZI ","M4N5MBXI ","M4N5MBYI ", & + "M4N5MBZI ","M4N5MMGXI ","M4N5MMGYI ","M4N5MMGZI ","M4N5STAXI ","M4N5STAYI ","M4N5STAZI ", & + "M4N5STVXI ","M4N5STVYI ","M4N5STVZI ","M4N5VXI ","M4N5VYI ","M4N5VZI ","M4N6AXI ", & + "M4N6AYI ","M4N6AZI ","M4N6DYNP ","M4N6FAFXI ","M4N6FAFYI ","M4N6FAFZI ","M4N6FAGXI ", & + "M4N6FAGYI ","M4N6FAGZI ","M4N6FAMXI ","M4N6FAMYI ","M4N6FAMZI ","M4N6FBFXI ","M4N6FBFYI ", & + "M4N6FBFZI ","M4N6FBXI ","M4N6FBYI ","M4N6FBZI ","M4N6FDXI ","M4N6FDYI ","M4N6FDZI ", & + "M4N6FIXI ","M4N6FIYI ","M4N6FIZI ","M4N6FMGXI ","M4N6FMGYI ","M4N6FMGZI ","M4N6MAFXI ", & + "M4N6MAFYI ","M4N6MAFZI ","M4N6MAGXI ","M4N6MAGYI ","M4N6MAGZI ","M4N6MBFXI ","M4N6MBFYI ", & + "M4N6MBFZI ","M4N6MBXI ","M4N6MBYI ","M4N6MBZI ","M4N6MMGXI ","M4N6MMGYI ","M4N6MMGZI ", & + "M4N6STAXI ","M4N6STAYI ","M4N6STAZI ","M4N6STVXI ","M4N6STVYI ","M4N6STVZI ","M4N6VXI ", & + "M4N6VYI ","M4N6VZI ","M4N7AXI ","M4N7AYI ","M4N7AZI ","M4N7DYNP ","M4N7FAFXI ", & + "M4N7FAFYI ","M4N7FAFZI ","M4N7FAGXI ","M4N7FAGYI ","M4N7FAGZI ","M4N7FAMXI ","M4N7FAMYI ", & + "M4N7FAMZI ","M4N7FBFXI ","M4N7FBFYI ","M4N7FBFZI ","M4N7FBXI ","M4N7FBYI ","M4N7FBZI ", & + "M4N7FDXI ","M4N7FDYI ","M4N7FDZI ","M4N7FIXI ","M4N7FIYI ","M4N7FIZI ","M4N7FMGXI ", & + "M4N7FMGYI ","M4N7FMGZI ","M4N7MAFXI ","M4N7MAFYI ","M4N7MAFZI ","M4N7MAGXI ","M4N7MAGYI ", & + "M4N7MAGZI ","M4N7MBFXI ","M4N7MBFYI ","M4N7MBFZI ","M4N7MBXI ","M4N7MBYI ","M4N7MBZI ", & + "M4N7MMGXI ","M4N7MMGYI ","M4N7MMGZI ","M4N7STAXI ","M4N7STAYI ","M4N7STAZI ","M4N7STVXI ", & + "M4N7STVYI ","M4N7STVZI ","M4N7VXI ","M4N7VYI ","M4N7VZI ","M4N8AXI ","M4N8AYI ", & + "M4N8AZI ","M4N8DYNP ","M4N8FAFXI ","M4N8FAFYI ","M4N8FAFZI ","M4N8FAGXI ","M4N8FAGYI ", & + "M4N8FAGZI ","M4N8FAMXI ","M4N8FAMYI ","M4N8FAMZI ","M4N8FBFXI ","M4N8FBFYI ","M4N8FBFZI ", & + "M4N8FBXI ","M4N8FBYI ","M4N8FBZI ","M4N8FDXI ","M4N8FDYI ","M4N8FDZI ","M4N8FIXI ", & + "M4N8FIYI ","M4N8FIZI ","M4N8FMGXI ","M4N8FMGYI ","M4N8FMGZI ","M4N8MAFXI ","M4N8MAFYI ", & + "M4N8MAFZI ","M4N8MAGXI ","M4N8MAGYI ","M4N8MAGZI ","M4N8MBFXI ","M4N8MBFYI ","M4N8MBFZI ", & + "M4N8MBXI ","M4N8MBYI ","M4N8MBZI ","M4N8MMGXI ","M4N8MMGYI ","M4N8MMGZI ","M4N8STAXI ", & + "M4N8STAYI ","M4N8STAZI ","M4N8STVXI ","M4N8STVYI ","M4N8STVZI ","M4N8VXI ","M4N8VYI ", & + "M4N8VZI ","M4N9AXI ","M4N9AYI ","M4N9AZI ","M4N9DYNP ","M4N9FAFXI ","M4N9FAFYI ", & + "M4N9FAFZI ","M4N9FAGXI ","M4N9FAGYI ","M4N9FAGZI ","M4N9FAMXI ","M4N9FAMYI ","M4N9FAMZI ", & + "M4N9FBFXI ","M4N9FBFYI ","M4N9FBFZI ","M4N9FBXI ","M4N9FBYI ","M4N9FBZI ","M4N9FDXI ", & + "M4N9FDYI ","M4N9FDZI ","M4N9FIXI ","M4N9FIYI ","M4N9FIZI ","M4N9FMGXI ","M4N9FMGYI ", & + "M4N9FMGZI ","M4N9MAFXI ","M4N9MAFYI ","M4N9MAFZI ","M4N9MAGXI ","M4N9MAGYI ","M4N9MAGZI ", & + "M4N9MBFXI ","M4N9MBFYI ","M4N9MBFZI ","M4N9MBXI ","M4N9MBYI ","M4N9MBZI ","M4N9MMGXI ", & + "M4N9MMGYI ","M4N9MMGZI ","M4N9STAXI ","M4N9STAYI ","M4N9STAZI ","M4N9STVXI ","M4N9STVYI ", & + "M4N9STVZI ","M4N9VXI ","M4N9VYI ","M4N9VZI ","M5N1AXI ","M5N1AYI ","M5N1AZI ", & + "M5N1DYNP ","M5N1FAFXI ","M5N1FAFYI ","M5N1FAFZI ","M5N1FAGXI ","M5N1FAGYI ","M5N1FAGZI ", & + "M5N1FAMXI ","M5N1FAMYI ","M5N1FAMZI ","M5N1FBFXI ","M5N1FBFYI ","M5N1FBFZI ","M5N1FBXI ", & + "M5N1FBYI ","M5N1FBZI ","M5N1FDXI ","M5N1FDYI ","M5N1FDZI ","M5N1FIXI ","M5N1FIYI ", & + "M5N1FIZI ","M5N1FMGXI ","M5N1FMGYI ","M5N1FMGZI ","M5N1MAFXI ","M5N1MAFYI ","M5N1MAFZI ", & + "M5N1MAGXI ","M5N1MAGYI ","M5N1MAGZI ","M5N1MBFXI ","M5N1MBFYI ","M5N1MBFZI ","M5N1MBXI ", & + "M5N1MBYI ","M5N1MBZI ","M5N1MMGXI ","M5N1MMGYI ","M5N1MMGZI ","M5N1STAXI ","M5N1STAYI ", & + "M5N1STAZI ","M5N1STVXI ","M5N1STVYI ","M5N1STVZI ","M5N1VXI ","M5N1VYI ","M5N1VZI ", & + "M5N2AXI ","M5N2AYI ","M5N2AZI ","M5N2DYNP ","M5N2FAFXI ","M5N2FAFYI ","M5N2FAFZI ", & + "M5N2FAGXI ","M5N2FAGYI ","M5N2FAGZI ","M5N2FAMXI ","M5N2FAMYI ","M5N2FAMZI ","M5N2FBFXI ", & + "M5N2FBFYI ","M5N2FBFZI ","M5N2FBXI ","M5N2FBYI ","M5N2FBZI ","M5N2FDXI ","M5N2FDYI ", & + "M5N2FDZI ","M5N2FIXI ","M5N2FIYI ","M5N2FIZI ","M5N2FMGXI ","M5N2FMGYI ","M5N2FMGZI ", & + "M5N2MAFXI ","M5N2MAFYI ","M5N2MAFZI ","M5N2MAGXI ","M5N2MAGYI ","M5N2MAGZI ","M5N2MBFXI ", & + "M5N2MBFYI ","M5N2MBFZI ","M5N2MBXI ","M5N2MBYI ","M5N2MBZI ","M5N2MMGXI ","M5N2MMGYI ", & + "M5N2MMGZI ","M5N2STAXI ","M5N2STAYI ","M5N2STAZI ","M5N2STVXI ","M5N2STVYI ","M5N2STVZI ", & + "M5N2VXI ","M5N2VYI ","M5N2VZI ","M5N3AXI ","M5N3AYI ","M5N3AZI ","M5N3DYNP ", & + "M5N3FAFXI ","M5N3FAFYI ","M5N3FAFZI ","M5N3FAGXI ","M5N3FAGYI ","M5N3FAGZI ","M5N3FAMXI ", & + "M5N3FAMYI ","M5N3FAMZI ","M5N3FBFXI ","M5N3FBFYI ","M5N3FBFZI ","M5N3FBXI ","M5N3FBYI ", & + "M5N3FBZI ","M5N3FDXI ","M5N3FDYI ","M5N3FDZI ","M5N3FIXI ","M5N3FIYI ","M5N3FIZI ", & + "M5N3FMGXI ","M5N3FMGYI ","M5N3FMGZI ","M5N3MAFXI ","M5N3MAFYI ","M5N3MAFZI ","M5N3MAGXI ", & + "M5N3MAGYI ","M5N3MAGZI ","M5N3MBFXI ","M5N3MBFYI ","M5N3MBFZI ","M5N3MBXI ","M5N3MBYI ", & + "M5N3MBZI ","M5N3MMGXI ","M5N3MMGYI ","M5N3MMGZI ","M5N3STAXI ","M5N3STAYI ","M5N3STAZI ", & + "M5N3STVXI ","M5N3STVYI ","M5N3STVZI ","M5N3VXI ","M5N3VYI ","M5N3VZI ","M5N4AXI ", & + "M5N4AYI ","M5N4AZI ","M5N4DYNP ","M5N4FAFXI ","M5N4FAFYI ","M5N4FAFZI ","M5N4FAGXI ", & + "M5N4FAGYI ","M5N4FAGZI ","M5N4FAMXI ","M5N4FAMYI ","M5N4FAMZI ","M5N4FBFXI ","M5N4FBFYI ", & + "M5N4FBFZI ","M5N4FBXI ","M5N4FBYI ","M5N4FBZI ","M5N4FDXI ","M5N4FDYI ","M5N4FDZI ", & + "M5N4FIXI ","M5N4FIYI ","M5N4FIZI ","M5N4FMGXI ","M5N4FMGYI ","M5N4FMGZI ","M5N4MAFXI ", & + "M5N4MAFYI ","M5N4MAFZI ","M5N4MAGXI ","M5N4MAGYI ","M5N4MAGZI ","M5N4MBFXI ","M5N4MBFYI ", & + "M5N4MBFZI ","M5N4MBXI ","M5N4MBYI ","M5N4MBZI ","M5N4MMGXI ","M5N4MMGYI ","M5N4MMGZI "/) + ValidParamAry(2486:2982) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M5N4STAXI ","M5N4STAYI ","M5N4STAZI ","M5N4STVXI ","M5N4STVYI ","M5N4STVZI ","M5N4VXI ", & + "M5N4VYI ","M5N4VZI ","M5N5AXI ","M5N5AYI ","M5N5AZI ","M5N5DYNP ","M5N5FAFXI ", & + "M5N5FAFYI ","M5N5FAFZI ","M5N5FAGXI ","M5N5FAGYI ","M5N5FAGZI ","M5N5FAMXI ","M5N5FAMYI ", & + "M5N5FAMZI ","M5N5FBFXI ","M5N5FBFYI ","M5N5FBFZI ","M5N5FBXI ","M5N5FBYI ","M5N5FBZI ", & + "M5N5FDXI ","M5N5FDYI ","M5N5FDZI ","M5N5FIXI ","M5N5FIYI ","M5N5FIZI ","M5N5FMGXI ", & + "M5N5FMGYI ","M5N5FMGZI ","M5N5MAFXI ","M5N5MAFYI ","M5N5MAFZI ","M5N5MAGXI ","M5N5MAGYI ", & + "M5N5MAGZI ","M5N5MBFXI ","M5N5MBFYI ","M5N5MBFZI ","M5N5MBXI ","M5N5MBYI ","M5N5MBZI ", & + "M5N5MMGXI ","M5N5MMGYI ","M5N5MMGZI ","M5N5STAXI ","M5N5STAYI ","M5N5STAZI ","M5N5STVXI ", & + "M5N5STVYI ","M5N5STVZI ","M5N5VXI ","M5N5VYI ","M5N5VZI ","M5N6AXI ","M5N6AYI ", & + "M5N6AZI ","M5N6DYNP ","M5N6FAFXI ","M5N6FAFYI ","M5N6FAFZI ","M5N6FAGXI ","M5N6FAGYI ", & + "M5N6FAGZI ","M5N6FAMXI ","M5N6FAMYI ","M5N6FAMZI ","M5N6FBFXI ","M5N6FBFYI ","M5N6FBFZI ", & + "M5N6FBXI ","M5N6FBYI ","M5N6FBZI ","M5N6FDXI ","M5N6FDYI ","M5N6FDZI ","M5N6FIXI ", & + "M5N6FIYI ","M5N6FIZI ","M5N6FMGXI ","M5N6FMGYI ","M5N6FMGZI ","M5N6MAFXI ","M5N6MAFYI ", & + "M5N6MAFZI ","M5N6MAGXI ","M5N6MAGYI ","M5N6MAGZI ","M5N6MBFXI ","M5N6MBFYI ","M5N6MBFZI ", & + "M5N6MBXI ","M5N6MBYI ","M5N6MBZI ","M5N6MMGXI ","M5N6MMGYI ","M5N6MMGZI ","M5N6STAXI ", & + "M5N6STAYI ","M5N6STAZI ","M5N6STVXI ","M5N6STVYI ","M5N6STVZI ","M5N6VXI ","M5N6VYI ", & + "M5N6VZI ","M5N7AXI ","M5N7AYI ","M5N7AZI ","M5N7DYNP ","M5N7FAFXI ","M5N7FAFYI ", & + "M5N7FAFZI ","M5N7FAGXI ","M5N7FAGYI ","M5N7FAGZI ","M5N7FAMXI ","M5N7FAMYI ","M5N7FAMZI ", & + "M5N7FBFXI ","M5N7FBFYI ","M5N7FBFZI ","M5N7FBXI ","M5N7FBYI ","M5N7FBZI ","M5N7FDXI ", & + "M5N7FDYI ","M5N7FDZI ","M5N7FIXI ","M5N7FIYI ","M5N7FIZI ","M5N7FMGXI ","M5N7FMGYI ", & + "M5N7FMGZI ","M5N7MAFXI ","M5N7MAFYI ","M5N7MAFZI ","M5N7MAGXI ","M5N7MAGYI ","M5N7MAGZI ", & + "M5N7MBFXI ","M5N7MBFYI ","M5N7MBFZI ","M5N7MBXI ","M5N7MBYI ","M5N7MBZI ","M5N7MMGXI ", & + "M5N7MMGYI ","M5N7MMGZI ","M5N7STAXI ","M5N7STAYI ","M5N7STAZI ","M5N7STVXI ","M5N7STVYI ", & + "M5N7STVZI ","M5N7VXI ","M5N7VYI ","M5N7VZI ","M5N8AXI ","M5N8AYI ","M5N8AZI ", & + "M5N8DYNP ","M5N8FAFXI ","M5N8FAFYI ","M5N8FAFZI ","M5N8FAGXI ","M5N8FAGYI ","M5N8FAGZI ", & + "M5N8FAMXI ","M5N8FAMYI ","M5N8FAMZI ","M5N8FBFXI ","M5N8FBFYI ","M5N8FBFZI ","M5N8FBXI ", & + "M5N8FBYI ","M5N8FBZI ","M5N8FDXI ","M5N8FDYI ","M5N8FDZI ","M5N8FIXI ","M5N8FIYI ", & + "M5N8FIZI ","M5N8FMGXI ","M5N8FMGYI ","M5N8FMGZI ","M5N8MAFXI ","M5N8MAFYI ","M5N8MAFZI ", & + "M5N8MAGXI ","M5N8MAGYI ","M5N8MAGZI ","M5N8MBFXI ","M5N8MBFYI ","M5N8MBFZI ","M5N8MBXI ", & + "M5N8MBYI ","M5N8MBZI ","M5N8MMGXI ","M5N8MMGYI ","M5N8MMGZI ","M5N8STAXI ","M5N8STAYI ", & + "M5N8STAZI ","M5N8STVXI ","M5N8STVYI ","M5N8STVZI ","M5N8VXI ","M5N8VYI ","M5N8VZI ", & + "M5N9AXI ","M5N9AYI ","M5N9AZI ","M5N9DYNP ","M5N9FAFXI ","M5N9FAFYI ","M5N9FAFZI ", & + "M5N9FAGXI ","M5N9FAGYI ","M5N9FAGZI ","M5N9FAMXI ","M5N9FAMYI ","M5N9FAMZI ","M5N9FBFXI ", & + "M5N9FBFYI ","M5N9FBFZI ","M5N9FBXI ","M5N9FBYI ","M5N9FBZI ","M5N9FDXI ","M5N9FDYI ", & + "M5N9FDZI ","M5N9FIXI ","M5N9FIYI ","M5N9FIZI ","M5N9FMGXI ","M5N9FMGYI ","M5N9FMGZI ", & + "M5N9MAFXI ","M5N9MAFYI ","M5N9MAFZI ","M5N9MAGXI ","M5N9MAGYI ","M5N9MAGZI ","M5N9MBFXI ", & + "M5N9MBFYI ","M5N9MBFZI ","M5N9MBXI ","M5N9MBYI ","M5N9MBZI ","M5N9MMGXI ","M5N9MMGYI ", & + "M5N9MMGZI ","M5N9STAXI ","M5N9STAYI ","M5N9STAZI ","M5N9STVXI ","M5N9STVYI ","M5N9STVZI ", & + "M5N9VXI ","M5N9VYI ","M5N9VZI ","M6N1AXI ","M6N1AYI ","M6N1AZI ","M6N1DYNP ", & + "M6N1FAFXI ","M6N1FAFYI ","M6N1FAFZI ","M6N1FAGXI ","M6N1FAGYI ","M6N1FAGZI ","M6N1FAMXI ", & + "M6N1FAMYI ","M6N1FAMZI ","M6N1FBFXI ","M6N1FBFYI ","M6N1FBFZI ","M6N1FBXI ","M6N1FBYI ", & + "M6N1FBZI ","M6N1FDXI ","M6N1FDYI ","M6N1FDZI ","M6N1FIXI ","M6N1FIYI ","M6N1FIZI ", & + "M6N1FMGXI ","M6N1FMGYI ","M6N1FMGZI ","M6N1MAFXI ","M6N1MAFYI ","M6N1MAFZI ","M6N1MAGXI ", & + "M6N1MAGYI ","M6N1MAGZI ","M6N1MBFXI ","M6N1MBFYI ","M6N1MBFZI ","M6N1MBXI ","M6N1MBYI ", & + "M6N1MBZI ","M6N1MMGXI ","M6N1MMGYI ","M6N1MMGZI ","M6N1STAXI ","M6N1STAYI ","M6N1STAZI ", & + "M6N1STVXI ","M6N1STVYI ","M6N1STVZI ","M6N1VXI ","M6N1VYI ","M6N1VZI ","M6N2AXI ", & + "M6N2AYI ","M6N2AZI ","M6N2DYNP ","M6N2FAFXI ","M6N2FAFYI ","M6N2FAFZI ","M6N2FAGXI ", & + "M6N2FAGYI ","M6N2FAGZI ","M6N2FAMXI ","M6N2FAMYI ","M6N2FAMZI ","M6N2FBFXI ","M6N2FBFYI ", & + "M6N2FBFZI ","M6N2FBXI ","M6N2FBYI ","M6N2FBZI ","M6N2FDXI ","M6N2FDYI ","M6N2FDZI ", & + "M6N2FIXI ","M6N2FIYI ","M6N2FIZI ","M6N2FMGXI ","M6N2FMGYI ","M6N2FMGZI ","M6N2MAFXI ", & + "M6N2MAFYI ","M6N2MAFZI ","M6N2MAGXI ","M6N2MAGYI ","M6N2MAGZI ","M6N2MBFXI ","M6N2MBFYI ", & + "M6N2MBFZI ","M6N2MBXI ","M6N2MBYI ","M6N2MBZI ","M6N2MMGXI ","M6N2MMGYI ","M6N2MMGZI ", & + "M6N2STAXI ","M6N2STAYI ","M6N2STAZI ","M6N2STVXI ","M6N2STVYI ","M6N2STVZI ","M6N2VXI ", & + "M6N2VYI ","M6N2VZI ","M6N3AXI ","M6N3AYI ","M6N3AZI ","M6N3DYNP ","M6N3FAFXI ", & + "M6N3FAFYI ","M6N3FAFZI ","M6N3FAGXI ","M6N3FAGYI ","M6N3FAGZI ","M6N3FAMXI ","M6N3FAMYI ", & + "M6N3FAMZI ","M6N3FBFXI ","M6N3FBFYI ","M6N3FBFZI ","M6N3FBXI ","M6N3FBYI ","M6N3FBZI ", & + "M6N3FDXI ","M6N3FDYI ","M6N3FDZI ","M6N3FIXI ","M6N3FIYI ","M6N3FIZI ","M6N3FMGXI ", & + "M6N3FMGYI ","M6N3FMGZI ","M6N3MAFXI ","M6N3MAFYI ","M6N3MAFZI ","M6N3MAGXI ","M6N3MAGYI ", & + "M6N3MAGZI ","M6N3MBFXI ","M6N3MBFYI ","M6N3MBFZI ","M6N3MBXI ","M6N3MBYI ","M6N3MBZI ", & + "M6N3MMGXI ","M6N3MMGYI ","M6N3MMGZI ","M6N3STAXI ","M6N3STAYI ","M6N3STAZI ","M6N3STVXI ", & + "M6N3STVYI ","M6N3STVZI ","M6N3VXI ","M6N3VYI ","M6N3VZI ","M6N4AXI ","M6N4AYI ", & + "M6N4AZI ","M6N4DYNP ","M6N4FAFXI ","M6N4FAFYI ","M6N4FAFZI ","M6N4FAGXI ","M6N4FAGYI ", & + "M6N4FAGZI ","M6N4FAMXI ","M6N4FAMYI ","M6N4FAMZI ","M6N4FBFXI ","M6N4FBFYI ","M6N4FBFZI ", & + "M6N4FBXI ","M6N4FBYI ","M6N4FBZI ","M6N4FDXI ","M6N4FDYI ","M6N4FDZI ","M6N4FIXI ", & + "M6N4FIYI ","M6N4FIZI ","M6N4FMGXI ","M6N4FMGYI ","M6N4FMGZI ","M6N4MAFXI ","M6N4MAFYI ", & + "M6N4MAFZI ","M6N4MAGXI ","M6N4MAGYI ","M6N4MAGZI ","M6N4MBFXI ","M6N4MBFYI ","M6N4MBFZI ", & + "M6N4MBXI ","M6N4MBYI ","M6N4MBZI ","M6N4MMGXI ","M6N4MMGYI ","M6N4MMGZI ","M6N4STAXI ", & + "M6N4STAYI ","M6N4STAZI ","M6N4STVXI ","M6N4STVYI ","M6N4STVZI ","M6N4VXI ","M6N4VYI ", & + "M6N4VZI ","M6N5AXI ","M6N5AYI ","M6N5AZI ","M6N5DYNP ","M6N5FAFXI ","M6N5FAFYI ", & + "M6N5FAFZI ","M6N5FAGXI ","M6N5FAGYI ","M6N5FAGZI ","M6N5FAMXI ","M6N5FAMYI ","M6N5FAMZI ", & + "M6N5FBFXI ","M6N5FBFYI ","M6N5FBFZI ","M6N5FBXI ","M6N5FBYI ","M6N5FBZI ","M6N5FDXI "/) + ValidParamAry(2983:3479) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M6N5FDYI ","M6N5FDZI ","M6N5FIXI ","M6N5FIYI ","M6N5FIZI ","M6N5FMGXI ","M6N5FMGYI ", & + "M6N5FMGZI ","M6N5MAFXI ","M6N5MAFYI ","M6N5MAFZI ","M6N5MAGXI ","M6N5MAGYI ","M6N5MAGZI ", & + "M6N5MBFXI ","M6N5MBFYI ","M6N5MBFZI ","M6N5MBXI ","M6N5MBYI ","M6N5MBZI ","M6N5MMGXI ", & + "M6N5MMGYI ","M6N5MMGZI ","M6N5STAXI ","M6N5STAYI ","M6N5STAZI ","M6N5STVXI ","M6N5STVYI ", & + "M6N5STVZI ","M6N5VXI ","M6N5VYI ","M6N5VZI ","M6N6AXI ","M6N6AYI ","M6N6AZI ", & + "M6N6DYNP ","M6N6FAFXI ","M6N6FAFYI ","M6N6FAFZI ","M6N6FAGXI ","M6N6FAGYI ","M6N6FAGZI ", & + "M6N6FAMXI ","M6N6FAMYI ","M6N6FAMZI ","M6N6FBFXI ","M6N6FBFYI ","M6N6FBFZI ","M6N6FBXI ", & + "M6N6FBYI ","M6N6FBZI ","M6N6FDXI ","M6N6FDYI ","M6N6FDZI ","M6N6FIXI ","M6N6FIYI ", & + "M6N6FIZI ","M6N6FMGXI ","M6N6FMGYI ","M6N6FMGZI ","M6N6MAFXI ","M6N6MAFYI ","M6N6MAFZI ", & + "M6N6MAGXI ","M6N6MAGYI ","M6N6MAGZI ","M6N6MBFXI ","M6N6MBFYI ","M6N6MBFZI ","M6N6MBXI ", & + "M6N6MBYI ","M6N6MBZI ","M6N6MMGXI ","M6N6MMGYI ","M6N6MMGZI ","M6N6STAXI ","M6N6STAYI ", & + "M6N6STAZI ","M6N6STVXI ","M6N6STVYI ","M6N6STVZI ","M6N6VXI ","M6N6VYI ","M6N6VZI ", & + "M6N7AXI ","M6N7AYI ","M6N7AZI ","M6N7DYNP ","M6N7FAFXI ","M6N7FAFYI ","M6N7FAFZI ", & + "M6N7FAGXI ","M6N7FAGYI ","M6N7FAGZI ","M6N7FAMXI ","M6N7FAMYI ","M6N7FAMZI ","M6N7FBFXI ", & + "M6N7FBFYI ","M6N7FBFZI ","M6N7FBXI ","M6N7FBYI ","M6N7FBZI ","M6N7FDXI ","M6N7FDYI ", & + "M6N7FDZI ","M6N7FIXI ","M6N7FIYI ","M6N7FIZI ","M6N7FMGXI ","M6N7FMGYI ","M6N7FMGZI ", & + "M6N7MAFXI ","M6N7MAFYI ","M6N7MAFZI ","M6N7MAGXI ","M6N7MAGYI ","M6N7MAGZI ","M6N7MBFXI ", & + "M6N7MBFYI ","M6N7MBFZI ","M6N7MBXI ","M6N7MBYI ","M6N7MBZI ","M6N7MMGXI ","M6N7MMGYI ", & + "M6N7MMGZI ","M6N7STAXI ","M6N7STAYI ","M6N7STAZI ","M6N7STVXI ","M6N7STVYI ","M6N7STVZI ", & + "M6N7VXI ","M6N7VYI ","M6N7VZI ","M6N8AXI ","M6N8AYI ","M6N8AZI ","M6N8DYNP ", & + "M6N8FAFXI ","M6N8FAFYI ","M6N8FAFZI ","M6N8FAGXI ","M6N8FAGYI ","M6N8FAGZI ","M6N8FAMXI ", & + "M6N8FAMYI ","M6N8FAMZI ","M6N8FBFXI ","M6N8FBFYI ","M6N8FBFZI ","M6N8FBXI ","M6N8FBYI ", & + "M6N8FBZI ","M6N8FDXI ","M6N8FDYI ","M6N8FDZI ","M6N8FIXI ","M6N8FIYI ","M6N8FIZI ", & + "M6N8FMGXI ","M6N8FMGYI ","M6N8FMGZI ","M6N8MAFXI ","M6N8MAFYI ","M6N8MAFZI ","M6N8MAGXI ", & + "M6N8MAGYI ","M6N8MAGZI ","M6N8MBFXI ","M6N8MBFYI ","M6N8MBFZI ","M6N8MBXI ","M6N8MBYI ", & + "M6N8MBZI ","M6N8MMGXI ","M6N8MMGYI ","M6N8MMGZI ","M6N8STAXI ","M6N8STAYI ","M6N8STAZI ", & + "M6N8STVXI ","M6N8STVYI ","M6N8STVZI ","M6N8VXI ","M6N8VYI ","M6N8VZI ","M6N9AXI ", & + "M6N9AYI ","M6N9AZI ","M6N9DYNP ","M6N9FAFXI ","M6N9FAFYI ","M6N9FAFZI ","M6N9FAGXI ", & + "M6N9FAGYI ","M6N9FAGZI ","M6N9FAMXI ","M6N9FAMYI ","M6N9FAMZI ","M6N9FBFXI ","M6N9FBFYI ", & + "M6N9FBFZI ","M6N9FBXI ","M6N9FBYI ","M6N9FBZI ","M6N9FDXI ","M6N9FDYI ","M6N9FDZI ", & + "M6N9FIXI ","M6N9FIYI ","M6N9FIZI ","M6N9FMGXI ","M6N9FMGYI ","M6N9FMGZI ","M6N9MAFXI ", & + "M6N9MAFYI ","M6N9MAFZI ","M6N9MAGXI ","M6N9MAGYI ","M6N9MAGZI ","M6N9MBFXI ","M6N9MBFYI ", & + "M6N9MBFZI ","M6N9MBXI ","M6N9MBYI ","M6N9MBZI ","M6N9MMGXI ","M6N9MMGYI ","M6N9MMGZI ", & + "M6N9STAXI ","M6N9STAYI ","M6N9STAZI ","M6N9STVXI ","M6N9STVYI ","M6N9STVZI ","M6N9VXI ", & + "M6N9VYI ","M6N9VZI ","M7N1AXI ","M7N1AYI ","M7N1AZI ","M7N1DYNP ","M7N1FAFXI ", & + "M7N1FAFYI ","M7N1FAFZI ","M7N1FAGXI ","M7N1FAGYI ","M7N1FAGZI ","M7N1FAMXI ","M7N1FAMYI ", & + "M7N1FAMZI ","M7N1FBFXI ","M7N1FBFYI ","M7N1FBFZI ","M7N1FBXI ","M7N1FBYI ","M7N1FBZI ", & + "M7N1FDXI ","M7N1FDYI ","M7N1FDZI ","M7N1FIXI ","M7N1FIYI ","M7N1FIZI ","M7N1FMGXI ", & + "M7N1FMGYI ","M7N1FMGZI ","M7N1MAFXI ","M7N1MAFYI ","M7N1MAFZI ","M7N1MAGXI ","M7N1MAGYI ", & + "M7N1MAGZI ","M7N1MBFXI ","M7N1MBFYI ","M7N1MBFZI ","M7N1MBXI ","M7N1MBYI ","M7N1MBZI ", & + "M7N1MMGXI ","M7N1MMGYI ","M7N1MMGZI ","M7N1STAXI ","M7N1STAYI ","M7N1STAZI ","M7N1STVXI ", & + "M7N1STVYI ","M7N1STVZI ","M7N1VXI ","M7N1VYI ","M7N1VZI ","M7N2AXI ","M7N2AYI ", & + "M7N2AZI ","M7N2DYNP ","M7N2FAFXI ","M7N2FAFYI ","M7N2FAFZI ","M7N2FAGXI ","M7N2FAGYI ", & + "M7N2FAGZI ","M7N2FAMXI ","M7N2FAMYI ","M7N2FAMZI ","M7N2FBFXI ","M7N2FBFYI ","M7N2FBFZI ", & + "M7N2FBXI ","M7N2FBYI ","M7N2FBZI ","M7N2FDXI ","M7N2FDYI ","M7N2FDZI ","M7N2FIXI ", & + "M7N2FIYI ","M7N2FIZI ","M7N2FMGXI ","M7N2FMGYI ","M7N2FMGZI ","M7N2MAFXI ","M7N2MAFYI ", & + "M7N2MAFZI ","M7N2MAGXI ","M7N2MAGYI ","M7N2MAGZI ","M7N2MBFXI ","M7N2MBFYI ","M7N2MBFZI ", & + "M7N2MBXI ","M7N2MBYI ","M7N2MBZI ","M7N2MMGXI ","M7N2MMGYI ","M7N2MMGZI ","M7N2STAXI ", & + "M7N2STAYI ","M7N2STAZI ","M7N2STVXI ","M7N2STVYI ","M7N2STVZI ","M7N2VXI ","M7N2VYI ", & + "M7N2VZI ","M7N3AXI ","M7N3AYI ","M7N3AZI ","M7N3DYNP ","M7N3FAFXI ","M7N3FAFYI ", & + "M7N3FAFZI ","M7N3FAGXI ","M7N3FAGYI ","M7N3FAGZI ","M7N3FAMXI ","M7N3FAMYI ","M7N3FAMZI ", & + "M7N3FBFXI ","M7N3FBFYI ","M7N3FBFZI ","M7N3FBXI ","M7N3FBYI ","M7N3FBZI ","M7N3FDXI ", & + "M7N3FDYI ","M7N3FDZI ","M7N3FIXI ","M7N3FIYI ","M7N3FIZI ","M7N3FMGXI ","M7N3FMGYI ", & + "M7N3FMGZI ","M7N3MAFXI ","M7N3MAFYI ","M7N3MAFZI ","M7N3MAGXI ","M7N3MAGYI ","M7N3MAGZI ", & + "M7N3MBFXI ","M7N3MBFYI ","M7N3MBFZI ","M7N3MBXI ","M7N3MBYI ","M7N3MBZI ","M7N3MMGXI ", & + "M7N3MMGYI ","M7N3MMGZI ","M7N3STAXI ","M7N3STAYI ","M7N3STAZI ","M7N3STVXI ","M7N3STVYI ", & + "M7N3STVZI ","M7N3VXI ","M7N3VYI ","M7N3VZI ","M7N4AXI ","M7N4AYI ","M7N4AZI ", & + "M7N4DYNP ","M7N4FAFXI ","M7N4FAFYI ","M7N4FAFZI ","M7N4FAGXI ","M7N4FAGYI ","M7N4FAGZI ", & + "M7N4FAMXI ","M7N4FAMYI ","M7N4FAMZI ","M7N4FBFXI ","M7N4FBFYI ","M7N4FBFZI ","M7N4FBXI ", & + "M7N4FBYI ","M7N4FBZI ","M7N4FDXI ","M7N4FDYI ","M7N4FDZI ","M7N4FIXI ","M7N4FIYI ", & + "M7N4FIZI ","M7N4FMGXI ","M7N4FMGYI ","M7N4FMGZI ","M7N4MAFXI ","M7N4MAFYI ","M7N4MAFZI ", & + "M7N4MAGXI ","M7N4MAGYI ","M7N4MAGZI ","M7N4MBFXI ","M7N4MBFYI ","M7N4MBFZI ","M7N4MBXI ", & + "M7N4MBYI ","M7N4MBZI ","M7N4MMGXI ","M7N4MMGYI ","M7N4MMGZI ","M7N4STAXI ","M7N4STAYI ", & + "M7N4STAZI ","M7N4STVXI ","M7N4STVYI ","M7N4STVZI ","M7N4VXI ","M7N4VYI ","M7N4VZI ", & + "M7N5AXI ","M7N5AYI ","M7N5AZI ","M7N5DYNP ","M7N5FAFXI ","M7N5FAFYI ","M7N5FAFZI ", & + "M7N5FAGXI ","M7N5FAGYI ","M7N5FAGZI ","M7N5FAMXI ","M7N5FAMYI ","M7N5FAMZI ","M7N5FBFXI ", & + "M7N5FBFYI ","M7N5FBFZI ","M7N5FBXI ","M7N5FBYI ","M7N5FBZI ","M7N5FDXI ","M7N5FDYI ", & + "M7N5FDZI ","M7N5FIXI ","M7N5FIYI ","M7N5FIZI ","M7N5FMGXI ","M7N5FMGYI ","M7N5FMGZI ", & + "M7N5MAFXI ","M7N5MAFYI ","M7N5MAFZI ","M7N5MAGXI ","M7N5MAGYI ","M7N5MAGZI ","M7N5MBFXI ", & + "M7N5MBFYI ","M7N5MBFZI ","M7N5MBXI ","M7N5MBYI ","M7N5MBZI ","M7N5MMGXI ","M7N5MMGYI ", & + "M7N5MMGZI ","M7N5STAXI ","M7N5STAYI ","M7N5STAZI ","M7N5STVXI ","M7N5STVYI ","M7N5STVZI "/) + ValidParamAry(3480:3976) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M7N5VXI ","M7N5VYI ","M7N5VZI ","M7N6AXI ","M7N6AYI ","M7N6AZI ","M7N6DYNP ", & + "M7N6FAFXI ","M7N6FAFYI ","M7N6FAFZI ","M7N6FAGXI ","M7N6FAGYI ","M7N6FAGZI ","M7N6FAMXI ", & + "M7N6FAMYI ","M7N6FAMZI ","M7N6FBFXI ","M7N6FBFYI ","M7N6FBFZI ","M7N6FBXI ","M7N6FBYI ", & + "M7N6FBZI ","M7N6FDXI ","M7N6FDYI ","M7N6FDZI ","M7N6FIXI ","M7N6FIYI ","M7N6FIZI ", & + "M7N6FMGXI ","M7N6FMGYI ","M7N6FMGZI ","M7N6MAFXI ","M7N6MAFYI ","M7N6MAFZI ","M7N6MAGXI ", & + "M7N6MAGYI ","M7N6MAGZI ","M7N6MBFXI ","M7N6MBFYI ","M7N6MBFZI ","M7N6MBXI ","M7N6MBYI ", & + "M7N6MBZI ","M7N6MMGXI ","M7N6MMGYI ","M7N6MMGZI ","M7N6STAXI ","M7N6STAYI ","M7N6STAZI ", & + "M7N6STVXI ","M7N6STVYI ","M7N6STVZI ","M7N6VXI ","M7N6VYI ","M7N6VZI ","M7N7AXI ", & + "M7N7AYI ","M7N7AZI ","M7N7DYNP ","M7N7FAFXI ","M7N7FAFYI ","M7N7FAFZI ","M7N7FAGXI ", & + "M7N7FAGYI ","M7N7FAGZI ","M7N7FAMXI ","M7N7FAMYI ","M7N7FAMZI ","M7N7FBFXI ","M7N7FBFYI ", & + "M7N7FBFZI ","M7N7FBXI ","M7N7FBYI ","M7N7FBZI ","M7N7FDXI ","M7N7FDYI ","M7N7FDZI ", & + "M7N7FIXI ","M7N7FIYI ","M7N7FIZI ","M7N7FMGXI ","M7N7FMGYI ","M7N7FMGZI ","M7N7MAFXI ", & + "M7N7MAFYI ","M7N7MAFZI ","M7N7MAGXI ","M7N7MAGYI ","M7N7MAGZI ","M7N7MBFXI ","M7N7MBFYI ", & + "M7N7MBFZI ","M7N7MBXI ","M7N7MBYI ","M7N7MBZI ","M7N7MMGXI ","M7N7MMGYI ","M7N7MMGZI ", & + "M7N7STAXI ","M7N7STAYI ","M7N7STAZI ","M7N7STVXI ","M7N7STVYI ","M7N7STVZI ","M7N7VXI ", & + "M7N7VYI ","M7N7VZI ","M7N8AXI ","M7N8AYI ","M7N8AZI ","M7N8DYNP ","M7N8FAFXI ", & + "M7N8FAFYI ","M7N8FAFZI ","M7N8FAGXI ","M7N8FAGYI ","M7N8FAGZI ","M7N8FAMXI ","M7N8FAMYI ", & + "M7N8FAMZI ","M7N8FBFXI ","M7N8FBFYI ","M7N8FBFZI ","M7N8FBXI ","M7N8FBYI ","M7N8FBZI ", & + "M7N8FDXI ","M7N8FDYI ","M7N8FDZI ","M7N8FIXI ","M7N8FIYI ","M7N8FIZI ","M7N8FMGXI ", & + "M7N8FMGYI ","M7N8FMGZI ","M7N8MAFXI ","M7N8MAFYI ","M7N8MAFZI ","M7N8MAGXI ","M7N8MAGYI ", & + "M7N8MAGZI ","M7N8MBFXI ","M7N8MBFYI ","M7N8MBFZI ","M7N8MBXI ","M7N8MBYI ","M7N8MBZI ", & + "M7N8MMGXI ","M7N8MMGYI ","M7N8MMGZI ","M7N8STAXI ","M7N8STAYI ","M7N8STAZI ","M7N8STVXI ", & + "M7N8STVYI ","M7N8STVZI ","M7N8VXI ","M7N8VYI ","M7N8VZI ","M7N9AXI ","M7N9AYI ", & + "M7N9AZI ","M7N9DYNP ","M7N9FAFXI ","M7N9FAFYI ","M7N9FAFZI ","M7N9FAGXI ","M7N9FAGYI ", & + "M7N9FAGZI ","M7N9FAMXI ","M7N9FAMYI ","M7N9FAMZI ","M7N9FBFXI ","M7N9FBFYI ","M7N9FBFZI ", & + "M7N9FBXI ","M7N9FBYI ","M7N9FBZI ","M7N9FDXI ","M7N9FDYI ","M7N9FDZI ","M7N9FIXI ", & + "M7N9FIYI ","M7N9FIZI ","M7N9FMGXI ","M7N9FMGYI ","M7N9FMGZI ","M7N9MAFXI ","M7N9MAFYI ", & + "M7N9MAFZI ","M7N9MAGXI ","M7N9MAGYI ","M7N9MAGZI ","M7N9MBFXI ","M7N9MBFYI ","M7N9MBFZI ", & + "M7N9MBXI ","M7N9MBYI ","M7N9MBZI ","M7N9MMGXI ","M7N9MMGYI ","M7N9MMGZI ","M7N9STAXI ", & + "M7N9STAYI ","M7N9STAZI ","M7N9STVXI ","M7N9STVYI ","M7N9STVZI ","M7N9VXI ","M7N9VYI ", & + "M7N9VZI ","M8N1AXI ","M8N1AYI ","M8N1AZI ","M8N1DYNP ","M8N1FAFXI ","M8N1FAFYI ", & + "M8N1FAFZI ","M8N1FAGXI ","M8N1FAGYI ","M8N1FAGZI ","M8N1FAMXI ","M8N1FAMYI ","M8N1FAMZI ", & + "M8N1FBFXI ","M8N1FBFYI ","M8N1FBFZI ","M8N1FBXI ","M8N1FBYI ","M8N1FBZI ","M8N1FDXI ", & + "M8N1FDYI ","M8N1FDZI ","M8N1FIXI ","M8N1FIYI ","M8N1FIZI ","M8N1FMGXI ","M8N1FMGYI ", & + "M8N1FMGZI ","M8N1MAFXI ","M8N1MAFYI ","M8N1MAFZI ","M8N1MAGXI ","M8N1MAGYI ","M8N1MAGZI ", & + "M8N1MBFXI ","M8N1MBFYI ","M8N1MBFZI ","M8N1MBXI ","M8N1MBYI ","M8N1MBZI ","M8N1MMGXI ", & + "M8N1MMGYI ","M8N1MMGZI ","M8N1STAXI ","M8N1STAYI ","M8N1STAZI ","M8N1STVXI ","M8N1STVYI ", & + "M8N1STVZI ","M8N1VXI ","M8N1VYI ","M8N1VZI ","M8N2AXI ","M8N2AYI ","M8N2AZI ", & + "M8N2DYNP ","M8N2FAFXI ","M8N2FAFYI ","M8N2FAFZI ","M8N2FAGXI ","M8N2FAGYI ","M8N2FAGZI ", & + "M8N2FAMXI ","M8N2FAMYI ","M8N2FAMZI ","M8N2FBFXI ","M8N2FBFYI ","M8N2FBFZI ","M8N2FBXI ", & + "M8N2FBYI ","M8N2FBZI ","M8N2FDXI ","M8N2FDYI ","M8N2FDZI ","M8N2FIXI ","M8N2FIYI ", & + "M8N2FIZI ","M8N2FMGXI ","M8N2FMGYI ","M8N2FMGZI ","M8N2MAFXI ","M8N2MAFYI ","M8N2MAFZI ", & + "M8N2MAGXI ","M8N2MAGYI ","M8N2MAGZI ","M8N2MBFXI ","M8N2MBFYI ","M8N2MBFZI ","M8N2MBXI ", & + "M8N2MBYI ","M8N2MBZI ","M8N2MMGXI ","M8N2MMGYI ","M8N2MMGZI ","M8N2STAXI ","M8N2STAYI ", & + "M8N2STAZI ","M8N2STVXI ","M8N2STVYI ","M8N2STVZI ","M8N2VXI ","M8N2VYI ","M8N2VZI ", & + "M8N3AXI ","M8N3AYI ","M8N3AZI ","M8N3DYNP ","M8N3FAFXI ","M8N3FAFYI ","M8N3FAFZI ", & + "M8N3FAGXI ","M8N3FAGYI ","M8N3FAGZI ","M8N3FAMXI ","M8N3FAMYI ","M8N3FAMZI ","M8N3FBFXI ", & + "M8N3FBFYI ","M8N3FBFZI ","M8N3FBXI ","M8N3FBYI ","M8N3FBZI ","M8N3FDXI ","M8N3FDYI ", & + "M8N3FDZI ","M8N3FIXI ","M8N3FIYI ","M8N3FIZI ","M8N3FMGXI ","M8N3FMGYI ","M8N3FMGZI ", & + "M8N3MAFXI ","M8N3MAFYI ","M8N3MAFZI ","M8N3MAGXI ","M8N3MAGYI ","M8N3MAGZI ","M8N3MBFXI ", & + "M8N3MBFYI ","M8N3MBFZI ","M8N3MBXI ","M8N3MBYI ","M8N3MBZI ","M8N3MMGXI ","M8N3MMGYI ", & + "M8N3MMGZI ","M8N3STAXI ","M8N3STAYI ","M8N3STAZI ","M8N3STVXI ","M8N3STVYI ","M8N3STVZI ", & + "M8N3VXI ","M8N3VYI ","M8N3VZI ","M8N4AXI ","M8N4AYI ","M8N4AZI ","M8N4DYNP ", & + "M8N4FAFXI ","M8N4FAFYI ","M8N4FAFZI ","M8N4FAGXI ","M8N4FAGYI ","M8N4FAGZI ","M8N4FAMXI ", & + "M8N4FAMYI ","M8N4FAMZI ","M8N4FBFXI ","M8N4FBFYI ","M8N4FBFZI ","M8N4FBXI ","M8N4FBYI ", & + "M8N4FBZI ","M8N4FDXI ","M8N4FDYI ","M8N4FDZI ","M8N4FIXI ","M8N4FIYI ","M8N4FIZI ", & + "M8N4FMGXI ","M8N4FMGYI ","M8N4FMGZI ","M8N4MAFXI ","M8N4MAFYI ","M8N4MAFZI ","M8N4MAGXI ", & + "M8N4MAGYI ","M8N4MAGZI ","M8N4MBFXI ","M8N4MBFYI ","M8N4MBFZI ","M8N4MBXI ","M8N4MBYI ", & + "M8N4MBZI ","M8N4MMGXI ","M8N4MMGYI ","M8N4MMGZI ","M8N4STAXI ","M8N4STAYI ","M8N4STAZI ", & + "M8N4STVXI ","M8N4STVYI ","M8N4STVZI ","M8N4VXI ","M8N4VYI ","M8N4VZI ","M8N5AXI ", & + "M8N5AYI ","M8N5AZI ","M8N5DYNP ","M8N5FAFXI ","M8N5FAFYI ","M8N5FAFZI ","M8N5FAGXI ", & + "M8N5FAGYI ","M8N5FAGZI ","M8N5FAMXI ","M8N5FAMYI ","M8N5FAMZI ","M8N5FBFXI ","M8N5FBFYI ", & + "M8N5FBFZI ","M8N5FBXI ","M8N5FBYI ","M8N5FBZI ","M8N5FDXI ","M8N5FDYI ","M8N5FDZI ", & + "M8N5FIXI ","M8N5FIYI ","M8N5FIZI ","M8N5FMGXI ","M8N5FMGYI ","M8N5FMGZI ","M8N5MAFXI ", & + "M8N5MAFYI ","M8N5MAFZI ","M8N5MAGXI ","M8N5MAGYI ","M8N5MAGZI ","M8N5MBFXI ","M8N5MBFYI ", & + "M8N5MBFZI ","M8N5MBXI ","M8N5MBYI ","M8N5MBZI ","M8N5MMGXI ","M8N5MMGYI ","M8N5MMGZI ", & + "M8N5STAXI ","M8N5STAYI ","M8N5STAZI ","M8N5STVXI ","M8N5STVYI ","M8N5STVZI ","M8N5VXI ", & + "M8N5VYI ","M8N5VZI ","M8N6AXI ","M8N6AYI ","M8N6AZI ","M8N6DYNP ","M8N6FAFXI ", & + "M8N6FAFYI ","M8N6FAFZI ","M8N6FAGXI ","M8N6FAGYI ","M8N6FAGZI ","M8N6FAMXI ","M8N6FAMYI ", & + "M8N6FAMZI ","M8N6FBFXI ","M8N6FBFYI ","M8N6FBFZI ","M8N6FBXI ","M8N6FBYI ","M8N6FBZI ", & + "M8N6FDXI ","M8N6FDYI ","M8N6FDZI ","M8N6FIXI ","M8N6FIYI ","M8N6FIZI ","M8N6FMGXI "/) + ValidParamAry(3977:4473) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M8N6FMGYI ","M8N6FMGZI ","M8N6MAFXI ","M8N6MAFYI ","M8N6MAFZI ","M8N6MAGXI ","M8N6MAGYI ", & + "M8N6MAGZI ","M8N6MBFXI ","M8N6MBFYI ","M8N6MBFZI ","M8N6MBXI ","M8N6MBYI ","M8N6MBZI ", & + "M8N6MMGXI ","M8N6MMGYI ","M8N6MMGZI ","M8N6STAXI ","M8N6STAYI ","M8N6STAZI ","M8N6STVXI ", & + "M8N6STVYI ","M8N6STVZI ","M8N6VXI ","M8N6VYI ","M8N6VZI ","M8N7AXI ","M8N7AYI ", & + "M8N7AZI ","M8N7DYNP ","M8N7FAFXI ","M8N7FAFYI ","M8N7FAFZI ","M8N7FAGXI ","M8N7FAGYI ", & + "M8N7FAGZI ","M8N7FAMXI ","M8N7FAMYI ","M8N7FAMZI ","M8N7FBFXI ","M8N7FBFYI ","M8N7FBFZI ", & + "M8N7FBXI ","M8N7FBYI ","M8N7FBZI ","M8N7FDXI ","M8N7FDYI ","M8N7FDZI ","M8N7FIXI ", & + "M8N7FIYI ","M8N7FIZI ","M8N7FMGXI ","M8N7FMGYI ","M8N7FMGZI ","M8N7MAFXI ","M8N7MAFYI ", & + "M8N7MAFZI ","M8N7MAGXI ","M8N7MAGYI ","M8N7MAGZI ","M8N7MBFXI ","M8N7MBFYI ","M8N7MBFZI ", & + "M8N7MBXI ","M8N7MBYI ","M8N7MBZI ","M8N7MMGXI ","M8N7MMGYI ","M8N7MMGZI ","M8N7STAXI ", & + "M8N7STAYI ","M8N7STAZI ","M8N7STVXI ","M8N7STVYI ","M8N7STVZI ","M8N7VXI ","M8N7VYI ", & + "M8N7VZI ","M8N8AXI ","M8N8AYI ","M8N8AZI ","M8N8DYNP ","M8N8FAFXI ","M8N8FAFYI ", & + "M8N8FAFZI ","M8N8FAGXI ","M8N8FAGYI ","M8N8FAGZI ","M8N8FAMXI ","M8N8FAMYI ","M8N8FAMZI ", & + "M8N8FBFXI ","M8N8FBFYI ","M8N8FBFZI ","M8N8FBXI ","M8N8FBYI ","M8N8FBZI ","M8N8FDXI ", & + "M8N8FDYI ","M8N8FDZI ","M8N8FIXI ","M8N8FIYI ","M8N8FIZI ","M8N8FMGXI ","M8N8FMGYI ", & + "M8N8FMGZI ","M8N8MAFXI ","M8N8MAFYI ","M8N8MAFZI ","M8N8MAGXI ","M8N8MAGYI ","M8N8MAGZI ", & + "M8N8MBFXI ","M8N8MBFYI ","M8N8MBFZI ","M8N8MBXI ","M8N8MBYI ","M8N8MBZI ","M8N8MMGXI ", & + "M8N8MMGYI ","M8N8MMGZI ","M8N8STAXI ","M8N8STAYI ","M8N8STAZI ","M8N8STVXI ","M8N8STVYI ", & + "M8N8STVZI ","M8N8VXI ","M8N8VYI ","M8N8VZI ","M8N9AXI ","M8N9AYI ","M8N9AZI ", & + "M8N9DYNP ","M8N9FAFXI ","M8N9FAFYI ","M8N9FAFZI ","M8N9FAGXI ","M8N9FAGYI ","M8N9FAGZI ", & + "M8N9FAMXI ","M8N9FAMYI ","M8N9FAMZI ","M8N9FBFXI ","M8N9FBFYI ","M8N9FBFZI ","M8N9FBXI ", & + "M8N9FBYI ","M8N9FBZI ","M8N9FDXI ","M8N9FDYI ","M8N9FDZI ","M8N9FIXI ","M8N9FIYI ", & + "M8N9FIZI ","M8N9FMGXI ","M8N9FMGYI ","M8N9FMGZI ","M8N9MAFXI ","M8N9MAFYI ","M8N9MAFZI ", & + "M8N9MAGXI ","M8N9MAGYI ","M8N9MAGZI ","M8N9MBFXI ","M8N9MBFYI ","M8N9MBFZI ","M8N9MBXI ", & + "M8N9MBYI ","M8N9MBZI ","M8N9MMGXI ","M8N9MMGYI ","M8N9MMGZI ","M8N9STAXI ","M8N9STAYI ", & + "M8N9STAZI ","M8N9STVXI ","M8N9STVYI ","M8N9STVZI ","M8N9VXI ","M8N9VYI ","M8N9VZI ", & + "M9N1AXI ","M9N1AYI ","M9N1AZI ","M9N1DYNP ","M9N1FAFXI ","M9N1FAFYI ","M9N1FAFZI ", & + "M9N1FAGXI ","M9N1FAGYI ","M9N1FAGZI ","M9N1FAMXI ","M9N1FAMYI ","M9N1FAMZI ","M9N1FBFXI ", & + "M9N1FBFYI ","M9N1FBFZI ","M9N1FBXI ","M9N1FBYI ","M9N1FBZI ","M9N1FDXI ","M9N1FDYI ", & + "M9N1FDZI ","M9N1FIXI ","M9N1FIYI ","M9N1FIZI ","M9N1FMGXI ","M9N1FMGYI ","M9N1FMGZI ", & + "M9N1MAFXI ","M9N1MAFYI ","M9N1MAFZI ","M9N1MAGXI ","M9N1MAGYI ","M9N1MAGZI ","M9N1MBFXI ", & + "M9N1MBFYI ","M9N1MBFZI ","M9N1MBXI ","M9N1MBYI ","M9N1MBZI ","M9N1MMGXI ","M9N1MMGYI ", & + "M9N1MMGZI ","M9N1STAXI ","M9N1STAYI ","M9N1STAZI ","M9N1STVXI ","M9N1STVYI ","M9N1STVZI ", & + "M9N1VXI ","M9N1VYI ","M9N1VZI ","M9N2AXI ","M9N2AYI ","M9N2AZI ","M9N2DYNP ", & + "M9N2FAFXI ","M9N2FAFYI ","M9N2FAFZI ","M9N2FAGXI ","M9N2FAGYI ","M9N2FAGZI ","M9N2FAMXI ", & + "M9N2FAMYI ","M9N2FAMZI ","M9N2FBFXI ","M9N2FBFYI ","M9N2FBFZI ","M9N2FBXI ","M9N2FBYI ", & + "M9N2FBZI ","M9N2FDXI ","M9N2FDYI ","M9N2FDZI ","M9N2FIXI ","M9N2FIYI ","M9N2FIZI ", & + "M9N2FMGXI ","M9N2FMGYI ","M9N2FMGZI ","M9N2MAFXI ","M9N2MAFYI ","M9N2MAFZI ","M9N2MAGXI ", & + "M9N2MAGYI ","M9N2MAGZI ","M9N2MBFXI ","M9N2MBFYI ","M9N2MBFZI ","M9N2MBXI ","M9N2MBYI ", & + "M9N2MBZI ","M9N2MMGXI ","M9N2MMGYI ","M9N2MMGZI ","M9N2STAXI ","M9N2STAYI ","M9N2STAZI ", & + "M9N2STVXI ","M9N2STVYI ","M9N2STVZI ","M9N2VXI ","M9N2VYI ","M9N2VZI ","M9N3AXI ", & + "M9N3AYI ","M9N3AZI ","M9N3DYNP ","M9N3FAFXI ","M9N3FAFYI ","M9N3FAFZI ","M9N3FAGXI ", & + "M9N3FAGYI ","M9N3FAGZI ","M9N3FAMXI ","M9N3FAMYI ","M9N3FAMZI ","M9N3FBFXI ","M9N3FBFYI ", & + "M9N3FBFZI ","M9N3FBXI ","M9N3FBYI ","M9N3FBZI ","M9N3FDXI ","M9N3FDYI ","M9N3FDZI ", & + "M9N3FIXI ","M9N3FIYI ","M9N3FIZI ","M9N3FMGXI ","M9N3FMGYI ","M9N3FMGZI ","M9N3MAFXI ", & + "M9N3MAFYI ","M9N3MAFZI ","M9N3MAGXI ","M9N3MAGYI ","M9N3MAGZI ","M9N3MBFXI ","M9N3MBFYI ", & + "M9N3MBFZI ","M9N3MBXI ","M9N3MBYI ","M9N3MBZI ","M9N3MMGXI ","M9N3MMGYI ","M9N3MMGZI ", & + "M9N3STAXI ","M9N3STAYI ","M9N3STAZI ","M9N3STVXI ","M9N3STVYI ","M9N3STVZI ","M9N3VXI ", & + "M9N3VYI ","M9N3VZI ","M9N4AXI ","M9N4AYI ","M9N4AZI ","M9N4DYNP ","M9N4FAFXI ", & + "M9N4FAFYI ","M9N4FAFZI ","M9N4FAGXI ","M9N4FAGYI ","M9N4FAGZI ","M9N4FAMXI ","M9N4FAMYI ", & + "M9N4FAMZI ","M9N4FBFXI ","M9N4FBFYI ","M9N4FBFZI ","M9N4FBXI ","M9N4FBYI ","M9N4FBZI ", & + "M9N4FDXI ","M9N4FDYI ","M9N4FDZI ","M9N4FIXI ","M9N4FIYI ","M9N4FIZI ","M9N4FMGXI ", & + "M9N4FMGYI ","M9N4FMGZI ","M9N4MAFXI ","M9N4MAFYI ","M9N4MAFZI ","M9N4MAGXI ","M9N4MAGYI ", & + "M9N4MAGZI ","M9N4MBFXI ","M9N4MBFYI ","M9N4MBFZI ","M9N4MBXI ","M9N4MBYI ","M9N4MBZI ", & + "M9N4MMGXI ","M9N4MMGYI ","M9N4MMGZI ","M9N4STAXI ","M9N4STAYI ","M9N4STAZI ","M9N4STVXI ", & + "M9N4STVYI ","M9N4STVZI ","M9N4VXI ","M9N4VYI ","M9N4VZI ","M9N5AXI ","M9N5AYI ", & + "M9N5AZI ","M9N5DYNP ","M9N5FAFXI ","M9N5FAFYI ","M9N5FAFZI ","M9N5FAGXI ","M9N5FAGYI ", & + "M9N5FAGZI ","M9N5FAMXI ","M9N5FAMYI ","M9N5FAMZI ","M9N5FBFXI ","M9N5FBFYI ","M9N5FBFZI ", & + "M9N5FBXI ","M9N5FBYI ","M9N5FBZI ","M9N5FDXI ","M9N5FDYI ","M9N5FDZI ","M9N5FIXI ", & + "M9N5FIYI ","M9N5FIZI ","M9N5FMGXI ","M9N5FMGYI ","M9N5FMGZI ","M9N5MAFXI ","M9N5MAFYI ", & + "M9N5MAFZI ","M9N5MAGXI ","M9N5MAGYI ","M9N5MAGZI ","M9N5MBFXI ","M9N5MBFYI ","M9N5MBFZI ", & + "M9N5MBXI ","M9N5MBYI ","M9N5MBZI ","M9N5MMGXI ","M9N5MMGYI ","M9N5MMGZI ","M9N5STAXI ", & + "M9N5STAYI ","M9N5STAZI ","M9N5STVXI ","M9N5STVYI ","M9N5STVZI ","M9N5VXI ","M9N5VYI ", & + "M9N5VZI ","M9N6AXI ","M9N6AYI ","M9N6AZI ","M9N6DYNP ","M9N6FAFXI ","M9N6FAFYI ", & + "M9N6FAFZI ","M9N6FAGXI ","M9N6FAGYI ","M9N6FAGZI ","M9N6FAMXI ","M9N6FAMYI ","M9N6FAMZI ", & + "M9N6FBFXI ","M9N6FBFYI ","M9N6FBFZI ","M9N6FBXI ","M9N6FBYI ","M9N6FBZI ","M9N6FDXI ", & + "M9N6FDYI ","M9N6FDZI ","M9N6FIXI ","M9N6FIYI ","M9N6FIZI ","M9N6FMGXI ","M9N6FMGYI ", & + "M9N6FMGZI ","M9N6MAFXI ","M9N6MAFYI ","M9N6MAFZI ","M9N6MAGXI ","M9N6MAGYI ","M9N6MAGZI ", & + "M9N6MBFXI ","M9N6MBFYI ","M9N6MBFZI ","M9N6MBXI ","M9N6MBYI ","M9N6MBZI ","M9N6MMGXI ", & + "M9N6MMGYI ","M9N6MMGZI ","M9N6STAXI ","M9N6STAYI ","M9N6STAZI ","M9N6STVXI ","M9N6STVYI ", & + "M9N6STVZI ","M9N6VXI ","M9N6VYI ","M9N6VZI ","M9N7AXI ","M9N7AYI ","M9N7AZI "/) + ValidParamAry(4474:4626) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M9N7DYNP ","M9N7FAFXI ","M9N7FAFYI ","M9N7FAFZI ","M9N7FAGXI ","M9N7FAGYI ","M9N7FAGZI ", & + "M9N7FAMXI ","M9N7FAMYI ","M9N7FAMZI ","M9N7FBFXI ","M9N7FBFYI ","M9N7FBFZI ","M9N7FBXI ", & + "M9N7FBYI ","M9N7FBZI ","M9N7FDXI ","M9N7FDYI ","M9N7FDZI ","M9N7FIXI ","M9N7FIYI ", & + "M9N7FIZI ","M9N7FMGXI ","M9N7FMGYI ","M9N7FMGZI ","M9N7MAFXI ","M9N7MAFYI ","M9N7MAFZI ", & + "M9N7MAGXI ","M9N7MAGYI ","M9N7MAGZI ","M9N7MBFXI ","M9N7MBFYI ","M9N7MBFZI ","M9N7MBXI ", & + "M9N7MBYI ","M9N7MBZI ","M9N7MMGXI ","M9N7MMGYI ","M9N7MMGZI ","M9N7STAXI ","M9N7STAYI ", & + "M9N7STAZI ","M9N7STVXI ","M9N7STVYI ","M9N7STVZI ","M9N7VXI ","M9N7VYI ","M9N7VZI ", & + "M9N8AXI ","M9N8AYI ","M9N8AZI ","M9N8DYNP ","M9N8FAFXI ","M9N8FAFYI ","M9N8FAFZI ", & + "M9N8FAGXI ","M9N8FAGYI ","M9N8FAGZI ","M9N8FAMXI ","M9N8FAMYI ","M9N8FAMZI ","M9N8FBFXI ", & + "M9N8FBFYI ","M9N8FBFZI ","M9N8FBXI ","M9N8FBYI ","M9N8FBZI ","M9N8FDXI ","M9N8FDYI ", & + "M9N8FDZI ","M9N8FIXI ","M9N8FIYI ","M9N8FIZI ","M9N8FMGXI ","M9N8FMGYI ","M9N8FMGZI ", & + "M9N8MAFXI ","M9N8MAFYI ","M9N8MAFZI ","M9N8MAGXI ","M9N8MAGYI ","M9N8MAGZI ","M9N8MBFXI ", & + "M9N8MBFYI ","M9N8MBFZI ","M9N8MBXI ","M9N8MBYI ","M9N8MBZI ","M9N8MMGXI ","M9N8MMGYI ", & + "M9N8MMGZI ","M9N8STAXI ","M9N8STAYI ","M9N8STAZI ","M9N8STVXI ","M9N8STVYI ","M9N8STVZI ", & + "M9N8VXI ","M9N8VYI ","M9N8VZI ","M9N9AXI ","M9N9AYI ","M9N9AZI ","M9N9DYNP ", & + "M9N9FAFXI ","M9N9FAFYI ","M9N9FAFZI ","M9N9FAGXI ","M9N9FAGYI ","M9N9FAGZI ","M9N9FAMXI ", & + "M9N9FAMYI ","M9N9FAMZI ","M9N9FBFXI ","M9N9FBFYI ","M9N9FBFZI ","M9N9FBXI ","M9N9FBYI ", & + "M9N9FBZI ","M9N9FDXI ","M9N9FDYI ","M9N9FDZI ","M9N9FIXI ","M9N9FIYI ","M9N9FIZI ", & + "M9N9FMGXI ","M9N9FMGYI ","M9N9FMGZI ","M9N9MAFXI ","M9N9MAFYI ","M9N9MAFZI ","M9N9MAGXI ", & + "M9N9MAGYI ","M9N9MAGZI ","M9N9MBFXI ","M9N9MBFYI ","M9N9MBFZI ","M9N9MBXI ","M9N9MBYI ", & + "M9N9MBZI ","M9N9MMGXI ","M9N9MMGYI ","M9N9MMGZI ","M9N9STAXI ","M9N9STAYI ","M9N9STAZI ", & + "M9N9STVXI ","M9N9STVYI ","M9N9STVZI ","M9N9VXI ","M9N9VYI ","M9N9VZI "/) + ParamIndxAry(1:497) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + J1Axi , J1Ayi , J1Azi , J1DynP , J1FAGxi , J1FAGyi , J1FAGzi , & + J1FAMxi , J1FAMyi , J1FAMzi , J1FBFxi , J1FBFyi , J1FBFzi , J1FBxi , & + J1FByi , J1FBzi , J1FDxi , J1FDyi , J1FDzi , J1FIxi , J1FIyi , & + J1FIzi , J1FMGxi , J1FMGyi , J1FMGzi , J1MAGxi , J1MAGyi , J1MAGzi , & + J1MBFxi , J1MBFyi , J1MBFzi , J1MBxi , J1MByi , J1MBzi , J1STAxi , & + J1STAyi , J1STAzi , J1STVxi , J1STVyi , J1STVzi , J1Vxi , J1Vyi , & + J1Vzi , J1WaveElev , J1WaveElv1 , J1WaveElv2 , J2Axi , J2Ayi , J2Azi , & + J2DynP , J2FAGxi , J2FAGyi , J2FAGzi , J2FAMxi , J2FAMyi , J2FAMzi , & + J2FBFxi , J2FBFyi , J2FBFzi , J2FBxi , J2FByi , J2FBzi , J2FDxi , & + J2FDyi , J2FDzi , J2FIxi , J2FIyi , J2FIzi , J2FMGxi , J2FMGyi , & + J2FMGzi , J2MAGxi , J2MAGyi , J2MAGzi , J2MBFxi , J2MBFyi , J2MBFzi , & + J2MBxi , J2MByi , J2MBzi , J2STAxi , J2STAyi , J2STAzi , J2STVxi , & + J2STVyi , J2STVzi , J2Vxi , J2Vyi , J2Vzi , J2WaveElev , J2WaveElv1 , & + J2WaveElv2 , J3Axi , J3Ayi , J3Azi , J3DynP , J3FAGxi , J3FAGyi , & + J3FAGzi , J3FAMxi , J3FAMyi , J3FAMzi , J3FBFxi , J3FBFyi , J3FBFzi , & + J3FBxi , J3FByi , J3FBzi , J3FDxi , J3FDyi , J3FDzi , J3FIxi , & + J3FIyi , J3FIzi , J3FMGxi , J3FMGyi , J3FMGzi , J3MAGxi , J3MAGyi , & + J3MAGzi , J3MBFxi , J3MBFyi , J3MBFzi , J3MBxi , J3MByi , J3MBzi , & + J3STAxi , J3STAyi , J3STAzi , J3STVxi , J3STVyi , J3STVzi , J3Vxi , & + J3Vyi , J3Vzi , J3WaveElev , J3WaveElv1 , J3WaveElv2 , J4Axi , J4Ayi , & + J4Azi , J4DynP , J4FAGxi , J4FAGyi , J4FAGzi , J4FAMxi , J4FAMyi , & + J4FAMzi , J4FBFxi , J4FBFyi , J4FBFzi , J4FBxi , J4FByi , J4FBzi , & + J4FDxi , J4FDyi , J4FDzi , J4FIxi , J4FIyi , J4FIzi , J4FMGxi , & + J4FMGyi , J4FMGzi , J4MAGxi , J4MAGyi , J4MAGzi , J4MBFxi , J4MBFyi , & + J4MBFzi , J4MBxi , J4MByi , J4MBzi , J4STAxi , J4STAyi , J4STAzi , & + J4STVxi , J4STVyi , J4STVzi , J4Vxi , J4Vyi , J4Vzi , J4WaveElev , & + J4WaveElv1 , J4WaveElv2 , J5Axi , J5Ayi , J5Azi , J5DynP , J5FAGxi , & + J5FAGyi , J5FAGzi , J5FAMxi , J5FAMyi , J5FAMzi , J5FBFxi , J5FBFyi , & + J5FBFzi , J5FBxi , J5FByi , J5FBzi , J5FDxi , J5FDyi , J5FDzi , & + J5FIxi , J5FIyi , J5FIzi , J5FMGxi , J5FMGyi , J5FMGzi , J5MAGxi , & + J5MAGyi , J5MAGzi , J5MBFxi , J5MBFyi , J5MBFzi , J5MBxi , J5MByi , & + J5MBzi , J5STAxi , J5STAyi , J5STAzi , J5STVxi , J5STVyi , J5STVzi , & + J5Vxi , J5Vyi , J5Vzi , J5WaveElev , J5WaveElv1 , J5WaveElv2 , J6Axi , & + J6Ayi , J6Azi , J6DynP , J6FAGxi , J6FAGyi , J6FAGzi , J6FAMxi , & + J6FAMyi , J6FAMzi , J6FBFxi , J6FBFyi , J6FBFzi , J6FBxi , J6FByi , & + J6FBzi , J6FDxi , J6FDyi , J6FDzi , J6FIxi , J6FIyi , J6FIzi , & + J6FMGxi , J6FMGyi , J6FMGzi , J6MAGxi , J6MAGyi , J6MAGzi , J6MBFxi , & + J6MBFyi , J6MBFzi , J6MBxi , J6MByi , J6MBzi , J6STAxi , J6STAyi , & + J6STAzi , J6STVxi , J6STVyi , J6STVzi , J6Vxi , J6Vyi , J6Vzi , & + J6WaveElev , J6WaveElv1 , J6WaveElv2 , J7Axi , J7Ayi , J7Azi , J7DynP , & + J7FAGxi , J7FAGyi , J7FAGzi , J7FAMxi , J7FAMyi , J7FAMzi , J7FBFxi , & + J7FBFyi , J7FBFzi , J7FBxi , J7FByi , J7FBzi , J7FDxi , J7FDyi , & + J7FDzi , J7FIxi , J7FIyi , J7FIzi , J7FMGxi , J7FMGyi , J7FMGzi , & + J7MAGxi , J7MAGyi , J7MAGzi , J7MBFxi , J7MBFyi , J7MBFzi , J7MBxi , & + J7MByi , J7MBzi , J7STAxi , J7STAyi , J7STAzi , J7STVxi , J7STVyi , & + J7STVzi , J7Vxi , J7Vyi , J7Vzi , J7WaveElev , J7WaveElv1 , J7WaveElv2 , & + J8Axi , J8Ayi , J8Azi , J8DynP , J8FAGxi , J8FAGyi , J8FAGzi , & + J8FAMxi , J8FAMyi , J8FAMzi , J8FBFxi , J8FBFyi , J8FBFzi , J8FBxi , & + J8FByi , J8FBzi , J8FDxi , J8FDyi , J8FDzi , J8FIxi , J8FIyi , & + J8FIzi , J8FMGxi , J8FMGyi , J8FMGzi , J8MAGxi , J8MAGyi , J8MAGzi , & + J8MBFxi , J8MBFyi , J8MBFzi , J8MBxi , J8MByi , J8MBzi , J8STAxi , & + J8STAyi , J8STAzi , J8STVxi , J8STVyi , J8STVzi , J8Vxi , J8Vyi , & + J8Vzi , J8WaveElev , J8WaveElv1 , J8WaveElv2 , J9Axi , J9Ayi , J9Azi , & + J9DynP , J9FAGxi , J9FAGyi , J9FAGzi , J9FAMxi , J9FAMyi , J9FAMzi , & + J9FBFxi , J9FBFyi , J9FBFzi , J9FBxi , J9FByi , J9FBzi , J9FDxi , & + J9FDyi , J9FDzi , J9FIxi , J9FIyi , J9FIzi , J9FMGxi , J9FMGyi , & + J9FMGzi , J9MAGxi , J9MAGyi , J9MAGzi , J9MBFxi , J9MBFyi , J9MBFzi , & + J9MBxi , J9MByi , J9MBzi , J9STAxi , J9STAyi , J9STAzi , J9STVxi , & + J9STVyi , J9STVzi , J9Vxi , J9Vyi , J9Vzi , J9WaveElev , J9WaveElv1 , & + J9WaveElv2 , M1N1Axi , M1N1Ayi , M1N1Azi , M1N1DynP , M1N1FAFxi , M1N1FAFyi , & + M1N1FAFzi , M1N1FAGxi , M1N1FAGyi , M1N1FAGzi , M1N1FAMxi , M1N1FAMyi , M1N1FAMzi , & + M1N1FBFxi , M1N1FBFyi , M1N1FBFzi , M1N1FBxi , M1N1FByi , M1N1FBzi , M1N1FDxi , & + M1N1FDyi , M1N1FDzi , M1N1FIxi , M1N1FIyi , M1N1FIzi , M1N1FMGxi , M1N1FMGyi , & + M1N1FMGzi , M1N1MAFxi , M1N1MAFyi , M1N1MAFzi , M1N1MAGxi , M1N1MAGyi , M1N1MAGzi , & + M1N1MBFxi , M1N1MBFyi , M1N1MBFzi , M1N1MBxi , M1N1MByi , M1N1MBzi , M1N1MMGxi , & + M1N1MMGyi , M1N1MMGzi , M1N1STAxi , M1N1STAyi , M1N1STAzi , M1N1STVxi , M1N1STVyi , & + M1N1STVzi , M1N1Vxi , M1N1Vyi , M1N1Vzi , M1N2Axi , M1N2Ayi , M1N2Azi , & + M1N2DynP , M1N2FAFxi , M1N2FAFyi , M1N2FAFzi , M1N2FAGxi , M1N2FAGyi , M1N2FAGzi , & + M1N2FAMxi , M1N2FAMyi , M1N2FAMzi , M1N2FBFxi , M1N2FBFyi , M1N2FBFzi , M1N2FBxi , & + M1N2FByi , M1N2FBzi , M1N2FDxi , M1N2FDyi , M1N2FDzi , M1N2FIxi , M1N2FIyi , & + M1N2FIzi , M1N2FMGxi , M1N2FMGyi , M1N2FMGzi , M1N2MAFxi , M1N2MAFyi , M1N2MAFzi /) + ParamIndxAry(498:994) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M1N2MAGxi , M1N2MAGyi , M1N2MAGzi , M1N2MBFxi , M1N2MBFyi , M1N2MBFzi , M1N2MBxi , & + M1N2MByi , M1N2MBzi , M1N2MMGxi , M1N2MMGyi , M1N2MMGzi , M1N2STAxi , M1N2STAyi , & + M1N2STAzi , M1N2STVxi , M1N2STVyi , M1N2STVzi , M1N2Vxi , M1N2Vyi , M1N2Vzi , & + M1N3Axi , M1N3Ayi , M1N3Azi , M1N3DynP , M1N3FAFxi , M1N3FAFyi , M1N3FAFzi , & + M1N3FAGxi , M1N3FAGyi , M1N3FAGzi , M1N3FAMxi , M1N3FAMyi , M1N3FAMzi , M1N3FBFxi , & + M1N3FBFyi , M1N3FBFzi , M1N3FBxi , M1N3FByi , M1N3FBzi , M1N3FDxi , M1N3FDyi , & + M1N3FDzi , M1N3FIxi , M1N3FIyi , M1N3FIzi , M1N3FMGxi , M1N3FMGyi , M1N3FMGzi , & + M1N3MAFxi , M1N3MAFyi , M1N3MAFzi , M1N3MAGxi , M1N3MAGyi , M1N3MAGzi , M1N3MBFxi , & + M1N3MBFyi , M1N3MBFzi , M1N3MBxi , M1N3MByi , M1N3MBzi , M1N3MMGxi , M1N3MMGyi , & + M1N3MMGzi , M1N3STAxi , M1N3STAyi , M1N3STAzi , M1N3STVxi , M1N3STVyi , M1N3STVzi , & + M1N3Vxi , M1N3Vyi , M1N3Vzi , M1N4Axi , M1N4Ayi , M1N4Azi , M1N4DynP , & + M1N4FAFxi , M1N4FAFyi , M1N4FAFzi , M1N4FAGxi , M1N4FAGyi , M1N4FAGzi , M1N4FAMxi , & + M1N4FAMyi , M1N4FAMzi , M1N4FBFxi , M1N4FBFyi , M1N4FBFzi , M1N4FBxi , M1N4FByi , & + M1N4FBzi , M1N4FDxi , M1N4FDyi , M1N4FDzi , M1N4FIxi , M1N4FIyi , M1N4FIzi , & + M1N4FMGxi , M1N4FMGyi , M1N4FMGzi , M1N4MAFxi , M1N4MAFyi , M1N4MAFzi , M1N4MAGxi , & + M1N4MAGyi , M1N4MAGzi , M1N4MBFxi , M1N4MBFyi , M1N4MBFzi , M1N4MBxi , M1N4MByi , & + M1N4MBzi , M1N4MMGxi , M1N4MMGyi , M1N4MMGzi , M1N4STAxi , M1N4STAyi , M1N4STAzi , & + M1N4STVxi , M1N4STVyi , M1N4STVzi , M1N4Vxi , M1N4Vyi , M1N4Vzi , M1N5Axi , & + M1N5Ayi , M1N5Azi , M1N5DynP , M1N5FAFxi , M1N5FAFyi , M1N5FAFzi , M1N5FAGxi , & + M1N5FAGyi , M1N5FAGzi , M1N5FAMxi , M1N5FAMyi , M1N5FAMzi , M1N5FBFxi , M1N5FBFyi , & + M1N5FBFzi , M1N5FBxi , M1N5FByi , M1N5FBzi , M1N5FDxi , M1N5FDyi , M1N5FDzi , & + M1N5FIxi , M1N5FIyi , M1N5FIzi , M1N5FMGxi , M1N5FMGyi , M1N5FMGzi , M1N5MAFxi , & + M1N5MAFyi , M1N5MAFzi , M1N5MAGxi , M1N5MAGyi , M1N5MAGzi , M1N5MBFxi , M1N5MBFyi , & + M1N5MBFzi , M1N5MBxi , M1N5MByi , M1N5MBzi , M1N5MMGxi , M1N5MMGyi , M1N5MMGzi , & + M1N5STAxi , M1N5STAyi , M1N5STAzi , M1N5STVxi , M1N5STVyi , M1N5STVzi , M1N5Vxi , & + M1N5Vyi , M1N5Vzi , M1N6Axi , M1N6Ayi , M1N6Azi , M1N6DynP , M1N6FAFxi , & + M1N6FAFyi , M1N6FAFzi , M1N6FAGxi , M1N6FAGyi , M1N6FAGzi , M1N6FAMxi , M1N6FAMyi , & + M1N6FAMzi , M1N6FBFxi , M1N6FBFyi , M1N6FBFzi , M1N6FBxi , M1N6FByi , M1N6FBzi , & + M1N6FDxi , M1N6FDyi , M1N6FDzi , M1N6FIxi , M1N6FIyi , M1N6FIzi , M1N6FMGxi , & + M1N6FMGyi , M1N6FMGzi , M1N6MAFxi , M1N6MAFyi , M1N6MAFzi , M1N6MAGxi , M1N6MAGyi , & + M1N6MAGzi , M1N6MBFxi , M1N6MBFyi , M1N6MBFzi , M1N6MBxi , M1N6MByi , M1N6MBzi , & + M1N6MMGxi , M1N6MMGyi , M1N6MMGzi , M1N6STAxi , M1N6STAyi , M1N6STAzi , M1N6STVxi , & + M1N6STVyi , M1N6STVzi , M1N6Vxi , M1N6Vyi , M1N6Vzi , M1N7Axi , M1N7Ayi , & + M1N7Azi , M1N7DynP , M1N7FAFxi , M1N7FAFyi , M1N7FAFzi , M1N7FAGxi , M1N7FAGyi , & + M1N7FAGzi , M1N7FAMxi , M1N7FAMyi , M1N7FAMzi , M1N7FBFxi , M1N7FBFyi , M1N7FBFzi , & + M1N7FBxi , M1N7FByi , M1N7FBzi , M1N7FDxi , M1N7FDyi , M1N7FDzi , M1N7FIxi , & + M1N7FIyi , M1N7FIzi , M1N7FMGxi , M1N7FMGyi , M1N7FMGzi , M1N7MAFxi , M1N7MAFyi , & + M1N7MAFzi , M1N7MAGxi , M1N7MAGyi , M1N7MAGzi , M1N7MBFxi , M1N7MBFyi , M1N7MBFzi , & + M1N7MBxi , M1N7MByi , M1N7MBzi , M1N7MMGxi , M1N7MMGyi , M1N7MMGzi , M1N7STAxi , & + M1N7STAyi , M1N7STAzi , M1N7STVxi , M1N7STVyi , M1N7STVzi , M1N7Vxi , M1N7Vyi , & + M1N7Vzi , M1N8Axi , M1N8Ayi , M1N8Azi , M1N8DynP , M1N8FAFxi , M1N8FAFyi , & + M1N8FAFzi , M1N8FAGxi , M1N8FAGyi , M1N8FAGzi , M1N8FAMxi , M1N8FAMyi , M1N8FAMzi , & + M1N8FBFxi , M1N8FBFyi , M1N8FBFzi , M1N8FBxi , M1N8FByi , M1N8FBzi , M1N8FDxi , & + M1N8FDyi , M1N8FDzi , M1N8FIxi , M1N8FIyi , M1N8FIzi , M1N8FMGxi , M1N8FMGyi , & + M1N8FMGzi , M1N8MAFxi , M1N8MAFyi , M1N8MAFzi , M1N8MAGxi , M1N8MAGyi , M1N8MAGzi , & + M1N8MBFxi , M1N8MBFyi , M1N8MBFzi , M1N8MBxi , M1N8MByi , M1N8MBzi , M1N8MMGxi , & + M1N8MMGyi , M1N8MMGzi , M1N8STAxi , M1N8STAyi , M1N8STAzi , M1N8STVxi , M1N8STVyi , & + M1N8STVzi , M1N8Vxi , M1N8Vyi , M1N8Vzi , M1N9Axi , M1N9Ayi , M1N9Azi , & + M1N9DynP , M1N9FAFxi , M1N9FAFyi , M1N9FAFzi , M1N9FAGxi , M1N9FAGyi , M1N9FAGzi , & + M1N9FAMxi , M1N9FAMyi , M1N9FAMzi , M1N9FBFxi , M1N9FBFyi , M1N9FBFzi , M1N9FBxi , & + M1N9FByi , M1N9FBzi , M1N9FDxi , M1N9FDyi , M1N9FDzi , M1N9FIxi , M1N9FIyi , & + M1N9FIzi , M1N9FMGxi , M1N9FMGyi , M1N9FMGzi , M1N9MAFxi , M1N9MAFyi , M1N9MAFzi , & + M1N9MAGxi , M1N9MAGyi , M1N9MAGzi , M1N9MBFxi , M1N9MBFyi , M1N9MBFzi , M1N9MBxi , & + M1N9MByi , M1N9MBzi , M1N9MMGxi , M1N9MMGyi , M1N9MMGzi , M1N9STAxi , M1N9STAyi , & + M1N9STAzi , M1N9STVxi , M1N9STVyi , M1N9STVzi , M1N9Vxi , M1N9Vyi , M1N9Vzi , & + M2N1Axi , M2N1Ayi , M2N1Azi , M2N1DynP , M2N1FAFxi , M2N1FAFyi , M2N1FAFzi , & + M2N1FAGxi , M2N1FAGyi , M2N1FAGzi , M2N1FAMxi , M2N1FAMyi , M2N1FAMzi , M2N1FBFxi , & + M2N1FBFyi , M2N1FBFzi , M2N1FBxi , M2N1FByi , M2N1FBzi , M2N1FDxi , M2N1FDyi , & + M2N1FDzi , M2N1FIxi , M2N1FIyi , M2N1FIzi , M2N1FMGxi , M2N1FMGyi , M2N1FMGzi , & + M2N1MAFxi , M2N1MAFyi , M2N1MAFzi , M2N1MAGxi , M2N1MAGyi , M2N1MAGzi , M2N1MBFxi , & + M2N1MBFyi , M2N1MBFzi , M2N1MBxi , M2N1MByi , M2N1MBzi , M2N1MMGxi , M2N1MMGyi , & + M2N1MMGzi , M2N1STAxi , M2N1STAyi , M2N1STAzi , M2N1STVxi , M2N1STVyi , M2N1STVzi , & + M2N1Vxi , M2N1Vyi , M2N1Vzi , M2N2Axi , M2N2Ayi , M2N2Azi , M2N2DynP , & + M2N2FAFxi , M2N2FAFyi , M2N2FAFzi , M2N2FAGxi , M2N2FAGyi , M2N2FAGzi , M2N2FAMxi , & + M2N2FAMyi , M2N2FAMzi , M2N2FBFxi , M2N2FBFyi , M2N2FBFzi , M2N2FBxi , M2N2FByi , & + M2N2FBzi , M2N2FDxi , M2N2FDyi , M2N2FDzi , M2N2FIxi , M2N2FIyi , M2N2FIzi , & + M2N2FMGxi , M2N2FMGyi , M2N2FMGzi , M2N2MAFxi , M2N2MAFyi , M2N2MAFzi , M2N2MAGxi , & + M2N2MAGyi , M2N2MAGzi , M2N2MBFxi , M2N2MBFyi , M2N2MBFzi , M2N2MBxi , M2N2MByi , & + M2N2MBzi , M2N2MMGxi , M2N2MMGyi , M2N2MMGzi , M2N2STAxi , M2N2STAyi , M2N2STAzi , & + M2N2STVxi , M2N2STVyi , M2N2STVzi , M2N2Vxi , M2N2Vyi , M2N2Vzi , M2N3Axi , & + M2N3Ayi , M2N3Azi , M2N3DynP , M2N3FAFxi , M2N3FAFyi , M2N3FAFzi , M2N3FAGxi /) + ParamIndxAry(995:1491) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M2N3FAGyi , M2N3FAGzi , M2N3FAMxi , M2N3FAMyi , M2N3FAMzi , M2N3FBFxi , M2N3FBFyi , & + M2N3FBFzi , M2N3FBxi , M2N3FByi , M2N3FBzi , M2N3FDxi , M2N3FDyi , M2N3FDzi , & + M2N3FIxi , M2N3FIyi , M2N3FIzi , M2N3FMGxi , M2N3FMGyi , M2N3FMGzi , M2N3MAFxi , & + M2N3MAFyi , M2N3MAFzi , M2N3MAGxi , M2N3MAGyi , M2N3MAGzi , M2N3MBFxi , M2N3MBFyi , & + M2N3MBFzi , M2N3MBxi , M2N3MByi , M2N3MBzi , M2N3MMGxi , M2N3MMGyi , M2N3MMGzi , & + M2N3STAxi , M2N3STAyi , M2N3STAzi , M2N3STVxi , M2N3STVyi , M2N3STVzi , M2N3Vxi , & + M2N3Vyi , M2N3Vzi , M2N4Axi , M2N4Ayi , M2N4Azi , M2N4DynP , M2N4FAFxi , & + M2N4FAFyi , M2N4FAFzi , M2N4FAGxi , M2N4FAGyi , M2N4FAGzi , M2N4FAMxi , M2N4FAMyi , & + M2N4FAMzi , M2N4FBFxi , M2N4FBFyi , M2N4FBFzi , M2N4FBxi , M2N4FByi , M2N4FBzi , & + M2N4FDxi , M2N4FDyi , M2N4FDzi , M2N4FIxi , M2N4FIyi , M2N4FIzi , M2N4FMGxi , & + M2N4FMGyi , M2N4FMGzi , M2N4MAFxi , M2N4MAFyi , M2N4MAFzi , M2N4MAGxi , M2N4MAGyi , & + M2N4MAGzi , M2N4MBFxi , M2N4MBFyi , M2N4MBFzi , M2N4MBxi , M2N4MByi , M2N4MBzi , & + M2N4MMGxi , M2N4MMGyi , M2N4MMGzi , M2N4STAxi , M2N4STAyi , M2N4STAzi , M2N4STVxi , & + M2N4STVyi , M2N4STVzi , M2N4Vxi , M2N4Vyi , M2N4Vzi , M2N5Axi , M2N5Ayi , & + M2N5Azi , M2N5DynP , M2N5FAFxi , M2N5FAFyi , M2N5FAFzi , M2N5FAGxi , M2N5FAGyi , & + M2N5FAGzi , M2N5FAMxi , M2N5FAMyi , M2N5FAMzi , M2N5FBFxi , M2N5FBFyi , M2N5FBFzi , & + M2N5FBxi , M2N5FByi , M2N5FBzi , M2N5FDxi , M2N5FDyi , M2N5FDzi , M2N5FIxi , & + M2N5FIyi , M2N5FIzi , M2N5FMGxi , M2N5FMGyi , M2N5FMGzi , M2N5MAFxi , M2N5MAFyi , & + M2N5MAFzi , M2N5MAGxi , M2N5MAGyi , M2N5MAGzi , M2N5MBFxi , M2N5MBFyi , M2N5MBFzi , & + M2N5MBxi , M2N5MByi , M2N5MBzi , M2N5MMGxi , M2N5MMGyi , M2N5MMGzi , M2N5STAxi , & + M2N5STAyi , M2N5STAzi , M2N5STVxi , M2N5STVyi , M2N5STVzi , M2N5Vxi , M2N5Vyi , & + M2N5Vzi , M2N6Axi , M2N6Ayi , M2N6Azi , M2N6DynP , M2N6FAFxi , M2N6FAFyi , & + M2N6FAFzi , M2N6FAGxi , M2N6FAGyi , M2N6FAGzi , M2N6FAMxi , M2N6FAMyi , M2N6FAMzi , & + M2N6FBFxi , M2N6FBFyi , M2N6FBFzi , M2N6FBxi , M2N6FByi , M2N6FBzi , M2N6FDxi , & + M2N6FDyi , M2N6FDzi , M2N6FIxi , M2N6FIyi , M2N6FIzi , M2N6FMGxi , M2N6FMGyi , & + M2N6FMGzi , M2N6MAFxi , M2N6MAFyi , M2N6MAFzi , M2N6MAGxi , M2N6MAGyi , M2N6MAGzi , & + M2N6MBFxi , M2N6MBFyi , M2N6MBFzi , M2N6MBxi , M2N6MByi , M2N6MBzi , M2N6MMGxi , & + M2N6MMGyi , M2N6MMGzi , M2N6STAxi , M2N6STAyi , M2N6STAzi , M2N6STVxi , M2N6STVyi , & + M2N6STVzi , M2N6Vxi , M2N6Vyi , M2N6Vzi , M2N7Axi , M2N7Ayi , M2N7Azi , & + M2N7DynP , M2N7FAFxi , M2N7FAFyi , M2N7FAFzi , M2N7FAGxi , M2N7FAGyi , M2N7FAGzi , & + M2N7FAMxi , M2N7FAMyi , M2N7FAMzi , M2N7FBFxi , M2N7FBFyi , M2N7FBFzi , M2N7FBxi , & + M2N7FByi , M2N7FBzi , M2N7FDxi , M2N7FDyi , M2N7FDzi , M2N7FIxi , M2N7FIyi , & + M2N7FIzi , M2N7FMGxi , M2N7FMGyi , M2N7FMGzi , M2N7MAFxi , M2N7MAFyi , M2N7MAFzi , & + M2N7MAGxi , M2N7MAGyi , M2N7MAGzi , M2N7MBFxi , M2N7MBFyi , M2N7MBFzi , M2N7MBxi , & + M2N7MByi , M2N7MBzi , M2N7MMGxi , M2N7MMGyi , M2N7MMGzi , M2N7STAxi , M2N7STAyi , & + M2N7STAzi , M2N7STVxi , M2N7STVyi , M2N7STVzi , M2N7Vxi , M2N7Vyi , M2N7Vzi , & + M2N8Axi , M2N8Ayi , M2N8Azi , M2N8DynP , M2N8FAFxi , M2N8FAFyi , M2N8FAFzi , & + M2N8FAGxi , M2N8FAGyi , M2N8FAGzi , M2N8FAMxi , M2N8FAMyi , M2N8FAMzi , M2N8FBFxi , & + M2N8FBFyi , M2N8FBFzi , M2N8FBxi , M2N8FByi , M2N8FBzi , M2N8FDxi , M2N8FDyi , & + M2N8FDzi , M2N8FIxi , M2N8FIyi , M2N8FIzi , M2N8FMGxi , M2N8FMGyi , M2N8FMGzi , & + M2N8MAFxi , M2N8MAFyi , M2N8MAFzi , M2N8MAGxi , M2N8MAGyi , M2N8MAGzi , M2N8MBFxi , & + M2N8MBFyi , M2N8MBFzi , M2N8MBxi , M2N8MByi , M2N8MBzi , M2N8MMGxi , M2N8MMGyi , & + M2N8MMGzi , M2N8STAxi , M2N8STAyi , M2N8STAzi , M2N8STVxi , M2N8STVyi , M2N8STVzi , & + M2N8Vxi , M2N8Vyi , M2N8Vzi , M2N9Axi , M2N9Ayi , M2N9Azi , M2N9DynP , & + M2N9FAFxi , M2N9FAFyi , M2N9FAFzi , M2N9FAGxi , M2N9FAGyi , M2N9FAGzi , M2N9FAMxi , & + M2N9FAMyi , M2N9FAMzi , M2N9FBFxi , M2N9FBFyi , M2N9FBFzi , M2N9FBxi , M2N9FByi , & + M2N9FBzi , M2N9FDxi , M2N9FDyi , M2N9FDzi , M2N9FIxi , M2N9FIyi , M2N9FIzi , & + M2N9FMGxi , M2N9FMGyi , M2N9FMGzi , M2N9MAFxi , M2N9MAFyi , M2N9MAFzi , M2N9MAGxi , & + M2N9MAGyi , M2N9MAGzi , M2N9MBFxi , M2N9MBFyi , M2N9MBFzi , M2N9MBxi , M2N9MByi , & + M2N9MBzi , M2N9MMGxi , M2N9MMGyi , M2N9MMGzi , M2N9STAxi , M2N9STAyi , M2N9STAzi , & + M2N9STVxi , M2N9STVyi , M2N9STVzi , M2N9Vxi , M2N9Vyi , M2N9Vzi , M3N1Axi , & + M3N1Ayi , M3N1Azi , M3N1DynP , M3N1FAFxi , M3N1FAFyi , M3N1FAFzi , M3N1FAGxi , & + M3N1FAGyi , M3N1FAGzi , M3N1FAMxi , M3N1FAMyi , M3N1FAMzi , M3N1FBFxi , M3N1FBFyi , & + M3N1FBFzi , M3N1FBxi , M3N1FByi , M3N1FBzi , M3N1FDxi , M3N1FDyi , M3N1FDzi , & + M3N1FIxi , M3N1FIyi , M3N1FIzi , M3N1FMGxi , M3N1FMGyi , M3N1FMGzi , M3N1MAFxi , & + M3N1MAFyi , M3N1MAFzi , M3N1MAGxi , M3N1MAGyi , M3N1MAGzi , M3N1MBFxi , M3N1MBFyi , & + M3N1MBFzi , M3N1MBxi , M3N1MByi , M3N1MBzi , M3N1MMGxi , M3N1MMGyi , M3N1MMGzi , & + M3N1STAxi , M3N1STAyi , M3N1STAzi , M3N1STVxi , M3N1STVyi , M3N1STVzi , M3N1Vxi , & + M3N1Vyi , M3N1Vzi , M3N2Axi , M3N2Ayi , M3N2Azi , M3N2DynP , M3N2FAFxi , & + M3N2FAFyi , M3N2FAFzi , M3N2FAGxi , M3N2FAGyi , M3N2FAGzi , M3N2FAMxi , M3N2FAMyi , & + M3N2FAMzi , M3N2FBFxi , M3N2FBFyi , M3N2FBFzi , M3N2FBxi , M3N2FByi , M3N2FBzi , & + M3N2FDxi , M3N2FDyi , M3N2FDzi , M3N2FIxi , M3N2FIyi , M3N2FIzi , M3N2FMGxi , & + M3N2FMGyi , M3N2FMGzi , M3N2MAFxi , M3N2MAFyi , M3N2MAFzi , M3N2MAGxi , M3N2MAGyi , & + M3N2MAGzi , M3N2MBFxi , M3N2MBFyi , M3N2MBFzi , M3N2MBxi , M3N2MByi , M3N2MBzi , & + M3N2MMGxi , M3N2MMGyi , M3N2MMGzi , M3N2STAxi , M3N2STAyi , M3N2STAzi , M3N2STVxi , & + M3N2STVyi , M3N2STVzi , M3N2Vxi , M3N2Vyi , M3N2Vzi , M3N3Axi , M3N3Ayi , & + M3N3Azi , M3N3DynP , M3N3FAFxi , M3N3FAFyi , M3N3FAFzi , M3N3FAGxi , M3N3FAGyi , & + M3N3FAGzi , M3N3FAMxi , M3N3FAMyi , M3N3FAMzi , M3N3FBFxi , M3N3FBFyi , M3N3FBFzi , & + M3N3FBxi , M3N3FByi , M3N3FBzi , M3N3FDxi , M3N3FDyi , M3N3FDzi , M3N3FIxi , & + M3N3FIyi , M3N3FIzi , M3N3FMGxi , M3N3FMGyi , M3N3FMGzi , M3N3MAFxi , M3N3MAFyi , & + M3N3MAFzi , M3N3MAGxi , M3N3MAGyi , M3N3MAGzi , M3N3MBFxi , M3N3MBFyi , M3N3MBFzi /) + ParamIndxAry(1492:1988) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M3N3MBxi , M3N3MByi , M3N3MBzi , M3N3MMGxi , M3N3MMGyi , M3N3MMGzi , M3N3STAxi , & + M3N3STAyi , M3N3STAzi , M3N3STVxi , M3N3STVyi , M3N3STVzi , M3N3Vxi , M3N3Vyi , & + M3N3Vzi , M3N4Axi , M3N4Ayi , M3N4Azi , M3N4DynP , M3N4FAFxi , M3N4FAFyi , & + M3N4FAFzi , M3N4FAGxi , M3N4FAGyi , M3N4FAGzi , M3N4FAMxi , M3N4FAMyi , M3N4FAMzi , & + M3N4FBFxi , M3N4FBFyi , M3N4FBFzi , M3N4FBxi , M3N4FByi , M3N4FBzi , M3N4FDxi , & + M3N4FDyi , M3N4FDzi , M3N4FIxi , M3N4FIyi , M3N4FIzi , M3N4FMGxi , M3N4FMGyi , & + M3N4FMGzi , M3N4MAFxi , M3N4MAFyi , M3N4MAFzi , M3N4MAGxi , M3N4MAGyi , M3N4MAGzi , & + M3N4MBFxi , M3N4MBFyi , M3N4MBFzi , M3N4MBxi , M3N4MByi , M3N4MBzi , M3N4MMGxi , & + M3N4MMGyi , M3N4MMGzi , M3N4STAxi , M3N4STAyi , M3N4STAzi , M3N4STVxi , M3N4STVyi , & + M3N4STVzi , M3N4Vxi , M3N4Vyi , M3N4Vzi , M3N5Axi , M3N5Ayi , M3N5Azi , & + M3N5DynP , M3N5FAFxi , M3N5FAFyi , M3N5FAFzi , M3N5FAGxi , M3N5FAGyi , M3N5FAGzi , & + M3N5FAMxi , M3N5FAMyi , M3N5FAMzi , M3N5FBFxi , M3N5FBFyi , M3N5FBFzi , M3N5FBxi , & + M3N5FByi , M3N5FBzi , M3N5FDxi , M3N5FDyi , M3N5FDzi , M3N5FIxi , M3N5FIyi , & + M3N5FIzi , M3N5FMGxi , M3N5FMGyi , M3N5FMGzi , M3N5MAFxi , M3N5MAFyi , M3N5MAFzi , & + M3N5MAGxi , M3N5MAGyi , M3N5MAGzi , M3N5MBFxi , M3N5MBFyi , M3N5MBFzi , M3N5MBxi , & + M3N5MByi , M3N5MBzi , M3N5MMGxi , M3N5MMGyi , M3N5MMGzi , M3N5STAxi , M3N5STAyi , & + M3N5STAzi , M3N5STVxi , M3N5STVyi , M3N5STVzi , M3N5Vxi , M3N5Vyi , M3N5Vzi , & + M3N6Axi , M3N6Ayi , M3N6Azi , M3N6DynP , M3N6FAFxi , M3N6FAFyi , M3N6FAFzi , & + M3N6FAGxi , M3N6FAGyi , M3N6FAGzi , M3N6FAMxi , M3N6FAMyi , M3N6FAMzi , M3N6FBFxi , & + M3N6FBFyi , M3N6FBFzi , M3N6FBxi , M3N6FByi , M3N6FBzi , M3N6FDxi , M3N6FDyi , & + M3N6FDzi , M3N6FIxi , M3N6FIyi , M3N6FIzi , M3N6FMGxi , M3N6FMGyi , M3N6FMGzi , & + M3N6MAFxi , M3N6MAFyi , M3N6MAFzi , M3N6MAGxi , M3N6MAGyi , M3N6MAGzi , M3N6MBFxi , & + M3N6MBFyi , M3N6MBFzi , M3N6MBxi , M3N6MByi , M3N6MBzi , M3N6MMGxi , M3N6MMGyi , & + M3N6MMGzi , M3N6STAxi , M3N6STAyi , M3N6STAzi , M3N6STVxi , M3N6STVyi , M3N6STVzi , & + M3N6Vxi , M3N6Vyi , M3N6Vzi , M3N7Axi , M3N7Ayi , M3N7Azi , M3N7DynP , & + M3N7FAFxi , M3N7FAFyi , M3N7FAFzi , M3N7FAGxi , M3N7FAGyi , M3N7FAGzi , M3N7FAMxi , & + M3N7FAMyi , M3N7FAMzi , M3N7FBFxi , M3N7FBFyi , M3N7FBFzi , M3N7FBxi , M3N7FByi , & + M3N7FBzi , M3N7FDxi , M3N7FDyi , M3N7FDzi , M3N7FIxi , M3N7FIyi , M3N7FIzi , & + M3N7FMGxi , M3N7FMGyi , M3N7FMGzi , M3N7MAFxi , M3N7MAFyi , M3N7MAFzi , M3N7MAGxi , & + M3N7MAGyi , M3N7MAGzi , M3N7MBFxi , M3N7MBFyi , M3N7MBFzi , M3N7MBxi , M3N7MByi , & + M3N7MBzi , M3N7MMGxi , M3N7MMGyi , M3N7MMGzi , M3N7STAxi , M3N7STAyi , M3N7STAzi , & + M3N7STVxi , M3N7STVyi , M3N7STVzi , M3N7Vxi , M3N7Vyi , M3N7Vzi , M3N8Axi , & + M3N8Ayi , M3N8Azi , M3N8DynP , M3N8FAFxi , M3N8FAFyi , M3N8FAFzi , M3N8FAGxi , & + M3N8FAGyi , M3N8FAGzi , M3N8FAMxi , M3N8FAMyi , M3N8FAMzi , M3N8FBFxi , M3N8FBFyi , & + M3N8FBFzi , M3N8FBxi , M3N8FByi , M3N8FBzi , M3N8FDxi , M3N8FDyi , M3N8FDzi , & + M3N8FIxi , M3N8FIyi , M3N8FIzi , M3N8FMGxi , M3N8FMGyi , M3N8FMGzi , M3N8MAFxi , & + M3N8MAFyi , M3N8MAFzi , M3N8MAGxi , M3N8MAGyi , M3N8MAGzi , M3N8MBFxi , M3N8MBFyi , & + M3N8MBFzi , M3N8MBxi , M3N8MByi , M3N8MBzi , M3N8MMGxi , M3N8MMGyi , M3N8MMGzi , & + M3N8STAxi , M3N8STAyi , M3N8STAzi , M3N8STVxi , M3N8STVyi , M3N8STVzi , M3N8Vxi , & + M3N8Vyi , M3N8Vzi , M3N9Axi , M3N9Ayi , M3N9Azi , M3N9DynP , M3N9FAFxi , & + M3N9FAFyi , M3N9FAFzi , M3N9FAGxi , M3N9FAGyi , M3N9FAGzi , M3N9FAMxi , M3N9FAMyi , & + M3N9FAMzi , M3N9FBFxi , M3N9FBFyi , M3N9FBFzi , M3N9FBxi , M3N9FByi , M3N9FBzi , & + M3N9FDxi , M3N9FDyi , M3N9FDzi , M3N9FIxi , M3N9FIyi , M3N9FIzi , M3N9FMGxi , & + M3N9FMGyi , M3N9FMGzi , M3N9MAFxi , M3N9MAFyi , M3N9MAFzi , M3N9MAGxi , M3N9MAGyi , & + M3N9MAGzi , M3N9MBFxi , M3N9MBFyi , M3N9MBFzi , M3N9MBxi , M3N9MByi , M3N9MBzi , & + M3N9MMGxi , M3N9MMGyi , M3N9MMGzi , M3N9STAxi , M3N9STAyi , M3N9STAzi , M3N9STVxi , & + M3N9STVyi , M3N9STVzi , M3N9Vxi , M3N9Vyi , M3N9Vzi , M4N1Axi , M4N1Ayi , & + M4N1Azi , M4N1DynP , M4N1FAFxi , M4N1FAFyi , M4N1FAFzi , M4N1FAGxi , M4N1FAGyi , & + M4N1FAGzi , M4N1FAMxi , M4N1FAMyi , M4N1FAMzi , M4N1FBFxi , M4N1FBFyi , M4N1FBFzi , & + M4N1FBxi , M4N1FByi , M4N1FBzi , M4N1FDxi , M4N1FDyi , M4N1FDzi , M4N1FIxi , & + M4N1FIyi , M4N1FIzi , M4N1FMGxi , M4N1FMGyi , M4N1FMGzi , M4N1MAFxi , M4N1MAFyi , & + M4N1MAFzi , M4N1MAGxi , M4N1MAGyi , M4N1MAGzi , M4N1MBFxi , M4N1MBFyi , M4N1MBFzi , & + M4N1MBxi , M4N1MByi , M4N1MBzi , M4N1MMGxi , M4N1MMGyi , M4N1MMGzi , M4N1STAxi , & + M4N1STAyi , M4N1STAzi , M4N1STVxi , M4N1STVyi , M4N1STVzi , M4N1Vxi , M4N1Vyi , & + M4N1Vzi , M4N2Axi , M4N2Ayi , M4N2Azi , M4N2DynP , M4N2FAFxi , M4N2FAFyi , & + M4N2FAFzi , M4N2FAGxi , M4N2FAGyi , M4N2FAGzi , M4N2FAMxi , M4N2FAMyi , M4N2FAMzi , & + M4N2FBFxi , M4N2FBFyi , M4N2FBFzi , M4N2FBxi , M4N2FByi , M4N2FBzi , M4N2FDxi , & + M4N2FDyi , M4N2FDzi , M4N2FIxi , M4N2FIyi , M4N2FIzi , M4N2FMGxi , M4N2FMGyi , & + M4N2FMGzi , M4N2MAFxi , M4N2MAFyi , M4N2MAFzi , M4N2MAGxi , M4N2MAGyi , M4N2MAGzi , & + M4N2MBFxi , M4N2MBFyi , M4N2MBFzi , M4N2MBxi , M4N2MByi , M4N2MBzi , M4N2MMGxi , & + M4N2MMGyi , M4N2MMGzi , M4N2STAxi , M4N2STAyi , M4N2STAzi , M4N2STVxi , M4N2STVyi , & + M4N2STVzi , M4N2Vxi , M4N2Vyi , M4N2Vzi , M4N3Axi , M4N3Ayi , M4N3Azi , & + M4N3DynP , M4N3FAFxi , M4N3FAFyi , M4N3FAFzi , M4N3FAGxi , M4N3FAGyi , M4N3FAGzi , & + M4N3FAMxi , M4N3FAMyi , M4N3FAMzi , M4N3FBFxi , M4N3FBFyi , M4N3FBFzi , M4N3FBxi , & + M4N3FByi , M4N3FBzi , M4N3FDxi , M4N3FDyi , M4N3FDzi , M4N3FIxi , M4N3FIyi , & + M4N3FIzi , M4N3FMGxi , M4N3FMGyi , M4N3FMGzi , M4N3MAFxi , M4N3MAFyi , M4N3MAFzi , & + M4N3MAGxi , M4N3MAGyi , M4N3MAGzi , M4N3MBFxi , M4N3MBFyi , M4N3MBFzi , M4N3MBxi , & + M4N3MByi , M4N3MBzi , M4N3MMGxi , M4N3MMGyi , M4N3MMGzi , M4N3STAxi , M4N3STAyi , & + M4N3STAzi , M4N3STVxi , M4N3STVyi , M4N3STVzi , M4N3Vxi , M4N3Vyi , M4N3Vzi , & + M4N4Axi , M4N4Ayi , M4N4Azi , M4N4DynP , M4N4FAFxi , M4N4FAFyi , M4N4FAFzi , & + M4N4FAGxi , M4N4FAGyi , M4N4FAGzi , M4N4FAMxi , M4N4FAMyi , M4N4FAMzi , M4N4FBFxi /) + ParamIndxAry(1989:2485) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M4N4FBFyi , M4N4FBFzi , M4N4FBxi , M4N4FByi , M4N4FBzi , M4N4FDxi , M4N4FDyi , & + M4N4FDzi , M4N4FIxi , M4N4FIyi , M4N4FIzi , M4N4FMGxi , M4N4FMGyi , M4N4FMGzi , & + M4N4MAFxi , M4N4MAFyi , M4N4MAFzi , M4N4MAGxi , M4N4MAGyi , M4N4MAGzi , M4N4MBFxi , & + M4N4MBFyi , M4N4MBFzi , M4N4MBxi , M4N4MByi , M4N4MBzi , M4N4MMGxi , M4N4MMGyi , & + M4N4MMGzi , M4N4STAxi , M4N4STAyi , M4N4STAzi , M4N4STVxi , M4N4STVyi , M4N4STVzi , & + M4N4Vxi , M4N4Vyi , M4N4Vzi , M4N5Axi , M4N5Ayi , M4N5Azi , M4N5DynP , & + M4N5FAFxi , M4N5FAFyi , M4N5FAFzi , M4N5FAGxi , M4N5FAGyi , M4N5FAGzi , M4N5FAMxi , & + M4N5FAMyi , M4N5FAMzi , M4N5FBFxi , M4N5FBFyi , M4N5FBFzi , M4N5FBxi , M4N5FByi , & + M4N5FBzi , M4N5FDxi , M4N5FDyi , M4N5FDzi , M4N5FIxi , M4N5FIyi , M4N5FIzi , & + M4N5FMGxi , M4N5FMGyi , M4N5FMGzi , M4N5MAFxi , M4N5MAFyi , M4N5MAFzi , M4N5MAGxi , & + M4N5MAGyi , M4N5MAGzi , M4N5MBFxi , M4N5MBFyi , M4N5MBFzi , M4N5MBxi , M4N5MByi , & + M4N5MBzi , M4N5MMGxi , M4N5MMGyi , M4N5MMGzi , M4N5STAxi , M4N5STAyi , M4N5STAzi , & + M4N5STVxi , M4N5STVyi , M4N5STVzi , M4N5Vxi , M4N5Vyi , M4N5Vzi , M4N6Axi , & + M4N6Ayi , M4N6Azi , M4N6DynP , M4N6FAFxi , M4N6FAFyi , M4N6FAFzi , M4N6FAGxi , & + M4N6FAGyi , M4N6FAGzi , M4N6FAMxi , M4N6FAMyi , M4N6FAMzi , M4N6FBFxi , M4N6FBFyi , & + M4N6FBFzi , M4N6FBxi , M4N6FByi , M4N6FBzi , M4N6FDxi , M4N6FDyi , M4N6FDzi , & + M4N6FIxi , M4N6FIyi , M4N6FIzi , M4N6FMGxi , M4N6FMGyi , M4N6FMGzi , M4N6MAFxi , & + M4N6MAFyi , M4N6MAFzi , M4N6MAGxi , M4N6MAGyi , M4N6MAGzi , M4N6MBFxi , M4N6MBFyi , & + M4N6MBFzi , M4N6MBxi , M4N6MByi , M4N6MBzi , M4N6MMGxi , M4N6MMGyi , M4N6MMGzi , & + M4N6STAxi , M4N6STAyi , M4N6STAzi , M4N6STVxi , M4N6STVyi , M4N6STVzi , M4N6Vxi , & + M4N6Vyi , M4N6Vzi , M4N7Axi , M4N7Ayi , M4N7Azi , M4N7DynP , M4N7FAFxi , & + M4N7FAFyi , M4N7FAFzi , M4N7FAGxi , M4N7FAGyi , M4N7FAGzi , M4N7FAMxi , M4N7FAMyi , & + M4N7FAMzi , M4N7FBFxi , M4N7FBFyi , M4N7FBFzi , M4N7FBxi , M4N7FByi , M4N7FBzi , & + M4N7FDxi , M4N7FDyi , M4N7FDzi , M4N7FIxi , M4N7FIyi , M4N7FIzi , M4N7FMGxi , & + M4N7FMGyi , M4N7FMGzi , M4N7MAFxi , M4N7MAFyi , M4N7MAFzi , M4N7MAGxi , M4N7MAGyi , & + M4N7MAGzi , M4N7MBFxi , M4N7MBFyi , M4N7MBFzi , M4N7MBxi , M4N7MByi , M4N7MBzi , & + M4N7MMGxi , M4N7MMGyi , M4N7MMGzi , M4N7STAxi , M4N7STAyi , M4N7STAzi , M4N7STVxi , & + M4N7STVyi , M4N7STVzi , M4N7Vxi , M4N7Vyi , M4N7Vzi , M4N8Axi , M4N8Ayi , & + M4N8Azi , M4N8DynP , M4N8FAFxi , M4N8FAFyi , M4N8FAFzi , M4N8FAGxi , M4N8FAGyi , & + M4N8FAGzi , M4N8FAMxi , M4N8FAMyi , M4N8FAMzi , M4N8FBFxi , M4N8FBFyi , M4N8FBFzi , & + M4N8FBxi , M4N8FByi , M4N8FBzi , M4N8FDxi , M4N8FDyi , M4N8FDzi , M4N8FIxi , & + M4N8FIyi , M4N8FIzi , M4N8FMGxi , M4N8FMGyi , M4N8FMGzi , M4N8MAFxi , M4N8MAFyi , & + M4N8MAFzi , M4N8MAGxi , M4N8MAGyi , M4N8MAGzi , M4N8MBFxi , M4N8MBFyi , M4N8MBFzi , & + M4N8MBxi , M4N8MByi , M4N8MBzi , M4N8MMGxi , M4N8MMGyi , M4N8MMGzi , M4N8STAxi , & + M4N8STAyi , M4N8STAzi , M4N8STVxi , M4N8STVyi , M4N8STVzi , M4N8Vxi , M4N8Vyi , & + M4N8Vzi , M4N9Axi , M4N9Ayi , M4N9Azi , M4N9DynP , M4N9FAFxi , M4N9FAFyi , & + M4N9FAFzi , M4N9FAGxi , M4N9FAGyi , M4N9FAGzi , M4N9FAMxi , M4N9FAMyi , M4N9FAMzi , & + M4N9FBFxi , M4N9FBFyi , M4N9FBFzi , M4N9FBxi , M4N9FByi , M4N9FBzi , M4N9FDxi , & + M4N9FDyi , M4N9FDzi , M4N9FIxi , M4N9FIyi , M4N9FIzi , M4N9FMGxi , M4N9FMGyi , & + M4N9FMGzi , M4N9MAFxi , M4N9MAFyi , M4N9MAFzi , M4N9MAGxi , M4N9MAGyi , M4N9MAGzi , & + M4N9MBFxi , M4N9MBFyi , M4N9MBFzi , M4N9MBxi , M4N9MByi , M4N9MBzi , M4N9MMGxi , & + M4N9MMGyi , M4N9MMGzi , M4N9STAxi , M4N9STAyi , M4N9STAzi , M4N9STVxi , M4N9STVyi , & + M4N9STVzi , M4N9Vxi , M4N9Vyi , M4N9Vzi , M5N1Axi , M5N1Ayi , M5N1Azi , & + M5N1DynP , M5N1FAFxi , M5N1FAFyi , M5N1FAFzi , M5N1FAGxi , M5N1FAGyi , M5N1FAGzi , & + M5N1FAMxi , M5N1FAMyi , M5N1FAMzi , M5N1FBFxi , M5N1FBFyi , M5N1FBFzi , M5N1FBxi , & + M5N1FByi , M5N1FBzi , M5N1FDxi , M5N1FDyi , M5N1FDzi , M5N1FIxi , M5N1FIyi , & + M5N1FIzi , M5N1FMGxi , M5N1FMGyi , M5N1FMGzi , M5N1MAFxi , M5N1MAFyi , M5N1MAFzi , & + M5N1MAGxi , M5N1MAGyi , M5N1MAGzi , M5N1MBFxi , M5N1MBFyi , M5N1MBFzi , M5N1MBxi , & + M5N1MByi , M5N1MBzi , M5N1MMGxi , M5N1MMGyi , M5N1MMGzi , M5N1STAxi , M5N1STAyi , & + M5N1STAzi , M5N1STVxi , M5N1STVyi , M5N1STVzi , M5N1Vxi , M5N1Vyi , M5N1Vzi , & + M5N2Axi , M5N2Ayi , M5N2Azi , M5N2DynP , M5N2FAFxi , M5N2FAFyi , M5N2FAFzi , & + M5N2FAGxi , M5N2FAGyi , M5N2FAGzi , M5N2FAMxi , M5N2FAMyi , M5N2FAMzi , M5N2FBFxi , & + M5N2FBFyi , M5N2FBFzi , M5N2FBxi , M5N2FByi , M5N2FBzi , M5N2FDxi , M5N2FDyi , & + M5N2FDzi , M5N2FIxi , M5N2FIyi , M5N2FIzi , M5N2FMGxi , M5N2FMGyi , M5N2FMGzi , & + M5N2MAFxi , M5N2MAFyi , M5N2MAFzi , M5N2MAGxi , M5N2MAGyi , M5N2MAGzi , M5N2MBFxi , & + M5N2MBFyi , M5N2MBFzi , M5N2MBxi , M5N2MByi , M5N2MBzi , M5N2MMGxi , M5N2MMGyi , & + M5N2MMGzi , M5N2STAxi , M5N2STAyi , M5N2STAzi , M5N2STVxi , M5N2STVyi , M5N2STVzi , & + M5N2Vxi , M5N2Vyi , M5N2Vzi , M5N3Axi , M5N3Ayi , M5N3Azi , M5N3DynP , & + M5N3FAFxi , M5N3FAFyi , M5N3FAFzi , M5N3FAGxi , M5N3FAGyi , M5N3FAGzi , M5N3FAMxi , & + M5N3FAMyi , M5N3FAMzi , M5N3FBFxi , M5N3FBFyi , M5N3FBFzi , M5N3FBxi , M5N3FByi , & + M5N3FBzi , M5N3FDxi , M5N3FDyi , M5N3FDzi , M5N3FIxi , M5N3FIyi , M5N3FIzi , & + M5N3FMGxi , M5N3FMGyi , M5N3FMGzi , M5N3MAFxi , M5N3MAFyi , M5N3MAFzi , M5N3MAGxi , & + M5N3MAGyi , M5N3MAGzi , M5N3MBFxi , M5N3MBFyi , M5N3MBFzi , M5N3MBxi , M5N3MByi , & + M5N3MBzi , M5N3MMGxi , M5N3MMGyi , M5N3MMGzi , M5N3STAxi , M5N3STAyi , M5N3STAzi , & + M5N3STVxi , M5N3STVyi , M5N3STVzi , M5N3Vxi , M5N3Vyi , M5N3Vzi , M5N4Axi , & + M5N4Ayi , M5N4Azi , M5N4DynP , M5N4FAFxi , M5N4FAFyi , M5N4FAFzi , M5N4FAGxi , & + M5N4FAGyi , M5N4FAGzi , M5N4FAMxi , M5N4FAMyi , M5N4FAMzi , M5N4FBFxi , M5N4FBFyi , & + M5N4FBFzi , M5N4FBxi , M5N4FByi , M5N4FBzi , M5N4FDxi , M5N4FDyi , M5N4FDzi , & + M5N4FIxi , M5N4FIyi , M5N4FIzi , M5N4FMGxi , M5N4FMGyi , M5N4FMGzi , M5N4MAFxi , & + M5N4MAFyi , M5N4MAFzi , M5N4MAGxi , M5N4MAGyi , M5N4MAGzi , M5N4MBFxi , M5N4MBFyi , & + M5N4MBFzi , M5N4MBxi , M5N4MByi , M5N4MBzi , M5N4MMGxi , M5N4MMGyi , M5N4MMGzi /) + ParamIndxAry(2486:2982) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M5N4STAxi , M5N4STAyi , M5N4STAzi , M5N4STVxi , M5N4STVyi , M5N4STVzi , M5N4Vxi , & + M5N4Vyi , M5N4Vzi , M5N5Axi , M5N5Ayi , M5N5Azi , M5N5DynP , M5N5FAFxi , & + M5N5FAFyi , M5N5FAFzi , M5N5FAGxi , M5N5FAGyi , M5N5FAGzi , M5N5FAMxi , M5N5FAMyi , & + M5N5FAMzi , M5N5FBFxi , M5N5FBFyi , M5N5FBFzi , M5N5FBxi , M5N5FByi , M5N5FBzi , & + M5N5FDxi , M5N5FDyi , M5N5FDzi , M5N5FIxi , M5N5FIyi , M5N5FIzi , M5N5FMGxi , & + M5N5FMGyi , M5N5FMGzi , M5N5MAFxi , M5N5MAFyi , M5N5MAFzi , M5N5MAGxi , M5N5MAGyi , & + M5N5MAGzi , M5N5MBFxi , M5N5MBFyi , M5N5MBFzi , M5N5MBxi , M5N5MByi , M5N5MBzi , & + M5N5MMGxi , M5N5MMGyi , M5N5MMGzi , M5N5STAxi , M5N5STAyi , M5N5STAzi , M5N5STVxi , & + M5N5STVyi , M5N5STVzi , M5N5Vxi , M5N5Vyi , M5N5Vzi , M5N6Axi , M5N6Ayi , & + M5N6Azi , M5N6DynP , M5N6FAFxi , M5N6FAFyi , M5N6FAFzi , M5N6FAGxi , M5N6FAGyi , & + M5N6FAGzi , M5N6FAMxi , M5N6FAMyi , M5N6FAMzi , M5N6FBFxi , M5N6FBFyi , M5N6FBFzi , & + M5N6FBxi , M5N6FByi , M5N6FBzi , M5N6FDxi , M5N6FDyi , M5N6FDzi , M5N6FIxi , & + M5N6FIyi , M5N6FIzi , M5N6FMGxi , M5N6FMGyi , M5N6FMGzi , M5N6MAFxi , M5N6MAFyi , & + M5N6MAFzi , M5N6MAGxi , M5N6MAGyi , M5N6MAGzi , M5N6MBFxi , M5N6MBFyi , M5N6MBFzi , & + M5N6MBxi , M5N6MByi , M5N6MBzi , M5N6MMGxi , M5N6MMGyi , M5N6MMGzi , M5N6STAxi , & + M5N6STAyi , M5N6STAzi , M5N6STVxi , M5N6STVyi , M5N6STVzi , M5N6Vxi , M5N6Vyi , & + M5N6Vzi , M5N7Axi , M5N7Ayi , M5N7Azi , M5N7DynP , M5N7FAFxi , M5N7FAFyi , & + M5N7FAFzi , M5N7FAGxi , M5N7FAGyi , M5N7FAGzi , M5N7FAMxi , M5N7FAMyi , M5N7FAMzi , & + M5N7FBFxi , M5N7FBFyi , M5N7FBFzi , M5N7FBxi , M5N7FByi , M5N7FBzi , M5N7FDxi , & + M5N7FDyi , M5N7FDzi , M5N7FIxi , M5N7FIyi , M5N7FIzi , M5N7FMGxi , M5N7FMGyi , & + M5N7FMGzi , M5N7MAFxi , M5N7MAFyi , M5N7MAFzi , M5N7MAGxi , M5N7MAGyi , M5N7MAGzi , & + M5N7MBFxi , M5N7MBFyi , M5N7MBFzi , M5N7MBxi , M5N7MByi , M5N7MBzi , M5N7MMGxi , & + M5N7MMGyi , M5N7MMGzi , M5N7STAxi , M5N7STAyi , M5N7STAzi , M5N7STVxi , M5N7STVyi , & + M5N7STVzi , M5N7Vxi , M5N7Vyi , M5N7Vzi , M5N8Axi , M5N8Ayi , M5N8Azi , & + M5N8DynP , M5N8FAFxi , M5N8FAFyi , M5N8FAFzi , M5N8FAGxi , M5N8FAGyi , M5N8FAGzi , & + M5N8FAMxi , M5N8FAMyi , M5N8FAMzi , M5N8FBFxi , M5N8FBFyi , M5N8FBFzi , M5N8FBxi , & + M5N8FByi , M5N8FBzi , M5N8FDxi , M5N8FDyi , M5N8FDzi , M5N8FIxi , M5N8FIyi , & + M5N8FIzi , M5N8FMGxi , M5N8FMGyi , M5N8FMGzi , M5N8MAFxi , M5N8MAFyi , M5N8MAFzi , & + M5N8MAGxi , M5N8MAGyi , M5N8MAGzi , M5N8MBFxi , M5N8MBFyi , M5N8MBFzi , M5N8MBxi , & + M5N8MByi , M5N8MBzi , M5N8MMGxi , M5N8MMGyi , M5N8MMGzi , M5N8STAxi , M5N8STAyi , & + M5N8STAzi , M5N8STVxi , M5N8STVyi , M5N8STVzi , M5N8Vxi , M5N8Vyi , M5N8Vzi , & + M5N9Axi , M5N9Ayi , M5N9Azi , M5N9DynP , M5N9FAFxi , M5N9FAFyi , M5N9FAFzi , & + M5N9FAGxi , M5N9FAGyi , M5N9FAGzi , M5N9FAMxi , M5N9FAMyi , M5N9FAMzi , M5N9FBFxi , & + M5N9FBFyi , M5N9FBFzi , M5N9FBxi , M5N9FByi , M5N9FBzi , M5N9FDxi , M5N9FDyi , & + M5N9FDzi , M5N9FIxi , M5N9FIyi , M5N9FIzi , M5N9FMGxi , M5N9FMGyi , M5N9FMGzi , & + M5N9MAFxi , M5N9MAFyi , M5N9MAFzi , M5N9MAGxi , M5N9MAGyi , M5N9MAGzi , M5N9MBFxi , & + M5N9MBFyi , M5N9MBFzi , M5N9MBxi , M5N9MByi , M5N9MBzi , M5N9MMGxi , M5N9MMGyi , & + M5N9MMGzi , M5N9STAxi , M5N9STAyi , M5N9STAzi , M5N9STVxi , M5N9STVyi , M5N9STVzi , & + M5N9Vxi , M5N9Vyi , M5N9Vzi , M6N1Axi , M6N1Ayi , M6N1Azi , M6N1DynP , & + M6N1FAFxi , M6N1FAFyi , M6N1FAFzi , M6N1FAGxi , M6N1FAGyi , M6N1FAGzi , M6N1FAMxi , & + M6N1FAMyi , M6N1FAMzi , M6N1FBFxi , M6N1FBFyi , M6N1FBFzi , M6N1FBxi , M6N1FByi , & + M6N1FBzi , M6N1FDxi , M6N1FDyi , M6N1FDzi , M6N1FIxi , M6N1FIyi , M6N1FIzi , & + M6N1FMGxi , M6N1FMGyi , M6N1FMGzi , M6N1MAFxi , M6N1MAFyi , M6N1MAFzi , M6N1MAGxi , & + M6N1MAGyi , M6N1MAGzi , M6N1MBFxi , M6N1MBFyi , M6N1MBFzi , M6N1MBxi , M6N1MByi , & + M6N1MBzi , M6N1MMGxi , M6N1MMGyi , M6N1MMGzi , M6N1STAxi , M6N1STAyi , M6N1STAzi , & + M6N1STVxi , M6N1STVyi , M6N1STVzi , M6N1Vxi , M6N1Vyi , M6N1Vzi , M6N2Axi , & + M6N2Ayi , M6N2Azi , M6N2DynP , M6N2FAFxi , M6N2FAFyi , M6N2FAFzi , M6N2FAGxi , & + M6N2FAGyi , M6N2FAGzi , M6N2FAMxi , M6N2FAMyi , M6N2FAMzi , M6N2FBFxi , M6N2FBFyi , & + M6N2FBFzi , M6N2FBxi , M6N2FByi , M6N2FBzi , M6N2FDxi , M6N2FDyi , M6N2FDzi , & + M6N2FIxi , M6N2FIyi , M6N2FIzi , M6N2FMGxi , M6N2FMGyi , M6N2FMGzi , M6N2MAFxi , & + M6N2MAFyi , M6N2MAFzi , M6N2MAGxi , M6N2MAGyi , M6N2MAGzi , M6N2MBFxi , M6N2MBFyi , & + M6N2MBFzi , M6N2MBxi , M6N2MByi , M6N2MBzi , M6N2MMGxi , M6N2MMGyi , M6N2MMGzi , & + M6N2STAxi , M6N2STAyi , M6N2STAzi , M6N2STVxi , M6N2STVyi , M6N2STVzi , M6N2Vxi , & + M6N2Vyi , M6N2Vzi , M6N3Axi , M6N3Ayi , M6N3Azi , M6N3DynP , M6N3FAFxi , & + M6N3FAFyi , M6N3FAFzi , M6N3FAGxi , M6N3FAGyi , M6N3FAGzi , M6N3FAMxi , M6N3FAMyi , & + M6N3FAMzi , M6N3FBFxi , M6N3FBFyi , M6N3FBFzi , M6N3FBxi , M6N3FByi , M6N3FBzi , & + M6N3FDxi , M6N3FDyi , M6N3FDzi , M6N3FIxi , M6N3FIyi , M6N3FIzi , M6N3FMGxi , & + M6N3FMGyi , M6N3FMGzi , M6N3MAFxi , M6N3MAFyi , M6N3MAFzi , M6N3MAGxi , M6N3MAGyi , & + M6N3MAGzi , M6N3MBFxi , M6N3MBFyi , M6N3MBFzi , M6N3MBxi , M6N3MByi , M6N3MBzi , & + M6N3MMGxi , M6N3MMGyi , M6N3MMGzi , M6N3STAxi , M6N3STAyi , M6N3STAzi , M6N3STVxi , & + M6N3STVyi , M6N3STVzi , M6N3Vxi , M6N3Vyi , M6N3Vzi , M6N4Axi , M6N4Ayi , & + M6N4Azi , M6N4DynP , M6N4FAFxi , M6N4FAFyi , M6N4FAFzi , M6N4FAGxi , M6N4FAGyi , & + M6N4FAGzi , M6N4FAMxi , M6N4FAMyi , M6N4FAMzi , M6N4FBFxi , M6N4FBFyi , M6N4FBFzi , & + M6N4FBxi , M6N4FByi , M6N4FBzi , M6N4FDxi , M6N4FDyi , M6N4FDzi , M6N4FIxi , & + M6N4FIyi , M6N4FIzi , M6N4FMGxi , M6N4FMGyi , M6N4FMGzi , M6N4MAFxi , M6N4MAFyi , & + M6N4MAFzi , M6N4MAGxi , M6N4MAGyi , M6N4MAGzi , M6N4MBFxi , M6N4MBFyi , M6N4MBFzi , & + M6N4MBxi , M6N4MByi , M6N4MBzi , M6N4MMGxi , M6N4MMGyi , M6N4MMGzi , M6N4STAxi , & + M6N4STAyi , M6N4STAzi , M6N4STVxi , M6N4STVyi , M6N4STVzi , M6N4Vxi , M6N4Vyi , & + M6N4Vzi , M6N5Axi , M6N5Ayi , M6N5Azi , M6N5DynP , M6N5FAFxi , M6N5FAFyi , & + M6N5FAFzi , M6N5FAGxi , M6N5FAGyi , M6N5FAGzi , M6N5FAMxi , M6N5FAMyi , M6N5FAMzi , & + M6N5FBFxi , M6N5FBFyi , M6N5FBFzi , M6N5FBxi , M6N5FByi , M6N5FBzi , M6N5FDxi /) + ParamIndxAry(2983:3479) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M6N5FDyi , M6N5FDzi , M6N5FIxi , M6N5FIyi , M6N5FIzi , M6N5FMGxi , M6N5FMGyi , & + M6N5FMGzi , M6N5MAFxi , M6N5MAFyi , M6N5MAFzi , M6N5MAGxi , M6N5MAGyi , M6N5MAGzi , & + M6N5MBFxi , M6N5MBFyi , M6N5MBFzi , M6N5MBxi , M6N5MByi , M6N5MBzi , M6N5MMGxi , & + M6N5MMGyi , M6N5MMGzi , M6N5STAxi , M6N5STAyi , M6N5STAzi , M6N5STVxi , M6N5STVyi , & + M6N5STVzi , M6N5Vxi , M6N5Vyi , M6N5Vzi , M6N6Axi , M6N6Ayi , M6N6Azi , & + M6N6DynP , M6N6FAFxi , M6N6FAFyi , M6N6FAFzi , M6N6FAGxi , M6N6FAGyi , M6N6FAGzi , & + M6N6FAMxi , M6N6FAMyi , M6N6FAMzi , M6N6FBFxi , M6N6FBFyi , M6N6FBFzi , M6N6FBxi , & + M6N6FByi , M6N6FBzi , M6N6FDxi , M6N6FDyi , M6N6FDzi , M6N6FIxi , M6N6FIyi , & + M6N6FIzi , M6N6FMGxi , M6N6FMGyi , M6N6FMGzi , M6N6MAFxi , M6N6MAFyi , M6N6MAFzi , & + M6N6MAGxi , M6N6MAGyi , M6N6MAGzi , M6N6MBFxi , M6N6MBFyi , M6N6MBFzi , M6N6MBxi , & + M6N6MByi , M6N6MBzi , M6N6MMGxi , M6N6MMGyi , M6N6MMGzi , M6N6STAxi , M6N6STAyi , & + M6N6STAzi , M6N6STVxi , M6N6STVyi , M6N6STVzi , M6N6Vxi , M6N6Vyi , M6N6Vzi , & + M6N7Axi , M6N7Ayi , M6N7Azi , M6N7DynP , M6N7FAFxi , M6N7FAFyi , M6N7FAFzi , & + M6N7FAGxi , M6N7FAGyi , M6N7FAGzi , M6N7FAMxi , M6N7FAMyi , M6N7FAMzi , M6N7FBFxi , & + M6N7FBFyi , M6N7FBFzi , M6N7FBxi , M6N7FByi , M6N7FBzi , M6N7FDxi , M6N7FDyi , & + M6N7FDzi , M6N7FIxi , M6N7FIyi , M6N7FIzi , M6N7FMGxi , M6N7FMGyi , M6N7FMGzi , & + M6N7MAFxi , M6N7MAFyi , M6N7MAFzi , M6N7MAGxi , M6N7MAGyi , M6N7MAGzi , M6N7MBFxi , & + M6N7MBFyi , M6N7MBFzi , M6N7MBxi , M6N7MByi , M6N7MBzi , M6N7MMGxi , M6N7MMGyi , & + M6N7MMGzi , M6N7STAxi , M6N7STAyi , M6N7STAzi , M6N7STVxi , M6N7STVyi , M6N7STVzi , & + M6N7Vxi , M6N7Vyi , M6N7Vzi , M6N8Axi , M6N8Ayi , M6N8Azi , M6N8DynP , & + M6N8FAFxi , M6N8FAFyi , M6N8FAFzi , M6N8FAGxi , M6N8FAGyi , M6N8FAGzi , M6N8FAMxi , & + M6N8FAMyi , M6N8FAMzi , M6N8FBFxi , M6N8FBFyi , M6N8FBFzi , M6N8FBxi , M6N8FByi , & + M6N8FBzi , M6N8FDxi , M6N8FDyi , M6N8FDzi , M6N8FIxi , M6N8FIyi , M6N8FIzi , & + M6N8FMGxi , M6N8FMGyi , M6N8FMGzi , M6N8MAFxi , M6N8MAFyi , M6N8MAFzi , M6N8MAGxi , & + M6N8MAGyi , M6N8MAGzi , M6N8MBFxi , M6N8MBFyi , M6N8MBFzi , M6N8MBxi , M6N8MByi , & + M6N8MBzi , M6N8MMGxi , M6N8MMGyi , M6N8MMGzi , M6N8STAxi , M6N8STAyi , M6N8STAzi , & + M6N8STVxi , M6N8STVyi , M6N8STVzi , M6N8Vxi , M6N8Vyi , M6N8Vzi , M6N9Axi , & + M6N9Ayi , M6N9Azi , M6N9DynP , M6N9FAFxi , M6N9FAFyi , M6N9FAFzi , M6N9FAGxi , & + M6N9FAGyi , M6N9FAGzi , M6N9FAMxi , M6N9FAMyi , M6N9FAMzi , M6N9FBFxi , M6N9FBFyi , & + M6N9FBFzi , M6N9FBxi , M6N9FByi , M6N9FBzi , M6N9FDxi , M6N9FDyi , M6N9FDzi , & + M6N9FIxi , M6N9FIyi , M6N9FIzi , M6N9FMGxi , M6N9FMGyi , M6N9FMGzi , M6N9MAFxi , & + M6N9MAFyi , M6N9MAFzi , M6N9MAGxi , M6N9MAGyi , M6N9MAGzi , M6N9MBFxi , M6N9MBFyi , & + M6N9MBFzi , M6N9MBxi , M6N9MByi , M6N9MBzi , M6N9MMGxi , M6N9MMGyi , M6N9MMGzi , & + M6N9STAxi , M6N9STAyi , M6N9STAzi , M6N9STVxi , M6N9STVyi , M6N9STVzi , M6N9Vxi , & + M6N9Vyi , M6N9Vzi , M7N1Axi , M7N1Ayi , M7N1Azi , M7N1DynP , M7N1FAFxi , & + M7N1FAFyi , M7N1FAFzi , M7N1FAGxi , M7N1FAGyi , M7N1FAGzi , M7N1FAMxi , M7N1FAMyi , & + M7N1FAMzi , M7N1FBFxi , M7N1FBFyi , M7N1FBFzi , M7N1FBxi , M7N1FByi , M7N1FBzi , & + M7N1FDxi , M7N1FDyi , M7N1FDzi , M7N1FIxi , M7N1FIyi , M7N1FIzi , M7N1FMGxi , & + M7N1FMGyi , M7N1FMGzi , M7N1MAFxi , M7N1MAFyi , M7N1MAFzi , M7N1MAGxi , M7N1MAGyi , & + M7N1MAGzi , M7N1MBFxi , M7N1MBFyi , M7N1MBFzi , M7N1MBxi , M7N1MByi , M7N1MBzi , & + M7N1MMGxi , M7N1MMGyi , M7N1MMGzi , M7N1STAxi , M7N1STAyi , M7N1STAzi , M7N1STVxi , & + M7N1STVyi , M7N1STVzi , M7N1Vxi , M7N1Vyi , M7N1Vzi , M7N2Axi , M7N2Ayi , & + M7N2Azi , M7N2DynP , M7N2FAFxi , M7N2FAFyi , M7N2FAFzi , M7N2FAGxi , M7N2FAGyi , & + M7N2FAGzi , M7N2FAMxi , M7N2FAMyi , M7N2FAMzi , M7N2FBFxi , M7N2FBFyi , M7N2FBFzi , & + M7N2FBxi , M7N2FByi , M7N2FBzi , M7N2FDxi , M7N2FDyi , M7N2FDzi , M7N2FIxi , & + M7N2FIyi , M7N2FIzi , M7N2FMGxi , M7N2FMGyi , M7N2FMGzi , M7N2MAFxi , M7N2MAFyi , & + M7N2MAFzi , M7N2MAGxi , M7N2MAGyi , M7N2MAGzi , M7N2MBFxi , M7N2MBFyi , M7N2MBFzi , & + M7N2MBxi , M7N2MByi , M7N2MBzi , M7N2MMGxi , M7N2MMGyi , M7N2MMGzi , M7N2STAxi , & + M7N2STAyi , M7N2STAzi , M7N2STVxi , M7N2STVyi , M7N2STVzi , M7N2Vxi , M7N2Vyi , & + M7N2Vzi , M7N3Axi , M7N3Ayi , M7N3Azi , M7N3DynP , M7N3FAFxi , M7N3FAFyi , & + M7N3FAFzi , M7N3FAGxi , M7N3FAGyi , M7N3FAGzi , M7N3FAMxi , M7N3FAMyi , M7N3FAMzi , & + M7N3FBFxi , M7N3FBFyi , M7N3FBFzi , M7N3FBxi , M7N3FByi , M7N3FBzi , M7N3FDxi , & + M7N3FDyi , M7N3FDzi , M7N3FIxi , M7N3FIyi , M7N3FIzi , M7N3FMGxi , M7N3FMGyi , & + M7N3FMGzi , M7N3MAFxi , M7N3MAFyi , M7N3MAFzi , M7N3MAGxi , M7N3MAGyi , M7N3MAGzi , & + M7N3MBFxi , M7N3MBFyi , M7N3MBFzi , M7N3MBxi , M7N3MByi , M7N3MBzi , M7N3MMGxi , & + M7N3MMGyi , M7N3MMGzi , M7N3STAxi , M7N3STAyi , M7N3STAzi , M7N3STVxi , M7N3STVyi , & + M7N3STVzi , M7N3Vxi , M7N3Vyi , M7N3Vzi , M7N4Axi , M7N4Ayi , M7N4Azi , & + M7N4DynP , M7N4FAFxi , M7N4FAFyi , M7N4FAFzi , M7N4FAGxi , M7N4FAGyi , M7N4FAGzi , & + M7N4FAMxi , M7N4FAMyi , M7N4FAMzi , M7N4FBFxi , M7N4FBFyi , M7N4FBFzi , M7N4FBxi , & + M7N4FByi , M7N4FBzi , M7N4FDxi , M7N4FDyi , M7N4FDzi , M7N4FIxi , M7N4FIyi , & + M7N4FIzi , M7N4FMGxi , M7N4FMGyi , M7N4FMGzi , M7N4MAFxi , M7N4MAFyi , M7N4MAFzi , & + M7N4MAGxi , M7N4MAGyi , M7N4MAGzi , M7N4MBFxi , M7N4MBFyi , M7N4MBFzi , M7N4MBxi , & + M7N4MByi , M7N4MBzi , M7N4MMGxi , M7N4MMGyi , M7N4MMGzi , M7N4STAxi , M7N4STAyi , & + M7N4STAzi , M7N4STVxi , M7N4STVyi , M7N4STVzi , M7N4Vxi , M7N4Vyi , M7N4Vzi , & + M7N5Axi , M7N5Ayi , M7N5Azi , M7N5DynP , M7N5FAFxi , M7N5FAFyi , M7N5FAFzi , & + M7N5FAGxi , M7N5FAGyi , M7N5FAGzi , M7N5FAMxi , M7N5FAMyi , M7N5FAMzi , M7N5FBFxi , & + M7N5FBFyi , M7N5FBFzi , M7N5FBxi , M7N5FByi , M7N5FBzi , M7N5FDxi , M7N5FDyi , & + M7N5FDzi , M7N5FIxi , M7N5FIyi , M7N5FIzi , M7N5FMGxi , M7N5FMGyi , M7N5FMGzi , & + M7N5MAFxi , M7N5MAFyi , M7N5MAFzi , M7N5MAGxi , M7N5MAGyi , M7N5MAGzi , M7N5MBFxi , & + M7N5MBFyi , M7N5MBFzi , M7N5MBxi , M7N5MByi , M7N5MBzi , M7N5MMGxi , M7N5MMGyi , & + M7N5MMGzi , M7N5STAxi , M7N5STAyi , M7N5STAzi , M7N5STVxi , M7N5STVyi , M7N5STVzi /) + ParamIndxAry(3480:3976) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M7N5Vxi , M7N5Vyi , M7N5Vzi , M7N6Axi , M7N6Ayi , M7N6Azi , M7N6DynP , & + M7N6FAFxi , M7N6FAFyi , M7N6FAFzi , M7N6FAGxi , M7N6FAGyi , M7N6FAGzi , M7N6FAMxi , & + M7N6FAMyi , M7N6FAMzi , M7N6FBFxi , M7N6FBFyi , M7N6FBFzi , M7N6FBxi , M7N6FByi , & + M7N6FBzi , M7N6FDxi , M7N6FDyi , M7N6FDzi , M7N6FIxi , M7N6FIyi , M7N6FIzi , & + M7N6FMGxi , M7N6FMGyi , M7N6FMGzi , M7N6MAFxi , M7N6MAFyi , M7N6MAFzi , M7N6MAGxi , & + M7N6MAGyi , M7N6MAGzi , M7N6MBFxi , M7N6MBFyi , M7N6MBFzi , M7N6MBxi , M7N6MByi , & + M7N6MBzi , M7N6MMGxi , M7N6MMGyi , M7N6MMGzi , M7N6STAxi , M7N6STAyi , M7N6STAzi , & + M7N6STVxi , M7N6STVyi , M7N6STVzi , M7N6Vxi , M7N6Vyi , M7N6Vzi , M7N7Axi , & + M7N7Ayi , M7N7Azi , M7N7DynP , M7N7FAFxi , M7N7FAFyi , M7N7FAFzi , M7N7FAGxi , & + M7N7FAGyi , M7N7FAGzi , M7N7FAMxi , M7N7FAMyi , M7N7FAMzi , M7N7FBFxi , M7N7FBFyi , & + M7N7FBFzi , M7N7FBxi , M7N7FByi , M7N7FBzi , M7N7FDxi , M7N7FDyi , M7N7FDzi , & + M7N7FIxi , M7N7FIyi , M7N7FIzi , M7N7FMGxi , M7N7FMGyi , M7N7FMGzi , M7N7MAFxi , & + M7N7MAFyi , M7N7MAFzi , M7N7MAGxi , M7N7MAGyi , M7N7MAGzi , M7N7MBFxi , M7N7MBFyi , & + M7N7MBFzi , M7N7MBxi , M7N7MByi , M7N7MBzi , M7N7MMGxi , M7N7MMGyi , M7N7MMGzi , & + M7N7STAxi , M7N7STAyi , M7N7STAzi , M7N7STVxi , M7N7STVyi , M7N7STVzi , M7N7Vxi , & + M7N7Vyi , M7N7Vzi , M7N8Axi , M7N8Ayi , M7N8Azi , M7N8DynP , M7N8FAFxi , & + M7N8FAFyi , M7N8FAFzi , M7N8FAGxi , M7N8FAGyi , M7N8FAGzi , M7N8FAMxi , M7N8FAMyi , & + M7N8FAMzi , M7N8FBFxi , M7N8FBFyi , M7N8FBFzi , M7N8FBxi , M7N8FByi , M7N8FBzi , & + M7N8FDxi , M7N8FDyi , M7N8FDzi , M7N8FIxi , M7N8FIyi , M7N8FIzi , M7N8FMGxi , & + M7N8FMGyi , M7N8FMGzi , M7N8MAFxi , M7N8MAFyi , M7N8MAFzi , M7N8MAGxi , M7N8MAGyi , & + M7N8MAGzi , M7N8MBFxi , M7N8MBFyi , M7N8MBFzi , M7N8MBxi , M7N8MByi , M7N8MBzi , & + M7N8MMGxi , M7N8MMGyi , M7N8MMGzi , M7N8STAxi , M7N8STAyi , M7N8STAzi , M7N8STVxi , & + M7N8STVyi , M7N8STVzi , M7N8Vxi , M7N8Vyi , M7N8Vzi , M7N9Axi , M7N9Ayi , & + M7N9Azi , M7N9DynP , M7N9FAFxi , M7N9FAFyi , M7N9FAFzi , M7N9FAGxi , M7N9FAGyi , & + M7N9FAGzi , M7N9FAMxi , M7N9FAMyi , M7N9FAMzi , M7N9FBFxi , M7N9FBFyi , M7N9FBFzi , & + M7N9FBxi , M7N9FByi , M7N9FBzi , M7N9FDxi , M7N9FDyi , M7N9FDzi , M7N9FIxi , & + M7N9FIyi , M7N9FIzi , M7N9FMGxi , M7N9FMGyi , M7N9FMGzi , M7N9MAFxi , M7N9MAFyi , & + M7N9MAFzi , M7N9MAGxi , M7N9MAGyi , M7N9MAGzi , M7N9MBFxi , M7N9MBFyi , M7N9MBFzi , & + M7N9MBxi , M7N9MByi , M7N9MBzi , M7N9MMGxi , M7N9MMGyi , M7N9MMGzi , M7N9STAxi , & + M7N9STAyi , M7N9STAzi , M7N9STVxi , M7N9STVyi , M7N9STVzi , M7N9Vxi , M7N9Vyi , & + M7N9Vzi , M8N1Axi , M8N1Ayi , M8N1Azi , M8N1DynP , M8N1FAFxi , M8N1FAFyi , & + M8N1FAFzi , M8N1FAGxi , M8N1FAGyi , M8N1FAGzi , M8N1FAMxi , M8N1FAMyi , M8N1FAMzi , & + M8N1FBFxi , M8N1FBFyi , M8N1FBFzi , M8N1FBxi , M8N1FByi , M8N1FBzi , M8N1FDxi , & + M8N1FDyi , M8N1FDzi , M8N1FIxi , M8N1FIyi , M8N1FIzi , M8N1FMGxi , M8N1FMGyi , & + M8N1FMGzi , M8N1MAFxi , M8N1MAFyi , M8N1MAFzi , M8N1MAGxi , M8N1MAGyi , M8N1MAGzi , & + M8N1MBFxi , M8N1MBFyi , M8N1MBFzi , M8N1MBxi , M8N1MByi , M8N1MBzi , M8N1MMGxi , & + M8N1MMGyi , M8N1MMGzi , M8N1STAxi , M8N1STAyi , M8N1STAzi , M8N1STVxi , M8N1STVyi , & + M8N1STVzi , M8N1Vxi , M8N1Vyi , M8N1Vzi , M8N2Axi , M8N2Ayi , M8N2Azi , & + M8N2DynP , M8N2FAFxi , M8N2FAFyi , M8N2FAFzi , M8N2FAGxi , M8N2FAGyi , M8N2FAGzi , & + M8N2FAMxi , M8N2FAMyi , M8N2FAMzi , M8N2FBFxi , M8N2FBFyi , M8N2FBFzi , M8N2FBxi , & + M8N2FByi , M8N2FBzi , M8N2FDxi , M8N2FDyi , M8N2FDzi , M8N2FIxi , M8N2FIyi , & + M8N2FIzi , M8N2FMGxi , M8N2FMGyi , M8N2FMGzi , M8N2MAFxi , M8N2MAFyi , M8N2MAFzi , & + M8N2MAGxi , M8N2MAGyi , M8N2MAGzi , M8N2MBFxi , M8N2MBFyi , M8N2MBFzi , M8N2MBxi , & + M8N2MByi , M8N2MBzi , M8N2MMGxi , M8N2MMGyi , M8N2MMGzi , M8N2STAxi , M8N2STAyi , & + M8N2STAzi , M8N2STVxi , M8N2STVyi , M8N2STVzi , M8N2Vxi , M8N2Vyi , M8N2Vzi , & + M8N3Axi , M8N3Ayi , M8N3Azi , M8N3DynP , M8N3FAFxi , M8N3FAFyi , M8N3FAFzi , & + M8N3FAGxi , M8N3FAGyi , M8N3FAGzi , M8N3FAMxi , M8N3FAMyi , M8N3FAMzi , M8N3FBFxi , & + M8N3FBFyi , M8N3FBFzi , M8N3FBxi , M8N3FByi , M8N3FBzi , M8N3FDxi , M8N3FDyi , & + M8N3FDzi , M8N3FIxi , M8N3FIyi , M8N3FIzi , M8N3FMGxi , M8N3FMGyi , M8N3FMGzi , & + M8N3MAFxi , M8N3MAFyi , M8N3MAFzi , M8N3MAGxi , M8N3MAGyi , M8N3MAGzi , M8N3MBFxi , & + M8N3MBFyi , M8N3MBFzi , M8N3MBxi , M8N3MByi , M8N3MBzi , M8N3MMGxi , M8N3MMGyi , & + M8N3MMGzi , M8N3STAxi , M8N3STAyi , M8N3STAzi , M8N3STVxi , M8N3STVyi , M8N3STVzi , & + M8N3Vxi , M8N3Vyi , M8N3Vzi , M8N4Axi , M8N4Ayi , M8N4Azi , M8N4DynP , & + M8N4FAFxi , M8N4FAFyi , M8N4FAFzi , M8N4FAGxi , M8N4FAGyi , M8N4FAGzi , M8N4FAMxi , & + M8N4FAMyi , M8N4FAMzi , M8N4FBFxi , M8N4FBFyi , M8N4FBFzi , M8N4FBxi , M8N4FByi , & + M8N4FBzi , M8N4FDxi , M8N4FDyi , M8N4FDzi , M8N4FIxi , M8N4FIyi , M8N4FIzi , & + M8N4FMGxi , M8N4FMGyi , M8N4FMGzi , M8N4MAFxi , M8N4MAFyi , M8N4MAFzi , M8N4MAGxi , & + M8N4MAGyi , M8N4MAGzi , M8N4MBFxi , M8N4MBFyi , M8N4MBFzi , M8N4MBxi , M8N4MByi , & + M8N4MBzi , M8N4MMGxi , M8N4MMGyi , M8N4MMGzi , M8N4STAxi , M8N4STAyi , M8N4STAzi , & + M8N4STVxi , M8N4STVyi , M8N4STVzi , M8N4Vxi , M8N4Vyi , M8N4Vzi , M8N5Axi , & + M8N5Ayi , M8N5Azi , M8N5DynP , M8N5FAFxi , M8N5FAFyi , M8N5FAFzi , M8N5FAGxi , & + M8N5FAGyi , M8N5FAGzi , M8N5FAMxi , M8N5FAMyi , M8N5FAMzi , M8N5FBFxi , M8N5FBFyi , & + M8N5FBFzi , M8N5FBxi , M8N5FByi , M8N5FBzi , M8N5FDxi , M8N5FDyi , M8N5FDzi , & + M8N5FIxi , M8N5FIyi , M8N5FIzi , M8N5FMGxi , M8N5FMGyi , M8N5FMGzi , M8N5MAFxi , & + M8N5MAFyi , M8N5MAFzi , M8N5MAGxi , M8N5MAGyi , M8N5MAGzi , M8N5MBFxi , M8N5MBFyi , & + M8N5MBFzi , M8N5MBxi , M8N5MByi , M8N5MBzi , M8N5MMGxi , M8N5MMGyi , M8N5MMGzi , & + M8N5STAxi , M8N5STAyi , M8N5STAzi , M8N5STVxi , M8N5STVyi , M8N5STVzi , M8N5Vxi , & + M8N5Vyi , M8N5Vzi , M8N6Axi , M8N6Ayi , M8N6Azi , M8N6DynP , M8N6FAFxi , & + M8N6FAFyi , M8N6FAFzi , M8N6FAGxi , M8N6FAGyi , M8N6FAGzi , M8N6FAMxi , M8N6FAMyi , & + M8N6FAMzi , M8N6FBFxi , M8N6FBFyi , M8N6FBFzi , M8N6FBxi , M8N6FByi , M8N6FBzi , & + M8N6FDxi , M8N6FDyi , M8N6FDzi , M8N6FIxi , M8N6FIyi , M8N6FIzi , M8N6FMGxi /) + ParamIndxAry(3977:4473) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M8N6FMGyi , M8N6FMGzi , M8N6MAFxi , M8N6MAFyi , M8N6MAFzi , M8N6MAGxi , M8N6MAGyi , & + M8N6MAGzi , M8N6MBFxi , M8N6MBFyi , M8N6MBFzi , M8N6MBxi , M8N6MByi , M8N6MBzi , & + M8N6MMGxi , M8N6MMGyi , M8N6MMGzi , M8N6STAxi , M8N6STAyi , M8N6STAzi , M8N6STVxi , & + M8N6STVyi , M8N6STVzi , M8N6Vxi , M8N6Vyi , M8N6Vzi , M8N7Axi , M8N7Ayi , & + M8N7Azi , M8N7DynP , M8N7FAFxi , M8N7FAFyi , M8N7FAFzi , M8N7FAGxi , M8N7FAGyi , & + M8N7FAGzi , M8N7FAMxi , M8N7FAMyi , M8N7FAMzi , M8N7FBFxi , M8N7FBFyi , M8N7FBFzi , & + M8N7FBxi , M8N7FByi , M8N7FBzi , M8N7FDxi , M8N7FDyi , M8N7FDzi , M8N7FIxi , & + M8N7FIyi , M8N7FIzi , M8N7FMGxi , M8N7FMGyi , M8N7FMGzi , M8N7MAFxi , M8N7MAFyi , & + M8N7MAFzi , M8N7MAGxi , M8N7MAGyi , M8N7MAGzi , M8N7MBFxi , M8N7MBFyi , M8N7MBFzi , & + M8N7MBxi , M8N7MByi , M8N7MBzi , M8N7MMGxi , M8N7MMGyi , M8N7MMGzi , M8N7STAxi , & + M8N7STAyi , M8N7STAzi , M8N7STVxi , M8N7STVyi , M8N7STVzi , M8N7Vxi , M8N7Vyi , & + M8N7Vzi , M8N8Axi , M8N8Ayi , M8N8Azi , M8N8DynP , M8N8FAFxi , M8N8FAFyi , & + M8N8FAFzi , M8N8FAGxi , M8N8FAGyi , M8N8FAGzi , M8N8FAMxi , M8N8FAMyi , M8N8FAMzi , & + M8N8FBFxi , M8N8FBFyi , M8N8FBFzi , M8N8FBxi , M8N8FByi , M8N8FBzi , M8N8FDxi , & + M8N8FDyi , M8N8FDzi , M8N8FIxi , M8N8FIyi , M8N8FIzi , M8N8FMGxi , M8N8FMGyi , & + M8N8FMGzi , M8N8MAFxi , M8N8MAFyi , M8N8MAFzi , M8N8MAGxi , M8N8MAGyi , M8N8MAGzi , & + M8N8MBFxi , M8N8MBFyi , M8N8MBFzi , M8N8MBxi , M8N8MByi , M8N8MBzi , M8N8MMGxi , & + M8N8MMGyi , M8N8MMGzi , M8N8STAxi , M8N8STAyi , M8N8STAzi , M8N8STVxi , M8N8STVyi , & + M8N8STVzi , M8N8Vxi , M8N8Vyi , M8N8Vzi , M8N9Axi , M8N9Ayi , M8N9Azi , & + M8N9DynP , M8N9FAFxi , M8N9FAFyi , M8N9FAFzi , M8N9FAGxi , M8N9FAGyi , M8N9FAGzi , & + M8N9FAMxi , M8N9FAMyi , M8N9FAMzi , M8N9FBFxi , M8N9FBFyi , M8N9FBFzi , M8N9FBxi , & + M8N9FByi , M8N9FBzi , M8N9FDxi , M8N9FDyi , M8N9FDzi , M8N9FIxi , M8N9FIyi , & + M8N9FIzi , M8N9FMGxi , M8N9FMGyi , M8N9FMGzi , M8N9MAFxi , M8N9MAFyi , M8N9MAFzi , & + M8N9MAGxi , M8N9MAGyi , M8N9MAGzi , M8N9MBFxi , M8N9MBFyi , M8N9MBFzi , M8N9MBxi , & + M8N9MByi , M8N9MBzi , M8N9MMGxi , M8N9MMGyi , M8N9MMGzi , M8N9STAxi , M8N9STAyi , & + M8N9STAzi , M8N9STVxi , M8N9STVyi , M8N9STVzi , M8N9Vxi , M8N9Vyi , M8N9Vzi , & + M9N1Axi , M9N1Ayi , M9N1Azi , M9N1DynP , M9N1FAFxi , M9N1FAFyi , M9N1FAFzi , & + M9N1FAGxi , M9N1FAGyi , M9N1FAGzi , M9N1FAMxi , M9N1FAMyi , M9N1FAMzi , M9N1FBFxi , & + M9N1FBFyi , M9N1FBFzi , M9N1FBxi , M9N1FByi , M9N1FBzi , M9N1FDxi , M9N1FDyi , & + M9N1FDzi , M9N1FIxi , M9N1FIyi , M9N1FIzi , M9N1FMGxi , M9N1FMGyi , M9N1FMGzi , & + M9N1MAFxi , M9N1MAFyi , M9N1MAFzi , M9N1MAGxi , M9N1MAGyi , M9N1MAGzi , M9N1MBFxi , & + M9N1MBFyi , M9N1MBFzi , M9N1MBxi , M9N1MByi , M9N1MBzi , M9N1MMGxi , M9N1MMGyi , & + M9N1MMGzi , M9N1STAxi , M9N1STAyi , M9N1STAzi , M9N1STVxi , M9N1STVyi , M9N1STVzi , & + M9N1Vxi , M9N1Vyi , M9N1Vzi , M9N2Axi , M9N2Ayi , M9N2Azi , M9N2DynP , & + M9N2FAFxi , M9N2FAFyi , M9N2FAFzi , M9N2FAGxi , M9N2FAGyi , M9N2FAGzi , M9N2FAMxi , & + M9N2FAMyi , M9N2FAMzi , M9N2FBFxi , M9N2FBFyi , M9N2FBFzi , M9N2FBxi , M9N2FByi , & + M9N2FBzi , M9N2FDxi , M9N2FDyi , M9N2FDzi , M9N2FIxi , M9N2FIyi , M9N2FIzi , & + M9N2FMGxi , M9N2FMGyi , M9N2FMGzi , M9N2MAFxi , M9N2MAFyi , M9N2MAFzi , M9N2MAGxi , & + M9N2MAGyi , M9N2MAGzi , M9N2MBFxi , M9N2MBFyi , M9N2MBFzi , M9N2MBxi , M9N2MByi , & + M9N2MBzi , M9N2MMGxi , M9N2MMGyi , M9N2MMGzi , M9N2STAxi , M9N2STAyi , M9N2STAzi , & + M9N2STVxi , M9N2STVyi , M9N2STVzi , M9N2Vxi , M9N2Vyi , M9N2Vzi , M9N3Axi , & + M9N3Ayi , M9N3Azi , M9N3DynP , M9N3FAFxi , M9N3FAFyi , M9N3FAFzi , M9N3FAGxi , & + M9N3FAGyi , M9N3FAGzi , M9N3FAMxi , M9N3FAMyi , M9N3FAMzi , M9N3FBFxi , M9N3FBFyi , & + M9N3FBFzi , M9N3FBxi , M9N3FByi , M9N3FBzi , M9N3FDxi , M9N3FDyi , M9N3FDzi , & + M9N3FIxi , M9N3FIyi , M9N3FIzi , M9N3FMGxi , M9N3FMGyi , M9N3FMGzi , M9N3MAFxi , & + M9N3MAFyi , M9N3MAFzi , M9N3MAGxi , M9N3MAGyi , M9N3MAGzi , M9N3MBFxi , M9N3MBFyi , & + M9N3MBFzi , M9N3MBxi , M9N3MByi , M9N3MBzi , M9N3MMGxi , M9N3MMGyi , M9N3MMGzi , & + M9N3STAxi , M9N3STAyi , M9N3STAzi , M9N3STVxi , M9N3STVyi , M9N3STVzi , M9N3Vxi , & + M9N3Vyi , M9N3Vzi , M9N4Axi , M9N4Ayi , M9N4Azi , M9N4DynP , M9N4FAFxi , & + M9N4FAFyi , M9N4FAFzi , M9N4FAGxi , M9N4FAGyi , M9N4FAGzi , M9N4FAMxi , M9N4FAMyi , & + M9N4FAMzi , M9N4FBFxi , M9N4FBFyi , M9N4FBFzi , M9N4FBxi , M9N4FByi , M9N4FBzi , & + M9N4FDxi , M9N4FDyi , M9N4FDzi , M9N4FIxi , M9N4FIyi , M9N4FIzi , M9N4FMGxi , & + M9N4FMGyi , M9N4FMGzi , M9N4MAFxi , M9N4MAFyi , M9N4MAFzi , M9N4MAGxi , M9N4MAGyi , & + M9N4MAGzi , M9N4MBFxi , M9N4MBFyi , M9N4MBFzi , M9N4MBxi , M9N4MByi , M9N4MBzi , & + M9N4MMGxi , M9N4MMGyi , M9N4MMGzi , M9N4STAxi , M9N4STAyi , M9N4STAzi , M9N4STVxi , & + M9N4STVyi , M9N4STVzi , M9N4Vxi , M9N4Vyi , M9N4Vzi , M9N5Axi , M9N5Ayi , & + M9N5Azi , M9N5DynP , M9N5FAFxi , M9N5FAFyi , M9N5FAFzi , M9N5FAGxi , M9N5FAGyi , & + M9N5FAGzi , M9N5FAMxi , M9N5FAMyi , M9N5FAMzi , M9N5FBFxi , M9N5FBFyi , M9N5FBFzi , & + M9N5FBxi , M9N5FByi , M9N5FBzi , M9N5FDxi , M9N5FDyi , M9N5FDzi , M9N5FIxi , & + M9N5FIyi , M9N5FIzi , M9N5FMGxi , M9N5FMGyi , M9N5FMGzi , M9N5MAFxi , M9N5MAFyi , & + M9N5MAFzi , M9N5MAGxi , M9N5MAGyi , M9N5MAGzi , M9N5MBFxi , M9N5MBFyi , M9N5MBFzi , & + M9N5MBxi , M9N5MByi , M9N5MBzi , M9N5MMGxi , M9N5MMGyi , M9N5MMGzi , M9N5STAxi , & + M9N5STAyi , M9N5STAzi , M9N5STVxi , M9N5STVyi , M9N5STVzi , M9N5Vxi , M9N5Vyi , & + M9N5Vzi , M9N6Axi , M9N6Ayi , M9N6Azi , M9N6DynP , M9N6FAFxi , M9N6FAFyi , & + M9N6FAFzi , M9N6FAGxi , M9N6FAGyi , M9N6FAGzi , M9N6FAMxi , M9N6FAMyi , M9N6FAMzi , & + M9N6FBFxi , M9N6FBFyi , M9N6FBFzi , M9N6FBxi , M9N6FByi , M9N6FBzi , M9N6FDxi , & + M9N6FDyi , M9N6FDzi , M9N6FIxi , M9N6FIyi , M9N6FIzi , M9N6FMGxi , M9N6FMGyi , & + M9N6FMGzi , M9N6MAFxi , M9N6MAFyi , M9N6MAFzi , M9N6MAGxi , M9N6MAGyi , M9N6MAGzi , & + M9N6MBFxi , M9N6MBFyi , M9N6MBFzi , M9N6MBxi , M9N6MByi , M9N6MBzi , M9N6MMGxi , & + M9N6MMGyi , M9N6MMGzi , M9N6STAxi , M9N6STAyi , M9N6STAzi , M9N6STVxi , M9N6STVyi , & + M9N6STVzi , M9N6Vxi , M9N6Vyi , M9N6Vzi , M9N7Axi , M9N7Ayi , M9N7Azi /) + ParamIndxAry(4474:4626) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M9N7DynP , M9N7FAFxi , M9N7FAFyi , M9N7FAFzi , M9N7FAGxi , M9N7FAGyi , M9N7FAGzi , & + M9N7FAMxi , M9N7FAMyi , M9N7FAMzi , M9N7FBFxi , M9N7FBFyi , M9N7FBFzi , M9N7FBxi , & + M9N7FByi , M9N7FBzi , M9N7FDxi , M9N7FDyi , M9N7FDzi , M9N7FIxi , M9N7FIyi , & + M9N7FIzi , M9N7FMGxi , M9N7FMGyi , M9N7FMGzi , M9N7MAFxi , M9N7MAFyi , M9N7MAFzi , & + M9N7MAGxi , M9N7MAGyi , M9N7MAGzi , M9N7MBFxi , M9N7MBFyi , M9N7MBFzi , M9N7MBxi , & + M9N7MByi , M9N7MBzi , M9N7MMGxi , M9N7MMGyi , M9N7MMGzi , M9N7STAxi , M9N7STAyi , & + M9N7STAzi , M9N7STVxi , M9N7STVyi , M9N7STVzi , M9N7Vxi , M9N7Vyi , M9N7Vzi , & + M9N8Axi , M9N8Ayi , M9N8Azi , M9N8DynP , M9N8FAFxi , M9N8FAFyi , M9N8FAFzi , & + M9N8FAGxi , M9N8FAGyi , M9N8FAGzi , M9N8FAMxi , M9N8FAMyi , M9N8FAMzi , M9N8FBFxi , & + M9N8FBFyi , M9N8FBFzi , M9N8FBxi , M9N8FByi , M9N8FBzi , M9N8FDxi , M9N8FDyi , & + M9N8FDzi , M9N8FIxi , M9N8FIyi , M9N8FIzi , M9N8FMGxi , M9N8FMGyi , M9N8FMGzi , & + M9N8MAFxi , M9N8MAFyi , M9N8MAFzi , M9N8MAGxi , M9N8MAGyi , M9N8MAGzi , M9N8MBFxi , & + M9N8MBFyi , M9N8MBFzi , M9N8MBxi , M9N8MByi , M9N8MBzi , M9N8MMGxi , M9N8MMGyi , & + M9N8MMGzi , M9N8STAxi , M9N8STAyi , M9N8STAzi , M9N8STVxi , M9N8STVyi , M9N8STVzi , & + M9N8Vxi , M9N8Vyi , M9N8Vzi , M9N9Axi , M9N9Ayi , M9N9Azi , M9N9DynP , & + M9N9FAFxi , M9N9FAFyi , M9N9FAFzi , M9N9FAGxi , M9N9FAGyi , M9N9FAGzi , M9N9FAMxi , & + M9N9FAMyi , M9N9FAMzi , M9N9FBFxi , M9N9FBFyi , M9N9FBFzi , M9N9FBxi , M9N9FByi , & + M9N9FBzi , M9N9FDxi , M9N9FDyi , M9N9FDzi , M9N9FIxi , M9N9FIyi , M9N9FIzi , & + M9N9FMGxi , M9N9FMGyi , M9N9FMGzi , M9N9MAFxi , M9N9MAFyi , M9N9MAFzi , M9N9MAGxi , & + M9N9MAGyi , M9N9MAGzi , M9N9MBFxi , M9N9MBFyi , M9N9MBFzi , M9N9MBxi , M9N9MByi , & + M9N9MBzi , M9N9MMGxi , M9N9MMGyi , M9N9MMGzi , M9N9STAxi , M9N9STAyi , M9N9STAzi , & + M9N9STVxi , M9N9STVyi , M9N9STVzi , M9N9Vxi , M9N9Vyi , M9N9Vzi /) + ParamUnitsAry(1:497) = (/ & ! This lists the units corresponding to the allowed parameters + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(Pa) ","(Pa) ","(Pa) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(Pa) ","(Pa) ", & + "(Pa) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(Pa) ","(Pa) ","(Pa) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(Pa) ", & + "(Pa) ","(Pa) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(Pa) ","(Pa) ","(Pa) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(Pa) ","(Pa) ","(Pa) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(Pa) ","(Pa) ","(Pa) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(Pa) ","(Pa) ","(Pa) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(Pa) ","(Pa) ", & + "(Pa) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)"/) + ParamUnitsAry(498:994) = (/ & ! This lists the units corresponding to the allowed parameters + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) "/) + ParamUnitsAry(995:1491) = (/ & ! This lists the units corresponding to the allowed parameters + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)"/) + ParamUnitsAry(1492:1988) = (/ & ! This lists the units corresponding to the allowed parameters + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) "/) + ParamUnitsAry(1989:2485) = (/ & ! This lists the units corresponding to the allowed parameters + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)"/) + ParamUnitsAry(2486:2982) = (/ & ! This lists the units corresponding to the allowed parameters + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) "/) + ParamUnitsAry(2983:3479) = (/ & ! This lists the units corresponding to the allowed parameters + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) "/) + ParamUnitsAry(3480:3976) = (/ & ! This lists the units corresponding to the allowed parameters + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) "/) + ParamUnitsAry(3977:4473) = (/ & ! This lists the units corresponding to the allowed parameters + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)", & + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)", & + "(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)", & + "(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)", & + "(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)"/) + ParamUnitsAry(4474:4626) = (/ & ! This lists the units corresponding to the allowed parameters + "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)", & + "(m/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s^2)","(m/s^2)","(m/s^2)","(Pa) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)", & + "(N-m/m)","(N-m/m)","(N-m/m)","(N-m/m)","(m/s^2)","(m/s^2)","(m/s^2)", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) "/) diff --git a/modules/hydrodyn/src/Morison_Types.f90 b/modules/hydrodyn/src/Morison_Types.f90 index 09060ae3ff..d75a7d101a 100644 --- a/modules/hydrodyn/src/Morison_Types.f90 +++ b/modules/hydrodyn/src/Morison_Types.f90 @@ -31,9 +31,10 @@ !! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. MODULE Morison_Types !--------------------------------------------------------------------------------------------------------------------------------- +USE SeaState_Interp_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: MaxMrsnOutputs = 4599 ! Total number of possible Morison module output channels [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MaxMrsnOutputs = 4626 ! Total number of possible Morison module output channels [-] ! ========= Morison_JointType ======= TYPE, PUBLIC :: Morison_JointType INTEGER(IntKi) :: JointID !< User-specified integer ID for the given joint [-] @@ -42,7 +43,7 @@ MODULE Morison_Types INTEGER(IntKi) :: JointAxIDIndx !< The index into the Axial Coefs arrays corresponding to the above Axial ID [-] INTEGER(IntKi) :: JointOvrlp !< Joint overlap code [Unused [-] INTEGER(IntKi) :: NConnections !< Number of members connecting to this joint [-] - INTEGER(IntKi) , DIMENSION(1:10) :: ConnectionList !< List of Members connected to this joint. The member index is what is stored, not the Member ID [-] + INTEGER(IntKi) , DIMENSION(1:50) :: ConnectionList !< List of Members connected to this joint. The member index is what is stored, not the Member ID [-] END TYPE Morison_JointType ! ======================= ! ========= Morison_MemberPropType ======= @@ -115,7 +116,7 @@ MODULE Morison_Types INTEGER(IntKi) :: JointOvrlp !< [-] INTEGER(IntKi) :: JointAxIDIndx !< [-] INTEGER(IntKi) :: NConnections !< Number of elements connecting to this node [-] - INTEGER(IntKi) , DIMENSION(1:10) :: ConnectionList !< Indices of all the members connected to this node (positive if end 1, negative if end 2) [-] + INTEGER(IntKi) , DIMENSION(1:50) :: ConnectionList !< Indices of all the members connected to this node (positive if end 1, negative if end 2) [-] REAL(ReKi) :: JAxCd !< Nodal lumped (joint) axial Cd [-] REAL(ReKi) :: JAxCa !< Nodal lumped (joint) axial Cp [-] REAL(ReKi) :: JAxCp !< Nodal lumped (joint) axial Ca [-] @@ -269,6 +270,7 @@ MODULE Morison_Types REAL(ReKi) :: WtrDens !< Water density [kg/m^3] REAL(ReKi) :: WtrDpth !< Water depth (positive-valued) [m] REAL(ReKi) :: MSL2SWL !< Mean Sea Level to Still Water Level offset [m] + INTEGER(IntKi) :: WaveDisp !< Method of computing Wave Kinematics. (0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [-] INTEGER(IntKi) :: NJoints !< Number of user-specified joints [-] INTEGER(IntKi) :: NNodes !< Total number of nodes in the final software model [-] TYPE(Morison_JointType) , DIMENSION(:), ALLOCATABLE :: InpJoints !< Array of user-specified joints [-] @@ -314,11 +316,15 @@ MODULE Morison_Types INTEGER(IntKi) :: UnOutFile !< [-] INTEGER(IntKi) :: UnSum !< [-] INTEGER(IntKi) :: NStepWave !< [-] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveAcc !< [-] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< [-] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveDynP !< [-] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveVel !< [-] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev => NULL() !< Total wave elevation [-] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [-] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev2 => NULL() !< Second order wave elevation [-] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveAcc => NULL() !< [-] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< [-] + REAL(SiKi) , DIMENSION(:,:,:,:), POINTER :: WaveDynP => NULL() !< [-] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveVel => NULL() !< [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: nodeInWater !< Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated [-] + TYPE(SeaSt_Interp_ParameterType) :: SeaSt_Interp_p !< parameter information from the SeaState Interpolation module [-] END TYPE Morison_InitInputType ! ======================= ! ========= Morison_InitOutputType ======= @@ -352,6 +358,9 @@ MODULE Morison_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: FV !< Fluid velocity at line element node at time t, which may not correspond to the WaveTime array of times [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: FA !< Fluid acceleration at line element node at time t, which may not correspond to the WaveTime array of times [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FDynP !< Fluid dynamic pressure at line element node at time t, which may not correspond to the WaveTime array of times [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WaveElev !< Total wave elevation [m] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WaveElev1 !< First order wave elevation [m] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WaveElev2 !< Second order wave elevation [m] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: vrel !< velocity of structural node relative to the water [m/s^2] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: nodeInWater !< Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated [-] TYPE(Morison_MemberLoads) , DIMENSION(:), ALLOCATABLE :: memberLoads !< Array (NMembers long) of member-based side-effects load contributions [-] @@ -362,6 +371,7 @@ MODULE Morison_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: F_A_End !< Lumped added mass loads at time t, which may not correspond to the WaveTime array of times [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: F_BF_End !< [-] INTEGER(IntKi) :: LastIndWave !< Last time index used in the wave kinematics arrays [-] + TYPE(SeaSt_Interp_MiscVarType) :: SeaSt_Interp_m !< misc var information from the SeaState Interpolation module [-] END TYPE Morison_MiscVarType ! ======================= ! ========= Morison_ParameterType ======= @@ -371,6 +381,7 @@ MODULE Morison_Types REAL(ReKi) :: WtrDens !< Water density [kg/m^3] REAL(ReKi) :: WtrDpth !< Water depth (positive-valued) [m] REAL(ReKi) :: MSL2SWL !< Mean Sea Level to Still Water Level offset [m] + INTEGER(IntKi) :: WaveDisp !< Method of computing Wave Kinematics. (0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [-] INTEGER(IntKi) :: NMembers !< number of members [-] TYPE(Morison_MemberType) , DIMENSION(:), ALLOCATABLE :: Members !< Array of Morison members used during simulation [-] INTEGER(IntKi) :: NNodes !< [-] @@ -382,10 +393,13 @@ MODULE Morison_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DP_Const_End !< Constant part of Joint dynamic pressure term [N] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Mass_MG_End !< Joint marine growth mass [kg] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: AM_End !< 3x3 Joint added mass matrix, constant for all t [N] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveVel !< [-] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveAcc !< [-] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveDynP !< [-] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< Times for which the wave kinematics are pre-computed [s] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev => NULL() !< Total wave elevation [m] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [m] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev2 => NULL() !< Second order wave elevation [m] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveVel => NULL() !< [-] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveAcc => NULL() !< [-] + REAL(SiKi) , DIMENSION(:,:,:,:), POINTER :: WaveDynP => NULL() !< [-] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Times for which the wave kinematics are pre-computed [s] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: nodeInWater !< Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated [-] INTEGER(IntKi) :: NStepWave !< [-] INTEGER(IntKi) :: NMOutputs !< [-] @@ -400,6 +414,7 @@ MODULE Morison_Types CHARACTER(20) :: OutFmt !< [-] CHARACTER(20) :: OutSFmt !< [-] CHARACTER(ChanLen) :: Delim !< [-] + TYPE(SeaSt_Interp_ParameterType) :: SeaSt_Interp_p !< parameter information from the SeaState Interpolation module [-] END TYPE Morison_ParameterType ! ======================= ! ========= Morison_InputType ======= @@ -425,6 +440,8 @@ SUBROUTINE Morison_CopyJointType( SrcJointTypeData, DstJointTypeData, CtrlCode, 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Morison_CopyJointType' @@ -556,6 +573,8 @@ SUBROUTINE Morison_UnPackJointType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Morison_UnPackJointType' @@ -5878,6 +5897,8 @@ SUBROUTINE Morison_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Morison_CopyInitInput' @@ -5888,6 +5909,7 @@ SUBROUTINE Morison_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, DstInitInputData%WtrDens = SrcInitInputData%WtrDens DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth DstInitInputData%MSL2SWL = SrcInitInputData%MSL2SWL + DstInitInputData%WaveDisp = SrcInitInputData%WaveDisp DstInitInputData%NJoints = SrcInitInputData%NJoints DstInitInputData%NNodes = SrcInitInputData%NNodes IF (ALLOCATED(SrcInitInputData%InpJoints)) THEN @@ -6109,15 +6131,67 @@ SUBROUTINE Morison_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, DstInitInputData%UnOutFile = SrcInitInputData%UnOutFile DstInitInputData%UnSum = SrcInitInputData%UnSum DstInitInputData%NStepWave = SrcInitInputData%NStepWave -IF (ALLOCATED(SrcInitInputData%WaveAcc)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveElev)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElev,1) + i1_u = UBOUND(SrcInitInputData%WaveElev,1) + i2_l = LBOUND(SrcInitInputData%WaveElev,2) + i2_u = UBOUND(SrcInitInputData%WaveElev,2) + i3_l = LBOUND(SrcInitInputData%WaveElev,3) + i3_u = UBOUND(SrcInitInputData%WaveElev,3) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElev)) THEN + ALLOCATE(DstInitInputData%WaveElev(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%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElev = SrcInitInputData%WaveElev +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveElev1)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElev1,1) + i1_u = UBOUND(SrcInitInputData%WaveElev1,1) + i2_l = LBOUND(SrcInitInputData%WaveElev1,2) + i2_u = UBOUND(SrcInitInputData%WaveElev1,2) + i3_l = LBOUND(SrcInitInputData%WaveElev1,3) + i3_u = UBOUND(SrcInitInputData%WaveElev1,3) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElev1)) THEN + ALLOCATE(DstInitInputData%WaveElev1(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%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElev1 = SrcInitInputData%WaveElev1 +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveElev2)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElev2,1) + i1_u = UBOUND(SrcInitInputData%WaveElev2,1) + i2_l = LBOUND(SrcInitInputData%WaveElev2,2) + i2_u = UBOUND(SrcInitInputData%WaveElev2,2) + i3_l = LBOUND(SrcInitInputData%WaveElev2,3) + i3_u = UBOUND(SrcInitInputData%WaveElev2,3) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElev2)) THEN + ALLOCATE(DstInitInputData%WaveElev2(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%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElev2 = SrcInitInputData%WaveElev2 +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveAcc)) THEN i1_l = LBOUND(SrcInitInputData%WaveAcc,1) i1_u = UBOUND(SrcInitInputData%WaveAcc,1) i2_l = LBOUND(SrcInitInputData%WaveAcc,2) i2_u = UBOUND(SrcInitInputData%WaveAcc,2) i3_l = LBOUND(SrcInitInputData%WaveAcc,3) i3_u = UBOUND(SrcInitInputData%WaveAcc,3) - IF (.NOT. ALLOCATED(DstInitInputData%WaveAcc)) THEN - ALLOCATE(DstInitInputData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = LBOUND(SrcInitInputData%WaveAcc,4) + i4_u = UBOUND(SrcInitInputData%WaveAcc,4) + i5_l = LBOUND(SrcInitInputData%WaveAcc,5) + i5_u = UBOUND(SrcInitInputData%WaveAcc,5) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveAcc)) THEN + ALLOCATE(DstInitInputData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveAcc.', ErrStat, ErrMsg,RoutineName) RETURN @@ -6125,10 +6199,10 @@ SUBROUTINE Morison_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, END IF DstInitInputData%WaveAcc = SrcInitInputData%WaveAcc ENDIF -IF (ALLOCATED(SrcInitInputData%WaveTime)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveTime)) THEN i1_l = LBOUND(SrcInitInputData%WaveTime,1) i1_u = UBOUND(SrcInitInputData%WaveTime,1) - IF (.NOT. ALLOCATED(DstInitInputData%WaveTime)) THEN + IF (.NOT. ASSOCIATED(DstInitInputData%WaveTime)) THEN ALLOCATE(DstInitInputData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -6137,13 +6211,17 @@ SUBROUTINE Morison_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, END IF DstInitInputData%WaveTime = SrcInitInputData%WaveTime ENDIF -IF (ALLOCATED(SrcInitInputData%WaveDynP)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveDynP)) THEN i1_l = LBOUND(SrcInitInputData%WaveDynP,1) i1_u = UBOUND(SrcInitInputData%WaveDynP,1) i2_l = LBOUND(SrcInitInputData%WaveDynP,2) i2_u = UBOUND(SrcInitInputData%WaveDynP,2) - IF (.NOT. ALLOCATED(DstInitInputData%WaveDynP)) THEN - ALLOCATE(DstInitInputData%WaveDynP(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + i3_l = LBOUND(SrcInitInputData%WaveDynP,3) + i3_u = UBOUND(SrcInitInputData%WaveDynP,3) + i4_l = LBOUND(SrcInitInputData%WaveDynP,4) + i4_u = UBOUND(SrcInitInputData%WaveDynP,4) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveDynP)) THEN + ALLOCATE(DstInitInputData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveDynP.', ErrStat, ErrMsg,RoutineName) RETURN @@ -6151,15 +6229,19 @@ SUBROUTINE Morison_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, END IF DstInitInputData%WaveDynP = SrcInitInputData%WaveDynP ENDIF -IF (ALLOCATED(SrcInitInputData%WaveVel)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveVel)) THEN i1_l = LBOUND(SrcInitInputData%WaveVel,1) i1_u = UBOUND(SrcInitInputData%WaveVel,1) i2_l = LBOUND(SrcInitInputData%WaveVel,2) i2_u = UBOUND(SrcInitInputData%WaveVel,2) i3_l = LBOUND(SrcInitInputData%WaveVel,3) i3_u = UBOUND(SrcInitInputData%WaveVel,3) - IF (.NOT. ALLOCATED(DstInitInputData%WaveVel)) THEN - ALLOCATE(DstInitInputData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = LBOUND(SrcInitInputData%WaveVel,4) + i4_u = UBOUND(SrcInitInputData%WaveVel,4) + i5_l = LBOUND(SrcInitInputData%WaveVel,5) + i5_u = UBOUND(SrcInitInputData%WaveVel,5) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveVel)) THEN + ALLOCATE(DstInitInputData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveVel.', ErrStat, ErrMsg,RoutineName) RETURN @@ -6181,6 +6263,9 @@ SUBROUTINE Morison_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, END IF DstInitInputData%nodeInWater = SrcInitInputData%nodeInWater ENDIF + CALL SeaSt_Interp_CopyParam( SrcInitInputData%SeaSt_Interp_p, DstInitInputData%SeaSt_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE Morison_CopyInitInput SUBROUTINE Morison_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -6261,21 +6346,38 @@ SUBROUTINE Morison_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitInputData%ValidOutList)) THEN DEALLOCATE(InitInputData%ValidOutList) ENDIF -IF (ALLOCATED(InitInputData%WaveAcc)) THEN +IF (ASSOCIATED(InitInputData%WaveElev)) THEN + DEALLOCATE(InitInputData%WaveElev) + InitInputData%WaveElev => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveElev1)) THEN + DEALLOCATE(InitInputData%WaveElev1) + InitInputData%WaveElev1 => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveElev2)) THEN + DEALLOCATE(InitInputData%WaveElev2) + InitInputData%WaveElev2 => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveAcc)) THEN DEALLOCATE(InitInputData%WaveAcc) + InitInputData%WaveAcc => NULL() ENDIF -IF (ALLOCATED(InitInputData%WaveTime)) THEN +IF (ASSOCIATED(InitInputData%WaveTime)) THEN DEALLOCATE(InitInputData%WaveTime) + InitInputData%WaveTime => NULL() ENDIF -IF (ALLOCATED(InitInputData%WaveDynP)) THEN +IF (ASSOCIATED(InitInputData%WaveDynP)) THEN DEALLOCATE(InitInputData%WaveDynP) + InitInputData%WaveDynP => NULL() ENDIF -IF (ALLOCATED(InitInputData%WaveVel)) THEN +IF (ASSOCIATED(InitInputData%WaveVel)) THEN DEALLOCATE(InitInputData%WaveVel) + InitInputData%WaveVel => NULL() ENDIF IF (ALLOCATED(InitInputData%nodeInWater)) THEN DEALLOCATE(InitInputData%nodeInWater) ENDIF + CALL SeaSt_Interp_DestroyParam( InitInputData%SeaSt_Interp_p, ErrStat, ErrMsg ) END SUBROUTINE Morison_DestroyInitInput SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -6317,6 +6419,7 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Re_BufSz = Re_BufSz + 1 ! WtrDens Re_BufSz = Re_BufSz + 1 ! WtrDpth Re_BufSz = Re_BufSz + 1 ! MSL2SWL + Int_BufSz = Int_BufSz + 1 ! WaveDisp Int_BufSz = Int_BufSz + 1 ! NJoints Int_BufSz = Int_BufSz + 1 ! NNodes Int_BufSz = Int_BufSz + 1 ! InpJoints allocated yes/no @@ -6609,24 +6712,39 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_BufSz = Int_BufSz + 1 ! UnOutFile Int_BufSz = Int_BufSz + 1 ! UnSum Int_BufSz = Int_BufSz + 1 ! NStepWave + Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no + IF ( ASSOCIATED(InData%WaveElev) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev1) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev1) ! WaveElev1 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev2 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev2) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev2 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev2) ! WaveElev2 + END IF Int_BufSz = Int_BufSz + 1 ! WaveAcc allocated yes/no - IF ( ALLOCATED(InData%WaveAcc) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveAcc upper/lower bounds for each dimension + IF ( ASSOCIATED(InData%WaveAcc) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveAcc upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveAcc) ! WaveAcc END IF Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN + IF ( ASSOCIATED(InData%WaveTime) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime END IF Int_BufSz = Int_BufSz + 1 ! WaveDynP allocated yes/no - IF ( ALLOCATED(InData%WaveDynP) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveDynP upper/lower bounds for each dimension + IF ( ASSOCIATED(InData%WaveDynP) ) THEN + Int_BufSz = Int_BufSz + 2*4 ! WaveDynP upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveDynP) ! WaveDynP END IF Int_BufSz = Int_BufSz + 1 ! WaveVel allocated yes/no - IF ( ALLOCATED(InData%WaveVel) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveVel upper/lower bounds for each dimension + IF ( ASSOCIATED(InData%WaveVel) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveVel upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveVel) ! WaveVel END IF Int_BufSz = Int_BufSz + 1 ! nodeInWater allocated yes/no @@ -6634,6 +6752,23 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_BufSz = Int_BufSz + 2*2 ! nodeInWater upper/lower bounds for each dimension Int_BufSz = Int_BufSz + SIZE(InData%nodeInWater) ! nodeInWater END IF + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_p: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -6669,6 +6804,8 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Re_Xferred = Re_Xferred + 1 ReKiBuf(Re_Xferred) = InData%MSL2SWL Re_Xferred = Re_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%WaveDisp + Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NJoints Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NNodes @@ -7207,7 +7344,82 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NStepWave Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveAcc) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveElev) ) 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%WaveElev,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev,3), UBOUND(InData%WaveElev,3) + DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) + DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) + ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) 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%WaveElev1,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev1,3), UBOUND(InData%WaveElev1,3) + DO i2 = LBOUND(InData%WaveElev1,2), UBOUND(InData%WaveElev1,2) + DO i1 = LBOUND(InData%WaveElev1,1), UBOUND(InData%WaveElev1,1) + ReKiBuf(Re_Xferred) = InData%WaveElev1(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev2) ) 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%WaveElev2,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev2,3), UBOUND(InData%WaveElev2,3) + DO i2 = LBOUND(InData%WaveElev2,2), UBOUND(InData%WaveElev2,2) + DO i1 = LBOUND(InData%WaveElev2,1), UBOUND(InData%WaveElev2,1) + ReKiBuf(Re_Xferred) = InData%WaveElev2(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveAcc) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -7221,18 +7433,28 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,3) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,5) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%WaveAcc,3), UBOUND(InData%WaveAcc,3) - DO i2 = LBOUND(InData%WaveAcc,2), UBOUND(InData%WaveAcc,2) - DO i1 = LBOUND(InData%WaveAcc,1), UBOUND(InData%WaveAcc,1) - ReKiBuf(Re_Xferred) = InData%WaveAcc(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(InData%WaveAcc,5), UBOUND(InData%WaveAcc,5) + DO i4 = LBOUND(InData%WaveAcc,4), UBOUND(InData%WaveAcc,4) + DO i3 = LBOUND(InData%WaveAcc,3), UBOUND(InData%WaveAcc,3) + DO i2 = LBOUND(InData%WaveAcc,2), UBOUND(InData%WaveAcc,2) + DO i1 = LBOUND(InData%WaveAcc,1), UBOUND(InData%WaveAcc,1) + ReKiBuf(Re_Xferred) = InData%WaveAcc(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveTime) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -7247,7 +7469,7 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Re_Xferred = Re_Xferred + 1 END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveDynP) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveDynP) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -7258,16 +7480,26 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,2) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,4) Int_Xferred = Int_Xferred + 2 - DO i2 = LBOUND(InData%WaveDynP,2), UBOUND(InData%WaveDynP,2) - DO i1 = LBOUND(InData%WaveDynP,1), UBOUND(InData%WaveDynP,1) - ReKiBuf(Re_Xferred) = InData%WaveDynP(i1,i2) - Re_Xferred = Re_Xferred + 1 + DO i4 = LBOUND(InData%WaveDynP,4), UBOUND(InData%WaveDynP,4) + DO i3 = LBOUND(InData%WaveDynP,3), UBOUND(InData%WaveDynP,3) + DO i2 = LBOUND(InData%WaveDynP,2), UBOUND(InData%WaveDynP,2) + DO i1 = LBOUND(InData%WaveDynP,1), UBOUND(InData%WaveDynP,1) + ReKiBuf(Re_Xferred) = InData%WaveDynP(i1,i2,i3,i4) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveVel) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveVel) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -7281,13 +7513,23 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,3) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,5) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%WaveVel,3), UBOUND(InData%WaveVel,3) - DO i2 = LBOUND(InData%WaveVel,2), UBOUND(InData%WaveVel,2) - DO i1 = LBOUND(InData%WaveVel,1), UBOUND(InData%WaveVel,1) - ReKiBuf(Re_Xferred) = InData%WaveVel(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(InData%WaveVel,5), UBOUND(InData%WaveVel,5) + DO i4 = LBOUND(InData%WaveVel,4), UBOUND(InData%WaveVel,4) + DO i3 = LBOUND(InData%WaveVel,3), UBOUND(InData%WaveVel,3) + DO i2 = LBOUND(InData%WaveVel,2), UBOUND(InData%WaveVel,2) + DO i1 = LBOUND(InData%WaveVel,1), UBOUND(InData%WaveVel,1) + ReKiBuf(Re_Xferred) = InData%WaveVel(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -7312,6 +7554,34 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E END DO END DO END IF + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_p + 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 END SUBROUTINE Morison_PackInitInput SUBROUTINE Morison_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -7330,6 +7600,8 @@ SUBROUTINE Morison_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Morison_UnPackInitInput' @@ -7351,6 +7623,8 @@ SUBROUTINE Morison_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Re_Xferred = Re_Xferred + 1 OutData%MSL2SWL = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 + OutData%WaveDisp = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 OutData%NJoints = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 OutData%NNodes = IntKiBuf(Int_Xferred) @@ -8059,6 +8333,90 @@ SUBROUTINE Morison_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Xferred = Int_Xferred + 1 OutData%NStepWave = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev)) DEALLOCATE(OutData%WaveElev) + ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev,3), UBOUND(OutData%WaveElev,3) + DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) + DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) + OutData%WaveElev(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev1)) DEALLOCATE(OutData%WaveElev1) + ALLOCATE(OutData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev1,3), UBOUND(OutData%WaveElev1,3) + DO i2 = LBOUND(OutData%WaveElev1,2), UBOUND(OutData%WaveElev1,2) + DO i1 = LBOUND(OutData%WaveElev1,1), UBOUND(OutData%WaveElev1,1) + OutData%WaveElev1(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev2 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev2)) DEALLOCATE(OutData%WaveElev2) + ALLOCATE(OutData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev2,3), UBOUND(OutData%WaveElev2,3) + DO i2 = LBOUND(OutData%WaveElev2,2), UBOUND(OutData%WaveElev2,2) + DO i1 = LBOUND(OutData%WaveElev2,1), UBOUND(OutData%WaveElev2,1) + OutData%WaveElev2(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveAcc not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -8072,17 +8430,27 @@ SUBROUTINE Morison_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveAcc)) DEALLOCATE(OutData%WaveAcc) - ALLOCATE(OutData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveAcc)) DEALLOCATE(OutData%WaveAcc) + ALLOCATE(OutData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%WaveAcc,3), UBOUND(OutData%WaveAcc,3) - DO i2 = LBOUND(OutData%WaveAcc,2), UBOUND(OutData%WaveAcc,2) - DO i1 = LBOUND(OutData%WaveAcc,1), UBOUND(OutData%WaveAcc,1) - OutData%WaveAcc(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(OutData%WaveAcc,5), UBOUND(OutData%WaveAcc,5) + DO i4 = LBOUND(OutData%WaveAcc,4), UBOUND(OutData%WaveAcc,4) + DO i3 = LBOUND(OutData%WaveAcc,3), UBOUND(OutData%WaveAcc,3) + DO i2 = LBOUND(OutData%WaveAcc,2), UBOUND(OutData%WaveAcc,2) + DO i1 = LBOUND(OutData%WaveAcc,1), UBOUND(OutData%WaveAcc,1) + OutData%WaveAcc(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -8094,7 +8462,7 @@ SUBROUTINE Morison_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -8115,16 +8483,26 @@ SUBROUTINE Morison_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat i2_l = IntKiBuf( Int_Xferred ) i2_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveDynP)) DEALLOCATE(OutData%WaveDynP) - ALLOCATE(OutData%WaveDynP(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveDynP)) DEALLOCATE(OutData%WaveDynP) + ALLOCATE(OutData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i2 = LBOUND(OutData%WaveDynP,2), UBOUND(OutData%WaveDynP,2) - DO i1 = LBOUND(OutData%WaveDynP,1), UBOUND(OutData%WaveDynP,1) - OutData%WaveDynP(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i4 = LBOUND(OutData%WaveDynP,4), UBOUND(OutData%WaveDynP,4) + DO i3 = LBOUND(OutData%WaveDynP,3), UBOUND(OutData%WaveDynP,3) + DO i2 = LBOUND(OutData%WaveDynP,2), UBOUND(OutData%WaveDynP,2) + DO i1 = LBOUND(OutData%WaveDynP,1), UBOUND(OutData%WaveDynP,1) + OutData%WaveDynP(i1,i2,i3,i4) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END IF @@ -8141,17 +8519,27 @@ SUBROUTINE Morison_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveVel)) DEALLOCATE(OutData%WaveVel) - ALLOCATE(OutData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveVel)) DEALLOCATE(OutData%WaveVel) + ALLOCATE(OutData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%WaveVel,3), UBOUND(OutData%WaveVel,3) - DO i2 = LBOUND(OutData%WaveVel,2), UBOUND(OutData%WaveVel,2) - DO i1 = LBOUND(OutData%WaveVel,1), UBOUND(OutData%WaveVel,1) - OutData%WaveVel(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(OutData%WaveVel,5), UBOUND(OutData%WaveVel,5) + DO i4 = LBOUND(OutData%WaveVel,4), UBOUND(OutData%WaveVel,4) + DO i3 = LBOUND(OutData%WaveVel,3), UBOUND(OutData%WaveVel,3) + DO i2 = LBOUND(OutData%WaveVel,2), UBOUND(OutData%WaveVel,2) + DO i1 = LBOUND(OutData%WaveVel,1), UBOUND(OutData%WaveVel,1) + OutData%WaveVel(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -8179,6 +8567,46 @@ SUBROUTINE Morison_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat END DO END DO END IF + 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 SeaSt_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_p, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_p + 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) END SUBROUTINE Morison_UnPackInitInput SUBROUTINE Morison_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) @@ -8972,6 +9400,42 @@ SUBROUTINE Morison_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg END IF DstMiscData%FDynP = SrcMiscData%FDynP ENDIF +IF (ALLOCATED(SrcMiscData%WaveElev)) THEN + i1_l = LBOUND(SrcMiscData%WaveElev,1) + i1_u = UBOUND(SrcMiscData%WaveElev,1) + IF (.NOT. ALLOCATED(DstMiscData%WaveElev)) THEN + ALLOCATE(DstMiscData%WaveElev(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstMiscData%WaveElev = SrcMiscData%WaveElev +ENDIF +IF (ALLOCATED(SrcMiscData%WaveElev1)) THEN + i1_l = LBOUND(SrcMiscData%WaveElev1,1) + i1_u = UBOUND(SrcMiscData%WaveElev1,1) + IF (.NOT. ALLOCATED(DstMiscData%WaveElev1)) THEN + ALLOCATE(DstMiscData%WaveElev1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstMiscData%WaveElev1 = SrcMiscData%WaveElev1 +ENDIF +IF (ALLOCATED(SrcMiscData%WaveElev2)) THEN + i1_l = LBOUND(SrcMiscData%WaveElev2,1) + i1_u = UBOUND(SrcMiscData%WaveElev2,1) + IF (.NOT. ALLOCATED(DstMiscData%WaveElev2)) THEN + ALLOCATE(DstMiscData%WaveElev2(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstMiscData%WaveElev2 = SrcMiscData%WaveElev2 +ENDIF IF (ALLOCATED(SrcMiscData%vrel)) THEN i1_l = LBOUND(SrcMiscData%vrel,1) i1_u = UBOUND(SrcMiscData%vrel,1) @@ -9099,6 +9563,9 @@ SUBROUTINE Morison_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg DstMiscData%F_BF_End = SrcMiscData%F_BF_End ENDIF DstMiscData%LastIndWave = SrcMiscData%LastIndWave + CALL SeaSt_Interp_CopyMisc( SrcMiscData%SeaSt_Interp_m, DstMiscData%SeaSt_Interp_m, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE Morison_CopyMisc SUBROUTINE Morison_DestroyMisc( MiscData, ErrStat, ErrMsg ) @@ -9119,6 +9586,15 @@ SUBROUTINE Morison_DestroyMisc( MiscData, ErrStat, ErrMsg ) IF (ALLOCATED(MiscData%FDynP)) THEN DEALLOCATE(MiscData%FDynP) ENDIF +IF (ALLOCATED(MiscData%WaveElev)) THEN + DEALLOCATE(MiscData%WaveElev) +ENDIF +IF (ALLOCATED(MiscData%WaveElev1)) THEN + DEALLOCATE(MiscData%WaveElev1) +ENDIF +IF (ALLOCATED(MiscData%WaveElev2)) THEN + DEALLOCATE(MiscData%WaveElev2) +ENDIF IF (ALLOCATED(MiscData%vrel)) THEN DEALLOCATE(MiscData%vrel) ENDIF @@ -9149,6 +9625,7 @@ SUBROUTINE Morison_DestroyMisc( MiscData, ErrStat, ErrMsg ) IF (ALLOCATED(MiscData%F_BF_End)) THEN DEALLOCATE(MiscData%F_BF_End) ENDIF + CALL SeaSt_Interp_DestroyMisc( MiscData%SeaSt_Interp_m, ErrStat, ErrMsg ) END SUBROUTINE Morison_DestroyMisc SUBROUTINE Morison_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -9201,6 +9678,21 @@ SUBROUTINE Morison_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Int_BufSz = Int_BufSz + 2*1 ! FDynP upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%FDynP) ! FDynP END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no + IF ( ALLOCATED(InData%WaveElev) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveElev upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no + IF ( ALLOCATED(InData%WaveElev1) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveElev1 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev1) ! WaveElev1 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev2 allocated yes/no + IF ( ALLOCATED(InData%WaveElev2) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveElev2 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev2) ! WaveElev2 + END IF Int_BufSz = Int_BufSz + 1 ! vrel allocated yes/no IF ( ALLOCATED(InData%vrel) ) THEN Int_BufSz = Int_BufSz + 2*2 ! vrel upper/lower bounds for each dimension @@ -9266,13 +9758,30 @@ SUBROUTINE Morison_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Re_BufSz = Re_BufSz + SIZE(InData%F_BF_End) ! F_BF_End END IF Int_BufSz = Int_BufSz + 1 ! LastIndWave - 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 + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_m: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_m, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_m + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_m + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_m + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_m + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + 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 @@ -9348,6 +9857,51 @@ SUBROUTINE Morison_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Re_Xferred = Re_Xferred + 1 END DO END IF + IF ( .NOT. ALLOCATED(InData%WaveElev) ) 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%WaveElev,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) + ReKiBuf(Re_Xferred) = InData%WaveElev(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveElev1) ) 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%WaveElev1,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveElev1,1), UBOUND(InData%WaveElev1,1) + ReKiBuf(Re_Xferred) = InData%WaveElev1(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveElev2) ) 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%WaveElev2,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveElev2,1), UBOUND(InData%WaveElev2,1) + ReKiBuf(Re_Xferred) = InData%WaveElev2(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF IF ( .NOT. ALLOCATED(InData%vrel) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -9546,6 +10100,34 @@ SUBROUTINE Morison_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg END IF IntKiBuf(Int_Xferred) = InData%LastIndWave Int_Xferred = Int_Xferred + 1 + CALL SeaSt_Interp_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_m, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_m + 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 END SUBROUTINE Morison_PackMisc SUBROUTINE Morison_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -9640,6 +10222,60 @@ SUBROUTINE Morison_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err Re_Xferred = Re_Xferred + 1 END DO END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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 + IF (ALLOCATED(OutData%WaveElev)) DEALLOCATE(OutData%WaveElev) + ALLOCATE(OutData%WaveElev(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) + OutData%WaveElev(i1) = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 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 + IF (ALLOCATED(OutData%WaveElev1)) DEALLOCATE(OutData%WaveElev1) + ALLOCATE(OutData%WaveElev1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveElev1,1), UBOUND(OutData%WaveElev1,1) + OutData%WaveElev1(i1) = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev2 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 + IF (ALLOCATED(OutData%WaveElev2)) DEALLOCATE(OutData%WaveElev2) + ALLOCATE(OutData%WaveElev2(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveElev2,1), UBOUND(OutData%WaveElev2,1) + OutData%WaveElev2(i1) = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! vrel not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -9877,6 +10513,46 @@ SUBROUTINE Morison_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err END IF OutData%LastIndWave = IntKiBuf(Int_Xferred) 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 SeaSt_Interp_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_m, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_m + 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) END SUBROUTINE Morison_UnPackMisc SUBROUTINE Morison_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) @@ -9890,6 +10566,8 @@ SUBROUTINE Morison_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Err 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Morison_CopyParam' @@ -9901,6 +10579,7 @@ SUBROUTINE Morison_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Err DstParamData%WtrDens = SrcParamData%WtrDens DstParamData%WtrDpth = SrcParamData%WtrDpth DstParamData%MSL2SWL = SrcParamData%MSL2SWL + DstParamData%WaveDisp = SrcParamData%WaveDisp DstParamData%NMembers = SrcParamData%NMembers IF (ALLOCATED(SrcParamData%Members)) THEN i1_l = LBOUND(SrcParamData%Members,1) @@ -10018,15 +10697,67 @@ SUBROUTINE Morison_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Err END IF DstParamData%AM_End = SrcParamData%AM_End ENDIF -IF (ALLOCATED(SrcParamData%WaveVel)) THEN +IF (ASSOCIATED(SrcParamData%WaveElev)) THEN + i1_l = LBOUND(SrcParamData%WaveElev,1) + i1_u = UBOUND(SrcParamData%WaveElev,1) + i2_l = LBOUND(SrcParamData%WaveElev,2) + i2_u = UBOUND(SrcParamData%WaveElev,2) + i3_l = LBOUND(SrcParamData%WaveElev,3) + i3_u = UBOUND(SrcParamData%WaveElev,3) + IF (.NOT. ASSOCIATED(DstParamData%WaveElev)) THEN + ALLOCATE(DstParamData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveElev = SrcParamData%WaveElev +ENDIF +IF (ASSOCIATED(SrcParamData%WaveElev1)) THEN + i1_l = LBOUND(SrcParamData%WaveElev1,1) + i1_u = UBOUND(SrcParamData%WaveElev1,1) + i2_l = LBOUND(SrcParamData%WaveElev1,2) + i2_u = UBOUND(SrcParamData%WaveElev1,2) + i3_l = LBOUND(SrcParamData%WaveElev1,3) + i3_u = UBOUND(SrcParamData%WaveElev1,3) + IF (.NOT. ASSOCIATED(DstParamData%WaveElev1)) THEN + ALLOCATE(DstParamData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveElev1 = SrcParamData%WaveElev1 +ENDIF +IF (ASSOCIATED(SrcParamData%WaveElev2)) THEN + i1_l = LBOUND(SrcParamData%WaveElev2,1) + i1_u = UBOUND(SrcParamData%WaveElev2,1) + i2_l = LBOUND(SrcParamData%WaveElev2,2) + i2_u = UBOUND(SrcParamData%WaveElev2,2) + i3_l = LBOUND(SrcParamData%WaveElev2,3) + i3_u = UBOUND(SrcParamData%WaveElev2,3) + IF (.NOT. ASSOCIATED(DstParamData%WaveElev2)) THEN + ALLOCATE(DstParamData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveElev2 = SrcParamData%WaveElev2 +ENDIF +IF (ASSOCIATED(SrcParamData%WaveVel)) THEN i1_l = LBOUND(SrcParamData%WaveVel,1) i1_u = UBOUND(SrcParamData%WaveVel,1) i2_l = LBOUND(SrcParamData%WaveVel,2) i2_u = UBOUND(SrcParamData%WaveVel,2) i3_l = LBOUND(SrcParamData%WaveVel,3) i3_u = UBOUND(SrcParamData%WaveVel,3) - IF (.NOT. ALLOCATED(DstParamData%WaveVel)) THEN - ALLOCATE(DstParamData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = LBOUND(SrcParamData%WaveVel,4) + i4_u = UBOUND(SrcParamData%WaveVel,4) + i5_l = LBOUND(SrcParamData%WaveVel,5) + i5_u = UBOUND(SrcParamData%WaveVel,5) + IF (.NOT. ASSOCIATED(DstParamData%WaveVel)) THEN + ALLOCATE(DstParamData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveVel.', ErrStat, ErrMsg,RoutineName) RETURN @@ -10034,15 +10765,19 @@ SUBROUTINE Morison_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Err END IF DstParamData%WaveVel = SrcParamData%WaveVel ENDIF -IF (ALLOCATED(SrcParamData%WaveAcc)) THEN +IF (ASSOCIATED(SrcParamData%WaveAcc)) THEN i1_l = LBOUND(SrcParamData%WaveAcc,1) i1_u = UBOUND(SrcParamData%WaveAcc,1) i2_l = LBOUND(SrcParamData%WaveAcc,2) i2_u = UBOUND(SrcParamData%WaveAcc,2) i3_l = LBOUND(SrcParamData%WaveAcc,3) i3_u = UBOUND(SrcParamData%WaveAcc,3) - IF (.NOT. ALLOCATED(DstParamData%WaveAcc)) THEN - ALLOCATE(DstParamData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = LBOUND(SrcParamData%WaveAcc,4) + i4_u = UBOUND(SrcParamData%WaveAcc,4) + i5_l = LBOUND(SrcParamData%WaveAcc,5) + i5_u = UBOUND(SrcParamData%WaveAcc,5) + IF (.NOT. ASSOCIATED(DstParamData%WaveAcc)) THEN + ALLOCATE(DstParamData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveAcc.', ErrStat, ErrMsg,RoutineName) RETURN @@ -10050,13 +10785,17 @@ SUBROUTINE Morison_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Err END IF DstParamData%WaveAcc = SrcParamData%WaveAcc ENDIF -IF (ALLOCATED(SrcParamData%WaveDynP)) THEN +IF (ASSOCIATED(SrcParamData%WaveDynP)) THEN i1_l = LBOUND(SrcParamData%WaveDynP,1) i1_u = UBOUND(SrcParamData%WaveDynP,1) i2_l = LBOUND(SrcParamData%WaveDynP,2) i2_u = UBOUND(SrcParamData%WaveDynP,2) - IF (.NOT. ALLOCATED(DstParamData%WaveDynP)) THEN - ALLOCATE(DstParamData%WaveDynP(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + i3_l = LBOUND(SrcParamData%WaveDynP,3) + i3_u = UBOUND(SrcParamData%WaveDynP,3) + i4_l = LBOUND(SrcParamData%WaveDynP,4) + i4_u = UBOUND(SrcParamData%WaveDynP,4) + IF (.NOT. ASSOCIATED(DstParamData%WaveDynP)) THEN + ALLOCATE(DstParamData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveDynP.', ErrStat, ErrMsg,RoutineName) RETURN @@ -10064,10 +10803,10 @@ SUBROUTINE Morison_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Err END IF DstParamData%WaveDynP = SrcParamData%WaveDynP ENDIF -IF (ALLOCATED(SrcParamData%WaveTime)) THEN +IF (ASSOCIATED(SrcParamData%WaveTime)) THEN i1_l = LBOUND(SrcParamData%WaveTime,1) i1_u = UBOUND(SrcParamData%WaveTime,1) - IF (.NOT. ALLOCATED(DstParamData%WaveTime)) THEN + IF (.NOT. ASSOCIATED(DstParamData%WaveTime)) THEN ALLOCATE(DstParamData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -10148,6 +10887,9 @@ SUBROUTINE Morison_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Err DstParamData%OutFmt = SrcParamData%OutFmt DstParamData%OutSFmt = SrcParamData%OutSFmt DstParamData%Delim = SrcParamData%Delim + CALL SeaSt_Interp_CopyParam( SrcParamData%SeaSt_Interp_p, DstParamData%SeaSt_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE Morison_CopyParam SUBROUTINE Morison_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -10186,17 +10928,33 @@ SUBROUTINE Morison_DestroyParam( ParamData, ErrStat, ErrMsg ) IF (ALLOCATED(ParamData%AM_End)) THEN DEALLOCATE(ParamData%AM_End) ENDIF -IF (ALLOCATED(ParamData%WaveVel)) THEN +IF (ASSOCIATED(ParamData%WaveElev)) THEN + DEALLOCATE(ParamData%WaveElev) + ParamData%WaveElev => NULL() +ENDIF +IF (ASSOCIATED(ParamData%WaveElev1)) THEN + DEALLOCATE(ParamData%WaveElev1) + ParamData%WaveElev1 => NULL() +ENDIF +IF (ASSOCIATED(ParamData%WaveElev2)) THEN + DEALLOCATE(ParamData%WaveElev2) + ParamData%WaveElev2 => NULL() +ENDIF +IF (ASSOCIATED(ParamData%WaveVel)) THEN DEALLOCATE(ParamData%WaveVel) + ParamData%WaveVel => NULL() ENDIF -IF (ALLOCATED(ParamData%WaveAcc)) THEN +IF (ASSOCIATED(ParamData%WaveAcc)) THEN DEALLOCATE(ParamData%WaveAcc) + ParamData%WaveAcc => NULL() ENDIF -IF (ALLOCATED(ParamData%WaveDynP)) THEN +IF (ASSOCIATED(ParamData%WaveDynP)) THEN DEALLOCATE(ParamData%WaveDynP) + ParamData%WaveDynP => NULL() ENDIF -IF (ALLOCATED(ParamData%WaveTime)) THEN +IF (ASSOCIATED(ParamData%WaveTime)) THEN DEALLOCATE(ParamData%WaveTime) + ParamData%WaveTime => NULL() ENDIF IF (ALLOCATED(ParamData%nodeInWater)) THEN DEALLOCATE(ParamData%nodeInWater) @@ -10219,6 +10977,7 @@ SUBROUTINE Morison_DestroyParam( ParamData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(ParamData%OutParam) ENDIF + CALL SeaSt_Interp_DestroyParam( ParamData%SeaSt_Interp_p, ErrStat, ErrMsg ) END SUBROUTINE Morison_DestroyParam SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -10261,6 +11020,7 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Re_BufSz = Re_BufSz + 1 ! WtrDens Re_BufSz = Re_BufSz + 1 ! WtrDpth Re_BufSz = Re_BufSz + 1 ! MSL2SWL + Int_BufSz = Int_BufSz + 1 ! WaveDisp Int_BufSz = Int_BufSz + 1 ! NMembers Int_BufSz = Int_BufSz + 1 ! Members allocated yes/no IF ( ALLOCATED(InData%Members) ) THEN @@ -10323,23 +11083,38 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 2*3 ! AM_End upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%AM_End) ! AM_End END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no + IF ( ASSOCIATED(InData%WaveElev) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev1) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev1) ! WaveElev1 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev2 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev2) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev2 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev2) ! WaveElev2 + END IF Int_BufSz = Int_BufSz + 1 ! WaveVel allocated yes/no - IF ( ALLOCATED(InData%WaveVel) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveVel upper/lower bounds for each dimension + IF ( ASSOCIATED(InData%WaveVel) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveVel upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveVel) ! WaveVel END IF Int_BufSz = Int_BufSz + 1 ! WaveAcc allocated yes/no - IF ( ALLOCATED(InData%WaveAcc) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveAcc upper/lower bounds for each dimension + IF ( ASSOCIATED(InData%WaveAcc) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveAcc upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveAcc) ! WaveAcc END IF Int_BufSz = Int_BufSz + 1 ! WaveDynP allocated yes/no - IF ( ALLOCATED(InData%WaveDynP) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! WaveDynP upper/lower bounds for each dimension + IF ( ASSOCIATED(InData%WaveDynP) ) THEN + Int_BufSz = Int_BufSz + 2*4 ! WaveDynP upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveDynP) ! WaveDynP END IF Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN + IF ( ASSOCIATED(InData%WaveTime) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime END IF @@ -10427,6 +11202,23 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 1*LEN(InData%OutFmt) ! OutFmt Int_BufSz = Int_BufSz + 1*LEN(InData%OutSFmt) ! OutSFmt Int_BufSz = Int_BufSz + 1*LEN(InData%Delim) ! Delim + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_p: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -10464,6 +11256,8 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Re_Xferred = Re_Xferred + 1 ReKiBuf(Re_Xferred) = InData%MSL2SWL Re_Xferred = Re_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%WaveDisp + Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NMembers Int_Xferred = Int_Xferred + 1 IF ( .NOT. ALLOCATED(InData%Members) ) THEN @@ -10651,7 +11445,82 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveVel) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveElev) ) 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%WaveElev,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev,3), UBOUND(InData%WaveElev,3) + DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) + DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) + ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) 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%WaveElev1,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev1,3), UBOUND(InData%WaveElev1,3) + DO i2 = LBOUND(InData%WaveElev1,2), UBOUND(InData%WaveElev1,2) + DO i1 = LBOUND(InData%WaveElev1,1), UBOUND(InData%WaveElev1,1) + ReKiBuf(Re_Xferred) = InData%WaveElev1(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev2) ) 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%WaveElev2,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev2,3), UBOUND(InData%WaveElev2,3) + DO i2 = LBOUND(InData%WaveElev2,2), UBOUND(InData%WaveElev2,2) + DO i1 = LBOUND(InData%WaveElev2,1), UBOUND(InData%WaveElev2,1) + ReKiBuf(Re_Xferred) = InData%WaveElev2(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveVel) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -10665,18 +11534,28 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,3) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,5) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%WaveVel,3), UBOUND(InData%WaveVel,3) - DO i2 = LBOUND(InData%WaveVel,2), UBOUND(InData%WaveVel,2) - DO i1 = LBOUND(InData%WaveVel,1), UBOUND(InData%WaveVel,1) - ReKiBuf(Re_Xferred) = InData%WaveVel(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(InData%WaveVel,5), UBOUND(InData%WaveVel,5) + DO i4 = LBOUND(InData%WaveVel,4), UBOUND(InData%WaveVel,4) + DO i3 = LBOUND(InData%WaveVel,3), UBOUND(InData%WaveVel,3) + DO i2 = LBOUND(InData%WaveVel,2), UBOUND(InData%WaveVel,2) + DO i1 = LBOUND(InData%WaveVel,1), UBOUND(InData%WaveVel,1) + ReKiBuf(Re_Xferred) = InData%WaveVel(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveAcc) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveAcc) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -10690,18 +11569,28 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,3) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,5) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%WaveAcc,3), UBOUND(InData%WaveAcc,3) - DO i2 = LBOUND(InData%WaveAcc,2), UBOUND(InData%WaveAcc,2) - DO i1 = LBOUND(InData%WaveAcc,1), UBOUND(InData%WaveAcc,1) - ReKiBuf(Re_Xferred) = InData%WaveAcc(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(InData%WaveAcc,5), UBOUND(InData%WaveAcc,5) + DO i4 = LBOUND(InData%WaveAcc,4), UBOUND(InData%WaveAcc,4) + DO i3 = LBOUND(InData%WaveAcc,3), UBOUND(InData%WaveAcc,3) + DO i2 = LBOUND(InData%WaveAcc,2), UBOUND(InData%WaveAcc,2) + DO i1 = LBOUND(InData%WaveAcc,1), UBOUND(InData%WaveAcc,1) + ReKiBuf(Re_Xferred) = InData%WaveAcc(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveDynP) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveDynP) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -10712,16 +11601,26 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_Xferred = Int_Xferred + 2 IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,2) IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,4) Int_Xferred = Int_Xferred + 2 - DO i2 = LBOUND(InData%WaveDynP,2), UBOUND(InData%WaveDynP,2) - DO i1 = LBOUND(InData%WaveDynP,1), UBOUND(InData%WaveDynP,1) - ReKiBuf(Re_Xferred) = InData%WaveDynP(i1,i2) - Re_Xferred = Re_Xferred + 1 + DO i4 = LBOUND(InData%WaveDynP,4), UBOUND(InData%WaveDynP,4) + DO i3 = LBOUND(InData%WaveDynP,3), UBOUND(InData%WaveDynP,3) + DO i2 = LBOUND(InData%WaveDynP,2), UBOUND(InData%WaveDynP,2) + DO i1 = LBOUND(InData%WaveDynP,1), UBOUND(InData%WaveDynP,1) + ReKiBuf(Re_Xferred) = InData%WaveDynP(i1,i2,i3,i4) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveTime) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -10905,6 +11804,34 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs IntKiBuf(Int_Xferred) = ICHAR(InData%Delim(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_p + 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 END SUBROUTINE Morison_PackParam SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -10923,6 +11850,8 @@ SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'Morison_UnPackParam' @@ -10946,6 +11875,8 @@ SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = Re_Xferred + 1 OutData%MSL2SWL = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 + OutData%WaveDisp = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 OutData%NMembers = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Members not allocated @@ -11169,6 +12100,90 @@ SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er END DO END DO END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev)) DEALLOCATE(OutData%WaveElev) + ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev,3), UBOUND(OutData%WaveElev,3) + DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) + DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) + OutData%WaveElev(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev1)) DEALLOCATE(OutData%WaveElev1) + ALLOCATE(OutData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev1,3), UBOUND(OutData%WaveElev1,3) + DO i2 = LBOUND(OutData%WaveElev1,2), UBOUND(OutData%WaveElev1,2) + DO i1 = LBOUND(OutData%WaveElev1,1), UBOUND(OutData%WaveElev1,1) + OutData%WaveElev1(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev2 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev2)) DEALLOCATE(OutData%WaveElev2) + ALLOCATE(OutData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev2,3), UBOUND(OutData%WaveElev2,3) + DO i2 = LBOUND(OutData%WaveElev2,2), UBOUND(OutData%WaveElev2,2) + DO i1 = LBOUND(OutData%WaveElev2,1), UBOUND(OutData%WaveElev2,1) + OutData%WaveElev2(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveVel not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -11182,17 +12197,27 @@ SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveVel)) DEALLOCATE(OutData%WaveVel) - ALLOCATE(OutData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveVel)) DEALLOCATE(OutData%WaveVel) + ALLOCATE(OutData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%WaveVel,3), UBOUND(OutData%WaveVel,3) - DO i2 = LBOUND(OutData%WaveVel,2), UBOUND(OutData%WaveVel,2) - DO i1 = LBOUND(OutData%WaveVel,1), UBOUND(OutData%WaveVel,1) - OutData%WaveVel(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(OutData%WaveVel,5), UBOUND(OutData%WaveVel,5) + DO i4 = LBOUND(OutData%WaveVel,4), UBOUND(OutData%WaveVel,4) + DO i3 = LBOUND(OutData%WaveVel,3), UBOUND(OutData%WaveVel,3) + DO i2 = LBOUND(OutData%WaveVel,2), UBOUND(OutData%WaveVel,2) + DO i1 = LBOUND(OutData%WaveVel,1), UBOUND(OutData%WaveVel,1) + OutData%WaveVel(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -11210,17 +12235,27 @@ SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveAcc)) DEALLOCATE(OutData%WaveAcc) - ALLOCATE(OutData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveAcc)) DEALLOCATE(OutData%WaveAcc) + ALLOCATE(OutData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%WaveAcc,3), UBOUND(OutData%WaveAcc,3) - DO i2 = LBOUND(OutData%WaveAcc,2), UBOUND(OutData%WaveAcc,2) - DO i1 = LBOUND(OutData%WaveAcc,1), UBOUND(OutData%WaveAcc,1) - OutData%WaveAcc(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i5 = LBOUND(OutData%WaveAcc,5), UBOUND(OutData%WaveAcc,5) + DO i4 = LBOUND(OutData%WaveAcc,4), UBOUND(OutData%WaveAcc,4) + DO i3 = LBOUND(OutData%WaveAcc,3), UBOUND(OutData%WaveAcc,3) + DO i2 = LBOUND(OutData%WaveAcc,2), UBOUND(OutData%WaveAcc,2) + DO i1 = LBOUND(OutData%WaveAcc,1), UBOUND(OutData%WaveAcc,1) + OutData%WaveAcc(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END DO @@ -11235,16 +12270,26 @@ SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er i2_l = IntKiBuf( Int_Xferred ) i2_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveDynP)) DEALLOCATE(OutData%WaveDynP) - ALLOCATE(OutData%WaveDynP(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveDynP)) DEALLOCATE(OutData%WaveDynP) + ALLOCATE(OutData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i2 = LBOUND(OutData%WaveDynP,2), UBOUND(OutData%WaveDynP,2) - DO i1 = LBOUND(OutData%WaveDynP,1), UBOUND(OutData%WaveDynP,1) - OutData%WaveDynP(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 + DO i4 = LBOUND(OutData%WaveDynP,4), UBOUND(OutData%WaveDynP,4) + DO i3 = LBOUND(OutData%WaveDynP,3), UBOUND(OutData%WaveDynP,3) + DO i2 = LBOUND(OutData%WaveDynP,2), UBOUND(OutData%WaveDynP,2) + DO i1 = LBOUND(OutData%WaveDynP,1), UBOUND(OutData%WaveDynP,1) + OutData%WaveDynP(i1,i2,i3,i4) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END DO END IF @@ -11255,7 +12300,7 @@ SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -11483,6 +12528,46 @@ SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er OutData%Delim(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I + 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 SeaSt_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_p, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_p + 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) END SUBROUTINE Morison_UnPackParam SUBROUTINE Morison_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) diff --git a/modules/hydrodyn/src/SS_Excitation.f90 b/modules/hydrodyn/src/SS_Excitation.f90 index 5af0dd457c..b8733d8ad8 100644 --- a/modules/hydrodyn/src/SS_Excitation.f90 +++ b/modules/hydrodyn/src/SS_Excitation.f90 @@ -20,7 +20,7 @@ ! !********************************************************************************************************************************** MODULE SS_Excitation - + USE SeaState_Interp USE SS_Excitation_Types USE NWTC_Library @@ -77,7 +77,37 @@ subroutine TransformStateSpaceMatrices( NBody, RotZ, C ) end do end subroutine TransformStateSpaceMatrices + +function GetWaveElevation ( time, u_in, t_in, p, m, ErrStat, ErrMsg ) + real(DbKi), intent(in) :: time + TYPE(SS_Exc_InputType), INTENT(IN) :: u_in(:) ! Input at t1 > t2 > t3 + real(DbKi), intent(in) :: t_in(:) + TYPE(SS_Exc_ParameterType), INTENT(in) :: p !< Parameters + TYPE(SS_Exc_MiscVarType), INTENT(inout) :: m !< Initial misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + real(ReKi) :: positionXY(2) + + real(SiKi) :: GetWaveElevation(p%NBody) + TYPE(SS_Exc_InputType) :: u_out ! extra_interp result + integer :: iBody + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + + + if (p%ExctnDisp == 0) then + GetWaveElevation = InterpWrappedStpReal ( real(time, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) + else + + call SS_Exc_Input_ExtrapInterp(u_in, t_in, u_out, time, ErrStat, ErrMsg ) + do iBody = 1, p%NBody + GetWaveElevation(:) = SeaSt_Interp_3D( time, u_out%PtfmPos(1:2,iBody), p%WaveElev1, p%SeaSt_interp_p, ErrStat, ErrMsg ) + end do + ! call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + end if +end function GetWaveElevation !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the start of the simulation to perform initialization steps. !! The parameters are set here and not changed during the simulation. @@ -85,7 +115,7 @@ end subroutine TransformStateSpaceMatrices SUBROUTINE SS_Exc_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) !.................................................................................................................................. - TYPE(SS_Exc_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization routine + TYPE(SS_Exc_InitInputType), INTENT(INOUT) :: InitInp !< Input data for initialization routine TYPE(SS_Exc_InputType), INTENT( OUT) :: u !< An initial guess for the input; input mesh must be defined TYPE(SS_Exc_ParameterType), INTENT( OUT) :: p !< Parameters TYPE(SS_Exc_ContinuousStateType), INTENT( OUT) :: x !< Initial continuous states @@ -119,13 +149,13 @@ SUBROUTINE SS_Exc_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Ini ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" - - u%DummyInput = 0.0_ReKi + Allocate(u%PtfmPos(3,InitInp%NBody), Stat= ErrStat) + u%PtfmPos = 0.0_ReKi UnSS = -1 - p%numStates = 0 - p%NBody = InitInp%NBody ! Number of WAMIT bodies: =1 if WAMIT is using NBodyMod > 1, >=1 if NBodyMod=1 - + p%numStates = 0 + p%NBody = InitInp%NBody ! Number of WAMIT bodies: =1 if WAMIT is using NBodyMod > 1, >=1 if NBodyMod=1 + ! Open the .ss input file! CALL GetNewUnit( UnSS ) CALL OpenFInpFile ( UnSS, TRIM(InitInp%InputFile)//'.ssexctn', ErrStat2, ErrMsg2 ) ! Open file. @@ -152,7 +182,8 @@ SUBROUTINE SS_Exc_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Ini CALL ReadVar( UnSS,TRIM(InitInp%InputFile)//'.ssexctn', p%numStates, 'p%numStates', 'Number of states',ErrStat2, ErrMsg2) ! Reads in the third line, containing the number of states CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SS_Exc_Init') - + + call AllocAry( p%spdof, 6*p%NBody, 'p%spdof', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SS_Rad_Init') CALL ReadAry( UnSS,TRIM(InitInp%InputFile)//'.ssexctn', p%spDOF, 6*p%NBody, 'p%spDOF', 'States per DOF',ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SS_Exc_Init') @@ -232,23 +263,29 @@ SUBROUTINE SS_Exc_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Ini ! Allocate Wave-elevation related arrays p%NStepWave = InitInp%NStepWave - allocate ( p%WaveElev0(0:p%NStepWave) , STAT=ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,'Error allocating p%WaveElev0 array',ErrStat,ErrMsg,'SS_Exc_Init') - end if - allocate ( p%WaveTime (0:p%NStepWave) , STAT=ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,'Error allocating p%WaveTime array',ErrStat,ErrMsg,'SS_Exc_Init') + !allocate ( p%WaveElev0(0:p%NStepWave) , STAT=ErrStat2 ) + !IF (ErrStat2 /= 0) THEN + ! CALL SetErrStat(ErrID_Fatal,'Error allocating p%WaveElev0 array',ErrStat,ErrMsg,'SS_Exc_Init') + !end if + !allocate ( p%WaveTime (0:p%NStepWave) , STAT=ErrStat2 ) + !IF (ErrStat2 /= 0) THEN + ! CALL SetErrStat(ErrID_Fatal,'Error allocating p%WaveTime array',ErrStat,ErrMsg,'SS_Exc_Init') + !end if + ! + !IF (ErrStat >= AbortErrLev) THEN + ! CALL CleanUp() + ! RETURN + !END IF + p%SeaSt_Interp_p = InitInp%SeaSt_Interp_p + p%ExctnDisp = InitInp%ExctnDisp + p%WaveTime => InitInp%WaveTime + p%ExctnDisp = InitInp%ExctnDisp + if (p%ExctnDisp == 0) then + call MOVE_ALLOC(InitInp%WaveElev0, p%WaveElev0) + else + p%WaveElev1 => InitInp%WaveElev1 end if - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - p%WaveTime = InitInp%WaveTime - p%WaveElev0 = InitInp%WaveElev0 - ! Define initial system states here: CALL AllocAry( x%x, p%numStates, 'x%x', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SS_Exc_Init') @@ -334,7 +371,8 @@ SUBROUTINE SS_Exc_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! Destroy the parameter data: - + nullify(p%WaveElev1) + nullify(p%WaveTime) CALL SS_Exc_DestroyParam( p, ErrStat, ErrMsg ) @@ -387,15 +425,15 @@ SUBROUTINE SS_Exc_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherStat CASE (1) ! RK4 - CALL SS_Exc_RK4( t, n, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) + CALL SS_Exc_RK4( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) CASE (2) ! AB4 - CALL SS_Exc_AB4( t, n, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) + CALL SS_Exc_AB4( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) CASE (3) ! ABM4 - CALL SS_Exc_ABM4( t, n, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) + CALL SS_Exc_ABM4( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) CASE DEFAULT !bjj: we already checked this at initialization, but for completeness: @@ -446,7 +484,7 @@ SUBROUTINE SS_Exc_CalcContStateDeriv( Time, waveElev0, p, x, xd, z, OtherState, !.................................................................................................................................. REAL(DbKi), INTENT(IN ) :: Time !< Current simulation time in seconds - REAL(SiKi), INTENT(IN ) :: waveElev0 !< Wave elevation at origin at time: Time (m) + REAL(SiKi), INTENT(IN ) :: waveElev0(:) !< Wave elevation at origin at time: Time (m) TYPE(SS_Exc_ParameterType), INTENT(IN ) :: p !< Parameters TYPE(SS_Exc_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time TYPE(SS_Exc_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at Time @@ -457,6 +495,8 @@ SUBROUTINE SS_Exc_CalcContStateDeriv( Time, waveElev0, p, x, xd, z, OtherState, INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + real(SiKi) :: Bwave(p%numStates) + integer(IntKi) :: i, iBody, spbody, count, iStart ! Initialize ErrStat ErrStat = ErrID_None @@ -470,8 +510,21 @@ SUBROUTINE SS_Exc_CalcContStateDeriv( Time, waveElev0, p, x, xd, z, OtherState, !Calc dxdt of a state space system ! [dxdt] = [A]*[xr]+B*[q] - - dxdt%x =matmul(p%A,x%x) + p%B * waveElev0 + spbody = 0 + count = 1 + iStart = 1 + do iBody=1,p%NBody + spbody = 0 + do i = 1,6 + spbody = spbody + p%spdof(count) + count = count + 1 + end do + + Bwave(iStart:iStart+spbody-1) = p%B(iStart:iStart+spbody-1)*waveElev0(iBody) + iStart = iStart + spBody + end do + + dxdt%x =matmul(p%A,x%x) + Bwave END SUBROUTINE SS_Exc_CalcContStateDeriv !---------------------------------------------------------------------------------------------------------------------------------- @@ -549,12 +602,13 @@ END SUBROUTINE SS_Exc_CalcConstrStateResidual !! Runge-Kutta." �16.1 and 16.2 in Numerical Recipes in FORTRAN: The Art of Scientific Computing, 2nd ed. Cambridge, England: !! Cambridge University Press, pp. 704-716, 1992. !! -SUBROUTINE SS_Exc_RK4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +SUBROUTINE SS_Exc_RK4( t, n, Inputs, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) !.................................................................................................................................. REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds INTEGER(IntKi), INTENT(IN ) :: n !< time step number REAL(DbKi), INTENT(IN ) :: utimes(:) !< times of input + TYPE(SS_Exc_InputType), INTENT(INOUT) :: Inputs(:) !< Inputs at InputTimes TYPE(SS_Exc_ParameterType), INTENT(IN ) :: p !< Parameters TYPE(SS_Exc_ContinuousStateType), INTENT(INOUT) :: x !< Continuous states at t on input at t + dt on output TYPE(SS_Exc_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at t @@ -572,7 +626,7 @@ SUBROUTINE SS_Exc_RK4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg TYPE(SS_Exc_ContinuousStateType) :: k3 ! RK4 constant; see above TYPE(SS_Exc_ContinuousStateType) :: k4 ! RK4 constant; see above TYPE(SS_Exc_ContinuousStateType) :: x_tmp ! Holds temporary modification to x - real(SiKi) :: waveElev0 ! interpolated value of the wave elevation at the origin + real(SiKi) :: waveElev0(p%NBody) ! interpolated value of the wave elevation at the origin INTEGER(IntKi) :: ErrStat2 ! local error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message (ErrMsg) @@ -594,8 +648,11 @@ SUBROUTINE SS_Exc_RK4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg IF ( ErrStat >= AbortErrLev ) RETURN ! find waveElev0 for time, t+p%Tc - - waveElev0 = InterpWrappedStpReal ( REAL(t+p%Tc, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) + !TODO: Replace with function call which extracts the correct form of wave elevation based on ExctnDisp, etc. + waveElev0 = GetWaveElevation( t+p%Tc, Inputs, utimes, p, m, ErrStat2, ErrMsg2 ) + CALL CheckError(ErrStat2,ErrMsg2) + IF ( ErrStat >= AbortErrLev ) RETURN + !waveElev0 = InterpWrappedStpReal ( REAL(t+p%Tc, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) ! find xdot at t CALL SS_Exc_CalcContStateDeriv( t, waveElev0, p, x, xd, z, OtherState, m, xdot, ErrStat2, ErrMsg2 ) CALL CheckError(ErrStat2,ErrMsg2) @@ -605,7 +662,11 @@ SUBROUTINE SS_Exc_RK4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg x_tmp%x = x%x + 0.5 * k1%x ! find waveElev0 for time, t + p%Tc + dt/2 - waveElev0 = InterpWrappedStpReal ( REAL(t+p%Tc+p%DT/2.0, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) + !TODO: Replace with function call which extracts the correct form of wave elevation based on ExctnDisp, etc. + waveElev0 = GetWaveElevation( t+p%Tc+p%DT/2.0, Inputs, utimes, p, m, ErrStat2, ErrMsg2 ) + CALL CheckError(ErrStat2,ErrMsg2) + IF ( ErrStat >= AbortErrLev ) RETURN + !waveElev0 = InterpWrappedStpReal ( REAL(t+p%Tc+p%DT/2.0, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) ! find xdot at t + dt/2 CALL SS_Exc_CalcContStateDeriv( t + 0.5*p%dt, waveElev0, p, x_tmp, xd, z, OtherState, m, xdot, ErrStat2, ErrMsg2 ) @@ -624,7 +685,11 @@ SUBROUTINE SS_Exc_RK4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg x_tmp%x = x%x + k3%x ! find waveElev0 for time, (t + p%Tc + dt) - waveElev0 = InterpWrappedStpReal ( REAL(t+p%Tc+p%DT, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) + !TODO: Replace with function call which extracts the correct form of wave elevation based on ExctnDisp, etc. + waveElev0 = GetWaveElevation( t+p%Tc+p%DT, Inputs, utimes, p, m, ErrStat2, ErrMsg2 ) + CALL CheckError(ErrStat2,ErrMsg2) + IF ( ErrStat >= AbortErrLev ) RETURN + !waveElev0 = InterpWrappedStpReal ( REAL(t+p%Tc+p%DT, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) ! find xdot at t + dt @@ -708,12 +773,13 @@ END SUBROUTINE SS_Exc_RK4 !! !! K. E. Atkinson, "An Introduction to Numerical Analysis", 1989, John Wiley & Sons, Inc, Second Edition. !! -SUBROUTINE SS_Exc_AB4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +SUBROUTINE SS_Exc_AB4( t, n, Inputs, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) !.................................................................................................................................. REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds INTEGER(IntKi), INTENT(IN ) :: n !< time step number REAL(DbKi), INTENT(IN ) :: utimes(:) !< times of input + TYPE(SS_Exc_InputType), INTENT(INOUT) :: Inputs(:) !< Inputs at InputTimes TYPE(SS_Exc_ParameterType), INTENT(IN ) :: p !< Parameters TYPE(SS_Exc_ContinuousStateType), INTENT(INOUT) :: x !< Continuous states at t on input at t + dt on output TYPE(SS_Exc_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at t @@ -726,7 +792,7 @@ SUBROUTINE SS_Exc_AB4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ! local variables - real(SiKi) :: waveElev0 + real(SiKi) :: waveElev0(p%NBody) INTEGER(IntKi) :: ErrStat2 ! local error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message (ErrMsg) @@ -761,7 +827,11 @@ SUBROUTINE SS_Exc_AB4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg endif ! find waveElev at t + Tc - waveElev0 = InterpWrappedStpReal ( REAL(t+p%Tc, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) + !TODO: Replace with function call which extracts the correct form of wave elevation based on ExctnDisp, etc. + waveElev0 = GetWaveElevation( t+p%Tc, Inputs, utimes, p, m, ErrStat2, ErrMsg2 ) + CALL CheckError(ErrStat2,ErrMsg2) + IF ( ErrStat >= AbortErrLev ) RETURN + !waveElev0 = InterpWrappedStpReal ( REAL(t+p%Tc, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) CALL SS_Exc_CalcContStateDeriv( t, waveElev0, p, x, xd, z, OtherState, m, OtherState%xdot ( 1 ), ErrStat2, ErrMsg2 ) ! initializes OtherState%xdot ( 1 ) CALL CheckError(ErrStat2,ErrMsg2) @@ -770,7 +840,7 @@ SUBROUTINE SS_Exc_AB4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg if (n .le. 2) then - CALL SS_Exc_RK4(t, n, utimes, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2 ) + CALL SS_Exc_RK4(t, n, Inputs, utimes, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2 ) CALL CheckError(ErrStat2,ErrMsg2) IF ( ErrStat >= AbortErrLev ) RETURN @@ -836,12 +906,13 @@ END SUBROUTINE SS_Exc_AB4 !! or !! !! K. E. Atkinson, "An Introduction to Numerical Analysis", 1989, John Wiley & Sons, Inc, Second Edition. -SUBROUTINE SS_Exc_ABM4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +SUBROUTINE SS_Exc_ABM4( t, n, Inputs, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) !.................................................................................................................................. REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds INTEGER(IntKi), INTENT(IN ) :: n !< time step number REAL(DbKi), INTENT(IN ) :: utimes(:) !< times of input + TYPE(SS_Exc_InputType), INTENT(INOUT) :: Inputs(:) !< Inputs at InputTimes TYPE(SS_Exc_ParameterType), INTENT(IN ) :: p !< Parameters TYPE(SS_Exc_ContinuousStateType), INTENT(INOUT) :: x !< Continuous states at t on input at t + dt on output TYPE(SS_Exc_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at t @@ -855,7 +926,7 @@ SUBROUTINE SS_Exc_ABM4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMs TYPE(SS_Exc_ContinuousStateType) :: x_pred ! Continuous states at t TYPE(SS_Exc_ContinuousStateType) :: xdot_pred ! Derivative of continuous states at t - real(SiKi) :: waveElev0 + real(SiKi) :: waveElev0(p%NBody) INTEGER(IntKi) :: ErrStat2 ! local error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message (ErrMsg) @@ -869,13 +940,16 @@ SUBROUTINE SS_Exc_ABM4( t, n, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMs CALL CheckError(ErrStat2,ErrMsg2) IF ( ErrStat >= AbortErrLev ) RETURN - CALL SS_Exc_AB4( t, n, utimes, p, x_pred, xd, z, OtherState, m, ErrStat2, ErrMsg2 ) + CALL SS_Exc_AB4( t, n, Inputs, utimes, p, x_pred, xd, z, OtherState, m, ErrStat2, ErrMsg2 ) CALL CheckError(ErrStat2,ErrMsg2) IF ( ErrStat >= AbortErrLev ) RETURN if (n .gt. 2_IntKi) then - - waveElev0 = InterpWrappedStpReal ( REAL(t+p%Tc+p%DT, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) + !TODO: Replace with function call which extracts the correct form of wave elevation based on ExctnDisp, etc. + waveElev0 = GetWaveElevation( t+p%Tc+p%DT, Inputs, utimes, p, m, ErrStat2, ErrMsg2 ) + CALL CheckError(ErrStat2,ErrMsg2) + IF ( ErrStat >= AbortErrLev ) RETURN + !waveElev0 = InterpWrappedStpReal ( REAL(t+p%Tc+p%DT, SiKi), p%WaveTime(:), p%WaveElev0(:), m%LastIndWave, p%NStepWave + 1 ) CALL SS_Exc_CalcContStateDeriv(t + p%dt, waveElev0, p, x_pred, xd, z, OtherState, m, xdot_pred, ErrStat2, ErrMsg2 ) CALL CheckError(ErrStat2,ErrMsg2) IF ( ErrStat >= AbortErrLev ) RETURN diff --git a/modules/hydrodyn/src/SS_Excitation.txt b/modules/hydrodyn/src/SS_Excitation.txt index 251d863d7a..1a329e9a4a 100644 --- a/modules/hydrodyn/src/SS_Excitation.txt +++ b/modules/hydrodyn/src/SS_Excitation.txt @@ -14,14 +14,18 @@ # (File) Revision #: $Rev$ # URL: $HeadURL$ ################################################################################################################################### +usefrom SeaState_Interp.txt typedef SS_Excitation/SS_Exc InitInputType CHARACTER(1024) InputFile - - - "Name of the input file" - typedef ^ ^ IntKi NBody - - - "Number of WAMIT bodies for this State Space model" - +typedef ^ ^ IntKi ExctnDisp - - - "0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0]" - typedef ^ ^ ReKi WaveDir - - - "Wave direction" rad typedef ^ ^ INTEGER NStepWave - - - "Number of timesteps in the WaveTime array" - typedef ^ ^ R8Ki PtfmRefztRot {:} - - "The rotation about zt of the body reference frame(s) from xt/yt" radians typedef ^ ^ SiKi WaveElev0 {:} - - "Wave elevation time history at origin" m -typedef ^ ^ SiKi WaveTime {:} - - "Times where wave elevation is known" s +typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" - +typedef ^ ^ SiKi WaveTime {*} - - "Times where wave elevation is known" s +typedef ^ ^ SeaSt_Interp_ParameterType SeaSt_Interp_p - - - "parameter information from the SeaState Interpolation module" - typedef ^ InitOutputType CHARACTER(10) WriteOutputHdr {:} - - "Header of the output" - typedef ^ InitOutputType CHARACTER(10) WriteOutputUnt {:} - - "Units of the output" - @@ -50,19 +54,22 @@ typedef ^ MiscVarType INTEGER typedef ^ ParameterType DbKi DT - - - "Time step" s typedef ^ ^ IntKi NBody - - - "Number of WAMIT bodies for this State Space model" - +typedef ^ ^ IntKi ExctnDisp - - - "0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0]" - typedef ^ ^ INTEGER NStepWave - - - "Number of timesteps in the WaveTime array" - -typedef ^ ^ IntKi spDOF {6} - - "States per DOF" - +typedef ^ ^ IntKi spDOF {:} - - "States per DOF" - typedef ^ ^ ReKi A {:}{:} - - "A matrix" - typedef ^ ^ ReKi B {:} - - "B matrix" - typedef ^ ^ ReKi C {:}{:} - - "C matrix" - typedef ^ ^ INTEGER numStates - 0 - "Number of states" - typedef ^ ^ DbKi Tc - - - "Time shift" s typedef ^ ^ SiKi WaveElev0 {:} - - "Wave elevation time history at origin" m -typedef ^ ^ SiKi WaveTime {:} - - "Times where wave elevation is known" s +typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" - +typedef ^ ^ SiKi WaveTime {*} - - "Times where wave elevation is known" s +typedef ^ ^ SeaSt_Interp_ParameterType SeaSt_Interp_p - - - "parameter information from the SeaState Interpolation module" - # ..... Inputs ............................. # Define inputs that are contained on the mesh here: -typedef ^ InputType ReKi DummyInput - - - "Remove this variable if you have input variables" - +typedef ^ InputType ReKi PtfmPos {:}{:} - - "Positions of the NBody platforms. Used when ExctnDisp = 1. For NBodyMod = 2, use actual instantaneous position, otherwise use only displacement" - # ..... Outputs ............................ diff --git a/modules/hydrodyn/src/SS_Excitation_Types.f90 b/modules/hydrodyn/src/SS_Excitation_Types.f90 index 1dbef8c916..60fb6d6748 100644 --- a/modules/hydrodyn/src/SS_Excitation_Types.f90 +++ b/modules/hydrodyn/src/SS_Excitation_Types.f90 @@ -31,17 +31,21 @@ !! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. MODULE SS_Excitation_Types !--------------------------------------------------------------------------------------------------------------------------------- +USE SeaState_Interp_Types USE NWTC_Library IMPLICIT NONE ! ========= SS_Exc_InitInputType ======= TYPE, PUBLIC :: SS_Exc_InitInputType CHARACTER(1024) :: InputFile !< Name of the input file [-] INTEGER(IntKi) :: NBody !< Number of WAMIT bodies for this State Space model [-] + INTEGER(IntKi) :: ExctnDisp !< 0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0] [-] REAL(ReKi) :: WaveDir !< Wave direction [rad] INTEGER(IntKi) :: NStepWave !< Number of timesteps in the WaveTime array [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: PtfmRefztRot !< The rotation about zt of the body reference frame(s) from xt/yt [radians] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElev0 !< Wave elevation time history at origin [m] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< Times where wave elevation is known [s] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [-] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Times where wave elevation is known [s] + TYPE(SeaSt_Interp_ParameterType) :: SeaSt_Interp_p !< parameter information from the SeaState Interpolation module [-] END TYPE SS_Exc_InitInputType ! ======================= ! ========= SS_Exc_InitOutputType ======= @@ -80,20 +84,23 @@ MODULE SS_Excitation_Types TYPE, PUBLIC :: SS_Exc_ParameterType REAL(DbKi) :: DT !< Time step [s] INTEGER(IntKi) :: NBody !< Number of WAMIT bodies for this State Space model [-] + INTEGER(IntKi) :: ExctnDisp !< 0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0] [-] INTEGER(IntKi) :: NStepWave !< Number of timesteps in the WaveTime array [-] - INTEGER(IntKi) , DIMENSION(1:6) :: spDOF !< States per DOF [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: spDOF !< States per DOF [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: A !< A matrix [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: B !< B matrix [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: C !< C matrix [-] INTEGER(IntKi) :: numStates = 0 !< Number of states [-] REAL(DbKi) :: Tc !< Time shift [s] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElev0 !< Wave elevation time history at origin [m] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< Times where wave elevation is known [s] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [-] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Times where wave elevation is known [s] + TYPE(SeaSt_Interp_ParameterType) :: SeaSt_Interp_p !< parameter information from the SeaState Interpolation module [-] END TYPE SS_Exc_ParameterType ! ======================= ! ========= SS_Exc_InputType ======= TYPE, PUBLIC :: SS_Exc_InputType - REAL(ReKi) :: DummyInput !< Remove this variable if you have input variables [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PtfmPos !< Positions of the NBody platforms. Used when ExctnDisp = 1. For NBodyMod = 2, use actual instantaneous position, otherwise use only displacement [-] END TYPE SS_Exc_InputType ! ======================= ! ========= SS_Exc_OutputType ======= @@ -113,6 +120,7 @@ SUBROUTINE SS_Exc_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SS_Exc_CopyInitInput' @@ -121,6 +129,7 @@ SUBROUTINE SS_Exc_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E ErrMsg = "" DstInitInputData%InputFile = SrcInitInputData%InputFile DstInitInputData%NBody = SrcInitInputData%NBody + DstInitInputData%ExctnDisp = SrcInitInputData%ExctnDisp DstInitInputData%WaveDir = SrcInitInputData%WaveDir DstInitInputData%NStepWave = SrcInitInputData%NStepWave IF (ALLOCATED(SrcInitInputData%PtfmRefztRot)) THEN @@ -147,10 +156,26 @@ SUBROUTINE SS_Exc_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E END IF DstInitInputData%WaveElev0 = SrcInitInputData%WaveElev0 ENDIF -IF (ALLOCATED(SrcInitInputData%WaveTime)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveElev1)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElev1,1) + i1_u = UBOUND(SrcInitInputData%WaveElev1,1) + i2_l = LBOUND(SrcInitInputData%WaveElev1,2) + i2_u = UBOUND(SrcInitInputData%WaveElev1,2) + i3_l = LBOUND(SrcInitInputData%WaveElev1,3) + i3_u = UBOUND(SrcInitInputData%WaveElev1,3) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElev1)) THEN + ALLOCATE(DstInitInputData%WaveElev1(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%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElev1 = SrcInitInputData%WaveElev1 +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveTime)) THEN i1_l = LBOUND(SrcInitInputData%WaveTime,1) i1_u = UBOUND(SrcInitInputData%WaveTime,1) - IF (.NOT. ALLOCATED(DstInitInputData%WaveTime)) THEN + IF (.NOT. ASSOCIATED(DstInitInputData%WaveTime)) THEN ALLOCATE(DstInitInputData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -159,6 +184,9 @@ SUBROUTINE SS_Exc_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E END IF DstInitInputData%WaveTime = SrcInitInputData%WaveTime ENDIF + CALL SeaSt_Interp_CopyParam( SrcInitInputData%SeaSt_Interp_p, DstInitInputData%SeaSt_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE SS_Exc_CopyInitInput SUBROUTINE SS_Exc_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -176,9 +204,15 @@ SUBROUTINE SS_Exc_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitInputData%WaveElev0)) THEN DEALLOCATE(InitInputData%WaveElev0) ENDIF -IF (ALLOCATED(InitInputData%WaveTime)) THEN +IF (ASSOCIATED(InitInputData%WaveElev1)) THEN + DEALLOCATE(InitInputData%WaveElev1) + InitInputData%WaveElev1 => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveTime)) THEN DEALLOCATE(InitInputData%WaveTime) + InitInputData%WaveTime => NULL() ENDIF + CALL SeaSt_Interp_DestroyParam( InitInputData%SeaSt_Interp_p, ErrStat, ErrMsg ) END SUBROUTINE SS_Exc_DestroyInitInput SUBROUTINE SS_Exc_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -218,6 +252,7 @@ SUBROUTINE SS_Exc_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_BufSz = 0 Int_BufSz = Int_BufSz + 1*LEN(InData%InputFile) ! InputFile Int_BufSz = Int_BufSz + 1 ! NBody + Int_BufSz = Int_BufSz + 1 ! ExctnDisp Re_BufSz = Re_BufSz + 1 ! WaveDir Int_BufSz = Int_BufSz + 1 ! NStepWave Int_BufSz = Int_BufSz + 1 ! PtfmRefztRot allocated yes/no @@ -230,11 +265,34 @@ SUBROUTINE SS_Exc_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_BufSz = Int_BufSz + 2*1 ! WaveElev0 upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElev0) ! WaveElev0 END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev1) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev1) ! WaveElev1 + END IF Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN + IF ( ASSOCIATED(InData%WaveTime) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime END IF + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_p: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -268,6 +326,8 @@ SUBROUTINE SS_Exc_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO ! I IntKiBuf(Int_Xferred) = InData%NBody Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%ExctnDisp + Int_Xferred = Int_Xferred + 1 ReKiBuf(Re_Xferred) = InData%WaveDir Re_Xferred = Re_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NStepWave @@ -302,7 +362,32 @@ SUBROUTINE SS_Exc_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_Xferred = Re_Xferred + 1 END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveTime) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) 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%WaveElev1,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev1,3), UBOUND(InData%WaveElev1,3) + DO i2 = LBOUND(InData%WaveElev1,2), UBOUND(InData%WaveElev1,2) + DO i1 = LBOUND(InData%WaveElev1,1), UBOUND(InData%WaveElev1,1) + ReKiBuf(Re_Xferred) = InData%WaveElev1(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -317,6 +402,34 @@ SUBROUTINE SS_Exc_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_Xferred = Re_Xferred + 1 END DO END IF + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_p + 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 END SUBROUTINE SS_Exc_PackInitInput SUBROUTINE SS_Exc_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -334,6 +447,7 @@ SUBROUTINE SS_Exc_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SS_Exc_UnPackInitInput' @@ -353,6 +467,8 @@ SUBROUTINE SS_Exc_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, END DO ! I OutData%NBody = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 + OutData%ExctnDisp = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 OutData%WaveDir = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 OutData%NStepWave = IntKiBuf(Int_Xferred) @@ -393,6 +509,34 @@ SUBROUTINE SS_Exc_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 END DO END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev1)) DEALLOCATE(OutData%WaveElev1) + ALLOCATE(OutData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev1,3), UBOUND(OutData%WaveElev1,3) + DO i2 = LBOUND(OutData%WaveElev1,2), UBOUND(OutData%WaveElev1,2) + DO i1 = LBOUND(OutData%WaveElev1,1), UBOUND(OutData%WaveElev1,1) + OutData%WaveElev1(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -400,7 +544,7 @@ SUBROUTINE SS_Exc_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -411,6 +555,46 @@ SUBROUTINE SS_Exc_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 END DO END IF + 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 SeaSt_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_p, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_p + 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) END SUBROUTINE SS_Exc_UnPackInitInput SUBROUTINE SS_Exc_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) @@ -1436,6 +1620,7 @@ SUBROUTINE SS_Exc_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SS_Exc_CopyParam' @@ -1444,8 +1629,20 @@ SUBROUTINE SS_Exc_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM ErrMsg = "" DstParamData%DT = SrcParamData%DT DstParamData%NBody = SrcParamData%NBody + DstParamData%ExctnDisp = SrcParamData%ExctnDisp DstParamData%NStepWave = SrcParamData%NStepWave +IF (ALLOCATED(SrcParamData%spDOF)) THEN + i1_l = LBOUND(SrcParamData%spDOF,1) + i1_u = UBOUND(SrcParamData%spDOF,1) + IF (.NOT. ALLOCATED(DstParamData%spDOF)) THEN + ALLOCATE(DstParamData%spDOF(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%spDOF.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF DstParamData%spDOF = SrcParamData%spDOF +ENDIF IF (ALLOCATED(SrcParamData%A)) THEN i1_l = LBOUND(SrcParamData%A,1) i1_u = UBOUND(SrcParamData%A,1) @@ -1500,10 +1697,26 @@ SUBROUTINE SS_Exc_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM END IF DstParamData%WaveElev0 = SrcParamData%WaveElev0 ENDIF -IF (ALLOCATED(SrcParamData%WaveTime)) THEN +IF (ASSOCIATED(SrcParamData%WaveElev1)) THEN + i1_l = LBOUND(SrcParamData%WaveElev1,1) + i1_u = UBOUND(SrcParamData%WaveElev1,1) + i2_l = LBOUND(SrcParamData%WaveElev1,2) + i2_u = UBOUND(SrcParamData%WaveElev1,2) + i3_l = LBOUND(SrcParamData%WaveElev1,3) + i3_u = UBOUND(SrcParamData%WaveElev1,3) + IF (.NOT. ASSOCIATED(DstParamData%WaveElev1)) THEN + ALLOCATE(DstParamData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveElev1 = SrcParamData%WaveElev1 +ENDIF +IF (ASSOCIATED(SrcParamData%WaveTime)) THEN i1_l = LBOUND(SrcParamData%WaveTime,1) i1_u = UBOUND(SrcParamData%WaveTime,1) - IF (.NOT. ALLOCATED(DstParamData%WaveTime)) THEN + IF (.NOT. ASSOCIATED(DstParamData%WaveTime)) THEN ALLOCATE(DstParamData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -1512,6 +1725,9 @@ SUBROUTINE SS_Exc_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM END IF DstParamData%WaveTime = SrcParamData%WaveTime ENDIF + CALL SeaSt_Interp_CopyParam( SrcParamData%SeaSt_Interp_p, DstParamData%SeaSt_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE SS_Exc_CopyParam SUBROUTINE SS_Exc_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -1523,6 +1739,9 @@ SUBROUTINE SS_Exc_DestroyParam( ParamData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" +IF (ALLOCATED(ParamData%spDOF)) THEN + DEALLOCATE(ParamData%spDOF) +ENDIF IF (ALLOCATED(ParamData%A)) THEN DEALLOCATE(ParamData%A) ENDIF @@ -1535,9 +1754,15 @@ SUBROUTINE SS_Exc_DestroyParam( ParamData, ErrStat, ErrMsg ) IF (ALLOCATED(ParamData%WaveElev0)) THEN DEALLOCATE(ParamData%WaveElev0) ENDIF -IF (ALLOCATED(ParamData%WaveTime)) THEN +IF (ASSOCIATED(ParamData%WaveElev1)) THEN + DEALLOCATE(ParamData%WaveElev1) + ParamData%WaveElev1 => NULL() +ENDIF +IF (ASSOCIATED(ParamData%WaveTime)) THEN DEALLOCATE(ParamData%WaveTime) + ParamData%WaveTime => NULL() ENDIF + CALL SeaSt_Interp_DestroyParam( ParamData%SeaSt_Interp_p, ErrStat, ErrMsg ) END SUBROUTINE SS_Exc_DestroyParam SUBROUTINE SS_Exc_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -1577,8 +1802,13 @@ SUBROUTINE SS_Exc_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Int_BufSz = 0 Db_BufSz = Db_BufSz + 1 ! DT Int_BufSz = Int_BufSz + 1 ! NBody + Int_BufSz = Int_BufSz + 1 ! ExctnDisp Int_BufSz = Int_BufSz + 1 ! NStepWave + Int_BufSz = Int_BufSz + 1 ! spDOF allocated yes/no + IF ( ALLOCATED(InData%spDOF) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! spDOF upper/lower bounds for each dimension Int_BufSz = Int_BufSz + SIZE(InData%spDOF) ! spDOF + END IF Int_BufSz = Int_BufSz + 1 ! A allocated yes/no IF ( ALLOCATED(InData%A) ) THEN Int_BufSz = Int_BufSz + 2*2 ! A upper/lower bounds for each dimension @@ -1601,11 +1831,34 @@ SUBROUTINE SS_Exc_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Int_BufSz = Int_BufSz + 2*1 ! WaveElev0 upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElev0) ! WaveElev0 END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev1) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev1) ! WaveElev1 + END IF Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN + IF ( ASSOCIATED(InData%WaveTime) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime END IF + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_p: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1637,12 +1890,25 @@ SUBROUTINE SS_Exc_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Db_Xferred = Db_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NBody Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%ExctnDisp + Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NStepWave Int_Xferred = Int_Xferred + 1 - DO i1 = LBOUND(InData%spDOF,1), UBOUND(InData%spDOF,1) - IntKiBuf(Int_Xferred) = InData%spDOF(i1) - Int_Xferred = Int_Xferred + 1 - END DO + IF ( .NOT. ALLOCATED(InData%spDOF) ) 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%spDOF,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%spDOF,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%spDOF,1), UBOUND(InData%spDOF,1) + IntKiBuf(Int_Xferred) = InData%spDOF(i1) + Int_Xferred = Int_Xferred + 1 + END DO + END IF IF ( .NOT. ALLOCATED(InData%A) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -1717,7 +1983,32 @@ SUBROUTINE SS_Exc_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Re_Xferred = Re_Xferred + 1 END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveTime) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) 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%WaveElev1,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev1,3), UBOUND(InData%WaveElev1,3) + DO i2 = LBOUND(InData%WaveElev1,2), UBOUND(InData%WaveElev1,2) + DO i1 = LBOUND(InData%WaveElev1,1), UBOUND(InData%WaveElev1,1) + ReKiBuf(Re_Xferred) = InData%WaveElev1(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -1732,6 +2023,34 @@ SUBROUTINE SS_Exc_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Re_Xferred = Re_Xferred + 1 END DO END IF + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_p + 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 END SUBROUTINE SS_Exc_PackParam SUBROUTINE SS_Exc_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1749,6 +2068,7 @@ SUBROUTINE SS_Exc_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SS_Exc_UnPackParam' @@ -1766,14 +2086,28 @@ SUBROUTINE SS_Exc_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err Db_Xferred = Db_Xferred + 1 OutData%NBody = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 + OutData%ExctnDisp = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 OutData%NStepWave = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 - i1_l = LBOUND(OutData%spDOF,1) - i1_u = UBOUND(OutData%spDOF,1) - DO i1 = LBOUND(OutData%spDOF,1), UBOUND(OutData%spDOF,1) - OutData%spDOF(i1) = IntKiBuf(Int_Xferred) - Int_Xferred = Int_Xferred + 1 - END DO + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! spDOF 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 + IF (ALLOCATED(OutData%spDOF)) DEALLOCATE(OutData%spDOF) + ALLOCATE(OutData%spDOF(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%spDOF.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%spDOF,1), UBOUND(OutData%spDOF,1) + OutData%spDOF(i1) = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! A not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -1860,6 +2194,34 @@ SUBROUTINE SS_Exc_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err Re_Xferred = Re_Xferred + 1 END DO END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev1)) DEALLOCATE(OutData%WaveElev1) + ALLOCATE(OutData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev1,3), UBOUND(OutData%WaveElev1,3) + DO i2 = LBOUND(OutData%WaveElev1,2), UBOUND(OutData%WaveElev1,2) + DO i1 = LBOUND(OutData%WaveElev1,1), UBOUND(OutData%WaveElev1,1) + OutData%WaveElev1(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -1867,7 +2229,7 @@ SUBROUTINE SS_Exc_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -1878,6 +2240,46 @@ SUBROUTINE SS_Exc_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err Re_Xferred = Re_Xferred + 1 END DO END IF + 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 SeaSt_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_p, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_p + 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) END SUBROUTINE SS_Exc_UnPackParam SUBROUTINE SS_Exc_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) @@ -1888,13 +2290,28 @@ SUBROUTINE SS_Exc_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrM 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 = 'SS_Exc_CopyInput' ! ErrStat = ErrID_None ErrMsg = "" - DstInputData%DummyInput = SrcInputData%DummyInput +IF (ALLOCATED(SrcInputData%PtfmPos)) THEN + i1_l = LBOUND(SrcInputData%PtfmPos,1) + i1_u = UBOUND(SrcInputData%PtfmPos,1) + i2_l = LBOUND(SrcInputData%PtfmPos,2) + i2_u = UBOUND(SrcInputData%PtfmPos,2) + IF (.NOT. ALLOCATED(DstInputData%PtfmPos)) THEN + ALLOCATE(DstInputData%PtfmPos(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%PtfmPos.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputData%PtfmPos = SrcInputData%PtfmPos +ENDIF END SUBROUTINE SS_Exc_CopyInput SUBROUTINE SS_Exc_DestroyInput( InputData, ErrStat, ErrMsg ) @@ -1906,6 +2323,9 @@ SUBROUTINE SS_Exc_DestroyInput( InputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" +IF (ALLOCATED(InputData%PtfmPos)) THEN + DEALLOCATE(InputData%PtfmPos) +ENDIF END SUBROUTINE SS_Exc_DestroyInput SUBROUTINE SS_Exc_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -1943,7 +2363,11 @@ SUBROUTINE SS_Exc_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Re_BufSz = 0 Db_BufSz = 0 Int_BufSz = 0 - Re_BufSz = Re_BufSz + 1 ! DummyInput + Int_BufSz = Int_BufSz + 1 ! PtfmPos allocated yes/no + IF ( ALLOCATED(InData%PtfmPos) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! PtfmPos upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%PtfmPos) ! PtfmPos + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1971,8 +2395,26 @@ SUBROUTINE SS_Exc_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Db_Xferred = 1 Int_Xferred = 1 - ReKiBuf(Re_Xferred) = InData%DummyInput - Re_Xferred = Re_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%PtfmPos) ) 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%PtfmPos,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PtfmPos,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%PtfmPos,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PtfmPos,2) + Int_Xferred = Int_Xferred + 2 + + DO i2 = LBOUND(InData%PtfmPos,2), UBOUND(InData%PtfmPos,2) + DO i1 = LBOUND(InData%PtfmPos,1), UBOUND(InData%PtfmPos,1) + ReKiBuf(Re_Xferred) = InData%PtfmPos(i1,i2) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END IF END SUBROUTINE SS_Exc_PackInput SUBROUTINE SS_Exc_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1988,6 +2430,8 @@ SUBROUTINE SS_Exc_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err 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 = 'SS_Exc_UnPackInput' @@ -2001,8 +2445,29 @@ SUBROUTINE SS_Exc_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 - OutData%DummyInput = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! PtfmPos 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%PtfmPos)) DEALLOCATE(OutData%PtfmPos) + ALLOCATE(OutData%PtfmPos(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%PtfmPos.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i2 = LBOUND(OutData%PtfmPos,2), UBOUND(OutData%PtfmPos,2) + DO i1 = LBOUND(OutData%PtfmPos,1), UBOUND(OutData%PtfmPos,1) + OutData%PtfmPos(i1,i2) = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END IF END SUBROUTINE SS_Exc_UnPackInput SUBROUTINE SS_Exc_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg ) @@ -2311,6 +2776,10 @@ SUBROUTINE SS_Exc_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrM REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i02 ! dim2 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays + INTEGER :: i2 ! dim2 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -2325,8 +2794,14 @@ SUBROUTINE SS_Exc_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrM END IF ScaleFactor = t_out / t(2) - b = -(u1%DummyInput - u2%DummyInput) - u_out%DummyInput = u1%DummyInput + b * ScaleFactor +IF (ALLOCATED(u_out%PtfmPos) .AND. ALLOCATED(u1%PtfmPos)) THEN + DO i2 = LBOUND(u_out%PtfmPos,2),UBOUND(u_out%PtfmPos,2) + DO i1 = LBOUND(u_out%PtfmPos,1),UBOUND(u_out%PtfmPos,1) + b = -(u1%PtfmPos(i1,i2) - u2%PtfmPos(i1,i2)) + u_out%PtfmPos(i1,i2) = u1%PtfmPos(i1,i2) + b * ScaleFactor + END DO + END DO +END IF ! check if allocated END SUBROUTINE SS_Exc_Input_ExtrapInterp1 @@ -2362,6 +2837,10 @@ SUBROUTINE SS_Exc_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors CHARACTER(*), PARAMETER :: RoutineName = 'SS_Exc_Input_ExtrapInterp2' + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i02 ! dim2 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays + INTEGER :: i2 ! dim2 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -2382,9 +2861,15 @@ SUBROUTINE SS_Exc_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, END IF ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) - b = (t(3)**2*(u1%DummyInput - u2%DummyInput) + t(2)**2*(-u1%DummyInput + u3%DummyInput))* scaleFactor - c = ( (t(2)-t(3))*u1%DummyInput + t(3)*u2%DummyInput - t(2)*u3%DummyInput ) * scaleFactor - u_out%DummyInput = u1%DummyInput + b + c * t_out +IF (ALLOCATED(u_out%PtfmPos) .AND. ALLOCATED(u1%PtfmPos)) THEN + DO i2 = LBOUND(u_out%PtfmPos,2),UBOUND(u_out%PtfmPos,2) + DO i1 = LBOUND(u_out%PtfmPos,1),UBOUND(u_out%PtfmPos,1) + b = (t(3)**2*(u1%PtfmPos(i1,i2) - u2%PtfmPos(i1,i2)) + t(2)**2*(-u1%PtfmPos(i1,i2) + u3%PtfmPos(i1,i2)))* scaleFactor + c = ( (t(2)-t(3))*u1%PtfmPos(i1,i2) + t(3)*u2%PtfmPos(i1,i2) - t(2)*u3%PtfmPos(i1,i2) ) * scaleFactor + u_out%PtfmPos(i1,i2) = u1%PtfmPos(i1,i2) + b + c * t_out + END DO + END DO +END IF ! check if allocated END SUBROUTINE SS_Exc_Input_ExtrapInterp2 diff --git a/modules/hydrodyn/src/WAMIT.f90 b/modules/hydrodyn/src/WAMIT.f90 index ef7e9c4f7b..c104e27219 100644 --- a/modules/hydrodyn/src/WAMIT.f90 +++ b/modules/hydrodyn/src/WAMIT.f90 @@ -30,6 +30,7 @@ MODULE WAMIT USE SS_Radiation USE SS_Excitation USE NWTC_FFTPACK + use SeaState_Interp IMPLICIT NONE @@ -136,6 +137,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init REAL(DbKi) :: Interval_Sub ! Local timestep for the SS_Rad and SS_Exc modules, based on RdtnDT COMPLEX(SiKi), ALLOCATABLE :: HdroExctn (:,:,:) ! Frequency- and direction-dependent complex hydrodynamic wave excitation force per unit wave amplitude vector (kg/s^2, kg-m/s^2) COMPLEX(SiKi), ALLOCATABLE :: WaveExctnC(:,:) ! Discrete Fourier transform of the instantaneous value of the total excitation force on the support platfrom from incident waves (N, N-m) + COMPLEX(SiKi), ALLOCATABLE :: WaveExctnCGrid(:,:,:) ! Discrete Fourier transform of the instantaneous value of the total excitation force on the grid points from incident waves (N, N-m) REAL(ReKi) :: DffrctDim (6) ! Matrix used to redimensionalize WAMIT hydrodynamic wave excitation force output (kg/s^2, kg-m/s^2 ) REAL(SiKi), ALLOCATABLE :: HdroAddMs (:,:,:) ! The frequency-dependent hydrodynamic added mass matrix from the radiation problem (kg , kg-m , kg-m^2 ) REAL(SiKi), ALLOCATABLE :: HdroDmpng (:,:,:) ! The frequency-dependent hydrodynamic damping matrix from the radiation problem (kg/s, kg-m/s, kg-m^2/s) @@ -159,7 +161,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init REAL(ReKi), ALLOCATABLE :: WAMITPer (:) ! Period components as ordered in the WAMIT output files (sec ) REAL(ReKi), ALLOCATABLE :: WAMITWvDir(:) ! Wave direction components as ordered in the WAMIT output files (degrees) - INTEGER :: I ! Generic index + INTEGER :: I,iGrid,iX,iY ! Generic index INTEGER :: Indx ! Cycles through the upper-triangular portion (diagonal and above) of the frequency-dependent hydrodynamic added mass and damping matrices from the radiation problem INTEGER :: InsertInd ! The lowest sorted index whose associated frequency component is higher than the current frequency component -- this is to sort the frequency components from lowest to highest INTEGER :: J ! Generic index @@ -225,9 +227,10 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init p%NStepWave = InitInp%NStepWave p%NumOuts = InitInp%NumOuts p%ExctnMod = InitInp%ExctnMod + p%ExctnDisp = InitInp%ExctnDisp p%NBodyMod = InitInp%NBodyMod p%NBody = InitInp%NBody ! In the context of this WAMIT object NBody is 1 if NBodyMod > 1 [there are NBody different WAMIT objects in this case] - + p%seast_interp_p = InitInp%seast_interp_p ! This module's implementation requires that if NBodyMod = 2 or 3, then there is one instance of a WAMIT module for each body, therefore, HydroDyn may have NBody > 1, but this WAMIT module will have NBody = 1 if ( (p%NBodyMod > 1) .and. (p%NBody > 1) ) then CALL SetErrStat( ErrID_Fatal, "DEVELOPER ERROR: If NBodyMod = 2 or 3, then NBody for the a WAMIT object must be equal to 1", ErrStat, ErrMsg, 'WAMIT_Init') @@ -909,7 +912,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init ! Initialize the variables associated with the incident wave: SELECT CASE ( InitInp%WaveMod ) ! Which incident wave kinematics model are we using? - CASE ( 0 ) ! No waves + CASE ( 0 ) ! No waves, NOTE: for this case we are forcing ExctnDisp = 0, so only p%WaveExctn needs to be allocated, not p%WaveExctnGrid if ( p%ExctnMod == 1 ) then ! Initialize everything to zero: @@ -930,21 +933,22 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init SS_Exctn_InitInp%NStepWave = p%NStepWave SS_Exctn_InitInp%NBody = InitInp%NBody SS_Exctn_InitInp%PtfmRefztRot = InitInp%PtfmRefztRot - + SS_Exctn_InitInp%ExctnDisp = InitInp%ExctnDisp ! No other modules need this WaveElev0 array so we will simply move the allocation over to the SS_Exctn module IF (ALLOCATED(InitInp%WaveElev0)) CALL MOVE_ALLOC(InitInp%WaveElev0, SS_Exctn_InitInp%WaveElev0) - + !SS_Exctn_InitInp%WaveElev0 => InitInp%WaveElev0 + SS_Exctn_InitInp%WaveElev1 => InitInp%WaveElev1 !TODO: Verify what happens within SS_Exctn when we have no waves. ! We need the WaveTime array to stay intact for use in other modules, so we will make a copy instead of moving the allocation - ALLOCATE ( SS_Exctn_InitInp%WaveTime (0:InitInp%NStepWave) , STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the SS_Exctn_InitInp%WaveTime array.', ErrStat, ErrMsg, 'WAMIT_Init') - CALL Cleanup() - RETURN - END IF - SS_Exctn_InitInp%WaveTime = InitInp%WaveTime + !ALLOCATE ( SS_Exctn_InitInp%WaveTime (0:InitInp%NStepWave) , STAT=ErrStat2 ) + !IF ( ErrStat2 /= 0 ) THEN + ! CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the SS_Exctn_InitInp%WaveTime array.', ErrStat, ErrMsg, 'WAMIT_Init') + ! CALL Cleanup() + ! RETURN + !END IF + SS_Exctn_InitInp%WaveTime => InitInp%WaveTime call SS_Exc_Init(SS_Exctn_InitInp, m%SS_Exctn_u, p%SS_Exctn, x%SS_Exctn, xd%SS_Exctn, z%SS_Exctn, OtherState%SS_Exctn, & m%SS_Exctn_y, m%SS_Exctn, Interval_Sub, SS_Exctn_InitOut, ErrStat2, ErrMsg2) @@ -957,6 +961,9 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init end if CASE ( 1, 2, 3, 4, 5, 10 ) ! Plane progressive (regular) wave, JONSWAP/Pierson-Moskowitz spectrum (irregular) wave, white-noise wave, or user-defined spectrum (irregular) wave. + + if ( p%ExctnMod == 1 ) then + ! Abort if we have chosen a wave heading direction that is outside the range ! of directions where the complex wave excitation force per unit wave ! amplitude vector has been defined, else interpolate to find the complex @@ -965,16 +972,14 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init ! NOTE: we may end up inadvertantly aborting if the wave direction crosses ! the -Pi / Pi boundary (-180/180 degrees). - IF ( ( InitInp%WaveDirMin < HdroWvDir(1) ) .OR. ( InitInp%WaveDirMax > HdroWvDir(NInpWvDir) ) ) THEN - ErrMsg2 = 'All Wave directions must be within the wave heading angle range available in "' & - //TRIM(InitInp%WAMITFile)//'.3" (inclusive).' - CALL SetErrStat( ErrID_Fatal, ErrMsg2, ErrStat, ErrMsg, 'WAMIT_Init') - CALL Cleanup() - RETURN - END IF + IF ( ( InitInp%WaveDirMin < HdroWvDir(1) ) .OR. ( InitInp%WaveDirMax > HdroWvDir(NInpWvDir) ) ) THEN + ErrMsg2 = 'All Wave directions must be within the wave heading angle range available in "' & + //TRIM(InitInp%WAMITFile)//'.3" (inclusive).' + CALL SetErrStat( ErrID_Fatal, ErrMsg2, ErrStat, ErrMsg, 'WAMIT_Init') + CALL Cleanup() + RETURN + END IF - if ( p%ExctnMod == 1 ) then - ! Calculate the WaveExctn data from WAMIT data if ExctnMod = 1 ! ALLOCATE the arrays: @@ -986,12 +991,28 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init RETURN END IF - ALLOCATE ( p%WaveExctn (0:InitInp%NStepWave,6*p%NBody) , STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the WaveExctn array.', ErrStat, ErrMsg, 'WAMIT_Init') - CALL Cleanup() - RETURN - END IF + if (p%ExctnDisp > 0 ) then + ALLOCATE ( WaveExctnCGrid(0:InitInp%NStepWave2 ,p%SeaSt_Interp_p%n(2)*p%SeaSt_Interp_p%n(3),6*p%NBody) , STAT=ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the WaveExctnC array.', ErrStat, ErrMsg, 'WAMIT_Init') + CALL Cleanup() + RETURN + END IF + ALLOCATE ( p%WaveExctnGrid (0:InitInp%NStepWave,p%SeaSt_Interp_p%n(2),p%SeaSt_Interp_p%n(3), 6*p%NBody) , STAT=ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the WaveExctn array.', ErrStat, ErrMsg, 'WAMIT_Init') + CALL Cleanup() + RETURN + END IF + else + ALLOCATE ( p%WaveExctn (0:InitInp%NStepWave,6*p%NBody) , STAT=ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the WaveExctn array.', ErrStat, ErrMsg, 'WAMIT_Init') + CALL Cleanup() + RETURN + END IF + end if + !==================================== ! Transform the wave excitation coefs @@ -1059,7 +1080,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init end do end if - + if (p%ExctnDisp == 0 ) then ! Compute the positive-frequency components (including zero) of the discrete ! Fourier transform of the wave excitation force: @@ -1083,13 +1104,100 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init RETURN END IF WaveExctnC(I,J) = WaveExctnC(I,J) * CMPLX(InitInp%WaveElevC0(1,I), InitInp%WaveElevC0(2,I)) + END DO ! J - All wave excitation forces and moments END DO ! I - The positive frequency components (including zero) of the discrete Fourier transform - + ! Compute the inverse discrete Fourier transform to find the time-domain + ! representation of the wave excitation force: + + CALL InitFFT ( InitInp%NStepWave, FFT_Data, .TRUE., ErrStat2 ) + CALL SetErrStat( ErrStat2, 'Error in call to InitFFT.', ErrStat, ErrMsg, 'WAMIT_Init') + IF ( ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + DO J = 1,6*p%NBody ! Loop through all wave excitation forces and moments + CALL ApplyFFT_cx ( p%WaveExctn(0:InitInp%NStepWave-1,J), WaveExctnC(:,J), FFT_Data, ErrStat2 ) + CALL SetErrStat( ErrStat2, ' An error occured while applying an FFT to WaveExctnC.', ErrStat, ErrMsg, 'WAMIT_Init') + IF ( ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + ! Append first datpoint as the last as aid for repeated wave data + p%WaveExctn(InitInp%NStepWave,J) = p%WaveExctn(0,J) + END DO ! J - All wave excitation forces and moments + + CALL ExitFFT(FFT_Data, ErrStat2) + CALL SetErrStat( ErrStat2, 'Error in call to ExitFFT.', ErrStat, ErrMsg, 'WAMIT_Init') + IF ( ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + else + DO I = 0,InitInp%NStepWave2 ! Loop through the positive frequency components (including zero) of the discrete Fourier transform + ! Compute the frequency of this component: + + Omega = I*InitInp%WaveDOmega + + ! Compute the discrete Fourier transform of the instantaneous value of the + ! total excitation force on the support platfrom from incident waves: + + DO J = 1,6*p%NBody ! Loop through all wave excitation forces and moments + TmpCoord(1) = Omega + TmpCoord(2) = InitInp%WaveDirArr(I) + CALL WAMIT_Interp2D_Cplx( TmpCoord, HdroExctn(:,:,J), HdroFreq, HdroWvDir, LastInd2, WaveExctnC(I,J), ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'WAMIT_Init') + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + do iGrid = 1, p%SeaSt_Interp_p%n(2)*p%SeaSt_Interp_p%n(3) + WaveExctnCGrid(I,iGrid,J) = WaveExctnC(I,J) * CMPLX(InitInp%WaveElevC(1,I,iGrid), InitInp%WaveElevC(2,I,iGrid)) + end do + END DO ! J - All wave excitation forces and moments + END DO ! I - The positive frequency components (including zero) of the discrete Fourier transform + + ! Compute the inverse discrete Fourier transform to find the time-domain + ! representation of the wave excitation force: + + CALL InitFFT ( InitInp%NStepWave, FFT_Data, .TRUE., ErrStat2 ) + CALL SetErrStat( ErrStat2, 'Error in call to InitFFT.', ErrStat, ErrMsg, 'WAMIT_Init') + IF ( ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + DO J = 1,6*p%NBody ! Loop through all wave excitation forces and moments + do iGrid = 1, p%SeaSt_Interp_p%n(2)*p%SeaSt_Interp_p%n(3) + iX = mod(iGrid-1, p%SeaSt_Interp_p%n(2)) + 1 ! 1st n index is time + iY = (iGrid-1) / p%SeaSt_Interp_p%n(3) + 1 + CALL ApplyFFT_cx ( p%WaveExctnGrid(0:InitInp%NStepWave-1,iX,iY,J), WaveExctnCGrid(:,iGrid,J), FFT_Data, ErrStat2 ) + CALL SetErrStat( ErrStat2, ' An error occured while applying an FFT to WaveExctnC.', ErrStat, ErrMsg, 'WAMIT_Init') + IF ( ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + ! Append first datpoint as the last as aid for repeated wave data + p%WaveExctnGrid(InitInp%NStepWave,iX,iY,J) = p%WaveExctnGrid(0,iX,iY,J) + end do + + END DO ! J - All wave excitation forces and moments + CALL ExitFFT(FFT_Data, ErrStat2) + CALL SetErrStat( ErrStat2, 'Error in call to ExitFFT.', ErrStat, ErrMsg, 'WAMIT_Init') + IF ( ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + end if + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Dump the HdroFreq variable to a file for debugging @@ -1121,34 +1229,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init !CLOSE ( 66 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ! Compute the inverse discrete Fourier transform to find the time-domain - ! representation of the wave excitation force: - - CALL InitFFT ( InitInp%NStepWave, FFT_Data, .TRUE., ErrStat2 ) - CALL SetErrStat( ErrStat2, 'Error in call to InitFFT.', ErrStat, ErrMsg, 'WAMIT_Init') - IF ( ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - DO J = 1,6*p%NBody ! Loop through all wave excitation forces and moments - CALL ApplyFFT_cx ( p%WaveExctn(0:InitInp%NStepWave-1,J), WaveExctnC(:,J), FFT_Data, ErrStat2 ) - CALL SetErrStat( ErrStat2, ' An error occured while applying an FFT to WaveExctnC.', ErrStat, ErrMsg, 'WAMIT_Init') - IF ( ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - ! Append first datpoint as the last as aid for repeated wave data - p%WaveExctn(InitInp%NStepWave,J) = p%WaveExctn(0,J) - END DO ! J - All wave excitation forces and moments - - CALL ExitFFT(FFT_Data, ErrStat2) - CALL SetErrStat( ErrStat2, 'Error in call to ExitFFT.', ErrStat, ErrMsg, 'WAMIT_Init') - IF ( ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + else if ( p%ExctnMod == 2 ) then Interval_Sub = InitInp%Conv_Rdtn%RdtnDT SS_Exctn_InitInp%InputFile = InitInp%WAMITFile @@ -1156,78 +1237,88 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init SS_Exctn_InitInp%NStepWave = p%NStepWave SS_Exctn_InitInp%NBody = InitInp%NBody SS_Exctn_InitInp%PtfmRefztRot = InitInp%PtfmRefztRot - - - + SS_Exctn_InitInp%SeaSt_Interp_p = InitInp%SeaSt_Interp_p + SS_Exctn_InitInp%ExctnDisp = InitInp%ExctnDisp + ! We have been passed a pointer to WaveElev0 for use by the State Space excitation module. + ! If the special case shown below is not used, then the state space model simply uses WaveElev0, as is. + ! however, if we are using the special case, then WaveElev0 will be modified. This is okay, because no one else + ! is using WaveElev0 data + if (p%ExctnDisp == 0 ) then + if (allocated(InitInp%WaveElev0)) then - if (allocated(InitInp%WaveElev0)) then - - ! No other modules need this WaveElev0 array so we will simply move the allocation over to the SS_Exctn module - call MOVE_ALLOC(InitInp%WaveElev0, SS_Exctn_InitInp%WaveElev0) - + ! No other modules need this WaveElev0 array so we will simply move the allocation over to the SS_Exctn module + call MOVE_ALLOC(InitInp%WaveElev0, SS_Exctn_InitInp%WaveElev0) + ! SS_Exctn_InitInp%WaveElev0 => InitInp%WaveElev0 - ! Handle special case when NBodyMod=2 and (PtfmRefxt /= 0 or PtfmRefyt /= 0) : Need to phase shift the wave elevation data for the offset body - if ( p%NBodyMod==2 .and. (InitInp%PtfmRefxt(1) /= 0 .or. InitInp%PtfmRefyt(1) /= 0) ) then + ! Handle special case when NBodyMod=2 and (PtfmRefxt /= 0 or PtfmRefyt /= 0) : Need to phase shift the wave elevation data for the offset body + if ( p%NBodyMod==2 .and. (InitInp%PtfmRefxt(1) /= 0 .or. InitInp%PtfmRefyt(1) /= 0) ) then - ! Need to start with the DFT of the Wave Elevation data at the Platform reference point: InitInp%WaveElevC0 + ! Need to start with the DFT of the Wave Elevation data at the Platform reference point: InitInp%WaveElevC0 - ! Now apply the phase shift in the frequency space + ! Now apply the phase shift in the frequency space - do J = 1, NInpWvDir - do I = 0,InitInp%NStepWave2 ! Loop through the positive frequency components (including zero) of the discrete Fourier transform + do J = 1, NInpWvDir + do I = 0,InitInp%NStepWave2 ! Loop through the positive frequency components (including zero) of the discrete Fourier transform - ! Compute the frequency of this component: + ! Compute the frequency of this component: - Omega = I*InitInp%WaveDOmega - ! Fxy = exp(-j * k(w) * ( X*cos(Beta(w)) + Y*sin(Beta(w)) ) - WaveNmbr = WaveNumber ( Omega, InitInp%Gravity, InitInp%WtrDpth ) - tmpAngle = WaveNmbr * ( InitInp%PtfmRefxt(1)*cos(HdroWvDir(J)*D2R) + InitInp%PtfmRefyt(1)*sin(HdroWvDir(J)*D2R) ) - TmpRe = cos(tmpAngle) - TmpIm = -sin(tmpAngle) - Fxy = CMPLX( TmpRe, TmpIm ) + Omega = I*InitInp%WaveDOmega + ! Fxy = exp(-j * k(w) * ( X*cos(Beta(w)) + Y*sin(Beta(w)) ) + WaveNmbr = WaveNumber ( Omega, InitInp%Gravity, InitInp%WtrDpth ) + tmpAngle = WaveNmbr * ( InitInp%PtfmRefxt(1)*cos(HdroWvDir(J)*D2R) + InitInp%PtfmRefyt(1)*sin(HdroWvDir(J)*D2R) ) + TmpRe = cos(tmpAngle) + TmpIm = -sin(tmpAngle) + Fxy = CMPLX( TmpRe, TmpIm ) - tmpComplexArr(I) = Fxy*CMPLX(InitInp%WaveElevC0(1,I), InitInp%WaveElevC0(2,I)) + tmpComplexArr(I) = Fxy*CMPLX(InitInp%WaveElevC0(1,I), InitInp%WaveElevC0(2,I)) - end do - end do + end do + end do - ! Compute the inverse discrete Fourier transforms to find the time-domain - ! representations of the wave kinematics without stretcing: + ! Compute the inverse discrete Fourier transforms to find the time-domain + ! representations of the wave kinematics without stretcing: - CALL InitFFT ( InitInp%NStepWave, FFT_Data, .TRUE., ErrStat2 ) - CALL SetErrStat(ErrStat2,'Error occured while initializing the FFT.',ErrStat,ErrMsg,'WAMIT_Init') - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF + CALL InitFFT ( InitInp%NStepWave, FFT_Data, .TRUE., ErrStat2 ) + CALL SetErrStat(ErrStat2,'Error occured while initializing the FFT.',ErrStat,ErrMsg,'WAMIT_Init') + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF - ! We'll need the following for wave stretching once we implement it. - CALL ApplyFFT_cx ( SS_Exctn_InitInp%WaveElev0(0:InitInp%NStepWave-1), tmpComplexArr(: ), FFT_Data, ErrStat2 ) - CALL SetErrStat(ErrStat2,'Error occured while applying the FFT to WaveElev0.',ErrStat,ErrMsg,'WAMIT_Init') - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - CALL ExitFFT(FFT_Data, ErrStat2) - CALL SetErrStat( ErrStat2, 'Error in call to ExitFFT.', ErrStat, ErrMsg, 'WAMIT_Init') - IF ( ErrStat >= AbortErrLev) THEN - CALL Cleanup() + ! We'll need the following for wave stretching once we implement it. + CALL ApplyFFT_cx ( SS_Exctn_InitInp%WaveElev0(0:InitInp%NStepWave-1), tmpComplexArr(: ), FFT_Data, ErrStat2 ) + CALL SetErrStat(ErrStat2,'Error occured while applying the FFT to WaveElev0.',ErrStat,ErrMsg,'WAMIT_Init') + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() RETURN END IF + + CALL ExitFFT(FFT_Data, ErrStat2) + CALL SetErrStat( ErrStat2, 'Error in call to ExitFFT.', ErrStat, ErrMsg, 'WAMIT_Init') + IF ( ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF - end if + end if + else + !TODO: Error message because we need WaveElev0 for ExctnDisp=0 + end if + else + SS_Exctn_InitInp%WaveElev1 => InitInp%WaveElev1 + end if + ! We need the WaveTime array to stay intact for use in other modules, so we will make a copy instead of moving the allocation - ALLOCATE ( SS_Exctn_InitInp%WaveTime (0:InitInp%NStepWave) , STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the SS_Exctn_InitInp%WaveTime array.', ErrStat, ErrMsg, 'WAMIT_Init') - CALL Cleanup() - RETURN - END IF - SS_Exctn_InitInp%WaveTime = InitInp%WaveTime + !ALLOCATE ( SS_Exctn_InitInp%WaveTime (0:InitInp%NStepWave) , STAT=ErrStat2 ) + !IF ( ErrStat2 /= 0 ) THEN + ! CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the SS_Exctn_InitInp%WaveTime array.', ErrStat, ErrMsg, 'WAMIT_Init') + ! CALL Cleanup() + ! RETURN + !END IF + SS_Exctn_InitInp%WaveTime => InitInp%WaveTime - end if + call SS_Exc_Init(SS_Exctn_InitInp, m%SS_Exctn_u, p%SS_Exctn, x%SS_Exctn, xd%SS_Exctn, z%SS_Exctn, OtherState%SS_Exctn, & m%SS_Exctn_y, m%SS_Exctn, Interval_Sub, SS_Exctn_InitOut, ErrStat2, ErrMsg2) @@ -1439,6 +1530,8 @@ SUBROUTINE Cleanup() CALL SS_Rad_DestroyInitInput( SS_Rdtn_InitInp, ErrStat2, ErrMsg2 ) CALL SS_Rad_DestroyInitOutput( SS_Rdtn_InitOut, ErrStat2, ErrMsg2 ) + nullify(SS_Exctn_InitInp%WaveTime) + nullify(SS_Exctn_InitInp%WaveElev1) CALL SS_Exc_DestroyInitInput( SS_Exctn_InitInp, ErrStat2, ErrMsg2 ) CALL SS_Exc_DestroyInitOutput( SS_Exctn_InitOut, ErrStat2, ErrMsg2 ) @@ -1500,7 +1593,8 @@ SUBROUTINE WAMIT_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! Destroy the parameter data: - + nullify(p%SS_Exctn%WaveElev1) + nullify(p%SS_Exctn%WaveTime) CALL WAMIT_DestroyParam( p, ErrStat, ErrMsg ) @@ -1641,6 +1735,26 @@ SUBROUTINE WAMIT_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState ErrMsg = ' Failed to allocate array SS_Exctn_u.' return end if + if (p%ExctnDisp == 1) then + DO I=1,nTime + ALLOCATE( SS_Exctn_u(I)%PtfmPos(3,p%NBody), STAT = ErrStat ) + IF (ErrStat /=0) THEN + ErrMsg = ' Failed to allocate array SS_Exctn_u(I)%PtfmPos.' + RETURN + END IF + if (p%NBodyMod == 2) then + do iBody=1,p%NBody + SS_Exctn_u(I)%PtfmPos(:,iBody) = Inputs(I)%Mesh%TranslationDisp(:,iBody) + Inputs(I)%Mesh%Position(:,iBody) + end do + else + do iBody=1,p%NBody + SS_Exctn_u(I)%PtfmPos(:,iBody) = Inputs(I)%Mesh%TranslationDisp(:,iBody) + end do + end if + + END DO + + end if call SS_Exc_UpdateStates( t, n, SS_Exctn_u, InputTimes, p%SS_Exctn, x%SS_Exctn, xd%SS_Exctn, z%SS_Exctn, OtherState%SS_Exctn, m%SS_Exctn, ErrStat, ErrMsg ) @@ -1674,16 +1788,19 @@ SUBROUTINE WAMIT_CalcOutput( Time, WaveTime, u, p, x, xd, z, OtherState, y, m, E !REAL(ReKi) :: F_HS (6) ! Total load contribution from hydrostatics, including the effects of waterplane area and the center of buoyancy (N, N-m) !REAL(ReKi) :: F_Waves (6) ! Total load contribution from incident waves (i.e., the diffraction problem) (N, N-m) !REAL(ReKi) :: F_Rdtn (6) ! Total load contribution from wave radiation damping (i.e., the diffraction problem) (N, N-m) - INTEGER(IntKi) :: I ! Generic index + INTEGER(IntKi) :: I,iStart ! Generic index INTEGER(IntKi) :: J ! Generic index -! INTEGER(IntKi) :: K ! Generic index + INTEGER(IntKi) :: K ! Generic index REAL(ReKi) :: q(6*p%NBody), qdot(6*p%NBody), qdotdot(6*p%NBody) ! kinematics for all WAMIT bodies REAL(ReKi) :: rotdisp(3) ! small angle rotational displacements REAL(ReKi) :: AllOuts(MaxWAMITOutputs) integer(IntKi) :: iBody ! Counter for WAMIT bodies. If NBodyMod > 1 then NBody = 1, and hence iBody = 1 integer(IntKi) :: indxStart, indxEnd ! Starting and ending indices for the iBody_th sub vector in an NBody long vector - - + real(ReKi) :: bodyPosition(2) ! x-y displaced location of a WAMIT body (relative to + ! Error handling + CHARACTER(1024) :: ErrMsg2 ! Temporary error message for calls + INTEGER(IntKi) :: ErrStat2 ! Temporary error status for calls + ! Initialize ErrStat ErrStat = ErrID_None @@ -1700,18 +1817,39 @@ SUBROUTINE WAMIT_CalcOutput( Time, WaveTime, u, p, x, xd, z, OtherState, y, m, E m%F_Waves1 = 0.0_ReKi else if ( p%ExctnMod == 1 ) then - - ! Abort if the wave excitation loads have not been computed yet: - IF ( .NOT. ALLOCATED ( p%WaveExctn ) ) THEN - ErrMsg = ' Routine WAMIT_Init() must be called before routine WAMIT_CalcOutput().' - ErrStat = ErrID_Fatal - RETURN - END IF - - DO I = 1,6*p%NBody ! Loop through all wave excitation forces and moments - m%F_Waves1(I) = InterpWrappedStpReal ( REAL(Time, SiKi), WaveTime(:), p%WaveExctn(:,I), & - m%LastIndWave, p%NStepWave + 1 ) - END DO ! I - All wave excitation forces and moments + if ( p%ExctnDisp == 0 ) then + ! Abort if the wave excitation loads have not been computed yet: + IF ( .NOT. ALLOCATED ( p%WaveExctn ) ) THEN + ErrMsg = ' Routine WAMIT_Init() must be called before routine WAMIT_CalcOutput().' + ErrStat = ErrID_Fatal + RETURN + END IF + + DO I = 1,6*p%NBody ! Loop through all wave excitation forces and moments + m%F_Waves1(I) = InterpWrappedStpReal ( REAL(Time, SiKi), WaveTime(:), p%WaveExctn(:,I), & + m%LastIndWave, p%NStepWave + 1 ) + END DO ! I - All wave excitation forces and moments + else + IF ( .NOT. allocated ( p%WaveExctnGrid ) ) THEN + ErrMsg = ' Routine WAMIT_Init() must be called before routine WAMIT_CalcOutput().' + ErrStat = ErrID_Fatal + RETURN + END IF + ! We are using the displaced x,y location of the WAMIT bodies to determine the Wave Exication force + do iBody = 1,p%NBody + + bodyPosition(1) = u%Mesh%TranslationDisp(1,iBody) + bodyPosition(2) = u%Mesh%TranslationDisp(2,iBody) + iStart = (iBody-1)*6+1 + + ! WaveExctnGrid dimensions are: 1st: wavetime, 2nd: X, 3rd: Y, 4th: Force component for each WAMIT Body + m%F_Waves1(iStart:iStart+5) = SeaSt_Interp_3D_Vec6( Time, bodyPosition, p%WaveExctnGrid(:,:,:,iStart:iStart+5), p%SeaSt_interp_p, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + + end do + + end if + else if ( p%ExctnMod == 2 ) then call SS_Exc_CalcOutput( Time, m%SS_Exctn_u, p%SS_Exctn, x%SS_Exctn, xd%SS_Exctn, & @@ -1817,7 +1955,7 @@ SUBROUTINE WAMIT_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, integer(IntKi) :: iBody ! WAMIT body index integer(IntKi) :: indxStart ! Starting and ending indices for the iBody_th sub vector in an NBody long vector - + real(SiKi) :: waveElev0(p%NBody) ! Initialize ErrStat ErrStat = ErrID_None @@ -1838,7 +1976,8 @@ SUBROUTINE WAMIT_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, ! NOTE: The input below (0.0) will only work as part of a linearization Get_OP call! If this routine (WAMIT_CalcContStateDeriv) is called in another context, then the following ! input needs to be implemented generically. As of Aug 10, 2020, this is only called for Get_OP related work. GJH if (p%ExctnMod == 2) then - CALL SS_Exc_CalcContStateDeriv( Time, 0.0_SiKi, p%SS_Exctn, x%SS_Exctn, xd%SS_Exctn, z%SS_Exctn, OtherState%SS_Exctn, m%SS_Exctn, dxdt%SS_Exctn, ErrStat, ErrMsg ) + waveElev0 = 0.0_SiKi + CALL SS_Exc_CalcContStateDeriv( Time, waveElev0, p%SS_Exctn, x%SS_Exctn, xd%SS_Exctn, z%SS_Exctn, OtherState%SS_Exctn, m%SS_Exctn, dxdt%SS_Exctn, ErrStat, ErrMsg ) end if END SUBROUTINE WAMIT_CalcContStateDeriv diff --git a/modules/hydrodyn/src/WAMIT.txt b/modules/hydrodyn/src/WAMIT.txt index 0317f50c9f..a5ef593082 100644 --- a/modules/hydrodyn/src/WAMIT.txt +++ b/modules/hydrodyn/src/WAMIT.txt @@ -16,7 +16,8 @@ include Registry_NWTC_Library.txt usefrom Conv_Radiation.txt usefrom SS_Radiation.txt usefrom SS_Excitation.txt -usefrom Waves.txt +#usefrom Waves.txt +usefrom SeaState_Interp.txt param WAMIT/WAMIT unused INTEGER MaxWAMITOutputs - 18 - "" - typedef ^ InitInputType INTEGER NBody - - - "[>=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]" - typedef ^ ^ INTEGER 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]" - @@ -33,6 +34,7 @@ typedef ^ ^ ReKi typedef ^ ^ ReKi PtfmCOByt {:} - - "" - typedef ^ ^ INTEGER RdtnMod - - - "" - typedef ^ ^ INTEGER ExctnMod - - - "" - +typedef ^ ^ INTEGER ExctnDisp - - - "0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0]" - typedef ^ ^ DbKi RdtnTMax - - - "" - typedef ^ ^ ReKi WaveDir - - - "" - typedef ^ ^ CHARACTER(1024) WAMITFile - - - "" - @@ -44,16 +46,19 @@ typedef ^ ^ INTEGER typedef ^ ^ INTEGER NStepWave2 - - - "" - typedef ^ ^ ReKi WaveDOmega - - - "" - typedef ^ ^ SiKi WaveElev0 {:} - - "Wave elevation time history at origin (needed for SS_Excitation module)" m -typedef ^ ^ SiKi WaveElevC0 {:}{:} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) -typedef ^ ^ SiKi WaveTime {:} - - "" - +typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" - +typedef ^ ^ SiKi WaveElevC0 {*}{*} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) +typedef ^ ^ SiKi WaveElevC {:}{:}{:} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at all grid points. First column is real part, second column is imaginary part" (meters) +typedef ^ ^ SiKi WaveTime {*} - - "" - typedef ^ ^ INTEGER WaveMod - - - "" - typedef ^ ^ ReKi WtrDens - - - "" - -typedef ^ ^ SiKi WaveDirArr {:} - - "Array of wave directions (one per frequency) from the Waves module" - +typedef ^ ^ SiKi WaveDirArr {*} - - "Array of wave directions (one per frequency) from the Waves module" - typedef ^ ^ SiKi WaveDirMin - - - "Minimum wave direction from Waves module" - typedef ^ ^ SiKi WaveDirMax - - - "Maximum wave direction from Waves module" - typedef ^ ^ CHARACTER(ChanLen) OutList {18} - - "This should really be dimensioned with MaxOutPts" - typedef ^ ^ LOGICAL OutAll - - - "" - typedef ^ ^ INTEGER NumOuts - - - "" - +typedef ^ ^ SeaSt_Interp_ParameterType SeaSt_Interp_p - - - "parameter information from the SeaState Interpolation module" - # # # Define outputs from the initialization routine here: @@ -118,7 +123,9 @@ typedef ^ ^ SiKi typedef ^ ^ SiKi HdroSttc {:}{:} - - "" - typedef ^ ^ INTEGER RdtnMod - - - "" - typedef ^ ^ INTEGER ExctnMod - - - "" - +typedef ^ ^ INTEGER ExctnDisp - - - "0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0]" - typedef ^ ^ SiKi WaveExctn {:}{:} - - "" - +typedef ^ ^ SiKi WaveExctnGrid {:}{:}{:}{:} - - "WaveExctnGrid dimensions are: 1st: wavetime, 2nd: X, 3rd: Y, 4th: Force component for eac WAMIT Body" - typedef ^ ^ INTEGER NStepWave - - - "" - typedef ^ ^ Conv_Rdtn_ParameterType Conv_Rdtn - - - "" - typedef ^ ^ SS_Rad_ParameterType SS_Rdtn - - - "" - @@ -131,6 +138,7 @@ typedef ^ ^ CHARACTER(2 typedef ^ ^ CHARACTER(20) OutSFmt - - - "" - typedef ^ ^ CHARACTER(ChanLen) Delim - - - "" - typedef ^ ^ INTEGER UnOutFile - - - "" - +typedef ^ ^ SeaSt_Interp_ParameterType SeaSt_Interp_p - - - "parameter information from the SeaState Interpolation module" - # # # ..... Inputs .................................................................................................................... diff --git a/modules/hydrodyn/src/WAMIT2.txt b/modules/hydrodyn/src/WAMIT2.txt index 9a500b34ab..be56422695 100644 --- a/modules/hydrodyn/src/WAMIT2.txt +++ b/modules/hydrodyn/src/WAMIT2.txt @@ -36,13 +36,13 @@ typedef ^ ^ ReKi WtrDens typedef ^ ^ ReKi Gravity - - - "Supplied by Driver: Gravitational acceleration" (m/s^2) typedef ^ ^ SiKi WtrDpth - - - "Water depth (positive-valued)" (m) -typedef ^ ^ SiKi WaveElevC0 {:}{:} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) +typedef ^ ^ SiKi WaveElevC0 {*}{*} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) typedef ^ ^ SiKi WaveDir - - - "Mean incident wave propagation heading direction" (degrees) typedef ^ ^ LOGICAL WaveMultiDir - - - "Indicates the waves are multidirectional -- set by HydroDyn_Input" - -typedef ^ ^ SiKi WaveDirArr {:} - - "Wave direction assigned to each frequency" (degrees) +typedef ^ ^ SiKi WaveDirArr {*} - - "Wave direction assigned to each frequency" (degrees) typedef ^ ^ SiKi WaveDirMin - - - "Minimum wave direction from Waves module" - typedef ^ ^ SiKi WaveDirMax - - - "Maximum wave direction from Waves module" - -typedef ^ ^ SiKi WaveTime {:} - - "Simulation times at which the instantaneous second order loads associated with the incident waves are determined" sec +#typedef ^ ^ SiKi WaveTime {*} - - "Simulation times at which the instantaneous second order loads associated with the incident waves are determined" sec typedef ^ ^ INTEGER WaveMod - - - "The wave model to use. This is for error checking -- ideally this would be done in the main calling routine, not here." - @@ -97,8 +97,8 @@ typedef ^ ^ ReKi F_Waves2 # Define parameters here: # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: # -typedef ^ ParameterType SiKi WaveTime {:} - - "Simulation times at which the instantaneous second order loads associated with the incident waves are determined" sec -typedef ^ ^ IntKi NStepWave - - - "Number of wave time steps" - +#typedef ^ ParameterType SiKi WaveTime {*} - - "Simulation times at which the instantaneous second order loads associated with the incident waves are determined" sec +typedef ^ ParameterType IntKi NStepWave - - - "Number of wave time steps" - typedef ^ ^ DbKi DT - - - "" - typedef ^ ^ INTEGER NBody - - - "[>=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]" - typedef ^ ^ INTEGER 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]" - diff --git a/modules/hydrodyn/src/WAMIT2_Types.f90 b/modules/hydrodyn/src/WAMIT2_Types.f90 index 27627976a3..0aefaede22 100644 --- a/modules/hydrodyn/src/WAMIT2_Types.f90 +++ b/modules/hydrodyn/src/WAMIT2_Types.f90 @@ -53,13 +53,12 @@ MODULE WAMIT2_Types REAL(ReKi) :: WtrDens !< Water density [(kg/m^3)] REAL(ReKi) :: Gravity !< Supplied by Driver: Gravitational acceleration [(m/s^2)] REAL(SiKi) :: WtrDpth !< Water depth (positive-valued) [(m)] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevC0 !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] + REAL(SiKi) , DIMENSION(:,:), POINTER :: WaveElevC0 => NULL() !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] REAL(SiKi) :: WaveDir !< Mean incident wave propagation heading direction [(degrees)] LOGICAL :: WaveMultiDir !< Indicates the waves are multidirectional -- set by HydroDyn_Input [-] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveDirArr !< Wave direction assigned to each frequency [(degrees)] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveDirArr => NULL() !< Wave direction assigned to each frequency [(degrees)] REAL(SiKi) :: WaveDirMin !< Minimum wave direction from Waves module [-] REAL(SiKi) :: WaveDirMax !< Maximum wave direction from Waves module [-] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< Simulation times at which the instantaneous second order loads associated with the incident waves are determined [sec] INTEGER(IntKi) :: WaveMod !< The wave model to use. This is for error checking -- ideally this would be done in the main calling routine, not here. [-] INTEGER(IntKi) :: MnDrift !< Calculate the mean drift force {0: no mean drift; [7,8,9,10,11, or 12]: WAMIT file to use} [-] INTEGER(IntKi) :: NewmanApp !< Slow drift forces computed with Newman approximation from WAMIT file:{0: No slow drift; [7,8,9,10,11, or 12]: WAMIT file to use} [-] @@ -110,7 +109,6 @@ MODULE WAMIT2_Types ! ======================= ! ========= WAMIT2_ParameterType ======= TYPE, PUBLIC :: WAMIT2_ParameterType - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< Simulation times at which the instantaneous second order loads associated with the incident waves are determined [sec] INTEGER(IntKi) :: NStepWave !< Number of wave time steps [-] REAL(DbKi) :: DT !< [-] INTEGER(IntKi) :: NBody !< [>=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] [-] @@ -221,12 +219,12 @@ SUBROUTINE WAMIT2_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E DstInitInputData%WtrDens = SrcInitInputData%WtrDens DstInitInputData%Gravity = SrcInitInputData%Gravity DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth -IF (ALLOCATED(SrcInitInputData%WaveElevC0)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveElevC0)) THEN i1_l = LBOUND(SrcInitInputData%WaveElevC0,1) i1_u = UBOUND(SrcInitInputData%WaveElevC0,1) i2_l = LBOUND(SrcInitInputData%WaveElevC0,2) i2_u = UBOUND(SrcInitInputData%WaveElevC0,2) - IF (.NOT. ALLOCATED(DstInitInputData%WaveElevC0)) THEN + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElevC0)) THEN ALLOCATE(DstInitInputData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) @@ -237,10 +235,10 @@ SUBROUTINE WAMIT2_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E ENDIF DstInitInputData%WaveDir = SrcInitInputData%WaveDir DstInitInputData%WaveMultiDir = SrcInitInputData%WaveMultiDir -IF (ALLOCATED(SrcInitInputData%WaveDirArr)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveDirArr)) THEN i1_l = LBOUND(SrcInitInputData%WaveDirArr,1) i1_u = UBOUND(SrcInitInputData%WaveDirArr,1) - IF (.NOT. ALLOCATED(DstInitInputData%WaveDirArr)) THEN + IF (.NOT. ASSOCIATED(DstInitInputData%WaveDirArr)) THEN ALLOCATE(DstInitInputData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) @@ -251,18 +249,6 @@ SUBROUTINE WAMIT2_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, E ENDIF DstInitInputData%WaveDirMin = SrcInitInputData%WaveDirMin DstInitInputData%WaveDirMax = SrcInitInputData%WaveDirMax -IF (ALLOCATED(SrcInitInputData%WaveTime)) THEN - i1_l = LBOUND(SrcInitInputData%WaveTime,1) - i1_u = UBOUND(SrcInitInputData%WaveTime,1) - IF (.NOT. ALLOCATED(DstInitInputData%WaveTime)) THEN - ALLOCATE(DstInitInputData%WaveTime(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveTime.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitInputData%WaveTime = SrcInitInputData%WaveTime -ENDIF DstInitInputData%WaveMod = SrcInitInputData%WaveMod DstInitInputData%MnDrift = SrcInitInputData%MnDrift DstInitInputData%NewmanApp = SrcInitInputData%NewmanApp @@ -301,14 +287,13 @@ SUBROUTINE WAMIT2_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitInputData%PtfmRefztRot)) THEN DEALLOCATE(InitInputData%PtfmRefztRot) ENDIF -IF (ALLOCATED(InitInputData%WaveElevC0)) THEN +IF (ASSOCIATED(InitInputData%WaveElevC0)) THEN DEALLOCATE(InitInputData%WaveElevC0) + InitInputData%WaveElevC0 => NULL() ENDIF -IF (ALLOCATED(InitInputData%WaveDirArr)) THEN +IF (ASSOCIATED(InitInputData%WaveDirArr)) THEN DEALLOCATE(InitInputData%WaveDirArr) -ENDIF -IF (ALLOCATED(InitInputData%WaveTime)) THEN - DEALLOCATE(InitInputData%WaveTime) + InitInputData%WaveDirArr => NULL() ENDIF END SUBROUTINE WAMIT2_DestroyInitInput @@ -381,24 +366,19 @@ SUBROUTINE WAMIT2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_BufSz = Re_BufSz + 1 ! Gravity Re_BufSz = Re_BufSz + 1 ! WtrDpth Int_BufSz = Int_BufSz + 1 ! WaveElevC0 allocated yes/no - IF ( ALLOCATED(InData%WaveElevC0) ) THEN + IF ( ASSOCIATED(InData%WaveElevC0) ) THEN Int_BufSz = Int_BufSz + 2*2 ! WaveElevC0 upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC0) ! WaveElevC0 END IF Re_BufSz = Re_BufSz + 1 ! WaveDir Int_BufSz = Int_BufSz + 1 ! WaveMultiDir Int_BufSz = Int_BufSz + 1 ! WaveDirArr allocated yes/no - IF ( ALLOCATED(InData%WaveDirArr) ) THEN + IF ( ASSOCIATED(InData%WaveDirArr) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveDirArr upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveDirArr) ! WaveDirArr END IF Re_BufSz = Re_BufSz + 1 ! WaveDirMin Re_BufSz = Re_BufSz + 1 ! WaveDirMax - Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime - END IF Int_BufSz = Int_BufSz + 1 ! WaveMod Int_BufSz = Int_BufSz + 1 ! MnDrift Int_BufSz = Int_BufSz + 1 ! NewmanApp @@ -529,7 +509,7 @@ SUBROUTINE WAMIT2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_Xferred = Re_Xferred + 1 ReKiBuf(Re_Xferred) = InData%WtrDpth Re_Xferred = Re_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveElevC0) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveElevC0) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -553,7 +533,7 @@ SUBROUTINE WAMIT2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_Xferred = Re_Xferred + 1 IntKiBuf(Int_Xferred) = TRANSFER(InData%WaveMultiDir, IntKiBuf(1)) Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveDirArr) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveDirArr) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -572,21 +552,6 @@ SUBROUTINE WAMIT2_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Re_Xferred = Re_Xferred + 1 ReKiBuf(Re_Xferred) = InData%WaveDirMax Re_Xferred = Re_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveTime) ) 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%WaveTime,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveTime,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%WaveTime,1), UBOUND(InData%WaveTime,1) - ReKiBuf(Re_Xferred) = InData%WaveTime(i1) - Re_Xferred = Re_Xferred + 1 - END DO - END IF IntKiBuf(Int_Xferred) = InData%WaveMod Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%MnDrift @@ -757,7 +722,7 @@ SUBROUTINE WAMIT2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i2_l = IntKiBuf( Int_Xferred ) i2_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveElevC0)) DEALLOCATE(OutData%WaveElevC0) + IF (ASSOCIATED(OutData%WaveElevC0)) DEALLOCATE(OutData%WaveElevC0) ALLOCATE(OutData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) @@ -781,7 +746,7 @@ SUBROUTINE WAMIT2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveDirArr)) DEALLOCATE(OutData%WaveDirArr) + IF (ASSOCIATED(OutData%WaveDirArr)) DEALLOCATE(OutData%WaveDirArr) ALLOCATE(OutData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) @@ -796,24 +761,6 @@ SUBROUTINE WAMIT2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 OutData%WaveDirMax = REAL(ReKiBuf(Re_Xferred), SiKi) Re_Xferred = Re_Xferred + 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime 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 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) - ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%WaveTime,1), UBOUND(OutData%WaveTime,1) - OutData%WaveTime(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END IF OutData%WaveMod = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 OutData%MnDrift = IntKiBuf(Int_Xferred) @@ -1673,18 +1620,6 @@ SUBROUTINE WAMIT2_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(SrcParamData%WaveTime)) THEN - i1_l = LBOUND(SrcParamData%WaveTime,1) - i1_u = UBOUND(SrcParamData%WaveTime,1) - IF (.NOT. ALLOCATED(DstParamData%WaveTime)) THEN - ALLOCATE(DstParamData%WaveTime(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveTime.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstParamData%WaveTime = SrcParamData%WaveTime -ENDIF DstParamData%NStepWave = SrcParamData%NStepWave DstParamData%DT = SrcParamData%DT DstParamData%NBody = SrcParamData%NBody @@ -1744,9 +1679,6 @@ SUBROUTINE WAMIT2_DestroyParam( ParamData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(ParamData%WaveTime)) THEN - DEALLOCATE(ParamData%WaveTime) -ENDIF IF (ALLOCATED(ParamData%WaveExctn2)) THEN DEALLOCATE(ParamData%WaveExctn2) ENDIF @@ -1793,11 +1725,6 @@ SUBROUTINE WAMIT2_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Re_BufSz = 0 Db_BufSz = 0 Int_BufSz = 0 - Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime - END IF Int_BufSz = Int_BufSz + 1 ! NStepWave Db_BufSz = Db_BufSz + 1 ! DT Int_BufSz = Int_BufSz + 1 ! NBody @@ -1872,21 +1799,6 @@ SUBROUTINE WAMIT2_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Db_Xferred = 1 Int_Xferred = 1 - IF ( .NOT. ALLOCATED(InData%WaveTime) ) 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%WaveTime,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveTime,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%WaveTime,1), UBOUND(InData%WaveTime,1) - ReKiBuf(Re_Xferred) = InData%WaveTime(i1) - Re_Xferred = Re_Xferred + 1 - END DO - END IF IntKiBuf(Int_Xferred) = InData%NStepWave Int_Xferred = Int_Xferred + 1 DbKiBuf(Db_Xferred) = InData%DT @@ -2028,24 +1940,6 @@ SUBROUTINE WAMIT2_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime 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 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) - ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%WaveTime,1), UBOUND(OutData%WaveTime,1) - OutData%WaveTime(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END IF OutData%NStepWave = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 OutData%DT = DbKiBuf(Db_Xferred) diff --git a/modules/hydrodyn/src/WAMIT_Types.f90 b/modules/hydrodyn/src/WAMIT_Types.f90 index d5f86e17dd..650e58bbb0 100644 --- a/modules/hydrodyn/src/WAMIT_Types.f90 +++ b/modules/hydrodyn/src/WAMIT_Types.f90 @@ -33,8 +33,8 @@ MODULE WAMIT_Types !--------------------------------------------------------------------------------------------------------------------------------- USE Conv_Radiation_Types USE SS_Radiation_Types +USE SeaState_Interp_Types USE SS_Excitation_Types -USE Waves_Types USE NWTC_Library IMPLICIT NONE INTEGER(IntKi), PUBLIC, PARAMETER :: MaxWAMITOutputs = 18 ! [-] @@ -55,6 +55,7 @@ MODULE WAMIT_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PtfmCOByt !< [-] INTEGER(IntKi) :: RdtnMod !< [-] INTEGER(IntKi) :: ExctnMod !< [-] + INTEGER(IntKi) :: ExctnDisp !< 0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0] [-] REAL(DbKi) :: RdtnTMax !< [-] REAL(ReKi) :: WaveDir !< [-] CHARACTER(1024) :: WAMITFile !< [-] @@ -64,16 +65,19 @@ MODULE WAMIT_Types INTEGER(IntKi) :: NStepWave2 !< [-] REAL(ReKi) :: WaveDOmega !< [-] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElev0 !< Wave elevation time history at origin (needed for SS_Excitation module) [m] - REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevC0 !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveTime !< [-] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [-] + REAL(SiKi) , DIMENSION(:,:), POINTER :: WaveElevC0 => NULL() !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] + REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveElevC !< Discrete Fourier transform of the instantaneous elevation of incident waves at all grid points. First column is real part, second column is imaginary part [(meters)] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< [-] INTEGER(IntKi) :: WaveMod !< [-] REAL(ReKi) :: WtrDens !< [-] - REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveDirArr !< Array of wave directions (one per frequency) from the Waves module [-] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveDirArr => NULL() !< Array of wave directions (one per frequency) from the Waves module [-] REAL(SiKi) :: WaveDirMin !< Minimum wave direction from Waves module [-] REAL(SiKi) :: WaveDirMax !< Maximum wave direction from Waves module [-] CHARACTER(ChanLen) , DIMENSION(1:18) :: OutList !< This should really be dimensioned with MaxOutPts [-] LOGICAL :: OutAll !< [-] INTEGER(IntKi) :: NumOuts !< [-] + TYPE(SeaSt_Interp_ParameterType) :: SeaSt_Interp_p !< parameter information from the SeaState Interpolation module [-] END TYPE WAMIT_InitInputType ! ======================= ! ========= WAMIT_InitOutputType ======= @@ -136,7 +140,9 @@ MODULE WAMIT_Types REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: HdroSttc !< [-] INTEGER(IntKi) :: RdtnMod !< [-] INTEGER(IntKi) :: ExctnMod !< [-] + INTEGER(IntKi) :: ExctnDisp !< 0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0] [-] REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveExctn !< [-] + REAL(SiKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: WaveExctnGrid !< WaveExctnGrid dimensions are: 1st: wavetime, 2nd: X, 3rd: Y, 4th: Force component for eac WAMIT Body [-] INTEGER(IntKi) :: NStepWave !< [-] TYPE(Conv_Rdtn_ParameterType) :: Conv_Rdtn !< [-] TYPE(SS_Rad_ParameterType) :: SS_Rdtn !< [-] @@ -149,6 +155,7 @@ MODULE WAMIT_Types CHARACTER(20) :: OutSFmt !< [-] CHARACTER(ChanLen) :: Delim !< [-] INTEGER(IntKi) :: UnOutFile !< [-] + TYPE(SeaSt_Interp_ParameterType) :: SeaSt_Interp_p !< parameter information from the SeaState Interpolation module [-] END TYPE WAMIT_ParameterType ! ======================= ! ========= WAMIT_InputType ======= @@ -172,6 +179,8 @@ SUBROUTINE WAMIT_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'WAMIT_CopyInitInput' @@ -270,6 +279,7 @@ SUBROUTINE WAMIT_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er ENDIF DstInitInputData%RdtnMod = SrcInitInputData%RdtnMod DstInitInputData%ExctnMod = SrcInitInputData%ExctnMod + DstInitInputData%ExctnDisp = SrcInitInputData%ExctnDisp DstInitInputData%RdtnTMax = SrcInitInputData%RdtnTMax DstInitInputData%WaveDir = SrcInitInputData%WaveDir DstInitInputData%WAMITFile = SrcInitInputData%WAMITFile @@ -292,12 +302,28 @@ SUBROUTINE WAMIT_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er END IF DstInitInputData%WaveElev0 = SrcInitInputData%WaveElev0 ENDIF -IF (ALLOCATED(SrcInitInputData%WaveElevC0)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveElev1)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElev1,1) + i1_u = UBOUND(SrcInitInputData%WaveElev1,1) + i2_l = LBOUND(SrcInitInputData%WaveElev1,2) + i2_u = UBOUND(SrcInitInputData%WaveElev1,2) + i3_l = LBOUND(SrcInitInputData%WaveElev1,3) + i3_u = UBOUND(SrcInitInputData%WaveElev1,3) + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElev1)) THEN + ALLOCATE(DstInitInputData%WaveElev1(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%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElev1 = SrcInitInputData%WaveElev1 +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveElevC0)) THEN i1_l = LBOUND(SrcInitInputData%WaveElevC0,1) i1_u = UBOUND(SrcInitInputData%WaveElevC0,1) i2_l = LBOUND(SrcInitInputData%WaveElevC0,2) i2_u = UBOUND(SrcInitInputData%WaveElevC0,2) - IF (.NOT. ALLOCATED(DstInitInputData%WaveElevC0)) THEN + IF (.NOT. ASSOCIATED(DstInitInputData%WaveElevC0)) THEN ALLOCATE(DstInitInputData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) @@ -306,10 +332,26 @@ SUBROUTINE WAMIT_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er END IF DstInitInputData%WaveElevC0 = SrcInitInputData%WaveElevC0 ENDIF -IF (ALLOCATED(SrcInitInputData%WaveTime)) THEN +IF (ALLOCATED(SrcInitInputData%WaveElevC)) THEN + i1_l = LBOUND(SrcInitInputData%WaveElevC,1) + i1_u = UBOUND(SrcInitInputData%WaveElevC,1) + i2_l = LBOUND(SrcInitInputData%WaveElevC,2) + i2_u = UBOUND(SrcInitInputData%WaveElevC,2) + i3_l = LBOUND(SrcInitInputData%WaveElevC,3) + i3_u = UBOUND(SrcInitInputData%WaveElevC,3) + IF (.NOT. ALLOCATED(DstInitInputData%WaveElevC)) THEN + ALLOCATE(DstInitInputData%WaveElevC(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%WaveElevC.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%WaveElevC = SrcInitInputData%WaveElevC +ENDIF +IF (ASSOCIATED(SrcInitInputData%WaveTime)) THEN i1_l = LBOUND(SrcInitInputData%WaveTime,1) i1_u = UBOUND(SrcInitInputData%WaveTime,1) - IF (.NOT. ALLOCATED(DstInitInputData%WaveTime)) THEN + IF (.NOT. ASSOCIATED(DstInitInputData%WaveTime)) THEN ALLOCATE(DstInitInputData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -320,10 +362,10 @@ SUBROUTINE WAMIT_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er ENDIF DstInitInputData%WaveMod = SrcInitInputData%WaveMod DstInitInputData%WtrDens = SrcInitInputData%WtrDens -IF (ALLOCATED(SrcInitInputData%WaveDirArr)) THEN +IF (ASSOCIATED(SrcInitInputData%WaveDirArr)) THEN i1_l = LBOUND(SrcInitInputData%WaveDirArr,1) i1_u = UBOUND(SrcInitInputData%WaveDirArr,1) - IF (.NOT. ALLOCATED(DstInitInputData%WaveDirArr)) THEN + IF (.NOT. ASSOCIATED(DstInitInputData%WaveDirArr)) THEN ALLOCATE(DstInitInputData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) @@ -337,6 +379,9 @@ SUBROUTINE WAMIT_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er DstInitInputData%OutList = SrcInitInputData%OutList DstInitInputData%OutAll = SrcInitInputData%OutAll DstInitInputData%NumOuts = SrcInitInputData%NumOuts + CALL SeaSt_Interp_CopyParam( SrcInitInputData%SeaSt_Interp_p, DstInitInputData%SeaSt_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE WAMIT_CopyInitInput SUBROUTINE WAMIT_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -373,15 +418,26 @@ SUBROUTINE WAMIT_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitInputData%WaveElev0)) THEN DEALLOCATE(InitInputData%WaveElev0) ENDIF -IF (ALLOCATED(InitInputData%WaveElevC0)) THEN +IF (ASSOCIATED(InitInputData%WaveElev1)) THEN + DEALLOCATE(InitInputData%WaveElev1) + InitInputData%WaveElev1 => NULL() +ENDIF +IF (ASSOCIATED(InitInputData%WaveElevC0)) THEN DEALLOCATE(InitInputData%WaveElevC0) + InitInputData%WaveElevC0 => NULL() ENDIF -IF (ALLOCATED(InitInputData%WaveTime)) THEN +IF (ALLOCATED(InitInputData%WaveElevC)) THEN + DEALLOCATE(InitInputData%WaveElevC) +ENDIF +IF (ASSOCIATED(InitInputData%WaveTime)) THEN DEALLOCATE(InitInputData%WaveTime) + InitInputData%WaveTime => NULL() ENDIF -IF (ALLOCATED(InitInputData%WaveDirArr)) THEN +IF (ASSOCIATED(InitInputData%WaveDirArr)) THEN DEALLOCATE(InitInputData%WaveDirArr) + InitInputData%WaveDirArr => NULL() ENDIF + CALL SeaSt_Interp_DestroyParam( InitInputData%SeaSt_Interp_p, ErrStat, ErrMsg ) END SUBROUTINE WAMIT_DestroyInitInput SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -462,6 +518,7 @@ SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err END IF Int_BufSz = Int_BufSz + 1 ! RdtnMod Int_BufSz = Int_BufSz + 1 ! ExctnMod + Int_BufSz = Int_BufSz + 1 ! ExctnDisp Db_BufSz = Db_BufSz + 1 ! RdtnTMax Re_BufSz = Re_BufSz + 1 ! WaveDir Int_BufSz = Int_BufSz + 1*LEN(InData%WAMITFile) ! WAMITFile @@ -492,20 +549,30 @@ SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Int_BufSz = Int_BufSz + 2*1 ! WaveElev0 upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElev0) ! WaveElev0 END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev1) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev1) ! WaveElev1 + END IF Int_BufSz = Int_BufSz + 1 ! WaveElevC0 allocated yes/no - IF ( ALLOCATED(InData%WaveElevC0) ) THEN + IF ( ASSOCIATED(InData%WaveElevC0) ) THEN Int_BufSz = Int_BufSz + 2*2 ! WaveElevC0 upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC0) ! WaveElevC0 END IF + Int_BufSz = Int_BufSz + 1 ! WaveElevC allocated yes/no + IF ( ALLOCATED(InData%WaveElevC) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElevC upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC) ! WaveElevC + END IF Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no - IF ( ALLOCATED(InData%WaveTime) ) THEN + IF ( ASSOCIATED(InData%WaveTime) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime END IF Int_BufSz = Int_BufSz + 1 ! WaveMod Re_BufSz = Re_BufSz + 1 ! WtrDens Int_BufSz = Int_BufSz + 1 ! WaveDirArr allocated yes/no - IF ( ALLOCATED(InData%WaveDirArr) ) THEN + IF ( ASSOCIATED(InData%WaveDirArr) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveDirArr upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveDirArr) ! WaveDirArr END IF @@ -514,6 +581,23 @@ SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Int_BufSz = Int_BufSz + SIZE(InData%OutList)*LEN(InData%OutList) ! OutList Int_BufSz = Int_BufSz + 1 ! OutAll Int_BufSz = Int_BufSz + 1 ! NumOuts + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_p: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -662,6 +746,8 @@ SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%ExctnMod Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%ExctnDisp + Int_Xferred = Int_Xferred + 1 DbKiBuf(Db_Xferred) = InData%RdtnTMax Db_Xferred = Db_Xferred + 1 ReKiBuf(Re_Xferred) = InData%WaveDir @@ -721,7 +807,32 @@ SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Re_Xferred = Re_Xferred + 1 END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveElevC0) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) 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%WaveElev1,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev1,3), UBOUND(InData%WaveElev1,3) + DO i2 = LBOUND(InData%WaveElev1,2), UBOUND(InData%WaveElev1,2) + DO i1 = LBOUND(InData%WaveElev1,1), UBOUND(InData%WaveElev1,1) + ReKiBuf(Re_Xferred) = InData%WaveElev1(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElevC0) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -741,7 +852,32 @@ SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveTime) ) THEN + IF ( .NOT. ALLOCATED(InData%WaveElevC) ) 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%WaveElevC,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElevC,3), UBOUND(InData%WaveElevC,3) + DO i2 = LBOUND(InData%WaveElevC,2), UBOUND(InData%WaveElevC,2) + DO i1 = LBOUND(InData%WaveElevC,1), UBOUND(InData%WaveElevC,1) + ReKiBuf(Re_Xferred) = InData%WaveElevC(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -760,7 +896,7 @@ SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Int_Xferred = Int_Xferred + 1 ReKiBuf(Re_Xferred) = InData%WtrDens Re_Xferred = Re_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveDirArr) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveDirArr) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -789,6 +925,34 @@ SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NumOuts Int_Xferred = Int_Xferred + 1 + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_p + 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 END SUBROUTINE WAMIT_PackInitInput SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -806,6 +970,8 @@ SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'WAMIT_UnPackInitInput' @@ -961,6 +1127,8 @@ SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Xferred = Int_Xferred + 1 OutData%ExctnMod = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 + OutData%ExctnDisp = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 OutData%RdtnTMax = DbKiBuf(Db_Xferred) Db_Xferred = Db_Xferred + 1 OutData%WaveDir = ReKiBuf(Re_Xferred) @@ -1035,6 +1203,34 @@ SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 END DO END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev1)) DEALLOCATE(OutData%WaveElev1) + ALLOCATE(OutData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev1,3), UBOUND(OutData%WaveElev1,3) + DO i2 = LBOUND(OutData%WaveElev1,2), UBOUND(OutData%WaveElev1,2) + DO i1 = LBOUND(OutData%WaveElev1,1), UBOUND(OutData%WaveElev1,1) + OutData%WaveElev1(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevC0 not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -1045,7 +1241,7 @@ SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i2_l = IntKiBuf( Int_Xferred ) i2_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveElevC0)) DEALLOCATE(OutData%WaveElevC0) + IF (ASSOCIATED(OutData%WaveElevC0)) DEALLOCATE(OutData%WaveElevC0) ALLOCATE(OutData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) @@ -1058,6 +1254,34 @@ SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, END DO END DO END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevC 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%WaveElevC)) DEALLOCATE(OutData%WaveElevC) + ALLOCATE(OutData%WaveElevC(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevC.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElevC,3), UBOUND(OutData%WaveElevC,3) + DO i2 = LBOUND(OutData%WaveElevC,2), UBOUND(OutData%WaveElevC,2) + DO i1 = LBOUND(OutData%WaveElevC,1), UBOUND(OutData%WaveElevC,1) + OutData%WaveElevC(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -1065,7 +1289,7 @@ SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) @@ -1087,7 +1311,7 @@ SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, i1_l = IntKiBuf( Int_Xferred ) i1_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveDirArr)) DEALLOCATE(OutData%WaveDirArr) + IF (ASSOCIATED(OutData%WaveDirArr)) DEALLOCATE(OutData%WaveDirArr) ALLOCATE(OutData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) @@ -1114,6 +1338,46 @@ SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Xferred = Int_Xferred + 1 OutData%NumOuts = IntKiBuf(Int_Xferred) 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 SeaSt_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_p, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_p + 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) END SUBROUTINE WAMIT_UnPackInitInput SUBROUTINE WAMIT_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) @@ -3940,6 +4204,8 @@ SUBROUTINE WAMIT_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMs 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'WAMIT_CopyParam' @@ -3992,6 +4258,7 @@ SUBROUTINE WAMIT_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMs ENDIF DstParamData%RdtnMod = SrcParamData%RdtnMod DstParamData%ExctnMod = SrcParamData%ExctnMod + DstParamData%ExctnDisp = SrcParamData%ExctnDisp IF (ALLOCATED(SrcParamData%WaveExctn)) THEN i1_l = LBOUND(SrcParamData%WaveExctn,1) i1_u = UBOUND(SrcParamData%WaveExctn,1) @@ -4005,6 +4272,24 @@ SUBROUTINE WAMIT_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMs END IF END IF DstParamData%WaveExctn = SrcParamData%WaveExctn +ENDIF +IF (ALLOCATED(SrcParamData%WaveExctnGrid)) THEN + i1_l = LBOUND(SrcParamData%WaveExctnGrid,1) + i1_u = UBOUND(SrcParamData%WaveExctnGrid,1) + i2_l = LBOUND(SrcParamData%WaveExctnGrid,2) + i2_u = UBOUND(SrcParamData%WaveExctnGrid,2) + i3_l = LBOUND(SrcParamData%WaveExctnGrid,3) + i3_u = UBOUND(SrcParamData%WaveExctnGrid,3) + i4_l = LBOUND(SrcParamData%WaveExctnGrid,4) + i4_u = UBOUND(SrcParamData%WaveExctnGrid,4) + IF (.NOT. ALLOCATED(DstParamData%WaveExctnGrid)) THEN + ALLOCATE(DstParamData%WaveExctnGrid(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveExctnGrid.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%WaveExctnGrid = SrcParamData%WaveExctnGrid ENDIF DstParamData%NStepWave = SrcParamData%NStepWave CALL Conv_Rdtn_CopyParam( SrcParamData%Conv_Rdtn, DstParamData%Conv_Rdtn, CtrlCode, ErrStat2, ErrMsg2 ) @@ -4039,6 +4324,9 @@ SUBROUTINE WAMIT_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMs DstParamData%OutSFmt = SrcParamData%OutSFmt DstParamData%Delim = SrcParamData%Delim DstParamData%UnOutFile = SrcParamData%UnOutFile + CALL SeaSt_Interp_CopyParam( SrcParamData%SeaSt_Interp_p, DstParamData%SeaSt_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE WAMIT_CopyParam SUBROUTINE WAMIT_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -4061,6 +4349,9 @@ SUBROUTINE WAMIT_DestroyParam( ParamData, ErrStat, ErrMsg ) ENDIF IF (ALLOCATED(ParamData%WaveExctn)) THEN DEALLOCATE(ParamData%WaveExctn) +ENDIF +IF (ALLOCATED(ParamData%WaveExctnGrid)) THEN + DEALLOCATE(ParamData%WaveExctnGrid) ENDIF CALL Conv_Rdtn_DestroyParam( ParamData%Conv_Rdtn, ErrStat, ErrMsg ) CALL SS_Rad_DestroyParam( ParamData%SS_Rdtn, ErrStat, ErrMsg ) @@ -4071,6 +4362,7 @@ SUBROUTINE WAMIT_DestroyParam( ParamData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(ParamData%OutParam) ENDIF + CALL SeaSt_Interp_DestroyParam( ParamData%SeaSt_Interp_p, ErrStat, ErrMsg ) END SUBROUTINE WAMIT_DestroyParam SUBROUTINE WAMIT_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -4127,10 +4419,16 @@ SUBROUTINE WAMIT_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, END IF Int_BufSz = Int_BufSz + 1 ! RdtnMod Int_BufSz = Int_BufSz + 1 ! ExctnMod + Int_BufSz = Int_BufSz + 1 ! ExctnDisp Int_BufSz = Int_BufSz + 1 ! WaveExctn allocated yes/no IF ( ALLOCATED(InData%WaveExctn) ) THEN Int_BufSz = Int_BufSz + 2*2 ! WaveExctn upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveExctn) ! WaveExctn + END IF + Int_BufSz = Int_BufSz + 1 ! WaveExctnGrid allocated yes/no + IF ( ALLOCATED(InData%WaveExctnGrid) ) THEN + Int_BufSz = Int_BufSz + 2*4 ! WaveExctnGrid upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveExctnGrid) ! WaveExctnGrid END IF Int_BufSz = Int_BufSz + 1 ! NStepWave ! Allocate buffers for subtypes, if any (we'll get sizes from these) @@ -4215,6 +4513,23 @@ SUBROUTINE WAMIT_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_BufSz = Int_BufSz + 1*LEN(InData%OutSFmt) ! OutSFmt Int_BufSz = Int_BufSz + 1*LEN(InData%Delim) ! Delim Int_BufSz = Int_BufSz + 1 ! UnOutFile + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_p: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -4310,6 +4625,8 @@ SUBROUTINE WAMIT_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%ExctnMod Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%ExctnDisp + Int_Xferred = Int_Xferred + 1 IF ( .NOT. ALLOCATED(InData%WaveExctn) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -4329,6 +4646,36 @@ SUBROUTINE WAMIT_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Re_Xferred = Re_Xferred + 1 END DO END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveExctnGrid) ) 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%WaveExctnGrid,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveExctnGrid,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveExctnGrid,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveExctnGrid,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveExctnGrid,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveExctnGrid,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveExctnGrid,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveExctnGrid,4) + Int_Xferred = Int_Xferred + 2 + + DO i4 = LBOUND(InData%WaveExctnGrid,4), UBOUND(InData%WaveExctnGrid,4) + DO i3 = LBOUND(InData%WaveExctnGrid,3), UBOUND(InData%WaveExctnGrid,3) + DO i2 = LBOUND(InData%WaveExctnGrid,2), UBOUND(InData%WaveExctnGrid,2) + DO i1 = LBOUND(InData%WaveExctnGrid,1), UBOUND(InData%WaveExctnGrid,1) + ReKiBuf(Re_Xferred) = InData%WaveExctnGrid(i1,i2,i3,i4) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO END IF IntKiBuf(Int_Xferred) = InData%NStepWave Int_Xferred = Int_Xferred + 1 @@ -4477,6 +4824,34 @@ SUBROUTINE WAMIT_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, END DO ! I IntKiBuf(Int_Xferred) = InData%UnOutFile Int_Xferred = Int_Xferred + 1 + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_p + 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 END SUBROUTINE WAMIT_PackParam SUBROUTINE WAMIT_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -4494,6 +4869,8 @@ SUBROUTINE WAMIT_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'WAMIT_UnPackParam' @@ -4584,6 +4961,8 @@ SUBROUTINE WAMIT_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM Int_Xferred = Int_Xferred + 1 OutData%ExctnMod = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 + OutData%ExctnDisp = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveExctn not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -4606,6 +4985,39 @@ SUBROUTINE WAMIT_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM Re_Xferred = Re_Xferred + 1 END DO END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveExctnGrid 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%WaveExctnGrid)) DEALLOCATE(OutData%WaveExctnGrid) + ALLOCATE(OutData%WaveExctnGrid(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveExctnGrid.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i4 = LBOUND(OutData%WaveExctnGrid,4), UBOUND(OutData%WaveExctnGrid,4) + DO i3 = LBOUND(OutData%WaveExctnGrid,3), UBOUND(OutData%WaveExctnGrid,3) + DO i2 = LBOUND(OutData%WaveExctnGrid,2), UBOUND(OutData%WaveExctnGrid,2) + DO i1 = LBOUND(OutData%WaveExctnGrid,1), UBOUND(OutData%WaveExctnGrid,1) + OutData%WaveExctnGrid(i1,i2,i3,i4) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO END IF OutData%NStepWave = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 @@ -4805,6 +5217,46 @@ SUBROUTINE WAMIT_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM END DO ! I OutData%UnOutFile = IntKiBuf(Int_Xferred) 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 SeaSt_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_p, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_p + 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) END SUBROUTINE WAMIT_UnPackParam SUBROUTINE WAMIT_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) diff --git a/modules/seastate/src/SeaState.f90 b/modules/seastate/src/SeaState.f90 index 479d5a5d0f..6951383fe0 100644 --- a/modules/seastate/src/SeaState.f90 +++ b/modules/seastate/src/SeaState.f90 @@ -3,7 +3,7 @@ ! Framework. HydroDyns_Types will be auto-generated based on a description of the variables for the module. ! ! "SeaState" should be replaced with the name of your module. Example: SeaState -! "SeaState" (in SeaState_*) should be replaced with the module name or an abbreviation of it. Example: HD +! "SeaState" (in SeaState_*) should be replaced with the module name or an abbreviation of it. Example: SeaSt !.................................................................................................................................. ! LICENSING ! Copyright (C) 2013-2015 National Renewable Energy Laboratory @@ -38,23 +38,23 @@ MODULE SeaState PRIVATE - TYPE(ProgDesc), PARAMETER :: SeaState_ProgDesc = ProgDesc( 'SeaState', '', '' ) + TYPE(ProgDesc), PARAMETER :: SeaSt_ProgDesc = ProgDesc( 'SeaState', '', '' ) ! ..... Public Subroutines ................................................................................................... - PUBLIC :: SeaState_Init ! Initialization routine - PUBLIC :: SeaState_End ! Ending routine (includes clean up) + PUBLIC :: SeaSt_Init ! Initialization routine + PUBLIC :: SeaSt_End ! Ending routine (includes clean up) - PUBLIC :: SeaState_UpdateStates ! Loose coupling routine for solving for constraint states, integrating + PUBLIC :: SeaSt_UpdateStates ! Loose coupling routine for solving for constraint states, integrating ! continuous states, and updating discrete states - PUBLIC :: SeaState_CalcOutput ! Routine for computing outputs + PUBLIC :: SeaSt_CalcOutput ! Routine for computing outputs - PUBLIC :: SeaState_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual - PUBLIC :: SeaState_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states - !PUBLIC :: SeaState_UpdateDiscState ! Tight coupling routine for updating discrete states + PUBLIC :: SeaSt_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual + PUBLIC :: SeaSt_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states + !PUBLIC :: SeaSt_UpdateDiscState ! Tight coupling routine for updating discrete states CONTAINS @@ -97,7 +97,7 @@ FUNCTION GetVersion(ThisProgVer) END FUNCTION GetVersion !subroutine ConvertWaveDataToSeaStatePointers(Waves_InitOut, p, ErrStat, ErrMsg) ! TYPE(Waves_InitOutputType), INTENT(in ) :: Waves_InitOut !< Output from Waves initialization routine -! TYPE(SeaState_ParameterType), INTENT(inout) :: p !< SeaState Parameters +! TYPE(SeaSt_ParameterType), INTENT(inout) :: p !< SeaState Parameters ! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation ! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! @@ -297,26 +297,26 @@ END FUNCTION GetVersion !> This routine is called at the start of the simulation to perform initialization steps. !! The parameters are set here and not changed during the simulation. !! The initial states and initial guess for the input are defined. -SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) +SUBROUTINE SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) !.................................................................................................................................. - TYPE(SeaState_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization routine. - TYPE(SeaState_InputType), INTENT( OUT) :: u !< An initial guess for the input; input mesh must be defined - TYPE(SeaState_ParameterType), INTENT( OUT) :: p !< Parameters - TYPE(SeaState_ContinuousStateType), INTENT( OUT) :: x !< Initial continuous states - TYPE(SeaState_DiscreteStateType), INTENT( OUT) :: xd !< Initial discrete states - TYPE(SeaState_ConstraintStateType), INTENT( OUT) :: z !< Initial guess of the constraint states - TYPE(SeaState_OtherStateType), INTENT( OUT) :: OtherState !< Initial other states - TYPE(SeaState_OutputType), INTENT( OUT) :: y !< Initial system outputs (outputs are not calculated; + TYPE(SeaSt_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization routine. + TYPE(SeaSt_InputType), INTENT( OUT) :: u !< An initial guess for the input; input mesh must be defined + TYPE(SeaSt_ParameterType), INTENT( OUT) :: p !< Parameters + TYPE(SeaSt_ContinuousStateType), INTENT( OUT) :: x !< Initial continuous states + TYPE(SeaSt_DiscreteStateType), INTENT( OUT) :: xd !< Initial discrete states + TYPE(SeaSt_ConstraintStateType), INTENT( OUT) :: z !< Initial guess of the constraint states + TYPE(SeaSt_OtherStateType), INTENT( OUT) :: OtherState !< Initial other states + TYPE(SeaSt_OutputType), INTENT( OUT) :: y !< Initial system outputs (outputs are not calculated; !! only the output mesh is initialized) - TYPE(SeaState_MiscVarType), INTENT( OUT) :: m !< Initial misc/optimization variables + TYPE(SeaSt_MiscVarType), INTENT( OUT) :: m !< Initial misc/optimization variables REAL(DbKi), INTENT(INOUT) :: Interval !< Coupling interval in seconds: the rate that - !! (1) SeaState_UpdateStates() is called in loose coupling & - !! (2) SeaState_UpdateDiscState() is called in tight coupling. + !! (1) SeaSt_UpdateStates() is called in loose coupling & + !! (2) SeaSt_UpdateDiscState() is called in tight coupling. !! Input is the suggested time from the glue code; !! Output is the actual coupling interval that will be used !! by the glue code. - TYPE(SeaState_InitOutputType), INTENT( OUT) :: InitOut !< Output for initialization routine + TYPE(SeaSt_InitOutputType), INTENT( OUT) :: InitOut !< Output for initialization routine INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -324,10 +324,10 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Local variables CHARACTER(1024) :: SummaryName ! name of the SeaState summary file - TYPE(SeaState_InputFile) :: InputFileData !< Data from input file + TYPE(SeaSt_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(SeaState_Interp_InitInputType) :: SeaSt_Interp_InitInp + TYPE(SeaSt_Interp_InitInputType) :: SeaSt_Interp_InitInp ! TYPE(Waves2_InitOutputType) :: Waves2_InitOut ! Initialization Outputs from the Waves2 module initialization TYPE(Current_InitOutputType) :: Current_InitOut ! Initialization Outputs from the Current module initialization INTEGER :: I, J, k, iBody ! Generic counters @@ -380,7 +380,7 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I CHARACTER(1024) :: versionStr INTEGER(IntKi) :: ErrStat2 ! local error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Init' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Init' CHARACTER(64) :: Frmt CHARACTER(2) :: Delim @@ -402,7 +402,7 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Display the module information - CALL DispNVD( SeaState_ProgDesc ) + CALL DispNVD( SeaSt_ProgDesc ) IF ( InitInp%UseInputFile ) THEN @@ -427,7 +427,7 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! Parse all SeaState-related input and populate the InputFileData structure - CALL SeaState_ParseInput( InitInp%InputFile, InitInp%OutRootName, InitInp%defWtrDens, InitInp%defWtrDpth, InitInp%defMSL2SWL, InFileInfo, InputFileData, ErrStat2, ErrMsg2 ) + CALL SeaSt_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() @@ -452,8 +452,8 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I IF ( InputFileData%SeaStSum ) THEN - SummaryName = TRIM(InitInp%OutRootName)//'.HD.sum' - CALL SeaStOut_OpenSum( InputFileData%UnSum, SummaryName, SeaState_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)//'.SEA.sum' + CALL SeaStOut_OpenSum( InputFileData%UnSum, SummaryName, SeaSt_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() @@ -654,6 +654,7 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I p%WaveDT = InputFileData%Waves%WaveDT p%WaveTime => Waves_InitOut%WaveTime p%WaveElev1 => Waves_InitOut%WaveElev + InitOut%WaveElev1 => p%WaveElev1 p%WaveVel => Waves_InitOut%WaveVel p%WaveAcc => Waves_InitOut%WaveAcc p%WaveDynP => Waves_InitOut%WaveDynP @@ -681,14 +682,15 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! CALL MOVE_ALLOC( Waves_InitOut%WaveElev, p%WaveElev1 ) ! allocate p%WaveElev1, set p%WaveElev1 = Waves_InitOut%WaveElev, and deallocate Waves_InitOut%WaveElev ! Copy the first order wave elevation information to p%WaveElev1 so that we can output the total, first, and second order wave elevation separately - ALLOCATE ( p%WaveElev (0:p%NStepWave, p%NGrid(1), p%NGrid(2) ) , STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat(ErrID_Fatal,'Error allocating memory for the WaveElev array.',ErrStat,ErrMsg,RoutineName) - CALL CleanUp() - RETURN - END IF - ! Need to loop over all the elements and copy - p%WaveElev(:,:,:) = p%WaveElev1(:,:,:) + !ALLOCATE ( p%WaveElev (0:p%NStepWave, p%NGrid(1), p%NGrid(2) ) , STAT=ErrStat2 ) + !IF ( ErrStat2 /= 0 ) THEN + ! CALL SetErrStat(ErrID_Fatal,'Error allocating memory for the WaveElev array.',ErrStat,ErrMsg,RoutineName) + ! CALL CleanUp() + ! RETURN + !END IF + !! Need to loop over all the elements and copy + !! TODO: This can create a stack overflowstory error + !p%WaveElev(:,:,:) = p%WaveElev1(:,:,:) @@ -850,16 +852,16 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I CALL SetErrStat(ErrID_Fatal,' WaveElev(NWaveElev) arrays for first and second order wave elevations are of different sizes.',ErrStat,ErrMsg,RoutineName) CALL CleanUp() RETURN - ELSE - - do k = 1, p%NGrid(2) - do J=1, p%NGrid(1) - do I = 0,p%NStepWave - p%WaveElev(I,J,k) = p%Waves2%WaveElev2(I,J,k) + p%WaveElev(I,J,k) - end do - end do - end do - !CALL MOVE_ALLOC(p%Waves2%WaveElev2,p%WaveElev2) + !ELSE + ! + ! do k = 1, p%NGrid(2) + ! do J=1, p%NGrid(1) + ! do I = 0,p%NStepWave + ! p%WaveElev(I,J,k) = p%Waves2%WaveElev2(I,J,k) + p%WaveElev(I,J,k) + ! end do + ! end do + ! end do + ! !CALL MOVE_ALLOC(p%Waves2%WaveElev2,p%WaveElev2) ENDIF ENDIF @@ -1004,14 +1006,14 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I p%NumOuts = InputFileData%NumOuts ! Define initialization-routine output here: - InitOut%Ver = SeaState_ProgDesc + InitOut%Ver = SeaSt_ProgDesc ! These three come directly from processing the inputs, and so will exist even if not using Morison elements: InitOut%WtrDens = InputFileData%Waves%WtrDens InitOut%WtrDpth = InputFileData%Waves%WtrDpth InitOut%MSL2SWL = InputFileData%MSL2SWL p%WtrDpth = InitOut%WtrDpth - - CALL SeaStOut_Init( SeaState_ProgDesc, InitInp%OutRootName, InputFileData, y, p, m, InitOut, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + CALL SeaStOut_Init( SeaSt_ProgDesc, InitInp%OutRootName, InputFileData, y, p, m, InitOut, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() RETURN @@ -1026,7 +1028,7 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I !=============================================== IF ( InputFileData%UnSum > 0 ) THEN - versionStr = GetVersion(SeaState_ProgDesc) + versionStr = GetVersion(SeaSt_ProgDesc) WRITE( InputFileData%UnSum, '(A/)') versionStr Delim = ' ' IF (InputFileData%Waves%WaveMod /= 0 .AND. InputFileData%Waves%WaveMod /= 6) THEN @@ -1044,7 +1046,8 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! WRITE( InputFileData%UnSum, '(/)' ) WRITE( InputFileData%UnSum, '(1X,A78)' ) ' Xi Yi Zi relative to MSL Z relative to SWL' do i= 1, p%NGridPts - WRITE(InputFileData%UnSum,Frmt) InputFileData%Waves%WaveKinxi(i),Delim, InputFileData%Waves%WaveKinyi(i),Delim, InputFileData%Waves%WaveKinzi(i) - InitOut%MSL2SWL,Delim, InputFileData%Waves%WaveKinzi(i) + ! NOTE: The Waves%WaveKinxi, yi, zi arrays hold all the grid point locations + WRITE(InputFileData%UnSum,Frmt) InputFileData%Waves%WaveKinxi(i),Delim, InputFileData%Waves%WaveKinyi(i),Delim, InputFileData%Waves%WaveKinzi(i) + InitOut%MSL2SWL,Delim, InputFileData%Waves%WaveKinzi(i) end do !WRITE( InputFileData%UnSum, '(1X,A11)' ) 'Y-locations' @@ -1065,7 +1068,8 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I WRITE( InputFileData%UnSum, '(2X,A84)' ) 'Index Xi Yi Zi relative to MSL Z relative to SWL' Frmt = '(1X,I5, 2X,ES18.4e2,A,ES18.4e2,A,ES18.4e2,A,ES18.4e2)' do i= 1, p%NWaveKin - WRITE(InputFileData%UnSum,Frmt) i, InputFileData%WaveKinxi(i),Delim, InputFileData%WaveKinyi(i),Delim, InputFileData%WaveKinzi(i) - InitOut%MSL2SWL,Delim, InputFileData%WaveKinzi(i) + ! NOTE: The InputFileData%WaveKinxi, yi, zi arrays hold the User-request kinematics output locations + WRITE(InputFileData%UnSum,Frmt) i, InputFileData%WaveKinxi(i),Delim, InputFileData%WaveKinyi(i),Delim, InputFileData%WaveKinzi(i) + InitOut%MSL2SWL,Delim, InputFileData%WaveKinzi(i) end do else @@ -1146,12 +1150,72 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I SeaSt_Interp_InitInp%pZero(1) = 0.0 !Time SeaSt_Interp_InitInp%pZero(4) = -InputFileData%Z_Depth ! zi SeaSt_Interp_InitInp%Z_Depth = InputFileData%Z_Depth - call SeaState_Interp_Init(SeaSt_Interp_InitInp, p%sea_interp_p, ErrStat2, ErrMsg2) + call SeaSt_Interp_Init(SeaSt_Interp_InitInp, p%seast_interp_p, ErrStat2, ErrMsg2) IF ( p%OutSwtch == 1 ) THEN ! Only HD-level output writing ! HACK WE can tell FAST not to write any HD outputs by simply deallocating the WriteOutputHdr array! DEALLOCATE ( InitOut%WriteOutputHdr ) END IF + + ! Copy Waves InitOut data to SeaState InitOut + + InitOut%WaveElevC0 => Waves_InitOut%WaveElevC0 ! For WAMIT and WAMIT2, FIT + CALL MOVE_ALLOC( Waves_InitOut%WaveElevC, InitOut%WaveElevC ) ! For WAMIT + InitOut%WaveDirArr => Waves_InitOut%WaveDirArr ! For WAMIT and WAMIT2 + InitOut%WaveDirMin = Waves_InitOut%WaveDirMin ! For WAMIT and WAMIT2 + InitOut%WaveDirMax = Waves_InitOut%WaveDirMax ! For WAMIT and WAMIT2 + InitOut%WaveDir = Waves_InitOut%WaveDir ! For WAMIT for use in SS_Excitation + !InitOut%WaveNDir = Waves_InitOut%WaveNDir ! Not needed + InitOut%WaveMultiDir = Waves_InitOut%WaveMultiDir ! For WAMIT2 + InitOut%WaveDOmega = Waves_InitOut%WaveDOmega ! For WAMIT and WAMIT2, FIT + !InitOut%WaveKinzi = Waves_InitOut%WaveKinzi ! Not needed + InitOut%WaveDynP => Waves_InitOut%WaveDynP ! For Morison + InitOut%WaveAcc => Waves_InitOut%WaveAcc ! For Morison + InitOut%WaveVel => Waves_InitOut%WaveVel ! For Morison + !InitOut%WaveElev => Waves_InitOut%WaveElev ! Not needed + !InitOut%WaveElev0 => Waves_InitOut%WaveElev0 ! For WAMIT for use in SS_Excitation + call MOVE_ALLOC(Waves_InitOut%WaveElev0, InitOut%WaveElev0 ) + InitOut%WaveTime => Waves_InitOut%WaveTime ! For Morison, and WAMIT for use in SS_Excitation + !InitOut%WaveTMax = Waves_InitOut%WaveTMax ! Not needed + InitOut%RhoXg = Waves_InitOut%RhoXg ! For WAMIT and WAMIT2 + InitOut%NStepWave = Waves_InitOut%NStepWave ! For WAMIT, WAMIT2, SS_Excitation, Morison + InitOut%NStepWave2 = Waves_InitOut%NStepWave2 ! For WAMIT and WAMIT2, FIT + + InitOut%WaveMod = InputFileData%Waves%WaveMod + InitOut%WaveStMod = InputFileData%Waves%WaveStMod + InitOut%WvLowCOff = InputFileData%Waves%WvLowCOff + InitOut%WvHiCOff = InputFileData%Waves%WvHiCOff + InitOut%WvLowCOffD = InputFileData%Waves2%WvLowCOffD + InitOut%WvHiCOffD = InputFileData%Waves2%WvHiCOffD + InitOut%WvLowCOffS = InputFileData%Waves2%WvLowCOffS + InitOut%WvHiCOffS = InputFileData%Waves2%WvHiCOffS + InitOut%WvDiffQTFF = InputFileData%Waves2%WvDiffQTFF + InitOut%WvSumQTFF = InputFileData%Waves2%WvSumQTFF + InitOut%WaveDirMod = InputFileData%Waves%WaveDirMod + InitOut%CurrMod = InputFileData%Current%CurrMod + InitOut%SeaSt_Interp_p = p%seast_interp_p + + + + + + + + + + + + + + + + + + + + + + ! Destroy the local initialization data CALL CleanUp() @@ -1160,7 +1224,7 @@ SUBROUTINE SeaState_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I !................................ SUBROUTINE CleanUp() - CALL SeaState_DestroyInputFile( InputFileData, ErrStat2, ErrMsg2 );CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL SeaSt_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) @@ -1204,21 +1268,21 @@ SUBROUTINE CleanUp() END SUBROUTINE CleanUp !................................ -END SUBROUTINE SeaState_Init +END SUBROUTINE SeaSt_Init !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the end of the simulation. -SUBROUTINE SeaState_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) - - TYPE(SeaState_InputType), INTENT(INOUT) :: u !< System inputs - TYPE(SeaState_ParameterType), INTENT(INOUT) :: p !< Parameters - TYPE(SeaState_ContinuousStateType), INTENT(INOUT) :: x !< Continuous states - TYPE(SeaState_DiscreteStateType), INTENT(INOUT) :: xd !< Discrete states - TYPE(SeaState_ConstraintStateType), INTENT(INOUT) :: z !< Constraint states - TYPE(SeaState_OtherStateType), INTENT(INOUT) :: OtherState !< Other/optimization states - TYPE(SeaState_OutputType), INTENT(INOUT) :: y !< System outputs - TYPE(SeaState_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables +SUBROUTINE SeaSt_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) + + TYPE(SeaSt_InputType), INTENT(INOUT) :: u !< System inputs + TYPE(SeaSt_ParameterType), INTENT(INOUT) :: p !< Parameters + TYPE(SeaSt_ContinuousStateType), INTENT(INOUT) :: x !< Continuous states + TYPE(SeaSt_DiscreteStateType), INTENT(INOUT) :: xd !< Discrete states + TYPE(SeaSt_ConstraintStateType), INTENT(INOUT) :: z !< Constraint states + TYPE(SeaSt_OtherStateType), INTENT(INOUT) :: OtherState !< Other/optimization states + TYPE(SeaSt_OutputType), INTENT(INOUT) :: y !< System outputs + TYPE(SeaSt_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -1247,52 +1311,52 @@ SUBROUTINE SeaState_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! Destroy the input data: - CALL SeaState_DestroyInput( u, ErrStat, ErrMsg ) + CALL SeaSt_DestroyInput( u, ErrStat, ErrMsg ) ! Destroy the parameter data: - CALL SeaState_DestroyParam( p, ErrStat, ErrMsg ) + CALL SeaSt_DestroyParam( p, ErrStat, ErrMsg ) ! Destroy the state data: - CALL SeaState_DestroyContState( x, ErrStat, ErrMsg ) - CALL SeaState_DestroyDiscState( xd, ErrStat, ErrMsg ) - CALL SeaState_DestroyConstrState( z, ErrStat, ErrMsg ) - CALL SeaState_DestroyOtherState( OtherState, ErrStat, ErrMsg ) + CALL SeaSt_DestroyContState( x, ErrStat, ErrMsg ) + CALL SeaSt_DestroyDiscState( xd, ErrStat, ErrMsg ) + CALL SeaSt_DestroyConstrState( z, ErrStat, ErrMsg ) + CALL SeaSt_DestroyOtherState( OtherState, ErrStat, ErrMsg ) ! Destroy misc variables: - CALL SeaState_DestroyMisc( m, ErrStat, ErrMsg ) + CALL SeaSt_DestroyMisc( m, ErrStat, ErrMsg ) ! Destroy the output data: - CALL SeaState_DestroyOutput( y, ErrStat, ErrMsg ) + CALL SeaSt_DestroyOutput( y, ErrStat, ErrMsg ) -END SUBROUTINE SeaState_End +END SUBROUTINE SeaSt_End !---------------------------------------------------------------------------------------------------------------------------------- !> Loose coupling routine for solving constraint states, integrating continuous states, and updating discrete states. !! Continuous, constraint, and discrete states are updated to values at t + Interval. -SUBROUTINE SeaState_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +SUBROUTINE SeaSt_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds INTEGER(IntKi), INTENT(IN ) :: n !< Current step of the simulation: t = n*Interval - TYPE(SeaState_InputType), INTENT(INOUT ) :: Inputs(:) !< Inputs at InputTimes + TYPE(SeaSt_InputType), INTENT(INOUT ) :: Inputs(:) !< Inputs at InputTimes REAL(DbKi), INTENT(IN ) :: InputTimes(:) !< Times in seconds associated with Inputs - TYPE(SeaState_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(SeaState_ContinuousStateType), INTENT(INOUT) :: x !< Input: Continuous states at t; + TYPE(SeaSt_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaSt_ContinuousStateType), INTENT(INOUT) :: x !< Input: Continuous states at t; !! Output: Continuous states at t + Interval - TYPE(SeaState_DiscreteStateType), INTENT(INOUT) :: xd !< Input: Discrete states at t; + TYPE(SeaSt_DiscreteStateType), INTENT(INOUT) :: xd !< Input: Discrete states at t; !! Output: Discrete states at t + Interval - TYPE(SeaState_ConstraintStateType), INTENT(INOUT) :: z !< Input: Constraint states at t; + TYPE(SeaSt_ConstraintStateType), INTENT(INOUT) :: z !< Input: Constraint states at t; !! Output: Constraint states at t + Interval - TYPE(SeaState_OtherStateType), INTENT(INOUT) :: OtherState !< Other states: Other states at t; + TYPE(SeaSt_OtherStateType), INTENT(INOUT) :: OtherState !< Other states: Other states at t; !! Output: Other states at t + Interval - TYPE(SeaState_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables + TYPE(SeaSt_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -1305,23 +1369,23 @@ SUBROUTINE SeaState_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherSt -END SUBROUTINE SeaState_UpdateStates +END SUBROUTINE SeaSt_UpdateStates !---------------------------------------------------------------------------------------------------------------------------------- !> Routine for computing outputs, used in both loose and tight coupling. -SUBROUTINE SeaState_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) +SUBROUTINE SeaSt_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) REAL(DbKi), INTENT(IN ) :: Time !< Current simulation time in seconds - TYPE(SeaState_InputType), INTENT(INOUT) :: u !< Inputs at Time (note that this is intent out because we're copying the u%WAMITMesh into m%u_wamit%mesh) - TYPE(SeaState_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(SeaState_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time - TYPE(SeaState_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at Time - TYPE(SeaState_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at Time - TYPE(SeaState_OtherStateType), INTENT(IN ) :: OtherState !< Other states at Time - TYPE(SeaState_OutputType), INTENT(INOUT) :: y !< Outputs computed at Time (Input only so that mesh con- + TYPE(SeaSt_InputType), INTENT(INOUT) :: u !< Inputs at Time (note that this is intent out because we're copying the u%WAMITMesh into m%u_wamit%mesh) + TYPE(SeaSt_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaSt_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time + TYPE(SeaSt_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at Time + TYPE(SeaSt_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at Time + TYPE(SeaSt_OtherStateType), INTENT(IN ) :: OtherState !< Other states at Time + TYPE(SeaSt_OutputType), INTENT(INOUT) :: y !< Outputs computed at Time (Input only so that mesh con- !! nectivity information does not have to be recalculated) - TYPE(SeaState_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables + TYPE(SeaSt_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !! Error message if ErrStat /= ErrID_None @@ -1368,16 +1432,20 @@ SUBROUTINE SeaState_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ! ! Waves2_CalcOutput is called only so that the wave elevations can be output (if requested). ! CALL Waves2_CalcOutput( Time, m%u_Waves2, p%Waves2, x%Waves2, xd%Waves2, & ! z%Waves2, OtherState%Waves2, y%Waves2, m%Waves2, ErrStat2, ErrMsg2 ) - ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) !END IF do i = 1, p%NWaveKin positionXYZ = (/p%WaveKinxi(i),p%WaveKinyi(i),p%WaveKinzi(i)/) - call SeaState_Interp_Setup( Time, positionXYZ, p%sea_interp_p, m%sea_interp_m, ErrStat, ErrMsg ) - WaveVel(:,i) = SeaState_Interp_4D_Vec( p%WaveVel, m%sea_interp_m, ErrStat, ErrMsg ) - WaveAcc(:,i) = SeaState_Interp_4D_Vec( p%WaveAcc, m%sea_interp_m, ErrStat, ErrMsg ) - WaveDynP(i) = SeaState_Interp_4D ( p%WaveDynP, m%sea_interp_m, ErrStat, ErrMsg ) + call SeaSt_Interp_Setup( Time, positionXYZ, p%seast_interp_p, m%seast_interp_m, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) + WaveVel(:,i) = SeaSt_Interp_4D_Vec( p%WaveVel, m%seast_interp_m, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) + WaveAcc(:,i) = SeaSt_Interp_4D_Vec( p%WaveAcc, m%seast_interp_m, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) + WaveDynP(i) = SeaSt_Interp_4D ( p%WaveDynP, m%seast_interp_m, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) end do @@ -1386,10 +1454,17 @@ SUBROUTINE SeaState_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, do i = 1, p%NWaveElev positionXY = (/p%WaveElevxi(i),p%WaveElevyi(i)/) ! TODO: Why interp the WaveElev. Instead just add 1 + 2 if Waves2 is being used? - WaveElev(i) = SeaState_Interp_3D( Time, positionXY, p%WaveElev, p%sea_interp_p, ErrStat, ErrMsg ) - WaveElev1(i) = SeaState_Interp_3D( Time, positionXY, p%WaveElev1, p%sea_interp_p, ErrStat, ErrMsg ) + !WaveElev(i) = SeaSt_Interp_3D( Time, positionXY, p%WaveElev, p%sea_interp_p, ErrStat2, ErrMsg2 ) + ! call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) + WaveElev1(i) = SeaSt_Interp_3D( Time, positionXY, p%WaveElev1, p%seast_interp_p, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) + if (allocated(p%Waves2%WaveElev2)) then - WaveElev2(i) = SeaState_Interp_3D( Time, positionXY, p%Waves2%WaveElev2, p%sea_interp_p, ErrStat, ErrMsg ) + WaveElev2(i) = SeaSt_Interp_3D( Time, positionXY, p%Waves2%WaveElev2, p%seast_interp_p, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) + WaveElev(i) = WaveElev1(i) + WaveElev2(i) + else + WaveElev(i) = WaveElev1(i) end if end do @@ -1401,12 +1476,12 @@ SUBROUTINE SeaState_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, IF ( (p%OutSwtch == 1 .OR. p%OutSwtch == 3) .AND. ( Time > m%LastOutTime ) ) THEN CALL SeaStOut_WriteOutputs( m%LastOutTime, y, p, m%Decimate, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) END IF ! Map calculated results into the AllOuts Array CALL SeaStOut_MapOutputs( Time, p, p%NWaveElev, WaveElev, WaveElev1, WaveElev2, p%NWaveKin, WaveVel, WaveAcc, WaveDynP, AllOuts, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) DO I = 1,p%NumOuts y%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) @@ -1432,26 +1507,26 @@ SUBROUTINE SeaState_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, m%LastOutTime = Time end if -END SUBROUTINE SeaState_CalcOutput +END SUBROUTINE SeaSt_CalcOutput !---------------------------------------------------------------------------------------------------------------------------------- !> Tight coupling routine for computing derivatives of continuous states -SUBROUTINE SeaState_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) +SUBROUTINE SeaSt_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) REAL(DbKi), INTENT(IN ) :: Time !< Current simulation time in seconds - TYPE(SeaState_InputType), INTENT(INOUT) :: u !< Inputs at Time (intent OUT only because we're copying the input mesh) - TYPE(SeaState_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(SeaState_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time - TYPE(SeaState_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at Time - TYPE(SeaState_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at Time - TYPE(SeaState_OtherStateType), INTENT(IN ) :: OtherState !< Other states - TYPE(SeaState_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables - TYPE(SeaState_ContinuousStateType), INTENT( OUT) :: dxdt !< Continuous state derivatives at Time + TYPE(SeaSt_InputType), INTENT(INOUT) :: u !< Inputs at Time (intent OUT only because we're copying the input mesh) + TYPE(SeaSt_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaSt_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time + TYPE(SeaSt_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at Time + TYPE(SeaSt_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at Time + TYPE(SeaSt_OtherStateType), INTENT(IN ) :: OtherState !< Other states + TYPE(SeaSt_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables + TYPE(SeaSt_ContinuousStateType), INTENT( OUT) :: dxdt !< Continuous state derivatives at Time INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None integer(IntKi) :: iWAMIT ! loop counter - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CalcContStateDeriv' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CalcContStateDeriv' ! Initialize ErrStat @@ -1460,24 +1535,24 @@ SUBROUTINE SeaState_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxd -END SUBROUTINE SeaState_CalcContStateDeriv +END SUBROUTINE SeaSt_CalcContStateDeriv !---------------------------------------------------------------------------------------------------------------------------------- !> Tight coupling routine for solving for the residual of the constraint state equations -SUBROUTINE SeaState_CalcConstrStateResidual( Time, u, p, x, xd, z, OtherState, m, z_residual, ErrStat, ErrMsg ) +SUBROUTINE SeaSt_CalcConstrStateResidual( Time, u, p, x, xd, z, OtherState, m, z_residual, ErrStat, ErrMsg ) REAL(DbKi), INTENT(IN ) :: Time !< Current simulation time in seconds - TYPE(SeaState_InputType), INTENT(INOUT) :: u !< Inputs at Time (intent OUT only because we're copying the input mesh) - TYPE(SeaState_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(SeaState_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time - TYPE(SeaState_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at Time - TYPE(SeaState_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at Time (possibly a guess) - TYPE(SeaState_OtherStateType), INTENT(IN ) :: OtherState !< Other/optimization states - TYPE(SeaState_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables - TYPE(SeaState_ConstraintStateType), INTENT( OUT) :: z_residual !< Residual of the constraint state equations using + TYPE(SeaSt_InputType), INTENT(INOUT) :: u !< Inputs at Time (intent OUT only because we're copying the input mesh) + TYPE(SeaSt_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaSt_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at Time + TYPE(SeaSt_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at Time + TYPE(SeaSt_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at Time (possibly a guess) + TYPE(SeaSt_OtherStateType), INTENT(IN ) :: OtherState !< Other/optimization states + TYPE(SeaSt_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables + TYPE(SeaSt_ConstraintStateType), INTENT( OUT) :: z_residual !< Residual of the constraint state equations using !! the input values described above INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -1494,7 +1569,7 @@ SUBROUTINE SeaState_CalcConstrStateResidual( Time, u, p, x, xd, z, OtherState, m ! Solve for the constraint states here: -END SUBROUTINE SeaState_CalcConstrStateResidual +END SUBROUTINE SeaSt_CalcConstrStateResidual diff --git a/modules/seastate/src/SeaState.txt b/modules/seastate/src/SeaState.txt index 5e543e5244..3143f153c6 100644 --- a/modules/seastate/src/SeaState.txt +++ b/modules/seastate/src/SeaState.txt @@ -19,9 +19,9 @@ usefrom Waves.txt usefrom Waves2.txt usefrom SeaState_Interp.txt # -param SeaState/SeaState unused INTEGER MaxSeaStOutputs - 90 - "The maximum number of output channels supported by this module" - +param SeaState/SeaSt unused INTEGER MaxSeaStOutputs - 90 - "The maximum number of output channels supported by this module" - # -typedef SeaState/SeaState SeaState_InputFile LOGICAL EchoFlag - - - "Echo the input file" +typedef SeaState/SeaSt SeaSt_InputFile LOGICAL EchoFlag - - - "Echo the input file" typedef ^ ^ ReKi MSL2SWL - - - "Mean Sea Level to Still Water Level offset" m typedef ^ ^ ReKi X_HalfWidth - - - "Half-width of the domain in the X direction" m typedef ^ ^ ReKi Y_HalfWidth - - - "Half-width of the domain in the Y direction" m @@ -51,7 +51,7 @@ typedef ^ ^ INTEGER UnS typedef ^ ^ CHARACTER(20) OutFmt - - - "Output format for numerical results" - typedef ^ ^ CHARACTER(20) OutSFmt - - - "Output format for header strings" - -typedef SeaState/SeaState InitInputType CHARACTER(1024) InputFile - - - "Supplied by Driver: full path and filename for the SeaState module" - +typedef SeaState/SeaSt InitInputType CHARACTER(1024) InputFile - - - "Supplied by Driver: full path and filename for the SeaState 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" - @@ -75,6 +75,45 @@ typedef ^ ^ ProgDesc Ver typedef ^ ^ ReKi WtrDens - - - "Water density, this is necessary to inform glue-code what the module is using for WtrDens (may not be the glue-code's default)" (kg/m^3) typedef ^ ^ ReKi WtrDpth - - - "Water depth, this is necessary to inform glue-code what the module is using for WtrDpth (may not be the glue-code's default)" (m) typedef ^ ^ ReKi MSL2SWL - - - "Offset between still-water level and mean sea level, this is necessary to inform glue-code what the module is using for MSL2SWL (may not be the glue-code's default)" (m) +typedef ^ ^ SiKi WaveElevC0 {*}{*} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) +typedef ^ ^ SiKi WaveElevC {:}{:}{:} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at all grid points. First column is real part, second column is imaginary part" (meters) +typedef ^ ^ SiKi WaveDirArr {*} - - "Wave direction array. Each frequency has a unique direction of WaveNDir > 1" (degrees) +typedef ^ ^ SiKi WaveDirMin - - - "Minimum wave direction." (degrees) +typedef ^ ^ SiKi WaveDirMax - - - "Maximum wave direction." (degrees) +typedef ^ ^ SiKi WaveDir - - - "Incident wave propagation heading direction" (degrees) +#typedef ^ ^ INTEGER WaveNDir - - - "Number of wave directions [only used if WaveDirMod = 1] [Must be an odd number -- will be adjusted within the waves module]" (-) +typedef ^ ^ LOGICAL WaveMultiDir - - - "Indicates the waves are multidirectional -- set by HydroDyn_Input" - +typedef ^ ^ SiKi WaveDOmega - - - "Frequency step for incident wave calculations" (rad/s) +#typedef ^ ^ SiKi WaveKinzi {:} - - "zi-coordinates for points where the incident wave kinematics will be computed; these are relative to the mean see level" (meters) +typedef ^ ^ SiKi WaveDynP {*}{*}{*}{*} - - "Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (N/m^2) +typedef ^ ^ SiKi WaveAcc {*}{*}{*}{*}{*} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (m/s^2) +typedef ^ ^ SiKi WaveVel {*}{*}{*}{*}{*} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) +#typedef ^ ^ SiKi PWaveDynP0 {*}{*}{*}{*} - - "Instantaneous dynamic pressure of incident waves , at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (N/m^2) +#typedef ^ ^ SiKi PWaveAcc0 {*}{*}{*}{*}{*} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (m/s^2) +#typedef ^ ^ SiKi PWaveVel0 {*}{*}{*}{*}{*} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) +typedef ^ ^ SiKi WaveElev {*}{*}{*} - - "Total wave elevation" - +typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" - +typedef ^ ^ SiKi WaveElev2 {*}{*}{*} - - "Second order wave elevation" - +typedef ^ ^ SiKi WaveElev0 {:} - - "Instantaneous elevation time-series of incident waves at the platform reference point" (meters) +typedef ^ ^ SiKi WaveTime {*} - - "Simulation times at which the instantaneous elevation of, velocity of, acceleration of, and loads associated with the incident waves are determined" (sec) +#typedef ^ ^ DbKi WaveTMax - - - "Analysis time for incident wave calculations; the actual analysis time may be larger than this value in order for the maintain an effecient FFT" (sec) +#typedef ^ ^ INTEGER nodeInWater {:}{:} - - "Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated" - +typedef ^ ^ SiKi RhoXg - - - "= WtrDens*Gravity" - +typedef ^ ^ INTEGER NStepWave - - - "Total number of frequency components = total number of time steps in the incident wave" - +typedef ^ ^ INTEGER NStepWave2 - - - "NStepWave / 2" - +typedef ^ ^ INTEGER WaveMod - - - "Incident wave kinematics model {0: none=still water, 1: plane progressive (regular), 2: JONSWAP/Pierson-Moskowitz spectrum (irregular), 3: white-noise spectrum, 4: user-defind spectrum from routine UserWaveSpctrm (irregular), 5: GH BLADED }" - +typedef ^ ^ INTEGER CurrMod - - - "" - +typedef ^ ^ INTEGER WaveStMod - - - "Model for stretching incident wave kinematics to instantaneous free surface {0: none=no stretching, 1: vertical stretching, 2: extrapolation stretching, 3: Wheeler stretching}" - +typedef ^ ^ INTEGER WaveDirMod - - - "Directional wave spreading function {0: none, 1: COS2S} [only used if WaveMod=6]" - +typedef ^ ^ SiKi WvLowCOff - - - "Low cut-off frequency or lower frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4]" (rad/s) +typedef ^ ^ SiKi WvHiCOff - - - "High cut-off frequency or upper frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4]" (rad/s) +typedef ^ ^ SiKi WvLowCOffD - - - "Minimum frequency used in the difference methods [Ignored if all difference methods = 0]" (rad/s) +typedef ^ ^ SiKi WvHiCOffD - - - "Maximum frequency used in the difference methods [Ignored if all difference methods = 0]" (rad/s) +typedef ^ ^ SiKi WvLowCOffS - - - "Minimum frequency used in the sum-QTF method [Ignored if SumQTF = 0]" (rad/s) +typedef ^ ^ SiKi WvHiCOffS - - - "Maximum frequency used in the sum-QTF method [Ignored if SumQTF = 0]" (rad/s) +typedef ^ ^ LOGICAL WvDiffQTFF - - - "Full difference QTF second order forces flag" (-) +typedef ^ ^ LOGICAL WvSumQTFF - - - "Full sum QTF second order forces flag" (-) +typedef ^ ^ SeaSt_Interp_ParameterType SeaSt_Interp_p - - - "parameter information from the SeaState Interpolation module" - # # # ..... States .................................................................................................................... @@ -99,7 +138,7 @@ typedef ^ OtherStateType Waves2_Othe typedef ^ MiscVarType INTEGER Decimate - - - "The output decimation counter" - typedef ^ ^ DbKi LastOutTime - - - "Last time step which was written to the output file (sec)" - typedef ^ ^ INTEGER LastIndWave - - - "The last index used in the wave kinematics arrays, used to optimize interpolation" - -typedef ^ ^ SeaState_Interp_MiscVarType Sea_Interp_m - - - "misc var information from the SeaState Interpolation module" - +typedef ^ ^ SeaSt_Interp_MiscVarType SeaSt_Interp_m - - - "misc var information from the SeaState Interpolation module" - typedef ^ ^ Waves2_MiscVarType Waves2 - - - "misc var information from the Waves2 module" - typedef ^ ^ Waves2_InputType u_Waves2 - - - "Waves2 module inputs" - # ..... Parameters ................................................................................................................ @@ -144,7 +183,7 @@ typedef ^ ^ CHARACTER(20) Out typedef ^ ^ CHARACTER(ChanLen) Delim - - - "Delimiter string for outputs, defaults to tab-delimiters" - typedef ^ ^ INTEGER UnOutFile - - - "File unit for the SeaState outputs" - typedef ^ ^ INTEGER OutDec - - - "Write every OutDec time steps" - -typedef ^ ^ SeaState_Interp_ParameterType Sea_Interp_p - - - "parameter information from the SeaState Interpolation module" - +typedef ^ ^ SeaSt_Interp_ParameterType SeaSt_Interp_p - - - "parameter information from the SeaState Interpolation module" - # # # ..... Inputs .................................................................................................................... diff --git a/modules/seastate/src/SeaState_DriverCode.f90 b/modules/seastate/src/SeaState_DriverCode.f90 index 138bfa2ac1..a772d1faa7 100644 --- a/modules/seastate/src/SeaState_DriverCode.f90 +++ b/modules/seastate/src/SeaState_DriverCode.f90 @@ -63,24 +63,24 @@ program SeaStateDriver real(DbKi) :: Interval ! HD module requested time interval integer(B1Ki), allocatable :: SaveAry(:) ! Array to store packed data structure - type(SeaState_InitInputType) :: InitInData ! Input data for initialization - type(SeaState_InitOutputType) :: InitOutData ! Output data from initialization + type(SeaSt_InitInputType) :: InitInData ! Input data for initialization + type(SeaSt_InitOutputType) :: InitOutData ! Output data from initialization - type(SeaState_ContinuousStateType) :: x ! Continuous states - type(SeaState_ContinuousStateType) :: x_new ! Continuous states at updated time - type(SeaState_DiscreteStateType) :: xd ! Discrete states - type(SeaState_DiscreteStateType) :: xd_new ! Discrete states at updated time - type(SeaState_ConstraintStateType) :: z ! Constraint states - type(SeaState_ConstraintStateType) :: z_residual ! Residual of the constraint state equations (Z) - type(SeaState_OtherStateType) :: OtherState ! Other states - type(SeaState_MiscVarType) :: m ! Misc/optimization variables + type(SeaSt_ContinuousStateType) :: x ! Continuous states + type(SeaSt_ContinuousStateType) :: x_new ! Continuous states at updated time + type(SeaSt_DiscreteStateType) :: xd ! Discrete states + type(SeaSt_DiscreteStateType) :: xd_new ! Discrete states at updated time + type(SeaSt_ConstraintStateType) :: z ! Constraint states + type(SeaSt_ConstraintStateType) :: z_residual ! Residual of the constraint state equations (Z) + type(SeaSt_OtherStateType) :: OtherState ! Other states + type(SeaSt_MiscVarType) :: m ! Misc/optimization variables - type(SeaState_ParameterType) :: p ! Parameters - !type(SeaState_InputType) :: u ! System inputs [OLD STYLE] - type(SeaState_InputType) :: u(NumInp) ! System inputs - type(SeaState_OutputType) :: y ! System outputs + type(SeaSt_ParameterType) :: p ! Parameters + !type(SeaSt_InputType) :: u ! System inputs [OLD STYLE] + type(SeaSt_InputType) :: u(NumInp) ! System inputs + type(SeaSt_OutputType) :: y ! System outputs - type(SeaState_ContinuousStateType) :: dxdt ! First time derivatives of the continuous states + type(SeaSt_ContinuousStateType) :: dxdt ! First time derivatives of the continuous states integer(IntKi) :: UnSeaSt_Out ! Output file identifier integer(IntKi) :: I ! Generic loop counter @@ -164,7 +164,7 @@ program SeaStateDriver InitInData%UseInputFile = .TRUE. InitInData%InputFile = drvrInitInp%SeaStateInputFile InitInData%OutRootName = drvrInitInp%OutRootName - InitInData%TMax = drvrInitInp%NSteps * drvrInitInp%TimeInterval + InitInData%TMax = (drvrInitInp%NSteps-1) * drvrInitInp%TimeInterval ! Starting time is always t = 0.0 ! Get the current time call date_and_time ( Values=StrtTime ) ! Let's time the whole simulation @@ -183,7 +183,7 @@ program SeaStateDriver !if ( drvrInitInp%WaveElevSeriesFlag ) then ! ALLOCATE ( InitInData%WaveElevXY(2,drvrInitInp%WaveElevNX*drvrInitInp%WaveElevNY), STAT=ErrStat ) ! if ( ErrStat >= ErrID_Fatal ) then - ! call SeaState_End( u(1), p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) + ! call SeaSt_End( u(1), p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! if ( ErrStat /= ErrID_None ) then ! call WrScr( ErrMsg ) ! end if @@ -205,7 +205,7 @@ program SeaStateDriver ! Initialize the module Interval = drvrInitInp%TimeInterval - call SeaState_Init( InitInData, u(1), p, x, xd, z, OtherState, y, m, Interval, InitOutData, ErrStat, ErrMsg ) + call SeaSt_Init( InitInData, u(1), p, x, xd, z, OtherState, y, m, Interval, InitOutData, ErrStat, ErrMsg ) if (errStat >= AbortErrLev) then ! Clean up and exit call SeaSt_DvrCleanup() @@ -229,8 +229,8 @@ program SeaStateDriver ! Destroy initialization data - call SeaState_DestroyInitInput( InitInData, ErrStat, ErrMsg ) - call SeaState_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) + call SeaSt_DestroyInitInput( InitInData, ErrStat, ErrMsg ) + call SeaSt_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) @@ -253,7 +253,7 @@ program SeaStateDriver ! Calculate outputs at n - call SeaState_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) + call SeaSt_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) if (errStat >= AbortErrLev) then ! Clean up and exit call SeaSt_DvrCleanup() @@ -309,10 +309,10 @@ subroutine SeaSt_DvrCleanup() errStat2 = ErrID_None errMsg2 = "" - call SeaState_DestroyInitInput( InitInData, errStat2, errMsg2 ) + call SeaSt_DestroyInitInput( InitInData, errStat2, errMsg2 ) call SetErrStat( errStat2, errMsg2, errStat, errMsg, 'SeaSt_DvrCleanup' ) - call SeaState_End( u(1), p, x, xd, z, OtherState, y, m, errStat2, errMsg2 ) + call SeaSt_End( u(1), p, x, xd, z, OtherState, y, m, errStat2, errMsg2 ) call SetErrStat( errStat2, errMsg2, errStat, errMsg, 'SeaSt_DvrCleanup' ) if ( ErrStat /= ErrID_None ) then !This assumes PRESENT(ErrID) is also .TRUE. : @@ -640,9 +640,9 @@ end SUBROUTINE ReadDriverInputFile SUBROUTINE WaveElevGrid_Output (drvrInitInp, SeaStateInitInp, SeaStateInitOut, SeaState_p, ErrStat, ErrMsg) type(SeaSt_drvr_InitInput), intent( in ) :: drvrInitInp - type(SeaState_InitInputType), intent( in ) :: SeaStateInitInp - type(SeaState_InitOutputType), intent( in ) :: SeaStateInitOut ! Output data from initialization - type(SeaState_ParameterType), intent( in ) :: SeaState_p ! Output data from initialization + type(SeaSt_InitInputType), intent( in ) :: SeaStateInitInp + type(SeaSt_InitOutputType), intent( in ) :: SeaStateInitOut ! Output data from initialization + type(SeaSt_ParameterType), intent( in ) :: SeaState_p ! Output data from initialization integer, intent( out ) :: ErrStat ! returns a non-zero value when an error occurs character(*), intent( out ) :: ErrMsg ! Error message if ErrStat /= ErrID_None diff --git a/modules/seastate/src/SeaState_Input.f90 b/modules/seastate/src/SeaState_Input.f90 index 4cba91a727..c8239093ff 100644 --- a/modules/seastate/src/SeaState_Input.f90 +++ b/modules/seastate/src/SeaState_Input.f90 @@ -54,7 +54,7 @@ SUBROUTINE PrintBadChannelWarning(NUserOutputs, UserOutputs , foundMask, ErrStat END SUBROUTINE PrintBadChannelWarning !==================================================================================================== -subroutine SeaState_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDpth, defMSL2SWL, FileInfo_In, InputFileData, ErrStat, ErrMsg ) +subroutine SeaSt_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDpth, defMSL2SWL, FileInfo_In, InputFileData, ErrStat, ErrMsg ) ! This public subroutine reads the input required for SeaState from the file whose name is an ! input parameter. !---------------------------------------------------------------------------------------------------- @@ -66,7 +66,7 @@ subroutine SeaState_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDp 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(SeaState_InputFile), INTENT(INOUT) :: InputFileData ! the SeaState input file data + type(SeaSt_InputFile), INTENT(INOUT) :: InputFileData ! the SeaState 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 @@ -84,7 +84,7 @@ subroutine SeaState_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDp integer(IntKi) :: CurLine !< Current entry in FileInfo_In%Lines array integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SeaState_ParaseInput' + character(*), parameter :: RoutineName = 'SeaSt_ParaseInput' ! Initialize local data UnEc = -1 @@ -439,7 +439,7 @@ subroutine SeaState_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDp ! WaveKinzi call ParseAry ( FileInfo_In, CurLine, 'WaveKinzi.', InputFileData%WaveKinzi, InputFileData%NWaveKin, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; - + !------------------------------------------------------------------------------------------------- ! Data section for OUTPUT CHANNELS !------------------------------------------------------------------------------------------------- @@ -471,7 +471,7 @@ subroutine Cleanup() if (UnEc > 0) close ( UnEc ) end subroutine Cleanup -end subroutine SeaState_ParseInput +end subroutine SeaSt_ParseInput !==================================================================================================== subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, ErrStat, ErrMsg ) @@ -481,10 +481,10 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E ! Passed variables - type(SeaState_InitInputType), intent( in ) :: InitInp ! the SeaState data - type(SeaState_ParameterType), intent( inout ) :: p ! the SeaState parameter data + type(SeaSt_InitInputType), intent( in ) :: InitInp ! the SeaState data + type(SeaSt_ParameterType), intent( inout ) :: p ! the SeaState parameter data real(DbKi), intent( in ) :: Interval ! The DT supplied by the glue code/driver - type(SeaState_InputFile), intent( inout ) :: InputFileData ! the SeaState input file data + type(SeaSt_InputFile), intent( inout ) :: InputFileData ! the SeaState 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 @@ -563,7 +563,7 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E ! Z_Depth - Depth of the domain the Z direction (m) !TODO: I'm not sure we want to offset this grid depth value. Check with Jason. - InputFileData%Z_Depth = InputFileData%Z_Depth + InputFileData%MSL2SWL + !InputFileData%Z_Depth = InputFileData%Z_Depth + InputFileData%MSL2SWL if ( ( InputFileData%Z_Depth <= 0.0_ReKi ) .or. ( InputFileData%Z_Depth > InputFileData%Waves%WtrDpth ) ) then call SetErrStat( ErrID_Fatal,'Z_Depth must be greater than zero and less than or equal to the WtrDpth + MSL2SWL.',ErrStat,ErrMsg,RoutineName) return @@ -619,22 +619,12 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E end if ! LEN_TRIM(InputFileData%Waves%WaveModChr) - if ( (WaveModIn == 6) .AND. .NOT. EqualRealNos(InputFileData%MSL2SWL, 0.0_ReKi) ) then - call SetErrStat( ErrID_Fatal,'MSL2SWL must be 0 when WaveMod = 6.',ErrStat,ErrMsg,RoutineName) - return - end if !TODO: THese tests need to be done by HD GJH 7/11/21 -! if ( WaveModIn < 0 .OR. WaveModIn > 6 ) 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... -! else if ( ErrStat /= ErrID_None .OR. WaveModIn /= 5) then -! call SetErrStat( ErrID_Fatal,'WaveMod must be 0, 1, 1P#, 2, 3, 4, or 5.',ErrStat,ErrMsg,RoutineName) -! return -! end if -! end if + if ( WaveModIn < 0 .OR. WaveModIn > 6 ) then + call SetErrStat( ErrID_Fatal,'WaveMod must be 0, 1, 1P#, 2, 3, 4, 5, or 6.',ErrStat,ErrMsg,RoutineName) + return + end if ! Linearization Checks ! LIN-TODO: @@ -1234,6 +1224,8 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E !InputFileData%OutFmt !InputFileData%OutSFmt + ! Shift from MSL to SWL coordinate system + InputFileData%WaveKinzi(:) = InputFileData%WaveKinzi(:) - InputFileData%MSL2SWL ! OutList - list of requested parameters to output to a file diff --git a/modules/seastate/src/SeaState_Interp_Types.f90 b/modules/seastate/src/SeaState_Interp_Types.f90 index ad581bdc43..e8a54a9a60 100644 --- a/modules/seastate/src/SeaState_Interp_Types.f90 +++ b/modules/seastate/src/SeaState_Interp_Types.f90 @@ -33,39 +33,39 @@ MODULE SeaState_Interp_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE -! ========= SeaState_Interp_InitInputType ======= - TYPE, PUBLIC :: SeaState_Interp_InitInputType +! ========= SeaSt_Interp_InitInputType ======= + TYPE, PUBLIC :: SeaSt_Interp_InitInputType INTEGER(IntKi) , DIMENSION(1:4) :: n !< number of grid points in the x, y, z, and t directions [-] REAL(ReKi) , DIMENSION(1:4) :: delta !< size between 2 consecutive grid points in each grid direction [m,m,m,s] REAL(ReKi) , DIMENSION(1:4) :: pZero !< fixed position of the XYZ grid (i.e., XYZ coordinates of m%V(:,1,1,1,:)) [m] REAL(ReKi) :: Z_Depth !< grid depth [m] - END TYPE SeaState_Interp_InitInputType + END TYPE SeaSt_Interp_InitInputType ! ======================= -! ========= SeaState_Interp_InitOutputType ======= - TYPE, PUBLIC :: SeaState_Interp_InitOutputType +! ========= SeaSt_Interp_InitOutputType ======= + TYPE, PUBLIC :: SeaSt_Interp_InitOutputType TYPE(ProgDesc) :: Ver !< Version information of this submodule [-] - END TYPE SeaState_Interp_InitOutputType + END TYPE SeaSt_Interp_InitOutputType ! ======================= -! ========= SeaState_Interp_MiscVarType ======= - TYPE, PUBLIC :: SeaState_Interp_MiscVarType +! ========= SeaSt_Interp_MiscVarType ======= + TYPE, PUBLIC :: SeaSt_Interp_MiscVarType REAL(SiKi) , DIMENSION(1:8) :: N3D !< this is the 3-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field [-] REAL(SiKi) , DIMENSION(1:16) :: N4D !< this is the 4-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field [-] INTEGER(IntKi) , DIMENSION(1:4) :: Indx_Lo !< this is the 4-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field [-] INTEGER(IntKi) , DIMENSION(1:4) :: Indx_Hi !< this is the 4-d velocity field for each wind component [{uvw},nx,ny,nz,nt]; it is stored as a miscVar instead of an input so that we don't have 4 copies of a very large field [-] - END TYPE SeaState_Interp_MiscVarType + END TYPE SeaSt_Interp_MiscVarType ! ======================= -! ========= SeaState_Interp_ParameterType ======= - TYPE, PUBLIC :: SeaState_Interp_ParameterType +! ========= SeaSt_Interp_ParameterType ======= + TYPE, PUBLIC :: SeaSt_Interp_ParameterType INTEGER(IntKi) , DIMENSION(1:4) :: n !< number of evenly-spaced grid points in the x, y, z, and t directions [-] REAL(ReKi) , DIMENSION(1:4) :: delta !< size between 2 consecutive grid points in each grid direction [m,m,m,s] REAL(ReKi) , DIMENSION(1:4) :: pZero !< fixed position of the XYZ grid (i.e., XYZ coordinates of m%V(:,1,1,1,:)) [m] REAL(ReKi) :: Z_Depth !< grid depth [m] - END TYPE SeaState_Interp_ParameterType + END TYPE SeaSt_Interp_ParameterType ! ======================= CONTAINS - SUBROUTINE SeaState_Interp_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_Interp_InitInputType), INTENT(IN) :: SrcInitInputData - TYPE(SeaState_Interp_InitInputType), INTENT(INOUT) :: DstInitInputData + SUBROUTINE SeaSt_Interp_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_Interp_InitInputType), INTENT(IN) :: SrcInitInputData + TYPE(SeaSt_Interp_InitInputType), INTENT(INOUT) :: DstInitInputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -74,7 +74,7 @@ SUBROUTINE SeaState_Interp_CopyInitInput( SrcInitInputData, DstInitInputData, Ct INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_CopyInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_CopyInitInput' ! ErrStat = ErrID_None ErrMsg = "" @@ -82,24 +82,24 @@ SUBROUTINE SeaState_Interp_CopyInitInput( SrcInitInputData, DstInitInputData, Ct DstInitInputData%delta = SrcInitInputData%delta DstInitInputData%pZero = SrcInitInputData%pZero DstInitInputData%Z_Depth = SrcInitInputData%Z_Depth - END SUBROUTINE SeaState_Interp_CopyInitInput + END SUBROUTINE SeaSt_Interp_CopyInitInput - SUBROUTINE SeaState_Interp_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) - TYPE(SeaState_Interp_InitInputType), INTENT(INOUT) :: InitInputData + SUBROUTINE SeaSt_Interp_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) + TYPE(SeaSt_Interp_InitInputType), INTENT(INOUT) :: InitInputData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_DestroyInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_DestroyInitInput' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE SeaState_Interp_DestroyInitInput + END SUBROUTINE SeaSt_Interp_DestroyInitInput - SUBROUTINE SeaState_Interp_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_Interp_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(SeaState_Interp_InitInputType), INTENT(IN) :: InData + TYPE(SeaSt_Interp_InitInputType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -114,7 +114,7 @@ SUBROUTINE SeaState_Interp_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, Er LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_PackInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_PackInitInput' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -175,13 +175,13 @@ SUBROUTINE SeaState_Interp_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, Er END DO ReKiBuf(Re_Xferred) = InData%Z_Depth Re_Xferred = Re_Xferred + 1 - END SUBROUTINE SeaState_Interp_PackInitInput + END SUBROUTINE SeaSt_Interp_PackInitInput - SUBROUTINE SeaState_Interp_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_Interp_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(SeaState_Interp_InitInputType), INTENT(INOUT) :: OutData + TYPE(SeaSt_Interp_InitInputType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -193,7 +193,7 @@ SUBROUTINE SeaState_Interp_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_UnPackInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_UnPackInitInput' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -224,11 +224,11 @@ SUBROUTINE SeaState_Interp_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, END DO OutData%Z_Depth = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 - END SUBROUTINE SeaState_Interp_UnPackInitInput + END SUBROUTINE SeaSt_Interp_UnPackInitInput - SUBROUTINE SeaState_Interp_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_Interp_InitOutputType), INTENT(IN) :: SrcInitOutputData - TYPE(SeaState_Interp_InitOutputType), INTENT(INOUT) :: DstInitOutputData + SUBROUTINE SeaSt_Interp_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_Interp_InitOutputType), INTENT(IN) :: SrcInitOutputData + TYPE(SeaSt_Interp_InitOutputType), INTENT(INOUT) :: DstInitOutputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -236,32 +236,32 @@ SUBROUTINE SeaState_Interp_CopyInitOutput( SrcInitOutputData, DstInitOutputData, INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_CopyInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_CopyInitOutput' ! ErrStat = ErrID_None ErrMsg = "" CALL NWTC_Library_Copyprogdesc( SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - END SUBROUTINE SeaState_Interp_CopyInitOutput + END SUBROUTINE SeaSt_Interp_CopyInitOutput - SUBROUTINE SeaState_Interp_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) - TYPE(SeaState_Interp_InitOutputType), INTENT(INOUT) :: InitOutputData + SUBROUTINE SeaSt_Interp_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) + TYPE(SeaSt_Interp_InitOutputType), INTENT(INOUT) :: InitOutputData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_DestroyInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_DestroyInitOutput' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" CALL NWTC_Library_Destroyprogdesc( InitOutputData%Ver, ErrStat, ErrMsg ) - END SUBROUTINE SeaState_Interp_DestroyInitOutput + END SUBROUTINE SeaSt_Interp_DestroyInitOutput - SUBROUTINE SeaState_Interp_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_Interp_PackInitOutput( 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(SeaState_Interp_InitOutputType), INTENT(IN) :: InData + TYPE(SeaSt_Interp_InitOutputType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -276,7 +276,7 @@ SUBROUTINE SeaState_Interp_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, E LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_PackInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_PackInitOutput' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -365,13 +365,13 @@ SUBROUTINE SeaState_Interp_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, E ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END SUBROUTINE SeaState_Interp_PackInitOutput + END SUBROUTINE SeaSt_Interp_PackInitOutput - SUBROUTINE SeaState_Interp_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_Interp_UnPackInitOutput( 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(SeaState_Interp_InitOutputType), INTENT(INOUT) :: OutData + TYPE(SeaSt_Interp_InitOutputType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -382,7 +382,7 @@ SUBROUTINE SeaState_Interp_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata INTEGER(IntKi) :: i INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_UnPackInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_UnPackInitOutput' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -433,11 +433,11 @@ SUBROUTINE SeaState_Interp_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) - END SUBROUTINE SeaState_Interp_UnPackInitOutput + END SUBROUTINE SeaSt_Interp_UnPackInitOutput - SUBROUTINE SeaState_Interp_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_Interp_MiscVarType), INTENT(IN) :: SrcMiscData - TYPE(SeaState_Interp_MiscVarType), INTENT(INOUT) :: DstMiscData + SUBROUTINE SeaSt_Interp_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_Interp_MiscVarType), INTENT(IN) :: SrcMiscData + TYPE(SeaSt_Interp_MiscVarType), INTENT(INOUT) :: DstMiscData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -446,7 +446,7 @@ SUBROUTINE SeaState_Interp_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_CopyMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_CopyMisc' ! ErrStat = ErrID_None ErrMsg = "" @@ -454,24 +454,24 @@ SUBROUTINE SeaState_Interp_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat DstMiscData%N4D = SrcMiscData%N4D DstMiscData%Indx_Lo = SrcMiscData%Indx_Lo DstMiscData%Indx_Hi = SrcMiscData%Indx_Hi - END SUBROUTINE SeaState_Interp_CopyMisc + END SUBROUTINE SeaSt_Interp_CopyMisc - SUBROUTINE SeaState_Interp_DestroyMisc( MiscData, ErrStat, ErrMsg ) - TYPE(SeaState_Interp_MiscVarType), INTENT(INOUT) :: MiscData + SUBROUTINE SeaSt_Interp_DestroyMisc( MiscData, ErrStat, ErrMsg ) + TYPE(SeaSt_Interp_MiscVarType), INTENT(INOUT) :: MiscData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_DestroyMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_DestroyMisc' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE SeaState_Interp_DestroyMisc + END SUBROUTINE SeaSt_Interp_DestroyMisc - SUBROUTINE SeaState_Interp_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_Interp_PackMisc( 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(SeaState_Interp_MiscVarType), INTENT(IN) :: InData + TYPE(SeaSt_Interp_MiscVarType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -486,7 +486,7 @@ SUBROUTINE SeaState_Interp_PackMisc( 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 = 'SeaState_Interp_PackMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_PackMisc' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -549,13 +549,13 @@ SUBROUTINE SeaState_Interp_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat IntKiBuf(Int_Xferred) = InData%Indx_Hi(i1) Int_Xferred = Int_Xferred + 1 END DO - END SUBROUTINE SeaState_Interp_PackMisc + END SUBROUTINE SeaSt_Interp_PackMisc - SUBROUTINE SeaState_Interp_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_Interp_UnPackMisc( 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(SeaState_Interp_MiscVarType), INTENT(INOUT) :: OutData + TYPE(SeaSt_Interp_MiscVarType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -567,7 +567,7 @@ SUBROUTINE SeaState_Interp_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrS INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_UnPackMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_UnPackMisc' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -602,11 +602,11 @@ SUBROUTINE SeaState_Interp_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrS OutData%Indx_Hi(i1) = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 END DO - END SUBROUTINE SeaState_Interp_UnPackMisc + END SUBROUTINE SeaSt_Interp_UnPackMisc - SUBROUTINE SeaState_Interp_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_Interp_ParameterType), INTENT(IN) :: SrcParamData - TYPE(SeaState_Interp_ParameterType), INTENT(INOUT) :: DstParamData + SUBROUTINE SeaSt_Interp_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_Interp_ParameterType), INTENT(IN) :: SrcParamData + TYPE(SeaSt_Interp_ParameterType), INTENT(INOUT) :: DstParamData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -615,7 +615,7 @@ SUBROUTINE SeaState_Interp_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrS INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_CopyParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_CopyParam' ! ErrStat = ErrID_None ErrMsg = "" @@ -623,24 +623,24 @@ SUBROUTINE SeaState_Interp_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrS DstParamData%delta = SrcParamData%delta DstParamData%pZero = SrcParamData%pZero DstParamData%Z_Depth = SrcParamData%Z_Depth - END SUBROUTINE SeaState_Interp_CopyParam + END SUBROUTINE SeaSt_Interp_CopyParam - SUBROUTINE SeaState_Interp_DestroyParam( ParamData, ErrStat, ErrMsg ) - TYPE(SeaState_Interp_ParameterType), INTENT(INOUT) :: ParamData + SUBROUTINE SeaSt_Interp_DestroyParam( ParamData, ErrStat, ErrMsg ) + TYPE(SeaSt_Interp_ParameterType), INTENT(INOUT) :: ParamData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_DestroyParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_DestroyParam' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE SeaState_Interp_DestroyParam + END SUBROUTINE SeaSt_Interp_DestroyParam - SUBROUTINE SeaState_Interp_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_Interp_PackParam( 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(SeaState_Interp_ParameterType), INTENT(IN) :: InData + TYPE(SeaSt_Interp_ParameterType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -655,7 +655,7 @@ SUBROUTINE SeaState_Interp_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrSta LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_PackParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_PackParam' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -716,13 +716,13 @@ SUBROUTINE SeaState_Interp_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrSta END DO ReKiBuf(Re_Xferred) = InData%Z_Depth Re_Xferred = Re_Xferred + 1 - END SUBROUTINE SeaState_Interp_PackParam + END SUBROUTINE SeaSt_Interp_PackParam - SUBROUTINE SeaState_Interp_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_Interp_UnPackParam( 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(SeaState_Interp_ParameterType), INTENT(INOUT) :: OutData + TYPE(SeaSt_Interp_ParameterType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -734,7 +734,7 @@ SUBROUTINE SeaState_Interp_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, Err INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_UnPackParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_UnPackParam' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -765,7 +765,7 @@ SUBROUTINE SeaState_Interp_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, Err END DO OutData%Z_Depth = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 - END SUBROUTINE SeaState_Interp_UnPackParam + END SUBROUTINE SeaSt_Interp_UnPackParam END MODULE SeaState_Interp_Types !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/SeaState_Output.f90 b/modules/seastate/src/SeaState_Output.f90 index 0001c2c672..00841758d5 100644 --- a/modules/seastate/src/SeaState_Output.f90 +++ b/modules/seastate/src/SeaState_Output.f90 @@ -446,10 +446,10 @@ END SUBROUTINE SeaStOut_WriteWvKinFiles !==================================================================================================== subroutine SeaStOut_MapOutputs( CurrentTime, p, NWaveElev, WaveElev, WaveElev1, WaveElev2, NWaveKin, WaveVel, WaveAcc, WaveDynP, AllOuts, ErrStat, ErrMsg ) ! This subroutine writes the data stored in the y variable to the correct indexed postions in WriteOutput -! This is called by SeaState_CalcOutput() at each time step. +! This is called by SeaSt_CalcOutput() at each time step. !---------------------------------------------------------------------------------------------------- REAL(DbKi), intent( in ) :: CurrentTime ! Current simulation time in seconds - TYPE(SeaState_ParameterType), intent( in ) :: p ! SeaState's parameter data + TYPE(SeaSt_ParameterType), intent( in ) :: p ! SeaState's parameter data INTEGER, intent( in ) :: NWaveElev ! Number of wave elevation locations to output REAL(ReKi), intent( in ) :: WaveElev(:) ! Instantaneous total elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) REAL(ReKi), intent( in ) :: WaveElev1(:) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) @@ -496,8 +496,8 @@ SUBROUTINE SeaStOut_WriteOutputs( Time, y, p, Decimate, ErrStat, ErrMsg ) ! Passed variables REAL(DbKi), INTENT( IN ) :: Time - TYPE(SeaState_OutputType), INTENT( INOUT ) :: y ! SeaState's output data - TYPE(SeaState_ParameterType), INTENT( IN ) :: p ! SeaState parameter data + TYPE(SeaSt_OutputType), INTENT( INOUT ) :: y ! SeaState's output data + TYPE(SeaSt_ParameterType), INTENT( IN ) :: p ! SeaState parameter data INTEGER, INTENT( INOUT ) :: Decimate ! Output decimatation counter INTEGER, INTENT( OUT ) :: ErrStat ! returns a non-zero value when an error occurs CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -552,7 +552,7 @@ SUBROUTINE SeaStOut_WriteOutputs( Time, y, p, Decimate, ErrStat, ErrMsg ) END SUBROUTINE SeaStOut_WriteOutputs !==================================================================================================== -SUBROUTINE SeaStOut_Init( SeaState_ProgDesc, OutRootName, InputFileData, y, p, m, InitOut, ErrStat, ErrMsg ) +SUBROUTINE SeaStOut_Init( SeaSt_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. @@ -562,13 +562,13 @@ SUBROUTINE SeaStOut_Init( SeaState_ProgDesc, OutRootName, InputFileData, y, p, ! Passed variables - TYPE(ProgDesc), INTENT( IN ) :: SeaState_ProgDesc ! + TYPE(ProgDesc), INTENT( IN ) :: SeaSt_ProgDesc ! CHARACTER(1024), INTENT( IN ) :: OutRootName ! The name of the output file - TYPE(SeaState_InputFile ), INTENT( IN ) :: InputFileData ! data needed to initialize the output module - TYPE(SeaState_OutputType), INTENT( INOUT ) :: y ! This module's internal data - TYPE(SeaState_ParameterType), INTENT( INOUT ) :: p - TYPE(SeaState_MiscVarType), INTENT( INOUT ) :: m - TYPE(SeaState_InitOutputType), INTENT( INOUT ) :: InitOut + TYPE(SeaSt_InputFile ), INTENT( IN ) :: InputFileData ! data needed to initialize the output module + TYPE(SeaSt_OutputType), INTENT( INOUT ) :: y ! This module's internal data + TYPE(SeaSt_ParameterType), INTENT( INOUT ) :: p + TYPE(SeaSt_MiscVarType), INTENT( INOUT ) :: m + TYPE(SeaSt_InitOutputType), INTENT( INOUT ) :: InitOut INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -658,7 +658,7 @@ SUBROUTINE SeaStOut_Init( SeaState_ProgDesc, OutRootName, InputFileData, y, p, IF ( p%OutSwtch == 1 .OR. p%OutSwtch == 3 ) THEN - CALL SeaStOut_OpenOutput( SeaState_ProgDesc, OutRootName, p, InitOut, ErrStat, ErrMsg ) + CALL SeaStOut_OpenOutput( SeaSt_ProgDesc, OutRootName, p, InitOut, ErrStat, ErrMsg ) IF (ErrStat >= AbortErrLev ) RETURN END IF @@ -669,7 +669,7 @@ SUBROUTINE SeaStOut_Init( SeaState_ProgDesc, OutRootName, InputFileData, y, p, END SUBROUTINE SeaStOUT_Init !==================================================================================================== -SUBROUTINE SeaStOut_OpenOutput( SeaState_ProgDesc, OutRootName, p, InitOut, ErrStat, ErrMsg ) +SUBROUTINE SeaStOut_OpenOutput( SeaSt_ProgDesc, OutRootName, p, 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 !---------------------------------------------------------------------------------------------------- @@ -678,10 +678,10 @@ SUBROUTINE SeaStOut_OpenOutput( SeaState_ProgDesc, OutRootName, p, InitOut, Err ! Passed variables - TYPE(ProgDesc) , INTENT( IN ) :: SeaState_ProgDesc + TYPE(ProgDesc) , INTENT( IN ) :: SeaSt_ProgDesc CHARACTER(1024), INTENT( IN ) :: OutRootName ! Root name for the output file - TYPE(SeaState_ParameterType), INTENT( INOUT ) :: p - TYPE(SeaState_InitOutPutType ),INTENT( IN ) :: InitOut ! + TYPE(SeaSt_ParameterType), INTENT( INOUT ) :: p + TYPE(SeaSt_InitOutPutType ),INTENT( IN ) :: InitOut ! INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -715,7 +715,7 @@ SUBROUTINE SeaStOut_OpenOutput( SeaState_ProgDesc, OutRootName, p, InitOut, Err ! Write the output file header - WRITE (p%UnOutFile,'(/,A/)', IOSTAT=ErrStat) 'These predictions were generated by '//TRIM(SeaState_ProgDesc%Name)//& + WRITE (p%UnOutFile,'(/,A/)', IOSTAT=ErrStat) 'These predictions were generated by '//TRIM(SeaSt_ProgDesc%Name)//& ' on '//CurDate()//' at '//CurTime()//'.' ! Write three empty lines @@ -869,8 +869,8 @@ SUBROUTINE SeaStOut_ChkOutLst( OutList, y, p, ErrStat, ErrMsg ) ! Passed variables - TYPE(SeaState_OutputType), INTENT( INOUT ) :: y ! This module's internal data - TYPE(SeaState_ParameterType), INTENT( INOUT ) :: p ! parameter data for this instance of the HD module + TYPE(SeaSt_OutputType), INTENT( INOUT ) :: y ! This module's internal data + TYPE(SeaSt_ParameterType), INTENT( INOUT ) :: p ! parameter data for this instance of the HD module ! INTEGER, INTENT(IN ) :: NumMemberNodes(*) ! the number of nodes on each of the first 9 members CHARACTER(ChanLen), INTENT( IN ) :: OutList (:) ! An array holding the names of the requested output channels. INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred @@ -977,7 +977,7 @@ SUBROUTINE SeaStOut_CloseOutput ( p, ErrStat, ErrMsg ) ! Passed variables - TYPE(SeaState_ParameterType), INTENT( INOUT ) :: p ! parameter data for this instance of the SeaState module + TYPE(SeaSt_ParameterType), INTENT( INOUT ) :: p ! parameter data for this instance of the SeaState module INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None diff --git a/modules/seastate/src/SeaState_Types.f90 b/modules/seastate/src/SeaState_Types.f90 index 60f0703b81..b51c960fa8 100644 --- a/modules/seastate/src/SeaState_Types.f90 +++ b/modules/seastate/src/SeaState_Types.f90 @@ -38,8 +38,8 @@ MODULE SeaState_Types USE NWTC_Library IMPLICIT NONE INTEGER(IntKi), PUBLIC, PARAMETER :: MaxSeaStOutputs = 90 ! The maximum number of output channels supported by this module [-] -! ========= SeaState_InputFile ======= - TYPE, PUBLIC :: SeaState_InputFile +! ========= SeaSt_InputFile ======= + TYPE, PUBLIC :: SeaSt_InputFile LOGICAL :: EchoFlag !< Echo the input file [-] REAL(ReKi) :: MSL2SWL !< Mean Sea Level to Still Water Level offset [m] REAL(ReKi) :: X_HalfWidth !< Half-width of the domain in the X direction [m] @@ -69,10 +69,10 @@ MODULE SeaState_Types INTEGER(IntKi) :: UnSum !< File unit for the SeaState summary file [-1 = no summary file] [-] CHARACTER(20) :: OutFmt !< Output format for numerical results [-] CHARACTER(20) :: OutSFmt !< Output format for header strings [-] - END TYPE SeaState_InputFile + END TYPE SeaSt_InputFile ! ======================= -! ========= SeaState_InitInputType ======= - TYPE, PUBLIC :: SeaState_InitInputType +! ========= SeaSt_InitInputType ======= + TYPE, PUBLIC :: SeaSt_InitInputType CHARACTER(1024) :: InputFile !< Supplied by Driver: full path and filename for the SeaState 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 [-] @@ -85,10 +85,10 @@ MODULE SeaState_Types 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 SeaState_InitInputType + END TYPE SeaSt_InitInputType ! ======================= -! ========= SeaState_InitOutputType ======= - TYPE, PUBLIC :: SeaState_InitOutputType +! ========= SeaSt_InitOutputType ======= + TYPE, PUBLIC :: SeaSt_InitOutputType TYPE(Waves2_InitOutputType) :: Waves2 !< Initialization output from the Waves2 module [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< The is the list of all HD-related output channel header strings (includes all sub-module channels) [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< The is the list of all HD-related output channel unit strings (includes all sub-module channels) [-] @@ -97,40 +97,72 @@ MODULE SeaState_Types REAL(ReKi) :: WtrDens !< Water density, this is necessary to inform glue-code what the module is using for WtrDens (may not be the glue-code's default) [(kg/m^3)] REAL(ReKi) :: WtrDpth !< Water depth, this is necessary to inform glue-code what the module is using for WtrDpth (may not be the glue-code's default) [(m)] REAL(ReKi) :: MSL2SWL !< Offset between still-water level and mean sea level, this is necessary to inform glue-code what the module is using for MSL2SWL (may not be the glue-code's default) [(m)] - END TYPE SeaState_InitOutputType + REAL(SiKi) , DIMENSION(:,:), POINTER :: WaveElevC0 => NULL() !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] + REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveElevC !< Discrete Fourier transform of the instantaneous elevation of incident waves at all grid points. First column is real part, second column is imaginary part [(meters)] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveDirArr => NULL() !< Wave direction array. Each frequency has a unique direction of WaveNDir > 1 [(degrees)] + REAL(SiKi) :: WaveDirMin !< Minimum wave direction. [(degrees)] + REAL(SiKi) :: WaveDirMax !< Maximum wave direction. [(degrees)] + REAL(SiKi) :: WaveDir !< Incident wave propagation heading direction [(degrees)] + LOGICAL :: WaveMultiDir !< Indicates the waves are multidirectional -- set by HydroDyn_Input [-] + REAL(SiKi) :: WaveDOmega !< Frequency step for incident wave calculations [(rad/s)] + REAL(SiKi) , DIMENSION(:,:,:,:), POINTER :: WaveDynP => NULL() !< Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed [(N/m^2)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveAcc => NULL() !< Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed [(m/s^2)] + REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveVel => NULL() !< Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.) [(m/s)] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev => NULL() !< Total wave elevation [-] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [-] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev2 => NULL() !< Second order wave elevation [-] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElev0 !< Instantaneous elevation time-series of incident waves at the platform reference point [(meters)] + REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Simulation times at which the instantaneous elevation of, velocity of, acceleration of, and loads associated with the incident waves are determined [(sec)] + REAL(SiKi) :: RhoXg !< = WtrDens*Gravity [-] + INTEGER(IntKi) :: NStepWave !< Total number of frequency components = total number of time steps in the incident wave [-] + INTEGER(IntKi) :: NStepWave2 !< NStepWave / 2 [-] + INTEGER(IntKi) :: WaveMod !< Incident wave kinematics model {0: none=still water, 1: plane progressive (regular), 2: JONSWAP/Pierson-Moskowitz spectrum (irregular), 3: white-noise spectrum, 4: user-defind spectrum from routine UserWaveSpctrm (irregular), 5: GH BLADED } [-] + INTEGER(IntKi) :: CurrMod !< [-] + INTEGER(IntKi) :: WaveStMod !< Model for stretching incident wave kinematics to instantaneous free surface {0: none=no stretching, 1: vertical stretching, 2: extrapolation stretching, 3: Wheeler stretching} [-] + INTEGER(IntKi) :: WaveDirMod !< Directional wave spreading function {0: none, 1: COS2S} [only used if WaveMod=6] [-] + REAL(SiKi) :: WvLowCOff !< Low cut-off frequency or lower frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4] [(rad/s)] + REAL(SiKi) :: WvHiCOff !< High cut-off frequency or upper frequency limit of the wave spectrum beyond which the wave spectrum is zeroed. [used only when WaveMod=2,3,4] [(rad/s)] + REAL(SiKi) :: WvLowCOffD !< Minimum frequency used in the difference methods [Ignored if all difference methods = 0] [(rad/s)] + REAL(SiKi) :: WvHiCOffD !< Maximum frequency used in the difference methods [Ignored if all difference methods = 0] [(rad/s)] + REAL(SiKi) :: WvLowCOffS !< Minimum frequency used in the sum-QTF method [Ignored if SumQTF = 0] [(rad/s)] + REAL(SiKi) :: WvHiCOffS !< Maximum frequency used in the sum-QTF method [Ignored if SumQTF = 0] [(rad/s)] + LOGICAL :: WvDiffQTFF !< Full difference QTF second order forces flag [(-)] + LOGICAL :: WvSumQTFF !< Full sum QTF second order forces flag [(-)] + TYPE(SeaSt_Interp_ParameterType) :: SeaSt_Interp_p !< parameter information from the SeaState Interpolation module [-] + END TYPE SeaSt_InitOutputType ! ======================= -! ========= SeaState_ContinuousStateType ======= - TYPE, PUBLIC :: SeaState_ContinuousStateType +! ========= SeaSt_ContinuousStateType ======= + TYPE, PUBLIC :: SeaSt_ContinuousStateType TYPE(Waves2_ContinuousStateType) :: Waves2 !< continuous states from the waves2 module [-] - END TYPE SeaState_ContinuousStateType + END TYPE SeaSt_ContinuousStateType ! ======================= -! ========= SeaState_DiscreteStateType ======= - TYPE, PUBLIC :: SeaState_DiscreteStateType +! ========= SeaSt_DiscreteStateType ======= + TYPE, PUBLIC :: SeaSt_DiscreteStateType TYPE(Waves2_DiscreteStateType) :: Waves2 !< discrete states from the waves2 module [-] - END TYPE SeaState_DiscreteStateType + END TYPE SeaSt_DiscreteStateType ! ======================= -! ========= SeaState_ConstraintStateType ======= - TYPE, PUBLIC :: SeaState_ConstraintStateType +! ========= SeaSt_ConstraintStateType ======= + TYPE, PUBLIC :: SeaSt_ConstraintStateType TYPE(Waves2_ConstraintStateType) :: Waves2 !< constraint states from the waves2 module [-] - END TYPE SeaState_ConstraintStateType + END TYPE SeaSt_ConstraintStateType ! ======================= -! ========= SeaState_OtherStateType ======= - TYPE, PUBLIC :: SeaState_OtherStateType +! ========= SeaSt_OtherStateType ======= + TYPE, PUBLIC :: SeaSt_OtherStateType TYPE(Waves2_OtherStateType) :: Waves2 !< OtherState information from the Waves2 module [-] - END TYPE SeaState_OtherStateType + END TYPE SeaSt_OtherStateType ! ======================= -! ========= SeaState_MiscVarType ======= - TYPE, PUBLIC :: SeaState_MiscVarType +! ========= SeaSt_MiscVarType ======= + TYPE, PUBLIC :: SeaSt_MiscVarType INTEGER(IntKi) :: Decimate !< The output decimation counter [-] REAL(DbKi) :: LastOutTime !< Last time step which was written to the output file (sec) [-] INTEGER(IntKi) :: LastIndWave !< The last index used in the wave kinematics arrays, used to optimize interpolation [-] - TYPE(SeaState_Interp_MiscVarType) :: Sea_Interp_m !< misc var information from the SeaState Interpolation module [-] + TYPE(SeaSt_Interp_MiscVarType) :: SeaSt_Interp_m !< misc var information from the SeaState Interpolation module [-] TYPE(Waves2_MiscVarType) :: Waves2 !< misc var information from the Waves2 module [-] TYPE(Waves2_InputType) :: u_Waves2 !< Waves2 module inputs [-] - END TYPE SeaState_MiscVarType + END TYPE SeaSt_MiscVarType ! ======================= -! ========= SeaState_ParameterType ======= - TYPE, PUBLIC :: SeaState_ParameterType +! ========= SeaSt_ParameterType ======= + TYPE, PUBLIC :: SeaSt_ParameterType TYPE(Waves2_ParameterType) :: Waves2 !< Parameter data for the Waves2 module [-] REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Array of time samples, (sec) [-] REAL(DbKi) :: WaveDT !< Wave DT [sec] @@ -162,24 +194,24 @@ MODULE SeaState_Types CHARACTER(ChanLen) :: Delim !< Delimiter string for outputs, defaults to tab-delimiters [-] INTEGER(IntKi) :: UnOutFile !< File unit for the SeaState outputs [-] INTEGER(IntKi) :: OutDec !< Write every OutDec time steps [-] - TYPE(SeaState_Interp_ParameterType) :: Sea_Interp_p !< parameter information from the SeaState Interpolation module [-] - END TYPE SeaState_ParameterType + TYPE(SeaSt_Interp_ParameterType) :: SeaSt_Interp_p !< parameter information from the SeaState Interpolation module [-] + END TYPE SeaSt_ParameterType ! ======================= -! ========= SeaState_InputType ======= - TYPE, PUBLIC :: SeaState_InputType +! ========= SeaSt_InputType ======= + TYPE, PUBLIC :: SeaSt_InputType REAL(SiKi) :: DummyInput !< Remove this variable if you have discrete states [-] - END TYPE SeaState_InputType + END TYPE SeaSt_InputType ! ======================= -! ========= SeaState_OutputType ======= - TYPE, PUBLIC :: SeaState_OutputType +! ========= SeaSt_OutputType ======= + TYPE, PUBLIC :: SeaSt_OutputType REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Outputs to be written to the output file(s) [-] TYPE(Waves2_OutputType) :: Waves2 !< Waves2 module outputs [-] - END TYPE SeaState_OutputType + END TYPE SeaSt_OutputType ! ======================= CONTAINS - SUBROUTINE SeaState_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_InputFile), INTENT(IN) :: SrcInputFileData - TYPE(SeaState_InputFile), INTENT(INOUT) :: DstInputFileData + SUBROUTINE SeaSt_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_InputFile), INTENT(IN) :: SrcInputFileData + TYPE(SeaSt_InputFile), INTENT(INOUT) :: DstInputFileData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -192,7 +224,7 @@ SUBROUTINE SeaState_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyInputFile' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyInputFile' ! ErrStat = ErrID_None ErrMsg = "" @@ -308,13 +340,13 @@ SUBROUTINE SeaState_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, DstInputFileData%UnSum = SrcInputFileData%UnSum DstInputFileData%OutFmt = SrcInputFileData%OutFmt DstInputFileData%OutSFmt = SrcInputFileData%OutSFmt - END SUBROUTINE SeaState_CopyInputFile + END SUBROUTINE SeaSt_CopyInputFile - SUBROUTINE SeaState_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) - TYPE(SeaState_InputFile), INTENT(INOUT) :: InputFileData + SUBROUTINE SeaSt_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) + TYPE(SeaSt_InputFile), INTENT(INOUT) :: InputFileData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyInputFile' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyInputFile' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None @@ -343,13 +375,13 @@ SUBROUTINE SeaState_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) IF (ALLOCATED(InputFileData%OutList)) THEN DEALLOCATE(InputFileData%OutList) ENDIF - END SUBROUTINE SeaState_DestroyInputFile + END SUBROUTINE SeaSt_DestroyInputFile - SUBROUTINE SeaState_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_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(SeaState_InputFile), INTENT(IN) :: InData + TYPE(SeaSt_InputFile), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -364,7 +396,7 @@ SUBROUTINE SeaState_PackInputFile( 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 = 'SeaState_PackInputFile' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackInputFile' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -748,13 +780,13 @@ SUBROUTINE SeaState_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, IntKiBuf(Int_Xferred) = ICHAR(InData%OutSFmt(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I - END SUBROUTINE SeaState_PackInputFile + END SUBROUTINE SeaSt_PackInputFile - SUBROUTINE SeaState_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_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(SeaState_InputFile), INTENT(INOUT) :: OutData + TYPE(SeaSt_InputFile), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -770,7 +802,7 @@ SUBROUTINE SeaState_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackInputFile' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackInputFile' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1073,11 +1105,11 @@ SUBROUTINE SeaState_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta OutData%OutSFmt(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I - END SUBROUTINE SeaState_UnPackInputFile + END SUBROUTINE SeaSt_UnPackInputFile - SUBROUTINE SeaState_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_InitInputType), INTENT(IN) :: SrcInitInputData - TYPE(SeaState_InitInputType), INTENT(INOUT) :: DstInitInputData + SUBROUTINE SeaSt_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_InitInputType), INTENT(IN) :: SrcInitInputData + TYPE(SeaSt_InitInputType), INTENT(INOUT) :: DstInitInputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -1087,7 +1119,7 @@ SUBROUTINE SeaState_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyInitInput' ! ErrStat = ErrID_None ErrMsg = "" @@ -1118,13 +1150,13 @@ SUBROUTINE SeaState_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ENDIF DstInitInputData%PtfmLocationX = SrcInitInputData%PtfmLocationX DstInitInputData%PtfmLocationY = SrcInitInputData%PtfmLocationY - END SUBROUTINE SeaState_CopyInitInput + END SUBROUTINE SeaSt_CopyInitInput - SUBROUTINE SeaState_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) - TYPE(SeaState_InitInputType), INTENT(INOUT) :: InitInputData + SUBROUTINE SeaSt_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) + TYPE(SeaSt_InitInputType), INTENT(INOUT) :: InitInputData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyInitInput' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None @@ -1133,13 +1165,13 @@ SUBROUTINE SeaState_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitInputData%WaveElevXY)) THEN DEALLOCATE(InitInputData%WaveElevXY) ENDIF - END SUBROUTINE SeaState_DestroyInitInput + END SUBROUTINE SeaSt_DestroyInitInput - SUBROUTINE SeaState_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_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(SeaState_InitInputType), INTENT(IN) :: InData + TYPE(SeaSt_InitInputType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -1154,7 +1186,7 @@ SUBROUTINE SeaState_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 = 'SeaState_PackInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackInitInput' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1302,13 +1334,13 @@ SUBROUTINE SeaState_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Re_Xferred = Re_Xferred + 1 ReKiBuf(Re_Xferred) = InData%PtfmLocationY Re_Xferred = Re_Xferred + 1 - END SUBROUTINE SeaState_PackInitInput + END SUBROUTINE SeaSt_PackInitInput - SUBROUTINE SeaState_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_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(SeaState_InitInputType), INTENT(INOUT) :: OutData + TYPE(SeaSt_InitInputType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -1321,7 +1353,7 @@ SUBROUTINE SeaState_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackInitInput' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1419,11 +1451,11 @@ SUBROUTINE SeaState_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta Re_Xferred = Re_Xferred + 1 OutData%PtfmLocationY = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 - END SUBROUTINE SeaState_UnPackInitInput + END SUBROUTINE SeaSt_UnPackInitInput - SUBROUTINE SeaState_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_InitOutputType), INTENT(IN) :: SrcInitOutputData - TYPE(SeaState_InitOutputType), INTENT(INOUT) :: DstInitOutputData + SUBROUTINE SeaSt_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_InitOutputType), INTENT(IN) :: SrcInitOutputData + TYPE(SeaSt_InitOutputType), INTENT(INOUT) :: DstInitOutputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -1431,9 +1463,12 @@ SUBROUTINE SeaState_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCo 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyInitOutput' ! ErrStat = ErrID_None ErrMsg = "" @@ -1484,13 +1519,208 @@ SUBROUTINE SeaState_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCo DstInitOutputData%WtrDens = SrcInitOutputData%WtrDens DstInitOutputData%WtrDpth = SrcInitOutputData%WtrDpth DstInitOutputData%MSL2SWL = SrcInitOutputData%MSL2SWL - END SUBROUTINE SeaState_CopyInitOutput +IF (ASSOCIATED(SrcInitOutputData%WaveElevC0)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveElevC0,1) + i1_u = UBOUND(SrcInitOutputData%WaveElevC0,1) + i2_l = LBOUND(SrcInitOutputData%WaveElevC0,2) + i2_u = UBOUND(SrcInitOutputData%WaveElevC0,2) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveElevC0)) THEN + ALLOCATE(DstInitOutputData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveElevC0 = SrcInitOutputData%WaveElevC0 +ENDIF +IF (ALLOCATED(SrcInitOutputData%WaveElevC)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveElevC,1) + i1_u = UBOUND(SrcInitOutputData%WaveElevC,1) + i2_l = LBOUND(SrcInitOutputData%WaveElevC,2) + i2_u = UBOUND(SrcInitOutputData%WaveElevC,2) + i3_l = LBOUND(SrcInitOutputData%WaveElevC,3) + i3_u = UBOUND(SrcInitOutputData%WaveElevC,3) + IF (.NOT. ALLOCATED(DstInitOutputData%WaveElevC)) THEN + ALLOCATE(DstInitOutputData%WaveElevC(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElevC.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveElevC = SrcInitOutputData%WaveElevC +ENDIF +IF (ASSOCIATED(SrcInitOutputData%WaveDirArr)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveDirArr,1) + i1_u = UBOUND(SrcInitOutputData%WaveDirArr,1) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveDirArr)) THEN + ALLOCATE(DstInitOutputData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveDirArr = SrcInitOutputData%WaveDirArr +ENDIF + DstInitOutputData%WaveDirMin = SrcInitOutputData%WaveDirMin + DstInitOutputData%WaveDirMax = SrcInitOutputData%WaveDirMax + DstInitOutputData%WaveDir = SrcInitOutputData%WaveDir + DstInitOutputData%WaveMultiDir = SrcInitOutputData%WaveMultiDir + DstInitOutputData%WaveDOmega = SrcInitOutputData%WaveDOmega +IF (ASSOCIATED(SrcInitOutputData%WaveDynP)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveDynP,1) + i1_u = UBOUND(SrcInitOutputData%WaveDynP,1) + i2_l = LBOUND(SrcInitOutputData%WaveDynP,2) + i2_u = UBOUND(SrcInitOutputData%WaveDynP,2) + i3_l = LBOUND(SrcInitOutputData%WaveDynP,3) + i3_u = UBOUND(SrcInitOutputData%WaveDynP,3) + i4_l = LBOUND(SrcInitOutputData%WaveDynP,4) + i4_u = UBOUND(SrcInitOutputData%WaveDynP,4) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveDynP)) THEN + ALLOCATE(DstInitOutputData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveDynP.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveDynP = SrcInitOutputData%WaveDynP +ENDIF +IF (ASSOCIATED(SrcInitOutputData%WaveAcc)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveAcc,1) + i1_u = UBOUND(SrcInitOutputData%WaveAcc,1) + i2_l = LBOUND(SrcInitOutputData%WaveAcc,2) + i2_u = UBOUND(SrcInitOutputData%WaveAcc,2) + i3_l = LBOUND(SrcInitOutputData%WaveAcc,3) + i3_u = UBOUND(SrcInitOutputData%WaveAcc,3) + i4_l = LBOUND(SrcInitOutputData%WaveAcc,4) + i4_u = UBOUND(SrcInitOutputData%WaveAcc,4) + i5_l = LBOUND(SrcInitOutputData%WaveAcc,5) + i5_u = UBOUND(SrcInitOutputData%WaveAcc,5) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveAcc)) THEN + ALLOCATE(DstInitOutputData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveAcc.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveAcc = SrcInitOutputData%WaveAcc +ENDIF +IF (ASSOCIATED(SrcInitOutputData%WaveVel)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveVel,1) + i1_u = UBOUND(SrcInitOutputData%WaveVel,1) + i2_l = LBOUND(SrcInitOutputData%WaveVel,2) + i2_u = UBOUND(SrcInitOutputData%WaveVel,2) + i3_l = LBOUND(SrcInitOutputData%WaveVel,3) + i3_u = UBOUND(SrcInitOutputData%WaveVel,3) + i4_l = LBOUND(SrcInitOutputData%WaveVel,4) + i4_u = UBOUND(SrcInitOutputData%WaveVel,4) + i5_l = LBOUND(SrcInitOutputData%WaveVel,5) + i5_u = UBOUND(SrcInitOutputData%WaveVel,5) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveVel)) THEN + ALLOCATE(DstInitOutputData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveVel.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveVel = SrcInitOutputData%WaveVel +ENDIF +IF (ASSOCIATED(SrcInitOutputData%WaveElev)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveElev,1) + i1_u = UBOUND(SrcInitOutputData%WaveElev,1) + i2_l = LBOUND(SrcInitOutputData%WaveElev,2) + i2_u = UBOUND(SrcInitOutputData%WaveElev,2) + i3_l = LBOUND(SrcInitOutputData%WaveElev,3) + i3_u = UBOUND(SrcInitOutputData%WaveElev,3) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveElev)) THEN + ALLOCATE(DstInitOutputData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveElev = SrcInitOutputData%WaveElev +ENDIF +IF (ASSOCIATED(SrcInitOutputData%WaveElev1)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveElev1,1) + i1_u = UBOUND(SrcInitOutputData%WaveElev1,1) + i2_l = LBOUND(SrcInitOutputData%WaveElev1,2) + i2_u = UBOUND(SrcInitOutputData%WaveElev1,2) + i3_l = LBOUND(SrcInitOutputData%WaveElev1,3) + i3_u = UBOUND(SrcInitOutputData%WaveElev1,3) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveElev1)) THEN + ALLOCATE(DstInitOutputData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveElev1 = SrcInitOutputData%WaveElev1 +ENDIF +IF (ASSOCIATED(SrcInitOutputData%WaveElev2)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveElev2,1) + i1_u = UBOUND(SrcInitOutputData%WaveElev2,1) + i2_l = LBOUND(SrcInitOutputData%WaveElev2,2) + i2_u = UBOUND(SrcInitOutputData%WaveElev2,2) + i3_l = LBOUND(SrcInitOutputData%WaveElev2,3) + i3_u = UBOUND(SrcInitOutputData%WaveElev2,3) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveElev2)) THEN + ALLOCATE(DstInitOutputData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveElev2 = SrcInitOutputData%WaveElev2 +ENDIF +IF (ALLOCATED(SrcInitOutputData%WaveElev0)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveElev0,1) + i1_u = UBOUND(SrcInitOutputData%WaveElev0,1) + IF (.NOT. ALLOCATED(DstInitOutputData%WaveElev0)) THEN + ALLOCATE(DstInitOutputData%WaveElev0(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElev0.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveElev0 = SrcInitOutputData%WaveElev0 +ENDIF +IF (ASSOCIATED(SrcInitOutputData%WaveTime)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveTime,1) + i1_u = UBOUND(SrcInitOutputData%WaveTime,1) + IF (.NOT. ASSOCIATED(DstInitOutputData%WaveTime)) THEN + ALLOCATE(DstInitOutputData%WaveTime(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveTime.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveTime = SrcInitOutputData%WaveTime +ENDIF + DstInitOutputData%RhoXg = SrcInitOutputData%RhoXg + DstInitOutputData%NStepWave = SrcInitOutputData%NStepWave + DstInitOutputData%NStepWave2 = SrcInitOutputData%NStepWave2 + DstInitOutputData%WaveMod = SrcInitOutputData%WaveMod + DstInitOutputData%CurrMod = SrcInitOutputData%CurrMod + DstInitOutputData%WaveStMod = SrcInitOutputData%WaveStMod + DstInitOutputData%WaveDirMod = SrcInitOutputData%WaveDirMod + DstInitOutputData%WvLowCOff = SrcInitOutputData%WvLowCOff + DstInitOutputData%WvHiCOff = SrcInitOutputData%WvHiCOff + DstInitOutputData%WvLowCOffD = SrcInitOutputData%WvLowCOffD + DstInitOutputData%WvHiCOffD = SrcInitOutputData%WvHiCOffD + DstInitOutputData%WvLowCOffS = SrcInitOutputData%WvLowCOffS + DstInitOutputData%WvHiCOffS = SrcInitOutputData%WvHiCOffS + DstInitOutputData%WvDiffQTFF = SrcInitOutputData%WvDiffQTFF + DstInitOutputData%WvSumQTFF = SrcInitOutputData%WvSumQTFF + CALL SeaSt_Interp_CopyParam( SrcInitOutputData%SeaSt_Interp_p, DstInitOutputData%SeaSt_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + END SUBROUTINE SeaSt_CopyInitOutput - SUBROUTINE SeaState_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) - TYPE(SeaState_InitOutputType), INTENT(INOUT) :: InitOutputData + SUBROUTINE SeaSt_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) + TYPE(SeaSt_InitOutputType), INTENT(INOUT) :: InitOutputData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyInitOutput' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None @@ -1506,13 +1736,56 @@ SUBROUTINE SeaState_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) DEALLOCATE(InitOutputData%WaveElevSeries) ENDIF CALL NWTC_Library_Destroyprogdesc( InitOutputData%Ver, ErrStat, ErrMsg ) - END SUBROUTINE SeaState_DestroyInitOutput +IF (ASSOCIATED(InitOutputData%WaveElevC0)) THEN + DEALLOCATE(InitOutputData%WaveElevC0) + InitOutputData%WaveElevC0 => NULL() +ENDIF +IF (ALLOCATED(InitOutputData%WaveElevC)) THEN + DEALLOCATE(InitOutputData%WaveElevC) +ENDIF +IF (ASSOCIATED(InitOutputData%WaveDirArr)) THEN + DEALLOCATE(InitOutputData%WaveDirArr) + InitOutputData%WaveDirArr => NULL() +ENDIF +IF (ASSOCIATED(InitOutputData%WaveDynP)) THEN + DEALLOCATE(InitOutputData%WaveDynP) + InitOutputData%WaveDynP => NULL() +ENDIF +IF (ASSOCIATED(InitOutputData%WaveAcc)) THEN + DEALLOCATE(InitOutputData%WaveAcc) + InitOutputData%WaveAcc => NULL() +ENDIF +IF (ASSOCIATED(InitOutputData%WaveVel)) THEN + DEALLOCATE(InitOutputData%WaveVel) + InitOutputData%WaveVel => NULL() +ENDIF +IF (ASSOCIATED(InitOutputData%WaveElev)) THEN + DEALLOCATE(InitOutputData%WaveElev) + InitOutputData%WaveElev => NULL() +ENDIF +IF (ASSOCIATED(InitOutputData%WaveElev1)) THEN + DEALLOCATE(InitOutputData%WaveElev1) + InitOutputData%WaveElev1 => NULL() +ENDIF +IF (ASSOCIATED(InitOutputData%WaveElev2)) THEN + DEALLOCATE(InitOutputData%WaveElev2) + InitOutputData%WaveElev2 => NULL() +ENDIF +IF (ALLOCATED(InitOutputData%WaveElev0)) THEN + DEALLOCATE(InitOutputData%WaveElev0) +ENDIF +IF (ASSOCIATED(InitOutputData%WaveTime)) THEN + DEALLOCATE(InitOutputData%WaveTime) + InitOutputData%WaveTime => NULL() +ENDIF + CALL SeaSt_Interp_DestroyParam( InitOutputData%SeaSt_Interp_p, ErrStat, ErrMsg ) + END SUBROUTINE SeaSt_DestroyInitOutput - SUBROUTINE SeaState_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_PackInitOutput( 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(SeaState_InitOutputType), INTENT(IN) :: InData + TYPE(SeaSt_InitOutputType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -1527,7 +1800,7 @@ SUBROUTINE SeaState_PackInitOutput( 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 = 'SeaState_PackInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackInitOutput' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1596,6 +1869,98 @@ SUBROUTINE SeaState_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Re_BufSz = Re_BufSz + 1 ! WtrDens Re_BufSz = Re_BufSz + 1 ! WtrDpth Re_BufSz = Re_BufSz + 1 ! MSL2SWL + Int_BufSz = Int_BufSz + 1 ! WaveElevC0 allocated yes/no + IF ( ASSOCIATED(InData%WaveElevC0) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! WaveElevC0 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC0) ! WaveElevC0 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElevC allocated yes/no + IF ( ALLOCATED(InData%WaveElevC) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElevC upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC) ! WaveElevC + END IF + Int_BufSz = Int_BufSz + 1 ! WaveDirArr allocated yes/no + IF ( ASSOCIATED(InData%WaveDirArr) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveDirArr upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveDirArr) ! WaveDirArr + END IF + Re_BufSz = Re_BufSz + 1 ! WaveDirMin + Re_BufSz = Re_BufSz + 1 ! WaveDirMax + Re_BufSz = Re_BufSz + 1 ! WaveDir + Int_BufSz = Int_BufSz + 1 ! WaveMultiDir + Re_BufSz = Re_BufSz + 1 ! WaveDOmega + Int_BufSz = Int_BufSz + 1 ! WaveDynP allocated yes/no + IF ( ASSOCIATED(InData%WaveDynP) ) THEN + Int_BufSz = Int_BufSz + 2*4 ! WaveDynP upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveDynP) ! WaveDynP + END IF + Int_BufSz = Int_BufSz + 1 ! WaveAcc allocated yes/no + IF ( ASSOCIATED(InData%WaveAcc) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveAcc upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveAcc) ! WaveAcc + END IF + Int_BufSz = Int_BufSz + 1 ! WaveVel allocated yes/no + IF ( ASSOCIATED(InData%WaveVel) ) THEN + Int_BufSz = Int_BufSz + 2*5 ! WaveVel upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveVel) ! WaveVel + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no + IF ( ASSOCIATED(InData%WaveElev) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev1) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev1) ! WaveElev1 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev2 allocated yes/no + IF ( ASSOCIATED(InData%WaveElev2) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElev2 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev2) ! WaveElev2 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev0 allocated yes/no + IF ( ALLOCATED(InData%WaveElev0) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveElev0 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev0) ! WaveElev0 + END IF + Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no + IF ( ASSOCIATED(InData%WaveTime) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveTime) ! WaveTime + END IF + Re_BufSz = Re_BufSz + 1 ! RhoXg + Int_BufSz = Int_BufSz + 1 ! NStepWave + Int_BufSz = Int_BufSz + 1 ! NStepWave2 + Int_BufSz = Int_BufSz + 1 ! WaveMod + Int_BufSz = Int_BufSz + 1 ! CurrMod + Int_BufSz = Int_BufSz + 1 ! WaveStMod + Int_BufSz = Int_BufSz + 1 ! WaveDirMod + Re_BufSz = Re_BufSz + 1 ! WvLowCOff + Re_BufSz = Re_BufSz + 1 ! WvHiCOff + Re_BufSz = Re_BufSz + 1 ! WvLowCOffD + Re_BufSz = Re_BufSz + 1 ! WvHiCOffD + Re_BufSz = Re_BufSz + 1 ! WvLowCOffS + Re_BufSz = Re_BufSz + 1 ! WvHiCOffS + Int_BufSz = Int_BufSz + 1 ! WvDiffQTFF + Int_BufSz = Int_BufSz + 1 ! WvSumQTFF + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_p: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1739,143 +2104,863 @@ SUBROUTINE SeaState_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Re_Xferred = Re_Xferred + 1 ReKiBuf(Re_Xferred) = InData%MSL2SWL Re_Xferred = Re_Xferred + 1 - END SUBROUTINE SeaState_PackInitOutput - - SUBROUTINE SeaState_UnPackInitOutput( 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(SeaState_InitOutputType), 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 = 'SeaState_UnPackInitOutput' - ! 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 - 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 Waves2_UnpackInitOutput( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 - 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) - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutputHdr not allocated + IF ( .NOT. ASSOCIATED(InData%WaveElevC0) ) THEN + IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE + IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC0,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC0,1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WriteOutputHdr)) DEALLOCATE(OutData%WriteOutputHdr) - ALLOCATE(OutData%WriteOutputHdr(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutputHdr.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%WriteOutputHdr,1), UBOUND(OutData%WriteOutputHdr,1) - DO I = 1, LEN(OutData%WriteOutputHdr) - OutData%WriteOutputHdr(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC0,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC0,2) + Int_Xferred = Int_Xferred + 2 + + DO i2 = LBOUND(InData%WaveElevC0,2), UBOUND(InData%WaveElevC0,2) + DO i1 = LBOUND(InData%WaveElevC0,1), UBOUND(InData%WaveElevC0,1) + ReKiBuf(Re_Xferred) = InData%WaveElevC0(i1,i2) + Re_Xferred = Re_Xferred + 1 + END DO END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutputUnt not allocated + IF ( .NOT. ALLOCATED(InData%WaveElevC) ) THEN + IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE + IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WriteOutputUnt)) DEALLOCATE(OutData%WriteOutputUnt) - ALLOCATE(OutData%WriteOutputUnt(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutputUnt.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%WriteOutputUnt,1), UBOUND(OutData%WriteOutputUnt,1) - DO I = 1, LEN(OutData%WriteOutputUnt) - OutData%WriteOutputUnt(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElevC,3), UBOUND(InData%WaveElevC,3) + DO i2 = LBOUND(InData%WaveElevC,2), UBOUND(InData%WaveElevC,2) + DO i1 = LBOUND(InData%WaveElevC,1), UBOUND(InData%WaveElevC,1) + ReKiBuf(Re_Xferred) = InData%WaveElevC(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevSeries not allocated + IF ( .NOT. ASSOCIATED(InData%WaveDirArr) ) THEN + IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE + IntKiBuf( Int_Xferred ) = 1 Int_Xferred = Int_Xferred + 1 - i1_l = IntKiBuf( Int_Xferred ) - i1_u = IntKiBuf( Int_Xferred + 1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDirArr,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDirArr,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%WaveElevSeries)) DEALLOCATE(OutData%WaveElevSeries) - ALLOCATE(OutData%WaveElevSeries(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevSeries.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i2 = LBOUND(OutData%WaveElevSeries,2), UBOUND(OutData%WaveElevSeries,2) - DO i1 = LBOUND(OutData%WaveElevSeries,1), UBOUND(OutData%WaveElevSeries,1) - OutData%WaveElevSeries(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO + + DO i1 = LBOUND(InData%WaveDirArr,1), UBOUND(InData%WaveDirArr,1) + ReKiBuf(Re_Xferred) = InData%WaveDirArr(i1) + Re_Xferred = Re_Xferred + 1 END DO END IF - Buf_size=IntKiBuf( Int_Xferred ) - Int_Xferred = Int_Xferred + 1 - IF(Buf_size > 0) THEN - ALLOCATE(Re_Buf(Buf_size),STAT=ErrStat2) + ReKiBuf(Re_Xferred) = InData%WaveDirMin + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WaveDirMax + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WaveDir + Re_Xferred = Re_Xferred + 1 + IntKiBuf(Int_Xferred) = TRANSFER(InData%WaveMultiDir, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WaveDOmega + Re_Xferred = Re_Xferred + 1 + IF ( .NOT. ASSOCIATED(InData%WaveDynP) ) 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%WaveDynP,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveDynP,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveDynP,4) + Int_Xferred = Int_Xferred + 2 + + DO i4 = LBOUND(InData%WaveDynP,4), UBOUND(InData%WaveDynP,4) + DO i3 = LBOUND(InData%WaveDynP,3), UBOUND(InData%WaveDynP,3) + DO i2 = LBOUND(InData%WaveDynP,2), UBOUND(InData%WaveDynP,2) + DO i1 = LBOUND(InData%WaveDynP,1), UBOUND(InData%WaveDynP,1) + ReKiBuf(Re_Xferred) = InData%WaveDynP(i1,i2,i3,i4) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveAcc) ) 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%WaveAcc,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveAcc,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveAcc,5) + Int_Xferred = Int_Xferred + 2 + + DO i5 = LBOUND(InData%WaveAcc,5), UBOUND(InData%WaveAcc,5) + DO i4 = LBOUND(InData%WaveAcc,4), UBOUND(InData%WaveAcc,4) + DO i3 = LBOUND(InData%WaveAcc,3), UBOUND(InData%WaveAcc,3) + DO i2 = LBOUND(InData%WaveAcc,2), UBOUND(InData%WaveAcc,2) + DO i1 = LBOUND(InData%WaveAcc,1), UBOUND(InData%WaveAcc,1) + ReKiBuf(Re_Xferred) = InData%WaveAcc(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveVel) ) 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%WaveVel,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,3) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,4) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,4) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveVel,5) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveVel,5) + Int_Xferred = Int_Xferred + 2 + + DO i5 = LBOUND(InData%WaveVel,5), UBOUND(InData%WaveVel,5) + DO i4 = LBOUND(InData%WaveVel,4), UBOUND(InData%WaveVel,4) + DO i3 = LBOUND(InData%WaveVel,3), UBOUND(InData%WaveVel,3) + DO i2 = LBOUND(InData%WaveVel,2), UBOUND(InData%WaveVel,2) + DO i1 = LBOUND(InData%WaveVel,1), UBOUND(InData%WaveVel,1) + ReKiBuf(Re_Xferred) = InData%WaveVel(i1,i2,i3,i4,i5) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev) ) 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%WaveElev,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev,3), UBOUND(InData%WaveElev,3) + DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) + DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) + ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) 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%WaveElev1,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev1,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev1,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev1,3), UBOUND(InData%WaveElev1,3) + DO i2 = LBOUND(InData%WaveElev1,2), UBOUND(InData%WaveElev1,2) + DO i1 = LBOUND(InData%WaveElev1,1), UBOUND(InData%WaveElev1,1) + ReKiBuf(Re_Xferred) = InData%WaveElev1(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveElev2) ) 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%WaveElev2,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev2,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev2,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElev2,3), UBOUND(InData%WaveElev2,3) + DO i2 = LBOUND(InData%WaveElev2,2), UBOUND(InData%WaveElev2,2) + DO i1 = LBOUND(InData%WaveElev2,1), UBOUND(InData%WaveElev2,1) + ReKiBuf(Re_Xferred) = InData%WaveElev2(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( .NOT. ALLOCATED(InData%WaveElev0) ) 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%WaveElev0,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev0,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveElev0,1), UBOUND(InData%WaveElev0,1) + ReKiBuf(Re_Xferred) = InData%WaveElev0(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( .NOT. ASSOCIATED(InData%WaveTime) ) 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%WaveTime,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveTime,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveTime,1), UBOUND(InData%WaveTime,1) + ReKiBuf(Re_Xferred) = InData%WaveTime(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + ReKiBuf(Re_Xferred) = InData%RhoXg + Re_Xferred = Re_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NStepWave + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%NStepWave2 + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%WaveMod + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%CurrMod + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%WaveStMod + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%WaveDirMod + Int_Xferred = Int_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvLowCOff + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvHiCOff + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvLowCOffD + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvHiCOffD + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvLowCOffS + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%WvHiCOffS + Re_Xferred = Re_Xferred + 1 + IntKiBuf(Int_Xferred) = TRANSFER(InData%WvDiffQTFF, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = TRANSFER(InData%WvSumQTFF, IntKiBuf(1)) + Int_Xferred = Int_Xferred + 1 + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_p + 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 + END SUBROUTINE SeaSt_PackInitOutput + + SUBROUTINE SeaSt_UnPackInitOutput( 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(SeaSt_InitOutputType), 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) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: i4, i4_l, i4_u ! bounds (upper/lower) for an array dimension 4 + INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackInitOutput' + ! 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 + 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 Waves2_UnpackInitOutput( Re_Buf, Db_Buf, Int_Buf, OutData%Waves2, ErrStat2, ErrMsg2 ) ! Waves2 + 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) + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutputHdr 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 + IF (ALLOCATED(OutData%WriteOutputHdr)) DEALLOCATE(OutData%WriteOutputHdr) + ALLOCATE(OutData%WriteOutputHdr(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutputHdr.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WriteOutputHdr,1), UBOUND(OutData%WriteOutputHdr,1) + DO I = 1, LEN(OutData%WriteOutputHdr) + OutData%WriteOutputHdr(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutputUnt 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 + IF (ALLOCATED(OutData%WriteOutputUnt)) DEALLOCATE(OutData%WriteOutputUnt) + ALLOCATE(OutData%WriteOutputUnt(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutputUnt.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WriteOutputUnt,1), UBOUND(OutData%WriteOutputUnt,1) + DO I = 1, LEN(OutData%WriteOutputUnt) + OutData%WriteOutputUnt(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevSeries 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%WaveElevSeries)) DEALLOCATE(OutData%WaveElevSeries) + ALLOCATE(OutData%WaveElevSeries(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevSeries.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i2 = LBOUND(OutData%WaveElevSeries,2), UBOUND(OutData%WaveElevSeries,2) + DO i1 = LBOUND(OutData%WaveElevSeries,1), UBOUND(OutData%WaveElevSeries,1) + OutData%WaveElevSeries(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END IF + 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_Unpackprogdesc( Re_Buf, Db_Buf, Int_Buf, OutData%Ver, ErrStat2, ErrMsg2 ) ! Ver + 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) + OutData%WtrDens = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%WtrDpth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%MSL2SWL = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevC0 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 (ASSOCIATED(OutData%WaveElevC0)) DEALLOCATE(OutData%WaveElevC0) + ALLOCATE(OutData%WaveElevC0(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevC0.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i2 = LBOUND(OutData%WaveElevC0,2), UBOUND(OutData%WaveElevC0,2) + DO i1 = LBOUND(OutData%WaveElevC0,1), UBOUND(OutData%WaveElevC0,1) + OutData%WaveElevC0(i1,i2) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevC 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%WaveElevC)) DEALLOCATE(OutData%WaveElevC) + ALLOCATE(OutData%WaveElevC(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevC.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElevC,3), UBOUND(OutData%WaveElevC,3) + DO i2 = LBOUND(OutData%WaveElevC,2), UBOUND(OutData%WaveElevC,2) + DO i1 = LBOUND(OutData%WaveElevC,1), UBOUND(OutData%WaveElevC,1) + OutData%WaveElevC(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDirArr 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 + IF (ASSOCIATED(OutData%WaveDirArr)) DEALLOCATE(OutData%WaveDirArr) + ALLOCATE(OutData%WaveDirArr(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDirArr.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveDirArr,1), UBOUND(OutData%WaveDirArr,1) + OutData%WaveDirArr(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + OutData%WaveDirMin = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WaveDirMax = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WaveDir = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WaveMultiDir = TRANSFER(IntKiBuf(Int_Xferred), OutData%WaveMultiDir) + Int_Xferred = Int_Xferred + 1 + OutData%WaveDOmega = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDynP 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveDynP)) DEALLOCATE(OutData%WaveDynP) + ALLOCATE(OutData%WaveDynP(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveDynP.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i4 = LBOUND(OutData%WaveDynP,4), UBOUND(OutData%WaveDynP,4) + DO i3 = LBOUND(OutData%WaveDynP,3), UBOUND(OutData%WaveDynP,3) + DO i2 = LBOUND(OutData%WaveDynP,2), UBOUND(OutData%WaveDynP,2) + DO i1 = LBOUND(OutData%WaveDynP,1), UBOUND(OutData%WaveDynP,1) + OutData%WaveDynP(i1,i2,i3,i4) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveAcc 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveAcc)) DEALLOCATE(OutData%WaveAcc) + ALLOCATE(OutData%WaveAcc(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveAcc.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i5 = LBOUND(OutData%WaveAcc,5), UBOUND(OutData%WaveAcc,5) + DO i4 = LBOUND(OutData%WaveAcc,4), UBOUND(OutData%WaveAcc,4) + DO i3 = LBOUND(OutData%WaveAcc,3), UBOUND(OutData%WaveAcc,3) + DO i2 = LBOUND(OutData%WaveAcc,2), UBOUND(OutData%WaveAcc,2) + DO i1 = LBOUND(OutData%WaveAcc,1), UBOUND(OutData%WaveAcc,1) + OutData%WaveAcc(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveVel 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i4_l = IntKiBuf( Int_Xferred ) + i4_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i5_l = IntKiBuf( Int_Xferred ) + i5_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveVel)) DEALLOCATE(OutData%WaveVel) + ALLOCATE(OutData%WaveVel(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u,i4_l:i4_u,i5_l:i5_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveVel.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i5 = LBOUND(OutData%WaveVel,5), UBOUND(OutData%WaveVel,5) + DO i4 = LBOUND(OutData%WaveVel,4), UBOUND(OutData%WaveVel,4) + DO i3 = LBOUND(OutData%WaveVel,3), UBOUND(OutData%WaveVel,3) + DO i2 = LBOUND(OutData%WaveVel,2), UBOUND(OutData%WaveVel,2) + DO i1 = LBOUND(OutData%WaveVel,1), UBOUND(OutData%WaveVel,1) + OutData%WaveVel(i1,i2,i3,i4,i5) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev)) DEALLOCATE(OutData%WaveElev) + ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev,3), UBOUND(OutData%WaveElev,3) + DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) + DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) + OutData%WaveElev(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev1)) DEALLOCATE(OutData%WaveElev1) + ALLOCATE(OutData%WaveElev1(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev1,3), UBOUND(OutData%WaveElev1,3) + DO i2 = LBOUND(OutData%WaveElev1,2), UBOUND(OutData%WaveElev1,2) + DO i1 = LBOUND(OutData%WaveElev1,1), UBOUND(OutData%WaveElev1,1) + OutData%WaveElev1(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev2 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ASSOCIATED(OutData%WaveElev2)) DEALLOCATE(OutData%WaveElev2) + ALLOCATE(OutData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElev2,3), UBOUND(OutData%WaveElev2,3) + DO i2 = LBOUND(OutData%WaveElev2,2), UBOUND(OutData%WaveElev2,2) + DO i1 = LBOUND(OutData%WaveElev2,1), UBOUND(OutData%WaveElev2,1) + OutData%WaveElev2(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev0 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 + IF (ALLOCATED(OutData%WaveElev0)) DEALLOCATE(OutData%WaveElev0) + ALLOCATE(OutData%WaveElev0(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev0.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveElev0,1), UBOUND(OutData%WaveElev0,1) + OutData%WaveElev0(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime 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 + IF (ASSOCIATED(OutData%WaveTime)) DEALLOCATE(OutData%WaveTime) + ALLOCATE(OutData%WaveTime(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveTime.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveTime,1), UBOUND(OutData%WaveTime,1) + OutData%WaveTime(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF + OutData%RhoXg = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%NStepWave = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%NStepWave2 = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%WaveMod = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%CurrMod = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%WaveStMod = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%WaveDirMod = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + OutData%WvLowCOff = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvHiCOff = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvLowCOffD = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvHiCOffD = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvLowCOffS = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvHiCOffS = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + OutData%WvDiffQTFF = TRANSFER(IntKiBuf(Int_Xferred), OutData%WvDiffQTFF) + Int_Xferred = Int_Xferred + 1 + OutData%WvSumQTFF = TRANSFER(IntKiBuf(Int_Xferred), OutData%WvSumQTFF) + 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 @@ -1905,24 +2990,18 @@ SUBROUTINE SeaState_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSt Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL NWTC_Library_Unpackprogdesc( Re_Buf, Db_Buf, Int_Buf, OutData%Ver, ErrStat2, ErrMsg2 ) ! Ver + CALL SeaSt_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_p, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_p 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) - OutData%WtrDens = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 - OutData%WtrDpth = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 - OutData%MSL2SWL = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 - END SUBROUTINE SeaState_UnPackInitOutput + END SUBROUTINE SeaSt_UnPackInitOutput - SUBROUTINE SeaState_CopyContState( SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_ContinuousStateType), INTENT(IN) :: SrcContStateData - TYPE(SeaState_ContinuousStateType), INTENT(INOUT) :: DstContStateData + SUBROUTINE SeaSt_CopyContState( SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_ContinuousStateType), INTENT(IN) :: SrcContStateData + TYPE(SeaSt_ContinuousStateType), INTENT(INOUT) :: DstContStateData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -1930,32 +3009,32 @@ SUBROUTINE SeaState_CopyContState( SrcContStateData, DstContStateData, CtrlCode, INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyContState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyContState' ! ErrStat = ErrID_None ErrMsg = "" CALL Waves2_CopyContState( SrcContStateData%Waves2, DstContStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - END SUBROUTINE SeaState_CopyContState + END SUBROUTINE SeaSt_CopyContState - SUBROUTINE SeaState_DestroyContState( ContStateData, ErrStat, ErrMsg ) - TYPE(SeaState_ContinuousStateType), INTENT(INOUT) :: ContStateData + SUBROUTINE SeaSt_DestroyContState( ContStateData, ErrStat, ErrMsg ) + TYPE(SeaSt_ContinuousStateType), INTENT(INOUT) :: ContStateData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyContState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyContState' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" CALL Waves2_DestroyContState( ContStateData%Waves2, ErrStat, ErrMsg ) - END SUBROUTINE SeaState_DestroyContState + END SUBROUTINE SeaSt_DestroyContState - SUBROUTINE SeaState_PackContState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_PackContState( 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(SeaState_ContinuousStateType), INTENT(IN) :: InData + TYPE(SeaSt_ContinuousStateType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -1970,7 +3049,7 @@ SUBROUTINE SeaState_PackContState( 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 = 'SeaState_PackContState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackContState' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2059,13 +3138,13 @@ SUBROUTINE SeaState_PackContState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END SUBROUTINE SeaState_PackContState + END SUBROUTINE SeaSt_PackContState - SUBROUTINE SeaState_UnPackContState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_UnPackContState( 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(SeaState_ContinuousStateType), INTENT(INOUT) :: OutData + TYPE(SeaSt_ContinuousStateType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -2076,7 +3155,7 @@ SUBROUTINE SeaState_UnPackContState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta INTEGER(IntKi) :: i INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackContState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackContState' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2127,11 +3206,11 @@ SUBROUTINE SeaState_UnPackContState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) - END SUBROUTINE SeaState_UnPackContState + END SUBROUTINE SeaSt_UnPackContState - SUBROUTINE SeaState_CopyDiscState( SrcDiscStateData, DstDiscStateData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_DiscreteStateType), INTENT(IN) :: SrcDiscStateData - TYPE(SeaState_DiscreteStateType), INTENT(INOUT) :: DstDiscStateData + SUBROUTINE SeaSt_CopyDiscState( SrcDiscStateData, DstDiscStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_DiscreteStateType), INTENT(IN) :: SrcDiscStateData + TYPE(SeaSt_DiscreteStateType), INTENT(INOUT) :: DstDiscStateData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -2139,32 +3218,32 @@ SUBROUTINE SeaState_CopyDiscState( SrcDiscStateData, DstDiscStateData, CtrlCode, INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyDiscState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyDiscState' ! ErrStat = ErrID_None ErrMsg = "" CALL Waves2_CopyDiscState( SrcDiscStateData%Waves2, DstDiscStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - END SUBROUTINE SeaState_CopyDiscState + END SUBROUTINE SeaSt_CopyDiscState - SUBROUTINE SeaState_DestroyDiscState( DiscStateData, ErrStat, ErrMsg ) - TYPE(SeaState_DiscreteStateType), INTENT(INOUT) :: DiscStateData + SUBROUTINE SeaSt_DestroyDiscState( DiscStateData, ErrStat, ErrMsg ) + TYPE(SeaSt_DiscreteStateType), INTENT(INOUT) :: DiscStateData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyDiscState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyDiscState' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" CALL Waves2_DestroyDiscState( DiscStateData%Waves2, ErrStat, ErrMsg ) - END SUBROUTINE SeaState_DestroyDiscState + END SUBROUTINE SeaSt_DestroyDiscState - SUBROUTINE SeaState_PackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_PackDiscState( 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(SeaState_DiscreteStateType), INTENT(IN) :: InData + TYPE(SeaSt_DiscreteStateType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -2179,7 +3258,7 @@ SUBROUTINE SeaState_PackDiscState( 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 = 'SeaState_PackDiscState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackDiscState' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2268,13 +3347,13 @@ SUBROUTINE SeaState_PackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END SUBROUTINE SeaState_PackDiscState + END SUBROUTINE SeaSt_PackDiscState - SUBROUTINE SeaState_UnPackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_UnPackDiscState( 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(SeaState_DiscreteStateType), INTENT(INOUT) :: OutData + TYPE(SeaSt_DiscreteStateType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -2285,7 +3364,7 @@ SUBROUTINE SeaState_UnPackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta INTEGER(IntKi) :: i INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackDiscState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackDiscState' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2336,11 +3415,11 @@ SUBROUTINE SeaState_UnPackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) - END SUBROUTINE SeaState_UnPackDiscState + END SUBROUTINE SeaSt_UnPackDiscState - SUBROUTINE SeaState_CopyConstrState( SrcConstrStateData, DstConstrStateData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_ConstraintStateType), INTENT(IN) :: SrcConstrStateData - TYPE(SeaState_ConstraintStateType), INTENT(INOUT) :: DstConstrStateData + SUBROUTINE SeaSt_CopyConstrState( SrcConstrStateData, DstConstrStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_ConstraintStateType), INTENT(IN) :: SrcConstrStateData + TYPE(SeaSt_ConstraintStateType), INTENT(INOUT) :: DstConstrStateData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -2348,32 +3427,32 @@ SUBROUTINE SeaState_CopyConstrState( SrcConstrStateData, DstConstrStateData, Ctr INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyConstrState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyConstrState' ! ErrStat = ErrID_None ErrMsg = "" CALL Waves2_CopyConstrState( SrcConstrStateData%Waves2, DstConstrStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - END SUBROUTINE SeaState_CopyConstrState + END SUBROUTINE SeaSt_CopyConstrState - SUBROUTINE SeaState_DestroyConstrState( ConstrStateData, ErrStat, ErrMsg ) - TYPE(SeaState_ConstraintStateType), INTENT(INOUT) :: ConstrStateData + SUBROUTINE SeaSt_DestroyConstrState( ConstrStateData, ErrStat, ErrMsg ) + TYPE(SeaSt_ConstraintStateType), INTENT(INOUT) :: ConstrStateData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyConstrState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyConstrState' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" CALL Waves2_DestroyConstrState( ConstrStateData%Waves2, ErrStat, ErrMsg ) - END SUBROUTINE SeaState_DestroyConstrState + END SUBROUTINE SeaSt_DestroyConstrState - SUBROUTINE SeaState_PackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_PackConstrState( 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(SeaState_ConstraintStateType), INTENT(IN) :: InData + TYPE(SeaSt_ConstraintStateType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -2388,7 +3467,7 @@ SUBROUTINE SeaState_PackConstrState( 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 = 'SeaState_PackConstrState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackConstrState' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2477,13 +3556,13 @@ SUBROUTINE SeaState_PackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END SUBROUTINE SeaState_PackConstrState + END SUBROUTINE SeaSt_PackConstrState - SUBROUTINE SeaState_UnPackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_UnPackConstrState( 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(SeaState_ConstraintStateType), INTENT(INOUT) :: OutData + TYPE(SeaSt_ConstraintStateType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -2494,7 +3573,7 @@ SUBROUTINE SeaState_UnPackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrS INTEGER(IntKi) :: i INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackConstrState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackConstrState' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2545,11 +3624,11 @@ SUBROUTINE SeaState_UnPackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrS IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) - END SUBROUTINE SeaState_UnPackConstrState + END SUBROUTINE SeaSt_UnPackConstrState - SUBROUTINE SeaState_CopyOtherState( SrcOtherStateData, DstOtherStateData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_OtherStateType), INTENT(IN) :: SrcOtherStateData - TYPE(SeaState_OtherStateType), INTENT(INOUT) :: DstOtherStateData + SUBROUTINE SeaSt_CopyOtherState( SrcOtherStateData, DstOtherStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_OtherStateType), INTENT(IN) :: SrcOtherStateData + TYPE(SeaSt_OtherStateType), INTENT(INOUT) :: DstOtherStateData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -2557,32 +3636,32 @@ SUBROUTINE SeaState_CopyOtherState( SrcOtherStateData, DstOtherStateData, CtrlCo INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyOtherState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyOtherState' ! ErrStat = ErrID_None ErrMsg = "" CALL Waves2_CopyOtherState( SrcOtherStateData%Waves2, DstOtherStateData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - END SUBROUTINE SeaState_CopyOtherState + END SUBROUTINE SeaSt_CopyOtherState - SUBROUTINE SeaState_DestroyOtherState( OtherStateData, ErrStat, ErrMsg ) - TYPE(SeaState_OtherStateType), INTENT(INOUT) :: OtherStateData + SUBROUTINE SeaSt_DestroyOtherState( OtherStateData, ErrStat, ErrMsg ) + TYPE(SeaSt_OtherStateType), INTENT(INOUT) :: OtherStateData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyOtherState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyOtherState' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" CALL Waves2_DestroyOtherState( OtherStateData%Waves2, ErrStat, ErrMsg ) - END SUBROUTINE SeaState_DestroyOtherState + END SUBROUTINE SeaSt_DestroyOtherState - SUBROUTINE SeaState_PackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_PackOtherState( 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(SeaState_OtherStateType), INTENT(IN) :: InData + TYPE(SeaSt_OtherStateType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -2597,7 +3676,7 @@ SUBROUTINE SeaState_PackOtherState( 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 = 'SeaState_PackOtherState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackOtherState' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2686,13 +3765,13 @@ SUBROUTINE SeaState_PackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END SUBROUTINE SeaState_PackOtherState + END SUBROUTINE SeaSt_PackOtherState - SUBROUTINE SeaState_UnPackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_UnPackOtherState( 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(SeaState_OtherStateType), INTENT(INOUT) :: OutData + TYPE(SeaSt_OtherStateType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -2703,7 +3782,7 @@ SUBROUTINE SeaState_UnPackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSt INTEGER(IntKi) :: i INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackOtherState' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackOtherState' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2754,11 +3833,11 @@ SUBROUTINE SeaState_UnPackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSt IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) - END SUBROUTINE SeaState_UnPackOtherState + END SUBROUTINE SeaSt_UnPackOtherState - SUBROUTINE SeaState_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_MiscVarType), INTENT(IN) :: SrcMiscData - TYPE(SeaState_MiscVarType), INTENT(INOUT) :: DstMiscData + SUBROUTINE SeaSt_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_MiscVarType), INTENT(IN) :: SrcMiscData + TYPE(SeaSt_MiscVarType), INTENT(INOUT) :: DstMiscData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -2766,14 +3845,14 @@ SUBROUTINE SeaState_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMs INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyMisc' ! ErrStat = ErrID_None ErrMsg = "" DstMiscData%Decimate = SrcMiscData%Decimate DstMiscData%LastOutTime = SrcMiscData%LastOutTime DstMiscData%LastIndWave = SrcMiscData%LastIndWave - CALL SeaState_Interp_CopyMisc( SrcMiscData%Sea_Interp_m, DstMiscData%Sea_Interp_m, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SeaSt_Interp_CopyMisc( SrcMiscData%SeaSt_Interp_m, DstMiscData%SeaSt_Interp_m, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN CALL Waves2_CopyMisc( SrcMiscData%Waves2, DstMiscData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) @@ -2782,27 +3861,27 @@ SUBROUTINE SeaState_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMs CALL Waves2_CopyInput( SrcMiscData%u_Waves2, DstMiscData%u_Waves2, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - END SUBROUTINE SeaState_CopyMisc + END SUBROUTINE SeaSt_CopyMisc - SUBROUTINE SeaState_DestroyMisc( MiscData, ErrStat, ErrMsg ) - TYPE(SeaState_MiscVarType), INTENT(INOUT) :: MiscData + SUBROUTINE SeaSt_DestroyMisc( MiscData, ErrStat, ErrMsg ) + TYPE(SeaSt_MiscVarType), INTENT(INOUT) :: MiscData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyMisc' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - CALL SeaState_Interp_DestroyMisc( MiscData%Sea_Interp_m, ErrStat, ErrMsg ) + CALL SeaSt_Interp_DestroyMisc( MiscData%SeaSt_Interp_m, ErrStat, ErrMsg ) CALL Waves2_DestroyMisc( MiscData%Waves2, ErrStat, ErrMsg ) CALL Waves2_DestroyInput( MiscData%u_Waves2, ErrStat, ErrMsg ) - END SUBROUTINE SeaState_DestroyMisc + END SUBROUTINE SeaSt_DestroyMisc - SUBROUTINE SeaState_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_PackMisc( 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(SeaState_MiscVarType), INTENT(IN) :: InData + TYPE(SeaSt_MiscVarType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -2817,7 +3896,7 @@ SUBROUTINE SeaState_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_PackMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackMisc' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2837,20 +3916,20 @@ SUBROUTINE SeaState_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_BufSz = Db_BufSz + 1 ! LastOutTime Int_BufSz = Int_BufSz + 1 ! LastIndWave ! Allocate buffers for subtypes, if any (we'll get sizes from these) - Int_BufSz = Int_BufSz + 3 ! Sea_Interp_m: size of buffers for each call to pack subtype - CALL SeaState_Interp_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%Sea_Interp_m, ErrStat2, ErrMsg2, .TRUE. ) ! Sea_Interp_m + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_m: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_m, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN - IF(ALLOCATED(Re_Buf)) THEN ! Sea_Interp_m + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_m Re_BufSz = Re_BufSz + SIZE( Re_Buf ) DEALLOCATE(Re_Buf) END IF - IF(ALLOCATED(Db_Buf)) THEN ! Sea_Interp_m + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_m Db_BufSz = Db_BufSz + SIZE( Db_Buf ) DEALLOCATE(Db_Buf) END IF - IF(ALLOCATED(Int_Buf)) THEN ! Sea_Interp_m + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_m Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF @@ -2921,7 +4000,7 @@ SUBROUTINE SeaState_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_Xferred = Db_Xferred + 1 IntKiBuf(Int_Xferred) = InData%LastIndWave Int_Xferred = Int_Xferred + 1 - CALL SeaState_Interp_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%Sea_Interp_m, ErrStat2, ErrMsg2, OnlySize ) ! Sea_Interp_m + CALL SeaSt_Interp_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_m, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -3005,13 +4084,13 @@ SUBROUTINE SeaState_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END SUBROUTINE SeaState_PackMisc + END SUBROUTINE SeaSt_PackMisc - SUBROUTINE SeaState_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_UnPackMisc( 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(SeaState_MiscVarType), INTENT(INOUT) :: OutData + TYPE(SeaSt_MiscVarType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -3022,7 +4101,7 @@ SUBROUTINE SeaState_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er INTEGER(IntKi) :: i INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackMisc' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -3072,7 +4151,7 @@ SUBROUTINE SeaState_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SeaState_Interp_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%Sea_Interp_m, ErrStat2, ErrMsg2 ) ! Sea_Interp_m + CALL SeaSt_Interp_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_m, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -3159,11 +4238,11 @@ SUBROUTINE SeaState_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) - END SUBROUTINE SeaState_UnPackMisc + END SUBROUTINE SeaSt_UnPackMisc - SUBROUTINE SeaState_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_ParameterType), INTENT(IN) :: SrcParamData - TYPE(SeaState_ParameterType), INTENT(INOUT) :: DstParamData + SUBROUTINE SeaSt_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_ParameterType), INTENT(IN) :: SrcParamData + TYPE(SeaSt_ParameterType), INTENT(INOUT) :: DstParamData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -3176,7 +4255,7 @@ SUBROUTINE SeaState_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Er INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyParam' ! ErrStat = ErrID_None ErrMsg = "" @@ -3394,16 +4473,16 @@ SUBROUTINE SeaState_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Er DstParamData%Delim = SrcParamData%Delim DstParamData%UnOutFile = SrcParamData%UnOutFile DstParamData%OutDec = SrcParamData%OutDec - CALL SeaState_Interp_CopyParam( SrcParamData%Sea_Interp_p, DstParamData%Sea_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SeaSt_Interp_CopyParam( SrcParamData%SeaSt_Interp_p, DstParamData%SeaSt_Interp_p, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - END SUBROUTINE SeaState_CopyParam + END SUBROUTINE SeaSt_CopyParam - SUBROUTINE SeaState_DestroyParam( ParamData, ErrStat, ErrMsg ) - TYPE(SeaState_ParameterType), INTENT(INOUT) :: ParamData + SUBROUTINE SeaSt_DestroyParam( ParamData, ErrStat, ErrMsg ) + TYPE(SeaSt_ParameterType), INTENT(INOUT) :: ParamData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyParam' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None @@ -3458,14 +4537,14 @@ SUBROUTINE SeaState_DestroyParam( ParamData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(ParamData%OutParam) ENDIF - CALL SeaState_Interp_DestroyParam( ParamData%Sea_Interp_p, ErrStat, ErrMsg ) - END SUBROUTINE SeaState_DestroyParam + CALL SeaSt_Interp_DestroyParam( ParamData%SeaSt_Interp_p, ErrStat, ErrMsg ) + END SUBROUTINE SeaSt_DestroyParam - SUBROUTINE SeaState_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_PackParam( 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(SeaState_ParameterType), INTENT(IN) :: InData + TYPE(SeaSt_ParameterType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -3480,7 +4559,7 @@ SUBROUTINE SeaState_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_PackParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackParam' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -3614,20 +4693,20 @@ SUBROUTINE SeaState_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM Int_BufSz = Int_BufSz + 1*LEN(InData%Delim) ! Delim Int_BufSz = Int_BufSz + 1 ! UnOutFile Int_BufSz = Int_BufSz + 1 ! OutDec - Int_BufSz = Int_BufSz + 3 ! Sea_Interp_p: size of buffers for each call to pack subtype - CALL SeaState_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%Sea_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! Sea_Interp_p + Int_BufSz = Int_BufSz + 3 ! SeaSt_Interp_p: size of buffers for each call to pack subtype + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt_Interp_p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN - IF(ALLOCATED(Re_Buf)) THEN ! Sea_Interp_p + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt_Interp_p Re_BufSz = Re_BufSz + SIZE( Re_Buf ) DEALLOCATE(Re_Buf) END IF - IF(ALLOCATED(Db_Buf)) THEN ! Sea_Interp_p + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt_Interp_p Db_BufSz = Db_BufSz + SIZE( Db_Buf ) DEALLOCATE(Db_Buf) END IF - IF(ALLOCATED(Int_Buf)) THEN ! Sea_Interp_p + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt_Interp_p Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF @@ -4036,7 +5115,7 @@ SUBROUTINE SeaState_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%OutDec Int_Xferred = Int_Xferred + 1 - CALL SeaState_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%Sea_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! Sea_Interp_p + CALL SeaSt_Interp_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt_Interp_p, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt_Interp_p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -4064,13 +5143,13 @@ SUBROUTINE SeaState_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END SUBROUTINE SeaState_PackParam + END SUBROUTINE SeaSt_PackParam - SUBROUTINE SeaState_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_UnPackParam( 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(SeaState_ParameterType), INTENT(INOUT) :: OutData + TYPE(SeaSt_ParameterType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -4086,7 +5165,7 @@ SUBROUTINE SeaState_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, E INTEGER(IntKi) :: i5, i5_l, i5_u ! bounds (upper/lower) for an array dimension 5 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackParam' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -4575,18 +5654,18 @@ SUBROUTINE SeaState_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, E Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SeaState_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%Sea_Interp_p, ErrStat2, ErrMsg2 ) ! Sea_Interp_p + CALL SeaSt_Interp_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt_Interp_p, ErrStat2, ErrMsg2 ) ! SeaSt_Interp_p 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) - END SUBROUTINE SeaState_UnPackParam + END SUBROUTINE SeaSt_UnPackParam - SUBROUTINE SeaState_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_InputType), INTENT(IN) :: SrcInputData - TYPE(SeaState_InputType), INTENT(INOUT) :: DstInputData + SUBROUTINE SeaSt_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_InputType), INTENT(IN) :: SrcInputData + TYPE(SeaSt_InputType), INTENT(INOUT) :: DstInputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -4594,29 +5673,29 @@ SUBROUTINE SeaState_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, Er INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyInput' ! ErrStat = ErrID_None ErrMsg = "" DstInputData%DummyInput = SrcInputData%DummyInput - END SUBROUTINE SeaState_CopyInput + END SUBROUTINE SeaSt_CopyInput - SUBROUTINE SeaState_DestroyInput( InputData, ErrStat, ErrMsg ) - TYPE(SeaState_InputType), INTENT(INOUT) :: InputData + SUBROUTINE SeaSt_DestroyInput( InputData, ErrStat, ErrMsg ) + TYPE(SeaSt_InputType), INTENT(INOUT) :: InputData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyInput' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE SeaState_DestroyInput + END SUBROUTINE SeaSt_DestroyInput - SUBROUTINE SeaState_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_PackInput( 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(SeaState_InputType), INTENT(IN) :: InData + TYPE(SeaSt_InputType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -4631,7 +5710,7 @@ SUBROUTINE SeaState_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_PackInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackInput' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -4677,13 +5756,13 @@ SUBROUTINE SeaState_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM ReKiBuf(Re_Xferred) = InData%DummyInput Re_Xferred = Re_Xferred + 1 - END SUBROUTINE SeaState_PackInput + END SUBROUTINE SeaSt_PackInput - SUBROUTINE SeaState_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_UnPackInput( 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(SeaState_InputType), INTENT(INOUT) :: OutData + TYPE(SeaSt_InputType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -4694,7 +5773,7 @@ SUBROUTINE SeaState_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, E INTEGER(IntKi) :: i INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackInput' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -4707,11 +5786,11 @@ SUBROUTINE SeaState_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, E Int_Xferred = 1 OutData%DummyInput = REAL(ReKiBuf(Re_Xferred), SiKi) Re_Xferred = Re_Xferred + 1 - END SUBROUTINE SeaState_UnPackInput + END SUBROUTINE SeaSt_UnPackInput - SUBROUTINE SeaState_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SeaState_OutputType), INTENT(IN) :: SrcOutputData - TYPE(SeaState_OutputType), INTENT(INOUT) :: DstOutputData + SUBROUTINE SeaSt_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaSt_OutputType), INTENT(IN) :: SrcOutputData + TYPE(SeaSt_OutputType), INTENT(INOUT) :: DstOutputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -4720,7 +5799,7 @@ SUBROUTINE SeaState_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_CopyOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyOutput' ! ErrStat = ErrID_None ErrMsg = "" @@ -4739,13 +5818,13 @@ SUBROUTINE SeaState_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, CALL Waves2_CopyOutput( SrcOutputData%Waves2, DstOutputData%Waves2, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - END SUBROUTINE SeaState_CopyOutput + END SUBROUTINE SeaSt_CopyOutput - SUBROUTINE SeaState_DestroyOutput( OutputData, ErrStat, ErrMsg ) - TYPE(SeaState_OutputType), INTENT(INOUT) :: OutputData + SUBROUTINE SeaSt_DestroyOutput( OutputData, ErrStat, ErrMsg ) + TYPE(SeaSt_OutputType), INTENT(INOUT) :: OutputData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_DestroyOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyOutput' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None @@ -4754,13 +5833,13 @@ SUBROUTINE SeaState_DestroyOutput( OutputData, ErrStat, ErrMsg ) DEALLOCATE(OutputData%WriteOutput) ENDIF CALL Waves2_DestroyOutput( OutputData%Waves2, ErrStat, ErrMsg ) - END SUBROUTINE SeaState_DestroyOutput + END SUBROUTINE SeaSt_DestroyOutput - SUBROUTINE SeaState_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SeaSt_PackOutput( 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(SeaState_OutputType), INTENT(IN) :: InData + TYPE(SeaSt_OutputType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -4775,7 +5854,7 @@ SUBROUTINE SeaState_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_PackOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_PackOutput' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -4884,13 +5963,13 @@ SUBROUTINE SeaState_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END SUBROUTINE SeaState_PackOutput + END SUBROUTINE SeaSt_PackOutput - SUBROUTINE SeaState_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_UnPackOutput( 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(SeaState_OutputType), INTENT(INOUT) :: OutData + TYPE(SeaSt_OutputType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -4902,7 +5981,7 @@ SUBROUTINE SeaState_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_UnPackOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_UnPackOutput' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -4971,10 +6050,10 @@ SUBROUTINE SeaState_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) - END SUBROUTINE SeaState_UnPackOutput + END SUBROUTINE SeaSt_UnPackOutput - SUBROUTINE SeaState_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time ! values of u (which has values associated with times in t). Order of the interpolation is given by the size of u @@ -4990,9 +6069,9 @@ SUBROUTINE SeaState_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) ! !.................................................................................................................................. - TYPE(SeaState_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 + TYPE(SeaSt_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Inputs - TYPE(SeaState_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + TYPE(SeaSt_InputType), INTENT(INOUT) :: u_out ! Input at tin_out REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -5000,7 +6079,7 @@ SUBROUTINE SeaState_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) INTEGER(IntKi) :: order ! order of polynomial fit (max 2) INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Input_ExtrapInterp' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Input_ExtrapInterp' ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -5010,22 +6089,22 @@ SUBROUTINE SeaState_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) endif order = SIZE(u) - 1 IF ( order .eq. 0 ) THEN - CALL SeaState_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SeaSt_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE IF ( order .eq. 1 ) THEN - CALL SeaState_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SeaSt_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE IF ( order .eq. 2 ) THEN - CALL SeaState_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SeaSt_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE CALL SetErrStat(ErrID_Fatal,'size(u) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) RETURN ENDIF - END SUBROUTINE SeaState_Input_ExtrapInterp + END SUBROUTINE SeaSt_Input_ExtrapInterp - SUBROUTINE SeaState_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time ! values of u (which has values associated with times in t). Order of the interpolation is 1. @@ -5037,17 +6116,17 @@ SUBROUTINE SeaState_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, Er ! !.................................................................................................................................. - TYPE(SeaState_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 - TYPE(SeaState_InputType), INTENT(IN) :: u2 ! Input at t2 + TYPE(SeaSt_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 + TYPE(SeaSt_InputType), INTENT(IN) :: u2 ! Input at t2 REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Inputs - TYPE(SeaState_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + TYPE(SeaSt_InputType), INTENT(INOUT) :: u_out ! Input at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None ! local variables REAL(DbKi) :: t(2) ! Times associated with the Inputs REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Input_ExtrapInterp1' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Input_ExtrapInterp1' REAL(DbKi) :: b ! temporary for extrapolation/interpolation REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors @@ -5068,10 +6147,10 @@ SUBROUTINE SeaState_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, Er ScaleFactor = t_out / t(2) b = -(u1%DummyInput - u2%DummyInput) u_out%DummyInput = u1%DummyInput + b * ScaleFactor - END SUBROUTINE SeaState_Input_ExtrapInterp1 + END SUBROUTINE SeaSt_Input_ExtrapInterp1 - SUBROUTINE SeaState_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time ! values of u (which has values associated with times in t). Order of the interpolation is 2. @@ -5085,11 +6164,11 @@ SUBROUTINE SeaState_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat ! !.................................................................................................................................. - TYPE(SeaState_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 - TYPE(SeaState_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 - TYPE(SeaState_InputType), INTENT(IN) :: u3 ! Input at t3 + TYPE(SeaSt_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 + TYPE(SeaSt_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 + TYPE(SeaSt_InputType), INTENT(IN) :: u3 ! Input at t3 REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Inputs - TYPE(SeaState_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + TYPE(SeaSt_InputType), INTENT(INOUT) :: u_out ! Input at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -5102,7 +6181,7 @@ SUBROUTINE SeaState_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Input_ExtrapInterp2' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Input_ExtrapInterp2' ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -5126,10 +6205,10 @@ SUBROUTINE SeaState_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat b = (t(3)**2*(u1%DummyInput - u2%DummyInput) + t(2)**2*(-u1%DummyInput + u3%DummyInput))* scaleFactor c = ( (t(2)-t(3))*u1%DummyInput + t(3)*u2%DummyInput - t(2)*u3%DummyInput ) * scaleFactor u_out%DummyInput = u1%DummyInput + b + c * t_out - END SUBROUTINE SeaState_Input_ExtrapInterp2 + END SUBROUTINE SeaSt_Input_ExtrapInterp2 - SUBROUTINE SeaState_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time ! values of y (which has values associated with times in t). Order of the interpolation is given by the size of y @@ -5145,9 +6224,9 @@ SUBROUTINE SeaState_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) ! !.................................................................................................................................. - TYPE(SeaState_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 + TYPE(SeaSt_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Outputs - TYPE(SeaState_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + TYPE(SeaSt_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -5155,7 +6234,7 @@ SUBROUTINE SeaState_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) INTEGER(IntKi) :: order ! order of polynomial fit (max 2) INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Output_ExtrapInterp' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Output_ExtrapInterp' ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -5165,22 +6244,22 @@ SUBROUTINE SeaState_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) endif order = SIZE(y) - 1 IF ( order .eq. 0 ) THEN - CALL SeaState_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SeaSt_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE IF ( order .eq. 1 ) THEN - CALL SeaState_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SeaSt_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE IF ( order .eq. 2 ) THEN - CALL SeaState_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SeaSt_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE CALL SetErrStat(ErrID_Fatal,'size(y) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) RETURN ENDIF - END SUBROUTINE SeaState_Output_ExtrapInterp + END SUBROUTINE SeaSt_Output_ExtrapInterp - SUBROUTINE SeaState_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time ! values of y (which has values associated with times in t). Order of the interpolation is 1. @@ -5192,17 +6271,17 @@ SUBROUTINE SeaState_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, E ! !.................................................................................................................................. - TYPE(SeaState_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 - TYPE(SeaState_OutputType), INTENT(IN) :: y2 ! Output at t2 + TYPE(SeaSt_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 + TYPE(SeaSt_OutputType), INTENT(IN) :: y2 ! Output at t2 REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Outputs - TYPE(SeaState_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + TYPE(SeaSt_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None ! local variables REAL(DbKi) :: t(2) ! Times associated with the Outputs REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Output_ExtrapInterp1' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Output_ExtrapInterp1' REAL(DbKi) :: b ! temporary for extrapolation/interpolation REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors @@ -5231,10 +6310,10 @@ SUBROUTINE SeaState_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, E END IF ! check if allocated CALL Waves2_Output_ExtrapInterp1( y1%Waves2, y2%Waves2, tin, y_out%Waves2, tin_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - END SUBROUTINE SeaState_Output_ExtrapInterp1 + END SUBROUTINE SeaSt_Output_ExtrapInterp1 - SUBROUTINE SeaState_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) + SUBROUTINE SeaSt_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time ! values of y (which has values associated with times in t). Order of the interpolation is 2. @@ -5248,11 +6327,11 @@ SUBROUTINE SeaState_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrSta ! !.................................................................................................................................. - TYPE(SeaState_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 - TYPE(SeaState_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 - TYPE(SeaState_OutputType), INTENT(IN) :: y3 ! Output at t3 + TYPE(SeaSt_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 + TYPE(SeaSt_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 + TYPE(SeaSt_OutputType), INTENT(IN) :: y3 ! Output at t3 REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Outputs - TYPE(SeaState_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + TYPE(SeaSt_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -5265,7 +6344,7 @@ SUBROUTINE SeaState_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrSta REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Output_ExtrapInterp2' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Output_ExtrapInterp2' INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat @@ -5297,7 +6376,7 @@ SUBROUTINE SeaState_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrSta END IF ! check if allocated CALL Waves2_Output_ExtrapInterp2( y1%Waves2, y2%Waves2, y3%Waves2, tin, y_out%Waves2, tin_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - END SUBROUTINE SeaState_Output_ExtrapInterp2 + END SUBROUTINE SeaSt_Output_ExtrapInterp2 END MODULE SeaState_Types !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/Waves.f90 b/modules/seastate/src/Waves.f90 index 3c47b8add3..8385d8a979 100644 --- a/modules/seastate/src/Waves.f90 +++ b/modules/seastate/src/Waves.f90 @@ -572,8 +572,8 @@ SUBROUTINE StillWaterWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) ALLOCATE ( InitOut%WaveTime (0:InitOut%NStepWave ) , STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveTime.', ErrStat,ErrMsg,'StillWaterWaves_Init') - !ALLOCATE ( InitOut%WaveElev0 (0:InitOut%NStepWave ), STAT=ErrStatTmp ) - !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev0.', ErrStat,ErrMsg,'StillWaterWaves_Init') + ALLOCATE ( InitOut%WaveElev0 (0:InitOut%NStepWave ), STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev0.', ErrStat,ErrMsg,'StillWaterWaves_Init') ALLOCATE ( InitOut%WaveElevC0 (2, 0:InitOut%NStepWave2 ) , STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElevC0.',ErrStat,ErrMsg,'StillWaterWaves_Init') @@ -609,7 +609,7 @@ SUBROUTINE StillWaterWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) InitOut%WaveDOmega = 0.0 InitOut%WaveTime = (/ 0.0_DbKi, 1.0_DbKi, 2.0_DbKi /) ! We must have at least two different time steps in the interpolation - ! InitOut%WaveElev0 = 0.0 + InitOut%WaveElev0 = 0.0 InitOut%WaveElevC0 = 0.0 InitOut%WaveElev = 0.0 !InitOut%PWaveDynP0 = 0.0 @@ -1082,12 +1082,15 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) !ALLOCATE ( PWaveAccC0VPz0 (0:InitOut%NStepWave2 ,InitInp%NWaveKin ), STAT=ErrStatTmp ) !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array PWaveAccC0VPz0.', ErrStat,ErrMsg,'VariousWaves_Init') - !ALLOCATE ( InitOut%WaveElev0 (0:InitOut%NStepWave ), STAT=ErrStatTmp ) - !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveElev0.', ErrStat,ErrMsg,'VariousWaves_Init') + ALLOCATE ( InitOut%WaveElev0 (0:InitOut%NStepWave ), STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveElev0.', ErrStat,ErrMsg,'VariousWaves_Init') ALLOCATE ( InitOut%WaveElev (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2) ), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev.', ErrStat,ErrMsg,'VariousWaves_Init') - + + ALLOCATE ( InitOut%WaveElevC (2,0:InitOut%NStepWave2,InitInp%NGrid(1)*InitInp%NGrid(2) ), STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElevC.', ErrStat,ErrMsg,'VariousWaves_Init') + ALLOCATE ( WaveDynP0B (0:InitOut%NStepWave-1,NWaveKin0Prime ), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveDynP0B.', ErrStat,ErrMsg,'VariousWaves_Init') @@ -1776,19 +1779,19 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) RETURN END IF - ! We'll need the following for wave stretching once we implement it. - ! CALL ApplyFFT_cx ( InitOut%WaveElev0 (0:InitOut%NStepWave-1), tmpComplexArr (: ), FFT_Data, ErrStatTmp ) - !CALL SetErrStat(ErrStatTmp,'Error occured while applying the FFT to WaveElev0.',ErrStat,ErrMsg,'VariousWaves_Init') - !IF ( ErrStat >= AbortErrLev ) THEN - ! CALL CleanUp() - ! RETURN - !END IF + + CALL ApplyFFT_cx ( InitOut%WaveElev0 (0:InitOut%NStepWave-1), tmpComplexArr (: ), FFT_Data, ErrStatTmp ) + CALL SetErrStat(ErrStatTmp,'Error occured while applying the FFT to WaveElev0.',ErrStat,ErrMsg,'VariousWaves_Init') + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF !TODO: FIX ME For generating grid elevations DO k = 1,InitInp%NWaveElev ! Loop through all points where the incident wave elevations are to be computed (normally all the XY grid points) ! This subroutine call applies the FFT at the correct location. i = mod(k-1, InitInp%NGrid(1)) + 1 j = (k-1) / InitInp%NGrid(2) + 1 - CALL WaveElevTimeSeriesAtXY( InitInp%WaveElevxi(k), InitInp%WaveElevyi(k), InitOut%WaveElev(:,i,j), ErrStatTmp, ErrMsgTmp ) + CALL WaveElevTimeSeriesAtXY( InitInp%WaveElevxi(k), InitInp%WaveElevyi(k), InitOut%WaveElev(:,i,j), InitOut%WaveElevC(:,:,k), ErrStatTmp, ErrMsgTmp ) CALL SetErrStat(ErrStatTmp,'Error occured while applying the FFT to InitOut%WaveElev.',ErrStat,ErrMsg,'VariousWaves_Init') IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2010,7 +2013,7 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) ! InitOut%PWaveDynP0(InitOut%NStepWave,:,:,: ) = InitOut%PWaveDynP0(0,:,:,: ) ! InitOut%PWaveVel0 (InitOut%NStepWave,:,:,:,:) = InitOut%PWaveVel0 (0,:,:,:,:) ! InitOut%PWaveAcc0 (InitOut%NStepWave,:,:,:,:) = InitOut%PWaveAcc0 (0,:,:,:,:) - ! InitOut%WaveElev0 (InitOut%NStepWave) = InitOut%WaveElev0 (0 ) + InitOut%WaveElev0 (InitOut%NStepWave) = InitOut%WaveElev0 (0 ) @@ -2020,11 +2023,12 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) CONTAINS - SUBROUTINE WaveElevTimeSeriesAtXY(Xcoord,Ycoord, WaveElevSeriesAtXY, ErrStatLcl, ErrMsgLcl ) + SUBROUTINE WaveElevTimeSeriesAtXY(Xcoord,Ycoord, WaveElevAtXY, WaveElevCAtXY, ErrStatLcl, ErrMsgLcl ) REAL(SiKi), INTENT(IN ) :: Xcoord REAL(SiKi), INTENT(IN ) :: Ycoord - REAL(SiKi), INTENT( OUT) :: WaveElevSeriesAtXY(0:InitOut%NStepWave) + REAL(SiKi), INTENT( OUT) :: WaveElevAtXY(0:InitOut%NStepWave) + real(SiKi), INTENT( OUT) :: WaveElevCAtXY(2,0:InitOut%NStepWave2) INTEGER(IntKi), INTENT( OUT) :: ErrStatLcl INTEGER(IntKi) :: ErrStatLcl2 CHARACTER(*), INTENT( OUT) :: ErrMsgLcl @@ -2045,12 +2049,14 @@ SUBROUTINE WaveElevTimeSeriesAtXY(Xcoord,Ycoord, WaveElevSeriesAtXY, ErrStatLcl, EXP( -ImagNmbr*WaveNmbr*( Xcoord*CosWaveDir(I)+ & Ycoord*SinWaveDir(I) ) ) ENDDO - - CALL ApplyFFT_cx ( WaveElevSeriesAtXY(0:InitOut%NStepWave-1), tmpComplexArr, FFT_Data, ErrStatLcl2 ) + + CALL ApplyFFT_cx ( WaveElevAtXY(0:InitOut%NStepWave-1), tmpComplexArr, FFT_Data, ErrStatLcl2 ) CALL SetErrStat(ErrStatLcl2,'Error occured while applying the FFT to InitOut%WaveElev.',ErrStatLcl,ErrMsgLcl,'WaveElevTimeSeriesAtXY') - +!TODO: Why is tmpComplexArr 0:NStepWave2 long? why not NStepWave2-1 ?? GJH + WaveElevCAtXY( 1,: ) = REAL(tmpComplexArr(:)) + WaveElevCAtXY( 2,: ) = IMAG(tmpComplexArr(:)) ! Append first datpoint as the last as aid for repeated wave data - WaveElevSeriesAtXY(InitOut%NStepWave) = WaveElevSeriesAtXY(0) + WaveElevAtXY(InitOut%NStepWave) = WaveElevAtXY(0) END SUBROUTINE WaveElevTimeSeriesAtXY diff --git a/modules/seastate/src/Waves.txt b/modules/seastate/src/Waves.txt index 53bc5bd26a..7ef24c4877 100644 --- a/modules/seastate/src/Waves.txt +++ b/modules/seastate/src/Waves.txt @@ -66,6 +66,7 @@ typedef ^ ^ NWTC_RandomNumber_ParameterType R # Define outputs from the initialization routine here: # typedef ^ InitOutputType SiKi WaveElevC0 {*}{*} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) +typedef ^ InitOutputType SiKi WaveElevC {:}{:}{:} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at all grid points. First column is real part, second column is imaginary part" (meters) typedef ^ ^ SiKi WaveDirArr {*} - - "Wave direction array. Each frequency has a unique direction of WaveNDir > 1" (degrees) typedef ^ ^ SiKi WaveDirMin - - - "Minimum wave direction." (degrees) typedef ^ ^ SiKi WaveDirMax - - - "Maximum wave direction." (degrees) @@ -81,7 +82,7 @@ typedef ^ ^ SiKi WaveVel #typedef ^ ^ SiKi PWaveAcc0 {*}{*}{*}{*}{*} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (m/s^2) #typedef ^ ^ SiKi PWaveVel0 {*}{*}{*}{*}{*} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) typedef ^ ^ SiKi WaveElev {*}{*}{*} - - "Instantaneous elevation time-series of incident waves at each of the XY grid points" (meters) -#typedef ^ ^ SiKi WaveElev0 {*} - - "Instantaneous elevation time-series of incident waves at the platform reference point" (meters) +typedef ^ ^ SiKi WaveElev0 {:} - - "Instantaneous elevation time-series of incident waves at the platform reference point" (meters) typedef ^ ^ SiKi WaveTime {*} - - "Simulation times at which the instantaneous elevation of, velocity of, acceleration of, and loads associated with the incident waves are determined" (sec) typedef ^ ^ DbKi WaveTMax - - - "Analysis time for incident wave calculations; the actual analysis time may be larger than this value in order for the maintain an effecient FFT" (sec) typedef ^ ^ INTEGER nodeInWater {:}{:} - - "Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated" - diff --git a/modules/seastate/src/Waves_Types.f90 b/modules/seastate/src/Waves_Types.f90 index 1216b3f6c3..c89d602acf 100644 --- a/modules/seastate/src/Waves_Types.f90 +++ b/modules/seastate/src/Waves_Types.f90 @@ -82,6 +82,7 @@ MODULE Waves_Types ! ========= Waves_InitOutputType ======= TYPE, PUBLIC :: Waves_InitOutputType REAL(SiKi) , DIMENSION(:,:), POINTER :: WaveElevC0 => NULL() !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] + REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveElevC !< Discrete Fourier transform of the instantaneous elevation of incident waves at all grid points. First column is real part, second column is imaginary part [(meters)] REAL(SiKi) , DIMENSION(:), POINTER :: WaveDirArr => NULL() !< Wave direction array. Each frequency has a unique direction of WaveNDir > 1 [(degrees)] REAL(SiKi) :: WaveDirMin !< Minimum wave direction. [(degrees)] REAL(SiKi) :: WaveDirMax !< Maximum wave direction. [(degrees)] @@ -94,6 +95,7 @@ MODULE Waves_Types REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveAcc => NULL() !< Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed [(m/s^2)] REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveVel => NULL() !< Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.) [(m/s)] REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev => NULL() !< Instantaneous elevation time-series of incident waves at each of the XY grid points [(meters)] + REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElev0 !< Instantaneous elevation time-series of incident waves at the platform reference point [(meters)] REAL(SiKi) , DIMENSION(:), POINTER :: WaveTime => NULL() !< Simulation times at which the instantaneous elevation of, velocity of, acceleration of, and loads associated with the incident waves are determined [(sec)] REAL(DbKi) :: WaveTMax !< Analysis time for incident wave calculations; the actual analysis time may be larger than this value in order for the maintain an effecient FFT [(sec)] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: nodeInWater !< Logical flag indicating if the node at the given time step is in the water, and hence needs to have hydrodynamic forces calculated [-] @@ -1006,6 +1008,22 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WaveElevC0 = SrcInitOutputData%WaveElevC0 ENDIF +IF (ALLOCATED(SrcInitOutputData%WaveElevC)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveElevC,1) + i1_u = UBOUND(SrcInitOutputData%WaveElevC,1) + i2_l = LBOUND(SrcInitOutputData%WaveElevC,2) + i2_u = UBOUND(SrcInitOutputData%WaveElevC,2) + i3_l = LBOUND(SrcInitOutputData%WaveElevC,3) + i3_u = UBOUND(SrcInitOutputData%WaveElevC,3) + IF (.NOT. ALLOCATED(DstInitOutputData%WaveElevC)) THEN + ALLOCATE(DstInitOutputData%WaveElevC(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElevC.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveElevC = SrcInitOutputData%WaveElevC +ENDIF IF (ASSOCIATED(SrcInitOutputData%WaveDirArr)) THEN i1_l = LBOUND(SrcInitOutputData%WaveDirArr,1) i1_u = UBOUND(SrcInitOutputData%WaveDirArr,1) @@ -1110,6 +1128,18 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WaveElev = SrcInitOutputData%WaveElev ENDIF +IF (ALLOCATED(SrcInitOutputData%WaveElev0)) THEN + i1_l = LBOUND(SrcInitOutputData%WaveElev0,1) + i1_u = UBOUND(SrcInitOutputData%WaveElev0,1) + IF (.NOT. ALLOCATED(DstInitOutputData%WaveElev0)) THEN + ALLOCATE(DstInitOutputData%WaveElev0(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElev0.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WaveElev0 = SrcInitOutputData%WaveElev0 +ENDIF IF (ASSOCIATED(SrcInitOutputData%WaveTime)) THEN i1_l = LBOUND(SrcInitOutputData%WaveTime,1) i1_u = UBOUND(SrcInitOutputData%WaveTime,1) @@ -1155,6 +1185,9 @@ SUBROUTINE Waves_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) DEALLOCATE(InitOutputData%WaveElevC0) InitOutputData%WaveElevC0 => NULL() ENDIF +IF (ALLOCATED(InitOutputData%WaveElevC)) THEN + DEALLOCATE(InitOutputData%WaveElevC) +ENDIF IF (ASSOCIATED(InitOutputData%WaveDirArr)) THEN DEALLOCATE(InitOutputData%WaveDirArr) InitOutputData%WaveDirArr => NULL() @@ -1178,6 +1211,9 @@ SUBROUTINE Waves_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) DEALLOCATE(InitOutputData%WaveElev) InitOutputData%WaveElev => NULL() ENDIF +IF (ALLOCATED(InitOutputData%WaveElev0)) THEN + DEALLOCATE(InitOutputData%WaveElev0) +ENDIF IF (ASSOCIATED(InitOutputData%WaveTime)) THEN DEALLOCATE(InitOutputData%WaveTime) InitOutputData%WaveTime => NULL() @@ -1227,6 +1263,11 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_BufSz = Int_BufSz + 2*2 ! WaveElevC0 upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC0) ! WaveElevC0 END IF + Int_BufSz = Int_BufSz + 1 ! WaveElevC allocated yes/no + IF ( ALLOCATED(InData%WaveElevC) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! WaveElevC upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElevC) ! WaveElevC + END IF Int_BufSz = Int_BufSz + 1 ! WaveDirArr allocated yes/no IF ( ASSOCIATED(InData%WaveDirArr) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveDirArr upper/lower bounds for each dimension @@ -1263,6 +1304,11 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_BufSz = Int_BufSz + 2*3 ! WaveElev upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev END IF + Int_BufSz = Int_BufSz + 1 ! WaveElev0 allocated yes/no + IF ( ALLOCATED(InData%WaveElev0) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WaveElev0 upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WaveElev0) ! WaveElev0 + END IF Int_BufSz = Int_BufSz + 1 ! WaveTime allocated yes/no IF ( ASSOCIATED(InData%WaveTime) ) THEN Int_BufSz = Int_BufSz + 2*1 ! WaveTime upper/lower bounds for each dimension @@ -1324,6 +1370,31 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO END DO END IF + IF ( .NOT. ALLOCATED(InData%WaveElevC) ) 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%WaveElevC,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElevC,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElevC,3) + Int_Xferred = Int_Xferred + 2 + + DO i3 = LBOUND(InData%WaveElevC,3), UBOUND(InData%WaveElevC,3) + DO i2 = LBOUND(InData%WaveElevC,2), UBOUND(InData%WaveElevC,2) + DO i1 = LBOUND(InData%WaveElevC,1), UBOUND(InData%WaveElevC,1) + ReKiBuf(Re_Xferred) = InData%WaveElevC(i1,i2,i3) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF IF ( .NOT. ASSOCIATED(InData%WaveDirArr) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -1491,6 +1562,21 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO END DO END IF + IF ( .NOT. ALLOCATED(InData%WaveElev0) ) 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%WaveElev0,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev0,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WaveElev0,1), UBOUND(InData%WaveElev0,1) + ReKiBuf(Re_Xferred) = InData%WaveElev0(i1) + Re_Xferred = Re_Xferred + 1 + END DO + END IF IF ( .NOT. ASSOCIATED(InData%WaveTime) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -1590,6 +1676,34 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, END DO END DO END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevC 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 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%WaveElevC)) DEALLOCATE(OutData%WaveElevC) + ALLOCATE(OutData%WaveElevC(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElevC.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i3 = LBOUND(OutData%WaveElevC,3), UBOUND(OutData%WaveElevC,3) + DO i2 = LBOUND(OutData%WaveElevC,2), UBOUND(OutData%WaveElevC,2) + DO i1 = LBOUND(OutData%WaveElevC,1), UBOUND(OutData%WaveElevC,1) + OutData%WaveElevC(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END DO + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveDirArr not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -1775,6 +1889,24 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, END DO END DO END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev0 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 + IF (ALLOCATED(OutData%WaveElev0)) DEALLOCATE(OutData%WaveElev0) + ALLOCATE(OutData%WaveElev0(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev0.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%WaveElev0,1), UBOUND(OutData%WaveElev0,1) + OutData%WaveElev0(i1) = REAL(ReKiBuf(Re_Xferred), SiKi) + Re_Xferred = Re_Xferred + 1 + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveTime not allocated Int_Xferred = Int_Xferred + 1 ELSE diff --git a/modules/seastate/src/seastate_Interp.f90 b/modules/seastate/src/seastate_Interp.f90 index 3d3a581b0b..aa159349ed 100644 --- a/modules/seastate/src/seastate_Interp.f90 +++ b/modules/seastate/src/seastate_Interp.f90 @@ -1,9 +1,9 @@ !> This module is an interpolator for SeaState pointer arrays based on a 3D grid and time. !! @note This module does not need to exactly conform to the FAST Modularization Framework standards. Three routines are required !! though: -!! -- SeaState_Interp_Init -- Load or create any wind data. Only called at the start of FAST. -!! -- SeaState_Interp_CalcOutput -- This will be called at each timestep with a series of data points to give the wave kinematics. -!! -- SeaState_Interp_End -- clear out any stored stuff. Only called at the end of FAST. +!! -- SeaSt_Interp_Init -- Load or create any wind data. Only called at the start of FAST. +!! -- SeaSt_Interp_CalcOutput -- This will be called at each timestep with a series of data points to give the wave kinematics. +!! -- SeaSt_Interp_End -- clear out any stored stuff. Only called at the end of FAST. MODULE SeaState_Interp !********************************************************************************************************************************** ! LICENSING @@ -31,14 +31,15 @@ MODULE SeaState_Interp IMPLICIT NONE PRIVATE - TYPE(ProgDesc), PARAMETER :: SeaState_Interp_Ver = ProgDesc( 'SeaState_Interp', '', '' ) + TYPE(ProgDesc), PARAMETER :: SeaSt_Interp_Ver = ProgDesc( 'SeaSt_Interp', '', '' ) - PUBLIC :: SeaState_Interp_Init - PUBLIC :: SeaState_Interp_End - PUBLIC :: SeaState_Interp_3D - PUBLIC :: SeaState_Interp_4D - PUBLIC :: SeaState_Interp_4D_Vec - public :: SeaState_Interp_Setup + PUBLIC :: SeaSt_Interp_Init + PUBLIC :: SeaSt_Interp_End + PUBLIC :: SeaSt_Interp_3D + PUBLIC :: SeaSt_Interp_4D + PUBLIC :: SeaSt_Interp_4D_Vec + PUBLIC :: SeaSt_Interp_3D_Vec6 + public :: SeaSt_Interp_Setup CONTAINS @@ -47,16 +48,16 @@ MODULE SeaState_Interp !---------------------------------------------------------------------------------------------------- !> A subroutine to initialize the SeaState 4D interpolator module. !---------------------------------------------------------------------------------------------------- -SUBROUTINE SeaState_Interp_Init(InitInp, p, ErrStat, ErrMsg) +SUBROUTINE SeaSt_Interp_Init(InitInp, p, ErrStat, ErrMsg) IMPLICIT NONE ! Passed Variables - TYPE(SeaState_Interp_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization - TYPE(SeaState_Interp_ParameterType), INTENT( OUT) :: p !< Parameters - ! TYPE(SeaState_Interp_InitOutputType), INTENT( OUT) :: InitOut !< Initial output + TYPE(SeaSt_Interp_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization + TYPE(SeaSt_Interp_ParameterType), INTENT( OUT) :: p !< Parameters + ! TYPE(SeaSt_Interp_InitOutputType), INTENT( OUT) :: InitOut !< Initial output ! REAL(DbKi), INTENT(IN ) :: Interval !< Do not change this!! @@ -73,7 +74,7 @@ SUBROUTINE SeaState_Interp_Init(InitInp, p, ErrStat, ErrMsg) ! Temporary variables for error handling INTEGER(IntKi) :: ErrStat2 ! Temp variable for the error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary error message - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_Init' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_Init' !------------------------------------------------------------------------------------------------- ! Set the Error handling variables @@ -96,11 +97,11 @@ SUBROUTINE SeaState_Interp_Init(InitInp, p, ErrStat, ErrMsg) ! Set the InitOutput information. Set any outputs here. !------------------------------------------------------------------------------------------------- - ! InitOut%Ver = SeaState_Interp_Ver + ! InitOut%Ver = SeaSt_Interp_Ver RETURN -END SUBROUTINE SeaState_Interp_Init +END SUBROUTINE SeaSt_Interp_Init !==================================================================================================== @@ -108,17 +109,17 @@ END SUBROUTINE SeaState_Interp_Init !> This routine and its subroutines calculate the wind velocity at a set of points given in !! PositionXYZ. The UVW velocities are returned in OutData%Velocity !------------------------------------------------------------------------------------------------- -SUBROUTINE SeaState_Interp_CalcOutput(Time, PositionXYZ, p, pWaveKinXX, WaveKinVal, ErrStat, ErrMsg) +SUBROUTINE SeaSt_Interp_CalcOutput(Time, PositionXYZ, p, pWaveKinXX, WaveKinVal, ErrStat, ErrMsg) IMPLICIT NONE - CHARACTER(*), PARAMETER :: RoutineName="SeaState_Interp_CalcOutput" + CHARACTER(*), PARAMETER :: RoutineName="SeaSt_Interp_CalcOutput" ! Passed Variables REAL(DbKi), INTENT(IN ) :: Time !< time from the start of the simulation REAL(ReKi), INTENT(IN ) :: PositionXYZ(:,:) !< Array of XYZ coordinates, 3xN - TYPE(SeaState_Interp_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaSt_Interp_ParameterType), INTENT(IN ) :: p !< Parameters REAL(ReKi), INTENT(IN ) :: pWaveKinXX(:,:,:,:) !< Velocity output at Time (Set to INOUT so that array does not get deallocated) REAL(ReKi), INTENT( out) :: WaveKinVal ! Error handling @@ -173,7 +174,7 @@ SUBROUTINE SeaState_Interp_CalcOutput(Time, PositionXYZ, p, pWaveKinXX, WaveKinV RETURN -END SUBROUTINE SeaState_Interp_CalcOutput +END SUBROUTINE SeaSt_Interp_CalcOutput subroutine SetCartesianXYIndex(p, pZero, delta, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, ErrMsg) REAL(ReKi), INTENT(IN ) :: p !< @@ -204,7 +205,7 @@ subroutine SetCartesianXYIndex(p, pZero, delta, nMax, Indx_Lo, Indx_Hi, isopc, E if ( Indx_Lo < 1 ) then Indx_Lo = 1 isopc = -1.0 - call SetErrStat(ErrID_Warn,'Position has been clamped to the grid boundary',ErrStat,ErrMsg,'SetCartesianIndex') !error out if time is outside the lower bounds + call SetErrStat(ErrID_Warn,'Position has been clamped to the grid boundary',ErrStat,ErrMsg,'SetCartesianXYIndex') !error out if time is outside the lower bounds end if Indx_Hi = min( Indx_Lo + 1, nMax ) ! make sure it's a valid index, zero-based @@ -213,7 +214,7 @@ subroutine SetCartesianXYIndex(p, pZero, delta, nMax, Indx_Lo, Indx_Hi, isopc, E ! Need to clamp to grid boundary Indx_Lo = Indx_Hi - 1 isopc = 1.0 - call SetErrStat(ErrID_Warn,'Position has been clamped to the grid boundary',ErrStat,ErrMsg,'SetCartesianIndex') !error out if time is outside the lower bounds + call SetErrStat(ErrID_Warn,'Position has been clamped to the grid boundary',ErrStat,ErrMsg,'SetCartesianXYIndex') !error out if time is outside the lower bounds end if @@ -330,19 +331,19 @@ end subroutine SetTimeIndex !==================================================================================================== !> This routine sets up interpolation of a 3-d or 4-d dataset. !! This method is described here: http://rjwagner49.com/Mathematics/Interpolation.pdf -subroutine SeaState_Interp_Setup( Time, Position, p, m, ErrStat, ErrMsg ) +subroutine SeaSt_Interp_Setup( Time, Position, p, m, ErrStat, ErrMsg ) ! I/O variables REAL(DbKi), INTENT(IN ) :: Time !< time from the start of the simulation REAL(ReKi), INTENT(IN ) :: Position(3) !< Array of XYZ coordinates, 3 - TYPE(SeaState_Interp_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(SeaState_Interp_MiscVarType), INTENT(INOUT) :: m !< MiscVars + TYPE(SeaSt_Interp_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaSt_Interp_MiscVarType), INTENT(INOUT) :: m !< MiscVars INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_Setup' + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_Setup' ! Local variables @@ -364,7 +365,7 @@ subroutine SeaState_Interp_Setup( Time, Position, p, m, ErrStat, ErrMsg ) ! Find the bounding indices for time !------------------------------------------------------------------------------------------------- call SetTimeIndex(Time, p%delta(1), p%n(1), m%Indx_Lo(1), m%Indx_Hi(1), isopc(1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !error out if x,y,z, or time is outside the lower bounds + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !warning if time is outside the bounds if (ErrStat >= AbortErrLev ) return @@ -373,7 +374,7 @@ subroutine SeaState_Interp_Setup( Time, Position, p, m, ErrStat, ErrMsg ) !------------------------------------------------------------------------------------------------- do i=2,3 call SetCartesianXYIndex(Position(i-1), p%pZero(i), p%delta(i), p%n(i), m%Indx_Lo(i), m%Indx_Hi(i), isopc(i), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !error out if x,y,z, or time is outside the lower bounds + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !warning if x,y is outside the bounds enddo @@ -384,7 +385,7 @@ subroutine SeaState_Interp_Setup( Time, Position, p, m, ErrStat, ErrMsg ) !------------------------------------------------------------------------------------------------- i=4 call SetCartesianZIndex(Position(i-1), p%Z_Depth, p%delta(i), p%n(i), m%Indx_Lo(i), m%Indx_Hi(i), isopc(i), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !error out if x,y,z, or time is outside the lower bounds + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !warning if z is outside the bounds if (ErrStat >= AbortErrLev ) return !------------------------------------------------------------------------------------------------- @@ -410,29 +411,29 @@ subroutine SeaState_Interp_Setup( Time, Position, p, m, ErrStat, ErrMsg ) m%N4D = m%N4D / REAL( SIZE(m%N4D), SiKi ) ! normalize -END Subroutine SeaState_Interp_Setup +END Subroutine SeaSt_Interp_Setup !==================================================================================================== !> This routine interpolates a 4-d dataset. !! This method is described here: http://rjwagner49.com/Mathematics/Interpolation.pdf -FUNCTION SeaState_Interp_4D( pKinXX, m, ErrStat, ErrMsg ) +FUNCTION SeaSt_Interp_4D( pKinXX, m, ErrStat, ErrMsg ) ! I/O variables real(SiKi), intent(in ) :: pKinXX(0:,:,:,:) - TYPE(SeaState_Interp_MiscVarType), INTENT(IN ) :: m !< Parameters + TYPE(SeaSt_Interp_MiscVarType), INTENT(IN ) :: m !< Parameters INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_PointSetup' - Real(SiKi) :: SeaState_Interp_4D + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_PointSetup' + Real(SiKi) :: SeaSt_Interp_4D ! Local variables REAL(SiKi) :: u(16) ! size 2^n - SeaState_Interp_4D = 0.0_SiKi + SeaSt_Interp_4D = 0.0_SiKi ErrStat = ErrID_None ErrMsg = "" @@ -457,31 +458,31 @@ FUNCTION SeaState_Interp_4D( pKinXX, m, ErrStat, ErrMsg ) u(15) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Lo(4) ) u(16) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Hi(4) ) - SeaState_Interp_4D = SUM ( m%N4D * u ) + SeaSt_Interp_4D = SUM ( m%N4D * u ) -END FUNCTION SeaState_Interp_4D +END FUNCTION SeaSt_Interp_4D !==================================================================================================== !> This routine interpolates a 4-d dataset. !! This method is described here: http://rjwagner49.com/Mathematics/Interpolation.pdf -FUNCTION SeaState_Interp_4D_Vec( pKinXX, m, ErrStat, ErrMsg ) +FUNCTION SeaSt_Interp_4D_Vec( pKinXX, m, ErrStat, ErrMsg ) ! I/O variables real(SiKi), intent(in ) :: pKinXX(0:,:,:,:,:) - TYPE(SeaState_Interp_MiscVarType), INTENT(IN ) :: m !< Parameters + TYPE(SeaSt_Interp_MiscVarType), INTENT(IN ) :: m !< Parameters INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_PointSetup' - Real(SiKi) :: SeaState_Interp_4D_Vec(3) + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_PointSetup' + Real(SiKi) :: SeaSt_Interp_4D_Vec(3) ! Local variables REAL(SiKi) :: u(16) ! size 2^n integer(IntKi) :: iDir - SeaState_Interp_4D_Vec = 0.0_SiKi + SeaSt_Interp_4D_Vec = 0.0_SiKi ErrStat = ErrID_None ErrMsg = "" @@ -506,26 +507,26 @@ FUNCTION SeaState_Interp_4D_Vec( pKinXX, m, ErrStat, ErrMsg ) u(15) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Lo(4), iDir ) u(16) = pKinXX( m%Indx_Hi(1), m%Indx_Hi(2), m%Indx_Hi(3), m%Indx_Hi(4), iDir ) - SeaState_Interp_4D_Vec(iDir) = SUM ( m%N4D * u ) + SeaSt_Interp_4D_Vec(iDir) = SUM ( m%N4D * u ) end do -END FUNCTION SeaState_Interp_4D_Vec +END FUNCTION SeaSt_Interp_4D_Vec !==================================================================================================== !> This routine interpolates a 3-d dataset with index 1 = time (zero-based indexing), 2 = x-coordinate (1-based indexing), 3 = y-coordinate (1-based indexing) !! This method is described here: http://rjwagner49.com/Mathematics/Interpolation.pdf -FUNCTION SeaState_Interp_3D( Time, Position, pKinXX, p, ErrStat, ErrMsg ) +FUNCTION SeaSt_Interp_3D( Time, Position, pKinXX, p, ErrStat, ErrMsg ) ! I/O variables REAL(DbKi), INTENT(IN ) :: Time !< time from the start of the simulation REAL(ReKi), INTENT(IN ) :: Position(2) !< Array of XYZ coordinates, 3 real(SiKi), intent(in ) :: pKinXX(0:,:,:) !< 3D Wave elevation data (SiKi for storage space reasons) - TYPE(SeaState_Interp_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SeaSt_Interp_ParameterType), INTENT(IN ) :: p !< Parameters INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SeaState_Interp_3D' - Real(SiKi) :: SeaState_Interp_3D + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_3D' + Real(SiKi) :: SeaSt_Interp_3D ! Local variables REAL(SiKi) :: u(8) ! size 2^n @@ -538,7 +539,7 @@ FUNCTION SeaState_Interp_3D( Time, Position, pKinXX, p, ErrStat, ErrMsg ) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - SeaState_Interp_3D = 0.0_SiKi + SeaSt_Interp_3D = 0.0_SiKi ErrStat = ErrID_None ErrMsg = "" @@ -546,7 +547,7 @@ FUNCTION SeaState_Interp_3D( Time, Position, pKinXX, p, ErrStat, ErrMsg ) ! Find the bounding indices for time !------------------------------------------------------------------------------------------------- call SetTimeIndex(Time, p%delta(1), p%n(1), Indx_Lo(1), Indx_Hi(1), isopc(1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !error out if x,y,z, or time is outside the lower bounds + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !warning if time is outside the bounds if (ErrStat >= AbortErrLev ) return !------------------------------------------------------------------------------------------------- @@ -554,7 +555,7 @@ FUNCTION SeaState_Interp_3D( Time, Position, pKinXX, p, ErrStat, ErrMsg ) !------------------------------------------------------------------------------------------------- do i=2,3 call SetCartesianXYIndex(Position(i-1), p%pZero(i), p%delta(i), p%n(i), Indx_Lo(i), Indx_Hi(i), isopc(i), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !error out if x,y,z, or time is outside the lower bounds + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !warning if x,y is outside the bounds end do if (ErrStat >= AbortErrLev ) return @@ -583,23 +584,95 @@ FUNCTION SeaState_Interp_3D( Time, Position, pKinXX, p, ErrStat, ErrMsg ) u(7) = pKinXX( Indx_Lo(1), Indx_Hi(2), Indx_Hi(3) ) u(8) = pKinXX( Indx_Lo(1), Indx_Lo(2), Indx_Hi(3) ) - SeaState_Interp_3D = SUM ( N3D * u ) + SeaSt_Interp_3D = SUM ( N3D * u ) + +END FUNCTION SeaSt_Interp_3D + +FUNCTION SeaSt_Interp_3D_VEC6 ( Time, Position, pKinXX, p, ErrStat, ErrMsg ) + ! I/O variables + REAL(DbKi), INTENT(IN ) :: Time !< time from the start of the simulation + REAL(ReKi), INTENT(IN ) :: Position(2) !< Array of XYZ coordinates, 3 + real(SiKi), intent(in ) :: pKinXX(0:,:,:,:) !< 3D Wave excitation data (SiKi for storage space reasons) + TYPE(SeaSt_Interp_ParameterType), INTENT(IN ) :: p !< Parameters + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Interp_3D' + Real(SiKi) :: SeaSt_Interp_3D_VEC6(6) + ! Local variables -END FUNCTION SeaState_Interp_3D + REAL(SiKi) :: u(8) ! size 2^n + real(ReKi) :: N3D(8) + integer(IntKi) :: Indx_Lo(3), Indx_Hi(3) + INTEGER(IntKi) :: i ! loop counter + INTEGER(IntKi) :: ic ! wind-component counter + REAL(SiKi) :: isopc(3) ! isoparametric coordinates + REAL(ReKi) :: Tmp ! temporary fraction of distance between two grid points + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + SeaSt_Interp_3D_VEC6 = 0.0_SiKi + ErrStat = ErrID_None + ErrMsg = "" + + !------------------------------------------------------------------------------------------------- + ! Find the bounding indices for time + !------------------------------------------------------------------------------------------------- + call SetTimeIndex(Time, p%delta(1), p%n(1), Indx_Lo(1), Indx_Hi(1), isopc(1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !warning if time is outside the bounds + if (ErrStat >= AbortErrLev ) return + + !------------------------------------------------------------------------------------------------- + ! Find the bounding indices for XY position + !------------------------------------------------------------------------------------------------- + do i=2,3 + call SetCartesianXYIndex(Position(i-1), p%pZero(i), p%delta(i), p%n(i), Indx_Lo(i), Indx_Hi(i), isopc(i), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !warning if x,y is outside the bounds + end do + if (ErrStat >= AbortErrLev ) return + + + N3D(1) = ( 1.0_ReKi + isopc(1) )*( 1.0_ReKi - isopc(2) )*( 1.0_ReKi - isopc(3) ) + N3D(2) = ( 1.0_ReKi + isopc(1) )*( 1.0_ReKi + isopc(2) )*( 1.0_ReKi - isopc(3) ) + N3D(3) = ( 1.0_ReKi - isopc(1) )*( 1.0_ReKi + isopc(2) )*( 1.0_ReKi - isopc(3) ) + N3D(4) = ( 1.0_ReKi - isopc(1) )*( 1.0_ReKi - isopc(2) )*( 1.0_ReKi - isopc(3) ) + N3D(5) = ( 1.0_ReKi + isopc(1) )*( 1.0_ReKi - isopc(2) )*( 1.0_ReKi + isopc(3) ) + N3D(6) = ( 1.0_ReKi + isopc(1) )*( 1.0_ReKi + isopc(2) )*( 1.0_ReKi + isopc(3) ) + N3D(7) = ( 1.0_ReKi - isopc(1) )*( 1.0_ReKi + isopc(2) )*( 1.0_ReKi + isopc(3) ) + N3D(8) = ( 1.0_ReKi - isopc(1) )*( 1.0_ReKi - isopc(2) )*( 1.0_ReKi + isopc(3) ) + N3D = N3D / REAL( SIZE(N3D), ReKi ) ! normalize + + !------------------------------------------------------------------------------------------------- + ! interpolate + !------------------------------------------------------------------------------------------------- + do i = 1,6 + u(1) = pKinXX( Indx_Hi(1), Indx_Lo(2), Indx_Lo(3), i ) + u(2) = pKinXX( Indx_Hi(1), Indx_Hi(2), Indx_Lo(3), i ) + u(3) = pKinXX( Indx_Lo(1), Indx_Hi(2), Indx_Lo(3), i ) + u(4) = pKinXX( Indx_Lo(1), Indx_Lo(2), Indx_Lo(3), i ) + u(5) = pKinXX( Indx_Hi(1), Indx_Lo(2), Indx_Hi(3), i ) + u(6) = pKinXX( Indx_Hi(1), Indx_Hi(2), Indx_Hi(3), i ) + u(7) = pKinXX( Indx_Lo(1), Indx_Hi(2), Indx_Hi(3), i ) + u(8) = pKinXX( Indx_Lo(1), Indx_Lo(2), Indx_Hi(3), i ) + + SeaSt_Interp_3D_VEC6(i) = SUM ( N3D * u ) + end do +END FUNCTION SeaSt_Interp_3D_VEC6 !---------------------------------------------------------------------------------------------------- !> This routine deallocates any memory in the FDext module. -SUBROUTINE SeaState_Interp_End( ParamData, MiscVars, ErrStat, ErrMsg) +SUBROUTINE SeaSt_Interp_End( ParamData, MiscVars, ErrStat, ErrMsg) IMPLICIT NONE - CHARACTER(*), PARAMETER :: RoutineName="SeaState_Interp_End" + CHARACTER(*), PARAMETER :: RoutineName="SeaSt_Interp_End" ! Passed Variables - TYPE(SeaState_Interp_ParameterType), INTENT(INOUT) :: ParamData !< Parameters - TYPE(SeaState_Interp_MiscVarType), INTENT(INOUT) :: MiscVars !< Misc variables for optimization (not copied in glue code) + TYPE(SeaSt_Interp_ParameterType), INTENT(INOUT) :: ParamData !< Parameters + TYPE(SeaSt_Interp_MiscVarType), INTENT(INOUT) :: MiscVars !< Misc variables for optimization (not copied in glue code) ! Error Handling @@ -619,16 +692,16 @@ SUBROUTINE SeaState_Interp_End( ParamData, MiscVars, ErrStat, ErrMsg) ! Destroy parameter data - CALL SeaState_Interp_DestroyParam( ParamData, TmpErrStat, TmpErrMsg ) + CALL SeaSt_Interp_DestroyParam( ParamData, TmpErrStat, TmpErrMsg ) CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) ! Destroy the misc data - CALL SeaState_Interp_DestroyMisc( MiscVars, TmpErrStat, TmpErrMsg ) + CALL SeaSt_Interp_DestroyMisc( MiscVars, TmpErrStat, TmpErrMsg ) CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -END SUBROUTINE SeaState_Interp_End +END SUBROUTINE SeaSt_Interp_End !==================================================================================================== END MODULE SeaState_Interp diff --git a/modules/seastate/src/seastate_Interp.txt b/modules/seastate/src/seastate_Interp.txt index 130d2110b2..735362db36 100644 --- a/modules/seastate/src/seastate_Interp.txt +++ b/modules/seastate/src/seastate_Interp.txt @@ -12,7 +12,7 @@ include Registry_NWTC_Library.txt ######################### -typedef SeaState_Interp/SeaState_Interp InitInputType IntKi n 4 - - "number of grid points in the x, y, z, and t directions" - +typedef SeaState_Interp/SeaSt_Interp InitInputType IntKi n 4 - - "number of grid points in the x, y, z, and t directions" - typedef ^ InitInputType ReKi delta 4 - - "size between 2 consecutive grid points in each grid direction" "m,m,m,s" typedef ^ InitInputType ReKi pZero 4 - - "fixed position of the XYZ grid (i.e., XYZ coordinates of m%V(:,1,1,1,:))" "m" typedef ^ InitInputType ReKi Z_Depth - - - "grid depth" m From cbde76617d089ed69ba0ab97c10b41757a8c7fbc Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Wed, 1 Dec 2021 09:57:42 -0700 Subject: [PATCH 05/35] Added SeaState module integration in OpenFAST --- .../openfast-library/src/FAST_Registry.txt | 41 +- modules/openfast-library/src/FAST_Solver.f90 | 1 + modules/openfast-library/src/FAST_Subs.f90 | 139 +- modules/openfast-library/src/FAST_Types.f90 | 2777 +++++++++++++---- 4 files changed, 2362 insertions(+), 596 deletions(-) diff --git a/modules/openfast-library/src/FAST_Registry.txt b/modules/openfast-library/src/FAST_Registry.txt index 1e20f3a052..742b7648e1 100644 --- a/modules/openfast-library/src/FAST_Registry.txt +++ b/modules/openfast-library/src/FAST_Registry.txt @@ -17,6 +17,7 @@ usefrom ServoDyn_Registry.txt usefrom Registry-AD14.txt usefrom AeroDyn_Registry.txt usefrom SubDyn_Registry.txt +usefrom SeaState.txt usefrom HydroDyn.txt usefrom IceFloe_FASTRegistry.inp usefrom InflowWind.txt @@ -44,16 +45,17 @@ param ^ - INTEGER Module_BD - 5 - "BeamDyn" - param ^ - INTEGER Module_AD14 - 6 - "AeroDyn14" - param ^ - INTEGER Module_AD - 7 - "AeroDyn" - param ^ - INTEGER Module_SrvD - 8 - "ServoDyn" - -param ^ - INTEGER Module_HD - 9 - "HydroDyn" - -param ^ - INTEGER Module_SD - 10 - "SubDyn" - -param ^ - INTEGER Module_ExtPtfm - 11 - "External Platform Loading MCKF" - -param ^ - INTEGER Module_MAP - 12 - "MAP (Mooring Analysis Program)" - -param ^ - INTEGER Module_FEAM - 13 - "FEAMooring" - -param ^ - INTEGER Module_MD - 14 - "MoorDyn" - -param ^ - INTEGER Module_Orca - 15 - "OrcaFlex integration (HD/Mooring)" - -param ^ - INTEGER Module_IceF - 16 - "IceFloe" - -param ^ - INTEGER Module_IceD - 17 - "IceDyn" - -param ^ - INTEGER NumModules - 17 - "The number of modules available in FAST" - +param ^ - INTEGER Module_SeaSt - 9 - "SeaState" - +param ^ - INTEGER Module_HD - 10 - "HydroDyn" - +param ^ - INTEGER Module_SD - 11 - "SubDyn" - +param ^ - INTEGER Module_ExtPtfm - 12 - "External Platform Loading MCKF" - +param ^ - INTEGER Module_MAP - 13 - "MAP (Mooring Analysis Program)" - +param ^ - INTEGER Module_FEAM - 14 - "FEAMooring" - +param ^ - INTEGER Module_MD - 15 - "MoorDyn" - +param ^ - INTEGER Module_Orca - 16 - "OrcaFlex integration (HD/Mooring)" - +param ^ - INTEGER Module_IceF - 17 - "IceFloe" - +param ^ - INTEGER Module_IceD - 18 - "IceDyn" - +param ^ - INTEGER NumModules - 18 - "The number of modules available in FAST" - # Other Constants param ^ - INTEGER MaxNBlades - 3 - "Maximum number of blades allowed on a turbine" - param ^ - INTEGER IceD_MaxLegs - 4 - "because I don't know how many legs there are before calling IceD_Init and I don't want to copy the data because of sibling mesh issues, I'm going to allocate IceD based on this number" - @@ -111,6 +113,7 @@ typedef ^ FAST_ParameterType IntKi CompElast - - - "Compute blade loads (switch) typedef ^ FAST_ParameterType IntKi CompInflow - - - "Compute inflow wind conditions (switch) {Module_None; Module_IfW; Module_OpFM}" - typedef ^ FAST_ParameterType IntKi CompAero - - - "Compute aerodynamic loads (switch) {Module_None; Module_AD14; Module_AD}" - typedef ^ FAST_ParameterType IntKi CompServo - - - "Compute control and electrical-drive dynamics (switch) {Module_None; Module_SrvD}" - +typedef ^ FAST_ParameterType IntKi CompSeaSt - - - "Compute sea states; wave kinematics (switch) {Module_None; Module_SeaSt}" - typedef ^ FAST_ParameterType IntKi CompHydro - - - "Compute hydrodynamic loads (switch) {Module_None; Module_HD}" - typedef ^ FAST_ParameterType IntKi CompSub - - - "Compute sub-structural dynamics (switch) {Module_None; Module_HD}" - typedef ^ FAST_ParameterType IntKi CompMooring - - - "Compute mooring system (switch) {Module_None; Module_MAP; Module_FEAM; Module_MD; Module_Orca}" - @@ -134,6 +137,7 @@ typedef ^ FAST_ParameterType CHARACTER(1024) BDBldFile {MaxNBlades} - - "Name of typedef ^ FAST_ParameterType CHARACTER(1024) InflowFile - - - "Name of file containing inflow wind input parameters" - typedef ^ FAST_ParameterType CHARACTER(1024) AeroFile - - - "Name of file containing aerodynamic input parameters" - typedef ^ FAST_ParameterType CHARACTER(1024) ServoFile - - - "Name of file containing control and electrical-drive input parameters" - +typedef ^ FAST_ParameterType CHARACTER(1024) SeaStFile - - - "Name of file containing sea state input parameters" - typedef ^ FAST_ParameterType CHARACTER(1024) HydroFile - - - "Name of file containing hydrodynamic input parameters" - typedef ^ FAST_ParameterType CHARACTER(1024) SubFile - - - "Name of file containing sub-structural input parameters" - typedef ^ FAST_ParameterType CHARACTER(1024) MooringFile - - - "Name of file containing mooring system input parameters" - @@ -496,6 +500,20 @@ typedef ^ ^ ExtPtfm_MiscVarType m - - - "Misc/optimization variables" typedef ^ ^ ExtPtfm_InputType Input {:} - - "Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" +# ..... SeaState data ....................................................................................................... +typedef FAST SeaState_Data SeaSt_ContinuousStateType x {2} - - "Continuous states" +typedef ^ ^ SeaSt_DiscreteStateType xd {2} - - "Discrete states" +typedef ^ ^ SeaSt_ConstraintStateType z {2} - - "Constraint states" +typedef ^ ^ SeaSt_OtherStateType OtherSt {2} - - "Other states" +typedef ^ ^ SeaSt_ParameterType p - - - "Parameters" +typedef ^ ^ SeaSt_InputType u - - - "System inputs" +typedef ^ ^ SeaSt_OutputType y - - - "System outputs" +typedef ^ ^ SeaSt_MiscVarType m - - - "Misc/optimization variables" +typedef ^ ^ SeaSt_InputType Input {:} - - "Array of inputs associated with InputTimes" +typedef ^ ^ SeaSt_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" +typedef ^ ^ SeaSt_OutputType y_interp - - - "interpolated system outputs for CalcSteady" +typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" + # ..... HydroDyn data ....................................................................................................... typedef FAST HydroDyn_Data HydroDyn_ContinuousStateType x {2} - - "Continuous states" typedef ^ ^ HydroDyn_DiscreteStateType xd {2} - - "Discrete states" @@ -693,6 +711,8 @@ typedef ^ FAST_InitData InflowWind_InitInputType InData_IfW - - typedef ^ FAST_InitData InflowWind_InitOutputType OutData_IfW - - - "IfW Initialization output data" typedef ^ FAST_InitData OpFM_InitInputType InData_OpFM - - - "OpFM Initialization input data" typedef ^ FAST_InitData OpFM_InitOutputType OutData_OpFM - - - "OpFM Initialization output data" +typedef ^ FAST_InitData SeaSt_InitInputType InData_SeaSt - - - "SeaSt Initialization input data" +typedef ^ FAST_InitData SeaSt_InitOutputType OutData_SeaSt - - - "SeaSt Initialization output data" typedef ^ FAST_InitData HydroDyn_InitInputType InData_HD - - - "HD Initialization input data" typedef ^ FAST_InitData HydroDyn_InitOutputType OutData_HD - - - "HD Initialization output data" typedef ^ FAST_InitData SD_InitInputType InData_SD - - - "SD Initialization input data" @@ -747,6 +767,7 @@ typedef ^ FAST_TurbineType AeroDyn14_Data AD14 - - - "Data for the AeroDyn14 mod typedef ^ FAST_TurbineType InflowWind_Data IfW - - - "Data for InflowWind module" - typedef ^ FAST_TurbineType OpenFOAM_Data OpFM - - - "Data for OpenFOAM integration module" - typedef ^ FAST_TurbineType SCDataEx_Data SC_DX - - - "Data for SuperController integration module" - +typedef ^ FAST_TurbineType SeaState_Data SeaSt - - - "Data for the SeaState module" - typedef ^ FAST_TurbineType HydroDyn_Data HD - - - "Data for the HydroDyn module" - typedef ^ FAST_TurbineType SubDyn_Data SD - - - "Data for the SubDyn module" - typedef ^ FAST_TurbineType MAP_Data MAP - - - "Data for the MAP (Mooring Analysis Program) module" - diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 653508f018..2ae5ff610d 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -36,6 +36,7 @@ MODULE FAST_Solver USE MoorDyn USE MAP USE OrcaFlexInterface + USE SeaState USE HydroDyn USE IceDyn USE IceFloe diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 1ef64aedf9..85dd6fd99c 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -49,18 +49,18 @@ SUBROUTINE FAST_InitializeAll_T( t_initial, TurbID, Turbine, ErrStat, ErrMsg, In IF (PRESENT(ExternInitData)) THEN CALL FAST_InitializeAll( t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, Turbine%SC_DX,& - Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & + Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg, InFile, ExternInitData ) ELSE CALL FAST_InitializeAll( t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, Turbine%SC_DX, & - Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & + Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg, InFile ) END IF ELSE CALL FAST_InitializeAll( t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, Turbine%SC_DX, & - Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & + Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) END IF @@ -68,7 +68,7 @@ SUBROUTINE FAST_InitializeAll_T( t_initial, TurbID, Turbine, ErrStat, ErrMsg, In END SUBROUTINE FAST_InitializeAll_T !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to call Init routine for each module. This routine sets all of the init input data for each module. -SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, SC_DX, HD, SD, ExtPtfm, & +SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, SC_DX, SeaSt, HD, SD, ExtPtfm, & MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg, InFile, ExternInitData ) use ElastoDyn_Parameters, only: Method_RK4 @@ -86,6 +86,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data TYPE(OpenFOAM_Data), INTENT(INOUT) :: OpFM !< OpenFOAM data TYPE(SCDataEx_Data), INTENT(INOUT) :: SC_DX !< SuperController exchange data + TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data @@ -856,7 +857,88 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, END IF end if - + ! ........................ + ! initialize SeaStates + ! ........................ + if ( p_FAST%CompSeaSt == Module_SeaSt ) then + + Init%InData_SeaSt%Gravity = p_FAST%Gravity + Init%InData_SeaSt%defWtrDens = p_FAST%WtrDens + Init%InData_SeaSt%defWtrDpth = p_FAST%WtrDpth + Init%InData_SeaSt%defMSL2SWL = p_FAST%MSL2SWL + Init%InData_SeaSt%UseInputFile = .TRUE. + Init%InData_SeaSt%InputFile = p_FAST%SeaStFile + Init%InData_SeaSt%OutRootName = p_FAST%OutFileRoot + Init%InData_SeaSt%TMax = p_FAST%TMax + + CALL SeaSt_Init( Init%InData_SeaSt, SeaSt%Input(1), SeaSt%p, SeaSt%x(STATE_CURR), SeaSt%xd(STATE_CURR), SeaSt%z(STATE_CURR), & + SeaSt%OtherSt(STATE_CURR), SeaSt%y, SeaSt%m, p_FAST%dt_module( MODULE_SeaSt ), Init%OutData_SeaSt, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + p_FAST%ModuleInitialized(Module_SeaSt) = .TRUE. + CALL SetModuleSubstepTime(Module_SeaSt, p_FAST, y_FAST, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + ! Need to set up other module's InitInput data here because we will also need to clean up SeaState data and would rather not defer that cleanup + if ( p_FAST%CompHydro == Module_HD ) then + Init%InData_HD%NStepWave = Init%OutData_SeaSt%NStepWave + Init%InData_HD%NStepWave2 = Init%OutData_SeaSt%NStepWave2 + Init%InData_HD%RhoXg = Init%OutData_SeaSt%RhoXg + Init%InData_HD%WaveMod = Init%OutData_SeaSt%WaveMod + Init%InData_HD%CurrMod = Init%OutData_SeaSt%CurrMod + Init%InData_HD%WaveStMod = Init%OutData_SeaSt%WaveStMod + Init%InData_HD%WaveDirMod = Init%OutData_SeaSt%WaveDirMod + Init%InData_HD%WvLowCOff = Init%OutData_SeaSt%WvLowCOff + Init%InData_HD%WvHiCOff = Init%OutData_SeaSt%WvHiCOff + Init%InData_HD%WvLowCOffD = Init%OutData_SeaSt%WvLowCOffD + Init%InData_HD%WvHiCOffD = Init%OutData_SeaSt%WvHiCOffD + Init%InData_HD%WvLowCOffS = Init%OutData_SeaSt%WvLowCOffS + Init%InData_HD%WvHiCOffS = Init%OutData_SeaSt%WvHiCOffS + Init%InData_HD%WvDiffQTFF = Init%OutData_SeaSt%WvDiffQTFF + Init%InData_HD%WvSumQTFF = Init%OutData_SeaSt%WvSumQTFF + Init%InData_HD%WaveDirMin = Init%OutData_SeaSt%WaveDirMin + Init%InData_HD%WaveDirMax = Init%OutData_SeaSt%WaveDirMax + Init%InData_HD%WaveDir = Init%OutData_SeaSt%WaveDir + Init%InData_HD%WaveMultiDir = Init%OutData_SeaSt%WaveMultiDir + Init%InData_HD%WaveDOmega = Init%OutData_SeaSt%WaveDOmega + CALL MOVE_ALLOC( Init%OutData_SeaSt%WaveElev0, Init%InData_HD%WaveElev0 ) + Init%InData_HD%WaveTime => Init%OutData_SeaSt%WaveTime + Init%InData_HD%WaveDynP => Init%OutData_SeaSt%WaveDynP + Init%InData_HD%WaveAcc => Init%OutData_SeaSt%WaveAcc + Init%InData_HD%WaveVel => Init%OutData_SeaSt%WaveVel + Init%InData_HD%WaveElevC0 => Init%OutData_SeaSt%WaveElevC0 + CALL MOVE_ALLOC( Init%OutData_SeaSt%WaveElevC, Init%InData_HD%WaveElevC ) + Init%InData_HD%WaveDirArr => Init%OutData_SeaSt%WaveDirArr + Init%InData_HD%WaveElev => Init%OutData_SeaSt%WaveElev + Init%InData_HD%WaveElev1 => Init%OutData_SeaSt%WaveElev1 + Init%InData_HD%WaveElev2 => Init%OutData_SeaSt%WaveElev2 + + call SeaSt_Interp_CopyParam(Init%OutData_SeaSt%SeaSt_Interp_p, Init%InData_HD%SeaSt_Interp_p, 0, ErrStat, ErrMsg ) + + end if + + + ! Now that all modules have been handled their pointer data, we need to nullify some of the SeaState InitOut pointers + ! The modules which were handed the data will be deallocating it. + + ! NOTE: this may need to change once other modules start using SeaState + nullify(Init%OutData_SeaSt%WaveDynP) + nullify(Init%OutData_SeaSt%WaveAcc) + nullify(Init%OutData_SeaSt%WaveVel) + nullify(Init%OutData_SeaSt%WaveTime) + nullify(Init%OutData_SeaSt%WaveElevC0) + nullify(Init%OutData_SeaSt%WaveDirArr) + nullify(Init%OutData_SeaSt%WaveElev) + nullify(Init%OutData_SeaSt%WaveElev1) + nullify(Init%OutData_SeaSt%WaveElev2) + + end if + ! ........................ ! initialize HydroDyn ! ........................ @@ -905,6 +987,20 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, if (allocated(Init%OutData_HD%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_HD)%Instance(1)%NumOutputs = size(Init%OutData_HD%WriteOutputHdr) end if + ! 1) Nullify the HD Init Input pointers + ! 2) Now, when HydroDyn_DestroyInitInput is called and hence SeaState_DestroyInitOutput, we will not deallocate data which is still in use because the is associated test will fail. + + nullify(Init%InData_HD%WaveElevC0) + nullify(Init%InData_HD%WaveDirArr) + nullify(Init%InData_HD%WaveDynP) + nullify(Init%InData_HD%WaveAcc) + nullify(Init%InData_HD%WaveVel) + nullify(Init%InData_HD%WaveTime) + nullify(Init%InData_HD%WaveElev) + nullify(Init%InData_HD%WaveElev1) + nullify(Init%InData_HD%WaveElev2) + + IF (ErrStat >= AbortErrLev) THEN CALL Cleanup() RETURN @@ -1711,10 +1807,17 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) IF (p%CompElast == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompElast must be 1 (ElastoDyn) or 2 (BeamDyn).', ErrStat, ErrMsg, RoutineName ) IF (p%CompAero == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompAero must be 0 (None), 1 (AeroDyn14), or 2 (AeroDyn).', ErrStat, ErrMsg, RoutineName ) IF (p%CompServo == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompServo must be 0 (None) or 1 (ServoDyn).', ErrStat, ErrMsg, RoutineName ) + IF (p%CompSeaSt == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompSeaSt must be 0 (None) or 1 (SeaState).', ErrStat, ErrMsg, RoutineName ) IF (p%CompHydro == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompHydro must be 0 (None) or 1 (HydroDyn).', ErrStat, ErrMsg, RoutineName ) IF (p%CompSub == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompSub must be 0 (None), 1 (SubDyn), or 2 (ExtPtfm_MCKF).', ErrStat, ErrMsg, RoutineName ) IF (p%CompMooring == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompMooring must be 0 (None), 1 (MAP), 2 (FEAMooring), 3 (MoorDyn), or 4 (OrcaFlex).', ErrStat, ErrMsg, RoutineName ) IF (p%CompIce == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompIce must be 0 (None) or 1 (IceFloe).', ErrStat, ErrMsg, RoutineName ) + + ! NOTE: If future modules consume SeaState data, then their checks should be added to this routine. 12/1/21 GJH + if (p%CompHydro == Module_HD .and. p%CompSeaSt==0) then + CALL SetErrStat( ErrID_Fatal, 'SeaState must be used when HydroDyn is used. Set CompSeaSt = 1 in the FAST input file.', ErrStat, ErrMsg, RoutineName ) + end if + IF (p%CompHydro /= Module_HD) THEN IF (p%CompMooring == Module_MAP) THEN CALL SetErrStat( ErrID_Fatal, 'HydroDyn must be used when MAP is used. Set CompHydro > 0 or CompMooring = 0 in the FAST input file.', ErrStat, ErrMsg, RoutineName ) @@ -2498,6 +2601,23 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS END IF + ! CompSeaSt - Compute sea state information (switch) {0=None; 1=SeaState}: + CALL ReadVar( UnIn, InputFile, p%CompSeaSt, "CompSeaSt", "Compute sea state information (switch) {0=None; 1=SeaState}}", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if ( ErrStat >= AbortErrLev ) then + call cleanup() + RETURN + end if + + ! immediately convert to values used inside the code: + IF ( p%CompSeaSt == 0 ) THEN + p%CompSeaSt = Module_NONE + ELSEIF ( p%CompSeaSt == 1 ) THEN + p%CompSeaSt = Module_SeaSt + ELSE + p%CompSeaSt = Module_Unknown + END IF + ! CompHydro - Compute hydrodynamic loads (switch) {0=None; 1=HydroDyn}: CALL ReadVar( UnIn, InputFile, p%CompHydro, "CompHydro", "Compute hydrodynamic loads (switch) {0=None; 1=HydroDyn}", ErrStat2, ErrMsg2, UnEc) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -2719,6 +2839,15 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS end if IF ( PathIsRelative( p%ServoFile ) ) p%ServoFile = TRIM(PriPath)//TRIM(p%ServoFile) + ! SeaStFile - Name of file containing sea state input parameters (-): + CALL ReadVar( UnIn, InputFile, p%SeaStFile, "SeaStFile", "Name of file containing sea state input parameters (-)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if ( ErrStat >= AbortErrLev ) then + call cleanup() + RETURN + end if + IF ( PathIsRelative( p%HydroFile ) ) p%HydroFile = TRIM(PriPath)//TRIM(p%HydroFile) + ! HydroFile - Name of file containing hydrodynamic input parameters (-): CALL ReadVar( UnIn, InputFile, p%HydroFile, "HydroFile", "Name of file containing hydrodynamic input parameters (-)", ErrStat2, ErrMsg2, UnEc) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index 3b40cdd4a1..84ed5f6e5a 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -57,6 +57,8 @@ MODULE FAST_Types USE Current_Types USE Waves_Types USE Waves2_Types +USE SeaState_Interp_Types +USE SeaState_Types USE Conv_Radiation_Types USE SS_Radiation_Types USE SS_Excitation_Types @@ -86,16 +88,17 @@ MODULE FAST_Types INTEGER(IntKi), PUBLIC, PARAMETER :: Module_AD14 = 6 ! AeroDyn14 [-] INTEGER(IntKi), PUBLIC, PARAMETER :: Module_AD = 7 ! AeroDyn [-] INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SrvD = 8 ! ServoDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_HD = 9 ! HydroDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SD = 10 ! SubDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ExtPtfm = 11 ! External Platform Loading MCKF [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_MAP = 12 ! MAP (Mooring Analysis Program) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_FEAM = 13 ! FEAMooring [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_MD = 14 ! MoorDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_Orca = 15 ! OrcaFlex integration (HD/Mooring) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IceF = 16 ! IceFloe [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IceD = 17 ! IceDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: NumModules = 17 ! The number of modules available in FAST [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SeaSt = 9 ! SeaState [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_HD = 10 ! HydroDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SD = 11 ! SubDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ExtPtfm = 12 ! External Platform Loading MCKF [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_MAP = 13 ! MAP (Mooring Analysis Program) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_FEAM = 14 ! FEAMooring [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_MD = 15 ! MoorDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_Orca = 16 ! OrcaFlex integration (HD/Mooring) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IceF = 17 ! IceFloe [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IceD = 18 ! IceDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: NumModules = 18 ! The number of modules available in FAST [-] INTEGER(IntKi), PUBLIC, PARAMETER :: MaxNBlades = 3 ! Maximum number of blades allowed on a turbine [-] INTEGER(IntKi), PUBLIC, PARAMETER :: IceD_MaxLegs = 4 ! because I don't know how many legs there are before calling IceD_Init and I don't want to copy the data because of sibling mesh issues, I'm going to allocate IceD based on this number [-] ! ========= FAST_VTK_BLSurfaceType ======= @@ -155,6 +158,7 @@ MODULE FAST_Types INTEGER(IntKi) :: CompInflow !< Compute inflow wind conditions (switch) {Module_None; Module_IfW; Module_OpFM} [-] INTEGER(IntKi) :: CompAero !< Compute aerodynamic loads (switch) {Module_None; Module_AD14; Module_AD} [-] INTEGER(IntKi) :: CompServo !< Compute control and electrical-drive dynamics (switch) {Module_None; Module_SrvD} [-] + INTEGER(IntKi) :: CompSeaSt !< Compute sea states; wave kinematics (switch) {Module_None; Module_SeaSt} [-] INTEGER(IntKi) :: CompHydro !< Compute hydrodynamic loads (switch) {Module_None; Module_HD} [-] INTEGER(IntKi) :: CompSub !< Compute sub-structural dynamics (switch) {Module_None; Module_HD} [-] INTEGER(IntKi) :: CompMooring !< Compute mooring system (switch) {Module_None; Module_MAP; Module_FEAM; Module_MD; Module_Orca} [-] @@ -176,6 +180,7 @@ MODULE FAST_Types CHARACTER(1024) :: InflowFile !< Name of file containing inflow wind input parameters [-] CHARACTER(1024) :: AeroFile !< Name of file containing aerodynamic input parameters [-] CHARACTER(1024) :: ServoFile !< Name of file containing control and electrical-drive input parameters [-] + CHARACTER(1024) :: SeaStFile !< Name of file containing sea state input parameters [-] CHARACTER(1024) :: HydroFile !< Name of file containing hydrodynamic input parameters [-] CHARACTER(1024) :: SubFile !< Name of file containing sub-structural input parameters [-] CHARACTER(1024) :: MooringFile !< Name of file containing mooring system input parameters [-] @@ -538,6 +543,22 @@ MODULE FAST_Types REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] END TYPE ExtPtfm_Data ! ======================= +! ========= SeaState_Data ======= + TYPE, PUBLIC :: SeaState_Data + TYPE(SeaSt_ContinuousStateType) , DIMENSION(1:2) :: x !< Continuous states [-] + TYPE(SeaSt_DiscreteStateType) , DIMENSION(1:2) :: xd !< Discrete states [-] + TYPE(SeaSt_ConstraintStateType) , DIMENSION(1:2) :: z !< Constraint states [-] + TYPE(SeaSt_OtherStateType) , DIMENSION(1:2) :: OtherSt !< Other states [-] + TYPE(SeaSt_ParameterType) :: p !< Parameters [-] + TYPE(SeaSt_InputType) :: u !< System inputs [-] + TYPE(SeaSt_OutputType) :: y !< System outputs [-] + TYPE(SeaSt_MiscVarType) :: m !< Misc/optimization variables [-] + TYPE(SeaSt_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] + TYPE(SeaSt_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] + TYPE(SeaSt_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] + REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] + END TYPE SeaState_Data +! ======================= ! ========= HydroDyn_Data ======= TYPE, PUBLIC :: HydroDyn_Data TYPE(HydroDyn_ContinuousStateType) , DIMENSION(1:2) :: x !< Continuous states [-] @@ -736,6 +757,8 @@ MODULE FAST_Types TYPE(InflowWind_InitOutputType) :: OutData_IfW !< IfW Initialization output data [-] TYPE(OpFM_InitInputType) :: InData_OpFM !< OpFM Initialization input data [-] TYPE(OpFM_InitOutputType) :: OutData_OpFM !< OpFM Initialization output data [-] + TYPE(SeaSt_InitInputType) :: InData_SeaSt !< SeaSt Initialization input data [-] + TYPE(SeaSt_InitOutputType) :: OutData_SeaSt !< SeaSt Initialization output data [-] TYPE(HydroDyn_InitInputType) :: InData_HD !< HD Initialization input data [-] TYPE(HydroDyn_InitOutputType) :: OutData_HD !< HD Initialization output data [-] TYPE(SD_InitInputType) :: InData_SD !< SD Initialization input data [-] @@ -792,6 +815,7 @@ MODULE FAST_Types TYPE(InflowWind_Data) :: IfW !< Data for InflowWind module [-] TYPE(OpenFOAM_Data) :: OpFM !< Data for OpenFOAM integration module [-] TYPE(SCDataEx_Data) :: SC_DX !< Data for SuperController integration module [-] + TYPE(SeaState_Data) :: SeaSt !< Data for the SeaState module [-] TYPE(HydroDyn_Data) :: HD !< Data for the HydroDyn module [-] TYPE(SubDyn_Data) :: SD !< Data for the SubDyn module [-] TYPE(MAP_Data) :: MAP !< Data for the MAP (Mooring Analysis Program) module [-] @@ -2131,6 +2155,7 @@ SUBROUTINE FAST_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%CompInflow = SrcParamData%CompInflow DstParamData%CompAero = SrcParamData%CompAero DstParamData%CompServo = SrcParamData%CompServo + DstParamData%CompSeaSt = SrcParamData%CompSeaSt DstParamData%CompHydro = SrcParamData%CompHydro DstParamData%CompSub = SrcParamData%CompSub DstParamData%CompMooring = SrcParamData%CompMooring @@ -2152,6 +2177,7 @@ SUBROUTINE FAST_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%InflowFile = SrcParamData%InflowFile DstParamData%AeroFile = SrcParamData%AeroFile DstParamData%ServoFile = SrcParamData%ServoFile + DstParamData%SeaStFile = SrcParamData%SeaStFile DstParamData%HydroFile = SrcParamData%HydroFile DstParamData%SubFile = SrcParamData%SubFile DstParamData%MooringFile = SrcParamData%MooringFile @@ -2274,6 +2300,7 @@ SUBROUTINE FAST_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_BufSz = Int_BufSz + 1 ! CompInflow Int_BufSz = Int_BufSz + 1 ! CompAero Int_BufSz = Int_BufSz + 1 ! CompServo + Int_BufSz = Int_BufSz + 1 ! CompSeaSt Int_BufSz = Int_BufSz + 1 ! CompHydro Int_BufSz = Int_BufSz + 1 ! CompSub Int_BufSz = Int_BufSz + 1 ! CompMooring @@ -2295,6 +2322,7 @@ SUBROUTINE FAST_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_BufSz = Int_BufSz + 1*LEN(InData%InflowFile) ! InflowFile Int_BufSz = Int_BufSz + 1*LEN(InData%AeroFile) ! AeroFile Int_BufSz = Int_BufSz + 1*LEN(InData%ServoFile) ! ServoFile + Int_BufSz = Int_BufSz + 1*LEN(InData%SeaStFile) ! SeaStFile Int_BufSz = Int_BufSz + 1*LEN(InData%HydroFile) ! HydroFile Int_BufSz = Int_BufSz + 1*LEN(InData%SubFile) ! SubFile Int_BufSz = Int_BufSz + 1*LEN(InData%MooringFile) ! MooringFile @@ -2450,6 +2478,8 @@ SUBROUTINE FAST_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%CompServo Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%CompSeaSt + Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%CompHydro Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%CompSub @@ -2504,6 +2534,10 @@ SUBROUTINE FAST_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, IntKiBuf(Int_Xferred) = ICHAR(InData%ServoFile(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I + DO I = 1, LEN(InData%SeaStFile) + IntKiBuf(Int_Xferred) = ICHAR(InData%SeaStFile(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I DO I = 1, LEN(InData%HydroFile) IntKiBuf(Int_Xferred) = ICHAR(InData%HydroFile(I:I), IntKi) Int_Xferred = Int_Xferred + 1 @@ -2763,6 +2797,8 @@ SUBROUTINE FAST_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMs Int_Xferred = Int_Xferred + 1 OutData%CompServo = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 + OutData%CompSeaSt = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 OutData%CompHydro = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 OutData%CompSub = IntKiBuf(Int_Xferred) @@ -2819,6 +2855,10 @@ SUBROUTINE FAST_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMs OutData%ServoFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I + DO I = 1, LEN(OutData%SeaStFile) + OutData%SeaStFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I DO I = 1, LEN(OutData%HydroFile) OutData%HydroFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 @@ -26575,18 +26615,1326 @@ SUBROUTINE FAST_UnPackSCDataEx_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SC_DX_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%p, ErrStat2, ErrMsg2 ) ! p + CALL SC_DX_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%p, ErrStat2, ErrMsg2 ) ! p + 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) + END SUBROUTINE FAST_UnPackSCDataEx_Data + + SUBROUTINE FAST_CopySubDyn_Data( SrcSubDyn_DataData, DstSubDyn_DataData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SubDyn_Data), INTENT(INOUT) :: SrcSubDyn_DataData + TYPE(SubDyn_Data), INTENT(INOUT) :: DstSubDyn_DataData + 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_CopySubDyn_Data' +! + ErrStat = ErrID_None + ErrMsg = "" + DO i1 = LBOUND(SrcSubDyn_DataData%x,1), UBOUND(SrcSubDyn_DataData%x,1) + CALL SD_CopyContState( SrcSubDyn_DataData%x(i1), DstSubDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO + DO i1 = LBOUND(SrcSubDyn_DataData%xd,1), UBOUND(SrcSubDyn_DataData%xd,1) + CALL SD_CopyDiscState( SrcSubDyn_DataData%xd(i1), DstSubDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO + DO i1 = LBOUND(SrcSubDyn_DataData%z,1), UBOUND(SrcSubDyn_DataData%z,1) + CALL SD_CopyConstrState( SrcSubDyn_DataData%z(i1), DstSubDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO + DO i1 = LBOUND(SrcSubDyn_DataData%OtherSt,1), UBOUND(SrcSubDyn_DataData%OtherSt,1) + CALL SD_CopyOtherState( SrcSubDyn_DataData%OtherSt(i1), DstSubDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO + CALL SD_CopyParam( SrcSubDyn_DataData%p, DstSubDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL SD_CopyInput( SrcSubDyn_DataData%u, DstSubDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL SD_CopyOutput( SrcSubDyn_DataData%y, DstSubDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL SD_CopyMisc( SrcSubDyn_DataData%m, DstSubDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN +IF (ALLOCATED(SrcSubDyn_DataData%Input)) THEN + i1_l = LBOUND(SrcSubDyn_DataData%Input,1) + i1_u = UBOUND(SrcSubDyn_DataData%Input,1) + IF (.NOT. ALLOCATED(DstSubDyn_DataData%Input)) THEN + ALLOCATE(DstSubDyn_DataData%Input(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%Input.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DO i1 = LBOUND(SrcSubDyn_DataData%Input,1), UBOUND(SrcSubDyn_DataData%Input,1) + CALL SD_CopyInput( SrcSubDyn_DataData%Input(i1), DstSubDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO +ENDIF +IF (ALLOCATED(SrcSubDyn_DataData%Output)) THEN + i1_l = LBOUND(SrcSubDyn_DataData%Output,1) + i1_u = UBOUND(SrcSubDyn_DataData%Output,1) + IF (.NOT. ALLOCATED(DstSubDyn_DataData%Output)) THEN + ALLOCATE(DstSubDyn_DataData%Output(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%Output.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DO i1 = LBOUND(SrcSubDyn_DataData%Output,1), UBOUND(SrcSubDyn_DataData%Output,1) + CALL SD_CopyOutput( SrcSubDyn_DataData%Output(i1), DstSubDyn_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO +ENDIF + CALL SD_CopyOutput( SrcSubDyn_DataData%y_interp, DstSubDyn_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN +IF (ALLOCATED(SrcSubDyn_DataData%InputTimes)) THEN + i1_l = LBOUND(SrcSubDyn_DataData%InputTimes,1) + i1_u = UBOUND(SrcSubDyn_DataData%InputTimes,1) + IF (.NOT. ALLOCATED(DstSubDyn_DataData%InputTimes)) THEN + ALLOCATE(DstSubDyn_DataData%InputTimes(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%InputTimes.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstSubDyn_DataData%InputTimes = SrcSubDyn_DataData%InputTimes +ENDIF + END SUBROUTINE FAST_CopySubDyn_Data + + SUBROUTINE FAST_DestroySubDyn_Data( SubDyn_DataData, ErrStat, ErrMsg ) + TYPE(SubDyn_Data), INTENT(INOUT) :: SubDyn_DataData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroySubDyn_Data' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" +DO i1 = LBOUND(SubDyn_DataData%x,1), UBOUND(SubDyn_DataData%x,1) + CALL SD_DestroyContState( SubDyn_DataData%x(i1), ErrStat, ErrMsg ) +ENDDO +DO i1 = LBOUND(SubDyn_DataData%xd,1), UBOUND(SubDyn_DataData%xd,1) + CALL SD_DestroyDiscState( SubDyn_DataData%xd(i1), ErrStat, ErrMsg ) +ENDDO +DO i1 = LBOUND(SubDyn_DataData%z,1), UBOUND(SubDyn_DataData%z,1) + CALL SD_DestroyConstrState( SubDyn_DataData%z(i1), ErrStat, ErrMsg ) +ENDDO +DO i1 = LBOUND(SubDyn_DataData%OtherSt,1), UBOUND(SubDyn_DataData%OtherSt,1) + CALL SD_DestroyOtherState( SubDyn_DataData%OtherSt(i1), ErrStat, ErrMsg ) +ENDDO + CALL SD_DestroyParam( SubDyn_DataData%p, ErrStat, ErrMsg ) + CALL SD_DestroyInput( SubDyn_DataData%u, ErrStat, ErrMsg ) + CALL SD_DestroyOutput( SubDyn_DataData%y, ErrStat, ErrMsg ) + CALL SD_DestroyMisc( SubDyn_DataData%m, ErrStat, ErrMsg ) +IF (ALLOCATED(SubDyn_DataData%Input)) THEN +DO i1 = LBOUND(SubDyn_DataData%Input,1), UBOUND(SubDyn_DataData%Input,1) + CALL SD_DestroyInput( SubDyn_DataData%Input(i1), ErrStat, ErrMsg ) +ENDDO + DEALLOCATE(SubDyn_DataData%Input) +ENDIF +IF (ALLOCATED(SubDyn_DataData%Output)) THEN +DO i1 = LBOUND(SubDyn_DataData%Output,1), UBOUND(SubDyn_DataData%Output,1) + CALL SD_DestroyOutput( SubDyn_DataData%Output(i1), ErrStat, ErrMsg ) +ENDDO + DEALLOCATE(SubDyn_DataData%Output) +ENDIF + CALL SD_DestroyOutput( SubDyn_DataData%y_interp, ErrStat, ErrMsg ) +IF (ALLOCATED(SubDyn_DataData%InputTimes)) THEN + DEALLOCATE(SubDyn_DataData%InputTimes) +ENDIF + END SUBROUTINE FAST_DestroySubDyn_Data + + SUBROUTINE FAST_PackSubDyn_Data( 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(SubDyn_Data), 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 = 'FAST_PackSubDyn_Data' + ! 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 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) + Int_BufSz = Int_BufSz + 3 ! x: size of buffers for each call to pack subtype + CALL SD_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, .TRUE. ) ! x + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! x + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! x + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! x + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) + Int_BufSz = Int_BufSz + 3 ! xd: size of buffers for each call to pack subtype + CALL SD_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, .TRUE. ) ! xd + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! xd + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! xd + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! xd + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) + Int_BufSz = Int_BufSz + 3 ! z: size of buffers for each call to pack subtype + CALL SD_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, .TRUE. ) ! z + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! z + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! z + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! z + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) + Int_BufSz = Int_BufSz + 3 ! OtherSt: size of buffers for each call to pack subtype + CALL SD_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OtherSt + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! OtherSt + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! OtherSt + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! OtherSt + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + Int_BufSz = Int_BufSz + 3 ! p: size of buffers for each call to pack subtype + CALL SD_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, .TRUE. ) ! p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! u: size of buffers for each call to pack subtype + CALL SD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, .TRUE. ) ! u + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! u + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! u + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! u + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! y: size of buffers for each call to pack subtype + CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, .TRUE. ) ! y + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! y + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! y + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! y + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! m: size of buffers for each call to pack subtype + CALL SD_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, .TRUE. ) ! m + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! m + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! m + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! m + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 1 ! Input allocated yes/no + IF ( ALLOCATED(InData%Input) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! Input upper/lower bounds for each dimension + DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) + Int_BufSz = Int_BufSz + 3 ! Input: size of buffers for each call to pack subtype + CALL SD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Input + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Input + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Input + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Input + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + END IF + Int_BufSz = Int_BufSz + 1 ! Output allocated yes/no + IF ( ALLOCATED(InData%Output) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! Output upper/lower bounds for each dimension + DO i1 = LBOUND(InData%Output,1), UBOUND(InData%Output,1) + Int_BufSz = Int_BufSz + 3 ! Output: size of buffers for each call to pack subtype + CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Output(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Output + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Output + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Output + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Output + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + END IF + Int_BufSz = Int_BufSz + 3 ! y_interp: size of buffers for each call to pack subtype + CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y_interp, ErrStat2, ErrMsg2, .TRUE. ) ! y_interp + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! y_interp + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! y_interp + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! y_interp + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 1 ! InputTimes allocated yes/no + IF ( ALLOCATED(InData%InputTimes) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! InputTimes upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%InputTimes) ! InputTimes + END IF + 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 i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) + CALL SD_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, OnlySize ) ! x + 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 + END DO + DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) + CALL SD_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, OnlySize ) ! xd + 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 + END DO + DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) + CALL SD_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, OnlySize ) ! z + 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 + END DO + DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) + CALL SD_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, OnlySize ) ! OtherSt + 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 + END DO + CALL SD_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, OnlySize ) ! p + 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 + CALL SD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, OnlySize ) ! u + 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 + CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, OnlySize ) ! y + 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 + CALL SD_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, OnlySize ) ! m + 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 + IF ( .NOT. ALLOCATED(InData%Input) ) 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%Input,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Input,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) + CALL SD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, OnlySize ) ! Input + 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 + END DO + END IF + IF ( .NOT. ALLOCATED(InData%Output) ) 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%Output,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Output,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%Output,1), UBOUND(InData%Output,1) + CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Output(i1), ErrStat2, ErrMsg2, OnlySize ) ! Output + 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 + END DO + END IF + CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y_interp, ErrStat2, ErrMsg2, OnlySize ) ! y_interp + 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 + IF ( .NOT. ALLOCATED(InData%InputTimes) ) 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%InputTimes,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%InputTimes,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%InputTimes,1), UBOUND(InData%InputTimes,1) + DbKiBuf(Db_Xferred) = InData%InputTimes(i1) + Db_Xferred = Db_Xferred + 1 + END DO + END IF + END SUBROUTINE FAST_PackSubDyn_Data + + SUBROUTINE FAST_UnPackSubDyn_Data( 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(SubDyn_Data), 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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UnPackSubDyn_Data' + ! 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 + i1_l = LBOUND(OutData%x,1) + i1_u = UBOUND(OutData%x,1) + DO i1 = LBOUND(OutData%x,1), UBOUND(OutData%x,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 SD_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%x(i1), ErrStat2, ErrMsg2 ) ! x + 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) + END DO + i1_l = LBOUND(OutData%xd,1) + i1_u = UBOUND(OutData%xd,1) + DO i1 = LBOUND(OutData%xd,1), UBOUND(OutData%xd,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 SD_UnpackDiscState( Re_Buf, Db_Buf, Int_Buf, OutData%xd(i1), ErrStat2, ErrMsg2 ) ! xd + 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) + END DO + i1_l = LBOUND(OutData%z,1) + i1_u = UBOUND(OutData%z,1) + DO i1 = LBOUND(OutData%z,1), UBOUND(OutData%z,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 SD_UnpackConstrState( Re_Buf, Db_Buf, Int_Buf, OutData%z(i1), ErrStat2, ErrMsg2 ) ! z + 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) + END DO + i1_l = LBOUND(OutData%OtherSt,1) + i1_u = UBOUND(OutData%OtherSt,1) + DO i1 = LBOUND(OutData%OtherSt,1), UBOUND(OutData%OtherSt,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 SD_UnpackOtherState( Re_Buf, Db_Buf, Int_Buf, OutData%OtherSt(i1), ErrStat2, ErrMsg2 ) ! OtherSt + 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) + END DO + 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 SD_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%p, ErrStat2, ErrMsg2 ) ! p + 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) + 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 SD_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%u, ErrStat2, ErrMsg2 ) ! u + 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) + 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 SD_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y, ErrStat2, ErrMsg2 ) ! y + 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) + 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 SD_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%m, ErrStat2, ErrMsg2 ) ! m + 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) + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Input 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 + IF (ALLOCATED(OutData%Input)) DEALLOCATE(OutData%Input) + ALLOCATE(OutData%Input(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%Input,1), UBOUND(OutData%Input,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 SD_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%Input(i1), ErrStat2, ErrMsg2 ) ! Input + 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) + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Output 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 + IF (ALLOCATED(OutData%Output)) DEALLOCATE(OutData%Output) + ALLOCATE(OutData%Output(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%Output,1), UBOUND(OutData%Output,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 SD_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%Output(i1), ErrStat2, ErrMsg2 ) ! Output + 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) + END DO + END IF + 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 SD_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y_interp, ErrStat2, ErrMsg2 ) ! y_interp 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) - END SUBROUTINE FAST_UnPackSCDataEx_Data + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! InputTimes 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 + IF (ALLOCATED(OutData%InputTimes)) DEALLOCATE(OutData%InputTimes) + ALLOCATE(OutData%InputTimes(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%InputTimes.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%InputTimes,1), UBOUND(OutData%InputTimes,1) + OutData%InputTimes(i1) = DbKiBuf(Db_Xferred) + Db_Xferred = Db_Xferred + 1 + END DO + END IF + END SUBROUTINE FAST_UnPackSubDyn_Data - SUBROUTINE FAST_CopySubDyn_Data( SrcSubDyn_DataData, DstSubDyn_DataData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SubDyn_Data), INTENT(INOUT) :: SrcSubDyn_DataData - TYPE(SubDyn_Data), INTENT(INOUT) :: DstSubDyn_DataData + SUBROUTINE FAST_CopyExtPtfm_Data( SrcExtPtfm_DataData, DstExtPtfm_DataData, CtrlCode, ErrStat, ErrMsg ) + TYPE(ExtPtfm_Data), INTENT(INOUT) :: SrcExtPtfm_DataData + TYPE(ExtPtfm_Data), INTENT(INOUT) :: DstExtPtfm_DataData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -26595,139 +27943,113 @@ SUBROUTINE FAST_CopySubDyn_Data( SrcSubDyn_DataData, DstSubDyn_DataData, CtrlCod INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_CopySubDyn_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_CopyExtPtfm_Data' ! ErrStat = ErrID_None ErrMsg = "" - DO i1 = LBOUND(SrcSubDyn_DataData%x,1), UBOUND(SrcSubDyn_DataData%x,1) - CALL SD_CopyContState( SrcSubDyn_DataData%x(i1), DstSubDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcExtPtfm_DataData%x,1), UBOUND(SrcExtPtfm_DataData%x,1) + CALL ExtPtfm_CopyContState( SrcExtPtfm_DataData%x(i1), DstExtPtfm_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcSubDyn_DataData%xd,1), UBOUND(SrcSubDyn_DataData%xd,1) - CALL SD_CopyDiscState( SrcSubDyn_DataData%xd(i1), DstSubDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcExtPtfm_DataData%xd,1), UBOUND(SrcExtPtfm_DataData%xd,1) + CALL ExtPtfm_CopyDiscState( SrcExtPtfm_DataData%xd(i1), DstExtPtfm_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcSubDyn_DataData%z,1), UBOUND(SrcSubDyn_DataData%z,1) - CALL SD_CopyConstrState( SrcSubDyn_DataData%z(i1), DstSubDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcExtPtfm_DataData%z,1), UBOUND(SrcExtPtfm_DataData%z,1) + CALL ExtPtfm_CopyConstrState( SrcExtPtfm_DataData%z(i1), DstExtPtfm_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcSubDyn_DataData%OtherSt,1), UBOUND(SrcSubDyn_DataData%OtherSt,1) - CALL SD_CopyOtherState( SrcSubDyn_DataData%OtherSt(i1), DstSubDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcExtPtfm_DataData%OtherSt,1), UBOUND(SrcExtPtfm_DataData%OtherSt,1) + CALL ExtPtfm_CopyOtherState( SrcExtPtfm_DataData%OtherSt(i1), DstExtPtfm_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - CALL SD_CopyParam( SrcSubDyn_DataData%p, DstSubDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN - CALL SD_CopyInput( SrcSubDyn_DataData%u, DstSubDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2 ) + CALL ExtPtfm_CopyParam( SrcExtPtfm_DataData%p, DstExtPtfm_DataData%p, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL SD_CopyOutput( SrcSubDyn_DataData%y, DstSubDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2 ) + CALL ExtPtfm_CopyInput( SrcExtPtfm_DataData%u, DstExtPtfm_DataData%u, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL SD_CopyMisc( SrcSubDyn_DataData%m, DstSubDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2 ) + CALL ExtPtfm_CopyOutput( SrcExtPtfm_DataData%y, DstExtPtfm_DataData%y, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN -IF (ALLOCATED(SrcSubDyn_DataData%Input)) THEN - i1_l = LBOUND(SrcSubDyn_DataData%Input,1) - i1_u = UBOUND(SrcSubDyn_DataData%Input,1) - IF (.NOT. ALLOCATED(DstSubDyn_DataData%Input)) THEN - ALLOCATE(DstSubDyn_DataData%Input(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%Input.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DO i1 = LBOUND(SrcSubDyn_DataData%Input,1), UBOUND(SrcSubDyn_DataData%Input,1) - CALL SD_CopyInput( SrcSubDyn_DataData%Input(i1), DstSubDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL ExtPtfm_CopyMisc( SrcExtPtfm_DataData%m, DstExtPtfm_DataData%m, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - ENDDO -ENDIF -IF (ALLOCATED(SrcSubDyn_DataData%Output)) THEN - i1_l = LBOUND(SrcSubDyn_DataData%Output,1) - i1_u = UBOUND(SrcSubDyn_DataData%Output,1) - IF (.NOT. ALLOCATED(DstSubDyn_DataData%Output)) THEN - ALLOCATE(DstSubDyn_DataData%Output(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcExtPtfm_DataData%Input)) THEN + i1_l = LBOUND(SrcExtPtfm_DataData%Input,1) + i1_u = UBOUND(SrcExtPtfm_DataData%Input,1) + IF (.NOT. ALLOCATED(DstExtPtfm_DataData%Input)) THEN + ALLOCATE(DstExtPtfm_DataData%Input(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%Output.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%Input.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DO i1 = LBOUND(SrcSubDyn_DataData%Output,1), UBOUND(SrcSubDyn_DataData%Output,1) - CALL SD_CopyOutput( SrcSubDyn_DataData%Output(i1), DstSubDyn_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcExtPtfm_DataData%Input,1), UBOUND(SrcExtPtfm_DataData%Input,1) + CALL ExtPtfm_CopyInput( SrcExtPtfm_DataData%Input(i1), DstExtPtfm_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF - CALL SD_CopyOutput( SrcSubDyn_DataData%y_interp, DstSubDyn_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN -IF (ALLOCATED(SrcSubDyn_DataData%InputTimes)) THEN - i1_l = LBOUND(SrcSubDyn_DataData%InputTimes,1) - i1_u = UBOUND(SrcSubDyn_DataData%InputTimes,1) - IF (.NOT. ALLOCATED(DstSubDyn_DataData%InputTimes)) THEN - ALLOCATE(DstSubDyn_DataData%InputTimes(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcExtPtfm_DataData%InputTimes)) THEN + i1_l = LBOUND(SrcExtPtfm_DataData%InputTimes,1) + i1_u = UBOUND(SrcExtPtfm_DataData%InputTimes,1) + IF (.NOT. ALLOCATED(DstExtPtfm_DataData%InputTimes)) THEN + ALLOCATE(DstExtPtfm_DataData%InputTimes(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%InputTimes.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%InputTimes.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstSubDyn_DataData%InputTimes = SrcSubDyn_DataData%InputTimes + DstExtPtfm_DataData%InputTimes = SrcExtPtfm_DataData%InputTimes ENDIF - END SUBROUTINE FAST_CopySubDyn_Data + END SUBROUTINE FAST_CopyExtPtfm_Data - SUBROUTINE FAST_DestroySubDyn_Data( SubDyn_DataData, ErrStat, ErrMsg ) - TYPE(SubDyn_Data), INTENT(INOUT) :: SubDyn_DataData + SUBROUTINE FAST_DestroyExtPtfm_Data( ExtPtfm_DataData, ErrStat, ErrMsg ) + TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm_DataData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroySubDyn_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroyExtPtfm_Data' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" -DO i1 = LBOUND(SubDyn_DataData%x,1), UBOUND(SubDyn_DataData%x,1) - CALL SD_DestroyContState( SubDyn_DataData%x(i1), ErrStat, ErrMsg ) -ENDDO -DO i1 = LBOUND(SubDyn_DataData%xd,1), UBOUND(SubDyn_DataData%xd,1) - CALL SD_DestroyDiscState( SubDyn_DataData%xd(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(ExtPtfm_DataData%x,1), UBOUND(ExtPtfm_DataData%x,1) + CALL ExtPtfm_DestroyContState( ExtPtfm_DataData%x(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(SubDyn_DataData%z,1), UBOUND(SubDyn_DataData%z,1) - CALL SD_DestroyConstrState( SubDyn_DataData%z(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(ExtPtfm_DataData%xd,1), UBOUND(ExtPtfm_DataData%xd,1) + CALL ExtPtfm_DestroyDiscState( ExtPtfm_DataData%xd(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(SubDyn_DataData%OtherSt,1), UBOUND(SubDyn_DataData%OtherSt,1) - CALL SD_DestroyOtherState( SubDyn_DataData%OtherSt(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(ExtPtfm_DataData%z,1), UBOUND(ExtPtfm_DataData%z,1) + CALL ExtPtfm_DestroyConstrState( ExtPtfm_DataData%z(i1), ErrStat, ErrMsg ) ENDDO - CALL SD_DestroyParam( SubDyn_DataData%p, ErrStat, ErrMsg ) - CALL SD_DestroyInput( SubDyn_DataData%u, ErrStat, ErrMsg ) - CALL SD_DestroyOutput( SubDyn_DataData%y, ErrStat, ErrMsg ) - CALL SD_DestroyMisc( SubDyn_DataData%m, ErrStat, ErrMsg ) -IF (ALLOCATED(SubDyn_DataData%Input)) THEN -DO i1 = LBOUND(SubDyn_DataData%Input,1), UBOUND(SubDyn_DataData%Input,1) - CALL SD_DestroyInput( SubDyn_DataData%Input(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(ExtPtfm_DataData%OtherSt,1), UBOUND(ExtPtfm_DataData%OtherSt,1) + CALL ExtPtfm_DestroyOtherState( ExtPtfm_DataData%OtherSt(i1), ErrStat, ErrMsg ) ENDDO - DEALLOCATE(SubDyn_DataData%Input) -ENDIF -IF (ALLOCATED(SubDyn_DataData%Output)) THEN -DO i1 = LBOUND(SubDyn_DataData%Output,1), UBOUND(SubDyn_DataData%Output,1) - CALL SD_DestroyOutput( SubDyn_DataData%Output(i1), ErrStat, ErrMsg ) + CALL ExtPtfm_DestroyParam( ExtPtfm_DataData%p, ErrStat, ErrMsg ) + CALL ExtPtfm_DestroyInput( ExtPtfm_DataData%u, ErrStat, ErrMsg ) + CALL ExtPtfm_DestroyOutput( ExtPtfm_DataData%y, ErrStat, ErrMsg ) + CALL ExtPtfm_DestroyMisc( ExtPtfm_DataData%m, ErrStat, ErrMsg ) +IF (ALLOCATED(ExtPtfm_DataData%Input)) THEN +DO i1 = LBOUND(ExtPtfm_DataData%Input,1), UBOUND(ExtPtfm_DataData%Input,1) + CALL ExtPtfm_DestroyInput( ExtPtfm_DataData%Input(i1), ErrStat, ErrMsg ) ENDDO - DEALLOCATE(SubDyn_DataData%Output) + DEALLOCATE(ExtPtfm_DataData%Input) ENDIF - CALL SD_DestroyOutput( SubDyn_DataData%y_interp, ErrStat, ErrMsg ) -IF (ALLOCATED(SubDyn_DataData%InputTimes)) THEN - DEALLOCATE(SubDyn_DataData%InputTimes) +IF (ALLOCATED(ExtPtfm_DataData%InputTimes)) THEN + DEALLOCATE(ExtPtfm_DataData%InputTimes) ENDIF - END SUBROUTINE FAST_DestroySubDyn_Data + END SUBROUTINE FAST_DestroyExtPtfm_Data - SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE FAST_PackExtPtfm_Data( 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(SubDyn_Data), INTENT(IN) :: InData + TYPE(ExtPtfm_Data), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -26742,7 +28064,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_PackSubDyn_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_PackExtPtfm_Data' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -26761,7 +28083,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er ! Allocate buffers for subtypes, if any (we'll get sizes from these) DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) Int_BufSz = Int_BufSz + 3 ! x: size of buffers for each call to pack subtype - CALL SD_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, .TRUE. ) ! x + CALL ExtPtfm_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, .TRUE. ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -26780,7 +28102,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) Int_BufSz = Int_BufSz + 3 ! xd: size of buffers for each call to pack subtype - CALL SD_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, .TRUE. ) ! xd + CALL ExtPtfm_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, .TRUE. ) ! xd CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -26799,7 +28121,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) Int_BufSz = Int_BufSz + 3 ! z: size of buffers for each call to pack subtype - CALL SD_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, .TRUE. ) ! z + CALL ExtPtfm_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, .TRUE. ) ! z CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -26818,7 +28140,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) Int_BufSz = Int_BufSz + 3 ! OtherSt: size of buffers for each call to pack subtype - CALL SD_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OtherSt + CALL ExtPtfm_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OtherSt CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -26836,7 +28158,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END IF END DO Int_BufSz = Int_BufSz + 3 ! p: size of buffers for each call to pack subtype - CALL SD_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, .TRUE. ) ! p + CALL ExtPtfm_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, .TRUE. ) ! p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -26853,7 +28175,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! u: size of buffers for each call to pack subtype - CALL SD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, .TRUE. ) ! u + CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, .TRUE. ) ! u CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -26870,7 +28192,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! y: size of buffers for each call to pack subtype - CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, .TRUE. ) ! y + CALL ExtPtfm_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, .TRUE. ) ! y CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -26887,7 +28209,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! m: size of buffers for each call to pack subtype - CALL SD_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, .TRUE. ) ! m + CALL ExtPtfm_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, .TRUE. ) ! m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -26908,7 +28230,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_BufSz = Int_BufSz + 2*1 ! Input upper/lower bounds for each dimension DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) Int_BufSz = Int_BufSz + 3 ! Input: size of buffers for each call to pack subtype - CALL SD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Input + CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Input CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -26926,46 +28248,6 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END IF END DO END IF - Int_BufSz = Int_BufSz + 1 ! Output allocated yes/no - IF ( ALLOCATED(InData%Output) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! Output upper/lower bounds for each dimension - DO i1 = LBOUND(InData%Output,1), UBOUND(InData%Output,1) - Int_BufSz = Int_BufSz + 3 ! Output: size of buffers for each call to pack subtype - CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Output(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Output - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! Output - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! Output - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! Output - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF - END DO - END IF - Int_BufSz = Int_BufSz + 3 ! y_interp: size of buffers for each call to pack subtype - CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y_interp, ErrStat2, ErrMsg2, .TRUE. ) ! y_interp - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! y_interp - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! y_interp - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! y_interp - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF Int_BufSz = Int_BufSz + 1 ! InputTimes allocated yes/no IF ( ALLOCATED(InData%InputTimes) ) THEN Int_BufSz = Int_BufSz + 2*1 ! InputTimes upper/lower bounds for each dimension @@ -26999,7 +28281,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_Xferred = 1 DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) - CALL SD_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, OnlySize ) ! x + CALL ExtPtfm_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, OnlySize ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27029,7 +28311,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er ENDIF END DO DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) - CALL SD_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, OnlySize ) ! xd + CALL ExtPtfm_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, OnlySize ) ! xd CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27059,7 +28341,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er ENDIF END DO DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) - CALL SD_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, OnlySize ) ! z + CALL ExtPtfm_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, OnlySize ) ! z CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27089,7 +28371,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er ENDIF END DO DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) - CALL SD_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, OnlySize ) ! OtherSt + CALL ExtPtfm_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, OnlySize ) ! OtherSt CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27118,7 +28400,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF END DO - CALL SD_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, OnlySize ) ! p + CALL ExtPtfm_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, OnlySize ) ! p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27146,7 +28428,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL SD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, OnlySize ) ! u + CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, OnlySize ) ! u CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27174,7 +28456,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, OnlySize ) ! y + CALL ExtPtfm_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, OnlySize ) ! y CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27202,7 +28484,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL SD_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, OnlySize ) ! m + CALL ExtPtfm_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, OnlySize ) ! m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27241,48 +28523,7 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_Xferred = Int_Xferred + 2 DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) - CALL SD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, OnlySize ) ! Input - 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 - END DO - END IF - IF ( .NOT. ALLOCATED(InData%Output) ) 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%Output,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Output,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%Output,1), UBOUND(InData%Output,1) - CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Output(i1), ErrStat2, ErrMsg2, OnlySize ) ! Output + CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, OnlySize ) ! Input CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27312,34 +28553,6 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er ENDIF END DO END IF - CALL SD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y_interp, ErrStat2, ErrMsg2, OnlySize ) ! y_interp - 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 IF ( .NOT. ALLOCATED(InData%InputTimes) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -27355,13 +28568,13 @@ SUBROUTINE FAST_PackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Db_Xferred = Db_Xferred + 1 END DO END IF - END SUBROUTINE FAST_PackSubDyn_Data + END SUBROUTINE FAST_PackExtPtfm_Data - SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE FAST_UnPackExtPtfm_Data( 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(SubDyn_Data), INTENT(INOUT) :: OutData + TYPE(ExtPtfm_Data), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -27373,7 +28586,7 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UnPackSubDyn_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UnPackExtPtfm_Data' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -27420,7 +28633,7 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SD_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%x(i1), ErrStat2, ErrMsg2 ) ! x + CALL ExtPtfm_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%x(i1), ErrStat2, ErrMsg2 ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27464,7 +28677,7 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SD_UnpackDiscState( Re_Buf, Db_Buf, Int_Buf, OutData%xd(i1), ErrStat2, ErrMsg2 ) ! xd + CALL ExtPtfm_UnpackDiscState( Re_Buf, Db_Buf, Int_Buf, OutData%xd(i1), ErrStat2, ErrMsg2 ) ! xd CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27508,98 +28721,17 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SD_UnpackConstrState( Re_Buf, Db_Buf, Int_Buf, OutData%z(i1), ErrStat2, ErrMsg2 ) ! z - 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) - END DO - i1_l = LBOUND(OutData%OtherSt,1) - i1_u = UBOUND(OutData%OtherSt,1) - DO i1 = LBOUND(OutData%OtherSt,1), UBOUND(OutData%OtherSt,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 SD_UnpackOtherState( Re_Buf, Db_Buf, Int_Buf, OutData%OtherSt(i1), ErrStat2, ErrMsg2 ) ! OtherSt - 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) - END DO - 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 SD_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%p, ErrStat2, ErrMsg2 ) ! p + CALL ExtPtfm_UnpackConstrState( Re_Buf, Db_Buf, Int_Buf, OutData%z(i1), ErrStat2, ErrMsg2 ) ! z 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) + END DO + i1_l = LBOUND(OutData%OtherSt,1) + i1_u = UBOUND(OutData%OtherSt,1) + DO i1 = LBOUND(OutData%OtherSt,1), UBOUND(OutData%OtherSt,1) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -27633,13 +28765,14 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SD_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%u, ErrStat2, ErrMsg2 ) ! u + CALL ExtPtfm_UnpackOtherState( Re_Buf, Db_Buf, Int_Buf, OutData%OtherSt(i1), ErrStat2, ErrMsg2 ) ! OtherSt 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) + END DO Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -27673,7 +28806,7 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SD_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y, ErrStat2, ErrMsg2 ) ! y + CALL ExtPtfm_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%p, ErrStat2, ErrMsg2 ) ! p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -27713,27 +28846,13 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SD_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%m, ErrStat2, ErrMsg2 ) ! m + CALL ExtPtfm_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%u, ErrStat2, ErrMsg2 ) ! u 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) - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Input 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 - IF (ALLOCATED(OutData%Input)) DEALLOCATE(OutData%Input) - ALLOCATE(OutData%Input(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%Input,1), UBOUND(OutData%Input,1) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -27767,29 +28886,13 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SD_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%Input(i1), ErrStat2, ErrMsg2 ) ! Input + CALL ExtPtfm_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y, ErrStat2, ErrMsg2 ) ! y 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) - END DO - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Output 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 - IF (ALLOCATED(OutData%Output)) DEALLOCATE(OutData%Output) - ALLOCATE(OutData%Output(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%Output,1), UBOUND(OutData%Output,1) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -27823,15 +28926,27 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SD_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%Output(i1), ErrStat2, ErrMsg2 ) ! Output + CALL ExtPtfm_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%m, ErrStat2, ErrMsg2 ) ! m 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) - END DO - END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Input 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 + IF (ALLOCATED(OutData%Input)) DEALLOCATE(OutData%Input) + ALLOCATE(OutData%Input(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%Input,1), UBOUND(OutData%Input,1) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -27865,13 +28980,15 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SD_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y_interp, ErrStat2, ErrMsg2 ) ! y_interp + CALL ExtPtfm_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%Input(i1), ErrStat2, ErrMsg2 ) ! Input 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) + END DO + END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! InputTimes not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -27890,11 +29007,11 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Db_Xferred = Db_Xferred + 1 END DO END IF - END SUBROUTINE FAST_UnPackSubDyn_Data + END SUBROUTINE FAST_UnPackExtPtfm_Data - SUBROUTINE FAST_CopyExtPtfm_Data( SrcExtPtfm_DataData, DstExtPtfm_DataData, CtrlCode, ErrStat, ErrMsg ) - TYPE(ExtPtfm_Data), INTENT(INOUT) :: SrcExtPtfm_DataData - TYPE(ExtPtfm_Data), INTENT(INOUT) :: DstExtPtfm_DataData + SUBROUTINE FAST_CopySeaState_Data( SrcSeaState_DataData, DstSeaState_DataData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SeaState_Data), INTENT(IN) :: SrcSeaState_DataData + TYPE(SeaState_Data), INTENT(INOUT) :: DstSeaState_DataData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -27903,113 +29020,139 @@ SUBROUTINE FAST_CopyExtPtfm_Data( SrcExtPtfm_DataData, DstExtPtfm_DataData, Ctrl INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_CopyExtPtfm_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_CopySeaState_Data' ! ErrStat = ErrID_None ErrMsg = "" - DO i1 = LBOUND(SrcExtPtfm_DataData%x,1), UBOUND(SrcExtPtfm_DataData%x,1) - CALL ExtPtfm_CopyContState( SrcExtPtfm_DataData%x(i1), DstExtPtfm_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcSeaState_DataData%x,1), UBOUND(SrcSeaState_DataData%x,1) + CALL SeaSt_CopyContState( SrcSeaState_DataData%x(i1), DstSeaState_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcExtPtfm_DataData%xd,1), UBOUND(SrcExtPtfm_DataData%xd,1) - CALL ExtPtfm_CopyDiscState( SrcExtPtfm_DataData%xd(i1), DstExtPtfm_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcSeaState_DataData%xd,1), UBOUND(SrcSeaState_DataData%xd,1) + CALL SeaSt_CopyDiscState( SrcSeaState_DataData%xd(i1), DstSeaState_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcExtPtfm_DataData%z,1), UBOUND(SrcExtPtfm_DataData%z,1) - CALL ExtPtfm_CopyConstrState( SrcExtPtfm_DataData%z(i1), DstExtPtfm_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcSeaState_DataData%z,1), UBOUND(SrcSeaState_DataData%z,1) + CALL SeaSt_CopyConstrState( SrcSeaState_DataData%z(i1), DstSeaState_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcExtPtfm_DataData%OtherSt,1), UBOUND(SrcExtPtfm_DataData%OtherSt,1) - CALL ExtPtfm_CopyOtherState( SrcExtPtfm_DataData%OtherSt(i1), DstExtPtfm_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcSeaState_DataData%OtherSt,1), UBOUND(SrcSeaState_DataData%OtherSt,1) + CALL SeaSt_CopyOtherState( SrcSeaState_DataData%OtherSt(i1), DstSeaState_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - CALL ExtPtfm_CopyParam( SrcExtPtfm_DataData%p, DstExtPtfm_DataData%p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SeaSt_CopyParam( SrcSeaState_DataData%p, DstSeaState_DataData%p, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL ExtPtfm_CopyInput( SrcExtPtfm_DataData%u, DstExtPtfm_DataData%u, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SeaSt_CopyInput( SrcSeaState_DataData%u, DstSeaState_DataData%u, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL ExtPtfm_CopyOutput( SrcExtPtfm_DataData%y, DstExtPtfm_DataData%y, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SeaSt_CopyOutput( SrcSeaState_DataData%y, DstSeaState_DataData%y, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL ExtPtfm_CopyMisc( SrcExtPtfm_DataData%m, DstExtPtfm_DataData%m, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SeaSt_CopyMisc( SrcSeaState_DataData%m, DstSeaState_DataData%m, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN -IF (ALLOCATED(SrcExtPtfm_DataData%Input)) THEN - i1_l = LBOUND(SrcExtPtfm_DataData%Input,1) - i1_u = UBOUND(SrcExtPtfm_DataData%Input,1) - IF (.NOT. ALLOCATED(DstExtPtfm_DataData%Input)) THEN - ALLOCATE(DstExtPtfm_DataData%Input(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcSeaState_DataData%Input)) THEN + i1_l = LBOUND(SrcSeaState_DataData%Input,1) + i1_u = UBOUND(SrcSeaState_DataData%Input,1) + IF (.NOT. ALLOCATED(DstSeaState_DataData%Input)) THEN + ALLOCATE(DstSeaState_DataData%Input(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%Input.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%Input.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DO i1 = LBOUND(SrcExtPtfm_DataData%Input,1), UBOUND(SrcExtPtfm_DataData%Input,1) - CALL ExtPtfm_CopyInput( SrcExtPtfm_DataData%Input(i1), DstExtPtfm_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcSeaState_DataData%Input,1), UBOUND(SrcSeaState_DataData%Input,1) + CALL SeaSt_CopyInput( SrcSeaState_DataData%Input(i1), DstSeaState_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF -IF (ALLOCATED(SrcExtPtfm_DataData%InputTimes)) THEN - i1_l = LBOUND(SrcExtPtfm_DataData%InputTimes,1) - i1_u = UBOUND(SrcExtPtfm_DataData%InputTimes,1) - IF (.NOT. ALLOCATED(DstExtPtfm_DataData%InputTimes)) THEN - ALLOCATE(DstExtPtfm_DataData%InputTimes(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcSeaState_DataData%Output)) THEN + i1_l = LBOUND(SrcSeaState_DataData%Output,1) + i1_u = UBOUND(SrcSeaState_DataData%Output,1) + IF (.NOT. ALLOCATED(DstSeaState_DataData%Output)) THEN + ALLOCATE(DstSeaState_DataData%Output(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%InputTimes.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%Output.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstExtPtfm_DataData%InputTimes = SrcExtPtfm_DataData%InputTimes + DO i1 = LBOUND(SrcSeaState_DataData%Output,1), UBOUND(SrcSeaState_DataData%Output,1) + CALL SeaSt_CopyOutput( SrcSeaState_DataData%Output(i1), DstSeaState_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO ENDIF - END SUBROUTINE FAST_CopyExtPtfm_Data + CALL SeaSt_CopyOutput( SrcSeaState_DataData%y_interp, DstSeaState_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN +IF (ALLOCATED(SrcSeaState_DataData%InputTimes)) THEN + i1_l = LBOUND(SrcSeaState_DataData%InputTimes,1) + i1_u = UBOUND(SrcSeaState_DataData%InputTimes,1) + IF (.NOT. ALLOCATED(DstSeaState_DataData%InputTimes)) THEN + ALLOCATE(DstSeaState_DataData%InputTimes(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%InputTimes.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstSeaState_DataData%InputTimes = SrcSeaState_DataData%InputTimes +ENDIF + END SUBROUTINE FAST_CopySeaState_Data - SUBROUTINE FAST_DestroyExtPtfm_Data( ExtPtfm_DataData, ErrStat, ErrMsg ) - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm_DataData + SUBROUTINE FAST_DestroySeaState_Data( SeaState_DataData, ErrStat, ErrMsg ) + TYPE(SeaState_Data), INTENT(INOUT) :: SeaState_DataData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroyExtPtfm_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroySeaState_Data' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" -DO i1 = LBOUND(ExtPtfm_DataData%x,1), UBOUND(ExtPtfm_DataData%x,1) - CALL ExtPtfm_DestroyContState( ExtPtfm_DataData%x(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(SeaState_DataData%x,1), UBOUND(SeaState_DataData%x,1) + CALL SeaSt_DestroyContState( SeaState_DataData%x(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(ExtPtfm_DataData%xd,1), UBOUND(ExtPtfm_DataData%xd,1) - CALL ExtPtfm_DestroyDiscState( ExtPtfm_DataData%xd(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(SeaState_DataData%xd,1), UBOUND(SeaState_DataData%xd,1) + CALL SeaSt_DestroyDiscState( SeaState_DataData%xd(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(ExtPtfm_DataData%z,1), UBOUND(ExtPtfm_DataData%z,1) - CALL ExtPtfm_DestroyConstrState( ExtPtfm_DataData%z(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(SeaState_DataData%z,1), UBOUND(SeaState_DataData%z,1) + CALL SeaSt_DestroyConstrState( SeaState_DataData%z(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(ExtPtfm_DataData%OtherSt,1), UBOUND(ExtPtfm_DataData%OtherSt,1) - CALL ExtPtfm_DestroyOtherState( ExtPtfm_DataData%OtherSt(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(SeaState_DataData%OtherSt,1), UBOUND(SeaState_DataData%OtherSt,1) + CALL SeaSt_DestroyOtherState( SeaState_DataData%OtherSt(i1), ErrStat, ErrMsg ) ENDDO - CALL ExtPtfm_DestroyParam( ExtPtfm_DataData%p, ErrStat, ErrMsg ) - CALL ExtPtfm_DestroyInput( ExtPtfm_DataData%u, ErrStat, ErrMsg ) - CALL ExtPtfm_DestroyOutput( ExtPtfm_DataData%y, ErrStat, ErrMsg ) - CALL ExtPtfm_DestroyMisc( ExtPtfm_DataData%m, ErrStat, ErrMsg ) -IF (ALLOCATED(ExtPtfm_DataData%Input)) THEN -DO i1 = LBOUND(ExtPtfm_DataData%Input,1), UBOUND(ExtPtfm_DataData%Input,1) - CALL ExtPtfm_DestroyInput( ExtPtfm_DataData%Input(i1), ErrStat, ErrMsg ) + CALL SeaSt_DestroyParam( SeaState_DataData%p, ErrStat, ErrMsg ) + CALL SeaSt_DestroyInput( SeaState_DataData%u, ErrStat, ErrMsg ) + CALL SeaSt_DestroyOutput( SeaState_DataData%y, ErrStat, ErrMsg ) + CALL SeaSt_DestroyMisc( SeaState_DataData%m, ErrStat, ErrMsg ) +IF (ALLOCATED(SeaState_DataData%Input)) THEN +DO i1 = LBOUND(SeaState_DataData%Input,1), UBOUND(SeaState_DataData%Input,1) + CALL SeaSt_DestroyInput( SeaState_DataData%Input(i1), ErrStat, ErrMsg ) ENDDO - DEALLOCATE(ExtPtfm_DataData%Input) + DEALLOCATE(SeaState_DataData%Input) ENDIF -IF (ALLOCATED(ExtPtfm_DataData%InputTimes)) THEN - DEALLOCATE(ExtPtfm_DataData%InputTimes) +IF (ALLOCATED(SeaState_DataData%Output)) THEN +DO i1 = LBOUND(SeaState_DataData%Output,1), UBOUND(SeaState_DataData%Output,1) + CALL SeaSt_DestroyOutput( SeaState_DataData%Output(i1), ErrStat, ErrMsg ) +ENDDO + DEALLOCATE(SeaState_DataData%Output) ENDIF - END SUBROUTINE FAST_DestroyExtPtfm_Data + CALL SeaSt_DestroyOutput( SeaState_DataData%y_interp, ErrStat, ErrMsg ) +IF (ALLOCATED(SeaState_DataData%InputTimes)) THEN + DEALLOCATE(SeaState_DataData%InputTimes) +ENDIF + END SUBROUTINE FAST_DestroySeaState_Data - SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE FAST_PackSeaState_Data( 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(ExtPtfm_Data), INTENT(IN) :: InData + TYPE(SeaState_Data), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -28024,7 +29167,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_PackExtPtfm_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_PackSeaState_Data' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -28043,7 +29186,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ! Allocate buffers for subtypes, if any (we'll get sizes from these) DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) Int_BufSz = Int_BufSz + 3 ! x: size of buffers for each call to pack subtype - CALL ExtPtfm_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, .TRUE. ) ! x + CALL SeaSt_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, .TRUE. ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28062,7 +29205,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E END DO DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) Int_BufSz = Int_BufSz + 3 ! xd: size of buffers for each call to pack subtype - CALL ExtPtfm_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, .TRUE. ) ! xd + CALL SeaSt_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, .TRUE. ) ! xd CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28081,7 +29224,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E END DO DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) Int_BufSz = Int_BufSz + 3 ! z: size of buffers for each call to pack subtype - CALL ExtPtfm_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, .TRUE. ) ! z + CALL SeaSt_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, .TRUE. ) ! z CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28100,7 +29243,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E END DO DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) Int_BufSz = Int_BufSz + 3 ! OtherSt: size of buffers for each call to pack subtype - CALL ExtPtfm_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OtherSt + CALL SeaSt_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OtherSt CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28118,7 +29261,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E END IF END DO Int_BufSz = Int_BufSz + 3 ! p: size of buffers for each call to pack subtype - CALL ExtPtfm_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, .TRUE. ) ! p + CALL SeaSt_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, .TRUE. ) ! p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28135,7 +29278,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! u: size of buffers for each call to pack subtype - CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, .TRUE. ) ! u + CALL SeaSt_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, .TRUE. ) ! u CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28152,7 +29295,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! y: size of buffers for each call to pack subtype - CALL ExtPtfm_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, .TRUE. ) ! y + CALL SeaSt_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, .TRUE. ) ! y CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28169,7 +29312,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! m: size of buffers for each call to pack subtype - CALL ExtPtfm_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, .TRUE. ) ! m + CALL SeaSt_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, .TRUE. ) ! m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28190,7 +29333,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_BufSz = Int_BufSz + 2*1 ! Input upper/lower bounds for each dimension DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) Int_BufSz = Int_BufSz + 3 ! Input: size of buffers for each call to pack subtype - CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Input + CALL SeaSt_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Input CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28208,6 +29351,46 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E END IF END DO END IF + Int_BufSz = Int_BufSz + 1 ! Output allocated yes/no + IF ( ALLOCATED(InData%Output) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! Output upper/lower bounds for each dimension + DO i1 = LBOUND(InData%Output,1), UBOUND(InData%Output,1) + Int_BufSz = Int_BufSz + 3 ! Output: size of buffers for each call to pack subtype + CALL SeaSt_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Output(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Output + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Output + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Output + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Output + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + END IF + Int_BufSz = Int_BufSz + 3 ! y_interp: size of buffers for each call to pack subtype + CALL SeaSt_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y_interp, ErrStat2, ErrMsg2, .TRUE. ) ! y_interp + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! y_interp + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! y_interp + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! y_interp + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF Int_BufSz = Int_BufSz + 1 ! InputTimes allocated yes/no IF ( ALLOCATED(InData%InputTimes) ) THEN Int_BufSz = Int_BufSz + 2*1 ! InputTimes upper/lower bounds for each dimension @@ -28241,7 +29424,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = 1 DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) - CALL ExtPtfm_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, OnlySize ) ! x + CALL SeaSt_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, OnlySize ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28271,7 +29454,180 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ENDIF END DO DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) - CALL ExtPtfm_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, OnlySize ) ! xd + CALL SeaSt_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, OnlySize ) ! xd + 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 + END DO + DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) + CALL SeaSt_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, OnlySize ) ! z + 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 + END DO + DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) + CALL SeaSt_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, OnlySize ) ! OtherSt + 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 + END DO + CALL SeaSt_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, OnlySize ) ! p + 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 + CALL SeaSt_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, OnlySize ) ! u + 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 + CALL SeaSt_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, OnlySize ) ! y + 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 + CALL SeaSt_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, OnlySize ) ! m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28299,39 +29655,18 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END DO - DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) - CALL ExtPtfm_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, OnlySize ) ! z - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN + IF ( .NOT. ALLOCATED(InData%Input) ) 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%Input,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Input,1) + Int_Xferred = Int_Xferred + 2 - 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 - END DO - DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) - CALL ExtPtfm_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, OnlySize ) ! OtherSt + DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) + CALL SeaSt_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, OnlySize ) ! Input CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28360,91 +29695,19 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF END DO - CALL ExtPtfm_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, OnlySize ) ! p - 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 - CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, OnlySize ) ! u - 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 - CALL ExtPtfm_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, OnlySize ) ! y - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN + END IF + IF ( .NOT. ALLOCATED(InData%Output) ) 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%Output,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Output,1) + Int_Xferred = Int_Xferred + 2 - 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 - CALL ExtPtfm_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, OnlySize ) ! m + DO i1 = LBOUND(InData%Output,1), UBOUND(InData%Output,1) + CALL SeaSt_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%Output(i1), ErrStat2, ErrMsg2, OnlySize ) ! Output CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28472,18 +29735,9 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - IF ( .NOT. ALLOCATED(InData%Input) ) 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%Input,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Input,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) - CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, OnlySize ) ! Input + END DO + END IF + CALL SeaSt_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y_interp, ErrStat2, ErrMsg2, OnlySize ) ! y_interp CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28511,8 +29765,6 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END DO - END IF IF ( .NOT. ALLOCATED(InData%InputTimes) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -28528,13 +29780,13 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Db_Xferred = Db_Xferred + 1 END DO END IF - END SUBROUTINE FAST_PackExtPtfm_Data + END SUBROUTINE FAST_PackSeaState_Data - SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE FAST_UnPackSeaState_Data( 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(ExtPtfm_Data), INTENT(INOUT) :: OutData + TYPE(SeaState_Data), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -28546,7 +29798,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UnPackExtPtfm_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UnPackSeaState_Data' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -28593,7 +29845,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%x(i1), ErrStat2, ErrMsg2 ) ! x + CALL SeaSt_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%x(i1), ErrStat2, ErrMsg2 ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28637,7 +29889,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackDiscState( Re_Buf, Db_Buf, Int_Buf, OutData%xd(i1), ErrStat2, ErrMsg2 ) ! xd + CALL SeaSt_UnpackDiscState( Re_Buf, Db_Buf, Int_Buf, OutData%xd(i1), ErrStat2, ErrMsg2 ) ! xd CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28681,7 +29933,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackConstrState( Re_Buf, Db_Buf, Int_Buf, OutData%z(i1), ErrStat2, ErrMsg2 ) ! z + CALL SeaSt_UnpackConstrState( Re_Buf, Db_Buf, Int_Buf, OutData%z(i1), ErrStat2, ErrMsg2 ) ! z CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28725,7 +29977,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackOtherState( Re_Buf, Db_Buf, Int_Buf, OutData%OtherSt(i1), ErrStat2, ErrMsg2 ) ! OtherSt + CALL SeaSt_UnpackOtherState( Re_Buf, Db_Buf, Int_Buf, OutData%OtherSt(i1), ErrStat2, ErrMsg2 ) ! OtherSt CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28766,7 +30018,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%p, ErrStat2, ErrMsg2 ) ! p + CALL SeaSt_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%p, ErrStat2, ErrMsg2 ) ! p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28806,7 +30058,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%u, ErrStat2, ErrMsg2 ) ! u + CALL SeaSt_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%u, ErrStat2, ErrMsg2 ) ! u CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -28846,13 +30098,123 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y, ErrStat2, ErrMsg2 ) ! y + CALL SeaSt_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y, ErrStat2, ErrMsg2 ) ! y + 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) + 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 SeaSt_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%m, ErrStat2, ErrMsg2 ) ! m + 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) + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Input 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 + IF (ALLOCATED(OutData%Input)) DEALLOCATE(OutData%Input) + ALLOCATE(OutData%Input(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%Input,1), UBOUND(OutData%Input,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 SeaSt_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%Input(i1), ErrStat2, ErrMsg2 ) ! Input 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) + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Output 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 + IF (ALLOCATED(OutData%Output)) DEALLOCATE(OutData%Output) + ALLOCATE(OutData%Output(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%Output,1), UBOUND(OutData%Output,1) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -28886,27 +30248,15 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%m, ErrStat2, ErrMsg2 ) ! m + CALL SeaSt_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%Output(i1), ErrStat2, ErrMsg2 ) ! Output 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) - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Input 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 - IF (ALLOCATED(OutData%Input)) DEALLOCATE(OutData%Input) - ALLOCATE(OutData%Input(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%Input,1), UBOUND(OutData%Input,1) + END DO + END IF Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -28940,15 +30290,13 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%Input(i1), ErrStat2, ErrMsg2 ) ! Input + CALL SeaSt_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y_interp, ErrStat2, ErrMsg2 ) ! y_interp 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) - END DO - END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! InputTimes not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -28967,7 +30315,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Db_Xferred = Db_Xferred + 1 END DO END IF - END SUBROUTINE FAST_UnPackExtPtfm_Data + END SUBROUTINE FAST_UnPackSeaState_Data SUBROUTINE FAST_CopyHydroDyn_Data( SrcHydroDyn_DataData, DstHydroDyn_DataData, CtrlCode, ErrStat, ErrMsg ) TYPE(HydroDyn_Data), INTENT(INOUT) :: SrcHydroDyn_DataData @@ -43625,6 +44973,12 @@ SUBROUTINE FAST_CopyInitData( SrcInitDataData, DstInitDataData, CtrlCode, ErrSta CALL OpFM_CopyInitOutput( SrcInitDataData%OutData_OpFM, DstInitDataData%OutData_OpFM, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN + CALL SeaSt_CopyInitInput( SrcInitDataData%InData_SeaSt, DstInitDataData%InData_SeaSt, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL SeaSt_CopyInitOutput( SrcInitDataData%OutData_SeaSt, DstInitDataData%OutData_SeaSt, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN CALL HydroDyn_CopyInitInput( SrcInitDataData%InData_HD, DstInitDataData%InData_HD, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -43709,6 +45063,8 @@ SUBROUTINE FAST_DestroyInitData( InitDataData, ErrStat, ErrMsg ) CALL InflowWind_DestroyInitOutput( InitDataData%OutData_IfW, ErrStat, ErrMsg ) CALL OpFM_DestroyInitInput( InitDataData%InData_OpFM, ErrStat, ErrMsg ) CALL OpFM_DestroyInitOutput( InitDataData%OutData_OpFM, ErrStat, ErrMsg ) + CALL SeaSt_DestroyInitInput( InitDataData%InData_SeaSt, ErrStat, ErrMsg ) + CALL SeaSt_DestroyInitOutput( InitDataData%OutData_SeaSt, ErrStat, ErrMsg ) CALL HydroDyn_DestroyInitInput( InitDataData%InData_HD, ErrStat, ErrMsg ) CALL HydroDyn_DestroyInitOutput( InitDataData%OutData_HD, ErrStat, ErrMsg ) CALL SD_DestroyInitInput( InitDataData%InData_SD, ErrStat, ErrMsg ) @@ -44009,6 +45365,40 @@ SUBROUTINE FAST_PackInitData( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF + Int_BufSz = Int_BufSz + 3 ! InData_SeaSt: size of buffers for each call to pack subtype + CALL SeaSt_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%InData_SeaSt, ErrStat2, ErrMsg2, .TRUE. ) ! InData_SeaSt + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! InData_SeaSt + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! InData_SeaSt + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! InData_SeaSt + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! OutData_SeaSt: size of buffers for each call to pack subtype + CALL SeaSt_PackInitOutput( Re_Buf, Db_Buf, Int_Buf, InData%OutData_SeaSt, ErrStat2, ErrMsg2, .TRUE. ) ! OutData_SeaSt + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! OutData_SeaSt + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! OutData_SeaSt + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! OutData_SeaSt + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF Int_BufSz = Int_BufSz + 3 ! InData_HD: size of buffers for each call to pack subtype CALL HydroDyn_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%InData_HD, ErrStat2, ErrMsg2, .TRUE. ) ! InData_HD CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -44723,6 +46113,62 @@ SUBROUTINE FAST_PackInitData( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs 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 + CALL SeaSt_PackInitInput( Re_Buf, Db_Buf, Int_Buf, InData%InData_SeaSt, ErrStat2, ErrMsg2, OnlySize ) ! InData_SeaSt + 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 + CALL SeaSt_PackInitOutput( Re_Buf, Db_Buf, Int_Buf, InData%OutData_SeaSt, ErrStat2, ErrMsg2, OnlySize ) ! OutData_SeaSt + 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 @@ -45853,6 +47299,86 @@ SUBROUTINE FAST_UnPackInitData( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er 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) + 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 SeaSt_UnpackInitInput( Re_Buf, Db_Buf, Int_Buf, OutData%InData_SeaSt, ErrStat2, ErrMsg2 ) ! InData_SeaSt + 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) + 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 SeaSt_UnpackInitOutput( Re_Buf, Db_Buf, Int_Buf, OutData%OutData_SeaSt, ErrStat2, ErrMsg2 ) ! OutData_SeaSt + 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) @@ -46974,6 +48500,9 @@ SUBROUTINE FAST_CopyTurbineType( SrcTurbineTypeData, DstTurbineTypeData, CtrlCod CALL FAST_Copyscdataex_data( SrcTurbineTypeData%SC_DX, DstTurbineTypeData%SC_DX, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN + CALL FAST_Copyseastate_data( SrcTurbineTypeData%SeaSt, DstTurbineTypeData%SeaSt, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN CALL FAST_Copyhydrodyn_data( SrcTurbineTypeData%HD, DstTurbineTypeData%HD, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -47024,6 +48553,7 @@ SUBROUTINE FAST_DestroyTurbineType( TurbineTypeData, ErrStat, ErrMsg ) CALL FAST_Destroyinflowwind_data( TurbineTypeData%IfW, ErrStat, ErrMsg ) CALL FAST_Destroyopenfoam_data( TurbineTypeData%OpFM, ErrStat, ErrMsg ) CALL FAST_Destroyscdataex_data( TurbineTypeData%SC_DX, ErrStat, ErrMsg ) + CALL FAST_Destroyseastate_data( TurbineTypeData%SeaSt, ErrStat, ErrMsg ) CALL FAST_Destroyhydrodyn_data( TurbineTypeData%HD, ErrStat, ErrMsg ) CALL FAST_Destroysubdyn_data( TurbineTypeData%SD, ErrStat, ErrMsg ) CALL FAST_Destroymap_data( TurbineTypeData%MAP, ErrStat, ErrMsg ) @@ -47276,6 +48806,23 @@ SUBROUTINE FAST_PackTurbineType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF + Int_BufSz = Int_BufSz + 3 ! SeaSt: size of buffers for each call to pack subtype + CALL FAST_Packseastate_data( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt, ErrStat2, ErrMsg2, .TRUE. ) ! SeaSt + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SeaSt + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SeaSt + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SeaSt + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF Int_BufSz = Int_BufSz + 3 ! HD: size of buffers for each call to pack subtype CALL FAST_Packhydrodyn_data( Re_Buf, Db_Buf, Int_Buf, InData%HD, ErrStat2, ErrMsg2, .TRUE. ) ! HD CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -47770,6 +49317,34 @@ SUBROUTINE FAST_PackTurbineType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er 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 + CALL FAST_Packseastate_data( Re_Buf, Db_Buf, Int_Buf, InData%SeaSt, ErrStat2, ErrMsg2, OnlySize ) ! SeaSt + 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 @@ -48553,6 +50128,46 @@ SUBROUTINE FAST_UnPackTurbineType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, 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) + 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 FAST_Unpackseastate_data( Re_Buf, Db_Buf, Int_Buf, OutData%SeaSt, ErrStat2, ErrMsg2 ) ! SeaSt + 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) From 737ee8f8ae72e558112ed92bb441dbc4d60ecf65 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Mon, 6 Dec 2021 08:11:40 -0700 Subject: [PATCH 06/35] Added ExctnCutOff to Input file / parsing This feature is currently unused. It will be fully implemented when ExctnDisp = 2 is implemented. --- modules/hydrodyn/src/HydroDyn_Input.f90 | 10 ++++++++++ modules/hydrodyn/src/WAMIT.txt | 4 +++- modules/hydrodyn/src/WAMIT_Types.f90 | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/modules/hydrodyn/src/HydroDyn_Input.f90 b/modules/hydrodyn/src/HydroDyn_Input.f90 index 7f6c36b489..346106a84c 100644 --- a/modules/hydrodyn/src/HydroDyn_Input.f90 +++ b/modules/hydrodyn/src/HydroDyn_Input.f90 @@ -260,6 +260,11 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDp call ParseVar( FileInfo_In, CurLine, 'ExctnDisp', InputFileData%WAMIT%ExctnDisp, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; + ! ExctnCutOff - Cutoff (corner) frequency of the low-pass time-filtered displaced position (Hz) [>0.0] [used only when PotMod=1, ExctnMod>0, and ExctnDisp=2]) + ! [STATE-SPACE REQUIRES *.ssexctn INPUT FILE] + call ParseVar( FileInfo_In, CurLine, 'ExctnCutOff', InputFileData%WAMIT%ExctnCutOff, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + ! RdtnMod - Radiation memory-effect model {1: convolution, 2: state-space} (switch) ! [STATE-SPACE REQUIRES *.ss INPUT FILE] call ParseVar( FileInfo_In, CurLine, 'RdtnMod', InputFileData%WAMIT%RdtnMod, ErrStat2, ErrMsg2, UnEc ) @@ -1308,6 +1313,11 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS InputFileData%WAMIT%ExctnDisp = 0 !Force ExctnDisp = 0, so that the Grid of Wave Excitation forces is not computed (saves time and memory) end if + ! ExctnCutOff + if ( InputFileData%PotMod == 1 .and. InputFileData%WAMIT%ExctnMod > 0 .and. InputFileData%WAMIT%ExctnDisp == 2 .and. InputFileData%WAMIT%ExctnCutOff <= 0.0 ) then + CALL SetErrStat( ErrID_Fatal,'ExctnCutOff must be greater than zero.',ErrStat,ErrMsg,RoutineName) + end if + ! PtfmVol0 - Displaced volume of water when the platform is in its undisplaced position IF ( InputFileData%PotMod == 1 ) THEN diff --git a/modules/hydrodyn/src/WAMIT.txt b/modules/hydrodyn/src/WAMIT.txt index a5ef593082..a1badff14d 100644 --- a/modules/hydrodyn/src/WAMIT.txt +++ b/modules/hydrodyn/src/WAMIT.txt @@ -34,7 +34,8 @@ typedef ^ ^ ReKi typedef ^ ^ ReKi PtfmCOByt {:} - - "" - typedef ^ ^ INTEGER RdtnMod - - - "" - typedef ^ ^ INTEGER ExctnMod - - - "" - -typedef ^ ^ INTEGER ExctnDisp - - - "0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0]" - +typedef ^ ^ INTEGER ExctnDisp - - - "0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0]" - +typedef ^ ^ INTEGER ExctnCutOff - - - "Cutoff (corner) frequency of the low-pass time-filtered displaced position (Hz) [>0.0] " Hz typedef ^ ^ DbKi RdtnTMax - - - "" - typedef ^ ^ ReKi WaveDir - - - "" - typedef ^ ^ CHARACTER(1024) WAMITFile - - - "" - @@ -124,6 +125,7 @@ typedef ^ ^ SiKi typedef ^ ^ INTEGER RdtnMod - - - "" - typedef ^ ^ INTEGER ExctnMod - - - "" - typedef ^ ^ INTEGER ExctnDisp - - - "0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0]" - +typedef ^ ^ INTEGER ExctnCutOff - - - "Cutoff (corner) frequency of the low-pass time-filtered displaced position (Hz) [>0.0] " Hz typedef ^ ^ SiKi WaveExctn {:}{:} - - "" - typedef ^ ^ SiKi WaveExctnGrid {:}{:}{:}{:} - - "WaveExctnGrid dimensions are: 1st: wavetime, 2nd: X, 3rd: Y, 4th: Force component for eac WAMIT Body" - typedef ^ ^ INTEGER NStepWave - - - "" - diff --git a/modules/hydrodyn/src/WAMIT_Types.f90 b/modules/hydrodyn/src/WAMIT_Types.f90 index 650e58bbb0..88e3026b51 100644 --- a/modules/hydrodyn/src/WAMIT_Types.f90 +++ b/modules/hydrodyn/src/WAMIT_Types.f90 @@ -56,6 +56,7 @@ MODULE WAMIT_Types INTEGER(IntKi) :: RdtnMod !< [-] INTEGER(IntKi) :: ExctnMod !< [-] INTEGER(IntKi) :: ExctnDisp !< 0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0] [-] + INTEGER(IntKi) :: ExctnCutOff !< Cutoff (corner) frequency of the low-pass time-filtered displaced position (Hz) [>0.0] [Hz] REAL(DbKi) :: RdtnTMax !< [-] REAL(ReKi) :: WaveDir !< [-] CHARACTER(1024) :: WAMITFile !< [-] @@ -141,6 +142,7 @@ MODULE WAMIT_Types INTEGER(IntKi) :: RdtnMod !< [-] INTEGER(IntKi) :: ExctnMod !< [-] INTEGER(IntKi) :: ExctnDisp !< 0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0] [-] + INTEGER(IntKi) :: ExctnCutOff !< Cutoff (corner) frequency of the low-pass time-filtered displaced position (Hz) [>0.0] [Hz] REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveExctn !< [-] REAL(SiKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: WaveExctnGrid !< WaveExctnGrid dimensions are: 1st: wavetime, 2nd: X, 3rd: Y, 4th: Force component for eac WAMIT Body [-] INTEGER(IntKi) :: NStepWave !< [-] @@ -280,6 +282,7 @@ SUBROUTINE WAMIT_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er DstInitInputData%RdtnMod = SrcInitInputData%RdtnMod DstInitInputData%ExctnMod = SrcInitInputData%ExctnMod DstInitInputData%ExctnDisp = SrcInitInputData%ExctnDisp + DstInitInputData%ExctnCutOff = SrcInitInputData%ExctnCutOff DstInitInputData%RdtnTMax = SrcInitInputData%RdtnTMax DstInitInputData%WaveDir = SrcInitInputData%WaveDir DstInitInputData%WAMITFile = SrcInitInputData%WAMITFile @@ -519,6 +522,7 @@ SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Int_BufSz = Int_BufSz + 1 ! RdtnMod Int_BufSz = Int_BufSz + 1 ! ExctnMod Int_BufSz = Int_BufSz + 1 ! ExctnDisp + Int_BufSz = Int_BufSz + 1 ! ExctnCutOff Db_BufSz = Db_BufSz + 1 ! RdtnTMax Re_BufSz = Re_BufSz + 1 ! WaveDir Int_BufSz = Int_BufSz + 1*LEN(InData%WAMITFile) ! WAMITFile @@ -748,6 +752,8 @@ SUBROUTINE WAMIT_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%ExctnDisp Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%ExctnCutOff + Int_Xferred = Int_Xferred + 1 DbKiBuf(Db_Xferred) = InData%RdtnTMax Db_Xferred = Db_Xferred + 1 ReKiBuf(Re_Xferred) = InData%WaveDir @@ -1129,6 +1135,8 @@ SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Xferred = Int_Xferred + 1 OutData%ExctnDisp = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 + OutData%ExctnCutOff = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 OutData%RdtnTMax = DbKiBuf(Db_Xferred) Db_Xferred = Db_Xferred + 1 OutData%WaveDir = ReKiBuf(Re_Xferred) @@ -4259,6 +4267,7 @@ SUBROUTINE WAMIT_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMs DstParamData%RdtnMod = SrcParamData%RdtnMod DstParamData%ExctnMod = SrcParamData%ExctnMod DstParamData%ExctnDisp = SrcParamData%ExctnDisp + DstParamData%ExctnCutOff = SrcParamData%ExctnCutOff IF (ALLOCATED(SrcParamData%WaveExctn)) THEN i1_l = LBOUND(SrcParamData%WaveExctn,1) i1_u = UBOUND(SrcParamData%WaveExctn,1) @@ -4420,6 +4429,7 @@ SUBROUTINE WAMIT_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_BufSz = Int_BufSz + 1 ! RdtnMod Int_BufSz = Int_BufSz + 1 ! ExctnMod Int_BufSz = Int_BufSz + 1 ! ExctnDisp + Int_BufSz = Int_BufSz + 1 ! ExctnCutOff Int_BufSz = Int_BufSz + 1 ! WaveExctn allocated yes/no IF ( ALLOCATED(InData%WaveExctn) ) THEN Int_BufSz = Int_BufSz + 2*2 ! WaveExctn upper/lower bounds for each dimension @@ -4627,6 +4637,8 @@ SUBROUTINE WAMIT_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%ExctnDisp Int_Xferred = Int_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%ExctnCutOff + Int_Xferred = Int_Xferred + 1 IF ( .NOT. ALLOCATED(InData%WaveExctn) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -4963,6 +4975,8 @@ SUBROUTINE WAMIT_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM Int_Xferred = Int_Xferred + 1 OutData%ExctnDisp = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 + OutData%ExctnCutOff = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveExctn not allocated Int_Xferred = Int_Xferred + 1 ELSE From d762b705353bdf282fa116265a5071db04b83ccd Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Mon, 6 Dec 2021 09:15:41 -0700 Subject: [PATCH 07/35] Update SeaState Interp Comments Comments make clear that the time signal is wrapped back into the valid time range [0,WaveTmax] --- modules/seastate/src/seastate_Interp.f90 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/seastate/src/seastate_Interp.f90 b/modules/seastate/src/seastate_Interp.f90 index aa159349ed..b1e2169801 100644 --- a/modules/seastate/src/seastate_Interp.f90 +++ b/modules/seastate/src/seastate_Interp.f90 @@ -305,13 +305,16 @@ subroutine SetTimeIndex(Time, deltaT, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, Er CALL SetErrStat(ErrID_Fatal,'Time value must be greater than or equal to zero!',ErrStat,ErrMsg,'SetTimeLoIndex') !error out if time is outside the lower bounds RETURN end if - - !TODO: Add mod to wrap time + Tmp = Time / deltaT Indx_Lo = INT( Tmp ) ! convert REAL to INTEGER if (Indx_Lo >= (nMax-1)) then ! Wrap the time series back to the beginning of the signal - ! Indx_Lo = mod(Indx_Lo, nMax) + + ! NOTE: nMax is the total number of time values in the grid, since this is zero-based indexing, the max index is nMax-1 + ! for example: in a time grid with 11 grid points, the indices run from 0,1,2,3,4,5,6,7,8,9,10 + ! for the repeating waves feature, index 10 is the same as index 0, so if Indx_Lo = 10 then we want to + ! wrap it back to index 0, if Indx_Lo = 11 we want to wrap back to index 1. Indx_Lo = Indx_Lo - (nMax - 1) Tmp = Tmp - real(nMax - 1, ReKi) end if From 9ea1f1c9ea7862bd9c451f3adb0294c72692399e Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Mon, 6 Dec 2021 12:01:31 -0700 Subject: [PATCH 08/35] Update VS build for SeaState --- vs-build/FASTlib/FASTlib.vfproj | 185 +++++++++++++++++------- vs-build/HydroDyn/HydroDynDriver.vfproj | 97 +++++++++---- vs-build/RunRegistry.bat | 2 +- 3 files changed, 201 insertions(+), 83 deletions(-) diff --git a/vs-build/FASTlib/FASTlib.vfproj b/vs-build/FASTlib/FASTlib.vfproj index 880205f5bf..3b2f5ffb68 100644 --- a/vs-build/FASTlib/FASTlib.vfproj +++ b/vs-build/FASTlib/FASTlib.vfproj @@ -723,36 +723,36 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -989,65 +989,65 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -1056,7 +1056,7 @@ - + @@ -1065,8 +1065,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + @@ -1074,13 +1154,12 @@ - + - - - + + diff --git a/vs-build/HydroDyn/HydroDynDriver.vfproj b/vs-build/HydroDyn/HydroDynDriver.vfproj index 124b485616..ca15b836aa 100644 --- a/vs-build/HydroDyn/HydroDynDriver.vfproj +++ b/vs-build/HydroDyn/HydroDynDriver.vfproj @@ -88,20 +88,20 @@ - + - + - + - + - + - + - - + + @@ -142,6 +142,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -210,59 +246,62 @@ - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - + + + + + - + - - - + + diff --git a/vs-build/RunRegistry.bat b/vs-build/RunRegistry.bat index ed1cec1882..e644294706 100644 --- a/vs-build/RunRegistry.bat +++ b/vs-build/RunRegistry.bat @@ -197,7 +197,7 @@ GOTO checkError SET CURR_LOC=%HD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -I "%SEAST_Loc%" -O "%Output_Loc%" GOTO checkError :SeaState From 01dda522d60579bd1ad5d5794f5adb12730295bd Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Thu, 9 Dec 2021 13:35:06 -0700 Subject: [PATCH 09/35] Update for SeaState managed outputs --- docs/OtherSupporting/OutListParameters.xlsx | Bin 570113 -> 570284 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/OtherSupporting/OutListParameters.xlsx b/docs/OtherSupporting/OutListParameters.xlsx index bbfcb4cadd028efc9484bf2510cd9dfe9e74a77f..8c04da7403c48abb270215976f7b44adb06866a1 100644 GIT binary patch delta 47440 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

    `zYw8OWT&u!++zIu|0$;- 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

    5}ekR+&Xz>zY|BT%Qx|kXq)25 z#sHgI*XP97q-z~#KRH3}TiYf&zcp~$RcE(lMD0$i=Wla%kb!scPVQSyqO8{H7&3OE z!?@8hDI;T?vME@>X47?rDN5J2lO>Z0l~NMU?RSo=b(wtnx{Arw^&`lA#w$gxS}pOW zE3xH>zKXiVjfS;zqPSZ7fVi@Hem2J^?EO3&XeKAcY*kqr58C0>`-<%-a8O=Xh=rk+ zZYL|6ke4z9jpzj@-B{m_oHz*moq|hGnS4Pkp@h+zW-&Y^_zrMy_o|0w-YIh8>WMe) z;$u|qcjfV{l#!`*>7dqBU!{GptrJWmmjVhn2<1;@r(ZdB(O8+Aemap#M_@W|bDvxq z7M+S&S3Fd+oQ(5WP5yTDCTD@!59WQUz-0JH+3NYH&o3Y1gd?B6s3XvEfQdSIn{h!_ zGis+ZXjk=B{F&&0H}Ws-Fw0VUa5DBeLl6R6uuMY5liBHiC}KwH-1wnLe@{IkoPXA9 zSG8z6Q7a{x5xmIO0TM~jgHmMu)>P{v;Ax!U$olXkc>Qp)tl!=oV=VGvDtTzOh)u+9 zrlxjfCx#I3&RW=3XR;#wNTS-c8S6zwtKmdv{S|DC3uo=FiI!u=>fESSOt$VE*<15< z1l;U}65gh_gq*R(^KD({6e~BcWt?YMs zkS;DwW3+lH3D9`G>C2UxaE>?t&}ebA8cx@_J=m!_5-)+JDHyNKP5;PoL>b1g6cD_kB`ghm&0W@BmxdWstPI zgw5G*Msyc5S0veb#*a9y#Iqch>2tuqnyN=8><+KecJ`$P%O77DNfa}L^&hGY^iQW< z1>QP-aZ-KM1;qoJK8S6E0^6|W#kIspMV6)mBiiQ-RF}WK!#S>T_r}-()k+flhA`uU zt&Av6L5kfNaeG8?DzMIs63h=eH-J@7rMTODv=LHp+j3T*NDyD@fc6(Fq5bvEP0_=H zRnbGdKR@1Lc68h+U(?y z)*w?Zi;KUK!cbGs>DI37Z{4#|bADphl8)!o9hy{NuW4ki)yyW~`D+=X*65a#Hycs6 z%IbZraB(xp+?vYwbeLLR5(m`|gRf2|&M48hjo`upzej^gLIi((ukwj_;xFZLwmXG@w?BdxGOhF3BbUYPXZ+M9cJ@c7PzQ)obk=9MTlEQO-Rh7MQ#xYL{!LpeN>HLczdy({Mt}$Nj#fvhPpf-JHCu8YgvPqscJw$D3PNkl~e#TGR4` z*=eg^saqcw=!7(z8I^lWB%ji8b_&e55 z;tzKOm@pI-UoB|*kj5w8e8-@$VkBApR2Zw_668@ zwi-%G{Lo+JxU!BW~eTBi@7$bgnRHbUBk{ZiJMS+-jm;(cwC_lNN7|L;V8#7t1-p zTQ1THJ3l(+=exIMZ ziE!7aTyFaivs#eI=46elvl`O7k;nS1S?q~>*stiYu@9#oH7kntb^Oki__BJ3g?qCs zrx!)0hJO}it$~kEB=O}W^L_i_=&dU*s30|b7GhWX^Vd`vbFnv@BLA63DDfqEES$b5 z@of_-Mg^aZkg&z>`&^Ys;k^yi7iD}p6rTz{A%QhNj|tww*zO!^L=}uNY2f3as?_mM z5PlpsS8gKh?;ZIs$?4aCWCto2bx#AI;r`Z~(MPu4k?p6^zAh~>zTohqSM=i9dhg-t z1aw#jg&F&uek7t$Bc&5eZxXwHjfCd0tbO?ZdeU<5$2nW+*l~rLW;E*!3Z_1DRZ+eX zA}CA^d{)BHs22QQPazV)zY-9NqR7E^IAi(m;p}gmGsauE(*J)y93Wpu+W)xdKZom` zejNx7XN^7_idP*Um(VY#<2197b>fH#>ZuAo%Om+5?A3*y2abYzj;iw^nTpZGLv(`J z>9voGWaM*di1Qc{M_9P)NiVlKNBa8bu?jVb%|1QD^CNhU?|(fB=o_#g*7$$^oNNRS z6EBO~4<9Lj1qw69o6wK6qN(gs7p5%K$(S|E)$g7)Y3CB0o#`^s)wdYTaA+k zc%ZNa56Sr=EXq&8gEDxKDIsc+my}#^{UwYF(!^&aunuRI6LfGiXFz#s*5m- z@?3jNo)96_D-eKE(#B^*wdn$@r#XxL;zu)m>4)2>AYFV0QcEJ3*v8cD>4_G}W|W~W zAcjLX^~v@bUf2ZcsTMvn34ZW`*TB4TNpXkdsthVy2duKVbwbwROZV#efqvx}ClsF! zK0OuFbO96Pw21-!)|aAa27o7PEUqvUWtr=UM5>ZZ` zs_(zx9H-JAQmnovnGnYTR=$*@ky4yMmPUI#QH~?C;NGD%@F%35LM*Lcf zTq=A;+QK9IhblZhWT-oCa!E(6N(_~)55gpTDwwUaXTo)*@Fu6&h^@IV+yh79pDCag z@$QNH_xzM74nq+6G7a!?$YFjiN3nwGa{c-FQ=BMGLwp6)p&>pFw6eV!VUk-ubhGH- z;6Qn^&pH25nAOb8yp5asyg|>%@}_rUKcvImgG!A^9p6Ej^_W}n)Qry8tS)2=Ks^0=oubfwNufPWBA?;dZUx7k`X8rh*$acM zYq*m9caTZ6`eizu$AxVAFBnCV-6S4*MVlq0nZmk)F@c*Q z3Fh5AKP)xYZlG{}2}F&t7&jJ)^+l?V>?&clo)y2L1b6cm2c- zr6$IM#-LYYK^wVc!jw-H86M9zG@er)9SgEg1_Rr77#>T2f%Z}`BN_~N$}v2Ss0TAb z!HiHaKp?|VKRLwBGuxF?ap=BWkW$!3-alVTHeTdj;kcVPAC@d|*;htu!?*7FYi3G| za%LOm2QN-2TfNY$qh-l%r(>bv_l4?WT+stiJ$k~PCwjq(Ll50=8hz#(u8i5wE&BrQ zL$37hN;=#48sX!&^Qw78Ph4y|!=y9PgW+}RGkJi+EW`EG`P~ z3x(a>bT4<>mhGZe9SgV|sxZKNkn^jI*lnq?*@W)HtpDc>BvZZntG{{ZYAH<U#Td{&ph1ytaax z(3b`tAHS8*f4;MZMa;c5&-XBn#%L<;3wq{@K}ANnHTV0Ht(eFJ3K2YHrR3UKBbX$4 z`!f&DljRr^|4x8l+W&LLC+)%SMJZD?HM`rE3zWYsRzFH$d znaP$yA~(M40hNs2*ETMbby}R?)R(R_YKcgDrb!VuW5H7%fho4|6m2j?2TWmsr>KJ| zu2RH`+h?v0ghLM}`sI@J=3CNz8tfL}#}W83e;$79f*;rC;KzFSQ2;#Fr5li}2&jpF z7K_p)cqczx{7$KO3w~@Igdc~I(E<3e4jJu(AG5$?F^mcah^d55%-FrwWQiJE zmKb|lhEaAJ`!@C^$ySDZuXIl5obUVQ_nY4{*Ztnlb3e~>UH3hIyzk6|;fy+IZ}p|n zjq~vt0jsOaBZojG8(<&EX#=qDibA$2vcbQD1vY@dAL)DQ5AF9?CJTRGa1Z5k5i;dltKhUlQyk`Rl z@7915WG`NRCF?T-UbO+Bld>Px!7CP~YAZGgKMDrCm){m_Yzeg359#cwAi;%9dT~u# zl!mp9^YX~ME0dsCF2e8N411zlJLrTLiu+9#EvtRKX;q~3{Vx)p;b^tGQ zm7P7Eqqddi%}xpiKidKP9NUn`>|2mftqRCz2Z%GPG3JACJ3x5X1>S(PdN)?kaof7< zo)hQ}S#fPaN0uAB7l%qLUi2xFmo2!8=$0h+l+uN#Tbkx_SI)g^INhPhT?r!<426D_ z&nvWlf|ihLIlh%~$0M!bbn&}CCn!NjmM-)0Hbrx2OeE+Z*lFFvCMc{9NKXDhiz?1N zant5UztU#{*2F#!SqxcJ<#@kUz9=*BB7lVR_xJ9Fe)hH&U|(~jrR2NxU7z)(D>#tL z-(a)P!C;`)V$+k(6yrBCFj`t!T1A5%%SFA)^KP172wF>H!Hv8%S}FA_ z>(6oV$!Td_o5gK?o~U4@hZ`(eSdaRS7RWaUE+(C-GDcKY5UL!;xkpdcd?EU0Y)WD6B|LFGErU`5NVl!a^#b)2|JBMjpEy$T+_H5W zRzI-j~Q|1FFbV74Lv&8j!gm!{S z^zM9&%_+J{_GO3m15A6JZAMR`YMKqjI6EG`a2|gb9Hz%TU7UK`@;sZ0qw|bJJuXbv zl81Sg556%HtX(HFby3wdqIst6voipf|xog-o$kwMNPczle1Dl+eX zD-el}cwo^Q>9ve|a7o?8xY^h-TXog+(V&1x8GH3)0rQG(;~vg%sB^fzoc z((BoaheT`h9kgWPEj`EToBF;yvcx(~X{8}>ok+NK-eyjq@ z7gzmsC_x()%^YG}J!~R&o+EnsflK_=&};nJf-+QTK9l%NUgzS6CIWUaDu-EyD1mV7 z@)XOl^eVHu=qJYo;~LvZ<`Sl&7$2H%nsbEc^$xQ5tVZ9orB%6$sWz`qHDLA!W&d@; zGVP|n`+TJ8T0y2t`z-4w%)*f%p!{)$6-R~b#IS;5grf3K$d#Pbmg&v{UMV*#9qfz>HP4okZt?U8Mbnia<#X_-n`Tr+6o_e z7UC4x|6NDI;lZ-6dZO?=Ybm?O@W~urG>5hQttj)CTz@!Xj^h-|SL<8fh*sZBf_IK8 zLqku&;EP#!DsM%pR*?eiN=24d2{e($I4wB@k+(4zYFzFXnU|zUDK_+YX(7wsxB)Ay zeV?c5)i3*(o1nX5YlaqWs0-hs`nY&duZE1v{BDibzS%}ivRb8AU~k?FgJ}XrEvH|$Cn*EP6KRlV=p8m|Jg(a~C?H}k zQg-ZmPQS^s$TJ?5orVsr;g@qiNs71=`GyfTNY;;*mk_Kf#X+|tWIsF_PD#>65UB!L zOMa@%`ZpFn5}c!7r1cJ|Lb-`aLs?Nt@+st_iMYZWr}I`ZVr5R6EHU-Et}) zlTxmSSG7*b#8602uuulvrooh|P`d{n8EPS1eW2i4G(Y7+lN=gMyyadlY+!$wQ}XFw z!KLic6$!aQ@0~nRWmJ)@(aLH~`t>rZPtv3@o+IyQB{^kQLAovM{pfcVJZ|JxwTgmuR~tJ<(d|<3m<8tyS_D99)vyNPPjx>NI;Kp^NnLT8l$}4Lq%t)SR4;gDaWQ zqA&*GI%${`6*HuCP`Vs7(^W&4#yyGX3%6>?AJEGfacN&6bzgT*H;5%;ml~a`{>Za! zY5gp&-xHqn6eE~h1Xoh0r5l?e2~!*PNZn47^1S83a^%UY0UhV+u$WZ&wTK=O0UwC$y8c|F<@ z$%5_JNghb)3{2Ukav-@aKp+Qm>wQWNZFLg}f>Z!){WK2JU5+oBvL5g1`P1-IhsB#D zv>>GS3L&F>f@%qoNUKN-r(!}34X|iCgP*Hz%gsNk^50e86$D-X>@>3So++D_Y-(;; zSX8TN4X2gPK?9bs_GZJiyq2;J5cCq}{G-u#rs@Whartni`Ndt{VL9sl^dzW=y ztuwFS^+F7X3ZK{*tkOKQnO1qWbs!Y)?qom>ZBIGaZ3@|A#CN$i&8%Y@ud|fda!lTY z_EkudbX)#e4a~1(xcOaUt@s+PTb}JjVZ^`KA8m%%Z_D_}K3oa+lYOM_U+j;T1fc)o zK9%w93TYWeZF)^23!ZbNW9HN)A`SY&ISy;Uow5_}w{i2*a}Tx64IFDo=vtvYYPS2> zNT+pcHOwKjx|#bo_clPtjxy)cxJe2l53JHSVOn$yl#d6zb!n^qBHJ8n>wkKigLTYq z{Orf+)p`_ly96Z;z`+g@B)oYQt35s*sPq1UR4)I!dA<$Ac2YADQd}A#6cRs$9g9}T znXN~)l9XTl6rHC|W{pYGY0dn_*&&4s4uVPld-ZqHf34n(hWm&1T`R~(X}+JFkzxsF%jK&u>do`DM82h;-SQ=mZ&CUcan{_X@)ST+e)&B%B?0HlMdCsWAipV2x(OA zh96W34_|WX{}#n67S;32j*mF0G2&}kR&p&inz%@^=GJW@`vPcaUUuKg#;4N^Kt{>XDX zqW(!MQ3yN-6%%MA&+W3G+p{fm=!*qM4gcWKpJw2K%;%E$dXJ*oc*h=+xKrv@e%X3Q zic$n#vANrBGW2D|fO({A0;_Skh2}8StWG}Iuh@_wmzTrLzJwwxx{FE!fmd{vf(Dj zVaxFvnv`{Z%}d#y_gBg7?l11GED6VtW=g4DO06>do}Y<@>3?O}G7p@p^o};w*svx@ zlt`0yeeY03&U>D7GtyDcSI6~Jr0%;%u@&yp(RkZ##Ei+6KRkIHhZ{S+CBpk1ekWop zG6ZU3wj%4H<{WOUhZh91ORCo$vBg!ygCMv<91PapvnR$hS8>*Y`1{_~!e@&UWh*vS z-JV9e-Y6`OYwxDZWOSvP^1$r!abXX1Wxq4%{c1kSz;X?9ydqXu+C#h)njx; zfU}D^diA@Xw zDXv#XjMmnF*=W7*K(1uM1=gI4Vvs2kGF{p>?S@RIvlM-JQHJ85Gk`vB`Mg)VSX0;D z=TjkbPf>|EB3Ik?^r$2$7->CChZk9iwRDBd#i7zqF&)^1{*7JxHkL(l{cxpK^aRuy z>id4D@2;6(f9TJJ%Q{ACUfRuPkJ;<49qTzhM>+ze*lrJ6K zAj!AZ94#Z0;}weQ|7>e&6iV9KEe6}i;G8GP_&W0})4ja2M;UJ1(_wgtea6Dj7bL;> zdPabqq1BxJ!J%?|^-9iq)7A7u6pvR(jmz3x@IZ!J`{y=^t4RO#4KJ;!34^kgr7gt| zSb2r7pgd*6qWQfP?`Z6<(b$mDSgq06`q5bN(O3mDw~K6v_R4x)T_`g|5^+;xkDtw~ zi$SgL0k4tInS7Z-bUy3+%>U=TEPt^GJHlD2M@&*5#UKNhFa6(d@BF)^eTXYtaIkHX zWq;Ym9Uxkq-T%m!0DDFThUBvNG~fs$&P?a+$wNU4tXt>F#~sK?O0lbnIlytjz4@Ns%uh2gSbkt+;De6K z{Qast!n!l;0MtkD_c_1}|M9zO@yky%7xMeZfv^AZ<8b}u=d|tj`&q94jz_6t+lgD0 z3!G&B_WBq4zKz<*ztGt{;2{6+XLtk|_WzzZ^oa^$@&I+_1YclhD7Y`c2Dan@l1!X9 zke&yqFkcGp8ntiU^i%*4@ffWKm27H4unj(+a{x+U#6veK!MpL_!qiR03oxG zpGXu;Er2|4KKgZSE(G8J7ab3c4n@bYxjU<+mwD=l$F1p0vGS8_*M{LV4kAGz&wY6fpNEHb+dD{GP1L? zVsW>zF4KIl%YBXWa2I<^#y4Sri8M}GVjI?1-d{JbR-wS6(1-jXgNbd4t$5h<;nF)G zOm%0mVUe4e&tR#3^tPFIefpDLq9suW>cB}(q(I`=7$MWA!&#qh3{J=FUCJ@|lmPny zM~*3j*Ezt8yZia+#A8;}o>ud0a@OFRHzBoVsZ!091S|s93XWRZ9GUN7U)@{dSt;7T zEknlCw)~km&C4n8&`x*yT!w<$)>Tb9NRt;x8;#!kq{ymPNwsX#lCi6Glas_I$kRNFx+Y#$hDDQzoWukd^mj%-`P*s!4wsL8-$bQMNhA zuS9h2t!P;}nWovKe z+I$9&AF7(2zs{LQj0@lD$vIHaKE?isj!ZoKMe2LBf7$lv>Ws}S+Y~J za9Y<~9sa<4aA11R2K%X{;`UHMz8x?*Akp@q`-Ze!^qsD6=$Re4Qah4;^~-ezYB-lX zp)Jy|RtX7RV?Cvac9KuQ*jII{O#xru3*J?3KWXs;2z&wz-Iv1&Si1MbU`sw03q~K# zOrR~1Xhv@)aPc=BPYZZGyS5dIv|2W9hs+5pLzoqfV_w-@zCI1K`PBHn37!b(_*g<0 zO>FyRQzkV8_sGVO|9nA4B1?0H)6s^%A)mNC<~L^gG&eD7BZX6Q^hTWc+{9_l{lL26 zp#w76D-nGU>z6E=Hu$;~OFH@q16-^KtlyuVDejz1K;#jfy$)pMyi(O_a|U#=NBr^4 zInP}QKC~<+zHX@!Z8UkBP8=2wFm>i7*s2cD@mXn!5BO{wT-2AJ;gsmBT2kIhQW0h= z{nk)Fuw<(ho5wgC&^druyv8%3>k?9h*^yARdRouGKAbdGOC6&&)EL&6&2W;^%O~G& zi^3er>L9NsJN<%dO*+;z(2kIg9M|pz7qv($H8W}P80?34JV)|kgK8AYz`8gy)&iR% zsz>g$T7X8ma&@=Aj5!mcCZ?S)xcNTcYR-wsqy~=BFCFe;efyv5!HM3MgtP{_- zql~C#numw4Pas^-V54b*Q;KXv8va6&J~d8~)LnUEU`P4KILmOgBF8E< z_-?*(!U!fO`p>uuSdXnui7W-8GitH<2iL+D#7Ct zj66p7PP9)QD%+R3%X{e7olh|r5Xag%yxI<5w2<##u&A(Qo|QKF{&~9gJHKaB&@S<- zwk$T&n{O`tsG8gt8=OKzGjW4=T{%DX^)i}o#p+T5&H$VA?*&XWX13^LBMW@3Eh)=t zm({%RY_RXXRglE+M76EKOE1I5y$5gtPSHP|qQineaNrL-_=8Y?ijFvgjheMU#YHXx z1G72{n}qotiJ<;BB_bvqp!fSL6>p?>LN=M<`i)})k}xdK>~A5NXf!s!6p}nLbkKVD z)-i!O(}`Mcb|8yuk5oOTM)EC=l+WFL{W9=ydh;u*?f&dM3-~ko{Nc~9q}9Ra%MZ7+ zfLA?mXHpA1oDW`Yep%FX z!t^Zr3xWdanS#IR^G0@sqjCeB>7w)FR5FG5=N_qNVwrK#X4;XfB(#TWFhv$HjiLv| zr%7aPtNO>^>o)+uyz!-HTqEUN_ry!bv#dM^$5hOxVbn|Fzv3h}Ed0oxJz2QoJmoW% zwCidf)^LAPg*dslj{fGyn{KurN-jus_U)fV)z(7zp6ogPi#n*V1Is0 zHXXAjb5qMLhn~zYO(kG%(fJLoP46gd#*bkOBt2)Tb~wwGEtvId20JBOK6KV%4xlCv zMXlcjrX5b;atp?zwEa(O_P|)=%Q1vmSQyl6bOv%I+!qV@YW!3ds!tR9pc9>bZ^54K z%GN$S{chMwK1k5;UdNC^{|Q3-P?LvPCKH=GYu|~_T8-~b8#=OYiQB2KkhWo^e)MKU zglu>r9?XcO21;`M0*CzX&!64JfrM&IX7mxmgY* z7%;}m#NK4Zcv3%ZMCmZ^Pj zqeVTtBsjZtk%X~)^1LrD!SZU>*bmM?#o{wEIpl47vq^I+`}9#o2^?bU8Zd=YA-BC0 zHt-!5)Qxh_t)AVcnW~K}w#ioLE2LiH11R7YA12V^!71}=`BGwTd40U^@F6I?x#QN( zZgu$ONdjx{m-2W>1r#5IyOxf%Hp&$^)x#}V4~SUjvan$oQA>!^f}RU9O2jumqQgqA z2|uOQf)@|fJPdc^CBXh9*94&$%uUGwnsyXh*957^-C#f7nC)|f#H}|lQ`hLxMWwQv zN{V@DW%fnlFjGd41M5nPIYjC^?wBy=K~IeDzVDWt^kVQcd+Nj9T|Mo6`XN*E(hZeD zp_oO8TxnW$b5&nyXIEo z|7t^Ln}7ScGDB%0&Y=UFEs7!74||G zvxJ_A zuFQM`cuMBm-t0jxYu(2`=UP*uEwf!x&w?$2wNnGD5NvtHOg@v2BM% zIKE64{W?)p?&RnS!({EKwNdEF-LWe2pTgdJM7g*PsQw zDRTw=LrBhVgnOtf5VE<`S}B0@47YJ`+$k;v&0I!E=Ox@qstXLQNUUnP{fL4FPd3T% z&M_9uY#BWA8n|Uc{{T`A73rN3+)C`Z@04B}=mn*g9Z*70wvU*^1Q(0F@_KO?9^qWU z^kTu-6kZ^~+mXffIWZPYQrQ#ay|jIBixH%nyv!LUIP>8`7~tX;6+f3l-4N{2qkxLE z^8lf}vI$gIkTQ(5Y-~DeXv!Ngf(?^*icTJqq`@QS6_+6F$tak0#Fhf{E$JM_^;hTe zTxb8=Wn+`klFv2R$ZyY=P)6x=sxWQ>xsTXvIfKi_f#$r#5jM!?9a+L?uFWMRDa>Ec8b07(L8?~_IGbc8dkWeg`PZ4NJkst znLGL_jK8~uadj6j!Q3>_TnakcQ(w6m_#a=M19n;vFc{}N&ZOr3l)i~f2p$fiFIvaM zyyFt|S`sp3^{{*s_rn*h-NoTS7rCATrmj6hcVOIx3+)WsL?Z0STlHKa_w~Ny*VmpCI(}4z$7%W% zp}nQ-N##4Td&S_FO5j0Td=oP4Ipts$hCpTdDRV;5WPsDa;j{;*E<)2FA!Ar|+1QNL z&c>`Eww&vWe{5F#z@Mt`Zl4$z#RYu-;A+D9_QVKFhhVVJcqk-+>zC48nHm$2AA@D>gSgrLOO3)&^tRmAhD=SARYR(GfP^KwiO zzUqio{yF4QSISzQGPa>wsPdId0x+H9xV%n|(Jzh;sWG4QFDiYDS~7P0g#ANzfQ}M@ z2FD|CP3*VLw$Kv=)7iJi%}BZVl+s59H)kYa@D?7Y#9S#$s|a;T9N{m->$UF$e=J5- ztkkBP<@Dd9)3LS38+0K@9KuLck@Gfr;H8!w*~2l)$x26L-_G8XgdtjlodQf;b8FxZ zi5#Di#Y?0~zuyCYJO_m=Ir=)EGI5v?vHRmY-Jo~-)%0I4XZO=Tr>h*me>TYhj(S`Y zEsq@$QFFg}`PKeeD^kBjt6^~>W=-OqpgSjq!FY#6n%)JXTm<4*b2y?+)N+#t^ltwJ z6tis=dQHgk%kmrCb~aTMAXZ)PG&ssJ8YV}}ym~0dSr!%5Foof{#Zj%Y;;D4_9EH0T z_VO4<)K8{r)-a>9aU)s;X46l~#C_flK7_RdrUs(jd@J403O(1mb(e^quM#o0iKpq2 zwzJqZCt`lLB8c>K$m0x*s;L|^P14iDJMH2r-G>W7tWGNHh^_u@1QcPzFf-MF`)qF3 zq!+KCP`ER<{a|{&iVKcvZ+(Ba6*Li#BynVvDSp;4~k9j9By@02Gxu~t-*J@Qv4xI zh{1OX9Ml00e5j*ZPd-<*htIv+Lc|V=K(tFaPG-7qF(IwhHZ`E`1s$@_eCj_Z(c|}A zkMqd@8@^8fPv`!x-E=&84T!}?{S<29GlC}~KEuQSeUt7=_Atw*2?1FI$DC9?c+dd> zdOd2bS7C`z+j7cAIo=W{W8gfwK(3m6>WhRIizUXL#!Y`*tz4Vohhdy7EK!MJQCdHg z|_i~sM!=I`8RYy&;^p-qk7--LeMzFar zAn*!xQ-IwcuiEp|8q^Lf3Fd0#G8P&k?QXS-%1Y&^J0!y-i)uUz%VcRASAqe2=J*Ta z1b#n6{XujJ9xE_Td&R?Sugdd+9J9(I=qlT-uBQ|EXUr_GaDOs!;z;Yz!&;IfWDb7} z{6QbcdlVH-&3GMGtBhM>!r*I?$pE+_m?Yv2aX|{ATVFY3^9;#lf~Gw?PsDr4&V}J` zB!iyA7wyVFDE@A@5cUnHHa3E_nmBS8$@_EKW^G*23AWEa2ZYd+dn{J{CquH=q>j+5 zCPTT#bw(b*2ohL|FzX_wV&Dj#Ab0!M40+)FtQ%4$x6H|X4NpPuiol(34&-6nFF~`L z6DLlmlBGc%`N?2}$7>BrA*qnK+M`Q6^qv?Ee&&qSzfh#2|~5Q_Mhblgro#P-F#;0o2!AU-f4$PfU#h7VIPR+Dqp(;Qk5pCj%T&02xwyq(Y^9rP5JJ36{(ql%hhZw|tSXv&3#pOsd zFj8OfM$#n^%oO>-f)os?mS)B&v^-MI8Jq4%Q4P$lji{|O2cuMKfSe7&7CB!DIWcwQDhi^H^0mYj$#3f<8mFY8XpF2YtVRX;g&$%WWE{9@AjA@(t5M zrIpqr5U-+oK>zN~lvZm@_x9al8SI`BbMgxlrmOu5M9w%{Qi?i(nEYU}oMDbv4rPd^ zxe@TlCLc^=9adh=)hx!JSEGQn=Y24o_Mmil3Pw#biNqa}V`qAn6qvYS#>~n1CT+0R z$?Tl{KH$1ZMLN6-OW-l9-&ioKjaiT*RG1)}aH4X=XFT9SGllh+yh#RDsC~fa!xZvO#c~<#JSwz)Us-I z!<^qC1Sl36{Qm;A?`&LK4u=Y6^uXW24HM5mBXKYd5*vRPg0ym{4s-Koz#Y52I$$8M)ihF&o6oPcqB6i~c?9jCFYO(ZEYB;_M9`E?e+f;%GE>l_?_)le$jT$GA$6uJ&Mi)L zb;4}@S5lpXB68+dr36>?s(E>i@oPD?_N=>@m ze#_`tB@A;gxQ!#pDaJOIi-KJ|6f@7h)LY8Nd|j|FfL6aQ!>L;I8R>2>w!5FOz_ev<3GW40Q<`;?s6G9Wulwh zI9|1F0jDh-iXHhUsP5yY%o9_U7(e$p;&%j`_HZcr`k{3^#-;h>l%8Qj9jM02R-R2! zEyDO-qDo4k6+PXI!sKhhBW(Dxp^EzuBiz3`CTal~vAIMPYTf3f$cdJjN_&Ov(ZNkcl>ce(8m|ITQLij(w^ua}AsDOtx;UMG%P;b+Q5|13jnEOc_YHFX!c-G&rw#1+YqkfejONjPwb0VCgby)o zmpAdZz}_qRhC4UKQfW!lo6k=cr!GMS?DwDow})g7GpKRB>na~dk0TnKdl=BU0mbVt z*XsPiZ_T6fi$ZcA|E&SDeVEjiNUwz#>NOyt)%yFxf6dKyyHIovHRjgnb#p#)KL?t9b9tj zF)ifuR&G5DGV3vSS$8VTQPG1}vZMtM0inq~RJWqamj@AZF+EhCBDZ;O$XMeuez9p5 zYzIhfM92VP*IhCt-CciV*JFhLE_FHXUsm}jl00M~1lfk4J|9UognptL*i1OH+`AUC z_Wa=G7=QkIMC;RtyYc9gy~FZkzsDJ^nnzwnyN%Qj+i`7qCtey%YG%+aHZL{g$GJ%7 zwlNW**&s5y4ajVsmL;=V3PFHT`15NG`87~HkBNKzM#%Np)flaXyCety6%lB$pmMui zHGrl4Ev4JFY^dQ(tmAmTv2)S`ob) z&Lx}5Nw(e3c4-++!w94Hw?hsSe0o`YBAKS@jk-l|N#;iVIQ$ra!q~sUhI4nj&pr`n zRi7B19yd7!vB%&3I`U)$%)3W&X;CjeWiPFS@s~h9UC3x>9YzOHejyKM@lh>iel1vs zYlV@@^ux}-BZzSZkxRRBnYxv3`|pf}cqN?wzIjMW2;2e@(`;h8T* zS}7+ubeDbtEt&1Q%xA*UM$~pb{v{D3O@SI_@|&+-`j7Tf*e13D-u`UpA?}|>EumwZ z2i-(NU3QZ>AG?cR*)SVn+CyMkxU6|1k^)t0>)U?>wDTOg)3>4=dJEd9)IxOGhp&mA zH`1UJocdUoO(=FH4_x3cNuibP@wpgp*=GSAAkblWsOmt}$NXDOP zMZZp>*Q4L>CuO8e~!))B8zyN2c5yo_#OiTUDDUqf%XdC&r zlbf#Ps~nVFfe!~euR%=bX&yh9)ey(iGXfylJ7G_+$krpBAils4vaJp9%OhIUnB9cT z^#f0z$4Sk7%8l`wD4T6jf+PJM!L(-PjGJwz$Z8$#Z7CY-tqrj?>-FXcS4LLoAET07jMLZEm(_0bY=N#IV+h58;slTwXHg+MK zEKVl?CkN0SVA&-GnzlhJT-ghlehQ6ieLTPOpb%CW7$v)us8Gb?;nJgu&l(Mo$NM9^ z89LAi3Gx`Hk$w@@4>`yex_9X1*Z!eQhx*fVk~|I(P#VZ(mJUI*6x}uGdqJ^z8|AsH zO@|tS`L|YVQX@Xwfs}OylXY<#{)XEGd7M;&=}(G z&}n$dO8tlnL6gnJ1Ut%oK04GRLCuK_u0CUxZMQd&Lh6E{EQJr^D}d5hOb?!6H{6T2 zZO|=@U{~#^&^WY_+f=VsAP{>nU?YXEstoH&oITy4o&>enAc0yie2QX&gwjSv!6Hyp z_OjXNZViMFzqapke?6&rbbs#1VZ1T!mQ+&pt`EzWqKn z3QvXB#GEsojBxiQ%6459;mQ1cepyMg(YEJ$OkRrexW{G_E?1wA-Kx^oA&KGB?a?_g zZD;79AWO!iGR{Y+c*m4x*BlMkN2Uxo{v%7eImfkJ{$r3=kTi_mz{xPU4Pfdax5H9vdx!ZHt99* zA52)JU^ZD5d3xJcayE2T*R9X}(*Y%uV7V?^yyruP8Ev@QHnV*(!{VxDl6C;##YpAz zyTTxyshxBE9RV003L(zb0+i$oCKG1+GN!xx=4edu)|RT-Dp$x6=6BTPrEDH^}FV1P|%4p5iL=NuF%KLu>lNU%!~T4I%iW4>8C!TQdz znspj({QeMinRm{iL^8YVD(EonZx$N$#+HHc1CbPTgt{yTuE!IRc3<^mfTo!n4|6|Q z+~p$JrYOx8zh7#C1_ni8>R;WXfcZ7mjZ6d0P~e!;Wc&nm+2B8mZyEpp#Tv#kS+^a3 zS6@o9dI3RT^6ZTiKCV8Ne8u2eB~4#p24>)0IMGY@mt#@K!CfLO+KFLDjOpG2a$1azIo*Zg<5gj z(H$^{RXjoDP~h-rjgU?~l6thRt9QiS$JK@*1u)a8*m z2U~q8Fr6N~1NRc@o$zIbc?4bH%5?;+!yxMHwn5ZEYtLUHfhYNxPoUlQ-_mjIiVh80 zhJqXf1+uf|7CeJwE%V={hnvu)di$!eV86z1Q@s%TcGQv%^{NvkE2osOMRfmK(DKuZ zoN!TwG-}TYdQd1h?77tbcG!94zQIq!+_eZwYtsSO;~`1j;8o|<`IifK@1I4* zM*Kou)>u7w?tr1i@8VD1KkzQ&hu!L(fu1zNbsdUZ=!;G&I@HG9UOmdSY(j1NM}MS* z9-zP1AN!ivBpb1+@)EVRykn6XDlVov1p(r2nu{9P?{D|Tem3;@xKA$dqHe)+?M3P| zk|%)PNd1*OhUGqGhX9jW!fbLO&&UhxuJ7;q2m(u0gZR=CyKt!|y3?>pX#FLN6FJ># zUXVpKOZFA5x8n7VB{@mzed&K=?0CmY+7#IHGyk%FY$@`fg7{k(Ygkk|lDN%4fbE`V z2gDp|Cni<8WN#RopmG{1*bqW6C+=_oQZT0l(q^DJO(o6u+lHmxBm0)|$w)t(QJ^yr z^dyC;)F?0&g!#vG1trLAPY}2{xR@`k@Rm^sgt-e(IW%ED(Fye165}_vIj*EL*>mI^ zY=C)KT5X{KwtQiuz_|UN4mp3f6;f$z>i}`4&MpB80X$)$aaq^PZ)0}}@L(U#q+c{x z{hy^!A#B4xA-lxCrDl_l7F}h>?PELs+xNfbjudi(mF4V6glPq0846aA6Ufelm2qr~G>bDCu+?4w@ztloZ+zYf_0*cRPTb!lK0{`2i#r&WUx=d? zdE;&0$leJx+H4XtpgTN;4j42519Tm6-h45&*-3USNmp`8=hQ82O!wB43pK&26JgpjwzdFBuw z_GhXrtP7xM#6!_^#`YA_p57PgS=c3`h*x8_oypMaso%wl^LK~+a>tx`e(Xz)&?qcz zYiGevPv!_q1kyArbD^Czmu|rR=Z@=0m$23vn70w$Cm>R%=W6_MO~$(qaasUXe^!p2lNG;2|}uD$0k+;*WQpC#%pDpG^ZVxPLFW|6QST)@FNy$Cm>I zJLfM!p9qVXFAIx))NkA^$5S~MTI|*h+*uu^-Gr=2*Q>inAJbF%dueKYf1^Qn!R%px zw};_Q)W^AQ%c$xeuS3#Uj)m!Zb(8**78Mgy4H9iOIkzac|Lz26WtyTm0ym(wOn3Yo z^;Ub#1{Vs6aO446w(AUCa7rta+6+_$?Lpm%*M{knMeWtU?X}LI;dOpEK@h3B! zfz5XQ#of_D-bZ8_OnKzSmUT4mU{S@R=|0-!mU2a(f&c$oeJpNbkn;JULViILparwu zaIv3VVp>Idf95Z16)}+k#SQWcDu1OOm!y*!R(h-{>rNty(MeKC`W$iAKOy7Z$?!>g zs5>;(+LT+2ukZ$r`40_nK;8nPR?k{g;?nW)0Q}mO2gYru>Z}Bn&-MPu z&P9OP#)Ews5*kGuRfav6r6z0y;ch8nX)!pk%i$Dh73^#=SX1t$+7&ps%Wc&Jz}9M` zv{ZKr@fhfFGx}CEc;>#5I{|i9!6xEY)#C`FA3mtYUGl467V@?pcaXd*?4=rI*kw4F zcYId9StB>3%p)>)C4zeSA%!$bs3ATGmM2$ra$(mQL@A}`Z{D_8DPjC)& z3hmCn-LRgtwDOi4c9wvz5C5Y>n6zQ;yPL+h?E&^P^=7TV%vb(GckXHgfJQRL$U^Y zE;YYp$q}bos&~;5m@) zx&^0nfVKC8tbtCRSd9vGa{&(w<7j-#2cA}-t)u0`4ym{mlp&&Ym zmJL=9I8@z1?B2dVV8MPe-RJ)*lqM=q&Mif@&f#(Mq|jFxOnum!2ON8zdtOqp>dE+e zMuCvek9Ic=;gAZOu%|< zOqn3Rbn(qV2uavJqbf+}$kb|W*|o<&*D!JhJ<8{9)ksX@nXW#%s2DgOi>OcH#UX0^ zPWhGxts>tW<35DCv=~Q@P9Ll_oyDf8LB%G?POK?>Q~mzVbeFLz%c_m47qR^nF+Xg9 z&EI;>mOqUk*`AyWa;7L?1wQ&r03!2=`VX}^xkBh0Q<3FQj`S;2w9D8>KTc$Ts6#KU zqyk|aYm9#V+Sa=MvQPmpU$7wwJTkv_^udNchlBEGrYV<$$17&3MfhLs|GP&_ z5O5}VdYU^pR|B=da541z&@Y@|0T5Fg$mU?dxw3u9pa(kikK%MqH+Z(w1LQ(}#rNhQ z#mneyF{YiClinXTW=;90V$gnVp8xR}=}cN~kmZt({q)+!a<3k#_@keGDLPZweD+S&SPP3$GWrBhP5JOW60Ty6FnNb#!*~9@9eI?$jhb!g?Sw>pxzbK67*B57x;1&{Ifz==8F~ zZRR@BwP&HqXW)2cYD)K7p^e<3rM-2J{M%Qc_3j8lDB5lL~0h?vBfK%LSg3 z-kP}xYeurFRm6jYc&`Dg6f(YV_^>~&0+mw9JW=1qU9B1jW((p68L=vfjyz?V%v_r1 znZYp@MONf(jeMz6c;-NxF+)fgA#WZr#>2uxBpcx9meTK*R3#4PW)l?u z;dL+GCmnFie2lwoA^_f%3C>}kFPd0m{8GG-1aF7eVU%CEpwCn4ZUi5~UFdp|z1>n) zyTBsUGz31Yx)g!T;nxUDX0hdpk#!8+z@kav5&bm2*-XZMK-i(Ic1<_(hslI`H~LZ+ zFyme5ZnNJP$0357i>S*GRK1HMF+t&}4ZkcA7)Ss&6lnL~Q-n5HY)G{6rpq>Q6QsFG`oQkJcJ_ggy&|4Hj{>i$J9zQl zTLQ1P)ZwH)+hrg7pV2jHJAt}=8 zf7EC(mIq5#|6#7Jy;VMR0-(>Ku}^Y00>3?je3jwM3T4mlKfN80xXJL)J`3?4DNTy#hl9$EVSVV% zW5H&Ps^~hDWie7UKL9dhKHHoEx-Pdv1Nd8*d+Noi)yJ=#+CL;Mu~zTh841OHop;zh z-0^G+WMR-}TaHXB`t{BW{7NcHkiB|u7b_LuS~=_!){D%k{J3j6gne1OTi&{-QE_SB z=xm*$ZWXT#lgiiPX>u?tMB3nuac;vevg)I{x^8l-FsgS`wXiH9BD`qEZy%|uGC3a@ z*knNZQPqI?u24@1#AA0K^qQ-&bwpp=PIO>N1=2^dsD*36!z0|Xje;HxT01La0G#%S z-)c6nI@jVtAC(8>5)=$iNIf69@5UV0qDD%?{2QDL1klMiZ`~ z7vOU$sV7l6tTdE>-B)Ab85R;9({Xkaw$Mt_f}IuiDNk5Dg*<-n9qL?tvy*WR#j^>7 z^VSt!O-@}yr+W4JTcW+&hU6ErX%pFLH<=UUVP&!4WhW#TUM`trgUWFk|HF4}Jffge z=tESvTk1XPjR~*l3?k6h`r|eVX+A{7Q9DLKt`thU7kP?_XIgOesDqK9;!FlHEE<$0 z9p)o(nX3K*A3Pshc9)1c0A(j&as0PE@wwNu9Mb+PeBkYQ2s^1Z9Yho?kKq3uiB-=- z`j^r&o6dY1+Je^NoZY~egVvbCJ0pJzy?Qr$+1YyYy|@2i)1@9^F>(SCo{d9MG6%Ey zY3xc1lc-+PbKRpqeoSq6D^9oU`q?%QEmQ%U*L_ZJK8D@afoz)&tKA~%mZ{p(%jiAF zgy=%l<_i=;4+`ckJ?$w?RPbU#(GNZ<+xtbRPDm`+n4m|!WtOa0r-T!_XtZVQ?bC@8 z26?psUI!wFcC=X!6!}nI4Pv@Xhg?_8tlxQS`u zn)Z-#KZH=ogYU`B{L?wz)Eyt=TN-30@mMiWc8eRr%L!xbim7uCDmG{)3bF>9>vdtN zz(-*KO0D;}kS$aXwsWD^UR-V0(|rb;LnY_kTaGWStUQ8!G8?U|4p7PkrPov7*C$gg zyI}ackT2_)*;xM)Z0MuhKZ1>k`qnsMOA239^*pkQ>h(n4f}kln^bQx`IGfD3bFTLu z5w)JP`VposKoXdINFaHxh644q+eG%e|7+3Jmh1mo?3yw!>pv7D3sN=>;(%XlyjWd= zK{^MMCld4KfWuW@$wPQS&lGPtuCba~`o+77=HCflK$eZ?kqZu^M@@Ku$Ng3TGJrh6 z={e{3`p(DV>c4=$=_md#yS+;zIgILQ1qYxPJt)nFHn+LkXJGPbxj8bacqwHt^hxu2 zX#Wq4p==l|0#JlaUB)y0WuyPF0p-f37cIt2_#yv*XI%;f9^zHTgWyox{RNQpaMSkd za2dG0BfAL5xbKYpauJLqI@)>~u7bXIJb-*eWk;%lOwoHl7penD5%Sr%&v(Cmg-}dO z#Vi&78opv5*TT^7_+wa1F!C7q+jcx&>%8h;k3;9iHS@*o(d@!sScLcnS>+dmNT_l1 zT=V&ip-imcV6oc0upnh$Q$PbAw~-6b#?AK#5M9$lp+duKe)d)}v}P(-GkWXyVMr2T z1efFy$7{?2lW4*pC=<>6#K*3FpgMgdhFr1KU+<4oYhaYhCPOUlXTe{(dPbZpsblH$ z^7Uz`JeBDpk%ezN&TX0u&X$g~zjB*I4q0c2?2&Y8)XRwEW83@!AOy?8LOEN)Qhzoo zInFkp!avdPRs3tYa&bfp=n&<9hPHH4HB`k@XU{kMi7Y}^OjgRo?{S3i#_W=ok)srjy3)J8?s`#Ytpgh$am|LRU$(vYCN-xfqqKZ=LVQ-L7**%WZ~s zqM7vJ7`O^1!*Lciy(Rp&X(pFu$^AJ8^3fEb;mL0o@V8yzKhc*dYZ|utbB&!Rqgv&| z!eJYLF`;B$BvOk;Y9v)v{mdmf#$gYh#Ab#Z=dBW;JcPqNfgwKAPJzP6rNLTZfTT>} z-PNT)g;oYTqg+om^&1UkFngF#?E49Tc}oA8s}c#DHDI8{@5^g__F1vn4?1}Ypd}|S3QtsxMLCg31+M6%>7_OI>NLBmJ@D`vWG)KYY z(Ee+3)6Kaq>XDj59%~Go6Gqn1Q44^6Z=?>e69GDyv8npnZ^JF#bBAV`HJd&izicWlI41 zy0WZNwtRxH>!uOyExcY-iJCMaIh)`zK5Wqa2yT{6&D-&2yr_43Ufa7_%}Fn6dXgv;`3N@sH)g)~p$X|B{h z#smHXG#>i4q%rkKa%H+YEzc;05(o?PUqH?ADUH#L>gI=RbucH2R5uV`5=Lr` zkNJ!>z8;Uop)R9Da~95^?8O&oIN>OsCt{NIZhxJ+Dfxr-WWEh(eYoyjwgdj09=827 zv);o8wjY|?Xd<1}-e2_i2?8E!4r?;Y3si2zZPd7b&@F${nde<>-@f~!*VaAakb^S^ zEBE!LTjuE}Y+TL_aUMCoZR;+QNmhc~OdlBJHH*k4Oi6dtr*JiQy&W#M;0ri%pKcY| z@%_QZ$oet89@iTHBeuAx0?FUqHt63}wV0=C=uVs+^8=w_{3qmTn1A?bkY%S-13rpV zo7^m61QvfXlY<}X?(I;&S)<~m5}O8peW8ARJe(jW^y3I0Mi=MKWhD7khu>2;jzM`0 zH!T6GY{_Nkj(7!9WB--WPy!0&!Sp~gF$^W%H4<^)NL}ZamO<|8XnmlJt#rH3plR3L zVo4-M&}BS1wFT02!P^K39JOw#Hv2M zHOj>~3+}93waj7Uw~4wbc2A=gB7AMW4u@10C=Jf1ksn0q?;=YRsA!v9FJ!iHQgysD zm#%~W&7BJoN2E)VGzv*ANLlX)|L}8DQG=5#(jbTDik$IdY4o0!;s_>6QV6dVsxXnM z!qfFuM{(i^p9tbW`b9f1po1*l#Hhln zR7K$p+24E9Ia$FQs_bN&`|N8F22M0a?IsRDG?6z@j>aT*xi;(T=zu-5-OLi0t(QiR zO7{b!*q;bv@C%7wCXo!-(^S4 zOKKZq9_y%v4%l8;Z6xw(SbK7pw7X{|9OCL0o?zm2NEg~gG5e>=B zZ1OotZ97y-`d^^zN3@1e6Hlf_a~N9XT0BL)SZ&o)M(&>#D!6Hw^wn!~wK1f)YVt1u z3^o;>MYy1j!qBpB#VCa{!8M?4+!W}}nV6MK0smOfJyf$>O46g!|GM+UkQIjo=QNdG z&W-{>+d*Ys?hhfHiS>q%ZW+wQqn`2lK>R}2OpY7MwR0@|%@&lc=YyUtM(|~PCJ)+a z28IE|=Pk;!;dgmrxEE1X)EX_gtfkDHJD$%YYp$aqe|v>fO3Is};! zdF<;{cxkWII-enCZ;1{1m(s(fP>M>dmr{&D5#R6cfga9?tjJtx&qA&wg-Gw-&Jb?3 z#Afa7tK0fb^6u9}6Y=?pXoJV7lUEie_lsBL(;9X!IFWG(GuA(|+iW$a+9s3#jA6Di zEQ$qT3U4s|bGqCpzb3kPvHdjoD|z#Gx*&PsT#7GYsys=~bXp%2DZ{3_#O^Ze(<0@yHIA4@TQ3k$NtA=2+^{PlJ&GKv3Q zSZ`=cN{b0eD%L%~oF@(Kt>_E1HOi3KT`%@`wB2Mv1WCjK3+h2QUmS(btDom#G{ses zWRs)st=bJ!ZzY;TKx>+DxK&)zei# zpBliFzhnJ1U;cfn~g#ctE4r7)^PwB84O=LqfIX(66i*jZJ&3cHNepzSy`yJzCgnhUA1<*!-gQiM2$-Oc5_e?=^eik39u4!TLO14MfoT$OJv@{$8&sy|y>Au!&_lt#WLE{ZXNh?{jRM7-ZAjnx&h zY}L$lFbl!tc8YFW?4Qv$4~zQFV48XHJJ4zx&WOrtSCKRfu6sMH{xgrY>Z?T=d4lJW zNa%3eXO!#9%k&KWpX(YODWdb7M(Q_5bG5s!#2U*19Hhy<5Ws8>?I?`WPVOlke7NrW zN#2eL*qPeFp-TwU7@35|7aF}y?AVn}>UZOt8x%^DPi2p}!au~Cl94{-Hc2tO@6c2C z!&LVpJ^DkX@F6U>DX4x-i2?nh+k3_NR!Ys5VUMtG@>%+PigVt%YW*c=NN;;>E?#rB zTsyf?_~||OuoZ{0w+|t|@^0lS5Ej1elcYfBka3qVhX`O^oxy|%!>m)(Grp%PdpF3^plQJ-r4-#=-8_Cjf` zJ45coT9-ms&Z!21F16EajU)L>To3iR_K4;8z=tLWnq5uyGdR4<=M8hw2+yR;eIorT zh>)zKZqMn$wAI&4y%5#163U$$pqBA>vA=6`>`^2{@lh%LcV&GO|5ahk-sHS z6!+XInl>DEY+SwRU`gg_MvOfKmZ*%Ap50Asqy}!BQKom#c2LO?21}kdw@J z13vEveuArD<+0|@4@bm$T|+sw+YHg>Xmo10n(n!|cYd&N!wyUylTtJp@BIFGt_I)p zbiUi?od@8>Che~VPaDdDq{KZ|rMF){Eypa+Z5Z44wTKX0bunLBPzW!Ur$+R#=>^mD zYZ+HrUVf580*GAj(!NeN7m z8OeO|E}snhm7Oc|^j{Ygq@q`#Rp=?@{6FU2J08n6{vWnoc2p>tk%o|rG9oJ@BP%nM zD7&(C6KJ)z< zhvDU6m;r@6km!bK)$w4n4YzQSdTP1<^B&=RH~v{Kk1+3BP38H}h5_Fl9IN2GoN9QkLUq8CWd zk^)eBPNU8vfG^^WSQ(UHUBzWy7G=#df1O;wYI_chC0HljK}Ked6wa|4=Zbp;9pJAGJ_Vcy|69=hx`6Hk@bK9Iej$B#k4bfUWi93K3o>O!D< z_w=U@9KIL0@XF|MIOo722aMr>dobf+I$qKifDxyAOa|P)ySea&5dJuWFc?vobGcPL z7cg#MKzs~^s@Ur>roob6pH|aZ@fKevTc#Gs;T#%oP!{Bf!FydaNZ1$J!7?kNsQqPe zCK@7U;khQ($OxUK(!w`7K}DwvZW+EWXSEIwb)d`q9sf2@;PCIIEqBt_`=l| zhfZY#2i}20>5sggf!tw{GXz^m>89{A$<=eU1@a;s*`i|!R=c@4gXJ9!@frs_FOdmZ zgrgQFU3|x7#9=YPLSVSc(2y;i2`KorX}79HmDuTXA&bY(N#Q=8!q#P_!kk6f#ByWe|DO&ZsMfm$B1w0vuWCS}QJguoYw=#Uy zwY4gJfw>Y{wj-NZp|!Gh_s#5&31wm!OY)Rroy*4;F=dkUEZxKF+vvHhm*g^}$3yoX z_c&y_MhKGnnj~Y$zC2H3fuXV_(tn0wSas5HU7wKkCy$G=32;e(aYezkcOcRp9$VN4 z)EV+r6RP-oO=)$2IX^w}VH)^}iO@=SuX7R+0K&Dt##Bal3U}Mg);XC2v0c9k18yB9 z0=SK>w7onUe+^8f#(adAgquM6M8E;C!&6Kj$b-4vswrmx-UsruLjM9c`VVj;C&^O= z=sW^PxAK2fU1?YofN<*$n4MLJEog6Jdv9kgco&1&8R<@(L&z+g2Pie-zc2T)QHq%e zoU?fT)buJGLA*?~keH%j1`d(t`=g&S@YgM1LSXL%f~x5F3Wt-MIIfXz1OlVN5;tSRw_&!Fk=|6DOw(L|(Bp3~`~`vg z@eCFVvJ5^ARvIvN?GSzLoWL~0NQEVmfl(*Czn1|kg|~G$0J7dytAbO({=8J#i+gB8WriiiL?o{W9x0xDZhz^?5Ig@WCp^8XSZOdF?|X+YAFfXdhrRZH`63)wu)hpQRAfIA01?ZM zsHxZe2>fP{K_5KoJe3PoO0kc)@RI@GhBc~Z_F@9WBAYy=d*uz2ZsKd)uT3~?E7YU6 z=X;%51w;-qlov1(0YM*i5^sWXt^>s+xi1B9}xRHu#j(qGTC6j4!_SIEiyfk z&V&U64IZ!vyx@RxMDzL6Ey&SnbWPK#jPH&MDt-ci1*|zYaVl*j3y!>YE;t$sSS$_p z{{VcnAgz4{!YX1|7DWhOhc65zR0I2{@nWit96%Bp6+VXev31a*_?zKm+U0IsbjJdMU9Pyp4Av|D$mU#+4Av3RnBx;2RcDcfz}mzsYBwrf;?l{0L=b8b zi-3L4f;4`n3&~Gkz(ECw(R$EeOKl3myIGmbfkW<#_B(!(FszZ+0LoCG;GXcG$LnWB$Vs<4T4Pa z62o*%^ZP8&t!{ZnbKD@4=5cA*&9765G=X5{!5KJy2w)?v9E($)(Us>QLPYoQY`4Js z0Rt@5IQEnL4!2w3NtXt1B5yC#vWl2>N<5!OxLq3NoI(m3_&E_ScS`+xc*=f=be$^m z2YU$=EcCvFx7wx5ZQwV!%3B6U>Dgz1t^jBcFRvg~UAQ#JV<@xO>jl#1f3s*&1cEL? z*PIhg`*0-{I1D(bOM}Wxgx4Z4R#n8!Y(VI6Rvm(Q zrUGOzGzpNI#ni)0FgB?0MGOGPI0FM3KDl#;{mB4HcC$X<9SkI(2<)V{>jt{6xyx## zxls%R4;V*oe?l5<#q z_^4_@I`H8o6Ic&K#JjS(J|l{i`RtY z&T;M_wuC(Kww7VAf z>BIx)Dd%!{30!a@&|1-UP8$r^f_lys_`yp7GD!@c6Og{(mGUpME})!%LlYdcVS&L# z7gEi|&*(u|8GCXnZY2Qbz#f@LTxN*OGqXqR@X-j4svzsxX9CnX2x$8l2&Lm^!1M|# z;_EqtPkijJEuexO2+ngu4;}|0{lKcXDXy$tsp+`Y(4#ewu1T;}t1eGni?~sCQaZtYtrW8$GVM4u2d5D?UmPsoYmKj+Zc)_i-f&YvDbPvB|Unl-N-0JOx77?XD7vBen9+2}uU5!5v)PelHJ|bN2 z!x2*gPJx60z{#I72`7tric~Ar+BDEBP*+#-pP6>+tEQ!JA%jUk`XG3pc2T zP#JE7G>Q*`k|kge?hu)wbN_7-?Jq)Vunz?ltRD`;l`W8)O2HN>i0{2V7na*byS?HAVN`3Lq5_cY)d3&wP^nL{SjNcRL_I*dVJpZy9RNskc=V|wzJ z5z<;Jg#ln|`%`k1`%1pz3^LK+go_edzqo z2WiIwBZ#)n!3Rzx+G&A=ssavd`?aS^!IDjQcQxargT+B(7KuN%;FI?&(NseU2XB1* zLF!HjI>9Q3 z*!@&i3o-|2h(l1lhd;#(v~^hdA~-&Q<`2AZzon69RmKEI0qsNkJ%ew9`jr52%M$zm znB%MI+9guB4YI!mNwTS4al5BlI`AR*0ji!Hq!|RoSBJj*V<9dLU>4pn_7MeLj_eFK zkns@6|ClgR-UZi7dvN%rNP#~sdeD{u?REs*Q^(TDW*GK6pXp@R|24cRr1*px0I4zD zu7$fEvu5!3G!Q*a?p(gU0ii5I=%Azn@E8?v(Yxxx65V z#8J?dpo06nn40}8i1&q(3uuv&ynJ~K8WGJlVFvvHmijOSt{IeZSu+qp<)T+rJiq9>-xt z(7I3&u?m0jKq4PtEJ%1;KwGPq9b6Zv0rH$cUhYrdUAcjpAD$#ua3y)XBI`5fB>L)1)*9y<1#@& z6kHemJ4+I-9ydNH@-bWzS9FUQ%s)PX?}024)joSpfN#I78$;P(R@w1=yeq$GhRK5C zE}G&9im1CKR*ZT0j3c6N^zRTeYA`Ry7nV+Coq)luT zGvFS5#H+=s@zoUig4Bgwd`;u!|y{e`oIfAXZQ~ zEj}2n(4I9yA8CORQr4;4?l75hTWDGSGzzhSz!}eNfu5kcvSqU&774df(rR{)bUitg z9JGS^koLq(%z7PXnY?s9&`LGvn!sA&rO*!R;SpEeanE}@n7=A|1pp7U*)?wVf@E9x zqpFJ)dLk(0{yrdrnPvH^PQlnus+gMSG!X4TL@|ZV{KWNU!_5>O=FFJb+>>omwXK-G z&b{x0`VlYJOxhdl3p&rI3JDAQp4b!;P`tt`@&gwkB}`cpV7g ze$I5gJO|+z7kibx=N&je4}DKrzlYw#B5L2Sv^{c> zOQRn8T-cn4n|=5qB3ugt;TFIg0^5D5Rs~C>nSxxs1ynESrO-%s75GAh%QvPEu#Mw- zRX{C+wB*I`ZVP>W*;;^{+v+y8f8o8~PG&H_K9eY&J~E4BPjIk8U{TM3<0(Bw&OVy6 ztd~{s-5}2N)B}n9)$0TY;ezW0g)ud_8r=p>BapWbz&;Kx0x)ybX>XaZ80e59cNsId z$b^`#Bd(2b4f{a^uGJI`f{9WfXnIcmL|Ul5poMyXod>D`Ehi)bfU5Uz)xa?7k}KmE zPY4PDeDE~CZgvucDTESGGzT>;6(RRLyTzdoSfC5|HWs4pgB~_$6af7e&$s8}qZ+t9 z0ULP00U0jvkw#7j60ewgIJa0o@9Wnl1NaGu{y$f(&h@UsK?5i_4rx+@fV3d|;8zkf zOPy46ND=8d!DR13?z7?`xB*AGc@D!!ugG1_Jb_2a+GYZ{!3K<|H9IXV8#&ivXFaFe z9^|G7%lu@J9%yhk@#C`fyw7vJP`U)SUO;+aUk5kAt>E&D9Z(Dx5CS4d8%G{C$paXk z0e6Z}IebBQ0Fm%@l0_DVk-~smB3Eu@x)jOGL4y!F&yc6&0*3~C2!&fIh~e?WF!s`l z32uoYhVrM+jL5L?;vb6;+TBLOt-k+?5$af6!{^oTRS~$Uh<=B((iXU>@wG1!d3T3y zb>ruW;v+$;TP(i$PdjtSt8=u)I;ke)g+8|pzF?rkIlIIw$Rah^=eTwJ{`-w2SVIxB zWmU9oUxyqxu0nPBpioP|a|2gka5ez^AMxEu1Mou!V4xQKeFSTsas!|W{t90w#s=o1 z2OhKs+ToYN1O7+QZ^U0P_t3k=I)d2mmTr#8+M(Ds3n1a7enCGAN_m8xL!S@ky@E{O zFkr=0tKIu?#{~2MP!h5Sogj-MPxyxx{8>2>km*g;R-VpL$mWZ%WOX19cvdRR)Q7=h zoY3M4X&f)s^>d^JcDvWz+&^yQm_l3Q8W`NtJXYua+4)cauC&(~aQTv?SCMArL*C0h zoYm??ALx4_Bu9S=?onYsQVrOB82ZuUTikwsN7DRS-Vu^hL6+T#v*2e#I7z3)6LL?! zF;S`>FdDqmzm6f=zvUE*sX7h{e@Z|2);`I*`goqI|CvQE_w^VtaNqhuEOX@P41>7} zh;SVLUhJyS=1oIqP(V$%Lbyx9-|H)qH(!R>-2UzG5i|J03ZMLg(hq&QYClMV??qQY zfFo3N!G-W3dm_0)t|FX6!#_NLft$2545ZB8voRkJY8T`>7XC?%gKQb<<)IXe8&Jry zgYHtuuBa|VSm6Rh{LwQ6Jev#CC1kQ|swH}u+ZFAq-a7Tf)(wHCbfSmyOeqVuSZ$u2 zyb&Mkd3s7R*!RUhy>NJfZN?aCbh9{|q`Wi~l#P zeAp1-VH6j;w^YAOJ>-3+e`@^$XN3IafbN_$7F4f5s?lSW1U9ogE6@+~Y|5#F$G#fj z-ii1}oNjRRmcq)^d!NCovkz4`6S2j{T6jyZ7E0^;vOFDPa(2F`u{5#Vpi!}1F~&mK zE8sHlJWiR0#d+Y$>fCy)!)XglltX8q9t{ib^m@80rrQ&edc8V6UQIy=pazm~UQF1M?zSO_+v^ktJclefvC%!d%|P7S*9y>{>iV~1l&@--eOyf#)n zi8-4ECZ;YfuVCqxY3fe`Y2o?Kh)LK9*d&_>r^6&TaKQYeu|opuR>$7T?_CLf`)9QC zQtZR&}v3PTw4N<#0^nw)W1%z*8O$o4x2tMt9k zEuSZjp1=mSICM=aBEo8Pr{mF%agbqb+c8Yvel(<5$(b>_LcDiZ`kN+Cp6{k*mi>`m zJD+{5nPOTTj%CV=O1``@*1ZfHz*3g@6^%WdAeKND*aR4YW|&wUf4hIX$FsF=UKu~w z65_`R^!D4Rv*$-HAnn%ZodeF#R^`K-pNQD!QQr??h=BQDhN9PmVSdaH_~{y&T4lU~ zA$$%7q%po>xZ8Bu8&X4WEE<j~kix@Eat@6CBTzT&rPvR2?Lo=VFr_YbX0P$>E9(6d9XIfvBSC(cD zrnJ`A?YLKhBV{Y2ttJ~BfaH(w6H2wIR|vLl5|fGWgb-D4r;f?2ItKyvTqb6{u#@Wn zIolV(iH$`W7+#p8sK3O}zbw}f^_xXgd9?faU?Q>D5)Ii07SH3NO=49Mo_{Ro@G5-5 zPzZhmw(&}VaI7GfwjxVx+8v_pFJa3)dUFgiQWOlQX(~F*wqyelaJImb|Mdfs2E;{r z8q@8YSm!#=63ZA%uJRQ;Pg<3_Sadz$DR3|cFPp}qscnW$nq`^^Zs7hcc+12u>wB}l z3ET7bS9{~lotOvL*;ItK*lN#WPs?LakWhLlLOVg!gnMrD`gm0cj*0BUH)M<>3Qs*u z70ydJK&TBvhe`a@C5BiC&Z{B%ZhPi(1MOJl05?8z-E=r@&Oy`#41$~*SUlu1+Q`m)aW`m;NxJycoCw&N)Au-5@2)OG7%>>;n z*t!q-`Yv6-un7Y9)Q>vXZA5kz5Dw+`?T~VUBSn8VvP%k4KHs^`k)Q;9F{RT4^H!di z;D|(PlIjJ>hR0y{3^pkN;7R9MCAL|N_kfRlH^+>~WZQP!_W@%2YoT$);Aiqm@Ry+I zxYOvADuFW2uc=D+#5dEFdisRD(G39Tw_k9EIIDx)*x@C*hR#7h8bcf?N<z7M@xeXJ%l;uqrcU4_jaxBgqOj-soh4GQP$307wYHL<` zOpN4!9zovFL_*c%Y4deJ(w0KAvdO}?OT0_Ln=V@%bJM#Y$i=G(tw=G{PRYX;u+*%6 zvI(YqP0^b%;p!H|%d;zl*!7*#FdU>+*$Jf55wvr=a&~v8>rVWTk9hTmTMoeKYDVu= zY%Uwoxo`oLb*>h85`WLFNvtL?DJ+K^-pWN&*$>Bb`V=hSuA2A>tiq-q(~eMoP(YpM zMIRL9V-O;y{IJzL%46sywTnC7O!sho;K#1|959~qbo@vxg6KU%6E6-mr0s4=Vwhz} zo=!0N@`AI76Y9x+_uVF-2bkjSok`_=Y(ZZ1G&Uv?x0yvQiRa8MdH4*Lk@#6s*f;=I z{*Aj;hkKJeji@>NfcZQv5yH~)E9XjcELdFddA1{(h?Tj?{smwY7JJAoZ)awn*P|*@ z10tShQTJj<935U}A<_VwdD8Z8c%jImuuI-Tcp{eaF^MyT8je+4d{-Lqs|jRM$R#(0 z9V^(>=OwV%y|c=1>G%T&m+U@{i!rqC%7`Cr&A<{zrMxk1D*EaTu@LWVZ1I?QoxsW| zAK&`wX~c)EtzyOKzsl@_;v$4sf;S8GtKF&l7lE=FclMVh9L!l#1B+7URbzh4Urt=d z+!=ZaByx_*Tcy2KKnim{_;(+3@dz;G&SiKnRV4VzdwUbMd5C+Ii;Wy)=SlD5Et z=I=Zv#({ejhfcsY`XxpPzc%&segyf{GZ#OSY9&XfjaREyKCL>;Be1hucuB_J{}M(p ziSp51FcwMb%NtBAuT<|nylE#Tm18^(pp_(nkM@v3Y}MiR``+I?seE~jH2`w>IK&pG&x4&&k_IO@ zWI+;F6}jYJ85kj4#s)NfNydV@znBf>rp49<#}dv3iw7{%u*mLKLI}qL^Dx7nQks>~ zSoCS-nrXsB@c+()$mW{xetZRkU)4^M5T?$XAH4~9i7I!K+E_L^>?TXxHNJAc;^}6< zK9S9N*EPE2`UYpIM>vd?&vYGUuqD$3J6h|Qr#<4~MI*K#UbL(=S z8DcuTjtJQpv>3Tl_|z9TIJck5@U_hRz=~1JBO}bjuA)cynmSojn4c*r8N43)C`@rC z|SeKp{w#ymK>6s{;I^NGZ;I`@xwo0Po^vag^8aNOf9Ix{ud=k`*zgf`yOF#3Xdyl#AIvXqmfMKGj+Ne}!2?a#Oi zytvAX0jBK_9T_;&x;qW1{I#m;A7!Piuf1eNr-?9lfy};t{t#y>|HgT+aAJ0MSY>Ww z!sQAji8XL0ax`~69+!?0yJmyzafw8l z2Pz&E+}}BM96vI_wC~;B?}_e0n;uow zEEG$4%!>h{b!r*E50%frh;yKnRiCFNARLh-;0;c?mn5OpCl(9xqj_F>w}${vh!CUf zoIc-FL>%_;dvF}FJYL>g+YyJ{k|jus+3aDX+~OH(FoaAQ5Gd{kXbB;q^1w_GK*hC_ zqd^2l02TbtKfE4)yWVy6>qc^oAY>P{B$;98UYL=t0dw0)@`)017H!5 z_T1`*ibNc98(w&;+X&`M=u?=lO;W9b?=V&#pC4V=*g>kf>2 zdwJ7tlMbg1El8o~jZMm^J~000eN}Q!Qwq0 zQ*B30l9m1wENJd?hztA!EE4c6ofz!?Xt-}D`^VvIsNaUCz@cW<`N8KWE5;kA1em-p z5;KSQ8vA?f5K@%fir)=trE$8*G|qc?_PKOvKCx`z*yk&@74!{vmY6O}J2)9{jQAS& zw8V@3dUW0RH8#T8xRq_1eX^gR<-&IG>qHuH{(JK)`5yM;S4`FF@nAbPAs z=z~7~!77M}hN&t&j0!7pRctf3e3%b>w>0GUoF`HF+VpiZUaO9DHhx$6+pLf2${yFa zm;x))C)cgOvtlwjO=G`ycGE^aJ6O5iSUG>~8SjmGCWlwgUQ%I{qrrZm54NFj$9a;N zC&n9t6s5hU-2D>1tsG3=SPCEm@L|r+c*6_gov`F@#<;jDHOXB zdC2hdd!!|BOFKJgL^z&mK+oZnms+5X-zDoIlC34)W}#0b741pbE`4q9R4A?^f;40v zjg_%XupMR^W}`~=E?F1|;UGj_qQQ%VT*j^j&;{R-h2KOjV%T6_D7+}adt}Pru)=sF zo)aPdrHgSD8&#TJf0B+gAn4;Y^1UU=b23E(k-qk0T>W?65MZd%X8DH{9K4(>SFsWh zeX;b>>wPB0_M%MCaK2PjrwEg`l~U?j12~D-sq^>eb@kToV5P(xeSW4&S1m#>A*SI$ z3K7SWg^Eb)-+;P73LfO8@mE1`5v|*u5ShD1u+j!bOWkZ-T#Z`?DWtz>ee^)qdCjsm zTNV3))4;ml*6=1OJ&`4-d5t$l(0OoxAO2IweemfpFg7r4)ev#>?(WT0BoM} zaQO=mv8)yRLNYKTz%UoDDHsD(o&LjlM=#9f zNLNTJi^uP&x_U>H$1|Itt%{499qZ0R<>qFN*d?%f; z-?f!~u-Ns$ZiY!ydEjfLm+8r$16Q2q%i{8TF;38T0sg_`*{nsMm?R$H$kcio%Dxs2 zS_7;9*n9(X!>+)48P}yaTkL~VK*-s5K#c49r~P5lbWX$< zgO`aXcsg+kpQRWZ;~ox|u|!Mq!gitA5JiO@cwc(?0sQi*pHS2LEhK9>`zy<;S3g}d zIEo6gLX|c+FLou&6em^uF#jcX&!E}Zf1V)eaC*tY_$_f_?xEI0%$YXMqDtyC79J&asG+QAB#Wk^j8Mk&X==iNo)uA z3@XD8-X}4C4c%-Ezx{)Jqq+RZ+=F-0l0UCv*?VQM>FI2IN?b|(TJv_BKe%Wqr^SZ~cVUJLBd z>*mz{D>N5hfvFGNjXk-)-QxIQ?<2wr-tZpV?$5~jW3xL7KsnpzU1y{^`J3b0UQ(6L zOOk#8|J*#(6l$+vTuV@4N*mOk7Lcvr{n$Dq;0INt{rp;T@#ib5iHoybuS=+~cX%&9 z6n|YL2AtO&^ZR8*nmcShTi0U&$bNxO$#dP^TkV=p6ye21?(%t2Nx95sL6glD&U+Z# z_{i+u+HU7pTu1m6ZuMSbg^T&h%yw_Mxb${L)DU}@Ck579Q8x~^jdfpTnXB)32N5|= z#{bm0$TB?3*O^X2x|}+0v`$W(^g3k0J7!DA=U9byqP6A8@;6VDJ7`y0C5~pC68)^$ z8Gl@tfRtxoCX_)hV@@-=-FBn!dUQswt^Yjndu>uwi-dEArRZmLwoV3-(0IIxF4&)i z&{~(!ahbMsvVgvl!RL5XHVwoh139O|t4Q7pkh(QVtfqohCQ+2yG8N_8=HT3Zh4c$N zOHp=X9j{`0QLZ;Kt`ojpQnyM{xAl)tmvDafB`B{qskx&`Q7^Vs?wB=sGWVn<)!Hm~ zd##jc!8?K@kJGw3Y~d}fwX2}=ADhX55Pr(>fT_@5nB%_oTh|~8*BfWm3nrw z$9`8V4%T`^$??L~TK&7Nf7xl>v@h3}NaF^A*;vzZE*=s;M>$~Y5+fQ}x zoh%D@ZzZxl@)RmNe>Cfh=tCAwt$4tok+mU({itYCs(3#AT%k@uGB1>22orMNIm>=9 zy+pek7K&ZEt#et7^$Jl$qaI*L>RbW%*ju9AhyQ5L^Euo!S#vqD2eqx|I%P!hz(VxB zgGfI8V7@nFdh>kcT3olwTvFU@p?M@UMN4z0cfsU{lQxiyif%^VEHU|x=fa<6_d!hfS3+LTSy`$QnqsRg*S2f=Z;x+H z`>jp^RpryKy=UuqTl(1b8GP9G5Aq`^E7ulHqMqwSN;gifd@y<&xsY_K^Lw9MN?bFn zI0cpb;j+_-LAs}ACO>2j+RCsGjp5#qJEsG+1Je=e{7xlLcUBv5uL3CDpSE;2Vsisl z$<{GZ)6%i=ywD#Xbt)q;sYy5mMZG=Q3E3_CsCRlVzoVOc z2fLPLMg$GUAY}>a1a9o1C+@5g#%`3`QHkhN++}L)ZX$VS4nU&;Mt9vZLFp?jZ8^GJ zw-R3V;TGpF%0VW%x7IlaRv2jJ4c-`}g1;ah6|dIJDn?Bb8ujI*w~v^?v65?ygn6O! zp_&miJvraLWJ+DQry0wJyB_}F+W^meKh-&tBdr-RP`Hu3Y;Hgar-z2~@1s8*u7?m{Wl<`LcIiG1vcQD^Eih4qVtI96+4p^UJFg84D;tIme%waJ9Qzg0Ha{G zLS<^o3)&{lymz^m#l5s?`z$PEIDN9m563k*G<9giHDwn^KCHG2lv*@TdSQHtb0R|G z4DqgZyoFK`Php15T*?diTWNRVYGnQaBzw>Of+Wun_q#L(80Rw>b#{7ckrmH!%axx0 zsB7ZFd$;&e7npdJv*`ONvEZHzPL_x)!!LTy!}0ZGA9W+COO|;Hry4}Xf{$yd35~`^ z_hj(5MfMUD#aq;ioC7;}@ZP<|6fKp`2%bIRXDR9^H|=LxQ&SRniM*hG2(`^P=ReDe z9Sd-}aXYhgSKYFvr8g!h%mFfJw*66!LTd9sJdx&)=*QNj;hTMNcYd zoX=WKq#=x7#a5STxWN`V<`v7A>&{0LqK1uE1T_`OvJ?)tfd89gef&rXBah{jvZNLL zMX*Eyx(&T6J)}YV9F}YYHRbFMnD^znT5p)mjoa@^V_<54=B|s@BO4@J*9Taxu2Irf^+mdmgto#*l4Da?{x>{*^p!wjsG6L*%oe zjO?69q5iAWzDX~r^ZG{JVxDAn`9k33{q0U?HzAhXd#vgoY5DG2v?hyOP9QzhbxGlO zax}86*O5GnJVvP3M|BUsNv3}$W3{fvL&+mzG|!P|6I0$i!Uu1uOYZR$XG~A0P`kFC z9nMg2?2J4?_cf$9%n0(!EUiQs@=f{@C+n!&J*<3;5?V1O_Y)GTSBM-bY4O?@0``;Vry1ZV||i>&28EB5-yg9Z7N{1SFOn|IyGr(pLK(WGI%d=K99SlPod`g zBe2|VeoK7uou(Wx6NcESsdVm>CQ;(BVRR)XrSo2RqtMy`EbH`DZ9pmc*OCd}xGz+y z;4klXcPk%jR-o&*um}sb#3q7i!lxfjYqWw74YtLqd&FY@*oFmH-j=QSwnL_d^NglA zL07G--IdbEV7%%%>U^mhnBr#e(P~|jo>Sx+xD%QT*`SX29*>3$_J zv)1-f5%`nUUm!(^Q-?ZqHicn2jh@W??*!+4m7yA-3fl_9C=!$lCLI$_B^T?fqu>lEE z^>0TS43FmONw80*Wna}*?wP8!y3(#;5||P3sWU`_bux{%=xmVDz(xlY?mgwM6Fr(` z?>VI;?W~reLUdE?iqj~KB&qs*Fn2m-smAJd#La~xm!`tT34OHeSWB)rdu6EP>4;sa zN zHc;DSm^Y;+c=1+Y%{;~W(2Md@2Y8vv%@BVT^$+{z%_{IlxzkxS6*HP)?^!PJ7^~s? zmev((N^pG^oFSfuhf!G*z1hNUhWBG*A5^Nm^(fs=9SXB<1*^5yeel zN?FAGI8Mjdw217pN$-GKwF7T! z;47ics?{_7JK9DWXV}{{2;+Zl0s-RDM$+!by}Lbuh?di*3VN?cn_e6--G z%nhS!TW8v|0oU7fD>~CY)6kR};CfoSDj6o=R~o{#8n7MXL@n108dv+>6Q5>3Rgy}34C;cdzhqk6i#(7ugFE{itTpRC4U(=HJLi= z+g;r)&20#CvT=s=rFegJ6?v|%6u*I76wx)-IkO?+p^U7PqNBho9Lb5q35o!^w|nAk?}46Q{15m<98P1&$90MOVMeLD#b|88>UVc`j%^OCpTTbUrbb7WAn-!#~*Rz z`nk7frwNal3S-j}hpDw)P7aJqQ^;|B*vy<@*$AM#aw_PHm>#r1MkS3>wa=|I7MFgO zCj&(q6hE(VoaL93c5VU_GvT+xjCTQ{vy`mXj%QPkvBbu zUP~AzgKf7VIipmJU94|yD^s9I1GDw;BDAHuj$NCShPL~xmm{E`gCw8EKpW@2GER^% zYct5j!!TlzH%UbLiM@uD>cbWAHLVtW)rP=uwWIdZ;#c;o5JX$RQeL)Asj;7N?ky4&bK+)$DuYXBvK>OZ6@lbyK zXX_PfvDMi1|4dTnshg>ia<*7P(`%tP&N@ya{)i+Rw(T;j3GBm9Y zii$GudE|o&5{|rBUi7dw_~N65qCvB3fy0hk1>bfVYNplr@8(utW~$;VUrVA*0a@nc zROcIL1zs)-_fzc(_mg~LOB?0_BZphvUk3z#;+D8BGyUK=e|y9X5K7(sVkOnQn*aNx z;1*ivw2MUNU60%U&4a7>Nel8h;r>xHp&p6_9eM*rLHTCRNwJ=`|9&xEA`}CYFTz-h ze>nc1e3t$=#wp>LHhk)T@(GTTbs18x`H!Th)UEshp8;`rKHqJl2C5w&0Vv2iG>NN_65v-?@Rxi;o-B)&b<}&tMNaW6gh{hVAXehIL-m<60NgNglK@%FG*l8K%!<=r~CWW?t zXVs5YL_g3+F{2%BqNpg&xfETS98*86h916&;-)-m)biHp(KWAk;b=ia)DiTMA&UBt zQcB!o&LLijh{J;h^%c>LXl+B(HHy-#al&wkh>L%n&}}D02To}C=kF7y3lqpE$6k(J z$DiPA)ba$J@bIq_XsPDFW>-r~PG0`62nM>AIR^T}U;ixv`{~DF_H#9aQ`@>J5%k@#5=-Y-UZYrfxm?ruE`zAn+eeP^2asOX) zNdhrU?rw!{u6|$Z?!CSE@gLk^wv|I)rsekZmSw)(;D;`>-J=p~Z23Q?&3(TMONxxM za;$Py4g*L;j)Z&43Ol(_TyN}Jhh21$n()n_;$Z&7vSQwz1suUF^=pZ)Z>L#@7yVwP{K zxIo71LPDMVbCCIo_GKcn8t0}J7k_c>y6AWDT<2mG(}T3qZdhz0x7lA`LpI=VOrohcXW~o z>Ll9q76=?+CMasOx(N!!67dYI4O}qPsgmhVW*{qOj1~mP{itz3bED~Rp^l>GO;HqR z4^tE^`5o({te)2d(B`J7qg*`DbCdI11h;}InI{Z&J`?(lr5dADbH##Kyr9H(U!Qj-fM6QR+wG(-J1R;ZMJ^GZi$3 z3*P(q#+af`pj%|D>Y&^9!C?B0(xcIkrPg`u5cXymFMr9d3O@xAqFdH z0^MJdeuR!edF+tS*&A%t1jS!^=wzaqL(K?`xn{_dRQ#_A67Vms5^M5Qo@6FKPizss zXBeQT_EELP5$FWXqR6Uv^1KN~KUV+={qB9ZP5M~cpwV)GYu2)jzs93&?3-O#e^U{A z+^)$T%sZY@Tb5giU82+cb?XAk)7bD+0(0KGmDk?na4kbiN)Hv5l(r3Su>}?LhJJGX z{X6{qgC(Uh9WdZ|D)bX47??0wQu5FM12R0JpT3X&4nM83q$HsN21vL=N0-^H(6hJO z2KO#`U_VVeqvqxY0v{Sc`0-FCjN7TYV@f zB%Tv`_{QwnPQyGhVN~F;)idMM%v?|se#T~5-?3jzCY&`**?o3KTQ)oQw@o&#-v514 z-#muBjS{nS=!2k*&%LLn#3;R2vXX|wR1c~twP~)M^AzFJH&T0uH%b0ss0D&vmNhrAqpF6TVu6dECTq(>#!(MV{y;*keID&lgF z7Sb3hm|jd&4z%_fWL+@jHke`zPr3PJAqvVd z{}Ezfsh;KE*g4ms^4@qHemsgi_Q8+3v+!sO{1`n0Kh}W9{;5t5Q#l?B%8vAC%@UFX zLyG8NEc`eV4<4xo;l~d6F}NRoEJsHB(xbzS+K-Rgy!T(X7oClr3E93p0|ik{|JuGe zTjuh()9b?j)76#7L*0FUOEi{3NEs8QqQ#OuLiS`YOEgHxGEBxkwt3<~CC1vskbU2h zZOEF;M3H^cWF5&eL$XX|ncoNfo^Q`H|J?gN_k8ZT=bZPsuldYpW^Pjh+vePBTH`xv z5dX&eGVE~AhOH8d-}k&1ZnHn@vuQMH*em*q)LTDevGf3D4P~*am6N-W1T1!a8Y0k!DArx>#4i^EF?+g;) zeyk?sXu39aEMmr_CZ=7l1taVXyoK6!0;8wW}uJQsC5o^_;E)ztW|}V&3mgSm_L6V+kj9P69{1ID^ix9=Qqp`_V59!Wkrj z;tLhO`wdBlY}eOM^wVqUabZ7F==RgcsloFa0<;b-g8=(gRKm~aC|4j7C}i^_Q+==6 zYQABOiR93zi(qfRT7#)erdxr|=8R@WXn`3wHHpJ-BUQ(AUxB^JH4|D?{o!=wetX~^ zAV0m??P~53kt(&WV(!^uZ%M7umox`^hR397r$LK0Mh^(cBjp-QJ*(Ly-3MH~vp+fW zLWi9CXEbZO&f<#nbGjnk(MDcoNm@x9!$+}`IcFo!3Y0(;+I5Wh-$kEjeSj%*0f{k( zGFM>YTtHyX=X0;6*0cq}vI+MEFx$IBn7?3{31A2Va{;k2uV9%m9J^xPNkI&c3ve^p z<^p12-m+xCKzGFqxG0PoppDAmXzk;*71uZPtW2#ibYzIw^^XR^c*>d_Dv3I2-Wbs?pjWQE?;buxmU9gVg36udj*E2!bNyC zjl{oW13yYy+FqSPc3@_>$eYfu#(O)kzDv#209X`piDF-@rIk&87q($G^+Si|lI9~M zMjI7ozb)lg7j{hLB(YR-d2cE@XZ4^iwLNHE9f;)_J;TI+&B`@LA^3do^C1={dxv6@A+gPp*Ju5 zLggN6(4D{La-%(kn6R1?m#1&_2KK_DFJaFf$Y9sr01sf#=0l9KCTps^f`9U5$M85` zTI8V}FAerE4U}GEKS#jNK(5W`XD@RaRR(d?Dv>{`MKjNyp^e^_(J6r+8~eN4-?pvvb!1 z>_1L&2?RpeB4&v4V{OJa}i?9L%I}N8k3n7H_@-78yd_l~ich zAnZY`@X+1o=PCsn@p?^eKYwWwH?BQ>xsnG9(l$Ugo7P=PEH1MX2cPH~!mV@#_4`$P z6mcOzUUl(@X%$I*^e4cD-V7! z_35XnrKwkrpy1Ok9CcuncXZUnH7>8iZh0UQHn)eTKg}j(=@_xP883ySD}a* z#%aNFl|bKP>(Muk7C$qRNlYBF)H}u&xTkSHSSD zUEyp5s=1*I53vE~Bf4P67sjpmVG#1S?kysqD;_fS7;h!w7`^L%O@{c(?Jmo$R5OLC&hHe z@a($c{yDq$w`Zt*d~#7d)&Rd=hKyb8`63Sw#PT)rl-~n7uZAqES5(t)l@B-JyJSU5 zb=6q_mkYC;>bwuL-(!h2P)r)m4U8q?l$f_{gZua2@ttPz0E`1Dx{(8JI<}N$Y zYxV9d>RNdpTJ+VSfyY?Y{PuNG_GtNyS>J6O3PDg<6l9o^vV4yh8+JZh3MW;48=+Bw|>%|Ny#m9n%RH_zDP!fqWM(5@Lxc zAkf3)8?Mm%#zeG1cF}wJ;@f7xht^05V8Uuxz>sSo)>l<>gAeO!k&oDJk^xI;mv+k5 zY_b8X({+V%l~M??eK=Q3B3e{AlS+6bC{Soi$p9L&pURRwab=F05P=aKOYAEu;kaDf z2Kg3{`jVCeO>&S=W7y|F)Lz&-!=Tx5q=37481zGTdUylxoYrE4GO$DnVSW+kY5`2n z*sJz5>t-&{k2$rHQD3rW_Jrjq8k~*j2WaQCiO9j{W6!PkYRASDHR1C|6Fj@OapCx} z4Kk;o-X@|9AITq397m#w@&P#?Tqgs@WGYY#h%<|q$L4zGe<8^7yWBsziO5$57~rc~ zaRU74#y4gxJ5#W z+>)1F%(l|TacL;ppc1joIU~QseS?H{$djm$0>Ktjv93IUD@3Rr$V6HB7S{*wX}kb?!n zxm`Mvgca?`i3n8~0tMCIt@`?}PgEzn=(rw_MNd3}60^;@b4RC*C&dzlS39B4!#AoQk3!=TD{DTC-&$JD-vmE%X5SD_O{ z-@di&nfmN_U>T@*GEnj87?g^+)LzM}-pTx3@`Xz@UVz^7#*-6!1z)&A+bj64Eui3m z+$Zn+f5B^Q?iRe2W2Ska%iS*%Nt=i%uhu}dvMfaXwo(MXKTN0;;UI4}fD1Ly{lm|a zu=M@%gR*y`5Zky!Jfs&^B}`B=NP&Up24Ksg$m}>;3Zr?d#d+lA!>vP?$BEn7&-XF6|?=F1zZX2 z?Ic(tEp$PyE<^p;ZN( zb%&b!)`2$sBZkKXoqsoy6zQ;BHpk||a1W5ATMiVc11T%%oU zBAusJ+*)0FCYei3+rS*PazNAXKHSC1K-|E#=FQs7n^$J04NmbR($lv6$MX^-jB~n0 zL_Hp#T-D?uyibRjKDi95a__qw^CXc9KXxu-faMd|pd+8D4tubjPt11S?AJ_fcfgr) zVpf{ik7c=sEy0Qn7H>?Z9%_CK4~|!FUL_lgQ7GemKt_ z{PvC_*TDU6-gqi83q_E>&+-vCskJ!}6^KR-AOBi^>mWkvAU9`hNyNv10}rEoczQDg z0XQJyFI(=aWKuMM5_#GBSXF0qEWm#;QVIF^W#pLO$v6vV(|nC?31`In66I?R*o)Rf zuJPVUI*n2xE3e^|*IG}q9jr!rC~}ptR*~qhCMJW-*TzSh-0l==11flFtc zMU=50x{Eb@eDa+-_cht(%mL0fIF!77J!WOPuGPD7R6%j7V9dUr9xw>6qgqtovc*pTi)sB? zFxmu@`g(tMDhTHi;9*x`xmfzsyUr8aL-@8ybehq%Ow5p|j7z43gqAr8knGXEy(feu zMmuuP1pC%Fq0vt%U29Gm44Gz(OKNIg)mtXj!`e_=@$?@&^cBY)ve*`(u%>^IE1Lcz zo&F=7{)3UeqP0WT+ajQUqBHx@@@`+q816vOMMgA6b+_5XxCes3Ot#XP=s=JdYRv1| zy1t^&jw76L_)s+6?cdEk#^Ev6C3HFXFiNUHy$-IlW#WVK81wp(IlJ?*aq63T&sJ6E z`7bmDIf<_%G+}s4NQb4=Sl6ume3F^@ixMY3{<2fY0g>*mC;@>Y6TIhijb6x=J~uIi{efAtuGLLNL0>yAskVwL&ww!-5Dkonq8|1RC0 zVVi`tR{3`tCE40TK?40jkM z8QVrujxcx#N2Q+C(IT^Sh|QtP#HK&Kc{ z`X(LHe19)r+lqcm8!{-Bv`oAH7yH5U7NB_3vZ<{EYn$#TI7;Q`F)1y!8%G!Pj zLHVxX5!Oci_|3n=QK?oC%)tRN z_DIWdTSA!E01M_i@BDY-GsC+IUB|vSy+0nT?}brG(?s9%zs+jS7xm45!wk7#KjGvv zw1U5sf7~&B=xy6(LS=OA)iHiL=B=xt?j`U&-!}(C)t;sEp#Q2lx4nHSKNGXk#>!tm zng>!nz`o%isx*0kfr0HXMx+>I#I$fYiIGbX^Qahfo~eKr=<{Q`i$PLM9;m%OcL_*} zaTIg41f;_xTDdDqGO1+2L>7U#lk(cRIT`+WVcYjEmQ%!|1q)KX*-2sEC(JY zKPm(93;pjHSBC$n2{`Pl0SCMC3;l6S=YP~b-QQKa0Qu)jREPdM5v_@JZ^5?Zz#19a z_d(t+7{%{{MPNDL|9#H}!oc^h1y5jvDnJ^{OGwb(JiZkmX(op-OhEMYE`YS1a6f9jWsfq~~=zCOst=v0GL8AUJ=)gV#U)Itz2{C}YS BPf7p) From 607b1afccf71644416d3cd8a8bdf7e5ba13e50b5 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Thu, 9 Dec 2021 13:35:47 -0700 Subject: [PATCH 10/35] Small Cmake updates for SeaState functionality --- CMakeLists.txt | 1 + modules/hydrodyn/CMakeLists.txt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36f0a0ecc3..a95a88d880 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -127,6 +127,7 @@ set(OPENFAST_MODULES elastodyn beamdyn subdyn + seastate hydrodyn orcaflex-interface extptfm diff --git a/modules/hydrodyn/CMakeLists.txt b/modules/hydrodyn/CMakeLists.txt index 3c10213253..43731750a1 100644 --- a/modules/hydrodyn/CMakeLists.txt +++ b/modules/hydrodyn/CMakeLists.txt @@ -43,7 +43,6 @@ set(HYDRODYN_SOURCES src/WAMIT_Interp.f90 src/Waves.f90 src/Waves2.f90 - src/Waves2_Output.f90 src/Conv_Radiation_Types.f90 src/Current_Types.f90 src/HydroDyn_Types.f90 From 34cb10e587ba8ab35aeef2b3a8870e6b31cfa5bf Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Thu, 9 Dec 2021 15:23:39 -0700 Subject: [PATCH 11/35] CMakeLists change to find filename of seastae_Interp.f90 --- modules/seastate/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/seastate/CMakeLists.txt b/modules/seastate/CMakeLists.txt index acdef872ed..b46d7a5904 100644 --- a/modules/seastate/CMakeLists.txt +++ b/modules/seastate/CMakeLists.txt @@ -27,7 +27,7 @@ set(SEAST_SOURCES src/Waves.f90 src/Waves2.f90 src/UserWaves.f90 - src/seastate_interp.f90 + src/seastate_Interp.f90 src/SeaState.f90 src/SeaState_Output.f90 src/Current_Types.f90 From a892f920aece5be4c5e68a734a9ec5c86c923fdb Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Thu, 9 Dec 2021 15:34:49 -0700 Subject: [PATCH 12/35] More CMakeLists Corrections for SeaState Update --- modules/hydrodyn/CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/hydrodyn/CMakeLists.txt b/modules/hydrodyn/CMakeLists.txt index 43731750a1..77cabd3586 100644 --- a/modules/hydrodyn/CMakeLists.txt +++ b/modules/hydrodyn/CMakeLists.txt @@ -16,7 +16,6 @@ if (GENERATE_TYPES) generate_f90_types(src/Conv_Radiation.txt ${CMAKE_CURRENT_LIST_DIR}/src/Conv_Radiation_Types.f90) - generate_f90_types(src/Current.txt ${CMAKE_CURRENT_LIST_DIR}/src/Current_Types.f90) generate_f90_types(src/HydroDyn.txt ${CMAKE_CURRENT_LIST_DIR}/src/HydroDyn_Types.f90) generate_f90_types(src/Morison.txt ${CMAKE_CURRENT_LIST_DIR}/src/Morison_Types.f90) generate_f90_types(src/SS_Radiation.txt ${CMAKE_CURRENT_LIST_DIR}/src/SS_Radiation_Types.f90) @@ -29,7 +28,6 @@ endif() set(HYDRODYN_SOURCES src/Conv_Radiation.f90 - src/Current.f90 src/HydroDyn.f90 src/HydroDyn_Input.f90 src/HydroDyn_Output.f90 @@ -44,7 +42,6 @@ set(HYDRODYN_SOURCES src/Waves.f90 src/Waves2.f90 src/Conv_Radiation_Types.f90 - src/Current_Types.f90 src/HydroDyn_Types.f90 src/Morison_Types.f90 src/SS_Radiation_Types.f90 From 2e85095a629adfb3d8bf02db5135e99db3a024d1 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Thu, 9 Dec 2021 15:59:37 -0700 Subject: [PATCH 13/35] More CMakelists debugging --- modules/hydrodyn/CMakeLists.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modules/hydrodyn/CMakeLists.txt b/modules/hydrodyn/CMakeLists.txt index 77cabd3586..71c9477cd0 100644 --- a/modules/hydrodyn/CMakeLists.txt +++ b/modules/hydrodyn/CMakeLists.txt @@ -22,8 +22,6 @@ if (GENERATE_TYPES) generate_f90_types(src/SS_Excitation.txt ${CMAKE_CURRENT_LIST_DIR}/src/SS_Excitation_Types.f90) generate_f90_types(src/WAMIT.txt ${CMAKE_CURRENT_LIST_DIR}/src/WAMIT_Types.f90) generate_f90_types(src/WAMIT2.txt ${CMAKE_CURRENT_LIST_DIR}/src/WAMIT2_Types.f90) - generate_f90_types(src/Waves.txt ${CMAKE_CURRENT_LIST_DIR}/src/Waves_Types.f90) - generate_f90_types(src/Waves2.txt ${CMAKE_CURRENT_LIST_DIR}/src/Waves2_Types.f90) endif() set(HYDRODYN_SOURCES @@ -35,12 +33,9 @@ set(HYDRODYN_SOURCES src/Morison_Output.f90 src/SS_Radiation.f90 src/SS_Excitation.f90 - src/UserWaves.f90 src/WAMIT.f90 src/WAMIT2.f90 src/WAMIT_Interp.f90 - src/Waves.f90 - src/Waves2.f90 src/Conv_Radiation_Types.f90 src/HydroDyn_Types.f90 src/Morison_Types.f90 @@ -48,8 +43,6 @@ set(HYDRODYN_SOURCES src/SS_Excitation_Types.f90 src/WAMIT_Types.f90 src/WAMIT2_Types.f90 - src/Waves_Types.f90 - src/Waves2_Types.f90 ) add_library(hydrodynlib ${HYDRODYN_SOURCES}) From 4d3f68df66c258f90029de772d8c8aa2fc2d1519 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Thu, 9 Dec 2021 18:05:24 -0700 Subject: [PATCH 14/35] CMaklists bug fix? Trying to resolve seastate references in hydrodyn --- modules/hydrodyn/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/hydrodyn/CMakeLists.txt b/modules/hydrodyn/CMakeLists.txt index 71c9477cd0..40cc424317 100644 --- a/modules/hydrodyn/CMakeLists.txt +++ b/modules/hydrodyn/CMakeLists.txt @@ -46,10 +46,10 @@ set(HYDRODYN_SOURCES ) add_library(hydrodynlib ${HYDRODYN_SOURCES}) -target_link_libraries(hydrodynlib nwtclibs) +target_link_libraries(hydrodynlib seastlib nwtclibs) add_executable(hydrodyn_driver src/HydroDyn_DriverCode.f90) -target_link_libraries(hydrodyn_driver hydrodynlib nwtclibs versioninfolib) +target_link_libraries(hydrodyn_driver hydrodynlib seastlib nwtclibs versioninfolib) #add_executable(ss_radiation # src/SS_Radiation_DriverCode.f90) From 3c17694211f81ba70ee404dd46a3c71b47f4095d Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Thu, 9 Dec 2021 19:00:40 -0700 Subject: [PATCH 15/35] More Cmakelists debug for SeaState --- modules/seastate/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/seastate/CMakeLists.txt b/modules/seastate/CMakeLists.txt index b46d7a5904..faeb3b3104 100644 --- a/modules/seastate/CMakeLists.txt +++ b/modules/seastate/CMakeLists.txt @@ -18,7 +18,7 @@ if (GENERATE_TYPES) generate_f90_types(src/Current.txt ${CMAKE_CURRENT_LIST_DIR}/src/Current_Types.f90) generate_f90_types(src/Waves.txt ${CMAKE_CURRENT_LIST_DIR}/src/Waves_Types.f90) generate_f90_types(src/Waves2.txt ${CMAKE_CURRENT_LIST_DIR}/src/Waves2_Types.f90 -noextrap) - generate_f90_types(src/seastate_interp.txt ${CMAKE_CURRENT_LIST_DIR}/src/SeaState_Interp_Types.f90 -noextrap) + generate_f90_types(src/seastate_Interp.txt ${CMAKE_CURRENT_LIST_DIR}/src/SeaState_Interp_Types.f90 -noextrap) generate_f90_types(src/SeaState.txt ${CMAKE_CURRENT_LIST_DIR}/src/SeaState_Types.f90 -noextrap) endif() From ab392b1e811dfdc114cfc6a834a74b2e3518e84f Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Fri, 10 Dec 2021 14:36:00 -0700 Subject: [PATCH 16/35] FIxed gfortran compile errors and Cmake error Needed to cast reals to correct types Added SeaState_input.f90 to CmakeLists.txt --- modules/seastate/CMakeLists.txt | 1 + modules/seastate/src/SeaState_Input.f90 | 9 +++++---- modules/seastate/src/SeaState_Output.f90 | 15 +++++++-------- modules/seastate/src/Waves.txt | 4 ++-- modules/seastate/src/seastate_Interp.f90 | 6 +++--- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/modules/seastate/CMakeLists.txt b/modules/seastate/CMakeLists.txt index faeb3b3104..2322dcac77 100644 --- a/modules/seastate/CMakeLists.txt +++ b/modules/seastate/CMakeLists.txt @@ -28,6 +28,7 @@ set(SEAST_SOURCES src/Waves2.f90 src/UserWaves.f90 src/seastate_Interp.f90 + src/SeaState_Input.f90 src/SeaState.f90 src/SeaState_Output.f90 src/Current_Types.f90 diff --git a/modules/seastate/src/SeaState_Input.f90 b/modules/seastate/src/SeaState_Input.f90 index c8239093ff..a398876d28 100644 --- a/modules/seastate/src/SeaState_Input.f90 +++ b/modules/seastate/src/SeaState_Input.f90 @@ -85,7 +85,7 @@ subroutine SeaSt_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDpth, integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'SeaSt_ParaseInput' - + real(ReKi) :: tmp ! Initialize local data UnEc = -1 ErrStat = ErrID_None @@ -123,13 +123,14 @@ subroutine SeaSt_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDpth, CurLine = CurLine + 1 ! WtrDens - Water density. - call ParseVarWDefault ( FileInfo_In, CurLine, 'WtrDens', InputFileData%Waves%WtrDens, defWtrDens, ErrStat2, ErrMsg2, UnEc ) + call ParseVarWDefault ( FileInfo_In, CurLine, 'WtrDens', tmp, defWtrDens, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; + InputFileData%Waves%WtrDens = tmp ! WtrDpth - Water depth - call ParseVarWDefault ( FileInfo_In, CurLine, 'WtrDpth', InputFileData%Waves%WtrDpth, defWtrDpth, ErrStat2, ErrMsg2, UnEc ) + call ParseVarWDefault ( FileInfo_In, CurLine, 'WtrDpth', tmp, defWtrDpth, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; - + InputFileData%Waves%WtrDpth = tmp ! MSL2SWL call ParseVarWDefault ( FileInfo_In, CurLine, 'MSL2SWL', InputFileData%MSL2SWL, defMSL2SWL, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; diff --git a/modules/seastate/src/SeaState_Output.f90 b/modules/seastate/src/SeaState_Output.f90 index 00841758d5..03174486aa 100644 --- a/modules/seastate/src/SeaState_Output.f90 +++ b/modules/seastate/src/SeaState_Output.f90 @@ -451,13 +451,13 @@ subroutine SeaStOut_MapOutputs( CurrentTime, p, NWaveElev, WaveElev, WaveElev1, REAL(DbKi), intent( in ) :: CurrentTime ! Current simulation time in seconds TYPE(SeaSt_ParameterType), intent( in ) :: p ! SeaState's parameter data INTEGER, intent( in ) :: NWaveElev ! Number of wave elevation locations to output - REAL(ReKi), intent( in ) :: WaveElev(:) ! Instantaneous total elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - REAL(ReKi), intent( in ) :: WaveElev1(:) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - REAL(ReKi), intent( in ) :: WaveElev2(:) ! Instantaneous second order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(SiKi), intent( in ) :: WaveElev(:) ! Instantaneous total elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(SiKi), intent( in ) :: WaveElev1(:) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(SiKi), intent( in ) :: WaveElev2(:) ! Instantaneous second order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) INTEGER, intent( in ) :: NWaveKin ! Number of wave elevation locations to output - REAL(ReKi), intent( in ) :: WaveVel(:,:) ! Instantaneous total elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - REAL(ReKi), intent( in ) :: WaveAcc(:,:) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - REAL(ReKi), intent( in ) :: WaveDynP(:) ! Instantaneous second order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(SiKi), intent( in ) :: WaveVel(:,:) ! Instantaneous total elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(SiKi), intent( in ) :: WaveAcc(:,:) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) + REAL(SiKi), intent( in ) :: WaveDynP(:) ! Instantaneous second order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) REAL(ReKi), intent( out ) :: AllOuts(MaxSeaStOutputs) INTEGER(IntKi), intent( out ) :: ErrStat ! Error status of the operation CHARACTER(*), intent( out ) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -465,8 +465,7 @@ subroutine SeaStOut_MapOutputs( CurrentTime, p, NWaveElev, WaveElev, WaveElev1, integer :: I, iBody, startIndx, endIndx integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - real(ReKi) :: rotdisp(3) - + ErrStat = ErrID_None ErrMsg = "" diff --git a/modules/seastate/src/Waves.txt b/modules/seastate/src/Waves.txt index 02a51feffd..1eb0228922 100644 --- a/modules/seastate/src/Waves.txt +++ b/modules/seastate/src/Waves.txt @@ -46,8 +46,8 @@ typedef ^ ^ INTEGER WaveSeed typedef ^ ^ INTEGER WaveStMod - - - "Model for stretching incident wave kinematics to instantaneous free surface {0: none=no stretching, 1: vertical stretching, 2: extrapolation stretching, 3: Wheeler stretching}" - typedef ^ ^ DbKi WaveTMax - - - "Analysis time for incident wave calculations; the actual analysis time may be larger than this value in order for the maintain an effecient FFT" (sec) typedef ^ ^ SiKi WaveTp - - - "Peak spectral period of incident waves" (sec) -typedef ^ ^ SiKi WtrDens - - - "Water density" (kg/m^3) -typedef ^ ^ SiKi WtrDpth - - - "Water depth" (meters) +typedef ^ ^ ReKi WtrDens - - - "Water density" (kg/m^3) +typedef ^ ^ ReKi WtrDpth - - - "Water depth" (meters) typedef ^ ^ INTEGER NWaveElev - - - "Number of points where the incident wave elevations are computed (the XY grid point locations)" - typedef ^ ^ SiKi WaveElevxi {:} - - "xi-coordinates for points where the incident wave elevations can be output" (meters) typedef ^ ^ SiKi WaveElevyi {:} - - "yi-coordinates for points where the incident wave elevations can be output" (meters) diff --git a/modules/seastate/src/seastate_Interp.f90 b/modules/seastate/src/seastate_Interp.f90 index b1e2169801..b18da622c5 100644 --- a/modules/seastate/src/seastate_Interp.f90 +++ b/modules/seastate/src/seastate_Interp.f90 @@ -183,7 +183,7 @@ subroutine SetCartesianXYIndex(p, pZero, delta, nMax, Indx_Lo, Indx_Hi, isopc, E INTEGER(IntKi), INTENT(in ) :: nMax INTEGER(IntKi), intent(inout) :: Indx_Lo INTEGER(IntKi), intent(inout) :: Indx_Hi - real(ReKi), intent(inout) :: isopc + real(SiKi), intent(inout) :: isopc INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -235,7 +235,7 @@ subroutine SetCartesianZIndex(p, z_depth, delta, nMax, Indx_Lo, Indx_Hi, isopc, INTEGER(IntKi), INTENT(in ) :: nMax INTEGER(IntKi), intent(inout) :: Indx_Lo INTEGER(IntKi), intent(inout) :: Indx_Hi - real(ReKi), intent(inout) :: isopc + real(SiKi), intent(inout) :: isopc INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -288,7 +288,7 @@ subroutine SetTimeIndex(Time, deltaT, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, Er INTEGER(IntKi), INTENT(in ) :: nMax INTEGER(IntKi), intent(inout) :: Indx_Lo INTEGER(IntKi), intent(inout) :: Indx_Hi - real(ReKi), intent(inout) :: isopc + real(SiKi), intent(inout) :: isopc INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None From 046d0123f55f203df4378f770984ad0bb49895b8 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 14 Dec 2021 12:58:19 -0700 Subject: [PATCH 17/35] SeaState: fix case issue in file names for registry files --- modules/seastate/CMakeLists.txt | 4 ++-- .../seastate/src/{seastate_Interp.f90 => SeaState_Interp.f90} | 0 .../seastate/src/{seastate_Interp.txt => SeaState_Interp.txt} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename modules/seastate/src/{seastate_Interp.f90 => SeaState_Interp.f90} (100%) rename modules/seastate/src/{seastate_Interp.txt => SeaState_Interp.txt} (100%) diff --git a/modules/seastate/CMakeLists.txt b/modules/seastate/CMakeLists.txt index 2322dcac77..a507ab3845 100644 --- a/modules/seastate/CMakeLists.txt +++ b/modules/seastate/CMakeLists.txt @@ -18,7 +18,7 @@ if (GENERATE_TYPES) generate_f90_types(src/Current.txt ${CMAKE_CURRENT_LIST_DIR}/src/Current_Types.f90) generate_f90_types(src/Waves.txt ${CMAKE_CURRENT_LIST_DIR}/src/Waves_Types.f90) generate_f90_types(src/Waves2.txt ${CMAKE_CURRENT_LIST_DIR}/src/Waves2_Types.f90 -noextrap) - generate_f90_types(src/seastate_Interp.txt ${CMAKE_CURRENT_LIST_DIR}/src/SeaState_Interp_Types.f90 -noextrap) + generate_f90_types(src/SeaState_Interp.txt ${CMAKE_CURRENT_LIST_DIR}/src/SeaState_Interp_Types.f90 -noextrap) generate_f90_types(src/SeaState.txt ${CMAKE_CURRENT_LIST_DIR}/src/SeaState_Types.f90 -noextrap) endif() @@ -27,7 +27,7 @@ set(SEAST_SOURCES src/Waves.f90 src/Waves2.f90 src/UserWaves.f90 - src/seastate_Interp.f90 + src/SeaState_Interp.f90 src/SeaState_Input.f90 src/SeaState.f90 src/SeaState_Output.f90 diff --git a/modules/seastate/src/seastate_Interp.f90 b/modules/seastate/src/SeaState_Interp.f90 similarity index 100% rename from modules/seastate/src/seastate_Interp.f90 rename to modules/seastate/src/SeaState_Interp.f90 diff --git a/modules/seastate/src/seastate_Interp.txt b/modules/seastate/src/SeaState_Interp.txt similarity index 100% rename from modules/seastate/src/seastate_Interp.txt rename to modules/seastate/src/SeaState_Interp.txt From ec0458d4d074407a10f106f2671644697c3d1a40 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 14 Dec 2021 13:06:56 -0700 Subject: [PATCH 18/35] SeaState: regenerate Types files with -noextrap flags HD_Types -- some registry file dependencies not used now FAST_Types -- some registry file dependencies not used now SeaState_Types -- -noextrap flag Waves_Types -- -noextrap flag Waves2_Types -- -noextrap flag --- modules/hydrodyn/src/HydroDyn_Types.f90 | 7 - modules/openfast-library/src/FAST_Types.f90 | 11 - modules/seastate/src/SeaState_Types.f90 | 326 -------------------- modules/seastate/src/Waves2_Types.f90 | 310 ------------------- modules/seastate/src/Waves_Types.f90 | 8 +- 5 files changed, 4 insertions(+), 658 deletions(-) diff --git a/modules/hydrodyn/src/HydroDyn_Types.f90 b/modules/hydrodyn/src/HydroDyn_Types.f90 index e026cc05ec..b731715e6b 100644 --- a/modules/hydrodyn/src/HydroDyn_Types.f90 +++ b/modules/hydrodyn/src/HydroDyn_Types.f90 @@ -31,16 +31,9 @@ !! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. MODULE HydroDyn_Types !--------------------------------------------------------------------------------------------------------------------------------- -USE Conv_Radiation_Types -USE SS_Radiation_Types -USE SeaState_Interp_Types -USE SS_Excitation_Types USE WAMIT_Types USE WAMIT2_Types USE Morison_Types -USE Current_Types -USE Waves_Types -USE Waves2_Types USE SeaState_Types USE NWTC_Library IMPLICIT NONE diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index 423e809baf..6c9478a2cd 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -38,17 +38,6 @@ MODULE FAST_Types USE AeroDyn14_Types USE AeroDyn_Types USE SubDyn_Types -USE Current_Types -USE Waves_Types -USE Waves2_Types -USE SeaState_Interp_Types -USE SeaState_Types -USE Conv_Radiation_Types -USE SS_Radiation_Types -USE SS_Excitation_Types -USE WAMIT_Types -USE WAMIT2_Types -USE Morison_Types USE HydroDyn_Types USE IceFloe_Types USE OpenFOAM_Types diff --git a/modules/seastate/src/SeaState_Types.f90 b/modules/seastate/src/SeaState_Types.f90 index b51c960fa8..66e199ade6 100644 --- a/modules/seastate/src/SeaState_Types.f90 +++ b/modules/seastate/src/SeaState_Types.f90 @@ -6052,331 +6052,5 @@ SUBROUTINE SeaSt_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END SUBROUTINE SeaSt_UnPackOutput - - SUBROUTINE SeaSt_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time -! values of u (which has values associated with times in t). Order of the interpolation is given by the size of u -! -! expressions below based on either -! -! f(t) = a -! f(t) = a + b * t, or -! f(t) = a + b * t + c * t**2 -! -! where a, b and c are determined as the solution to -! f(t1) = u1, f(t2) = u2, f(t3) = u3 (as appropriate) -! -!.................................................................................................................................. - - TYPE(SeaSt_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 - REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Inputs - TYPE(SeaSt_InputType), INTENT(INOUT) :: u_out ! Input at tin_out - REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - INTEGER(IntKi) :: order ! order of polynomial fit (max 2) - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Input_ExtrapInterp' - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - if ( size(t) .ne. size(u)) then - CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(u)',ErrStat,ErrMsg,RoutineName) - RETURN - endif - order = SIZE(u) - 1 - IF ( order .eq. 0 ) THEN - CALL SeaSt_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE IF ( order .eq. 1 ) THEN - CALL SeaSt_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE IF ( order .eq. 2 ) THEN - CALL SeaSt_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE - CALL SetErrStat(ErrID_Fatal,'size(u) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) - RETURN - ENDIF - END SUBROUTINE SeaSt_Input_ExtrapInterp - - - SUBROUTINE SeaSt_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time -! values of u (which has values associated with times in t). Order of the interpolation is 1. -! -! f(t) = a + b * t, or -! -! where a and b are determined as the solution to -! f(t1) = u1, f(t2) = u2 -! -!.................................................................................................................................. - - TYPE(SeaSt_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 - TYPE(SeaSt_InputType), INTENT(IN) :: u2 ! Input at t2 - REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Inputs - TYPE(SeaSt_InputType), INTENT(INOUT) :: u_out ! Input at tin_out - REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - REAL(DbKi) :: t(2) ! Times associated with the Inputs - REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Input_ExtrapInterp1' - REAL(DbKi) :: b ! temporary for extrapolation/interpolation - REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - ! we'll subtract a constant from the times to resolve some - ! numerical issues when t gets large (and to simplify the equations) - t = tin - tin(1) - t_out = tin_out - tin(1) - - IF ( EqualRealNos( t(1), t(2) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - - ScaleFactor = t_out / t(2) - b = -(u1%DummyInput - u2%DummyInput) - u_out%DummyInput = u1%DummyInput + b * ScaleFactor - END SUBROUTINE SeaSt_Input_ExtrapInterp1 - - - SUBROUTINE SeaSt_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time -! values of u (which has values associated with times in t). Order of the interpolation is 2. -! -! expressions below based on either -! -! f(t) = a + b * t + c * t**2 -! -! where a, b and c are determined as the solution to -! f(t1) = u1, f(t2) = u2, f(t3) = u3 -! -!.................................................................................................................................. - - TYPE(SeaSt_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 - TYPE(SeaSt_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 - TYPE(SeaSt_InputType), INTENT(IN) :: u3 ! Input at t3 - REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Inputs - TYPE(SeaSt_InputType), INTENT(INOUT) :: u_out ! Input at tin_out - REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - REAL(DbKi) :: t(3) ! Times associated with the Inputs - REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - INTEGER(IntKi) :: order ! order of polynomial fit (max 2) - REAL(DbKi) :: b ! temporary for extrapolation/interpolation - REAL(DbKi) :: c ! temporary for extrapolation/interpolation - REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Input_ExtrapInterp2' - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - ! we'll subtract a constant from the times to resolve some - ! numerical issues when t gets large (and to simplify the equations) - t = tin - tin(1) - t_out = tin_out - tin(1) - - IF ( EqualRealNos( t(1), t(2) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - - ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) - b = (t(3)**2*(u1%DummyInput - u2%DummyInput) + t(2)**2*(-u1%DummyInput + u3%DummyInput))* scaleFactor - c = ( (t(2)-t(3))*u1%DummyInput + t(3)*u2%DummyInput - t(2)*u3%DummyInput ) * scaleFactor - u_out%DummyInput = u1%DummyInput + b + c * t_out - END SUBROUTINE SeaSt_Input_ExtrapInterp2 - - - SUBROUTINE SeaSt_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time -! values of y (which has values associated with times in t). Order of the interpolation is given by the size of y -! -! expressions below based on either -! -! f(t) = a -! f(t) = a + b * t, or -! f(t) = a + b * t + c * t**2 -! -! where a, b and c are determined as the solution to -! f(t1) = y1, f(t2) = y2, f(t3) = y3 (as appropriate) -! -!.................................................................................................................................. - - TYPE(SeaSt_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 - REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Outputs - TYPE(SeaSt_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out - REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - INTEGER(IntKi) :: order ! order of polynomial fit (max 2) - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Output_ExtrapInterp' - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - if ( size(t) .ne. size(y)) then - CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(y)',ErrStat,ErrMsg,RoutineName) - RETURN - endif - order = SIZE(y) - 1 - IF ( order .eq. 0 ) THEN - CALL SeaSt_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE IF ( order .eq. 1 ) THEN - CALL SeaSt_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE IF ( order .eq. 2 ) THEN - CALL SeaSt_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE - CALL SetErrStat(ErrID_Fatal,'size(y) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) - RETURN - ENDIF - END SUBROUTINE SeaSt_Output_ExtrapInterp - - - SUBROUTINE SeaSt_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time -! values of y (which has values associated with times in t). Order of the interpolation is 1. -! -! f(t) = a + b * t, or -! -! where a and b are determined as the solution to -! f(t1) = y1, f(t2) = y2 -! -!.................................................................................................................................. - - TYPE(SeaSt_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 - TYPE(SeaSt_OutputType), INTENT(IN) :: y2 ! Output at t2 - REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Outputs - TYPE(SeaSt_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out - REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - REAL(DbKi) :: t(2) ! Times associated with the Outputs - REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Output_ExtrapInterp1' - REAL(DbKi) :: b ! temporary for extrapolation/interpolation - REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts - INTEGER :: i1 ! dim1 counter variable for arrays - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - ! we'll subtract a constant from the times to resolve some - ! numerical issues when t gets large (and to simplify the equations) - t = tin - tin(1) - t_out = tin_out - tin(1) - - IF ( EqualRealNos( t(1), t(2) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - - ScaleFactor = t_out / t(2) -IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN - DO i1 = LBOUND(y_out%WriteOutput,1),UBOUND(y_out%WriteOutput,1) - b = -(y1%WriteOutput(i1) - y2%WriteOutput(i1)) - y_out%WriteOutput(i1) = y1%WriteOutput(i1) + b * ScaleFactor - END DO -END IF ! check if allocated - CALL Waves2_Output_ExtrapInterp1( y1%Waves2, y2%Waves2, tin, y_out%Waves2, tin_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - END SUBROUTINE SeaSt_Output_ExtrapInterp1 - - - SUBROUTINE SeaSt_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time -! values of y (which has values associated with times in t). Order of the interpolation is 2. -! -! expressions below based on either -! -! f(t) = a + b * t + c * t**2 -! -! where a, b and c are determined as the solution to -! f(t1) = y1, f(t2) = y2, f(t3) = y3 -! -!.................................................................................................................................. - - TYPE(SeaSt_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 - TYPE(SeaSt_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 - TYPE(SeaSt_OutputType), INTENT(IN) :: y3 ! Output at t3 - REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Outputs - TYPE(SeaSt_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out - REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - REAL(DbKi) :: t(3) ! Times associated with the Outputs - REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - INTEGER(IntKi) :: order ! order of polynomial fit (max 2) - REAL(DbKi) :: b ! temporary for extrapolation/interpolation - REAL(DbKi) :: c ! temporary for extrapolation/interpolation - REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Output_ExtrapInterp2' - INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts - INTEGER :: i1 ! dim1 counter variable for arrays - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - ! we'll subtract a constant from the times to resolve some - ! numerical issues when t gets large (and to simplify the equations) - t = tin - tin(1) - t_out = tin_out - tin(1) - - IF ( EqualRealNos( t(1), t(2) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - - ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) -IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN - DO i1 = LBOUND(y_out%WriteOutput,1),UBOUND(y_out%WriteOutput,1) - b = (t(3)**2*(y1%WriteOutput(i1) - y2%WriteOutput(i1)) + t(2)**2*(-y1%WriteOutput(i1) + y3%WriteOutput(i1)))* scaleFactor - c = ( (t(2)-t(3))*y1%WriteOutput(i1) + t(3)*y2%WriteOutput(i1) - t(2)*y3%WriteOutput(i1) ) * scaleFactor - y_out%WriteOutput(i1) = y1%WriteOutput(i1) + b + c * t_out - END DO -END IF ! check if allocated - CALL Waves2_Output_ExtrapInterp2( y1%Waves2, y2%Waves2, y3%Waves2, tin, y_out%Waves2, tin_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - END SUBROUTINE SeaSt_Output_ExtrapInterp2 - END MODULE SeaState_Types !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/Waves2_Types.f90 b/modules/seastate/src/Waves2_Types.f90 index 99bc7eeb53..398c9aef2e 100644 --- a/modules/seastate/src/Waves2_Types.f90 +++ b/modules/seastate/src/Waves2_Types.f90 @@ -2693,315 +2693,5 @@ SUBROUTINE Waves2_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = Re_Xferred + 1 END SUBROUTINE Waves2_UnPackOutput - - SUBROUTINE Waves2_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time -! values of u (which has values associated with times in t). Order of the interpolation is given by the size of u -! -! expressions below based on either -! -! f(t) = a -! f(t) = a + b * t, or -! f(t) = a + b * t + c * t**2 -! -! where a, b and c are determined as the solution to -! f(t1) = u1, f(t2) = u2, f(t3) = u3 (as appropriate) -! -!.................................................................................................................................. - - TYPE(Waves2_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 - REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Inputs - TYPE(Waves2_InputType), INTENT(INOUT) :: u_out ! Input at tin_out - REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - INTEGER(IntKi) :: order ! order of polynomial fit (max 2) - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Input_ExtrapInterp' - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - if ( size(t) .ne. size(u)) then - CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(u)',ErrStat,ErrMsg,RoutineName) - RETURN - endif - order = SIZE(u) - 1 - IF ( order .eq. 0 ) THEN - CALL Waves2_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE IF ( order .eq. 1 ) THEN - CALL Waves2_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE IF ( order .eq. 2 ) THEN - CALL Waves2_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE - CALL SetErrStat(ErrID_Fatal,'size(u) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) - RETURN - ENDIF - END SUBROUTINE Waves2_Input_ExtrapInterp - - - SUBROUTINE Waves2_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time -! values of u (which has values associated with times in t). Order of the interpolation is 1. -! -! f(t) = a + b * t, or -! -! where a and b are determined as the solution to -! f(t1) = u1, f(t2) = u2 -! -!.................................................................................................................................. - - TYPE(Waves2_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 - TYPE(Waves2_InputType), INTENT(IN) :: u2 ! Input at t2 - REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Inputs - TYPE(Waves2_InputType), INTENT(INOUT) :: u_out ! Input at tin_out - REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - REAL(DbKi) :: t(2) ! Times associated with the Inputs - REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Input_ExtrapInterp1' - REAL(DbKi) :: b ! temporary for extrapolation/interpolation - REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - ! we'll subtract a constant from the times to resolve some - ! numerical issues when t gets large (and to simplify the equations) - t = tin - tin(1) - t_out = tin_out - tin(1) - - IF ( EqualRealNos( t(1), t(2) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - - ScaleFactor = t_out / t(2) - b = -(u1%DummyInput - u2%DummyInput) - u_out%DummyInput = u1%DummyInput + b * ScaleFactor - END SUBROUTINE Waves2_Input_ExtrapInterp1 - - - SUBROUTINE Waves2_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time -! values of u (which has values associated with times in t). Order of the interpolation is 2. -! -! expressions below based on either -! -! f(t) = a + b * t + c * t**2 -! -! where a, b and c are determined as the solution to -! f(t1) = u1, f(t2) = u2, f(t3) = u3 -! -!.................................................................................................................................. - - TYPE(Waves2_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 - TYPE(Waves2_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 - TYPE(Waves2_InputType), INTENT(IN) :: u3 ! Input at t3 - REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Inputs - TYPE(Waves2_InputType), INTENT(INOUT) :: u_out ! Input at tin_out - REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - REAL(DbKi) :: t(3) ! Times associated with the Inputs - REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - INTEGER(IntKi) :: order ! order of polynomial fit (max 2) - REAL(DbKi) :: b ! temporary for extrapolation/interpolation - REAL(DbKi) :: c ! temporary for extrapolation/interpolation - REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Input_ExtrapInterp2' - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - ! we'll subtract a constant from the times to resolve some - ! numerical issues when t gets large (and to simplify the equations) - t = tin - tin(1) - t_out = tin_out - tin(1) - - IF ( EqualRealNos( t(1), t(2) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - - ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) - b = (t(3)**2*(u1%DummyInput - u2%DummyInput) + t(2)**2*(-u1%DummyInput + u3%DummyInput))* scaleFactor - c = ( (t(2)-t(3))*u1%DummyInput + t(3)*u2%DummyInput - t(2)*u3%DummyInput ) * scaleFactor - u_out%DummyInput = u1%DummyInput + b + c * t_out - END SUBROUTINE Waves2_Input_ExtrapInterp2 - - - SUBROUTINE Waves2_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time -! values of y (which has values associated with times in t). Order of the interpolation is given by the size of y -! -! expressions below based on either -! -! f(t) = a -! f(t) = a + b * t, or -! f(t) = a + b * t + c * t**2 -! -! where a, b and c are determined as the solution to -! f(t1) = y1, f(t2) = y2, f(t3) = y3 (as appropriate) -! -!.................................................................................................................................. - - TYPE(Waves2_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 - REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Outputs - TYPE(Waves2_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out - REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - INTEGER(IntKi) :: order ! order of polynomial fit (max 2) - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Output_ExtrapInterp' - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - if ( size(t) .ne. size(y)) then - CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(y)',ErrStat,ErrMsg,RoutineName) - RETURN - endif - order = SIZE(y) - 1 - IF ( order .eq. 0 ) THEN - CALL Waves2_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE IF ( order .eq. 1 ) THEN - CALL Waves2_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE IF ( order .eq. 2 ) THEN - CALL Waves2_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ELSE - CALL SetErrStat(ErrID_Fatal,'size(y) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) - RETURN - ENDIF - END SUBROUTINE Waves2_Output_ExtrapInterp - - - SUBROUTINE Waves2_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time -! values of y (which has values associated with times in t). Order of the interpolation is 1. -! -! f(t) = a + b * t, or -! -! where a and b are determined as the solution to -! f(t1) = y1, f(t2) = y2 -! -!.................................................................................................................................. - - TYPE(Waves2_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 - TYPE(Waves2_OutputType), INTENT(IN) :: y2 ! Output at t2 - REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Outputs - TYPE(Waves2_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out - REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - REAL(DbKi) :: t(2) ! Times associated with the Outputs - REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Output_ExtrapInterp1' - REAL(DbKi) :: b ! temporary for extrapolation/interpolation - REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - ! we'll subtract a constant from the times to resolve some - ! numerical issues when t gets large (and to simplify the equations) - t = tin - tin(1) - t_out = tin_out - tin(1) - - IF ( EqualRealNos( t(1), t(2) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - - ScaleFactor = t_out / t(2) - b = -(y1%DummyOutput - y2%DummyOutput) - y_out%DummyOutput = y1%DummyOutput + b * ScaleFactor - END SUBROUTINE Waves2_Output_ExtrapInterp1 - - - SUBROUTINE Waves2_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) -! -! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time -! values of y (which has values associated with times in t). Order of the interpolation is 2. -! -! expressions below based on either -! -! f(t) = a + b * t + c * t**2 -! -! where a, b and c are determined as the solution to -! f(t1) = y1, f(t2) = y2, f(t3) = y3 -! -!.................................................................................................................................. - - TYPE(Waves2_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 - TYPE(Waves2_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 - TYPE(Waves2_OutputType), INTENT(IN) :: y3 ! Output at t3 - REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Outputs - TYPE(Waves2_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out - REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables - REAL(DbKi) :: t(3) ! Times associated with the Outputs - REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - INTEGER(IntKi) :: order ! order of polynomial fit (max 2) - REAL(DbKi) :: b ! temporary for extrapolation/interpolation - REAL(DbKi) :: c ! temporary for extrapolation/interpolation - REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation - INTEGER(IntKi) :: ErrStat2 ! local errors - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Output_ExtrapInterp2' - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - ! we'll subtract a constant from the times to resolve some - ! numerical issues when t gets large (and to simplify the equations) - t = tin - tin(1) - t_out = tin_out - tin(1) - - IF ( EqualRealNos( t(1), t(2) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN - CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - - ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) - b = (t(3)**2*(y1%DummyOutput - y2%DummyOutput) + t(2)**2*(-y1%DummyOutput + y3%DummyOutput))* scaleFactor - c = ( (t(2)-t(3))*y1%DummyOutput + t(3)*y2%DummyOutput - t(2)*y3%DummyOutput ) * scaleFactor - y_out%DummyOutput = y1%DummyOutput + b + c * t_out - END SUBROUTINE Waves2_Output_ExtrapInterp2 - END MODULE Waves2_Types !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/Waves_Types.f90 b/modules/seastate/src/Waves_Types.f90 index 2212da5015..3e73667b5c 100644 --- a/modules/seastate/src/Waves_Types.f90 +++ b/modules/seastate/src/Waves_Types.f90 @@ -63,8 +63,8 @@ MODULE Waves_Types INTEGER(IntKi) :: WaveStMod !< Model for stretching incident wave kinematics to instantaneous free surface {0: none=no stretching, 1: vertical stretching, 2: extrapolation stretching, 3: Wheeler stretching} [-] REAL(DbKi) :: WaveTMax !< Analysis time for incident wave calculations; the actual analysis time may be larger than this value in order for the maintain an effecient FFT [(sec)] REAL(SiKi) :: WaveTp !< Peak spectral period of incident waves [(sec)] - REAL(SiKi) :: WtrDens !< Water density [(kg/m^3)] - REAL(SiKi) :: WtrDpth !< Water depth [(meters)] + REAL(ReKi) :: WtrDens !< Water density [(kg/m^3)] + REAL(ReKi) :: WtrDpth !< Water depth [(meters)] INTEGER(IntKi) :: NWaveElev !< Number of points where the incident wave elevations are computed (the XY grid point locations) [-] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevxi !< xi-coordinates for points where the incident wave elevations can be output [(meters)] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevyi !< yi-coordinates for points where the incident wave elevations can be output [(meters)] @@ -795,9 +795,9 @@ SUBROUTINE Waves_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Db_Xferred = Db_Xferred + 1 OutData%WaveTp = REAL(ReKiBuf(Re_Xferred), SiKi) Re_Xferred = Re_Xferred + 1 - OutData%WtrDens = REAL(ReKiBuf(Re_Xferred), SiKi) + OutData%WtrDens = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 - OutData%WtrDpth = REAL(ReKiBuf(Re_Xferred), SiKi) + OutData%WtrDpth = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 OutData%NWaveElev = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 From fc92514b458387d025c01390656223d40c7bb05f Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Tue, 21 Dec 2021 09:10:54 -0700 Subject: [PATCH 19/35] Fixed broken WaveElevation data in Morison --- modules/hydrodyn/src/HydroDyn.f90 | 3 - modules/hydrodyn/src/HydroDyn_DriverCode.f90 | 3 - modules/hydrodyn/src/Morison.f90 | 24 +- modules/hydrodyn/src/Morison.txt | 2 - modules/hydrodyn/src/Morison_Types.f90 | 158 -------- modules/seastate/src/SeaState.f90 | 9 +- modules/seastate/src/SeaState.txt | 1 - modules/seastate/src/SeaState_DriverCode.f90 | 21 +- modules/seastate/src/SeaState_Types.f90 | 405 +++++++++++++++---- modules/seastate/src/Waves2.txt | 2 +- modules/seastate/src/Waves2_Types.f90 | 325 ++++++++++++++- 11 files changed, 690 insertions(+), 263 deletions(-) diff --git a/modules/hydrodyn/src/HydroDyn.f90 b/modules/hydrodyn/src/HydroDyn.f90 index af2c6c66af..b8974e7f76 100644 --- a/modules/hydrodyn/src/HydroDyn.f90 +++ b/modules/hydrodyn/src/HydroDyn.f90 @@ -803,7 +803,6 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I InputFileData%Morison%WaveAcc => InitInp%WaveAcc InputFileData%Morison%WaveDynP => InitInp%WaveDynP InputFileData%Morison%WaveVel => InitInp%WaveVel - InputFileData%Morison%WaveElev => InitInp%WaveElev InputFileData%Morison%WaveElev1 => InitInp%WaveElev1 InputFileData%Morison%WaveElev2 => InitInp%WaveElev2 ! CALL MOVE_ALLOC( Waves_InitOut%nodeInWater,InputFileData%Morison%nodeInWater ) ! moved to Morison%p%nodeInWater in the init routine @@ -1209,7 +1208,6 @@ SUBROUTINE CleanUp() nullify(InputFileData%Morison%WaveAcc) nullify(InputFileData%Morison%WaveVel) nullify(InputFileData%Morison%WaveTime) - nullify(InputFileData%Morison%WaveElev) nullify(InputFileData%Morison%WaveElev1) nullify(InputFileData%Morison%WaveElev2) nullify(InputFileData%WAMIT%WaveElevC0) @@ -1280,7 +1278,6 @@ SUBROUTINE HydroDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) nullify(p%Morison%WaveDynP) nullify(p%Morison%WaveAcc) nullify(p%Morison%WaveVel) - nullify(p%Morison%WaveElev) nullify(p%Morison%WaveElev1) nullify(p%Morison%WaveElev2) do i = 1,p%NBody diff --git a/modules/hydrodyn/src/HydroDyn_DriverCode.f90 b/modules/hydrodyn/src/HydroDyn_DriverCode.f90 index 0da07adfc7..f9e4240eac 100644 --- a/modules/hydrodyn/src/HydroDyn_DriverCode.f90 +++ b/modules/hydrodyn/src/HydroDyn_DriverCode.f90 @@ -279,7 +279,6 @@ PROGRAM HydroDynDriver InitInData%WaveElevC0 => InitOutData_SeaSt%WaveElevC0 CALL MOVE_ALLOC( InitOutData_SeaSt%WaveElevC, InitInData%WaveElevC ) InitInData%WaveDirArr => InitOutData_SeaSt%WaveDirArr - InitInData%WaveElev => InitOutData_SeaSt%WaveElev InitInData%WaveElev1 => InitOutData_SeaSt%WaveElev1 InitInData%WaveElev2 => InitOutData_SeaSt%WaveElev2 @@ -290,7 +289,6 @@ PROGRAM HydroDynDriver nullify(InitOutData_SeaSt%WaveTime) nullify(InitOutData_SeaSt%WaveElevC0) nullify(InitOutData_SeaSt%WaveDirArr) - nullify(InitOutData_SeaSt%WaveElev) nullify(InitOutData_SeaSt%WaveElev1) nullify(InitOutData_SeaSt%WaveElev2) @@ -392,7 +390,6 @@ PROGRAM HydroDynDriver nullify(InitInData%WaveAcc) nullify(InitInData%WaveVel) nullify(InitInData%WaveTime) - nullify(InitInData%WaveElev) nullify(InitInData%WaveElev1) nullify(InitInData%WaveElev2) diff --git a/modules/hydrodyn/src/Morison.f90 b/modules/hydrodyn/src/Morison.f90 index c5393d4f2e..f0cce36f87 100644 --- a/modules/hydrodyn/src/Morison.f90 +++ b/modules/hydrodyn/src/Morison.f90 @@ -1889,7 +1889,11 @@ SUBROUTINE Morison_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In p%OutSwtch = InitInp%OutSwtch p%MSL2SWL = InitInp%MSL2SWL p%WaveDisp = InitInp%WaveDisp - + p%WaveElev1 => InitInp%WaveElev1 + if (associated(InitInp%WaveElev2)) then + p%WaveElev2 => InitInp%WaveElev2 + end if + ALLOCATE ( p%MOutLst(p%NMOutputs), STAT = errStat ) IF ( errStat /= ErrID_None ) THEN errMsg = ' Error allocating space for MOutLst array.' @@ -2282,6 +2286,9 @@ SUBROUTINE AllocateNodeLoadVariables(InitInp, p, m, NNodes, errStat, errMsg ) call AllocAry( m%FV , 3, NNodes , 'm%FV' , errStat2, errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, routineName) call AllocAry( m%FA , 3, NNodes , 'm%FA' , errStat2, errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, routineName) call AllocAry( m%FDynP , NNodes , 'm%FDynP' , errStat2, errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, routineName) + call AllocAry( m%WaveElev , NNodes , 'm%WaveElev' , errStat2, errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, routineName) + call AllocAry( m%WaveElev1 , NNodes , 'm%WaveElev1' , errStat2, errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, routineName) + call AllocAry( m%WaveElev2 , NNodes , 'm%WaveElev2' , errStat2, errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, routineName) call AllocAry( p%An_End , 3, p%NJoints, 'p%An_End' , errStat2, errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, routineName) call AllocAry( p%DragConst_End, p%NJoints, 'p%DragConst_End', errStat2, errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, routineName) call AllocAry( m%F_I_End , 3, p%NJoints, 'm%F_I_End' , errStat2, errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, routineName) @@ -2384,7 +2391,6 @@ SUBROUTINE Morison_End( u, p, x, xd, z, OtherState, y, m, errStat, errMsg ) nullify(p%WaveDynP) nullify(p%WaveAcc) nullify(p%WaveVel) - nullify(p%WaveElev) nullify(p%WaveElev1) nullify(p%WaveElev2) CALL Morison_DestroyParam( p, errStat, errMsg ) @@ -2605,7 +2611,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, real(ReKi) :: a_s2(3) real(ReKi) :: alpha_s2(3) real(ReKi) :: omega_s2(3) - real(ReKi) :: pos1(3), pos2(3) + real(ReKi) :: pos1(3), pos2(3), positionXY(2) real(ReKi) :: Imat(3,3) real(ReKi) :: iArm(3), iTerm(3), Ioffset, h_c, dRdl_p, dRdl_pp, f_hydro(3), Am(3,3), lstar, deltal real(ReKi) :: C_1, C_2, a0b0, z1d, z2d, h @@ -2647,6 +2653,18 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) m%FDynP(j) = SeaSt_Interp_4D ( p%WaveDynP, m%seast_interp_m, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaState_CalcOutput' ) + + positionXY = (/pos1(1),pos1(2)/) + m%WaveElev1(j) = SeaSt_Interp_3D( Time, positionXY, p%WaveElev1, p%seast_interp_p, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) + + if (associated(p%WaveElev2)) then + m%WaveElev2(j) = SeaSt_Interp_3D( Time, positionXY, p%WaveElev2, p%seast_interp_p, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) + m%WaveElev(j) = m%WaveElev1(j) + m%WaveElev2(j) + else + m%WaveElev(j) = m%WaveElev1(j) + end if else m%FV(:,j) = 0.0 m%FA(:,j) = 0.0 diff --git a/modules/hydrodyn/src/Morison.txt b/modules/hydrodyn/src/Morison.txt index 1bc9039c3b..1e1175e271 100644 --- a/modules/hydrodyn/src/Morison.txt +++ b/modules/hydrodyn/src/Morison.txt @@ -253,7 +253,6 @@ typedef ^ ^ CHARACTER(1 typedef ^ ^ INTEGER UnOutFile - - - "" - typedef ^ ^ INTEGER UnSum - - - "" - typedef ^ ^ INTEGER NStepWave - - - "" - -typedef ^ ^ SiKi WaveElev {*}{*}{*} - - "Total wave elevation" - typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" - typedef ^ ^ SiKi WaveElev2 {*}{*}{*} - - "Second order wave elevation" - typedef ^ ^ SiKi WaveAcc {*}{*}{*}{*}{*} - - "" - @@ -342,7 +341,6 @@ typedef ^ ^ ReKi typedef ^ ^ ReKi DP_Const_End {:}{:} - - "Constant part of Joint dynamic pressure term" N typedef ^ ^ ReKi Mass_MG_End {:} - - "Joint marine growth mass" kg typedef ^ ^ ReKi AM_End {:}{:}{:} - - "3x3 Joint added mass matrix, constant for all t" N -typedef ^ ^ SiKi WaveElev {*}{*}{*} - - "Total wave elevation" m typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" m typedef ^ ^ SiKi WaveElev2 {*}{*}{*} - - "Second order wave elevation" m typedef ^ ^ SiKi WaveVel {*}{*}{*}{*}{*} - - "" - diff --git a/modules/hydrodyn/src/Morison_Types.f90 b/modules/hydrodyn/src/Morison_Types.f90 index d75a7d101a..0715c65c4b 100644 --- a/modules/hydrodyn/src/Morison_Types.f90 +++ b/modules/hydrodyn/src/Morison_Types.f90 @@ -316,7 +316,6 @@ MODULE Morison_Types INTEGER(IntKi) :: UnOutFile !< [-] INTEGER(IntKi) :: UnSum !< [-] INTEGER(IntKi) :: NStepWave !< [-] - REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev => NULL() !< Total wave elevation [-] REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [-] REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev2 => NULL() !< Second order wave elevation [-] REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveAcc => NULL() !< [-] @@ -393,7 +392,6 @@ MODULE Morison_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DP_Const_End !< Constant part of Joint dynamic pressure term [N] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Mass_MG_End !< Joint marine growth mass [kg] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: AM_End !< 3x3 Joint added mass matrix, constant for all t [N] - REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev => NULL() !< Total wave elevation [m] REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [m] REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev2 => NULL() !< Second order wave elevation [m] REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveVel => NULL() !< [-] @@ -6131,22 +6129,6 @@ SUBROUTINE Morison_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, DstInitInputData%UnOutFile = SrcInitInputData%UnOutFile DstInitInputData%UnSum = SrcInitInputData%UnSum DstInitInputData%NStepWave = SrcInitInputData%NStepWave -IF (ASSOCIATED(SrcInitInputData%WaveElev)) THEN - i1_l = LBOUND(SrcInitInputData%WaveElev,1) - i1_u = UBOUND(SrcInitInputData%WaveElev,1) - i2_l = LBOUND(SrcInitInputData%WaveElev,2) - i2_u = UBOUND(SrcInitInputData%WaveElev,2) - i3_l = LBOUND(SrcInitInputData%WaveElev,3) - i3_u = UBOUND(SrcInitInputData%WaveElev,3) - IF (.NOT. ASSOCIATED(DstInitInputData%WaveElev)) THEN - ALLOCATE(DstInitInputData%WaveElev(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%WaveElev.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitInputData%WaveElev = SrcInitInputData%WaveElev -ENDIF IF (ASSOCIATED(SrcInitInputData%WaveElev1)) THEN i1_l = LBOUND(SrcInitInputData%WaveElev1,1) i1_u = UBOUND(SrcInitInputData%WaveElev1,1) @@ -6346,10 +6328,6 @@ SUBROUTINE Morison_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitInputData%ValidOutList)) THEN DEALLOCATE(InitInputData%ValidOutList) ENDIF -IF (ASSOCIATED(InitInputData%WaveElev)) THEN - DEALLOCATE(InitInputData%WaveElev) - InitInputData%WaveElev => NULL() -ENDIF IF (ASSOCIATED(InitInputData%WaveElev1)) THEN DEALLOCATE(InitInputData%WaveElev1) InitInputData%WaveElev1 => NULL() @@ -6712,11 +6690,6 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_BufSz = Int_BufSz + 1 ! UnOutFile Int_BufSz = Int_BufSz + 1 ! UnSum Int_BufSz = Int_BufSz + 1 ! NStepWave - Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no - IF ( ASSOCIATED(InData%WaveElev) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveElev upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev - END IF Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no IF ( ASSOCIATED(InData%WaveElev1) ) THEN Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension @@ -7344,31 +7317,6 @@ SUBROUTINE Morison_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NStepWave Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ASSOCIATED(InData%WaveElev) ) 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%WaveElev,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,2) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,3) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,3) - Int_Xferred = Int_Xferred + 2 - - DO i3 = LBOUND(InData%WaveElev,3), UBOUND(InData%WaveElev,3) - DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) - DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) - ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -8333,34 +8281,6 @@ SUBROUTINE Morison_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Xferred = Int_Xferred + 1 OutData%NStepWave = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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 - i3_l = IntKiBuf( Int_Xferred ) - i3_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%WaveElev)) DEALLOCATE(OutData%WaveElev) - ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i3 = LBOUND(OutData%WaveElev,3), UBOUND(OutData%WaveElev,3) - DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) - DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) - OutData%WaveElev(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -10697,22 +10617,6 @@ SUBROUTINE Morison_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, Err END IF DstParamData%AM_End = SrcParamData%AM_End ENDIF -IF (ASSOCIATED(SrcParamData%WaveElev)) THEN - i1_l = LBOUND(SrcParamData%WaveElev,1) - i1_u = UBOUND(SrcParamData%WaveElev,1) - i2_l = LBOUND(SrcParamData%WaveElev,2) - i2_u = UBOUND(SrcParamData%WaveElev,2) - i3_l = LBOUND(SrcParamData%WaveElev,3) - i3_u = UBOUND(SrcParamData%WaveElev,3) - IF (.NOT. ASSOCIATED(DstParamData%WaveElev)) THEN - ALLOCATE(DstParamData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstParamData%WaveElev = SrcParamData%WaveElev -ENDIF IF (ASSOCIATED(SrcParamData%WaveElev1)) THEN i1_l = LBOUND(SrcParamData%WaveElev1,1) i1_u = UBOUND(SrcParamData%WaveElev1,1) @@ -10928,10 +10832,6 @@ SUBROUTINE Morison_DestroyParam( ParamData, ErrStat, ErrMsg ) IF (ALLOCATED(ParamData%AM_End)) THEN DEALLOCATE(ParamData%AM_End) ENDIF -IF (ASSOCIATED(ParamData%WaveElev)) THEN - DEALLOCATE(ParamData%WaveElev) - ParamData%WaveElev => NULL() -ENDIF IF (ASSOCIATED(ParamData%WaveElev1)) THEN DEALLOCATE(ParamData%WaveElev1) ParamData%WaveElev1 => NULL() @@ -11083,11 +10983,6 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 2*3 ! AM_End upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%AM_End) ! AM_End END IF - Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no - IF ( ASSOCIATED(InData%WaveElev) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveElev upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev - END IF Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no IF ( ASSOCIATED(InData%WaveElev1) ) THEN Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension @@ -11445,31 +11340,6 @@ SUBROUTINE Morison_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END DO END DO END IF - IF ( .NOT. ASSOCIATED(InData%WaveElev) ) 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%WaveElev,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,2) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,3) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,3) - Int_Xferred = Int_Xferred + 2 - - DO i3 = LBOUND(InData%WaveElev,3), UBOUND(InData%WaveElev,3) - DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) - DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) - ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -12100,34 +11970,6 @@ SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er END DO END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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 - i3_l = IntKiBuf( Int_Xferred ) - i3_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%WaveElev)) DEALLOCATE(OutData%WaveElev) - ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i3 = LBOUND(OutData%WaveElev,3), UBOUND(OutData%WaveElev,3) - DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) - DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) - OutData%WaveElev(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 not allocated Int_Xferred = Int_Xferred + 1 ELSE diff --git a/modules/seastate/src/SeaState.f90 b/modules/seastate/src/SeaState.f90 index 6951383fe0..826ca4745d 100644 --- a/modules/seastate/src/SeaState.f90 +++ b/modules/seastate/src/SeaState.f90 @@ -847,12 +847,13 @@ SUBROUTINE SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init ! If we calculated wave elevations, it is now stored in p%WaveElev. So we need to add the corrections. IF (p%Waves2%NWaveElev > 0 ) THEN ! Make sure the sizes of the two resulting arrays are identical... - IF ( SIZE(p%WaveElev,DIM=1) /= SIZE(p%Waves2%WaveElev2,DIM=1) .OR. & - SIZE(p%WaveElev,DIM=2) /= SIZE(p%Waves2%WaveElev2,DIM=2)) THEN + IF ( SIZE(p%WaveElev1,DIM=1) /= SIZE(p%Waves2%WaveElev2,DIM=1) .OR. & + SIZE(p%WaveElev1,DIM=2) /= SIZE(p%Waves2%WaveElev2,DIM=2)) THEN CALL SetErrStat(ErrID_Fatal,' WaveElev(NWaveElev) arrays for first and second order wave elevations are of different sizes.',ErrStat,ErrMsg,RoutineName) CALL CleanUp() RETURN - !ELSE + ELSE + InitOut%WaveElev2 => p%Waves2%WaveElev2 ! ! do k = 1, p%NGrid(2) ! do J=1, p%NGrid(1) @@ -1459,7 +1460,7 @@ SUBROUTINE SeaSt_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er WaveElev1(i) = SeaSt_Interp_3D( Time, positionXY, p%WaveElev1, p%seast_interp_p, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) - if (allocated(p%Waves2%WaveElev2)) then + if (associated(p%Waves2%WaveElev2)) then WaveElev2(i) = SeaSt_Interp_3D( Time, positionXY, p%Waves2%WaveElev2, p%seast_interp_p, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) WaveElev(i) = WaveElev1(i) + WaveElev2(i) diff --git a/modules/seastate/src/SeaState.txt b/modules/seastate/src/SeaState.txt index 3143f153c6..abcac618dc 100644 --- a/modules/seastate/src/SeaState.txt +++ b/modules/seastate/src/SeaState.txt @@ -91,7 +91,6 @@ typedef ^ ^ SiKi WaveVel #typedef ^ ^ SiKi PWaveDynP0 {*}{*}{*}{*} - - "Instantaneous dynamic pressure of incident waves , at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (N/m^2) #typedef ^ ^ SiKi PWaveAcc0 {*}{*}{*}{*}{*} - - "Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed" (m/s^2) #typedef ^ ^ SiKi PWaveVel0 {*}{*}{*}{*}{*} - - "Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at the location (xi,yi,0), at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.)" (m/s) -typedef ^ ^ SiKi WaveElev {*}{*}{*} - - "Total wave elevation" - typedef ^ ^ SiKi WaveElev1 {*}{*}{*} - - "First order wave elevation" - typedef ^ ^ SiKi WaveElev2 {*}{*}{*} - - "Second order wave elevation" - typedef ^ ^ SiKi WaveElev0 {:} - - "Instantaneous elevation time-series of incident waves at the platform reference point" (meters) diff --git a/modules/seastate/src/SeaState_DriverCode.f90 b/modules/seastate/src/SeaState_DriverCode.f90 index a772d1faa7..1ab006c240 100644 --- a/modules/seastate/src/SeaState_DriverCode.f90 +++ b/modules/seastate/src/SeaState_DriverCode.f90 @@ -227,6 +227,17 @@ program SeaStateDriver end if + ! Nullify these pointers because they are no longer needed + nullify(InitOutData%WaveDynP) + nullify(InitOutData%WaveAcc) + nullify(InitOutData%WaveVel) + nullify(InitOutData%WaveTime) + !nullify(InitOutData%WaveElevC0) + !nullify(InitOutData%WaveDirArr) + nullify(InitOutData%WaveElev) + nullify(InitOutData%WaveElev1) + nullify(InitOutData%WaveElev2) + ! Destroy initialization data call SeaSt_DestroyInitInput( InitInData, ErrStat, ErrMsg ) @@ -654,6 +665,7 @@ SUBROUTINE WaveElevGrid_Output (drvrInitInp, SeaStateInitInp, SeaStateInitOut, S character(1024) :: WaveElevFileName !< Name for the output file for the wave elevation series character(128) :: WaveElevFmt !< Format specifier for the output file for wave elevation series real(ReKi) :: xpos, ypos + real(SiKi) :: WaveElev integer(IntKi) :: i,j,k WaveElevFmt = "(F14.7,3x,F14.7,3x,F14.7)" @@ -700,8 +712,13 @@ SUBROUTINE WaveElevGrid_Output (drvrInitInp, SeaStateInitInp, SeaStateInitOut, S do j=1,SeaState_p%NGrid(1) xpos = -SeaState_p%deltaGrid(1)*(SeaState_p%NGrid(1)-1)/2.0 + (J-1)*SeaState_p%deltaGrid(1) do k=1, SeaState_p%NGrid(2) - ypos = -SeaState_p%deltaGrid(2)*(SeaState_p%NGrid(2)-1)/2.0 + (K-1)*SeaState_p%deltaGrid(2) - write (WaveElevFileUn,WaveElevFmt, IOSTAT=ErrStatTmp ) xpos, ypos,SeaState_p%WaveElev(I,J,K) + ypos = -SeaState_p%deltaGrid(2)*(SeaState_p%NGrid(2)-1)/2.0 + (K-1)*SeaState_p%deltaGrid(2) + if (allocated(SeaState_p%Waves2%WaveElev2)) then + WaveElev = SeaState_p%WaveElev1(I,J,K) + SeaState_p%Waves2%WaveElev2(I,J,K) + else + WaveElev = SeaState_p%WaveElev1(I,J,K) + end if + write (WaveElevFileUn,WaveElevFmt, IOSTAT=ErrStatTmp ) xpos, ypos, WaveElev end do end do end do diff --git a/modules/seastate/src/SeaState_Types.f90 b/modules/seastate/src/SeaState_Types.f90 index 66e199ade6..3590e95ed6 100644 --- a/modules/seastate/src/SeaState_Types.f90 +++ b/modules/seastate/src/SeaState_Types.f90 @@ -108,7 +108,6 @@ MODULE SeaState_Types REAL(SiKi) , DIMENSION(:,:,:,:), POINTER :: WaveDynP => NULL() !< Instantaneous dynamic pressure of incident waves , accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed [(N/m^2)] REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveAcc => NULL() !< Instantaneous acceleration of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed [(m/s^2)] REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: WaveVel => NULL() !< Instantaneous velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, accounting for stretching, at each of the NWaveKin (grid) points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.) [(m/s)] - REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev => NULL() !< Total wave elevation [-] REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev1 => NULL() !< First order wave elevation [-] REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev2 => NULL() !< Second order wave elevation [-] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElev0 !< Instantaneous elevation time-series of incident waves at the platform reference point [(meters)] @@ -1624,22 +1623,6 @@ SUBROUTINE SeaSt_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WaveVel = SrcInitOutputData%WaveVel ENDIF -IF (ASSOCIATED(SrcInitOutputData%WaveElev)) THEN - i1_l = LBOUND(SrcInitOutputData%WaveElev,1) - i1_u = UBOUND(SrcInitOutputData%WaveElev,1) - i2_l = LBOUND(SrcInitOutputData%WaveElev,2) - i2_u = UBOUND(SrcInitOutputData%WaveElev,2) - i3_l = LBOUND(SrcInitOutputData%WaveElev,3) - i3_u = UBOUND(SrcInitOutputData%WaveElev,3) - IF (.NOT. ASSOCIATED(DstInitOutputData%WaveElev)) THEN - ALLOCATE(DstInitOutputData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WaveElev.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitOutputData%WaveElev = SrcInitOutputData%WaveElev -ENDIF IF (ASSOCIATED(SrcInitOutputData%WaveElev1)) THEN i1_l = LBOUND(SrcInitOutputData%WaveElev1,1) i1_u = UBOUND(SrcInitOutputData%WaveElev1,1) @@ -1759,10 +1742,6 @@ SUBROUTINE SeaSt_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) DEALLOCATE(InitOutputData%WaveVel) InitOutputData%WaveVel => NULL() ENDIF -IF (ASSOCIATED(InitOutputData%WaveElev)) THEN - DEALLOCATE(InitOutputData%WaveElev) - InitOutputData%WaveElev => NULL() -ENDIF IF (ASSOCIATED(InitOutputData%WaveElev1)) THEN DEALLOCATE(InitOutputData%WaveElev1) InitOutputData%WaveElev1 => NULL() @@ -1904,11 +1883,6 @@ SUBROUTINE SeaSt_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_BufSz = Int_BufSz + 2*5 ! WaveVel upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveVel) ! WaveVel END IF - Int_BufSz = Int_BufSz + 1 ! WaveElev allocated yes/no - IF ( ASSOCIATED(InData%WaveElev) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! WaveElev upper/lower bounds for each dimension - Re_BufSz = Re_BufSz + SIZE(InData%WaveElev) ! WaveElev - END IF Int_BufSz = Int_BufSz + 1 ! WaveElev1 allocated yes/no IF ( ASSOCIATED(InData%WaveElev1) ) THEN Int_BufSz = Int_BufSz + 2*3 ! WaveElev1 upper/lower bounds for each dimension @@ -2274,31 +2248,6 @@ SUBROUTINE SeaSt_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO END DO END IF - IF ( .NOT. ASSOCIATED(InData%WaveElev) ) 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%WaveElev,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,2) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%WaveElev,3) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WaveElev,3) - Int_Xferred = Int_Xferred + 2 - - DO i3 = LBOUND(InData%WaveElev,3), UBOUND(InData%WaveElev,3) - DO i2 = LBOUND(InData%WaveElev,2), UBOUND(InData%WaveElev,2) - DO i1 = LBOUND(InData%WaveElev,1), UBOUND(InData%WaveElev,1) - ReKiBuf(Re_Xferred) = InData%WaveElev(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF IF ( .NOT. ASSOCIATED(InData%WaveElev1) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -2807,34 +2756,6 @@ SUBROUTINE SeaSt_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, END DO END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev 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 - i3_l = IntKiBuf( Int_Xferred ) - i3_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ASSOCIATED(OutData%WaveElev)) DEALLOCATE(OutData%WaveElev) - ALLOCATE(OutData%WaveElev(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i3 = LBOUND(OutData%WaveElev,3), UBOUND(OutData%WaveElev,3) - DO i2 = LBOUND(OutData%WaveElev,2), UBOUND(OutData%WaveElev,2) - DO i1 = LBOUND(OutData%WaveElev,1), UBOUND(OutData%WaveElev,1) - OutData%WaveElev(i1,i2,i3) = REAL(ReKiBuf(Re_Xferred), SiKi) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO - END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElev1 not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -6052,5 +5973,331 @@ SUBROUTINE SeaSt_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END SUBROUTINE SeaSt_UnPackOutput + + SUBROUTINE SeaSt_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is given by the size of u +! +! expressions below based on either +! +! f(t) = a +! f(t) = a + b * t, or +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = u1, f(t2) = u2, f(t3) = u3 (as appropriate) +! +!.................................................................................................................................. + + TYPE(SeaSt_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 + REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Inputs + TYPE(SeaSt_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Input_ExtrapInterp' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + if ( size(t) .ne. size(u)) then + CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(u)',ErrStat,ErrMsg,RoutineName) + RETURN + endif + order = SIZE(u) - 1 + IF ( order .eq. 0 ) THEN + CALL SeaSt_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 1 ) THEN + CALL SeaSt_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 2 ) THEN + CALL SeaSt_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE + CALL SetErrStat(ErrID_Fatal,'size(u) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) + RETURN + ENDIF + END SUBROUTINE SeaSt_Input_ExtrapInterp + + + SUBROUTINE SeaSt_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is 1. +! +! f(t) = a + b * t, or +! +! where a and b are determined as the solution to +! f(t1) = u1, f(t2) = u2 +! +!.................................................................................................................................. + + TYPE(SeaSt_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 + TYPE(SeaSt_InputType), INTENT(IN) :: u2 ! Input at t2 + REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Inputs + TYPE(SeaSt_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(2) ! Times associated with the Inputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Input_ExtrapInterp1' + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / t(2) + b = -(u1%DummyInput - u2%DummyInput) + u_out%DummyInput = u1%DummyInput + b * ScaleFactor + END SUBROUTINE SeaSt_Input_ExtrapInterp1 + + + SUBROUTINE SeaSt_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is 2. +! +! expressions below based on either +! +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = u1, f(t2) = u2, f(t3) = u3 +! +!.................................................................................................................................. + + TYPE(SeaSt_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 + TYPE(SeaSt_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 + TYPE(SeaSt_InputType), INTENT(IN) :: u3 ! Input at t3 + REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Inputs + TYPE(SeaSt_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(3) ! Times associated with the Inputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: c ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Input_ExtrapInterp2' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) + b = (t(3)**2*(u1%DummyInput - u2%DummyInput) + t(2)**2*(-u1%DummyInput + u3%DummyInput))* scaleFactor + c = ( (t(2)-t(3))*u1%DummyInput + t(3)*u2%DummyInput - t(2)*u3%DummyInput ) * scaleFactor + u_out%DummyInput = u1%DummyInput + b + c * t_out + END SUBROUTINE SeaSt_Input_ExtrapInterp2 + + + SUBROUTINE SeaSt_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is given by the size of y +! +! expressions below based on either +! +! f(t) = a +! f(t) = a + b * t, or +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = y1, f(t2) = y2, f(t3) = y3 (as appropriate) +! +!.................................................................................................................................. + + TYPE(SeaSt_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 + REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Outputs + TYPE(SeaSt_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Output_ExtrapInterp' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + if ( size(t) .ne. size(y)) then + CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(y)',ErrStat,ErrMsg,RoutineName) + RETURN + endif + order = SIZE(y) - 1 + IF ( order .eq. 0 ) THEN + CALL SeaSt_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 1 ) THEN + CALL SeaSt_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 2 ) THEN + CALL SeaSt_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE + CALL SetErrStat(ErrID_Fatal,'size(y) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) + RETURN + ENDIF + END SUBROUTINE SeaSt_Output_ExtrapInterp + + + SUBROUTINE SeaSt_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is 1. +! +! f(t) = a + b * t, or +! +! where a and b are determined as the solution to +! f(t1) = y1, f(t2) = y2 +! +!.................................................................................................................................. + + TYPE(SeaSt_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 + TYPE(SeaSt_OutputType), INTENT(IN) :: y2 ! Output at t2 + REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Outputs + TYPE(SeaSt_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(2) ! Times associated with the Outputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Output_ExtrapInterp1' + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / t(2) +IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN + DO i1 = LBOUND(y_out%WriteOutput,1),UBOUND(y_out%WriteOutput,1) + b = -(y1%WriteOutput(i1) - y2%WriteOutput(i1)) + y_out%WriteOutput(i1) = y1%WriteOutput(i1) + b * ScaleFactor + END DO +END IF ! check if allocated + CALL Waves2_Output_ExtrapInterp1( y1%Waves2, y2%Waves2, tin, y_out%Waves2, tin_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END SUBROUTINE SeaSt_Output_ExtrapInterp1 + + + SUBROUTINE SeaSt_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is 2. +! +! expressions below based on either +! +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = y1, f(t2) = y2, f(t3) = y3 +! +!.................................................................................................................................. + + TYPE(SeaSt_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 + TYPE(SeaSt_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 + TYPE(SeaSt_OutputType), INTENT(IN) :: y3 ! Output at t3 + REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Outputs + TYPE(SeaSt_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(3) ! Times associated with the Outputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: c ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_Output_ExtrapInterp2' + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) +IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN + DO i1 = LBOUND(y_out%WriteOutput,1),UBOUND(y_out%WriteOutput,1) + b = (t(3)**2*(y1%WriteOutput(i1) - y2%WriteOutput(i1)) + t(2)**2*(-y1%WriteOutput(i1) + y3%WriteOutput(i1)))* scaleFactor + c = ( (t(2)-t(3))*y1%WriteOutput(i1) + t(3)*y2%WriteOutput(i1) - t(2)*y3%WriteOutput(i1) ) * scaleFactor + y_out%WriteOutput(i1) = y1%WriteOutput(i1) + b + c * t_out + END DO +END IF ! check if allocated + CALL Waves2_Output_ExtrapInterp2( y1%Waves2, y2%Waves2, y3%Waves2, tin, y_out%Waves2, tin_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END SUBROUTINE SeaSt_Output_ExtrapInterp2 + END MODULE SeaState_Types !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/Waves2.txt b/modules/seastate/src/Waves2.txt index e185ca0b6c..3cf763d743 100644 --- a/modules/seastate/src/Waves2.txt +++ b/modules/seastate/src/Waves2.txt @@ -127,7 +127,7 @@ typedef ^ ^ INTEGER NWaveElev typedef ^ ^ INTEGER NStepWave - - - "Total number of frequency components = total number of time steps in the incident wave" - typedef ^ ^ INTEGER NStepWave2 - - - "NStepWave / 2" - #typedef ^ ^ SiKi WaveTime {:} - - "Simulation times at which the instantaneous second order loads associated with the incident waves are determined" sec -typedef ^ ^ SiKi WaveElev2 {:}{:}{:} - - "Instantaneous elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output" (meters) +typedef ^ ^ SiKi WaveElev2 {*}{*}{*} - - "Instantaneous elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output" (meters) #typedef ^ ^ SiKi WaveElev2D {:}{:}{:} - - "" (m) # "Instantaneous 2nd-order difference frequency correction for the elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output" (meters) #typedef ^ ^ SiKi WaveElev2S {:}{:}{:} - - "" (m) diff --git a/modules/seastate/src/Waves2_Types.f90 b/modules/seastate/src/Waves2_Types.f90 index 398c9aef2e..64540db020 100644 --- a/modules/seastate/src/Waves2_Types.f90 +++ b/modules/seastate/src/Waves2_Types.f90 @@ -108,7 +108,7 @@ MODULE Waves2_Types INTEGER(IntKi) :: NWaveElev !< Number of points where the incident wave elevations can be output [-] INTEGER(IntKi) :: NStepWave !< Total number of frequency components = total number of time steps in the incident wave [-] INTEGER(IntKi) :: NStepWave2 !< NStepWave / 2 [-] - REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveElev2 !< Instantaneous elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output [(meters)] + REAL(SiKi) , DIMENSION(:,:,:), POINTER :: WaveElev2 => NULL() !< Instantaneous elevation time-series of incident waves at each of the NWaveElev points where the incident wave elevations can be output [(meters)] END TYPE Waves2_ParameterType ! ======================= ! ========= Waves2_InputType ======= @@ -2228,14 +2228,14 @@ SUBROUTINE Waves2_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM DstParamData%NWaveElev = SrcParamData%NWaveElev DstParamData%NStepWave = SrcParamData%NStepWave DstParamData%NStepWave2 = SrcParamData%NStepWave2 -IF (ALLOCATED(SrcParamData%WaveElev2)) THEN +IF (ASSOCIATED(SrcParamData%WaveElev2)) THEN i1_l = LBOUND(SrcParamData%WaveElev2,1) i1_u = UBOUND(SrcParamData%WaveElev2,1) i2_l = LBOUND(SrcParamData%WaveElev2,2) i2_u = UBOUND(SrcParamData%WaveElev2,2) i3_l = LBOUND(SrcParamData%WaveElev2,3) i3_u = UBOUND(SrcParamData%WaveElev2,3) - IF (.NOT. ALLOCATED(DstParamData%WaveElev2)) THEN + IF (.NOT. ASSOCIATED(DstParamData%WaveElev2)) THEN ALLOCATE(DstParamData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WaveElev2.', ErrStat, ErrMsg,RoutineName) @@ -2255,8 +2255,9 @@ SUBROUTINE Waves2_DestroyParam( ParamData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(ParamData%WaveElev2)) THEN +IF (ASSOCIATED(ParamData%WaveElev2)) THEN DEALLOCATE(ParamData%WaveElev2) + ParamData%WaveElev2 => NULL() ENDIF END SUBROUTINE Waves2_DestroyParam @@ -2302,7 +2303,7 @@ SUBROUTINE Waves2_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Int_BufSz = Int_BufSz + 1 ! NStepWave Int_BufSz = Int_BufSz + 1 ! NStepWave2 Int_BufSz = Int_BufSz + 1 ! WaveElev2 allocated yes/no - IF ( ALLOCATED(InData%WaveElev2) ) THEN + IF ( ASSOCIATED(InData%WaveElev2) ) THEN Int_BufSz = Int_BufSz + 2*3 ! WaveElev2 upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WaveElev2) ! WaveElev2 END IF @@ -2345,7 +2346,7 @@ SUBROUTINE Waves2_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NStepWave2 Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%WaveElev2) ) THEN + IF ( .NOT. ASSOCIATED(InData%WaveElev2) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -2426,7 +2427,7 @@ SUBROUTINE Waves2_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%WaveElev2)) DEALLOCATE(OutData%WaveElev2) + IF (ASSOCIATED(OutData%WaveElev2)) DEALLOCATE(OutData%WaveElev2) ALLOCATE(OutData%WaveElev2(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveElev2.', ErrStat, ErrMsg,RoutineName) @@ -2693,5 +2694,315 @@ SUBROUTINE Waves2_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = Re_Xferred + 1 END SUBROUTINE Waves2_UnPackOutput + + SUBROUTINE Waves2_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is given by the size of u +! +! expressions below based on either +! +! f(t) = a +! f(t) = a + b * t, or +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = u1, f(t2) = u2, f(t3) = u3 (as appropriate) +! +!.................................................................................................................................. + + TYPE(Waves2_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 + REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Inputs + TYPE(Waves2_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Input_ExtrapInterp' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + if ( size(t) .ne. size(u)) then + CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(u)',ErrStat,ErrMsg,RoutineName) + RETURN + endif + order = SIZE(u) - 1 + IF ( order .eq. 0 ) THEN + CALL Waves2_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 1 ) THEN + CALL Waves2_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 2 ) THEN + CALL Waves2_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE + CALL SetErrStat(ErrID_Fatal,'size(u) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) + RETURN + ENDIF + END SUBROUTINE Waves2_Input_ExtrapInterp + + + SUBROUTINE Waves2_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is 1. +! +! f(t) = a + b * t, or +! +! where a and b are determined as the solution to +! f(t1) = u1, f(t2) = u2 +! +!.................................................................................................................................. + + TYPE(Waves2_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 + TYPE(Waves2_InputType), INTENT(IN) :: u2 ! Input at t2 + REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Inputs + TYPE(Waves2_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(2) ! Times associated with the Inputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Input_ExtrapInterp1' + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / t(2) + b = -(u1%DummyInput - u2%DummyInput) + u_out%DummyInput = u1%DummyInput + b * ScaleFactor + END SUBROUTINE Waves2_Input_ExtrapInterp1 + + + SUBROUTINE Waves2_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is 2. +! +! expressions below based on either +! +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = u1, f(t2) = u2, f(t3) = u3 +! +!.................................................................................................................................. + + TYPE(Waves2_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 + TYPE(Waves2_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 + TYPE(Waves2_InputType), INTENT(IN) :: u3 ! Input at t3 + REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Inputs + TYPE(Waves2_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(3) ! Times associated with the Inputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: c ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Input_ExtrapInterp2' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) + b = (t(3)**2*(u1%DummyInput - u2%DummyInput) + t(2)**2*(-u1%DummyInput + u3%DummyInput))* scaleFactor + c = ( (t(2)-t(3))*u1%DummyInput + t(3)*u2%DummyInput - t(2)*u3%DummyInput ) * scaleFactor + u_out%DummyInput = u1%DummyInput + b + c * t_out + END SUBROUTINE Waves2_Input_ExtrapInterp2 + + + SUBROUTINE Waves2_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is given by the size of y +! +! expressions below based on either +! +! f(t) = a +! f(t) = a + b * t, or +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = y1, f(t2) = y2, f(t3) = y3 (as appropriate) +! +!.................................................................................................................................. + + TYPE(Waves2_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 + REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Outputs + TYPE(Waves2_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Output_ExtrapInterp' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + if ( size(t) .ne. size(y)) then + CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(y)',ErrStat,ErrMsg,RoutineName) + RETURN + endif + order = SIZE(y) - 1 + IF ( order .eq. 0 ) THEN + CALL Waves2_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 1 ) THEN + CALL Waves2_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 2 ) THEN + CALL Waves2_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE + CALL SetErrStat(ErrID_Fatal,'size(y) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) + RETURN + ENDIF + END SUBROUTINE Waves2_Output_ExtrapInterp + + + SUBROUTINE Waves2_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is 1. +! +! f(t) = a + b * t, or +! +! where a and b are determined as the solution to +! f(t1) = y1, f(t2) = y2 +! +!.................................................................................................................................. + + TYPE(Waves2_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 + TYPE(Waves2_OutputType), INTENT(IN) :: y2 ! Output at t2 + REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Outputs + TYPE(Waves2_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(2) ! Times associated with the Outputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Output_ExtrapInterp1' + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / t(2) + b = -(y1%DummyOutput - y2%DummyOutput) + y_out%DummyOutput = y1%DummyOutput + b * ScaleFactor + END SUBROUTINE Waves2_Output_ExtrapInterp1 + + + SUBROUTINE Waves2_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is 2. +! +! expressions below based on either +! +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = y1, f(t2) = y2, f(t3) = y3 +! +!.................................................................................................................................. + + TYPE(Waves2_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 + TYPE(Waves2_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 + TYPE(Waves2_OutputType), INTENT(IN) :: y3 ! Output at t3 + REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Outputs + TYPE(Waves2_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(3) ! Times associated with the Outputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + REAL(DbKi) :: b ! temporary for extrapolation/interpolation + REAL(DbKi) :: c ! temporary for extrapolation/interpolation + REAL(DbKi) :: ScaleFactor ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'Waves2_Output_ExtrapInterp2' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ScaleFactor = t_out / (t(2) * t(3) * (t(2) - t(3))) + b = (t(3)**2*(y1%DummyOutput - y2%DummyOutput) + t(2)**2*(-y1%DummyOutput + y3%DummyOutput))* scaleFactor + c = ( (t(2)-t(3))*y1%DummyOutput + t(3)*y2%DummyOutput - t(2)*y3%DummyOutput ) * scaleFactor + y_out%DummyOutput = y1%DummyOutput + b + c * t_out + END SUBROUTINE Waves2_Output_ExtrapInterp2 + END MODULE Waves2_Types !ENDOFREGISTRYGENERATEDFILE From ec32f76b9d4fc0d66e4362ed1ee5e8f431e44f37 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Tue, 21 Dec 2021 09:11:37 -0700 Subject: [PATCH 20/35] Fixed output handling for channels larger than 9 characters --- modules/hydrodyn/src/HydroDyn_Output.f90 | 4 ++-- modules/hydrodyn/src/Morison_Output.f90 | 8 ++++---- modules/seastate/src/SeaState_Output.f90 | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/hydrodyn/src/HydroDyn_Output.f90 b/modules/hydrodyn/src/HydroDyn_Output.f90 index 18555c3afe..1ac8ce041c 100644 --- a/modules/hydrodyn/src/HydroDyn_Output.f90 +++ b/modules/hydrodyn/src/HydroDyn_Output.f90 @@ -1517,13 +1517,13 @@ FUNCTION HDOut_GetChannels ( NUserOutputs, UserOutputs, OutList, foundMask, CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) + Indx = IndexCharAry( OutListTmp(1:11), ValidParamAry ) IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again ! ex, 'MTipDxc1' causes the sign of TipDxc1 to be switched. OutListTmp = OutListTmp(2:) - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) + Indx = IndexCharAry( OutListTmp(1:11), ValidParamAry ) END IF IF ( Indx > 0 ) THEN diff --git a/modules/hydrodyn/src/Morison_Output.f90 b/modules/hydrodyn/src/Morison_Output.f90 index 7d4b2ae5f6..582e057454 100644 --- a/modules/hydrodyn/src/Morison_Output.f90 +++ b/modules/hydrodyn/src/Morison_Output.f90 @@ -9071,13 +9071,13 @@ FUNCTION GetMorisonChannels ( NUserOutputs, UserOutputs, OutList, foundMask CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) + Indx = IndexCharAry( OutListTmp(1:11), ValidParamAry ) IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again ! ex, 'MTipDxc1' causes the sign of TipDxc1 to be switched. OutListTmp = OutListTmp(2:) - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) + Indx = IndexCharAry( OutListTmp(1:11), ValidParamAry ) END IF IF ( Indx > 0 ) THEN @@ -9194,13 +9194,13 @@ SUBROUTINE MrsnOut_ChkOutLst( OutList, ValidOutList, y, p, ErrStat, ErrMsg ) CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) + Indx = IndexCharAry( OutListTmp(1:11), ValidParamAry ) IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again p%OutParam(I)%SignM = -1 ! ex, 'MTipDxc1' causes the sign of TipDxc1 to be switched. OutListTmp = OutListTmp(2:) - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) + Indx = IndexCharAry( OutListTmp(1:11), ValidParamAry ) END IF IF ( Indx > 0 ) THEN diff --git a/modules/seastate/src/SeaState_Output.f90 b/modules/seastate/src/SeaState_Output.f90 index 03174486aa..be209bdbbb 100644 --- a/modules/seastate/src/SeaState_Output.f90 +++ b/modules/seastate/src/SeaState_Output.f90 @@ -812,13 +812,13 @@ FUNCTION SeaStOut_GetChannels ( NUserOutputs, UserOutputs, OutList, foundMa CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) + Indx = IndexCharAry( OutListTmp(1:11), ValidParamAry ) IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again ! ex, 'MTipDxc1' causes the sign of TipDxc1 to be switched. OutListTmp = OutListTmp(2:) - Indx = IndexCharAry( OutListTmp(1:9), ValidParamAry ) + Indx = IndexCharAry( OutListTmp(1:11), ValidParamAry ) END IF IF ( Indx > 0 ) THEN From 4600072861d7306cf5b732eb4e0c1ba985735f0d Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Wed, 5 Jan 2022 09:57:50 -0700 Subject: [PATCH 21/35] Remove debugging print statement --- modules/seastate/src/SeaState_Input.f90 | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/seastate/src/SeaState_Input.f90 b/modules/seastate/src/SeaState_Input.f90 index a398876d28..7a3a2d085a 100644 --- a/modules/seastate/src/SeaState_Input.f90 +++ b/modules/seastate/src/SeaState_Input.f90 @@ -1334,7 +1334,6 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E count = 1 do k = 0, p%NGrid(3) - 1 zpos = - ( 1.0 - cos( real((p%NGrid(3) - 1) - k, ReKi) * p%deltaGrid(3) ) ) * InputFileData%Z_Depth - print*,zpos do j = 0, p%NGrid(2)-1 ypos = -InputFileData%Y_HalfWidth + p%deltaGrid(2)*j do i= 0, p%NGrid(1)-1 From e397699681780ffed166b96d2ddcc56bb088b5a7 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Wed, 5 Jan 2022 09:59:10 -0700 Subject: [PATCH 22/35] Fix reporting of max/min wave elevations in output file WaveElev.out was not reporting the correct min/max values --- modules/seastate/src/SeaState_DriverCode.f90 | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/modules/seastate/src/SeaState_DriverCode.f90 b/modules/seastate/src/SeaState_DriverCode.f90 index 1ab006c240..f55b3b5d60 100644 --- a/modules/seastate/src/SeaState_DriverCode.f90 +++ b/modules/seastate/src/SeaState_DriverCode.f90 @@ -234,7 +234,7 @@ program SeaStateDriver nullify(InitOutData%WaveTime) !nullify(InitOutData%WaveElevC0) !nullify(InitOutData%WaveDirArr) - nullify(InitOutData%WaveElev) + !nullify(InitOutData%WaveElev) nullify(InitOutData%WaveElev1) nullify(InitOutData%WaveElev2) @@ -665,7 +665,7 @@ SUBROUTINE WaveElevGrid_Output (drvrInitInp, SeaStateInitInp, SeaStateInitOut, S character(1024) :: WaveElevFileName !< Name for the output file for the wave elevation series character(128) :: WaveElevFmt !< Format specifier for the output file for wave elevation series real(ReKi) :: xpos, ypos - real(SiKi) :: WaveElev + real(SiKi) :: WaveElev,minWaveVal,maxWaveVal integer(IntKi) :: i,j,k WaveElevFmt = "(F14.7,3x,F14.7,3x,F14.7)" @@ -685,6 +685,14 @@ SUBROUTINE WaveElevGrid_Output (drvrInitInp, SeaStateInitInp, SeaStateInitOut, S if ( ErrStat >= AbortErrLev ) return end if + if (associated(SeaState_p%WaveElev2)) then + maxWaveVal = MAXVAL(SeaState_p%WaveElev1+SeaState_p%WaveElev2) + minWaveVal = MINVAL(SeaState_p%WaveElev1+SeaState_p%WaveElev2) + else + maxWaveVal = MAXVAL(SeaState_p%WaveElev1) + minWaveVal = MINVAL(SeaState_p%WaveElev1) + end if + ! Write some useful header information ! write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '## This file was generated by '//TRIM(GetNVD(SeaState_Drv_ProgDesc))// & ! ' on '//CurDate()//' at '//CurTime()//'.' @@ -700,8 +708,8 @@ SUBROUTINE WaveElevGrid_Output (drvrInitInp, SeaStateInitInp, SeaStateInitOut, S write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridYPoints = '//TRIM(Num2LStr(SeaState_p%NGrid(2))) write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridDX = '//TRIM(Num2LStr(SeaState_p%deltaGrid(1))) write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# GridDY = '//TRIM(Num2LStr(SeaState_p%deltaGrid(2))) - write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# MaxWaveElev = '//TRIM(Num2LStr(MAXVAL(SeaState_p%WaveElev))) - write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# MinWaveElev = '//TRIM(Num2LStr(MINVAL(SeaState_p%WaveElev))) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# MaxWaveElev = '//TRIM(Num2LStr(maxWaveVal)) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# MinWaveElev = '//TRIM(Num2LStr(minWaveVal)) write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# ' ! Timestep looping @@ -713,7 +721,7 @@ SUBROUTINE WaveElevGrid_Output (drvrInitInp, SeaStateInitInp, SeaStateInitOut, S xpos = -SeaState_p%deltaGrid(1)*(SeaState_p%NGrid(1)-1)/2.0 + (J-1)*SeaState_p%deltaGrid(1) do k=1, SeaState_p%NGrid(2) ypos = -SeaState_p%deltaGrid(2)*(SeaState_p%NGrid(2)-1)/2.0 + (K-1)*SeaState_p%deltaGrid(2) - if (allocated(SeaState_p%Waves2%WaveElev2)) then + if (associated(SeaState_p%Waves2%WaveElev2)) then WaveElev = SeaState_p%WaveElev1(I,J,K) + SeaState_p%Waves2%WaveElev2(I,J,K) else WaveElev = SeaState_p%WaveElev1(I,J,K) From 903ebb2639f05d139ccbe3bf0c88cd254217eb49 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Wed, 5 Jan 2022 10:01:19 -0700 Subject: [PATCH 23/35] Implemented SeaState outputs via the glue-code --- modules/openfast-library/src/FAST_Subs.f90 | 54 ++++++++++++++++------ 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 1abbc22542..782db97cbc 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -914,7 +914,6 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, Init%InData_HD%WaveElevC0 => Init%OutData_SeaSt%WaveElevC0 CALL MOVE_ALLOC( Init%OutData_SeaSt%WaveElevC, Init%InData_HD%WaveElevC ) Init%InData_HD%WaveDirArr => Init%OutData_SeaSt%WaveDirArr - Init%InData_HD%WaveElev => Init%OutData_SeaSt%WaveElev Init%InData_HD%WaveElev1 => Init%OutData_SeaSt%WaveElev1 Init%InData_HD%WaveElev2 => Init%OutData_SeaSt%WaveElev2 @@ -933,7 +932,6 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, nullify(Init%OutData_SeaSt%WaveTime) nullify(Init%OutData_SeaSt%WaveElevC0) nullify(Init%OutData_SeaSt%WaveDirArr) - nullify(Init%OutData_SeaSt%WaveElev) nullify(Init%OutData_SeaSt%WaveElev1) nullify(Init%OutData_SeaSt%WaveElev2) @@ -996,7 +994,6 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, nullify(Init%InData_HD%WaveAcc) nullify(Init%InData_HD%WaveVel) nullify(Init%InData_HD%WaveTime) - nullify(Init%InData_HD%WaveElev) nullify(Init%InData_HD%WaveElev1) nullify(Init%InData_HD%WaveElev2) @@ -2064,6 +2061,7 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) IF ( ALLOCATED( Init%OutData_AD%rotors(1)%WriteOutputHdr)) y_FAST%numOuts(Module_AD) = SIZE(Init%OutData_AD%rotors(1)%WriteOutputHdr) ENDIF IF ( ALLOCATED( Init%OutData_SrvD%WriteOutputHdr ) ) y_FAST%numOuts(Module_SrvD) = SIZE(Init%OutData_SrvD%WriteOutputHdr) + IF ( ALLOCATED( Init%OutData_SeaSt%WriteOutputHdr ) ) y_FAST%numOuts(Module_SeaSt) = SIZE(Init%OutData_SeaSt%WriteOutputHdr) IF ( ALLOCATED( Init%OutData_HD%WriteOutputHdr ) ) y_FAST%numOuts(Module_HD) = SIZE(Init%OutData_HD%WriteOutputHdr) IF ( ALLOCATED( Init%OutData_SD%WriteOutputHdr ) ) y_FAST%numOuts(Module_SD) = SIZE(Init%OutData_SD%WriteOutputHdr) IF ( ALLOCATED( Init%OutData_ExtPtfm%WriteOutputHdr) ) y_FAST%numOuts(Module_ExtPtfm)= SIZE(Init%OutData_ExtPtfm%WriteOutputHdr) @@ -2139,6 +2137,12 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) indxNext = indxNext + 1 END DO + DO i=1,y_FAST%numOuts(Module_SeaSt) !SeaState + y_FAST%ChannelNames(indxNext) = Init%OutData_SeaSt%WriteOutputHdr(i) + y_FAST%ChannelUnits(indxNext) = Init%OutData_SeaSt%WriteOutputUnt(i) + indxNext = indxNext + 1 + END DO + DO i=1,y_FAST%numOuts(Module_HD) !HydroDyn y_FAST%ChannelNames(indxNext) = Init%OutData_HD%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_HD%WriteOutputUnt(i) @@ -4062,13 +4066,13 @@ SUBROUTINE FAST_Solution0_T(Turbine, ErrStat, ErrMsg) CALL FAST_Solution0(Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, Turbine%SC_DX,& - Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & + Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) END SUBROUTINE FAST_Solution0_T !---------------------------------------------------------------------------------------------------------------------------------- !> Routine that calls CalcOutput for the first time of the simulation (at t=0). After the initial solve, data arrays are initialized. -SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, SC_DX, HD, SD, ExtPtfm, & +SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, SC_DX, SeaSt, HD, SD, ExtPtfm, & MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code @@ -4083,6 +4087,7 @@ SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, O TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data TYPE(OpenFOAM_Data), INTENT(INOUT) :: OpFM !< OpenFOAM data TYPE(SCDataEx_Data), INTENT(INOUT) :: SC_DX !< Supercontroller exchange data + TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data @@ -4128,6 +4133,11 @@ SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, O IF ( p_FAST%CompServo == Module_SrvD ) CALL SrvD_SetExternalInputs( p_FAST, m_FAST, SrvD%Input(1) ) IF ( p_FAST%CompInflow == Module_IfW ) CALL IfW_SetExternalInputs( IfW%p, m_FAST, ED%y, IfW%Input(1) ) + if ( P_FAST%CompSeaSt == Module_SeaSt ) then + call SeaSt_CalcOutput( t_initial, SeaSt%u, SeaSt%p, SeaSt%x(1), SeaSt%xd(1), SeaSt%z(1), SeaSt%OtherSt(1), SeaSt%y, SeaSt%m, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + end if + CALL CalcOutputs_And_SolveForInputs( n_t_global, t_initial, STATE_CURR, m_FAST%calcJacobian, m_FAST%NextJacCalcTime, & p_FAST, m_FAST, y_FAST%WriteThisStep, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) @@ -4142,7 +4152,7 @@ SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, O ! Check to see if we should output data this time step: !---------------------------------------------------------------------------------------- - CALL WriteOutputToFile(n_t_global_next, t_initial, p_FAST, y_FAST, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2) + CALL WriteOutputToFile(n_t_global_next, t_initial, p_FAST, y_FAST, ED, BD, AD14, AD, IfW, OpFM, SeaSt, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! turn off VTK output when @@ -4636,13 +4646,13 @@ SUBROUTINE FAST_Solution_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) CALL FAST_Solution(t_initial, n_t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, Turbine%SC_DX, & - Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & + Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) END SUBROUTINE FAST_Solution_T !---------------------------------------------------------------------------------------------------------------------------------- !> This routine takes data from n_t_global and gets values at n_t_global + 1 -SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, SC_DX, HD, SD, ExtPtfm, & +SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, SC_DX, SeaSt, HD, SD, ExtPtfm, & MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) REAL(DbKi), INTENT(IN ) :: t_initial !< initial time @@ -4660,6 +4670,7 @@ SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data TYPE(OpenFOAM_Data), INTENT(INOUT) :: OpFM !< OpenFOAM data TYPE(SCDataEx_Data), INTENT(INOUT) :: SC_DX !< Supercontroller Exchange data + TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data @@ -4884,6 +4895,10 @@ SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF + if ( P_FAST%CompSeaSt == Module_SeaSt ) then + call SeaSt_CalcOutput( t_global_next, SeaSt%u, SeaSt%p, SeaSt%x(1), SeaSt%xd(1), SeaSt%z(1), SeaSt%OtherSt(1), SeaSt%y, SeaSt%m, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + end if ! HydroDyn: copy final predictions to actual states IF ( p_FAST%CompHydro == Module_HD ) THEN @@ -4996,7 +5011,7 @@ SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, !! Check to see if we should output data this time step: !---------------------------------------------------------------------------------------- - CALL WriteOutputToFile(n_t_global_next, t_global_next, p_FAST, y_FAST, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & + CALL WriteOutputToFile(n_t_global_next, t_global_next, p_FAST, y_FAST, ED, BD, AD14, AD, IfW, OpFM, SeaSt, HD, SD, ExtPtfm, & SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -5033,7 +5048,7 @@ END FUNCTION NeedWriteOutput !> This routine determines if it's time to write to the output files--based on a previous call to fast_subs::needwriteoutput--, and !! calls the routine to write to the files with the output data. It should be called after all the output solves for a given time !! have been completed, and assumes y_FAST\%WriteThisStep has been set. -SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & +SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, BD, AD14, AD, IfW, OpFM, SeaSt, HD, SD, ExtPtfm, & SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg) !............................................................................................................................... INTEGER(IntKi), INTENT(IN ) :: n_t_global !< Current global time step @@ -5048,6 +5063,7 @@ SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, BD, AD14, TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data TYPE(OpenFOAM_Data), INTENT(IN ) :: OpFM !< OpenFOAM data + TYPE(SeaState_Data), INTENT(IN ) :: SeaSt !< SeaState data TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data TYPE(ExtPtfm_Data), INTENT(IN ) :: ExtPtfm !< ExtPtfm_MCKF data @@ -5075,7 +5091,7 @@ SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, BD, AD14, ! Generate glue-code output file CALL WrOutputLine( t_global, p_FAST, y_FAST, IfW%y%WriteOutput, OpFM%y%WriteOutput, ED%y%WriteOutput, & - AD%y, SrvD%y%WriteOutput, HD%y%WriteOutput, SD%y%WriteOutput, ExtPtfm%y%WriteOutput, MAPp%y%WriteOutput, & + AD%y, SrvD%y%WriteOutput, SeaSt%y%WriteOutput, HD%y%WriteOutput, SD%y%WriteOutput, ExtPtfm%y%WriteOutput, MAPp%y%WriteOutput, & FEAM%y%WriteOutput, MD%y%WriteOutput, Orca%y%WriteOutput, IceF%y%WriteOutput, IceD%y, BD%y, ErrStat, ErrMsg ) ENDIF @@ -5091,7 +5107,7 @@ SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, BD, AD14, END SUBROUTINE WriteOutputToFile !---------------------------------------------------------------------------------------------------------------------------------- !> This routine writes the module output to the primary output file(s). -SUBROUTINE WrOutputLine( t, p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, y_AD, SrvDOutput, HDOutput, SDOutput, ExtPtfmOutput,& +SUBROUTINE WrOutputLine( t, p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, y_AD, SrvDOutput, SeaStOutput, HDOutput, SDOutput, ExtPtfmOutput,& MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, y_BD, ErrStat, ErrMsg) IMPLICIT NONE @@ -5107,6 +5123,7 @@ SUBROUTINE WrOutputLine( t, p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, y_A REAL(ReKi), ALLOCATABLE, INTENT(IN) :: EDOutput (:) !< ElastoDyn WriteOutput values TYPE(AD_OutputType), INTENT(IN) :: y_AD !< AeroDyn outputs (WriteOutput values are subset of allocated Rotors) REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SrvDOutput (:) !< ServoDyn WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SeaStOutput (:) !< SeaState WriteOutput values REAL(ReKi), ALLOCATABLE, INTENT(IN) :: HDOutput (:) !< HydroDyn WriteOutput values REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SDOutput (:) !< SubDyn WriteOutput values REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ExtPtfmOutput (:) !< ExtPtfm_MCKF WriteOutput values @@ -5131,7 +5148,7 @@ SUBROUTINE WrOutputLine( t, p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, y_A ErrStat = ErrID_None ErrMsg = '' - CALL FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, y_AD, SrvDOutput, HDOutput, SDOutput, ExtPtfmOutput, & + CALL FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, y_AD, SrvDOutput, SeaStOutput, HDOutput, SDOutput, ExtPtfmOutput, & MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, y_BD, OutputAry) IF (p_FAST%WrTxtOutFile) THEN @@ -5192,7 +5209,7 @@ SUBROUTINE FillOutputAry_T(Turbine, Outputs) CALL FillOutputAry(Turbine%p_FAST, Turbine%y_FAST, Turbine%IfW%y%WriteOutput, Turbine%OpFM%y%WriteOutput, & Turbine%ED%y%WriteOutput, Turbine%AD%y, Turbine%SrvD%y%WriteOutput, & - Turbine%HD%y%WriteOutput, Turbine%SD%y%WriteOutput, Turbine%ExtPtfm%y%WriteOutput, Turbine%MAP%y%WriteOutput, & + Turbine%SeaSt%y%WriteOutput, Turbine%HD%y%WriteOutput, Turbine%SD%y%WriteOutput, Turbine%ExtPtfm%y%WriteOutput, Turbine%MAP%y%WriteOutput, & Turbine%FEAM%y%WriteOutput, Turbine%MD%y%WriteOutput, Turbine%Orca%y%WriteOutput, & Turbine%IceF%y%WriteOutput, Turbine%IceD%y, Turbine%BD%y, Outputs) @@ -5200,7 +5217,7 @@ END SUBROUTINE FillOutputAry_T !---------------------------------------------------------------------------------------------------------------------------------- !> This routine concatenates all of the WriteOutput values from the module Output into one array to be written to the FAST !! output file. -SUBROUTINE FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, y_AD, SrvDOutput, HDOutput, SDOutput, ExtPtfmOutput, & +SUBROUTINE FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, y_AD, SrvDOutput, SeaStOutput, HDOutput, SDOutput, ExtPtfmOutput, & MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, y_BD, OutputAry) TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters @@ -5211,6 +5228,7 @@ SUBROUTINE FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, y_AD, REAL(ReKi), ALLOCATABLE, INTENT(IN) :: EDOutput (:) !< ElastoDyn WriteOutput values TYPE(AD_OutputType), INTENT(IN) :: y_AD !< AeroDyn outputs (WriteOutput values are subset of allocated Rotors) REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SrvDOutput (:) !< ServoDyn WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SeaStOutput (:) !< SeaState WriteOutput values REAL(ReKi), ALLOCATABLE, INTENT(IN) :: HDOutput (:) !< HydroDyn WriteOutput values REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SDOutput (:) !< SubDyn WriteOutput values REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ExtPtfmOutput (:) !< ExtPtfm_MCKF WriteOutput values @@ -5280,6 +5298,12 @@ SUBROUTINE FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, y_AD, indxNext = IndxLast + 1 END IF + IF ( y_FAST%numOuts(Module_SeaSt) > 0 ) THEN + indxLast = indxNext + SIZE(SeaStOutput) - 1 + OutputAry(indxNext:indxLast) = SeaStOutput + indxNext = IndxLast + 1 + END IF + IF ( y_FAST%numOuts(Module_HD) > 0 ) THEN indxLast = indxNext + SIZE(HDOutput) - 1 OutputAry(indxNext:indxLast) = HDOutput From 79589c7479f57962b7fd46927529e9813834c136 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Tue, 18 Jan 2022 12:47:02 -0700 Subject: [PATCH 24/35] Bug fix for Max/Min WaveElevation Ouputs --- modules/seastate/src/SeaState_DriverCode.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/seastate/src/SeaState_DriverCode.f90 b/modules/seastate/src/SeaState_DriverCode.f90 index f55b3b5d60..5aae59ea32 100644 --- a/modules/seastate/src/SeaState_DriverCode.f90 +++ b/modules/seastate/src/SeaState_DriverCode.f90 @@ -685,9 +685,9 @@ SUBROUTINE WaveElevGrid_Output (drvrInitInp, SeaStateInitInp, SeaStateInitOut, S if ( ErrStat >= AbortErrLev ) return end if - if (associated(SeaState_p%WaveElev2)) then - maxWaveVal = MAXVAL(SeaState_p%WaveElev1+SeaState_p%WaveElev2) - minWaveVal = MINVAL(SeaState_p%WaveElev1+SeaState_p%WaveElev2) + if (associated(SeaState_p%Waves2%WaveElev2)) then + maxWaveVal = MAXVAL(SeaState_p%WaveElev1+SeaState_p%Waves2%WaveElev2) + minWaveVal = MINVAL(SeaState_p%WaveElev1+SeaState_p%Waves2%WaveElev2) else maxWaveVal = MAXVAL(SeaState_p%WaveElev1) minWaveVal = MINVAL(SeaState_p%WaveElev1) From 9d14af70a68eee80d1483df0b046c447d6544300 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Wed, 19 Jan 2022 10:37:43 -0700 Subject: [PATCH 25/35] vs-build bug fixe: Added new SeaState project --- vs-build/SeaState/SeaStateDriver.sln | 37 +++ vs-build/SeaState/SeaStateDriver.vfproj | 347 ++++++++++++++++++++++++ 2 files changed, 384 insertions(+) create mode 100644 vs-build/SeaState/SeaStateDriver.sln create mode 100644 vs-build/SeaState/SeaStateDriver.vfproj diff --git a/vs-build/SeaState/SeaStateDriver.sln b/vs-build/SeaState/SeaStateDriver.sln new file mode 100644 index 0000000000..ee23e926c1 --- /dev/null +++ b/vs-build/SeaState/SeaStateDriver.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30503.244 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{6989167D-11E4-40FE-8C1A-21924BCA7E90}") = "SeaStateDriver", "SeaStateDriver.vfproj", "{815C302F-A93D-4C22-9329-717B4BC113C0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_Double|Win32 = Debug_Double|Win32 + Debug_Double|x64 = Debug_Double|x64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug_Double|x64.Build.0 = Debug_Double|x64 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug|Win32.ActiveCfg = Debug|Win32 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug|Win32.Build.0 = Debug|Win32 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug|x64.ActiveCfg = Debug|x64 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug|x64.Build.0 = Debug|x64 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Release|Win32.ActiveCfg = Release|Win32 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Release|Win32.Build.0 = Release|Win32 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Release|x64.ActiveCfg = Release|x64 + {815C302F-A93D-4C22-9329-717B4BC113C0}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D73C5D81-14CD-4C14-8B52-6885B380AE3E} + EndGlobalSection +EndGlobal diff --git a/vs-build/SeaState/SeaStateDriver.vfproj b/vs-build/SeaState/SeaStateDriver.vfproj new file mode 100644 index 0000000000..b8c27199ed --- /dev/null +++ b/vs-build/SeaState/SeaStateDriver.vfproj @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 6cc52861ff46d0b958e36420781a844c6ae6e3df Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Mon, 24 Jan 2022 09:25:05 -0700 Subject: [PATCH 26/35] Updates for Writing Kinematics Files --- modules/seastate/src/SeaState.txt | 3 + modules/seastate/src/SeaState_DriverCode.f90 | 10 +- modules/seastate/src/SeaState_Input.f90 | 3 + modules/seastate/src/SeaState_Output.f90 | 219 +++++++++++++------ modules/seastate/src/SeaState_Types.f90 | 21 ++ 5 files changed, 183 insertions(+), 73 deletions(-) diff --git a/modules/seastate/src/SeaState.txt b/modules/seastate/src/SeaState.txt index abcac618dc..3451bb1d8a 100644 --- a/modules/seastate/src/SeaState.txt +++ b/modules/seastate/src/SeaState.txt @@ -150,6 +150,9 @@ typedef ^ ^ DbKi Wav typedef ^ ^ INTEGER NGridPts - - - "Number of data points in the wave kinematics grid" - typedef ^ ^ INTEGER NGrid 3 - - "Number of grid entries in x, y, and z" typedef ^ ^ ReKi deltaGrid 3 - - "delta between grid points in x, y, and theta (for z)" m,m,rad +typedef ^ ^ ReKi X_HalfWidth - - - "Half-width of the domain in the X direction" m +typedef ^ ^ ReKi Y_HalfWidth - - - "Half-width of the domain in the Y direction" m +typedef ^ ^ ReKi Z_Depth - - - "Depth of the domain the Z direction" m #typedef ^ ^ ReKi gridDX - - - "distance between kinematics grid points along the xi direction" m #typedef ^ ^ ReKi gridDY - - - "distance between kinematics grid points along the yi direction" m #typedef ^ ^ ReKi gridDTheta - - - "delta angle used for cosine-spaced zi direction kinematic grid points" rad diff --git a/modules/seastate/src/SeaState_DriverCode.f90 b/modules/seastate/src/SeaState_DriverCode.f90 index 5aae59ea32..db79086faf 100644 --- a/modules/seastate/src/SeaState_DriverCode.f90 +++ b/modules/seastate/src/SeaState_DriverCode.f90 @@ -226,6 +226,11 @@ program SeaStateDriver call SeaSt_DvrCleanup() end if + ! Write Wave Kinematics File + call SeaStOut_WriteWvKinFiles( InitInData%OutRootName, version, p%NStepWave, p%WaveDT, p%X_HalfWidth, p%Y_HalfWidth, & + p%Z_Depth, p%deltaGrid, p%NGrid, InitOutData%WaveElev1, InitOutData%WaveElev1, & + InitOutData%WaveTime, InitOutData%WaveVel, InitOutData%WaveAcc, InitOutData%WaveDynP, ErrStat, ErrMsg ) + ! Nullify these pointers because they are no longer needed nullify(InitOutData%WaveDynP) @@ -244,7 +249,10 @@ program SeaStateDriver call SeaSt_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) - + if (errStat >= AbortErrLev) then + ! Clean up and exit + call SeaSt_DvrCleanup() + end if diff --git a/modules/seastate/src/SeaState_Input.f90 b/modules/seastate/src/SeaState_Input.f90 index 7a3a2d085a..43afb2151a 100644 --- a/modules/seastate/src/SeaState_Input.f90 +++ b/modules/seastate/src/SeaState_Input.f90 @@ -1328,6 +1328,9 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E end if ! Generate grid points + p%X_HalfWidth = InputFileData%X_HalfWidth + p%Y_HalfWidth = InputFileData%Y_HalfWidth + p%Z_Depth = InputFileData%Z_Depth p%deltaGrid(1) = InputFileData%X_HalfWidth/(InputFileData%NX) p%deltaGrid(2)= InputFileData%Y_HalfWidth/(InputFileData%NY) p%deltaGrid(3) = PI / ( 2*(InputFileData%NZ-1) ) diff --git a/modules/seastate/src/SeaState_Output.f90 b/modules/seastate/src/SeaState_Output.f90 index be209bdbbb..694d9dfba7 100644 --- a/modules/seastate/src/SeaState_Output.f90 +++ b/modules/seastate/src/SeaState_Output.f90 @@ -320,22 +320,26 @@ SUBROUTINE SeaStOut_OpenSum( UnSum, SummaryName, SeaSt_Prog, ErrStat, ErrMsg ) END SUBROUTINE SeaStOut_OpenSum !==================================================================================================== -SUBROUTINE SeaStOut_WriteWvKinFiles( Rootname, SeaSt_Prog, NStepWave, NNodes, NWaveElev, nodeInWater, WaveElev, WaveKinzi, & +SUBROUTINE SeaStOut_WriteWvKinFiles( Rootname, SeaSt_Prog, NStepWave, WaveDT, X_HalfWidth, Y_HalfWidth, & + Z_Depth, deltaGrid, NGrid, WaveElev1, WaveElev2, & WaveTime, WaveVel, WaveAcc, WaveDynP, ErrStat, ErrMsg ) -!TODO: Modifiy for writing grid instead of nodes + ! Passed variables CHARACTER(*), INTENT( IN ) :: Rootname ! filename including full path, minus any file extension. TYPE(ProgDesc), INTENT( IN ) :: SeaSt_Prog ! the name/version/date of the SeaState program INTEGER, INTENT( IN ) :: NStepWave ! Number of time steps for the wave kinematics arrays - INTEGER, INTENT( IN ) :: NNodes ! Number of simulation nodes for the wave kinematics arrays - INTEGER, INTENT( IN ) :: NWaveElev ! Number of locations where wave elevations were requested - INTEGER, INTENT( IN ) :: nodeInWater(0:,: ) ! - REAL(SiKi), INTENT( IN ) :: WaveElev (0:,: ) ! Instantaneous wave elevations at requested locations - REAL(SiKi), INTENT( IN ) :: WaveKinzi(: ) ! The z-location of all the nodes - REAL(SiKi), INTENT( IN ) :: WaveTime (0: ) ! The time values for the wave kinematics (time) - REAL(SiKi), INTENT( IN ) :: WaveVel (0:,:,:) ! The wave velocities (time,node,component) - REAL(SiKi), INTENT( IN ) :: WaveAcc (0:,:,:) ! The wave accelerations (time,node,component) - REAL(SiKi), INTENT( IN ) :: WaveDynP(0:,:) ! The wave dynamic pressure (time,node) + real(DbKi), intent( in ) :: WaveDT + real(ReKi), intent( in ) :: X_HalfWidth + real(ReKi), intent( in ) :: Y_HalfWidth + real(ReKi), intent( in ) :: Z_Depth + real(ReKi), intent( in ) :: deltaGrid(3) + INTEGER, INTENT( IN ) :: NGrid(3) ! Number of grid points for the wave kinematics arrays + REAL(SiKi), pointer, INTENT( IN ) :: WaveElev1 (:,:,: ) ! Instantaneous wave elevations at requested locations - 1st order + REAL(SiKi), pointer, INTENT( IN ) :: WaveElev2 (:,:,: ) ! Instantaneous wave elevations at requested locations - 2nd order + REAL(SiKi), pointer, INTENT( IN ) :: WaveTime (: ) ! The time values for the wave kinematics (time) + REAL(SiKi), pointer, INTENT( IN ) :: WaveVel (:,:,:,:,:) ! The wave velocities (time,node,component) + REAL(SiKi), pointer, INTENT( IN ) :: WaveAcc (:,:,:,:,:) ! The wave accelerations (time,node,component) + REAL(SiKi), pointer, INTENT( IN ) :: WaveDynP(:,:,:,:) ! The wave dynamic pressure (time,node) INTEGER, INTENT( OUT ) :: ErrStat ! returns a non-zero value when an error occurs CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -343,9 +347,10 @@ SUBROUTINE SeaStOut_WriteWvKinFiles( Rootname, SeaSt_Prog, NStepWave, NNodes, NW INTEGER :: UnWv ! file unit for writing the various wave kinematics files CHARACTER(1024) :: WvName ! complete filename for one of the output files CHARACTER(5) :: extension(7) - INTEGER :: i, j, iFile - CHARACTER(64) :: Frmt, Sfrmt + INTEGER :: i, j, k, m, iFile + CHARACTER(64) :: Frmt, Frmt2, Sfrmt CHARACTER(ChanLen) :: Delim + real(ReKi) :: x_gridPts(NGrid(1)), y_gridPts(NGrid(2)), z_gridPts(NGrid(3)) ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -353,54 +358,64 @@ SUBROUTINE SeaStOut_WriteWvKinFiles( Rootname, SeaSt_Prog, NStepWave, NNodes, NW extension = (/'.Vxi ','.Vyi ','.Vzi ','.Axi ','.Ayi ','.Azi ','.DynP'/) Delim = '' !Frmt = '('//TRIM(Int2LStr(NNodes))//'(:,A,ES11.4e2))' - Frmt = '(:,A,ES11.4e2)' - Sfrmt = '(:,A,A11)' + Frmt = '(A1,ES11.4e2)' + Sfrmt = '(A1,A11)' + ! Create grid point locations + + do i = 0, NGrid(1)-1 + x_gridPts(i+1) = -X_HalfWidth + deltaGrid(1)*i + end do + do i = 0, NGrid(2)-1 + y_gridPts(i+1) = -Y_HalfWidth + deltaGrid(2)*i + end do + do i = 0, NGrid(3)-1 + z_gridPts(i+1) = - ( 1.0 - cos( real((NGrid(3) - 1) - i, ReKi) * deltaGrid(3) ) ) * Z_Depth + end do - DO iFile = 1,7 CALL GetNewUnit( UnWv ) - WvName = Rootname // TRIM(extension(iFile)) + WvName = TRIM(Rootname) // TRIM(extension(iFile)) CALL OpenFOutFile ( UnWv, WvName, ErrStat, ErrMsg ) IF (ErrStat >=AbortErrLev) RETURN - - - ! Write the summary file header - ! WRITE (UnWv,'(/,A/)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( HD_Prog%Name )//& - WRITE (UnWv,'(A)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( SeaSt_Prog%Name )//& - ' '//TRIM( SeaSt_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' - - - DO i= 0,NStepWave-1 - DO j = 1, NNodes - IF ( nodeInWater(i,j) == 0 ) THEN - WRITE(UnWv,Sfrmt,ADVANCE='no') Delim, '##########' - ELSE + call WriteWvKinHeader( UnWv, iFile, Delim, SeaSt_Prog, waveDT, -z_gridPts(1), NGrid, deltaGrid ) + + DO m= 0,NStepWave + DO k = 1, NGrid(3) + do j = 1, NGrid(2) + do i = 1, NGrid(1) - SELECT CASE (iFile) - CASE (1) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (i,j,1) - CASE (2) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (i,j,2) - CASE (3) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (i,j,3) - CASE (4) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (i,j,1) - CASE (5) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (i,j,2) - CASE (6) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (i,j,3) - CASE (7) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveDynP(i,j ) + !IF ( nodeInWater(i,j) == 0 ) THEN + ! WRITE(UnWv,Sfrmt,ADVANCE='no') Delim, '##########' + !ELSE + + SELECT CASE (iFile) + CASE (1) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (m,i,j,k,1) + CASE (2) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (m,i,j,k,2) + CASE (3) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (m,i,j,k,3) + CASE (4) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (m,i,j,k,1) + CASE (5) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (m,i,j,k,2) + CASE (6) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (m,i,j,k,3) + CASE (7) + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveDynP(m,i,j,k ) END SELECT - END IF - END DO - WRITE (UnWv,'()', IOSTAT=ErrStat) ! write the line return - END DO - + !END IF + END DO ! for i + WRITE (UnWv,'(A)', IOSTAT=ErrStat) ' ! All X grid locations at Y = '//TRIM(num2lstr(y_gridPts(j)))// & + ', Z = '//TRIM(num2lstr(z_gridPts(k)))// & + ', WaveTime = '//TRIM(num2lstr(waveDT*m)) ! write the line return + END DO ! for j + END DO ! for k + END DO ! for m CLOSE( UnWv, IOSTAT=ErrStat ) IF (ErrStat /= 0) THEN ErrStat = ErrID_Fatal @@ -409,36 +424,96 @@ SUBROUTINE SeaStOut_WriteWvKinFiles( Rootname, SeaSt_Prog, NStepWave, NNodes, NW END IF END DO - IF ( NWaveElev > 0 ) THEN + ! WaveElevation Grid - CALL GetNewUnit( UnWv ) + CALL GetNewUnit( UnWv ) - WvName = Rootname // '.Elev' - CALL OpenFOutFile ( UnWv, WvName, ErrStat, ErrMsg ) - IF (ErrStat >=AbortErrLev) RETURN + WvName = TRIM(Rootname) // '.Elev' + CALL OpenFOutFile ( UnWv, WvName, ErrStat, ErrMsg ) + IF (ErrStat >=AbortErrLev) RETURN + call WriteWvKinHeader( UnWv, 8, Delim, SeaSt_Prog, waveDT, -z_gridPts(1), NGrid, deltaGrid ) + + + DO m= 0,NStepWave-1 + do j = 1, NGrid(2) + do i = 1, NGrid(1) + !Frmt = '('//TRIM(Int2LStr(NWaveElev))//'(:,A,ES11.4e2))' + !WRITE(UnWv,Frmt) ( Delim, WaveElev(i,j) , j=1,NWaveElev ) + if ( associated(WaveElev2) ) then + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveElev1(m,i,j) + WaveElev2(m,i,j) + else + WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveElev1(m,i,j) + end if + end do + WRITE (UnWv,'()', IOSTAT=ErrStat) ! write the line return + end do - ! Write the summary file header - WRITE (UnWv,'(A)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( SeaSt_Prog%Name )//& - ' '//TRIM( SeaSt_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' - + END DO - DO i= 0,NStepWave-1 - - Frmt = '('//TRIM(Int2LStr(NWaveElev))//'(:,A,ES11.4e2))' - WRITE(UnWv,Frmt) ( Delim, WaveElev(i,j) , j=1,NWaveElev ) - - END DO + CLOSE( UnWv, IOSTAT=ErrStat ) + IF (ErrStat /= 0) THEN + ErrStat = ErrID_Fatal + ErrMsg = 'Problem closing wave elevations file' + RETURN + END IF - CLOSE( UnWv, IOSTAT=ErrStat ) - IF (ErrStat /= 0) THEN - ErrStat = ErrID_Fatal - ErrMsg = 'Problem closing wave elevations file' - RETURN - END IF + contains + + subroutine WriteWvKinHeader( UnWv, fileType, Delim, SeaSt_Prog, waveDT, Z_Depth, NGrid, deltaGrid ) + ! Passed variables + INTEGER, INTENT( IN ) :: UnWv + integer, intent( in ) :: fileType + CHARACTER(ChanLen), intent( in ) :: Delim + TYPE(ProgDesc), INTENT( IN ) :: SeaSt_Prog ! the name/version/date of the SeaState program + real(DbKi), intent( in ) :: WaveDT + real(ReKi), intent( in ) :: Z_Depth + real(ReKi), intent( in ) :: deltaGrid(3) + INTEGER, INTENT( IN ) :: NGrid(3) ! Number of grid points for the wave kinematics arrays + + integer(IntKi) :: i + CHARACTER(64) :: Frmt - END IF + ! Write the summary file header + ! WRITE (UnWv,'(/,A/)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( HD_Prog%Name )//& + WRITE (UnWv,'(A)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( SeaSt_Prog%Name )//& + ' '//TRIM( SeaSt_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' + SELECT CASE (fileType) + CASE (1) + WRITE(UnWv, '(A)', IOSTAT=ErrStat) 'Fluid Velocity along the X-direction (m/s)' + CASE (2) + WRITE(UnWv, '(A)', IOSTAT=ErrStat) 'Fluid Velocity along the Y-direction (m/s)' + CASE (3) + WRITE(UnWv, '(A)', IOSTAT=ErrStat) 'Fluid Velocity along the Z-direction (m/s)' + CASE (4) + WRITE(UnWv, '(A)', IOSTAT=ErrStat) 'Fluid Acceleration along the X-direction (m/s^2)' + CASE (5) + WRITE(UnWv, '(A)', IOSTAT=ErrStat) 'Fluid Acceleration along the Y-direction (m/s^2)' + CASE (6) + WRITE(UnWv, '(A)', IOSTAT=ErrStat) 'Fluid Acceleration along the Z-direction (m/s^2)' + CASE (7) + WRITE(UnWv, '(A)', IOSTAT=ErrStat) 'Fluid Dynamic Pressure (Pa)' + CASE (8) + WRITE(UnWv, '(A)', IOSTAT=ErrStat) 'Wave Elevation (m)' + END SELECT + Frmt = '(A1,ES11.4e2,A)' + write (UnWv,Frmt, IOSTAT=ErrStat) '!' , waveDT , ' - WaveDT (s)' + write (UnWv,Frmt, IOSTAT=ErrStat) '!' , NGrid(1) , ' - Number of X grid points [NX*2 + 1]' + write (UnWv,Frmt, IOSTAT=ErrStat) '!' , NGrid(2) , ' - Number of Y grid points [NY*2 + 1]' + write (UnWv,Frmt, IOSTAT=ErrStat) '!' , NGrid(3) , ' - Number of Z grid points [NZ]' + write (UnWv,Frmt, IOSTAT=ErrStat) '!' , deltaGrid(1) , ' - X grid spacing (m) [dX]' + write (UnWv,Frmt, IOSTAT=ErrStat) '!' , deltaGrid(2) , ' - Y grid spacing (m) [dY]' + write (UnWv,Frmt, IOSTAT=ErrStat) '!' , Z_Depth , ' - Lowest Z Depth (m) [Z_Depth]' + write (UnWv,Frmt, IOSTAT=ErrStat) '!' , deltaGrid(3) , ' - Z grid spacing (radians) [dthetaZ, where Z coordinates are found using: Z[nZ] = ( COS( nZ*dthetaZ ) - 1 )*Z_Depth, where nZ = {NZ-1, NZ-2, ..., 1,0} and dthetaZ = pi/( 2*(NZ-1) ) and 0 < Z_Depth <= WtrDpth+MSL2SWL ]' + + Frmt = '(A1,'//TRIM(Int2LStr(NGrid(1)))//'(A1,ES11.4e2),A)' + write(UnWv,Frmt) '!', ( Delim, x_gridPts(i) , i=1,NGrid(1) ), ' - X-Locations (m)' + Frmt = '(A1,'//TRIM(Int2LStr(NGrid(2)))//'(A1,ES11.4e2),A)' + write(UnWv,Frmt) '!', ( Delim, y_gridPts(i) , i=1,NGrid(2) ), ' - Y-Locations (m)' + Frmt = '(A1,'//TRIM(Int2LStr(NGrid(3)))//'(A1,ES11.4e2),A)' + write(UnWv,Frmt) '!', ( Delim, z_gridPts(i) , i=1,NGrid(3) ), ' - Z-Locations (m)' + end subroutine WriteWvKinHeader END SUBROUTINE SeaStOut_WriteWvKinFiles diff --git a/modules/seastate/src/SeaState_Types.f90 b/modules/seastate/src/SeaState_Types.f90 index 3590e95ed6..199cc9cc1c 100644 --- a/modules/seastate/src/SeaState_Types.f90 +++ b/modules/seastate/src/SeaState_Types.f90 @@ -168,6 +168,9 @@ MODULE SeaState_Types INTEGER(IntKi) :: NGridPts !< Number of data points in the wave kinematics grid [-] INTEGER(IntKi) , DIMENSION(1:3) :: NGrid !< Number of grid entries in x, y, and z [-] REAL(ReKi) , DIMENSION(1:3) :: deltaGrid !< delta between grid points in x, y, and theta (for z) [m,m,rad] + REAL(ReKi) :: X_HalfWidth !< Half-width of the domain in the X direction [m] + REAL(ReKi) :: Y_HalfWidth !< Half-width of the domain in the Y direction [m] + REAL(ReKi) :: Z_Depth !< Depth of the domain the Z direction [m] INTEGER(IntKi) :: NStepWave !< Number of data points in the wave kinematics arrays [-] INTEGER(IntKi) :: NWaveElev !< Number of wave elevation outputs [-] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevxi !< xi-coordinates for points where the incident wave elevations can be output [(meters)] @@ -4199,6 +4202,9 @@ SUBROUTINE SeaSt_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMs DstParamData%NGridPts = SrcParamData%NGridPts DstParamData%NGrid = SrcParamData%NGrid DstParamData%deltaGrid = SrcParamData%deltaGrid + DstParamData%X_HalfWidth = SrcParamData%X_HalfWidth + DstParamData%Y_HalfWidth = SrcParamData%Y_HalfWidth + DstParamData%Z_Depth = SrcParamData%Z_Depth DstParamData%NStepWave = SrcParamData%NStepWave DstParamData%NWaveElev = SrcParamData%NWaveElev IF (ALLOCATED(SrcParamData%WaveElevxi)) THEN @@ -4523,6 +4529,9 @@ SUBROUTINE SeaSt_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_BufSz = Int_BufSz + 1 ! NGridPts Int_BufSz = Int_BufSz + SIZE(InData%NGrid) ! NGrid Re_BufSz = Re_BufSz + SIZE(InData%deltaGrid) ! deltaGrid + Re_BufSz = Re_BufSz + 1 ! X_HalfWidth + Re_BufSz = Re_BufSz + 1 ! Y_HalfWidth + Re_BufSz = Re_BufSz + 1 ! Z_Depth Int_BufSz = Int_BufSz + 1 ! NStepWave Int_BufSz = Int_BufSz + 1 ! NWaveElev Int_BufSz = Int_BufSz + 1 ! WaveElevxi allocated yes/no @@ -4713,6 +4722,12 @@ SUBROUTINE SeaSt_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, ReKiBuf(Re_Xferred) = InData%deltaGrid(i1) Re_Xferred = Re_Xferred + 1 END DO + ReKiBuf(Re_Xferred) = InData%X_HalfWidth + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%Y_HalfWidth + Re_Xferred = Re_Xferred + 1 + ReKiBuf(Re_Xferred) = InData%Z_Depth + Re_Xferred = Re_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NStepWave Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%NWaveElev @@ -5171,6 +5186,12 @@ SUBROUTINE SeaSt_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM OutData%deltaGrid(i1) = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 END DO + OutData%X_HalfWidth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%Y_HalfWidth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 + OutData%Z_Depth = ReKiBuf(Re_Xferred) + Re_Xferred = Re_Xferred + 1 OutData%NStepWave = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 OutData%NWaveElev = IntKiBuf(Int_Xferred) From b741b0436bb01c4750f861f149e5cf0a652b023d Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Tue, 25 Jan 2022 09:58:56 -0700 Subject: [PATCH 27/35] Bug Fix: Correct number of grid points in XY directions based on NX, NY input file param --- modules/seastate/src/SeaState_Input.f90 | 8 ++++---- modules/seastate/src/SeaState_Output.f90 | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/seastate/src/SeaState_Input.f90 b/modules/seastate/src/SeaState_Input.f90 index 43afb2151a..82d40d76e2 100644 --- a/modules/seastate/src/SeaState_Input.f90 +++ b/modules/seastate/src/SeaState_Input.f90 @@ -1282,8 +1282,8 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E !TODO: This is now set with the grid points? GJH 7/11/21 - p%NGrid(1) = InputFileData%NX*2+1 - p%NGrid(2) = InputFileData%NY*2+1 + p%NGrid(1) = InputFileData%NX*2-1 + p%NGrid(2) = InputFileData%NY*2-1 p%NGrid(3) = InputFileData%NZ p%NGridPts = p%NGrid(1) * p%NGrid(2) * p%NGrid(3) InputFileData%Waves%NGrid = p%NGrid @@ -1331,8 +1331,8 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E p%X_HalfWidth = InputFileData%X_HalfWidth p%Y_HalfWidth = InputFileData%Y_HalfWidth p%Z_Depth = InputFileData%Z_Depth - p%deltaGrid(1) = InputFileData%X_HalfWidth/(InputFileData%NX) - p%deltaGrid(2)= InputFileData%Y_HalfWidth/(InputFileData%NY) + p%deltaGrid(1) = InputFileData%X_HalfWidth/(InputFileData%NX-1) + p%deltaGrid(2)= InputFileData%Y_HalfWidth/(InputFileData%NY-1) p%deltaGrid(3) = PI / ( 2*(InputFileData%NZ-1) ) count = 1 do k = 0, p%NGrid(3) - 1 diff --git a/modules/seastate/src/SeaState_Output.f90 b/modules/seastate/src/SeaState_Output.f90 index 694d9dfba7..51c5b95fd6 100644 --- a/modules/seastate/src/SeaState_Output.f90 +++ b/modules/seastate/src/SeaState_Output.f90 @@ -473,7 +473,7 @@ subroutine WriteWvKinHeader( UnWv, fileType, Delim, SeaSt_Prog, waveDT, Z_Depth, INTEGER, INTENT( IN ) :: NGrid(3) ! Number of grid points for the wave kinematics arrays integer(IntKi) :: i - CHARACTER(64) :: Frmt + CHARACTER(64) :: Frmt, Frmt2 ! Write the summary file header ! WRITE (UnWv,'(/,A/)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( HD_Prog%Name )//& @@ -498,10 +498,11 @@ subroutine WriteWvKinHeader( UnWv, fileType, Delim, SeaSt_Prog, waveDT, Z_Depth, WRITE(UnWv, '(A)', IOSTAT=ErrStat) 'Wave Elevation (m)' END SELECT Frmt = '(A1,ES11.4e2,A)' + Frmt2 = '(A1,I11,A)' write (UnWv,Frmt, IOSTAT=ErrStat) '!' , waveDT , ' - WaveDT (s)' - write (UnWv,Frmt, IOSTAT=ErrStat) '!' , NGrid(1) , ' - Number of X grid points [NX*2 + 1]' - write (UnWv,Frmt, IOSTAT=ErrStat) '!' , NGrid(2) , ' - Number of Y grid points [NY*2 + 1]' - write (UnWv,Frmt, IOSTAT=ErrStat) '!' , NGrid(3) , ' - Number of Z grid points [NZ]' + write (UnWv,Frmt2, IOSTAT=ErrStat) '!' , NGrid(1) , ' - Number of X grid points [NX*2 - 1]' + write (UnWv,Frmt2, IOSTAT=ErrStat) '!' , NGrid(2) , ' - Number of Y grid points [NY*2 - 1]' + write (UnWv,Frmt2, IOSTAT=ErrStat) '!' , NGrid(3) , ' - Number of Z grid points [NZ]' write (UnWv,Frmt, IOSTAT=ErrStat) '!' , deltaGrid(1) , ' - X grid spacing (m) [dX]' write (UnWv,Frmt, IOSTAT=ErrStat) '!' , deltaGrid(2) , ' - Y grid spacing (m) [dY]' write (UnWv,Frmt, IOSTAT=ErrStat) '!' , Z_Depth , ' - Lowest Z Depth (m) [Z_Depth]' From 34c38fc87d262b40c43f98261df3caa167ddf398 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Mon, 31 Jan 2022 08:49:33 -0700 Subject: [PATCH 28/35] Fixed bug with repeating wave kinematics The wrapping of the time signal back into the range [0,WaveTMax] had bugs --- modules/seastate/src/SeaState_Interp.f90 | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/modules/seastate/src/SeaState_Interp.f90 b/modules/seastate/src/SeaState_Interp.f90 index b18da622c5..fe984659ee 100644 --- a/modules/seastate/src/SeaState_Interp.f90 +++ b/modules/seastate/src/SeaState_Interp.f90 @@ -292,7 +292,7 @@ subroutine SetTimeIndex(Time, deltaT, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, Er INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - integer(IntKi) :: i + integer(IntKi) :: i, mult real(ReKi) :: Tmp ErrStat = ErrID_None @@ -305,19 +305,16 @@ subroutine SetTimeIndex(Time, deltaT, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, Er CALL SetErrStat(ErrID_Fatal,'Time value must be greater than or equal to zero!',ErrStat,ErrMsg,'SetTimeLoIndex') !error out if time is outside the lower bounds RETURN end if - + +! NOTE: nMax is the total number of time values in the grid, since this is zero-based indexing, the max index is nMax-1 +! for example: in a time grid with 11 grid points, the indices run from 0,1,2,3,4,5,6,7,8,9,10 +! for the repeating waves feature, index 10 is the same as index 0, so if Indx_Lo = 10 then we want to +! wrap it back to index 0, if Indx_Lo = 11 we want to wrap back to index 1. + Tmp = Time / deltaT + Tmp = MOD(Tmp,real((nMax), DbKi)) Indx_Lo = INT( Tmp ) ! convert REAL to INTEGER - - if (Indx_Lo >= (nMax-1)) then ! Wrap the time series back to the beginning of the signal - - ! NOTE: nMax is the total number of time values in the grid, since this is zero-based indexing, the max index is nMax-1 - ! for example: in a time grid with 11 grid points, the indices run from 0,1,2,3,4,5,6,7,8,9,10 - ! for the repeating waves feature, index 10 is the same as index 0, so if Indx_Lo = 10 then we want to - ! wrap it back to index 0, if Indx_Lo = 11 we want to wrap back to index 1. - Indx_Lo = Indx_Lo - (nMax - 1) - Tmp = Tmp - real(nMax - 1, ReKi) - end if + isopc = 2.0_ReKi * (Tmp - REAL(Indx_Lo , ReKi)) - 1.0_ReKi ! convert to value between -1 and 1 !------------------------------------------------------------------------------------------------- @@ -326,7 +323,7 @@ subroutine SetTimeIndex(Time, deltaT, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, Er isopc = min( 1.0_SiKi, isopc ) isopc = max(-1.0_SiKi, isopc ) - Indx_Hi = min( Indx_Lo + 1, nMax - 1 ) ! make sure it's a valid index, zero-based + Indx_Hi = min( Indx_Lo + 1, nMax ) ! make sure it's a valid index, zero-based end subroutine SetTimeIndex From e361b6fe0797a1e04fb04c825f3b03a77742bef6 Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Mon, 31 Jan 2022 08:55:45 -0700 Subject: [PATCH 29/35] Finished WaveMod = 6 implementation plus bug fixes * Removed requirement for WaveMod = 6 to have WaveDT = Driver DT * If WaveMod /= 6 and the WvKinFile is not the empty string, will cause SeaState module to write the kinematics files. * Fixed generation of SeaState summary file when WaveMod = 6 * Fixed setting wave time data range to NStepWave+1 for the Interpolation algorithm * Finished WaveMod = 6 implementation --- modules/seastate/src/SeaState.f90 | 145 ++++++------- modules/seastate/src/SeaState_DriverCode.f90 | 6 +- modules/seastate/src/SeaState_Input.f90 | 19 +- modules/seastate/src/SeaState_Output.f90 | 2 +- modules/seastate/src/UserWaves.f90 | 204 +++++++++---------- 5 files changed, 161 insertions(+), 215 deletions(-) diff --git a/modules/seastate/src/SeaState.f90 b/modules/seastate/src/SeaState.f90 index 826ca4745d..63f0d013c6 100644 --- a/modules/seastate/src/SeaState.f90 +++ b/modules/seastate/src/SeaState.f90 @@ -1029,75 +1029,63 @@ SUBROUTINE SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init !=============================================== IF ( InputFileData%UnSum > 0 ) THEN - versionStr = GetVersion(SeaSt_ProgDesc) - WRITE( InputFileData%UnSum, '(A/)') versionStr - Delim = ' ' - IF (InputFileData%Waves%WaveMod /= 0 .AND. InputFileData%Waves%WaveMod /= 6) THEN + versionStr = GetVersion(SeaSt_ProgDesc) + WRITE( InputFileData%UnSum, '(A/)') versionStr + Delim = ' ' + IF (InputFileData%Waves%WaveMod /= 0 .and. InputFileData%Waves%WaveMod /= 6) THEN - WRITE( InputFileData%UnSum, '(1X,A61,F8.2,A4/)' ) 'The Mean Sea Level to Still Water Level (MSL2SWL) Offset is :',InitOut%MSL2SWL,' (m)' - ! WRITE( InputFileData%UnSum, '(1X,A/)' ) 'Note: The Water Depth and Z_Depth in this summary file are offset from the input file data by MSL2SWL' !, and Z coordinate(s) of the user-requested output location(s) - WRITE( InputFileData%UnSum, '(1X,A15,F8.2,A8)' ) 'Water Density: ', InitOut%WtrDens, '(kg/m^3)' - WRITE( InputFileData%UnSum, '(1X,A15,F8.2,A20,F8.2,A19)' ) 'Water Depth : ', p%WtrDpth - InitOut%MSL2SWL, '(m) relative to MSL; ', p%WtrDpth, '(m) relative to SWL' - WRITE( InputFileData%UnSum, '(1X,A15,F8.2,A20,F8.2,A19/)' ) 'Grid Z_Depth : ', InputFileData%Z_Depth - InitOut%MSL2SWL, '(m) relative to MSL; ', InputFileData%Z_Depth, '(m) relative to SWL' - Frmt = '(1X,ES18.4e2,A,ES18.4e2,A,ES18.4e2,A,ES18.4e2)' - - ! Write Kinematics grid point locations - ! WRITE( InputFileData%UnSum, '(/)' ) - WRITE( InputFileData%UnSum, '(1X,A31/)' ) 'Wave Kinematics Grid Points (m)' - ! WRITE( InputFileData%UnSum, '(/)' ) - WRITE( InputFileData%UnSum, '(1X,A78)' ) ' Xi Yi Zi relative to MSL Z relative to SWL' - do i= 1, p%NGridPts - ! NOTE: The Waves%WaveKinxi, yi, zi arrays hold all the grid point locations - WRITE(InputFileData%UnSum,Frmt) InputFileData%Waves%WaveKinxi(i),Delim, InputFileData%Waves%WaveKinyi(i),Delim, InputFileData%Waves%WaveKinzi(i) + InitOut%MSL2SWL,Delim, InputFileData%Waves%WaveKinzi(i) + WRITE( InputFileData%UnSum, '(1X,A61,F8.2,A4/)' ) 'The Mean Sea Level to Still Water Level (MSL2SWL) Offset is :',InitOut%MSL2SWL,' (m)' + WRITE( InputFileData%UnSum, '(1X,A15,F8.2,A8)' ) 'Water Density: ', InitOut%WtrDens, '(kg/m^3)' + WRITE( InputFileData%UnSum, '(1X,A15,F8.2,A20,F8.2,A19)' ) 'Water Depth : ', p%WtrDpth - InitOut%MSL2SWL, '(m) relative to MSL; ', p%WtrDpth, '(m) relative to SWL' + WRITE( InputFileData%UnSum, '(1X,A15,F8.2,A20,F8.2,A19/)' ) 'Grid Z_Depth : ', InputFileData%Z_Depth - InitOut%MSL2SWL, '(m) relative to MSL; ', InputFileData%Z_Depth, '(m) relative to SWL' + end if + Frmt = '(1X,ES18.4e2,A,ES18.4e2,A,ES18.4e2,A,ES18.4e2)' + ! Write Kinematics grid point locations + WRITE( InputFileData%UnSum, '(1X,A31/)' ) 'Wave Kinematics Grid Points (m)' + WRITE( InputFileData%UnSum, '(1X,A78)' ) ' Xi Yi Zi relative to MSL Z relative to SWL' + do i= 1, p%NGridPts + ! NOTE: The Waves%WaveKinxi, yi, zi arrays hold all the grid point locations + WRITE(InputFileData%UnSum,Frmt) InputFileData%Waves%WaveKinxi(i),Delim, InputFileData%Waves%WaveKinyi(i),Delim, InputFileData%Waves%WaveKinzi(i) + InitOut%MSL2SWL,Delim, InputFileData%Waves%WaveKinzi(i) + end do + + ! ! Write User-requested Wave Kinematics locations + WRITE( InputFileData%UnSum, '(/)' ) + if (p%NWaveKin > 0) then + WRITE( InputFileData%UnSum, '(1X,A51/)' ) 'User-Requested Wave Kinematics Output Locations (m)' + ! WRITE( InputFileData%UnSum, '(/)' ) + WRITE( InputFileData%UnSum, '(2X,A84)' ) 'Index Xi Yi Zi relative to MSL Z relative to SWL' + Frmt = '(1X,I5, 2X,ES18.4e2,A,ES18.4e2,A,ES18.4e2,A,ES18.4e2)' + do i= 1, p%NWaveKin + ! NOTE: The InputFileData%WaveKinxi, yi, zi arrays hold the User-request kinematics output locations + WRITE(InputFileData%UnSum,Frmt) i, InputFileData%WaveKinxi(i),Delim, InputFileData%WaveKinyi(i),Delim, InputFileData%WaveKinzi(i) + InitOut%MSL2SWL,Delim, InputFileData%WaveKinzi(i) end do - - !WRITE( InputFileData%UnSum, '(1X,A11)' ) 'Y-locations' - !do i= 1, p%NGrid(2) - ! WRITE(InputFileData%UnSum,Frmt,ADVANCE='no') Delim, InputFileData%Waves%WaveKinyi(i) - !end do - !WRITE (InputFileData%UnSum,'()', IOSTAT=ErrStat) ! write the line return - !WRITE( InputFileData%UnSum, '(1X,A11)' ) 'Z-locations' - !do i= 1, p%NGrid(3) - ! WRITE(InputFileData%UnSum,Frmt,ADVANCE='no') Delim, InputFileData%Waves%WaveKinzi(i) - !end do - !WRITE (InputFileData%UnSum,'()', IOSTAT=ErrStat) ! write the line return - ! ! Write User-requested Wave Kinematics locations - WRITE( InputFileData%UnSum, '(/)' ) - if (p%NWaveKin > 0) then - WRITE( InputFileData%UnSum, '(1X,A51/)' ) 'User-Requested Wave Kinematics Output Locations (m)' - ! WRITE( InputFileData%UnSum, '(/)' ) - WRITE( InputFileData%UnSum, '(2X,A84)' ) 'Index Xi Yi Zi relative to MSL Z relative to SWL' - Frmt = '(1X,I5, 2X,ES18.4e2,A,ES18.4e2,A,ES18.4e2,A,ES18.4e2)' - do i= 1, p%NWaveKin - ! NOTE: The InputFileData%WaveKinxi, yi, zi arrays hold the User-request kinematics output locations - WRITE(InputFileData%UnSum,Frmt) i, InputFileData%WaveKinxi(i),Delim, InputFileData%WaveKinyi(i),Delim, InputFileData%WaveKinzi(i) + InitOut%MSL2SWL,Delim, InputFileData%WaveKinzi(i) - end do - else - WRITE( InputFileData%UnSum, '(1X,A50)' ) 'No User-Requested Wave Kinematics Output Channels' - end if + else + WRITE( InputFileData%UnSum, '(1X,A50)' ) 'No User-Requested Wave Kinematics Output Channels' + end if - ! Write User-requested Wave Elevations - WRITE( InputFileData%UnSum, '(/)' ) - if (p%NWaveElev > 0) then - WRITE( InputFileData%UnSum, '(1X,A50/)' ) 'User-Requested Wave Elevation Output Locations (m)' - ! WRITE( InputFileData%UnSum, '(/)' ) - WRITE( InputFileData%UnSum, '(2X,A25)' ) 'Index Xi Yi' - Frmt = '(1X,I5, 2X, ES11.4e2,A,ES11.4e2)' - do i= 1, p%NWaveElev - WRITE(InputFileData%UnSum,Frmt) i, InputFileData%WaveElevxi(i), Delim, InputFileData%WaveElevyi(i) - end do + ! Write User-requested Wave Elevations + WRITE( InputFileData%UnSum, '(/)' ) + if (p%NWaveElev > 0) then + WRITE( InputFileData%UnSum, '(1X,A50/)' ) 'User-Requested Wave Elevation Output Locations (m)' + ! WRITE( InputFileData%UnSum, '(/)' ) + WRITE( InputFileData%UnSum, '(2X,A25)' ) 'Index Xi Yi' + Frmt = '(1X,I5, 2X, ES11.4e2,A,ES11.4e2)' + do i= 1, p%NWaveElev + WRITE(InputFileData%UnSum,Frmt) i, InputFileData%WaveElevxi(i), Delim, InputFileData%WaveElevyi(i) + end do - else - WRITE( InputFileData%UnSum, '(1X,A50)' ) 'No User-Requested Wave Elevation Output Channels' - end if - if (p%NumOuts > 0) then - WRITE( InputFileData%UnSum, '(//1X,A/)' ) 'Requested Output Channels' - do i = 1, p%NumOuts - WRITE( InputFileData%UnSum, '(4X,A)' ) InputFileData%OutList(i) - end do - end if - + else + WRITE( InputFileData%UnSum, '(1X,A50)' ) 'No User-Requested Wave Elevation Output Channels' + end if + if (p%NumOuts > 0) then + WRITE( InputFileData%UnSum, '(//1X,A/)' ) 'Requested Output Channels' + do i = 1, p%NumOuts + WRITE( InputFileData%UnSum, '(4X,A)' ) InputFileData%OutList(i) + end do + end if + + IF (InputFileData%Waves%WaveMod /= 6) THEN ! Write wave kinematics at (0,0) WRITE( InputFileData%UnSum, '(/)' ) WRITE( InputFileData%UnSum, '(1X,A28/)' ) 'Wave Kinematics DFT at (0,0)' @@ -1140,11 +1128,11 @@ SUBROUTINE SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init END IF - + ! Setup the 4D grid information for the Interpolatin Module - SeaSt_Interp_InitInp%n = (/p%NStepWave+1,p%nGrid(1),p%nGrid(2),p%nGrid(3)/) + SeaSt_Interp_InitInp%n = (/p%NStepWave,p%nGrid(1),p%nGrid(2),p%nGrid(3)/) SeaSt_Interp_InitInp%delta = (/real(p%WaveDT,ReKi),p%deltaGrid(1),p%deltaGrid(2),p%deltaGrid(3)/) SeaSt_Interp_InitInp%pZero(2) = -InputFileData%X_HalfWidth SeaSt_Interp_InitInp%pZero(3) = -InputFileData%Y_HalfWidth @@ -1200,24 +1188,13 @@ SUBROUTINE SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init - - - - - - - - - - - - - - - - - - + ! Write Wave Kinematics? + if ( InputFileData%Waves%WriteWvKin ) then + call SeaStOut_WriteWvKinFiles( InputFileData%Waves%WvKinFile, SeaSt_ProgDesc, p%NStepWave, p%WaveDT, p%X_HalfWidth, p%Y_HalfWidth, & + p%Z_Depth, p%deltaGrid, p%NGrid, InitOut%WaveElev1, InitOut%WaveElev2, & + InitOut%WaveTime, InitOut%WaveVel, InitOut%WaveAcc, InitOut%WaveDynP, ErrStat, ErrMsg ) + end if + ! Destroy the local initialization data CALL CleanUp() diff --git a/modules/seastate/src/SeaState_DriverCode.f90 b/modules/seastate/src/SeaState_DriverCode.f90 index db79086faf..d35b2a7fec 100644 --- a/modules/seastate/src/SeaState_DriverCode.f90 +++ b/modules/seastate/src/SeaState_DriverCode.f90 @@ -226,11 +226,7 @@ program SeaStateDriver call SeaSt_DvrCleanup() end if - ! Write Wave Kinematics File - call SeaStOut_WriteWvKinFiles( InitInData%OutRootName, version, p%NStepWave, p%WaveDT, p%X_HalfWidth, p%Y_HalfWidth, & - p%Z_Depth, p%deltaGrid, p%NGrid, InitOutData%WaveElev1, InitOutData%WaveElev1, & - InitOutData%WaveTime, InitOutData%WaveVel, InitOutData%WaveAcc, InitOutData%WaveDynP, ErrStat, ErrMsg ) - + ! Nullify these pointers because they are no longer needed nullify(InitOutData%WaveDynP) diff --git a/modules/seastate/src/SeaState_Input.f90 b/modules/seastate/src/SeaState_Input.f90 index 82d40d76e2..8b9250b0ee 100644 --- a/modules/seastate/src/SeaState_Input.f90 +++ b/modules/seastate/src/SeaState_Input.f90 @@ -720,11 +720,7 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E call SetErrStat( ErrID_Fatal,'WaveDT must be greater than zero.',ErrStat,ErrMsg,RoutineName) return end if - - 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 InputFileData%Waves%WaveDT = 0.0 @@ -932,23 +928,16 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E InputFileData%Waves%WvKinFile = TRIM(TmpPath)//TRIM(InputFileData%Waves%WvKinFile) end if InputFileData%Waves%WriteWvKin = .FALSE. - else !don't use this one - -#ifdef WRITE_WV_KIN + else if ( LEN_TRIM( InputFileData%Waves%WvKinFile ) == 0 ) then InputFileData%Waves%WriteWvKin = .FALSE. else - InputFileData%Waves%WriteWvKin = .TRUE. if ( PathIsRelative( InputFileData%Waves%WvKinFile ) ) then - call GetPath( TRIM(InputFileData%InputFile), TmpPath ) + call GetPath( TRIM(InitInp%InputFile), TmpPath ) InputFileData%Waves%WvKinFile = TRIM(TmpPath)//TRIM(InputFileData%Waves%WvKinFile) end if + InputFileData%Waves%WriteWvKin = .TRUE. end if - -#else - InputFileData%Waves%WvKinFile = "" - InputFileData%Waves%WriteWvKin = .FALSE. -#endif end if diff --git a/modules/seastate/src/SeaState_Output.f90 b/modules/seastate/src/SeaState_Output.f90 index 51c5b95fd6..a3c34b0fa8 100644 --- a/modules/seastate/src/SeaState_Output.f90 +++ b/modules/seastate/src/SeaState_Output.f90 @@ -383,7 +383,7 @@ SUBROUTINE SeaStOut_WriteWvKinFiles( Rootname, SeaSt_Prog, NStepWave, WaveDT, X_ call WriteWvKinHeader( UnWv, iFile, Delim, SeaSt_Prog, waveDT, -z_gridPts(1), NGrid, deltaGrid ) - DO m= 0,NStepWave + DO m= 0,NStepWave-1 DO k = 1, NGrid(3) do j = 1, NGrid(2) do i = 1, NGrid(1) diff --git a/modules/seastate/src/UserWaves.f90 b/modules/seastate/src/UserWaves.f90 index a9de2b957f..42c15cad12 100644 --- a/modules/seastate/src/UserWaves.f90 +++ b/modules/seastate/src/UserWaves.f90 @@ -680,13 +680,12 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) INTEGER :: UnWv ! file unit for writing the various wave kinematics files CHARACTER(1024) :: FileName ! complete filename for one of the output files - INTEGER :: I ! Generic index - INTEGER :: J ! Generic index + INTEGER :: i, j, k, m, icount ! Generic index INTEGER :: iFile ! Generic index CHARACTER(64) :: Frmt, Sfrmt CHARACTER(10) :: Delim - CHARACTER(64), ALLOCATABLE :: WaveDataStr(:,:) - REAL(SiKi), ALLOCATABLE :: WaveData(:,:) + CHARACTER(64), ALLOCATABLE :: WaveDataStr(:) + REAL(SiKi), ALLOCATABLE :: WaveData(:) ! Temporary error handling variables INTEGER(IntKi) :: ErrStatTmp ! Temporarary error status for procesing @@ -721,25 +720,25 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) InitOut%NStepWave2 = InitOut%NStepWave/2 - ALLOCATE ( WaveDataStr (0:InitOut%NStepWave,InitInp%NWaveKin ) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveDataStr.', ErrStat,ErrMsg,RoutineName) + ALLOCATE ( WaveDataStr ( InitInp%NGrid(1) ) , STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveDataStr.', ErrStat,ErrMsg,RoutineName) ALLOCATE ( InitOut%nodeInWater (0:InitOut%NStepWave,InitInp%NWaveKin ) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array outOfWaterFlag.', ErrStat,ErrMsg,RoutineName) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array outOfWaterFlag.', ErrStat,ErrMsg,RoutineName) InitOut%nodeInWater = 1 - ALLOCATE ( WaveData (0:InitOut%NStepWave,InitInp%NWaveKin ) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveData.', ErrStat,ErrMsg,RoutineName) + ALLOCATE ( WaveData ( InitInp%NGrid(1) ) , STAT=ErrStatTmp ) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array WaveData.', ErrStat,ErrMsg,RoutineName) WaveData = 0.0_SiKi ALLOCATE ( InitOut%WaveTime (0:InitOut%NStepWave ) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveTime.', ErrStat,ErrMsg,RoutineName) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveTime.', ErrStat,ErrMsg,RoutineName) ALLOCATE ( InitOut%WaveElev (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2) ) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev.', ErrStat,ErrMsg,RoutineName) + IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev.', ErrStat,ErrMsg,RoutineName) InitOut%WaveElev = 0.0_SiKi - ALLOCATE ( InitOut%WaveDynP (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3) ), STAT=ErrStatTmp ) + ALLOCATE ( InitOut%WaveDynP (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3) ), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveDynP.', ErrStat,ErrMsg,'VariousWaves_Init') ALLOCATE ( InitOut%WaveVel (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) @@ -748,65 +747,14 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) ALLOCATE ( InitOut%WaveAcc (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3),3), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveAcc.', ErrStat,ErrMsg,'VariousWaves_Init') - - ! Now check if all the allocations worked properly IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() RETURN END IF - - - ! Read the first file and set the initial values of the - - CALL GetNewUnit( UnWv ) - - FileName = TRIM(InitInp%WvKinFile) // TRIM(extension(1)) - - CALL OpenFInpFile ( UnWv, FileName, ErrStat, ErrMsg ) - IF ( ErrStat /= 0 ) THEN - ErrStat = ErrID_Fatal - ErrMsg = 'Failed to open wave kinematics file, ' // TRIM(FileName) - RETURN - END IF - - - - CALL ReadCom( UnWv, FileName, 'HydroDyn wave kinematics file header line 1', ErrStatTmp, ErrMsgTmp ) - CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - DO i = 0,InitOut%NStepWave-1 - ! Extract fields from current line - IF (.not. ExtractFields(UnWv, WaveDataStr(i,:), InitInp%NWaveKin)) THEN - call Cleanup() - RETURN - END IF - DO j = 1, InitInp%NWaveKin - - isNumeric = is_numeric(WaveDataStr(i,j), WaveData(i,j)) - IF (.NOT. isNumeric )THEN - InitOut%nodeInWater(i,j) = 0 - WaveData(i,j) = 0.0 - ELSE - InitOut%nodeInWater(i,j) = 1 - END IF - - - END DO - - END DO - !TODO: Rework onto grid - ! InitOut%WaveVel (:,:,1) = WaveData(:,:) - - ! Now read the remaining files and check that the elements are consistent with the first file - DO iFile = 2,7 - + DO iFile = 1,7 CALL GetNewUnit( UnWv ) FileName = TRIM(InitInp%WvKinFile) // TRIM(extension(iFile)) @@ -818,67 +766,103 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) RETURN END IF + do i = 1, 13 + CALL ReadCom( UnWv, FileName, 'HydroDyn wave kinematics file header line', ErrStatTmp, ErrMsgTmp ) + CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + end do + + DO m = 0,InitOut%NStepWave-1 + icount = 1 + do k = 1, InitInp%NGrid(3) + do j = 1, InitInp%NGrid(2) + ! Extract fields from current line + IF (.not. ExtractFields(UnWv, WaveDataStr(:), InitInp%NGrid(1))) THEN + call Cleanup() + RETURN + END IF + DO i = 1, InitInp%NGrid(1) + + isNumeric = is_numeric(WaveDataStr(i), WaveData(i)) + IF (.NOT. isNumeric ) THEN + InitOut%nodeInWater(m,icount) = 0 + WaveData(i) = 0.0 + ELSE + InitOut%nodeInWater(m,icount) = 1 + END IF + + SELECT CASE (iFile) + CASE (1) + InitOut%WaveVel (m,i,j,k,1) = WaveData(i) + CASE (2) + InitOut%WaveVel (m,i,j,k,2) = WaveData(i) + CASE (3) + InitOut%WaveVel (m,i,j,k,3) = WaveData(i) + CASE (4) + InitOut%WaveAcc (m,i,j,k,1) = WaveData(i) + CASE (5) + InitOut%WaveAcc (m,i,j,k,2) = WaveData(i) + CASE (6) + InitOut%WaveAcc (m,i,j,k,3) = WaveData(i) + CASE (7) + InitOut%WaveDynP(m,i,j,k ) = WaveData(i) + END SELECT + icount = icount + 1 + END DO + end do + end do + END DO + end do + + ! WaveTime + DO i = 0,InitOut%NStepWave + InitOut%WaveTime(i) = i*InitInp%WaveDT + END DO + ! WaveElev + CALL GetNewUnit( UnWv ) + + FileName = TRIM(InitInp%WvKinFile) // '.Elev' - CALL ReadCom( UnWv, FileName, 'HydroDyn wave kinematics file header line 1', ErrStatTmp, ErrMsgTmp ) + CALL OpenFInpFile ( UnWv, FileName, ErrStat, ErrMsg ) + IF ( ErrStat /= 0 ) THEN + ErrStat = ErrID_Fatal + ErrMsg = 'Failed to open wave elevation file, ' // TRIM(FileName) + RETURN + END IF + + do i = 1, 13 + CALL ReadCom( UnWv, FileName, 'HydroDyn wave elevation file header line', ErrStatTmp, ErrMsgTmp ) CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName ) IF (ErrStat >= AbortErrLev) THEN CALL Cleanup() RETURN END IF - - DO i = 0,InitOut%NStepWave-1 + end do + + DO m = 0,InitOut%NStepWave-1 + do j = 1, InitInp%NGrid(2) ! Extract fields from current line - IF (.not. ExtractFields(UnWv, WaveDataStr(i,:), InitInp%NWaveKin)) THEN - call Cleanup() - RETURN + IF (.not. ExtractFields(UnWv, WaveDataStr(:), InitInp%NGrid(1))) THEN + call Cleanup() + RETURN END IF - DO j = 1, InitInp%NWaveKin - isNumeric = is_numeric(WaveDataStr(i,j), WaveData(i,j)) - IF ( ( isNumeric .AND. (InitOut%nodeInWater(i,j) == 0) ) .OR. ( .NOT. isNumeric .AND. ( InitOut%nodeInWater(i,j) == 1 ) ) ) THEN - ErrStatTmp = ErrID_Fatal - ErrMsgTmp = 'Element of wave kinematics file must be numerical or non-numerical across all files. Problem was found in ' // TRIM(FileName) // ' on row ' // Num2LStr(i+1) // ' and column ' // Num2LStr(j) - CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName ) - CALL CleanUp() - RETURN - END IF + DO i = 1, InitInp%NGrid(1) + isNumeric = is_numeric(WaveDataStr(i), WaveData(i)) IF (.NOT. isNumeric ) THEN - InitOut%nodeInWater(i,j) = 0 - WaveData(i,j) = 0.0 + InitOut%WaveElev(m,i,j ) = 0.0 ELSE - InitOut%nodeInWater(i,j) = 1 + InitOut%WaveElev(m,i,j ) = WaveData(i) END IF END DO - - END DO - SELECT CASE (iFile) - !TODO: Rework onto grid points - !CASE (1) - ! InitOut%WaveVel (:,:,1) = WaveData(:,:) - !CASE (2) - ! InitOut%WaveVel (:,:,2) = WaveData(:,:) - !CASE (3) - ! InitOut%WaveVel (:,:,3) = WaveData(:,:) - !CASE (4) - ! InitOut%WaveAcc (:,:,1) = WaveData(:,:) - !CASE (5) - ! InitOut%WaveAcc (:,:,2) = WaveData(:,:) - !CASE (6) - ! InitOut%WaveAcc (:,:,3) = WaveData(:,:) - !CASE (7) - ! InitOut%WaveDynP = WaveData - END SELECT - - CLOSE(UnWv) - END DO - - ! WaveTime - DO i = 0,InitOut%NStepWave - InitOut%WaveTime(i) = i*InitInp%WaveDT + end do + END DO - - ! WaveElev + !TODO FIX for new grid of XY wave elevations ! IF ( InitInp%NWaveElev > 0 ) THEN ! CALL GetNewUnit( UnWv ) From 78c3849814324c1d21d0488ae5d755f268302d85 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 2 Feb 2022 08:54:28 -0700 Subject: [PATCH 30/35] seastate: change WtrDpth to ReKi so double precision will compile This is more consistent with what is passed into HD and SeaState --- modules/hydrodyn/src/WAMIT.txt | 2 +- modules/hydrodyn/src/WAMIT2.txt | 2 +- modules/hydrodyn/src/WAMIT2_Types.f90 | 4 ++-- modules/hydrodyn/src/WAMIT_Types.f90 | 4 ++-- modules/seastate/src/Waves.f90 | 34 +++++++++++++-------------- modules/seastate/src/Waves2.txt | 2 +- modules/seastate/src/Waves2_Types.f90 | 4 ++-- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/modules/hydrodyn/src/WAMIT.txt b/modules/hydrodyn/src/WAMIT.txt index a1badff14d..93c006e72c 100644 --- a/modules/hydrodyn/src/WAMIT.txt +++ b/modules/hydrodyn/src/WAMIT.txt @@ -22,7 +22,7 @@ param WAMIT/WAMIT unused INTEGER typedef ^ InitInputType INTEGER NBody - - - "[>=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]" - typedef ^ ^ INTEGER 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]" - typedef ^ ^ ReKi Gravity - - - "Supplied by Driver: Gravitational acceleration" "(m/s^2)" -typedef ^ ^ SiKi WtrDpth - - - "Water depth (positive-valued)" m +typedef ^ ^ ReKi WtrDpth - - - "Water depth (positive-valued)" m typedef ^ ^ ReKi PtfmVol0 {:} - - "" - typedef ^ ^ LOGICAL HasWAMIT - - - ".TRUE. if using WAMIT model, .FALSE. otherwise" - typedef ^ ^ ReKi WAMITULEN - - - "" - diff --git a/modules/hydrodyn/src/WAMIT2.txt b/modules/hydrodyn/src/WAMIT2.txt index be56422695..a4935b28c3 100644 --- a/modules/hydrodyn/src/WAMIT2.txt +++ b/modules/hydrodyn/src/WAMIT2.txt @@ -34,7 +34,7 @@ typedef ^ ^ INTEGER NStepWave2 typedef ^ ^ ReKi WaveDOmega - - - "Frequency step for incident wave calculations" (rad/s) typedef ^ ^ ReKi WtrDens - - - "Water density" (kg/m^3) typedef ^ ^ ReKi Gravity - - - "Supplied by Driver: Gravitational acceleration" (m/s^2) -typedef ^ ^ SiKi WtrDpth - - - "Water depth (positive-valued)" (m) +typedef ^ ^ ReKi WtrDpth - - - "Water depth (positive-valued)" (m) typedef ^ ^ SiKi WaveElevC0 {*}{*} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part" (meters) typedef ^ ^ SiKi WaveDir - - - "Mean incident wave propagation heading direction" (degrees) diff --git a/modules/hydrodyn/src/WAMIT2_Types.f90 b/modules/hydrodyn/src/WAMIT2_Types.f90 index 0aefaede22..105da86924 100644 --- a/modules/hydrodyn/src/WAMIT2_Types.f90 +++ b/modules/hydrodyn/src/WAMIT2_Types.f90 @@ -52,7 +52,7 @@ MODULE WAMIT2_Types REAL(ReKi) :: WaveDOmega !< Frequency step for incident wave calculations [(rad/s)] REAL(ReKi) :: WtrDens !< Water density [(kg/m^3)] REAL(ReKi) :: Gravity !< Supplied by Driver: Gravitational acceleration [(m/s^2)] - REAL(SiKi) :: WtrDpth !< Water depth (positive-valued) [(m)] + REAL(ReKi) :: WtrDpth !< Water depth (positive-valued) [(m)] REAL(SiKi) , DIMENSION(:,:), POINTER :: WaveElevC0 => NULL() !< Discrete Fourier transform of the instantaneous elevation of incident waves at the platform reference point. First column is real part, second column is imaginary part [(meters)] REAL(SiKi) :: WaveDir !< Mean incident wave propagation heading direction [(degrees)] LOGICAL :: WaveMultiDir !< Indicates the waves are multidirectional -- set by HydroDyn_Input [-] @@ -710,7 +710,7 @@ SUBROUTINE WAMIT2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 OutData%Gravity = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 - OutData%WtrDpth = REAL(ReKiBuf(Re_Xferred), SiKi) + OutData%WtrDpth = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WaveElevC0 not allocated Int_Xferred = Int_Xferred + 1 diff --git a/modules/hydrodyn/src/WAMIT_Types.f90 b/modules/hydrodyn/src/WAMIT_Types.f90 index 88e3026b51..acd90952f2 100644 --- a/modules/hydrodyn/src/WAMIT_Types.f90 +++ b/modules/hydrodyn/src/WAMIT_Types.f90 @@ -43,7 +43,7 @@ MODULE WAMIT_Types INTEGER(IntKi) :: NBody !< [>=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] [-] INTEGER(IntKi) :: 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] [-] REAL(ReKi) :: Gravity !< Supplied by Driver: Gravitational acceleration [(m/s^2)] - REAL(SiKi) :: WtrDpth !< Water depth (positive-valued) [m] + REAL(ReKi) :: WtrDpth !< Water depth (positive-valued) [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PtfmVol0 !< [-] LOGICAL :: HasWAMIT !< .TRUE. if using WAMIT model, .FALSE. otherwise [-] REAL(ReKi) :: WAMITULEN !< [-] @@ -997,7 +997,7 @@ SUBROUTINE WAMIT_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Xferred = Int_Xferred + 1 OutData%Gravity = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 - OutData%WtrDpth = REAL(ReKiBuf(Re_Xferred), SiKi) + OutData%WtrDpth = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! PtfmVol0 not allocated Int_Xferred = Int_Xferred + 1 diff --git a/modules/seastate/src/Waves.f90 b/modules/seastate/src/Waves.f90 index 8385d8a979..4e5a43ed74 100644 --- a/modules/seastate/src/Waves.f90 +++ b/modules/seastate/src/Waves.f90 @@ -299,7 +299,7 @@ FUNCTION WaveNumber ( Omega, g, h ) ! Passed Variables: REAL(ReKi), INTENT(IN ) :: g ! Gravitational acceleration (m/s^2) - REAL(SiKi), INTENT(IN ) :: h ! Water depth (meters) + REAL(ReKi), INTENT(IN ) :: h ! Water depth (meters) REAL(SiKi), INTENT(IN ) :: Omega ! Wave frequency (rad/s) REAL(SiKi) :: WaveNumber ! This function = wavenumber, k (1/m) @@ -328,7 +328,7 @@ FUNCTION WaveNumber ( Omega, g, h ) ELSE ! Omega > 0.0; solve for the wavenumber as usual. - C = Omega*Omega*h/REAL(g,SiKi) + C = Omega*Omega*REAL(h,SiKi)/REAL(g,SiKi) CC = C*C @@ -355,11 +355,11 @@ FUNCTION WaveNumber ( Omega, g, h ) A = 1.0/( C - C2 ) B = A*( ( 0.5*LOG( ( X0 + C )/( X0 - C ) ) ) - X0 ) - WaveNumber = ( X0 - ( B*C2*( 1.0 + (A*B*C*X0) ) ) )/h + WaveNumber = ( X0 - ( B*C2*( 1.0 + (A*B*C*X0) ) ) )/REAL(h,SiKi) ELSE - WaveNumber = X0/h + WaveNumber = X0/REAL(h,SiKi) END IF @@ -389,7 +389,7 @@ FUNCTION COSHNumOvrCOSHDen ( k, h, z ) ! Passed Variables: REAL(SiKi) :: COSHNumOvrCOSHDen ! This function = COSH( k*( z + h ) )/COSH( k*h ) (-) - REAL(SiKi), INTENT(IN ) :: h ! Water depth ( h > 0 ) (meters) + REAL(ReKi), INTENT(IN ) :: h ! Water depth ( h > 0 ) (meters) REAL(SiKi), INTENT(IN ) :: k ! Wave number ( k >= 0 ) (1/m) REAL(SiKi), INTENT(IN ) :: z ! Elevation (-h <= z <= 0 ) (meters) @@ -399,11 +399,11 @@ FUNCTION COSHNumOvrCOSHDen ( k, h, z ) IF ( k*h > 89.4_SiKi ) THEN ! When .TRUE., the shallow water formulation will trigger a floating point overflow error; however, COSH( k*( z + h ) )/COSH( k*h ) = EXP( k*z ) + EXP( -k*( z + 2*h ) ) for large k*h. This equals the deep water formulation, EXP( k*z ), except near z = -h, because h > 14.23*wavelength (since k = 2*Pi/wavelength) in this case. - COSHNumOvrCOSHDen = EXP( k*z ) + EXP( -k*( z + 2.0_SiKi*h ) ) + COSHNumOvrCOSHDen = EXP( k*z ) + EXP( -k*( z + 2.0_SiKi*REAL(h,SiKi) ) ) ELSE ! 0 < k*h <= 89.4; use the shallow water formulation. - COSHNumOvrCOSHDen =REAL( COSH( k*( z + h ) ),R8Ki)/COSH( k*h ) + COSHNumOvrCOSHDen =REAL( COSH( k*( z + REAL(h,SiKi) ) ),R8Ki)/COSH( k*REAL(h,SiKi) ) END IF @@ -431,7 +431,7 @@ FUNCTION COSHNumOvrSINHDen ( k, h, z ) ! Passed Variables: REAL(SiKi) :: COSHNumOvrSINHDen ! This function = COSH( k*( z + h ) )/SINH( k*h ) (-) - REAL(SiKi), INTENT(IN ) :: h ! Water depth ( h > 0 ) (meters) + REAL(ReKi), INTENT(IN ) :: h ! Water depth ( h > 0 ) (meters) REAL(SiKi), INTENT(IN ) :: k ! Wave number ( k >= 0 ) (1/m) REAL(SiKi), INTENT(IN ) :: z ! Elevation (-h <= z <= 0 ) (meters) @@ -444,13 +444,13 @@ FUNCTION COSHNumOvrSINHDen ( k, h, z ) COSHNumOvrSINHDen = HUGE( k ) - ELSEIF ( k*h > 89.4_SiKi ) THEN ! When .TRUE., the shallow water formulation will trigger a floating point overflow error; however, COSH( k*( z + h ) )/SINH( k*h ) = EXP( k*z ) + EXP( -k*( z + 2*h ) ) for large k*h. This equals the deep water formulation, EXP( k*z ), except near z = -h, because h > 14.23*wavelength (since k = 2*Pi/wavelength) in this case. + ELSEIF ( k*REAL(h,SiKi) > 89.4_SiKi ) THEN ! When .TRUE., the shallow water formulation will trigger a floating point overflow error; however, COSH( k*( z + h ) )/SINH( k*h ) = EXP( k*z ) + EXP( -k*( z + 2*h ) ) for large k*h. This equals the deep water formulation, EXP( k*z ), except near z = -h, because h > 14.23*wavelength (since k = 2*Pi/wavelength) in this case. - COSHNumOvrSINHDen = EXP( k*z ) + EXP( -k*( z + 2*h ) ) + COSHNumOvrSINHDen = EXP( k*z ) + EXP( -k*( z + 2*REAL(h,SiKi) ) ) ELSE ! 0 < k*h <= 89.4; use the shallow water formulation. - COSHNumOvrSINHDen = COSH( k*( z + h ) )/SINH( k*h ) + COSHNumOvrSINHDen = COSH( k*( z + REAL(h,SiKi) ) )/SINH( k*REAL(h,SiKi) ) END IF @@ -515,7 +515,7 @@ FUNCTION SINHNumOvrSINHDen ( k, h, z ) ! Passed Variables: REAL(SiKi) :: SINHNumOvrSINHDen ! This function = SINH( k*( z + h ) )/SINH( k*h ) (-) - REAL(SiKi), INTENT(IN ) :: h ! Water depth ( h > 0 ) (meters) + REAL(ReKi), INTENT(IN ) :: h ! Water depth ( h > 0 ) (meters) REAL(SiKi), INTENT(IN ) :: k ! Wave number ( k >= 0 ) (1/m) REAL(SiKi), INTENT(IN ) :: z ! Elevation (-h <= z <= 0 ) (meters) @@ -527,13 +527,13 @@ FUNCTION SINHNumOvrSINHDen ( k, h, z ) SINHNumOvrSINHDen = 1.0 - ELSEIF ( k*h > 89.4_SiKi ) THEN ! When .TRUE., the shallow water formulation will trigger a floating point overflow error; however, SINH( k*( z + h ) )/SINH( k*h ) = EXP( k*z ) - EXP( -k*( z + 2*h ) ) for large k*h. This equals the deep water formulation, EXP( k*z ), except near z = -h, because h > 14.23*wavelength (since k = 2*Pi/wavelength) in this case. + ELSEIF ( k*REAL(h,SiKi) > 89.4_SiKi ) THEN ! When .TRUE., the shallow water formulation will trigger a floating point overflow error; however, SINH( k*( z + h ) )/SINH( k*h ) = EXP( k*z ) - EXP( -k*( z + 2*h ) ) for large k*h. This equals the deep water formulation, EXP( k*z ), except near z = -h, because h > 14.23*wavelength (since k = 2*Pi/wavelength) in this case. SINHNumOvrSINHDen = EXP( k*z ) - EXP( -k*( z + 2.0_SiKi*h ) ) ELSE ! 0 < k*h <= 89.4; use the shallow water formulation. - SINHNumOvrSINHDen = SINH( k*( z + h ) )/SINH( k*h ) + SINHNumOvrSINHDen = SINH( k*( z + REAL(h,SiKi) ) )/SINH( k*REAL(h,SiKi) ) END IF @@ -2405,7 +2405,7 @@ FUNCTION WheelerStretching ( zOrzPrime, Zeta, h, ForwardOrBackward, ErrStat, Err ! Passed Variables: - REAL(SiKi), INTENT(IN ) :: h ! Water depth (meters) + REAL(ReKi), INTENT(IN ) :: h ! Water depth (meters) REAL(SiKi) :: WheelerStretching ! This function = zPrime [forward] or z [backward] (meters) REAL(SiKi), INTENT(IN ) :: Zeta ! Instantaneous elevation of incident waves (meters) REAL(SiKi), INTENT(IN ) :: zOrzPrime ! Elevations where the wave kinematics are to be applied using Wheeler stretching, z, [forward] or elevations where the wave kinematics are computed before applying Wheeler stretching, zPrime, [backward] (meters) @@ -2425,12 +2425,12 @@ FUNCTION WheelerStretching ( zOrzPrime, Zeta, h, ForwardOrBackward, ErrStat, Err CASE ( 'F' ) ! Forward - WheelerStretching = ( 1.0 + Zeta/h )*zOrzPrime + Zeta + WheelerStretching = ( 1.0 + Zeta/REAL(h,SiKi) )*zOrzPrime + Zeta CASE ( 'B' ) ! Backward - WheelerStretching = ( zOrzPrime - Zeta )/( 1.0 + Zeta/h ) + WheelerStretching = ( zOrzPrime - Zeta )/( 1.0 + Zeta/REAL(h,SiKi) ) CASE DEFAULT diff --git a/modules/seastate/src/Waves2.txt b/modules/seastate/src/Waves2.txt index e185ca0b6c..1cf5b81cb6 100644 --- a/modules/seastate/src/Waves2.txt +++ b/modules/seastate/src/Waves2.txt @@ -23,7 +23,7 @@ typedef Waves2/Waves2 InitInputType INTEGER UnSum typedef ^ ^ ReKi Gravity - - - "Gravitational acceleration" (m/s^2) typedef ^ ^ ReKi WtrDens - - - "Water density" (kg/m^3) -typedef ^ ^ SiKi WtrDpth - - - "Water depth" (meters) +typedef ^ ^ ReKi WtrDpth - - - "Water depth" (meters) typedef ^ ^ INTEGER NStepWave - - - "Total number of frequency components = total number of time steps in the incident wave" - typedef ^ ^ INTEGER NStepWave2 - - - "NStepWave / 2" - diff --git a/modules/seastate/src/Waves2_Types.f90 b/modules/seastate/src/Waves2_Types.f90 index 398c9aef2e..c773876140 100644 --- a/modules/seastate/src/Waves2_Types.f90 +++ b/modules/seastate/src/Waves2_Types.f90 @@ -39,7 +39,7 @@ MODULE Waves2_Types INTEGER(IntKi) :: UnSum !< The unit number for the HydroDyn summary file [-] REAL(ReKi) :: Gravity !< Gravitational acceleration [(m/s^2)] REAL(ReKi) :: WtrDens !< Water density [(kg/m^3)] - REAL(SiKi) :: WtrDpth !< Water depth [(meters)] + REAL(ReKi) :: WtrDpth !< Water depth [(meters)] INTEGER(IntKi) :: NStepWave !< Total number of frequency components = total number of time steps in the incident wave [-] INTEGER(IntKi) :: NStepWave2 !< NStepWave / 2 [-] REAL(SiKi) :: WaveDOmega !< Frequency step for incident wave calculations [(rad/s)] @@ -661,7 +661,7 @@ SUBROUTINE Waves2_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 OutData%WtrDens = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 - OutData%WtrDpth = REAL(ReKiBuf(Re_Xferred), SiKi) + OutData%WtrDpth = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 OutData%NStepWave = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 From 4baac0b774a1cf81c12a48cc9cb9047a278ff32b Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Wed, 2 Feb 2022 15:51:41 -0700 Subject: [PATCH 31/35] Tweaks to Writing and Reading Wave Kinematics + code cleanup * Added input setting in Stand-alone SeaState module driver: WrWvKinMod 0: do not write kinematics 1: write only the (0,0) WaveElevation time series 2: write all kinematics * Changed kinematics writing to write the NStepWave increment (instead of stopping at NStepWave-1) * Fixed kinematics reading to match above condition * Remove completed TODO comments and removed other unnecessary commented out code --- modules/hydrodyn/src/HydroDyn.f90 | 17 +-- modules/hydrodyn/src/HydroDyn_Input.f90 | 4 +- modules/hydrodyn/src/HydroDyn_Output.f90 | 123 ------------------- modules/seastate/src/SeaState.f90 | 49 ++------ modules/seastate/src/SeaState.txt | 1 + modules/seastate/src/SeaState_DriverCode.f90 | 24 +++- modules/seastate/src/SeaState_Input.f90 | 97 +-------------- modules/seastate/src/SeaState_Output.f90 | 64 +++++++++- modules/seastate/src/SeaState_Types.f90 | 7 ++ modules/seastate/src/UserWaves.f90 | 46 ++----- modules/seastate/src/Waves.f90 | 6 +- modules/seastate/src/Waves.txt | 1 - modules/seastate/src/Waves2.f90 | 2 +- modules/seastate/src/Waves_Types.f90 | 7 -- 14 files changed, 125 insertions(+), 323 deletions(-) diff --git a/modules/hydrodyn/src/HydroDyn.f90 b/modules/hydrodyn/src/HydroDyn.f90 index b8974e7f76..0e4a7e48b9 100644 --- a/modules/hydrodyn/src/HydroDyn.f90 +++ b/modules/hydrodyn/src/HydroDyn.f90 @@ -832,22 +832,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I ! DEALLOCATE(WaveDynP0) !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 - !TODO: Where does this belong now GJH 9/24/2021 - !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 (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 - - - + InputFileData%Morison%seast_interp_p = InitInp%seast_interp_p ! Check the output switch to see if Morison is needing to send outputs back to HydroDyn via the WriteOutput array diff --git a/modules/hydrodyn/src/HydroDyn_Input.f90 b/modules/hydrodyn/src/HydroDyn_Input.f90 index 346106a84c..c73b0e85f9 100644 --- a/modules/hydrodyn/src/HydroDyn_Input.f90 +++ b/modules/hydrodyn/src/HydroDyn_Input.f90 @@ -1163,7 +1163,7 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS ! MSL2SWL - Mean sea level to still water level -!TODO: Add check for InputFileData%Morison%MSL2SWL + IF ( InputFileData%PotMod == 1 .AND. .NOT. EqualRealNos(InputFileData%Morison%MSL2SWL, 0.0_ReKi) ) THEN CALL SetErrStat( ErrID_Fatal,'SeaState MSL2SWL must be 0 when PotMod = 1 (WAMIT).',ErrStat,ErrMsg,RoutineName) RETURN @@ -1175,7 +1175,7 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS ! WaveMod - Wave kinematics model switch. -!TODO: Verify this check + IF ( InputFileData%PotMod > 0 .and. InitInp%WaveMod == 6 ) THEN CALL SetErrStat( ErrID_Fatal,'WaveMod must be 0, 1, 1P#, 2, 3, 4, or 5 when PotMod is not 0',ErrStat,ErrMsg,RoutineName) RETURN diff --git a/modules/hydrodyn/src/HydroDyn_Output.f90 b/modules/hydrodyn/src/HydroDyn_Output.f90 index 1ac8ce041c..b78008824f 100644 --- a/modules/hydrodyn/src/HydroDyn_Output.f90 +++ b/modules/hydrodyn/src/HydroDyn_Output.f90 @@ -870,7 +870,6 @@ MODULE HydroDyn_Output PUBLIC :: HDOut_CloseOutput PUBLIC :: HDOut_GetChannels PUBLIC :: HDOUT_Init - PUBLIC :: HDOut_WriteWvKinFiles CONTAINS @@ -952,129 +951,7 @@ SUBROUTINE HDOut_OpenSum( UnSum, SummaryName, HD_Prog, ErrStat, ErrMsg ) END SUBROUTINE HDOut_OpenSum -!==================================================================================================== -SUBROUTINE HDOut_WriteWvKinFiles( Rootname, HD_Prog, NStepWave, NNodes, NWaveElev, nodeInWater, WaveElev, WaveKinzi, & - WaveTime, WaveVel, WaveAcc, WaveDynP, ErrStat, ErrMsg ) - ! Passed variables - CHARACTER(*), INTENT( IN ) :: Rootname ! filename including full path, minus any file extension. - TYPE(ProgDesc), INTENT( IN ) :: HD_Prog ! the name/version/date of the hydrodynamics program - INTEGER, INTENT( IN ) :: NStepWave ! Number of time steps for the wave kinematics arrays - INTEGER, INTENT( IN ) :: NNodes ! Number of simulation nodes for the wave kinematics arrays - INTEGER, INTENT( IN ) :: NWaveElev ! Number of locations where wave elevations were requested - INTEGER, INTENT( IN ) :: nodeInWater(0:,: ) ! - REAL(SiKi), INTENT( IN ) :: WaveElev (0:,: ) ! Instantaneous wave elevations at requested locations - REAL(SiKi), INTENT( IN ) :: WaveKinzi(: ) ! The z-location of all the nodes - REAL(SiKi), INTENT( IN ) :: WaveTime (0: ) ! The time values for the wave kinematics (time) - REAL(SiKi), INTENT( IN ) :: WaveVel (0:,:,:) ! The wave velocities (time,node,component) - REAL(SiKi), INTENT( IN ) :: WaveAcc (0:,:,:) ! The wave accelerations (time,node,component) - REAL(SiKi), INTENT( IN ) :: WaveDynP(0:,:) ! The wave dynamic pressure (time,node) - 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 :: UnWv ! file unit for writing the various wave kinematics files - CHARACTER(1024) :: WvName ! complete filename for one of the output files - CHARACTER(5) :: extension(7) - INTEGER :: i, j, iFile - CHARACTER(64) :: Frmt, Sfrmt - CHARACTER(ChanLen) :: Delim - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - - extension = (/'.Vxi ','.Vyi ','.Vzi ','.Axi ','.Ayi ','.Azi ','.DynP'/) - Delim = '' - !Frmt = '('//TRIM(Int2LStr(NNodes))//'(:,A,ES11.4e2))' - Frmt = '(:,A,ES11.4e2)' - Sfrmt = '(:,A,A11)' - - - - DO iFile = 1,7 - - CALL GetNewUnit( UnWv ) - - WvName = Rootname // TRIM(extension(iFile)) - CALL OpenFOutFile ( UnWv, WvName, ErrStat, ErrMsg ) - IF (ErrStat >=AbortErrLev) RETURN - - - - ! Write the summary file header - ! WRITE (UnWv,'(/,A/)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( HD_Prog%Name )//& - WRITE (UnWv,'(A)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( HD_Prog%Name )//& - ' '//TRIM( HD_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' - - - DO i= 0,NStepWave-1 - DO j = 1, NNodes - IF ( nodeInWater(i,j) == 0 ) THEN - WRITE(UnWv,Sfrmt,ADVANCE='no') Delim, '##########' - ELSE - - SELECT CASE (iFile) - CASE (1) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (i,j,1) - CASE (2) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (i,j,2) - CASE (3) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveVel (i,j,3) - CASE (4) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (i,j,1) - CASE (5) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (i,j,2) - CASE (6) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveAcc (i,j,3) - CASE (7) - WRITE(UnWv,Frmt,ADVANCE='no') Delim, WaveDynP(i,j ) - END SELECT - END IF - END DO - WRITE (UnWv,'()', IOSTAT=ErrStat) ! write the line return - END DO - - CLOSE( UnWv, IOSTAT=ErrStat ) - IF (ErrStat /= 0) THEN - ErrStat = ErrID_Fatal - ErrMsg = 'Problem closing wave kinematics file' - RETURN - END IF - END DO - - IF ( NWaveElev > 0 ) THEN - - CALL GetNewUnit( UnWv ) - - WvName = Rootname // '.Elev' - CALL OpenFOutFile ( UnWv, WvName, ErrStat, ErrMsg ) - IF (ErrStat >=AbortErrLev) RETURN - - - - ! Write the summary file header - WRITE (UnWv,'(A)', IOSTAT=ErrStat) 'This wave kinematics file was generated by '//TRIM( HD_Prog%Name )//& - ' '//TRIM( HD_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' - - - DO i= 0,NStepWave-1 - - Frmt = '('//TRIM(Int2LStr(NWaveElev))//'(:,A,ES11.4e2))' - WRITE(UnWv,Frmt) ( Delim, WaveElev(i,j) , j=1,NWaveElev ) - - END DO - - CLOSE( UnWv, IOSTAT=ErrStat ) - IF (ErrStat /= 0) THEN - ErrStat = ErrID_Fatal - ErrMsg = 'Problem closing wave elevations file' - RETURN - END IF - - END IF - - -END SUBROUTINE HDOut_WriteWvKinFiles !==================================================================================================== SUBROUTINE HDOut_MapOutputs( CurrentTime, p, y, m_WAMIT, m_WAMIT2, F_Add, F_Waves, F_Hydro, PRPmesh, q, qdot, qdotdot, AllOuts, ErrStat, ErrMsg ) diff --git a/modules/seastate/src/SeaState.f90 b/modules/seastate/src/SeaState.f90 index 63f0d013c6..d2bf96ece5 100644 --- a/modules/seastate/src/SeaState.f90 +++ b/modules/seastate/src/SeaState.f90 @@ -677,22 +677,6 @@ SUBROUTINE SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init p%WaveKinxi = InputFileData%WaveKinxi p%WaveKinyi = InputFileData%WaveKinyi p%WaveKinzi = InputFileData%WaveKinzi - - ! CALL MOVE_ALLOC( Waves_InitOut%WaveTime, p%WaveTime ) - ! CALL MOVE_ALLOC( Waves_InitOut%WaveElev, p%WaveElev1 ) ! allocate p%WaveElev1, set p%WaveElev1 = Waves_InitOut%WaveElev, and deallocate Waves_InitOut%WaveElev - - ! Copy the first order wave elevation information to p%WaveElev1 so that we can output the total, first, and second order wave elevation separately - !ALLOCATE ( p%WaveElev (0:p%NStepWave, p%NGrid(1), p%NGrid(2) ) , STAT=ErrStat2 ) - !IF ( ErrStat2 /= 0 ) THEN - ! CALL SetErrStat(ErrID_Fatal,'Error allocating memory for the WaveElev array.',ErrStat,ErrMsg,RoutineName) - ! CALL CleanUp() - ! RETURN - !END IF - !! Need to loop over all the elements and copy - !! TODO: This can create a stack overflowstory error - !p%WaveElev(:,:,:) = p%WaveElev1(:,:,:) - - m%LastIndWave = 1 @@ -1105,17 +1089,6 @@ SUBROUTINE SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init END IF - -!========================================== -!TODO: FIX ME - ! Deallocate any remaining Waves Output data -! IF(ALLOCATED( Waves_InitOut%WaveElevC0 )) DEALLOCATE( Waves_InitOut%WaveElevC0 ) -! IF(ALLOCATED( Waves_InitOut%WaveAcc )) DEALLOCATE( Waves_InitOut%WaveAcc ) -! IF(ALLOCATED( Waves_InitOut%WaveDynP )) DEALLOCATE( Waves_InitOut%WaveDynP ) -! 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( InputFileData%WAMIT%WaveElevC0 )) DEALLOCATE( InputFileData%WAMIT%WaveElevC0) ! Close the summary file IF ( InputFileData%SeaStSum ) THEN @@ -1185,14 +1158,18 @@ SUBROUTINE SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init InitOut%SeaSt_Interp_p = p%seast_interp_p - - - ! Write Wave Kinematics? - if ( InputFileData%Waves%WriteWvKin ) then - call SeaStOut_WriteWvKinFiles( InputFileData%Waves%WvKinFile, SeaSt_ProgDesc, p%NStepWave, p%WaveDT, p%X_HalfWidth, p%Y_HalfWidth, & - p%Z_Depth, p%deltaGrid, p%NGrid, InitOut%WaveElev1, InitOut%WaveElev2, & - InitOut%WaveTime, InitOut%WaveVel, InitOut%WaveAcc, InitOut%WaveDynP, ErrStat, ErrMsg ) + if ( InputFileData%Waves%WaveMod /= 6 ) then + if ( InitInp%WrWvKinMod == 2 ) then + call SeaStOut_WriteWvKinFiles( InitInp%OutRootname, SeaSt_ProgDesc, p%NStepWave, p%WaveDT, p%X_HalfWidth, p%Y_HalfWidth, & + p%Z_Depth, p%deltaGrid, p%NGrid, InitOut%WaveElev1, InitOut%WaveElev2, & + InitOut%WaveTime, InitOut%WaveVel, InitOut%WaveAcc, InitOut%WaveDynP, ErrStat, ErrMsg ) + else if ( InitInp%WrWvKinMod == 1 ) then + call SeaStOut_WriteWaveElev0(InitInp%OutRootname, SeaSt_ProgDesc, p%NStepWave, p%WaveDT, & + p%NGrid, InitOut%WaveElev1, InitOut%WaveElev2, & + InitOut%WaveTime, ErrStat, ErrMsg ) + end if + end if ! Destroy the local initialization data @@ -1431,9 +1408,7 @@ SUBROUTINE SeaSt_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er do i = 1, p%NWaveElev positionXY = (/p%WaveElevxi(i),p%WaveElevyi(i)/) - ! TODO: Why interp the WaveElev. Instead just add 1 + 2 if Waves2 is being used? - !WaveElev(i) = SeaSt_Interp_3D( Time, positionXY, p%WaveElev, p%sea_interp_p, ErrStat2, ErrMsg2 ) - ! call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) + WaveElev1(i) = SeaSt_Interp_3D( Time, positionXY, p%WaveElev1, p%seast_interp_p, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) diff --git a/modules/seastate/src/SeaState.txt b/modules/seastate/src/SeaState.txt index 3451bb1d8a..93a0d17a16 100644 --- a/modules/seastate/src/SeaState.txt +++ b/modules/seastate/src/SeaState.txt @@ -63,6 +63,7 @@ typedef ^ ^ DbKi TMa 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" +typedef ^ ^ IntKi WrWvKinMod - 0 - "0,1, or 2 indicating whether we are going to write out kinematics files. [ignored if WaveMod = 6, if 1 or 2 then files are written using the outrootname]" - # # # Define outputs from the initialization routine here: diff --git a/modules/seastate/src/SeaState_DriverCode.f90 b/modules/seastate/src/SeaState_DriverCode.f90 index d35b2a7fec..eaddab51d0 100644 --- a/modules/seastate/src/SeaState_DriverCode.f90 +++ b/modules/seastate/src/SeaState_DriverCode.f90 @@ -39,6 +39,7 @@ program SeaStateDriver real(ReKi) :: MSL2SWL character(1024) :: SeaStateInputFile character(1024) :: OutRootName + integer :: WrWvKinMod integer :: NSteps real(DbKi) :: TimeInterval logical :: WaveElevSeriesFlag !< Should we put together a wave elevation series and save it to file? @@ -174,7 +175,7 @@ program SeaStateDriver ! figure out how many time steps we should go before writing screen output: n_SttsTime = MAX( 1, NINT( SttsTime / drvrInitInp%TimeInterval ) ) ! this may not be the final TimeInterval, though!!! GJH 8/14/14 - + InitInData%WrWvKinMod = drvrInitInp%WrWvKinMod !------------------------------------------------------------------------------------- ! Begin Simulation Setup !------------------------------------------------------------------------------------- @@ -589,7 +590,26 @@ SUBROUTINE ReadDriverInputFile( inputFile, InitInp, ErrStat, ErrMsg ) return end if - + ! WrWvKinMod - Write Kinematics? + + call ReadVar ( UnIn, FileName, InitInp%WrWvKinMod, 'WrWvKinMod', 'WrWvKinMod', ErrStat, ErrMsg, UnEchoLocal ) + + if ( ErrStat /= ErrID_None ) then + ErrMsg = ' Failed to read WrWvKinMod parameter.' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + if ( InitInp%WrWvKinMod < 0 .or. InitInp%WrWvKinMod > 2 ) then + ErrMsg = ' WrWvKinMod parameter must be 0, 1, or 2' + ErrStat = ErrID_Fatal + call CleanupEchoFile( InitInp%Echo, UnEchoLocal ) + close( UnIn ) + return + end if + + ! NSteps call ReadVar ( UnIn, FileName, InitInp%NSteps, 'NSteps', & diff --git a/modules/seastate/src/SeaState_Input.f90 b/modules/seastate/src/SeaState_Input.f90 index 8b9250b0ee..4601b7f239 100644 --- a/modules/seastate/src/SeaState_Input.f90 +++ b/modules/seastate/src/SeaState_Input.f90 @@ -541,15 +541,6 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E return end if -!TODO: This is now a HD input check only - ! ! MSL2SWL - Mean sea level to still water level - ! - !if ( InputFileData%PotMod == 1 .AND. .NOT. EqualRealNos(InputFileData%MSL2SWL, 0.0_ReKi) ) then - ! call SetErrStat( ErrID_Fatal,'MSL2SWL must be 0 when PotMod = 1 (WAMIT).',ErrStat,ErrMsg,RoutineName) - ! return - !end if - - ! X_HalfWidth - Half-width of the domain in the X direction (m) if ( InputFileData%X_HalfWidth <= 0.0_ReKi ) then call SetErrStat( ErrID_Fatal,'X_HalfWidth must be greater than zero.',ErrStat,ErrMsg,RoutineName) @@ -563,8 +554,7 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E end if ! Z_Depth - Depth of the domain the Z direction (m) - !TODO: I'm not sure we want to offset this grid depth value. Check with Jason. - !InputFileData%Z_Depth = InputFileData%Z_Depth + InputFileData%MSL2SWL + if ( ( InputFileData%Z_Depth <= 0.0_ReKi ) .or. ( InputFileData%Z_Depth > InputFileData%Waves%WtrDpth ) ) then call SetErrStat( ErrID_Fatal,'Z_Depth must be greater than zero and less than or equal to the WtrDpth + MSL2SWL.',ErrStat,ErrMsg,RoutineName) return @@ -621,7 +611,6 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E end if ! LEN_TRIM(InputFileData%Waves%WaveModChr) -!TODO: THese tests need to be done by HD GJH 7/11/21 if ( WaveModIn < 0 .OR. WaveModIn > 6 ) then call SetErrStat( ErrID_Fatal,'WaveMod must be 0, 1, 1P#, 2, 3, 4, 5, or 6.',ErrStat,ErrMsg,RoutineName) return @@ -812,12 +801,6 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E return end if -!TODO: THis needs to be done by HD : Does that mean the WvLowCOff and WvHiCOff need to be InitOut now? - ! ! Copy over the first order frequency limits to the WAMIT2 module which needs them. - !InputFileData%WAMIT2%WvLowCOff = InputFileData%Waves%WvLowCOff - !InputFileData%WAMIT2%WvHiCOff = InputFileData%Waves%WvHiCOff - - ! WaveDir - Wave heading direction. if ( ( InputFileData%Waves%WaveMod > 0 ) .AND. ( InputFileData%Waves%WaveMod /= 6 ) ) then ! .TRUE if we have incident waves, but not user input wave data. @@ -927,17 +910,7 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E call GetPath( TRIM(InitInp%InputFile), TmpPath ) InputFileData%Waves%WvKinFile = TRIM(TmpPath)//TRIM(InputFileData%Waves%WvKinFile) end if - InputFileData%Waves%WriteWvKin = .FALSE. - else - if ( LEN_TRIM( InputFileData%Waves%WvKinFile ) == 0 ) then - InputFileData%Waves%WriteWvKin = .FALSE. - else - if ( PathIsRelative( InputFileData%Waves%WvKinFile ) ) then - call GetPath( TRIM(InitInp%InputFile), TmpPath ) - InputFileData%Waves%WvKinFile = TRIM(TmpPath)//TRIM(InputFileData%Waves%WvKinFile) - end if - InputFileData%Waves%WriteWvKin = .TRUE. - end if + end if @@ -986,15 +959,6 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E return end if -!TODO: This needs to be handled by HD - ! ! Copy over the 2nd order limits to the WAMIT2 module which needs them. - !InputFileData%WAMIT2%WvLowCOffD = InputFileData%Waves2%WvLowCOffD - !InputFileData%WAMIT2%WvHiCOffD = InputFileData%Waves2%WvHiCOffD - !InputFileData%WAMIT2%WvLowCOffS = InputFileData%Waves2%WvLowCOffS - !InputFileData%WAMIT2%WvHiCOffS = InputFileData%Waves2%WvHiCOffS - - - !------------------------------------------------------------------------- ! Check Current section !------------------------------------------------------------------------- @@ -1145,60 +1109,7 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E end if - !TODO: Move these to HD - !.................. - ! check for linearization - !.................. - !if (InitInp%Linearize) 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 ( 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 ( 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 ( 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 ( 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 ( (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 ( 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 ( 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 ( 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 ( 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 ( 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 - ! - !end if - - - + !------------------------------------------------------------------------------------------------- ! Data section for OUTPUT !------------------------------------------------------------------------------------------------- @@ -1285,7 +1196,7 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, Interval, InputFileData, E end if -!TODO: This is now set with the grid points? GJH 7/11/21 +!NOTE: This is now set with the grid points? GJH 7/11/21 ! Establish the number and locations where the wave kinematics will be computed InputFileData%Waves%NWaveKin = p%NGridPts ! Number of points where the incident wave kinematics will be computed (-) InputFileData%Waves%NWaveElev = p%NGrid(1)*p%NGrid(2) ! Number of XY grid points where the wave elevations are computed diff --git a/modules/seastate/src/SeaState_Output.f90 b/modules/seastate/src/SeaState_Output.f90 index a3c34b0fa8..c9631b3f9a 100644 --- a/modules/seastate/src/SeaState_Output.f90 +++ b/modules/seastate/src/SeaState_Output.f90 @@ -238,6 +238,7 @@ MODULE SeaState_Output PUBLIC :: SeaStOut_GetChannels PUBLIC :: SeaStOut_Init PUBLIC :: SeaStOut_WriteWvKinFiles + PUBLIC :: SeaStOut_WriteWaveElev0 CONTAINS @@ -373,6 +374,9 @@ SUBROUTINE SeaStOut_WriteWvKinFiles( Rootname, SeaSt_Prog, NStepWave, WaveDT, X_ z_gridPts(i+1) = - ( 1.0 - cos( real((NGrid(3) - 1) - i, ReKi) * deltaGrid(3) ) ) * Z_Depth end do + ! Write the increments from [0, NStepWave] even though for OpenFAST data, NStepWave = 0, but for arbitrary user data this may not be true. + ! As a result for WaveMod=5,6 we shouldn't assume periodic waves over the period WaveTMax + DO iFile = 1,7 CALL GetNewUnit( UnWv ) @@ -383,7 +387,7 @@ SUBROUTINE SeaStOut_WriteWvKinFiles( Rootname, SeaSt_Prog, NStepWave, WaveDT, X_ call WriteWvKinHeader( UnWv, iFile, Delim, SeaSt_Prog, waveDT, -z_gridPts(1), NGrid, deltaGrid ) - DO m= 0,NStepWave-1 + DO m= 0,NStepWave DO k = 1, NGrid(3) do j = 1, NGrid(2) do i = 1, NGrid(1) @@ -436,7 +440,7 @@ SUBROUTINE SeaStOut_WriteWvKinFiles( Rootname, SeaSt_Prog, NStepWave, WaveDT, X_ call WriteWvKinHeader( UnWv, 8, Delim, SeaSt_Prog, waveDT, -z_gridPts(1), NGrid, deltaGrid ) - DO m= 0,NStepWave-1 + DO m= 0,NStepWave do j = 1, NGrid(2) do i = 1, NGrid(1) !Frmt = '('//TRIM(Int2LStr(NWaveElev))//'(:,A,ES11.4e2))' @@ -518,6 +522,62 @@ end subroutine WriteWvKinHeader END SUBROUTINE SeaStOut_WriteWvKinFiles +subroutine SeaStOut_WriteWaveElev0( Rootname, SeaSt_Prog, NStepWave, WaveDT, NGrid, WaveElev1, WaveElev2, WaveTime, ErrStat, ErrMsg ) + + ! Passed variables + CHARACTER(*), INTENT( IN ) :: Rootname ! filename including full path, minus any file extension. + TYPE(ProgDesc), INTENT( IN ) :: SeaSt_Prog ! the name/version/date of the SeaState program + INTEGER, INTENT( IN ) :: NStepWave ! Number of time steps for the wave kinematics arrays + real(DbKi), intent( in ) :: WaveDT + INTEGER, INTENT( IN ) :: NGrid(3) ! Number of grid points for the wave kinematics arrays + REAL(SiKi), pointer, INTENT( IN ) :: WaveElev1 (:,:,: ) ! Instantaneous wave elevations at requested locations - 1st order + REAL(SiKi), pointer, INTENT( IN ) :: WaveElev2 (:,:,: ) ! Instantaneous wave elevations at requested locations - 2nd order + REAL(SiKi), pointer, INTENT( IN ) :: WaveTime (: ) ! The time values for the wave kinematics (time) + 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 :: UnWv ! file unit for writing the various wave kinematics files + CHARACTER(1024) :: WvName ! complete filename for one of the output files + CHARACTER(5) :: extension(7) + INTEGER :: i, j, k, m, iFile + CHARACTER(64) :: Frmt, Frmt2, Sfrmt + CHARACTER(ChanLen) :: Delim + real(ReKi) :: x_gridPts(NGrid(1)), y_gridPts(NGrid(2)), z_gridPts(NGrid(3)) + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + Frmt = '(F12.4,ES12.4e2)' + Frmt2 = '(2(A12))' + CALL GetNewUnit( UnWv ) + + + WvName = TRIM(Rootname) // '.Elev' + i = NGrid(1) / 2 + 1 + j = NGrid(2) / 2 + 1 + CALL OpenFOutFile ( UnWv, WvName, ErrStat, ErrMsg ) + IF (ErrStat >=AbortErrLev) RETURN + ! WRITE (UnWv,'(A)', IOSTAT=ErrStat) 'This wave elevation (0,0) file was generated by '//TRIM( SeaSt_Prog%Name )//& + ! ' '//TRIM( SeaSt_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' + WRITE (UnWv,Frmt2, IOSTAT=ErrStat) 'Time', 'WaveElev0' + ! Write the increments from [0, NStepWave] even though for OpenFAST data, NStepWave = 0, but for arbitrary user data this may not be true. + ! As a result for WaveMod=5,6 we shouldn't assume periodic waves over the period WaveTMax + DO m= 0,NStepWave + + if ( associated(WaveElev2) ) then + WRITE(UnWv,Frmt) WaveTime(m), WaveElev1(m,i,j) + WaveElev2(m,i,j) + else + WRITE(UnWv,Frmt) WaveTime(m), WaveElev1(m,i,j) + end if + END DO + + CLOSE( UnWv, IOSTAT=ErrStat ) + IF (ErrStat /= 0) THEN + ErrStat = ErrID_Fatal + ErrMsg = 'Problem closing wave elevations file' + RETURN + END IF +end subroutine SeaStOut_WriteWaveElev0 !==================================================================================================== subroutine SeaStOut_MapOutputs( CurrentTime, p, NWaveElev, WaveElev, WaveElev1, WaveElev2, NWaveKin, WaveVel, WaveAcc, WaveDynP, AllOuts, ErrStat, ErrMsg ) diff --git a/modules/seastate/src/SeaState_Types.f90 b/modules/seastate/src/SeaState_Types.f90 index 199cc9cc1c..9e306afe2b 100644 --- a/modules/seastate/src/SeaState_Types.f90 +++ b/modules/seastate/src/SeaState_Types.f90 @@ -85,6 +85,7 @@ MODULE SeaState_Types 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) :: WrWvKinMod = 0 !< 0,1, or 2 indicating whether we are going to write out kinematics files. [ignored if WaveMod = 6, if 1 or 2 then files are written using the outrootname] [-] END TYPE SeaSt_InitInputType ! ======================= ! ========= SeaSt_InitOutputType ======= @@ -1152,6 +1153,7 @@ SUBROUTINE SeaSt_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er ENDIF DstInitInputData%PtfmLocationX = SrcInitInputData%PtfmLocationX DstInitInputData%PtfmLocationY = SrcInitInputData%PtfmLocationY + DstInitInputData%WrWvKinMod = SrcInitInputData%WrWvKinMod END SUBROUTINE SeaSt_CopyInitInput SUBROUTINE SeaSt_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -1237,6 +1239,7 @@ SUBROUTINE SeaSt_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err END IF Re_BufSz = Re_BufSz + 1 ! PtfmLocationX Re_BufSz = Re_BufSz + 1 ! PtfmLocationY + Int_BufSz = Int_BufSz + 1 ! WrWvKinMod IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1336,6 +1339,8 @@ SUBROUTINE SeaSt_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Re_Xferred = Re_Xferred + 1 ReKiBuf(Re_Xferred) = InData%PtfmLocationY Re_Xferred = Re_Xferred + 1 + IntKiBuf(Int_Xferred) = InData%WrWvKinMod + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SeaSt_PackInitInput SUBROUTINE SeaSt_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1453,6 +1458,8 @@ SUBROUTINE SeaSt_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Re_Xferred = Re_Xferred + 1 OutData%PtfmLocationY = ReKiBuf(Re_Xferred) Re_Xferred = Re_Xferred + 1 + OutData%WrWvKinMod = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SeaSt_UnPackInitInput SUBROUTINE SeaSt_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) diff --git a/modules/seastate/src/UserWaves.f90 b/modules/seastate/src/UserWaves.f90 index 42c15cad12..ff3f7456cc 100644 --- a/modules/seastate/src/UserWaves.f90 +++ b/modules/seastate/src/UserWaves.f90 @@ -114,7 +114,9 @@ SUBROUTINE WaveElev_ReadFile ( InitInp, WaveElevData, ErrStat, ErrMsg ) ! Adjust the number of steps since we index from zero WaveElevData%NStepWave = WaveElevData%NStepWave - 1_IntKi - + ! Even though for OpenFAST data, NStepWave time increment data equals the 0 time increment data, + ! we cannot assume that is true for arbitrary user data. Therefore, we read the entire [0, NStepWave] data from file. + ! As a result for WaveMod=5,6 we shouldn't assume periodic waves over the period WaveTMax !-------------------------------------------------- ! Read in the data @@ -753,6 +755,11 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) RETURN END IF + ! Even though for OpenFAST data, NStepWave time increment data equals the 0 time increment data, + ! we cannot assume that is true for arbitrary user data. Therefore, we read the entire [0, NStepWave] data from file. + ! As a result for WaveMod=5,6 we shouldn't assume periodic waves over the period WaveTMax + + ! Read the first file and set the initial values of the DO iFile = 1,7 CALL GetNewUnit( UnWv ) @@ -775,7 +782,7 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) END IF end do - DO m = 0,InitOut%NStepWave-1 + DO m = 0,InitOut%NStepWave icount = 1 do k = 1, InitInp%NGrid(3) do j = 1, InitInp%NGrid(2) @@ -843,7 +850,7 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) END IF end do - DO m = 0,InitOut%NStepWave-1 + DO m = 0,InitOut%NStepWave do j = 1, InitInp%NGrid(2) ! Extract fields from current line IF (.not. ExtractFields(UnWv, WaveDataStr(:), InitInp%NGrid(1))) THEN @@ -863,41 +870,8 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) END DO -!TODO FIX for new grid of XY wave elevations -! IF ( InitInp%NWaveElev > 0 ) THEN -! CALL GetNewUnit( UnWv ) -! -! FileName = TRIM(InitInp%WvKinFile) // '.Elev' -! -! CALL OpenFInpFile ( UnWv, FileName, ErrStat, ErrMsg ) -! IF ( ErrStat /= 0 ) THEN -! ErrStat = ErrID_Fatal -! ErrMsg = 'Failed to open wave elevations file, ' // TRIM(FileName) -! RETURN -! END IF -! -! Frmt = '('//TRIM(Int2LStr(InitInp%NWaveElev))//'(:,A,ES11.4e2))' -! -! CALL ReadCom( UnWv, FileName, 'HydroDyn wave elevations file header line 1', ErrStatTmp, ErrMsgTmp ) -! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName ) -! IF (ErrStat >= AbortErrLev) THEN -! CALL Cleanup() -! RETURN -! END IF -!!TODO: FIX WaveElev based on grid now. -! !DO t = 0,InitOut%NStepWave-1 -! ! Read(UnWv,Frmt) ( Delim, InitOut%WaveElev(t,i,j) , j=1,InitInp%NWaveElev ) -! !END DO -! CLOSE(UnWv) -! END IF CALL CleanUp( ) - ! Need to append the first time step record to the end of each array for periodic waves - InitOut%WaveVel (InitOut%NStepWave,:,:,:,:) = InitOut%WaveVel (0,:,:,:,:) - InitOut%WaveAcc (InitOut%NStepWave,:,:,:,:) = InitOut%WaveAcc (0,:,:,:,:) - InitOut%WaveDynP(InitOut%NStepWave,:,:,:) = InitOut%WaveDynP(0,:,:,: ) - InitOut%WaveElev(InitOut%NStepWave,:,:) = InitOut%WaveElev(0,:,:) - InitOut%nodeInWater(InitOut%NStepWave,:) = InitOut%nodeInWater(0,:) diff --git a/modules/seastate/src/Waves.f90 b/modules/seastate/src/Waves.f90 index 8385d8a979..92710b389b 100644 --- a/modules/seastate/src/Waves.f90 +++ b/modules/seastate/src/Waves.f90 @@ -1133,7 +1133,7 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) !ALLOCATE ( PWaveAcc0VPz0 (0:InitOut%NStepWave-1,InitInp%NWaveKin ), STAT=ErrStatTmp ) !IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array PWaveAcc0VPz0.', ErrStat,ErrMsg,'VariousWaves_Init') -!TODO: These InitOut arrays now need to be organized for the grid points + ALLOCATE ( InitOut%WaveDynP (0:InitOut%NStepWave,InitInp%NGrid(1),InitInp%NGrid(2),InitInp%NGrid(3) ), STAT=ErrStatTmp ) IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveDynP.', ErrStat,ErrMsg,'VariousWaves_Init') @@ -1786,7 +1786,7 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) CALL CleanUp() RETURN END IF -!TODO: FIX ME For generating grid elevations +!NOTE: For all grid points DO k = 1,InitInp%NWaveElev ! Loop through all points where the incident wave elevations are to be computed (normally all the XY grid points) ! This subroutine call applies the FFT at the correct location. i = mod(k-1, InitInp%NGrid(1)) + 1 @@ -2052,7 +2052,7 @@ SUBROUTINE WaveElevTimeSeriesAtXY(Xcoord,Ycoord, WaveElevAtXY, WaveElevCAtXY, Er CALL ApplyFFT_cx ( WaveElevAtXY(0:InitOut%NStepWave-1), tmpComplexArr, FFT_Data, ErrStatLcl2 ) CALL SetErrStat(ErrStatLcl2,'Error occured while applying the FFT to InitOut%WaveElev.',ErrStatLcl,ErrMsgLcl,'WaveElevTimeSeriesAtXY') -!TODO: Why is tmpComplexArr 0:NStepWave2 long? why not NStepWave2-1 ?? GJH + WaveElevCAtXY( 1,: ) = REAL(tmpComplexArr(:)) WaveElevCAtXY( 2,: ) = IMAG(tmpComplexArr(:)) ! Append first datpoint as the last as aid for repeated wave data diff --git a/modules/seastate/src/Waves.txt b/modules/seastate/src/Waves.txt index 1eb0228922..04fdb41088 100644 --- a/modules/seastate/src/Waves.txt +++ b/modules/seastate/src/Waves.txt @@ -21,7 +21,6 @@ include Registry_NWTC_Library.txt typedef Waves/Waves InitInputType CHARACTER(1024) InputFile - - - "Name of the input file" - typedef ^ ^ CHARACTER(1024) DirRoot - - - "The name of the root file including the full path. This may be useful if you want this routine to write a permanent record of what it does to be stored with the simulation results: the results should be stored in a file whose name (including path) is generated by appending any suitable extension to DirRoot." - typedef ^ ^ CHARACTER(1024) WvKinFile - - - "The root name of user input wave kinematics files" - -typedef ^ ^ LOGICAL WriteWvKin - - - "Flag indicating whether we are going to write out kinematics files. [Must be FALSE if WaveMod = 5 or 6, if TRUE then WvKinFile must have a string value and this is the rootname for all the output files]" - typedef ^ ^ INTEGER UnSum - - - "The unit number for the HydroDyn summary file" - typedef ^ ^ ReKi Gravity - - - "Gravitational acceleration" (m/s^2) typedef ^ ^ ReKi MSL2SWL - - - "Offset between still-water level and mean sea level [positive upward; must be zero if using WAMIT]" (meters) diff --git a/modules/seastate/src/Waves2.f90 b/modules/seastate/src/Waves2.f90 index 36a19e7be9..d3efda75cc 100644 --- a/modules/seastate/src/Waves2.f90 +++ b/modules/seastate/src/Waves2.f90 @@ -938,7 +938,7 @@ SUBROUTINE Waves2_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, !! that point. The results are added to the wave elevation results from the diff !! frequency calculations earlier in the code. !-------------------------------------------------------------------------------- -!TODO: This is all grid points +!NOTE: This is all grid points ! Step through the requested points DO k = 1,InitInp%NWaveElev ! Loop through all points where the incident wave elevations are to be computed (normally all the XY grid points) ! This subroutine call applies the FFT at the correct location. diff --git a/modules/seastate/src/Waves_Types.f90 b/modules/seastate/src/Waves_Types.f90 index 3e73667b5c..9520643465 100644 --- a/modules/seastate/src/Waves_Types.f90 +++ b/modules/seastate/src/Waves_Types.f90 @@ -38,7 +38,6 @@ MODULE Waves_Types CHARACTER(1024) :: InputFile !< Name of the input file [-] CHARACTER(1024) :: DirRoot !< The name of the root file including the full path. This may be useful if you want this routine to write a permanent record of what it does to be stored with the simulation results: the results should be stored in a file whose name (including path) is generated by appending any suitable extension to DirRoot. [-] CHARACTER(1024) :: WvKinFile !< The root name of user input wave kinematics files [-] - LOGICAL :: WriteWvKin !< Flag indicating whether we are going to write out kinematics files. [Must be FALSE if WaveMod = 5 or 6, if TRUE then WvKinFile must have a string value and this is the rootname for all the output files] [-] INTEGER(IntKi) :: UnSum !< The unit number for the HydroDyn summary file [-] REAL(ReKi) :: Gravity !< Gravitational acceleration [(m/s^2)] REAL(ReKi) :: MSL2SWL !< Offset between still-water level and mean sea level [positive upward; must be zero if using WAMIT] [(meters)] @@ -171,7 +170,6 @@ SUBROUTINE Waves_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er DstInitInputData%InputFile = SrcInitInputData%InputFile DstInitInputData%DirRoot = SrcInitInputData%DirRoot DstInitInputData%WvKinFile = SrcInitInputData%WvKinFile - DstInitInputData%WriteWvKin = SrcInitInputData%WriteWvKin DstInitInputData%UnSum = SrcInitInputData%UnSum DstInitInputData%Gravity = SrcInitInputData%Gravity DstInitInputData%MSL2SWL = SrcInitInputData%MSL2SWL @@ -362,7 +360,6 @@ SUBROUTINE Waves_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Int_BufSz = Int_BufSz + 1*LEN(InData%InputFile) ! InputFile Int_BufSz = Int_BufSz + 1*LEN(InData%DirRoot) ! DirRoot Int_BufSz = Int_BufSz + 1*LEN(InData%WvKinFile) ! WvKinFile - Int_BufSz = Int_BufSz + 1 ! WriteWvKin Int_BufSz = Int_BufSz + 1 ! UnSum Re_BufSz = Re_BufSz + 1 ! Gravity Re_BufSz = Re_BufSz + 1 ! MSL2SWL @@ -485,8 +482,6 @@ SUBROUTINE Waves_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err IntKiBuf(Int_Xferred) = ICHAR(InData%WvKinFile(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I - IntKiBuf(Int_Xferred) = TRANSFER(InData%WriteWvKin, IntKiBuf(1)) - Int_Xferred = Int_Xferred + 1 IntKiBuf(Int_Xferred) = InData%UnSum Int_Xferred = Int_Xferred + 1 ReKiBuf(Re_Xferred) = InData%Gravity @@ -733,8 +728,6 @@ SUBROUTINE Waves_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, OutData%WvKinFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I - OutData%WriteWvKin = TRANSFER(IntKiBuf(Int_Xferred), OutData%WriteWvKin) - Int_Xferred = Int_Xferred + 1 OutData%UnSum = IntKiBuf(Int_Xferred) Int_Xferred = Int_Xferred + 1 OutData%Gravity = ReKiBuf(Re_Xferred) From 62dbc2129be7579b9bce260df6eedb15716949ed Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Thu, 3 Feb 2022 08:53:50 -0700 Subject: [PATCH 32/35] Fixed a small type casting issue in SeaState Interpolator --- modules/seastate/src/SeaState_Interp.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/seastate/src/SeaState_Interp.f90 b/modules/seastate/src/SeaState_Interp.f90 index fe984659ee..696e86f98d 100644 --- a/modules/seastate/src/SeaState_Interp.f90 +++ b/modules/seastate/src/SeaState_Interp.f90 @@ -311,8 +311,8 @@ subroutine SetTimeIndex(Time, deltaT, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, Er ! for the repeating waves feature, index 10 is the same as index 0, so if Indx_Lo = 10 then we want to ! wrap it back to index 0, if Indx_Lo = 11 we want to wrap back to index 1. - Tmp = Time / deltaT - Tmp = MOD(Tmp,real((nMax), DbKi)) + Tmp = real(Time,ReKi) / deltaT + Tmp = MOD(Tmp,real((nMax), ReKi)) Indx_Lo = INT( Tmp ) ! convert REAL to INTEGER isopc = 2.0_ReKi * (Tmp - REAL(Indx_Lo , ReKi)) - 1.0_ReKi ! convert to value between -1 and 1 From 595544c13631c3f04a78a7659b31cc28c2ed9a0f Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Thu, 3 Feb 2022 10:47:09 -0700 Subject: [PATCH 33/35] Proposed bug fixes for OpenFAST issues #844 and #847 --- modules/hydrodyn/src/Morison.f90 | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/hydrodyn/src/Morison.f90 b/modules/hydrodyn/src/Morison.f90 index f0cce36f87..96a708d4b3 100644 --- a/modules/hydrodyn/src/Morison.f90 +++ b/modules/hydrodyn/src/Morison.f90 @@ -1663,13 +1663,13 @@ subroutine SetMemberProperties( MSL2SWL, gravity, member, MCoefMod, MmbrCoefIDIn if (Zb < -WtrDepth) then ! fully buried element, do not add these volume contributions to totals - else if (0.0 > Zb) then + else if (0.0 >= Zb) then ! Bug fix per OpenFAST issue #844 GJH 2/3/2022 ! fully submerged elements. ! NOTE: For an element which is fractionaly in the seabed, the entire element volume is added to totals member%Vinner = member%Vinner + Vinner_l + Vinner_u member%Vouter = member%Vouter + Vouter_l + Vouter_u member%Vsubmerged = member%Vsubmerged + Vouter_l + Vouter_u - else if ((0.0 > Za) .AND. (0.0 <= Zb)) then + else if ((0.0 > Za) .AND. (0.0 < Zb)) then ! Bug fix per OpenFAST issue #844 GJH 2/3/2022 if (i == 1) then call SetErrStat(ErrID_Fatal, 'The lowest element of a member must not cross the free surface. This is true for MemberID '//trim(num2lstr(member%MemberID)), errStat, errMsg, 'SetMemberProperties') end if @@ -2736,7 +2736,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, alpha_s2= u%Mesh%RotationAcc (:, mem%NodeIndx(i+1)) omega_s2= u%Mesh%RotationVel (:, mem%NodeIndx(i+1)) - if ( .not. mem%PropPot ) then ! Member is NOT modeled with Potential Flow Theory + if ( (.not. mem%PropPot) .and. (i >= mem%i_floor) ) then ! Member is NOT modeled with Potential Flow Theory and not completely buried in the seabed. Bug fix for OpenFast issue #847 GJH 2/3/2022 ! should i_floor theshold be applied to below calculations to avoid wasting time on computing zero-valued things? <<<<< ! should lumped half-element coefficients get combined at initialization? <<< @@ -2809,8 +2809,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, ! ------------------- buoyancy loads: sides: Sections 3.1 and 3.2 ------------------------ -!TODO: What about elements which are buried in the seabed? This doesn't seem to be tested for - if (z1 < 0.0_ReKi) then ! if segment is at least partially submerged ... + if ( z1 < 0.0_ReKi ) then ! if segment is at least partially submerged if (z2 >= 0) then ! special calculation if the slice is partially submerged From 2592679964db7cfdc62eb7bcc48a9802ecb140ef Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Wed, 9 Feb 2022 11:08:39 -0700 Subject: [PATCH 34/35] Altered casting (again) for Time index calculation in SeaState_Interp --- modules/seastate/src/SeaState_Interp.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/seastate/src/SeaState_Interp.f90 b/modules/seastate/src/SeaState_Interp.f90 index 696e86f98d..1aaaa7e6ab 100644 --- a/modules/seastate/src/SeaState_Interp.f90 +++ b/modules/seastate/src/SeaState_Interp.f90 @@ -311,7 +311,7 @@ subroutine SetTimeIndex(Time, deltaT, nMax, Indx_Lo, Indx_Hi, isopc, ErrStat, Er ! for the repeating waves feature, index 10 is the same as index 0, so if Indx_Lo = 10 then we want to ! wrap it back to index 0, if Indx_Lo = 11 we want to wrap back to index 1. - Tmp = real(Time,ReKi) / deltaT + Tmp = real( (Time/ real(deltaT,DbKi)) ,ReKi) Tmp = MOD(Tmp,real((nMax), ReKi)) Indx_Lo = INT( Tmp ) ! convert REAL to INTEGER From 325d1a95e1e7227f37666800e109ecb4f3c4edba Mon Sep 17 00:00:00 2001 From: Gregory Hayman Date: Wed, 16 Feb 2022 16:29:04 -0700 Subject: [PATCH 35/35] Fix for elements below seabed check --- modules/hydrodyn/src/Morison.f90 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/hydrodyn/src/Morison.f90 b/modules/hydrodyn/src/Morison.f90 index 96a708d4b3..eeb0d6d802 100644 --- a/modules/hydrodyn/src/Morison.f90 +++ b/modules/hydrodyn/src/Morison.f90 @@ -2711,6 +2711,8 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, DO i =1,N ! loop through member elements + if ( i >= mem%i_floor ) then ! Member element is not completely buried in the seabed. Bug fix for OpenFast issue #847 GJH 2/3/2022 + ! calculate isntantaneous incline angle and heading, and related trig values ! the first and last NodeIndx values point to the corresponding Joint nodes idices which are at the start of the Mesh @@ -2735,9 +2737,8 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, a_s2 = u%Mesh%TranslationAcc(:, mem%NodeIndx(i+1)) alpha_s2= u%Mesh%RotationAcc (:, mem%NodeIndx(i+1)) omega_s2= u%Mesh%RotationVel (:, mem%NodeIndx(i+1)) - - if ( (.not. mem%PropPot) .and. (i >= mem%i_floor) ) then ! Member is NOT modeled with Potential Flow Theory and not completely buried in the seabed. Bug fix for OpenFast issue #847 GJH 2/3/2022 + if ( .not. mem%PropPot ) then ! Member is NOT modeled with Potential Flow Theory ! should i_floor theshold be applied to below calculations to avoid wasting time on computing zero-valued things? <<<<< ! should lumped half-element coefficients get combined at initialization? <<< @@ -3034,7 +3035,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, ! no load for unflooded element or element fully below seabed end if - + endif ! i >= ifloor