SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/get_mesh_index_ign.F90
Go to the documentation of this file.
00001 !     ###############################################################
00002       SUBROUTINE GET_MESH_INDEX_IGN(KGRID_PAR,KL,PGRID_PAR,PLAT,PLON,KINDEX,KSSO,KISSOX,KISSOY)
00003 !     ###############################################################
00004 !
00005 !!**** *GET_MESH_INDEX_IGN* 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_IGN, ONLY : XXLIM, XYLIM, XX_MIN, XX_MAX, XY_MIN, &
00026                                        XY_MAX, XDX, XDY  
00027 USE MODD_POINT_OVERLAY
00028 USE MODE_GRIDTYPE_IGN
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(KIND=JPRB) :: ZHOOK_HANDLE
00062 !----------------------------------------------------------------------------
00063 !
00064 IF (LHOOK) CALL DR_HOOK('GET_MESH_INDEX_IGN',0,ZHOOK_HANDLE)
00065 IF (.NOT. ALLOCATED(XXLIM)) THEN
00066 !
00067 !*    1.     Uncode parameters of the grid
00068 !            -----------------------------
00069 !
00070   CALL GET_GRIDTYPE_IGN(PGRID_PAR,KLAMBERT=ILAMBERT,KL=IL)
00071 !
00072   ALLOCATE(ZX (IL))
00073   ALLOCATE(ZY (IL))
00074   ALLOCATE(XDX(IL))
00075   ALLOCATE(XDY(IL))
00076   ALLOCATE(XXLIM(IL))
00077   ALLOCATE(XYLIM(IL))
00078 !
00079   CALL GET_GRIDTYPE_IGN(PGRID_PAR,PX=ZX,PY=ZY,PDX=XDX,PDY=XDY)
00080 !
00081 !*    2.     Limits of grid meshes in x and y
00082 !            --------------------------------
00083 !
00084   XXLIM(:)=ZX(:)-XDX(:)/2.
00085   XYLIM(:)=ZY(:)-XDY(:)/2.
00086 
00087   XX_MIN = MINVAL(XXLIM)
00088   XX_MAX = MAXVAL(XXLIM+XDX)
00089   XY_MIN = MINVAL(XYLIM)
00090   XY_MAX = MAXVAL(XYLIM+XDY)
00091   DEALLOCATE(ZX )
00092   DEALLOCATE(ZY )
00093 END IF
00094 !
00095 !*    3.     Projection
00096 !            ----------
00097 !
00098 ALLOCATE(ZX (SIZE(PLAT)))
00099 ALLOCATE(ZY (SIZE(PLAT)))
00100 !
00101   CALL GET_GRIDTYPE_IGN(PGRID_PAR,KLAMBERT=ILAMBERT)
00102 !
00103 !       write (*,*),'APPEL  XY_IGN'
00104 !       print*,'LON LAT ENTREE : ',plon(1),plat(1)
00105   CALL XY_IGN(ILAMBERT,ZX,ZY,PLAT,PLON)
00106 !   write(*,*) '    X Y SORTIE : ', ZX(1),ZY(1)
00107 
00108 !
00109 !
00110 !
00111 !*    5.     Localisation of the data points on (x,y) grid
00112 !            ---------------------------------------------
00113 !
00114 KINDEX(:)=0.
00115 !
00116 DO JI=1,SIZE(PLON)
00117   IF (     ZX(JI)<XX_MIN .OR. ZX(JI)>XX_MAX        &
00118          .OR. ZY(JI)<XY_MIN .OR. ZY(JI)>XY_MAX ) THEN   
00119     KINDEX(JI) = 0
00120     IF (KSSO/=0) THEN
00121       KISSOX(JI) = 0
00122       KISSOY(JI) = 0
00123     END IF
00124     XNUM(JI)=0
00125     CYCLE
00126   END IF
00127 !
00128   IVAR=XNUM(JI)
00129 ! 
00130   IF (IVAR.NE.0) THEN
00131 
00132     !le point qu'on regarde est-il dans un point de grille du domaine          
00133     DO JL=IVAR,SIZE(XXLIM)
00134       IF( ZX(JI)> XXLIM(JL) .AND. ZX(JI) < XXLIM(JL)+XDX(JL)   & 
00135         .AND. ZY(JI) > XYLIM(JL) .AND. ZY(JI) < XYLIM(JL)+XDY(JL) ) THEN
00136         
00137         KINDEX(JI) = JL
00138         IVAR = JL+1
00139 
00140 !   write(*,'(A,2F8.4,2F11.2,A,I4,A1)'),            &
00141 !   'point ', PLAT(JI), PLON(JI),ZX(JI),ZY(JI),' index : ',KINDEX (JI),'='
00142 !
00143 !
00144 !*    6.     Localisation of the data points in the subgrid of this mesh
00145 !            -----------------------------------------------------------
00146 !
00147         IF (KSSO/=0) THEN
00148           KISSOX(JI) = 1 + INT( FLOAT(KSSO) *             &
00149                            (ZX(JI)-XXLIM(KINDEX(JI)))/XDX(KINDEX(JI)) )   
00150           KISSOY(JI) = 1 + INT( FLOAT(KSSO) *             &
00151                            (ZY(JI)-XYLIM(KINDEX(JI)))/XDY(KINDEX(JI)) )   
00152         END IF
00153         EXIT
00154       ENDIF
00155     ENDDO
00156 
00157     IF (IVAR.NE.XNUM(JI)) THEN 
00158       XNUM(JI)=IVAR
00159     ELSE
00160       XNUM(JI)=0
00161     ENDIF
00162     
00163   ENDIF
00164 
00165 END DO
00166 !
00167 !-------------------------------------------------------------------------------
00168 DEALLOCATE(ZX )
00169 DEALLOCATE(ZY )
00170 IF (LHOOK) CALL DR_HOOK('GET_MESH_INDEX_IGN',1,ZHOOK_HANDLE)
00171 !-------------------------------------------------------------------------------
00172 !
00173 END SUBROUTINE GET_MESH_INDEX_IGN