forked from erget/wgrib2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathijkgds1.f
executable file
·96 lines (96 loc) · 3.54 KB
/
ijkgds1.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
C-----------------------------------------------------------------------
FUNCTION IJKGDS1(I,J,IJKGDSA)
C$$$ SUBPROGRAM DOCUMENTATION BLOCK
C
C SUBPROGRAM: IJKGDS1 RETURN FIELD POSITION FOR A GIVEN GRID POINT
C PRGMMR: IREDELL ORG: W/NMC23 DATE: 96-04-10
C
C ABSTRACT: THIS SUBPROGRAM DECODES THE GRIB GRID DESCRIPTION SECTION
C AND RETURNS THE FIELD POSITION FOR A GIVEN GRID POINT.
C CALL IJKGDS0 TO SET UP THE NAVIGATION PARAMETER ARRAY.
C
C PROGRAM HISTORY LOG:
C 96-04-10 IREDELL
C 97-03-11 IREDELL ALLOWED HEMISPHERIC GRIDS TO WRAP OVER ONE POLE
C 98-07-13 BALDWIN ADD 2D STAGGERED ETA GRID INDEXING (203)
C 1999-04-08 IREDELL SPLIT IJKGDS INTO TWO
C
C USAGE: ...IJKGDS1(I,J,IJKGDSA)
C
C INPUT ARGUMENT LIST:
C I - INTEGER X GRID POINT
C J - INTEGER Y GRID POINT
C IJKGDSA - INTEGER (20) NAVIGATION PARAMETER ARRAY
C IJKGDSA(1) IS NUMBER OF X POINTS
C IJKGDSA(2) IS NUMBER OF Y POINTS
C IJKGDSA(3) IS X WRAPAROUND INCREMENT
C (0 IF NO WRAPAROUND)
C IJKGDSA(4) IS Y WRAPAROUND LOWER PIVOT POINT
C (0 IF NO WRAPAROUND)
C IJKGDSA(5) IS Y WRAPAROUND UPPER PIVOT POINT
C (0 IF NO WRAPAROUND)
C IJKGDSA(6) IS SCANNING MODE
C (0 IF X FIRST THEN Y; 1 IF Y FIRST THEN X;
C 2 IF STAGGERED DIAGONAL LIKE PROJECTION 201;
C 3 IF STAGGERED DIAGONAL LIKE PROJECTION 203)
C IJKGDSA(7) IS MASS/WIND FLAG FOR STAGGERED DIAGONAL
C (0 IF MASS; 1 IF WIND)
C IJKGDSA(8:20) ARE UNUSED AT THE MOMENT
C
C OUTPUT ARGUMENT LIST:
C IJKGDS - INTEGER POSITION IN GRIB FIELD TO LOCATE GRID POINT
C (0 IF OUT OF BOUNDS)
C
C ATTRIBUTES:
C LANGUAGE: FORTRAN 90
C
C$$$
INTEGER I,J
INTEGER IJKGDSA(20)
C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
C EXTRACT FROM NAVIGATION PARAMETER ARRAY
IM=IJKGDSA(1)
JM=IJKGDSA(2)
IWRAP=IJKGDSA(3)
JWRAP1=IJKGDSA(4)
JWRAP2=IJKGDSA(5)
NSCAN=IJKGDSA(6)
KSCAN=IJKGDSA(7)
C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
C COMPUTE WRAPAROUNDS IN X AND Y IF NECESSARY AND POSSIBLE
II=I
JJ=J
IF(IWRAP.GT.0) THEN
II=MOD(I-1+IWRAP,IWRAP)+1
IF(J.LT.1.AND.JWRAP1.GT.0) THEN
JJ=JWRAP1-J
II=MOD(II-1+IWRAP/2,IWRAP)+1
ELSEIF(J.GT.JM.AND.JWRAP2.GT.0) THEN
JJ=JWRAP2-J
II=MOD(II-1+IWRAP/2,IWRAP)+1
ENDIF
ENDIF
C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
C COMPUTE POSITION FOR THE APPROPRIATE SCANNING MODE
IJKGDS1=0
IF(NSCAN.EQ.0) THEN
IF(II.GE.1.AND.II.LE.IM.AND.JJ.GE.1.AND.JJ.LE.JM)
& IJKGDS1=II+(JJ-1)*IM
ELSEIF(NSCAN.EQ.1) THEN
IF(II.GE.1.AND.II.LE.IM.AND.JJ.GE.1.AND.JJ.LE.JM)
& IJKGDS1=JJ+(II-1)*JM
ELSEIF(NSCAN.EQ.2) THEN
IS1=(JM+1-KSCAN)/2
IIF=JJ+(II-IS1)
JJF=JJ-(II-IS1)+KSCAN
IF(IIF.GE.1.AND.IIF.LE.2*IM-1.AND.JJF.GE.1.AND.JJF.LE.JM)
& IJKGDS1=(IIF+(JJF-1)*(2*IM-1)+1-KSCAN)/2
ELSEIF(NSCAN.EQ.3) THEN
IS1=(JM+1-KSCAN)/2
IIF=JJ+(II-IS1)
JJF=JJ-(II-IS1)+KSCAN
IF(IIF.GE.1.AND.IIF.LE.2*IM-1.AND.JJF.GE.1.AND.JJF.LE.JM)
& IJKGDS1=(IIF+1)/2+(JJF-1)*IM
ENDIF
C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
END