SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/TOPD/recharge_surf_topd.F90
Go to the documentation of this file.
00001 !-----------------------------------------------------------
00002 !     #######################
00003       SUBROUTINE RECHARGE_SURF_TOPD(PHI,PHT,KI)
00004 !     #######################
00005 !
00006 !!****  *RECHARGE_SURF_TOPD*  
00007 !!
00008 !!    PURPOSE
00009 !!    -------
00010 !
00011 !     
00012 !         
00013 !     
00014 !!**  METHOD
00015 !!    ------
00016 !
00017 !!    EXTERNAL
00018 !!    --------
00019 !!
00020 !!    none
00021 !!
00022 !!    IMPLICIT ARGUMENTS
00023 !!    ------------------ 
00024 !!
00025 !!      
00026 !!    REFERENCE
00027 !!    ---------
00028 !!      
00029 !!    AUTHOR
00030 !!    ------
00031 !!
00032 !!      K. Chancibault  * LTHE / Meteo-France *
00033 !!
00034 !!    MODIFICATIONS
00035 !!    -------------
00036 !!
00037 !!      Original   12/2003
00038 !! 
00039 !!    WARNING
00040 !!    ----------------
00041 !!     on considère que le seuil pour les deficits reste le niveau Wfc
00042 !-------------------------------------------------------------------------------
00043 !
00044 !*       0.     DECLARATIONS
00045 !               ------------
00046 USE MODD_COUPLING_TOPD, ONLY: NMASKI, XWFCTOPT, XDMAXFC, XWTOPT,&
00047                                 XDTOPT, XWSTOPT, NNPIX
00048 USE MODD_TOPODYN,       ONLY: NNCAT, XDMAXT
00049 !
00050 USE MODD_SURF_PAR,        ONLY: XUNDEF,NUNDEF
00051 !
00052 USE MODI_ABOR1_SFX
00053 !
00054 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00055 USE PARKIND1  ,ONLY : JPRB
00056 !
00057 IMPLICIT NONE
00058 !
00059 !*      0.1    declarations of arguments
00060 !
00061 !
00062 INTEGER, INTENT(IN) :: KI    ! Grid dimensions
00063 REAL, DIMENSION(:), INTENT(INOUT)   :: PHI   ! water content variation since last time step from ISBA (m)
00064 REAL, DIMENSION(:,:), INTENT(OUT)   :: PHT   ! water content variation to provide to TOPODYN to be distributed (m) 
00065 !
00066 !*      0.2    declarations of local variables
00067 !
00068 !
00069 LOGICAL, DIMENSION(NNCAT,SIZE(NMASKI,3)) :: GTEST
00070 INTEGER            :: J1,J2,J3,J4     ! loop control 
00071 INTEGER            :: INBSAT, INBALL
00072 !
00073 REAL                           :: ZREST            ! m
00074 REAL                           :: ZWNEW            ! m3/m3
00075 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00076 !-------------------------------------------------------------------------------
00077 IF (LHOOK) CALL DR_HOOK('RECHARGE_SURF_TOPD',0,ZHOOK_HANDLE)
00078 !
00079 !*       0.     Initialization:
00080 !               ---------------
00081 !
00082 !*       1.     ISBA => TOPODYN-LAT
00083 !               -------------------
00084 !
00085 PHT(:,:)=0.
00086 !
00087 DO J3 = 1,KI
00088   !
00089   !The water content is lower than the previous one : this case is dealed with first to fasten the computation time.
00090   IF (PHI(J3) <= 0.0) THEN
00091     !
00092     DO J1 = 1,NNCAT
00093       !
00094       J4 = 1
00095       J2 = NMASKI(J3,J1,J4)
00096       !
00097       DO WHILE (J2 /= NUNDEF .AND. J4<=SIZE(NMASKI,3) )
00098         !
00099         IF ( XWFCTOPT(J1,J2) /= XUNDEF ) THEN
00100           !
00101           ZWNEW = XWTOPT(J1,J2) + PHI(J3) / XDTOPT(J1,J2)
00102           !
00103           IF ( ZWNEW >= XWFCTOPT(J1,J2) ) THEN
00104             !
00105             ! on reste au-dessus de la capacite au champ, malgre l'assechement
00106             XDMAXT(J1,J2) = XDMAXFC(J1,J2) 
00107             PHT(J1,J2) = (ZWNEW - XWFCTOPT(J1,J2)) * XDTOPT(J1,J2)
00108             !
00109           ELSE ! on passe au-dessous de la capacite au champ
00110             !
00111             XDMAXT(J1,J2) = (XWSTOPT(J1,J2) - ZWNEW) * XDTOPT(J1,J2)
00112             PHT(J1,J2) = 0.0
00113             !
00114           ENDIF
00115           !
00116           J4 = J4+1
00117           IF ( J4<=SIZE(NMASKI,3) ) J2 = NMASKI(J3,J1,J4)
00118           !
00119         ELSE ! pixel non défini dans Isba
00120           !
00121           XDMAXT(J1,J2) = 0.0
00122           PHT = 0.0
00123           !
00124         ENDIF
00125         !
00126       ENDDO
00127       !
00128     ENDDO
00129     !
00130   ELSE ! recharge > 0.0
00131     !
00132     ZREST=1.
00133     GTEST(:,:)=.TRUE.
00134     !
00135     DO WHILE ( ZREST>0.0 )
00136       !
00137       ZREST=0.0
00138       !
00139       DO J1=1,NNCAT
00140         !
00141         J4=1
00142         J2=NMASKI(J3,J1,J4)
00143         !
00144         DO WHILE ( J2/=NUNDEF .AND. J4<=SIZE(NMASKI,3) )
00145           !
00146           IF ( GTEST(J1,J4) .AND. XWFCTOPT(J1,J2)/=XUNDEF ) THEN
00147             !
00148             ZWNEW = XWTOPT(J1,J2) + PHI(J3) / XDTOPT(J1,J2)
00149             !
00150             IF ( XWTOPT(J1,J2) == XWSTOPT(J1,J2) ) THEN ! pixel déjà saturé
00151               !
00152               XDMAXT(J1,J2) = 0.0
00153               PHT(J1,J2) = 0.0
00154               ZREST = ZREST + PHI(J3)
00155               GTEST(J1,J4) = .FALSE.
00156               !
00157             ELSE IF ( ( XWSTOPT(J1,J2) - XWTOPT(J1,J2) ) * XDTOPT(J1,J2) <= PHI(J3) ) THEN
00158               !
00159               ! pixel va se saturer
00160               XDMAXT(J1,J2) = XDMAXFC(J1,J2)
00161               PHT(J1,J2) = ( XWSTOPT(J1,J2) - XWFCTOPT(J1,J2) ) * XDTOPT(J1,J2)
00162               ZREST = ZREST + PHI(J3) - PHT(J1,J2)
00163               GTEST(J1,J4)=.FALSE.
00164               !
00165             ELSE IF ( XWTOPT(J1,J2) < XWFCTOPT(J1,J2) ) THEN 
00166               !
00167               ! en dessous de la capacité au champ avant d'ajouter la recharge
00168               IF ( (XWTOPT(J1,J2) + PHI(J3)/XDTOPT(J1,J2)) <= XWFCTOPT(J1,J2) ) THEN 
00169                 !
00170                 ! en dessous de la capacité au champ avec la recharge 
00171                 XDMAXT(J1,J2) = ( XWSTOPT(J1,J2) - ZWNEW ) * XDTOPT(J1,J2)
00172                 PHT(J1,J2) = 0.0
00173                 !
00174               ELSE ! au-dessus de la capacité au champ avec la recharge
00175                 !
00176                 XDMAXT(J1,J2) = XDMAXFC(J1,J2)
00177                 PHT(J1,J2) = ( ZWNEW - XWFCTOPT(J1,J2) ) * XDTOPT(J1,J2)
00178                 !
00179               ENDIF
00180               !
00181             ELSE ! au-dessus de la capacité au champ avant d'ajouter la recharge
00182               !
00183               XDMAXT(J1,J2) = XDMAXFC(J1,J2)
00184               PHT(J1,J2) = ( ZWNEW - XWFCTOPT(J1,J2) ) * XDTOPT(J1,J2)
00185               !
00186             ENDIF
00187             !
00188           ELSE IF ( XWFCTOPT(J1,J2)==XUNDEF ) THEN! pixel non défini dans Isba
00189             !
00190             XDMAXT(J1,J2) = 0.0
00191             PHT = 0.0
00192             !
00193           ENDIF
00194           !
00195           J4 = J4+1
00196           IF ( J4<=SIZE(NMASKI,3) ) J2 = NMASKI(J3,J1,J4)
00197           !
00198         ENDDO
00199         !
00200       ENDDO
00201       !
00202       IF ( ZREST/=0.0 ) THEN
00203         !
00204         INBSAT=COUNT(.NOT.GTEST) !nb de pixels saturés avec ou sans la recharge
00205         !
00206         IF ( INBSAT == NNPIX(J3) ) THEN
00207           !
00208           IF (NNPIX(J3) > 400 ) THEN
00209             WRITE(*,*) 'MAILLE NUM=',J3, 'nb pix tot=',NNPIX(J3)
00210             CALL ABOR1_SFX("RECHARGE_SURF_TOPD: TOO MANY PIXELS SATURATED ")
00211           ELSE
00212             ZREST=0.0
00213           ENDIF
00214           !
00215         ELSE
00216           !
00217           PHI(J3) = PHI(J3) + ( ZREST / (NNPIX(J3) - INBSAT) ) ! nouvelle recharge à distribuer
00218           !
00219         ENDIF
00220       ENDIF
00221       !
00222     ENDDO
00223     !
00224   ENDIF
00225   !
00226 ENDDO
00227 !
00228 IF (LHOOK) CALL DR_HOOK('RECHARGE_SURF_TOPD',1,ZHOOK_HANDLE)
00229 !
00230 END SUBROUTINE RECHARGE_SURF_TOPD