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