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