NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.

To learn about what's going on, see About the Archive Site.

[netcdfgroup] writing netcdf by f77

Dear Folks,
I am a newbie in netcdf, even in fortran77 programming. 
I try to make a netcdf file in f77 to support my Phd research. 
I modify an example f77 program as describe below:

==============================================
      program convert_U1M_netcdf
      implicit none
      include '/home/endros/netcdf/include/netcdf.inc'

C     This is the name of the data file we will create.
      character*(*) FILE_NAME
      parameter (FILE_NAME = 'home/endros/U1MP1d_MTH.nc')
      integer ncid

C     We are writing data, .....
C     timesteps of data.
      integer NDIMS, NRECS
      parameter (NDIMS = 3)
      integer NLATS, NLONS
      parameter (NLATS = 620, NLONS = 866, NRECS = 120)
      character*(*) LAT_NAME, LON_NAME, REC_NAME
      parameter (LAT_NAME = 'y', LON_NAME = 'x')
      parameter (REC_NAME = 'time')
      integer lon_dimid, lat_dimid, lvl_dimid, rec_dimid, nrec_dimid

C     The start and count arrays will tell the netCDF library where to
C     write our data.
      integer start(NDIMS), count(NDIMS)

C     These program variables hold the latitudes and longitudes.
      real lats(NLATS), lons(NLONS), day(NRECS)
      integer lon_varid, lat_varid, lvl_varid, rec_varid

C     We will create two netCDF variables, one each for temperature and
C     pressure fields.
      character*(*) ECM_NAME, NREC_NAME
      parameter (ECM_NAME='ssu')
      parameter (NREC_NAME='day')
      integer ecm_varid, nrec_varid
      integer dimids(NDIMS)

C     We recommend that each variable carry a "units" attribute.
      character*(*) UNITS
      parameter (UNITS = 'units')
      character*(*) ECM_UNITS,LAT_UNITS,LON_UNITS,REC_UNITS,NREC_UNITS
      parameter(ECM_UNITS='days',REC_UNITS='months',NREC_UNITS='mths')
      parameter (LAT_UNITS = 'degrees_north')
      parameter (LON_UNITS = 'degrees_east')
      character cyears*4, cmonths*2, cdays*2

C     Program variables to hold the data we will write out. 
      real ecm_out(NLONS, NLATS)

C     Use these to construct some latitude and longitude data for this
C     example.
      integer START_LAT, START_LON, START_DAY
      parameter (START_LAT = 10.42, START_LON = 107.92)
      parameter (START_DAY = 1)

C     Loop indices.
      integer rc, lat, lon, rec,iyy,isyy,ieyy,imm,i,j,tss,nrec

C     Error handling.
      integer retval

C     Create pretend data. If this wasn't an example program, we would
C     have some real data to write, for example, model output.
      do lat = 1, NLATS
         lats(lat) = START_LAT + (lat - 1) * (1/111.12)
      end do
      do lon = 1, NLONS
         lons(lon) = START_LON + (lon - 1) * (1/111.12)
      end do

      do rc = 1, NRECS
         day(rc) = START_DAY + (rc - 1) 
      end do

C     Create the file. 
      retval = nf_create(FILE_NAME, nf_clobber, ncid)
      if (retval .ne. nf_noerr) call handle_err(retval)

C     Define the dimensions. 
      retval = nf_def_dim(ncid, LAT_NAME, NLATS, lat_dimid)
      if (retval .ne. nf_noerr) call handle_err(retval)
      retval = nf_def_dim(ncid, LON_NAME, NLONS, lon_dimid)
      if (retval .ne. nf_noerr) call handle_err(retval)
      retval = nf_def_dim(ncid, REC_NAME, NRECS, rec_dimid)
      if (retval .ne. nf_noerr) call handle_err(retval)

C     Define the coordinate variables. 

      retval = nf_def_var(ncid, LAT_NAME, NF_DOUBLE, 1, lat_dimid, 
     +     lat_varid)
      if (retval .ne. nf_noerr) call handle_err(retval)
      retval = nf_def_var(ncid, LON_NAME, NF_DOUBLE, 1, lon_dimid, 
     +     lon_varid)
      if (retval .ne. nf_noerr) call handle_err(retval)

C     Assign units attributes to coordinate variables.
      retval = nf_put_att_text(ncid, lat_varid, UNITS, len(LAT_UNITS), 
     +     LAT_UNITS)
      if (retval .ne. nf_noerr) call handle_err(retval)
      retval = nf_put_att_text(ncid, lon_varid, UNITS, len(LON_UNITS), 
     +     LON_UNITS)
      if (retval .ne. nf_noerr) call handle_err(retval)

C     The dimids array is used to pass the dimids of the dimensions of
C     the netCDF variables. 
      dimids(1) = lon_dimid
      dimids(2) = lat_dimid
      dimids(3) = rec_dimid

C     Define the netCDF variables for the pressure and temperature data.
      retval = nf_def_var(ncid, ECM_NAME, NF_DOUBLE, NDIMS, dimids, 
     +     ecm_varid)
      if (retval .ne. nf_noerr) call handle_err(retval)

      retval = nf_def_var(ncid, NREC_NAME, NF_DOUBLE, NDIMS, dimids, 
     +     nrec_varid)
      if (retval .ne. nf_noerr) call handle_err(retval)


C     Assign units attributes to the netCDF variables.
      retval = nf_put_att_text(ncid, ecm_varid, UNITS, len(ECM_UNITS), 
     +     ECM_UNITS)
      if (retval .ne. nf_noerr) call handle_err(retval)

      retval = nf_put_att_text(ncid, nrec_varid, UNITS, len(NREC_UNITS), 
     +     NREC_UNITS)
      if (retval .ne. nf_noerr) call handle_err(retval)


C     End define mode.
      retval = nf_enddef(ncid)
      if (retval .ne. nf_noerr) call handle_err(retval)

C     Write the coordinate variable data. 
      retval = nf_put_var_real(ncid, lat_varid, lats)
      if (retval .ne. nf_noerr) call handle_err(retval)
      retval = nf_put_var_real(ncid, lon_varid, lons)
      if (retval .ne. nf_noerr) call handle_err(retval)

C     These settings tell netcdf to write one timestep of data. 
      count(1) = NLONS
      count(2) = NLATS
      count(3) = 1
      start(1) = 1
      start(2) = 1
      
C     Write the pretend data. 
c----collect variable output in (i,j)--------------
      isyy=1993
      ieyy=2002
      
      do 9000 iyy=isyy,ieyy
         do 8900 imm=1,12
            
            write(cyears,'(i4.4)') iyy
            write(cmonths,'(i2.2)') imm
            
            print *,'proc: mo-',cmonths,'yr-',cyears

           open(45,file='/work/endros/CSCR'
     &           //'/U1M_'
     &           //cyears//cmonths//'.dat'
     &           ,form='unformatted'
     &           ,access='direct'
     &           ,recl=NLONS*NLATS)
            read(45,rec=1) ((ecm_out(i,j),i=1,NLONS),j=1,NLATS)
            close(45)

      print *, 'start saving netcdf...wait...!!!'

      do rec=1,NRECS
         start(3) = rec
         retval = nf_put_vara_real(ncid, ecm_varid, start, count, 
     +        ecm_out)
         if (retval .ne. nf_noerr) call handle_err(retval)
      enddo
      
 8900    enddo 
 9000 enddo

C     Close the file. 
      retval = nf_close(ncid)
      if (retval .ne. nf_noerr) call handle_err(retval)
   
      print *,'*** SUCCESS writing .....: ', FILE_NAME, '!'
      end

      subroutine handle_err(errcode)
      implicit none
      include '/home/endros/netcdf/include/netcdf.inc'
      integer errcode

      print *, 'Error: ', nf_strerror(errcode)
      stop 2
      end

=========================================
Actually, this works well and I got a nc file. After I check the header

$ncdump -h U1MP1d_MTH.nc

netcdf U1MP1d_MTH {
dimensions:
        y = 620 ;
        x = 866 ;
        time = 120 ;

variables:
        double y(y) ;
                y:units = "degrees_north" ;
        double x(x) ;
                x:units = "degrees_east" ;
        double ssu(time, y, x) ;
                ssu:units = "days" ;
        double *day(time, y, x)* ;
                day:units = "mths" ;
}

--->> a question is how to modify the above program in which I will get the
variable "day" is only depend on "time". I want to make  *"day(time)"* only.

Sorry, My english limited that why i cannot really understand the example
f77 program.

Any helps and clues. I am really apreciate it.

Endro
Phd Student, Japan







--
View this message in context: 
http://netcdf-group.1586084.n2.nabble.com/writing-netcdf-by-f77-tp7574833.html
Sent from the NetCDF Group mailing list archive at Nabble.com.



  • 2013 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdfgroup archives: