NCEPLIBS-ip 4.0.0
ip_mercator_grid_mod.f90
1module ip_mercator_grid_mod
4 use constants_mod, only: dpr, pi
5 use earth_radius_mod
6 implicit none
7
8 private
9 public :: ip_mercator_grid
10
11 type, extends(ip_grid) :: ip_mercator_grid
12 real :: rlat1, rlon1, rlon2, rlati, hi, dlon, dphi
13 contains
14 procedure :: init_grib1
15 procedure :: init_grib2
16 procedure :: gdswzd => gdswzd_mercator
17 end type ip_mercator_grid
18
19 REAL :: DLON
20 REAL :: DPHI
21 REAL :: RERTH
22
23CONTAINS
24
25 subroutine init_grib1(self, g1_desc)
26 class(ip_mercator_grid), intent(inout) :: self
27 type(grib1_descriptor), intent(in) :: g1_desc
28
29 integer :: iscan, jscan
30 real :: dy, hj
31
32 associate(kgds => g1_desc%gds)
33 self%rerth = 6.3712e6
34 self%eccen_squared = 0.0
35
36 self%IM=kgds(2)
37 self%JM=kgds(3)
38
39 self%RLAT1=kgds(4)*1.e-3
40 self%RLON1=kgds(5)*1.e-3
41 self%RLON2=kgds(8)*1.e-3
42 self%RLATI=kgds(9)*1.e-3
43
44 iscan=mod(kgds(11)/128,2)
45 jscan=mod(kgds(11)/64,2)
46
47 dy=kgds(13)
48 self%HI=(-1.)**iscan
49 hj=(-1.)**(1-jscan)
50 self%DLON=self%HI*(mod(self%HI*(self%RLON2-self%RLON1)-1+3600,360.)+1)/(self%IM-1)
51 self%DPHI=hj*dy/(self%RERTH*cos(self%RLATI/dpr))
52
53 ! defaults
54 self%iwrap = 0
55 self%jwrap1 = 0
56 self%jwrap2 = 0
57 self%nscan = mod(kgds(11) / 32, 2)
58 self%nscan_field_pos = self%nscan
59 self%kscan = 0
60
61 self%iwrap = nint(360 / abs(self%dlon))
62 if (self%im < self%iwrap) self%iwrap = 0
63 end associate
64
65 end subroutine init_grib1
66
67 subroutine init_grib2(self, g2_desc)
68 class(ip_mercator_grid), intent(inout) :: self
69 type(grib2_descriptor), intent(in) :: g2_desc
70
71 integer :: iscan, jscan
72 real :: hj, dy
73
74 associate(igdtmpl => g2_desc%gdt_tmpl, igdtlen => g2_desc%gdt_len)
75
76 call earth_radius(igdtmpl, igdtlen, self%rerth, self%eccen_squared)
77
78 self%IM=igdtmpl(8)
79 self%JM=igdtmpl(9)
80
81 self%RLAT1=float(igdtmpl(10))*1.0e-6
82 self%RLON1=float(igdtmpl(11))*1.0e-6
83 self%RLON2=float(igdtmpl(15))*1.0e-6
84 self%RLATI=float(igdtmpl(13))*1.0e-6
85
86 iscan=mod(igdtmpl(16)/128,2)
87 jscan=mod(igdtmpl(16)/64,2)
88
89 dy=float(igdtmpl(19))*1.0e-3
90 self%HI=(-1.)**iscan
91 hj=(-1.)**(1-jscan)
92 self%DLON=self%HI*(mod(self%HI*(self%RLON2-self%RLON1)-1+3600,360.)+1)/(self%IM-1)
93 self%DPHI=hj*dy/(self%RERTH*cos(self%RLATI/dpr))
94
95 self%jwrap1 = 0
96 self%jwrap2 = 0
97 self%kscan = 0
98 self%nscan=mod(igdtmpl(16) / 32,2)
99 self%nscan_field_pos = self%nscan
100
101 self%iwrap = nint(360 / abs(self%dlon))
102 if(self%im < self%iwrap) self%iwrap = 0
103
104 end associate
105 end subroutine init_grib2
106
107 SUBROUTINE gdswzd_mercator(self,IOPT,NPTS,FILL, &
108 XPTS,YPTS,RLON,RLAT,NRET, &
109 CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
110 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
111 !
112 ! SUBPROGRAM: GDSWZD_MERCATOR GDS WIZARD FOR MERCATOR CYLINDRICAL
113 ! PRGMMR: IREDELL ORG: W/NMC23 DATE: 96-04-10
114 !
115 ! ABSTRACT: THIS ROUTINE DECODES THE GRIB 2 GRID DEFINITION
116 ! TEMPLATE (PASSED IN INTEGER FORM AS DECODED BY THE
117 ! NCEP G2 LIBRARY) AND RETURNS ONE OF THE FOLLOWING:
118 ! (IOPT=+1) EARTH COORDINATES OF SELECTED GRID COORDINATES
119 ! (IOPT=-1) GRID COORDINATES OF SELECTED EARTH COORDINATES
120 ! WORKS FOR MERCATOR CYLINDRICAL PROJECTIONS.
121 ! IF THE SELECTED COORDINATES ARE MORE THAN ONE GRIDPOINT
122 ! BEYOND THE THE EDGES OF THE GRID DOMAIN, THEN THE RELEVANT
123 ! OUTPUT ELEMENTS ARE SET TO FILL VALUES. THE
124 ! ACTUAL NUMBER OF VALID POINTS COMPUTED IS RETURNED TOO.
125 ! OPTIONALLY, THE VECTOR ROTATIONS, MAP JACOBIANS AND
126 ! THE GRID BOX AREAS MAY BE RETURNED. TO COMPUTE THE
127 ! VECTOR ROTATIONS, THE OPTIONAL ARGUMENTS 'SROT' AND 'CROT'
128 ! MUST BE PRESENT. TO COMPUTE THE MAP JACOBIANS, THE
129 ! OPTIONAL ARGUMENTS 'XLON', 'XLAT', 'YLON', 'YLAT' MUST BE
130 ! PRESENT. TO COMPUTE THE GRID BOX AREAS, THE OPTIONAL
131 ! ARGUMENT 'AREA' MUST BE PRESENT.
132 !
133 ! PROGRAM HISTORY LOG:
134 ! 96-04-10 IREDELL
135 ! 96-10-01 IREDELL PROTECTED AGAINST UNRESOLVABLE POINTS
136 ! 97-10-20 IREDELL INCLUDE MAP OPTIONS
137 ! 2015-01-21 GAYNO MERGER OF GDSWIZ01 AND GDSWZD01. MAKE
138 ! CROT,SORT,XLON,XLAT,YLON,YLAT AND AREA
139 ! OPTIONAL ARGUMENTS. MAKE PART OF A MODULE.
140 ! MOVE VECTOR ROTATION, MAP JACOBIAN AND GRID
141 ! BOX AREA COMPUTATIONS TO SEPARATE SUBROUTINES.
142 ! 2015-07-13 GAYNO CONVERT TO GRIB 2. REPLACE GRIB 1 KGDS ARRAY
143 ! WITH GRIB 2 GRID DEFINITION TEMPLATE ARRAY.
144 ! RENAME AS "GDSWZD_MERCATOR".
145 ! 2018-07-20 WESLEY ADD THREADS.
146 !
147 ! USAGE: CALL GDSWZD_MERCATOR(IGDTNUM,IGDTMPL,IGDTLEN,IOPT,NPTS, &
148 ! FILL,XPTS,YPTS,RLON,RLAT,NRET, &
149 ! CROT,SROT,XLON,XLAT,YLON,YLAT,AREA)
150 !
151 ! INPUT ARGUMENT LIST:
152 ! IGDTNUM - INTEGER GRID DEFINITION TEMPLATE NUMBER.
153 ! CORRESPONDS TO THE GFLD%IGDTNUM COMPONENT OF THE
154 ! NCEP G2 LIBRARY GRIDMOD DATA STRUCTURE.
155 ! MUST BE "10" FOR MERCATOR GRIDS.
156 ! IGDTMPL - INTEGER (IGDTLEN) GRID DEFINITION TEMPLATE ARRAY.
157 ! CORRESPONDS TO THE GFLD%IGDTMPL COMPONENT OF THE
158 ! NCEP G2 LIBRARY GRIDMOD DATA STRUCTURE FOR SECTION
159 ! THREE:
160 ! (1): SHAPE OF EARTH, OCTET 15
161 ! (2): SCALE FACTOR OF SPHERICAL EARTH RADIUS,
162 ! OCTET 16
163 ! (3): SCALED VALUE OF RADIUS OF SPHERICAL EARTH,
164 ! OCTETS 17-20
165 ! (4): SCALE FACTOR OF MAJOR AXIS OF ELLIPTICAL EARTH,
166 ! OCTET 21
167 ! (5): SCALED VALUE OF MAJOR AXIS OF ELLIPTICAL EARTH,
168 ! OCTETS 22-25
169 ! (6): SCALE FACTOR OF MINOR AXIS OF ELLIPTICAL EARTH,
170 ! OCTET 26
171 ! (7): SCALED VALUE OF MINOR AXIS OF ELLIPTICAL EARTH,
172 ! OCTETS 27-30
173 ! (8): NUMBER OF POINTS ALONG A PARALLEL, OCTS 31-34
174 ! (9): NUMBER OF POINTS ALONG A MERIDIAN, OCTS 35-38
175 ! (10): LATITUDE OF FIRST POINT, OCTETS 39-42
176 ! (11): LONGITUDE OF FIRST POINT, OCTETS 43-46
177 ! (12): RESOLUTION AND COMPONENT FLAGS, OCTET 47
178 ! (13): TANGENT LATITUDE, OCTETS 48-51
179 ! (14): LATITUDE OF LAST POINT, OCTETS 52-55
180 ! (15): LONGITUDE OF LAST POINT, OCTETS 56-59
181 ! (16): SCANNING MODE FLAGS, OCTET 60
182 ! (17): ORIENTATION OF GRID, OCTETS 61-64
183 ! (18): LONGITUDINAL GRID LENGTH, OCTETS 65-68
184 ! (19): LATITUDINAL GRID LENGTH, OCTETS 69-72
185 ! IGDTLEN - INTEGER NUMBER OF ELEMENTS (19) OF THE GRID DEFINITION
186 ! TEMPLATE ARRAY. CORRESPONDS TO THE GFLD%IGDTLEN
187 ! COMPONENT OF THE NCEP G2 LIBRARY GRIDMOD DATA STRUCTURE.
188 ! IOPT - INTEGER OPTION FLAG
189 ! (+1 TO COMPUTE EARTH COORDS OF SELECTED GRID COORDS)
190 ! (-1 TO COMPUTE GRID COORDS OF SELECTED EARTH COORDS)
191 ! NPTS - INTEGER MAXIMUM NUMBER OF COORDINATES
192 ! FILL - REAL FILL VALUE TO SET INVALID OUTPUT DATA
193 ! (MUST BE IMPOSSIBLE VALUE; SUGGESTED VALUE: -9999.)
194 ! XPTS - REAL (NPTS) GRID X POINT COORDINATES IF IOPT>0
195 ! YPTS - REAL (NPTS) GRID Y POINT COORDINATES IF IOPT>0
196 ! RLON - REAL (NPTS) EARTH LONGITUDES IN DEGREES E IF IOPT<0
197 ! (ACCEPTABLE RANGE: -360. TO 360.)
198 ! RLAT - REAL (NPTS) EARTH LATITUDES IN DEGREES N IF IOPT<0
199 ! (ACCEPTABLE RANGE: -90. TO 90.)
200 !
201 ! OUTPUT ARGUMENT LIST:
202 ! XPTS - REAL (NPTS) GRID X POINT COORDINATES IF IOPT<0
203 ! YPTS - REAL (NPTS) GRID Y POINT COORDINATES IF IOPT<0
204 ! RLON - REAL (NPTS) EARTH LONGITUDES IN DEGREES E IF IOPT>0
205 ! RLAT - REAL (NPTS) EARTH LATITUDES IN DEGREES N IF IOPT>0
206 ! NRET - INTEGER NUMBER OF VALID POINTS COMPUTED
207 ! CROT - REAL, OPTIONAL (NPTS) CLOCKWISE VECTOR ROTATION COSINES
208 ! SROT - REAL, OPTIONAL (NPTS) CLOCKWISE VECTOR ROTATION SINES
209 ! (UGRID=CROT*UEARTH-SROT*VEARTH;
210 ! VGRID=SROT*UEARTH+CROT*VEARTH)
211 ! XLON - REAL, OPTIONAL (NPTS) DX/DLON IN 1/DEGREES
212 ! XLAT - REAL, OPTIONAL (NPTS) DX/DLAT IN 1/DEGREES
213 ! YLON - REAL, OPTIONAL (NPTS) DY/DLON IN 1/DEGREES
214 ! YLAT - REAL, OPTIONAL (NPTS) DY/DLAT IN 1/DEGREES
215 ! AREA - REAL, OPTIONAL (NPTS) AREA WEIGHTS IN M**2
216 ! (PROPORTIONAL TO THE SQUARE OF THE MAP FACTOR)
217 !
218 ! ATTRIBUTES:
219 ! LANGUAGE: FORTRAN 90
220 !
221 !$$$
222 IMPLICIT NONE
223 !
224 class(ip_mercator_grid), intent(in) :: self
225 INTEGER, INTENT(IN ) :: IOPT, NPTS
226 INTEGER, INTENT( OUT) :: NRET
227 !
228 REAL, INTENT(IN ) :: FILL
229 REAL, INTENT(INOUT) :: RLON(NPTS),RLAT(NPTS)
230 REAL, INTENT(INOUT) :: XPTS(NPTS),YPTS(NPTS)
231 REAL, OPTIONAL, INTENT( OUT) :: CROT(NPTS),SROT(NPTS)
232 REAL, OPTIONAL, INTENT( OUT) :: XLON(NPTS),XLAT(NPTS)
233 REAL, OPTIONAL, INTENT( OUT) :: YLON(NPTS),YLAT(NPTS),AREA(NPTS)
234 !
235 INTEGER :: IM, JM, N
236 !
237 LOGICAL :: LROT, LMAP, LAREA
238 !
239 REAL :: DY, HI
240 REAL :: RLAT1, RLON1, RLON2, RLATI
241 REAL :: XMAX, XMIN, YMAX, YMIN
242 REAL :: YE
243 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
244 IF(PRESENT(crot)) crot=fill
245 IF(PRESENT(srot)) srot=fill
246 IF(PRESENT(xlon)) xlon=fill
247 IF(PRESENT(xlat)) xlat=fill
248 IF(PRESENT(ylon)) ylon=fill
249 IF(PRESENT(ylat)) ylat=fill
250 IF(PRESENT(area)) area=fill
251 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
252
253 im=self%im
254 jm=self%jm
255
256 rlat1=self%rlat1
257 rlon1=self%rlon1
258 rlon2=self%rlon2
259 rlati=self%rlati
260
261 hi=self%hi
262
263 dlon=self%dlon
264 dphi=self%dphi
265 rerth = self%rerth
266
267 ye=1-log(tan((rlat1+90)/2/dpr))/dphi
268 xmin=0
269 xmax=im+1
270 IF(im.EQ.nint(360/abs(dlon))) xmax=im+2
271 ymin=0
272 ymax=jm+1
273 nret=0
274 IF(PRESENT(crot).AND.PRESENT(srot))THEN
275 lrot=.true.
276 ELSE
277 lrot=.false.
278 ENDIF
279 IF(PRESENT(xlon).AND.PRESENT(xlat).AND.PRESENT(ylon).AND.PRESENT(ylat))THEN
280 lmap=.true.
281 ELSE
282 lmap=.false.
283 ENDIF
284 IF(PRESENT(area))THEN
285 larea=.true.
286 ELSE
287 larea=.false.
288 ENDIF
289 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
290 ! TRANSLATE GRID COORDINATES TO EARTH COORDINATES
291 IF(iopt.EQ.0.OR.iopt.EQ.1) THEN
292 !$OMP PARALLEL DO PRIVATE(N) REDUCTION(+:NRET) SCHEDULE(STATIC)
293 DO n=1,npts
294 IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
295 ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
296 rlon(n)=mod(rlon1+dlon*(xpts(n)-1)+3600,360.)
297 rlat(n)=2*atan(exp(dphi*(ypts(n)-ye)))*dpr-90
298 nret=nret+1
299 IF(lrot) CALL mercator_vect_rot(crot(n),srot(n))
300 IF(lmap) CALL mercator_map_jacob(rlat(n),xlon(n),xlat(n),ylon(n),ylat(n))
301 IF(larea) CALL mercator_grid_area(rlat(n),area(n))
302 ELSE
303 rlon(n)=fill
304 rlat(n)=fill
305 ENDIF
306 ENDDO
307 !$OMP END PARALLEL DO
308 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
309 ! TRANSLATE EARTH COORDINATES TO GRID COORDINATES
310 ELSEIF(iopt.EQ.-1) THEN
311 !$OMP PARALLEL DO PRIVATE(N) REDUCTION(+:NRET) SCHEDULE(STATIC)
312 DO n=1,npts
313 IF(abs(rlon(n)).LE.360.AND.abs(rlat(n)).LT.90) THEN
314 xpts(n)=1+hi*mod(hi*(rlon(n)-rlon1)+3600,360.)/dlon
315 ypts(n)=ye+log(tan((rlat(n)+90)/2/dpr))/dphi
316 IF(xpts(n).GE.xmin.AND.xpts(n).LE.xmax.AND. &
317 ypts(n).GE.ymin.AND.ypts(n).LE.ymax) THEN
318 nret=nret+1
319 IF(lrot) CALL mercator_vect_rot(crot(n),srot(n))
320 IF(lmap) CALL mercator_map_jacob(rlat(n),xlon(n),xlat(n),ylon(n),ylat(n))
321 IF(larea) CALL mercator_grid_area(rlat(n),area(n))
322 ELSE
323 xpts(n)=fill
324 ypts(n)=fill
325 ENDIF
326 ELSE
327 xpts(n)=fill
328 ypts(n)=fill
329 ENDIF
330 ENDDO
331 !$OMP END PARALLEL DO
332 ENDIF
333 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
334 END SUBROUTINE gdswzd_mercator
335 !
336 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
337 SUBROUTINE mercator_error(IOPT,FILL,RLAT,RLON,XPTS,YPTS,NPTS)
338 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
339 !
340 ! SUBPROGRAM: MERCATOR_ERROR ERROR HANDLER
341 ! PRGMMR: GAYNO ORG: W/NMC23 DATE: 2015-07-13
342 !
343 ! ABSTRACT: UPON AN ERROR, THIS SUBPROGRAM ASSIGNS
344 ! A "FILL" VALUE TO THE OUTPUT FIELDS.
345
346 ! PROGRAM HISTORY LOG:
347 ! 2015-07-13 GAYNO INITIAL VERSION
348 !
349 ! USAGE: CALL MERCATOR_ERROR(IOPT,FILL,RLAT,RLON,XPTS,YPTS,NPTS)
350 !
351 ! INPUT ARGUMENT LIST:
352 ! IOPT - INTEGER OPTION FLAG
353 ! (+1 TO COMPUTE EARTH COORDS OF SELECTED GRID COORDS)
354 ! (-1 TO COMPUTE GRID COORDS OF SELECTED EARTH COORDS)
355 ! NPTS - INTEGER MAXIMUM NUMBER OF COORDINATES
356 ! FILL - REAL FILL VALUE TO SET INVALID OUTPUT DATA
357 ! (MUST BE IMPOSSIBLE VALUE; SUGGESTED VALUE: -9999.)
358 ! OUTPUT ARGUMENT LIST:
359 ! RLON - REAL (NPTS) EARTH LONGITUDES IF IOPT<0
360 ! RLAT - REAL (NPTS) EARTH LATITUDES IF IOPT<0
361 ! XPTS - REAL (NPTS) GRID X POINT COORDINATES IF IOPT>0
362 ! YPTS - REAL (NPTS) GRID Y POINT COORDINATES IF IOPT>0
363 !
364 ! ATTRIBUTES:
365 ! LANGUAGE: FORTRAN 90
366 !
367 !$$$
368 IMPLICIT NONE
369 !
370 INTEGER, INTENT(IN ) :: IOPT, NPTS
371 !
372 REAL, INTENT(IN ) :: FILL
373 REAL, INTENT( OUT) :: RLAT(NPTS),RLON(NPTS)
374 REAL, INTENT( OUT) :: XPTS(NPTS),YPTS(NPTS)
375 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
376 IF(iopt>=0) THEN
377 rlon=fill
378 rlat=fill
379 ENDIF
380 IF(iopt<=0) THEN
381 xpts=fill
382 ypts=fill
383 ENDIF
384 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
385 END SUBROUTINE mercator_error
386 !
387 SUBROUTINE mercator_vect_rot(CROT,SROT)
388 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
389 !
390 ! SUBPROGRAM: MERCATOR_VECT_ROT VECTOR ROTATION FIELDS FOR
391 ! MERCATOR CYLINDRICAL GRIDS
392 !
393 ! PRGMMR: GAYNO ORG: W/NMC23 DATE: 2015-01-21
394 !
395 ! ABSTRACT: THIS SUBPROGRAM COMPUTES THE VECTOR ROTATION SINES AND
396 ! COSINES FOR A MERCATOR CYLINDRICAL GRID.
397 !
398 ! PROGRAM HISTORY LOG:
399 ! 2015-01-21 GAYNO INITIAL VERSION
400 ! 2015-09-17 GAYNO RENAME AS "MERCATOR_VECT_ROT".
401 !
402 ! USAGE: CALL MERCATOR_VECT_ROT(CROT,SROT)
403 !
404 ! INPUT ARGUMENT LIST:
405 ! NONE
406 !
407 ! OUTPUT ARGUMENT LIST:
408 ! CROT - CLOCKWISE VECTOR ROTATION COSINES (REAL)
409 ! SROT - CLOCKWISE VECTOR ROTATION SINES (REAL)
410 ! (UGRID=CROT*UEARTH-SROT*VEARTH;
411 ! VGRID=SROT*UEARTH+CROT*VEARTH)
412 !
413 ! ATTRIBUTES:
414 ! LANGUAGE: FORTRAN 90
415 !
416 !$$$
417 !
418 IMPLICIT NONE
419
420 REAL, INTENT( OUT) :: CROT, SROT
421
422 crot=1.0
423 srot=0.0
424
425 END SUBROUTINE mercator_vect_rot
426 !
427 SUBROUTINE mercator_map_jacob(RLAT,XLON,XLAT,YLON,YLAT)
428 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
429 !
430 ! SUBPROGRAM: MERCATOR_MAP_JACOB MAP JACOBIANS FOR
431 ! MERCATOR CYLINDRICAL GRIDS
432 !
433 ! PRGMMR: GAYNO ORG: W/NMC23 DATE: 2015-01-21
434 !
435 ! ABSTRACT: THIS SUBPROGRAM COMPUTES THE MAP JACOBIANS FOR
436 ! A MERCATOR CYLINDRICAL GRID.
437 !
438 ! PROGRAM HISTORY LOG:
439 ! 2015-01-21 GAYNO INITIAL VERSION
440 ! 2015-09-17 GAYNO RENAME AS "MERCATOR_MAP_JACOB"
441 !
442 ! USAGE: CALL MERCATOR_MAP_JACOB(RLAT,XLON,XLAT,YLON,YLAT)
443 !
444 ! INPUT ARGUMENT LIST:
445 ! RLAT - LATITUDE IN DEGREES (REAL)
446 !
447 ! OUTPUT ARGUMENT LIST:
448 ! XLON - DX/DLON IN 1/DEGREES (REAL)
449 ! XLAT - DX/DLAT IN 1/DEGREES (REAL)
450 ! YLON - DY/DLON IN 1/DEGREES (REAL)
451 ! YLAT - DY/DLAT IN 1/DEGREES (REAL)
452 !
453 ! ATTRIBUTES:
454 ! LANGUAGE: FORTRAN 90
455 !
456 !$$$
457
458 IMPLICIT NONE
459
460 REAL, INTENT(IN ) :: RLAT
461 REAL, INTENT( OUT) :: XLON, XLAT, YLON, YLAT
462
463 xlon=1./dlon
464 xlat=0.
465 ylon=0.
466 ylat=1./dphi/cos(rlat/dpr)/dpr
467
468 END SUBROUTINE mercator_map_jacob
469 !
470 SUBROUTINE mercator_grid_area(RLAT,AREA)
471 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
472 !
473 ! SUBPROGRAM: MERCATOR_GRID_AREA GRID BOX AREA FOR
474 ! MERCATOR CYLINDRICAL GRIDS
475 !
476 ! PRGMMR: GAYNO ORG: W/NMC23 DATE: 2015-01-21
477 !
478 ! ABSTRACT: THIS SUBPROGRAM COMPUTES THE GRID BOX AREA FOR
479 ! A MERCATOR CYLINDRICAL GRID.
480 !
481 ! PROGRAM HISTORY LOG:
482 ! 2015-01-21 GAYNO INITIAL VERSION
483 ! 2015-09-17 GAYNO RENAME AS "MERCATOR_GRID_AREA"
484 !
485 ! USAGE: CALL MERCATOR_GRID_AREA(RLAT,AREA)
486 !
487 ! INPUT ARGUMENT LIST:
488 ! RLAT - LATITUDE OF GRID POINT IN DEGREES (REAL)
489 !
490 ! OUTPUT ARGUMENT LIST:
491 ! AREA - AREA WEIGHTS IN M**2 (REAL)
492 !
493 ! ATTRIBUTES:
494 ! LANGUAGE: FORTRAN 90
495 !
496 !$$$
497
498 IMPLICIT NONE
499
500 REAL, INTENT(IN ) :: RLAT
501 REAL, INTENT( OUT) :: AREA
502
503 area=rerth**2*cos(rlat/dpr)**2*dphi*dlon/dpr
504
505 END SUBROUTINE mercator_grid_area
506
507end module ip_mercator_grid_mod
508
Module containing common constants.
real(real64), parameter pi
PI.
real(real64), parameter dpr
Radians to degrees.
Uses derived type grid descriptor objects to abstract away the raw Grib-1 and Grib-2 grid definitions...
Abstract ip_grid type.
Definition: ip_grid_mod.f90:8
Abstract grid that holds fields and methods common to all grids.
Definition: ip_grid_mod.f90:45