SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/TRIP/trip_interface.F90
Go to the documentation of this file.
00001 !####################################################################
00002 SUBROUTINE TRIP_INTERFACE (KLUOUT,KLON,KLAT,ORESTART,KYEAR,KMONTH,  &
00003                             KTRIP,PDURATION,PRUNOFF,PDRAIN,PSRC_FLOOD) 
00004 !####################################################################
00005 !
00006 !!****  *TRIP*  
00007 !!
00008 !!    PURPOSE
00009 !!    -------
00010 !
00011 !     Driver for the TRIP river routing.
00012 !     Here, we call the physical and the diag routines     
00013 !
00014 !!      
00015 !!    REFERENCE
00016 !!    ---------
00017 !!      
00018 !!    AUTHOR
00019 !!    ------
00020 !!      B. Decharme     
00021 !!
00022 !!    MODIFICATIONS
00023 !!    -------------
00024 !!      Original    01/02/05 
00025 !!      Modif.      28/05/08 
00026 !-------------------------------------------------------------------------------
00027 !
00028 !*       0.     DECLARATIONS
00029 !               ------------
00030 !
00031 USE MODD_TRIP_PAR,    ONLY : XRHOLW_T
00032 USE MODD_TRIP_GRID_n, ONLY : XAREA
00033 USE MODD_DIAG_TRIP_n
00034 USE MODD_TRIP_n
00035 !
00036 !
00037 USE MODI_TRIP
00038 USE MODI_DIAG_TRIP_n
00039 USE MODI_RESTART_TRIP_n
00040 !
00041 IMPLICIT NONE
00042 !
00043 !*      0.1    declarations of arguments
00044 !
00045 LOGICAL, INTENT(IN)                  :: ORESTART
00046 !
00047 INTEGER, INTENT(IN)                  :: KLON
00048 INTEGER, INTENT(IN)                  :: KLAT
00049 INTEGER, INTENT(IN)                  :: KLUOUT
00050 INTEGER, INTENT(IN)                  :: KYEAR
00051 INTEGER, INTENT(IN)                  :: KMONTH
00052 INTEGER, INTENT(IN)                  :: KTRIP
00053 !
00054 REAL,    INTENT(IN)                  :: PDURATION
00055 !
00056 REAL, DIMENSION(KLON,KLAT), INTENT(INOUT)  :: PRUNOFF
00057 REAL, DIMENSION(KLON,KLAT), INTENT(INOUT)  :: PDRAIN
00058 !
00059 REAL, DIMENSION(KLON,KLAT), INTENT(INOUT),OPTIONAL  :: PSRC_FLOOD
00060 !
00061 !*      0.2    declarations of local variables
00062 !
00063 INTEGER, DIMENSION(5,2) :: ISIZE
00064 INTEGER :: JTSTEP, ITRIP_TSTEP
00065 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00066 !
00067 !-------------------------------------------------------------------------------
00068 ! Allocate local variables
00069 !-------------------------------------------------------------------------------
00070 !
00071 IF (LHOOK) CALL DR_HOOK('TRIP_INTERFACE',0,ZHOOK_HANDLE)
00072 !
00073 ISIZE(:,:) = 0
00074 !
00075 IF (LTRIP_DIAG_MISC) THEN
00076   ISIZE(1,1) = KLON
00077   ISIZE(1,2) = KLAT
00078 ENDIF
00079 !
00080 IF (CGROUNDW/='DEF') THEN
00081   ISIZE(2,1) = KLON
00082   ISIZE(2,2) = KLAT
00083 ENDIF
00084 !
00085 IF (CVIT=='VAR') THEN
00086   ISIZE(3,1) = KLON
00087   ISIZE(3,2) = KLAT
00088 ENDIF
00089 !
00090 IF (LFLOODT) THEN
00091   !
00092   IF (.NOT.PRESENT(PSRC_FLOOD)) THEN
00093     WRITE(KLUOUT,*)'!Probleme when you call the coupling_trip_n.f90 routine!!!!'
00094     STOP 
00095   ENDIF  
00096   !  
00097   ISIZE(4,1) = KLON
00098   ISIZE(4,2) = KLAT
00099   !
00100   IF(LTRIP_DIAG_MISC)THEN
00101     ISIZE(5,1) = KLON
00102     ISIZE(5,2) = KLAT
00103   ENDIF
00104 ENDIF
00105 !
00106  CALL TRIP_INTERFACE_DIM(ISIZE)
00107 !
00108 !-------------------------------------------------------------------------------
00109 !Write restart
00110 !-------------------------------------------------------------------------------
00111 !
00112 IF(ORESTART.AND.KTRIP==INT(PDURATION/XTSTEP_COUPLING))THEN
00113    CALL RESTART_TRIP_n(KLUOUT)
00114 ENDIF
00115 !
00116 IF (LHOOK) CALL DR_HOOK('TRIP_INTERFACE',1,ZHOOK_HANDLE)
00117 !
00118 !-------------------------------------------------------------------------------
00119 !
00120 CONTAINS
00121 !
00122 SUBROUTINE TRIP_INTERFACE_DIM(KSIZE)
00123 !
00124 IMPLICIT NONE
00125 !
00126 INTEGER, DIMENSION(:,:), INTENT(IN) :: KSIZE
00127 !
00128 REAL, DIMENSION(KLON,KLAT) :: ZGOUT          
00129 REAL, DIMENSION(KLON,KLAT) :: ZSOUT   
00130 REAL, DIMENSION(KLON,KLAT) :: ZSIN
00131 REAL, DIMENSION(KLON,KLAT) :: ZSURF_STO_OLD  
00132 REAL, DIMENSION(KLON,KLAT) :: ZQDIS_OLD      
00133 !
00134 REAL, DIMENSION(KSIZE(1,1),KSIZE(1,2)) :: ZQIN_OLD
00135 !
00136 REAL, DIMENSION(KSIZE(2,1),KSIZE(2,2)) :: ZGROUND_STO_OLD
00137 REAL, DIMENSION(KSIZE(2,1),KSIZE(2,2)) :: ZQGF_OLD  
00138 !
00139 REAL, DIMENSION(KSIZE(3,1),KSIZE(3,2)) :: ZVEL           
00140 REAL, DIMENSION(KSIZE(3,1),KSIZE(3,2)) :: ZHS            
00141 REAL, DIMENSION(KSIZE(3,1),KSIZE(3,2)) :: ZVEL_OLD       
00142 REAL, DIMENSION(KSIZE(3,1),KSIZE(3,2)) :: ZHS_OLD  
00143 !
00144 REAL, DIMENSION(KSIZE(4,1),KSIZE(4,2)) :: ZSOURCE
00145 REAL, DIMENSION(KSIZE(4,1),KSIZE(4,2)) :: ZQFR           
00146 REAL, DIMENSION(KSIZE(4,1),KSIZE(4,2)) :: ZQRF           
00147 REAL, DIMENSION(KSIZE(4,1),KSIZE(4,2)) :: ZVFIN
00148 REAL, DIMENSION(KSIZE(4,1),KSIZE(4,2)) :: ZVFOUT
00149 REAL, DIMENSION(KSIZE(4,1),KSIZE(4,2)) :: ZHSF
00150 REAL, DIMENSION(KSIZE(4,1),KSIZE(4,2)) :: ZFLOOD_STO_OLD 
00151 REAL, DIMENSION(KSIZE(4,1),KSIZE(4,2)) :: ZFF_OLD        
00152 REAL, DIMENSION(KSIZE(4,1),KSIZE(4,2)) :: ZHF_OLD        
00153 !
00154 REAL, DIMENSION(KSIZE(5,1),KSIZE(5,2)) :: ZQFR_OLD       
00155 REAL, DIMENSION(KSIZE(5,1),KSIZE(5,2)) :: ZQRF_OLD
00156 REAL, DIMENSION(KSIZE(5,1),KSIZE(5,2)) :: ZVFIN_OLD
00157 REAL, DIMENSION(KSIZE(5,1),KSIZE(5,2)) :: ZVFOUT_OLD
00158 REAL, DIMENSION(KSIZE(5,1),KSIZE(5,2)) :: ZWF_OLD
00159 REAL, DIMENSION(KSIZE(5,1),KSIZE(5,2)) :: ZLF_OLD
00160 REAL, DIMENSION(KSIZE(5,1),KSIZE(5,2)) :: ZHSF_OLD
00161 REAL, DIMENSION(KSIZE(5,1),KSIZE(5,2)) :: ZSOURCE_OLD
00162 !
00163 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00164 !
00165 IF (LHOOK) CALL DR_HOOK('TRIP_INTERFACE:TRIP_INTERFACE_DIM',0,ZHOOK_HANDLE)
00166 !-------------------------------------------------------------------------------
00167 !Put ISBA variables in TRIP dimension (kg --> kg/s)
00168 !-------------------------------------------------------------------------------
00169 !
00170 PRUNOFF(:,:) = PRUNOFF(:,:) / XTSTEP_COUPLING
00171 PDRAIN (:,:) = PDRAIN (:,:) / XTSTEP_COUPLING
00172 !
00173 !-------------------------------------------------------------
00174 !
00175 ZGOUT        (:,:) = 0.0
00176 ZSIN         (:,:) = 0.0
00177 ZSOUT        (:,:) = 0.0
00178 ZSURF_STO_OLD(:,:) = XDIAG_SURF_STO
00179 ZQDIS_OLD    (:,:) = XDIAG_QDIS
00180 !
00181 IF(LTRIP_DIAG_MISC) ZQIN_OLD(:,:) = XDIAG_QIN
00182 !
00183 ! No groundwater treatement (e.g. permafrost)
00184 !
00185 IF(CGROUNDW/='DEF')THEN
00186   !
00187   ZGROUND_STO_OLD(:,:) = XDIAG_GROUND_STO
00188   ZQGF_OLD       (:,:) = XDIAG_QGF 
00189   !
00190   WHERE(XTAUG(:,:)==0.0)
00191     PRUNOFF(:,:) = PRUNOFF(:,:)+PDRAIN(:,:)
00192     PDRAIN(:,:)  = 0.0
00193   ENDWHERE  
00194   !
00195 ENDIF
00196 !
00197 IF(CVIT=='VAR')THEN
00198   ZVEL    (:,:) = 0.0
00199   ZHS     (:,:) = 0.0
00200   ZVEL_OLD(:,:) = XDIAG_VEL
00201   ZHS_OLD (:,:) = XDIAG_HS
00202 ENDIF
00203 !
00204 IF(LFLOODT)THEN
00205   !  
00206   ZSOURCE(:,:) = PSRC_FLOOD(:,:) / XTSTEP_COUPLING
00207   WHERE(XFFLOOD(:,:)==1.0.AND.ZSOURCE(:,:)>0.0)
00208         PRUNOFF(:,:) = PRUNOFF(:,:) + ZSOURCE(:,:)
00209         ZSOURCE(:,:) = 0.0
00210   ENDWHERE  
00211   !
00212   ZQFR          (:,:) = 0.0
00213   ZQRF          (:,:) = 0.0
00214   ZVFIN         (:,:) = 0.0
00215   ZVFOUT        (:,:) = 0.0
00216   ZHSF          (:,:) = 0.0
00217   ZFLOOD_STO_OLD(:,:) = XDIAG_FLOOD_STO
00218   ZFF_OLD       (:,:) = XDIAG_FF
00219   ZHF_OLD       (:,:) = XDIAG_HF
00220   !
00221 
00222   IF(LTRIP_DIAG_MISC)THEN
00223     ZQFR_OLD      (:,:) = XDIAG_QFR
00224     ZQRF_OLD      (:,:) = XDIAG_QRF
00225     ZVFIN_OLD     (:,:) = XDIAG_VFIN
00226     ZVFOUT_OLD    (:,:) = XDIAG_VFOUT
00227     ZWF_OLD       (:,:) = XDIAG_WF
00228     ZLF_OLD       (:,:) = XDIAG_LF
00229     ZHSF_OLD      (:,:) = XDIAG_HSF
00230     ZSOURCE_OLD   (:,:) = XDIAG_SOURCE
00231   ENDIF
00232 !
00233 ENDIF
00234 !
00235 !-------------------------------------------------------------------------------
00236 !Call physical routines
00237 !-------------------------------------------------------------------------------
00238 !
00239 ITRIP_TSTEP = INT(XTSTEP_COUPLING/XTRIP_TSTEP)
00240 !
00241 DO JTSTEP=1,ITRIP_TSTEP
00242 !   
00243 ! * TRIP time step loop
00244 !
00245   CALL TRIP(KLUOUT,CGROUNDW,CVIT,LFLOODT,LPRINT_TRIP,        &
00246             XTRIP_TSTEP,IGRCN,ISEQ,INEXTX,INEXTY,ISEQMAX,    &
00247             XTAUG,XAREA,XLEN,XFLOOD_LEN,XSLOPEBED,XWIDTH,XN, &
00248             XN_FLOOD,XHC_BED,XWFLOOD,XTAB_F,XTAB_H,XTAB_VF,  &
00249             PDRAIN,PRUNOFF,ZSOURCE,XGROUND_STO,XSURF_STO,    &
00250             XFLOOD_STO,ZSOUT,ZGOUT,ZHS,XHFLOOD,ZVEL,         &
00251             XFFLOOD,ZQFR,ZQRF,ZVFIN,ZVFOUT,                  &
00252             ZHSF,ZSIN,KTRIP,JTSTEP,ITRIP_TSTEP,ITABMAX       ) 
00253 !
00254 ! * Actualisation of diagnostic variables   
00255 !        
00256   XDIAG_QDIS(:,:) = XDIAG_QDIS(:,:) + ZSOUT(:,:) * XTRIP_TSTEP / XRHOLW_T
00257 !   
00258   IF(CGROUNDW/='DEF')THEN
00259     XDIAG_QGF(:,:) = XDIAG_QGF(:,:)  + ZGOUT(:,:) * XTRIP_TSTEP / XRHOLW_T
00260   ENDIF
00261 !           
00262   IF(LTRIP_DIAG_MISC)THEN
00263     XDIAG_QIN (:,:) = XDIAG_QIN (:,:) + ZSIN (:,:) * XTRIP_TSTEP / XRHOLW_T
00264     IF(LFLOODT)THEN
00265       XDIAG_QFR(:,:) = XDIAG_QFR(:,:) + ZQFR(:,:) * XTRIP_TSTEP / XRHOLW_T
00266       XDIAG_QRF(:,:) = XDIAG_QRF(:,:) + ZQRF(:,:) * XTRIP_TSTEP / XRHOLW_T
00267     ENDIF
00268   ENDIF
00269 !
00270 ENDDO ! * End TRIP time step loop
00271 !
00272 XDIAG_SURF_STO(:,:) = XDIAG_SURF_STO(:,:) + XSURF_STO(:,:) / XAREA(:,:)
00273 !
00274 IF(CGROUNDW/='DEF')THEN
00275   XDIAG_GROUND_STO(:,:) = XDIAG_GROUND_STO(:,:) + XGROUND_STO(:,:) / XAREA(:,:)
00276 ENDIF
00277 !
00278 IF(CVIT=='VAR')THEN
00279    XDIAG_VEL(:,:) = XDIAG_VEL(:,:) + ZVEL(:,:)
00280    XDIAG_HS (:,:) = XDIAG_HS (:,:) + ZHS (:,:)
00281 ENDIF
00282 
00283 IF(LFLOODT)THEN
00284 !          
00285    XDIAG_FLOOD_STO(:,:) = XDIAG_FLOOD_STO(:,:) + XFLOOD_STO(:,:) / XAREA(:,:)
00286    XDIAG_FF       (:,:) = XDIAG_FF       (:,:) + XFFLOOD (:,:)
00287    XDIAG_HF       (:,:) = XDIAG_HF       (:,:) + XHFLOOD (:,:)
00288 !
00289   IF(LTRIP_DIAG_MISC)THEN
00290      XDIAG_VFIN  (:,:) = XDIAG_VFIN  (:,:) + ZVFIN     (:,:)
00291      XDIAG_VFOUT (:,:) = XDIAG_VFOUT (:,:) + ZVFOUT    (:,:)
00292      XDIAG_WF    (:,:) = XDIAG_WF    (:,:) + XWFLOOD   (:,:)
00293      XDIAG_LF    (:,:) = XDIAG_LF    (:,:) + XFLOOD_LEN(:,:)
00294      XDIAG_HSF   (:,:) = XDIAG_HSF   (:,:) + ZHSF      (:,:)
00295      XDIAG_SOURCE(:,:) = XDIAG_SOURCE(:,:) + ZSOURCE   (:,:) * XTSTEP_COUPLING / XAREA(:,:)
00296   ENDIF
00297 !
00298 ! Coupling variables
00299 !
00300   XPIFLOOD(:,:)=XFLOOD_STO(:,:)
00301 !
00302 ENDIF       
00303 !
00304 !-------------------------------------------------------------------------------
00305 !Store result
00306 !-------------------------------------------------------------------------------
00307 !
00308 IF(LPRINT_TRIP)WRITE(KLUOUT,*)''
00309 !
00310  CALL DIAG_TRIP_n(KLUOUT,KYEAR,KMONTH,KTRIP,PDURATION,      &
00311                   ZSURF_STO_OLD,ZQDIS_OLD,ZGROUND_STO_OLD, &
00312                   ZQGF_OLD,ZVEL_OLD,ZHS_OLD,ZFLOOD_STO_OLD,&
00313                   ZFF_OLD,ZHF_OLD,ZQFR_OLD,ZQRF_OLD,       &
00314                   ZVFIN_OLD,ZVFOUT_OLD,ZWF_OLD,ZLF_OLD,    &
00315                   ZHSF_OLD,ZQIN_OLD,ZSOURCE_OLD            ) 
00316 !
00317 IF (LHOOK) CALL DR_HOOK('TRIP_INTERFACE:TRIP_INTERFACE_DIM',1,ZHOOK_HANDLE)
00318 !
00319 END SUBROUTINE TRIP_INTERFACE_DIM
00320 !
00321 END SUBROUTINE TRIP_INTERFACE