Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The following Fortran 77 program opens a GRIB file and calls INTF2 to interpolate fields to a 1.5/1.5 LatLon grid and extract a sub-area. The function INTIN is not used here because the input fields are in GRIB format and are self-defining.

Subroutines PBOPEN, PBCLOSE, PBGRIB and PBWRITE handle pure binary input and output files.

Depending on the parameter you wish to interpolate, there might be necessary to specify a path for the LSM files (using e.g. environment variable MARS_LSM_PATH.)

 

Code Block
titleFortran 77
linenumberstrue
C
C Copyright 2015 ECMWF.
C
C This 

...

software is licensed under the terms of the Apache Licence
C Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
C
C Unless required by applicable law or agreed to in writing, software
C distributed under the License is distributed on an "AS IS" BASIS,
C WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
C
C In applying this licence, ECMWF does not waive the privileges and immunities
C granted to it by virtue of its status as an intergovernmental organisation
C nor does it submit to any jurisdiction.
C

      PROGRAM EXAMPLE_INTF2
      IMPLICIT NONE


C     Parameters
      INTEGER JPGRIB   ! GRIB size (up to 1/16 deg)
      INTEGER JPBYTES  ! bytes/integer
      PARAMETER (JPGRIB = 33190420)
#ifdef INTEGER_8
      PARAMETER (JPBYTES = 8)
#else
      PARAMETER (JPBYTES = 4)
#endif


C

...

     Local 

...

variables
      INTEGER    

...

 

...

 

...

INTV(

...

4)

...

      REAL 

...

 

...

      

...

 

...

REALV(

...

4)
      CHARACTER*20 CHARV

      

...

CHARACTER*128 INFILE, OUTFILE, ARG
      INTEGER INLEN, OUTLEN, U1, U2, IRET, 

...

N
      INTEGER

...

 INGRIB(JPGRIB), OUTGRIB(JPGRIB)


C     Externals
      INTEGER INTOUT, INTF2, IARGC


C     

...

------------------------------------------------------------------


C     Pick up file names from command line

...


      INFILE  = ' '
      

...

OUTFILE = 

...

' '
      IF( 

...

IARGC().

...

EQ.4 ) THEN
        DO N = 

...

1,

...

 4, 2
          

...

CALL GETARG(N,ARG)
        

...

  IF

...

 (ARG.EQ.'-i') THEN
    

...

 

...

 

...

      CALL GETARG(

...

N+1,INFILE)
 

...

  

...

     

...

 

...

 ELSEIF (ARG.EQ.'-

...

o') THEN
            CALL 

...

GETARG(

...

N+1,OUTFILE)
          ENDIF
       

...

 ENDDO
      ENDIF
     

...

 CALL CHECK(
     _  INDEX(INFILE,' ').EQ.1 .OR. INDEX(OUTFILE,' ').EQ.1,
     _  

...

'Usage: 

...

example_

...

intf2 -i 

...

infile -o 

...

outfile' )

      INTV  = 

...

0
      REALV = 0.
    

...

 

...

 

...

CHARV = 

...

''


C     Define the packing accuracy for the new field(s)

...


      INTV(1) = 24
      IRET = INTOUT('accuracy', INTV, REALV, CHARV)
      

...

CALL CHECK(

...

IRET.NE.0, 

...

'INTOUT (accuracy) failed')
      INTV(1) = 

...

0


C     Define the geographical area for the new field(s)

...


      REALV(1) =  60.

...


      REALV(2) = -10.

...


      REALV(3) =  40.

...


      REALV(4) =  15.

...


      IRET = INTOUT('area', INTV, REALV, CHARV)
      

...

CALL CHECK(

...

IRET.NE.0, 

...

'INTOUT (area) failed')
      REALV = 

...

0.


C     Define the grid interval for the new field(s)

...


      REALV(1) = 1.5
      REALV(2) = 1.5
      IRET = INTOUT('grid', INTV, REALV, CHARV)
      

...

CALL CHECK(

...

IRET.NE.0

...

, 'INTOUT (grid) failed')
      REALV = 

...

0.


C     Open input and output files

...


...

      CALL PBOPEN(

...

U1, INFILE, 'r', IRET)
      

...

CALL CHECK(

...

IRET.NE.0, 

...

'

...

PBOPEN failed (r)')
      CALL PBOPEN(

...

U2, OUTFILE, 'w', IRET)
      

...

CALL CHECK(

...

IRET.NE.0, 

...

'

...

PBOPEN failed (w)')


C     Start of loop 

...

on 

...

input 

...

fields
      PRINT *, 'Start 

...

interpolation...'
      N = 0
 220  CONTINUE
      

...

N = 

...

N + 1

...


C

...

     Read next 

...

field
      

...

CALL PBGRIB(

...

U1, INGRIB, JPGRIB*JPBYTES, 

...

INLEN, IRET)

...

      IF (

...

IRET.EQ.-1

...

) THEN
        IRET = 0
        GOTO 

...

290
      ENDIF
      

...

CALL CHECK(

...

IRET.NE.0

...

, '

...

PBGRIB failed')

...


C     

...

Interpolate

...


      

...

PRINT 

...

*,

...

 '

...

Interpolate 

...

field 

...

#', 

...

N
      

...

OUTLEN = JPGRIB
      

...

IRET = INTF2(INGRIB,INLEN,

...

OUTGRIB,

...

OUTLEN)
      CALL 

...

CHECK(

...

IRET.NE.0, 

...

'INTF failed')

C     Write the new field 

...

to file
      IF (OUTLEN.GT.0) THEN
        CALL 

...

PBWRITE(U2, OUTGRIB, OUTLEN, IRET)
      

...

ELSE

...

        

...

PRINT 

...

*, 

...

'Output 

...

same 

...

as 

...

input'
        CALL PBWRITE(

...

U2, 

...

INGRIB, 

...

INLEN, IRET)
      ENDIF
      

...

CALL CHECK(

...

IRET.LT.

...

0, '

...

PBWRITE failed')

...


C     

...

Loop back for next 

...

field
      GOTO 

...

220

...


C     

...

Close

...

 

...

290  CONTINUE

...


      

...

CALL PBCLOSE(U1, IRET)
      CALL 

...

PBCLOSE(

...

U2,

...

 IRET)

      PRINT *, 'Interpolated ', 

...

(N-1), ' 

...

field(s).'
      END


C

...

     ------------------------------------------------------------------


      

...

SUBROUTINE CHECK(OOPS,MSG)
      IMPLICIT NONE
      LOGICAL OOPS
      

...

CHARACTER 

...

MSG*(*)
      IF (OOPS) THEN
        

...

PRINT 

...

*, 

...

MSG
        CALL 

...

EXIT(3)
      

...

ENDIF

...

      END