|
Appendix 1: Readnet.for
created from cdf2fortran
Sample file produced by
the cdf2fortran utility with the netCDF file 'rcm00683.cdf' found in the WOCE
CD ROM 2. Note that this fortran routine can be easily generalised to read all
of the cm data records on this CD set.
c-----------------------------------------------------------------------
c
c readnet.f
c This file is a fortran template file
designed to read the given
c netCDF file into memory.
c
c History:
c Date Name Action
c --------- ------------ --------------------------------------------
c ?? ??? ?? cids Created.
c
c-----------------------------------------------------------------------
c Do not forget to include the -I path_to_netcdf_includes
in your
c compile statement
c Required includes.
c include 'netcdf.inc'
include '/usr/local/netcdf/include/netcdf.inc'
c Define Variables.
c Variable ids run sequentially from
1 to nvars = 08
parameter (nvars = 8) ! number of variables
parameter (nrec= 36434) ! change this
'to generalize
parameter (ndims = 1) ! number of dimensions
parameter (itime = 36434)
integer*4 rcode ! error code
integer*4 recdim ! record dimension
real*8 date(nrec)
real*8 time(nrec)
real*4 speed(nrec)
real*4 direction(nrec)
real*4 u(nrec)
real*4 v(nrec)
real*4 temperature(nrec)
real*4 pressure(nrec)
integer*4 start(ndims) ! hyperslab starting
index
integer*4 count(ndims) ! hyperslab count
from start
integer vdims(ndims) ! max # of var dims
character*1024 strbuf ! string buffer
for var
! and attr names
c Open netCDF file.
ncid=ncopn('rcm00683.cdf',ncnowrit,rcode)
c Get info on the record dimension for
this file.
call ncinq(ncid,ndims,nvars,ngatts,recdim,rcode)
call ncdinq(ncid,recdim,strbuf,nrecs,rcode)
c nrecs now contains the # of records
for this file
c Retrieve data for date variable.
call ncvinq(ncid, 1,strbuf,nctype,nvdim,vdims,nvatts,rcode)
lenstr=1
do j=1,nvdim
call ncdinq(ncid,vdims(j),strbuf,ndsize,rcode)
lenstr=lenstr*ndsize
start(j)=1
count(j)=ndsize
end do
call ncvgt(ncid, 1,start,count,date,rcode)
c Retrieve data for time variable.
call ncvinq(ncid, 2,strbuf,nctype,nvdim,vdims,nvatts,rcode)
lenstr=1
do j=1,nvdim
call ncdinq(ncid,vdims(j),strbuf,ndsize,rcode)
lenstr=lenstr*ndsize
start(j)=1
count(j)=ndsize
end do
call ncvgt(ncid, 2,start,count,time,rcode)
c Retrieve data for speed variable.
call ncvinq(ncid, 3,strbuf,nctype,nvdim,vdims,nvatts,rcode)
lenstr=1
do j=1,nvdim
call ncdinq(ncid,vdims(j),strbuf,ndsize,rcode)
lenstr=lenstr*ndsize
start(j)=1
count(j)=ndsize
end do
call ncvgt(ncid, 3,start,count,speed,rcode)
c Retrieve data for direction variable.
call ncvinq(ncid, 4,strbuf,nctype,nvdim,vdims,nvatts,rcode)
lenstr=1
do j=1,nvdim
call ncdinq(ncid,vdims(j),strbuf,ndsize,rcode)
lenstr=lenstr*ndsize
start(j)=1
count(j)=ndsize
end do
call ncvgt(ncid, 4,start,count,direction,rcode)
c Retrieve data for u variable.
call ncvinq(ncid, 5,strbuf,nctype,nvdim,vdims,nvatts,rcode)
lenstr=1
do j=1,nvdim
call ncdinq(ncid,vdims(j),strbuf,ndsize,rcode)
lenstr=lenstr*ndsize
start(j)=1
count(j)=ndsize
end do
call ncvgt(ncid, 5,start,count,u,rcode)
c Retrieve data for v variable.
call ncvinq(ncid, 6,strbuf,nctype,nvdim,vdims,nvatts,rcode)
lenstr=1
do j=1,nvdim
call ncdinq(ncid,vdims(j),strbuf,ndsize,rcode)
lenstr=lenstr*ndsize
start(j)=1
count(j)=ndsize
end do
call ncvgt(ncid, 6,start,count,v,rcode)
c Retrieve data for temperature variable.
call ncvinq(ncid, 7,strbuf,nctype,nvdim,vdims,nvatts,rcode)
lenstr=1
do j=1,nvdim
call ncdinq(ncid,vdims(j),strbuf,ndsize,rcode)
lenstr=lenstr*ndsize
start(j)=1
count(j)=ndsize
end do
call ncvgt(ncid, 7,start,count,temperature,rcode)
c Retrieve data for pressure variable.
call ncvinq(ncid, 8,strbuf,nctype,nvdim,vdims,nvatts,rcode)
lenstr=1
do j=1,nvdim
call ncdinq(ncid,vdims(j),strbuf,ndsize,rcode)
lenstr=lenstr*ndsize
start(j)=1
count(j)=ndsize
end do
call ncvgt(ncid, 8,start,count,pressure,rcode)
c ******************************************
c Begin writing statements to use the
data.
c ******************************************
c End Program.
stop
end
|