SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/get_mesh_index_conf_proj.F90
Go to the documentation of this file.
00001 !     ###############################################################
00002       SUBROUTINE GET_MESH_INDEX_CONF_PROJ(KGRID_PAR,KL,PGRID_PAR,PLAT,PLON,KINDEX,KSSO,KISSOX,KISSOY)
00003 !     ###############################################################
00004 !
00005 !!**** *GET_MESH_INDEX_CONF_PROJ* get the grid mesh where point (lat,lon) is located
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !!
00010 !!    AUTHOR
00011 !!    ------
00012 !!
00013 !!    V. Masson         Meteo-France
00014 !!
00015 !!    MODIFICATION
00016 !!    ------------
00017 !!
00018 !!    Original    12/09/95
00019 !!    J.Escobar  22/10/2011 : reintroduce optimisation for JI/JJ number of lines computation
00020 !!
00021 !----------------------------------------------------------------------------
00022 !
00023 !*    0.     DECLARATION
00024 !            -----------
00025 !
00026 USE MODD_GET_MESH_INDEX_CONF_PROJ, ONLY : XLAT0, XLON0, XRPK, XBETA,    &
00027                                             XLATOR, XLONOR, NIMAX, NJMAX, &
00028                                             XXLIM, XYLIM  
00029 USE MODE_GRIDTYPE_CONF_PROJ
00030 !
00031 !
00032 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00033 USE PARKIND1  ,ONLY : JPRB
00034 !
00035 IMPLICIT NONE
00036 !
00037 !*    0.1    Declaration of arguments
00038 !            ------------------------
00039 !
00040 INTEGER,                       INTENT(IN)    :: KGRID_PAR ! size of PGRID_PAR
00041 INTEGER,                       INTENT(IN)    :: KL        ! number of points
00042 REAL,    DIMENSION(KGRID_PAR), INTENT(IN)    :: PGRID_PAR ! grid parameters
00043 REAL,    DIMENSION(KL),        INTENT(IN)    :: PLAT      ! latitude of the point
00044 REAL,    DIMENSION(KL),        INTENT(IN)    :: PLON      ! longitude of the point
00045 INTEGER, DIMENSION(KL),        INTENT(OUT)   :: KINDEX    ! index of the grid mesh where the point is
00046 INTEGER,                       INTENT(IN)    :: KSSO      ! number of subgrid mesh in each direction
00047 INTEGER, DIMENSION(KL),        INTENT(OUT)   :: KISSOX    ! X index of the subgrid mesh
00048 INTEGER, DIMENSION(KL),        INTENT(OUT)   :: KISSOY    ! Y index of the subgrid mesh
00049 !
00050 !*    0.2    Declaration of other local variables
00051 !            ------------------------------------
00052 !
00053 REAL, DIMENSION(SIZE(PLON))       :: ZLON     ! longitude
00054 !
00055 REAL, DIMENSION(:), ALLOCATABLE   :: ZX       ! X conformal coordinate
00056 REAL, DIMENSION(:), ALLOCATABLE   :: ZY       ! Y conformal coordinate
00057 REAL, DIMENSION(:), ALLOCATABLE   :: ZDX      ! X grid mesh size
00058 REAL, DIMENSION(:), ALLOCATABLE   :: ZDY      ! Y grid mesh size
00059 REAL                              :: ZDXLIM   ! X grid mesh size
00060 REAL                              :: ZDYLIM   ! Y grid mesh size
00061 !
00062 INTEGER                           :: JI       ! loop counter in x
00063 INTEGER                           :: JJ       ! loop counter in y
00064 INTEGER                           :: JL       ! loop counter on input points
00065 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00066 !----------------------------------------------------------------------------
00067 !
00068 IF (LHOOK) CALL DR_HOOK('GET_MESH_INDEX_CONF_PROJ',0,ZHOOK_HANDLE)
00069 IF (.NOT. ALLOCATED(XXLIM)) THEN
00070 !
00071 !*    1.     Uncode parameters of the grid
00072 !            -----------------------------
00073 !
00074   CALL GET_GRIDTYPE_CONF_PROJ(PGRID_PAR,XLAT0,XLON0,XRPK,XBETA,&
00075                                 XLATOR,XLONOR,NIMAX,NJMAX        )  
00076 !
00077   ALLOCATE(ZX (NIMAX*NJMAX))
00078   ALLOCATE(ZY (NIMAX*NJMAX))
00079   ALLOCATE(ZDX(NIMAX*NJMAX))
00080   ALLOCATE(ZDY(NIMAX*NJMAX))
00081 !
00082   CALL GET_GRIDTYPE_CONF_PROJ(PGRID_PAR,                       &
00083                                 PX=ZX,PY=ZY,PDX=ZDX,PDY=ZDY      )  
00084 !
00085 !*    2.     Limits of grid meshes in x and y
00086 !            --------------------------------
00087 !
00088   ALLOCATE(XXLIM(NIMAX+1))
00089   XXLIM(1) = ZX(1) - ZDX(1)/2.
00090   DO JI=2,NIMAX
00091     JL = JI
00092     XXLIM(JI) = ZX(JL) - (ZDX(JL-1)+ZDX(JL))/4.
00093   END DO
00094   XXLIM(NIMAX+1) = ZX(NIMAX) + ZDX(NIMAX)/2.
00095 
00096   ALLOCATE(XYLIM(NJMAX+1))
00097   XYLIM(1) = ZY(1) - ZDY(1)/2.
00098   DO JJ=2,NJMAX
00099     JL = 1 + (JJ-1) * NIMAX
00100     XYLIM(JJ) = ZY(JL) - (ZDY(JL-NIMAX)+ZDY(JL))/4.
00101   END DO
00102   XYLIM(NJMAX+1) = ZY(1+(NJMAX-1)*NIMAX) + ZDY(1+(NJMAX-1)*NIMAX)/2.
00103 !
00104 !
00105   DEALLOCATE(ZX )
00106   DEALLOCATE(ZY )
00107   DEALLOCATE(ZDX)
00108   DEALLOCATE(ZDY)
00109 END IF
00110 !
00111 ZDXLIM = XXLIM(2) - XXLIM(1)
00112 ZDYLIM = XYLIM(2) - XYLIM(1)
00113 !
00114 !*    2.     Reshifts the longitudes with respect to projection reference point
00115 !            ------------------------------------------------------------------
00116 !
00117 ZLON(:) = PLON(:)+NINT((XLON0-PLON(:))/360.)*360.
00118 !
00119 !*    3.     Projection
00120 !            ----------
00121 !
00122 ALLOCATE(ZX (SIZE(PLAT)))
00123 ALLOCATE(ZY (SIZE(PLAT)))
00124 !
00125  CALL XY_CONF_PROJ(XLAT0,XLON0,XRPK,XBETA,XLATOR,XLONOR, &
00126                     ZX,ZY,PLAT,ZLON                       )  
00127 !
00128 !
00129 !
00130 !*    5.     Localisation of the data points on (x,y) grid
00131 !            ---------------------------------------------
00132 !
00133 DO JL=1,SIZE(PLON)
00134   IF (     ZX(JL)<XXLIM(1) .OR. ZX(JL)>XXLIM(NIMAX+1) &
00135         .OR. ZY(JL)<XYLIM(1) .OR. ZY(JL)>XYLIM(NJMAX+1) ) THEN  
00136     KINDEX(JL) = 0
00137     IF (KSSO/=0) THEN
00138       KISSOX(JL) = 0
00139       KISSOY(JL) = 0
00140     END IF
00141     CYCLE
00142   END IF
00143   JI = MIN(INT( (ZX(JL) - XXLIM(1))/ZDXLIM+1),NIMAX)
00144   JJ = MIN(INT( (ZY(JL) - XYLIM(1))/ZDYLIM+1),NJMAX)
00145 
00146   KINDEX(JL) = (JJ-1) * NIMAX + JI
00147 !
00148 !
00149 !*    6.     Localisation of the data points on in the subgrid of this mesh
00150 !            --------------------------------------------------------------
00151 !
00152   IF (KSSO/=0) THEN
00153     KISSOX(JL) = 1 + INT( FLOAT(KSSO) * (ZX(JL)-XXLIM(JI))/(XXLIM(JI+1)-XXLIM(JI)) )
00154     KISSOY(JL) = 1 + INT( FLOAT(KSSO) * (ZY(JL)-XYLIM(JJ))/(XYLIM(JJ+1)-XYLIM(JJ)) )
00155   END IF
00156 END DO
00157 !
00158 !-------------------------------------------------------------------------------
00159 DEALLOCATE(ZX )
00160 DEALLOCATE(ZY )
00161 IF (LHOOK) CALL DR_HOOK('GET_MESH_INDEX_CONF_PROJ',1,ZHOOK_HANDLE)
00162 !-------------------------------------------------------------------------------
00163 !
00164 END SUBROUTINE GET_MESH_INDEX_CONF_PROJ