SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/TRIP/trip_surface_water_velvar.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE TRIP_SURFACE_WATER_VELVAR (PTSTEP,KGRCN,KSEQ,KNEXTX,KNEXTY,KSEQMAX,       &
00003                                              PLEN,PSLOPEBED,PWIDTH,PN,PRUNOFF,PSURF_STO,   &
00004                                              PSURF_STO2,PGOUT,PSIN,PSOUT,PVEL,PHS,PAREA,   &
00005                                              PSSTO_ALL,PSSTO2_ALL,PSIN_ALL,PDRUN_ALL,      &
00006                                              PSOUT_ALL,PVEL_ALL,PHS_ALL                    ) 
00007 !     ################################################################
00008 !
00009 !!****  *TRIP_SURFACE_WATER_VELVAR*  
00010 !!
00011 !!    PURPOSE
00012 !!    -------
00013 !
00014 !     Calculate the river storage in the next time step based on the storage
00015 !     of current time step using the Manning equation and the Arora (1999) 
00016 !     variable flow velocity scheme.
00017 !     Numérical method = RK Ordre 4 Rang 4:
00018 !
00019 !     Point de depart       : X0(t)     =X(t)
00020 !     point intermediaire K1: X1(t+dt/2)=X(t) + dt/2 * F(X0(t))
00021 !     point intermediaire K2: X2(t+dt/2)=X(t) + dt/2 * F(X1(t+dt/2))
00022 !     point intermediaire K3: X3(t+dt)  =X(t) + dt   * F(X2(t+dt/2))
00023 !     point final         K4:                          F(X3(t+dt))
00024 !
00025 !     point Final: X(t+dt)=X(t)+dt/6*(F(X0(t))+2*F(X1(t+dt/2))+2*F(X2(t+dt/2))+F(X3(t+dt)))
00026 !
00027 !     
00028 !!**  METHOD
00029 !!    ------
00030 !
00031 !     RK Ordre 4 Rang 4
00032 !
00033 !!    EXTERNAL
00034 !!    --------
00035 !
00036 !     None
00037 !!
00038 !!    IMPLICIT ARGUMENTS
00039 !!    ------------------
00040 !!
00041 !!      
00042 !!    REFERENCE
00043 !!    ---------
00044 !!      
00045 !!    AUTHOR
00046 !!    ------
00047 !!      B. Decharme     
00048 !!
00049 !!    MODIFICATIONS
00050 !!    -------------
00051 !!      Original    01/02/09 
00052 !-------------------------------------------------------------------------------
00053 !
00054 !*       0.     DECLARATIONS
00055 !               ------------
00056 !
00057 USE MODD_TRIP_PAR, ONLY : XRHOLW_T
00058 !
00059 USE MODE_TRIP_FUNCTION
00060 !
00061 IMPLICIT NONE
00062 !
00063 !*      0.1    declarations of arguments
00064 !
00065 REAL, INTENT(IN)                     :: PTSTEP ! Trip timestep value (10800s)
00066 !
00067 INTEGER, DIMENSION(:,:),INTENT(IN)   :: KGRCN  ! Flow direction (1->8)
00068 INTEGER, DIMENSION(:,:),INTENT(IN)   :: KSEQ   ! River sequence
00069 INTEGER, DIMENSION(:,:),INTENT(IN)   :: KNEXTX ! returns x and y point
00070 INTEGER, DIMENSION(:,:),INTENT(IN)   :: KNEXTY ! of destination grid:
00071 !                                                                    8 1 2
00072 !                                                                    7   3
00073 !                                                                    6 5 4
00074 !
00075 INTEGER, INTENT(IN)                  :: KSEQMAX ! maximum down flow
00076 !
00077 REAL,DIMENSION(:,:), INTENT(IN)      :: PLEN       ! river length       [m] 
00078 REAL,DIMENSION(:,:), INTENT(IN)      :: PSLOPEBED  ! river bed slopes             [m/m]
00079 REAL,DIMENSION(:,:), INTENT(IN)      :: PWIDTH     ! river widths                 [m]
00080 REAL,DIMENSION(:,:), INTENT(IN)      :: PN         ! Manning roughness coeficient [-] (0.03 to 0.065)
00081 REAL,DIMENSION(:,:), INTENT(IN)      :: PAREA      ! Grid-cell area    [m˛]
00082 REAL,DIMENSION(:,:), INTENT(IN)      :: PRUNOFF    ! Surface runoff from ISBA    [kg/s]
00083 REAL,DIMENSION(:,:), INTENT(IN)      :: PGOUT      ! ground water outflow        [kg/s]
00084 REAL,DIMENSION(:,:), INTENT(IN)      :: PSURF_STO  ! river channel storage at t    [kg]
00085 !
00086 REAL,DIMENSION(:,:), INTENT(INOUT)   :: PSURF_STO2 ! river channel storage at t+1     [kg]
00087 !
00088 REAL,DIMENSION(:,:), INTENT(OUT)     :: PHS   ! river channel height [m]
00089 REAL,DIMENSION(:,:), INTENT(OUT)     :: PSIN  ! Inflow to the surface river reservoir [kg/s]
00090 REAL,DIMENSION(:,:), INTENT(OUT)     :: PSOUT ! Outflow from the surface river reservoir [kg/s]
00091 REAL,DIMENSION(:,:), INTENT(OUT)     :: PVEL  ! River channel velocity  [m/s]
00092 !
00093 REAL,                 INTENT(OUT)    :: PSSTO_ALL,PSSTO2_ALL,PSIN_ALL,    
00094                                          PDRUN_ALL,PSOUT_ALL,PVEL_ALL,     
00095                                          PHS_ALL 
00096 !                                       Final budget variable
00097 !
00098 !*      0.2    declarations of local variables
00099 !
00100 REAL, DIMENSION(SIZE(PLEN,1),SIZE(PLEN,2)) :: ZQIN
00101 !
00102 REAL    :: ZVELCOEF,ZQOUT,ZAREA, 
00103             ZTSTEP,ZSTOMAX 
00104 !
00105 REAL    :: ZS1,ZS2,ZS3
00106 REAL    :: ZK1,ZK2,ZK3,ZK4
00107 !
00108 INTEGER :: ILON, ILAT, I, J, ISEQ
00109 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00110 !
00111 !-------------------------------------------------------------------------------
00112 !-------------------------------------------------------------------------------
00113 !
00114 IF (LHOOK) CALL DR_HOOK('MODI_TRIP_SURFACE_WATER_VELVAR:TRIP_SURFACE_WATER_VELVAR',0,ZHOOK_HANDLE)
00115 ILON = SIZE(PLEN,1)
00116 ILAT = SIZE(PLEN,2)
00117 !
00118 !-------------------------------------------------------------------------------
00119 !-------------------------------------------------------------------------------
00120 !
00121 PSURF_STO2 (:,:) = 0.0
00122 PSIN       (:,:) = 0.0
00123 PSOUT      (:,:) = 0.0
00124 PVEL       (:,:) = 0.0
00125 ZQIN       (:,:) = 0.0
00126 !
00127 PSSTO_ALL   = 0.0
00128 PSSTO2_ALL  = 0.0
00129 PSIN_ALL    = 0.0
00130 PDRUN_ALL   = 0.0
00131 PSOUT_ALL   = 0.0
00132 PVEL_ALL    = 0.0
00133 PHS_ALL=0.0
00134 !
00135 ZAREA=SUM(PAREA,PLEN>0.0)
00136 !
00137 !-------------------------------------------------------------------------------
00138 !Sequence loop
00139 !
00140 DO ISEQ=1,KSEQMAX
00141    DO J=1,ILAT
00142       DO I=1,ILON
00143 !      
00144          IF(KSEQ(I,J)/=ISEQ.OR.KSEQ(I,J)==0)CYCLE
00145 !
00146 !        ---------------------------------------------------------------------
00147 !        inflow calculation
00148 !
00149          ZQIN(I,J)=ZQIN(I,J)+PRUNOFF(I,J)+PGOUT(I,J)
00150          PDRUN_ALL=PDRUN_ALL+PRUNOFF(I,J)+PGOUT(I,J)
00151 !
00152          PSIN(I,J)=ZQIN(I,J)
00153 !  
00154          IF(PN(I,J)>0.0)THEN
00155            ZVELCOEF=SQRT(PSLOPEBED(I,J))/PN(I,J)
00156          ELSE
00157            ZVELCOEF=0.0
00158          ENDIF
00159 !
00160 !        ------------------------------------------------------------------
00161 !        Runge Kutta 4            
00162 !        ------------------------------------------------------------------
00163 !           
00164          ZTSTEP=PTSTEP/2.0
00165          ZK1=FUNCVEL(ZVELCOEF,PLEN(I,J),PWIDTH(I,J),PSURF_STO(I,J),PSIN(I,J))
00166          ZS1=PSURF_STO(I,J)+ZTSTEP*ZK1
00167 !
00168          ZTSTEP=PTSTEP/2.0
00169          ZK2=FUNCVEL(ZVELCOEF,PLEN(I,J),PWIDTH(I,J),ZS1,PSIN(I,J))
00170          ZS2=PSURF_STO(I,J)+ZTSTEP*ZK2
00171 !
00172          ZTSTEP=PTSTEP
00173          ZK3=FUNCVEL(ZVELCOEF,PLEN(I,J),PWIDTH(I,J),ZS2,PSIN(I,J))
00174          ZS3=PSURF_STO(I,J)+ZTSTEP*ZK3
00175 !
00176          ZK4=FUNCVEL(ZVELCOEF,PLEN(I,J),PWIDTH(I,J),ZS3,PSIN(I,J))
00177 !
00178          ZTSTEP=PTSTEP/6.0
00179          PSURF_STO2(I,J)=PSURF_STO(I,J)+ZTSTEP*(ZK1+2.0*ZK2+2.0*ZK3+ZK4)
00180 !
00181 !        -------------------------------------------------------------------
00182 !        supress numerical artifacs
00183          ZSTOMAX=ZQIN(I,J)*PTSTEP+PSURF_STO(I,J)
00184 !      
00185          PSURF_STO2(I,J)=MIN(ZSTOMAX,PSURF_STO2(I,J))
00186 !
00187 !        ------------------------------------------------------------------
00188 !        river channel outflow calculation and supress numerical artifacs
00189 !
00190          ZQOUT      = (PSURF_STO(I,J)-PSURF_STO2(I,J))/PTSTEP+ZQIN(I,J)
00191          PSOUT(I,J) = MAX(ZQOUT,0.0)
00192 !             
00193          PSURF_STO2(I,J) = PSURF_STO2(I,J) + (PSOUT(I,J)-ZQOUT)
00194 !            
00195 !        ------------------------------------------------------------------
00196 !        river channel height and velocity diagnostic             
00197 !           
00198          IF(ZVELCOEF==0.0)THEN
00199             PHS(I,J)=0.0
00200          ELSE
00201             PHS(I,J)=PSURF_STO2(I,J)/(XRHOLW_T*PLEN(I,J)*PWIDTH(I,J))
00202          ENDIF
00203 !           
00204          PVEL(I,J)=DIAGVEL(ZVELCOEF,PLEN(I,J),PWIDTH(I,J),PHS(I,J))
00205 !
00206 !        ------------------------------------------------------------------
00207 !        budget calculation
00208          PSSTO_ALL  = PSSTO_ALL  + PSURF_STO (I,J)  
00209          PSSTO2_ALL = PSSTO2_ALL + PSURF_STO2(I,J)
00210          PSIN_ALL   = PSIN_ALL   + ZQIN      (I,J)
00211          PSOUT_ALL  = PSOUT_ALL  + PSOUT     (I,J)
00212          PVEL_ALL   = PVEL_ALL   + PVEL      (I,J) * PAREA(I,J)
00213          PHS_ALL    = PHS_ALL    + PHS       (I,J) * PAREA(I,J)
00214 !              
00215 !        ------------------------------------------------------------------
00216          IF(KGRCN(I,J)>=1.AND.KGRCN(I,J)<=8)THEN
00217            ZQIN(KNEXTX(I,J),KNEXTY(I,J))=ZQIN(KNEXTX(I,J),KNEXTY(I,J))+PSOUT(I,J)
00218          ENDIF
00219 !
00220       ENDDO
00221    ENDDO
00222 ENDDO
00223 !
00224 PVEL_ALL = PVEL_ALL / ZAREA
00225 PHS_ALL = PHS_ALL / ZAREA
00226 !
00227 IF (LHOOK) CALL DR_HOOK('MODI_TRIP_SURFACE_WATER_VELVAR:TRIP_SURFACE_WATER_VELVAR',1,ZHOOK_HANDLE)
00228 !
00229 !-------------------------------------------------------------------------------
00230 !-------------------------------------------------------------------------------
00231 END SUBROUTINE TRIP_SURFACE_WATER_VELVAR