1 | # Introduction |
---|
2 | |
---|
3 | ## What is it? |
---|
4 | |
---|
5 | NetCDF95 is an alternative Fortran interface to the |
---|
6 | [NetCDF](http://www.unidata.ucar.edu/software/netcdf/index.html) |
---|
7 | library. The official Fortran interface is the [Fortran 90 NetCDF |
---|
8 | interface](https://www.unidata.ucar.edu/software/netcdf/docs-fortran/f90_The-NetCDF-Fortran-90-Interface-Guide.html). |
---|
9 | |
---|
10 | The name NetCDF95 was at first a reference to the Fortran 95 standard |
---|
11 | but NetCDF95 now uses Fortran 2003 features. |
---|
12 | |
---|
13 | Author: [Lionel GUEZ](https://www.lmd.jussieu.fr/~lguez) |
---|
14 | |
---|
15 | ## Why an alternative interface? |
---|
16 | |
---|
17 | Compared to the the [Fortran 90 NetCDF |
---|
18 | interface](https://www.unidata.ucar.edu/software/netcdf/docs-fortran/f90_The-NetCDF-Fortran-90-Interface-Guide.html), |
---|
19 | NetCDF95 is meant to be friendlier and more secure. Notably: |
---|
20 | |
---|
21 | - NetCDF95 frees you of the cumbersome task of handling the error |
---|
22 | status. NetCDF95 procedures behave like the Fortran input/output |
---|
23 | statements. That is, the error status is an optional output |
---|
24 | argument. Consider, for example, the Fortran formatted `read` |
---|
25 | statement: |
---|
26 | |
---|
27 | read([unit=]u, [fmt=]fmt [,iostat=ios] [, err=error-label] & |
---|
28 | [,end=end-label]) [list] |
---|
29 | |
---|
30 | If the `err`, `end` and `iostat` keywords are not provided, and |
---|
31 | there is a problem in the execution of the `read` statement, then |
---|
32 | execution of the program stops (with an informative error message |
---|
33 | from the compiler). Similarly, NetCDF95 procedures have an |
---|
34 | optional argument for error status. If the optional argument is |
---|
35 | absent and there is an error, then the NetCDF95 procedure produces |
---|
36 | an error message and stops the program. (The official Fortran 90 |
---|
37 | interface looks like it has been made to mimic the C interface, |
---|
38 | and this is not optimal in Fortran.) |
---|
39 | |
---|
40 | - NetCDF95 frees you of assumptions on the size of arrays and the size |
---|
41 | of character strings when you call several inquiry procedures. (It |
---|
42 | does so by making use of allocatable arguments, a Fortran 2003 |
---|
43 | feature.) See |
---|
44 | [`nf95_inquire_variable`](Detailed_content/variables.md), |
---|
45 | [`nf95_inq_grpname`](Detailed_content/groups.md), |
---|
46 | [`nf95_inq_grps`](Detailed_content/groups.md), |
---|
47 | [`nf95_inq_grpname_full`](Detailed_content/groups.md). |
---|
48 | |
---|
49 | - NetCDF95 offers procedures that have no counterpart in the official |
---|
50 | interface. These combine several calls to other NetCDF95 procedures |
---|
51 | for common higher-level tasks. See |
---|
52 | [`nf95_gw_var`](Detailed_content/variables.md), |
---|
53 | [`nf95_find_coord`](Detailed_content/datasets.md), |
---|
54 | [`nf95_create_single`](Detailed_content/datasets.md), |
---|
55 | [`nf95_get_missing`](Detailed_content/attributes.md). |
---|
56 | |
---|
57 | - NetCDF95 replaces functions by subroutines. Procedures of the |
---|
58 | official Fortran 90 interface are all functions, and they are all with |
---|
59 | side effects. First, they have `intent(out)` arguments. Furthermore, |
---|
60 | there is obviously data transfer inside the procedures. Any data |
---|
61 | transfer inside a function is considered as a side effect. In this |
---|
62 | respect, the Fortran 90 interface mimics the C interface. But Fortran |
---|
63 | has a different programming style than C and frowns upon side-effects |
---|
64 | in functions. See for example Metcalf and Reid (Fortran 90/95 |
---|
65 | Explained, 1999, §§ 5.10 and 6.10). |
---|
66 | |
---|
67 | - There are other improvements such as securing the call to |
---|
68 | [`nf95_get_var`](Detailed_content/variables.md) by checking the |
---|
69 | arguments start and `count_nc`, and renaming badly chosen argument |
---|
70 | names len and count to nclen and `count_nc`. |
---|
71 | |
---|
72 | |
---|