51 USE yomhook
,ONLY : lhook, dr_hook
52 USE parkind1
,ONLY : jprb
59 INTEGER,
INTENT(IN) :: kgrid_par
60 REAL,
DIMENSION(KGRID_PAR),
INTENT(IN) :: pgrid_par
61 LOGICAL,
DIMENSION(720,360),
INTENT(OUT) :: olatlonmask
74 REAL,
DIMENSION(:),
ALLOCATABLE :: zdx
75 REAL,
DIMENSION(:),
ALLOCATABLE :: zdy
76 REAL,
DIMENSION(:),
ALLOCATABLE :: zx
77 REAL,
DIMENSION(:),
ALLOCATABLE :: zy
78 REAL,
DIMENSION(:),
ALLOCATABLE :: zxcorner
79 REAL,
DIMENSION(:),
ALLOCATABLE :: zycorner
80 REAL,
DIMENSION(:),
ALLOCATABLE :: zlon
81 REAL,
DIMENSION(:),
ALLOCATABLE :: zlat
82 REAL,
DIMENSION(:,:),
ALLOCATABLE :: zlon2d
83 REAL,
DIMENSION(:,:),
ALLOCATABLE :: zlat2d
84 REAL,
DIMENSION(720,360) :: zx_mask
85 REAL,
DIMENSION(720,360) :: zy_mask
86 INTEGER,
DIMENSION(720,360) :: icount1
87 INTEGER,
DIMENSION(720,360) :: icount2
88 REAL,
DIMENSION(720) :: zlon_mask
89 REAL,
DIMENSION(720) :: zlat_mask
103 REAL(KIND=JPRB) :: zhook_handle
106 IF (lhook) CALL dr_hook(
'LATLONMASK_CONF_PROJ',0,zhook_handle)
110 ALLOCATE(zx(iimax*ijmax))
111 ALLOCATE(zy(iimax*ijmax))
112 ALLOCATE(zdx(iimax*ijmax))
113 ALLOCATE(zdy(iimax*ijmax))
114 ALLOCATE(zxcorner((iimax+1)*(ijmax+1)))
115 ALLOCATE(zycorner((iimax+1)*(ijmax+1)))
116 ALLOCATE(zlon((iimax+1)*(ijmax+1)))
117 ALLOCATE(zlat((iimax+1)*(ijmax+1)))
121 olatlonmask(:,:) = .false.
130 zxmin = minval(zx) - 3.* maxval(zdx)/2.
131 zxmax = maxval(zx) + 3.* maxval(zdx)/2.
133 zymin = minval(zy) - 3.* maxval(zdy)/2.
134 zymax = maxval(zy) + 3.* maxval(zdy)/2.
138 zxcorner(ji+(jj-1)*(iimax+1)) = zx(ji+(jj-1)*iimax) - 0.5*zdx(ji+(jj-1)*iimax)
139 zycorner(ji+(jj-1)*(iimax+1)) = zy(ji+(jj-1)*iimax) - 0.5*zdy(ji+(jj-1)*iimax)
141 zxcorner(iimax+1+(jj-1)*(iimax+1)) = zx(iimax+(jj-1)*iimax) + 0.5*zdx(iimax+(jj-1)*iimax)
142 zycorner(iimax+1+(jj-1)*(iimax+1)) = zy(iimax+(jj-1)*iimax) - 0.5*zdx(iimax+(jj-1)*iimax)
145 zxcorner(ji+ijmax*(iimax+1)) = zx(ji+(ijmax-1)*iimax) - 0.5*zdx(ji+(ijmax-1)*iimax)
146 zycorner(ji+ijmax*(iimax+1)) = zy(ji+(ijmax-1)*iimax) + 0.5*zdy(ji+(ijmax-1)*iimax)
148 zxcorner((ijmax+1)*(iimax+1)) = zx(ijmax*iimax) + 0.5*zdx(ijmax*iimax)
149 zycorner((ijmax+1)*(iimax+1)) = zy(ijmax*iimax) + 0.5*zdy(ijmax*iimax)
161 zlon_mask(:)= (/ ( jlon /2. - 0.25 , jlon=1,720 ) /)
167 plat0=zlat0,plon0=zlon0,prpk=zrpk, &
168 pbeta=zbeta,plator=zlator,plonor=zlonor )
170 zlon_mask(:)=zlon_mask(:)+nint((zlon0-zlon_mask(:))/360.)*360.
175 DO jlat=1,
SIZE(olatlonmask,2)
176 zlat_mask(:) = (jlat-180)/2. - 0.25
177 CALL
xy_conf_proj(zlat0,zlon0,zrpk,zbeta,zlator,zlonor, &
178 zx_mask(:,jlat),zy_mask(:,jlat), &
179 zlat_mask(:),zlon_mask(:) )
185 WHERE ( zx_mask(:,:) >= zxmin .AND. zx_mask(:,:) <= zxmax &
186 .AND. zy_mask(:,:) >= zymin .AND. zy_mask(:,:) <= zymax )
187 olatlonmask(:,:) = .true.
196 zxcorner,zycorner,zlat,zlon )
201 zlon(:) = zlon(:) + nint((180.-zlon(:))/360.)*360.
209 ALLOCATE(zlat2d(iimax+1,ijmax+1))
210 ALLOCATE(zlon2d(iimax+1,ijmax+1))
214 zlat2d(ji,jj) = zlat(ji+(jj-1)*(iimax+1))
215 zlon2d(ji,jj) = zlon(ji+(jj-1)*(iimax+1))
225 jlat = min( 1 + int( ( zlat2d(ji,jj) + 90. ) * 2. ) ,360)
226 jlon = min( 1 + int( ( zlon2d(ji,jj) ) * 2. ) ,720)
228 icount1(jlon,jlat) = icount1(jlon,jlat) + 1
237 icount2(jlon,jlat) = icount2(jlon,jlat) + 1
242 jlat = min( 1 + int( ( zlat2d(min(ji+1,iimax),jj) + 90. ) * 2. ) ,360)
243 jlon = min( 1 + int( ( zlon2d(min(ji+1,iimax),jj) ) * 2. ) ,720)
244 icount1(jlon,jlat) = icount1(jlon,jlat) + 1
245 icount2(jlon,jlat) = icount2(jlon,jlat) + 1
247 jlat = min( 1 + int( ( zlat2d(ji,min(jj+1,ijmax)) + 90. ) * 2. ) ,360)
248 jlon = min( 1 + int( ( zlon2d(ji,min(jj+1,ijmax)) ) * 2. ) ,720)
249 icount1(jlon,jlat) = icount1(jlon,jlat) + 1
250 icount2(jlon,jlat) = icount2(jlon,jlat) + 1
252 jlat = min( 1 + int( ( zlat2d(max(ji-1,1),jj) + 90. ) * 2. ) ,360)
253 jlon = min( 1 + int( ( zlon2d(max(ji-1,1),jj) ) * 2. ) ,720)
254 icount1(jlon,jlat) = icount1(jlon,jlat) + 1
255 icount2(jlon,jlat) = icount2(jlon,jlat) + 1
257 jlat = min( 1 + int( ( zlat2d(ji,max(jj-1,1)) + 90. ) * 2. ) ,360)
258 jlon = min( 1 + int( ( zlon2d(ji,max(jj-1,1)) ) * 2. ) ,720)
259 icount1(jlon,jlat) = icount1(jlon,jlat) + 1
260 icount2(jlon,jlat) = icount2(jlon,jlat) + 1
268 WHERE (icount1(:,:) > 0 .AND. icount2(:,:) == 0)
269 olatlonmask(:,:) = .false.
272 WHERE (icount1(:,:) > 0 .AND. icount2(:,:) > 0)
273 olatlonmask(:,:) = .true.
276 zlat_mask(1:360)= (/ ( (jlat-180)/2. - 0.25 , jlat=1,360 ) /)
280 IF ( (icount1(jlon,jlat) > 0 .OR. olatlonmask(jlon,jlat)) .AND. iverb > 1) &
281 WRITE(*,
'(2(I3,1X),2(F6.2,1X),2(F8.0,1X),L1)') jlon,jlat,zlon_mask(jlon),zlat_mask(jlat), &
282 zx_mask(jlon,jlat),zy_mask(jlon,jlat),olatlonmask(jlon,jlat)
295 IF (lhook) CALL dr_hook(
'LATLONMASK_CONF_PROJ',1,zhook_handle)
subroutine latlonmask_conf_proj(KGRID_PAR, PGRID_PAR, OLATLONMASK)
subroutine latlon_conf_proj(PLAT0, PLON0, PRPK, PBETA, PLATOR, PLONOR, PX, PY, PLAT, PLON)
subroutine xy_conf_proj(PLAT0, PLON0, PRPK, PBETA, PLATOR, PLONOR, PX, PY, PLAT, PLON)
subroutine get_gridtype_conf_proj(PGRID_PAR, PLAT0, PLON0, PRPK, PBETA, PLATOR, PLONOR, KIMAX, KJMAX, PX, PY, PDX, PDY, KL)