SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/mode_crodebug.F90
Go to the documentation of this file.
00001 !##########################
00002 MODULE MODE_CRODEBUG
00003 !##########################
00004 !
00005 !! *MODE_CRODEBUG*
00006 !!
00007 !! PURPOSE
00008 !! -------
00009 ! CROCUS debugging mode
00010 
00011 !!
00012 !!**  IMPLICIT ARGUMENTS
00013 !!    ------------------
00014 !!       NONE          
00015 !!
00016 !!    REFERENCE
00017 !!    ---------
00018 !!
00019 !!    AUTHOR
00020 !!    ------
00021 !!      M. Lafaysse       * Meteo France *
00022 !!
00023 !!    MODIFICATIONS
00024 !!    -------------
00025 !!      Original    11/06/2012
00026 !!      Modification M Lafaysse 03/10/2012 : add energy balance control
00027 !--------------------------------------------------------------------------------
00028 
00029 USE MODD_ISBA_n,       ONLY : TSNOW
00030 
00031 IMPLICIT NONE
00032 
00033 LOGICAL::LCRODAILYINFO=.FALSE.
00034 LOGICAL::LCRODEBUG=.FALSE.
00035 LOGICAL::LCRODEBUGDETAILS=.FALSE.
00036 LOGICAL::LCRODEBUGATM=.FALSE.
00037 LOGICAL::LPRINTGRAN=.FALSE.
00038 LOGICAL::LCONTROLBALANCE=.FALSE.
00039 
00040 INTEGER::NPOINTCRODEBUG=1
00041 INTEGER::NTIMECRODEBUG=0
00042 INTEGER::NENDCRODEBUG=99999999
00043 INTEGER::NHOURCRODEBUG=0
00044 
00045 REAL::XLATCRODEBUG=-999.
00046 REAL::XLONCRODEBUG=-999.
00047 
00048 CONTAINS
00049 
00050 SUBROUTINE INIT_CRODEBUG()
00051 ! Check environment variables to activate crocus debugging mode if required
00052 
00053  CHARACTER(1)::YCROCUS_INFO,YCROCUS_DEBUG,YCROCUS_BALANCE
00054  CHARACTER(8)::YCROCUS_DEBUG_TIME
00055  CHARACTER(2)::YCROCUS_DEBUG_HOUR
00056  CHARACTER(6)::YCROCUS_DEBUG_POINT
00057  CHARACTER(12)::YCROCUS_DEBUG_LAT,YCROCUS_DEBUG_LON
00058 
00059 IF (TSNOW%SCHEME=='CRO') THEN
00060   CALL GETENV("CROCUS_INFO",YCROCUS_INFO)
00061   SELECT CASE (YCROCUS_INFO)
00062     CASE ("1")
00063       PRINT*,"CROCUS : print daily informations."
00064       LCRODAILYINFO=.TRUE.
00065     CASE DEFAULT
00066       LCRODAILYINFO=.FALSE.
00067   END SELECT
00068   CALL GETENV("CROCUS_DEBUG",YCROCUS_DEBUG)
00069   SELECT CASE (YCROCUS_DEBUG)
00070     CASE ("1")
00071       PRINT*,"CROCUS DEBUGGING MODE : print snow profile at the end of each time step"
00072       LCRODEBUG=.TRUE.
00073       LCRODEBUGDETAILS=.FALSE.
00074       LCRODEBUGATM=.FALSE.
00075       LPRINTGRAN=.FALSE.
00076     CASE ("2")
00077       PRINT*,"CROCUS DEBUGGING MODE : print snow profile after each CROCUS routine"
00078       LCRODEBUG=.TRUE.
00079       LCRODEBUGDETAILS=.TRUE.
00080       LCRODEBUGATM=.FALSE.
00081       LPRINTGRAN=.FALSE.
00082     CASE ("3")
00083       PRINT*,
00084 "CROCUS DEBUGGING MODE : print snow profile at the end of each &        & time step and forcing data"
00085       LCRODEBUG=.TRUE.
00086       LCRODEBUGDETAILS=.FALSE.
00087       LCRODEBUGATM=.TRUE.
00088       LPRINTGRAN=.FALSE.
00089     CASE ("4")
00090       PRINT*,
00091 "CROCUS DEBUGGING MODE : print snow profile after each CROCUS routine & & and forcing data"
00092       LCRODEBUG=.TRUE.
00093       LCRODEBUGDETAILS=.TRUE.
00094       LCRODEBUGATM=.TRUE.
00095       LPRINTGRAN=.FALSE.
00096     CASE ("5")
00097       PRINT*,"CROCUS DEBUGGING MODE : print everything"
00098       LCRODEBUG=.TRUE.
00099       LCRODEBUGDETAILS=.TRUE.
00100       LCRODEBUGATM=.TRUE.
00101       LPRINTGRAN=.TRUE.
00102     CASE DEFAULT
00103       LCRODEBUG=.FALSE.
00104       LCRODEBUGDETAILS=.FALSE.
00105       LCRODEBUGATM=.FALSE.
00106       LPRINTGRAN=.FALSE.
00107   END SELECT
00108 
00109   CALL GETENV("CROCUS_BALANCE",YCROCUS_BALANCE)
00110  
00111   SELECT CASE (YCROCUS_BALANCE)
00112     CASE ("1")
00113       PRINT*,"CROCUS DEBUGGING MODE : print mass and energy balance diagnostics."
00114       LCONTROLBALANCE=.TRUE.
00115     CASE DEFAULT
00116       LCONTROLBALANCE=.FALSE.
00117   END SELECT
00118   
00119   IF (LCRODEBUG .OR. LCONTROLBALANCE) THEN
00120     CALL GETENV("CROCUS_DEBUG_DATE",YCROCUS_DEBUG_TIME)
00121     IF (LEN_TRIM(YCROCUS_DEBUG_TIME)>0) THEN
00122       READ(YCROCUS_DEBUG_TIME,'(I8)')NTIMECRODEBUG
00123       PRINT*,"after the date : ",NTIMECRODEBUG
00124     ELSE
00125       NTIMECRODEBUG=0
00126     END IF
00127 
00128     CALL GETENV("CROCUS_DEBUG_DATE_END",YCROCUS_DEBUG_TIME)
00129     IF (LEN_TRIM(YCROCUS_DEBUG_TIME)>0) THEN
00130       READ(YCROCUS_DEBUG_TIME,'(I8)')NENDCRODEBUG
00131       PRINT*,"before the date : ",NENDCRODEBUG
00132     ELSE
00133       NENDCRODEBUG=99999999
00134     END IF
00135 
00136     CALL GETENV("CROCUS_DEBUG_HOUR",YCROCUS_DEBUG_HOUR)
00137     IF (LEN_TRIM(YCROCUS_DEBUG_HOUR)>0) THEN
00138       READ(YCROCUS_DEBUG_HOUR,'(I2)')NHOURCRODEBUG
00139       PRINT*,"after the hour : ",NHOURCRODEBUG
00140     ELSE
00141       NHOURCRODEBUG=0
00142     END IF
00143 
00144     CALL GETENV("CROCUS_DEBUG_POINT",YCROCUS_DEBUG_POINT)
00145     IF (LEN_TRIM(YCROCUS_DEBUG_POINT)>0) THEN
00146       READ(YCROCUS_DEBUG_POINT,'(I6)')NPOINTCRODEBUG
00147     ELSE
00148       NPOINTCRODEBUG=1
00149     END IF
00150 
00151     CALL GETENV("CROCUS_DEBUG_LAT",YCROCUS_DEBUG_LAT)
00152     IF (LEN_TRIM(YCROCUS_DEBUG_LAT)>0) THEN
00153       READ(YCROCUS_DEBUG_LAT,*)XLATCRODEBUG
00154     ELSE 
00155       XLATCRODEBUG=-999.
00156     END IF
00157 
00158     CALL GETENV("CROCUS_DEBUG_LON",YCROCUS_DEBUG_LON)
00159     IF (LEN_TRIM(YCROCUS_DEBUG_LON)>0) THEN
00160       READ(YCROCUS_DEBUG_LON,*)XLONCRODEBUG
00161     ELSE
00162       XLONCRODEBUG=-999.
00163     END IF
00164   END IF
00165 END IF
00166 
00167 END SUBROUTINE INIT_CRODEBUG
00168 
00169 SUBROUTINE GETPOINT_CRODEBUG(PLAT,PLON,KDEBUG)
00170 ! gives the point to output for debugging
00171 REAL,DIMENSION(:),INTENT(IN)::PLAT,PLON
00172 INTEGER,INTENT(OUT)::KDEBUG
00173 
00174 KDEBUG=MINLOC((PLAT-XLATCRODEBUG)**2+(PLON-XLONCRODEBUG)**2,1)
00175 
00176 END SUBROUTINE GETPOINT_CRODEBUG
00177 
00178 
00179 END MODULE MODE_CRODEBUG