program main
      include 'netcdf.inc'
* error status return
      integer stat
* netCDF ncid
      integer  ncid

* dimension lengths
      integer lat_len
      parameter (lat_len = 6)
      integer lon_len
      parameter (lon_len = 4)
      integer time_len
      parameter (time_len = NF_UNLIMITED)
* dimension ids
      integer lat_dim
      integer lon_dim
      integer time_dim

* variable ids
      integer lat_id;
      integer lon_id;
      integer time_id;
      integer pr_id;

* rank (number of dimensions) for each variable
      integer lat_rank
      parameter (lat_rank = 1)
      integer lon_rank
      parameter (lon_rank = 1)
      integer time_rank
      parameter (time_rank = 1)
      integer pr_rank
      parameter (pr_rank = 3)

* variable shapes
      integer lat_dims(lat_rank)
      integer lon_dims(lon_rank)
      integer time_dims(time_rank)
      integer pr_dims(pr_rank)

* variable declarations
      real  lat(6)
      real  lon(4)
* attribute vectors
      integer textval(1)


* enter define mode
      stat = nf_create('mslp.nc', nf_clobber, ncid);
      call check_err(stat)
* define dimensions
      stat = nf_def_dim(ncid, 'lat', lat_len, lat_dim);
      call check_err(stat)
      stat = nf_def_dim(ncid, 'lon', lon_len, lon_dim);
      call check_err(stat)
      stat = nf_def_dim(ncid, 'time', time_len, time_dim);
      call check_err(stat)
* define variables

      lat_dims(1) = lat_dim
      stat = nf_def_var(ncid, 'lat', nf_float, lat_rank, lat_dims, lat_i
     1d);
      call check_err(stat)

      lon_dims(1) = lon_dim
      stat = nf_def_var(ncid, 'lon', nf_float, lon_rank, lon_dims, lon_i
     1d);
      call check_err(stat)

      time_dims(1) = time_dim
      stat = nf_def_var(ncid, 'time', nf_double, time_rank, time_dims, t
     1ime_id);
      call check_err(stat)

      pr_dims(1) = lon_dim
      pr_dims(2) = lat_dim
      pr_dims(3) = time_dim
      stat = nf_def_var(ncid, 'pr', nf_float, pr_rank, pr_dims, pr_id);
      call check_err(stat)
* assign global attributes
* define title
      stat = nf_put_att_text(ncid, NF_GLOBAL, 'title', 20, 'example for 
     1workshop')
      call check_err(stat)

* assign per-variable attributes
* define units
      stat = nf_put_att_text(ncid, lat_id, 'units', 13, 'degrees_north')
      call check_err(stat)
* define units
      stat = nf_put_att_text(ncid, lon_id, 'units', 12, 'degrees_east')
      call check_err(stat)
* define units
      stat = nf_put_att_text(ncid, time_id, 'units', 24, 'seconds since 
     12009-01-01')
      call check_err(stat)
* define standard_name
      stat = nf_put_att_text(ncid, pr_id, 'standard_name', 25, 'air_pres
     1sure_at_sea_level')
      call check_err(stat)
* define units
      stat = nf_put_att_text(ncid, pr_id, 'units', 3, 'hPa')
      call check_err(stat)

* leave define mode
      stat = nf_enddef(ncid);
      call check_err(stat)
* assign scalar and fixed dimension variable data



* perform variable data writes
      call write_lat(ncid,lat_id)
      call write_lon(ncid,lon_id)
      call write_time(ncid,time_id)
      call write_pr(ncid,pr_id)
      stat = nf_close(ncid)
      call check_err(stat)
      end


      subroutine write_lat(ncid,lat_id)
      integer ncid
      integer lat_id
      include 'netcdf.inc'
      integer stat

      integer lat_start(1)
      integer lat_count(1)

      real  lat(6)
      data lat /25, 30, 35, 40, 45, 50/
      lat_start(1) = 1
      lat_count(1) = 6
      stat = nf_put_vara_real(ncid, lat_id, lat_start, lat_count, lat)
      call check_err(stat)
      end

      subroutine write_lon(ncid,lon_id)
      integer ncid
      integer lon_id
      include 'netcdf.inc'
      integer stat

      integer lon_start(1)
      integer lon_count(1)

      real  lon(4)
      data lon /-125, -110, -95, -80/
      lon_start(1) = 1
      lon_count(1) = 4
      stat = nf_put_vara_real(ncid, lon_id, lon_start, lon_count, lon)
      call check_err(stat)
      end

      subroutine write_time(ncid,time_id)
      integer ncid
      integer time_id
      include 'netcdf.inc'
      integer stat

      integer time_start(1)
      integer time_count(1)

      double precision time(2)
      data time /7776000, 15552000/
      time_start(1) = 1
      time_count(1) = 2
      stat = nf_put_vara_double(ncid, time_id, time_start, time_count, t
     1ime)
      call check_err(stat)
      end

      subroutine write_pr(ncid,pr_id)
      integer ncid
      integer pr_id
      include 'netcdf.inc'
      integer stat

      integer pr_start(3)
      integer pr_count(3)

      real  pr(4,6,2)
      data pr /900.5, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 
     1911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 9
     172, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 98
     15, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995/
      pr_start(1) = 1
      pr_start(2) = 1
      pr_start(3) = 1
      pr_count(1) = 4
      pr_count(2) = 6
      pr_count(3) = 2
      stat = nf_put_vara_real(ncid, pr_id, pr_start, pr_count, pr)
      call check_err(stat)
      end

      subroutine check_err(stat)
      integer stat
      include 'netcdf.inc'
      if (stat .ne. NF_NOERR) then
      print *, nf_strerror(stat)
      stop
      endif
      end