File: tst_io.f90

package info (click to toggle)
netcdf-fortran 4.4.4%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 8,420 kB
  • ctags: 8,797
  • sloc: fortran: 51,087; f90: 20,357; sh: 11,601; ansic: 7,034; makefile: 548; pascal: 313; xml: 173
file content (185 lines) | stat: -rw-r--r-- 6,933 bytes parent folder | download | duplicates (4)
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
! Copyright 2007, UCAR/Unidata. See netcdf/COPYRIGHT file for copying
! and redistribution conditions.

! This program tests io times with large files (> 4 GB) in
! netCDF-4. This is user-contributed code.

! $Id: tst_io.f90,v 1.7 2009/02/17 13:17:18 ed Exp $
program tst_io
  use netcdf ! access to netcdf module
  implicit none
  integer, parameter :: prsz1 = 50, prsz2 = 50, &
       prsz3 = 50, prsz4 = 50, repct = 10
  integer :: i1, i2, i3, i4, j, k, ticksPerSec
  real :: psr
  integer :: clockRate
  integer :: start, now, wrint1, ncint1, wrint2, ncint2, &
       wrint3, ncint3, iosb, iosn, size
  real, dimension (prsz1, prsz2, prsz3, prsz4) :: x
  character(len = *), parameter :: nclFilenm1 = 'tst_io1.nc', &
       nclFilenm2 = 'tst_io2.nc', nclFilenm3 = 'tst_io3.nc', &
       nclFilenm4 = 'tst_io4.nc', nclFilenm5 = 'tst_io5.nc', &
       nclFilenm6 = 'tst_io6.nc', nclFilenm7 = 'tst_io7.nc', &
       nclFilenm8 = 'tst_io8.nc', nclFilenm9 = 'tst_io9.nc', &
       nclFilenm10 = 'tst_io10.nc', nclFilenm11 = 'tst_io11.nc'
  ! needed for netcdf
  integer :: ncid, x1id, x2id, x3id, x4id, vrid
  integer :: vrids, vridt, vridu, vridv, vridw, vridx, vridy, vridz

  psr = 1.7/real(prsz1)

  print *, "Starting data initialization."
  size = (prsz1 * prsz2 * prsz3 * prsz4 )/ 250000
  do i1 = 1, prsz1
     do i2 = 1, prsz2
        do i3 = 1, prsz3 ! Jackson Pollock it is not
           do i4 = 1, prsz4
              x(i1, i2, i3, i4) = sin(i1*psr)*(0.5 + cos(i2*psr))+(psr/i3)+ i4/(10.0*prsz4)
           enddo
        enddo
     enddo
  enddo
  call system_clock(start, ticksPerSec)
  clockRate = 1000/ticksPerSec
  print 5, size, 1000.0/real(ticksPerSec)
5 format("Array sizes =", i4, "MB. Clock resolution = ", f6.3, " ms."/)

  ! First the binary writes
  call system_clock(start, ticksPerSec)
  write(1, iostat = iosb) x
  call system_clock(now)
  wrint1 = now - start
  call check (iosb, 1)
  print 1, size, "MB","binary write = ", wrint1 * clockRate
1 format("Time for", i5, a, a26, i6, " msec. ")

  call system_clock(start)
  do i1 = 1, repct
     rewind (2, iostat = iosb)
     call check (iosb, 2)
     write(2, iostat = iosb) x
     call check (iosb, 3)
  enddo
  call system_clock(now)
  wrint2 = now - start
  call check (iosb, 4)
  close(2, iostat = iosb)
  call check (iosb, 5)
  print 2, size, "MB", repct, " binary rewind/writes = ", wrint2 * clockRate
2 format("Time for", i5, a, i3, a23, i6," msec. ", a, i6)
  close(1, iostat = iosb)

  call system_clock(start)
  write(13, iostat = iosb) x
  call check (iosb, 6)
  write(14, iostat = iosb) x
  call check (iosb, 7)
  write(15, iostat = iosb) x
  call check (iosb, 8)
  write(16, iostat = iosb) x
  call check (iosb, 9)
  write(17, iostat = iosb) x
  call check (iosb, 10)
  write(18, iostat = iosb) x
  call check (iosb, 11)
  write(19, iostat = iosb) x
  call check (iosb, 12)
  write(20, iostat = iosb) x
  call check (iosb, 13)
  call system_clock(now)
  wrint3 = now - start
  print 2, size, "MB", 8, " binary file writes = ", wrint3 * clockRate
  do i1 = 1, 8
     close(12 + i1, iostat = iosb)
     call check (iosb, 14)
  enddo

  ! Next the netCDF writes
  call setupNetCDF (nclFilenm1, ncid, vrid, x, prsz1, prsz2, prsz3, prsz4, &
       x1id, x2id, x3id, x4id, NF90_CLOBBER, 20)
  call system_clock(start)
  call check (NF90_PUT_VAR(ncid, vrid, x), 18)
  call system_clock(now)
  ncint1 = now - start
  print 3, size, "MB"," netcdf write = ", ncint1 * clockRate, &
       real(ncint1)/real (wrint1)
3 format("Time for", i5, a, a25, i7, " msec. Spd ratio = ", f5.2)

  call check (NF90_CLOSE(ncid), 14)

  call system_clock(start)
  do i1 = 1, repct
     call setupNetCDF (nclFilenm1, ncid, vrid, x, prsz1, prsz2, prsz3, prsz4, &
          x1id, x2id, x3id, x4id, NF90_CLOBBER, 130)
     call check (NF90_PUT_VAR(ncid, vrid, x), 23 + i1)
     call check (NF90_CLOSE(ncid), 15)
  enddo
  call system_clock(now)
  ncint2 = now - start
  print 4, size, repct, " repeated netcdf writes = ", ncint2 * clockRate, &
       real(ncint2)/real(wrint2);
4 format("Time for", i5, "MB", i3, a22, i7, " msec. Spd ratio = ", f5.2)

!   call system_clock(start)
!   call setupNetCDF (nclFilenm3, ncid, vrids, s, prsz1, prsz2, prsz3, prsz4, &
!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 20)
!   call setupNetCDF (nclFilenm4, ncid, vridt, t, prsz1, prsz2, prsz3, prsz4, &
!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 30)
!   call setupNetCDF (nclFilenm5, ncid, vridu, u, prsz1, prsz2, prsz3, prsz4, &
!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 40)
!   call setupNetCDF (nclFilenm6, ncid, vridv, v, prsz1, prsz2, prsz3, prsz4, &
!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 50)
!   call setupNetCDF (nclFilenm7, ncid, vridw, w, prsz1, prsz2, prsz3, prsz4, &
!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 60)
!   call setupNetCDF (nclFilenm8, ncid, vridx, x, prsz1, prsz2, prsz3, prsz4, &
!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 70)
!   call setupNetCDF (nclFilenm9, ncid, vridy, y, prsz1, prsz2, prsz3, prsz4, &
!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 80)
!   call setupNetCDF (nclFilenm10, ncid, vridz, z, prsz1, prsz2, prsz3, prsz4, &
!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 90)
!   call check (NF90_PUT_VAR(ncid, vrids, s), 118)
!   call check (NF90_PUT_VAR(ncid, vridt, t), 119)
!   call check (NF90_PUT_VAR(ncid, vridu, u), 120)
!   call check (NF90_PUT_VAR(ncid, vridv, v), 121)
!   call check (NF90_PUT_VAR(ncid, vridw, w), 122)
!   call check (NF90_PUT_VAR(ncid, vridx, x), 123)
!   call check (NF90_PUT_VAR(ncid, vridy, y), 124)
!   call check (NF90_PUT_VAR(ncid, vridz, z), 125)
!   call system_clock(now)
!   ncint3 = now - start
!   call check (NF90_CLOSE(ncid), 16)
!   print 4, size, 8, " netcdf file writes = ", ncint3 * clockRate, &
!        real(ncint3)/real(wrint3);

contains
  subroutine check (st, n) ! checks the return error code
    integer, intent (in) :: st, n
    if ((n < 10.and.st /= 0).or.(n > 10.and.st /= NF90_noerr))then
       print *, "I/O error at", n, " status = ", st
       stop 2
    endif
  end subroutine check

  subroutine setupNetCDF(fn, nc, vr, vrnam, d1, d2, d3, d4, do1, do2, &
       do3, do4, stat, deb)
    integer, intent(in) :: d1, d2, d3, d4, stat, deb
    integer, intent(out) :: do1, do2, do3, do4, vr
    integer, intent(inout) :: nc
    integer, dimension(4) :: dimids (4)

    character(len = *), intent(in) :: fn
    real, dimension (d1, d2, d3, d4), intent (in) :: vrnam

    call check (NF90_CREATE (fn, stat, nc), deb + 1)
    call check (NF90_DEF_DIM(nc, "d1", d1, do1), deb + 2)
    call check (NF90_DEF_DIM(nc, "d2", d2, do2), deb + 3)
    call check (NF90_DEF_DIM(nc, "d3", d3, do3), deb + 4)
    call check (NF90_DEF_DIM(nc, "d4", d4, do4), deb + 5)

    dimids = (/ do1, do2, do3, do4 /)
    call check (NF90_DEF_VAR(nc, "data", NF90_REAL, dimids, vr), deb + 6)
    call check (NF90_ENDDEF (nc), deb + 7)

  end subroutine setupNetCDF

end program tst_io