SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/pgd_frac.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE PGD_FRAC(HPROGRAM,OECOCLIMAP)
00003 !     ##############################################################
00004 !
00005 !!**** *PGD_FRAC* monitor for averaging and interpolations of cover fractions
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !!
00010 !!    METHOD
00011 !!    ------
00012 !!   
00013 !
00014 !!    EXTERNAL
00015 !!    --------
00016 !!
00017 !!    IMPLICIT ARGUMENTS
00018 !!    ------------------
00019 !!
00020 !!    REFERENCE
00021 !!    ---------
00022 !!
00023 !!    AUTHOR
00024 !!    ------
00025 !!
00026 !!    V. Masson        Meteo-France
00027 !!
00028 !!    MODIFICATION
00029 !!    ------------
00030 !!
00031 !!    Original    10/12/97
00032 !!
00033 !!       Modified 08/12/05, P. Le Moigne: user defined fields
00034 !----------------------------------------------------------------------------
00035 !
00036 !*    0.     DECLARATION
00037 !            -----------
00038 !
00039 USE MODD_SURF_PAR,       ONLY : XUNDEF
00040 USE MODD_PGD_GRID,       ONLY : NL, CGRID
00041 USE MODD_DATA_COVER_PAR, ONLY : JPCOVER
00042 USE MODD_SURF_ATM_n,     ONLY : XNATURE, XSEA, XTOWN, XWATER,             &
00043                                   XCOVER, LCOVER,                         &
00044                                   NSIZE_NATURE, NSIZE_SEA,                &
00045                                   NSIZE_TOWN, NSIZE_WATER,NSIZE_FULL,     &
00046                                   NDIM_NATURE, NDIM_SEA,                  &
00047                                   NDIM_TOWN,NDIM_WATER  
00048 !
00049 USE MODD_PGDWORK,        ONLY : CATYPE
00050 !
00051 USE MODI_GET_LUOUT
00052 USE MODI_OPEN_NAMELIST
00053 USE MODI_CLOSE_NAMELIST
00054 USE MODI_PGD_FIELD
00055 USE MODI_SUM_ON_ALL_PROCS
00056 !
00057 USE MODE_POS_SURF
00058 !
00059 !
00060 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00061 USE PARKIND1  ,ONLY : JPRB
00062 !
00063 USE MODI_ABOR1_SFX
00064 !
00065 IMPLICIT NONE
00066 !
00067 !*    0.1    Declaration of arguments
00068 !            ------------------------
00069 !
00070  CHARACTER(LEN=6),    INTENT(IN)    :: HPROGRAM     ! Type of program
00071 LOGICAL,             INTENT(OUT)   :: OECOCLIMAP   ! F if fractions prescribed by user
00072 !                                                  ! T if fractions will be computed from ecoclimap
00073 !
00074 !*    0.2    Declaration of local variables
00075 !            ------------------------------
00076 !
00077 INTEGER               :: ILUOUT    ! output listing logical unit
00078 INTEGER               :: ILUNAM    ! namelist file  logical unit
00079 LOGICAL               :: GFOUND    ! true if namelist is found
00080 !
00081 INTEGER               :: JCOVER    ! loop counter on covers
00082 !
00083 REAL, DIMENSION(NL)   :: ZSUM      ! sum of 4 tiles fractions
00084 !
00085 !*    0.3    Declaration of namelists
00086 !            ------------------------
00087 !
00088 LOGICAL  :: LECOCLIMAP  ! F if ecoclimap is not used
00089 REAL     :: XUNIF_SEA   ! value of sea    fraction
00090 REAL     :: XUNIF_WATER ! value of water  fraction
00091 REAL     :: XUNIF_NATURE! value of nature fraction
00092 REAL     :: XUNIF_TOWN  ! value of town   fraction
00093 !
00094 ! name of files containing data
00095 !
00096  CHARACTER(LEN=28)     :: CFNAM_SEA    ! name of sea    file
00097  CHARACTER(LEN=28)     :: CFNAM_WATER  ! name of water  file
00098  CHARACTER(LEN=28)     :: CFNAM_NATURE ! name of nature file
00099  CHARACTER(LEN=28)     :: CFNAM_TOWN   ! name of town   file
00100 !
00101 ! type of files containing data
00102 !
00103  CHARACTER(LEN=6)      :: CFTYP_SEA    ! type of sea    file
00104  CHARACTER(LEN=6)      :: CFTYP_WATER  ! type of water  file
00105  CHARACTER(LEN=6)      :: CFTYP_NATURE ! type of nature file
00106  CHARACTER(LEN=6)      :: CFTYP_TOWN   ! type of town   file
00107 !
00108 INTEGER               :: ICOVER       ! 0 if cover is not present, >1 if present somewhere
00109 !                                     ! (even on another processor)
00110 !
00111 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00112 !
00113 !
00114 NAMELIST/NAM_FRAC/ LECOCLIMAP,                                         &
00115                      XUNIF_SEA, XUNIF_WATER, XUNIF_NATURE, XUNIF_TOWN, &
00116                      CFNAM_SEA, CFNAM_WATER, CFNAM_NATURE, CFNAM_TOWN, &
00117                      CFTYP_SEA, CFTYP_WATER, CFTYP_NATURE, CFTYP_TOWN  
00118 !-------------------------------------------------------------------------------
00119 !
00120 !*    1.      Initializations
00121 !             ---------------
00122 !
00123 IF (LHOOK) CALL DR_HOOK('PGD_FRAC',0,ZHOOK_HANDLE)
00124 XUNIF_SEA      = XUNDEF
00125 XUNIF_WATER    = XUNDEF
00126 XUNIF_NATURE   = XUNDEF
00127 XUNIF_TOWN     = XUNDEF
00128 LECOCLIMAP     = .TRUE.
00129 CFNAM_SEA   (:)= '                            '
00130 CFNAM_WATER (:)= '                            '
00131 CFNAM_NATURE(:)= '                            '
00132 CFNAM_TOWN  (:)= '                            '
00133 CFTYP_SEA   (:)= '      '
00134 CFTYP_WATER (:)= '      '
00135 CFTYP_NATURE(:)= '      '
00136 CFTYP_TOWN  (:)= '      '
00137 !
00138 OECOCLIMAP = .TRUE.
00139 !
00140 !-------------------------------------------------------------------------------
00141 !
00142 !*    2.      Input file for cover types
00143 !             --------------------------
00144 !
00145  CALL GET_LUOUT(HPROGRAM,ILUOUT)
00146  CALL OPEN_NAMELIST(HPROGRAM,ILUNAM)
00147 !
00148  CALL POSNAM(ILUNAM,'NAM_FRAC',GFOUND,ILUOUT)
00149 IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_FRAC)
00150 !
00151  CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM)
00152 !
00153 !-------------------------------------------------------------------------------
00154 !
00155 IF ((LEN_TRIM(CFNAM_SEA)/=0 .OR. XUNIF_SEA/=XUNDEF) .AND. (LEN_TRIM(CFNAM_WATER)/=0 .OR. XUNIF_WATER/=XUNDEF) .AND. &
00156     (LEN_TRIM(CFNAM_NATURE)/=0 .OR. XUNIF_NATURE/=XUNDEF) .AND. (LEN_TRIM(CFNAM_TOWN)/=0 .OR. XUNIF_TOWN/=XUNDEF)) THEN
00157 !
00158   ALLOCATE(XSEA   (NL))
00159   ALLOCATE(XWATER (NL))
00160   ALLOCATE(XNATURE(NL))
00161   ALLOCATE(XTOWN  (NL))
00162 !
00163 !*    3.      Uniform fractions are prescribed
00164 !             --------------------------------
00165 !
00166   IF (XUNIF_SEA/=XUNDEF .AND. XUNIF_WATER/=XUNDEF .AND. XUNIF_NATURE/=XUNDEF .AND.  XUNIF_TOWN/=XUNDEF) THEN
00167 !
00168 !*    3.1     Verification of the total input cover fractions
00169 !             -----------------------------------------------
00170 !
00171     IF (ABS(XUNIF_SEA+XUNIF_WATER+XUNIF_NATURE+XUNIF_TOWN-1.)>1.E-6) THEN
00172       WRITE(ILUOUT,*) ' '
00173       WRITE(ILUOUT,*) '*********************************************************'
00174       WRITE(ILUOUT,*) '* Error in fractions preparation                        *'
00175       WRITE(ILUOUT,*) '* The prescribed fractions do not fit                   *'
00176       WRITE(ILUOUT,*) '* The sum of all 4 fractions must be equal to 1 exactly *'
00177       WRITE(ILUOUT,*) '*********************************************************'
00178       WRITE(ILUOUT,*) ' '
00179       CALL ABOR1_SFX('PGD_FRAC: SUM OF ALL FRACTIONS MUST BE 1.')
00180 !
00181 !*    3.2     Use of the presribed cover fractions
00182 !             ------------------------------------
00183 !
00184     ELSE
00185 !
00186       XSEA    = XUNIF_SEA 
00187       XWATER  = XUNIF_WATER
00188       XNATURE = XUNIF_NATURE
00189       XTOWN   = XUNIF_TOWN
00190 
00191     END IF
00192 !
00193 !*    3.3     No data
00194 !             -------
00195 !
00196   ELSE
00197 
00198     CATYPE = 'ARI'
00199     IF (XUNIF_SEA==XUNDEF) THEN
00200       CALL PGD_FIELD(HPROGRAM,'XSEA: sea fraction      ','ALL', CFNAM_SEA   , &
00201                     CFTYP_SEA   , XUNIF_SEA   , XSEA(:)   )  
00202     ELSE                 
00203       XSEA(:) = XUNIF_SEA
00204     ENDIF
00205     IF (XUNIF_WATER==XUNDEF) THEN
00206       CALL PGD_FIELD(HPROGRAM,'XWATER: water fraction  ','ALL', CFNAM_WATER , &
00207                     CFTYP_WATER , XUNIF_WATER , XWATER(:) )  
00208     ELSE                    
00209       XWATER(:) = XUNIF_WATER
00210     ENDIF
00211     IF (XUNIF_NATURE==XUNDEF) THEN
00212       CALL PGD_FIELD(HPROGRAM,'XNATURE: nature fraction','ALL', CFNAM_NATURE, &
00213                     CFTYP_NATURE, XUNIF_NATURE, XNATURE(:))  
00214     ELSE                    
00215       XNATURE(:) = XUNIF_NATURE
00216     ENDIF
00217     IF (XUNIF_TOWN==XUNDEF) THEN
00218       CALL PGD_FIELD(HPROGRAM,'XTOWN: town fraction    ','ALL', CFNAM_TOWN  , &
00219                     CFTYP_TOWN  , XUNIF_TOWN  , XTOWN(:)  )  
00220     ELSE                    
00221       XTOWN(:) = XUNIF_TOWN
00222     ENDIF
00223   ENDIF
00224 
00225 ELSE
00226 !
00227 !*    4.      No prescription of fractions
00228 !             ----------------------------
00229 !
00230   IF (LHOOK) CALL DR_HOOK('PGD_FRAC',1,ZHOOK_HANDLE)
00231   RETURN
00232 !
00233 ENDIF
00234 !-------------------------------------------------------------------------------
00235 !         consistency check
00236 !         ------------------
00237 !
00238 ZSUM(:) = XSEA(:) + XNATURE(:) + XWATER(:) + XTOWN(:)
00239 
00240 XSEA(:)    = XSEA(:)    / ZSUM(:)
00241 XNATURE(:) = XNATURE(:) / ZSUM(:)
00242 XWATER(:)  = XWATER(:)  / ZSUM(:)
00243 XTOWN(:)   = XTOWN(:)   / ZSUM(:)
00244 !
00245 !-------------------------------------------------------------------------------
00246 
00247 WRITE(ILUOUT,*) ' '
00248 !-------------------------------------------------------------------------------
00249 !
00250 OECOCLIMAP = LECOCLIMAP
00251 !
00252 !*    5.      List of cover present
00253 !             ---------------------
00254 !
00255 IF (.NOT.LECOCLIMAP) THEN
00256 
00257   ALLOCATE(XCOVER (NL,JPCOVER))
00258 
00259   XCOVER(:,:) =0.
00260   XCOVER(:,1) = XSEA(:)
00261   XCOVER(:,2) = XWATER(:)
00262   XCOVER(:,4) = XNATURE(:)
00263   XCOVER(:,254) = XTOWN(:)
00264 !
00265  ALLOCATE(LCOVER(JPCOVER))
00266   LCOVER = .FALSE.
00267  DO JCOVER=1,JPCOVER
00268     ICOVER = SUM_ON_ALL_PROCS(HPROGRAM,CGRID,XCOVER(:,JCOVER)/=0. ,'COV')
00269     IF (ICOVER>0) LCOVER(JCOVER)=.TRUE. 
00270  END DO  
00271 !
00272 !
00273 !-------------------------------------------------------------------------------
00274 !
00275 !*    6.      Land - sea fractions
00276 !             --------------------
00277 !
00278   NSIZE_NATURE    = COUNT(XNATURE(:) > 0.0)
00279   NSIZE_WATER     = COUNT(XWATER (:) > 0.0)
00280   NSIZE_SEA       = COUNT(XSEA   (:) > 0.0)
00281   NSIZE_TOWN      = COUNT(XTOWN  (:) > 0.0)
00282   NSIZE_FULL      = NL
00283 !
00284   NDIM_NATURE    = SUM_ON_ALL_PROCS(HPROGRAM,CGRID,XNATURE(:) > 0.0, 'DIM')
00285   NDIM_WATER     = SUM_ON_ALL_PROCS(HPROGRAM,CGRID,XWATER (:) > 0.0, 'DIM')
00286   NDIM_SEA       = SUM_ON_ALL_PROCS(HPROGRAM,CGRID,XSEA   (:) > 0.0, 'DIM')
00287   NDIM_TOWN      = SUM_ON_ALL_PROCS(HPROGRAM,CGRID,XTOWN  (:) > 0.0, 'DIM')
00288 !  
00289 ENDIF
00290 IF (LHOOK) CALL DR_HOOK('PGD_FRAC',1,ZHOOK_HANDLE)
00291 !-------------------------------------------------------------------------------
00292 !
00293 END SUBROUTINE PGD_FRAC