File: RELEASE_NOTES

package info (click to toggle)
pnetcdf 1.14.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,812 kB
  • sloc: ansic: 85,298; f90: 10,707; fortran: 9,283; cpp: 8,864; makefile: 3,084; perl: 2,833; sh: 2,538; yacc: 1,227; lex: 216
file content (2934 lines) | stat: -rw-r--r-- 161,277 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
=====================================
PnetCDF Release Notes
=====================================

-------------------------------------
Version _PNETCDF_VERSION_ (_PNETCDF_RELEASE_DATE_)
-------------------------------------

* New optimization
  + When file header extent size grows, moving the data section to a higher
    file offset has changed to be done in chunks of 16 MB per process.
    See [PR #174](https://github.com/Parallel-NetCDF/PnetCDF/pull/174),

* Configure options
  + For PnetCDF developers, the requirement for libtool version has been
    changed to 2.5.4, due to an issue on Mac OS when using OpenMPI. See
    [Issue #155](https://github.com/Parallel-NetCDF/PnetCDF/issues/155),
    [Issue #163](https://github.com/Parallel-NetCDF/PnetCDF/issues/163),
    and [PR #164](https://github.com/Parallel-NetCDF/PnetCDF/pull/164).

* New APIs
  + A set of APIs that read the header of a CDL file header and allow users to
    query the metadata defined in the CDL file. These APIs can be useful for
    creating a program (such as an I/O benchmark) based on an output netCDF
    file from another application (a CDL file can be generated by running the
    utility `ncmpidump/ncdump`). See
    [PR #177](https://github.com/Parallel-NetCDF/PnetCDF/pull/177).
    * `cdl_hdr_open()` opens and parses the CDL file's header
    * `cdl_hdr_inq_format()` returns file format version
    * `cdl_hdr_inq_ndims()` returns number of dimensions defined in CDL file
    * `cdl_hdr_inq_dim()` returns metadata of a dimension
    * `cdl_hdr_inq_nvars()` returns number of variables
    * `cdl_hdr_inq_var()` returns metadata of a variable defined in CDL file
    * `cdl_hdr_inq_nattrs()` returns number of attributes of a given variable
    * `cdl_hdr_inq_attr()` returns metadata of an attribute
    * `cdl_hdr_close()` closes the CDL file
  + The CDL Header C Reference Manual is available in
    [cdl_api_guide.md](https://github.com/Parallel-NetCDF/PnetCDF/blob/master/doc/cdl_api_guide.md).
    See [PR #184](https://github.com/Parallel-NetCDF/PnetCDF/pull/184).

* Bug fixes
  + Fix a GCC 15 compilation error. Thanks to Adrian Reber.
    See [PR #179](https://github.com/Parallel-NetCDF/PnetCDF/pull/179).
  + Fix errors when building an RPM. Thanks to Adrian Reber.
    See [PR #178](https://github.com/Parallel-NetCDF/PnetCDF/pull/178).
  + Fix setting of user hint nc_ibuf_size.
    See [PR #161](https://github.com/Parallel-NetCDF/PnetCDF/pull/161).

* New example programs
  + examples/C/create_from_cdl.c shows how to call the new CDL header APIs to
    create a netCDF file with the same metadata.

* New programs for I/O benchmarks
  + WRF-IO contains an extraction of the I/O kernel of WRF (Weather Research
    and Forecast Model, a weather prediction computer simulation program
    developed at NCAR) that can be used to evaluate the file I/O performance
    of WRF. It's data partitioning pattern is a 2D block-block checkerboard
    pattern, along the longitude and latitude.
    See [PR #165](https://github.com/Parallel-NetCDF/PnetCDF/pull/165)
    and [PR #181](https://github.com/Parallel-NetCDF/PnetCDF/pull/181).

* New test program
  + test/cdf/tst_cdl_hdr_parser.c tests the new CDL header APIs.
  + test/testcases/tst_grow_header.c tests header extent growth by re-entering
    the define mode multiple times and add more fix-sized and record variables.

* Clarifications about of PnetCDF hints
  + There are three ways in PnetCDF for user to set hints to align the starting
    file offset for the data section (header extent) and record variable
    section.
    1. through a call to API `nc_header_align_size` by setting arguments of
       `h_minfree`, `v_align`, `v_minfree`, and `r_align`.
    2. through an MPI info object passed to calls of `ncmpi_create()` and
       `ncmpi_open()`. Hints are `nc_header_align_size`, `nc_var_align_size`,
       and `nc_record_align_size`.
    3. through a run-time environment variable `PNETCDF_HINTS`. Hints are
       `nc_header_align_size`, `nc_var_align_size`, and `nc_record_align_size`.
  + As the same hints may be set by one or more of the above methods, PnetCDF
    implements the following hint precedence.
    * `PNETCDF_HINTS` > `ncmpi__enddef()` > `MPI info`.
    * 1st priority: hints set in the environment variable `PNETCDF_HINTS`, e.g.
      `PNETCDF_HINTS="nc_var_align_size=1048576"`. Making this the first
      priority is because it allows to run the same application executable
      without source code modification using different alignment settings
      through a run-time environment variable.
    * 2nd priority: hints set in the MPI info object passed to calls of
      `ncmpi_create()` and `ncmpi_open()`, e.g.
      `MPI_Info_set("nc_var_align_size", "1048576");`. The reasoning is when a
      3rd-party library built on top of PnetCDF implements its codes using
      'ncmpi__enddef'. An application that uses such 3rd-party library can pass
      an MPI info object to it, which further passes the info to PnetCDF. This
      precedence allows that application to exercise different hints without
      changing the 3rd-party library's source codes.
    * 3rd priority: hints used in the arguments of `ncmpi__enddef()`, e.g.
      `ncmpi__enddef(..., v_align=1048576,...)`.
  + PnetCDF I/O hint `nc_header_align_size` is essentially the same as hint
    `nc_var_align_size`, but its name appears to be closer to the hint's
    intent, i.e. to reserve some space for the header growth in the future when
    new data objects are added. Please note when both hints are set, only hint
    `nc_var_align_size` will take effect and `nc_header_align_size` ignored.
  + When there is no fix-sized variable (i.e. non-record variable) defined,
    argument `v_minfree` passed to `ncmpi__enddef()` is ignored. In this
    case, users should set `h_minfree`, if an extra header space is desired.
  + When there is no fix-sized variables defined and none of hints
    `nc_header_align_size`, `nc_var_align_size`, or argument `v_align` is set,
    `nc_record_align_size` or `r_align`, if set, will be used to align the
    header extent.
  + For the above update to the hint precedence, see
    PnetCDF See [PR #173](https://github.com/Parallel-NetCDF/PnetCDF/pull/173).


-------------------------------------
Version 1.14.0 (November 11, 2024)
-------------------------------------

* New features
  + Intra-node aggregation for write requests -- When the number of MPI
    processes allocated to a compute node is large, this feature can
    effectively reduce the communication congestion caused by an overwhelming
    large number of asynchronous messages posted during the collective write
    of MPI-IO. This new feature can be enabled by setting the PnetCDF I/O hint
    'nc_num_aggrs_per_node' to the desired number of aggregators per compute
    node. The non-aggregators send their requests to the assigned aggregators,
    and then the aggregators make aggregated requests to the file.
    [PR #156](https://github.com/Parallel-NetCDF/PnetCDF/pull/156).
  + Support MPI derived data types that are constructed from the large-count
    derived datatype constructors introduced in MPI 4.0.
    [PR #145](https://github.com/Parallel-NetCDF/PnetCDF/pull/145).

* New optimization
  + When running sequentially (i.e. number of processes is 1), PnetCDF calls
    the MPI independent I/O functions and avoids calls to MPI_Barrier,
    MPI_Bcast, and MPI_Allreduce.
    [PR #149](https://github.com/Parallel-NetCDF/PnetCDF/pull/149).

* Configure options changed
  + The default has been changed to build both shared and static libraries.
    [PR #143](https://github.com/Parallel-NetCDF/PnetCDF/pull/143).

* Configure updates:
  + Fix `pnetcdf-config` of reflecting the installation path when installation
    is done by running command `make install DESTDIR=/alternate/directory`
    which prepends '/alternate/directory' before all installation names.
    [PR #154](https://github.com/Parallel-NetCDF/PnetCDF/pull/154).

* New constants
  + A new C macro `NC_FillValue` replaces `_FillValue` and thus `_FillValue` is
    now deprecated This conforms with NetCDF4's change in its version 4.9.3
    release. [PR #153](https://github.com/Parallel-NetCDF/PnetCDF/pull/153).

* New PnetCDF hints
  + 'nc_num_aggrs_per_node' -- To enable the intra-node aggregation, this I/O
    hint can set to a positive integral value, which indicates the desired
    number of processes per compute node to be selected as the aggregators.
    Setting it to 0 disables the aggregation, which is also the default mode.
    [PR #156](https://github.com/Parallel-NetCDF/PnetCDF/pull/156).

* Build recipes
  + When using OpenMPI on Mac OSX, a link error may appear. The work around is
    to add `LDFLAGS=-ld_classic` into the configure command line. Thanks to
    Rui Chen for reporting and provide the solution.
    [Issue #139](https://github.com/Parallel-NetCDF/PnetCDF/issues/139).

* Updated utility programs
  + none

* Other updates:
  + More document for comparing PnetCDF and NetCDF4 has been added to file
    doc/netcdf4_vs_pnetcdf.md
    [PR #152](https://github.com/Parallel-NetCDF/PnetCDF/pull/152) and
    [PR #140](https://github.com/Parallel-NetCDF/PnetCDF/pull/140).

* New example programs
  + C/flexible_bottom.c and C/vard_bottom.c - These two examples construct MPI
    derived data types using absolute memory addresses first and use MPI_BOTTOM
    when calling the PnetCDF flexible APIs.

* New programs for I/O benchmarks
  + C/pnetcdf_put_vara.c --
    * This program writes a series of 3D variables with 2D block-block
      partitioning pattern. Each variable is a record variable.
      [PR #150](https://github.com/Parallel-NetCDF/PnetCDF/pull/150).
  + C/netcdf_put_vara.c --
    * This sequential NetCDF-C program writes a series of 3D variables. Each
      variable is a record variable.
    * This program and `C/pnetcdf_put_vara.c` can be used to compare the
      performance of NetCDF and PnetCDF when running sequentially, i.e. one
      process.
      [PR #150](https://github.com/Parallel-NetCDF/PnetCDF/pull/150).

* New test program
  + test/testcases/flexible_large_count.c - tests flexible APIs that use MPI
    derived datatypes created by MPI large-count datatype constructors.
    [PR #145](https://github.com/Parallel-NetCDF/PnetCDF/pull/145).


-------------------------------------
Version 1.13.0 (March 29, 2024)
-------------------------------------

* New features
  + A single read/write request made by an MPI process is now allowed to be of
    size larger than 2 GiB. Such large requests will be passed to the MP-IO
    library. This feature makes use of "the large count feature" introduced in
    MPI standard 4.0, which includes `MPI_XXX_c` APIs whose arguments are of
    type `MPI_Count`. `MPI_Count` can be an 8-byte integer type, enabling large
    MPI operations. As some MPI libraries today have begun implementing MPI
    4.0, PnetCDF now can rely on the MPI libraries to support large single
    requests. When the MPI library used to build PnetCDF does not support large
    requests, the MPI errors are returned. Because of this change, the PnetCDF
    configure option `--enable-large-single-req` is thus deprecated.
    See [PR #131](https://github.com/Parallel-NetCDF/PnetCDF/pull/131)
  + Flexible APIs now can operate as high-level APIs, when argument `bufcount`
    is set to `NC_COUNT_IGNORE` and `buftype` is set to an MPI predefined data
    type. See [PR #82](https://github.com/Parallel-NetCDF/PnetCDF/pull/82).
    Below is a write example from a buffer of type float.
    ```
    ncmpi_put_vara_all(ncid, varid, start, count, buf, NC_COUNT_IGNORE, MPI_FLOAT);
    ```
    is equivalent to
    ```
    ncmpi_put_vara_float_all(ncid, varid, start, count, buf);
    ```

* New Limitations
  + Hint `nc_header_read_chunk_size`, introduced in version 1.4.0, is now
    limited to `NC_MAX_INT`. As PnetCDF reads file header in chunks, this hint
    can be used to customize the chunk size. The default is 256 KB.
    See [4209056](https://github.com/Parallel-NetCDF/PnetCDF/commit/4209056e9a66465421f7ce9f1b44518923638b04)

* Configure options
  + `--enable-large-single-req` is deprecated and removed, as PnetCDF now
    allows a single reqd/write request of size larger than 2 GiB.
  + `--disable-file-sync` is deprecated and removed. This configure option
    alone was not able to provide a sufficient data consistency. Users are
    suggested to call `ncmpi_sync` and `MPI_Barrier` to achieve a desired
    consistency, as suggested by MPI standard.
  + A new option `--enable-install-examples` installs the example programs
    under folder `${prefix}/pnetcdf_examples` along with run script files. An
    example is `${prefix}/pnetcdf_examples/C/run_c_examples.sh`. The default of
    this option is `disabled`.
    See [PR #91](https://github.com/Parallel-NetCDF/PnetCDF/pull/91)
  + Add three new environment variables `SEQ_CFLAGS`, `SEQ_LDFLAGS` and
    `SEQ_LIBS` for setting the compile, link, and library flags, respectively
    to be used to build the sequential utility programs, i.e. `cdfdiff`,
    `ncoffsets`, `ncvalidator`, and `pnetcdf_version`.
    See [PR #122](https://github.com/Parallel-NetCDF/PnetCDF/pull/122)

* Configure updates:
  + Upgrade `config.guess` and `config.sub` to 2024-01-01.
    See [PR #116](https://github.com/Parallel-NetCDF/PnetCDF/pull/116)
  + FLASH-IO benchmark - add compile flag "-fallow-argument-mismatch" for GNU
    Fortran 10 and later.
    See [PR #114](https://github.com/Parallel-NetCDF/PnetCDF/pull/114)
  + Handle the case when MPICC environment variable is not set and `--with-mpi`
    is not used.  See commit
    [6142135](https://github.com/Parallel-NetCDF/PnetCDF/commit/61421356ecd38878a4ef46771ed6520d4257251f)
  + Upgrade Autotools version requirement to autoconf 2.71, automake 1.16.5, and
    libtool 2.4.6. (Note this change affects PnetCDF developers only.)
    See [PR #95](https://github.com/Parallel-NetCDF/PnetCDF/pull/95)
    Thanks to Blaise Bourdin for pointing out in
    [Issue #94](https://github.com/Parallel-NetCDF/PnetCDF/issues/94)
    that configure failed when using Intel OneAPI 2022.2.0 compilers. The fix
    is to use autoconf 2.70 and newer.

* New constants
  + `NC_COUNT_IGNORE` - This is used in flexible APIs. When argument `bufcount`
    is `NC_COUNT_IGNORE`, `buftype` must be a predefine MPI datatype and the
    APIs operate as the high-level APIs. Fortran equivalents are
    `NF_COUNT_IGNORE` and `NF90_COUNT_IGNORE`.
    See [PR #92](https://github.com/Parallel-NetCDF/PnetCDF/pull/92)

* API semantics updates
  + File open flag `NC_SHARE` is now deprecated. It is still defined, but takes
    no effect.
    See [PR #119](https://github.com/Parallel-NetCDF/PnetCDF/pull/119)
  + `NC_SHARE` alone is not sufficient to provide data consistency for accessing
    a shared file in parallel and thus is now deprecated. PnetCDF follows the
    file consistency defined in MPI standard, which only addresses the case
    when all file accesses are relative to a specific file handle created from
    a collective open, and thus `NC_SHARE` becomes invalid. See
    doc/README.consistency.md for more information.

* New PnetCDF hints
  + `nc_hash_size_dim` sets the hash table size for dimension names.
    Default: 256
  + `nc_hash_size_var` sets the hash table size for variable names.
    Default: 256
  + `nc_hash_size_gattr` sets the hash table size for global attribute names.
    Default: 64
  + `nc_hash_size_vattr` sets the hash table size for variable attribute names.
    Default: 8
  + The above 4 new hints can be used to set different hash table sizes for
    dimensions, variables, and attributes. Hashing tables are used for quick
    data object name lookup. It can be useful for files containing a large
    number of dimensions, variables, and attributes. For instance, when the
    number of variables to be defined is large and the number of attributes per
    variable is small, increasing the value of `nc_hash_size_var` can speed up
    the variable definition and inquiring time. On the other hand, setting a
    smaller value for hint `nc_hash_size_vattr` can reduce memory footprint.
    See [PR #132](https://github.com/Parallel-NetCDF/PnetCDF/pull/132).

* Updated utility programs
  + `ncvalidator` - When the file size is larger or smaller than what is
    calculated based on the metadata stored in the file header, the file may
    still be a valid netCDF file.
    * The larger-than-expected case can happen if opening an existing file that
      contains no variable. Deleting a global attribute already defined in the
      file will reduce the file header size. In this case, the file is still a
      valid netCDF file. Such mismatch will be detected and the file size
      truncated to the header size.
      See [PR #99](https://github.com/Parallel-NetCDF/PnetCDF/pull/99)
    * The smaller-than-expected case can happen if the last variable is
      partially written. The expected file size is calculated based on the full
      sizes of all variables. In this case, the file is still a valid netCDF
      file, and `ncvalidator` will report a warning, rather than an error.
    * Print the dimension size of a variable on stdout when its size is larger
      than the limitation allowed by the file format. See commit
      [5584d44](https://github.com/Parallel-NetCDF/PnetCDF/commit/5584d44a433a68966b0be601e7a73e939c695dbf)
  + Add file src/utils/README.md which gives short descriptions of the utility
    programs and collapsible bullets to display their manual pages.

* Other updates:
  + When file header extent size grows, PnetCDF now uses a movement unit per
    process of size up to 64 MiB.
    See [PR #137](https://github.com/Parallel-NetCDF/PnetCDF/pull/137)
  + Since version 1.1.0, PnetCDF has been using file striping size, if
    obtainable from the MPI-IO hint `striping_unit`, to align the starting file
    offset of the data section. This offset is also referred to as the file
    header extent, which can be larger than the header size to allow header to
    grow when new data objects are added. Starting from this release, file
    stripe size is no longer used for setting the starting offset of the data
    section. This is because automatically setting file header extent using the
    file striping size may grow the file header unexpectedly when adding new
    objects to an existing file.
    See [PR #124](https://github.com/Parallel-NetCDF/PnetCDF/pull/124) and
    [PR #125](https://github.com/Parallel-NetCDF/PnetCDF/pull/125).
  + Use unsigned int to perform byte swap.
    See [PR #113](https://github.com/Parallel-NetCDF/PnetCDF/pull/113).
  + Silence Intel icc compilation warnings: when CFLAGS contains
    "-Wimplicit-const-int-float-conversion" and "-Wstringop-overread".
    See [PR #110](https://github.com/Parallel-NetCDF/PnetCDF/pull/110).
  + In all previous PnetCDF's implementations, file header is always written/
    read by rank 0 using MPI independent APIs. This can nullify ROMIO hint
    `romio_no_indep_rw` if set by the user. To warrant no independent read/
    write user hint, PnetCDF now checks hint `romio_no_indep_rw` and if set to
    `true`, then all file header I/Os are made through MPI collective I/O
    calls, where only rank 0 makes non-zero length requests while all others
    zero length (in order to participate the collective calls). See
    [PR #104](https://github.com/Parallel-NetCDF/PnetCDF/pull/104) and
    [PR #138](https://github.com/Parallel-NetCDF/PnetCDF/pull/138).
  + In all prior versions, the file name was checked whether it contains
    character ':'. The prefix name ending with ':' is considered by ROMIO as
    the file system type name. The prefix name, if found, is then stripped, so
    the file name can be used in the POSIX function calls internally. However,
    the prefix was not checked against the file system type names recognized
    by ROMIO. Starting from this release, the prefix is checked against the
    known file system type names to ROMIO. If the prefix is not one of the
    recognized types, e.g.  "ufs", "nfs", "xfs", "pvfs2", "gpfs", "panfs",
    "lustre", "daos", "testfs", "ime", or "quobyte", then the prefix name is
    not stripped. This change is for the case when the file name contains ':',
    but it is not for specifying the file system type. See
    [PR #79](https://github.com/Parallel-NetCDF/PnetCDF/pull/79) and
    [MPICH PR 5951](https://github.com/pmodels/mpich/pull/5951).

* Bug fixes
  + Return I/O hints that are actually used. See commit
    [0dcf628](https://github.com/Parallel-NetCDF/PnetCDF/commit/0dcf6284106e42faa5e8fb9ab1aa5d52917ff892).
  + Fix residual values of `v_align` and `r_align` when re-entering the define
    mode multiple times.
    See [PR #126](https://github.com/Parallel-NetCDF/PnetCDF/pull/126).
  + Fix Fortran API `nf90mpi_Inq_buffer_size` which should call
    `nfmpi_inq_buffer_size` internally.
    See [PR #111](https://github.com/Parallel-NetCDF/PnetCDF/pull/111).
  + Fix `ncmpi_inq_num_rec_vars()` and `ncmpi_inq_num_fix_vars()` when opening
    an existing file. See
    [PR #103](https://github.com/Parallel-NetCDF/PnetCDF/pull/103).
  + `ncmpidiff` -  when checking the dimensions defined in the second files
    whether are also defined in the first file. See commit
    [88cd9c1](https://github.com/Parallel-NetCDF/PnetCDF/commit/88cd9c187b9b3dc9018b066e905a10d0c74488f8).
  + Use Fortran subroutine `Get_Environment_Variable` instead of `getenv` if it
    is available.  See commits
    [a0b8aca](https://github.com/Parallel-NetCDF/PnetCDF/commit/a0b8acabc3bf7a7a35d878c9db2afb71942bb7a9), and
    [b796759](https://github.com/Parallel-NetCDF/PnetCDF/commit/b796759f5a8e1749e7c168e05fe1665a35e2a2a1).

* New test program
  + test/largefile/large_attr.c - tests attributes of size > 2 GiB.
  + test/largefile/tst_hash_large_ndims.c - tests hashing performance when
    the number of dimensions is large.
  + test/largefile/tst_hash_large_nvars.c - tests hashing performance when
    the number of variables is large.
  + test/largefile/tst_hash_large_ngattr.c - tests hashing performance when
    the number of global attributes is large.
  + test/largefile/large_header.c - tests file header size larger than 2 GiB.
  + test/largefile/large_reqs.c - tests a single read/write request of size
    larger than 2 GiB.
  + test/testcases/tst_redefine.c - tests multiple entries of `ncmpi__enddef`
    [PR #126](https://github.com/Parallel-NetCDF/PnetCDF/pull/126).
  + test/testcases/tst_symlink.c - tests `NC_CLOBBER` on a symbolic link.
  + test/testcases/tst_del_attr.c - tests delete attributes. See
    [PR #99](https://github.com/Parallel-NetCDF/PnetCDF/pull/99).
  + test/testcases/test_get_varn.c - tests `get_varn` API. See
    [PR #90](https://github.com/Parallel-NetCDF/PnetCDF/pull/90).
  + test/testcases/flexible_var.c - tests flexible var API
  + test/testcases/flexible_api.f - tests flexible API when `bufcount == -1`
  + test/testcases/scalar.c - adds tests for scalar variables using nonblocking
    APIs. See commit
    [07ff7b1](https://github.com/search?q=repo%3AParallel-NetCDF%2FPnetCDF+07ff7b1&type=commits)
  + test/nonblocking/test_bputf.f90, test/nonblocking/test_bputf77.f -
    add tests of APIs `inq_buffer_usage` and `inq_buffer_size`. See commit
    [94ce438](https://github.com/Parallel-NetCDF/PnetCDF/commit/94ce438262fe7fcade031dcae1a677a827549bb3)

* Clarifications
  + Hints `nc_header_align_size` and `nc_record_align_size` are to align the
    file header extent and starting file offset of the record variable section,
    respectively.
  + Hint `nc_record_align_size` is not to align the offsets of individual
    record variables.
  + Prior to version 1.13.0, hint `nc_var_align_size` is used to align the
    starting file offsets of individual fixed-size variables. This design was
    to reduce file lock contention in MPI collective I/O operations. Beginning
    from this release (version 1.13.0), this hint is used to align only the
    starting file offset of the entire data section, not individual variables.
    The reason of such change is because PnetCDF nonblocking APIs can aggregate
    multiple I/O requests and MPI-IO today has been optimized to align I/O to
    file striping boundaries, which makes aligning starting offsets of
    individual variables less effective and may create large empty space in the
    file.
  + Using `NC_CLOBBER` in `ncmpi_create()` can be expensive if the file already
    exists. When the existing file is a regular file, PnetCDF will delete it
    with a call to `unlink()` first and re-created it. Calling `unlink()` may
    be expensive for some parallel file systems. When the existing file is a
    symbolic link, PnetCDF will call `truncate()` or `MPI_File_set_size()` to
    truncate the file size to zero. Calling `truncate()` may also be very
    expensive on some file systems, e.g. Lustre. Sporadically a long time spent
    on `unlink()` and `truncate()` was observed on Perlmutter at NERSC.

-------------------------------------
Version 1.12.3 (February 21, 2022)
-------------------------------------

* New optimization
  + Improve the performance when nonblocking requests contain more than one
    record.
    See [a00f5d2](https://github.com/Parallel-NetCDF/PnetCDF/commit/a00f5d2).

* Update configure options
  + Retire configure options `--enable-netcdf4` and `--enable-adios`, as there
    are already options `--with-netcdf4` and `--with-adios`. According to the
    autoconf manual, `--enable-feature` is for internal packages and
    `--with-feature` is for external.  Adding `--with-feature` is equivalent to
    enabling the feature.

* Updated utility program
  + Replace the definition of "difference ratio" used in utility programs
    `cdfdiff` and `ncmpidiff` with formula
    ```
    |x - y| / max(|x|, |y|)
    ```
    where |x| means the absolute value of x.
    See [issue #78](https://github.com/Parallel-NetCDF/PnetCDF/issues/78) and
    [9b165ceb](https://github.com/Parallel-NetCDF/PnetCDF/commit/9b165ceb).
  + Utility programs `cdfdiff` and `ncmpidiff` now report only the first
    variable element that are different or fail to meet the tolerances. Their
    values and differences are now printed on the standard output.
    See [75d20e6](https://github.com/Parallel-NetCDF/PnetCDF/commit/75d20e6)
    and [58d2d17](https://github.com/Parallel-NetCDF/PnetCDF/commit/58d2d17).
  + Use the same user-provided tolerant difference and tolerant difference
    ratio (through command-line option '-t') to check all variables.
    See [issue #78](https://github.com/Parallel-NetCDF/PnetCDF/issues/78) and
    [75d20e6](https://github.com/Parallel-NetCDF/PnetCDF/commit/75d20e6).

* Other updates:
  + IBM XLF compiler on Summit at OLCF requires compile flag "-qfixed" when
    compiling Fortran programs written in fixed form. Thus, the fixed form flag
    detected at configure time has been added to `AM_FFLAGS` when compiling
    fixed form programs. Similarly, the free form flag has been added to
    `AM_FCFLAGS` when compiling free form programs. This issue affects only the
    test and example Fortran programs. The PnetCDF library is intact.
    See [PR #73](https://github.com/Parallel-NetCDF/PnetCDF/pull/73)
  + Add all PnetCDF I/O hints to the inquired MPI info object returned by API
    `ncmpi_inq_file_info()`.
    See [f0e65cf](https://github.com/Parallel-NetCDF/PnetCDF/commit/f0e65cf).

* Bug fixes
  + Fix a bug in utility program `ncvalidator` for the case when there is no
    record written, but both fixed-size and record variables are defined.
    See [b34bfcd](https://github.com/Parallel-NetCDF/PnetCDF/commit/b34bfcd).
  + Fix configure bug of setting environment variable `SEQ_CC` to the
    sequential `CC` extracted from `MPICC`. Also add configure help message for
    environment variable `SEQ_CC`. Thanks to Carl Ponder for reporting.
    See [4978f6d](https://github.com/Parallel-NetCDF/PnetCDF/commit/4978f6d).
  + Fix a bug when C function `truncate` is not available. Argument `fh` of
    `MPI_File_close` is a pointer.
    See [3e331a6](https://github.com/Parallel-NetCDF/PnetCDF/commit/3e331a6).
  + When using an MPI compiler whose Fortran feature was disabled, the MPI
    Fortran constants and datatypes may not be defined in the header file
    `mpi.h`. This is the case for Open MPI (tested with 4.0.2). PnetCDF used
    some Fortran datatypes without checking whether they are defined, which can
    fail when running 'make'. A fix has been added to check whether the Fortran
    feature is disabled and wraps around the Fortran datatypes with C directive
    'ifdef ENABLE_FORTRAN'. Thanks Bert Wesarg for reporting this bug.
    See [issue #68](https://github.com/Parallel-NetCDF/PnetCDF/issues/68) and
    [PR #69](https://github.com/Parallel-NetCDF/PnetCDF/pull/69).

* Issues with NetCDF library
  + Test program [test/nc4/tst_rec_vars.c](test/nc4/tst_rec_vars.c) fails to
    run when using NetCDF 4.8.0 and 4.8.1. Thanks Bruno Pagani for reporting.
    See [issue #72](https://github.com/Parallel-NetCDF/PnetCDF/issues/72).

* Clarifications
  + Nonblocking APIs have yet to support subfiling feature.

-------------------------------------
Version 1.12.2 (January 15, 2021)
-------------------------------------

* Build recipes
  + Starting from GNU Fortran 10.0.0, function/subroutine argument type
    mismatch becomes a compile error. A new compile command-line option
    "-fallow-argument-mismatch" can turn these errors into warnings. This
    command-line option is added automatically in PnetCDF version 1.12.2 and
    later. When building PnetCDF of version 1.12.1 and earlier versions using
    GNU Fortran 10.0.0 and later, please add "-fallow-argument-mismatch" to
    environment variables FFLAGS and FCFLAGS.
    See [issue #61](https://github.com/Parallel-NetCDF/PnetCDF/issues/61)
    and [GCC 10 Release note](https://gcc.gnu.org/gcc-10/changes.html).
  + README.CRAY has been revised to reflect the recent changes of default
    compiling environment on Cori at NERSC.

* Updated utility program
  + ncvalidator now reports the name of variable that violates the NetCDF
    limitation on large variables for CDF-2 files
  + add corrupted file bad_large_fixed_var.nc2 that contains one large
    fixed-size variables that is not defined last
  + add corrupted file bad_large_rec_2_vars.nc2 that contains 2 large record
    variables
  + add corrupted file bad_large_rec_var.nc2 that contains 1 large record
    variable that is not defined last
  + add URLs of NetCDF limitations on large variables for CDF-1 and 2 file
    formats

* Other updates:
  + When calling ncmpi_create() with NC_CLOBBER flag, PnetCDF now calls
    access() to check whether file exists first. If the file does not exist,
    successive calls to truncate() or unlink() can be skipped.
  + Improve detection of HDF5 signature. The HDF5 signature is located at the
    beginning of the HDF5 superblock, but the location of HDF5 superblock may
    not be at the beginning of the file. It is located at byte offset 0, byte
    offset 512, and at successive locations in the file, each a multiple of two
    of the previous location; in other words, at these byte offsets: 0, 512,
    1024, 2048, and so on.

* Bug fixes
  + Fix more strict aliasing bug when building PnetCDF with -O3 flag. Thanks to
    Gianfranco Costamagna for reporting
    [issue #55](https://github.com/Parallel-NetCDF/PnetCDF/issues/55). See
    [pull request r65](https://github.com/Parallel-NetCDF/PnetCDF/pull/65) for
    the fix.
  + Fix NC_CLOBBER mode for ncmpi_create() when files are existing symbolic
    links. Prior to this release, symbolic links, like other regular files, was
    first deleted and then created. This can result in an unexpected outcome,
    i.e. the deletion of symbolic link. NetCDF-4 library implements this
    differently, by adding O_TRUNC flag when calling open() to truncate the
    file to length 0. Historically, PnetCDF did not adopt the same approach
    because MPI does not define a similar flag to O_TRUNC and the only way to
    achieve the file clobber effect is to through MPI_File_set_size(), which
    can be expensive as the function takes an MPI file handler argument, which
    requires to open the file first with a call to MPI_File_open().
  + Fix various compile and link bugs when NAG Fortran is used. Bugs include
    flag needed to verbose linking output, unrecognized link option -pthread,
    unmatched C compiler underneath. Thanks Sergey Kosukhin for providing the
    fix in [PR #59](https://github.com/Parallel-NetCDF/PnetCDF/pull/59)
    and [PR #60](https://github.com/Parallel-NetCDF/PnetCDF/pull/60)
  + Fix a bug of calling Fortran getarg() with the first argument k with a
    value > 0 when there is no command-line argument is used. NAG Fortran may
    crash the program. See
    [f16bd3c](https://github.com/Parallel-NetCDF/PnetCDF/commit/f16bd3c1ba1b08eade2384f094c519f3f2dc114e)
  + Fix a bug that limits FLASH-IO to run on less than 16K MPI processes. See
    [1d84fa5](https://github.com/Parallel-NetCDF/PnetCDF/commit/1d84fa5d54ca9179da4a5b1a4ee3b92cc92287ed)

-------------------------------------
Version 1.12.1 (December 9, 2019)
-------------------------------------

* New/updated utility program
  + A new command-line option `-t` is added to utility program `cdfdiff` to
    compare variable differences within a tolerance. See the man page of
    `cdfdiff` for usage.

* Issues related to MPI library vendors:
  + When using OpenMPI version 4.0.2 to build PnetCDF 1.12.0 and prior
    versions, running 'make' may encounter a problem related to MPI constants
    that have been deprecated in MPI standard 3.0. Error messages similar to
    below may appear.
    ```
    In file included from src/drivers/common/dtype_decode.c:16:
    src/drivers/common/dtype_decode.c: In function 'ncmpii_dtype_decode':
    /OpenMPI/4.0.2/include/mpi.h:322:57: error: expected expression before '_Static_assert'
     #define THIS_SYMBOL_WAS_REMOVED_IN_MPI30(func, newfunc) _Static_assert(0, #func " was removed in MPI-3.0.  Use " #newfunc " instead.")
                                                             ^~~~~~~~~~~~~~
    /OpenMPI/4.0.2/include/mpi.h:743:46: note: in expansion of macro 'THIS_SYMBOL_WAS_REMOVED_IN_MPI30'
     #        define MPI_COMBINER_HVECTOR_INTEGER THIS_SYMBOL_WAS_REMOVED_IN_MPI30(MPI_COMBINER_HVECTOR_INTEGER, MPI_COMBINER_HVECTOR);
                                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    src/drivers/common/dtype_decode.c:390:14: note: in expansion of macro 'MPI_COMBINER_HVECTOR_INTEGER'
             case MPI_COMBINER_HVECTOR_INTEGER:
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ```
    In OpenMPI 4.0.2, the default configuration is not to support MPI constants
    that have been deprecated in MPI 3.0. However, instead of ignoring those
    constants, OpenMPI 4.0.2 still defines them as assertion macros, which can
    cleverly trigger a compile-time error if user programs try to use them.
    This behavior appears when the underlying C compilers supporting 2011
    revision of the C standard (with `__STDC_VERSION__ >= 201112L`) such as GCC
    version 4.6 and later are used to build OpenMPI. However, when using
    earlier versions of C compilers to build OpenMPI 4.0.2, those deprecated
    MPI constants are not defined at all in mpi.h. See discussion
    [issue 7099](https://github.com/open-mpi/ompi/issues/7099).

    Thanks to Carl Ponder for reporting the error and Nick Papior for providing
    a workaround solution that is to rebuild OpenMPI 4.0.2 with configure
    option "--enable-mpi1-compatibility" and use it to build PnetCDF 1.12.0 and
    earlier versions. Note the latest MPICH 3.3.1 does not have such an issue,
    as all deprecated constants are still defined. This issue is now fixed in
    PnetCDF of release 1.12.1 which no longer requires the workaround build of
    OpenMPI.

* Bug fixes
  + Fix strict aliasing bug when building PnetCDF with -O3 flag. See
    [a40aa5f](https://github.com/Parallel-NetCDF/PnetCDF/commit/a40aa5f73938ba1298f92ad471b3e3578ef8dbda)

* New Limitations
  + Configure command now checks whether the supplied MPI C compiler is a
    wrapper of a C++ compiler. If this is detected, the PnetCDF configuration
    will be aborted. This check is enforced because using such an MPI C
    compiler will cause problem for linking Fortran, C and C++ programs, with
    an error message similar to this:
    ```
    conftestf.o: In function `MAIN_': conftestf.f:4: undefined reference to `sub_'
    configure:33318: error: Could not link conftestf.o and conftest.o
    ```

* Build recipes
  + On Theta @ ALCF, when compiling utility programs 'ncoffsets' and 'cdfdiff',
    using Intel-based compilers such as module PrgEnv-intel, one may encounter
    error messages below.
    ```
    In file included from /usr/include/inttypes.h:27:0,
    /theta-archive/intel/compilers_and_libraries_2019.5.281/linux/compiler/include/stdint.h:43:54: error: missing binary operator before token "("
       defined(__has_include_next) && __has_include_next(<stdint.h>)
                                                        ^
    ```
    This issue is due to the environment variable 'CPATH' is set for Intel C
    compilers which is not compatible with GCC. However, this can be simply
    resolved by adding "SEQ_CC=icc" to your make command line, i.e.
    ```
    make SEQ_CC=icc
    ```

* Other updates:
  + The string length of I/O hint `nc_burst_buf_dirname`, the name of burst
    buffer directory must be less than the value of MPI_MAX_INFO_VAL. This is
    because all PnetCDF I/O hints were handled through MPI info mechanism and
    MPI requires the maximum string length of the value of an MPI info object
    to be MPI_MAX_INFO_VAL. If violated, error MPI_ERR_INFO_VALUE will be
    returned.

-------------------------------------
Version 1.12.0 (September 30, 2019)
-------------------------------------

* New features
  + BP file read capability is supported -- By being built on top of ADIOS
    library PnetCDF can now read files in BP format. Note write capability is
    not supported. This feature is added for convenience purpose, i.e. the
    existing PnetCDF programs can read BP files without change. The read
    performance of BP files is expected no difference from using ADIOS library
    directly. More information can be found in doc/README.ADIOS.md.

* New Limitations
  + Writing to BP files is not supported.

* Update configure options
  + To enable ADIOS BP file support, two new options can be used.
    - `--enable-adios`: enables read capability for BP files
    - `--with-adios=/path/to/adios`: can be used to specify the path to ADIOS
      library installation
    By default, this option is disabled.
  + Option `--with-netcdf4` now allows a form of `--with-netcdf4=INC,LIB` in
    addition to `--with-netcdf4=DIR`. This is in case the include and lib
    folders of NetCDF-4 installation are in different locations.

* New C and Fortran constants
  + NC_BP, NF_BP, and NF90_BP are the flags indicating BP file access mode.
  + NC_FORMAT_BP, NF_FORMAT_BP, and NF90_FORMAT_BP indicate BP file format.

* New error codes
  + NC_EADIOS, NF_EADIOS, NF90_EADIOS - indicate ADIOS library internal
    errors.

* New/updated utility program
  + `cdfdiff` is a new utility program. It is a serial version of `ncmpidiff`
    that is compiled with gcc without PnetCDF library. It can run on the login
    node in a cross-compile environment. `cdfdiff` only compares files in the
    classic NetCDF formats, i.e. CDF-1, CDF-2, and CDF-5.
  + `ncmpidiff` now checks file format versions of two files, and reports
    difference if not the same. Even if formats are different, it continues to
    compare the contents of file headers and values in variables.
  + A new command-line option `-t` is added to utility program `ncmpidiff` to
    compare variable differences within a tolerance. See the man page of
    `ncmpidiff` for usage. Thanks to Carl Ponder for contributing the source
    codes. See [PR #53](https://github.com/Parallel-NetCDF/PnetCDF/pull/53)
  + `ncmpidump` can now dump contents of BP files.

* Other updates:
  + The MPI info object now includes all PnetCDF hints once obtained from a
    call to ncmpi_inq_file_info(). If any hint is not set by the users, its
    default value is set in the info object.

* Bug fixes
  + When calling a nonblocking API with a zero-length request and argument
    request ID being NULL, segmentation fault may occur. See
    [PR #51](https://github.com/Parallel-NetCDF/PnetCDF/pull/51)

* New example programs
  + examples/adios/read_metadata.c - dumps metadata of a BP file.
  + examples/adios/read_var.c - reads a variable from a BP file generated by
    the ADIOS example program examples/C/arrays/arrays_write.
  + examples/adios/read_var_nb.c - reads a variable from a BP file generated
    by the ADIOS example program examples/C/arrays/arrays_write using PnetCDF
    non-blocking APIs.

* New test program
  + test/adios/open.c - tests if PnetCDF recognize BP files.
  + test/adios/header.c - tests if PnetCDF can parse BP header.
  + test/adios/var.c - tests if PnetCDF can read variables from a BP file
  + test/adios/varm.c - tests varm APIS for reading a BP file
  + test/adios/vars.c - tests vars APIs for reading a BP file
  + test/adios/ivar.c - tests nonblocking API for reading a BP file
  + test/adios/ivars.c - tests nonblocking vars APIs for reading a BP file
  + test/adios/ivarm.c - tests nonblocking varm APIs for reading a BP file
  + test/adios/att.c - tests reading attributes from a BP file
  + test/adios/indep.c - tests reading a BP file in independent data mode
  + test/burst_buffer/varn.c -- tests varn APIs when burst buffer driver is
    used. The test includes cases when argument `counts` contains some of the
    elements being NULL.
  + test/nc4/notsupport.c - test if error code NC_ENOTSUPPORT is properly
    returned when calling APIs for unsupported NetCDF-4 feature.
  + test/nc4/tst_rec_vars.c - tests writing and reading record variables from
    NetCDF-4 files
  + test/nc4/rec2 - tests reading a record variables with 2 unlimited
    dimensions from NetCDF-4 files.

* Issues related to MPI library vendors:
  + Per-file thread-safe capability is not supported when using OpenMPI with
    ROMIO backend, i.e. when `--mca io romio321` is used at `mpirun` command
    line. See OpenMPI github issue
    [6951](https://github.com/open-mpi/ompi/issues/6951)

-------------------------------------
Version 1.11.2 (May 13, 2019)
-------------------------------------

* Bug fixes
  + When configure command-line option `--enable-netcdf4` is used, errors may
    occur during the configure or make time. Thanks Bruno Pagani for reporting.
    See bug fix in
    [pull request #46](https://github.com/Parallel-NetCDF/PnetCDF/pull/46).
  + Fix configure date setting when environment variable `SOURCE_DATE_EPOCH`
    is set.

* Clarifications
  + Limitation of supporting NetCDF-4 driver -- a list of APIs that are not
    supported for NetCDF-4 files is given in `doc/README.NetCDF4.md`. Error
    code `NC_ENOTSUPPORT` is returned when those APIs are called.

* Other updates:
  + Utility program `ncoffsets` is updated to skip printing the dimension names
    if the number of dimensions of a variable is larger than 64.This predefined
    constant can be changed a different number `N` by adding
    `-DMAX_PRINT_NDIMS=N` to the compile command line.
  + Utility program `ncvalidator` is updated to be able to repair the file
    header to fill in null-byte paddings in the space between the header size
    and header extent.
  + Add a note to `doc/README.CRAY` about a compilation issue encountered on
    Cori @ NERSC when module gcc/7.3.0 is loaded.
  + Change release date format from `Day Month, Year` to `Month Day, Year`.

* New test program
  + test/nc4/notsupport.c - Test if error code NC_ENOTSUPPORT is properly
    returned when calling APIs for unsupported NetCDF-4 feature.
  + test/nc4/rtst_rec_vars.c - Test record variables for NetCDF-4 files.
  + test/nc4/tst_2_rec_dims.c - Test opening a NetCDF-4 file containing more
    than one unlimited dimension on whether correct error can be returned.
  + test/nc4/tst_get_put_size.c - Test the amount of I/O so far for NetCDF-4
    files.
  + test/testcases/tst_version.c - Check whether PnetCDF version string
    returned from ncmpi_inq_libvers() matches the constant PNETCDF_VERSION
    defined in header file pnetcdf.h.

-------------------------------------
Version 1.11.1 (April 12, 2019)
-------------------------------------

* New optimization
  + When inserting nonblocking requests into the PnetCDF internal pending
    queues, the queues are now kept sorted (using an insert sort) into an
    increasing order of variable starting file offsets. This can avoid the
    quick sort when flushing the pending requests. See
    [pull request #37](https://github.com/Parallel-NetCDF/PnetCDF/pull/37).
    To avoid internal sorts completely, users are recommended to post
    nonblocking requests in the increasing order of variable IDs and fixed-size
    variables first followed by record variables.

* New Limitations
  + When building with NetCDF-4 feature enabled, using a NetCDF-4 library that
    has already been built with PnetCDF enabled, i.e. `--enable-pnetcdf`, is not
    supported. See [Issue #33](https://github.com/Parallel-NetCDF/PnetCDF/issues/33).

* Other updates:
  + Add a check whether the MPI library is built with shared-library support.
    If not and `--enable-shared` is used, the configure process of PnetCDF will
    fail.
  + In the NetCDF-4 driver, `nc4io_inq_var()` adds a NULL-argument check for
    `no_fill` and `fill_value`. If both arguments are NULL, it skips the call
    to `nc_inq_var_fill`.
  + File header extent area between end of header and first variable will be
    padded with null bytes if PnetCDF is configured with option
    `--enable-null-byte-header-padding`.
  + Add AC_PROG_CPP in configure.ac to check whether `-E` option is required by
    the C preprocessor.
  + Add a check for whether `m4` utility is available, and abort the configure
    if it is not.

* Bug fixes
  + Fix ncmpidiff when comparing dimension names of 2 variables between files
    whose dimension define orders are different. See
    [Issue #42](https://github.com/Parallel-NetCDF/PnetCDF/pull/42).
  + Fix error checking for programs in examples/C to ignore NC_ENOTENABLED
    if PnetCDF was not built with `--enable-profiling`. Thanks to Bruno Pagani
    and see [Issue #34](https://github.com/Parallel-NetCDF/PnetCDF/issues/34).

* New test program
  + test/burst_buffer/varn.c -- to test varn API when burst buffer driver is
    used. The test includes cases when argument counts is NULL or some elements
    in counts are NULL.

* Clarifications
  + Padding -- NetCDF classic file format specification states "Header padding
    uses null (\x00) bytes. In data, padding uses variable's fill value."
    PnetCDF implements the header padding specification but only enforces it
    when the configure option `--enable-null-byte-header-padding` is set. Note
    PnetCDF has not yet implemented the padding for data section.


-------------------------------------
Version 1.11.0 (December 19, 2018)
-------------------------------------

* New features
  + NetCDF-4 driver -- Accessing HDF5-based NetCDF-4 files is now supported.
    PnetCDF can be built on top of NetCDF-4 library to let users to use PnetCDF
    APIs to read and write a NetCDF-4 file. Users now can add NC_NETCDF4 flag
    when calling ncmpi_create() to create NetCDF-4 files. For opening NetCDF-4
    files, no additional flag is needed, as PnetCDF automatically detects the
    file format and uses the HDF5 I/O driver underneath. This feature is
    provided for convenience purpose. The parallel I/O performance to NetCDF-4
    files is expected no difference from using NetCDF-4 library directly.
  + Per-file thread-safe capability is added. This feature can be enabled at
    configure time by adding command-line option `--enable-thread-safe`. In
    addition, option `--with-pthread` can be used to specify the install path
    to the pthreads library. This feature currently only supports
    one-thread-per-file I/O operations and the classic CDF-1, 2, and 5 files.

* New optimization
  + On some systems, e.g. Cori @NERSC, collective MPI-IO may perform poorly
    when the I/O buffer is noncontiguous, compared to a contiguous one. To
    avoid this, `ncmpi_wait()` and `ncmpi_wait_all()` now check whether the
    buffer is noncontiguous and size is less than 16 MiB. If both are true, a
    temporary contiguous buffer is allocated to copy the data over and used in
    the MPI read or write calls. The size of the buffer can be adjusted through
    a new hint `nc_ibuf_size`. See `New PnetCDF hint` below and
    [PR #26](https://github.com/Parallel-NetCDF/PnetCDF/pull/26). Programs
    developed to test this issue is available in
    https://github.com/Parallel-NetCDF/E3SM-IO/tree/master/mpi_io_test
  + Burst buffer driver is updated to run varn APIs more efficiently. Previous
    implementation breaks a single varn request into multiple vara requests,
    which can be slow and require a large amount of meta data. It has changed
    to consider each varn request a single entity. See
    [PR #30](https://github.com/Parallel-NetCDF/PnetCDF/pull/30) and
    [PR #31](https://github.com/Parallel-NetCDF/PnetCDF/pull/31).

* New Limitations
  + For creating new files, the NetCDF-4 driver in PnetCDF supports only the
    classic model I/O operations. Advanced NetCDF-4 features, such as chunking,
    compression, etc. are not supported in PnetCDF. This is due to the
    unavailability of PnetCDF APIs for those operations.
  + The burst buffering driver does not support NetCDF-4 file formats.
  + Due to a bug in HDF5 1.10.2 that fails zero-length write requests to record
    variables in the collective mode, PnetCDF is not able to support such
    requests when NetCDF-4 feature is enabled. See discussion in
    https://github.com/NCAR/ParallelIO/pull/1304
    The bug fix has appeared in HDF5 1.10.4 release.

* Update configure options
  + Enable NetCDF-4 support.
    - `--enable-netcdf4`: enables NetCDF4 format classic mode support
    - `--with-netcdf4=/path/to/netcdf-4`: can be used to specify the path to
      NetCDF-4 library installation
  + Enable multi-threading support.
    - `--enable-thread-safe`: enable per-file thread-safe support
    - `--with-pthread`: path to the pthread library installation

* New constants
  + none

* New APIs
  + C++ API `NcmpiFile::set_fill()` is added for setting and inquiring the
    fill mode of an opened NetCDF file.

* API syntax changes
  + none

* API semantics updates
  + none

* New error code precedence
  + none

* Updated error strings
  + none

* New error code
  + none

* New PnetCDF hint
  + `nc_ibuf_size` -- to set the size of a temporal buffer to be allocated by
    PnetCDF internally to pack noncontiguous user write buffers supplied to the
    nonblocking requests into a contiguous space. Similarly for read case to
    unpack the temporal buffer to user read buffers, if they are noncontiguous.
    This affects both blocking and nonblocking APIs. On some systems, using
    noncontiguous user buffers in MPI collective read/write functions performs
    significantly worse than using contiguous buffers. Note if the size of
    aggregated user buffers is larger than `nc_ibuf_size`, packing/unpacking
    will be disabled to save memory footprint. The default value is 16 MiB.

* New run-time environment variables
  + none

* Build recipes
  + doc/README.NetCDF4.md is added to describe the usage of the new feature of
    NetCDF-4 support.

* New/updated utility program
  + none

* Other updates:
  + The automatic file layout alignment for fixed-size variables is disabled.
    This is because modern MPI-IO implementations have already aligned the file
    access with the file lock boundaries and the automatic alignment can create
    a file view with "holes" in between variables, which can adversely degrade
    I/O performance. Users can still set hints `nc_header_align_size`,
    `nc_var_align_size`, and `nc_record_align_size` to use customized alignment
    sizes.
  + The internal data buffering mechanism used in the burst buffer driver is
    removed. This mechanism caches the request data in memory until the
    accumulated size is more than 8 MiB, so the write requests to burst buffers
    can be aligned with 8 MiB boundaries. However, experiments on Cray DataWarp
    show a negligible performance improvement unless the I/O request is small
    and fragment. On the other hand, it can degrade performance for mid- and
    large-sized requests. The burst buffer driver now writes directly to the
    burst buffers for each user write request.

* Bug fixes
  + Fix bug of checking interleaved requests for scalar variables. See
    [PR #27](https://github.com/Parallel-NetCDF/PnetCDF/pull/27).
  + When building PnetCDF using the IBM xlc compiler with -O optimization
    option on Little Endian platforms, users may encounter errors related to
    strict ANSI C aliasing rules. Thanks to Jim Edwards for reporting and Rafik
    Zurob for providing the fix. See
    [Issue #23](https://github.com/Parallel-NetCDF/PnetCDF/issues/23) and
    [Pull Request #24](https://github.com/Parallel-NetCDF/PnetCDF/issues/24).
  + Shell ksh has a different way to redirect stdout and stderr from bash.
    PnetCDF configure.ac and acinclude.m4 have been developed mainly on bash.
    This bug can cause configure command to fail when using ksh. Thanks to
    @poohRui for reporting the bug. See
    [Issue #21](https://github.com/Parallel-NetCDF/PnetCDF/issues/21) and
    [PR #22](https://github.com/Parallel-NetCDF/PnetCDF/pull/22).
    However, running configure under ksh is still buggy. A GNU automake bug
    report of hanging problem can be found in
    https://lists.gnu.org/archive/html/bug-automake/2015-04/msg00000.html
    PnetCDF users are recommended to run configure under other shells.
  + For put and get APIs when buftype is MPI_DATATYPE_NULL, bufcount is
    ignored. This is not implemented correctly in blocking put and get APIs.
    See bug fix committed on Aug. 25, 2018.
  + ncmpidiff -- when comparing two files that contain record variables but
    no record has been written. See bug fix committed on Aug. 25, 2018.
  + ncmpidiff -- when comparing two scalar variables, error NC_EBADDIM may
    mistakenly reported. See bug fix committed on Aug. 12, 2018.
  + When the MPI communicator used in ncmpi_create or ncmpi_open is freed by
    the user after the call and before file is closed, programs would crash at
    ncmpi_close with MPI error of "Invalid communicator". The fix moves the
    duplication of MPI communicator to the place before calling driver create
    and open subroutines. See bug fix committed on Jul 21, 2018.

* New example programs
  + examples/C/time_var.c and examples/F77/time_var.f - show how to define,
    write, and read record variables.
  + examples/C/pthread.c - demonstrates the one-file-per-thread I/O example.
    When running on some parallel machines, users may need to set certain
    environment variable to enable MPI multi-threading support, for example on
    Cori @NERSC with command
    ```
    export MPICH_MAX_THREAD_SAFETY=multiple
    ```
  + examples/C/transpose2D.c - a 2D version of examples/C/transpose.c

* New programs for I/O benchmarks
  + none

* New test program
  + test/F90/test_fill.f90 - another test for bug fix r3730.
  + test/testcases/error_precedence.m4 - tests the error code reporting
    precedence
  + test/nc4/tst_zero_req.c - tests a HDF5 1.10.2 bug that causes test program
    to hang when writing to and reading back a 2D record variable in collective
    mode with some of the processes making zero-length requests.
  + test/nc4/put_get_all_kinds.m4 - tests all supported variable read/write
    API. Make sure they are properly wired up
  + test/nc4/interoperability_rd.m4 - tests whether NetCDF-4 file written using
    NetCDF can be read by PnetCDF
  + test/nc4/interoperability_wr.m4 - tests whether NetCDF-4 file written using
    PnetCDF can be read by NetCDF
  + test/nc4/simple_xy.c - tests reading NetCDF-4 files, borrowed the test
    program simple_xy.c from NetCDF
  + test/testcases/tst_pthread.c - tests thread-safe capability for scenario of
    each thread operating on a unique file.
  + test/testcases/tst_free_comm.c - free MPI communicator right after calling
    ncmpi_create to see if PnetCDF duplicates the communicator correctly.

* Conformity with NetCDF library
  + none

* Discrepancy from NetCDF library
  + In contract to NetCDF-4 which allows to read/write variables in define mode
    when the file format is in NetCDF-4 format, PnetCDF still requires reading
    and writing variables in data mode.
  + In contrast to the semantics of nc_set_fill() defined in NetCDF-4,
    ncmpi_set_fill() changes the fill mode of all variables newly defined in
    the current scope of defined mode. Variables affected include the ones
    defined before and after the call to ncmpi_set_fill(). Note this API has no
    effect on the already existing variables created in the previous define
    mode. This behavior follows the convention adopted by NetCDF-3. To change
    fill mode for individual variables after the call to ncmpi_set_fill(), API
    ncmpi_def_var_fill() can be used for this purpose. Refer NetCDF 4.1.3 user
    guide for semantics of
    [nc_set_fill()](https://www.unidata.ucar.edu/software/netcdf/documentation/historic/netcdf-c/nc_005fset_005ffill.html).
    A discussion with NetCDF developers regarding this issue can be found in
    [1114](https://github.com/Unidata/netcdf-c/pull/1114).
  + The error code return precedence can be different between NetCDF and
    PnetCDF in some cases. A test program for error code return precedence is
    available in test/testcases/error_precedence.m4. This program can be used
    to test both PnetCDF and NetCDF libraries. Note when testing NetCDF
    programs, because NetCDF does not follow the same precedence, failures are
    expected. A discussion with NetCDF developers regarding this issue can be
    found in [334](https://github.com/Unidata/netcdf-c/issues/334).

* Issues related to MPI library vendors:
  + none

* Issues related to Darshan library:
  + none

* Clarifications
  + PnetCDF currently does not support Fortran default integer type set to 8
    bytes (for GNU Fortran compiler, this change of default setting is done by
    using compile option -fdefault-integer-8). Checking this has been added
    and configure command will fail, once default 8-byte integer is detected.


-------------------------------------
Version 1.10.0 (July  2, 2018)
-------------------------------------

  o New features
    * A new I/O layer that makes use of burst buffers is added. Burst buffer is
      an I/O driver that implements a log-based I/O aggregation for write
      requests with the present of burst buffer storage devices. The design is
      to save first write requests in burst buffers and later flush the saved
      requests to the destination file system. See doc/README.burst_buffering
      for more detailed description.

  o New optimization
    * Internal memory management for nonblocking APIs has been improved further
      to reduce memory footprint. See r3763.
    * Both blocking and nonblocking varn APIs have been improved for better
      performance and less memory footprint. See r3747-r3750.
    * Prior to this release, when buftype in flexible APIs indicates a
      noncontiguous layout in user buffer, PnetCDF packs the user buffer into
      a contiguous buffer allocated internally, which will later be used in
      MPI-IO calls. To reduce memory footprint, this release avoids the
      additional memory allocation and directly uses the user buffer in MPI-IO
      calls when neither byte-swap nor type-conversion is required. See r3722
      and r3723.

  o New Limitations
    * none

  o Update configure options
    * The default setting for relax-coord-bound option is changed to "enable",
      in accord with NetCDF 4.6.2. Users may use --disable-relax-coord-bound to
      disable this setting at configure time or at run time by setting the
      environment variable PNETCDF_RELAX_COORD_BOUND. See section "New run-time
      environment variables" below for more information.
    * Option in-place byte-swap is expanded into the following three settings.
      --enable-in-place-swap : to perform byte swap on user I/O buffers
        whenever possible. This option results in the least amount of internal
        memory usage. However, if an immutable user buffer is used,
        segmentation fault may occur when byte swap is performed on user
        buffer in place.
      --disable-in-place-swap : when byte swap is required, PnetCDF allocates
        an internal memory to perform byte swap to avoid altering the contents
        of user buffer. This option will increase internal memory footprint.
      The default (neither the above option is used at the command line): an
        internal buffer is allocated for byte swap only when the I/O request
        size is less than 4 KiB. For larger requests, user buffers are used
        for in-place byte swap.
      The mode can also be changed at the run time by setting the PnetCDF hint
      nc_in_place_swap in the run-time environment variable PNETCDF_HINTS. See
      New hints below for more info.  Note -in-place-swap option only affect
      applications running on Little Endian machines, as no byte swap is
      necessary on Big Endian machines.

  o New constants
    * none

  o New APIs
    * ncmpi_flush() flushes data buffered by PnetCDF to the destination file
      system. When using the burst buffers, the data cached in the burst
      buffers will be flushed.

  o API syntax changes
    * none

  o API semantics updates
    * The default setting for checking the coordinate bound is changed to the
      more relaxed check. Users can still change this checking at run time by
      setting the environment variable PNETCDF_RELAX_COORD_BOUND. See section
      of "New run-time environment variables" below for more information.
    * ncmpi_put_vard and ncmpi_get_vard APIs
      1. Now allow to write and read two or more variables in a single call to
         vard APIs. In this case, argument varid will be the ID of first
         variable. Argument filetype should be constructed by using the
         relative distance between any two successive variables. See example
         program examples/C/vard_mvars.c.
      2. When argument filetype is MPI_DATATYPE_NULL, the request is considered
         a zero-length request.
      3. Limitation of vard APIs: The element data type of filetype must
         conform with the variable external NC data type. The element data
         types of all variables accessed in filetype must be the same.
         Otherwise, NC_EMULTITYPES will be returned.
      4. buftype must contain only one same element data type if it is used to
         read or write multiple variables from file. Otherwise NC_EMULTITYPES
         will be returned.

  o New error code precedence
    * none

  o Updated error strings
    * none

  o New error code
    * NC_EFLUSHED when calling ncmpi_cancel() to cancel non-blocking requests
      but the requests have already flushed.
    * NC_EBADLOG when the log files stored in the burst buffers are found
      corrupted.

  o New PnetCDF hints
    * nc_in_place_swap -- to enable or disable in-place byte swap on Little
      Endian architectures. The default mode is auto. See in-place byte-swap
      option above for descriptions of the three modes. Below is an example
      that changes the mode to "enable" regardless the setting used at the
      configure time, by setting the environment variable PNETCDF_HINTS with
      command:
          export PNETCDF_HINTS="nc_in_place_swap=enable"
    * nc_burst_buf -- to use the burst buffering feature. The default setting
      is disable. To enable at the run time, one can set the hint to
      environment variable PNETCDF_HINTS, for example,
          export PNETCDF_HINTS="nc_burst_buf=enable"
    * nc_burst_buf_dirname -- Name of directory on the burst buffer where the
      internal log files will be stored. This is usually set to the path where
      burst buffer is mounted. The default path is the same directory of the
      output file.
    * nc_burst_buf_del_on_close -- Whether the burst buffer log files should
      be deleted when closing the NetCDF file. The default is enable. To
      disable at the run time, one can set the hint to environment variable
      PNETCDF_HINTS, for example,
          export PNETCDF_HINTS="nc_burst_buf_del_on_close=disable"
      Note that on some systems, e.g. DataWarp, all files stored in burst
      buffers may be purged when the user job is completed. In this case, users
      who wish to keep the log files for other jobs must refer to the burst
      buffer user guide for such setting. For DataWarp on Cori @NERSC, the
      settings are described in
      http://www.nersc.gov/users/computational-systems/cori/burst-buffer/example-batch-scripts/
    * nc_burst_buf_flush_buffer_size -- Amount of memory allowed by users for
      PnetCDF to allocate when flushing the burst buffer log files. The unit
      is in bytes. Value 0 means unlimited. Users are suggested to use a
      number that is at least the size of largest individual requests. The
      default is unlimited.

  o New run-time environment variables
    * PNETCDF_RELAX_COORD_BOUND environment variable can be set to 0 to disable
      or 1 to enable the more relaxed boundary check for argument start. Prior
      to version 1.10.0, the default behavior is to use a strict boundary
      check, i.e. error code NC_EINVALCOORDS will be thrown when the value of
      start is larger than or equal to the defined dimension size.

  o Build recipes
    * doc/README.burst_buffering is added to describe the usage of the new
      feature of burst buffering.
    * doc/README.IBM is revised as the compiler behavior, particularly when
      using GNU-based MPI compilers to build static-only libraries, has
      changed on BGQ since the release of 1.9.0.
    * doc/README.CRAY is revised as the compiler behavior, particularly when
      using GNU-based MPI compilers to build static-only libraries, has
      changed on CRAY since the release of 1.9.0.
    * doc/README.Ubuntu is revised and the fix of adding LDFLAGS is no longer
      necessary when building shared libraries.

  o New/updated utility program
    * ncvalidator adds a new option -t to turn on tracing mode which prints all
      successfully validated metadata till the first error encountered.
    * ncvalidator adds a check to detect whether there are two or more
      unlimited dimensions defined in the file and, if yes, reports error code
      NC_EUNLIMIT.

  o Other updates:
    * Inter-library dependencies among C, C++ and Fortran have been updated to
      follow automake user guide: adding FLIBS and FCLIBS to _LIBADD. This
      update resolves problems of building shared libraries for some systems.
    * Move the memory allocation trace feature out of --enable-debug into the
      new configure option --enable-profiling. By default, this is disabled.
    * Add a check for NC_EUNLIMIT in API ncmpi_open to detect whether two or
      more unlimited dimensions are defined to detect a corrupted file.

  o Bug fixes
    * Fix type_create_subarray64() for case when some dimensions of the global
      array is larger than 4G and oldtype is not MPI_BYTE. See r3779. Without
      this fix, test/largefile/large_var.c will fail. Note prior to 1.9.1,
      type_create_subarray64() is always called with oldtype being MPI_BYTE.
    * Fix configure-time bug that configure fails to recognize the compilers
      with full-path names passed from the environment variable MPICC, MPICXX,
      MPIF77, or MPIF90. See Ticket #35 for bug report and r3740 for fix.
    * Fix the bug that writing scalar attributes of type NF_INT64 was
      mistakenly casted to NF_INT. See r3730.
    * Fix test/testcases/erange_fill.m4 for the case of NC_LONG data type.
      NC_LONG is synonym of NC_INT. When setting fill value for variables of
      type NC_LONG, the user buffer must be of type int (internal). See r3726.
    * Fix the calculation of new record number in put_vard API. Thanks to
      Jim Edwards. See r3675.
    * Fix the calculation of growing size of nonblocking request queues to
      include the number of records of a record variable, as such request is
      split into multiple additional requests, one for each record. See r3651.
    * Remove freeing name object because NC_ENULLPAD is not a fatal error. See
      r3644. This bug only appears when "--enable-null-byte-header-padding" is
      set at configure time and opening files whose headers are not padded with
      null bytes.
    * Member "value" of NC_dimarray, NC_attrarray, and NC_vararray can still be
      NULL when a corrupted tag of NC_DIMENSION, NC_ATTRIBUTE, or NC_VARIABLE
      is read from files. Add a check against NULL before freeing it. This bug
      only appears when reading files with corrupted NC tags. See r3645.

  o New example programs
    * example/C/vard_mvars.c shows an example of using a single vard API call
      to write or read two variables.
    * example/burst_buffer/create_open.c shows an example of creating and
      opening a NetCDF file with the burst buffering feature enabled.
    * example/burst_buffer/nonblocking.c shows an example of using non-blocking
      put APIs with the burst buffering feature enabled.

  o New programs for I/O benchmarks
    * none

  o New test program
    * test/burst_buffer/bb_bsize.c - test whether the burst buffer driver works
      under limited flush buffer size.
    * test/burst_buffer/bb_hints.c - test file hints related to the burst
      buffer driver
    * test/burst_buffer/bb_many_reqs.c - stress test the nonblocking request
      pool in the burst buffer driver
    * test/burst_buffer/bb_nonblocking.c - test the behavior of burst buffer
      driver when using nonblocking I/O, particularly for case that tries to
      cancel an already flushed request.
    * test/burst_buffer/highdim.c - test whether the burst buffer driver can
      handle very high dimension variables.
    * test/testcases/test_fillvalue.c - tests PnetCDF allows to put attribute
      _FillValue for global variable and for non-global variable, requires the
      data type of attribute _FillValue be the same as the variable's.
    * test/F90/test_attr_int64.f90 - tests the bug fixed in r3730 that
      nf90mpi_put_att API writes a scalar attribute of type NF90_INT64 that
      was mistakenly casted to NF90_INT.
    * test/testcase/test_vard_rec.c - tests ncmpi_put_vard APIs for writing a
      record variable with one record at a time. This is to test the fix to
      bug reported by Jim Edwards in r3675.
    * test/nonblocking/large_num_reqs.c - tests large number of nonblocking put
      and get requests (larger than NC_REQUEST_CHUNK, the constant used to grow
      the internal queues that store the nonblocking put and get requests. This
      is to test bug fix in r3651.
    * test/testcases/tst_def_var_fill.c - tests API ncmpi_def_var_fill and
      verifies fill values when fill mode is turned on and off.
    * src/utils/ncvalidator/tst_open.c - tests API ncmpi_open against corrupted
      files and checks expected error codes.

  o Conformity with NetCDF library
    * NetCDF allows to put attribute _FillValue of any NC data type to the
      global variable, NC_GLOBAL. Note this is allowed for classic files, but
      not for the HDF5-based NetCDF-4 files. PnetCDF conforms with this
      behavior from this release on. Reference of NetCDF 4.1.3 user guide for
      nc_put_att_type() at https://www.unidata.ucar.edu/software/netcdf/documentation/historic/netcdf-c/nc_005fput_005fatt_005f-type.html
    * For non-global variables, NetCDF treats the classic and HDF5 files
      differently. For classic files, it allows to create attribute _FillValue
      of a data type that is different from the variable's. For HDF5 files, the
      data type of attribute _FillValue must be the same as the variable. Note
      this behavior for classic files is against the convention specified in
      the NetCDF user guide and NetCDF plans to revise the user guide to
      describe the new convention. As for PnetCDF, we decided to enforce the
      rule that requires the data type of attribute _FillValue be the same as
      the variable's.


  o New conflict with NetCDF library
    * none

  o New issues related to MPI library vendors:
    * none

  o New issues related to Darshan library:
    * none

  o New clarifications
    * none


-------------------------------------
Version 1.9.0 (December 19, 2017)
-------------------------------------

  o New features
    * The configure environment has been migrated to use GNU automake and
      libtool.
    * Building shared libraries is now supported with configure option
      --enable-shared. However, the default configuration is to build static
      library only. Note linking shared libraries is not recommended due to
      the likely performance degradation.

  o New optimization
    * Use hash function for faster attribute name lookup. See r3335.

  o New Limitations
    * PnetCDF now requires the underlying MPI library define data type
      MPI_Offset an 8-byte integer. Configuration process will be aborted if
      MPI_Offset is detected to be of size 4 bytes. See r2944.
    * The maximum number of files that can be simultaneously opened by an MPI
      process is now limited to 1024 (a new constant NC_MAX_NFILES defined in
      pnetcdf.h). When this limit is reached, error code NC_ENFILE will be
      thrown.
    * NC_MAX_VAR_DIMS, the maximum number of dimensions per variable is raised
      to 2147483647, i.e. NC_MAX_INT
    * NC_MAX_DIMS, the maximum number of dimensions per file is raised to
      2147483647, i.e. NC_MAX_INT
    * NC_MAX_ATTRS, the maximum number of attributes per file is raised to
      2147483647, i.e. NC_MAX_INT
    * NC_MAX_VARS, the maximum number of variables per file is raised to
      2147483647, i.e. NC_MAX_INT
    * NC_EMAX_REQ error code will be thrown when a single request of a get/put
      API call or the aggregated size of nonblocking requests in a wait API
      call exceeds INT_MAX (max of 4-byte integer).  Note the size limit is per
      MPI process, not across all processes. This is due to MPI-IO is yet to
      support a single MPI-IO request, i.e. MPI_File_read or MPI_File_write, of
      size larger then INT_MAX. A new configure command-line option
      "--enable-large-single-req" has been added to disable the checking. Use
      this option is recommended only when the underneath MPI-IO library
      supports large single requests made by each MPI process.

  o New constants
    * NC_FORMAT_UNKNOWN, NF_FORMAT_UNKNOWN, and NF90_FORMAT_UNKNOWN are new
      constants that are one of the returned values of argument formatp in the
      API ncmpi_inq_file_format when the file under inquiry is unrecognizable
      by PnetCDF library.
    * NC_MAX_NFILES, NF_MAX_NFILES, and NF90_MAX_NFILES define the maximum
      number of files that can be kept opened by an MPI process.

  o New APIs
    * none

  o API syntax changes
    * Add C type qualifier "const" to argument fill_value of ncmpi_def_var_fill
      to indicate the contents pointed by fill_value is immutable.

  o Semantics updates
    * Calling ncmpi_end_indep_data() in collective data mode is no longer
      considered illegal, starting from this release 1.9.0. In this case, the
      API simply returns NC_NOERR. Note calling ncmpi_begin_indep_data() in
      independent data mode has been allowed since PnetCDF 1.2.0. Thanks to
      Gregory Sjaardema for pointing out the asymmetry between the two APIs.
      See r3517.
    * For CDF-5 files, the maximum size of a variable or a variable's record
      is NC_MAX_INT64-3 (i.e. 2^64-4).
    * When the file create/open modes are not consistent among processes, the
      modes on all processes will be replaced by rank 0's mode and PnetCDF
      library will still try to create/open the file. Error code
      NC_EMULTIDEFINE_CMODE or NC_EMULTIDEFINE_OMODE will be returned on
      processes whose modes disagree with rank 0's. If safe mode is on, then
      all processes will also get the same error code.
    * API ncmpi_inq_nreqs() - allows argument nreqs to be NULL. In this case,
      the API is equivalent to checking the validity of argument ncid. In
      previous releases, NC_EINVAL is returned when argument nreqs is NULL.
    * API ncmpi_inq_buffer_usage() - allows argument usage to be NULL. In this
      case, the API is equivalent to checking the validity of argument ncid. In
      previous releases, NC_EINVAL is returned when argument usage is NULL.
    * API ncmpi_inq_buffer_size() - allows argument usage to be NULL. In this
      case, the API is equivalent to checking the validity of argument ncid. In
      previous releases, NC_EINVAL is returned when argument buf_size is NULL.

  o New error code precedence
    * none

  o Updated error strings
    * The error string corresponding to error code NC_EMAXDIMS is changed to
      cover the case when NC_MAX_DIMS or NC_MAX_VAR_DIMS is exceeded.

  o New error code
    * NC_EMAX_REQ - indicates a single request of a get/put API call or the
      aggregated size of nonblocking requests in a wait API call exceeds
      INT_MAX (max of 4-byte integer). The corresponding F77 and F90 error
      codes are NF_EMAX_REQ and NF90_EMAX_REQ, respectively.
    * NC_ENULLPAD - indicates the file fails strict null-byte header check. The
      corresponding F77 and F90 error codes are NF_ENULPAD and NF90_ENULPAD,
      respectively. The same error code has also been defined in NetCDF since
      4.5.1. Note this error is not considered fatal. PnetCDF will continue
      the file open procedure if there is no other error found. Therefore, when
      encountering this error code returned from the file open API, ncmpi_open,
      user can safely ignore it. See section "Conflict with NetCDF library"
      below for further discussion.

  o New PnetCDF hint
    * none

  o New run-time environment variables
    * none

  o New build recipe
    * doc/README.Ubuntu provides build instructions for Ubuntu Linux OS.

  o New/updated utility program
    * Utility program ncmpivalid is renamed to ncvalidator to reflect its
      purpose. It is now running in serial and thus no longer requires an MPI
      compiler to build it. In fact, its source codes are all in a single file,
      ncvalidator.c, which can be compiled using gcc, i.e. command "gcc -o
      ncvalidator ncvalidator.c".  This utility program can be used to validate
      a classic CDF file, and report the locations that fail to comply with CDF
      formats. It can also repair a file whose header fails to use null bytes
      for paddings, when the command-line option "-x" is used. See its man page
      for further description of usage.

  o Other updates:
    * Update UTF8 encoding utility to use utf8proc library version 2.1.0 from
      the Julia Language project, https://github.com/JuliaLang/utf8proc
      License https://github.com/JuliaLang/utf8proc/blob/master/LICENSE.md
    * Add quiet mode command-line option "-q" to utility program ncvalidator.
    * Add an internal check for whether the file starting offsets of all
      variables are in an increasing order as the variables defines. See r3369.
    * All build recipes (README files) have been moved to folder doc. Most of
      the recipes have been updated with instructions for building shared
      libraries.
    * Rename configure-time variables TEST_SEQRUN, TEST_MPIRUN, and TEST_OUTDIR
      to TESTSEQRUN, TESTMPIRUN, and TESTOUTDIR, respectively. This change
      avoids conflict to the name convention reserved by automake.
    * Fix TESTMPIRUN default value to use full path specified in --with-mpi at
      configure command line

  o Bug fixes
    * Fix a bug in nonblocking APIs when two separate nonblocking requests that
      can be coalesced into a contiguous MPI fileview or buffer type but the
      coalesced length becomes too big and overflows a 4-byte integer, data
      type of argument blocklengths of MPI_Type_create_hindexed, coalescing
      should be skipped. I.e. such two requests should be treated as two
      separate blocks in MPI_Type_create_hindexed.  Thanks Jim Edwards for
      reporting. See r3565.
    * Fix a bug in nonblocking APIs when one request's access region covers
      more than one other non-interleaved requests. PnetCDF fails to identify
      them as a single group of interleaved requests. Test program
      test/nonblocking/interleaved.c has been revised to test the fix.
      See r3389.
    * Fix a bug in string parsing the environment variable PNETCDF_HINTS and
      print warning messages when hint strings are ill-formed. See r3284.
    * Fix a bug in F90 APIs for reading and writing scalar variables, i.e.
      number of dimensions is zero. The bugs appear only when using Intel
      Fortran compiler which does not allow checking presence of an argument
      and its contents in the same if condition. See r3009, r3012, r3013.
    * Conform with CDF-2 file format specification on using 2^32-1 for vsize
      when the variable size is larger than 2^32-4 bytes. See r2957.
    * Fix a bug in nc_test when running on an ARMv7 architecture, a raspberry
      pi, where char is unsigned and which is little Endian, 32-bit machine.
      See r2922.
    * Fix a bug that fails to do byte-swap when retrieving user-defined fill
      values. See r2864. This fix is critical when PnetCDF is configured with
      option erange-fill enabled (default mode) and the target platform is a
      Little Endian.

  o New example programs
    * none

  o New programs for I/O benchmarks
    * none

  o New test program
    * test/testcases/tst_vars_fill.m4 - tests strided put (vars) APIs with
      fill mode on.
    * test/largefile/large_coalesce.c - tests a bug fixed in r3565 when two
      separate nonblocking requests that can be coalesced into a contiguous MPI
      fileview or buffer type but the coalesced length becomes too big and
      overflows a 4-byte integer.
    * test/testcases/tst_info.c - tests an internal bug in heap memory
      allocation trace mechanism. See r3514.
    * test/cdf_format/tst_corrupt.c
      1. tests whether NC_EMAXDIMS can be thrown when opening a corrupted file
         header with number of dimensions being larger than NC_MAX_DIMS.
      2. tests whether NC_EMAXATTS can be thrown when opening a corrupted file
         header with number of attributes being larger than NC_MAX_ATTRS.
      3. tests whether NC_EBADDIM can be thrown when opening a corrupted file
         header with dimension ID of a variable is beyond the number of
         dimensions defined in the file.
      4. tests whether NC_EBADTYPE can be thrown when opening a corrupted file
         header with nc_type of a variable is not within the legal NC atomic
         data type allowed by the file format.
    * test/testcases/tst_max_var_dims.c - tests the number of dimensions
      against NC_MAX_VAR_DIMS when calling ncmpi_def_var API.
    * test/largefile/tst_cdf5_begin.c - tests CDF-5 file header corruption for
      the case when the starting file offsets of variables are not in an
      increasing order as they defined.
    * test/cdf_format/tst_open_cdf5.c - tests whether NC_ENOTNC can be
      correctly thrown when opening a corrupted CDF-5 (bad_begin.nc5) which
      contains two variables and the second variable's starting file offset is
      less than the first variable's end offset.
    * test/testcases/large_var_cdf5.c - tests whether NC_EVARSIZE can be
      correctly thrown when a variable or a variable record is larger than
      NC_MAX_INT64-3.
    * test/testcases/mix_collectives.c - tests collective get/put APIs that
      allow different processes to call different kinds of APIs (i.e. var1,
      vara, vars, varm, etc.) and use different var IDs. In other words, the
      API kinds can be different among processes in a collective call.
    * test/largefile/high_dim_var.c - tests blocking vars APIs for high-
      dimensional variables. See r3164.
    * test/largefile/large_dims_vars_attrs.c - tests large number of
      dimensions, large number of variables, and large number of attributes.
    * test/testcases/put_all_kinds.m4 - tests various blocking put APIs.
    * test/testcases/tst_dimsizes.c - borrowed from NetCDF library to test
      define/inquire APIs for the maximum allowable dimension sizes. This test
      program is similar to (or a subset of) test/cdf_format/dim_cdf12.c
    * test/testcases/null_args.c - tests whether the correct error codes can
      be returned when using NULL arguments for start, count, stride, or imap

  o Conformity with NetCDF library
    * API ncmpi_open now checks the number of large variables that is legal
      for CDF-1 and CDF-2 files. See r2961. For the information about the
      number of large variables allowed in the classic formats can be found in
      http://www.unidata.ucar.edu/software/netcdf/docs/file_structure_and_performance.html#classic_format_limitations
    * Add checking for error code NC_ELATEFILL. Setting a variable's attribute
      _FillValue must be done in the variable's initial define mode.
    * NetCDF-4 documents in 4.4.1 and prior state that setting attribute
      _FillValue for global variable NC_GLOBAL is not allowed and error code
      NC_EINVAL will be thrown. Revisions r2954, r2955, and r2956 enforce this
      rule. However, because the rule has never been implemented in any NetCDF
      official release, NetCDF developers have decided to abandon this rule
      by revising the NetCDF document starting from v4.5. See discussion in
      NetCDF GitHub pull request 458. To be consistent with NetCDF, PnetCDF
      follows the same decision by wrapping the checking with preprocessor
      conditional #ifdef NO_NC_GLOBAL_FILLVALUE (see r3403). Note NC_EGLOBAL
      will be thrown when using NC_GLOBAL in ncmpi_def_var_fill(). This is
      due to no data type information for the fill value can be passed.
    * From the releases of 1.6.1 through 1.8.1, putting attribute _FillValue
      automatically turns on the fill mode for the variable. Similarly,
      deleting attribute _FillValue turns off the fill mode. However, this
      behavior does not conform with NetCDF library. This release fixes this
      inconsistency, so putting or deleting attribute _FillValue does not
      affect a variable's fill mode. See r2951.

  o Conflict with NetCDF library
    * Null-byte padding for attribute values in file header -- The classic CDF
      specifications require header padding uses null (\x00) bytes. However,
      prior to version 4.5.0, NetCDF did not implement this specification
      entirely. In particular, it has never enforced the null-byte padding for
      attribute values (it has for others, such as names of dimension,
      variables, and attributes.) It also appears that files created by SciPy
      NetCDF module or NetCDF Java module, both developed independent from
      NetCDF-C, also fail to respect this padding specification.  This becomes
      a problem for PnetCDF to read such netCDF files, because PnetCDF enforces
      the header padding from its very first release.  The files violating the
      padding specification will not be readable by PnetCDF of all releases
      prior to 1.9.0 and error code NC_EINVAL or NC_ENOTNC will be thrown when
      opening such files.  Note if the sizes of all attribute values of your
      files are aligned with 4-byte boundaries, then the files are readable by
      PnetCDF.  In order to keep the files in question readable by PnetCDF,
      checking for null-byte padding has been disabled in 1.9.0 by default. A
      new configure command-line option "--enable-null-byte-header-padding" has
      been made available to enable the checking and error code NC_ENULLPAD
      will be thrown when opening files. Note NC_ENULLPAD is not considered a
      fatal error. Users can safely ignore it. However, we keep this checking
      in ncvalidator no matter the new configure option is set or not.
      ncvalidator is a utility program reports whether a CDF file violates the
      file format specification, including this null-byte padding. See r3528
      for source codes changed and discussion in NetCDF Github issue
      https://github.com/Unidata/netcdf-c/issues/657.

  o Issues related to MPI library vendors:
    * When using OpenMPI 2.0.0 through the latest 2.1.2 to build PnetCDF 1.8.1
      and prior, the following message may appear when running make check:
          "MPI error (MPI_File_open) : MPI_ERR_FILE: invalid file"
      but the test programs report "pass". This message can be safely ignored.
      It is due to OpenMPI failing to translate system error code ENOENT into
      MPI_ERR_NO_SUCH_FILE, but returns MPI_ERR_FILE instead. Thanks to Edgar
      Gabriel, a trick to silence the messages is to add the following to the
      command line of make check:
        TEST_SEQRUN="/path/to/OpenMPI/2.x.x/bin/mpirun --mca io romio314 -n 1"
      See discussion thread in OpenMPI:
      https://github.com/open-mpi/ompi/issues/4412
      Note this error message does not appear in PnetCDF 1.9.0 and after.
    * When using OpenMPI 2.1.1 and priors built with Intel compilers 17.0.0,
      the test program nonblocking/mcoll_testf.f90 fails with segmentation
      fault. This is due to a bug in OpenMPI. See discussion thread in OpenMPI:
      https://github.com/open-mpi/ompi/issues/3695
    * PnetCDF can no longer be built on 32-bit machines if using OpenMPI
      versions 2.0.2 and 1.10.6 and earlier versions. This is because OpenMPI
      configures type MPI_Offset as a 4-byte integer on all 32-bit machines,
      even if the machines allow 64-bit file offsets, known as large-file
      support. We suggest to use other MPI libraries to build PnetCDF on 32-bit
      machines. See the discussion thread in OpenMPI:
      https://github.com/open-mpi/ompi/issues/3195
    * Fix test/nc_test/test_read.m4 and test/testcases/modes.c which test
      whether the correct error codes can be returned when opening a
      non-existing file. Thanks to Mark Dixon for testing various MPI
      libraries, C compilers, and file systems, we found that when using
      MVAPICH2 2.2, its Lustre driver always adds O_CREAT flag to the open()
      calls. Because of this behavior, the non-existing file will be created
      with zero length, which causes PnetCDF to spew NC_ENOTNC instead of
      NC_ENOENT. A bug report has been filed to MVAPICH. The fix shall come in
      the next release of MVAPICH. The bug report can be found in
      http://mailman.cse.ohio-state.edu/pipermail/mvapich-discuss/2017-February/006300.html

  o Issues related to Darshan library:
    * When using Darshan in conjunction with PnetCDF, if you encounter
      link-time or run-time errors with messages shown below, then we recommend
      to use Darshan library version 3.1.5 and later.

      During compile/link time:
      /soft/perftools/darshan/lib/libdarshan-mpi-io.a(darshan-pnetcdf.o):
      In function `__wrap_ncmpi_create': darshan-pnetcdf.c:62: undefined
      reference to `ncmpi_create'

      During run time:
      WARNING: Darshan ncmpi_create() stub called; this is probably the result
      of a link-time problem.

  o Clarifications
    * The NetCDF CDF formats define a set of external NC data types and
      describe their intents of use, shown below.

      External type  No. Bits  Intent of use
      -------------  --------  ---------------------------------
      NC_CHAR         8        text data (the only non-numerical type in NetCDF)
      NC_BYTE         8        1-byte integer
      NC_SHORT       16        2-byte signed integer
      NC_INT         32        4-byte signed integer
      NC_FLOAT       32        4-byte floating point number
      NC_DOUBLE      64        8-byte real number in double precision
      NC_UBYTE        8        unsigned 1-byte integer
      NC_USHORT      16        unsigned 2-byte integer
      NC_UINT        32        unsigned 4-byte integer
      NC_INT64       64        signed 8-byte integer
      NC_UINT64      64        unsigned 8-byte integer

      Note NC_CHAR is the only non-numerical data type available in NetCDF
      realm.  All other external types are considered numerical, which are
      illegal to be converted (type-casted) to and from a NetCDF variable
      defined in NC_CHAR type (error code NC_ECHAR will be thrown). The only
      legal APIs to read/write a variable of type NC_CHAR are the "_text" APIs.

    * Starting from 1.7.0, PnetCDF translates internal data types (i.e. data
      types of the I/O buffer and also used in the API name such as text,
      schar, uchar, short, int, etc.) to MPI data types based on the table
      below. Note MPI_BYTE does no correspond to any internal data type used
      in NetCDF/PnetCDF APIs. Thus, when MPI_BYTE is used to construct an MPI
      derived data type which is later used as argument buftype in a flexible
      API, the error code NC_EBADTYPE will be thrown (Not a valid data type).

      Data type of                                  Corresponding
      internal I/O buffer   Example API             MPI datatype
      -------------         ----------------------  -----------------
      text                  ncmpi_put_var_text      MPI_CHAR
      schar                 ncmpi_put_var_schar     MPI_SIGNED_CHAR
      uchar                 ncmpi_put_var_uchar     MPI_UNSIGNED_CHAR
      short                 ncmpi_put_var_short     MPI_SHORT
      ushort                ncmpi_put_var_ushort    MPI_UNSIGNED_SHORT
      int                   ncmpi_put_var_int       MPI_INT
      uint                  ncmpi_put_var_uint      MPI_UNSIGNED
      long                  ncmpi_put_var_long      MPI_LONG
      float                 ncmpi_put_var_float     MPI_FLOAT
      double                ncmpi_put_var_double    MPI_DOUBLE
      longlong              ncmpi_put_var_longlong  MPI_LONG_LONG_INT
      ulonglong             ncmpi_put_var_ulonglong MPI_UNSIGNED_LONG_LONG

-------------------------------------
Version 1.8.1 (January 28, 2017)
-------------------------------------

  This release is mainly for fixing the following bug.

  o Bug fixes:
    * Fortran parameters NF_MAX_DIMS, NF_MAX_ATTRS, NF_MAX_VARS, and NF_MAX_NAME
      defined in the Fortran header file, pnetcdf.inc, were set to obsolete
      values and have been fixed in this release to conform with their
      corresponding C constants. Because these four parameters were not used
      by PnetCDF internally, the end users can safely skip this release and
      1.8.1 should perform the same as 1.8.0. If your programs explicitly use
      these four parameters, then updating to 1.8.1 is recommended.

  o Other updates:
    * To conform with GNU Coding Standards, the installation location for man
      pages are changed to ${prefix}/share/man.
    * Support of DESTDIR for Building Binary Packages has been added, as
      suggested by sunpoet@FreeBSD.org. Ticket #25

-------------------------------------
Version 1.8.0 (December 19, 2016)
-------------------------------------

  o New features
    * Copy fill values to data elements that cause out-of-bound error (i.e.
      NC_ERANGE.) In netCDF v4.4.1 and priors, type conversion for out-of-
      bound elements proceeds even if the out-of-bound error is detected, and
      the contents (in both files and read buffers) are left up to the user
      to handle. See the URL below for details.
      http://www.unidata.ucar.edu/software/netcdf/docs/group__error.html
      Instead of carrying out the type conversion, PnetCDF fills the out-of-
      bound data elements with their "fill values", as specified by the
      variable's attribute "_FillValue" or default CDF fill values if the
      attribute is not defined. Specifically, for PnetCDF put APIs, the value
      of attribute _FillValue, if defined, will be used when writing to files.
      For get APIs, the default CDF _FillValue corresponding to the internal
      data type will be used to fill the read buffer. This feature can be
      disabled by adding option "--disable-erange-fill" to the configure
      command line. In this case, the conventional NetCDF method described
      above is used.
    * A new configure option --enable-relax-coord-bound is added to provide a
      more relaxed boundary check for argument start. Traditionally, both
      NetCDF and PnetCDF detect the error code NC_EINVALCOORDS when the value
      of start is larger than or equal to the defined dimension size. This can
      be inconvenient for some applications that make a zero-length request
      with start being the dimension size, usually the last process. The new
      configure option relaxes the boundary check by allowing the above
      exception, i.e. start[i] can be the size of dimension i only when
      count[i] is zero. The default of this feature is disabled. For more
      detailed information, see discussion in:
      http://lists.mcs.anl.gov/pipermail/parallel-netcdf/2016-March/001839.html
    * New macros have been added to PnetCDF header file, pnetcdf.h, to indicate
      the configurable options that were enabled/disabled. These macros are
      PNETCDF_ERANGE_FILL, PNETCDF_SUBFILING, PNETCDF_RELAX_COORD_BOUND, and
      PNETCDF_DEBUG_MODE. Their values are set to 1 when enabled, 0 otherwise.
    * API ncmpi_inq_file_format can now detect HDF5 file signature and report
      NC_FORMAT_NETCDF4.
    * Enable ncmpidump to check whether input file is in HDF5 format when -k
      option is used at the command line.
    * In ncmpi_open, add a checking for HDF5 file signature and return error
      code NC_ENOTNC3 if detected.

  o New APIs
    * ncmpi_strerrno, nfmpi_strerrno, nf90mpi_strerrno return the string name
      of a NC error code.
    * ncmpi_inq_path, nfmpi_inq_path, nf90mpi_inq_path for inquiring the file
      pathname which was used to open/create the CDF file.

  o New optimization
    * Use Bernstein hash function for checking whether the name of a variable
      or dimension has already been used.
    * Replace the use of linked lists with arrays for storing the pending
      nonblocking requests. This could save time for traversing the linked
      list.

  o Syntax changes
    * ncmpi_cancel can now be called in define mode.

  o Semantics updates
    * For collective APIs, the following errors are considered fatal:
      NC_EBADID, NC_EPERM, NC_EINDEFINE, NC_EINDEP, and NC_ENOTINDEP. Once
      detects these errors the calling APIs return immediately. If the fatal
      errors happen only to a subset of processes, the running program may
      hang, due to other processes being waiting at an MPI collective call.
      (Note hanging will never occur to independent APIs.) To debug a hanging
      problem, users can run the program in safe mode by setting the
      environment variable PNETCDF_SAFE_MODE to 1. In safe mode, error codes
      are synchronized among all processes. Error codes other than the above,
      if detected, are not as fatal. The processes encountering the non-fatal
      errors will continue to the collective call but with zero-length
      requests. Thus, the collective calls can nicely complete without hanging.
    * Consistency check for header data (defining dimensions, variables, and
      attributes) is moved to individual APIs and only enabled when safe mode
      is enabled. Header data consistency check is no longer performed in
      ncmpi_enddef. As a reminder, PnetCDF APIs that change header data are
      all collective and their arguments are required to be consistent among
      the calling processes.
    * In netCDF-3, whether the contents of an NC_BYTE variable in CDF-1 or
      CDF-2 files are signed or unsigned is determined by the calling APIs. See
      http://www.unidata.ucar.edu/software/netcdf/docs/data_type.html#type_conversion
      "In netcdf-3, we treat NC_BYTE as signed for the purposes of conversion
      to short, int, long, float, or double. (Of course, no conversion takes
      place when the internal type is signed char.) In the _uchar functions, we
      treat NC_BYTE as if it were unsigned. Thus, no NC_ERANGE error can occur
      converting between NC_BYTE and unsigned char." In other words, if called
      from signed APIs, NC_BYTE variables are treated as signed. If called from
      unsigned APIs (i.e. _uchar APIs, the only unsigned APIs in netCDF-3) they
      are unsigned. NetCDF-3 specifically makes an exception to skip NC_ERANGE
      check when calling _uchar APIs on NC_BYTE variables. However, in netCDF-4
      and CDF-5, because of the introduction of the new data type NC_UBYTE, an
      unsigned 8-bit integer, which makes NC_BYTE a signed 8-bit integer and
      thus renders the above exception less sense. Starting from this release,
      for CDF-5 files, regular NC_ERANGE check is performed in PnetCDF for all
      APIs that access NC_BYTE variables. For CDF-1 and 2 files, PnetCDF still
      honors that exception.
    * Prior to version 1.7.0, any outstanding nonblocking requests detected at
      file close are automatically cancelled without reporting an error.
      Starting from this 1.8.0 release, error code NC_EPENDING will be returned
      when pending requests are detected at the file close.
    * API ncmpi_set_default_format is changed to an independent API. However,
      it is expected to be called by all processes that intend to create a file
      later. Inconsistency in default format setting will be detected at file
      create time.

  o New utility program
    * Added pnetcdf-config shell script to display the options used in building
      PnetCDF.

  o New error code precedence
    * When two or more errors are detected by the PnetCDF library (e.g. due to
      the use of more than one bad API argument), the error code returned from
      an API will follow the precedence below. In principle, the errors related
      to ncid is the most serious, followed by varid.
      For put attribute APIs:
          NC_EBADID, NC_EPERM, NC_ENOTVAR, NC_EBADNAME, NC_EBADTYPE, NC_ECHAR,
          NC_EINVAL, NC_ENOTINDEFINE, NC_ERANGE
      For get attribute APIs:
          NC_EBADID, NC_ENOTVAR, NC_EBADNAME, NC_ENOTATT, NC_ECHAR, NC_EINVAL,
          NC_ERANGE
      For put/get variable APIs:
          NC_EBADID, NC_EPERM, NC_EINDEFINE, NC_ENOTVAR, NC_ECHAR,
          NC_EINVALCOORDS, NC_EEDGE, NC_ESTRIDE, NC_EINVAL, NC_ERANGE

  o New error code
    * NC_EPENDING: Pending nonblocking request is found at file close.
    * NC_EINVAL_OMODE: invalid file open mode. This separates the case from the
      file create API which uses NC_EINVAL_CMODE mode. The error messages for
      both error codes are revised accordingly.
    * NC_EMULTIDEFINE_CMODE: inconsistent file create mode. This separates the
      case from NC_EMULTIDEFINE_OMODE. The error messages for both error codes
      are revised accordingly.
    * The Fortran error codes corresponding to the above are also added.

  o New test program
    * test/testcases/scalar.c to test whether arguments start, count, stride,
      and imap are properly ignored when getting/putting a scalar variable
    * test/testcases/erange_fill.m4 to test the new configure-time feature of
      --enable-erange-fill

  o Other updates:
    * Check file open/create mode for NC_DISKLESS and NC_MMAP and return error
      code NC_EINVAL_OMODE/NC_EINVAL_CMODE if either of these two modes is
      used. These modes are currently not supported.
    * Clarify support for CDF-2 and CDF-5 formats. When the size of MPI_Offset
      is less than 8 bytes, support for CDF-2 and CDF-5 is disabled.
    * When using OpenMPI 2.0.1 to build PnetCDF, users may encounter an error
      message of "test_write.c: file ./scratch.nc should not exist" or "FAILURE
      at line 429 of test_ncmpi_abort in test_write.c: expecting NC_ENOENT or
      NC_EFILE but got NC_NOERR" while running "make check". The cause is due
      to a bug in OpenMPI 2.0.1 that fails to return the correct MPI error
      class MPI_ERR_NO_SUCH_FILE when deleting a non-existing file. The bug fix
      will appear in OpenMPI 2.0.2. See the OpenMPI bug report in
      https://github.com/open-mpi/ompi/issues/2232
    * When using OpenMPI 1.10.2 and 1.8.5 to build PnetCDF, users may encounter
      an error message of "An error occurred in MPI_Type_create_hindexed" when
      running "make check". This is due to a bug in OpenMPI that fails to
      create a zero-size datatype in MPI_Type_create_hindexed. The bug fix has
      appeared in the releases of 1.10.3, 1.8.6, and 2.0.1. See the bug report
      in https://github.com/open-mpi/ompi/issues/1611
    * When using SGI MPI with MPT 2.14 to build PnetCDF, users may encounter an
      error message of "function:MPI_TYPE_CREATE_HVECTOR, Invalid argument".
      The bug fix will appear in 2.15 to be released in November 2016.
    * The quiet mode of utility program ncmpidiff, command-line option -q, now
      print no message when two files or two variables in comparison are the
      same.

  o Interoperability with netCDF-4
    * When using 1.8.0 release to build netCDF version 4.4.1.1 and earlier,
      users may encounter errors with message like "test_put.c: NetCDF: Numeric
      conversion not representable" from running command "make test".  This is
      due to an incorrect implementation of uchar APIs for accessing variables
      of type NC_BYTE for CDF-2 files in both PnetCDF and NetCDF. If not using
      such a special case, users can ignore this error. See more information
      above under "Semantics updates".

  o Bug fixes
    * Fix to allow argument no_fill in API ncmpi_inq_var_fill to be NULL. See
      r2609
    * Fix to allow putting global attribute _FillValue. See r2560
    * Fix some missing character string normalizations for names of attributes,
      dimensions, and variables.
    * Fix the return unlimited dimension ID of value -1, not 0, by Fortran API
      nfmpi_inq_unlimdim when no unlimited dimension is defined. This conforms
      with netCDF convention. See r2396 and r1372
    * Fix string processing of the environment variables for PnetCDF I/O hints
      See r2385
    * Fix utility ncmpidiff to use collective read APIs in collective data mode
      See r2382


-------------------------------------
Version 1.7.0 (March 3, 2016)
-------------------------------------

  o New features
    * Nonblocking requests now can be posted while the program is in the define
      mode. This feature enables applications to add new variables and post the
      nonblocking write requests without separating the codes by
      ncmpi_enddef(). Note ncmpi_wait_all and ncmpi_wait must still be called
      in the data mode.
    * When using immutable write buffer in put APIs on a Little Endian machine,
      the in-place byte swap operation performed internally in PnetCDF can
      cause a fatal error (by trying to change the contents of an immutable
      memory space). The solution of copying user's write request to a
      temporary buffer and perform byte swap there conflicts with PnetCDF's
      design principle of avoiding internal memory allocation as much as
      possible. Since the size of immutable buffer in most cases is small,
      PnetCDF now compromise the two by making a copy of write requests that is
      less than 4KB. Users are warned that using immutable write buffer larger
      than 4KB will still cause the fatal error in the PnetCDF default
      configuration. The way to completely disable in-place byte swap is to
      build PnetCDF with --disable-in-place-swap option at the configure time.
      In this case, the internal memory allocation in PnetCDF will increase.

  o Syntax changes
    * In ncmpi_wait_all(), ncmpi_wait(), and ncmpi_cancel(), the API's third
      argument, array of requests IDs, is changed to INOUT. Upon successful
      completion or cancellation of individual nonblocking requests, the
      corresponding request IDs are set to NC_REQ_NULL.

  o New run-time environment variables
    * PNETCDF_VERBOSE_DEBUG_MODE environment variable can be used to print the
      location in the source code where the error code is originated, no matter
      the error is intended or not. This run-time environment variable only
      takes effect when PnetCDF is configure with debug mode, i.e.
      --enable-debug is used at the configure command line.  Set this variable
      to 1 to enable. Set it to 0 or keep it unset disables this mode. Default
      is 0, i.e. disabled.  Users are warned that enabling this mode may result
      in a lot of debugging messages printed in stderr.

  o New example programs
    * examples/C/nonblocking_write_in_def.c shows an example of posting
      nonblocking write requests in the define mode.
    * examples/C/req_all.c shows an example of using NC_REQ_ALL to flush all
      pending nonblocking requests without providing the requests IDs.

  o New test program
    * test/cdf_format/dim_cdf12.c tests defining maximal dimension size for
      CDF-1 and CDF-2 file formats
    * test/testcases/test_erange.c tests if the error code NC_ERANGE can be
      correctly returned for two cases 1) get a NC_UBYTE value of 255 from a
      netCDF file to a memory buffer of type signed char and 2) put a value
      of -1 of signed char to a NC_UBYTE variable in a netCDF file
    * test/testcases/check_type.c tests if the error codes can be correctly
      returned when conflicted in-memory and external data types are used.
    * test/testcases/put_parameter.f tests the use of immutable write buffer
      (e.g. a buffer declared as PARAMETER). Note the buffer size must be
      smaller than 4KB.
    * test/nonblocking/i_varn_indef.c tests posting nonblocking requests in
      define mode.
    * test/nonblocking/req_all.c tests the use of NC_REQ_ALL for flushing
      all pending nonblocking requests without providing the requests IDs.
    * test/last_large_var.c tests the special case when there is no record
      variable, the last fixed-size variable can be larger than 2GiB in size
      if its starting file offset is less than 2GiB.
    * test/testcases/buftype_free.c and test/testcases/buftype_freef.f test
      the bug in r2160.
    * testcases/add_var.c checks the starting file offsets of newly added
      variables from re-entering the define mode.
    * testcases/attrf.f checks NF_ERANGE is returned instead of coredump. This
      is particularly for NAG Fortran compiler that may report "Arithmetics
       exception".
    * testcases/check_striping.c checks if the file striping unit and factor
      returned from MPI-IO hints are consistent among processes.
    * test/nonblocking/column_wise.c checks if PnetCDF detects interleaved
      fileviews from multiple nonblocking requests and correctly breaks and
      reconstructs the fileviews so the combined fileview is monotonic
      non-decreasing in file offsets.

  o New optimization
    * Filling variables at ncmpi_enddef() is now done by aggregating all write
      requests into one MPI collective write call. In v 1.6.1, this is done by
      filling one variable at a time.

  o New utility program
    * ncoffsets reports the file offset information, including the starting and
      ending file offsets, of variables stored in a netCDF file. ncoffsets is
      compiled with gcc if gcc is presented on the build system. Additional
      command-line options are: (-v) reports only for a selected list of
      variables in interest, (-s) prints the variable sizes, (-g) outputs the
      file space gap size from the end of previous variable, (-x) reports
      whether there is a gap between any two adjacent fixed-size variables. See
      the man page for descriptions of all command-line options and examples.

  o Semantics updates
    * All nonblocking APIs now take a NULL pointer for the request ID argument,
      meaning users do not wish to keep track of the request ID. If NULL
      request IDs are used, NC_REQ_ALL should be used when calling
      ncmpi_wait_all/ncmpi_wait to commit all the pending nonblocking requests.
      This feature relinquishes users from the responsibility of tracking the
      IDs of pending requests.
    * Using NC_REQ_ALL as the 2nd argument "num" in ncmpi_wait_all/ncmpi_wait
      APIs will flush all the pending nonblocking requests. In this case, the
      3rd and 4th arguments "array_of_requests" and "array_of_statuses" will be
      ignored and thus these two arguments can be NULLs.
    * Using NC_REQ_ALL in ncmpi_cancel() will cancel all the pending
      nonblocking requests.
    * Using NC_GET_REQ_ALL or NC_PUT_REQ_ALL in ncmpi_wait_all(), ncmpi_wait(),
      and ncmpi_cancel() for all the pending get-only or put-only requests,
      respectively.

  o Other updates:
    * Conform with netCDF on the maximal dimension size for CDF-2 file format
      to be (2^32 - 4)
    * NC_ERANGE checks have been removed from nc_test for text APIs and
      variables that are defined as NC_CHAR type
    * Add README.K-Computer build recipe for using Fujitsu MPI compilers on the
      K computer at RIKEN in Japan
    * Add README.INTEL build recipe for using Intel MPI compilers 4.x
    * Build dependency rule is added for files configure and configure.in
    * PnetCDF checks MPICC/MPICXX/MPIF77/MPIF90 instead of CC/CXX/F77/F90/FC.
      If MPICC/MPICXX/MPIF77/MPIF90 are set, PnetCDF will ignore
      CC/CXX/F77/F90/FC. If CC/CXX/F77/F90/FC is set instead of
      MPICC/MPICXX/MPIF77/MPIF90, PnetCDF will now copy them to
      MPICC/MPICXX/MPIF77/MPIF90.
    * Enforce netCDF convention on error code priority: NC_ECHAR trumps
      NC_EINVALCOORDS, NC_EEDGE, and NC_ESTRIDE.
    * Return error code NC_EGLOBAL instead of NC_ENOTVAR for APIs where using
      NC_GLOBAL as the variable ID argument is prohibited.
    * All Fortran 77 test and example programs (files with .f and .F
      extensions) have been revised to conform with 77 standard, and was tested
      using pgf77.
    * Now provides a pkg-config file
      (http://www.freedesktop.org/wiki/Software/pkg-config/), making it
      slightly easier to set the correct pnetcdf include and library paths.

  o Bug fixes
    * Fix the bus error of invalid address alignment when build with Fujitsu
      compiler. See r2171 and r2180.
    * Fix the bug for the special case when there is no record variable, the
      last fixed-size variable can be larger than 2GiB in size if its starting
      file offset is less than 2GiB. See r2166.
    * Fix the nonblocking flexible APIs that fail to save (duplicate) the user
      MPI derived data type that later is needed to unpack read data to the
      user buffer (a call to MPI_Unpack). See r2160.
    * Fix Fortran 77 constants nf_fill_uint and nf_fill_int64 (thanks Jim
      Edwards) that pgf77-based MPI compiler does not like "_8" modifier.
      See r2045 and r2051. The same issue for NAG Fortran compiler is also
      resolved. See r2089 and r2093.
    * In the example program examples/tutorial/pnetcdf-write-nb.c, the write
      buffers used in two iput API calls should be different. See r2095.
    * Fix the error reporting mechanism for NC_ERANGE, for when an arithmetic
      overflow happens. Overflow checking is now performed before I/O.

-------------------------------------
Version 1.6.1 (June 1, 2015)
-------------------------------------

  o New features
    * PnetCDF now supports fill mode. ncmpi_set_fill() can be used to set the
      fill mode for the entire data set. Note the differences from netCDF:
      1. The default mode in PnetCDF is NC_NOFILL.
      2. Setting fill mode for the entire file or individual variables must be
         done in define mode.
      3. For non-record variables, they are filled at the time ncmpi_enddef()
         is called.
      4. For record variables, users must explicitly call ncmpi_fill_var_rec()
         to fill one record at a time before writing to the record of that
         variable.

  o New APIs
    * ncmpi_def_var_fill() sets fill mode for an individual variable. This API
      must be called in define mode.
    * ncmpi_inq_var_fill() inquires fill mode of a variable.
    * ncmpi_fill_var_rec() is a collective API that fills a record of a record
      variable. This API must be called at data mode.
    * ncmpi_inq_default_format() for inquiring the default file format for
      new file creation. Note the default format can be changed by
      ncmpi_set_default_format().
    * The above new API are also available in Fortran and C++ versions.

  o New error code
    * NC_ENOTRECVAR when attempting operation only for record variables
    * NC_ENOTFILL when attempting to fill a variable when its fill mode is off
    * NC_EMULTIDEFINE_FILL_MODE when inconsistent dataset fill mode is detected
    * NC_EMULTIDEFINE_VAR_FILL_MODE when inconsistent variable fill mode is
      detected
    * NC_EMULTIDEFINE_VAR_FILL_VALUE when inconsistent variable fill value is
      detected
    * Fortran versions of the above error codes are also added.

  o New example programs
    * C/fill_mode.c shows the use of ncmpi_set_fill(), ncmpi_def_var_fill(),
      ncmpi_inq_var_fill() and ncmpi_fill_var_rec()
      F77/fill_mode.f is the Fortran version.
      F90/fill_mode.f90 is the Fortran 90 version.
      CXX/fill_mode.cpp is the C++ version.
    * C/ghost_cell.c shows how to use varm API for writing from a user buffer
      as a 2D array with ghost cells on both ends of every dimension.

  o New test programs
    * nc_test/tst_nofill.c borrowed from netCDF
    * testcases/ivarn.c tests bug fix r2023 when the request IDs stored in
      argument array_of_requests[] of ncmpi_wait_all() are not in an
      increasing order.

  o Other updates:
    * Change the chunk size used for moving variable data when the file header
      extent expands. The default is now 1MB. If the file's striping unit
      size is known (from MPI-IO hint striping_unit) then the chunk size is
      set to the striping unit size.

  o Bug fixes
    * Add missing F90 function overloading for f90mpi_put_var_all,
      f90mpi_get_var_all, f90mpi_put_vard_all, and f90mpi_get_vard_all,
      when the user buffer is a scalar.
    * Fix when the request IDs passed in argument array_of_requests[] of
      ncmpi_wait_all() are not in an increasing order. See r2023.
    * Fix C++ compile error for converting NULL to string. See r2039.

-------------------------------------
Version 1.6.0 (February 2, 2015)
-------------------------------------

  o Format conformation updates:
    * Conform with netCDF4 on CDF-1 and CDF-2 formats. The only difference now
      between the two formats are the OFFSET item in the format spec (32 vs.
      64 bit integers.) All names (variable, dimension, attribute) now allow
      extended characters (e.g. special2 and MUTF8).

  o New APIs
    * Nonblocking buffered varn API family.
      For C,   ncmpi_bput_varn_<type>()
      For F77, nfmpi_bput_varn_<type>()
      For F90, nf90mpi_bput_varn()
      For C++, NcmpiVar::bputVarn()
    * Nonblocking varn API family.
      For C,   ncmpi_iput_varn_<type>() and ncmpi_iget_varn_<type>()
      For F77, nfmpi_iput_varn_<type>() and nfmpi_iget_varn_<type>()
      For F90, nf90mpi_iput_varn()      and nf90mpi_iget_varn()
      For C++, NcmpiVar::iputVarn()     and NcmpiVar::igetVarn()
    * Blocking vard API family takes an argument of MPI derived data type that
      describes the file access layout, as opposed to vara and vars APIs that
      use start[] and count[].
      For C,   ncmpi_put_vard()    and ncmpi_get_vard()
      For F77, nfmpi_put_vard()    and nfmpi_get_vard()
      For F90, nf90mpi_put_vard()  and nf90mpi_get_vard()
      For C++, NcmpiVar::putVard() and NcmpiVar::getVard()
    * Collective var1 API family
      For C,   ncmpi_put_var1_all()        ncmpi_get_var1_all()
               ncmpi_put_var1_<type>_all() ncmpi_get_var1_<type>_all()
      For F77, nfmpi_put_var1_all()        nfmpi_get_var1_all()
               nfmpi_put_var1_<type>_all() nfmpi_get_var1_<type>_all()
      For F90, nf90mpi_put_var_all()       nf90mpi_get_var_all()
      For C++, NcmpiVar::putVar_all()      NcmpiVar::getVar_all()
    * ncmpi_inq_buffer_size() returns the size of buffer previously attached
      for use of bput APIs. With ncmpi_inq_buffer_usage() one can calculate
      the space remaining for additional bput requests.
      For F77, nfmpi_inq_buffer_size()
      For F90, nf90mpi_inq_buffer_size()
      For C++, NcmpiFile::Inq_buffer_size()
    * ncmpi_inq_recsize() returns the size of record block, i.e. the sum of
      single records of all record variables.
      For F77, nfmpi_inq_recsize()
      For F90, nf90mpi_inq_recsize()
      For C++, NcmpiGroup::getRecSize()
    * ncmpi_inq_num_rec_vars() and ncmpi_inq_num_fix_vars() report the number
      of record and fixed-size variables, respectively.
      For F77, nfmpi_inq_num_rec_vars()     and nfmpi_inq_num_fix_vars()
      For F90, nf90mpi_inq_num_rec_vars()   and nf90mpi_inq_num_fix_vars()
      For C++, NcmpiGroup::getRecVarCount() and NcmpiGroup::getFixVarCount()

  o New PnetCDF hint
    * pnetcdf_subfiling -- it can be set in an MPI info object or in the
      environment variable PNETCDF_HINTS to enable/disable subfiling.
      The value is either "enable" or "disable".

  o PnetCDF hint priority
    * The alignment hints set in the environment variable "PNETCDF_HINTS" have
      the highest priority, which overwrite the alignment hints set in
      `ncmpi__enddef()`, which overwrite the alignment hints set in the MPI_Info
      object used in the call of ncmpi_create() and ncmpi_open().

  o New error code
    * NC_ESTRICTCDF2 for attempting CDF-5 operation on CDF-2 file. For
      example, define a variable of type NC_INT64 in a CDF-2 file.
    * NC_ETYPESIZE when filetype size is bigger than the variable size
    * NC_ETYPE_MISMATCH when the element type of filetype mismatches the
      variable type
    * NC_ETYPESIZE_MISMATCH when filetype size mismatches buffer type size
    * NC_ENULLSTART when argument start is a NULL pointer
    * NC_ENULLCOUNT when argument count is a NULL pointer
    * NC_EINVAL_CMODE when invalid file create mode is set, (e.g. cannot have
      both NC_64BIT_OFFSET & NC_64BIT_DATA. In PnetCDF 1.5.0 and earlier
      versions, if both flags were set, then NC_64BIT_DATA triumphs
      NC_64BIT_OFFSET.)

  o New example programs
    * C/bput_varn_uint.c and F77/bput_varn_int8.f show the use of
      nonblocking bput_varn APIs
    * C/i_varn_int64.c and F77/i_varn_real.f show the use of nonblocking
      iput_varn and iget_varn APIs
    * C/vard_int.c F77/vard_int.f F90/vard_int.f90 CXX/vard_int.cpp show the
      use of vard API to write/read record and fixed-size variables.
    * C/transpose.c shows the use of ncmpi_put_vara_int_all to write a 3D array
      that is dimensional-transposed from the one stored in memory. Six
      transposed 3D arrays are saved whose dimensions are organized as ZYX,
      ZXY, YZX, YXZ, XZY, and XYZ. The C++, Fortran 77, and Fortran 90
      versions are also provided.

  o New test program
    * nonblocking/wait_after_indep.c tests if ncmpi_end_indep_data() returns
      properly when nonblocking APIs are called in independent data mode and
      the wait call is made after exiting the independent mode.
    * nonblocking/flexible_bput.c tests flexible bput APIs that use
      noncontiguous buffer type, noncontiguous imap and require type conversion
    * testcases/flexible2.c tests flexible APIs that perform type conversion
    * testcases/flexible_varm.c tests flexible varm APIs
    * testcases/varn_contig.c tests the case when the fileview is actually a
      contiguous chunk. PnetCDF should be able to merge all.
    * nonblocking/bput_varn_uint.c tests nonblocking bput_varn APIs
    * nonblocking/i_varn_int64.c tests nonblocking iput_varn and iget_varn APIs
    * test/testcases/test_vard.c test/testcases/test_vardf.f
      test/testcases/test_vardf90.f90 test the new vard APIs.
    * test/testcases/inq_recsize.c tests if one can correctly inquire the
      size of record block from in a netCDF file. A similar program in F90,
      named inq_recsizef.f90, is also added.
    * In test/nc_test, the test programs below are borrowed from netCDF test
      programs: t_nc.c tst_misc.c tst_norm.c tst_small.c tst_names.c
      tst_atts3.c tst_atts.c
    * test/testcases/one_record.c tests the special case defined in CDF-1 and
      CDF-2 specification that "A special case: Where there is exactly one
      record variable, we drop the requirement that each record be four-byte
      aligned, so in this case there is no record padding."
    * test/testcases/modes.c tests if correct error codes are returned when
      various file create/open modes are used.
    * Under test/testcases, varn_int.c varn_intf.f varn_real.f90 test varn APIs
    * test/testcases/inq_num_vars.c test if one can correctly inquire the
      numbers of record and fixed-size variables defined in a netCDF file.
      A similar program in F90, named inq_num_varsf.f90, is also added.
    * test/nonblocking/interleaved.c tests a combination of interleaved
      file types. This is to test the bug fix in r1758.

  o New optimization
    * Prior to this release, PnetCDF wraps each MPI read/write call in put/get
      APIs with two MPI_File_set_view(). One is before the MPI read/write call
      to take advantage of MPI's fileview feature for accessing non-contiguous
      file locations. The other is after the MPI read/write call to make the
      whole file visible, as the root process may write to file header later
      in the data mode and it alone cannot make a call to MPI_File_set_view()
      because the function is collective.

      In this release, the second MPI_File_set_view() has been removed. The
      root process's fileview is changed to always keep the whole file header
      visible. Saving a collective call to MPI_File_set_view() is expected to
      improve some performance.

  o Semantics updates
    * Header consistency mechanism has been updated. See README.consistency for
      details.
    * The use of NC_SHARE is also revised. See README.consistency for details.

  o Other updates:
    * The subfiling feature is now disabled in ncmpidump and ncmpidiff until
      a bug fix to allow reading the master file with the number of processes
      that is smaller than the number of subfiles.
    * The attribute names reserved for subfiling feature are now changed to
      use a prefix of "_PnetCDF_SubFiling". The leading "_" underscore is a CDL
      convention.
    * The flexible APIs now allow argument buftype to be MPI_DATATYPE_NULL.
      In this case, argument bufcount is ignored and argument buf's data type
      must match the data type of variable defined in the file - no data
      conversion will be done. This extension makes the flexible APIs be
      able to correspond to the netCDF APIs whose names do not contain a data
      type, e.g. nc_put_vara().
    * Type conversion between NC_BYTE and unsigned char no longer checks for
      out of range error (NC_ERANGE). CDF file format specification make a
      special case for this kind of data type conversion. See: "Note on byte
      data" in the format specification.
    * Conform with the CDF-2 and CDF-5 formats that names are normalized
      according to Unicode NFC normalization rules during encoding as UTF-8
      for storing in the file header.
    * A new configure option, --enable-large-file-test, to enable testing
      I/O on large files and large variables. Note the testing programs will
      run very slowly.

  o Bug fixes
    * fix the bug for flexible get_varn API. When buftype is noncontiguous, the
      bug forgot to "unpacks" the temporary buffer that reads data from file to
      the user buffer using buftype.
    * fix the bug in blocking flexible get APIs when buftype is noncontiguous,
      swap is needed, type conversion is not. The bug sets a NULL pointer to
      the read buffer and passes it to MPI_File_read functions. See r1815.
    * fix the bug for the NetCDF special case when there is only one record
      variable and the record size is not four-byte aligned. In this case,
      NetCDF spec says the alignment must dropped (no padding). See r1791.
    * fix the bug in nonblocking APIs when requests are resorted into
      nonoverlapping groups and the first group of file types are interleaved,
      it was mistakenly identified as non-interleaved. See r1758.
    * fix the setting for PNETCDF_RELEASE_DATE in configure.in. Using read
      command together with IFS does not work as expected in bash 4.3.11. See
      http://lists.mcs.anl.gov/pipermail/parallel-netcdf/2014-July/001586.html
      for further detailed discussion.

-------------------------------------
Version 1.5.0 (July 8, 2014)
-------------------------------------

  o New features
    * A new configure option "--disable-in-place-swap" is added. It disables
      the byte-swap operations running in-place on the user's write buffers.
      The purpose of providing this option is to deal with the problem when a
      Fortran program uses a immutable buffer for put APIs, e.g. the buffer is
      declared as a PARAMETER, and in-place byte swap on this buffer causes
      segmentation fault. See discussion threads of
      http://lists.mcs.anl.gov/pipermail/parallel-netcdf/2013-July/001498.html

      Impacts:
      1. It takes effect only on Little Endian machines.
      2. It only affects put/iput data APIs, but not attribute APIs.
      3. The INTENT of buffer arguments in all Fortran 90 put/iput APIs will be
         declared as "IN". Without this setting, the default is "INOUT".
      4. It has an impact on performance, as an extra internal temporary buffer
         will be allocated to copy data over from user's put buffer, so byte
         swap can be run on the temporary buffer.

      The default setting is to enable in-place byte swap. PnetCDF tries not to
      allocate additional memory space, due to performance concern. Users are
      discouraged to use Fortran PARAMETER buffers in put APIs.

    * A new configure option "--enable-debug" is added. It enables a memory
      allocation tracing mechanism internal in PnetCDF. In addition, it enables
      the PnetCDF safe mode. (Note that setting the environment variable
      PNETCDF_SAFE_MODE at the run time can still overwrite the safe mode.)
      Default debug mode is disabled. When enabled, a user program can call
      three new APIs below: ncmpi_inq_malloc_size, ncmpi_inq_malloc_max_size,
      and ncmpi_inq_malloc_list to obtain the size in bytes of current memory
      allocated internally. This feature uses a binary tree to manage all
      malloc buffers, e.g. tsearch() and tdelete().

    * Add three Fortran parameters for PnetCDF library version numbers:
      PNETCDF_VERSION_MAJOR, PNETCDF_VERSION_MINOR, and PNETCDF_VERSION_SUB.
      Similarly in C programs, these are defined in pnetcdf.h as constants.

  o New APIs
    * C++ APIs are now available. They are developed based on netCDF-4 C++
      library. However, users are encouraged to use C APIs, instead C++.

    * ncmpi_put_att, ncmpi_get_att, nfmpi_put_att, and nfmpi_get_att - these
      APIs correspond to nc_put_att, nc_get_att, nf_put_att, and nf_get_att.
      Note they are not the "flexible" APIs. Flexible APIs have an MPI derived
      datatype argument.

    * `ncmpi__enddef`, `nfmpi__enddef`, and `nf90mpi_enddef` - these APIs
      correspond to netCDF `nc__enddef`, `nf__enddef`, and `nf90_enddef` (with
      additional optional arguments).

    * ncmpi_inq_file_info - the naming for ncmpi_get_file_info may cause
      confusion, as "get" has a different meaning on PnetCDF. The correct
      name should use "inq". However, ncmpi_get_file_info is kept for backward
      compatibility.

    * ncmpi_inq_striping, nfmpi_inq_striping, nf90mpi_inq_striping report the
      file system striping settings of the opened file: striping size and
      striping count, if the underneath MPI-IO can find their values from the
      file system in use.

    * ncmpi_inq_malloc_size, ncmpi_inq_malloc_max_size, ncmpi_inq_malloc_list
      report the size in bytes of current memory allocated internally by
      PnetCDF. Similar APIs for Fortran 77 and 90 are also available. These
      APIs are enabled only when PnetCDF is configured with option
      --enable-debug. When this option is not enabled, calling these APIs will
      return the error code NC_ENOTENABLED. These APIs are usefully for
      debugging.

    * ncmpi_inq_files_opened reports the number of files that are currently
      opened. Similar API for Fortran 77 and 90 are also available. The API
      takes 2 arguments: number of files and array of file IDs. If the second
      argument, array of IDs, is not NULL, then it will filled with the netCDF
      dataset IDs. This API is useful for debugging.

  o Syntax changes
    * For all Fortran put/iput APIs, the INTENT of write buffer arguments is
      changed to "INOUT" on Little Endian machines, if option
      "--disable-in-place-swap" is not used at configuration. Otherwise, i.e.
      on Big Endian machines or PnetCDF is configured with
      "--disable-in-place-swap" on Little Endian machines, the INTENT is "IN".

  o New PnetCDF hint
    * nc_record_align_size - aligns the starting file offset of the record
      variable section. Note this is for the entire section, not individual
      records.

  o New error code
    * NC_ENOTENABLED indicates the API is available only when the corresponding
      feature is enabled. For example, nfmpi_inq_malloc_size() returns this
      error code when "--enable-debug" is not used at configure.

    * NC_EBAD_FILE corresponds to MPI error code MPI_ERR_BAD_FILE, meaning
      "Invalid file name (e.g., path name too long)."

    * NC_ENO_SPACE corresponds to MPI error code MPI_ERR_NO_SPACE, meaning
      "Not enough space."

    * NC_EQUOTA corresponds to MPI error code MPI_ERR_QUOTA, meaning
      "Quota exceeded."

    * NC_EMULTIDEFINE_FNC_ARGS corresponds to MPI error code MPI_ERR_NOT_SAME,
      meaning "inconsistent function arguments used in collective API."

  o New run-time environment variables
    * none

  o New example programs
    * Example programs now report if there is any PnetCDF internal malloc
      residues yet to be freed, if --enable-debug option is used at
      configure.

    * Under examples/C, three examples are added: create_open.c, get_vara.c,
      and global_attributes.c. File examples/README contains their
      descriptions.

    * Under examples/CXX, several example programs corresponding to those in
      examples/C are added.

  o New programs for I/O benchmarks
    * none

  o New test program
    * Many test programs now report if there is any PnetCDF internal malloc
      residues yet to be freed, if --enable-debug option is used at configure.

    * add tests for flexible APIs. The tests borrow from nc_test/test_write.c
      that tests nc_put_var1, nc_put_vara, nc_put_vars, and nc_put_varm.
      Similarly for get APIs.

    * testcases/record.c checks if the number of records is updated correctly.
      It writes to a variable's 2nd record followed by the 1st record. A call
      to ncmpi_inq_dim() or ncmpi_inq_dimlen() should report 2 records after
      the writes complete.

    * testcases/noclobber.c checks if error code NC_EEXIST can be returned
      correctly when NC_NOCLOBBER modes is used in ncmpi_create and in the
      meantime the file exists.

    * Some test programs are developed to run in parallel. The test mechanism
      for parallel runs is command "make ptest". Two environment variables
      can be used to set the MPI run command and output file directory:
      TEST_MPIRUN and TEST_OUTDIR. Their defaults are mpiexec and "." (current
      directory), respectively. For example,
          make ptest TEST_MPIRUN="aprun -n NP" TEST_OUTDIR=/scratch
      Note the keyword "NP" will be replaced by the different numbers of
      processes used to run the tests. The testing uses up to 8 MPI processes.

    * A sample PBS script file is provided to test "make ptest" on machines
      with a batch queue system: doc/pbs.script. This example script can be
      submitted from the build root directory (where you run "make" command to
      build PnetCDF library).

    * For cross compile environment (and batch queue system), the environment
      variable TEST_SEQRUN can be used to set the MPI run command. For example,
      the command for testing sequential programs:
          make check TEST_SEQRUN="aprun -n 1" TEST_OUTDIR=/scratch

      For non-cross compile environment, there is no need to set the environment
      variables, as long as one can run the MPI executable without mpirun or
      mpiexec.

  o New optimization
    * none

  o New utility program
    * pnetcdf_version prints the version information of the PnetCDF library and
      command-line arguments used at configure

  o Other updates:
    * Revise FLASH-IO benchmark to use nonblocking APIs for both checkpoint and
      plot writes. The control variable to switch between nonblocking and
      blocking API is "use_nonblocking_io". Set it to .FALSE. in
      flash_benchmark_io.F90 to switch to blocking APIs. Using nonblocking APIs
      is now the default.

    * To match ncdump, ncmpidump now only supports one input file.

    * Makefiles are revised for better recursive make and fixed some build
      target dependency for parallel make.

    * File creation was revised for handling NC_CLOBBER and NC_NOCLOBBER modes.
      On systems where Unix calls access() and unlink() are available, they
      are used to check if a file exits and to delete an existing file.

    * subfiling is now enabled by default. Users can use --disable-subfiling to
      disable it

    * man page of ncmpigen is updated to add the description for option "-v"
      which lets users to specify the desired output file formats, e.g.
      CDF-1, CDF-2, or CDF-5.

    * flex, lex, bison, or yacc are no longer needed for building ncmpigen.

  o Bug fixes
    * fix ncmpigen.y on parsing CDL file to get the number of records. The bug
      failed the command "make b-test", due to getting a wrong number of
      records (current value for the unlimited dimension).

    * fix the update for number of records when writing to a record that is
      not the last record.

-------------------------------------
Version 1.4.1 (December 23, 2013)
-------------------------------------

  o Bug fix:
    * Improve pnetcdf.inc portability for fixed/free-form Fortran programs

  o Fortran API syntax changes
    * For nfmpi_put_att and nf90mpi_put_att family, the intent modifier for
      the put buffer arguments are now declared as INTENT(IN).
    * For nfmpi_put_var* and nf90mpi_put_var family
      + On Big Endian machines, the intent modifier for the put buffer
        arguments are now declared as INTENT(IN).
      + On Little Endian machines, the intent modifier for the put buffer
        arguments are still declared as INTENT(INOUT). This is because PnetCDF
        does in-place byte-swap on user's put buffer. If user's buffer is
        declared as parameter, then segment fault can happen when PnetCDF
        tries to byte-swap a read-only memory.

  o Subfiling
    * Subfiling is a new PnetCDF feature that divides a file transparently
      into several smaller subfiles, each of which stores subarrays
      in CDF file formats. The file name supplied by the users serves as a
      master file that contains all metadata about array partitioning
      information among the subfiles. Because data partitioning is made
      transparently from users, data accessing is kept the same through
      the conventional PnetCDF APIs and the master file.
    * To enable this feature at configure time, add configure option
      "--enable-subfiling".


-------------------------------------
Version 1.4.0 (November 17, 2013)
-------------------------------------

  o New APIs
    * Fortran 90 APIs (adopted from netcdf-fortran-4.2). All F90 APIs have
      prefix name "nf90mpi_". The APIs support function overloading.
    * get/put_varn_<type> for reading/writing a list of subrequests (each is
      specified by starts[i][ndims] and counts[i][ndims] for subrequest i.
      ndims is the number of dimension of the variable) to a single variable.
    * multiple put/get requests with explicit buffer type names:
      ncmpi_mput_var_type(), ncmpi_mput_var1_type(), ncmpi_mput_vara_type(),
      ncmpi_mput_vars_type(), ncmpi_mput_varm_type(). Similar for get APIs.
      "type" is one of the followings: text, schar, uchar, short, ushort, int,
      uint, long, float, double, longlong, or ulonglong.
    * ncmpi_inq_nreqs() reports the number of pending nonblocking requests
    * ncmpi_inq_header_size() reports the size of the file header
    * ncmpi_inq_header_extent() reports the space currently allocated for the
      file header, (also the file offset of the first variable)
    * ncmpi_inq_put_size() reports the write amount committed by far
    * ncmpi_inq_get_size() reports the read amount committed by far
    * ncmpi_sync_numrecs() a collective API that can be called in independent
      data mode to synchronize the number of records in memory across all
      processes, and update to the file if NC_SHARE is set.

  o Syntax change for Fortran put APIs
    * intent of buffer argument in all Fortran APIs is changed to inout, as
      byte-swap might be performed directly on the buffer. This change is
      for performance consideration. For example, if the buffer is declared
      as Fortran parameter, then compile will fail.

  o New PnetCDF hint
    * nc_header_read_chunk_size: PnetCDF reads the file headers in chunks. This
      hint indicates the chunk size (in bytes). The default is 256 KB.

  o New error code
    * NC_EINTOVERFLOW reports the error of 4-byte integer overflow. This
      usually happens due to MPI-IO data type constructor APIs' arguments using
      4-byte integers.
    * Error codes to report metadata defined inconsistently across processes.
        NC_EMULTIDEFINE_OMODE      - create/open mode
        NC_EMULTIDEFINE_DIM_NUM    - number of dimensions
        NC_EMULTIDEFINE_DIM_SIZE   - size of dimension
        NC_EMULTIDEFINE_DIM_NAME   - dimension names
        NC_EMULTIDEFINE_VAR_NUM    - number of variables
        NC_EMULTIDEFINE_VAR_NAME   - variable name
        NC_EMULTIDEFINE_VAR_NDIMS  - variable's number of dimensions
        NC_EMULTIDEFINE_VAR_DIMIDS - variable's dimid
        NC_EMULTIDEFINE_VAR_TYPE   - variable's data type
        NC_EMULTIDEFINE_VAR_LEN    - variable's size
        NC_EMULTIDEFINE_NUMRECS    - number of records
        NC_EMULTIDEFINE_VAR_BEGIN  - variable file begin offset
        NC_EMULTIDEFINE_ATTR_NUM   - number of attributes
        NC_EMULTIDEFINE_ATTR_SIZE  - memory space used by attribute
        NC_EMULTIDEFINE_ATTR_NAME  - attribute name
        NC_EMULTIDEFINE_ATTR_TYPE  - attribute type
        NC_EMULTIDEFINE_ATTR_LEN   - attribute length
        NC_EMULTIDEFINE_ATTR_VAL   - attribute value

  o New run-time environment variables
    * PNETCDF_SAFE_MODE environment variable can be used to enable/disable the
      internal checking for data/argument consistency across all processes (by
      calling collective MPI_Allreduce). Set it to 1 to enable the checking.
      Default is 0, i.e. disabled.
    * PNETCDF_HINTS environment variable can be used to pass the I/O hints to
      PnetCDF library. Hints include both PnetCDF and MPI-IO hints.
      PNETCDF_HINTS is a string of hints separated by ";" and each hint is in
      the form of hint=value. E.g.
          romio_ds_write=disable;nc_header_align_size=1048576
      If this environment variable is set, it overrides any values that
      were set by using calls to MPI_Info_set in the application code.

  o New example programs
    * example programs are now categorized into C, F77, and F90 directories
    * nonblocking_write.f and nonblocking_write.f90 are the Fortran version of
      nonblocking_write.c
    * put_varn_float.c for using the new APIs ncmpi_put_varn_float_all()
      put_varn_real.f and put_varn_real.f90 are the Fortran versions
    * put_varn_int.c, put_varn_int.f, and put_varn_int.f90, for using the new
      APIs ncmpi_put_varn_int_all() and nfmpi_put_varn_int_all()
    * hints.c, hints.f, and hints.f90 for using PnetCDF hints
    * flexible_api.c, flexible_api.f, and flexible_api.f90, for using blocking
      and nonblocking flexible APIs
    * mput.c for using ncmpi_mput_vara_all() to write a series of arbitrary
      start[] and count[]
    * block_cyclic.c, block_cyclic.f, and block_cyclic.f90 are for a
      *-(block-cyclic) 2D partitioning pattern
    * column_wise.c, for a *-cyclic 2D partitioning pattern
    * put_vara.c, put_vara.f, and put_var.f90 for using for
      nfmpi_put_vara_int_all()

  o New programs for I/O benchmarks
    * benchmarks/C/aggregation.c -- evaluate PnetCDF's performance on I/O
      aggregation across multiple requests with different data access patterns.
    * benchmarks/C/write_block_read_column.c -- writes variables and reads back
      using different data partitioning patterns
    * benchmarks/FLASH-IO -- I/O kernel of FLASH, a reacting hydrodynamics code
      developed at University of Chicago. This benchmark can be built
      independently from PnetCDF release.

  o New test program
    * test/F90 contains test programs adopted from netcdf-fortran-4.2
    * test/nf90_test contains test programs adopted from test/nf_test
    * testcases/alignment_test.c -- test for header and fixed variable file
      offset alignments when entering redef mode
    * testcases/nonblocking.c -- test nonblocking APIs ncmpi_iput_vara_int()
      and ncmpi_iget_vara_int()
    * testcases/flexible.c -- test flexible API ncmpi_get_vara_int_all() using
      an MPI derived data type created by MPI_Type_create_hindex()
    * test/header/header_consistency.c -- test header inconsistency and see if
      inconsistent metadata is overwritten by root's

  o New semantics for attribute APIs in data mode
    The following APIs can modify file header while being called in data mode.
    Note that these APIs can only modify existing attributes, rename variables
    or dimensions, given that the new attributes and names do not take more
    file space than the old ones. Otherwise, these APIs are prohibited in data
    mode.
      ncmpi_rename_dim(),
      ncmpi_rename_var(),
      ncmpi_copy_att(),
      ncmpi_rename_att(), and
      ncmpi_put_att_<type>()
    Starting from this release of PnetCDF, these APIs must be called
    collectively when in data mode. This new requirement is to ensure the
    file header cached in memory is consistent across all processes.

  o New synchronization for number of records
    In collective data mode, the number of records cached in memory is
    always synchronized across all processes. In independent mode, the value
    can be inconsistent, unless ncmpi_sync_numrecs() (a collective API) is
    called explicitly. Otherwise, the synchronization will have to wait until
    the call to ncmpi_end_indep_data().

    Flushing the number of records to file when it is changed used to be
    delayed until ncmpi_close() or ncmpi_sync() is called. If a strong file
    consistency is desired, users must enable NC_SHARE mode when opening the
    file. However, note that in this mode any header change will cause file
    I/O to flush  the dirty header data (not just number of records). For
    programs that do not change header frequently, enabling NC_SHARE should
    have no significant performance impact.

    This flushing behavior has been changed in 1.4.0 to the following. At the
    end of collective calls, if the number of records increases, the changed
    value will be written to the file, no matter if NC_SHARE mode is used or
    not. This change is to ensure the number of records is up-to-dated in
    file, in case the application program does not close file (due to crash
    or programming error). Note this change applies to collective APIs only.

  o New optimization: I/O request aggregation
    The original design of nonblocking I/O is to concatenate the fileviews of
    individual nonblocking requests and serve them with a single MPI-IO call,
    if possible. However, because MPI-IO requires the file displacements of
    the flattened fileview be in a monotonically nondecreasing order, the
    original approach (in v1.3.1 and prior) divides the nonblocking requests
    into groups such that each group abides by this MPI-IO fileview
    requirement. Each group is then carried out by a separate MPI-IO call.
    Performance can be poor if there are multiple groups and each group's
    aggregate access region is non-contiguous in the file.

    This revision fixes this problem by 1) sorting the starting offset of all
    nonblocking requests into a non-decreasing order; 2) dividing the requests
    into groups (two types of groups are identified: interleaving and
    non-interleaving); 3) for each non-interleaving group, concatenating
    fileviews of all requests in the group; 4) for each interleaving group,
    flattening fileviews of all requests in the group, merging the
    offset-length pairs, and concatenating them into a new integrated fileview;
    5) concatenating the fileviews of all groups into a single one; 6) the
    final combined fileview is used by a single MPI-IO call to carry out the
    requests.  Performance is expected to be improved as the number of MPI-IO
    calls is reduced to one.

    However, be warned about the additional memory requirement. The additional
    memory needed for flattening the fileviews might be more than the I/O data
    itself. For example, a request to accessing a single column of a 2D integer
    array will result in offset-length pairs, each representing only a 4-byte
    integer where the C struct in PnetCDF for storing an offset-length pair
    takes 3*sizeof(MPI_Offset)=24 bytes (offset, length, and I/O buffer
    pointer).

  o Other updates:
    * configure.in and Makefile.in have been revised to detect MPI compilers
      and other compile options automatically.
    * A new configure option "--disable-file-sync" to disable calling file
      sync. This is to be used when the underlying file system provides data
      consistency control.
    * add build recipe for IBM BGQ (e.g. Vesta/Mira/Cetus @ANL) in README.IBM
    * add build recipe for CRAY-XE6, Hopper @NERSC in README.CRAY
    * add build recipe for CRAY-XC30, Edison @NERSC in README.CRAY
    * add build recipe for Endeavour @ NASA in README.SGI
    * add declaration of flexible APIs for Fortran 90
    * "make testing" now hides most of the stdout. Use "make verbose_testing"
      for verbose output.
    * ncmpidump: add the command-line option "-k" to report the format of
      netCDF file.
    * ncvalid is renamed to ncmpivalid, a tool to validate the structure of
      netCDF files for conforming with CDF formats.
    * Fortran type NFMPI_OFFSET is removed. It was merely a shortcut to
      integer(KIND=MPI_OFFSET_KIND). Some Fortran 77 compiler does not
      recognize keyword KIND. In that case, please set MPIF77 to the MPI
      Fortran 90 compiler, e.g. ./configure MPIF77=mpif90
    * configure now automatically checks Fortran module compile flags
    * Support additional Fortran netCDF data types: nf_ubyte, nf_ushort,
      nf_uint, nf_uint64, nf90_ubyte, nf90_ushort, nf90_uint, nf90_uint64.
    * Error codes and messages conform with netCDF's

  o Bug fixes
    * Argument unlimdimidp of nfmpi_inq() returns -1 when no unlimited length
      dimension has been defined (to conform nf_inq()).
    * Argument varid of nfmpi_inq_varoffset() is fixed to be the C's varid
      plus one.
    * For collective APIs, many places have been changed to prevent program
      from hanging if a subset of the processes got errors. The fix will allow
      all processes participating the MPI collective calls in the PnetCDF, even
      if errors are detected on a subset of processes.
    * set the nonblocking request ID to NULL when the request length is zero
    * report error when bogus request IDs are passed in ncmpi_wait
    * when entering redef with different alignment hints, fixed-size
      variables' file starting offsets will only be changed when it is bigger
      than the old ones
    * Fix some Fortran API intent in/out argument declarations
    * ncmpi_def_var is fixed to detect if CDF-5 data types is used on CDF-1 or
      CDF-2 files. Error code NC_ESTRICTNC3 will return.



-------------------------------------
Version 1.3.1 (September 24, 2012)
-------------------------------------

    This release is primarily a bug-fix release, tidying up a few issues and
    incorporating some early feedback on our "buffered put" interface (see
    http://trac.mcs.anl.gov/projects/parallel-netcdf/wiki/BufferedInterface for
    more information)

    - add a new API ncmpi_inq_buffer_usage/nfmpi_inq_buffer_usage for inquiring
      the current usage of the internal buffer allocated by the "buffered"-put
      APIs.
    - bug fix to make bput APIs properly return error code NC_EINSUFFBUF.
    - bug fixes for ncmpidump to avoid residue contents from a previous read
      when it read beyond EOF.
    - bug fixes in the tutorial example codes.
    - add more in-line comments for the tutorial example codes.
    - add the error string for error code NC_ENOENT.

-------------------------------------
Version 1.3.0 (June 26, 2012)
-------------------------------------

    - Bug fixes in new ncmpidiff tool.
    - Small optimizations to reduce communication in library.
    - Improved documentation, including more test programs and a QuickTutorial.
    - Bug fixes in our Fortran 90 support.
    - Better compatibility with NetCDF-4: no need for a modified pnetcdf.h from
      Unidata when building NetCDF-4 with PnetCDF support.
    - PnetCDF now duplicates the MPI communicator internally, which fixed at
      least one odd behavior seen in a PnetCDF-using application.
    - Improvements to PnetCDF header and variable alignment (see wiki page
      VariableAlignment).
    - Add a checking for file create mode consistency across all processes and
      an error code for it, NC_ECMODE.
    - Bug fix for updating the number of record variables in nonblocking APIs.
    - Bug fix for variable starting file offsets when defining multiple large
      variables (> 232 elements) in one CDF-5 file.
    - Add a new configure option that takes environment variable $RM to replace
      the default "rm" command in all Makefiles.
    - Bug fix for nonblocking varm APIs.
    - Support for CDF-2's special2 characters in names (variables, attributes,
      dimensions, etc.)
    - Release of the official CDF-5 file format specification (see wiki page
      CD-5).
    - Support for CDF-5 data types: NC_UBYTE, NC_USHORT, NC_UINT, NC_INT64,
      NC_UINT64, and NF_INT64.
    - New C APIs: ncmpi_put_vara_ushort, ncmpi_put_vara_uint,
      ncmpi_put_vara_longlong, and ncmpi_put_vara_ulonglong. Similarly for
      var1, var, vars and varm APIs. Also for get and nonblocking APIs.
    - New Fortran APIs: nfmpi_put_vars_int8 and similarly for var1, var, vars,
      varm, get, and nonblocking APIs.
    - Add a new error code, NC_ENOTSUPPORT, for not-yet-supported features.
    - A new set of buffered put APIs (eg. ncmpi_bput_vara_float) is added (see
      BufferedInterface). They make a copy of the user's buffer internally, so
      the user's buffer can be reused when the call returns. Their usage are
      similar to the iput APIs.
    - Add new error codes for buffered put APIs: NC_ENULLBUF,
      NC_EPREVATTACHBUF, NC_ENULLABUF, NC_EPENDINGBPUT, and NC_EINSUFFBUF.
    - Add new test and example programs for the buffered put APIs.
    - The error string returned by ncmpi_strerror() for an undefined error code
      is updated from "Unknown Error" to "Unknown Error: Unrecognized PnetCDF
      error code ID" to be more descriptive.
    - Remove the use of POSIX error codes: EINVAL, ENOERR, ERANGE, and ENOMEM.
      They are replaced by NC error codes now: NC_EINVAL, NC_NOERR, NC_ERANGE,
      and NC_ENOMEM.
    - A better translation of MPI-IO error classes to netCDF/PnetCDF error
      codes. For example, MPI-IO error class MPI_ERR_NO_SUCH_FILE is translated
      to NC_ENOENT.

    - Compatibility note

    - In testing with version 11.7 of the Portland Group compiler, some of the
      Fortran test programs fail to compile if built with pgf77. The tests work
      if built with the Fortran 90 compiler.

-------------------------------------
Version 1.2.0 (August 19, 2010)
-------------------------------------

    - Several bugs fixed, memory leaks reduced,

    - Internal housekeeping

    - Reduce the places where PnetCDF will call MPI_FILE_SYNC

    - A new 'ncmpidiff' utility to compare two datasets in parallel

    - Addressed a build failure when compiling with some versions of MVAPICH2.
      See
      http://lists.mcs.anl.gov/pipermail/parallel-netcdf/2010-July/001045.html
      for an example of the build failure.

    - If you build this release and still get "undefined reference to 'yyin'",
      then you have some stale object files. "make clean" and re-build.

    - Additional error checking for collective routines

    - We have also made API changes to our non-blocking interface. Our
      non-blocking semantics have been relaxed somewhat, and should be more
      usable in more situations.


-------------------------------------
Version 1.1.0 (November 2, 2009)
-------------------------------------

    - A new file format, CDF-5, is introduced. This format allows defining
      large array variables with more than 2^32 elements.

    - A new optimization in PnetCDF with this release. If the hint
      "striping_unit" is set, then PnetCDF will align the start of non-record
      variables to a multiple of that value.

    - A new set of APIs for reading/writing multiple variables. The existing
      asynchronous APIs have also been improved to enable combination of
      multiple variable access into fewer I/O requests.

    - There is now a simple pnetcdf.F90 module for F90 codes. Please consider
      this as an "early feedback" version and not a hard guarantee of a fixed
      F90 API (though we don't expect it to change drastically if at all).
      This module is generated from the F77 'pnetcdf.inc': thanks to
      Annette Koontz for the idea.

    - The 'ncmpigen' utility can now create "big variable" (CDF-5) files, in
      addition to the older "big file" (CDF-2) files.

-------------------------------------
Version 1.0.0 (July 27, 2005)
-------------------------------------

    - The PnetCDF developers are quite happy to announce our 1.0.0 release.
      This release reflects the culmination of several years of work and lots
      of community feedback.

      A brief list of the major changes since 0.9.4:

    - Has both the high level and flexible data mode interfaces
    - Improved support for many more platforms
    - Support for all serial NetCDF access patterns (var, vara, vars,
      varm) and types (text, char, uchar, schar, short, int, float, long,
      double)
    - Synced up with netcdf-3.6.0
    - The usual array of bug fixes and improvements.