SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/ini_var_from_patch.F90
Go to the documentation of this file.
00001       SUBROUTINE INI_VAR_FROM_PATCH(HPROGRAM,KLUOUT,HNAME,PFIELD,KPTS,PDEF)
00002 !!
00003 !!    PURPOSE
00004 !!    -------
00005 !!
00006 !!      (1) KPTS=n  interpol field with n pts
00007 !!      (2) KPTS=0  conserve cells mass  
00008 !!   Case 2 : simple extrapolation based on the inside cell informations.
00009 !!             this is donne before conserving cell or global mass
00010 !!
00011 !!    METHOD
00012 !!    ------ 
00013 !!
00014 !!    EXTERNAL
00015 !!    --------
00016 !!
00017 !!    IMPLICIT ARGUMENTS
00018 !!    ------------------
00019 !!
00020 !!    REFERENCE
00021 !!    ---------
00022 !!
00023 !!    AUTHOR
00024 !!    ------
00025 !!
00026 !!    R. Alkama        Meteo-France
00027 !!
00028 !!    MODIFICATION
00029 !!    ------------
00030 !!    Original    12/2010
00031 !!
00032 !----------------------------------------------------------------------------
00033 !!*    0.     DECLARATION
00034 !            -----------
00035 !
00036 USE MODD_SURF_PAR,        ONLY : XUNDEF
00037 USE MODD_SURF_ATM_n,      ONLY : NSIZE_FULL
00038 USE MODD_ISBA_n,          ONLY : XPATCH_OLD, XPATCH, XLAI
00039 !
00040 USE MODI_GET_SURF_MASK_n
00041 USE MODI_INTERPOL_FIELD
00042 USE MODI_UNPACK_SAME_RANK
00043 USE MODI_PACK_SAME_RANK
00044 !
00045 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00046 USE PARKIND1  ,ONLY : JPRB
00047 !
00048 IMPLICIT NONE
00049 !
00050 !*    0.1    Declaration of arguments
00051 !            ------------------------
00052 !
00053  CHARACTER(LEN=6),             INTENT(IN)    :: HPROGRAM  ! host model
00054 INTEGER,                      INTENT(IN   ) :: KLUOUT
00055 INTEGER,                      INTENT(IN   ) :: KPTS
00056  CHARACTER(LEN=*),             INTENT(IN   ) :: HNAME
00057 REAL, DIMENSION(:,:),         INTENT(INOUT) :: PFIELD
00058 !
00059 REAL, DIMENSION(:  ), OPTIONAL, INTENT(IN) :: PDEF 
00060 !
00061 !*    0.2    Declaration of local variables
00062 !            ------------------------------
00063 !
00064 LOGICAL, DIMENSION(SIZE(XLAI,1),SIZE(XLAI,2)) :: GVEG
00065 REAL,    DIMENSION(SIZE(PFIELD,1)) :: ZFIELD1_TOT, ZFIELD2_TOT
00066 INTEGER, DIMENSION(SIZE(PFIELD,1)) :: IMASK  ! mask for packing from complete field to nature field
00067 INTEGER, DIMENSION(SIZE(PFIELD,1)) :: NSIZE
00068 INTEGER, DIMENSION(NSIZE_FULL)     :: NSIZE_TOT
00069 REAL,    DIMENSION(NSIZE_FULL)     :: ZFIELD_TOT
00070 INTEGER                            :: INI, IPATCH, IFULL, INPTS
00071 INTEGER                            :: JPATCH  ! loop counter on patch
00072 REAL                               :: ZRATIO_TOT
00073 !
00074 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00075 !
00076 !-------------------------------------------------------------------------------
00077 ! (1) & (2) INTERPOL FILED
00078 !-------------------------
00079 !
00080 IF (LHOOK) CALL DR_HOOK('INI_VAR_FROM_PATCH',0,ZHOOK_HANDLE)
00081 !
00082 INI=SIZE(PFIELD,1)
00083 IPATCH=SIZE(PFIELD,2)
00084 !
00085 IF (KPTS>0)THEN
00086   !
00087   CALL GET_SURF_MASK_n('NATURE',INI,IMASK,NSIZE_FULL,KLUOUT)
00088   !
00089   DO JPATCH=1,IPATCH
00090     NSIZE(:)=0
00091     WHERE (PFIELD(:,JPATCH).NE.XUNDEF) NSIZE(:)=1
00092     WHERE (XPATCH(:,JPATCH)==0.) NSIZE(:)=-1
00093     CALL UNPACK_SAME_RANK(IMASK,NSIZE,NSIZE_TOT,-1)
00094     CALL UNPACK_SAME_RANK(IMASK,PFIELD(:,JPATCH),ZFIELD_TOT)
00095     IF(PRESENT(PDEF))THEN
00096       CALL INTERPOL_FIELD(HPROGRAM,KLUOUT,NSIZE_TOT,ZFIELD_TOT,HNAME,PDEF=PDEF(JPATCH),KNPTS=KPTS)
00097     ELSE
00098       CALL INTERPOL_FIELD(HPROGRAM,KLUOUT,NSIZE_TOT,ZFIELD_TOT,HNAME,KNPTS=KPTS)
00099     ENDIF
00100     CALL PACK_SAME_RANK(IMASK,ZFIELD_TOT,PFIELD(:,JPATCH))  
00101   ENDDO
00102   !
00103 ELSE
00104 !
00105 !-------------------------------------------------------------------------------
00106 ! (3) Cell mass conservative + simple interpolation based on global cell
00107 !     informations
00108 !----------------------------
00109 !                 
00110   !
00111   ZFIELD1_TOT(:)=0.
00112   ZFIELD2_TOT(:)=0.
00113   !
00114   GVEG(:,:)=.TRUE.
00115   !
00116   IF (TRIM(HNAME)=='WR')THEN
00117     !no interception over soil(1), roc(2) and glaciers(3)
00118     DO JPATCH=1,IPATCH
00119       WHERE(XPATCH(:,JPATCH) /=0. .AND. XPATCH_OLD(:,JPATCH) ==0..AND.XLAI(:,JPATCH)==0.)
00120           PFIELD(:,JPATCH) = 0.  
00121           GVEG  (:,JPATCH) = .FALSE.
00122       ENDWHERE
00123     END DO
00124   END IF
00125   !
00126   !quantity of water before restart in each grid point
00127   DO JPATCH=1,IPATCH 
00128     ZFIELD1_TOT(:)=ZFIELD1_TOT(:)+ XPATCH_OLD(:,JPATCH)*PFIELD(:,JPATCH)
00129   END DO
00130   !
00131   DO JPATCH=1,IPATCH
00132     !if a patch appears in a grid point, it takes the quantity of water in the
00133     !whole grid point before
00134     WHERE(XPATCH(:,JPATCH) /=0. .AND. XPATCH_OLD(:,JPATCH)==0. .AND. GVEG  (:,JPATCH))
00135           PFIELD(:,JPATCH)=ZFIELD1_TOT(:)
00136     ENDWHERE
00137     !quantity of water after restart and landuse in each grid point 
00138     ZFIELD2_TOT(:)=ZFIELD2_TOT(:)+ XPATCH(:,JPATCH)*PFIELD(:,JPATCH)           
00139   END DO
00140   !
00141   ! Conserve cell mass if not WG and WGI
00142   ! If WG or WGI conserve global mass via CONSERV_GLOBAL_MASS routine
00143   !    is recomanded 
00144   !
00145   IF (TRIM(HNAME)/='WG' .AND. TRIM(HNAME)/='WGI') THEN
00146     DO JPATCH=1,IPATCH
00147       WHERE(ZFIELD2_TOT(:) > 1.E-12)
00148         PFIELD(:,JPATCH)=(ZFIELD1_TOT(:)/ZFIELD2_TOT(:))*PFIELD(:,JPATCH)
00149       ENDWHERE
00150     END DO
00151   ENDIF
00152   !
00153   WHERE(XPATCH(:,:) ==0.)PFIELD(:,:)=XUNDEF
00154   !
00155 ENDIF
00156 !
00157 !-------------------------------------------------------------------------------
00158 !
00159 IF (LHOOK) CALL DR_HOOK('INI_VAR_FROM_PATCH',1,ZHOOK_HANDLE)
00160 !
00161 !-------------------------------------------------------------------------------
00162 !
00163 END SUBROUTINE INI_VAR_FROM_PATCH