SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/TOPD/topodyn_lat.F90
Go to the documentation of this file.
00001 !-----------------------------------------------------------------
00002 !     ###########################
00003 SUBROUTINE TOPODYN_LAT(PRW,PDEF,PKAPPA,PKAPPAC,GTOPD)
00004 !,PERROR)
00005 !     ###########################
00006 !
00007 !
00008 !     PURPOSE
00009 !     -------
00010 !     to distribute laterally soil water following topodyn concept
00011 !
00012 !
00013 !     METHOD
00014 !     ------
00015 !
00016 !     EXTERNAL
00017 !     --------
00018 !     none
00019 !
00020 !
00021 !     AUTHOR
00022 !     ------
00023 !
00024 !     G.-M. Saulnier * LTHE * 
00025 !     K. Chancibault * CNRM *
00026 !
00027 !     MODIFICATIONS
00028 !     -------------
00029 !
00030 !     Original    12/2003
00031 !     writing in fortran 90 12/2004
00032 !------------------------------------------------------------------------------------------
00033 !
00034 !*    0.0    DECLARATIONS
00035 !            ------------
00036 USE MODD_TOPODYN,       ONLY : NNCAT, NMESHT, XDMAXT, XDXT, XMPARA, NNMC, XCONN, NLINE,&
00037                                  XSLOP,  XDAREA
00038 USE MODD_COUPLING_TOPD, ONLY : XWSTOPT, XDTOPT
00039 USE MODD_TOPD_PAR,        ONLY : XSTEPK
00040 !
00041 USE MODD_SURF_PAR,        ONLY : XUNDEF
00042 !
00043 USE MODI_FLOWDOWN
00044 USE MODI_ABOR1_SFX
00045 USE MODI_WRITE_FILE_VECMAP
00046 USE MODI_WRITE_FILE_MAP
00047 !
00048 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00049 USE PARKIND1  ,ONLY : JPRB
00050 !
00051 IMPLICIT NONE
00052 !
00053 !*    0.1   declarations of arguments
00054 !
00055 REAL, DIMENSION(:,:), INTENT(IN)   :: PRW
00056 REAL, DIMENSION(:,:), INTENT(OUT)  :: PDEF
00057 REAL, DIMENSION(:,:), INTENT(OUT)  :: PKAPPA
00058 REAL, DIMENSION(:), INTENT(OUT)    :: PKAPPAC
00059 LOGICAL, DIMENSION(:), INTENT(OUT) :: GTOPD
00060 !
00061 !*    0.2   declarations of local variables
00062 !
00063 LOGICAL              :: GFOUND  ! logical variable
00064 REAL                 :: ZSOMME
00065 REAL                 :: ZM      ! XMPARA in m
00066 REAL                 :: ZDX     ! XDXT in m
00067 REAL                 :: ZKVAL, ZKVALMIN, ZKVALMAX
00068 REAL                 :: ZDAV    ! Averaged deficit (m)
00069 REAL                 :: ZDAV2   ! Averaged deficit on ZA-ZAS-ZAD (m)
00070 REAL                 :: ZNDMAXAV,ZNKAV ! temporary averaged maximal deficit and averaged similarity index
00071 REAL                 :: ZDMAXAV,ZKAV   ! averaged maximal deficit and averaged similarity index
00072 REAL                 :: ZFUNC
00073 REAL                 :: ZDIF,ZDIFMIN   ! difference calcul
00074 REAL                 :: ZNAS, ZNAD     ! temporary saturated and dry relative catchment area
00075 REAL                 :: ZAS,ZAD        ! saturated and dry relative catchment area 
00076 REAL                 :: ZA             ! total catchment area
00077 REAL                 :: ZTMP
00078 !
00079 REAL, DIMENSION(NMESHT) :: ZDMAX     ! XDMAXT in m
00080 REAL, DIMENSION(NMESHT) :: ZRW       ! PRW in m
00081 REAL, DIMENSION(NMESHT) :: ZDINI     ! initial deficit
00082 REAL, DIMENSION(NMESHT) :: ZMASK
00083 REAL, DIMENSION(NMESHT) :: ZKAPPA_PACK, ZDMAX_PACK
00084 !REAL, DIMENSION(NMESHT) :: ZTMP
00085 !
00086 INTEGER              :: J1, J2, JJ !
00087 INTEGER              :: INKAPPA ! number of steps in similarity index distribution
00088 INTEGER              :: INPCON  ! number of connected pixels
00089 INTEGER              :: INAS    ! number of saturated pixels
00090 INTEGER              :: INAD    ! number of dry pixels
00091 INTEGER :: I_DIM
00092 !
00093 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00094 !-----------------------------------------------------------------------------------
00095 IF (LHOOK) CALL DR_HOOK('TOPODYN_LAT',0,ZHOOK_HANDLE)
00096 !
00097 PKAPPA(:,: )= 0.0
00098 PKAPPAC(:) = 0.
00099 GTOPD(:) = .TRUE.
00100 PDEF(:,:) = 0.
00101 !
00102 DO JJ = 1,NNCAT
00103   !*    0.    Initialisation
00104   !           -------------- 
00105   ZMASK(:) = 0.0
00106   ZRW(:) = 0.0
00107   ZDMAX(:) = 0.0
00108   INPCON = 0
00109   ZDAV = 0.0
00110   ZDAV2 = 0.0
00111   GFOUND = .FALSE.
00112   ZDIFMIN = 99999.
00113   !
00114   ZRW(:) = PRW(JJ,:) 
00115   ZDMAX(:) = XDMAXT(JJ,:)
00116   ZDX = XDXT(JJ)
00117   ZM = XMPARA(JJ)
00118   ZDINI(:) = ZDMAX(:)
00119   !
00120   !*    0.2   definition of the catchment area concerned by lateral distribution
00121   !           ------------------------------------------------------------------
00122   !
00123   DO J1=1,NNMC(JJ)
00124     !
00125     IF ( ZRW(J1).GT.0.0 ) THEN
00126       ZMASK(J1)=1.0
00127     ELSE
00128       ZMASK(J1)=0.0
00129     ENDIF
00130     !
00131   ENDDO
00132   !
00133   CALL FLOWDOWN(NNMC(JJ),ZMASK,XCONN(JJ,:,:),NLINE(JJ,:))
00134   !
00135   WHERE (ZMASK == 0.0) ZMASK = XUNDEF
00136   !
00137   !
00138   !*    1.    Calcul of hydrological similarity and topographic indexes 
00139   !           ---------------------------------------------------------
00140   !*    1.1   Calcul of averaged deficit and initialisation of indexes
00141   !           --------------------------------------------------------
00142   !
00143   ZA   = NNMC(JJ) * ZDX**2
00144   ZTMP=0.
00145   !
00146   DO J1=1,NNMC(JJ)
00147     !
00148     IF (ZMASK(J1)/=XUNDEF) THEN
00149       !
00150       PKAPPA(JJ,J1) = ZRW(J1) 
00151       INPCON = INPCON + 1
00152       ZDINI(J1) = ZDMAX(J1) - ZRW(J1)
00153       !
00154       IF ( ZDINI(J1) <0.0 ) THEN
00155         ! WRITE(*,*) J1,'Dini negatif !'
00156         ZTMP = ZTMP - ZDINI(J1) !we stock here water above saturation to be
00157                                 !       distributed among the others pixels
00158         ZDINI(J1) = 0.
00159       ENDIF
00160       !
00161       ZDAV = ZDAV + ZDINI(J1)
00162       !
00163     ELSE
00164       !
00165       PKAPPA(JJ,J1) = XUNDEF
00166       !
00167     ENDIF
00168     !
00169   ENDDO
00170   !
00171   IF (ZTMP>0.) THEN
00172     !write(*,*) COUNT(ZDINI(:)<0.),' pixels avec ZDINI negatif. Volume total :', ZTMP
00173     WHERE ( ZDINI(:)>0. ) ZDINI(:) = ZDINI(:)-ZTMP/(COUNT(ZDINI(:)>0.))
00174   ENDIF
00175   !
00176   IF (INPCON >= NNMC(JJ)/1000) THEN
00177     !
00178     ZDAV = ZDAV / INPCON 
00179     ZDAV = ZDAV / ZM
00180     !
00181     !*    1.2   Propagation of indexes
00182     !           ----------------------
00183     !
00184     CALL FLOWDOWN(NNMC(JJ),PKAPPA(JJ,:),XCONN(JJ,:,:),NLINE(JJ,:))
00185     !
00186     !*    1.3   Distribution of indexes
00187     !           ----------------------
00188     !
00189     J2=1
00190     !
00191     DO WHILE ( .NOT.GFOUND .AND. J2.LE.NNMC(JJ) )
00192       !
00193       IF (ZMASK(J2)/=XUNDEF) THEN
00194         !
00195         GFOUND = .TRUE.
00196         ZKVAL = PKAPPA(JJ,J2) * XDAREA(JJ,J2) / XSLOP(JJ,J2)
00197         ZKVAL = LOG(ZKVAL)
00198         ZKVALMAX = ZKVAL
00199         ZKVALMIN = ZKVAL
00200         PKAPPA(JJ,J2) = ZKVAL
00201         !
00202       ELSE
00203         !
00204         PKAPPA(JJ,J2) = XUNDEF
00205         !
00206       ENDIF
00207       !
00208       J2 = J2 + 1
00209       !
00210     ENDDO
00211     !     
00212     DO J1 = J2,NNMC(JJ)
00213       !
00214       IF (ZMASK(J1)/=XUNDEF) THEN
00215         !
00216         ZKVAL = PKAPPA(JJ,J1) * XDAREA(JJ,J1) / XSLOP(JJ,J1)
00217         ZKVAL = LOG(ZKVAL)
00218         !
00219         IF (ZKVAL.GT.ZKVALMAX) THEN
00220           ZKVALMAX = ZKVAL
00221         ELSEIF (ZKVAL.LT.ZKVALMIN) THEN
00222           ZKVALMIN = ZKVAL
00223         ENDIF
00224         !
00225         PKAPPA(JJ,J1) = ZKVAL
00226         !
00227       ELSE
00228         !
00229         PKAPPA(JJ,J1) = XUNDEF
00230         !
00231       ENDIF
00232       !
00233     ENDDO
00234     !
00235     !*    1.4   Calcul of saturation index
00236     !           --------------------------
00237     !
00238     I_DIM = COUNT( ZMASK(1:NNMC(JJ))/=XUNDEF )
00239     ZKAPPA_PACK(:) = XUNDEF
00240     ZDMAX_PACK (:) = XUNDEF
00241     ZKAPPA_PACK(1:I_DIM) = PACK(PKAPPA(JJ,1:NNMC(JJ)),ZMASK(1:NNMC(JJ))/=XUNDEF)
00242     ZDMAX_PACK (1:I_DIM) = PACK(ZDMAX    (1:NNMC(JJ)),ZMASK(1:NNMC(JJ))/=XUNDEF)
00243     !
00244     INKAPPA = INT((ZKVALMAX - ZKVALMIN) / XSTEPK)
00245     !
00246     DO J1=1,INKAPPA
00247       !
00248       ZKVAL = ZKVALMIN + (XSTEPK * (J1-1))
00249       INAS = 0
00250       INAD = 0
00251       ZNDMAXAV = 0.0
00252       ZNKAV = 0.0
00253       !
00254       DO J2=1,I_DIM      
00255         !      
00256         IF ( ZKAPPA_PACK(J2).GE.ZKVAL ) THEN
00257           ! saturated pixel
00258           INAS = INAS + 1
00259         ELSEIF  (ZKAPPA_PACK(J2).LE.( ZKVAL-(ZDMAX_PACK(J2)/ZM)) ) THEN
00260           ! dry pixel
00261           INAD = INAD + 1
00262           ZNDMAXAV = ZNDMAXAV + ZDMAX_PACK(J2)
00263         ELSE
00264           ZNKAV = ZNKAV + ZKAPPA_PACK(J2)
00265         ENDIF
00266         !
00267       ENDDO
00268       ! 
00269       IF (INAD == 0) THEN
00270         ZNDMAXAV = 0.0
00271       ELSE
00272         ZNDMAXAV = ZNDMAXAV /  REAL(INAD)
00273       ENDIF
00274       !
00275       IF ( INPCON == INAS .OR. INPCON == INAD .OR. INPCON == (INAD+INAS)) THEN
00276         ZNKAV = 0.0
00277       ELSE
00278         ZNKAV = ZNKAV / REAL(INPCON - INAD - INAS)
00279       ENDIF
00280       !
00281       IF (INPCON /= 0) THEN
00282         ZNAS = REAL(INAS) / REAL(INPCON)
00283         ZNAD = REAL(INAD) / REAL(INPCON)
00284       ENDIF
00285       !
00286       ZFUNC = (1 - ZNAS - ZNAD) * ( ZKVAL - ZNKAV )
00287       IF (ZM /= 0.) ZFUNC = ZFUNC + (ZNAD * (ZNDMAXAV / ZM))
00288       !
00289       ZDIF = ABS( ZFUNC - ZDAV )
00290       !
00291       IF ( ZDIF.LT.ZDIFMIN ) THEN
00292         !
00293         ZDIFMIN = ZDIF
00294         PKAPPAC(JJ) = ZKVAL
00295         ZAS = ZNAS
00296         ZAD = ZNAD
00297         ZDMAXAV = ZNDMAXAV
00298         ZKAV = ZNKAV
00299         !
00300       ENDIF
00301       !
00302     ENDDO   
00303     !
00304     !*    2.     Local deficits calculation
00305     !            --------------------------
00306     !
00307     !*    2.1    New averaged deficit on A-Ad-As
00308     !            -------------------------------
00309     !
00310     ZDAV = ZDAV * ZM
00311     !
00312     IF ( ZAS<1. .AND. ZAD<1. ) THEN
00313       !
00314       ZDAV2 = (ZDAV - ZDMAXAV * ZAD) / (1 - ZAS - ZAD)
00315       !
00316     ELSE
00317       !
00318       IF (ZAS>=1.) WRITE(*,*) 'ALL THE AREA IS SATURATED'
00319       IF (ZAD>=1.) WRITE(*,*) 'ALL THE AREA HAS A MAXIMAL DEFICIT'
00320       WRITE(*,*) 'ALL THE AREA',ZAS,ZAD
00321       CALL ABOR1_SFX("TOPODYN_LAT: ALL THE AREA IS SATURATED OR HAS A MAXIMAL DEFICIT")
00322       !
00323     ENDIF
00324     !
00325     !*    2.2    Local deficits 
00326     !            --------------
00327     !
00328     ZSOMME=0.0
00329     !ZTMP(:)=XUNDEF
00330     !
00331     DO J1=1,NNMC(JJ)
00332       !
00333       IF ( ZMASK(J1)/=XUNDEF ) THEN
00334         !
00335         IF ( (PKAPPA(JJ,J1).GT.(PKAPPAC(JJ) - ZDMAX(J1)/ZM)) .AND. (PKAPPA(JJ,J1).LT.PKAPPAC(JJ)) ) THEN
00336           !
00337           PDEF(JJ,J1) = ZM * (ZKAV - PKAPPA(JJ,J1)) + ZDAV2
00338           !ZTMP(J1) = 0.5
00339           IF (PDEF(JJ,J1) < 0.0) PDEF(JJ,J1) = 0.0
00340           !
00341         ELSEIF ( PKAPPA(JJ,J1).GE.PKAPPAC(JJ) ) THEN
00342           !
00343           PDEF(JJ,J1) = 0.0
00344           !ZTMP(J1) = 1.
00345           !
00346         ELSEIF ( PKAPPA(JJ,J1).LE.(PKAPPAC(JJ) - ZDMAX(J1)/ZM) ) THEN
00347           !
00348           PDEF(JJ,J1) = ZDMAX(J1)
00349           !ZTMP(J1) = -1.0
00350           !
00351         ENDIF
00352         !
00353         ! nouveau contenu en eau total (m)
00354         ZSOMME = ZSOMME + ( XWSTOPT(JJ,J1)*XDTOPT(JJ,J1) - PDEF(JJ,J1) )
00355         !
00356       ELSE
00357         !
00358         PDEF(JJ,J1) = ZDMAX(J1)
00359         !
00360       ENDIF
00361       !
00362     ENDDO
00363     !
00364     ! variation du contenu en eau total
00365     DO J1=1,NNMC(JJ)
00366       !
00367       IF (PDEF(JJ,J1)<0.0) THEN
00368         WRITE(*,*) 'LAMBDA=',PKAPPA(JJ,J1),'LAMBDAC=',PKAPPAC(JJ)
00369       ENDIF
00370       !
00371     ENDDO
00372     !
00373     GTOPD(JJ)=.TRUE.
00374     !
00375   ELSE
00376     !
00377     !  'Pas de redistribution laterale'
00378     GTOPD(JJ)=.FALSE.
00379     !
00380     PKAPPA(JJ,:) = XUNDEF
00381     !  PDEF(JJ,:) = ZDMAX(:) - ZRW(:)
00382     PDEF(JJ,:) = ZDINI(:)
00383     PKAPPAC(JJ) = XUNDEF
00384     !
00385   ENDIF
00386   ! 
00387 ENDDO
00388 !
00389 IF (LHOOK) CALL DR_HOOK('TOPODYN_LAT',1,ZHOOK_HANDLE)
00390 !
00391 END SUBROUTINE TOPODYN_LAT
00392