SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/TRIP/flood_update.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE FLOOD_UPDATE (PTAB_F,PTAB_H,PTAB_VF,PAREA,PFLOOD_STO, &
00003                                  PHFLOOD,PFFLOOD,PFLOOD_LEN,PWFLOOD      )  
00004 !     ##########################################################################
00005 !
00006 !!****  *FLOOD_UPDATE*  
00007 !!
00008 !!    PURPOSE
00009 !!    -------
00010 !
00011 !     Compute HFLOOD, FFLOOD, LFLOOD, WFLOOD.
00012 !     
00013 !!**  METHOD
00014 !!    ------
00015 !
00016 !     Direct calculation
00017 !
00018 !!    EXTERNAL
00019 !!    --------
00020 !
00021 !     None
00022 !!
00023 !!    IMPLICIT ARGUMENTS
00024 !!    ------------------
00025 !!
00026 !!      
00027 !!    REFERENCE
00028 !!    ---------
00029 !!      
00030 !!    AUTHOR
00031 !!    ------
00032 !!      B. Decharme     
00033 !!
00034 !!    MODIFICATIONS
00035 !!    -------------
00036 !!      Original    01/11/06 
00037 !-------------------------------------------------------------------------------
00038 !
00039 !*       0.     DECLARATIONS
00040 !               ------------
00041 !
00042 USE MODD_TRIP_PAR, ONLY : XTRIP_UNDEF, XRHOLW_T
00043 USE MODD_TRIP_n,   ONLY : XRATMED
00044 !
00045 !
00046 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00047 USE PARKIND1  ,ONLY : JPRB
00048 !
00049 IMPLICIT NONE
00050 !
00051 !*      0.1    declarations of arguments
00052 !
00053 REAL,DIMENSION(:), INTENT(IN)  :: PTAB_F  ! Flood fraction array
00054 REAL,DIMENSION(:), INTENT(IN)  :: PTAB_H  ! Topo height array
00055 REAL,DIMENSION(:), INTENT(IN)  :: PTAB_VF ! Flood volume array
00056 REAL,              INTENT(IN)  :: PAREA   ! grid area                 [mē]
00057 REAL,              INTENT(IN)  :: PFLOOD_STO ! Floodplain water mass  [kg]
00058 !
00059 REAL,              INTENT(OUT) :: PHFLOOD ! Floodplain fraction        [-]
00060 REAL,              INTENT(OUT) :: PFFLOOD    ! Floodplain water depth  [m]
00061 REAL,              INTENT(OUT) :: PFLOOD_LEN ! Floodplain lenght       [m]
00062 REAL,              INTENT(OUT) :: PWFLOOD    ! Floodplain width        [m]
00063 !
00064 !*      0.2    declarations of local variables
00065 !
00066 REAL,    DIMENSION(:), ALLOCATABLE :: ZCOMP
00067 !
00068 REAL    :: ZF_UP, ZF_DOWN, ZV_UP, ZV_DOWN, ZH_UP, ZH_DOWN, ZSLOPE
00069 !
00070 INTEGER, DIMENSION(:), ALLOCATABLE  ::IUP, IDOWN
00071 !
00072 INTEGER :: I, IPAS
00073 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00074 !
00075 !-------------------------------------------------------------------------------
00076 ! Initialize and allocate local variable
00077 !-------------------------------------------------------------------------------
00078 !
00079 IF (LHOOK) CALL DR_HOOK('FLOOD_UPDATE',0,ZHOOK_HANDLE)
00080 PHFLOOD    = 0.0
00081 PFFLOOD    = 0.0
00082 PWFLOOD    = 0.0
00083 PFLOOD_LEN = 0.0
00084 !
00085 IF(PFLOOD_STO<=0 .AND. LHOOK) CALL DR_HOOK('FLOOD_UPDATE',1,ZHOOK_HANDLE)
00086 IF(PFLOOD_STO<=0)RETURN
00087 !
00088 IPAS=SIZE(PTAB_VF(:))
00089 !
00090 ALLOCATE(ZCOMP(IPAS))
00091 ALLOCATE(IUP  (1))
00092 ALLOCATE(IDOWN(1))
00093 !
00094 !-------------------------------------------------------------------------------
00095 !compare arrays
00096 !
00097 ZCOMP(:) = PTAB_VF(:)-PFLOOD_STO
00098 !
00099 !-------------------------------------------------------------------------------
00100 !calculate array index
00101 !
00102 IF(ALL(ZCOMP(:)<0.0))THEN
00103    IUP  (1) = IPAS
00104    IDOWN(1) = IPAS
00105 ELSE
00106    IUP  (:) = MINLOC(ZCOMP(:),ZCOMP(:)>=0.0)
00107    IDOWN(:) = MAXLOC(ZCOMP(:),ZCOMP(:)<=0.0)
00108 ENDIF
00109 !
00110 !-------------------------------------------------------------------------------
00111 !new born
00112 !
00113 ZF_UP   = PTAB_F (IUP  (1))
00114 ZF_DOWN = PTAB_F (IDOWN(1))
00115 ZV_UP   = PTAB_VF(IUP  (1))
00116 ZV_DOWN = PTAB_VF(IDOWN(1))
00117 ZH_UP   = PTAB_H (IUP  (1))
00118 ZH_DOWN = PTAB_H (IDOWN(1))
00119 !
00120 !-------------------------------------------------------------------------------
00121 !Calculate new Fflood
00122 !          
00123 ZSLOPE = 0.0
00124 IF(IUP(1)/=IDOWN(1)) ZSLOPE = (ZF_UP-ZF_DOWN)/(ZV_UP-ZV_DOWN)
00125 !          
00126 PFFLOOD = ZF_DOWN + (PFLOOD_STO-ZV_DOWN) * ZSLOPE
00127 !
00128 !-------------------------------------------------------------------------------
00129 !Calculate new Hflood
00130 !
00131 ZSLOPE = 0.0
00132 IF(IUP(1)/=IDOWN(1)) ZSLOPE = (ZH_UP-ZH_DOWN)/(ZV_UP-ZV_DOWN)
00133 !          
00134 PHFLOOD = ZH_DOWN + (PFLOOD_STO-ZV_DOWN) * ZSLOPE
00135 !
00136 !-------------------------------------------------------------------------------
00137 !Calculate special case
00138 !
00139 IF(PFFLOOD>=1.0)THEN
00140    PFFLOOD=1.0
00141    PHFLOOD= ZH_DOWN + (PFLOOD_STO-ZV_DOWN)/(XRHOLW_T*PAREA)
00142 ENDIF
00143 !
00144 !-------------------------------------------------------------------------------
00145 !Calculate new Wflood, Lflood
00146 !
00147 PFLOOD_LEN = XRATMED*SQRT(PFFLOOD*PAREA)
00148 PWFLOOD    = PAREA*PFFLOOD/PFLOOD_LEN
00149 !
00150 !-------------------------------------------------------------------------------
00151 ! Deallocate local variable
00152 !-------------------------------------------------------------------------------
00153 !
00154 DEALLOCATE(ZCOMP)
00155 DEALLOCATE(IUP  )
00156 DEALLOCATE(IDOWN)
00157 IF (LHOOK) CALL DR_HOOK('FLOOD_UPDATE',1,ZHOOK_HANDLE)
00158 !
00159 !-------------------------------------------------------------------------------
00160 END SUBROUTINE FLOOD_UPDATE