1 | ! This is part of the netCDF package. |
---|
2 | ! Copyright 2006 University Corporation for Atmospheric Research/Unidata. |
---|
3 | ! See COPYRIGHT file for conditions of use. |
---|
4 | |
---|
5 | ! This is a very simple example which writes a 2D array of |
---|
6 | ! sample data. To handle this in netCDF we create two shared |
---|
7 | ! dimensions, "x" and "y", and a netCDF variable, called "data". |
---|
8 | |
---|
9 | ! This example demonstrates the netCDF Fortran 90 API. This is part |
---|
10 | ! of the netCDF tutorial, which can be found at: |
---|
11 | ! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial |
---|
12 | |
---|
13 | ! Full documentation of the netCDF Fortran 90 API can be found at: |
---|
14 | ! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90 |
---|
15 | |
---|
16 | ! $Id: simple_xy_wr.f90,v 1.7 2006/12/09 18:44:58 russ Exp $ |
---|
17 | |
---|
18 | program simple_xy_wr |
---|
19 | use netcdf |
---|
20 | implicit none |
---|
21 | |
---|
22 | ! This is the name of the data file we will create. |
---|
23 | character (len = *), parameter :: FILE_NAME = "simple_xy.nc" |
---|
24 | |
---|
25 | ! We are writing 2D data, a 6 x 12 grid. |
---|
26 | integer, parameter :: NDIMS = 2 |
---|
27 | integer, parameter :: NX = 6, NY = 12 |
---|
28 | |
---|
29 | ! When we create netCDF files, variables and dimensions, we get back |
---|
30 | ! an ID for each one. |
---|
31 | integer :: ncid, varid, dimids(NDIMS) |
---|
32 | integer :: x_dimid, y_dimid |
---|
33 | |
---|
34 | ! This is the data array we will write. It will just be filled with |
---|
35 | ! a progression of integers for this example. |
---|
36 | integer :: data_out(NY, NX) |
---|
37 | |
---|
38 | ! Loop indexes, and error handling. |
---|
39 | integer :: x, y |
---|
40 | |
---|
41 | ! Create some pretend data. If this wasn't an example program, we |
---|
42 | ! would have some real data to write, for example, model output. |
---|
43 | do x = 1, NX |
---|
44 | do y = 1, NY |
---|
45 | data_out(y, x) = (x - 1) * NY + (y - 1) |
---|
46 | end do |
---|
47 | end do |
---|
48 | |
---|
49 | ! Always check the return code of every netCDF function call. In |
---|
50 | ! this example program, wrapping netCDF calls with "call check()" |
---|
51 | ! makes sure that any return which is not equal to nf90_noerr (0) |
---|
52 | ! will print a netCDF error message and exit. |
---|
53 | |
---|
54 | ! Create the netCDF file. The nf90_clobber parameter tells netCDF to |
---|
55 | ! overwrite this file, if it already exists. |
---|
56 | call check( nf90_create(FILE_NAME, NF90_CLOBBER, ncid) ) |
---|
57 | |
---|
58 | ! Define the dimensions. NetCDF will hand back an ID for each. |
---|
59 | call check( nf90_def_dim(ncid, "x", NX, x_dimid) ) |
---|
60 | call check( nf90_def_dim(ncid, "y", NY, y_dimid) ) |
---|
61 | |
---|
62 | ! The dimids array is used to pass the IDs of the dimensions of |
---|
63 | ! the variables. Note that in fortran arrays are stored in |
---|
64 | ! column-major format. |
---|
65 | dimids = (/ y_dimid, x_dimid /) |
---|
66 | |
---|
67 | ! Define the variable. The type of the variable in this case is |
---|
68 | ! NF90_INT (4-byte integer). |
---|
69 | call check( nf90_def_var(ncid, "data", NF90_INT, dimids, varid) ) |
---|
70 | |
---|
71 | ! End define mode. This tells netCDF we are done defining metadata. |
---|
72 | call check( nf90_enddef(ncid) ) |
---|
73 | |
---|
74 | ! Write the pretend data to the file. Although netCDF supports |
---|
75 | ! reading and writing subsets of data, in this case we write all the |
---|
76 | ! data in one operation. |
---|
77 | call check( nf90_put_var(ncid, varid, data_out) ) |
---|
78 | |
---|
79 | ! Close the file. This frees up any internal netCDF resources |
---|
80 | ! associated with the file, and flushes any buffers. |
---|
81 | call check( nf90_close(ncid) ) |
---|
82 | |
---|
83 | print *, "*** SUCCESS writing example file simple_xy.nc! " |
---|
84 | |
---|
85 | contains |
---|
86 | subroutine check(status) |
---|
87 | integer, intent ( in) :: status |
---|
88 | |
---|
89 | if(status /= nf90_noerr) then |
---|
90 | print *, trim(nf90_strerror(status)) |
---|
91 | stop "Stopped" |
---|
92 | end if |
---|
93 | end subroutine check |
---|
94 | end program simple_xy_wr |
---|