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/docs/OtherSupporting/OutListParameters.xlsx b/docs/OtherSupporting/OutListParameters.xlsx index aeb7f5289c..8c04da7403 100644 Binary files a/docs/OtherSupporting/OutListParameters.xlsx and b/docs/OtherSupporting/OutListParameters.xlsx differ diff --git a/modules/hydrodyn/CMakeLists.txt b/modules/hydrodyn/CMakeLists.txt index 3c10213253..40cc424317 100644 --- a/modules/hydrodyn/CMakeLists.txt +++ b/modules/hydrodyn/CMakeLists.txt @@ -16,20 +16,16 @@ 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) 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 src/Conv_Radiation.f90 - src/Current.f90 src/HydroDyn.f90 src/HydroDyn_Input.f90 src/HydroDyn_Output.f90 @@ -37,30 +33,23 @@ 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/Waves2_Output.f90 src/Conv_Radiation_Types.f90 - src/Current_Types.f90 src/HydroDyn_Types.f90 src/Morison_Types.f90 src/SS_Radiation_Types.f90 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}) -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) diff --git a/modules/hydrodyn/src/HydroDyn.f90 b/modules/hydrodyn/src/HydroDyn.f90 index 5b0e990a3b..0e4a7e48b9 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,44 @@ 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%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 - - - - + + 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 +853,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 +888,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 +965,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 @@ -1705,7 +1161,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 @@ -1729,48 +1185,25 @@ 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%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 !................................ @@ -1792,7 +1225,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 @@ -1822,6 +1255,20 @@ 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%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 ) @@ -2042,10 +1489,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) @@ -2055,9 +1499,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: @@ -2067,15 +1509,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 @@ -2236,28 +1669,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. @@ -2269,7 +1681,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 @@ -2282,12 +1694,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..f9e4240eac 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,84 @@ 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%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%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 +375,26 @@ 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%WaveElev1) + nullify(InitInData%WaveElev2) + if (errStat >= AbortErrLev) then - ! Clean up and exit + ! Clean up and exit call HD_DvrCleanup() end if @@ -320,19 +407,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 +605,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 +686,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 +943,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 +1120,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 +1127,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 3dadca82ba..c73b0e85f9 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, real(defWtrDens,SiKi), 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,15 @@ 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; + + ! 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 ) @@ -665,7 +452,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 +1144,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 +1162,23 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS ! MSL2SWL - Mean sea level to still water level + 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 + + ! WaveMod - Wave kinematics model switch. - 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) + 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 -!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 @@ -1442,22 +1202,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 +1230,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. - - InputFileData%Waves%WaveStMod = 0 + ! TODO: The following can no longer be set because it is part of InitInp and SeaState Parameters. GJH 9/24/2021 + ! InitInp%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 - + InputFileData%WAMIT2%WvLowCOffD = InitInp%WvLowCOffD + InputFileData%WAMIT2%WvHiCOffD = InitInp%WvHiCOffD + InputFileData%WAMIT2%WvLowCOffS = InitInp%WvLowCOffS + InputFileData%WAMIT2%WvHiCOffS = InitInp%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 ! PotFile - Root name of potential flow files @@ -1974,12 +1276,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 +1307,17 @@ 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 + + ! 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 @@ -2266,19 +1580,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 +1623,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 +2225,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 @@ -2933,7 +2247,7 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS InputFileData%Morison%MGTop = -999999.0 InputFileData%Morison%MGBottom = 999999.0 - + DO I = 1,InputFileData%Morison%NMGDepths ! Store the boundaries of the marine growth zone IF ( InputFileData%Morison%MGDepths(I)%MGDpth > InputFileData%Morison%MGTop ) THEN @@ -3087,7 +2401,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 +2452,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 +2475,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 465797a7ce..b78008824f 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 ................................................................................................... @@ -916,7 +870,6 @@ MODULE HydroDyn_Output PUBLIC :: HDOut_CloseOutput PUBLIC :: HDOut_GetChannels PUBLIC :: HDOUT_Init - PUBLIC :: HDOut_WriteWvKinFiles CONTAINS @@ -998,154 +951,28 @@ 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, 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. !---------------------------------------------------------------------------------------------------- - REAL(DbKi), INTENT( IN ) :: CurrentTime ! Current simulation time in seconds - TYPE(HydroDyn_ParameterType), INTENT( IN ) :: p ! HydroDyn's parameter data - TYPE(HydroDyn_OutputType), INTENT( INOUT ) :: y ! HydroDyn's output data - type(WAMIT_MiscVarType), ALLOCATABLE, intent( in ) :: m_WAMIT(:) ! WAMIT object's MiscVar data - type(WAMIT2_MiscVarType), ALLOCATABLE, 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), ALLOCATABLE, INTENT( IN ) :: F_Add(:) - REAL(ReKi), ALLOCATABLE, INTENT( IN ) :: F_Waves(:) - REAL(ReKi), INTENT( IN ) :: F_Hydro(:) ! All hydrodynamic loads integrated at (0,0,0) in the global coordinate system - type(MeshType), INTENT( IN ) :: PRPmesh ! the PRP mesh -- for motions output - REAL(ReKi), INTENT( IN ) :: q(:) ! WAMIT body translations and rotations - REAL(ReKi), INTENT( IN ) :: qdot(:) ! WAMIT body translational and rotational velocities - REAL(ReKi), INTENT( IN ) :: qdotdot(:) ! WAMIT body translational and rotational accelerations - REAL(ReKi), INTENT( OUT ) :: AllOuts(MaxHDOutputs) - INTEGER(IntKi), INTENT( OUT ) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + REAL(DbKi), INTENT( IN ) :: CurrentTime ! Current simulation time in seconds + TYPE(HydroDyn_ParameterType), INTENT( IN ) :: p ! HydroDyn's parameter data + 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 + 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 + type(MeshType), INTENT( IN ) :: PRPmesh ! the PRP mesh -- for motions output + REAL(ReKi), INTENT( IN ) :: q(:) ! WAMIT body translations and rotations + REAL(ReKi), INTENT( IN ) :: qdot(:) ! WAMIT body translational and rotational velocities + REAL(ReKi), INTENT( IN ) :: qdotdot(:) ! WAMIT body translational and rotational accelerations + REAL(ReKi), INTENT( OUT ) :: AllOuts(MaxHDOutputs) + 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 @@ -1204,12 +1031,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 +1060,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 +1168,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 +1215,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 +1272,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 +1301,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 +1320,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 )//'))' @@ -1595,13 +1394,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/HydroDyn_Types.f90 b/modules/hydrodyn/src/HydroDyn_Types.f90 index 3397982a00..b731715e6b 100644 --- a/modules/hydrodyn/src/HydroDyn_Types.f90 +++ b/modules/hydrodyn/src/HydroDyn_Types.f90 @@ -31,15 +31,14 @@ !! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. MODULE HydroDyn_Types !--------------------------------------------------------------------------------------------------------------------------------- -USE Current_Types -USE Waves2_Types USE WAMIT_Types USE WAMIT2_Types USE Morison_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 [-] @@ -47,9 +46,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 [-] @@ -97,13 +94,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) [-] @@ -130,7 +158,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 ! ======================= @@ -138,7 +165,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 ! ======================= @@ -146,7 +172,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 ! ======================= @@ -154,7 +179,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 ! ======================= @@ -171,11 +195,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 ======= @@ -185,7 +207,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] [-] @@ -193,12 +214,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 [-] @@ -231,7 +248,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) [-] @@ -249,6 +265,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' @@ -318,13 +336,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 @@ -506,9 +518,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 @@ -604,54 +614,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 + 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 ! Waves2 + IF(ALLOCATED(Re_Buf)) THEN ! SeaState Re_BufSz = Re_BufSz + SIZE( Re_Buf ) DEALLOCATE(Re_Buf) END IF - IF(ALLOCATED(Db_Buf)) THEN ! Waves2 + IF(ALLOCATED(Db_Buf)) THEN ! SeaState 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 + IF(ALLOCATED(Int_Buf)) THEN ! SeaState Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF @@ -900,63 +876,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 @@ -1291,6 +1211,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' @@ -1446,87 +1368,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 @@ -1903,6 +1745,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' @@ -1938,6 +1783,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 ) @@ -1953,6 +1993,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 ) @@ -2025,29 +2108,121 @@ 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) - RETURN - 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 - IF(OnlySize) RETURN ! return early if only trying to allocate buffers (not pack them) - + 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 + IF(OnlySize) RETURN ! return early if only trying to allocate buffers (not pack them) + Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 @@ -2108,62 +2283,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 @@ -2197,58 +3131,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 ) @@ -2299,9 +3188,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 @@ -2432,7 +3318,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) @@ -2543,23 +3428,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) @@ -2746,34 +3614,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 @@ -3113,46 +3953,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 @@ -3834,9 +4634,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 @@ -3863,7 +4660,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 @@ -3949,23 +4745,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) @@ -4061,38 +4840,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 @@ -4120,6 +4869,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 @@ -4289,46 +5040,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 @@ -4418,9 +5129,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 @@ -4447,7 +5155,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 @@ -4533,23 +5240,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) @@ -4676,34 +5366,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 @@ -4873,46 +5535,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 @@ -4975,9 +5597,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 @@ -4994,7 +5613,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 @@ -5068,23 +5686,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) @@ -5161,34 +5762,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 @@ -5346,46 +5919,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) @@ -5478,9 +6011,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 @@ -5507,7 +6037,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 @@ -5593,23 +6122,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) @@ -5697,46 +6209,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 @@ -5764,6 +6246,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 @@ -5933,46 +6417,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 @@ -6099,9 +6543,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 @@ -6137,9 +6578,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 ) @@ -6172,7 +6610,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) @@ -6186,7 +6623,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 ) @@ -6336,23 +6772,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) @@ -6416,23 +6835,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 @@ -6666,34 +7068,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 @@ -6804,34 +7178,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 ) @@ -7141,46 +7487,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 @@ -7333,46 +7639,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 ) @@ -7427,9 +7693,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 @@ -7439,10 +7702,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) @@ -7452,49 +7715,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) @@ -7645,19 +7865,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) @@ -7773,23 +7984,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) @@ -7813,28 +8007,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 @@ -8019,34 +8197,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 @@ -8087,7 +8237,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 @@ -8104,68 +8254,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 @@ -8529,46 +8617,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 @@ -8628,7 +8676,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) @@ -8641,77 +8689,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 @@ -9398,9 +9375,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 @@ -9442,7 +9416,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 @@ -9532,23 +9505,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) @@ -9697,34 +9653,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 @@ -9937,46 +9865,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 @@ -10346,8 +10234,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 ) @@ -10427,8 +10313,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 1a861ab5ea..eeb0d6d802 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 @@ -1662,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 @@ -1887,7 +1888,12 @@ 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 + 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.' @@ -2158,6 +2164,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 @@ -2276,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) @@ -2318,37 +2331,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 +2386,13 @@ 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%WaveElev1) + nullify(p%WaveElev2) CALL Morison_DestroyParam( p, errStat, errMsg ) @@ -2564,7 +2557,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 @@ -2618,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 @@ -2631,23 +2624,55 @@ 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 - ! 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)) + 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' ) - 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 + 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 + m%FDynP(j) = 0.0 + end if + + m%vrel(:,j) = m%FV(:,j) - u%Mesh%TranslationVel(:,j) + end do ! ============================================================================================== @@ -2686,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 @@ -2710,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 ) then ! Member is NOT modeled with Potential Flow Theory + 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? <<< @@ -2784,14 +2810,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 @@ -3010,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 diff --git a/modules/hydrodyn/src/Morison.txt b/modules/hydrodyn/src/Morison.txt index 2943d32c35..1e1175e271 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,14 @@ 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 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 +305,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 +318,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 +329,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 +341,13 @@ 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 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 +361,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..582e057454 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) "/) @@ -9036,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 @@ -9159,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/hydrodyn/src/Morison_Types.f90 b/modules/hydrodyn/src/Morison_Types.f90 index 09060ae3ff..0715c65c4b 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,14 @@ 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 :: 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 +357,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 +370,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 +380,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 +392,12 @@ 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 :: 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 +412,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 +438,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 +571,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 +5895,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 +5907,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 +6129,51 @@ 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%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 +6181,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 +6193,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 +6211,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 +6245,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 +6328,34 @@ SUBROUTINE Morison_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitInputData%ValidOutList)) THEN DEALLOCATE(InitInputData%ValidOutList) ENDIF -IF (ALLOCATED(InitInputData%WaveAcc)) THEN +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 +6397,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 +6690,34 @@ 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 ! 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 +6725,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 +6777,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 +7317,57 @@ 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%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 +7381,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 +7417,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 +7428,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 +7461,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 +7502,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 +7548,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 +7571,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 +8281,62 @@ 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 ! 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 +8350,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 +8382,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 +8403,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 +8439,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 +8487,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 +9320,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 +9483,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 +9506,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 +9545,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 +9598,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,6 +9678,23 @@ 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 + 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 @@ -9348,6 +9777,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,11 +10020,39 @@ SUBROUTINE Morison_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg END IF IntKiBuf(Int_Xferred) = InData%LastIndWave Int_Xferred = Int_Xferred + 1 - END SUBROUTINE Morison_PackMisc + 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 - SUBROUTINE Morison_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) - REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: ReKiBuf(:) - REAL(DbKi), ALLOCATABLE, INTENT(IN ) :: DbKiBuf(:) + 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 ) + REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: ReKiBuf(:) + REAL(DbKi), ALLOCATABLE, INTENT(IN ) :: DbKiBuf(:) INTEGER(IntKi), ALLOCATABLE, INTENT(IN ) :: IntKiBuf(:) TYPE(Morison_MiscVarType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat @@ -9640,6 +10142,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 +10433,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 +10486,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 +10499,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 +10617,51 @@ 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%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 +10669,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 +10689,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 +10707,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 +10791,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 +10832,29 @@ 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%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 +10877,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 +10920,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 +10983,33 @@ 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 ! 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 +11097,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 +11151,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 +11340,57 @@ 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%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 +11404,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 +11439,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 +11471,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 +11674,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 +11720,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 +11745,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 +11970,62 @@ SUBROUTINE Morison_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er 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 +12039,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 +12077,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 +12112,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 +12142,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 +12370,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 bce90bec42..0a0857a0e8 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..93c006e72c 100644 --- a/modules/hydrodyn/src/WAMIT.txt +++ b/modules/hydrodyn/src/WAMIT.txt @@ -16,12 +16,13 @@ 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]" - 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 - - - "" - @@ -33,6 +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 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 - - - "" - @@ -44,16 +47,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 +124,10 @@ 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 ^ ^ 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 - - - "" - typedef ^ ^ Conv_Rdtn_ParameterType Conv_Rdtn - - - "" - typedef ^ ^ SS_Rad_ParameterType SS_Rdtn - - - "" - @@ -131,6 +140,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..a4935b28c3 100644 --- a/modules/hydrodyn/src/WAMIT2.txt +++ b/modules/hydrodyn/src/WAMIT2.txt @@ -34,15 +34,15 @@ 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 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..105da86924 100644 --- a/modules/hydrodyn/src/WAMIT2_Types.f90 +++ b/modules/hydrodyn/src/WAMIT2_Types.f90 @@ -52,14 +52,13 @@ 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(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(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 [-] - 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 @@ -745,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 @@ -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..acd90952f2 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 ! [-] @@ -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 !< [-] @@ -55,6 +55,8 @@ 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] [-] + 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 !< [-] @@ -64,16 +66,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 +141,10 @@ 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] [-] + 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 !< [-] TYPE(Conv_Rdtn_ParameterType) :: Conv_Rdtn !< [-] TYPE(SS_Rad_ParameterType) :: SS_Rdtn !< [-] @@ -149,6 +157,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 +181,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 +281,8 @@ SUBROUTINE WAMIT_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er ENDIF 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 @@ -292,12 +305,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 +335,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 +365,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 +382,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 +421,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%WaveElevC)) THEN + DEALLOCATE(InitInputData%WaveElevC) ENDIF -IF (ALLOCATED(InitInputData%WaveTime)) THEN +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 +521,8 @@ 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 + 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 @@ -492,20 +553,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 +585,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 +750,10 @@ 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 + 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 @@ -721,7 +813,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 +858,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 +902,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 +931,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 +976,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' @@ -825,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 @@ -961,6 +1133,10 @@ 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%ExctnCutOff = 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 +1211,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 +1249,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 +1262,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 +1297,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 +1319,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 +1346,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 +4212,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 +4266,8 @@ SUBROUTINE WAMIT_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMs ENDIF 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) @@ -4005,6 +4281,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 +4333,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 +4358,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 +4371,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 +4428,17 @@ 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 ! 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 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 +4523,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 +4635,10 @@ 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 + 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 @@ -4329,6 +4658,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 +4836,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 +4881,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 +4973,10 @@ 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 + 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 @@ -4606,6 +4999,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 +5231,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/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/openfast-library/src/FAST_Registry.txt b/modules/openfast-library/src/FAST_Registry.txt index bfaf87a116..3373a8a5e0 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 dcbefe71a2..d6645cd554 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 7a28e2cfc2..782db97cbc 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,86 @@ 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%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%WaveElev1) + nullify(Init%OutData_SeaSt%WaveElev2) + + end if + ! ........................ ! initialize HydroDyn ! ........................ @@ -905,6 +985,19 @@ 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%WaveElev1) + nullify(Init%InData_HD%WaveElev2) + + IF (ErrStat >= AbortErrLev) THEN CALL Cleanup() RETURN @@ -1711,10 +1804,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 ) @@ -1961,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) @@ -2036,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) @@ -2498,6 +2605,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 +2843,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) @@ -3933,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 @@ -3954,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 @@ -3999,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 ) @@ -4013,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 @@ -4507,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 @@ -4531,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 @@ -4755,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 @@ -4867,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 ) @@ -4904,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 @@ -4919,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 @@ -4946,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 @@ -4962,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 @@ -4978,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 @@ -5002,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 @@ -5063,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) @@ -5071,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 @@ -5082,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 @@ -5151,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 diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index 801d11adf5..6c9478a2cd 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -60,16 +60,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 ======= @@ -129,6 +130,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} [-] @@ -150,6 +152,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 [-] @@ -512,6 +515,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 [-] @@ -710,6 +729,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 [-] @@ -766,6 +787,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 [-] @@ -2105,6 +2127,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 @@ -2126,6 +2149,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 @@ -2248,6 +2272,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 @@ -2269,6 +2294,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 @@ -2424,6 +2450,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 @@ -2478,6 +2506,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 @@ -2737,6 +2769,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) @@ -2793,6 +2827,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 @@ -26549,18 +26587,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 @@ -26569,139 +27915,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 @@ -26716,7 +28036,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(:) @@ -26735,7 +28055,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 @@ -26754,7 +28074,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 @@ -26773,7 +28093,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 @@ -26792,7 +28112,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 @@ -26810,7 +28130,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 @@ -26827,7 +28147,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 @@ -26844,7 +28164,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 @@ -26861,7 +28181,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 @@ -26882,7 +28202,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 @@ -26900,46 +28220,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 @@ -26973,7 +28253,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 @@ -27003,7 +28283,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 @@ -27033,7 +28313,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 @@ -27063,7 +28343,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 @@ -27092,7 +28372,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 @@ -27120,7 +28400,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 @@ -27148,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_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 @@ -27176,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_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 @@ -27215,48 +28495,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 @@ -27286,34 +28525,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 @@ -27329,13 +28540,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 @@ -27347,7 +28558,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(:) @@ -27394,7 +28605,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 @@ -27438,7 +28649,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 @@ -27482,98 +28693,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 @@ -27607,13 +28737,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 @@ -27647,7 +28778,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 @@ -27687,27 +28818,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 @@ -27741,29 +28858,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 @@ -27797,15 +28898,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 @@ -27839,13 +28952,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 @@ -27864,11 +28979,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 @@ -27877,113 +28992,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 @@ -27998,7 +29139,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(:) @@ -28017,7 +29158,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 @@ -28036,7 +29177,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 @@ -28055,7 +29196,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 @@ -28074,7 +29215,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 @@ -28092,7 +29233,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 @@ -28109,7 +29250,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 @@ -28126,7 +29267,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 @@ -28143,7 +29284,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 @@ -28164,7 +29305,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 @@ -28182,6 +29323,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 @@ -28215,7 +29396,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 @@ -28245,7 +29426,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 @@ -28273,39 +29627,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 @@ -28334,91 +29667,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 @@ -28446,18 +29707,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 @@ -28485,8 +29737,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 @@ -28502,13 +29752,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 @@ -28520,7 +29770,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(:) @@ -28567,7 +29817,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 @@ -28611,7 +29861,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 @@ -28655,7 +29905,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 @@ -28699,7 +29949,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 @@ -28740,7 +29990,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 @@ -28780,7 +30030,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 @@ -28820,13 +30070,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 @@ -28860,27 +30220,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 @@ -28914,15 +30262,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 @@ -28941,7 +30287,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 @@ -43599,6 +44945,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 @@ -43683,6 +45035,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 ) @@ -43983,6 +45337,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) @@ -44697,6 +46085,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 @@ -45827,6 +47271,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) @@ -46948,6 +48472,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 @@ -46998,6 +48525,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 ) @@ -47250,6 +48778,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) @@ -47744,6 +49289,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 @@ -48527,6 +50100,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) 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 e0438498bd..4dff5d0bf1 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 ab645697cb..1820d5eab3 100644 --- a/modules/openfast-registry/src/reg_parse.c +++ b/modules/openfast-registry/src/reg_parse.c @@ -561,12 +561,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 ) { @@ -584,6 +585,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 diff --git a/modules/seastate/CMakeLists.txt b/modules/seastate/CMakeLists.txt new file mode 100644 index 0000000000..a507ab3845 --- /dev/null +++ b/modules/seastate/CMakeLists.txt @@ -0,0 +1,55 @@ +# +# 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_Input.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/hydrodyn/src/Current.f90 b/modules/seastate/src/Current.f90 similarity index 97% rename from modules/hydrodyn/src/Current.f90 rename to modules/seastate/src/Current.f90 index a7415f6779..88440e0c5a 100644 --- a/modules/hydrodyn/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/hydrodyn/src/Current.txt b/modules/seastate/src/Current.txt similarity index 98% rename from modules/hydrodyn/src/Current.txt rename to modules/seastate/src/Current.txt index 5008b1b0af..54db13cf13 100644 --- a/modules/hydrodyn/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/hydrodyn/src/Current_Types.f90 b/modules/seastate/src/Current_Types.f90 similarity index 97% rename from modules/hydrodyn/src/Current_Types.f90 rename to modules/seastate/src/Current_Types.f90 index f262434bca..5cc09396e6 100644 --- a/modules/hydrodyn/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..d2bf96ece5 --- /dev/null +++ b/modules/seastate/src/SeaState.f90 @@ -0,0 +1,1533 @@ +!********************************************************************************************************************************** +! 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: SeaSt +!.................................................................................................................................. +! 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 :: SeaSt_ProgDesc = ProgDesc( 'SeaState', '', '' ) + + + + + ! ..... Public Subroutines ................................................................................................... + + PUBLIC :: SeaSt_Init ! Initialization routine + PUBLIC :: SeaSt_End ! Ending routine (includes clean up) + + PUBLIC :: SeaSt_UpdateStates ! Loose coupling routine for solving for constraint states, integrating + ! continuous states, and updating discrete states + PUBLIC :: SeaSt_CalcOutput ! Routine for computing outputs + + 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 +!---------------------------------------------------------------------------------------------------------------------------------- +!> 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(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 +! +! +! ! 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 SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) +!.................................................................................................................................. + + 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(SeaSt_MiscVarType), INTENT( OUT) :: m !< Initial misc/optimization variables + REAL(DbKi), INTENT(INOUT) :: Interval !< Coupling interval in seconds: the rate that + !! (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(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 + + + ! Local variables + + CHARACTER(1024) :: SummaryName ! name of the SeaState summary 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(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 + 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 = 'SeaSt_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( SeaSt_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 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() + 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)//'.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() + 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 + InitOut%WaveElev1 => p%WaveElev1 + 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 + + 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%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 + InitOut%WaveElev2 => p%Waves2%WaveElev2 + ! + ! 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 = 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( 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 + END IF + + + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF + +!=============================================== + + 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 + + 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 + + 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 + + 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)' + ! 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 + + ! 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,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 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 + + + ! Write Wave Kinematics? + 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 + CALL CleanUp() + +CONTAINS +!................................ + SUBROUTINE CleanUp() + + 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) + 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 SeaSt_Init + + +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine is called at the end of the simulation. +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 + + + + ! 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 SeaSt_DestroyInput( u, ErrStat, ErrMsg ) + + + ! Destroy the parameter data: + + CALL SeaSt_DestroyParam( p, ErrStat, ErrMsg ) + + + ! Destroy the state data: + + 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 SeaSt_DestroyMisc( m, ErrStat, ErrMsg ) + + ! Destroy the output data: + + CALL SeaSt_DestroyOutput( y, ErrStat, ErrMsg ) + + +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 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(SeaSt_InputType), INTENT(INOUT ) :: Inputs(:) !< Inputs at InputTimes + REAL(DbKi), INTENT(IN ) :: InputTimes(:) !< Times in seconds associated with Inputs + 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(SeaSt_DiscreteStateType), INTENT(INOUT) :: xd !< Input: Discrete states at t; + !! Output: Discrete states at t + Interval + TYPE(SeaSt_ConstraintStateType), INTENT(INOUT) :: z !< Input: Constraint states at t; + !! Output: Constraint states at t + Interval + TYPE(SeaSt_OtherStateType), INTENT(INOUT) :: OtherState !< Other states: Other states at t; + !! Output: Other states at t + Interval + 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 + + + ! Initialize variables + + ErrStat = ErrID_None ! no error has occurred + ErrMsg = "" + + + + +END SUBROUTINE SeaSt_UpdateStates + + +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine for computing outputs, used in both loose and tight coupling. +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(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(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 + + 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, 'SeaSt_CalcOutput' ) + !END IF + + + do i = 1, p%NWaveKin + positionXYZ = (/p%WaveKinxi(i),p%WaveKinyi(i),p%WaveKinzi(i)/) + 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 + + ! 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)/) + + WaveElev1(i) = SeaSt_Interp_3D( Time, positionXY, p%WaveElev1, p%seast_interp_p, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SeaSt_CalcOutput' ) + + 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) + else + WaveElev(i) = WaveElev1(i) + 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, '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, 'SeaSt_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 SeaSt_CalcOutput + + +!---------------------------------------------------------------------------------------------------------------------------------- +!> Tight coupling routine for computing derivatives of continuous states +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(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 = 'SeaSt_CalcContStateDeriv' + + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + + + +END SUBROUTINE SeaSt_CalcContStateDeriv + + + + +!---------------------------------------------------------------------------------------------------------------------------------- +!> Tight coupling routine for solving for the residual of the constraint state equations +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(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 + + + ! 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 SeaSt_CalcConstrStateResidual + + + + + +!---------------------------------------------------------------------------------------------------------------------------------- +END MODULE SeaState +!********************************************************************************************************************************** diff --git a/modules/seastate/src/SeaState.txt b/modules/seastate/src/SeaState.txt new file mode 100644 index 0000000000..93a0d17a16 --- /dev/null +++ b/modules/seastate/src/SeaState.txt @@ -0,0 +1,201 @@ +################################################################################################################################### +################################################################################################################################### +# 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/SeaSt unused INTEGER MaxSeaStOutputs - 90 - "The maximum number of output channels supported by this module" - +# +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 +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/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" - +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" +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: +# +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) +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 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 .................................................................................................................... +# 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 ^ ^ 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 ................................................................................................................ +# 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 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 +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 ^ ^ 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 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..eaddab51d0 --- /dev/null +++ b/modules/seastate/src/SeaState_DriverCode.f90 @@ -0,0 +1,766 @@ +!********************************************************************************************************************************** +! 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 :: WrWvKinMod + 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(SeaSt_InitInputType) :: InitInData ! Input data for initialization + type(SeaSt_InitOutputType) :: InitOutData ! Output data from initialization + + 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(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(SeaSt_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-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 + 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 + + InitInData%WrWvKinMod = drvrInitInp%WrWvKinMod +!------------------------------------------------------------------------------------- +! 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 SeaSt_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 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() + 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 + + + + ! 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 ) + call SeaSt_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) + + + if (errStat >= AbortErrLev) then + ! Clean up and exit + call SeaSt_DvrCleanup() + end if + + + + !............................................................................................................................... + ! 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 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() + 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 SeaSt_DestroyInitInput( InitInData, errStat2, errMsg2 ) + call SetErrStat( errStat2, errMsg2, errStat, errMsg, 'SeaSt_DvrCleanup' ) + + 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. : + 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 + + ! 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', & + '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(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 + + ! 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 + real(SiKi) :: WaveElev,minWaveVal,maxWaveVal + 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 + + 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) + 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(maxWaveVal)) + write (WaveElevFileUn,'(A)', IOSTAT=ErrStatTmp ) '# MinWaveElev = '//TRIM(Num2LStr(minWaveVal)) + 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) + 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) + end if + write (WaveElevFileUn,WaveElevFmt, IOSTAT=ErrStatTmp ) xpos, ypos, WaveElev + 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..4601b7f239 --- /dev/null +++ b/modules/seastate/src/SeaState_Input.f90 @@ -0,0 +1,1304 @@ +!********************************************************************************************************************************** +! 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 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. +!---------------------------------------------------------------------------------------------------- + + ! 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(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 + + ! 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 = 'SeaSt_ParaseInput' + real(ReKi) :: tmp + ! 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', tmp, defWtrDens, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + InputFileData%Waves%WtrDens = tmp + + ! WtrDpth - Water depth + 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; + + !------------------------------------------------------------------------------------------------- + ! 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 SeaSt_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(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(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 + + 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 + + ! 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) + + 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 < 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: + !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 + + 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 + + ! 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 + + 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 + + !------------------------------------------------------------------------- + ! 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 + + + !------------------------------------------------------------------------------------------------- + ! 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 + + ! Shift from MSL to SWL coordinate system + InputFileData%WaveKinzi(:) = InputFileData%WaveKinzi(:) - InputFileData%MSL2SWL + + ! 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 + + +!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 + 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%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-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 + zpos = - ( 1.0 - cos( real((p%NGrid(3) - 1) - k, ReKi) * p%deltaGrid(3) ) ) * InputFileData%Z_Depth + 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.f90 b/modules/seastate/src/SeaState_Interp.f90 new file mode 100644 index 0000000000..1aaaa7e6ab --- /dev/null +++ b/modules/seastate/src/SeaState_Interp.f90 @@ -0,0 +1,707 @@ +!> 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: +!! -- 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 +! 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 :: SeaSt_Interp_Ver = ProgDesc( 'SeaSt_Interp', '', '' ) + + 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 + +!==================================================================================================== + +!---------------------------------------------------------------------------------------------------- +!> A subroutine to initialize the SeaState 4D interpolator module. +!---------------------------------------------------------------------------------------------------- +SUBROUTINE SeaSt_Interp_Init(InitInp, p, ErrStat, ErrMsg) + + + IMPLICIT NONE + + ! Passed Variables + + 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!! + + + + ! 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 = 'SeaSt_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 = SeaSt_Interp_Ver + + RETURN + +END SUBROUTINE SeaSt_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 SeaSt_Interp_CalcOutput(Time, PositionXYZ, p, pWaveKinXX, WaveKinVal, ErrStat, ErrMsg) + + IMPLICIT NONE + + 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(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 + 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 SeaSt_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(SiKi), 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,'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 + + 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,'SetCartesianXYIndex') !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(SiKi), 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(SiKi), intent(inout) :: isopc + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + integer(IntKi) :: i, mult + 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 + +! 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 = real( (Time/ real(deltaT,DbKi)) ,ReKi) + 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 + + !------------------------------------------------------------------------------------------------- + ! 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 ) ! 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 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(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 = 'SeaSt_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) !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), m%Indx_Lo(i), m%Indx_Hi(i), isopc(i), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !warning if x,y is outside the 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) !warning if z is outside the 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 SeaSt_Interp_Setup + +!==================================================================================================== +!> This routine interpolates a 4-d dataset. +!! This method is described here: http://rjwagner49.com/Mathematics/Interpolation.pdf +FUNCTION SeaSt_Interp_4D( pKinXX, m, ErrStat, ErrMsg ) + + ! I/O variables + + real(SiKi), intent(in ) :: pKinXX(0:,:,:,:) + 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 = 'SeaSt_Interp_PointSetup' + Real(SiKi) :: SeaSt_Interp_4D + ! Local variables + + REAL(SiKi) :: u(16) ! size 2^n + + + SeaSt_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) ) + + SeaSt_Interp_4D = SUM ( m%N4D * u ) + +END FUNCTION SeaSt_Interp_4D + +!==================================================================================================== +!> This routine interpolates a 4-d dataset. +!! This method is described here: http://rjwagner49.com/Mathematics/Interpolation.pdf +FUNCTION SeaSt_Interp_4D_Vec( pKinXX, m, ErrStat, ErrMsg ) + + ! I/O variables + + real(SiKi), intent(in ) :: pKinXX(0:,:,:,:,:) + 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 = 'SeaSt_Interp_PointSetup' + Real(SiKi) :: SeaSt_Interp_4D_Vec(3) + ! Local variables + + REAL(SiKi) :: u(16) ! size 2^n + integer(IntKi) :: iDir + + SeaSt_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 ) + + SeaSt_Interp_4D_Vec(iDir) = SUM ( m%N4D * u ) + end do +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 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(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 + ! 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 + + SeaSt_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) !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 + !------------------------------------------------------------------------------------------------- + + 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) ) + + 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 + + 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 SeaSt_Interp_End( ParamData, MiscVars, ErrStat, ErrMsg) + + + IMPLICIT NONE + + CHARACTER(*), PARAMETER :: RoutineName="SeaSt_Interp_End" + + + ! Passed Variables + 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 + 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 SeaSt_Interp_DestroyParam( ParamData, TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + + ! Destroy the misc data + + CALL SeaSt_Interp_DestroyMisc( MiscVars, TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + +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 new file mode 100644 index 0000000000..735362db36 --- /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/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 + +# 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/modules/seastate/src/SeaState_Interp_Types.f90 b/modules/seastate/src/SeaState_Interp_Types.f90 new file mode 100644 index 0000000000..e8a54a9a60 --- /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 +! ========= 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 SeaSt_Interp_InitInputType +! ======================= +! ========= SeaSt_Interp_InitOutputType ======= + TYPE, PUBLIC :: SeaSt_Interp_InitOutputType + TYPE(ProgDesc) :: Ver !< Version information of this submodule [-] + END TYPE SeaSt_Interp_InitOutputType +! ======================= +! ========= 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 SeaSt_Interp_MiscVarType +! ======================= +! ========= 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 SeaSt_Interp_ParameterType +! ======================= +CONTAINS + 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 +! 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 = 'SeaSt_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 SeaSt_Interp_CopyInitInput + + 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 = 'SeaSt_Interp_DestroyInitInput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE SeaSt_Interp_DestroyInitInput + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_Interp_PackInitInput + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_Interp_UnPackInitInput + + 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 +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + 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 SeaSt_Interp_CopyInitOutput + + 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 = '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 SeaSt_Interp_DestroyInitOutput + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_Interp_PackInitOutput + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_Interp_UnPackInitOutput + + 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 +! 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 = 'SeaSt_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 SeaSt_Interp_CopyMisc + + 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 = 'SeaSt_Interp_DestroyMisc' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE SeaSt_Interp_DestroyMisc + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_Interp_PackMisc + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_Interp_UnPackMisc + + 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 +! 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 = 'SeaSt_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 SeaSt_Interp_CopyParam + + 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 = 'SeaSt_Interp_DestroyParam' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE SeaSt_Interp_DestroyParam + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_Interp_PackParam + + 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(SeaSt_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 = 'SeaSt_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 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 new file mode 100644 index 0000000000..c9631b3f9a --- /dev/null +++ b/modules/seastate/src/SeaState_Output.f90 @@ -0,0 +1,1160 @@ +!********************************************************************************************************************************** +! 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 + PUBLIC :: SeaStOut_WriteWaveElev0 + + 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, WaveDT, X_HalfWidth, Y_HalfWidth, & + Z_Depth, deltaGrid, NGrid, WaveElev1, WaveElev2, & + WaveTime, WaveVel, WaveAcc, WaveDynP, 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 + 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 + + ! 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 = "" + + extension = (/'.Vxi ','.Vyi ','.Vzi ','.Axi ','.Ayi ','.Azi ','.DynP'/) + Delim = '' + !Frmt = '('//TRIM(Int2LStr(NNodes))//'(:,A,ES11.4e2))' + 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 + + ! 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 ) + + WvName = TRIM(Rootname) // TRIM(extension(iFile)) + CALL OpenFOutFile ( UnWv, WvName, ErrStat, ErrMsg ) + IF (ErrStat >=AbortErrLev) RETURN + + 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) + + !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 ! 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 + ErrMsg = 'Problem closing wave kinematics file' + RETURN + END IF + END DO + + ! WaveElevation Grid + + CALL GetNewUnit( UnWv ) + + 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 + 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 + + END DO + + 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, Frmt2 + + ! 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)' + Frmt2 = '(A1,I11,A)' + write (UnWv,Frmt, IOSTAT=ErrStat) '!' , waveDT , ' - WaveDT (s)' + 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]' + 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 +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 ) +! This subroutine writes the data stored in the y variable to the correct indexed postions in WriteOutput +! This is called by SeaSt_CalcOutput() at each time step. +!---------------------------------------------------------------------------------------------------- + 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(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(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 + + integer :: I, iBody, startIndx, endIndx + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + 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(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 + + ! 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( 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. +!---------------------------------------------------------------------------------------------------- + + + + ! Passed variables + + TYPE(ProgDesc), INTENT( IN ) :: SeaSt_ProgDesc ! + CHARACTER(1024), INTENT( IN ) :: OutRootName ! The name of the output file + 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 + + ! 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( SeaSt_ProgDesc, OutRootName, p, InitOut, ErrStat, ErrMsg ) + IF (ErrStat >= AbortErrLev ) RETURN + END IF + + + + RETURN + +END SUBROUTINE SeaStOUT_Init + +!==================================================================================================== +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 +!---------------------------------------------------------------------------------------------------- + + + + ! Passed variables + + TYPE(ProgDesc) , INTENT( IN ) :: SeaSt_ProgDesc + CHARACTER(1024), INTENT( IN ) :: OutRootName ! Root name for the output file + 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 + + ! 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(SeaSt_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: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:11), 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(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 + 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(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 + +! ! 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..9e306afe2b --- /dev/null +++ b/modules/seastate/src/SeaState_Types.f90 @@ -0,0 +1,6331 @@ +!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 [-] +! ========= 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] + 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 SeaSt_InputFile +! ======================= +! ========= 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 [-] + 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] + 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 ======= + 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) [-] + 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)] + 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 :: 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 +! ======================= +! ========= SeaSt_ContinuousStateType ======= + TYPE, PUBLIC :: SeaSt_ContinuousStateType + TYPE(Waves2_ContinuousStateType) :: Waves2 !< continuous states from the waves2 module [-] + END TYPE SeaSt_ContinuousStateType +! ======================= +! ========= SeaSt_DiscreteStateType ======= + TYPE, PUBLIC :: SeaSt_DiscreteStateType + TYPE(Waves2_DiscreteStateType) :: Waves2 !< discrete states from the waves2 module [-] + END TYPE SeaSt_DiscreteStateType +! ======================= +! ========= SeaSt_ConstraintStateType ======= + TYPE, PUBLIC :: SeaSt_ConstraintStateType + TYPE(Waves2_ConstraintStateType) :: Waves2 !< constraint states from the waves2 module [-] + END TYPE SeaSt_ConstraintStateType +! ======================= +! ========= SeaSt_OtherStateType ======= + TYPE, PUBLIC :: SeaSt_OtherStateType + TYPE(Waves2_OtherStateType) :: Waves2 !< OtherState information from the Waves2 module [-] + END TYPE SeaSt_OtherStateType +! ======================= +! ========= 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(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 SeaSt_MiscVarType +! ======================= +! ========= 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] + 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)] + 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(SeaSt_Interp_ParameterType) :: SeaSt_Interp_p !< parameter information from the SeaState Interpolation module [-] + END TYPE SeaSt_ParameterType +! ======================= +! ========= SeaSt_InputType ======= + TYPE, PUBLIC :: SeaSt_InputType + REAL(SiKi) :: DummyInput !< Remove this variable if you have discrete states [-] + END TYPE SeaSt_InputType +! ======================= +! ========= 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 SeaSt_OutputType +! ======================= +CONTAINS + 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 +! 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 = 'SeaSt_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 SeaSt_CopyInputFile + + SUBROUTINE SeaSt_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) + TYPE(SeaSt_InputFile), INTENT(INOUT) :: InputFileData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_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 SeaSt_DestroyInputFile + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_PackInputFile + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_UnPackInputFile + + 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 +! 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 = 'SeaSt_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 + DstInitInputData%WrWvKinMod = SrcInitInputData%WrWvKinMod + END SUBROUTINE SeaSt_CopyInitInput + + SUBROUTINE SeaSt_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) + TYPE(SeaSt_InitInputType), INTENT(INOUT) :: InitInputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_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 SeaSt_DestroyInitInput + + 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(SeaSt_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 = 'SeaSt_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 + Int_BufSz = Int_BufSz + 1 ! WrWvKinMod + 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 + IntKiBuf(Int_Xferred) = InData%WrWvKinMod + Int_Xferred = Int_Xferred + 1 + END SUBROUTINE SeaSt_PackInitInput + + 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(SeaSt_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 = 'SeaSt_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 + OutData%WrWvKinMod = IntKiBuf(Int_Xferred) + Int_Xferred = Int_Xferred + 1 + END SUBROUTINE SeaSt_UnPackInitInput + + 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 +! 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 = 'SeaSt_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 +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%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 SeaSt_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) + TYPE(SeaSt_InitOutputType), INTENT(INOUT) :: InitOutputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_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 ) +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%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 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(SeaSt_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 = 'SeaSt_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 + 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 ! 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 + 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 + 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 + 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%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 ! 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 + 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 SeaSt_UnPackInitOutput + + 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 +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + 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 SeaSt_CopyContState + + SUBROUTINE SeaSt_DestroyContState( ContStateData, ErrStat, ErrMsg ) + TYPE(SeaSt_ContinuousStateType), INTENT(INOUT) :: ContStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + 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 SeaSt_DestroyContState + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_PackContState + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_UnPackContState + + 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 +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + 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 SeaSt_CopyDiscState + + SUBROUTINE SeaSt_DestroyDiscState( DiscStateData, ErrStat, ErrMsg ) + TYPE(SeaSt_DiscreteStateType), INTENT(INOUT) :: DiscStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + 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 SeaSt_DestroyDiscState + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_PackDiscState + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_UnPackDiscState + + 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 +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + 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 SeaSt_CopyConstrState + + SUBROUTINE SeaSt_DestroyConstrState( ConstrStateData, ErrStat, ErrMsg ) + TYPE(SeaSt_ConstraintStateType), INTENT(INOUT) :: ConstrStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + 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 SeaSt_DestroyConstrState + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_PackConstrState + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_UnPackConstrState + + 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 +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + 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 SeaSt_CopyOtherState + + SUBROUTINE SeaSt_DestroyOtherState( OtherStateData, ErrStat, ErrMsg ) + TYPE(SeaSt_OtherStateType), INTENT(INOUT) :: OtherStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + 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 SeaSt_DestroyOtherState + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_PackOtherState + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_UnPackOtherState + + 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 +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyMisc' +! + ErrStat = ErrID_None + ErrMsg = "" + DstMiscData%Decimate = SrcMiscData%Decimate + DstMiscData%LastOutTime = SrcMiscData%LastOutTime + 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 + 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 SeaSt_CopyMisc + + SUBROUTINE SeaSt_DestroyMisc( MiscData, ErrStat, ErrMsg ) + TYPE(SeaSt_MiscVarType), INTENT(INOUT) :: MiscData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyMisc' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + 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 SeaSt_DestroyMisc + + 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(SeaSt_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 = 'SeaSt_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 ! 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 + 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 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 + 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 SeaSt_PackMisc + + 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(SeaSt_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 = 'SeaSt_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 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) + 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 SeaSt_UnPackMisc + + 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 +! 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 = 'SeaSt_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%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 + 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 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 SeaSt_CopyParam + + SUBROUTINE SeaSt_DestroyParam( ParamData, ErrStat, ErrMsg ) + TYPE(SeaSt_ParameterType), INTENT(INOUT) :: ParamData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_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 SeaSt_Interp_DestroyParam( ParamData%SeaSt_Interp_p, ErrStat, ErrMsg ) + END SUBROUTINE SeaSt_DestroyParam + + 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(SeaSt_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 = 'SeaSt_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 + 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 + 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 ! 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 + 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 + 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 + 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 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_PackParam + + 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(SeaSt_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 = 'SeaSt_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%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) + 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 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 SeaSt_UnPackParam + + 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 +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_CopyInput' +! + ErrStat = ErrID_None + ErrMsg = "" + DstInputData%DummyInput = SrcInputData%DummyInput + END SUBROUTINE SeaSt_CopyInput + + SUBROUTINE SeaSt_DestroyInput( InputData, ErrStat, ErrMsg ) + TYPE(SeaSt_InputType), INTENT(INOUT) :: InputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_DestroyInput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE SeaSt_DestroyInput + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_PackInput + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_UnPackInput + + 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 +! 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 = 'SeaSt_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 SeaSt_CopyOutput + + SUBROUTINE SeaSt_DestroyOutput( OutputData, ErrStat, ErrMsg ) + TYPE(SeaSt_OutputType), INTENT(INOUT) :: OutputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SeaSt_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 SeaSt_DestroyOutput + + 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(SeaSt_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 = 'SeaSt_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 SeaSt_PackOutput + + 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(SeaSt_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 = 'SeaSt_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 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/hydrodyn/src/UserWaves.f90 b/modules/seastate/src/UserWaves.f90 similarity index 84% rename from modules/hydrodyn/src/UserWaves.f90 rename to modules/seastate/src/UserWaves.f90 index a979b5df93..ff3f7456cc 100644 --- a/modules/hydrodyn/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 @@ -658,7 +660,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 @@ -680,13 +682,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,92 +722,46 @@ 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%NWaveElev ) , STAT=ErrStatTmp ) - IF (ErrStatTmp /= 0) CALL SetErrStat(ErrID_Fatal,'Cannot allocate array InitOut%WaveElev.', 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) 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%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%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%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 IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() 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 - - 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 - - InitOut%WaveVel (:,:,1) = WaveData(:,:) - - ! Now read the remaining files and check that the elements are consistent with the first file - DO iFile = 2,7 - + ! Read the first file and set the initial values of the + DO iFile = 1,7 CALL GetNewUnit( UnWv ) FileName = TRIM(InitInp%WvKinFile) // TRIM(extension(iFile)) @@ -818,121 +773,107 @@ SUBROUTINE UserWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) 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 ( ( 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 + 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 + 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) - 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 - 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 - END SELECT + 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 - CLOSE(UnWv) - END DO - + 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 - IF ( InitInp%NWaveElev > 0 ) THEN - CALL GetNewUnit( UnWv ) + CALL GetNewUnit( UnWv ) - FileName = TRIM(InitInp%WvKinFile) // '.Elev' + 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 + 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 - Frmt = '('//TRIM(Int2LStr(InitInp%NWaveElev))//'(:,A,ES11.4e2))' - - CALL ReadCom( UnWv, FileName, 'HydroDyn wave elevations file header line 1', ErrStatTmp, ErrMsgTmp ) + 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 - Read(UnWv,Frmt) ( Delim, InitOut%WaveElev(i,j) , j=1,InitInp%NWaveElev ) - END DO - CLOSE(UnWv) - END IF + end do + + 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 + call Cleanup() + RETURN + END IF + DO i = 1, InitInp%NGrid(1) + + isNumeric = is_numeric(WaveDataStr(i), WaveData(i)) + IF (.NOT. isNumeric ) THEN + InitOut%WaveElev(m,i,j ) = 0.0 + ELSE + InitOut%WaveElev(m,i,j ) = WaveData(i) + END IF + END DO + end do + + END DO + 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,:) - - ! 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/hydrodyn/src/Waves.f90 b/modules/seastate/src/Waves.f90 similarity index 92% rename from modules/hydrodyn/src/Waves.f90 rename to modules/seastate/src/Waves.f90 index 5358c49a49..e8e1d23bf6 100644 --- a/modules/hydrodyn/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 @@ -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 @@ -577,26 +577,26 @@ SUBROUTINE StillWaterWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) 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') @@ -612,46 +612,38 @@ SUBROUTINE StillWaterWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) 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. @@ -1092,9 +1085,12 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, ErrStat, ErrMsg ) 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 ( 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') @@ -1137,25 +1133,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 ) + + + 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') @@ -1763,17 +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 - - DO J = 1,InitInp%NWaveElev ! Loop through all points where the incident wave elevations can be output +!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. - 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), 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() @@ -1782,28 +1800,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 +1918,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,12 +2007,12 @@ 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%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 ) @@ -2014,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 @@ -2039,12 +2049,14 @@ SUBROUTINE WaveElevTimeSeriesAtXY(Xcoord,Ycoord, WaveElevSeriesAtXY, ErrStatLcl, EXP( -ImagNmbr*WaveNmbr*( Xcoord*CosWaveDir(I)+ & Ycoord*SinWaveDir(I) ) ) ENDDO + + 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') - 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') - + 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 @@ -2173,6 +2185,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? @@ -2392,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) @@ -2412,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/hydrodyn/src/Waves.txt b/modules/seastate/src/Waves.txt similarity index 81% rename from modules/hydrodyn/src/Waves.txt rename to modules/seastate/src/Waves.txt index 366067469c..04fdb41088 100644 --- a/modules/hydrodyn/src/Waves.txt +++ b/modules/seastate/src/Waves.txt @@ -21,10 +21,10 @@ 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) +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) @@ -45,16 +45,16 @@ 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 ^ ^ INTEGER NWaveElev - - - "Number of points where the incident wave elevations can be output" - +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) -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 +64,9 @@ 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 ^ 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) 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 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 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 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/hydrodyn/src/Waves2.f90 b/modules/seastate/src/Waves2.f90 similarity index 94% rename from modules/hydrodyn/src/Waves2.f90 rename to modules/seastate/src/Waves2.f90 index 743e87708f..d3efda75cc 100644 --- a/modules/hydrodyn/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. !-------------------------------------------------------------------------------- - +!NOTE: 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/hydrodyn/src/Waves2.txt b/modules/seastate/src/Waves2.txt similarity index 79% rename from modules/hydrodyn/src/Waves2.txt rename to modules/seastate/src/Waves2.txt index 71aa3c56ad..6b8fa49b99 100644 --- a/modules/hydrodyn/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" - @@ -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/hydrodyn/src/Waves2_Types.f90 b/modules/seastate/src/Waves2_Types.f90 similarity index 69% rename from modules/hydrodyn/src/Waves2_Types.f90 rename to modules/seastate/src/Waves2_Types.f90 index affe3fdc41..15c878c39e 100644 --- a/modules/hydrodyn/src/Waves2_Types.f90 +++ b/modules/seastate/src/Waves2_Types.f90 @@ -39,15 +39,16 @@ 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)] 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(:,:,:), 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 ======= @@ -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' @@ -688,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 @@ -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 +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) - IF (.NOT. ALLOCATED(DstParamData%WaveElev2)) THEN - ALLOCATE(DstParamData%WaveElev2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + 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 @@ -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,9 @@ SUBROUTINE Waves2_DestroyParam( ParamData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(ParamData%WaveTime)) THEN - DEALLOCATE(ParamData%WaveTime) -ENDIF -IF (ALLOCATED(ParamData%WaveElev2)) THEN +IF (ASSOCIATED(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) + ParamData%WaveElev2 => NULL() ENDIF END SUBROUTINE Waves2_DestroyParam @@ -2845,46 +2302,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 + 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 ! 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,22 +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%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 + IF ( .NOT. ASSOCIATED(InData%WaveElev2) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -2950,74 +2357,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 +2388,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 +2414,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 +2424,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 - IF (ALLOCATED(OutData%WaveElev2)) DEALLOCATE(OutData%WaveElev2) - ALLOCATE(OutData%WaveElev2(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 + 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 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 +2577,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 +2595,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 +2632,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 +2660,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 +2677,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 +2690,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 +2928,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 +2942,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 +2979,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 +2999,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/hydrodyn/src/Waves_Types.f90 b/modules/seastate/src/Waves_Types.f90 similarity index 85% rename from modules/hydrodyn/src/Waves_Types.f90 rename to modules/seastate/src/Waves_Types.f90 index 9b98fdc949..9520643465 100644 --- a/modules/hydrodyn/src/Waves_Types.f90 +++ b/modules/seastate/src/Waves_Types.f90 @@ -38,10 +38,10 @@ 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)] + 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)] @@ -62,16 +62,15 @@ 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)] - INTEGER(IntKi) :: NWaveElev !< Number of points where the incident wave elevations can be output [-] + 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)] - 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 +80,9 @@ 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(:,:,:), 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)] @@ -90,16 +90,12 @@ 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(:,:,:,:), 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(:), 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 :: 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 +159,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' @@ -172,10 +170,10 @@ 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 + 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 @@ -379,10 +360,10 @@ 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 + 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 +396,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 @@ -506,14 +482,16 @@ 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 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 +573,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 +701,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' @@ -768,14 +728,18 @@ 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) 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) @@ -824,9 +788,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 @@ -865,29 +829,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 +979,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 +1001,26 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WaveElevC0 = SrcInitOutputData%WaveElevC0 ENDIF -IF (ALLOCATED(SrcInitOutputData%WaveDirArr)) THEN +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. 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 +1047,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 +1065,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 +1085,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 +1105,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 @@ -1206,24 +1133,10 @@ SUBROUTINE Waves_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, 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 +1174,42 @@ 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 (ALLOCATED(InitOutputData%WaveElevC)) THEN + DEALLOCATE(InitOutputData%WaveElevC) +ENDIF +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 +1252,17 @@ 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 ! 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 ( 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,39 +1277,24 @@ 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 @@ -1401,13 +1302,8 @@ SUBROUTINE Waves_PackInitOutput( 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 ! 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 +1343,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 +1363,32 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO END DO END IF - IF ( .NOT. ALLOCATED(InData%WaveDirArr) ) 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%WaveDirArr) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 ELSE @@ -1509,27 +1430,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 +1441,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 +1475,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) + 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,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PWaveAcc0,2) - 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 +1510,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 @@ -1660,12 +1541,17 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er 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 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 + 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 @@ -1684,27 +1570,7 @@ SUBROUTINE Waves_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er 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 - 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 +1631,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 +1656,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) @@ -1801,6 +1669,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 @@ -1808,7 +1704,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 +1745,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 +1755,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 +1791,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) + 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) - 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 +1829,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,44 +1867,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 @@ -2048,29 +1900,6 @@ SUBROUTINE Waves_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, 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 +1907,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/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 faf06756d7..e644294706 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 @@ -199,6 +197,17 @@ GOTO checkError SET CURR_LOC=%HD_Loc% SET Output_Loc=%CURR_LOC% +%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -I "%SEAST_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 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +