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