netCDF-3.5.1, CYGWIN and NAG f95

Hi all,

trying to compile netCDF-3.5.1 under CYGWIN with the NAG f95 compiler and
with the Intel Fortran compilers under Linux compiler exhibited a few
problems with the current netCDF release.  I am new to netCDF, so maybe some
issues mentioned are old and well known.


1) The file cfortran.h coming with netCDF is quite ancient, it should be
replaced by a more recent one or patched suitably.  By googling one can
certainly find most necessary but scattered information.

However, for compiling with NAG f95 I had to use another patch, since NAG
f95 does not do the same name mangling as f2c (note: this may or may not be
the correct place to fix the symptoms, but it did serve to compile and link
the stuff):

--- fortran/cfortran-netcdf.h   2004-02-18 18:27:40.000000000 +0100
+++ fortran/cfortran-netcdf-cygwin-nagf95.h     2004-04-06
14:33:13.000000000 +0200
@@ -74,7 +74,7 @@
 
 /* Remainder of cfortran.h depends on the Fortran compiler. */
 
-#if defined(CLIPPERFortran) || defined(__CYGWIN32__)
+#if (defined(CLIPPERFortran)||defined(__CYGWIN32__)) &&
!defined(NAGf90Fortran)
 #ifndef f2cFortran
 #define f2cFortran
 #endif


If somebody knows how to correctly auto-detect the type of the Fortran 95
compiler,
he or she might also set suitable defaults for the compiler options, such as
"-mismatch -w=unused" for the NAG compiler.
 

2) The following patch should be applied to the source distribution

--- ./nf_test/nf_test.F.orig    1997-06-11 18:20:48.000000000 +0200
+++ ./nf_test/nf_test.F.        2004-04-06 14:41:37.375000000 +0200
@@ -81,6 +81,9 @@
 !      DIGITAL Visual Fortran needs DFPORT for iargc
        USE DFPORT
         implicit        none
+#elif defined(NAGf90Fortran)
+        USE F90_UNIX_ENV, only : iargc, getarg
+        implicit        none
 #else
         implicit        none
         integer         iargc

3) In the file ncx.c there is a bug which throws an floating point exception
with NAG f95. Running the Fortran 90 tests after compiling yields a core
dump:

[...]
00400000:D:/cygwin/usr/local/src/packages/netcdf-3.5.1/src/nf_test/nf_test.e
xe (
symbols previously loaded)
#0  0x00450bad in ncx_put_short_double (
    xp=0xa0484ac, ip=0x22edb8) at ncx.c:408
408             ix_short xx = *ip;
(gdb) l 408
403     }
404
405     int
406     ncx_put_short_double(void *xp, const double *ip)
407     {
408             ix_short xx = *ip;
409             put_ix_short(xp, &xx);
410             if(*ip > X_SHORT_MAX || *ip < X_SHORT_MIN)
411                     return NC_ERANGE;
412             return ENOERR;
(gdb) print *ip
$1 = -32769
(gdb)

Clearly, the assignment to the short xx should be made _after_ the range
check, not before!  I do not know what should happen when *ip is outside the
range for shorts, so this is something for the maintainers to look into and
to fix.


-- 
Harald Anlauf
Deutscher Wetterdienst (DWD)           | Phone:  +49-(0)69/678667-41
FE1/AP03 - Assimilation & Modelle      | Fax:    +49-(0)69/678667-54
63067 Offenbach                        | e-Mail: harald.anlauf@xxxxxx

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