SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/pgd_field.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE PGD_FIELD(HPROGRAM,HFIELD,HAREA,HFILE,HFILETYPE,PUNIF,PFIELD,OPRESENT)
00003 !     ##############################################################
00004 !
00005 !!**** *PGD_FIELD* monitor for averaging and interpolations of ISBA physiographic fields
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 !!    09/2010 (E. Kourzeneva):   interpolation of the lake depth 
00033 !!                               is not allowed and not necessary
00034 !!
00035 !----------------------------------------------------------------------------
00036 !
00037 !*    0.     DECLARATION
00038 !            -----------
00039 !
00040 USE MODD_SURF_PAR,       ONLY : XUNDEF
00041 USE MODD_PGD_GRID,       ONLY : NL
00042 USE MODD_PGDWORK,        ONLY : XSUMVAL, NSIZE, CATYPE,      &
00043                                 NVALNBR, NVALCOUNT, XVALLIST, JPVALMAX
00044 USE MODD_SURF_ATM_n,     ONLY : XNATURE, XSEA, XTOWN, XWATER
00045 !
00046 USE MODI_GET_LUOUT
00047 USE MODI_TREAT_FIELD
00048 USE MODI_INTERPOL_FIELD
00049 USE MODI_PACK_SAME_RANK
00050 !
00051 !
00052 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00053 USE PARKIND1  ,ONLY : JPRB
00054 !
00055 USE MODI_ABOR1_SFX
00056 !
00057 USE MODI_GET_SURF_MASK_n
00058 !
00059 USE MODI_GET_TYPE_DIM_n
00060 !
00061 IMPLICIT NONE
00062 !
00063 !*    0.1    Declaration of arguments
00064 !            ------------------------
00065 !
00066  CHARACTER(LEN=6),  INTENT(IN) :: HPROGRAM  ! Type of program
00067  CHARACTER(LEN=*),  INTENT(IN) :: HFIELD    ! field name for prints
00068  CHARACTER(LEN=3),  INTENT(IN) :: HAREA     ! area where field is defined
00069 !                                          ! 'ALL' : everywhere
00070 !                                          ! 'NAT' : on nature
00071 !                                          ! 'TWN' : on town
00072 !                                          ! 'SEA' : on sea
00073 !                                          ! 'WAT' : on inland waters
00074  CHARACTER(LEN=28), INTENT(IN) :: HFILE     ! data file name
00075  CHARACTER(LEN=6),  INTENT(IN) :: HFILETYPE ! data file type
00076 REAL,              INTENT(IN) :: PUNIF     ! prescribed uniform value for field
00077 REAL, DIMENSION(:),INTENT(OUT):: PFIELD    ! physiographic field
00078 LOGICAL, OPTIONAL, INTENT(OUT) :: OPRESENT
00079 !
00080 !
00081 !*    0.2    Declaration of local variables
00082 !            ------------------------------
00083 !
00084 INTEGER                        :: ILU    ! expected physical size of full surface array
00085 INTEGER                        :: ILUOUT ! output listing logical unit
00086 INTEGER, DIMENSION(:), POINTER :: IMASK  ! mask for packing from complete field to nature field
00087 INTEGER                        :: IDIM   !
00088 
00089 !
00090  CHARACTER(LEN=20)   :: YFIELD
00091  CHARACTER(LEN=6)    :: YMASK
00092 INTEGER             :: INPTS     ! number of points used for interpolation
00093 REAL, DIMENSION(NL) :: ZFIELD    ! physiographic field on full grid
00094 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00095 !-------------------------------------------------------------------------------
00096 !
00097 !*    1.      Initializations
00098 !             ---------------
00099 !
00100 IF (LHOOK) CALL DR_HOOK('PGD_FIELD',0,ZHOOK_HANDLE)
00101 ZFIELD(:) = XUNDEF
00102 IF (PRESENT(OPRESENT)) OPRESENT=.TRUE.
00103 !-------------------------------------------------------------------------------
00104 !
00105 !*    2.      Output listing logical unit
00106 !             ---------------------------
00107 !
00108  CALL GET_LUOUT(HPROGRAM,ILUOUT)
00109 !
00110 !-------------------------------------------------------------------------------
00111 !
00112 !*    3.      Read from file
00113 !             --------------
00114 !
00115 IF (LEN_TRIM(HFILE)/=0) THEN
00116 !       
00117 !-------------------------------------------------------------------------------
00118 !
00119 !*    4.      Averages the field
00120 !             ------------------
00121 !
00122   ALLOCATE(NSIZE     (NL))
00123   ALLOCATE(XSUMVAL   (NL))
00124 !
00125   NSIZE    (:) = 0.
00126   XSUMVAL  (:) = 0.
00127   INPTS        = 3
00128 !
00129   IF (CATYPE=='MAJ') THEN
00130     ALLOCATE(NVALNBR  (NL))
00131     ALLOCATE(NVALCOUNT(NL,JPVALMAX))
00132     ALLOCATE(XVALLIST (NL,JPVALMAX))
00133     NVALNBR   = 0
00134     NVALCOUNT = 0
00135     XVALLIST  = XUNDEF
00136     INPTS     = 1
00137   END IF
00138 !
00139   YFIELD = '                    '
00140   YFIELD = HFIELD(1:MIN(LEN(HFIELD),20))
00141 !
00142   CALL TREAT_FIELD(HPROGRAM,'SURF  ',HFILETYPE,'A_MESH',HFILE,   &
00143                    YFIELD,ZFIELD,HAREA                           )  
00144 !
00145 !-------------------------------------------------------------------------------
00146 !
00147 !*    4.      Mask for the interpolations
00148 !             ---------------------------
00149 !
00150   SELECT CASE (HAREA)
00151     CASE ('LAN')
00152       WHERE ((XTOWN(:)+XNATURE(:))==0. .AND. NSIZE(:)==0 ) NSIZE(:) = -1
00153     CASE ('TWN')
00154       WHERE (XTOWN  (:)==0. .AND. NSIZE(:)==0 ) NSIZE(:) = -1
00155     CASE ('BLD')
00156       WHERE (XTOWN  (:)==0. .AND. NSIZE(:)==0 ) NSIZE(:) = -1              
00157     CASE ('NAT')
00158       WHERE (XNATURE(:)==0. .AND. NSIZE(:)==0 ) NSIZE(:) = -1
00159     CASE ('SEA')
00160       WHERE (XSEA   (:)==0. .AND. NSIZE(:)==0 ) NSIZE(:) = -1
00161     CASE ('WAT')
00162       WHERE (XWATER (:)==0. .AND. NSIZE(:)==0 ) NSIZE(:) = -1
00163   END SELECT
00164 !
00165 !-------------------------------------------------------------------------------
00166 !
00167 !*    5.      Interpolation if some points are not initialized (no data for these points)
00168 !             ------------------------------------------------
00169 !
00170   IF(HFIELD.NE."water depth") THEN
00171     IF (PUNIF/=XUNDEF) THEN
00172       CALL INTERPOL_FIELD(HPROGRAM,ILUOUT,NSIZE,ZFIELD(:),HFIELD,PDEF=PUNIF,KNPTS=INPTS)
00173     ELSE
00174       CALL INTERPOL_FIELD(HPROGRAM,ILUOUT,NSIZE,ZFIELD(:),HFIELD)
00175     END IF          
00176   END IF
00177 !
00178   DEALLOCATE(NSIZE    )
00179   DEALLOCATE(XSUMVAL  )
00180   IF (CATYPE=='MAJ') THEN
00181     DEALLOCATE(NVALNBR  )
00182     DEALLOCATE(NVALCOUNT)
00183     DEALLOCATE(XVALLIST )
00184   END IF
00185 !
00186 !-------------------------------------------------------------------------------
00187 !
00188 ELSEIF (PUNIF/=XUNDEF) THEN
00189 !
00190 !*    3.1     Use of the presribed field
00191 !             --------------------------
00192 !
00193   ZFIELD(:) = PUNIF
00194 !
00195 ELSE
00196 !
00197   IF (PRESENT(OPRESENT)) THEN
00198     OPRESENT=.FALSE.
00199     IF (LHOOK) CALL DR_HOOK('PGD_FIELD',1,ZHOOK_HANDLE)
00200     RETURN
00201   ENDIF
00202 !
00203   WRITE(ILUOUT,*) ' '
00204   WRITE(ILUOUT,*) '***********************************************************'
00205   WRITE(ILUOUT,*) '* Error in PGD field preparation of field : ', HFIELD
00206   WRITE(ILUOUT,*) '* There is no prescribed value and no input file          *'
00207   WRITE(ILUOUT,*) '***********************************************************'
00208   WRITE(ILUOUT,*) ' '
00209   CALL ABOR1_SFX('PGD_FIELD: NO PRESCRIBED VALUE NOR INPUT FILE FOR '//HFIELD)
00210 !
00211 END IF
00212 !-------------------------------------------------------------------------------
00213 !
00214 !*    6.      Mask for the field
00215 !             ------------------
00216 !
00217 SELECT CASE (HAREA)
00218   CASE ('LAN')
00219           YMASK = 'LAND  '
00220   CASE ('TWN')
00221           YMASK = 'TOWN  '
00222     CASE ('BLD')
00223           YMASK = 'TOWN '              
00224   CASE ('NAT')
00225           YMASK = 'NATURE'
00226   CASE ('SEA')
00227           YMASK = 'SEA   '
00228   CASE ('WAT')
00229           YMASK = 'WATER '
00230   CASE DEFAULT
00231           PFIELD(:) = ZFIELD(:)
00232           IF (LHOOK) CALL DR_HOOK('PGD_FIELD',1,ZHOOK_HANDLE)
00233           RETURN
00234 END SELECT
00235 
00236  CALL GET_TYPE_DIM_n(YMASK,IDIM)
00237 IF (IDIM/=SIZE(PFIELD)) THEN
00238    WRITE(ILUOUT,*)'Wrong dimension of MASK: ',IDIM,SIZE(PFIELD)
00239    CALL ABOR1_SFX('PGD_FIELD: WRONG DIMENSION OF MASK')
00240 ENDIF
00241 
00242 ALLOCATE(IMASK(IDIM))
00243 ILU=0
00244  CALL GET_SURF_MASK_n(YMASK,IDIM,IMASK,ILU,ILUOUT)
00245  CALL PACK_SAME_RANK(IMASK,ZFIELD(:),PFIELD(:))
00246 DEALLOCATE(IMASK)
00247 IF (LHOOK) CALL DR_HOOK('PGD_FIELD',1,ZHOOK_HANDLE)
00248 
00249 !
00250 !-------------------------------------------------------------------------------
00251 !
00252 END SUBROUTINE PGD_FIELD