SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/get_mesh_index_lonlatval.F90
Go to the documentation of this file.
00001 !     ###############################################################
00002       SUBROUTINE GET_MESH_INDEX_LONLATVAL(KGRID_PAR,KL,PGRID_PAR,PLAT,PLON,KINDEX,KSSO,KISSOX,KISSOY)
00003 !     ###############################################################
00004 !
00005 !!**** *GET_MESH_INDEX_LONLATVAL* get the grid mesh where point (lat,lon) is located
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !!
00010 !!    AUTHOR
00011 !!    ------
00012 !!
00013 !!    E. Martin         Meteo-France
00014 !!
00015 !!    MODIFICATION
00016 !!    ------------
00017 !!
00018 !!    Original    10/2007  
00019 !!
00020 !----------------------------------------------------------------------------
00021 !
00022 !*    0.     DECLARATION
00023 !            -----------
00024 !
00025 USE MODD_GET_MESH_INDEX_LONLATVAL, ONLY : XXLIM, XYLIM, XX_MIN, XX_MAX, XY_MIN, &
00026                                       XY_MAX, XDX, XDY  
00027 USE MODE_GRIDTYPE_LONLATVAL
00028 USE MODD_POINT_OVERLAY
00029 !
00030 !
00031 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00032 USE PARKIND1  ,ONLY : JPRB
00033 !
00034 IMPLICIT NONE
00035 !
00036 !*    0.1    Declaration of arguments
00037 !            ------------------------
00038 !
00039 INTEGER,                       INTENT(IN)    :: KGRID_PAR ! size of PGRID_PAR
00040 INTEGER,                       INTENT(IN)    :: KL        ! number of points
00041 REAL,    DIMENSION(KGRID_PAR), INTENT(IN)    :: PGRID_PAR ! grid parameters
00042 REAL,    DIMENSION(KL),        INTENT(IN)    :: PLAT      ! latitude of the point
00043 REAL,    DIMENSION(KL),        INTENT(IN)    :: PLON      ! longitude of the point
00044 INTEGER, DIMENSION(KL),        INTENT(OUT)   :: KINDEX    ! index of the grid mesh where the point is
00045 INTEGER,                       INTENT(IN)    :: KSSO      ! number of subgrid mesh in each direction
00046 INTEGER, DIMENSION(KL),        INTENT(OUT)   :: KISSOX    ! X index of the subgrid mesh
00047 INTEGER, DIMENSION(KL),        INTENT(OUT)   :: KISSOY    ! Y index of the subgrid mesh
00048 !
00049 !*    0.2    Declaration of other local variables
00050 !            ------------------------------------
00051 !
00052 INTEGER                           :: ILAMBERT ! Lambert type
00053 !
00054 REAL, DIMENSION(:), ALLOCATABLE   :: ZX       ! X Lambert   coordinate
00055 REAL, DIMENSION(:), ALLOCATABLE   :: ZY       ! Y Lambert   coordinate
00056 !
00057 INTEGER                           :: IVAR
00058 INTEGER                           :: IL       ! Grid dimension
00059 INTEGER                           :: JL       ! loop counter in lambert grid
00060 INTEGER                           :: JI       ! loop counter on input points
00061 REAL, DIMENSION(SIZE(PLON)) :: ZLON
00062 REAL :: XLON0
00063 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00064 !----------------------------------------------------------------------------
00065 !
00066 !
00067 IF (LHOOK) CALL DR_HOOK('GET_MESH_INDEX_LONLATVAL',0,ZHOOK_HANDLE)
00068 IF (.NOT. ALLOCATED(XXLIM)) THEN
00069 !
00070 !*    1.     Uncode parameters of the grid
00071 !            -----------------------------
00072 !
00073   CALL GET_GRIDTYPE_LONLATVAL(PGRID_PAR,KL=IL)
00074 !
00075   ALLOCATE(ZX (IL))
00076   ALLOCATE(ZY (IL))
00077   ALLOCATE(XDX(IL))
00078   ALLOCATE(XDY(IL))
00079   ALLOCATE(XXLIM(IL))
00080   ALLOCATE(XYLIM(IL))
00081 !
00082   CALL GET_GRIDTYPE_LONLATVAL(PGRID_PAR,PX=ZX,PY=ZY,PDX=XDX,PDY=XDY)
00083 !
00084 !*    2.     Limits of grid meshes in x and y
00085 !            --------------------------------
00086 !
00087   XXLIM(:)=ZX(:)-XDX(:)/2.
00088   XYLIM(:)=ZY(:)-XDY(:)/2.
00089 
00090   XX_MIN = MINVAL(XXLIM)
00091   XX_MAX = MAXVAL(XXLIM+XDX)
00092   XY_MIN = MINVAL(XYLIM)
00093   XY_MAX = MAXVAL(XYLIM+XDY)
00094   DEALLOCATE(ZX )
00095   DEALLOCATE(ZY )
00096   
00097 
00098 END IF
00099 !
00100 XLON0 = 0.5*(XX_MIN+XX_MAX)
00101 !
00102 !*    3.     Projection
00103 !            ----------
00104 !
00105 ALLOCATE(ZX (SIZE(PLAT)))
00106 ALLOCATE(ZY (SIZE(PLAT)))
00107 !
00108   CALL GET_GRIDTYPE_LONLATVAL(PGRID_PAR)
00109 !
00110   ZLON(:) = PLON(:)+NINT((XLON0-PLON(:))/360.)*360.
00111 !
00112 !*    5.     Localisation of the data points on (x,y) grid
00113 !            ---------------------------------------------
00114 !
00115 KINDEX(:)=0.
00116 !
00117 DO JI=1,SIZE(PLON)
00118 
00119   IF (     ZLON(JI)<XX_MIN .OR. ZLON(JI)>XX_MAX        &
00120         .OR. PLAT(JI)<XY_MIN .OR. PLAT(JI)>XY_MAX ) THEN  
00121      KINDEX(JI) = 0
00122     IF (KSSO/=0) THEN
00123       KISSOX(JI) = 0
00124       KISSOY(JI) = 0
00125     END IF
00126     XNUM(JI)=0
00127     CYCLE
00128   END IF
00129 !
00130   IVAR=XNUM(JI)
00131 !
00132   IF (IVAR.NE.0) THEN
00133           
00134     DO JL=IVAR,SIZE(XXLIM)
00135       IF( ZLON(JI)> XXLIM(JL) .AND. ZLON(JI) < XXLIM(JL)+XDX(JL)   &
00136        .AND. PLAT(JI) > XYLIM(JL) .AND. PLAT(JI) < XYLIM(JL)+XDY(JL) ) THEN  
00137 !
00138         KINDEX(JI) = JL
00139         IVAR = JL+1
00140 !
00141 !*    6.     Localisation of the data points in the subgrid of this mesh
00142 !            -----------------------------------------------------------
00143 !
00144         IF (KSSO/=0) THEN
00145           KISSOX(JI) = 1 + INT( FLOAT(KSSO) *             &
00146                            (ZLON(JI)-XXLIM(KINDEX(JI)))/XDX(KINDEX(JI)) )  
00147           KISSOY(JI) = 1 + INT( FLOAT(KSSO) *             &
00148                            (PLAT(JI)-XYLIM(KINDEX(JI)))/XDY(KINDEX(JI)) )  
00149         END IF
00150         EXIT
00151       ENDIF
00152     ENDDO
00153 
00154     IF (IVAR.NE.XNUM(JI)) THEN
00155       XNUM(JI)=IVAR
00156     ELSE
00157       XNUM(JI)=0
00158     ENDIF
00159  
00160   ENDIF 
00161     
00162 END DO
00163 !
00164 !-------------------------------------------------------------------------------
00165 DEALLOCATE(ZX )
00166 DEALLOCATE(ZY )
00167 IF (LHOOK) CALL DR_HOOK('GET_MESH_INDEX_LONLATVAL',1,ZHOOK_HANDLE)
00168 !-------------------------------------------------------------------------------
00169 !
00170 END SUBROUTINE GET_MESH_INDEX_LONLATVAL