SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE TRIP_SURFACE_WATER (PTSTEP,KGRCN,KSEQ,KNEXTX,KNEXTY,KSEQMAX, & 00003 PLEN,PRUNOFF,PGOUT,PSURF_STO,PSURF_STO2, & 00004 PSIN,PSOUT,PSSTO_ALL,PSSTO2_ALL,PSIN_ALL,& 00005 PDRUN_ALL,PSOUT_ALL) 00006 ! ################################################################ 00007 ! 00008 !!**** *TRIP_SURFACE_WATER* 00009 !! 00010 !! PURPOSE 00011 !! ------- 00012 ! 00013 ! Calculate the river storage in the next time step based on the storage 00014 ! of current time step using fixed 0.5m/s stream flow velocity. 00015 ! 00016 ! 00017 !!** METHOD 00018 !! ------ 00019 ! 00020 ! Direct calculation 00021 ! 00022 !! EXTERNAL 00023 !! -------- 00024 ! 00025 ! None 00026 !! 00027 !! IMPLICIT ARGUMENTS 00028 !! ------------------ 00029 !! 00030 !! 00031 !! REFERENCE 00032 !! --------- 00033 !! 00034 !! AUTHOR 00035 !! ------ 00036 !! B. Decharme 00037 !! 00038 !! MODIFICATIONS 00039 !! ------------- 00040 !! Original 01/02/05 00041 !------------------------------------------------------------------------------- 00042 ! 00043 !* 0. DECLARATIONS 00044 ! ------------ 00045 ! 00046 USE MODD_TRIP_n, ONLY : XCVEL 00047 USE MODD_TRIP_PAR, ONLY : XRHOLW_T 00048 ! 00049 ! 00050 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00051 USE PARKIND1 ,ONLY : JPRB 00052 ! 00053 IMPLICIT NONE 00054 ! 00055 !* 0.1 declarations of arguments 00056 ! 00057 REAL, INTENT(IN) :: PTSTEP ! Trip timestep value (10800s) 00058 ! 00059 INTEGER, DIMENSION(:,:),INTENT(IN) :: KGRCN ! Flow direction (1->8) 00060 INTEGER, DIMENSION(:,:),INTENT(IN) :: KSEQ ! River sequence 00061 INTEGER, DIMENSION(:,:),INTENT(IN) :: KNEXTX ! returns x and y point 00062 INTEGER, DIMENSION(:,:),INTENT(IN) :: KNEXTY ! of destination grid: 00063 ! 8 1 2 00064 ! 7 3 00065 ! 6 5 4 00066 ! 00067 INTEGER, INTENT(IN) :: KSEQMAX ! maximum down flow 00068 ! 00069 REAL,DIMENSION(:,:), INTENT(IN) :: PLEN ! river length [m] 00070 REAL,DIMENSION(:,:), INTENT(IN) :: PRUNOFF ! Surface runoff from ISBA [kg/s] 00071 REAL,DIMENSION(:,:), INTENT(IN) :: PGOUT ! ground water outflow [kg/s] 00072 REAL,DIMENSION(:,:), INTENT(IN) :: PSURF_STO ! river channel storage at t [kg] 00073 ! 00074 REAL,DIMENSION(:,:), INTENT(INOUT) :: PSURF_STO2 ! river channel storage at t+1 [kg] 00075 ! 00076 REAL,DIMENSION(:,:), INTENT(OUT) :: PSIN ! Inflow to the surface river reservoir [kg/s] 00077 REAL,DIMENSION(:,:), INTENT(OUT) :: PSOUT ! Outflow from the surface river reservoir [kg/s] 00078 ! 00079 REAL, INTENT(OUT) :: PSSTO_ALL,PSSTO2_ALL,PSIN_ALL, 00080 PDRUN_ALL,PSOUT_ALL 00081 ! Final budget variable 00082 ! 00083 !* 0.2 declarations of local variables 00084 ! 00085 REAL, DIMENSION(SIZE(PLEN,1),SIZE(PLEN,2)) :: ZQIN 00086 ! 00087 REAL :: ZRC,ZQOUT,ZSTOMAX 00088 ! 00089 INTEGER :: ILON, ILAT, I, J, ISEQ 00090 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00091 ! 00092 !------------------------------------------------------------------------------- 00093 !------------------------------------------------------------------------------- 00094 ! 00095 IF (LHOOK) CALL DR_HOOK('TRIP_SURFACE_WATER',0,ZHOOK_HANDLE) 00096 ILON = SIZE(PLEN,1) 00097 ILAT = SIZE(PLEN,2) 00098 ! 00099 !------------------------------------------------------------------------------- 00100 !------------------------------------------------------------------------------- 00101 ! 00102 PSURF_STO2 (:,:) = 0.0 00103 PSIN (:,:) = 0.0 00104 PSOUT (:,:) = 0.0 00105 ! 00106 ZQIN (:,:) = 0.0 00107 ! 00108 PSSTO_ALL = 0.0 00109 PSSTO2_ALL = 0.0 00110 PSIN_ALL = 0.0 00111 PDRUN_ALL = 0.0 00112 PSOUT_ALL = 0.0 00113 ! 00114 !------------------------------------------------------------------------------- 00115 !Sequence loop 00116 ! 00117 DO ISEQ=1,KSEQMAX 00118 DO J=1,ILAT 00119 DO I=1,ILON 00120 ! 00121 IF(KSEQ(I,J)/=ISEQ.OR.KSEQ(I,J)==0)CYCLE 00122 ! 00123 ! --------------------------------------------------------------------- 00124 ! inflow calculation 00125 ! 00126 ZQIN(I,J)=ZQIN(I,J)+PRUNOFF(I,J)+PGOUT(I,J) 00127 PDRUN_ALL=PDRUN_ALL+PRUNOFF(I,J)+PGOUT(I,J) 00128 ! 00129 PSIN(I,J)=ZQIN(I,J) 00130 ! 00131 ! ------------------------------------------------------------------ 00132 ! Fixed river channel velocity 00133 ZRC = XCVEL / PLEN(I,J) 00134 ! 00135 ! ------------------------------------------------------------------ 00136 ! river channel storage calculation 00137 PSURF_STO2(I,J) = PSURF_STO(I,J)*EXP(-(ZRC*PTSTEP))+(1.0-EXP(-(ZRC*PTSTEP)))*ZQIN(I,J)/ZRC 00138 ! 00139 ! ------------------------------------------------------------------- 00140 ! supress numerical artifacs 00141 ZSTOMAX=ZQIN(I,J)*PTSTEP+PSURF_STO(I,J) 00142 ! 00143 PSURF_STO2(I,J)=MIN(ZSTOMAX, PSURF_STO2(I,J)) 00144 ! 00145 ! ------------------------------------------------------------------ 00146 ! river channel outflow calculation and supress numerical artifacs 00147 ! 00148 ZQOUT = (PSURF_STO(I,J)-PSURF_STO2(I,J))/PTSTEP+ZQIN(I,J) 00149 PSOUT(I,J) = MAX(ZQOUT,0.0) 00150 ! 00151 PSURF_STO2(I,J) = PSURF_STO2(I,J) + (PSOUT(I,J)-ZQOUT) 00152 ! 00153 ! ------------------------------------------------------------------ 00154 ! budget calculation 00155 PSSTO_ALL = PSSTO_ALL + PSURF_STO(I,J) 00156 PSSTO2_ALL = PSSTO2_ALL + PSURF_STO2(I,J) 00157 PSIN_ALL = PSIN_ALL + ZQIN(I,J) 00158 PSOUT_ALL = PSOUT_ALL + PSOUT(I,J) 00159 ! 00160 ! ------------------------------------------------------------------ 00161 IF(KGRCN(I,J)>=1.AND.KGRCN(I,J)<=8)THEN 00162 ZQIN(KNEXTX(I,J),KNEXTY(I,J))=ZQIN(KNEXTX(I,J),KNEXTY(I,J))+PSOUT(I,J) 00163 ENDIF 00164 ! 00165 ENDDO 00166 ENDDO 00167 ENDDO 00168 ! 00169 IF (LHOOK) CALL DR_HOOK('TRIP_SURFACE_WATER',1,ZHOOK_HANDLE) 00170 ! 00171 !------------------------------------------------------------------------------- 00172 !------------------------------------------------------------------------------- 00173 END SUBROUTINE TRIP_SURFACE_WATER