diff --git a/docs/source/user/beamdyn/input_files.rst b/docs/source/user/beamdyn/input_files.rst index 412e921555..915e6ac0b2 100644 --- a/docs/source/user/beamdyn/input_files.rst +++ b/docs/source/user/beamdyn/input_files.rst @@ -266,6 +266,12 @@ keyword “DEFAULT” sets ``N_Fact = 5``. time-integration in seconds. The keyword “DEFAULT” may be used to indicate that the module should employ the time increment prescribed by the driver code (FAST/stand-alone driver program). +``DTBeam`` must be equal to or an integer divisor of the glue-code or +driver time step ``DT``. When it is smaller, BeamDyn takes +``DT``/``DTBeam`` steps per glue-code or driver step, and output is +written every ``DT``. In OpenFAST with tight coupling (``ModCoupling`` = +2 or 3), the glue code integrates the BeamDyn states at ``DT`` and +``DTBeam`` is not used. ``load_retries`` specifies the maximum number of load retries allowed. This option currently works only for static analysis. For every load retry, the applied load is diff --git a/modules/beamdyn/src/BeamDyn.f90 b/modules/beamdyn/src/BeamDyn.f90 index 1b510e8a82..fbdba0d808 100644 --- a/modules/beamdyn/src/BeamDyn.f90 +++ b/modules/beamdyn/src/BeamDyn.f90 @@ -127,6 +127,9 @@ SUBROUTINE BD_Init( InitInp, u, p, x, xd, z, OtherState, y, MiscVar, Interval, I ! this routine sets *some* of the parameters (basically the "easy" ones) call SetParameters(InitInp, InputFileData, p, OtherState, ErrStat2, ErrMsg2); if (Failed()) return + ! Return the time step BeamDyn uses (DTBeam) so the caller can step (or sub-step) consistently + Interval = p%dt + ! Temporary GLL point intrinsic coordinates array CALL BD_GenerateGLL(p%nodes_per_elem,GLL_nodes,ErrStat2,ErrMsg2); if (Failed()) return @@ -2010,7 +2013,10 @@ SUBROUTINE BD_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! Place any last minute operations or calculations here: ! Close files here: - if (m%Un_Sum > 0) CLOSE(m%Un_Sum) + if (m%Un_Sum > 0) then + CLOSE(m%Un_Sum) + m%Un_Sum = -1 + endif ! Destroy the input data: @@ -2060,6 +2066,7 @@ SUBROUTINE BD_UpdateStates( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + TYPE(BD_InputType) :: u_interp ! Inputs interpolated to t+dt (used only when sub-stepping) INTEGER(IntKi) :: ErrStat2 ! Temporary Error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary Error message @@ -2071,9 +2078,26 @@ SUBROUTINE BD_UpdateStates( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat CALL BD_GA2( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,''); if (ErrStat >= AbortErrLev) return - ! change reference frame to root motion at t=T+DT (u(1)%RootMotionMesh) - call BD_UpdateGlobalRef(u(1),p,x,OtherState,ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'') + ! change reference frame to root motion at t+dt + if (EqualRealNos(utimes(1), t + p%dt)) then + ! u(1) is at t+dt (BeamDyn time step is the same as the caller's) + call BD_UpdateGlobalRef(u(1),p,x,OtherState,ErrStat2,ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'') + else + ! BeamDyn is being sub-stepped, so u(1) is at the end of the caller's step, not at t+dt. + ! Interpolate the (global frame) inputs to t+dt so the root motion matches the states. + call BD_CopyInput(u(1), u_interp, MESH_NEWCOPY, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'') + if (ErrStat < AbortErrLev) then + call BD_Input_ExtrapInterp(u, utimes, u_interp, t + p%dt, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'') + end if + if (ErrStat < AbortErrLev) then + call BD_UpdateGlobalRef(u_interp,p,x,OtherState,ErrStat2,ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'') + end if + call BD_DestroyInput(u_interp, ErrStat2, ErrMsg2) + end if ELSE !IF(p%analysis_type == BD_STATIC_ANALYSIS) THEN CALL BD_Static( t, u, utimes, p, x, OtherState, m, ErrStat, ErrMsg ) ENDIF diff --git a/modules/beamdyn/src/BeamDyn_IO.f90 b/modules/beamdyn/src/BeamDyn_IO.f90 index 3bebee9578..2429033ed5 100644 --- a/modules/beamdyn/src/BeamDyn_IO.f90 +++ b/modules/beamdyn/src/BeamDyn_IO.f90 @@ -1534,6 +1534,10 @@ SUBROUTINE BD_ValidateInputData( InitInp, InputFileData, ErrStat, ErrMsg ) IF(InputFileData%QuasiStaticInit .AND. (.NOT. InitInp%DynamicSolve)) & CALL SetErrStat ( ErrID_Warn, 'QuasiStaticInit option only valid with dynamic solve. Ignoring.', ErrStat, ErrMsg, RoutineName ) + ! Time step must be positive for dynamic solves (not used in static solves) + IF(InitInp%DynamicSolve .AND. InputFileData%DTBeam <= 0.0_DbKi) & + CALL SetErrStat ( ErrID_Fatal, 'DTBeam must be greater than 0.', ErrStat, ErrMsg, RoutineName ) + IF(InputFileData%rhoinf .LT. 0.0_BDKi .OR. InputFileData%rhoinf .GT. 1.0_BDKi) & CALL SetErrStat ( ErrID_Fatal, 'Numerical damping parameter \rho_{inf} must be in the range of [0.0,1.0]', ErrStat, ErrMsg, RoutineName ) IF(InputFileData%quadrature .NE. GAUSS_QUADRATURE .AND. InputFileData%quadrature .NE. TRAP_QUADRATURE) & diff --git a/modules/beamdyn/src/Driver_Beam.f90 b/modules/beamdyn/src/Driver_Beam.f90 index 8b218beeab..8b36c60194 100644 --- a/modules/beamdyn/src/Driver_Beam.f90 +++ b/modules/beamdyn/src/Driver_Beam.f90 @@ -32,6 +32,11 @@ PROGRAM BeamDyn_Driver_Program CHARACTER(1024) :: ErrMsg ! Error message if ErrStat /= ErrID_None REAL(DbKi) :: dt_global ! fixed/constant global time step REAL(DbKi) :: t_global ! global-loop time marker + REAL(DbKi) :: dt_BD ! BeamDyn time step (DTBeam, returned from BD_Init) + REAL(DbKi) :: t_BD ! BeamDyn sub-step time marker + INTEGER(IntKi) :: n_substeps ! number of BeamDyn time steps per driver time step + INTEGER(IntKi) :: j_ss ! BeamDyn sub-step counter + INTEGER(IntKi) :: n_t_BD ! BeamDyn time step counter INTEGER(IntKi) :: n_t_final ! total number of time steps INTEGER(IntKi) :: n_t_global ! global-loop time counter INTEGER(IntKi) :: n_t_vtk ! global vtk step counter @@ -112,6 +117,9 @@ PROGRAM BeamDyn_Driver_Program ALLOCATE(BD_Input(BD_interp_order + 1)) ALLOCATE(BD_InputTimes(BD_interp_order + 1)) + ! Suggested BeamDyn time step. BD_Init returns the time step BeamDyn actually uses (DTBeam) + dt_BD = dt_global + CALL BD_Init(BD_InitInput & , BD_Input(1) & , BD_Parameter & @@ -121,11 +129,15 @@ PROGRAM BeamDyn_Driver_Program , BD_OtherState & , BD_Output & , BD_MiscVar & - , dt_global & + , dt_BD & , BD_InitOutput & , ErrStat & , ErrMsg ) CALL CheckError() + + ! BeamDyn may use a smaller time step (DTBeam) than the driver. Sub-step BeamDyn in that case. + call SetBDSubSteps() + CALL CheckError() ! If the Quasi-Static solve is in use, rerun the initialization with loads at t=0 ! (HACK: set in the driver only because computing Jacobians with this option [as in FAST glue code] is problematic) @@ -155,7 +167,7 @@ PROGRAM BeamDyn_Driver_Program CALL CheckError() ! solve for inputs at previous time steps - BD_InputTimes(j) = DvrData%t_initial - (j - 1) * dt_global + BD_InputTimes(j) = DvrData%t_initial - (j - 1) * dt_BD CALL BD_InputSolve( BD_InputTimes(j), BD_Input(j), DvrData, ErrStat, ErrMsg) CALL CheckError() END DO @@ -194,27 +206,30 @@ PROGRAM BeamDyn_Driver_Program DO n_t_global = 0, n_t_final - ! Shift "window" of BD_Input - DO j = BD_interp_order, 1, -1 - CALL BD_CopyInput (BD_Input(j), BD_Input(j+1), MESH_UPDATECOPY, Errstat, ErrMsg) + IF(BD_Parameter%analysis_type .EQ. BD_STATIC_ANALYSIS .AND. n_t_global > max_ld_step) EXIT + + ! update states from n_t_global to n_t_global + 1, sub-stepping BeamDyn at its own time step + DO j_ss = 1, n_substeps + n_t_BD = n_t_global*n_substeps + j_ss - 1 + t_BD = n_t_BD * dt_BD + DvrData%t_initial + + ! Shift "window" of BD_Input + DO j = BD_interp_order, 1, -1 + CALL BD_CopyInput (BD_Input(j), BD_Input(j+1), MESH_UPDATECOPY, Errstat, ErrMsg) + CALL CheckError() + BD_InputTimes(j+1) = BD_InputTimes(j) + END DO + + BD_InputTimes(1) = t_BD + dt_BD + CALL BD_InputSolve( BD_InputTimes(1), BD_Input(1), DvrData, ErrStat, ErrMsg) CALL CheckError() - BD_InputTimes(j+1) = BD_InputTimes(j) - END DO - - BD_InputTimes(1) = t_global + dt_global - CALL BD_InputSolve( BD_InputTimes(1), BD_Input(1), DvrData, ErrStat, ErrMsg) - CALL CheckError() - - - IF(BD_Parameter%analysis_type .EQ. BD_STATIC_ANALYSIS .AND. n_t_global > max_ld_step) EXIT - - ! update states from n_t_global to n_t_global + 1 - CALL BD_UpdateStates( t_global, n_t_global, BD_Input, BD_InputTimes, BD_Parameter, & - BD_ContinuousState, & - BD_DiscreteState, BD_ConstraintState, & - BD_OtherState, BD_MiscVar, ErrStat, ErrMsg ) - CALL CheckError() + CALL BD_UpdateStates( t_BD, n_t_BD, BD_Input, BD_InputTimes, BD_Parameter, & + BD_ContinuousState, & + BD_DiscreteState, BD_ConstraintState, & + BD_OtherState, BD_MiscVar, ErrStat, ErrMsg ) + CALL CheckError() + END DO ! advance time t_global = (n_t_global+1) * dt_global + DvrData%t_initial @@ -247,6 +262,36 @@ PROGRAM BeamDyn_Driver_Program CALL Dvr_End() CONTAINS +!---------------------------------------------------------------------------------------------------------------------------------- + !> Set the number of BeamDyn sub-steps per driver time step. The BeamDyn time step (DTBeam) must be + !! equal to or an integer divisor of the driver time step. Static analysis does not use DTBeam (each + !! driver step is a load step), so it is not sub-stepped. + SUBROUTINE SetBDSubSteps() + if (BD_Parameter%analysis_type == BD_STATIC_ANALYSIS) then + n_substeps = 1 + dt_BD = dt_global + elseif (EqualRealNos(dt_BD, dt_global)) then + n_substeps = 1 + dt_BD = dt_global + elseif (dt_BD <= 0.0_DbKi) then + ErrStat = ErrID_Fatal + ErrMsg = 'BeamDyn time step DTBeam ('//trim(Num2LStr(dt_BD))//' s) must be greater than 0.' + elseif (dt_BD > dt_global) then + ErrStat = ErrID_Fatal + ErrMsg = 'BeamDyn time step DTBeam ('//trim(Num2LStr(dt_BD))//' s) cannot be larger than the driver time step DT ('// & + trim(Num2LStr(dt_global))//' s).' + else + n_substeps = nint(dt_global / dt_BD) + if (.not. EqualRealNos(dt_global, dt_BD*n_substeps)) then + ErrStat = ErrID_Fatal + ErrMsg = 'BeamDyn time step DTBeam ('//trim(Num2LStr(dt_BD))//' s) must be an integer divisor of the driver time step DT ('// & + trim(Num2LStr(dt_global))//' s).' + else + call WrScr(' BeamDyn time step DTBeam ('//trim(Num2LStr(dt_BD))//' s) is smaller than the driver time step DT ('// & + trim(Num2LStr(dt_global))//' s). Using '//trim(Num2LStr(n_substeps))//' BeamDyn sub-steps per driver step.') + endif + endif + END SUBROUTINE SetBDSubSteps !---------------------------------------------------------------------------------------------------------------------------------- SUBROUTINE Dvr_End() diff --git a/modules/nwtc-library/ModRegGen.py b/modules/nwtc-library/ModRegGen.py index 01981f6b2e..1840b783a8 100644 --- a/modules/nwtc-library/ModRegGen.py +++ b/modules/nwtc-library/ModRegGen.py @@ -261,11 +261,24 @@ type(c_ptr), intent(out) :: Ptr integer(B8Ki), intent(out) :: Idx + ! Initialize outputs + Ptr = c_null_ptr + Idx = 0 + ! If error, return if (RF%ErrStat /= ErrID_None) return - ! Unpack pointer index + ! Unpack pointer index, return if error call RegUnpack(RF, Idx) + if (RegCheckErr(RF, "RegUnpackPointer")) return + + ! Check that index is within pointer index bounds + if (Idx < 1 .or. Idx > size(RF%Pointers, kind=B8Ki)) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "RegUnpackPointer: pointer index", Idx, "out of range 1 to", size(RF%Pointers, kind=B8Ki) + Idx = 0 + return + end if ! Get pointer from index Ptr = RF%Pointers(Idx) @@ -303,12 +316,19 @@ type(RegFile), intent(inout) :: RF logical :: match integer(B8Ki) :: DataNum + integer(IntKi) :: stat ! Increment the data number to be read RF%NumData = RF%NumData + 1 - ! Read the data number from the file - read(RF%Unit) DataNum + ! Read the data number from the file, return if error + read(RF%Unit, iostat=stat) DataNum + if (stat /= 0) then + match = .false. + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Error reading data number", RF%NumData, "from file, iostat =", stat + return + end if ! If data number from file does not match expected number, set match false ! and create error message; otherwise, set match to true @@ -329,16 +349,26 @@ def gen_pack(w, dt, decl, rank): w.write(f'\n\n subroutine {name}(RF, Data)') w.write(f'\n type(RegFile), intent(inout) :: RF') w.write(f'\n {decl+", intent(in)":<35s} :: Data{dims}') + w.write(f'\n integer(IntKi) :: stat') w.write(f'\n') w.write(f'\n ! If error, return') w.write(f'\n if (RF%ErrStat /= ErrID_None) return') w.write(f'\n') w.write(f'\n ! Increment data number and write to file') w.write(f'\n RF%NumData = RF%NumData + 1') - w.write(f'\n write(RF%Unit) RF%NumData') + w.write(f'\n write(RF%Unit, iostat=stat) RF%NumData') + w.write(f'\n if (stat /= 0) then') + w.write(f'\n RF%ErrStat = ErrID_Fatal') + w.write(f'\n write(RF%ErrMsg, *) "{name}: error writing data number", RF%NumData, "to file, iostat =", stat') + w.write(f'\n return') + w.write(f'\n end if') w.write(f'\n') w.write(f'\n ! Write data to file') - w.write(f'\n write(RF%Unit) Data') + w.write(f'\n write(RF%Unit, iostat=stat) Data') + w.write(f'\n if (stat /= 0) then') + w.write(f'\n RF%ErrStat = ErrID_Fatal') + w.write(f'\n write(RF%ErrMsg, *) "{name}: error writing data", RF%NumData, "to file, iostat =", stat') + w.write(f'\n end if') w.write(f'\n end subroutine') @@ -349,6 +379,7 @@ def gen_unpack(w, dt, decl, rank): w.write(f'\n subroutine {name}(RF, Data)') w.write(f'\n type(RegFile), intent(inout) :: RF') w.write(f'\n {decl+", intent(out)":<35s} :: Data{dims}') + w.write(f'\n integer(IntKi) :: stat') w.write(f'\n') w.write(f'\n ! If error, return') w.write(f'\n if (RF%ErrStat /= ErrID_None) return') @@ -356,8 +387,12 @@ def gen_unpack(w, dt, decl, rank): w.write(f'\n ! Read data number, return if invalid') w.write(f'\n if (.not. DataNumValid(RF)) return') w.write(f'\n') - w.write(f'\n ! Read data from file') - w.write(f'\n read(RF%Unit) Data') + w.write(f'\n ! Read data from file, return if error') + w.write(f'\n read(RF%Unit, iostat=stat) Data') + w.write(f'\n if (stat /= 0) then') + w.write(f'\n RF%ErrStat = ErrID_Fatal') + w.write(f'\n write(RF%ErrMsg, *) "{name}: error reading data", RF%NumData, "from file, iostat =", stat') + w.write(f'\n end if') w.write(f'\n end subroutine') def gen_pack_alloc(w, dt, decl, rank): diff --git a/modules/nwtc-library/src/ModReg.f90 b/modules/nwtc-library/src/ModReg.f90 index 1cc99dca2e..cccda0ccfd 100644 --- a/modules/nwtc-library/src/ModReg.f90 +++ b/modules/nwtc-library/src/ModReg.f90 @@ -328,11 +328,24 @@ subroutine RegUnpackPointer(RF, Ptr, Idx) type(c_ptr), intent(out) :: Ptr integer(B8Ki), intent(out) :: Idx + ! Initialize outputs + Ptr = c_null_ptr + Idx = 0 + ! If error, return if (RF%ErrStat /= ErrID_None) return - ! Unpack pointer index + ! Unpack pointer index, return if error call RegUnpack(RF, Idx) + if (RegCheckErr(RF, "RegUnpackPointer")) return + + ! Check that index is within pointer index bounds + if (Idx < 1 .or. Idx > size(RF%Pointers, kind=B8Ki)) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "RegUnpackPointer: pointer index", Idx, "out of range 1 to", size(RF%Pointers, kind=B8Ki) + Idx = 0 + return + end if ! Get pointer from index Ptr = RF%Pointers(Idx) @@ -370,12 +383,19 @@ function DataNumValid(RF) result(match) type(RegFile), intent(inout) :: RF logical :: match integer(B8Ki) :: DataNum + integer(IntKi) :: stat ! Increment the data number to be read RF%NumData = RF%NumData + 1 - ! Read the data number from the file - read(RF%Unit) DataNum + ! Read the data number from the file, return if error + read(RF%Unit, iostat=stat) DataNum + if (stat /= 0) then + match = .false. + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Error reading data number", RF%NumData, "from file, iostat =", stat + return + end if ! If data number from file does not match expected number, set match false ! and create error message; otherwise, set match to true @@ -392,21 +412,32 @@ function DataNumValid(RF) result(match) subroutine Pack_C1(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(in) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_C1(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(out) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -414,8 +445,12 @@ subroutine Unpack_C1(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_C1: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_C1(RF, Data) @@ -538,21 +573,32 @@ subroutine UnpackPtr_C1(RF, Data) subroutine Pack_C1_Rank1(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(in) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1_Rank1: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1_Rank1: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_C1_Rank1(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(out) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -560,8 +606,12 @@ subroutine Unpack_C1_Rank1(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_C1_Rank1: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_C1_Rank1(RF, Data) @@ -699,21 +749,32 @@ subroutine UnpackPtr_C1_Rank1(RF, Data, LB, UB) subroutine Pack_C1_Rank2(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(in) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1_Rank2: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1_Rank2: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_C1_Rank2(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(out) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -721,8 +782,12 @@ subroutine Unpack_C1_Rank2(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_C1_Rank2: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_C1_Rank2(RF, Data) @@ -860,21 +925,32 @@ subroutine UnpackPtr_C1_Rank2(RF, Data, LB, UB) subroutine Pack_C1_Rank3(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(in) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1_Rank3: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1_Rank3: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_C1_Rank3(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(out) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -882,8 +958,12 @@ subroutine Unpack_C1_Rank3(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_C1_Rank3: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_C1_Rank3(RF, Data) @@ -1021,21 +1101,32 @@ subroutine UnpackPtr_C1_Rank3(RF, Data, LB, UB) subroutine Pack_C1_Rank4(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(in) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1_Rank4: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1_Rank4: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_C1_Rank4(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(out) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -1043,8 +1134,12 @@ subroutine Unpack_C1_Rank4(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_C1_Rank4: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_C1_Rank4(RF, Data) @@ -1182,21 +1277,32 @@ subroutine UnpackPtr_C1_Rank4(RF, Data, LB, UB) subroutine Pack_C1_Rank5(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(in) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1_Rank5: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_C1_Rank5: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_C1_Rank5(RF, Data) type(RegFile), intent(inout) :: RF character(*), intent(out) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -1204,8 +1310,12 @@ subroutine Unpack_C1_Rank5(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_C1_Rank5: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_C1_Rank5(RF, Data) @@ -1343,21 +1453,32 @@ subroutine UnpackPtr_C1_Rank5(RF, Data, LB, UB) subroutine Pack_L1(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(in) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_L1(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(out) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -1365,8 +1486,12 @@ subroutine Unpack_L1(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_L1: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_L1(RF, Data) @@ -1489,21 +1614,32 @@ subroutine UnpackPtr_L1(RF, Data) subroutine Pack_L1_Rank1(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(in) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1_Rank1: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1_Rank1: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_L1_Rank1(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(out) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -1511,8 +1647,12 @@ subroutine Unpack_L1_Rank1(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_L1_Rank1: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_L1_Rank1(RF, Data) @@ -1650,21 +1790,32 @@ subroutine UnpackPtr_L1_Rank1(RF, Data, LB, UB) subroutine Pack_L1_Rank2(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(in) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1_Rank2: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1_Rank2: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_L1_Rank2(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(out) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -1672,8 +1823,12 @@ subroutine Unpack_L1_Rank2(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_L1_Rank2: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_L1_Rank2(RF, Data) @@ -1811,21 +1966,32 @@ subroutine UnpackPtr_L1_Rank2(RF, Data, LB, UB) subroutine Pack_L1_Rank3(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(in) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1_Rank3: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1_Rank3: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_L1_Rank3(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(out) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -1833,8 +1999,12 @@ subroutine Unpack_L1_Rank3(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_L1_Rank3: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_L1_Rank3(RF, Data) @@ -1972,21 +2142,32 @@ subroutine UnpackPtr_L1_Rank3(RF, Data, LB, UB) subroutine Pack_L1_Rank4(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(in) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1_Rank4: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1_Rank4: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_L1_Rank4(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(out) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -1994,8 +2175,12 @@ subroutine Unpack_L1_Rank4(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_L1_Rank4: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_L1_Rank4(RF, Data) @@ -2133,21 +2318,32 @@ subroutine UnpackPtr_L1_Rank4(RF, Data, LB, UB) subroutine Pack_L1_Rank5(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(in) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1_Rank5: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_L1_Rank5: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_L1_Rank5(RF, Data) type(RegFile), intent(inout) :: RF logical, intent(out) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -2155,8 +2351,12 @@ subroutine Unpack_L1_Rank5(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_L1_Rank5: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_L1_Rank5(RF, Data) @@ -2294,21 +2494,32 @@ subroutine UnpackPtr_L1_Rank5(RF, Data, LB, UB) subroutine Pack_I4(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(in) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I4(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(out) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -2316,8 +2527,12 @@ subroutine Unpack_I4(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I4: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I4(RF, Data) @@ -2440,21 +2655,32 @@ subroutine UnpackPtr_I4(RF, Data) subroutine Pack_I4_Rank1(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(in) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4_Rank1: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4_Rank1: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I4_Rank1(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(out) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -2462,8 +2688,12 @@ subroutine Unpack_I4_Rank1(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I4_Rank1: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I4_Rank1(RF, Data) @@ -2601,21 +2831,32 @@ subroutine UnpackPtr_I4_Rank1(RF, Data, LB, UB) subroutine Pack_I4_Rank2(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(in) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4_Rank2: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4_Rank2: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I4_Rank2(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(out) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -2623,8 +2864,12 @@ subroutine Unpack_I4_Rank2(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I4_Rank2: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I4_Rank2(RF, Data) @@ -2762,21 +3007,32 @@ subroutine UnpackPtr_I4_Rank2(RF, Data, LB, UB) subroutine Pack_I4_Rank3(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(in) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4_Rank3: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4_Rank3: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I4_Rank3(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(out) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -2784,8 +3040,12 @@ subroutine Unpack_I4_Rank3(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I4_Rank3: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I4_Rank3(RF, Data) @@ -2923,21 +3183,32 @@ subroutine UnpackPtr_I4_Rank3(RF, Data, LB, UB) subroutine Pack_I4_Rank4(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(in) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4_Rank4: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4_Rank4: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I4_Rank4(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(out) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -2945,8 +3216,12 @@ subroutine Unpack_I4_Rank4(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I4_Rank4: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I4_Rank4(RF, Data) @@ -3084,21 +3359,32 @@ subroutine UnpackPtr_I4_Rank4(RF, Data, LB, UB) subroutine Pack_I4_Rank5(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(in) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4_Rank5: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I4_Rank5: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I4_Rank5(RF, Data) type(RegFile), intent(inout) :: RF integer(B4Ki), intent(out) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -3106,8 +3392,12 @@ subroutine Unpack_I4_Rank5(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I4_Rank5: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I4_Rank5(RF, Data) @@ -3245,21 +3535,32 @@ subroutine UnpackPtr_I4_Rank5(RF, Data, LB, UB) subroutine Pack_I8(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(in) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I8(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(out) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -3267,8 +3568,12 @@ subroutine Unpack_I8(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I8: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I8(RF, Data) @@ -3391,21 +3696,32 @@ subroutine UnpackPtr_I8(RF, Data) subroutine Pack_I8_Rank1(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(in) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8_Rank1: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8_Rank1: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I8_Rank1(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(out) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -3413,8 +3729,12 @@ subroutine Unpack_I8_Rank1(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I8_Rank1: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I8_Rank1(RF, Data) @@ -3552,21 +3872,32 @@ subroutine UnpackPtr_I8_Rank1(RF, Data, LB, UB) subroutine Pack_I8_Rank2(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(in) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8_Rank2: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8_Rank2: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I8_Rank2(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(out) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -3574,8 +3905,12 @@ subroutine Unpack_I8_Rank2(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I8_Rank2: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I8_Rank2(RF, Data) @@ -3713,21 +4048,32 @@ subroutine UnpackPtr_I8_Rank2(RF, Data, LB, UB) subroutine Pack_I8_Rank3(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(in) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8_Rank3: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8_Rank3: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I8_Rank3(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(out) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -3735,8 +4081,12 @@ subroutine Unpack_I8_Rank3(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I8_Rank3: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I8_Rank3(RF, Data) @@ -3874,21 +4224,32 @@ subroutine UnpackPtr_I8_Rank3(RF, Data, LB, UB) subroutine Pack_I8_Rank4(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(in) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8_Rank4: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8_Rank4: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I8_Rank4(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(out) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -3896,8 +4257,12 @@ subroutine Unpack_I8_Rank4(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I8_Rank4: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I8_Rank4(RF, Data) @@ -4035,21 +4400,32 @@ subroutine UnpackPtr_I8_Rank4(RF, Data, LB, UB) subroutine Pack_I8_Rank5(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(in) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8_Rank5: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_I8_Rank5: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_I8_Rank5(RF, Data) type(RegFile), intent(inout) :: RF integer(B8Ki), intent(out) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -4057,8 +4433,12 @@ subroutine Unpack_I8_Rank5(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_I8_Rank5: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_I8_Rank5(RF, Data) @@ -4196,21 +4576,32 @@ subroutine UnpackPtr_I8_Rank5(RF, Data, LB, UB) subroutine Pack_R4(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(in) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R4(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(out) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -4218,8 +4609,12 @@ subroutine Unpack_R4(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R4: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R4(RF, Data) @@ -4342,21 +4737,32 @@ subroutine UnpackPtr_R4(RF, Data) subroutine Pack_R4_Rank1(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(in) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4_Rank1: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4_Rank1: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R4_Rank1(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(out) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -4364,8 +4770,12 @@ subroutine Unpack_R4_Rank1(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R4_Rank1: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R4_Rank1(RF, Data) @@ -4503,21 +4913,32 @@ subroutine UnpackPtr_R4_Rank1(RF, Data, LB, UB) subroutine Pack_R4_Rank2(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(in) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4_Rank2: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4_Rank2: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R4_Rank2(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(out) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -4525,8 +4946,12 @@ subroutine Unpack_R4_Rank2(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R4_Rank2: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R4_Rank2(RF, Data) @@ -4664,21 +5089,32 @@ subroutine UnpackPtr_R4_Rank2(RF, Data, LB, UB) subroutine Pack_R4_Rank3(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(in) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4_Rank3: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4_Rank3: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R4_Rank3(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(out) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -4686,8 +5122,12 @@ subroutine Unpack_R4_Rank3(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R4_Rank3: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R4_Rank3(RF, Data) @@ -4825,21 +5265,32 @@ subroutine UnpackPtr_R4_Rank3(RF, Data, LB, UB) subroutine Pack_R4_Rank4(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(in) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4_Rank4: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4_Rank4: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R4_Rank4(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(out) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -4847,8 +5298,12 @@ subroutine Unpack_R4_Rank4(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R4_Rank4: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R4_Rank4(RF, Data) @@ -4986,21 +5441,32 @@ subroutine UnpackPtr_R4_Rank4(RF, Data, LB, UB) subroutine Pack_R4_Rank5(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(in) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4_Rank5: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R4_Rank5: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R4_Rank5(RF, Data) type(RegFile), intent(inout) :: RF real(R4Ki), intent(out) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -5008,8 +5474,12 @@ subroutine Unpack_R4_Rank5(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R4_Rank5: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R4_Rank5(RF, Data) @@ -5147,21 +5617,32 @@ subroutine UnpackPtr_R4_Rank5(RF, Data, LB, UB) subroutine Pack_R8(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(in) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R8(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(out) :: Data + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -5169,8 +5650,12 @@ subroutine Unpack_R8(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R8: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R8(RF, Data) @@ -5293,21 +5778,32 @@ subroutine UnpackPtr_R8(RF, Data) subroutine Pack_R8_Rank1(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(in) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8_Rank1: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8_Rank1: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R8_Rank1(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(out) :: Data(:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -5315,8 +5811,12 @@ subroutine Unpack_R8_Rank1(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R8_Rank1: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R8_Rank1(RF, Data) @@ -5454,21 +5954,32 @@ subroutine UnpackPtr_R8_Rank1(RF, Data, LB, UB) subroutine Pack_R8_Rank2(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(in) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8_Rank2: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8_Rank2: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R8_Rank2(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(out) :: Data(:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -5476,8 +5987,12 @@ subroutine Unpack_R8_Rank2(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R8_Rank2: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R8_Rank2(RF, Data) @@ -5615,21 +6130,32 @@ subroutine UnpackPtr_R8_Rank2(RF, Data, LB, UB) subroutine Pack_R8_Rank3(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(in) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8_Rank3: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8_Rank3: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R8_Rank3(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(out) :: Data(:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -5637,8 +6163,12 @@ subroutine Unpack_R8_Rank3(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R8_Rank3: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R8_Rank3(RF, Data) @@ -5776,21 +6306,32 @@ subroutine UnpackPtr_R8_Rank3(RF, Data, LB, UB) subroutine Pack_R8_Rank4(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(in) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8_Rank4: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8_Rank4: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R8_Rank4(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(out) :: Data(:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -5798,8 +6339,12 @@ subroutine Unpack_R8_Rank4(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R8_Rank4: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R8_Rank4(RF, Data) @@ -5937,21 +6482,32 @@ subroutine UnpackPtr_R8_Rank4(RF, Data, LB, UB) subroutine Pack_R8_Rank5(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(in) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return ! Increment data number and write to file RF%NumData = RF%NumData + 1 - write(RF%Unit) RF%NumData + write(RF%Unit, iostat=stat) RF%NumData + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8_Rank5: error writing data number", RF%NumData, "to file, iostat =", stat + return + end if ! Write data to file - write(RF%Unit) Data + write(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Pack_R8_Rank5: error writing data", RF%NumData, "to file, iostat =", stat + end if end subroutine subroutine Unpack_R8_Rank5(RF, Data) type(RegFile), intent(inout) :: RF real(R8Ki), intent(out) :: Data(:,:,:,:,:) + integer(IntKi) :: stat ! If error, return if (RF%ErrStat /= ErrID_None) return @@ -5959,8 +6515,12 @@ subroutine Unpack_R8_Rank5(RF, Data) ! Read data number, return if invalid if (.not. DataNumValid(RF)) return - ! Read data from file - read(RF%Unit) Data + ! Read data from file, return if error + read(RF%Unit, iostat=stat) Data + if (stat /= 0) then + RF%ErrStat = ErrID_Fatal + write(RF%ErrMsg, *) "Unpack_R8_Rank5: error reading data", RF%NumData, "from file, iostat =", stat + end if end subroutine subroutine PackAlloc_R8_Rank5(RF, Data) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 37ab4de784..f25ecfc1ef 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -211,9 +211,9 @@ subroutine FAST_SolverInit(p_FAST, p, m, GlueModData, GlueModMaps, Turbine, ErrS ! Loop through tight-coupling modules do i = 1, size(p%iModTC) - if (GlueModData(i)%SubSteps > 1) then - call WrScr('Info: tightly coupled module "'//trim(GlueModData(i)%Abbr)//'" requested '// & - 'time step of '//trim(Num2Lstr(GlueModData(i)%DT))//', which is different than '// & + if (GlueModData(p%iModTC(i))%SubSteps > 1) then + call WrScr('Info: tightly coupled module "'//trim(GlueModData(p%iModTC(i))%Abbr)//'" requested '// & + 'time step of '//trim(Num2Lstr(GlueModData(p%iModTC(i))%DT))//', which is different than '// & 'glue-code time step of '//trim(Num2Lstr(p%h))//'. Sub-stepping disabled for this module.') end if end do diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 787967f6dc..1cfa15cea0 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -472,6 +472,7 @@ ua_regression("ua_redfreq" "unsteadyaero") # BeamDyn regression tests bd_regression("bd_5MW_dynamic" "beamdyn;dynamic") +bd_regression("bd_5MW_dynamic_substep" "beamdyn;dynamic") bd_regression("bd_5MW_dynamic_gravity_Az00" "beamdyn;dynamic") bd_regression("bd_5MW_dynamic_gravity_Az90" "beamdyn;dynamic") bd_regression("bd_5MW_dynamic_modal_damping" "beamdyn;dynamic") diff --git a/reg_tests/r-test b/reg_tests/r-test index 2aa1664832..fd31c2b88e 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 2aa1664832f47d6c1286583b33c36bf4dfe1b80b +Subproject commit fd31c2b88e4731a791d9efe14a765a2a8a6fc837