Newer
Older

WAUTELET Philippe
committed
!SFX_LIC Copyright 2012-2019 CNRS, Meteo-France and Universite Paul Sabatier
!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence

WAUTELET Philippe
committed
!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!##########################
MODULE MODE_CRODEBUG
!##########################
!
!! *MODE_CRODEBUG*
!!
!! PURPOSE
!! -------
! CROCUS debugging mode
!!
!!** IMPLICIT ARGUMENTS
!! ------------------
!! NONE
!!
!! REFERENCE
!! ---------
!!
!! AUTHOR
!! ------
!!
!! MODIFICATIONS
!! -------------
!! Original 11/06/2012

WAUTELET Philippe
committed
!! Modifications:
!! M Lafaysse 03/10/2012 : add energy balance control
!! P. Wautelet 22/01/2019: use standard GET_ENVIRONMENT_VARIABLE instead of non standard GETENV
!--------------------------------------------------------------------------------
!
! To stop simulation if mass/energy balances not closed
LOGICAL,PARAMETER :: LPSTOPBALANCE = .FALSE.
!
LOGICAL :: LCRODAILYINFO = .FALSE.
LOGICAL :: LCRODEBUG = .FALSE.
LOGICAL :: LCRODEBUGDETAILS = .FALSE.
LOGICAL :: LCRODEBUGATM = .FALSE.
LOGICAL :: LPRINTGRAN = .FALSE.
LOGICAL :: LCONTROLBALANCE = .FALSE.
!
INTEGER :: NPOINTCRODEBUG = 1
INTEGER :: NTIMECRODEBUG = 0
INTEGER :: NENDCRODEBUG = 99999999
INTEGER :: NHOURCRODEBUG = 0
!
REAL :: XLATCRODEBUG = -999.
REAL :: XLONCRODEBUG = -999.
!
REAL :: XWARNING_MASSBALANCE=1.E-4
REAL :: XWARNING_ENERGYBALANCE=1.E-4
!
! Check environment variables to activate crocus debugging mode if required
CHARACTER(LEN=*), INTENT(IN) :: HSNOW_SCHEME
!
!
CHARACTER(1) :: YCROCUS_INFO,YCROCUS_DEBUG,YCROCUS_BALANCE
CHARACTER(8) :: YCROCUS_DEBUG_TIME
CHARACTER(2) :: YCROCUS_DEBUG_HOUR
CHARACTER(6) :: YCROCUS_DEBUG_POINT
CHARACTER(12) :: YCROCUS_DEBUG_LAT,YCROCUS_DEBUG_LON
!

WAUTELET Philippe
committed
CALL GET_ENVIRONMENT_VARIABLE("CROCUS_INFO",YCROCUS_INFO)
SELECT CASE (YCROCUS_INFO)
CASE ("1")
PRINT*,"CROCUS : print daily informations."
LCRODAILYINFO=.TRUE.
CASE DEFAULT
LCRODAILYINFO=.FALSE.
END SELECT

WAUTELET Philippe
committed
CALL GET_ENVIRONMENT_VARIABLE("CROCUS_DEBUG",YCROCUS_DEBUG)
SELECT CASE (YCROCUS_DEBUG)
CASE ("1")
PRINT*,"CROCUS DEBUGGING MODE : print snow profile at the end of each time step"
LCRODEBUG=.TRUE.
LCRODEBUGDETAILS=.FALSE.
LCRODEBUGATM=.FALSE.
LPRINTGRAN=.FALSE.
CASE ("2")
PRINT*,"CROCUS DEBUGGING MODE : print snow profile after each CROCUS routine"
LCRODEBUG=.TRUE.
LCRODEBUGDETAILS=.TRUE.
LCRODEBUGATM=.FALSE.
LPRINTGRAN=.FALSE.
CASE ("3")
PRINT*,"CROCUS DEBUGGING MODE : print snow profile at the end of each &
LCRODEBUG=.TRUE.
LCRODEBUGDETAILS=.FALSE.
LCRODEBUGATM=.TRUE.
LPRINTGRAN=.FALSE.
CASE ("4")
PRINT*,"CROCUS DEBUGGING MODE : print snow profile after each CROCUS routine &
LCRODEBUG=.TRUE.
LCRODEBUGDETAILS=.TRUE.
LCRODEBUGATM=.TRUE.
LPRINTGRAN=.FALSE.
CASE ("5")
PRINT*,"CROCUS DEBUGGING MODE : print everything"
LCRODEBUG=.TRUE.
LCRODEBUGDETAILS=.TRUE.
LCRODEBUGATM=.TRUE.
LPRINTGRAN=.TRUE.
CASE DEFAULT
LCRODEBUG=.FALSE.
LCRODEBUGDETAILS=.FALSE.
LCRODEBUGATM=.FALSE.
LPRINTGRAN=.FALSE.
END SELECT

WAUTELET Philippe
committed
CALL GET_ENVIRONMENT_VARIABLE("CROCUS_BALANCE",YCROCUS_BALANCE)
SELECT CASE (YCROCUS_BALANCE)
CASE ("1")
PRINT*,"CROCUS DEBUGGING MODE : print mass and energy balance diagnostics."
LCONTROLBALANCE=.TRUE.
CASE DEFAULT
LCONTROLBALANCE=.FALSE.
END SELECT
IF (LCRODEBUG .OR. LCONTROLBALANCE) THEN

WAUTELET Philippe
committed
CALL GET_ENVIRONMENT_VARIABLE("CROCUS_DEBUG_DATE",YCROCUS_DEBUG_TIME)
IF ( LEN_TRIM(YCROCUS_DEBUG_TIME)>0 ) THEN
READ(YCROCUS_DEBUG_TIME,'(I8)')NTIMECRODEBUG
PRINT*,"after the date : ",NTIMECRODEBUG
ELSE

WAUTELET Philippe
committed
CALL GET_ENVIRONMENT_VARIABLE("CROCUS_DEBUG_DATE_END",YCROCUS_DEBUG_TIME)
IF (LEN_TRIM(YCROCUS_DEBUG_TIME)>0) THEN
READ(YCROCUS_DEBUG_TIME,'(I8)')NENDCRODEBUG
PRINT*,"before the date : ",NENDCRODEBUG
ELSE

WAUTELET Philippe
committed
CALL GET_ENVIRONMENT_VARIABLE("CROCUS_DEBUG_HOUR",YCROCUS_DEBUG_HOUR)
IF (LEN_TRIM(YCROCUS_DEBUG_HOUR)>0) THEN
READ(YCROCUS_DEBUG_HOUR,'(I2)')NHOURCRODEBUG
PRINT*,"after the hour : ",NHOURCRODEBUG
ELSE

WAUTELET Philippe
committed
CALL GET_ENVIRONMENT_VARIABLE("CROCUS_DEBUG_POINT",YCROCUS_DEBUG_POINT)
IF (LEN_TRIM(YCROCUS_DEBUG_POINT)>0) THEN
READ(YCROCUS_DEBUG_POINT,'(I6)')NPOINTCRODEBUG
ELSE

WAUTELET Philippe
committed
CALL GET_ENVIRONMENT_VARIABLE("CROCUS_DEBUG_LAT",YCROCUS_DEBUG_LAT)
IF (LEN_TRIM(YCROCUS_DEBUG_LAT)>0) THEN
READ(YCROCUS_DEBUG_LAT,*)XLATCRODEBUG
ELSE

WAUTELET Philippe
committed
CALL GET_ENVIRONMENT_VARIABLE("CROCUS_DEBUG_LON",YCROCUS_DEBUG_LON)
IF (LEN_TRIM(YCROCUS_DEBUG_LON)>0) THEN
READ(YCROCUS_DEBUG_LON,*)XLONCRODEBUG
ELSE
XLONCRODEBUG=-999.
END IF
SUBROUTINE GETPOINT_CRODEBUG(PLAT,PLON,KDEBUG)
! gives the point to output for debugging
REAL,DIMENSION(:),INTENT(IN) :: PLAT,PLON
INTEGER,INTENT(OUT) :: KDEBUG
!
KDEBUG=MINLOC( (PLAT-XLATCRODEBUG)**2 + (PLON-XLONCRODEBUG)**2, 1 )
!