Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Various Bug Fixes #188

Merged
merged 23 commits into from
Dec 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
99a5ebe
Fix yaw threshold documentation in DISCON
dzalkind Oct 4, 2022
657f206
Fix debug unit labels
dzalkind Oct 4, 2022
537e336
Add nacelle heading error to DebugVar
dzalkind Oct 4, 2022
46176fd
Update ROSCO_IO and Types
dzalkind Oct 4, 2022
a6d4d90
Read NacHeading from OpenFAST
dzalkind Oct 4, 2022
35f2911
Update DISCONs
dzalkind Oct 4, 2022
cfe7b5b
Fix ******s in dbg files
dzalkind Oct 7, 2022
1c15a8b
Allow single U in power_curve
dzalkind Oct 10, 2022
458925f
Initialize floating feedback filters at 0, make optional input for filts
dzalkind Nov 8, 2022
9780e9a
give dummy units if dbg units missing
dzalkind Nov 8, 2022
e92bc30
Update FAST_wrapper.py
aclerc Nov 24, 2022
6dc4f18
Update example_08.py
aclerc Nov 24, 2022
a9a2a0b
Update linear_model handling for new pyFAST, will break with weis import
dzalkind Nov 28, 2022
de951b5
Merge remote-tracking branch 'upstream/develop' into vbf
dzalkind Nov 28, 2022
7c77853
Try with conda installed compiler
dzalkind Nov 29, 2022
00b5acd
Re-do filter initialization, reset value unused for now
dzalkind Nov 29, 2022
7f05343
Merge remote-tracking branch 'aclerc/fix-FAST_wrapper' into vbf
dzalkind Nov 29, 2022
d76942c
Merge remote-tracking branch 'aclerc/fix-example_08' into vbf
dzalkind Nov 29, 2022
9312d43
Merge branch 'bf/yaw_control' into vbf
dzalkind Nov 29, 2022
f07dce4
Regen registry and discons
dzalkind Nov 29, 2022
9391f74
Enable run_FAST in setup install
dzalkind Dec 9, 2022
4318465
Set default wind_dir in simp_step case
dzalkind Dec 9, 2022
7035cc3
Add dll shutdown method to control_interface
dzalkind Dec 9, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/CI_rosco-pytools.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,10 @@ jobs:
FC: gfortran


# - name: Add dependencies macOS specific
# if: true == contains( matrix.os, 'macOS')
# run: |
# conda install compilers
- name: Add dependencies macOS specific
if: true == contains( matrix.os, 'macOS')
run: |
conda install compilers

# Install ROSCO toolbox
- name: Install ROSCO toolbox on Windows
Expand Down
2 changes: 1 addition & 1 deletion Examples/example_08.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
# fast_out.plot_fast_out()

# Load and plot
fastout = fast_out.load_fast_out(filenames, tmin=10)
fastout = fast_out.load_fast_out(filenames)
fast_out.plot_fast_out(cases=cases,showplot=False)

plt.savefig(os.path.join(example_out_dir,'08_IEA-15MW_Semi_Out.png'))
Expand Down
1 change: 1 addition & 0 deletions Examples/example_15.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ def main():
'wind_dir': run_dir
}
r.save_dir = run_dir
r.rosco_dir = rosco_dir

r.run_FAST()

Expand Down
1 change: 1 addition & 0 deletions Examples/example_16.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ def main():
'wind_dir': run_dir
}
r.controller_params = controller_params
r.rosco_dir = rosco_dir
r.save_dir = run_dir

r.run_FAST()
Expand Down
1 change: 1 addition & 0 deletions Examples/example_18.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ def main():
r.case_inputs[("ServoDyn","Ptch_Cntrl")] = {'vals':[1], 'group':0} # Individual pitch control must be enabled in ServoDyn
r.controller_params = controller_params
r.save_dir = run_dir
r.rosco_dir = rosco_dir

r.run_FAST()

Expand Down
8 changes: 4 additions & 4 deletions ROSCO/rosco_registry/rosco_types.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1041,13 +1041,13 @@ DebugVariables:
description: Commanded yaw rate [rad/s].
NacHeadingTarget:
<<: *real
description: Target nacelle heading [rad].
description: Target nacelle heading [deg].
NacVaneOffset:
<<: *real
description: Nacelle vane angle with offset [rad].
Yaw_err:
description: Nacelle vane angle with offset [deg].
Yaw_Err:
<<: *real
description: Yaw error [rad].
description: Yaw error [deg].
YawState:
<<: *real
description: State of yaw controller
Expand Down
21 changes: 19 additions & 2 deletions ROSCO/rosco_registry/write_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,12 +221,15 @@ def write_roscoio(yfile):
file.write(' DebugOutUnits = [CHARACTER(15) :: ')
counter = 0
for unit in dbg_units:
# Give dummy unit if not defined
if not unit:
unit = '[N/A]'
counter += 1
if counter == len(dbg_units):
file.write(" '{}'".format(unit))
file.write(" '{}'".format(unit)) # last line
else:
file.write(" '{}',".format(unit))
if (counter % 5 == 0):
if (counter % 5 == 0): # group in groups of 5
file.write(' & \n ')
file.write(']\n')

Expand Down Expand Up @@ -293,6 +296,20 @@ def write_roscoio(yfile):
file.write(" 100 FORMAT('Generator speed: ', f6.1, ' RPM, Pitch angle: ', f5.1, ' deg, Power: ', f7.1, ' kW, Est. wind Speed: ', f5.1, ' m/s')\n")
file.write(" END IF\n")
file.write("\n")
file.write(" ! Process DebugOutData, LocalVarOutData\n")
file.write(" ! Remove very small numbers that cause ******** outputs\n")
file.write(" DO I = 1,SIZE(DebugOutData)\n")
file.write(" IF (ABS(DebugOutData(I)) < 1E-10) THEN\n")
file.write(" DebugOutData(I) = 0\n")
file.write(" END IF\n")
file.write(" END DO\n")
file.write(" \n")
file.write(" DO I = 1,SIZE(LocalVarOutData)\n")
file.write(" IF (ABS(LocalVarOutData(I)) < 1E-10) THEN\n")
file.write(" LocalVarOutData(I) = 0\n")
file.write(" END IF\n")
file.write(" END DO\n")
file.write(" \n")
file.write(" ! Write debug files\n")
file.write(" IF(CntrPar%LoggingLevel > 0) THEN\n")
file.write(" WRITE (UnDb, FmtDat) LocalVar%Time, DebugOutData\n")
Expand Down
1 change: 1 addition & 0 deletions ROSCO/src/Controllers.f90
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,7 @@ SUBROUTINE YawRateControl(avrSWAP, CntrPar, LocalVar, objInst, zmqVar, DebugVar,
DebugVar%NacHeadingTarget = NacHeadingTarget
DebugVar%NacVaneOffset = NacVaneOffset
DebugVar%YawState = YawState
DebugVar%Yaw_Err = NacHeadingError
END IF
END SUBROUTINE YawRateControl
!-------------------------------------------------------------------------------------------------------------------------------
Expand Down
83 changes: 60 additions & 23 deletions ROSCO/src/Filters.f90
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ MODULE Filters

CONTAINS
!-------------------------------------------------------------------------------------------------------------------------------
REAL(DbKi) FUNCTION LPFilter(InputSignal, DT, CornerFreq, FP, iStatus, reset, inst)
REAL(DbKi) FUNCTION LPFilter(InputSignal, DT, CornerFreq, FP, iStatus, reset, inst, InitialValue)
! Discrete time Low-Pass Filter of the form:
! Continuous Time Form: H(s) = CornerFreq/(1 + CornerFreq)
! Discrete Time Form: H(z) = (b1z + b0) / (a1*z + a0)
Expand All @@ -40,11 +40,18 @@ REAL(DbKi) FUNCTION LPFilter(InputSignal, DT, CornerFreq, FP, iStatus, reset, in
INTEGER(IntKi), INTENT(IN) :: iStatus ! A status flag set by the simulation as follows: 0 if this is the first call, 1 for all subsequent time steps, -1 if this is the final call at the end of the simulation.
INTEGER(IntKi), INTENT(INOUT) :: inst ! Instance number. Every instance of this function needs to have an unique instance number to ensure instances don't influence each other.
LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal
REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset

REAL(DbKi) :: InitialValue_ ! Value to set when reset

! Defaults
InitialValue_ = InputSignal
IF (PRESENT(InitialValue)) InitialValue_ = InitialValue

! Initialization
! Initialization
IF ((iStatus == 0) .OR. reset) THEN
FP%lpf1_OutputSignalLast(inst) = InputSignal
FP%lpf1_InputSignalLast(inst) = InputSignal
FP%lpf1_OutputSignalLast(inst) = InitialValue_
FP%lpf1_InputSignalLast(inst) = InitialValue_
FP%lpf1_a1(inst) = 2 + CornerFreq*DT
FP%lpf1_a0(inst) = CornerFreq*DT - 2
FP%lpf1_b1(inst) = CornerFreq*DT
Expand All @@ -63,7 +70,7 @@ REAL(DbKi) FUNCTION LPFilter(InputSignal, DT, CornerFreq, FP, iStatus, reset, in

END FUNCTION LPFilter
!-------------------------------------------------------------------------------------------------------------------------------
REAL(DbKi) FUNCTION SecLPFilter(InputSignal, DT, CornerFreq, Damp, FP, iStatus, reset, inst)
REAL(DbKi) FUNCTION SecLPFilter(InputSignal, DT, CornerFreq, Damp, FP, iStatus, reset, inst, InitialValue)
! Discrete time Low-Pass Filter of the form:
! Continuous Time Form: H(s) = CornerFreq^2/(s^2 + 2*CornerFreq*Damp*s + CornerFreq^2)
! Discrete Time From: H(z) = (b2*z^2 + b1*z + b0) / (a2*z^2 + a1*z + a0)
Expand All @@ -75,14 +82,21 @@ REAL(DbKi) FUNCTION SecLPFilter(InputSignal, DT, CornerFreq, Damp, FP, iStatus,
REAL(DbKi), INTENT(IN) :: Damp ! Dampening constant
INTEGER(IntKi), INTENT(IN) :: iStatus ! A status flag set by the simulation as follows: 0 if this is the first call, 1 for all subsequent time steps, -1 if this is the final call at the end of the simulation.
INTEGER(IntKi), INTENT(INOUT) :: inst ! Instance number. Every instance of this function needs to have an unique instance number to ensure instances don't influence each other.
LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal
LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal
REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset

REAL(DbKi) :: InitialValue_ ! Value to set when reset

! Defaults
InitialValue_ = InputSignal
IF (PRESENT(InitialValue)) InitialValue_ = InitialValue

! Initialization
IF ((iStatus == 0) .OR. reset ) THEN
FP%lpf2_OutputSignalLast1(inst) = InputSignal
FP%lpf2_OutputSignalLast2(inst) = InputSignal
FP%lpf2_InputSignalLast1(inst) = InputSignal
FP%lpf2_InputSignalLast2(inst) = InputSignal
FP%lpf2_OutputSignalLast1(inst) = InitialValue_
FP%lpf2_OutputSignalLast2(inst) = InitialValue_
FP%lpf2_InputSignalLast1(inst) = InitialValue_
FP%lpf2_InputSignalLast2(inst) = InitialValue_

! Coefficients
FP%lpf2_a2(inst) = DT**2.0*CornerFreq**2.0 + 4.0 + 4.0*Damp*CornerFreq*DT
Expand All @@ -106,7 +120,7 @@ REAL(DbKi) FUNCTION SecLPFilter(InputSignal, DT, CornerFreq, Damp, FP, iStatus,

END FUNCTION SecLPFilter
!-------------------------------------------------------------------------------------------------------------------------------
REAL(DbKi) FUNCTION HPFilter( InputSignal, DT, CornerFreq, FP, iStatus, reset, inst)
REAL(DbKi) FUNCTION HPFilter( InputSignal, DT, CornerFreq, FP, iStatus, reset, inst, InitialValue)
! Discrete time High-Pass Filter
USE ROSCO_Types, ONLY : FilterParameters
TYPE(FilterParameters), INTENT(INOUT) :: FP
Expand All @@ -119,11 +133,18 @@ REAL(DbKi) FUNCTION HPFilter( InputSignal, DT, CornerFreq, FP, iStatus, reset, i
LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal
! Local
REAL(DbKi) :: K ! Constant gain
REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset

REAL(DbKi) :: InitialValue_ ! Value to set when reset

! Defaults
InitialValue_ = InputSignal
IF (PRESENT(InitialValue)) InitialValue_ = InitialValue

! Initialization
IF ((iStatus == 0) .OR. reset) THEN
FP%hpf_OutputSignalLast(inst) = InputSignal
FP%hpf_InputSignalLast(inst) = InputSignal
FP%hpf_OutputSignalLast(inst) = InitialValue_
FP%hpf_InputSignalLast(inst) = InitialValue_
ENDIF
K = 2.0 / DT

Expand All @@ -137,7 +158,7 @@ REAL(DbKi) FUNCTION HPFilter( InputSignal, DT, CornerFreq, FP, iStatus, reset, i

END FUNCTION HPFilter
!-------------------------------------------------------------------------------------------------------------------------------
REAL(DbKi) FUNCTION NotchFilterSlopes(InputSignal, DT, CornerFreq, Damp, FP, iStatus, reset, inst, Moving)
REAL(DbKi) FUNCTION NotchFilterSlopes(InputSignal, DT, CornerFreq, Damp, FP, iStatus, reset, inst, Moving, InitialValue)
! Discrete time inverted Notch Filter with descending slopes, G = CornerFreq*s/(Damp*s^2+CornerFreq*s+Damp*CornerFreq^2)
USE ROSCO_Types, ONLY : FilterParameters
TYPE(FilterParameters), INTENT(INOUT) :: FP
Expand All @@ -150,9 +171,15 @@ REAL(DbKi) FUNCTION NotchFilterSlopes(InputSignal, DT, CornerFreq, Damp, FP, iSt
INTEGER(IntKi), INTENT(INOUT) :: inst ! Instance number. Every instance of this function needs to have an unique instance number to ensure instances don't influence each other.
LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal
LOGICAL, OPTIONAL, INTENT(IN) :: Moving ! Moving CornerFreq flag
REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset

LOGICAL :: Moving_ ! Local version
REAL(DbKi) :: CornerFreq_ ! Local version
REAL(DbKi) :: InitialValue_ ! Value to set when reset

! Defaults
InitialValue_ = InputSignal
IF (PRESENT(InitialValue)) InitialValue_ = InitialValue

Moving_ = .FALSE.
IF (PRESENT(Moving)) Moving_ = Moving
Expand All @@ -166,10 +193,10 @@ REAL(DbKi) FUNCTION NotchFilterSlopes(InputSignal, DT, CornerFreq, Damp, FP, iSt

! Initialization
IF ((iStatus == 0) .OR. reset) THEN
FP%nfs_OutputSignalLast1(inst) = InputSignal
FP%nfs_OutputSignalLast2(inst) = InputSignal
FP%nfs_InputSignalLast1(inst) = InputSignal
FP%nfs_InputSignalLast2(inst) = InputSignal
FP%nfs_OutputSignalLast1(inst) = InitialValue_
FP%nfs_OutputSignalLast2(inst) = InitialValue_
FP%nfs_InputSignalLast1(inst) = InitialValue_
FP%nfs_InputSignalLast2(inst) = InitialValue_
ENDIF

IF ((iStatus == 0) .OR. reset .OR. Moving_) THEN
Expand All @@ -192,7 +219,7 @@ REAL(DbKi) FUNCTION NotchFilterSlopes(InputSignal, DT, CornerFreq, Damp, FP, iSt

END FUNCTION NotchFilterSlopes
!-------------------------------------------------------------------------------------------------------------------------------
REAL(DbKi) FUNCTION NotchFilter(InputSignal, DT, omega, betaNum, betaDen, FP, iStatus, reset, inst)
REAL(DbKi) FUNCTION NotchFilter(InputSignal, DT, omega, betaNum, betaDen, FP, iStatus, reset, inst, InitialValue)
! Discrete time Notch Filter
! Continuous Time Form: G(s) = (s^2 + 2*omega*betaNum*s + omega^2)/(s^2 + 2*omega*betaDen*s + omega^2)
! Discrete Time Form: H(z) = (b2*z^2 +b1*z^2 + b0*z)/((z^2 +a1*z^2 + a0*z))
Expand All @@ -207,16 +234,22 @@ REAL(DbKi) FUNCTION NotchFilter(InputSignal, DT, omega, betaNum, betaDen, FP, iS
INTEGER(IntKi), INTENT(IN) :: iStatus ! A status flag set by the simulation as follows: 0 if this is the first call, 1 for all subsequent time steps, -1 if this is the final call at the end of the simulation.
INTEGER(IntKi), INTENT(INOUT) :: inst ! Instance number. Every instance of this function needs to have an unique instance number to ensure instances don't influence each other.
LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal
REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset
! Local
REAL(DbKi) :: K ! Constant gain
REAL(DbKi) :: InitialValue_ ! Value to set when reset

! Defaults
InitialValue_ = InputSignal
IF (PRESENT(InitialValue)) InitialValue_ = InitialValue

! Initialization
K = 2.0/DT
IF ((iStatus == 0) .OR. reset) THEN
FP%nf_OutputSignalLast1(inst) = InputSignal
FP%nf_OutputSignalLast2(inst) = InputSignal
FP%nf_InputSignalLast1(inst) = InputSignal
FP%nf_InputSignalLast2(inst) = InputSignal
FP%nf_OutputSignalLast1(inst) = InitialValue_
FP%nf_OutputSignalLast2(inst) = InitialValue_
FP%nf_InputSignalLast1(inst) = InitialValue_
FP%nf_InputSignalLast2(inst) = InitialValue_
FP%nf_b2(inst) = (K**2.0 + 2.0*omega*BetaNum*K + omega**2.0)/(K**2.0 + 2.0*omega*BetaDen*K + omega**2.0)
FP%nf_b1(inst) = (2.0*omega**2.0 - 2.0*K**2.0) / (K**2.0 + 2.0*omega*BetaDen*K + omega**2.0);
FP%nf_b0(inst) = (K**2.0 - 2.0*omega*BetaNum*K + omega**2.0) / (K**2.0 + 2.0*omega*BetaDen*K + omega**2.0)
Expand Down Expand Up @@ -269,6 +302,10 @@ SUBROUTINE PreFilterMeasuredSignals(CntrPar, LocalVar, DebugVar, objInst, ErrVar
! Filtering the tower fore-aft acceleration signal
IF (CntrPar%Fl_Mode > 0) THEN
! Force to start at 0
IF (LocalVar%iStatus == 0 .AND. LocalVar%Time == 0) THEN
LocalVar%NacIMU_FA_Acc = 0
LocalVar%FA_Acc = 0
ENDIF
LocalVar%NacIMU_FA_AccF = SecLPFilter(LocalVar%NacIMU_FA_Acc, LocalVar%DT, CntrPar%F_FlCornerFreq(1), CntrPar%F_FlCornerFreq(2), LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instSecLPF) ! Fixed Damping
LocalVar%FA_AccF = SecLPFilter(LocalVar%FA_Acc, LocalVar%DT, CntrPar%F_FlCornerFreq(1), CntrPar%F_FlCornerFreq(2), LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instSecLPF) ! Fixed Damping
LocalVar%NacIMU_FA_AccF = HPFilter(LocalVar%NacIMU_FA_AccF, LocalVar%DT, CntrPar%F_FlHighPassFreq, LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instHPF)
Expand Down
22 changes: 18 additions & 4 deletions ROSCO/src/ROSCO_IO.f90
Original file line number Diff line number Diff line change
Expand Up @@ -426,18 +426,18 @@ SUBROUTINE Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, size_av
DebugOutData(20) = DebugVar%YawRateCom
DebugOutData(21) = DebugVar%NacHeadingTarget
DebugOutData(22) = DebugVar%NacVaneOffset
DebugOutData(23) = DebugVar%Yaw_err
DebugOutData(23) = DebugVar%Yaw_Err
DebugOutData(24) = DebugVar%YawState
DebugOutStrings = [CHARACTER(15) :: 'WE_Cp', 'WE_b', 'WE_w', 'WE_t', 'WE_Vm', &
'WE_Vt', 'WE_Vw', 'WE_lambda', 'PC_PICommand', 'GenSpeedF', &
'RotSpeedF', 'NacIMU_FA_AccF', 'FA_AccF', 'Fl_PitCom', 'PC_MinPit', &
'axisTilt_1P', 'axisYaw_1P', 'axisTilt_2P', 'axisYaw_2P', 'YawRateCom', &
'NacHeadingTarget', 'NacVaneOffset', 'Yaw_err', 'YawState']
'NacHeadingTarget', 'NacVaneOffset', 'Yaw_Err', 'YawState']
DebugOutUnits = [CHARACTER(15) :: '[-]', '[-]', '[-]', '[-]', '[m/s]', &
'[m/s]', '[m/s]', '[rad]', '[rad]', '[rad/s]', &
'[rad/s]', '[rad/s]', '[m/s]', '[rad]', '[rad]', &
'', '', '', '', '[rad/s]', &
'[rad]', '[rad]', '[rad]', '']
'[N/A]', '[N/A]', '[N/A]', '[N/A]', '[rad/s]', &
'[deg]', '[deg]', '[deg]', '[N/A]']
nLocalVars = 69
Allocate(LocalVarOutData(nLocalVars))
Allocate(LocalVarOutStrings(nLocalVars))
Expand Down Expand Up @@ -556,6 +556,20 @@ SUBROUTINE Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, size_av
100 FORMAT('Generator speed: ', f6.1, ' RPM, Pitch angle: ', f5.1, ' deg, Power: ', f7.1, ' kW, Est. wind Speed: ', f5.1, ' m/s')
END IF

! Process DebugOutData, LocalVarOutData
! Remove very small numbers that cause ******** outputs
DO I = 1,SIZE(DebugOutData)
IF (ABS(DebugOutData(I)) < 1E-10) THEN
DebugOutData(I) = 0
END IF
END DO

DO I = 1,SIZE(LocalVarOutData)
IF (ABS(LocalVarOutData(I)) < 1E-10) THEN
LocalVarOutData(I) = 0
END IF
END DO

! Write debug files
IF(CntrPar%LoggingLevel > 0) THEN
WRITE (UnDb, FmtDat) LocalVar%Time, DebugOutData
Expand Down
Loading