File: interpolation_example.F

package info (click to toggle)
emoslib 000380%2Bdfsg-3
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 47,712 kB
  • ctags: 11,551
  • sloc: fortran: 89,643; ansic: 24,200; makefile: 370; sh: 355
file content (149 lines) | stat: -rwxr-xr-x 3,587 bytes parent folder | download | duplicates (2)
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
C Copyright 1981-2007 ECMWF
C 
C Licensed under the GNU Lesser General Public License which
C incorporates the terms and conditions of version 3 of the GNU
C General Public License.
C See LICENSE and gpl-3.0.txt for details.
C

       PROGRAM SAMPLE1
C
      IMPLICIT NONE
      INTEGER IPROD
      INTEGER INTV
      REAL REALV
      CHARACTER*20 CHARV
      DIMENSION INTV(4), REALV(4), CHARV(4)
C
      INTEGER JPGRIB, JPBYTES
C
      PARAMETER (JPGRIB = 2000000)
C
C     JPBYTES is the size in bytes on an 'INTEGER'
C     Set JPBYTES = 8 on a 64-bit machine.
C
      PARAMETER (JPBYTES = 4)
C
      INTEGER INGRIB, NEWFLD
      DIMENSION INGRIB(JPGRIB), NEWFLD(JPGRIB)
C
      REAL ZNFELDI, ZNFELDO
      DIMENSION ZNFELDI(1), ZNFELDO(1)
C
      INTEGER IUNIT1, IUNIT2, IREC, INLEN, NEWLEN, IRET, NARGS
      INTEGER*4 J
C
C     Externals
      INTEGER INTOUT, INTF, IARGC

      CHARACTER*128 INFILE, OUTFILE, CARG(4)
C
C **********************************************************************
C
C     Pick up file names from command line.
C
      NARGS = IARGC()
      IF( NARGS.LT.4 ) THEN
        print*,'Usage: interpolation_example -i inputfile -o outputfile'
        STOP
      END IF

      DO 101 J=1,NARGS
      CALL GETARG(J,CARG(J))
 101  CONTINUE

      DO 102 J=1,NARGS,2
        IF(CARG(J).EQ.'-i') THEN
           INFILE=CARG(J+1)
        ELSEIF(CARG(J).EQ.'-o') THEN
           OUTFILE=CARG(J+1)
        ELSE
        print*,'Usage: interpolation_example -i inputfile -o outputfile'
        STOP
        END IF
 102  CONTINUE

C     Define the packing accuracy for the new field(s).
C
      INTV(1) = 24
      IRET = INTOUT('accuracy', INTV, REALV, CHARV)
      IF ( IRET.NE.0 ) THEN
        WRITE(*,*) ' First INTOUT failed.'
        STOP
      ENDIF
C
C     Define the geographical area for the new field(s).
C
      REALV(1) =  60.0
      REALV(2) = -10.0
      REALV(3) =  40.0
      REALV(4) =  15.0
      IRET = INTOUT('area', INTV, REALV, CHARV)
      IF ( IRET.NE.0 ) THEN
        WRITE(*,*) ' Second INTOUT failed.'
        STOP
      ENDIF
C
C     Define the grid interval for the new field(s).
C
      REALV(1) = 1.5
      REALV(2) = 1.5
      IRET = INTOUT('grid', INTV, REALV, CHARV)
      IF ( IRET.NE.0 ) THEN
        WRITE(*,*) ' Third INTOUT failed.'
        STOP
      ENDIF
C
C     Open input and output files.
C
      CALL PBOPEN(IUNIT1, INFILE, 'r', IRET)
      IF ( IRET.NE.0 ) STOP ' PBOPEN failed'
      CALL PBOPEN(IUNIT2, OUTFILE, 'w', IRET)
      IF ( IRET.NE.0 ) STOP ' PBOPEN failed'
      IPROD = 0
C
C     Start of loop through input GRIB-coded fields
C
 200  CONTINUE
        IPROD = IPROD + 1
C
C       Read next product.
C
        CALL PBGRIB(IUNIT1, INGRIB, JPGRIB*JPBYTES, IREC, IRET)
        IF ( IRET.EQ.-1 ) GOTO 900
        IF ( IRET.NE.0 ) STOP ' PBGRIB failed'
C
C       Interpolate.
C
        WRITE(*,*) ' Interpolate product number ', IPROD
        NEWLEN = JPGRIB
        INLEN  = IREC/JPBYTES
        IRET = INTF(INGRIB,INLEN,ZNFELDI,NEWFLD,NEWLEN,ZNFELDO)
        IF ( IRET.NE.0 ) THEN
          WRITE(*,*) ' INTF failed.'
          STOP
        ENDIF
C
C       Write the new product to file.
C
       CALL PBWRITE( IUNIT2, NEWFLD, NEWLEN*JPBYTES, IRET)
        IF ( IRET.LT.(NEWLEN*JPBYTES) ) STOP ' PBWRITE failed'
C
C       Loop back for next product.
C
      GOTO 200
C
C     Closedown.
C
 900  CONTINUE
C
      IPROD = IPROD - 1
      WRITE(*,*) ' All done after ', IPROD, ' products.'
C
C     Close input and output files.
C 
      CALL PBCLOSE(IUNIT1, IRET)
      CALL PBCLOSE(IUNIT2, IRET)
C
      STOP
      END