SURFEX v7.3
General documentation of Surfex
|
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