program test_netcdf
! -----------------------------------------------------------------------
! The drunken divers testcase
! some lines are stolen from unidata - netcdf testprograms
! -----------------------------------------------------------------------
use netcdf
implicit none
character*256 :: outputfile='divers_birth_day_drink.nc'
integer :: stdout=6
! include 'netcdf.inc'
integer :: ncid, k
integer :: latdim, londim, depthdim, timedim
integer :: vardims(4)
integer :: latid, lonid, depthid, timeid, ndepth=5
integer :: varid
real :: depth(5), drinks(1,1,5,1), degeast, degnorth
real*8 :: rdays
character (len = *), parameter :: varunit = "glasses"
character (len = *), parameter :: varname = "number of drinks"
character (len = *), parameter :: varshort = "drinks"
character (len = *), parameter :: units = "units"
character (len = *), parameter :: long_name = "long_name"
character (len = *), parameter :: lat_name = "latitude"
character (len = *), parameter :: lon_name = "longitude"
character (len = *), parameter :: lat_units = "degrees_north"
character (len = *), parameter :: lon_units = "degrees_east"
character (len = *), parameter :: depth_units = "m"
character (len = *), parameter :: time_units = "days since 2000-01-01 00:00:00"
character (len = *), parameter :: origin = "time_origin"
character (len = *), parameter :: origin_val = "1-jan-2000 00:00:00"
! -----------------------------------------------------------------------
! define where and when the diver dives and
! in which depth he has how much birthday drinks
! -----------------------------------------------------------------------
degnorth = 57.02
degeast = 20.3
rdays = 10.0
do k=1, 5
depth(k) = float(k)*float(k)
drinks(1,1,k,1) = depth(k)
enddo
! -----------------------------------------------------------------------
! create the file
! -----------------------------------------------------------------------
call check( nf90_create(outputfile, nf90_clobber, ncid))
write(stdout,*) 'file ',trim(outputfile),' has been created '
! -----------------------------------------------------------------------
! define axis
! -----------------------------------------------------------------------
call check( nf90_def_dim(ncid, 'longitude', 1, londim))
call check( nf90_def_dim(ncid, 'latitude' , 1, latdim))
call check( nf90_def_dim(ncid, 'depth' , ndepth, depthdim))
call check( nf90_def_dim(ncid, 'time' , nf90_unlimited, timedim))
call check( nf90_def_var(ncid, lon_name, nf90_real, londim, lonid))
call check( nf90_def_var(ncid, lat_name, nf90_real, latdim, latid))
call check( nf90_def_var(ncid, 'depth', nf90_real, depthdim, depthid))
call check( nf90_def_var(ncid, 'time', nf90_real, timedim, timeid))
call check( nf90_put_att(ncid, latid, units, lat_units) )
call check( nf90_put_att(ncid, lonid, units, lon_units) )
call check( nf90_put_att(ncid, depthid, units, depth_units))
call check( nf90_put_att(ncid, timeid, units, time_units))
call check( nf90_put_att(ncid, timeid, origin, origin_val))
vardims(1) = londim
vardims(2) = latdim
vardims(3) = depthdim
vardims(4) = timedim
! -----------------------------------------------------------------------
! define variables
! -----------------------------------------------------------------------
call check( nf90_def_var(ncid, trim(varshort), nf90_real, vardims, varid))
call check( nf90_put_att(ncid, varid, units ,trim(varunit)))
call check( nf90_put_att(ncid, varid, long_name, trim(varname)))
call check( nf90_enddef(ncid))
! -----------------------------------------------------------------------
! now write something
! -----------------------------------------------------------------------
call check( nf90_put_var(ncid, latid, degnorth))
call check( nf90_put_var(ncid, lonid, degeast))
call check( nf90_put_var(ncid, depthid, depth))
call check( nf90_put_var(ncid, timeid, rdays))
call check( nf90_put_var(ncid, varid, drinks))
!-----------------------------------------------------------------------
! ready
!-----------------------------------------------------------------------
call check( nf90_close(ncid))
contains
subroutine check(status)
integer, intent ( in) :: status
if(status /= nf90_noerr) then
print *, trim(nf90_strerror(status))
stop "stopped"
end if
end subroutine check
end program test_netcdf