SURFEX v7.3
General documentation of Surfex
|
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