SURFEX v7.3
General documentation of Surfex
|
00001 !----------------------------------------------------------------- 00002 ! ####################### 00003 SUBROUTINE INIT_TOPD(HPROGRAM) 00004 ! ####################### 00005 ! 00006 !!**** *INIT_TOPD* 00007 !! 00008 !! PURPOSE 00009 !! ------- 00010 ! This routine aims at initialising the variables 00011 ! needed of running Topmodel. 00012 ! 00013 ! 00014 !!** METHOD 00015 !! ------ 00016 ! 00017 !! EXTERNAL 00018 !! -------- 00019 !! 00020 !! none 00021 !! 00022 !! IMPLICIT ARGUMENTS 00023 !! ------------------ 00024 !! 00025 !! 00026 !! 00027 !! 00028 !! 00029 !! REFERENCE 00030 !! --------- 00031 !! 00032 !! 00033 !! 00034 !! AUTHOR 00035 !! ------ 00036 !! 00037 !! K. Chancibault * LTHE / Meteo-France * 00038 !! B. Vincendon * Meteo-France * 00039 !! 00040 !! MODIFICATIONS 00041 !! ------------- 00042 !! 00043 !! Original 11/2006 00044 !! Modification 04/2007 : Supression of 2 arguments KSTEP,PSTEP 00045 !! that are now module arguments from MODD_TOPDDYN_n 00046 !! NNB_TOPD_STEP,XTOPD_STEP 00047 !! Modification 11/2011 : Exfiltration option removed (B. Vincendon) 00048 !------------------------------------------------------------------------------- 00049 ! 00050 !* 0. DECLARATIONS 00051 ! ------------ 00052 ! 00053 USE MODD_COUPLING_TOPD, ONLY : NNB_STP_RESTART 00054 USE MODD_TOPODYN, ONLY : CCAT, NNCAT, NNB_TOPD_STEP, XTOPD_STEP,& 00055 XDXT, NNXC, NNYC,& 00056 XNUL, XX0, XY0, NNPT,& 00057 NX_STEP_ROUT, XSPEEDR,& 00058 XSPEEDH, NNMC, NMESHT, NPMAX,& 00059 NLINE, XDMAXT,& 00060 XTOPD, XDRIV, XDHIL, XTIME_TOPD,& 00061 XDGRD, XSPEEDG, XTIME_TOPD_DRAIN,& 00062 XQTOT, XTANB, XSLOP, XDAREA,& 00063 XLAMBDA, XCONN, XQB_DR, XQB_RUN 00064 ! 00065 USE MODD_TOPD_PAR, ONLY : NDIM 00066 USE MODD_SURF_PAR, ONLY : XUNDEF, NUNDEF 00067 ! 00068 USE MODI_GET_LUOUT 00069 USE MODI_READ_TOPD_HEADER_DTM 00070 USE MODI_READ_TOPD_FILE 00071 USE MODI_READ_TOPD_HEADER_CONNEX 00072 USE MODI_READ_CONNEX_FILE 00073 USE MODI_READ_SLOPE_FILE 00074 ! 00075 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00076 USE PARKIND1 ,ONLY : JPRB 00077 ! 00078 IMPLICIT NONE 00079 ! 00080 !* 0.1 declarations of arguments 00081 ! 00082 CHARACTER(LEN=*), INTENT(IN) :: HPROGRAM ! 00083 ! 00084 !* 0.2 declarations of local variables 00085 ! 00086 ! 00087 CHARACTER(LEN=50), DIMENSION(:),ALLOCATABLE :: YFILETOP ! topographic file names 00088 CHARACTER(LEN=50), DIMENSION(:),ALLOCATABLE :: YFILECON ! topographic file names 00089 CHARACTER(LEN=50), DIMENSION(:),ALLOCATABLE :: YFILESLO ! topographic file names 00090 CHARACTER(LEN=50), DIMENSION(:),ALLOCATABLE :: YFILEDH ! topographic file names 00091 CHARACTER(LEN=50), DIMENSION(:),ALLOCATABLE :: YFILEDR ! topographic file names 00092 INTEGER :: JJ,JCAT ! loop control 00093 INTEGER :: IUNIT ! Unit of the files 00094 INTEGER :: ILUOUT ! Unit of the files 00095 ! 00096 REAL, DIMENSION(:),ALLOCATABLE :: ZTOPD_READ !Topgraphic variable read 00097 ! 00098 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00099 !------------------------------------------------------------------------------- 00100 IF (LHOOK) CALL DR_HOOK('INIT_TOPD',0,ZHOOK_HANDLE) 00101 ! 00102 !* 1 Initialization: 00103 ! --------------- 00104 ! 00105 CALL GET_LUOUT(HPROGRAM,ILUOUT) 00106 ! 00107 WRITE(ILUOUT,*) 'INITIALISATION INIT_TOPD' 00108 ! 00109 ALLOCATE(YFILETOP(NNCAT)) 00110 ALLOCATE(YFILECON(NNCAT)) 00111 ALLOCATE(YFILESLO(NNCAT)) 00112 ALLOCATE(YFILEDH (NNCAT)) 00113 ALLOCATE(YFILEDR (NNCAT)) 00114 ! 00115 DO JCAT=1,NNCAT 00116 YFILETOP(JCAT)=TRIM(CCAT(JCAT))//'_FilledDTM.map' 00117 YFILECON(JCAT)=TRIM(CCAT(JCAT))//'_connections.vec' 00118 YFILESLO(JCAT)=TRIM(CCAT(JCAT))//'_slope.vec' 00119 YFILEDR(JCAT)=TRIM(CCAT(JCAT))//'_RiverDist.map' 00120 YFILEDH(JCAT)=TRIM(CCAT(JCAT))//'_HillDist.map' 00121 ENDDO 00122 00123 ALLOCATE(NNMC(NNCAT)) 00124 NNMC(:)=0 00125 ALLOCATE(NNXC(NNCAT)) 00126 NNXC(:)=0 00127 ALLOCATE(NNYC(NNCAT)) 00128 NNYC(:)=0 00129 ALLOCATE(XX0(NNCAT)) 00130 XX0(:)=0.0 00131 ALLOCATE(XY0(NNCAT)) 00132 XY0(:)=0.0 00133 ALLOCATE(NNPT(NNCAT)) 00134 NNPT(:)=0 00135 ALLOCATE(XNUL(NNCAT)) 00136 ALLOCATE(XDXT(NNCAT)) 00137 ! 00138 !* 2 Topographic files 00139 ! ----------------------------- 00140 DO JCAT=1,NNCAT 00141 CALL READ_TOPD_HEADER_DTM(HPROGRAM,YFILETOP(JCAT),'FORMATTED',& 00142 XX0(JCAT),XY0(JCAT),NNXC(JCAT),NNYC(JCAT),& 00143 XNUL(JCAT),XDXT(JCAT)) 00144 ENDDO 00145 ! 00146 NNPT(:) = NNXC(:) * NNYC(:) 00147 ! 00148 NPMAX = MAXVAL(NNPT(:)) 00149 ! 00150 ! 00151 ALLOCATE(NLINE(NNCAT,NPMAX)) 00152 NLINE(:,:)=0 00153 ALLOCATE(XDRIV(NNCAT,NPMAX)) 00154 XDRIV(:,:)=0.0 00155 ALLOCATE(XDHIL(NNCAT,NPMAX)) 00156 XDHIL(:,:)=0.0 00157 ALLOCATE(XDGRD(NNCAT,NPMAX)) 00158 XDGRD(:,:)=0.0 00159 ALLOCATE(XQTOT(NNCAT,NNB_TOPD_STEP)) 00160 XQTOT(:,:)=0.0 00161 ALLOCATE(XTOPD(NNCAT,NPMAX)) 00162 XTOPD(:,:)=0.0 00163 00164 ALLOCATE(ZTOPD_READ(NPMAX)) 00165 DO JCAT = 1,NNCAT 00166 ! 00167 CALL READ_TOPD_FILE(HPROGRAM,YFILETOP(JCAT),'FORMATTED',NNPT(JCAT),ZTOPD_READ) 00168 DO JJ = 1,NNPT(JCAT) 00169 XTOPD(JCAT,JJ) = ZTOPD_READ(JJ) ! XTOPD can only be >=0 00170 ENDDO 00171 ! 00172 ENDDO 00173 ! for XTOPD, we do not have to use NLINE, all the pixels of the rectancle around 00174 ! the catchment are read. 00175 ! 00176 !* 4 Connection files 00177 ! ---------------- 00178 ! 00179 DO JCAT=1,NNCAT 00180 CALL READ_TOPD_HEADER_CONNEX(HPROGRAM,YFILECON(JCAT),'FORMATTED',NNMC(JCAT)) 00181 ENDDO 00182 ! 00183 NMESHT=MAXVAL(NNMC(:)) 00184 ! 00185 ALLOCATE(XDMAXT(NNCAT,NMESHT)) 00186 ALLOCATE(XCONN(NNCAT,NMESHT,NDIM)) 00187 XCONN(:,:,:)=0.0 00188 XDMAXT(:,:)=0.0 00189 ! 00190 DO JCAT=1,NNCAT 00191 CALL READ_CONNEX_FILE(HPROGRAM,YFILECON(JCAT),'FORMATTED',NNMC(JCAT),XCONN(JCAT,:,:),NLINE(JCAT,:)) 00192 ENDDO 00193 ! 00194 !* 5 Slope files 00195 ! ----------- 00196 IF (HPROGRAM/='PGD') THEN 00197 ! 00198 ALLOCATE(XTANB(NNCAT,NMESHT)) 00199 ALLOCATE(XSLOP(NNCAT,NMESHT)) 00200 ALLOCATE(XDAREA(NNCAT,NMESHT)) 00201 ALLOCATE(XLAMBDA(NNCAT,NMESHT)) 00202 ! 00203 DO JCAT=1,NNCAT 00204 CALL READ_SLOPE_FILE(HPROGRAM,YFILESLO(JCAT),'FORMATTED',NNMC(JCAT),& 00205 XTANB(JCAT,:),XSLOP(JCAT,:),XDAREA(JCAT,:),XLAMBDA(JCAT,:)) 00206 ENDDO 00207 ! 00208 !* 6 River Distance file 00209 ! ------------------- 00210 ! 00211 DO JCAT=1,NNCAT 00212 CALL READ_TOPD_FILE(HPROGRAM,YFILEDR(JCAT),'FORMATTED',NNPT(JCAT),ZTOPD_READ) 00213 DO JJ=1,NPMAX 00214 IF ( NLINE(JCAT,JJ)/=0. .AND. NLINE(JCAT,JJ)/=XUNDEF ) & 00215 XDRIV(JCAT,NLINE(JCAT,JJ)) = ZTOPD_READ(JJ) 00216 ENDDO 00217 ENDDO 00218 ! for XDRIV, we must use NLINE, online pixels inside de the catchment are read. 00219 ! 00220 !* 7 Hillslope Distance file 00221 ! ----------------------- 00222 ! 00223 DO JCAT=1,NNCAT 00224 CALL READ_TOPD_FILE(HPROGRAM,YFILEDH(JCAT),'FORMATTED',NNPT(JCAT),ZTOPD_READ) 00225 DO JJ=1,NPMAX 00226 IF ( NLINE(JCAT,JJ)/=0. .AND. NLINE(JCAT,JJ)/=XUNDEF ) & 00227 XDHIL(JCAT,NLINE(JCAT,JJ)) = ZTOPD_READ(JJ) 00228 ENDDO 00229 ENDDO 00230 ! 00231 ! for XDHIL, we must use NLINE, online pixels inside de the catchment are read. 00232 XDGRD(:,:) = XDHIL(:,:) 00233 ! 00234 !* 8 Calculations for routing by geomorpho 00235 ! ------------------------------------- 00236 ! 00237 ALLOCATE(NX_STEP_ROUT(NNCAT)) 00238 ALLOCATE(XTIME_TOPD(NNCAT,NMESHT)) 00239 ALLOCATE(XTIME_TOPD_DRAIN(NNCAT,NMESHT)) 00240 ! 00241 XTIME_TOPD(:,:) = 0.0 00242 XTIME_TOPD_DRAIN(:,:) = 0.0 00243 XSPEEDH(:) = XSPEEDR(:)/10. 00244 ! 00245 ! 00246 DO JCAT=1,NNCAT 00247 ! 00248 IF ( XSPEEDR(JCAT)/=0. .AND. XSPEEDG(JCAT)/=0. ) THEN 00249 WHERE ( XDHIL(JCAT,1:NNMC(JCAT))/=XUNDEF .AND. XDRIV(JCAT,1:NNMC(JCAT))/=XUNDEF ) & 00250 XTIME_TOPD(JCAT,1:NNMC(JCAT)) = XDHIL(JCAT,1:NNMC(JCAT)) / XSPEEDH(JCAT) + & 00251 XDRIV(JCAT,1:NNMC(JCAT)) / XSPEEDR(JCAT) 00252 WHERE ( XDGRD(JCAT,1:NNMC(JCAT))/=XUNDEF .AND. XDRIV(JCAT,1:NNMC(JCAT))/=XUNDEF ) & 00253 XTIME_TOPD_DRAIN(JCAT,1:NNMC(JCAT)) = XDGRD(JCAT,1:NNMC(JCAT)) / XSPEEDG(JCAT) + & 00254 XDRIV(JCAT,1:NNMC(JCAT)) / XSPEEDR(JCAT) 00255 ELSE 00256 WRITE(ILUOUT,*) 'You have to choose some values for routing velocities' 00257 ENDIF 00258 ! 00259 IF (XTOPD_STEP/=0.) & 00260 NX_STEP_ROUT(JCAT) = INT(MAXVAL(XTIME_TOPD(JCAT,1:NNMC(JCAT))) / XTOPD_STEP) + 1 00261 ! 00262 ENDDO 00263 ! 00264 IF ( NNB_STP_RESTART==0 ) NNB_STP_RESTART = MAX(NNB_TOPD_STEP,MAXVAL(NX_STEP_ROUT(:))) 00265 ! 00266 ! 00267 ALLOCATE(XQB_DR(NNCAT,NNB_TOPD_STEP)) 00268 XQB_DR(:,:)=0.0 00269 ALLOCATE(XQB_RUN(NNCAT,NNB_TOPD_STEP)) 00270 XQB_RUN(:,:)=0.0 00271 ! 00272 ENDIF 00273 ! 00274 IF (LHOOK) CALL DR_HOOK('INIT_TOPD',1,ZHOOK_HANDLE) 00275 ! 00276 END SUBROUTINE INIT_TOPD