File: intf.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 (431 lines) | stat: -rwxr-xr-x 11,935 bytes parent folder | download
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
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

       INTEGER FUNCTION INTF( INGRIB,INLEN,FLDIN,OUTGRIB,OUTLEN,FLDOUT)
C
C---->
C**** INTF
C
C     Purpose
C     -------
C
C     Interpolate input field...
C
C
C     Interface
C     ---------
C
C     IRET = INTF( INGRIB,INLEN,FLDIN,OUTGRIB,OUTLEN,FLDOUT)
C
C     Input
C     -----
C
C     INGRIB - Input field (packed).
C     INLEN  - Input field length (words).
C     FLDIN  - Input field (unpacked).
C
C
C     Output
C     ------
C
C     OUTGRIB - Output field (packed).
C     OUTLEN  - Output field length (words).
C     FLDOUT  - Output field (unpacked).
C
C
C     Method
C     ------
C
C     Call interpolation routines.
C
C
C     Externals
C     ---------
C
C     IBASINI - Ensure basic interpolation setup is done.
C     INSANE  - Ensure no outrageous values given for interpolation.
C     PDDEFS  - Setup interpolation using parameter dependent options.
C     PRECIP  - Says if field is to have 'precipitation' treatment
C     INTFAU  - Prepare to interpolate unpacked input field.
C     INTFAP  - Prepare to interpolate packed input field.
C     HNTFAU  - Prepare to interpolate unpacked input field (using
C               Hirlam 12-point for rotations).
C     HNTFAP  - Prepare to interpolate packed input field (using
C               Hirlam 12-point for rotations).
C     INTFB   - Interpolate input field.
C     INTLOG  - Log error message.
C     JDEBUG  - Checks environment to switch on/off debug
C     INTWAVE - Interpolate quasi-regular lat/long wave field
C               to a regular lat/long field.
C     OCEANP  - Interpolate GRIB ocean field.
C     RESET_C - Reset interpolation handling options using GRIB product.
C
C
C     Author
C     ------
C
C     J.D.Chambers     ECMWF     Aug 1994
C
C----<
C
      IMPLICIT NONE
C
C     Function arguments
C
      INTEGER INGRIB(*),OUTGRIB(*),INLEN,OUTLEN
      REAL FLDIN(*),FLDOUT(*)
C
#include "parim.h"
#include "nifld.common"
#include "nofld.common"
#include "grfixed.h"
#include "intf.h"
C
C     Parameters
C
      INTEGER JPROUTINE
      PARAMETER (JPROUTINE = 26000 )
C
C     Local variables
C
      INTEGER IWORD, IRET, IORIGLN, ISAME
      INTEGER LOOP, IIHOLD, IOHOLD
      DIMENSION IIHOLD(4), IOHOLD(4)
      INTEGER NUMTABL, NUMPROD
      LOGICAL L98WAVE, LUNROT
      CHARACTER*6 YFLAG
      INTEGER IOS
C
C     Externals
C
      INTEGER IBASINI, PDDEFS, INSANE
      INTEGER INTFAU, INTFAP, INTFB, HNTFAU, HNTFAP
      INTEGER INTWAVE2,INTWAVE,INTWAVU, OCEANP, OCEANU, RESET_C
      LOGICAL PRECIP
C
C     -----------------------------------------------------------------|
C*    Section 1.   Initialise
C     -----------------------------------------------------------------|
C
  100 CONTINUE
C
      INTF = 0
      IRET = 0
      IORIGLN = OUTLEN
      NOMISS = 0
      LUNROT = .FALSE.
      OUTLROT = 0

C
C     Save input and output area definitions
C
      DO 110 LOOP = 1, 4
        IIHOLD(LOOP) = NIAREA(LOOP)
        IOHOLD(LOOP) = NOAREA(LOOP)
  110 CONTINUE
C
C     Check if debug option turned on
C
      CALL JDEBUG()
C
C     If the input is a set of U and V rotated lat/long fields,
C     set return length to zero and do not copy input to output
C
      IF( (NIREPR.EQ.JPREGULAR).AND.LWIND.AND.LNOROTA ) THEN
        OUTLEN = 0
        IRET   = 0
        CALL INTLOG(JP_DEBUG,
     X    'INTF: Input U and V rotated lat/long fields ...',JPQUIET)
        CALL INTLOG(JP_DEBUG,
     X    'INTF: ... no further interpolation has been done',JPQUIET)
        GOTO 900
      ENDIF
C
C     -----------------------------------------------------------------|
C*    Section 2.   Prepare to interpolate input field.
C     -----------------------------------------------------------------|
C
  200 CONTINUE
C
C     Ensure that basic initialisation has been done
C
      IRET = IBASINI(0)
      IF( IRET.NE.0 ) THEN
        CALL INTLOG(JP_ERROR,'INTF: basic initialisation fail.',JPQUIET)
        INTF = IRET
        GOTO 900
      ENDIF
C
C     Allocate work array ZNFELDI if not already done.
C
      IF( NIFORM.EQ.1 ) THEN
        IF( IZNJDCI.NE.1952999238 ) THEN
          CALL JMEMHAN( 19, IZNFLDI, JPEXPAND, 1, IRET)
          IF( IRET.NE.0 ) THEN
            CALL INTLOG(JP_WARN,'INTF: ZNFELDI allocation fail',JPQUIET)
            INTF = IRET
            GOTO 900
          ENDIF
          IZNJDCI = 1952999238
        ENDIF
C
C       Unpack the field headers for packed input.
C
        CALL INTLOG(JP_DEBUG, 'INTF: Unpack GRIB headers.',JPQUIET)
        IRET = 1
        IWORD = 0
        CALL GRIBEX(ISEC0, ISEC1, ISEC2, ZSEC2, ISEC3, ZSEC3, ISEC4,
     X              ZNFELDI, JPEXPAND, INGRIB, INLEN, IWORD, 'J',IRET)
C
        IF( (IRET.NE.0).AND.(IRET.NE.811) ) THEN
          CALL INTLOG(JP_ERROR,
     X      'INTF: Failed to unpack GRIB heders.',JPQUIET)
          INTF = IRET
          GOTO 900
        ENDIF
C
C       Reset interpolation handling options using GRIB values.
C
        IRET = RESET_C( ISEC1, ISEC2, ZSEC2, ISEC4)
        IF( IRET.NE.0 ) THEN
          CALL INTLOG(JP_WARN,
     X      'INTF: Setup of interp. options from GRIB failed',JPQUIET)
          INTF = IRET
          GOTO 900
        ENDIF
C end of NIFORM = 1
      ENDIF
C
C     Check that no outrageous values given for interpolation
C
      ISAME = INSANE()
      IF ( ISAME .GT. 0 ) THEN
        CALL INTLOG(JP_ERROR,
     X    'INTF: Interpolation cannot use given values.',JPQUIET)
        INTF = ISAME
        GOTO 900
      ENDIF
Cs setting of out Date
      NODATE = NIDATE
C
C     If output is same as the input, set return length to zero and
C     do not copy input to output
C
      IF( ISAME.EQ.-1 ) THEN
        OUTLEN = 0
        IRET   = 0
        CALL INTLOG(JP_DEBUG,
     X    'INTF: Output is same as the input.',JPQUIET)
        CALL INTLOG(JP_DEBUG,
     X    'INTF: No interpolation carried out.',JPQUIET)
        GOTO 900
      ENDIF
C
C     Set precipitation flag if user hasn't
C
      IF( .NOT.LPRECSET ) LPREC = PRECIP()
C
C     Handle packed fields
C
C
C     -----------------------------------------------------------------|
C*    Section 3.   Use special interpolation for:
C                  - an ECMWF wave field.
C                  - a reduced latitude-longitude field
C     -----------------------------------------------------------------|
C
  300   CONTINUE
C
        NUMTABL = NITABLE
        NUMPROD = NUMTABL*1000 + NIPARAM
        L98WAVE = (NUMTABL.EQ.140).OR.
     X            (NUMPROD.EQ.131229).OR.
     X            (NUMPROD.EQ.131232).OR.
     X            (NIREPR.EQ.26)
      IF( L98WAVE ) THEN
          CALL INTLOG(JP_DEBUG,
     X      'INTF: Wave-type interpolation required.',JPQUIET)
C
        OUTLEN = IORIGLN
        IF( NIFORM.EQ.1 ) THEN
             IRET = INTWAVE2(INGRIB,INLEN,OUTGRIB,OUTLEN)
cs             IRET = INTWAVE(INGRIB,INLEN,OUTGRIB,OUTLEN)
        ELSE
            IRET = INTWAVU(FLDIN,INLEN,FLDOUT,OUTLEN)
        ENDIF
          IF( IRET.EQ.0 ) THEN
            CALL INTLOG(JP_DEBUG,
     X        'INTF: Wave-type interpolated OK.',JPQUIET)
          ELSE
            CALL INTLOG(JP_DEBUG,
     X        'INTF: Wave-type interpolation failed.',JPQUIET)
          ENDIF
          INTF = IRET
          GOTO 900
        ENDIF
C
C     -----------------------------------------------------------------|
C*    Section 4.   Use special interpolation for an ECMWF ocean field.
C     -----------------------------------------------------------------|
C
  400   CONTINUE
C
        IF( ((ISEC1(24).EQ.1).AND.(ISEC1(37).EQ.4)).OR.LOCEAN ) THEN
C
          CALL INTLOG(JP_DEBUG,
     X      'INTF: Ocean field interpolation required.',JPQUIET)
C
          OUTLEN = IORIGLN
          IF( NIFORM.EQ.1 ) THEN
            IRET = OCEANP(INGRIB,INLEN,OUTGRIB,OUTLEN)
          ELSE
            IRET = OCEANU(FLDIN,INLEN,FLDOUT,OUTLEN)
          ENDIF
          IF( IRET.EQ.0 ) THEN
            CALL INTLOG(JP_DEBUG,
     X        'INTF: Ocean field interpolated OK.',JPQUIET)
          ELSE
            CALL INTLOG(JP_DEBUG,
     X        'INTF: Ocean field interpolation failed.',JPQUIET)
          ENDIF
          INTF = IRET
          GOTO 900
        ENDIF
C
C     -----------------------------------------------------------------|
C*    Section 5.   Continue interpolation setup in other cases.
C     -----------------------------------------------------------------|
C
  500   CONTINUE
      IF( NIFORM.EQ.1 ) THEN
C
C       Unpack (and rotate) field if necessary
C
        IF( LUSEHIR ) THEN
          IRET = HNTFAP(INGRIB,INLEN)
        ELSE
          IRET = INTFAP(INGRIB,INLEN)
        ENDIF
C
C       If a bitmap encountered with some missing values (IRET=-4),
C       product cannot be interpolated unless 'missingvalue'
C       specified via INTIN
C
        IF( .NOT.LIMISSV ) THEN
          IF( (IRET.NE.0).AND.(IRET.NE.-2) ) THEN
            IF( IRET.EQ.-4 ) THEN
              CALL INTLOG(JP_WARN,
     X        'INTF: Product has bitmap and missing data.',JPQUIET)
              CALL INTLOG(JP_WARN,
     X        'INTF: Try Using INTIN "missingvalue" option',JPQUIET)
            ENDIF
            INTF = -4
            GOTO 900
          ENDIF
        ELSE
          IF( IRET.GT.0 ) THEN
            CALL INTLOG(JP_WARN,
     X        'INTF: Problems preparing for interpolation.',JPQUIET)
            INTF = IRET
            GOTO 900
          ENDIF
        ENDIF
C
C     Handle unpacked fields
C
      ELSE
        LUNROT = .TRUE.
        IF( LUSEHIR ) THEN
          IRET = HNTFAU(FLDIN,INLEN)
        ELSE
          IRET = INTFAU(FLDIN,INLEN)
        ENDIF
      ENDIF
C
      IF( (IRET.NE.0).AND.(IRET.NE.-2) ) THEN
        CALL INTLOG(JP_WARN,'INTF: Prepare interpolate fail',JPQUIET)
        INTF = IRET
        GOTO 900
      ENDIF
C
C     Field values are now in ZNFELDI.
C
C     Setup output length same as input GRIB length in case straight
C     copy is done later (ie input is transferred direct to output
C     without postprocessing).
C
      OUTLEN = INLEN

C
C     Setup interpolation options based on parameter in field.
C
      IRET = PDDEFS()
      IF( IRET.NE.0 ) THEN
        CALL INTLOG(JP_ERROR,
     X    'INTF: Setup interpolation options from param failed',JPQUIET)
        INTF = IRET
        GOTO 900
      ENDIF
C
C     -----------------------------------------------------------------|
C*    Section 7.   Interpolate input field.
C     -----------------------------------------------------------------|
C
  700 CONTINUE
C
C     If all values missing, set flag to ensure all are missing in the
C     interpolated field.
C
      IF( ISEC4(1).LT.0 ) NOMISS = ISEC4(1)
C
C     Perform the interpolation.
C
      CALL INTLOG(JP_DEBUG,'INTF: Perform the interpolation.',JPQUIET)
C
      OUTLEN = IORIGLN
      IF( NIFORM.EQ.1 ) THEN
        IRET = INTFB( INGRIB,INLEN,OUTGRIB,OUTLEN,FLDOUT)
      ELSE
        IRET = INTFB( ZNFELDI,INLEN,OUTGRIB,OUTLEN,FLDOUT)
      ENDIF
C
      IF( LUNROT.AND.LNOROTA ) THEN
          OUTLEN = OUTLROT
      ENDIF
C
      IF( IRET.NE.0 ) THEN
        CALL INTLOG(JP_ERROR,'INTF: Interpolation failed.',JPQUIET)
        INTF = IRET
        GOTO 900
      ELSE
C
        CALL INTLOG(JP_DEBUG,
     X    'INTF: Interpolation finished successfully.',JPQUIET)
      ENDIF
C
C     -----------------------------------------------------------------|
C*    Section 9.   Closedown.
C     -----------------------------------------------------------------|
C
  900 CONTINUE
C
C     Clear change flags for next product processing
C
      LCHANGE = .FALSE.
      LSMCHNG = .FALSE.
C
C     Restore input and output area definitions
C
      DO 910 LOOP = 1, 4
        NIAREA(LOOP) = IIHOLD(LOOP)
        NOAAPI(LOOP) = NOAREA(LOOP)
        NOAREA(LOOP) = IOHOLD(LOOP)
  910 CONTINUE
C
      RETURN
      END