File: read_from_file.f90

package info (click to toggle)
eccodes 2.20.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 400,332 kB
  • sloc: ansic: 167,977; makefile: 21,348; sh: 10,719; f90: 5,927; python: 4,831; perl: 3,031; javascript: 1,427; yacc: 818; lex: 356; awk: 66
file content (97 lines) | stat: -rw-r--r-- 3,006 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
! (C) Copyright 2005- ECMWF.
!
! This software is licensed under the terms of the Apache Licence Version 2.0
! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
!
! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
!
! Get message lengths using two different interfaces
! See GRIB-292
!
program read_from_file
use eccodes
  implicit none
  character(len=32) :: input_grib_file
  integer,dimension(26) :: message_lengths  ! expected message lengths

  input_grib_file = '../../data/v.grib2'
  message_lengths = (/ 95917, 96963, 97308, 97386, 97215, 97440, 98451, 98629, 98448, &
                       99186, 97517, 97466, 99307, 98460,101491, 99361,100292, 96838, &
                       91093, 83247, 78244, 74872, 72663, 69305, 69881, 68572 /)

  ! Get the grib message length using two different interfaces
  call read_using_size_t()
  call read_using_integer()
  print *,'Passed'

contains
!======================================
subroutine read_using_size_t
  implicit none
  integer :: size,intsize
  parameter (intsize=100000,size=intsize*4)
  integer            :: ifile
  integer            :: iret
  integer            :: count1=0
  integer(kind=4),dimension(intsize) :: buffer
  integer(kind=kindOfSize_t) :: len1 ! For large messages

  ifile=5
  call codes_open_file(ifile, input_grib_file, 'r')

  len1=size
  call codes_read_from_file(ifile, buffer, len1, iret)

  do while (iret==CODES_SUCCESS)
    count1=count1+1
    if (len1 /= message_lengths(count1)) then
        write(*,'(a,i3,a,i8,a,i8)') 'Error: Message #',count1,' length=', len1,'. Expected=',message_lengths(count1)
        stop
    end if
    len1=size
    call codes_read_from_file(ifile, buffer, len1, iret)
  end do

  if (iret/=CODES_END_OF_FILE) then
    call codes_check(iret,'read_from_file','')
  endif
  call codes_close_file(ifile)

end subroutine read_using_size_t

!======================================
subroutine read_using_integer
  implicit none
  integer :: size,intsize
  parameter (intsize=100000,size=intsize*4)
  integer            :: ifile
  integer            :: iret
  integer            :: count1=0
  integer(kind=4),dimension(intsize) :: buffer
  integer            :: len1

  ifile=5
  call codes_open_file(ifile, input_grib_file, 'r')

  len1=size
  call codes_read_from_file(ifile, buffer, len1, iret)

  do while (iret==CODES_SUCCESS)
    count1=count1+1
    if (len1 /= message_lengths(count1)) then
        write(*,'(a,i3,a,i8,a,i8)') 'Error: Message #',count1,' length=', len1,'. Expected=',message_lengths(count1)
        stop
    end if
    len1=size
    call codes_read_from_file(ifile, buffer, len1, iret)
  end do

  if (iret/=CODES_END_OF_FILE) then
    call codes_check(iret,'read_from_file','')
  endif
  call codes_close_file(ifile)

end subroutine read_using_integer
!======================================
end program