54 #include "nfconfig.inc" 57 #define NC_CLASSIC_MODEL 0 65 #ifndef NC_CLASSIC_MODEL 66 #define NC_CLASSIC_MODEL 0x0100 77 v2data_size(nc_type datatype)
89 #if NF_INT1_IS_C_SIGNED_CHAR 90 size =
sizeof(
signed char);
91 #elif NF_INT1_IS_C_SHORT 93 #elif NF_INT1_IS_C_INT 95 #elif NF_INT1_IS_C_LONG 100 #if NF_INT2_IS_C_SHORT 101 size =
sizeof(short);
102 #elif NF_INT2_IS_C_INT 104 #elif NF_INT2_IS_C_LONG 111 #elif NF_INT_IS_C_LONG 116 #if NF_REAL_IS_C_FLOAT 117 size =
sizeof(float);
118 #elif NF_REAL_IS_C_DOUBLE 119 size =
sizeof(double);
123 #if NF_DOUBLEPRECISION_IS_C_FLOAT 124 size =
sizeof(float);
125 #elif NF_DOUBLEPRECISION_IS_C_DOUBLE 126 size =
sizeof(double);
139 f2c_v2imap(
int ncid,
int varid,
const int* fimap, ptrdiff_t* cimap)
144 if (nc_inq_vartype(ncid, varid, &datatype) ||
145 nc_inq_varndims(ncid, varid, &rank) || rank <= 0)
157 int dimids[NC_MAX_VAR_DIMS];
161 if (nc_inq_vardimid(ncid, varid, dimids) != NC_NOERR)
164 for (total = 1, idim = rank - 1; idim >= 0; --idim)
170 if (nc_inq_dimlen(ncid, dimids[idim], &length) != NC_NOERR)
192 # if NF_INT1_IS_C_SIGNED_CHAR 193 size =
sizeof(
signed char);
194 # elif NF_INT1_IS_C_SHORT 195 size =
sizeof(short);
196 # elif NF_INT1_IS_C_INT 198 # elif NF_INT1_IS_C_LONG 203 # if NF_INT2_IS_C_SHORT 204 size =
sizeof(short);
205 # elif NF_INT2_IS_C_INT 207 # elif NF_INT2_IS_C_LONG 214 # elif NF_INT_IS_C_LONG 219 # if NF_REAL_IS_C_FLOAT 220 size =
sizeof(float);
221 # elif NF_REAL_IS_C_DOUBLE 222 size =
sizeof(double);
226 # if NF_DOUBLEPRECISION_IS_C_FLOAT 227 size =
sizeof(float);
228 # elif NF_DOUBLEPRECISION_IS_C_DOUBLE 229 size =
sizeof(double);
236 for (idim = 0; idim < rank; ++idim)
237 cimap[idim] = fimap[rank - 1 - idim] / size;
248 dimprod(
const size_t* count,
int rank)
253 for (i = 0; i < rank; ++i)
290 const char *pathname,
297 if (pathname == NULL)
301 *rcode = ((ncid = nccreate (pathname, clobmode)) == -1)
308 nc_advise(
"NCCRE", *rcode,
"");
322 const char *pathname,
331 rwmode > NC_WRITE + NC_SHARE + NC_CLASSIC_MODEL + NC_LOCK)
334 nc_advise(
"NCOPN", *rcode,
335 "bad flag, did you forget to include netcdf.inc?");
339 if (pathname == NULL) {
344 *rcode = ((ncid = ncopen (pathname, rwmode)) == -1)
351 nc_advise(
"NCOPN", *rcode,
"");
373 if ((dimid = ncdimdef (ncid, dimname, (
long)dimlen)) == -1)
397 if ((dimid = ncdimid (ncid, dimname)) == -1)
423 if ((status = nc_def_var(ncid, varname, datatype, ndims, dimids, &varid)))
425 nc_advise(
"NCVDEF", status,
"");
452 if ((varid = ncvarid (ncid, varname)) == -1)
475 *rcode = ((itype = (int) nctypelen (datatype)) == -1)
491 *rcode = ncclose(ncid) == -1
505 *rcode = ncredef(ncid) == -1
519 *rcode = ncendef (ncid) == -1
537 *rcode = ncinquire(ncid, indims, invars, inatts, irecdim) == -1
552 *rcode = ncsync (ncid) == -1
568 *rcode = ncabort(ncid) == -1
588 if (ncdiminq (ncid, dimid, dimname, &siz) == -1)
608 *rcode = ncdimrename(ncid, dimid, dimname) == -1
629 *rcode = ncvarinq(ncid, varid, varname, datatype, indims,
630 dimarray, inatts) == -1
642 const size_t* indices,
650 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
658 # if NF_INT1_IS_C_SIGNED_CHAR 659 status = nc_put_var1_schar(ncid, varid, indices,
660 (
const signed char*)value);
661 # elif NF_INT1_IS_C_SHORT 662 status = nc_put_var1_short(ncid, varid, indices,
663 (
const short*)value);
664 # elif NF_INT1_IS_C_INT 665 status = nc_put_var1_int(ncid, varid, indices,
667 # elif NF_INT1_IS_C_LONG 668 status = nc_put_var1_long(ncid, varid, indices,
673 # if NF_INT2_IS_C_SHORT 674 status = nc_put_var1_short(ncid, varid, indices,
675 (
const short*)value);
676 # elif NF_INT2_IS_C_INT 677 status = nc_put_var1_int(ncid, varid, indices,
679 # elif NF_INT2_IS_C_LONG 680 status = nc_put_var1_long(ncid, varid, indices,
686 status = nc_put_var1_int(ncid, varid, indices,
688 # elif NF_INT_IS_C_LONG 689 status = nc_put_var1_long(ncid, varid, indices,
694 # if NF_REAL_IS_C_FLOAT 695 status = nc_put_var1_float(ncid, varid, indices,
696 (
const float*)value);
697 # elif NF_REAL_IS_C_DOUBLE 698 status = nc_put_var1_double(ncid, varid, indices,
699 (
const double*)value);
703 # if NF_DOUBLEPRECISION_IS_C_FLOAT 704 status = nc_put_var1_float(ncid, varid, indices,
705 (
const float*)value);
706 # elif NF_DOUBLEPRECISION_IS_C_DOUBLE 707 status = nc_put_var1_double(ncid, varid, indices,
708 (
const double*)value);
718 nc_advise(
"NCVPT1", status,
"");
730 const size_t* indices,
738 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
740 status = datatype != NC_CHAR
742 : nc_put_var1_text(ncid, varid, indices, value);
749 nc_advise(
"NCVP1C", status,
"");
771 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
779 # if NF_INT1_IS_C_SIGNED_CHAR 780 status = nc_put_vara_schar(ncid, varid, start, count,
781 (
const signed char*)value);
782 # elif NF_INT1_IS_C_SHORT 783 status = nc_put_vara_short(ncid, varid, start, count,
784 (
const short*)value);
785 # elif NF_INT1_IS_C_INT 786 status = nc_put_vara_int(ncid, varid, start, count,
788 # elif NF_INT1_IS_C_LONG 789 status = nc_put_vara_long(ncid, varid, start, count,
794 # if NF_INT2_IS_C_SHORT 795 status = nc_put_vara_short(ncid, varid, start, count,
796 (
const short*)value);
797 # elif NF_INT2_IS_C_INT 798 status = nc_put_vara_int(ncid, varid, start, count,
800 # elif NF_INT2_IS_C_LONG 801 status = nc_put_vara_long(ncid, varid, start, count,
807 status = nc_put_vara_int(ncid, varid, start, count,
809 # elif NF_INT_IS_C_LONG 810 status = nc_put_vara_long(ncid, varid, start, count,
815 # if NF_REAL_IS_C_FLOAT 816 status = nc_put_vara_float(ncid, varid, start, count,
817 (
const float*)value);
818 # elif NF_REAL_IS_C_DOUBLE 819 status = nc_put_vara_double(ncid, varid, start, count,
820 (
const double*)value);
824 # if NF_DOUBLEPRECISION_IS_C_FLOAT 825 status = nc_put_vara_float(ncid, varid, start, count,
826 (
const float*)value);
827 # elif NF_DOUBLEPRECISION_IS_C_DOUBLE 828 status = nc_put_vara_double(ncid, varid, start, count,
829 (
const double*)value);
839 nc_advise(
"NCVPT", status,
"");
862 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
864 if (datatype != NC_CHAR)
870 status = nc_inq_varndims(ncid, varid, &rank);
873 if (dimprod(count, rank) > (
size_t)lenstr)
876 status = nc_put_vara_text(ncid, varid, start, count, value);
885 nc_advise(
"NCVPTC", status,
"");
901 const ptrdiff_t* strides,
902 const ptrdiff_t* imap,
911 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
912 (status = nc_inq_varndims(ncid, varid, &rank)) == 0)
920 # if NF_INT1_IS_C_SIGNED_CHAR 921 status = nc_put_varm_schar(ncid, varid, start, count,
923 (
const signed char*)value);
924 # elif NF_INT1_IS_C_SHORT 925 status = nc_put_varm_short(ncid, varid, start, count,
927 (
const short*)value);
928 # elif NF_INT1_IS_C_INT 929 status = nc_put_varm_int(ncid, varid, start, count,
932 # elif NF_INT1_IS_C_LONG 933 status = nc_put_varm_long(ncid, varid, start, count,
939 # if NF_INT2_IS_C_SHORT 940 status = nc_put_varm_short(ncid, varid, start, count,
942 (
const short*)value);
943 # elif NF_INT2_IS_C_INT 944 status = nc_put_varm_int(ncid, varid, start, count,
947 # elif NF_INT2_IS_C_LONG 948 status = nc_put_varm_long(ncid, varid, start, count,
955 status = nc_put_varm_int(ncid, varid, start, count,
958 # elif NF_INT_IS_C_LONG 959 status = nc_put_varm_long(ncid, varid, start, count,
965 # if NF_REAL_IS_C_FLOAT 966 status = nc_put_varm_float(ncid, varid, start, count,
968 (
const float*)value);
969 # elif NF_REAL_IS_C_DOUBLE 970 status = nc_put_varm_double(ncid, varid, start, count,
972 (
const double*)value);
976 # if NF_DOUBLEPRECISION_IS_C_FLOAT 977 status = nc_put_varm_float(ncid, varid, start, count,
979 (
const float*)value);
980 # elif NF_DOUBLEPRECISION_IS_C_DOUBLE 981 status = nc_put_varm_double(ncid, varid, start, count,
983 (
const double*)value);
993 nc_advise(
"NCVPTG", status,
"");
1007 const size_t* start,
1008 const size_t* count,
1009 const ptrdiff_t* strides,
1010 const ptrdiff_t* imap,
1019 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
1020 (status = nc_inq_varndims(ncid, varid, &rank)) == 0)
1025 status = nc_put_varm_text(ncid, varid, start, count,
1039 nc_advise(
"NCVPGC", status,
"");
1052 const size_t* indices,
1060 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
1068 # if NF_INT1_IS_C_SIGNED_CHAR 1069 status = nc_get_var1_schar(ncid, varid, indices,
1070 (
signed char*)value);
1071 # elif NF_INT1_IS_C_SHORT 1072 status = nc_get_var1_short(ncid, varid, indices,
1074 # elif NF_INT1_IS_C_INT 1075 status = nc_get_var1_int(ncid, varid, indices,
1077 # elif NF_INT1_IS_C_LONG 1078 status = nc_get_var1_long(ncid, varid, indices,
1083 # if NF_INT2_IS_C_SHORT 1084 status = nc_get_var1_short(ncid, varid, indices,
1086 # elif NF_INT2_IS_C_INT 1087 status = nc_get_var1_int(ncid, varid, indices,
1089 # elif NF_INT2_IS_C_LONG 1090 status = nc_get_var1_long(ncid, varid, indices,
1095 # if NF_INT_IS_C_INT 1096 status = nc_get_var1_int(ncid, varid, indices,
1098 # elif NF_INT_IS_C_LONG 1099 status = nc_get_var1_long(ncid, varid, indices,
1104 # if NF_REAL_IS_C_FLOAT 1105 status = nc_get_var1_float(ncid, varid, indices,
1107 # elif NF_REAL_IS_C_DOUBLE 1108 status = nc_get_var1_double(ncid, varid, indices,
1113 # if NF_DOUBLEPRECISION_IS_C_FLOAT 1114 status = nc_get_var1_float(ncid, varid, indices,
1116 # elif NF_DOUBLEPRECISION_IS_C_DOUBLE 1117 status = nc_get_var1_double(ncid, varid, indices,
1128 nc_advise(
"NCVGT1", status,
"");
1142 const size_t* indices,
1150 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
1155 status = nc_get_var1_text(ncid, varid, indices, value);
1167 nc_advise(
"NCVG1C", status,
"");
1181 const size_t* start,
1182 const size_t* count,
1190 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
1198 # if NF_INT1_IS_C_SIGNED_CHAR 1199 status = nc_get_vara_schar(ncid, varid, start, count,
1200 (
signed char*)value);
1201 # elif NF_INT1_IS_C_SHORT 1202 status = nc_get_vara_short(ncid, varid, start, count,
1204 # elif NF_INT1_IS_C_INT 1205 status = nc_get_vara_int(ncid, varid, start, count,
1207 # elif NF_INT1_IS_C_LONG 1208 status = nc_get_vara_long(ncid, varid, start, count,
1213 # if NF_INT2_IS_C_SHORT 1214 status = nc_get_vara_short(ncid, varid, start, count,
1216 # elif NF_INT2_IS_C_INT 1217 status = nc_get_vara_int(ncid, varid, start, count,
1219 # elif NF_INT2_IS_C_LONG 1220 status = nc_get_vara_long(ncid, varid, start, count,
1225 # if NF_INT_IS_C_INT 1226 status = nc_get_vara_int(ncid, varid, start, count,
1228 # elif NF_INT_IS_C_LONG 1229 status = nc_get_vara_long(ncid, varid, start, count,
1234 # if NF_REAL_IS_C_FLOAT 1235 status = nc_get_vara_float(ncid, varid, start, count,
1237 # elif NF_REAL_IS_C_DOUBLE 1238 status = nc_get_vara_double(ncid, varid, start, count,
1243 # if NF_DOUBLEPRECISION_IS_C_FLOAT 1244 status = nc_get_vara_float(ncid, varid, start, count,
1246 # elif NF_DOUBLEPRECISION_IS_C_DOUBLE 1247 status = nc_get_vara_double(ncid, varid, start, count,
1258 nc_advise(
"NCVGT", status,
"");
1271 const size_t* start,
1272 const size_t* count,
1281 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
1283 if (datatype != NC_CHAR)
1285 else if ((status = nc_get_vara_text(ncid, varid, start, count, value))
1290 if ((status = nc_inq_varndims(ncid, varid, &rank)) == 0)
1292 size_t total = dimprod(count, rank);
1294 (void) memset(value+total,
' ', lenstr - total);
1303 nc_advise(
"NCVGTC", status,
"");
1316 const size_t* start,
1317 const size_t* count,
1318 const ptrdiff_t* strides,
1319 const ptrdiff_t* imap,
1328 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
1329 (status = nc_inq_varndims(ncid, varid, &rank)) == 0)
1337 # if NF_INT1_IS_C_SIGNED_CHAR 1338 status = nc_get_varm_schar(ncid, varid, start, count,
1340 (
signed char*)value);
1341 # elif NF_INT1_IS_C_SHORT 1342 status = nc_get_varm_short(ncid, varid, start, count,
1345 # elif NF_INT1_IS_C_INT 1346 status = nc_get_varm_int(ncid, varid, start, count,
1349 # elif NF_INT1_IS_C_LONG 1350 status = nc_get_varm_long(ncid, varid, start, count,
1356 # if NF_INT2_IS_C_SHORT 1357 status = nc_get_varm_short(ncid, varid, start, count,
1360 # elif NF_INT2_IS_C_INT 1361 status = nc_get_varm_int(ncid, varid, start, count,
1364 # elif NF_INT2_IS_C_LONG 1365 status = nc_get_varm_long(ncid, varid, start, count,
1371 # if NF_INT_IS_C_INT 1372 status = nc_get_varm_int(ncid, varid, start, count,
1375 # elif NF_INT_IS_C_LONG 1376 status = nc_get_varm_long(ncid, varid, start, count,
1382 # if NF_REAL_IS_C_FLOAT 1383 status = nc_get_varm_float(ncid, varid, start, count,
1386 # elif NF_REAL_IS_C_DOUBLE 1387 status = nc_get_varm_double(ncid, varid, start, count,
1393 # if NF_DOUBLEPRECISION_IS_C_FLOAT 1394 status = nc_get_varm_float(ncid, varid, start, count,
1397 # elif NF_DOUBLEPRECISION_IS_C_DOUBLE 1398 status = nc_get_varm_double(ncid, varid, start, count,
1410 nc_advise(
"NCVGTG", status,
"");
1423 const size_t* start,
1424 const size_t* count,
1425 const ptrdiff_t* strides,
1426 const ptrdiff_t* imap,
1435 if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
1436 (status = nc_inq_varndims(ncid, varid, &rank)) == 0)
1441 status = nc_get_varm_text(ncid, varid, start, count,
1455 nc_advise(
"NCVGGC", status,
"");
1467 const char* varname,
1471 *rcode = ncvarrename (ncid, varid, varname) == -1
1484 const char* attname,
1499 # if NF_INT1_IS_C_SIGNED_CHAR 1500 status = nc_put_att_schar(ncid, varid, attname, datatype,
1501 attlen, (
const signed char*)value);
1502 # elif NF_INT1_IS_C_SHORT 1503 status = nc_put_att_short(ncid, varid, attname, datatype,
1504 attlen, (
const short*)value);
1505 # elif NF_INT1_IS_C_INT 1506 status = nc_put_att_int(ncid, varid, attname, datatype,
1507 attlen, (
const int*)value);
1508 # elif NF_INT1_IS_C_LONG 1509 status = nc_put_att_long(ncid, varid, attname, datatype,
1510 attlen, (
const long*)value);
1514 # if NF_INT2_IS_C_SHORT 1515 status = nc_put_att_short(ncid, varid, attname, datatype,
1516 attlen, (
const short*)value);
1517 # elif NF_INT2_IS_C_INT 1518 status = nc_put_att_int(ncid, varid, attname, datatype,
1519 attlen, (
const int*)value);
1520 # elif NF_INT2_IS_C_LONG 1521 status = nc_put_att_long(ncid, varid, attname, datatype,
1522 attlen, (
const long*)value);
1526 # if NF_INT_IS_C_INT 1527 status = nc_put_att_int(ncid, varid, attname, datatype,
1528 attlen, (
const int*)value);
1529 # elif NF_INT_IS_C_LONG 1530 status = nc_put_att_long(ncid, varid, attname, datatype,
1531 attlen, (
const long*)value);
1535 # if NF_REAL_IS_C_FLOAT 1536 status = nc_put_att_float(ncid, varid, attname, datatype,
1537 attlen, (
const float*)value);
1538 # elif NF_REAL_IS_C_DOUBLE 1539 status = nc_put_att_double(ncid, varid, attname, datatype,
1540 attlen, (
const double*)value);
1544 # if NF_DOUBLEPRECISION_IS_C_FLOAT 1545 status = nc_put_att_float(ncid, varid, attname, datatype,
1546 attlen, (
const float*)value);
1547 # elif NF_DOUBLEPRECISION_IS_C_DOUBLE 1548 status = nc_put_att_double(ncid, varid, attname, datatype,
1549 attlen, (
const double*)value);
1558 nc_advise(
"NCAPT", status,
"");
1570 const char* attname,
1579 if (datatype != NC_CHAR)
1582 status = nc_put_att_text(ncid, varid, attname, attlen, value);
1588 nc_advise(
"NCAPTC", status,
"");
1601 const char* attname,
1607 *rcode = ncattinq(ncid, varid, attname, datatype, attlen)
1620 const char* attname,
1628 if ((status = nc_inq_atttype(ncid, varid, attname, &datatype)) == 0)
1636 # if NF_INT1_IS_C_SIGNED_CHAR 1637 status = nc_get_att_schar(ncid, varid, attname,
1638 (
signed char*)value);
1639 # elif NF_INT1_IS_C_SHORT 1640 status = nc_get_att_short(ncid, varid, attname,
1642 # elif NF_INT1_IS_C_INT 1643 status = nc_get_att_int(ncid, varid, attname,
1645 # elif NF_INT1_IS_C_LONG 1646 status = nc_get_att_long(ncid, varid, attname,
1651 # if NF_INT2_IS_C_SHORT 1652 status = nc_get_att_short(ncid, varid, attname,
1654 # elif NF_INT2_IS_C_INT 1655 status = nc_get_att_int(ncid, varid, attname,
1657 # elif NF_INT2_IS_C_LONG 1658 status = nc_get_att_long(ncid, varid, attname,
1663 # if NF_INT_IS_C_INT 1664 status = nc_get_att_int(ncid, varid, attname,
1666 # elif NF_INT_IS_C_LONG 1667 status = nc_get_att_long(ncid, varid, attname,
1672 # if NF_REAL_IS_C_FLOAT 1673 status = nc_get_att_float(ncid, varid, attname,
1675 # elif NF_REAL_IS_C_DOUBLE 1676 status = nc_get_att_double(ncid, varid, attname,
1681 # if NF_DOUBLEPRECISION_IS_C_FLOAT 1682 status = nc_get_att_float(ncid, varid, attname,
1684 # elif NF_DOUBLEPRECISION_IS_C_DOUBLE 1685 status = nc_get_att_double(ncid, varid, attname,
1696 nc_advise(
"NCAGT", status,
"");
1709 const char* attname,
1718 if ((status = nc_inq_atttype(ncid, varid, attname, &datatype)) == 0)
1720 if (datatype != NC_CHAR)
1726 status = nc_inq_attlen(ncid, varid, attname, &len);
1733 status = nc_get_att_text(ncid, varid, attname,
1736 (void) memset(value+len,
' ', attlen - len);
1746 nc_advise(
"NCAGTC", status,
"");
1758 const char* attname,
1764 *rcode = ncattcopy(inncid, invarid, attname, outncid, outvarid)
1783 *rcode = ncattname(ncid, varid, attnum, attname) == -1
1795 const char* attname,
1796 const char* newname,
1800 *rcode = ncattrename(ncid, varid, attname, newname) == -1
1812 const char* attname,
1816 *rcode = ncattdel(ncid, varid, attname) == -1
1833 *rcode = ((retval = ncsetfill(ncid, fillmode)) == -1)