From c371da4dd796ee46599a6c146418765c7526dbeb Mon Sep 17 00:00:00 2001 From: Jim Edwards Date: Fri, 8 Dec 2017 07:50:33 -0700 Subject: [PATCH] Squashed 'src/externals/pio1/' changes from 96b76c7..b4e6d54 b4e6d54 limit value of pio_max_var_dims 3645510 Merge pull request #1227 from NCAR/pio1_0_cime_merge 6cd47b4 fix whitespace issues pio1 git-subtree-dir: src/externals/pio1 git-subtree-split: b4e6d54044feeaa7be0b400b058735e51c3219c1 --- ChangeLog | 762 +++++++------- Doxyfile | 1498 +++++++++++++-------------- DoxygenLayout.xml | 4 +- customdoxygen.css | 54 +- doc/CAMexample.txt | 6 +- doc/Decomp.txt | 60 +- doc/DoxygenLayout.xml | 2 +- doc/Error.txt | 10 +- doc/Examples.txt | 18 +- doc/GettingStarted.txt | 14 +- doc/Installing.txt | 14 +- doc/api.txt | 6 +- doc/base.txt | 20 +- doc/example/simple-bc | 2 +- doc/example/simple-bc-rearr | 2 +- doc/example/simple-bc-rearr-pe1 | 2 +- doc/example/simple-bc-rearr-pe2 | 2 +- doc/example/simple-dof | 2 +- doc/example/simple-dof-rearr | 2 +- doc/faq.txt | 14 +- doc/images/block-cyclic-rearr.eps | 450 ++++---- doc/images/block-cyclic.eps | 450 ++++---- doc/images/dof-rearr.eps | 450 ++++---- doc/images/dof.eps | 450 ++++---- doc/testpio_example.txt | 64 +- pio/C_interface_mod.F90 | 6 +- pio/Makefile.conf.in | 6 +- pio/README.config | 4 +- pio/alloc_mod.F90.in | 22 +- pio/box_rearrange.F90.in | 106 +- pio/calcdecomp.F90 | 38 +- pio/calcdisplace_mod.F90 | 46 +- pio/fdepends.awk | 12 +- pio/iompi_mod.F90.in | 38 +- pio/ionf_mod.F90 | 72 +- pio/nf_mod.F90 | 188 ++-- pio/pio.F90 | 10 +- pio/pio_kinds.F90 | 2 +- pio/pio_mpi_utils.F90 | 4 +- pio/pio_msg_callbacks.F90 | 56 +- pio/pio_msg_getput_callbacks.F90.in | 52 +- pio/pio_msg_mod.F90 | 28 +- pio/pio_nf_utils.F90 | 8 +- pio/pio_spmd_utils.F90.in | 40 +- pio/pio_support.F90 | 40 +- pio/pio_types.F90 | 82 +- pio/pio_utils.F90 | 12 +- pio/piodarray.F90.in | 160 +-- pio/piolib_mod.F90 | 542 +++++----- pio/pionfatt_mod.F90.in | 72 +- pio/pionfget_mod.F90.in | 40 +- pio/pionfread_mod.F90.in | 12 +- pio/pionfwrite_mod.F90.in | 20 +- pio/piovdc.F90 | 26 +- pio/rearrange.F90.in | 10 +- pio/topology.c | 98 +- scripts/Utils.pm | 38 +- scripts/config.pl | 4 +- scripts/testpio_yellowstone.pl | 4 +- tests/testpio/CMakeLists.txt | 2 +- tests/testpio/MPASA30km.csh | 2 +- tests/testpio/README.testpio | 64 +- tests/testpio/build_defaults.xml | 40 +- tests/testpio/check_mod.F90 | 58 +- tests/testpio/config_bench.xml | 30 +- tests/testpio/fdepends.awk | 12 +- tests/testpio/gdecomp_mod.F90 | 36 +- tests/testpio/namelist_mod.F90 | 22 +- tests/testpio/test_lib.F90 | 50 +- tests/testpio/testdecomp.F90 | 4 +- tests/testpio/testpio.F90 | 204 ++-- tests/testpio/testpio_bench.pl | 16 +- tests/testpio/testpio_build.pl | 4 +- tests/testpio/testpio_run.pl | 18 +- tests/testpio/utils_mod.F90 | 2 +- tests/unittests/CMakeLists.txt | 2 +- tests/unittests/Levy_Notes | 4 +- tests/unittests/README | 2 +- tests/unittests/basic_tests.F90 | 2 +- tests/unittests/driver.F90 | 4 +- timing/CMakeLists.txt | 2 +- timing/ChangeLog | 70 +- timing/GPTLget_memusage.c | 12 +- timing/GPTLprint_memusage.c | 20 +- timing/GPTLutil.c | 10 +- timing/Makefile | 6 +- timing/README | 8 +- timing/XXXdotF/perf_mod.F | 422 ++++---- timing/XXXdotF/perf_utils.F | 162 +-- timing/f_wrappers.c | 20 +- timing/gptl.c | 400 +++---- timing/gptl.inc | 8 +- timing/gptl_papi.c | 142 +-- timing/perf_mod.F90 | 136 +-- timing/perf_utils.F90 | 38 +- timing/private.h | 8 +- timing/threadutil.c | 20 +- 97 files changed, 4159 insertions(+), 4159 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0d2fb680769..e6b3c2e1687 100644 --- a/ChangeLog +++ b/ChangeLog @@ -31,7 +31,7 @@ One-line : Add code for pio2 api compatability M pio/nf_mod.F90 M pio/pio.F90 M pio/piolib_mod.F90 - + =========================== Originator: jedwards/santos Date: Nov 19, 2014 @@ -76,7 +76,7 @@ Originator: jedwards Date: Feb 20, 2014 Model: pio Version: pio1_8_10 -One-line : add gptl timing library support +One-line : add gptl timing library support M 924 pio/CMakeLists.txt M 924 testpio/CMakeLists.txt @@ -138,7 +138,7 @@ One-line summary: Get cmake utilities from external repository D pio/cmake D SVN_EXTERNAL_DIRECTORIES A pio/SVN_EXTERNAL_DIRECTORIES - + =========================== Originator: jedwards Date: Dec 06, 2013 @@ -191,10 +191,10 @@ Model: pio Version: pio1_8_0 One-line summary: switch to a cmake build, updates for mira, fixes for netcdf4p - remove all autoconf support files, add cmake support files. + remove all autoconf support files, add cmake support files. it is currently required to run tests by hand, a cmake implimentation - of tests is planned but incomplete. CESM tests have been run - on this tag. + of tests is planned but incomplete. CESM tests have been run + on this tag. =============================================================== *** You must run 'make predist' in the pio subdirectory before committing. *** @@ -211,7 +211,7 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: M Calcdecomp.F90 - only mark as converged if all iotasks are counted M box_rearranger.F90.in - add code to avoid an infinate loop - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -226,11 +226,11 @@ Describe any substantial timing or memory changes: -Code reviewed by: Jim +Code reviewed by: Jim Summary of pre-tag testing: - Regression tests: + Regression tests: testpio.693883.stdout:test complete on yellowstone 103 tests PASS, 0 tests FAIL testpio.696040.stdout:test complete on yellowstone_gnu 80 tests PASS, 0 tests FAIL testpio.696166.stdout:test complete on yellowstone_pgi 80 tests PASS, 0 tests FAIL @@ -251,14 +251,14 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: M calcdecomp.F90 - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): -Bugs fixed: edge case in ROF model, problem was found in cesm test +Bugs fixed: edge case in ROF model, problem was found in cesm test ERS_N2.f19_g16.B20TRC5CN.yellowstone_intel Describe any changes made to scripts/build system: @@ -269,13 +269,13 @@ Describe any substantial timing or memory changes: Code reviewed by: Self -Summary of pre-tag testing: +Summary of pre-tag testing: - Regression tests: + Regression tests: testpio.693883.stdout:test complete on yellowstone 103 tests PASS, 0 tests FAIL testpio.696040.stdout:test complete on yellowstone_gnu 80 tests PASS, 0 tests FAIL testpio.696166.stdout:test complete on yellowstone_pgi 80 tests PASS, 0 tests FAIL - cesm1_2_rel03 prebeta yellowstone intel tests all pass. + cesm1_2_rel03 prebeta yellowstone intel tests all pass. =============================================================== @@ -286,7 +286,7 @@ Tag name: pio1_7_0 Originator(s): Jim Date: May 10, 2013 One-line Summary: Bug fix in calcdecomp, remove parameters from mpi_bcast - and pass variables to satisfy f90 module issues. + and pass variables to satisfy f90 module issues. List all subroutines eliminated: @@ -298,11 +298,11 @@ List all existing files that have been modified, and describe the changes: pionfget_mod.F90.in pionfatt_mod.F90.in piodarray.F90.in - Remove constant fields from mpi_bcast calls, these were not errors, but + Remove constant fields from mpi_bcast calls, these were not errors, but caused problems with the F90 interface in fujitsues mpi.mod calcdecomp.F90 Every io task now computes all io tasks start and count and checks them - for consistancy, if inconsistant reduce the number of io tasks by 1 and try + for consistancy, if inconsistant reduce the number of io tasks by 1 and try again. List all component tags that were used to create pio tag: @@ -311,7 +311,7 @@ Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): -Bugs fixed: +Bugs fixed: Describe any changes made to scripts/build system: @@ -348,7 +348,7 @@ Tag name: pio1_6_8 Originator(s): Jim Date: April 23, 2013 One-line Summary: minor fix in box_rearrange.F90 for mpi-serial - + M pio/box_rearrange.F90.in M pio/box_rearrange.F90 @@ -383,7 +383,7 @@ M pio/pionfput_mod.F90 - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -396,10 +396,10 @@ Describe any changes made to scripts/build system: Describe any substantial timing or memory changes: -Code reviewed by: Jim +Code reviewed by: Jim Summary of pre-tag testing: cesm prealpha testing - + Regression tests: test complete on yellowstone 103 tests PASS, 0 tests FAIL @@ -414,17 +414,17 @@ test complete on yellowstone_pgi 80 tests PASS, 0 tests FAIL Tag name: pio1_6_6 Originator(s): Jim, Alice Date: Apr 03, 2013 -One-line Summary: Documentation update, mv genf90.pl to external, bug fix in nfput for pnetcdf +One-line Summary: Documentation update, mv genf90.pl to external, bug fix in nfput for pnetcdf List all subroutines eliminated: pio_quicksort.F90 (not used), dtypes.h (now autogenerated) genf90.pl (now external) List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: - Many changes in documentation. + Many changes in documentation. pionfput_mod.F90.in: Made put_var_0d_{TYPE} explicit and seperate from put_var_{DIMS}d_{TYPE} to allow for a bug fix in 0d vars written using pnetcdf and to allow some CPP code cleanup. - + List all component tags that were used to create pio tag: genf90: genf90_130402 @@ -446,14 +446,14 @@ Summary of pre-tag testing: test complete on yellowstone_gnu 80 tests PASS, 0 tests FAIL test complete on yellowstone 103 tests PASS, 0 tests FAIL test complete on titan 102 tests PASS, 0 tests FAIL - + =============================================================== =============================================================== *** You must run 'make predist' in the pio subdirectory before committing. *** -Tag name: pio1_6_5 +Tag name: pio1_6_5 Originator(s): Jim Date: 03-07-2013 One-line Summary: minor change to work with mpi-serial @@ -464,7 +464,7 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: piolib_mod.F90 : add ifdef around MPI datatype calls (not supported by mpi-serial lib) - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -508,12 +508,12 @@ M pio/box_rearrange.F90 M pio/box_rearrange.F90.in Refactored search algorythm for ionodes significantly reducing the time required for this operation - + M testpio/build_defaults.xml A testpio/ystest.sh Changes to allow yellowstone to run netcdf4 tests, requires a new script to submit compile to caldera. - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -535,7 +535,7 @@ Summary of pre-tag testing: Regression tests: test complete on yellowstone 103 tests PASS, 0 tests FAIL cesm yellowstone prealpha tests completed (cesm1_2_alpha03c) - + =============================================================== =============================================================== *** You must run 'make predist' in the pio subdirectory before committing. *** @@ -562,7 +562,7 @@ List all existing files that have been modified, and describe the changes: pio/calcdisplace_mod.F90 - remove intent from pointer argument pio/pionfput_mod.F90.in - rework interface to pnetcdf to avoid indep_mode pio/pionfput_mod.F90 - pio/piolib_mod.F90 - add gensubarray routine to create subarray mpitype + pio/piolib_mod.F90 - add gensubarray routine to create subarray mpitype pio/piovdc.F90 - reindent file List all component tags that were used to create pio tag: @@ -602,19 +602,19 @@ M 703 testpio/testpio_run.pl - When using --twopass option do n submit job unless build completes successfully M 700 testpio/gdecomp_mod.F90 - fix a dependancy issue M 700 pio/calcdisplace_mod.F90 - fail silently on overflow of displace - array, this data is not used for pnetcdf so by failing silently + array, this data is not used for pnetcdf so by failing silently here we defer the failure of mpiio i/o until the read or write call -M 700 pio/configure.ac - change line length max to 132 to support nag +M 700 pio/configure.ac - change line length max to 132 to support nag fortran compiler M 703 pio/piolib_mod.F90 - if displace array overflows in calcdisplace_mod set filetype to mpi_datatype_null M 700 pio/configure M 700 pio/aclocal.m4 M 700 pio/config.h.in - these autoconf generated files are in the repo + these autoconf generated files are in the repo for convience - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -632,7 +632,7 @@ Code reviewed by: Jim Summary of pre-tag testing: Regression tests: Tested on challenger, titan, yellowstone with xlf, - pgi, and intel compilers + pgi, and intel compilers =============================================================== @@ -652,7 +652,7 @@ List all existing files that have been modified, and describe the changes: M pio/piolib_mod.F90 lenblocks was incorrectly set to 1 for 1D arrays M testpio/Utils.pm updates for yellowstone_pgi M testpio/testpio_run.pl match yellowstone_pgi to host yellowstone - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -691,9 +691,9 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: M piolib_mod.F90 M calcdisplace_mod.F90 - M pio_types.F90 + M pio_types.F90 + - List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -703,7 +703,7 @@ of new functionality and how user can use it): Bugs fixed: mpas decomp issue when two leading non-decomposed dimensions. Describe any changes made to scripts/build system: - Updated tests to reflect + Updated tests to reflect Describe any substantial timing or memory changes: Code reviewed by: self @@ -774,7 +774,7 @@ List all existing files that have been modified, and describe the changes: Index: testpio/testpio_run.pl Index: testpio/build_defaults.xml Index: testpio/Utils.pm - Index: pio/pionfwrite_mod.F90 + Index: pio/pionfwrite_mod.F90 Index: pio/pionfwrite_mod.F90.in Index: pio/pionfput_mod.F90 Index: pio/pionfput_mod.F90.in @@ -803,7 +803,7 @@ Summary of pre-tag testing: Regression tests: bluefire 114 tests PASS, 0 tests FAIL - yellowstone 80 tests PASS, 0 tests FAIL + yellowstone 80 tests PASS, 0 tests FAIL =============================================================== @@ -826,14 +826,14 @@ List all existing files that have been modified, and describe the changes: pio/box_rearrange.F90.in : promote some variables i4 to i8, remove debug prints pio/calcdecomp.F90 : correct product calculation to i8 pio/topology.c : remove extra print statements (bluegene only) - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): -Bugs fixed: +Bugs fixed: Describe any changes made to scripts/build system: @@ -847,7 +847,7 @@ Summary of pre-tag testing: Regression tests: bluefire 114 tests PASS, 0 tests FAIL - yellowstone 80 tests PASS, 0 tests FAIL + yellowstone 80 tests PASS, 0 tests FAIL =============================================================== =============================================================== @@ -856,7 +856,7 @@ Summary of pre-tag testing: Tag name: pio1_5_4 (ChangeLog was not updated for pio1_5_3) Originator(s): Jim Edwards Date: 9-12-2012 -One-line Summary: move testlib to test directory make sure f95 compatible when +One-line Summary: move testlib to test directory make sure f95 compatible when _COMPRESSION is not defined. Clean up pionfput_mod.F90.in List all subroutines eliminated: @@ -1016,14 +1016,14 @@ List all files added and what they do: Some helper functions for c_interoperability pio/test_lib.F90 Another vdc2 developement test - this should probably be removed. - + List all existing files that have been modified, and describe the changes: testpio/testpio.F90 testpio/namelist_mod.F90 testpio/testpio_run.pl testpio/gdecomp_mod.F90 Updated dof arrays to be i8, added a vdc test - + testpio/testpio_build.pl testpio/build_defaults.xml testpio/Makefile @@ -1052,14 +1052,14 @@ List all existing files that have been modified, and describe the changes: pio/pio_support.F90.in pio/box_rearrange.F90.in Changed several variables to be of type pio_offset and added a test to check the kind of this variable - + pio/calcdecomp.F90 Removed dead code - + List all component tags that were used to create pio tag: https://parallelio.googlecode.com/svn/libpiovdc/trunk_tags/libpiovdc_1_0_1 - + Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): @@ -1079,7 +1079,7 @@ Summary of pre-tag testing: Lynx: 80 tests pass, 0 fail Lynx_intel: 80 pass, 0 fail Intrepid(Challenger) 74 pass, 0 fail (testpio_run.pl was modified to avoid tests that are expected to fail) - + =============================================================== =============================================================== *** You must run 'make predist' in the pio subdirectory before committing. *** @@ -1106,11 +1106,11 @@ List all existing files that have been modified, and describe the changes: pio/calcdisplace_mod.F90 Fix GCD calculation bug pio/piolib_mod.F90 - Update Bluegene interface + Update Bluegene interface pio/topology.c - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -1132,7 +1132,7 @@ Summary of pre-tag testing: Regression tests: intrepid 74 tests PASS, 6 tests FAIL (expected) Bluefire: 113 tests PASS, 0 tests FAIL lynx intel : 80 tests PASS, 0 tests FAIL - lynx pgi : 80 tests PASS, 0 tests FAIL + lynx pgi : 80 tests PASS, 0 tests FAIL =============================================================== @@ -1146,10 +1146,10 @@ tests: bluefire lynx pgi lynx intel - challenger (intrepid) + challenger (intrepid) =============================================================== -Tag name: pio1_4_4 +Tag name: pio1_4_4 Originator: Jim Date: 04-18-2012 One-line Summary: Minor fixes for mpi-serial build and mpi_abort syntax @@ -1186,13 +1186,13 @@ List all existing files that have been modified, and describe the changes: testpio/Utils.pm testpio/POPB.csh - pio/pio_types.F90 + pio/pio_types.F90 pio/piolib_mod.F90 pio/pio_kinds.F90 pio/box_rearrange.F90.in pio/box_rearrange.F90 Fix some minor issues including further protections against calling mpi with invalid (comm,info) handles. - + List all component tags that were used to create pio tag: @@ -1221,7 +1221,7 @@ Tag name: pio1_4_2 Originator(s): Jim Date: 03-??-2012 One-line Summary: Correct cppdef flags around use mpi call in pio_msg_callbackes.F90 - + =============================================================== *** You must run 'make predist' in the pio subdirectory before committing. *** @@ -1240,38 +1240,38 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: -pio/calcdecomp.F90 +pio/calcdecomp.F90 Add code allowing for runtime setting of blocksize with default 884736 bytes Correct bug introduced in 1.4.0 which may cause index to exceed dimension bounds pio/calcdisplace_mod.F90 A few more variables need to be i8 for > 2GB array support -pio/pio.F90 +pio/pio.F90 Add new functions pio_set_buffer_size_limit and pio_set_blocksize to public entities -pio/piolib_mod.F90 -pio/pio_msg_callbacks.F90 +pio/piolib_mod.F90 +pio/pio_msg_callbacks.F90 Add function freedecomp_handler for async interface (fixes longstanding expected test failure) pio/pio_msg_mod.F90 Correct handling of iodesc when io is async -pio/pio_types.F90 -pio/piodarray.F90.in -pio/pionfwrite_mod.F90.in +pio/pio_types.F90 +pio/piodarray.F90.in +pio/pionfwrite_mod.F90.in Add support for buffering IO fields written using pnetcdf async interface testpio/POPDv2.csh -testpio/Utils.pm +testpio/Utils.pm testpio/build_defaults.xml testpio/namelists/testpio_in.pb06 Update hopper interface, reduce size of arrays in pb06 to prevent memory blowout - + Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): - -Bugs fixed: + +Bugs fixed: Describe any changes made to scripts/build system: @@ -1286,7 +1286,7 @@ Summary of pre-tag testing: Regression tests: Bluefire: 113 tests PASS, 0 tests FAIL lynx intel : 80 tests PASS, 0 tests FAIL Hopper pgi : 113 tests PASS, 0 tests FAIL - + =============================================================== =============================================================== @@ -1295,7 +1295,7 @@ Summary of pre-tag testing: Tag name: pio1_4_0 Originator(s): Jim Date: 02-07-2012 -One-line Summary: add i8 ldof support +One-line Summary: add i8 ldof support List all subroutines eliminated: @@ -1353,13 +1353,13 @@ List all existing files that have been modified, and describe the changes: pio/aclocal.m4 pio/iompi_mod.F90.in - Added code to detect mpi.mod and use it if it exists, falling back to the + Added code to detect mpi.mod and use it if it exists, falling back to the mpif.h if it does not. With some mpi implemenations this gives strong type checking - in the mpi interface. Made all ldof related internals size i8 and added interfaces - to call pio_initdecomp with i8 dof's, corrected calcdecomp code to consider max block - size as well as min block size. - - + in the mpi interface. Made all ldof related internals size i8 and added interfaces + to call pio_initdecomp with i8 dof's, corrected calcdecomp code to consider max block + size as well as min block size. + + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -1402,9 +1402,9 @@ List all existing files that have been modified, and describe the changes: box_rearranger.F90.in deallocate dest_ioproc and dest_ioindex after iodesc initialization. these are only needed for mpi-serial after this point. piodarray.F90.in allow for 7 possible dimensions on input arrays - this is the fortran limit. - - + + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -1432,7 +1432,7 @@ Summary of pre-tag testing: *** You must run 'make predist' in the pio subdirectory before committing. *** Tag name: pio1_3_12 -Originator(s): Jim +Originator(s): Jim Date: 10-31-2011 One-line Summary: Make flowcontrol default, add workaround for mpi_rsend bug in cray/gemini @@ -1445,9 +1445,9 @@ List all existing files that have been modified, and describe the changes: pio_support.F90.in box_rearrange.F90.in - Added code to replace MPI_RSEND, MPI_IRSEND with MPI_SEND and MPI_ISEND when _NO_MPI_RSEND is + Added code to replace MPI_RSEND, MPI_IRSEND with MPI_SEND and MPI_ISEND when _NO_MPI_RSEND is defined. Made _USE_FLOW_CONTROL the default by replacing the macro with its negative _NO_FLOW_CONTROL - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -1483,10 +1483,10 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: calcdecomp.F90 : After computing the optimal number of ioprocs we - adjust that number down to be a multiple of the last decomposed + adjust that number down to be a multiple of the last decomposed dimension. This appears to be very robust, avoiding the edge cases that all of these recent tags have tried to address. - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -1529,9 +1529,9 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: Calcdecomp.F90 - Added a correction for an unstanding edge condition in this algorytm, tested hopefully thoroghly - buildconf.xml updated settings for netcdf on bluefire + buildconf.xml updated settings for netcdf on bluefire + - List all component tags that were used to create pio tag: Describe the changes for each comdponent above that was changed relative @@ -1576,7 +1576,7 @@ List all existing files that have been modified, and describe the changes: coverage for testing the validity of this algorythm. I keep finding issues with cesm - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -1606,7 +1606,7 @@ Summary of pre-tag testing: Tag name: pio1_3_8 Originator(s): Edwards Date: 8-9-2011 -One-line Summary: Update Cacldecomp.F90 +One-line Summary: Update Cacldecomp.F90 List all subroutines eliminated: @@ -1615,7 +1615,7 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: Corrected a further edge error in calcdecomp.F90, added startandcount target to Makefile - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -1643,7 +1643,7 @@ Summary of pre-tag testing: Tag name: pio1_3_7 Originator(s): Edwards Date: 8-9-2011 -One-line Summary: Update Cacldecomp.F90 +One-line Summary: Update Cacldecomp.F90 List all subroutines eliminated: @@ -1651,10 +1651,10 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: Calcdecomp.F90 was generating bad start and count arrays when - gdims(n) was smaller than the number of io tasks. + gdims(n) was smaller than the number of io tasks. Algorythm was changed to resolve this and a unit test was added in case of further issues. - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -1689,7 +1689,7 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: pio/Makefile - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -1727,17 +1727,17 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: Index: testpio/testpio.F90 Index: testpio/build_defaults.xml - Add code to use the AMPI compiler from the NCSA CHARM++ project, this + Add code to use the AMPI compiler from the NCSA CHARM++ project, this is not working yet. Index: pio/m4/acx_mpi.m4 Updated to work on cray systems with ftn and cc Index: pio/m4/fortran.m4 - Updated to latest autoconf + Updated to latest autoconf Index: pio/alloc_mod.F90.in Index: pio/alloc_mod.F90 Added Debug code Index: pio/pio_msg_callbacks.F90 - Added an impicit none statement + Added an impicit none statement Index: pio/Makefile Index: pio/config.h.in Index: pio/Makefile.conf.in @@ -1765,7 +1765,7 @@ Code reviewed by: Summary of pre-tag testing: - Regression tests: bluefire: 74 tests PASS, 6 tests FAIL(expected) + Regression tests: bluefire: 74 tests PASS, 6 tests FAIL(expected) edinburgh: 20 pass 2 fail (expected) lynx : test complete on lynx 74 tests PASS, 6 tests FAIL (expected) @@ -1785,7 +1785,7 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: Added some debug logging in alloc_mod.F90.in Added null initialization of some pointers in pio_types.F90, this is a f95 issue. - + List all component tags that were used to create pio tag: @@ -1824,11 +1824,11 @@ List all subroutines added and what they do: added m4 subdirectory with various autoconf tools config.h.in added calcdecomp as a replacement for getiostartandcount - + List all existing files that have been modified, and describe the changes: configure.ac, Makefile.conf.in - Updated autoconf support - + Updated autoconf support + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -1840,7 +1840,7 @@ Bugs fixed: http://bugs.cgd.ucar.edu/show_bug.cgi?id=1372 Describe any changes made to scripts/build system: configure.ac was brought up to compatability with autoconf 2.63 a macros subdirectory was added with additional fortran and netcdf macros - + Describe any substantial timing or memory changes: @@ -1853,8 +1853,8 @@ Summary of pre-tag testing: jaguar (pgi) 80 tests PASS, 0 tests FAIL lynx_gnu 80 tests PASS, 0 tests FAIL edinburgh (pgi) 22 pass 2 fail (expected) - - + + =============================================================== @@ -1868,7 +1868,7 @@ One-line Summary: Code Clean up, box rearranger bug fixes List all subroutines eliminated: mct_rearrange.F90.in mct_rearrange.F90.in -List all subroutines added and what they do: +List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: testpio/build_defaults.xml @@ -1876,7 +1876,7 @@ List all existing files that have been modified, and describe the changes: pio/configure.in pio/configure pio/rearrange.F90.in - pio/pio_types.F90 + pio/pio_types.F90 pio/Makefile pio/pio.F90 Remove support for mct rearranger @@ -1888,7 +1888,7 @@ List all existing files that have been modified, and describe the changes: Remove calcdisplace code duplicated in calcdisplace_mod pio/box_rearranger.F90.in Avoid 0 sized array errors - + List all component tags that were used to create pio tag: @@ -1902,7 +1902,7 @@ Describe any changes made to scripts/build system: Removed references to mct in build Describe any substantial timing or memory changes: - + Code reviewed by: Edwards @@ -1911,7 +1911,7 @@ Summary of pre-tag testing: Cam regressions on bluefire and edinburgh with xlf, bluefire 80 tests PASS, 0 tests FAIL edinburgh (lahey) 22 pass 2 fail (expected) jaguar (pgi) 80 pass, 0 Fail - + =============================================================== =============================================================== @@ -1958,7 +1958,7 @@ Tag name: pio1_2_6 Originator(s): Jim Date: 11-19-2010 One-line Summary: Fix problems with single task run, cleanup mpi_info_set calls - make start and count args static + make start and count args static List all subroutines eliminated: @@ -1997,7 +1997,7 @@ Originator(s): Jim Date: 11-17-2010 One-line Summary: Fixed problems with single task (mpi-serial) runs. Improved lynx port - + List all subroutines eliminated: List all subroutines added and what they do: @@ -2005,8 +2005,8 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: pio/piolib_mod.F90 force rearranger to none when total tasks = 1 testpio/Utils.pm added module support for lynx - - + + List all component tags that were used to create pio tag: MCT2_7_0_100228-mpiserial101109_tag02 Describe the changes for each component above that was changed relative @@ -2026,8 +2026,8 @@ Summary of pre-tag testing: Regression tests: lynx 80 PASS 0 FAIL bluefire 107 PASS, 0 FAIL - frost 74 PASS, 6 FAIL (expected failures) - edinburgh 22 PASS, 2 FAIL (expected failures) + frost 74 PASS, 6 FAIL (expected failures) + edinburgh 22 PASS, 2 FAIL (expected failures) =============================================================== @@ -2047,19 +2047,19 @@ List all existing files that have been modified, and describe the changes: Some compilers export symbols included with include 'mpif.h even though the module is default private, fixed by using only clause in pio_types include statements - + List all component tags that were used to create pio tag: MCT2_7_0_100228-mpiserial101109_tag02 - + Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): -Bugs fixed: +Bugs fixed: Describe any changes made to scripts/build system: - added test for mirage1 - + added test for mirage1 + Describe any substantial timing or memory changes: @@ -2069,11 +2069,11 @@ Code reviewed by: self Summary of pre-tag testing: CESM lnd serial build Regression tests - test complete on mirage1 11 tests PASS, 2 tests FAIL (new system mpiserial intel compiler) + test complete on mirage1 11 tests PASS, 2 tests FAIL (new system mpiserial intel compiler) Jaguarpf 80 tests pass - frost 74 PASS, 6 FAIL (expected failures) - bluefire - edinburgh 22 pass, 2 fail (expected failures) + frost 74 PASS, 6 FAIL (expected failures) + bluefire + edinburgh 22 pass, 2 fail (expected failures) =============================================================== =============================================================== @@ -2134,8 +2134,8 @@ List all existing files that have been modified, and describe the changes: piolib_mod.F90 : Removed NEED_MPI_ROOT ifdef and replaced with NO_MPI2 and MPISERIAL wrappers pio_support.F90 : fixed bug in variable declaration (missing ::) - - + + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -2168,13 +2168,13 @@ Summary of pre-tag testing: cam stand alone and cesm tests Tag name: pio1_2_1 Originator(s): Jim, Pat Worley Date: 11-04-2010 -One-line Summary: bug fixes +One-line Summary: bug fixes -List all subroutines eliminated: +List all subroutines eliminated: -List all subroutines added and what they do: +List all subroutines added and what they do: camlike_decomp_generator: Adds a cam type deconfiguration generator for testing and performance studies - + List all existing files that have been modified, and describe the changes: Index: testpio/testpio_build.pl @@ -2185,19 +2185,19 @@ List all existing files that have been modified, and describe the changes: Index: testpio/namelist_mod.F90 Index: testpio/gdecomp_mod.F90 Index: testpio/Utils.pm - Added support for a realistic cam-like decomp, added a new host edinburgh_openmpi, bug fix for + Added support for a realistic cam-like decomp, added a new host edinburgh_openmpi, bug fix for mpich-1 on edinburgh (MPI_ROOT is not defined in mpif.h) Updated intrepid flags to use netcdf-4 - + Index: pio/aclocal.m4 Index: pio/configure Index: pio/configure.ac Fixed a bug in getting mpif90 from the environment - + Index: pio/piolib_mod.F90 Index: pio/ionf_mod.F90 Improved Debug print statements, code clean up - + Index: pio/nf_mod.F90 Renamed some variables which had the same name as the fortran len intrensic @@ -2209,8 +2209,8 @@ List all existing files that have been modified, and describe the changes: piolib_mod pio_support Removed references to mpi_comm_world - - + + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -2229,17 +2229,17 @@ Code reviewed by: self Summary of pre-tag testing: cam regressions on bluefire - Regression tests: + Regression tests: bluefire 107 tests PASS, 0 tests FAIL jaguar 80 tests PASS, 0 tests FAIL - intrepid 60 tests PASS, 5 tests FAIL + intrepid 60 tests PASS, 5 tests FAIL Support for async on bluegene is incomplete in this tag. test complete on edinburgh 22 tests PASS, 2 tests FAIL - snet asb01 FAIL - snet asb04 FAIL - These are expected failures due to mpich not - supporting MPI-2 intercommunicators - + snet asb01 FAIL + snet asb04 FAIL + These are expected failures due to mpich not + supporting MPI-2 intercommunicators + =============================================================== =============================================================== @@ -2250,7 +2250,7 @@ Originator(s): Jim Date: 10-14-2010 One-line Summary: Support for disjoint IO tasks -List all subroutines eliminated: +List all subroutines eliminated: List all subroutines added and what they do: A + - pio_msg_callbacks.F90 @@ -2258,15 +2258,15 @@ A + - pio_msg_getput_callbacks.F90.in The subroutines in these files are the interface between the disjoint io tasks and the pio functions, to avoid circular dependencies they are not written in module form. Each subroutine collects the input arguments from the compute - tasks and calls the requested function. Communication of function outputs back to the + tasks and calls the requested function. Communication of function outputs back to the compute tasks happens within the function so no post call clean up is required. - + A + - pio_msg_mod.F90 - This module contains the loop in which the disjoint io tasks wait for requests from + This module contains the loop in which the disjoint io tasks wait for requests from compute tasks. Multiple compute communicators with distinct iosystem descripters are - supported. + supported. + - A + - dtypes.h Move type macros to an include file to be shared by multiple pio internal files @@ -2292,7 +2292,7 @@ List all existing files that have been modified, and describe the changes: mct_rearrange.F90 Add support for disjoint io tasks. Add tests for disjoint tasks to testsuite. - Improve support for netcdf4. + Improve support for netcdf4. List all component tags that were used to create pio tag: @@ -2303,7 +2303,7 @@ of new functionality and how user can use it): Bugs fixed: -Describe any changes made to scripts/build system: Added new files to build +Describe any changes made to scripts/build system: Added new files to build Describe any substantial timing or memory changes: @@ -2331,7 +2331,7 @@ List all existing files that have been modified, and describe the changes: piolib_mod.F90: removed fanning functionality in getiostartandcount this feature was not robust and was failing to converge in a number of cases. Fixed a case which allowed division by 0 if count(1)==0. - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -2353,7 +2353,7 @@ Summary of pre-tag testing: bluefire 107 tests PASS, 0 tests FAIL jaguar 74 tests PASS, 0 tests FAIL edinburg 22 tests PASS, 0 tests FAIL - + =============================================================== =============================================================== *** You must run 'make predist' in the pio subdirectory before committing. *** @@ -2369,7 +2369,7 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: piolib_mod.F90 correct #enddef placement. - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -2386,13 +2386,13 @@ Describe any substantial timing or memory changes: Code reviewed by: Jim -Summary of pre-tag testing: +Summary of pre-tag testing: Regression tests: bluefire 107 tests PASS, 0 tests FAIL jaguar 80 tests PASS, 0 tests FAIL test complete on edinburgh 22 tests PASS, 2 tests FAIL - snet asb01 FAIL - snet asb04 FAIL - These are expected failures due to mpich not + snet asb01 FAIL + snet asb04 FAIL + These are expected failures due to mpich not supporting MPI-2 intercommunicators =============================================================== @@ -2402,7 +2402,7 @@ Summary of pre-tag testing: Tag name: pio1_1_0 Originator(s): Jim Date: 05-20-2010 -One-line Summary: code cleanup, improved netcdf4 performance +One-line Summary: code cleanup, improved netcdf4 performance List all subroutines eliminated: @@ -2428,23 +2428,23 @@ List all existing files that have been modified, and describe the changes: improved error message configure.ac added HAVE_MPI flag needed by timing - pionfput_mod.F90.in + pionfput_mod.F90.in fixed a bug that created a potential race condition in the pnetcdf interface piolib_mod.F90 - Explicitly read input arguments on task 0 and ignore + Explicitly read input arguments on task 0 and ignore others in pio_init, pio_openfile and pio_createfile calls. pio_kinds.F90 Increase default string length - box_rearrange.F90.in + box_rearrange.F90.in Moved stdout info to debug mode only ionf_mod.F90 Improved error handling - - - + + + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -2463,10 +2463,10 @@ Summary of pre-tag testing: Regression tests: bluefire 107 tests PASS, 0 tests FAIL - edinburgh 22 tests PASS, 0 tests FAIL + edinburgh 22 tests PASS, 0 tests FAIL edinburgh_intel 22 tests PASS, 0 tests FAIL - intrepid - jaguarpf + intrepid + jaguarpf =============================================================== @@ -2479,12 +2479,12 @@ Originator(s): John Date: 03-19-2010 One-line Summary: Reworked testpio execution scripts -List all subroutines eliminated: +List all subroutines eliminated: List all subroutines added and what they do: - * runString creates a 'mpirun' string for a particular system (Utils.pm) - * submitString creates a 'qsub' string for a particular system (Utils.pm) + * runString creates a 'mpirun' string for a particular system (Utils.pm) + * submitString creates a 'qsub' string for a particular system (Utils.pm) List all existing files that have been modified, and describe the changes: @@ -2498,7 +2498,7 @@ Bugs fixed: pgi compiler could not open large files with direct access thus cau Describe any changes made to scripts/build system: - Reworked the testpio execution scripts such that the number of cores is now a + Reworked the testpio execution scripts such that the number of cores is now a command line arguement. Added preliminary support for columbia Describe any substantial timing or memory changes: @@ -2509,7 +2509,7 @@ Summary of pre-tag testing: Regression tests: bluefire 107 tests PASS, 0 tests FAIL - edinburgh 22 tests PASS, 0 tests FAIL + edinburgh 22 tests PASS, 0 tests FAIL edinburgh_intel 22 tests PASS, 0 tests FAIL frost 74 tests PASS, 0 tests FAIL kraken 74 tests PASS, 0 tests FAIL @@ -2542,14 +2542,14 @@ Describe any changes made to scripts/build system: Describe any substantial timing or memory changes: -Code reviewed by: self +Code reviewed by: self Summary of pre-tag testing: Regression tests: ccsm regression on jaguar bluefire 107 tests PASS, 0 tests FAIL - edinburgh 22 tests PASS, 0 tests FAIL + edinburgh 22 tests PASS, 0 tests FAIL edinburgh_intel 22 tests PASS, 0 tests FAIL frost 75 tests PASS, 0 tests FAIL jaguar 75 tests PASS, 0 tests FAIL @@ -2579,10 +2579,10 @@ List all existing files that have been modified, and describe the changes: - Moved some host specific code into Utils.pm - Marked code in the perl scripts that are host specific - Allowed the use of negative numIOprocs in namelist for BGL - - Removed the b14 benchmark. This was only added as experimental - code and it exceeds memory on Blue Genel/L when running on + - Removed the b14 benchmark. This was only added as experimental + code and it exceeds memory on Blue Genel/L when running on 64 MPI tasks. - - Removed the 'bench' testsuite. This was only added as + - Removed the 'bench' testsuite. This was only added as experimental code. - Added support for Kraken in PIO testsuite - Added script support in tesetpio_run.pl on Frost. @@ -2609,7 +2609,7 @@ Summary of pre-tag testing: Regression tests: bluefire 107 tests PASS, 0 tests FAIL ** frost 74 tests PASS, 0 tests FAIL ** - kraken 74 tests PASS, 0 tests FAIL + kraken 74 tests PASS, 0 tests FAIL CAM regression ccsm pretags @@ -2650,7 +2650,7 @@ Summary of pre-tag testing: Regression tests: bluefire 119 tests PASS, 0 tests FAIL - edinburgh 22 tests PASS, 0 tests FAIL + edinburgh 22 tests PASS, 0 tests FAIL edinburgh_intel 22 tests PASS, 0 tests FAIL frost 75 tests PASS, 0 tests FAIL jaguar 75 tests PASS, 0 tests FAIL @@ -2676,7 +2676,7 @@ List all existing files that have been modified, and describe the changes: internal start and count arrays were dependent on the lengths of the start and count arrays passed in. They should instead be dependent on the number of dimensions of the variable being read or written. - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -2696,7 +2696,7 @@ Summary of pre-tag testing: Regression tests: bluefire 119 tests PASS, 0 tests FAIL - edinburgh 22 tests PASS, 0 tests FAIL + edinburgh 22 tests PASS, 0 tests FAIL edinburgh_intel 22 tests PASS, 0 tests FAIL frost 75 tests PASS, 0 tests FAIL jaguar 75 tests PASS, 0 tests FAIL @@ -2718,7 +2718,7 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: piolib_mod : corrected assumptions about number of decomp dimensions and number of tasks in io. - + List all component tags that were used to create pio tag: @@ -2737,10 +2737,10 @@ Describe any substantial timing or memory changes: Code reviewed by: Jim Summary of pre-tag testing: - + Regression tests: bluefire 119 tests PASS, 0 tests FAIL - edinburgh 22 tests PASS, 0 tests FAIL + edinburgh 22 tests PASS, 0 tests FAIL edinburgh_intel 22 tests PASS, 0 tests FAIL frost 75 tests PASS, 0 tests FAIL jaguar 75 tests PASS, 0 tests FAIL @@ -2754,51 +2754,51 @@ Summary of pre-tag testing: Tag name: pio1_0_11 (No changelog entry was made for pio1_0_10) Originator(s): Jim, John Date: 02-24-2010 -One-line Summary: Blue Gene specific optimization +One-line Summary: Blue Gene specific optimization List all subroutines eliminated: - Removed the Makefile.conf.bluefire and changed testpio_run.pl so that configure is + Removed the Makefile.conf.bluefire and changed testpio_run.pl so that configure is run using the bash shell on bluefire. (ksh is slow) - -List all subroutines added and what they do: - - PIO_getnumiotasks: This returns the actual number of IO tasks + +List all subroutines added and what they do: + + PIO_getnumiotasks: This returns the actual number of IO tasks used by PIO. - + nextlarger: Calculates the next larger value which even divides an input arguement. - determineiotasks: A special routine only for Blue Gene which will load balance + determineiotasks: A special routine only for Blue Gene which will load balance io-tasks accross IO-nodes identity: A Blue Gene specific routine which prints out node identity - + List all existing files that have been modified, and describe the changes: pio/configure.ac - Added CFLAGS to configure stdout - + Added CFLAGS to configure stdout + pio/pio_types.F90 - - Moved ioranks array into type declaration. This is a - necessary generalization because we no longer have even - strides for the IO ranks. + + Moved ioranks array into type declaration. This is a + necessary generalization because we no longer have even + strides for the IO ranks. pio/piolib_mod.F90 - getiostartandcount has been generallized the provide more + getiostartandcount has been generallized the provide more functionality including: - - Block decomposition in the z-dimension - - A fan-in/out limiter for the decomposition creation loop - - PIO_inidecomp_dof has been modified to call determineiotasks - if on a Blue Gene system + - Block decomposition in the z-dimension + - A fan-in/out limiter for the decomposition creation loop + + PIO_inidecomp_dof has been modified to call determineiotasks + if on a Blue Gene system add BGP and BGL ifdef - pio/Makefile + pio/Makefile Includes the Blue Gene specific topology.c file @@ -2808,8 +2808,8 @@ List all existing files that have been modified, and describe the changes: pio/pio.F90 - exported public PIO_getnumiotasks subroutine - + exported public PIO_getnumiotasks subroutine + testpio/testpio_build.pl @@ -2818,20 +2818,20 @@ List all existing files that have been modified, and describe the changes: testpio/tstpio.F90 - Added test which only allocates arrays if they are used by the code. - - Added the option to do 2-phase pass to measure performance. The - first phase writes out all files, while the second phase will read all - files. This 2-phase approach does a better job of filtering out the - impact of read-caching on performance measurements. + Added test which only allocates arrays if they are used by the code. + + Added the option to do 2-phase pass to measure performance. The + first phase writes out all files, while the second phase will read all + files. This 2-phase approach does a better job of filtering out the + impact of read-caching on performance measurements. Fixed the diagnostic which prints out the location of the maximum memory usage - testpio/testpio_run.pl + testpio/testpio_run.pl Added the new testsuite 'bench' - testpio/build_defaults.xml + testpio/build_defaults.xml updated the version of pnetcdf on frost @@ -2852,20 +2852,20 @@ Describe any changes made to scripts/build system: Describe any substantial timing or memory changes: - Blue Gene specific optimizations that balance the number of io-tasks to io-nodes. + Blue Gene specific optimizations that balance the number of io-tasks to io-nodes. - Added test which only allocates arrays if they are used by the code. + Added test which only allocates arrays if they are used by the code. - Added the option to do 2-phase pass to measure performance. The - first phase writes out all files, while the second phase will read all - files. This 2-phase approach does a better job of filtering out the - impact of read-caching on performance measurements. + Added the option to do 2-phase pass to measure performance. The + first phase writes out all files, while the second phase will read all + files. This 2-phase approach does a better job of filtering out the + impact of read-caching on performance measurements. Code reviewed by: John, Jim Summary of pre-tag testing: bluefire 119 tests PASS, 0 tests FAIL - edinburgh 22 tests PASS, 0 tests FAIL + edinburgh 22 tests PASS, 0 tests FAIL edinburgh_intel 22 tests PASS, 0 tests FAIL frost 75 tests PASS, 0 tests FAIL jaguar 75 tests PASS, 0 tests FAIL @@ -2881,7 +2881,7 @@ Originator(s): Jim, Pat Worley Date: One-line Summary: handshaking for cray -List all subroutines eliminated: +List all subroutines eliminated: List all subroutines added and what they do: pnetcdf_version_check check that the pnetcdf version is new enough for pio @@ -2927,8 +2927,8 @@ List all existing files that have been modified, and describe the changes: requirements (allocate/assignment/deallocate). Since this is similar to what is used in USESPACE, I doubt that we will notice any difference. - - + + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -2983,8 +2983,8 @@ M 58 configure.ac M 58 aclocal.m4 Added support for netcdf4, two new iotypes are defined PIO_IOTYPE_NETCDF4C and PIO_IOTYPE_NETCDF4P for compressed and parallel options of netcdf4. Files opened for read should open in the correct - format - + format + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -2995,19 +2995,19 @@ Bugs fixed: Describe any changes made to scripts/build system: Added tests for netcdf4 on bluefire - - + + Describe any substantial timing or memory changes: -Code reviewed by: Jim +Code reviewed by: Jim Summary of pre-tag testing: bluefire: 107 tests PASS, 0 tests FAIL frost : 74 tests PASS, 0 tests FAIL dublin : 22 tests PASS, 0 tests FAIL - Regression tests: Tested in cam + Regression tests: Tested in cam =============================================================== @@ -3026,7 +3026,7 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: piolib_mod.F90 corrected case of cpp macros - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -3074,12 +3074,12 @@ Describe any changes made to scripts/build system: Removed the mct requirement Removed OPT flags added by default in configure, no OPT flags are included unless explicitly added by the user. - + Describe any substantial timing or memory changes: Code reviewed by: Jim and John -Summary of pre-tag testing: +Summary of pre-tag testing: Regression tests: Bluefire, frost, dublin (pgi and intel) all tests pass @@ -3089,7 +3089,7 @@ Summary of pre-tag testing: Tag name: pio60_prod Originator(s): Jim Date: 12-07-2009 -One-line Summary: Fix problems when using lahey compiler, fix last two +One-line Summary: Fix problems when using lahey compiler, fix last two problems in testsuite. List all subroutines eliminated: @@ -3105,15 +3105,15 @@ List all existing files that have been modified, and describe the changes: with intrensic of same name. piolib_mod.F90 : Modified GenIndexedBlock to allow for 0 length writes thus allowing tests bn01 and bn03 to pass. - pio_support.F90.in: Removed a #ifdef USEMPIIO that was unneeded. + pio_support.F90.in: Removed a #ifdef USEMPIIO that was unneeded. - genf90.pl : Modified to print line numbers at the beginning of routines + genf90.pl : Modified to print line numbers at the beginning of routines instead of the end. This should make line numbers from compilers and debuggers more accurate. - iompi_mod.F90.in : + iompi_mod.F90.in : + - List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -3122,7 +3122,7 @@ of new functionality and how user can use it): Bugs fixed: fixed the bn01 and bn03 tests. - + Describe any changes made to scripts/build system: Describe any substantial timing or memory changes: @@ -3132,9 +3132,9 @@ Code reviewed by: self Summary of pre-tag testing: all 74 tests PASS on bluefire, frost and Jaguar all 22 tests PASS on dublin using lahey and intel compilers. - + Regression tests: - + =============================================================== =============================================================== @@ -3142,7 +3142,7 @@ Summary of pre-tag testing: Tag name: pio59_prod Originator(s): Jim -Date: 10-20-2009 +Date: 10-20-2009 One-line Summary: bug fix in pio_get_var List all subroutines eliminated: @@ -3152,7 +3152,7 @@ List all subroutines added and what they do: List all existing files that have been modified, and describe the changes: Renamed functions in nf_mod to avoid redirection, this was done for the intel compiler Updated ChangeLog_template - + List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative @@ -3221,17 +3221,17 @@ of new functionality and how user can use it): pionf_mod.F90.in fixed a bug that caused text writes to fail if the text variable included the netcdf unlimited dimension -genf90.pl fixed preprocessor line numbering to refer to correct .in +genf90.pl fixed preprocessor line numbering to refer to correct .in file line numbers. Debuggers and core files should now point back to - the correct source line. + the correct source line. pio_spmd_utils.F90.in : Changed send to isend in handshaking algorythm to avoid potential deadlock should mpi buffers become filled. pio_types.F90 removed definition of MPI_INFO_NULL when compiled with mpi-serial, mpi-serial already defines this variable. - + Bugs fixed: - + Describe any changes made to scripts/build system: Describe any substantial timing or memory changes: @@ -3284,29 +3284,29 @@ Originator(s): Jim Date: 09-29-09 One-line Summary: New test scripts. Added support for multidimensional darrays. New documentation - -List all component tags that were used to create pio tag: + +List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): There is no longer a need to flatten multidimensional arrays when calling - pio_read_darray and pio_write_darray. + pio_read_darray and pio_write_darray. Bugs fixed: -Describe any changes made to scripts/build system: testpio_build.pl and testpio_run.pl - replace individual csh scripts. +Describe any changes made to scripts/build system: testpio_build.pl and testpio_run.pl + replace individual csh scripts. Describe any substantial timing or memory changes: Code reviewed by: self Summary of pre-tag testing: Tested on bluefire, frost, dublin, athena, jaguar - 70 tests now pass and 4 fail - (bn01 and bn03). + 70 tests now pass and 4 fail - (bn01 and bn03). Tests were also run with the cam testsuite. - + Regression tests: @@ -3358,9 +3358,9 @@ of new functionality and how user can use it): Bugs fixed: -Describe any changes made to scripts/build system: +Describe any changes made to scripts/build system: -Describe any substantial timing or memory changes: +Describe any substantial timing or memory changes: Code reviewed by: self @@ -3384,11 +3384,11 @@ Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): -Added a new variable to the testpio_in namelist: nvars +Added a new variable to the testpio_in namelist: nvars which controls the number of variables written to the r4 and r8 files also added an unlimited dimension to test file variables moved setframe calls in testpio - + Bugs fixed: Describe any changes made to scripts/build system: @@ -3397,7 +3397,7 @@ Describe any substantial timing or memory changes: Code reviewed by: self -Summary of pre-tag testing: +Summary of pre-tag testing: Regression tests: bluefire test suite (12 failures expected) @@ -3420,7 +3420,7 @@ to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): -Bugs fixed: +Bugs fixed: Describe any changes made to scripts/build system: @@ -3438,7 +3438,7 @@ Summary of pre-tag testing: Cam regressions (all pass). bluefire test suite ( Tag name: pio50_prod Originator(s): Jim, Tony, Mariana, John Date: 7-1-2009 -One-line Summary: bug fix in piolib_mod to accept base=0. +One-line Summary: bug fix in piolib_mod to accept base=0. fixed intel compiler line length problem fixed getiostartandcount for large processor counts fixed problems and improved testing on bluegene platforms @@ -3448,7 +3448,7 @@ List all component tags that were used to create pio tag: timing https://svn-ccsm-models.cgd.ucar.edu/timing/trunk_tags/timing_081221 testpio/perl5lib https://svn-ccsm-models.cgd.ucar.edu/perl5lib/trunk_tags/perl5lib_090613/ - + Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): @@ -3459,14 +3459,14 @@ Bugs fixed: Describe any changes made to scripts/build system: Began working on improved test scripts using xml and perl - this is a work in progress, your contribution would be welcome. - + Describe any substantial timing or memory changes: Code reviewed by: Jim Summary of pre-tag testing: - Regression tests: + Regression tests: bluefire: 62 PASS, 12 FAIL @@ -3481,13 +3481,13 @@ One-line Summary: Improved boxrearranger performance List all component tags that were used to create pio tag: mct https://svn-ccsm-models.cgd.ucar.edu/mct/trunk_tags/MCT2_5_1_080912 - timing https://svn-ccsm-models.cgd.ucar.edu/timing/trunk_tags/timing_081221 - + timing https://svn-ccsm-models.cgd.ucar.edu/timing/trunk_tags/timing_081221 + Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): - Disabled timing tests in frost test suite - the timing library needs a few changes + Disabled timing tests in frost test suite - the timing library needs a few changes to work on frost Replaced getiostartandcount with an algorithm provided by Tony, this is doing a better job of decomposing into optimal strips @@ -3498,15 +3498,15 @@ of new functionality and how user can use it): processor. This reduces the number of expected failures from 13 to 12. Changed cpp formating in box_rearranger.F90.in to satisfy fussy cpp in intel compiler. - + Bugs fixed: Describe any changes made to scripts/build system: - Disabled timing tests in frost test suite - the timing library needs a few changes + Disabled timing tests in frost test suite - the timing library needs a few changes to work on frost Describe any substantial timing or memory changes: - + Code reviewed by: Jim, Mariana Summary of pre-tag testing: testpio suite on bluefire and frost @@ -3514,7 +3514,7 @@ Summary of pre-tag testing: testpio suite on bluefire and frost Regression tests: bluefire: 62 PASS, 12 FAIL - frost : + frost : =============================================================== @@ -3529,9 +3529,9 @@ One-line Summary: Added support for benchmark and testsuite on frost List all component tags that were used to create pio tag: mct https://svn-ccsm-models.cgd.ucar.edu/mct/trunk_tags/MCT2_5_1_080912 - timing https://svn-ccsm-models.cgd.ucar.edu/timing/trunk_tags/timing_081221 + timing https://svn-ccsm-models.cgd.ucar.edu/timing/trunk_tags/timing_081221 - Added support for the benchmark and testsuite on frost. + Added support for the benchmark and testsuite on frost. Bugs fixed: @@ -3545,7 +3545,7 @@ Summary of pre-tag testing: Regression tests: A total of 50 passed and 24 failures. - + =============================================================== =============================================================== *** You must run 'make predist' in the pio subdirectory before committing. *** @@ -3557,7 +3557,7 @@ One-line Summary: Added communications options to box_rearranger List all component tags that were used to create pio tag: mct https://svn-ccsm-models.cgd.ucar.edu/mct/trunk_tags/MCT2_5_1_080912 - timing https://svn-ccsm-models.cgd.ucar.edu/timing/trunk_tags/timing_081221 + timing https://svn-ccsm-models.cgd.ucar.edu/timing/trunk_tags/timing_081221 Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description @@ -3575,7 +3575,7 @@ of new functionality and how user can use it): to enable the different options. 1) Out of the box, the original cam3_6_39 algorithms - are used. + are used. 2) Compiling with @@ -3620,7 +3620,7 @@ of new functionality and how user can use it): and recompile. - + Bugs fixed: @@ -3635,7 +3635,7 @@ Summary of pre-tag testing: Regression tests: Passed all expected tests on bluefire and jaguar (13 expected failures on each) Passed cam regression tests - + =============================================================== =============================================================== @@ -3656,11 +3656,11 @@ of new functionality and how user can use it): * Reduced the amount of memory used in gdecomp_DOF subroutine * Added several new benchmark configurations - * Addressed bug in decomposition calculation algorithm + * Addressed bug in decomposition calculation algorithm * Added support for full specification of IO decomposition - using namelist + using namelist * Added output of maximum memory across processors in testpio code - + Bugs fixed: @@ -3685,20 +3685,20 @@ Originator(s): Jim, Pat Worley Date: 05-19-09 One-line Summary: Changed send recv algorythm in pionfwrite_mod, minor bug fixes -List all component tags that were used to create pio tag: +List all component tags that were used to create pio tag: mct https://svn-ccsm-models.cgd.ucar.edu/mct/trunk_tags/MCT2_5_1_080912 timing https://svn-ccsm-models.cgd.ucar.edu/timing/trunk_tags/timing_081221 - + Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): - + Added handshaking to make sure that irecv is posted prior to send in communications for netcdf output method in pionfwrite_mod. - Replaced mpi_int with mpi_integer. + Replaced mpi_int with mpi_integer. - -Bugs fixed: + +Bugs fixed: Describe any changes made to scripts/build system: @@ -3721,26 +3721,26 @@ Originator(s): Jim Date: 05-15-09 One-line Summary: Rewrite getiostartandcount routine in piolib_mod.F90 -List all component tags that were used to create pio tag: +List all component tags that were used to create pio tag: mct https://svn-ccsm-models.cgd.ucar.edu/mct/trunk_tags/MCT2_5_1_080912 timing https://svn-ccsm-models.cgd.ucar.edu/timing/trunk_tags/timing_081221 - + Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): - + A complete rewrite of thegetiostartandcount routine includes 3 options for - how arrays should be decomposed onto the io processors plus allows the - user to specify start and count arrays at the application level. + how arrays should be decomposed onto the io processors plus allows the + user to specify start and count arrays at the application level. The initdecomp interface therefor has three additional optional parameters - + initDecomp_1dof_nf_box(Iosystem,basepioTYPE,dims,compDOF, IOdesc, start, count, method_in) where start and count are of type PIO_OFFSET and have the same number of dimensions as dims and method_in is an integer with value 1 (inner dim first) ,2 (outer dim first), or 3 (largest to smallest) If either start or count is provided both must be and method_in is ignored. -Bugs fixed: +Bugs fixed: Describe any changes made to scripts/build system: @@ -3790,9 +3790,9 @@ Describe any substantial timing or memory changes: Code reviewed by: self -Summary of pre-tag testing: +Summary of pre-tag testing: - Regression tests: + Regression tests: =============================================================== @@ -3812,7 +3812,7 @@ Describe any substantial timing or memory changes: Code reviewed by: self -Summary of pre-tag testing: +Summary of pre-tag testing: Regression tests: bluefire all pass @@ -3833,7 +3833,7 @@ Describe any substantial timing or memory changes: Code reviewed by: self -Summary of pre-tag testing: +Summary of pre-tag testing: Regression tests: bluefire all pass @@ -3858,7 +3858,7 @@ Date: April 17, 2009 One-line Summary: Fixed generated files, clarified procedure for commiting =============================================================== - + Tag name: pio37_prod Originator(s): tcraig Date: 03/20/2009 @@ -3868,7 +3868,7 @@ add Makefile.conf.bluefire for ccsm build. has no effect on standalone implementation. =============================================================== - + Tag name: pio36_prod Originator(s): Jim Date: 03/20/2009 @@ -3888,7 +3888,7 @@ Describe any substantial timing or memory changes: Code reviewed by: -Summary of pre-tag testing: +Summary of pre-tag testing: Regression tests: cam regression tests @@ -3896,7 +3896,7 @@ Summary of pre-tag testing: =============================================================== =============================================================== - + Tag name: pio35_prod Originator(s): tcraig Date: 03/05/09 @@ -3909,7 +3909,7 @@ One-line Summary: merge testdev11_pio34_prod to trunk - and more... =============================================================== - + Tag name: pio34_prod Originator(s): tcraig Date: 03/05/09 @@ -3922,7 +3922,7 @@ One-line Summary: pio bug fixes - Fix fill value bug in piodarray.F90.in (tcraig) =============================================================== - + Tag name: pio33_prod Originator(s): tcraig Date: 02/06/09 @@ -3938,7 +3938,7 @@ One-line Summary: testpio update, pio update - Extend testpio logic wrt test capabilities =============================================================== - + Tag name: pio32_prod Originator(s): tcraig Date: 01/30/09 @@ -3952,20 +3952,20 @@ testpio_suite.bluefire.run testdecomp.bluefire.run all run to completion on bluefire - + =============================================================== - + Tag name: pio31_prod Originator(s): Jim Edwards Date: 01/30/09 One-line Summary: Minor bug fix, update configure for mpiio - pio/configure - pio/configure.ac + pio/configure + pio/configure.ac pio/piolib_mod.F90 - + =============================================================== - + Tag name: pio30_prod Originator(s): Jim Edwards Date: 01/30/09 @@ -3993,7 +3993,7 @@ Summary of pre-tag testing: cam regression on bluefire and calgary =============================================================== =============================================================== - + Tag name: pio29_prod Originator(s): John Dennis Date: 01/21/09 @@ -4020,7 +4020,7 @@ Summary of pre-tag testing: =============================================================== =============================================================== - + Tag name: pio28_prod Originator(s): Jim Date: 12/16/08 @@ -4047,7 +4047,7 @@ Summary of pre-tag testing: =============================================================== =============================================================== - + Tag name: pio27_prod Originator(s): Jim, Ray Date: 12/10/08 @@ -4055,18 +4055,18 @@ One-line Summary: configuration changes List all component tags that were used to create pio tag: mct https://svn-ccsm-models.cgd.ucar.edu/mct/trunk_tags/MCT2_5_1_080912 - + Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): Reconfigured to build as a standalone library in CCSM build. - + Bugs fixed: Describe any changes made to scripts/build system: configuration tools moved to pio subdirectory to allow exporting pio lib without test directory and externals - + Describe any substantial timing or memory changes: Code reviewed by: Jim @@ -4078,7 +4078,7 @@ Summary of pre-tag testing: tested using cam test suite on bluefire and calgary =============================================================== =============================================================== - + Tag name: pio26_prod Originator(s): Jim Date: 10/20/08 @@ -4090,7 +4090,7 @@ Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): -Bugs fixed: +Bugs fixed: Describe any changes made to scripts/build system: @@ -4105,7 +4105,7 @@ Summary of pre-tag testing: tested with homme/cam on bluefire and calgary =============================================================== =============================================================== - + Tag name: pio25_prod Originator(s): Jim Date: 10/03/08 @@ -4117,7 +4117,7 @@ Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): -Bugs fixed: +Bugs fixed: Describe any changes made to scripts/build system: @@ -4132,7 +4132,7 @@ Summary of pre-tag testing: tested against cam on bluefire and bangkok =============================================================== =============================================================== - + Tag name: pio24_prod Originator(s): Jim Date: 8/28/08 @@ -4160,7 +4160,7 @@ Summary of pre-tag testing: tested on bluefire and with cam and homme interface =============================================================== =============================================================== - + Tag name: pio23_prod Originator(s): Jim Date: 4/24/08 @@ -4187,13 +4187,13 @@ Summary of pre-tag testing: tested on aix and with cam =============================================================== =============================================================== - + Tag name: pio22_prod Originator(s): Jim Edwards Date: 4/14/08 One-line Summary: Moved F90 generation from cpp to perl script genf90.pl -List all component tags that were used to create pio tag: +List all component tags that were used to create pio tag: mct https://svn-ccsm-models.cgd.ucar.edu/mct/trunk_tags/MCT2_4_2_071026 Describe the changes for each component above that was changed relative @@ -4217,7 +4217,7 @@ Summary of pre-tag testing: Tested on AIX =============================================================== =============================================================== - + Tag name: pio21_prod Originator(s): Jim Edwards Date: 4-9-2008 @@ -4244,7 +4244,7 @@ Summary of pre-tag testing: tested on blueice =============================================================== =============================================================== - + Tag name: pio20_prod Originator(s): Jim Edwards Date: 3-26-2008 @@ -4271,13 +4271,13 @@ Summary of pre-tag testing: tested on blueice =============================================================== =============================================================== - + Tag name: pio18_prod Originator(s): Jim Edwards Date: 03-20-2008 One-line Summary: minor updates to netcdf attributes and put/get functions -List all component tags that were used to create pio tag: +List all component tags that were used to create pio tag: Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description @@ -4286,7 +4286,7 @@ of new functionality and how user can use it): Bugs fixed: Describe any changes made to scripts/build system: none - + Describe any substantial timing or memory changes: none Code reviewed by: me @@ -4298,7 +4298,7 @@ Summary of pre-tag testing: tested against cam on blueice =============================================================== =============================================================== - + Tag name: pio16_prod Originator(s): John Dennis Date: 03-14-2008 @@ -4308,11 +4308,11 @@ A testpio/factor_mod.F90 Several factoring need by the new decompostion algorthm in testcode M testpio/Makefile - - Added the source file factor_mod.F90 to build -M testpio/check_mod.F90 - + Added the source file factor_mod.F90 to build + +M testpio/check_mod.F90 + Eliminated excessive error messages generation M testpio/testPIO.F90 @@ -4337,19 +4337,19 @@ Describe any changes made to scripts/build system: Describe any substantial timing or memory changes: - See above. + See above. Code reviewed by: John Summary of pre-tag testing: Regression tests: - tested on frost for binary files + tested on frost for binary files =============================================================== =============================================================== - + Tag name: pio15_prod Originator(s): Jim Edwards Date: 03-07-2008 @@ -4390,7 +4390,7 @@ of new functionality and how user can use it): Change the arguments to PIO_OPENFILE and PIO_CREATEFILE from (File, filename) to (PIO, FIle, iotype, filename) Change the first argument to PIO_INITDECOMP from file_desc_t to iosystem_desc_t Explicitly include the io_desc_t in calls to pio_read_darray and pio_write_darray - + Bugs fixed: Describe any changes made to scripts/build system: @@ -4406,7 +4406,7 @@ Summary of pre-tag testing: =============================================================== =============================================================== - + Tag name: pio14_prod Originator(s): J. Dennis Date: 03/04/08 @@ -4414,13 +4414,13 @@ One-line Summary: Add rearranger support for binary files M testPIO.F90 - - Added code to use rearranger for binary files + - Added code to use rearranger for binary files - Added namelist variables to control number of IO processors (nprocsIO) M piolib_mod.F90 - - Cleaned up some dead code in initDecomp_2dof_BIN + - Cleaned up some dead code in initDecomp_2dof_BIN M iompi_mod.F90 @@ -4447,16 +4447,16 @@ Summary of pre-tag testing: tested on BGL =============================================================== =============================================================== - + Tag name: pio13_prod Originator(s): J. Dennis Date: 02/29/08 -One-line Summary: Changes to improve benchmarking of testpio code. +One-line Summary: Changes to improve benchmarking of testpio code. M testPIO.F90 - Added ability to read/write to a other directories - + - Added support to flush buffer cache - Added support to run performance test several iterations. @@ -4489,7 +4489,7 @@ Summary of pre-tag testing: =============================================================== =============================================================== - + Tag name: pio11_prod Originator(s): Jim Edwards Date: 01/17/08 @@ -4508,7 +4508,7 @@ M 8542 pioread.inc A + - pionfatt.inc Moved from nf_mod and added support for calls using vdesc instead of vdesc%var_id M 8542 pionfwrite.inc - Added timing calls + Added timing calls M 8542 nf_mod.F90 Added support for calls using vdesc instead of vdesc%var_id M 8542 rearrange.F90 @@ -4525,16 +4525,16 @@ M 8542 pionfput.inc Added support for calls using vdesc instead of vdesc%var_id M 8542 rearrange.inc minor format changes - + List all component tags that were used to create pio tag: mct MCT2_4_2_071026 -Describe the changes for each component above that was changed relative +Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): -Bugs fixed: +Bugs fixed: Describe any changes made to scripts/build system: @@ -4557,9 +4557,9 @@ Changes since last tag use MCT_initialized to determine if need to start MCT added timers to rearranger - + =============================================================== - + Tag name: pio10_prod Originator(s): Ray Loy Date: Jan 3, 2008 @@ -4567,19 +4567,19 @@ One-line Summary: changed initDecomp args from MPI types to PIO types List all component tags that were used to create pio tag: - mct MCT2_3_0_070524 + mct MCT2_3_0_070524 -Describe the changes for each component above that was changed relative +Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): all interfaces of PIO_initDecomp are now changed to use - PIO_{double,real,int,char} instead of + PIO_{double,real,int,char} instead of MPI_{DOUBLE_PRECISION,REAL,INTEGER,CHAR} this is to be more consistent - -Bugs fixed: + +Bugs fixed: Summary of pre-tag testing: @@ -4595,7 +4595,7 @@ Summary of pre-tag testing: Regression tests: =============================================================== - + Tag name: pio09_prod Originator(s): Ray Loy Date: Dec 5, 2007 @@ -4603,9 +4603,9 @@ One-line Summary: added mp_alltoallw option to box rearrange List all component tags that were used to create pio tag: - mct MCT2_3_0_070524 + mct MCT2_3_0_070524 -Describe the changes for each component above that was changed relative +Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): @@ -4614,7 +4614,7 @@ of new functionality and how user can use it): on some platforms this might be faster. -Bugs fixed: +Bugs fixed: Summary of pre-tag testing: @@ -4630,7 +4630,7 @@ Summary of pre-tag testing: Regression tests: =============================================================== - + Tag name: pio08_prod Originator(s): Ray Loy Date: Nov 30, 2007 @@ -4638,9 +4638,9 @@ One-line Summary: mpi type caching in box rearranger List all component tags that were used to create pio tag: - mct MCT2_3_0_070524 + mct MCT2_3_0_070524 -Describe the changes for each component above that was changed relative +Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): @@ -4651,9 +4651,9 @@ time of the rearrange. also was able to remove some of the data in IODesc because it is no longer needed after the type creation. - -Bugs fixed: + +Bugs fixed: Summary of pre-tag testing: @@ -4669,7 +4669,7 @@ Summary of pre-tag testing: Regression tests: =============================================================== - + Tag name: pio05_prod Originator(s): John Dennis Date: Oct 23, 2007 @@ -4677,17 +4677,17 @@ One-line Summary: Support for PIO in POP List all component tags that were used to create pio tag: - mct MCT2_3_0_070524 + mct MCT2_3_0_070524 -Describe the changes for each component above that was changed relative +Describe the changes for each component above that was changed relative to the previous ccsm tag in this sequence (this includes description of new functionality and how user can use it): PIO in POP - Several major changes were applied to PIO to enable use in -POP. This included the porting of the old version of the subroutine -initDecomp_2dof_BIN. The previous version of the subroutine does not + Several major changes were applied to PIO to enable use in +POP. This included the porting of the old version of the subroutine +initDecomp_2dof_BIN. The previous version of the subroutine does not use the two separate IODOF properly. ChangeLog @@ -4695,15 +4695,15 @@ ChangeLog PIO now uses a changed log and new form of tags: pio##_prod -Bugs fixed: +Bugs fixed: - Binary writing with MPI-IO now works again. + Binary writing with MPI-IO now works again. Summary of pre-tag testing: Regression tests: - Minor testing on BlueGene within LANL POP and CCSM POP in coupled system. + Minor testing on BlueGene within LANL POP and CCSM POP in coupled system. Machine (frost): Regression tests: diff --git a/Doxyfile b/Doxyfile index f08fc6189ec..75f1f10fa3a 100644 --- a/Doxyfile +++ b/Doxyfile @@ -14,91 +14,91 @@ # Project related configuration options #--------------------------------------------------------------------------- -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 -# The PROJECT_NAME tag is a single word (or sequence of words) that should -# identify the project. Note that if you do not use Doxywizard you need +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = PIO -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.7.2 -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = +PROJECT_BRIEF = -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. -PROJECT_LOGO = +PROJECT_LOGO = -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = /cesmweb/html/models/pio_new #OUTPUT_DIRECTORY = ./doc/html -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ @@ -113,159 +113,159 @@ ABBREVIATE_BRIEF = "The $name class" \ an \ the -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. Note that you specify absolute paths here, but also -# relative paths, which will be relative from the directory where doxygen is +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. Note that you specify absolute paths here, but also +# relative paths, which will be relative from the directory where doxygen is # started. -STRIP_FROM_PATH = +STRIP_FROM_PATH = -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO -# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. -ALIASES = +ALIASES = -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = YES -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, -# and language is one of the parsers supported by doxygen: IDL, Java, -# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, -# C++. For instance to make doxygen treat .inc files as Fortran files (default -# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note -# that for custom extensions you also need to set FILE_PATTERNS otherwise the +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, +# and language is one of the parsers supported by doxygen: IDL, Java, +# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, +# C++. For instance to make doxygen treat .inc files as Fortran files (default +# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note +# that for custom extensions you also need to set FILE_PATTERNS otherwise the # files are not read by doxygen. EXTENSION_MAPPING = in=Fortran -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO -# If you use Microsoft's C++/CLI language, you should set this option to YES to +# If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO @@ -279,50 +279,50 @@ SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penalty. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will roughly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 @@ -332,313 +332,313 @@ SYMBOL_CACHE_SIZE = 0 # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO -# If the EXTRACT_STATIC tag is set to YES all static members of a file +# If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = NO -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES -# The ENABLED_SECTIONS tag can be used to enable conditional +# The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. -ENABLED_SECTIONS = +ENABLED_SECTIONS = -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. This will remove the Namespaces entry from the Quick Index +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. -LAYOUT_FILE = +LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- -# The QUIET tag can be used to turn on/off the messages that are generated +# The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written # to stderr. -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = . -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ @@ -649,153 +649,153 @@ FILE_PATTERNS = *.c \ *.F90.in \ *.txt -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# Note that relative paths are relative to the directory from which doxygen is +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* -EXCLUDE_PATTERNS = +EXCLUDE_PATTERNS = -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test -EXCLUDE_SYMBOLS = +EXCLUDE_SYMBOLS = -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = doc/example \ testpio -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = doc/images -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. -INPUT_FILTER = +INPUT_FILTER = -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. -FILTER_PATTERNS = +FILTER_PATTERNS = -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. -FILTER_SOURCE_PATTERNS = +FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO -# Setting the INLINE_SOURCES tag to YES will include the body +# Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code # fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = YES -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES @@ -804,151 +804,151 @@ VERBATIM_HEADERS = YES # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = ./ -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is advised to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! -HTML_HEADER = +HTML_HEADER = -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a # standard footer. -HTML_FOOTER = +HTML_FOOTER = -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If left blank doxygen will -# generate a default style sheet. Note that it is recommended to use -# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If left blank doxygen will +# generate a default style sheet. Note that it is recommended to use +# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this # tag will in the future become obsolete. -HTML_STYLESHEET = +HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = customdoxygen.css -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the style sheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the # page has loaded. HTML_DYNAMIC_SECTIONS = NO -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely -# identify the documentation publisher. This should be a reverse domain-name +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely +# identify the documentation publisher. This should be a reverse domain-name # style string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher @@ -957,202 +957,202 @@ DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_NAME = Publisher -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be # written to the html output directory. -CHM_FILE = +CHM_FILE = -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. -HHC_LOCATION = +HHC_LOCATION = -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. -CHM_INDEX_ENCODING = +CHM_INDEX_ENCODING = -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO -# The TOC_EXPAND flag can be set to YES to add extra items for group members +# The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. -QCH_FILE = +QCH_FILE = -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters -QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_NAME = -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# # Qt Help Project / Custom Filters. -QHP_CUST_FILTER_ATTRS = +QHP_CUST_FILTER_ATTRS = -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# # Qt Help Project / Filter Attributes. -QHP_SECT_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. -QHG_LOCATION = +QHG_LOCATION = -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project -# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) -# at top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. Since the tabs have the same information as the -# navigation tree you can set this option to NO if you already set +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. -# Since the tree basically has the same information as the tab index you +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to -# the MathJax Content Delivery Network so you can quickly see the result without -# installing MathJax. However, it is strongly recommended to install a local +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. However, it is strongly recommended to install a local # copy of MathJax from http://www.mathjax.org before deployment. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvantages are that it is more difficult to setup +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO @@ -1161,91 +1161,91 @@ SERVER_BASED_SEARCH = NO # configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. -EXTRA_PACKAGES = +EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! -LATEX_HEADER = +LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! -LATEX_FOOTER = +LATEX_FOOTER = -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO @@ -1255,68 +1255,68 @@ LATEX_SOURCE_CODE = NO # configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO -# Load style sheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. -RTF_STYLESHEET_FILE = +RTF_STYLESHEET_FILE = -# Set optional variables used in the generation of an rtf document. +# Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. -RTF_EXTENSIONS_FILE = +RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man -# The MAN_EXTENSION tag determines the extension that is added to +# The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO @@ -1325,33 +1325,33 @@ MAN_LINKS = NO # configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the # syntax of the XML files. -XML_SCHEMA = +XML_SCHEMA = -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the # syntax of the XML files. -XML_DTD = +XML_DTD = -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES @@ -1360,10 +1360,10 @@ XML_PROGRAMLISTING = YES # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO @@ -1372,97 +1372,97 @@ GENERATE_AUTOGEN_DEF = NO # configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by # the preprocessor. -INCLUDE_PATH = +INCLUDE_PATH = -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. -INCLUDE_FILE_PATTERNS = +INCLUDE_FILE_PATTERNS = -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator # instead of the = operator. -PREDEFINED = +PREDEFINED = -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES @@ -1471,37 +1471,37 @@ SKIP_FUNCTION_MACROS = YES # Configuration::additions related to external references #--------------------------------------------------------------------------- -# The TAGFILES option can be used to specify one or more tagfiles. For each -# tag file the location of the external documentation should be added. The -# format of a tag file without this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths -# or URLs. Note that each tag file must have a unique name (where the name does -# NOT include the path). If a tag file is not located in the directory in which +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which # doxygen is run, you must also specify the path to the tagfile here. -TAGFILES = +TAGFILES = -# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. -GENERATE_TAGFILE = +GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES -# The PERL_PATH should be the absolute path and name of the perl script +# The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl @@ -1510,206 +1510,206 @@ PERL_PATH = /usr/bin/perl # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. -MSCGEN_PATH = +MSCGEN_PATH = -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 -# By default doxygen will use the Helvetica font for all dot files that -# doxygen generates. When you want a differently looking font you can specify -# the font name using DOT_FONTNAME. You need to make sure dot is able to find -# the font, which can be done by putting it in a standard location or by setting -# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. DOT_FONTNAME = Helvetica -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 -# By default doxygen will tell dot to use the Helvetica font. -# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. -DOT_FONTPATH = +DOT_FONTPATH = -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the # CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO -# If set to YES, the inheritance and collaboration graphs will show the +# If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES -# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. If you choose svg you need to set -# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png -# The tag DOT_PATH can be used to specify the path where the dot tool can be +# The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. -DOT_PATH = +DOT_PATH = -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the # \dotfile command). -DOTFILE_DIRS = +DOTFILE_DIRS = -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the # \mscfile command). -MSCFILE_DIRS = +MSCFILE_DIRS = -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES diff --git a/DoxygenLayout.xml b/DoxygenLayout.xml index 0a798a1e267..8faedfb81da 100644 --- a/DoxygenLayout.xml +++ b/DoxygenLayout.xml @@ -11,7 +11,7 @@ - + @@ -19,7 +19,7 @@ - + diff --git a/customdoxygen.css b/customdoxygen.css index 5f14f59d3f7..5e327faf68d 100644 --- a/customdoxygen.css +++ b/customdoxygen.css @@ -141,11 +141,11 @@ a.elRef { } a.code, a.code:visited { - color: #4665A2; + color: #4665A2; } a.codeRef, a.codeRef:visited { - color: #4665A2; + color: #4665A2; } /* @end */ @@ -289,7 +289,7 @@ p.formulaDsp { } img.formulaDsp { - + } img.formulaInl { @@ -347,20 +347,20 @@ span.charliteral { color: #008080 } -span.vhdldigit { - color: #ff00ff +span.vhdldigit { + color: #ff00ff } -span.vhdlchar { - color: #000000 +span.vhdlchar { + color: #000000 } -span.vhdlkeyword { - color: #700070 +span.vhdlkeyword { + color: #700070 } -span.vhdllogic { - color: #ff0000 +span.vhdllogic { + color: #ff0000 } blockquote { @@ -555,9 +555,9 @@ table.memberdecls { } .memdoc, dl.reflist dd { - border-bottom: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; padding: 6px 10px 2px 10px; background-color: #FBFCFD; border-top-width: 0; @@ -609,18 +609,18 @@ dl.reflist dd { .params, .retval, .exception, .tparams { margin-left: 0px; padding-left: 0px; -} +} .params .paramname, .retval .paramname { font-weight: bold; vertical-align: top; } - + .params .paramtype { font-style: italic; vertical-align: top; -} - +} + .params .paramdir { font-family: "courier new",courier,monospace; vertical-align: top; @@ -797,8 +797,8 @@ table.fieldtable { .fieldtable td.fielddoc p:first-child { margin-top: 2px; -} - +} + .fieldtable td.fielddoc p:last-child { margin-bottom: 2px; } @@ -872,7 +872,7 @@ table.fieldtable { color: #283A5D; font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; + text-decoration: none; } .navpath li.navelem a:hover @@ -901,7 +901,7 @@ div.summary padding-right: 5px; width: 50%; text-align: right; -} +} div.summary a { @@ -1013,19 +1013,19 @@ dl.section dd { vertical-align: bottom; border-collapse: separate; } - + #projectlogo img -{ +{ border: 0px none; } - + #projectname { font: 300% Tahoma, Arial,sans-serif; margin: 0px; padding: 2px 0px; } - + #projectbrief { font: 120% Tahoma, Arial,sans-serif; @@ -1120,7 +1120,7 @@ div.toc ul { list-style: none outside none; border: medium none; padding: 0px; -} +} div.toc li.level1 { margin-left: 0px; diff --git a/doc/CAMexample.txt b/doc/CAMexample.txt index 77bd3df9fbb..d6a3c20f3cf 100644 --- a/doc/CAMexample.txt +++ b/doc/CAMexample.txt @@ -13,7 +13,7 @@ * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * - */ + */ /*! \page CAMexample Community Atmosphere Model (CAM) \section cam Implementation of PIO in CAM @@ -37,7 +37,7 @@ initializes PIO in CAM. Init_pio_subsystem calls read_namelist_pio, which calls set_pio_parameters. The main parameters set includes the IO mode (netcdf vs pnetcdf), number of IO tasks, and IO stride. -Cam_pio_createfile and cam_pio_openfile create and open a PIO file, respectively. +Cam_pio_createfile and cam_pio_openfile create and open a PIO file, respectively. Cam_pio_createfile is called from cam_write_restart, h_define (called from wshist, which is called from write_restart_history), and atm_write_srfrest_mct. @@ -72,7 +72,7 @@ decomposition already exists. The routine performing that search is find_iodesc (called from get_phys_decomp and get_dyn_decomp). This capability is supported only when the range of history output is the whole domain. -Get_phys_decomp calls get_phys_ldof (or get_column_ldof), and get_dyn_decomp calls +Get_phys_decomp calls get_phys_ldof (or get_column_ldof), and get_dyn_decomp calls get_dyn_ldof (or get_column_ldof). These routines do the bulk of the work in constructing the IO decompositions. Get_column_ldof is called when the history output is restricted to a subset of the domain. diff --git a/doc/Decomp.txt b/doc/Decomp.txt index e4d4e42fe1d..1b7ad9e9444 100644 --- a/doc/Decomp.txt +++ b/doc/Decomp.txt @@ -1,12 +1,12 @@ /****************************************************************************** * - * * - * Copyright (C) 2009 + * + * Copyright (C) 2009 * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * @@ -16,55 +16,55 @@ */ /*! \page decomp Describing decompositions -On of the biggest challenges to working with PIO is setting up +On of the biggest challenges to working with PIO is setting up the call to \ref PIO_initdecomp. The user must properly describe -how the data within each MPI tasks memory should be placed or retrieved from -disk. PIO provides several interfaces. We describe the simplest interface -first and then progress to the most complex and flexible interface. +how the data within each MPI tasks memory should be placed or retrieved from +disk. PIO provides several interfaces. We describe the simplest interface +first and then progress to the most complex and flexible interface. \section decomp_bc Block-cyclic interface -The simplest interface assumes that your arrays are decomposed in a block-cyclic -structure and can be described simply using a start-count type approach. -A simple block-cyclic decomposition for a 1-dimension (1D) array is illustrated in Figure 1. -Note that contigious layout of the data in memory can be easily mapped to a contigious -layout on disk. The \em start arguments correspond to the starting point of the block of contigious -memory, while the \em count is the number of words. Note that \em start and \em count must be arrays of length -equal to the dimensionality of the distributed array. While we use a 1D array for simplicity, PIO -currently supports up to the Fortran limit of 7-dimension (7D) arrays. In the case of 7D arrays, the start and count arrays +The simplest interface assumes that your arrays are decomposed in a block-cyclic +structure and can be described simply using a start-count type approach. +A simple block-cyclic decomposition for a 1-dimension (1D) array is illustrated in Figure 1. +Note that contigious layout of the data in memory can be easily mapped to a contigious +layout on disk. The \em start arguments correspond to the starting point of the block of contigious +memory, while the \em count is the number of words. Note that \em start and \em count must be arrays of length +equal to the dimensionality of the distributed array. While we use a 1D array for simplicity, PIO +currently supports up to the Fortran limit of 7-dimension (7D) arrays. In the case of 7D arrays, the start and count arrays would be of length 7. \image html block-cyclic.png "Figure 1: Setting up the \em start and \em count arrays for a single 1D array distributed accross 3 MPI tasks." \image latex block-cyclic.eps "Setting up the \em start and \em count arrays for a single 1D array distributed accross 3 MPI tasks." width=10cm -The call to \ref PIO_initdecomp that would implement the decomposition illustrated in Figure 1 is listed below. +The call to \ref PIO_initdecomp that would implement the decomposition illustrated in Figure 1 is listed below. The variable \em iosystem is created by the call to \ref PIO_init. The second argument \em PIO_double is the PIO kind, and indicates that this is a decomposition for a 8-byte real. (For a list of supported kinds see \ref PIO_kinds.) -The argument \em dims is the global dimension for the array. The \em start and \em count arrays are 8-byte integers of +The argument \em dims is the global dimension for the array. The \em start and \em count arrays are 8-byte integers of type PIO_OFFSET, while \em iodesc is the IO descriptor generated by the call to PIO_initdecomp. \verbinclude simple-bc \section rearr Controlling IO decomposition -The above example represents the simplest way to initialize and use PIO to write out and read distributed arrays. However, PIO provides some additional features that allows greater control over the IO process. In particular, it provides the ability to define an IO decomposition. Note that a user defined IO decomposition is optional. If one is not provided and rearrangement is necessary, PIO will internally compute an IO decomposition. The reason an IO decomposition may be necessary is described in the section \ref decomp_dof below. +The above example represents the simplest way to initialize and use PIO to write out and read distributed arrays. However, PIO provides some additional features that allows greater control over the IO process. In particular, it provides the ability to define an IO decomposition. Note that a user defined IO decomposition is optional. If one is not provided and rearrangement is necessary, PIO will internally compute an IO decomposition. The reason an IO decomposition may be necessary is described in the section \ref decomp_dof below. This flexibility provides the ability to define an intermediate decomposition that is unique from the computational decomposition. This IO decomposition can be constructed to maximize the write or read performance to the disk subsystem. We extend the -simple example in Figure 1 to include an IO decomposition in Figure 1b. +simple example in Figure 1 to include an IO decomposition in Figure 1b. \image html block-cyclic-rearr.png "Figure 1b: Block cyclic decomposition with rearrangement" \image latex block-cyclic-rearr.eps "Block cyclic decomposition with rearrangement" width=10cm -Figure 1b illustrates the creation of an IO decomposition on two of the MPI tasks. For this decomposition, the 8 word IO decomposition array and corresponding disk layout are evenly distributed between PE 0 (yellow) and PE 2 (blue). The arrows in Figure 1b indicates rearrangement that is performed within the PIO library. In this -case, PE 0 sends a word to PE 2, illustrated by the shading of yellow to blue, while PE 1 sends two words to PE 0 as illustrated by the shading of red to yellow. The rearranged array in the IO decomposition is subsequently written to disk. -Note that in this case, only two of three MPI tasks are performing writes to disk. The number of MPI tasks involved in IO to disk is specified in the \ref PIO_init using a combination of the num_aggregator and stride parameters. For figure 1b, the num_aggregator=3 and the stride=2. PIO allows the user to specify the IO decomposition using the -optional parameters \em iostart and \em iocount. The following bits of code for PE 0, PE 1, and PE 2 illustrates the necessary calls to \ref PIO_initdecomp. +Figure 1b illustrates the creation of an IO decomposition on two of the MPI tasks. For this decomposition, the 8 word IO decomposition array and corresponding disk layout are evenly distributed between PE 0 (yellow) and PE 2 (blue). The arrows in Figure 1b indicates rearrangement that is performed within the PIO library. In this +case, PE 0 sends a word to PE 2, illustrated by the shading of yellow to blue, while PE 1 sends two words to PE 0 as illustrated by the shading of red to yellow. The rearranged array in the IO decomposition is subsequently written to disk. +Note that in this case, only two of three MPI tasks are performing writes to disk. The number of MPI tasks involved in IO to disk is specified in the \ref PIO_init using a combination of the num_aggregator and stride parameters. For figure 1b, the num_aggregator=3 and the stride=2. PIO allows the user to specify the IO decomposition using the +optional parameters \em iostart and \em iocount. The following bits of code for PE 0, PE 1, and PE 2 illustrates the necessary calls to \ref PIO_initdecomp. -\verbinclude simple-bc-rearr +\verbinclude simple-bc-rearr -\verbinclude simple-bc-rearr-pe1 +\verbinclude simple-bc-rearr-pe1 -\verbinclude simple-bc-rearr-pe2 +\verbinclude simple-bc-rearr-pe2 \section decomp_dof Degree of freedom interface @@ -91,12 +91,12 @@ is illustrated at the bottom of Figure 2. \image html dof.png "Figure 2: Setting up the comDOF arrays for a single 1D array distributed accross 3 MPI tasks." \image latex dof.eps "Setting up the comDOF arrays for a single 1D array distributed accross 3 MPI tasks." width=10cm - -The call to \ref PIO_initdecomp which implements Figure 2 on PE 0 is provided below. + +The call to \ref PIO_initdecomp which implements Figure 2 on PE 0 is provided below. \verbinclude simple-dof -As with the block-cyclic interface, the degree of freedom interface provides the ability to specify the io decomposition through optional arguments to \ref PIO_initdecomp. +As with the block-cyclic interface, the degree of freedom interface provides the ability to specify the io decomposition through optional arguments to \ref PIO_initdecomp. \image html dof-rearr.png "Figure 3: Setting up the comDOF arrays and setting IO decomposition for a single 1D array distributed accross 3 MPI tasks and written from 2 tasks after rearrangement within the PIO library" \image latex dof-rearr.eps "Setting up the comDOF arrays and, io decomposition for a single 1D array distributed accross 3 MPI tasks" width=10cm diff --git a/doc/DoxygenLayout.xml b/doc/DoxygenLayout.xml index 0ed7d1089e5..c3552b69f03 100644 --- a/doc/DoxygenLayout.xml +++ b/doc/DoxygenLayout.xml @@ -7,7 +7,7 @@ - + diff --git a/doc/Error.txt b/doc/Error.txt index 4664919cbc8..774e11039d7 100644 --- a/doc/Error.txt +++ b/doc/Error.txt @@ -1,19 +1,19 @@ /****************************************************************************** * - * * - * Copyright (C) 2009 + * + * Copyright (C) 2009 * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * - */ /*! + */ /*! \page error Error Handling By default, PIO handles errors internally by printing a string diff --git a/doc/Examples.txt b/doc/Examples.txt index d2e2951bdea..60164535c9d 100644 --- a/doc/Examples.txt +++ b/doc/Examples.txt @@ -1,12 +1,12 @@ /****************************************************************************** * - * * - * Copyright (C) 2009 + * + * Copyright (C) 2009 * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * @@ -16,11 +16,11 @@ */ /*! \page examp Examples Examples of the usage of PIO - PIO has been implemented in several geophysical component models, including the -Community Atmosphere Model (CAM), the Community Land Model (CLM), the Parallel Ocean Program -(POP), the Community Ice CodE (CICE), and coupler for used by CCSM4.0 (CPL7). We also provide -several simpler example code as well as a test code that is suitable for regression testing and -benchmarking. + PIO has been implemented in several geophysical component models, including the +Community Atmosphere Model (CAM), the Community Land Model (CLM), the Parallel Ocean Program +(POP), the Community Ice CodE (CICE), and coupler for used by CCSM4.0 (CPL7). We also provide +several simpler example code as well as a test code that is suitable for regression testing and +benchmarking. - \subpage CAMexample - \subpage testpio_example diff --git a/doc/GettingStarted.txt b/doc/GettingStarted.txt index 0258bd730ae..7dab4a05eee 100644 --- a/doc/GettingStarted.txt +++ b/doc/GettingStarted.txt @@ -1,21 +1,21 @@ /****************************************************************************** * - * * - * Copyright (C) 2009 + * + * Copyright (C) 2009 * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * - */ + */ -/*! \page intro Introduction +/*! \page intro Introduction PIO is a software interface layer designed to encapsolate the complexities of parallel IO and make it easier to replace the lower @@ -51,6 +51,6 @@ application space. This is done in a call to \ref PIO_initdecomp. In the simplest call to this function, a one dimensional integer array is passed from each task, the values in the array represent the 0 based offset from the beginning of the array -on file. +on file. */ diff --git a/doc/Installing.txt b/doc/Installing.txt index 8c11e63b3f2..629bd3cda3b 100644 --- a/doc/Installing.txt +++ b/doc/Installing.txt @@ -1,12 +1,12 @@ /****************************************************************************** * - * + * * * Copyright (C) 2013 * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * @@ -24,9 +24,9 @@
  • Configure - PIO uses the gnu autoconf tools, for historical reasons the configure script is in the pio subdirectory. A complete set of configure arguments, options and flags is available by running: -> configure --help. +> configure --help. -Before running configure, you will need to know the location of some supporting libraries. +Before running configure, you will need to know the location of some supporting libraries. - Set the NETCDF_PATH environment variable to the netcdf install directory or --disable-netcdf to disable serial NetCDF support. @@ -46,14 +46,14 @@ One additional flag of interest is --enable-filesystem-hints which can be set to gpfs or lustre. You should only use this flag if you are sure that the file system you are using is either gpfs or lustre respectively. If you are unsure, then do not use this flag.
  • -
  • After configure completes use gmake in the pio subdirectory to complete the build. +
  • After configure completes use gmake in the pio subdirectory to complete the build. > gmake Note that although the user application only needs to 'use pio' at least some compilers require that all of the module files be located in the install directory. If that is the case, then running -> gmake install +> gmake install will move the compiled library and module files to the directory specified by $PREFIX.
  • diff --git a/doc/api.txt b/doc/api.txt index 3ffee6dfa23..caba3bb377b 100644 --- a/doc/api.txt +++ b/doc/api.txt @@ -28,9 +28,9 @@ - \ref PIO_dupiodesc - \ref PIO_getnumiotasks - \ref PIO_set_blocksize - \section netcdf NetCDF format specific routines + \section netcdf NetCDF format specific routines Also see: http://www.unidata.ucar.edu/software/netcdf/docs/ - \subsection putget Reading/Writing netcdf metadata + \subsection putget Reading/Writing netcdf metadata - \ref PIO_get_att - \ref PIO_put_att - \ref PIO_get_var @@ -38,7 +38,7 @@ \subsection utilnc Netcdf utility routines - \ref PIO_enddef - \ref PIO_redef - - \ref PIO_def_dim + - \ref PIO_def_dim - \ref PIO_def_var - \ref PIO_copy_att \subsection inqnc NetCDF file inquiry routines diff --git a/doc/base.txt b/doc/base.txt index 6f29fbc1273..21cfdaf7bf5 100644 --- a/doc/base.txt +++ b/doc/base.txt @@ -1,20 +1,20 @@ /****************************************************************************** * - * * - * Copyright (C) 2009 + * + * Copyright (C) 2009 * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * - */ -/*! + */ +/*! \mainpage Parallel I/O library (PIO) @@ -25,13 +25,13 @@ \author Art Mirin \author Mariana Vertenstein -The Parallel I/O (PIO) library has been developed over several years to improve the -ability of component models of the Community Earth System Model (CESM) to perform I/O. However, we +The Parallel I/O (PIO) library has been developed over several years to improve the +ability of component models of the Community Earth System Model (CESM) to perform I/O. However, we believe that the interface is sufficiently general to be useful to a broader spectrum of applications. Although PIO has a binary output capability the focus of development has been on backend tools that -use the NetCDF file format. +use the NetCDF file format. -This user's guide provides information about the PIO library and examples on how it can be used. +This user's guide provides information about the PIO library and examples on how it can be used. Please review the ChangeLog that is included with the distribution for up-to-date release information. - \ref intro diff --git a/doc/example/simple-bc b/doc/example/simple-bc index ee58c4bbeb6..1b7cac1658f 100644 --- a/doc/example/simple-bc +++ b/doc/example/simple-bc @@ -1,6 +1,6 @@ type (iosystem_desc_t) :: iosystem - integer (i4) :: dims(1) + integer (i4) :: dims(1) integer (kind=PIO_OFFSET) :: start(1), count(1) type (io_desc_t) :: iodesc ... diff --git a/doc/example/simple-bc-rearr b/doc/example/simple-bc-rearr index c919f29cc54..3ef3876a8dd 100644 --- a/doc/example/simple-bc-rearr +++ b/doc/example/simple-bc-rearr @@ -1,6 +1,6 @@ type (iosystem_desc_t) :: iosystem - integer (i4) :: dims(1) + integer (i4) :: dims(1) integer (kind=PIO_OFFSET) :: compstart(1), compcount(1) integer (kind=PIO_OFFSET) :: iostart(1), iocount(1) type (io_desc_t) :: iodesc diff --git a/doc/example/simple-bc-rearr-pe1 b/doc/example/simple-bc-rearr-pe1 index 5399ad83774..2b016a3aea8 100644 --- a/doc/example/simple-bc-rearr-pe1 +++ b/doc/example/simple-bc-rearr-pe1 @@ -1,6 +1,6 @@ type (iosystem_desc_t) :: iosystem - integer (i4) :: dims(1) + integer (i4) :: dims(1) integer (kind=PIO_OFFSET) :: compstart(1), compcount(1) type (io_desc_t) :: iodesc ... diff --git a/doc/example/simple-bc-rearr-pe2 b/doc/example/simple-bc-rearr-pe2 index 31880f4f87e..3aedb52f36d 100644 --- a/doc/example/simple-bc-rearr-pe2 +++ b/doc/example/simple-bc-rearr-pe2 @@ -1,6 +1,6 @@ type (iosystem_desc_t) :: iosystem - integer (i4) :: dims(1) + integer (i4) :: dims(1) integer (kind=PIO_OFFSET) :: compstart(1), compcount(1) integer (kind=PIO_OFFSET) :: iostart(1), iocount(1) type (io_desc_t) :: iodesc diff --git a/doc/example/simple-dof b/doc/example/simple-dof index b53a82d799a..159a6895dbc 100644 --- a/doc/example/simple-dof +++ b/doc/example/simple-dof @@ -1,6 +1,6 @@ type (iosystem_desc_t) :: iosystem - integer (i4) :: dims(1) + integer (i4) :: dims(1) integer (i4) :: compdof type (io_desc_t) :: iodesc ... diff --git a/doc/example/simple-dof-rearr b/doc/example/simple-dof-rearr index af8b9910c24..bea57693691 100644 --- a/doc/example/simple-dof-rearr +++ b/doc/example/simple-dof-rearr @@ -1,6 +1,6 @@ type (iosystem_desc_t) :: iosystem - integer (i4) :: dims(1) + integer (i4) :: dims(1) integer (i4) :: compdof type (io_desc_t) :: iodesc integer (kind=PIO_OFFSET) :: iostart(:),iocount(:) diff --git a/doc/faq.txt b/doc/faq.txt index 99d7c46b7a4..0f37956ea19 100644 --- a/doc/faq.txt +++ b/doc/faq.txt @@ -1,30 +1,30 @@ /****************************************************************************** * - * * - * Copyright (C) 2009 + * + * Copyright (C) 2009 * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * - */ /*! \page faq Frequently Asked Questions + */ /*! \page faq Frequently Asked Questions Here is a list of frequently asked questions and their answers.
    How do I specify which tasks perform IO?
    -
    This is done in the call to \ref PIO_init which has two interfaces: init_intracom and init_intercom. +
    This is done in the call to \ref PIO_init which has two interfaces: init_intracom and init_intercom.
    • In the init_intracom interface, use the num_iotasks and stride variables to specify the total number of io tasks and the stride between them with respect to the mpi communicator, comp_comm, which is provided. You can also use the optional base argument to shift the first IO task away from the first computational task, this is often desirable because the applications first computational task often has higher memory requirements than other tasks. IO tasks are a subset of the tasks defined in comp_comm.
    • In the init_intercom interface, IO tasks are a disjoint set of tasks from those in the computational communicator. This interface is still experimental and not recommended for production use at this time.
    Note that num_iotasks is the maximum number of IO tasks to use for an IO operation. The size of the field being read or written along with the tunable blocksize parameter, \ref PIO_set_blocksize, determines the actual number of tasks used for a given IO operation.
    -
    How do I test if PIO is installed and working correctly?
    +
    How do I test if PIO is installed and working correctly?
    The PIO Library distribution contains a testpio subdirectory with a number of programs to test the PIO library. Please see the \ref examp page for details.
    diff --git a/doc/images/block-cyclic-rearr.eps b/doc/images/block-cyclic-rearr.eps index cb586bd4210..1318dc814b8 100644 --- a/doc/images/block-cyclic-rearr.eps +++ b/doc/images/block-cyclic-rearr.eps @@ -57,32 +57,32 @@ mark /Q/grestore counttomark 2 idiv {ld}repeat pop -/SC{ +/SC{ /ColorSpace fr scs }bd /sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld /soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld /cgmtx matrix def /sdmtx{cgmtx currentmatrix pop}bd -/CM {cgmtx setmatrix}bd -/cm {cmmtx astore CM concat}bd +/CM {cgmtx setmatrix}bd +/cm {cmmtx astore CM concat}bd /W{clip newpath}bd /W*{eoclip newpath}bd statusdict begin product end dup (HP) anchorsearch{ - pop pop pop + pop pop pop true }{ - pop + pop (hp) anchorsearch{ pop pop true }{ pop false }ifelse }ifelse -{ - { - { - pop pop +{ + { + { + pop pop (0)dup 0 4 -1 roll put F charpath }cshow @@ -94,7 +94,7 @@ statusdict begin product end dup (HP) anchorsearch{ /cps {cply stroke}bd /pgsave 0 def /bp{/pgsave save store}bd -/ep{pgsave restore showpage}def +/ep{pgsave restore showpage}def /re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd /scrdict 10 dict def /scrmtx matrix def @@ -104,7 +104,7 @@ statusdict begin product end dup (HP) anchorsearch{ scrmtx astore pop gsave initgraphics -CM +CM patarray exch get scrmtx makepattern @@ -114,13 +114,13 @@ setpattern /cg_BeginEPSF{ userdict save/cg_b4_Inc_state exch put userdict/cg_endepsf/cg_EndEPSF load put - count userdict/cg_op_count 3 -1 roll put + count userdict/cg_op_count 3 -1 roll put countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put 3 sub{end}repeat /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath - false setstrokeadjust false setoverprint + false setstrokeadjust false setoverprint }bd /cg_EndEPSF{ countdictstack 3 sub { end } repeat @@ -145,7 +145,7 @@ L3?{ /ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd }bd - /cg_miaiproc{ + /cg_miaiproc{ string/ImageBandMask xs string/ImageBandData xs /ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter @@ -158,16 +158,16 @@ L3?{ /EI{imsave restore}bd /ID{ counttomark 2 idiv -dup 2 add +dup 2 add dict begin {def} repeat -pop +pop /ImageType 1 def /ImageMatrix[Width 0 0 Height neg 0 Height]def currentdict dup/ImageMask known{ImageMask}{F}ifelse exch L3?{ dup/MaskedImage known - { + { pop << /ImageType 3 @@ -187,8 +187,8 @@ L3?{ }if }if exch -{imagemask}{image}ifelse -end +{imagemask}{image}ifelse +end }bd /cguidfix{statusdict begin mark version end {cvr}stopped{cleartomark 0}{exch pop}ifelse @@ -201,27 +201,27 @@ currentdict end definefont pop /t_array 0 def /t_i 0 def /t_c 1 string def -/x_proc{ +/x_proc{ exch t_array t_i get add exch moveto /t_i t_i 1 add store }bd -/y_proc{ +/y_proc{ t_array t_i get add moveto /t_i t_i 1 add store }bd /xy_proc{ - - t_array t_i 2 copy 1 add get 3 1 roll get + + t_array t_i 2 copy 1 add get 3 1 roll get 4 -1 roll add 3 1 roll add moveto /t_i t_i 2 add store }bd -/sop 0 def -/cp_proc/x_proc ld -/base_charpath +/sop 0 def +/cp_proc/x_proc ld +/base_charpath { /t_array xs /t_i 0 def - { + { t_c 0 3 -1 roll put currentpoint t_c cply sop @@ -229,7 +229,7 @@ currentdict end definefont pop }forall /t_array 0 def }bd -/sop/stroke ld +/sop/stroke ld /nop{}def /xsp/base_charpath ld /ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd @@ -237,12 +237,12 @@ currentdict end definefont pop /xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd /ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd /xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd -/refnt{ +/refnt{ findfont dup length dict copy dup -/Encoding 4 -1 roll put +/Encoding 4 -1 roll put definefont pop }bd -/renmfont{ +/renmfont{ findfont dup length dict copy definefont pop }bd L3? dup dup{save exch}if @@ -266,68 +266,68 @@ L3? dup dup{save exch}if /ymin 0 def /xmax 0 def /xmin 0 def -/setupFunEval +/setupFunEval { begin /nRange Range length 2 idiv store - /mulRange - - [ + /mulRange + + [ 0 1 nRange 1 sub - { - 2 mul/nDim2 xd - Range nDim2 get - Range nDim2 1 add get - 1 index sub - - 255 div - exch + { + 2 mul/nDim2 xd + Range nDim2 get + Range nDim2 1 add get + 1 index sub + + 255 div + exch }for ]store end }bd -/FunEval +/FunEval { begin - - nRange mul /val xd - + + nRange mul /val xd + 0 1 nRange 1 sub { - dup 2 mul/nDim2 xd - val - add DataSource exch get - mulRange nDim2 get mul - mulRange nDim2 1 add get - add - }for + dup 2 mul/nDim2 xd + val + add DataSource exch get + mulRange nDim2 get mul + mulRange nDim2 1 add get + add + }for end }bd -/max +/max { 2 copy lt {exch pop}{pop}ifelse }bd /sh2 -{ - /Coords load aload pop - 3 index 3 index translate - - 3 -1 roll sub - 3 1 roll exch - sub +{ + /Coords load aload pop + 3 index 3 index translate + + 3 -1 roll sub + 3 1 roll exch + sub 2 copy - dup mul exch dup mul add sqrt + dup mul exch dup mul add sqrt dup - scale - atan - - rotate - - /Function load setupFunEval - - - clippath {pathbbox}stopped {0 0 0 0}if newpath + scale + atan + + rotate + + /Function load setupFunEval + + + clippath {pathbbox}stopped {0 0 0 0}if newpath /ymax xs /xmax xs /ymin xs @@ -335,39 +335,39 @@ L3? dup dup{save exch}if currentdict/Extend known { /Extend load 0 get - { - 0/Function load FunEval sc + { + 0/Function load FunEval sc xmin ymin xmin abs ymax ymin sub rectfill }if }if - + /Nsteps/Function load/Size get 0 get 1 sub store /dx 1 Nsteps div store gsave /di ymax ymin sub store /Function load - + 0 1 Nsteps { 1 index FunEval sc 0 ymin dx di rectfill dx 0 translate }for - pop - grestore + pop + grestore currentdict/Extend known { /Extend load 1 get - { - Nsteps/Function load FunEval sc + { + Nsteps/Function load FunEval sc 1 ymin xmax 1 sub abs ymax ymin sub rectfill }if }if }bd -/shp -{ +/shp +{ 4 copy - + dup 0 gt{ 0 exch a1 a0 arc }{ @@ -378,9 +378,9 @@ L3? dup dup{save exch}if }{ pop 0 lineto }ifelse - + fill - + dup 0 gt{ 0 exch a0 a1 arc }{ @@ -391,175 +391,175 @@ L3? dup dup{save exch}if }{ pop 0 lineto }ifelse - + fill }bd /calcmaxs -{ - - xmin dup mul ymin dup mul add sqrt - xmax dup mul ymin dup mul add sqrt - xmin dup mul ymax dup mul add sqrt - xmax dup mul ymax dup mul add sqrt - max max max +{ + + xmin dup mul ymin dup mul add sqrt + xmax dup mul ymin dup mul add sqrt + xmin dup mul ymax dup mul add sqrt + xmax dup mul ymax dup mul add sqrt + max max max }bd /sh3 -{ - /Coords load aload pop - 5 index 5 index translate - 3 -1 roll 6 -1 roll sub - 3 -1 roll 5 -1 roll sub +{ + /Coords load aload pop + 5 index 5 index translate + 3 -1 roll 6 -1 roll sub + 3 -1 roll 5 -1 roll sub 2 copy dup mul exch dup mul add sqrt - /dx xs + /dx xs 2 copy 0 ne exch 0 ne or { - - exch atan rotate + + exch atan rotate }{ pop pop }ifelse - + /r2 xs /r1 xs - /Function load - dup/Size get 0 get 1 sub - /Nsteps xs - setupFunEval - - - - - + /Function load + dup/Size get 0 get 1 sub + /Nsteps xs + setupFunEval + + + + + dx r2 add r1 lt{ - - 0 + + 0 }{ dx r1 add r2 le - { + { 1 - }{ + }{ r1 r2 eq - { + { 2 - }{ + }{ 3 - }ifelse + }ifelse }ifelse }ifelse - /sh3tp xs - clippath {pathbbox}stopped {0 0 0 0}if - newpath + /sh3tp xs + clippath {pathbbox}stopped {0 0 0 0}if + newpath /ymax xs /xmax xs /ymin xs /xmin xs - + dx dup mul r2 r1 sub dup mul sub dup 0 gt { sqrt r2 r1 sub atan - /a0 exch 180 exch sub store - /a1 a0 neg store + /a0 exch 180 exch sub store + /a1 a0 neg store }{ pop /a0 0 store - /a1 360 store - }ifelse + /a1 360 store + }ifelse currentdict/Extend known { - /Extend load 0 get r1 0 gt and - { - 0/Function load FunEval sc - - - - - { - { + /Extend load 0 get r1 0 gt and + { + 0/Function load FunEval sc + + + + + { + { dx 0 r1 360 0 arcn xmin ymin moveto xmax ymin lineto xmax ymax lineto xmin ymax lineto xmin ymin lineto - eofill + eofill } - { + { r1 0 gt{0 0 r1 0 360 arc fill}if } - { - - - - + { + + + + 0 r1 xmin abs r1 add neg r1 shp } - { - - - r2 r1 gt{ - + { + + + r2 r1 gt{ + 0 r1 - r1 neg r2 r1 sub div dx mul - 0 - shp - }{ - - - - 0 r1 calcmaxs + r1 neg r2 r1 sub div dx mul + 0 + shp + }{ + + + + 0 r1 calcmaxs dup - + r2 add dx mul dx r1 r2 sub sub div - neg - exch 1 index + neg + exch 1 index abs exch sub shp }ifelse - } - }sh3tp get exec + } + }sh3tp get exec }if }if - + /d0 0 store /r0 r1 store /di dx Nsteps div store - /ri r2 r1 sub Nsteps div store - /Function load + /ri r2 r1 sub Nsteps div store + /Function load 0 1 Nsteps - { + { 1 index FunEval sc d0 di add r0 ri add d0 r0 shp { - + d0 0 r0 a1 a0 arc d0 di add 0 r0 ri add a0 a1 arcn fill - - + + d0 0 r0 a0 a1 arc d0 di add 0 r0 ri add a1 a0 arcn fill }pop - - + + /d0 d0 di add store /r0 r0 ri add store }for - pop - + pop + currentdict/Extend known { - /Extend load 1 get r2 0 gt and - { - Nsteps/Function load FunEval sc - - - - - { + /Extend load 1 get r2 0 gt and + { + Nsteps/Function load FunEval sc + + + + + { { dx 0 r2 0 360 arc fill - } + } { dx 0 r2 360 0 arcn xmin ymin moveto @@ -567,68 +567,68 @@ L3? dup dup{save exch}if xmax ymax lineto xmin ymax lineto xmin ymin lineto - eofill - } - { - - + eofill + } + { + + xmax abs r1 add r1 dx r1 shp - } - { - + } + { + r2 r1 gt{ - - - - calcmaxs dup - - r1 add dx mul dx r2 r1 sub sub div - exch 1 index + + + + calcmaxs dup + + r1 add dx mul dx r2 r1 sub sub div + exch 1 index exch sub dx r2 shp - }{ - - r1 neg r2 r1 sub div dx mul - 0 - dx - r2 + }{ + + r1 neg r2 r1 sub div dx mul + 0 + dx + r2 shp }ifelse } - } - sh3tp get exec + } + sh3tp get exec }if }if }bd -/sh -{ +/sh +{ begin /ShadingType load dup dup 2 eq exch 3 eq or - { + { gsave newpath /ColorSpace load scs currentdict/BBox known { - /BBox load aload pop - 2 index sub - 3 index - 3 -1 roll exch sub + /BBox load aload pop + 2 index sub + 3 index + 3 -1 roll exch sub exch rectclip }if 2 eq {sh2}{sh3}ifelse grestore }{ - - pop + + pop (DEBUG: shading type unimplemented\n)print flush }ifelse end }bd {restore}if not dup{save exch}if - L3?{ + L3?{ /sh/shfill ld /csq/clipsave ld /csQ/cliprestore ld @@ -771,22 +771,22 @@ sdmtx 0000000000000000000000000000000000000000000000000000000000000000 cleartomark end %APLT1End - + %RBIEndFontSubset /Helvetica cguidfix /F1.1/Helvetica renmfont -[ /CIEBasedABC 4 dict dup begin -/WhitePoint [ 0.9505 1.0000 1.0891 ] def -/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def -/MatrixABC [ 0.4294 0.2332 0.0202 0.3278 0.6737 0.1105 0.1933 0.0938 0.9580 ] def -/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def +[ /CIEBasedABC 4 dict dup begin +/WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def +/MatrixABC [ 0.4294 0.2332 0.0202 0.3278 0.6737 0.1105 0.1933 0.0938 0.9580 ] def +/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def end ] /Cs1 exch/ColorSpace dr pop -[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def -/DecodeA { { 1.8008 exp } bind exec} bind -def -/MatrixA [ 0.9642 1.0000 0.8249 ] def -/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def -/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def +[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeA { { 1.8008 exp } bind exec} bind +def +/MatrixA [ 0.9642 1.0000 0.8249 ] def +/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def +/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def end ] /Cs2 exch/ColorSpace dr pop %%EndPageSetup 0.60000002 i diff --git a/doc/images/block-cyclic.eps b/doc/images/block-cyclic.eps index a3940d08909..baba1098988 100644 --- a/doc/images/block-cyclic.eps +++ b/doc/images/block-cyclic.eps @@ -57,32 +57,32 @@ mark /Q/grestore counttomark 2 idiv {ld}repeat pop -/SC{ +/SC{ /ColorSpace fr scs }bd /sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld /soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld /cgmtx matrix def /sdmtx{cgmtx currentmatrix pop}bd -/CM {cgmtx setmatrix}bd -/cm {cmmtx astore CM concat}bd +/CM {cgmtx setmatrix}bd +/cm {cmmtx astore CM concat}bd /W{clip newpath}bd /W*{eoclip newpath}bd statusdict begin product end dup (HP) anchorsearch{ - pop pop pop + pop pop pop true }{ - pop + pop (hp) anchorsearch{ pop pop true }{ pop false }ifelse }ifelse -{ - { - { - pop pop +{ + { + { + pop pop (0)dup 0 4 -1 roll put F charpath }cshow @@ -94,7 +94,7 @@ statusdict begin product end dup (HP) anchorsearch{ /cps {cply stroke}bd /pgsave 0 def /bp{/pgsave save store}bd -/ep{pgsave restore showpage}def +/ep{pgsave restore showpage}def /re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd /scrdict 10 dict def /scrmtx matrix def @@ -104,7 +104,7 @@ statusdict begin product end dup (HP) anchorsearch{ scrmtx astore pop gsave initgraphics -CM +CM patarray exch get scrmtx makepattern @@ -114,13 +114,13 @@ setpattern /cg_BeginEPSF{ userdict save/cg_b4_Inc_state exch put userdict/cg_endepsf/cg_EndEPSF load put - count userdict/cg_op_count 3 -1 roll put + count userdict/cg_op_count 3 -1 roll put countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put 3 sub{end}repeat /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath - false setstrokeadjust false setoverprint + false setstrokeadjust false setoverprint }bd /cg_EndEPSF{ countdictstack 3 sub { end } repeat @@ -145,7 +145,7 @@ L3?{ /ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd }bd - /cg_miaiproc{ + /cg_miaiproc{ string/ImageBandMask xs string/ImageBandData xs /ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter @@ -158,16 +158,16 @@ L3?{ /EI{imsave restore}bd /ID{ counttomark 2 idiv -dup 2 add +dup 2 add dict begin {def} repeat -pop +pop /ImageType 1 def /ImageMatrix[Width 0 0 Height neg 0 Height]def currentdict dup/ImageMask known{ImageMask}{F}ifelse exch L3?{ dup/MaskedImage known - { + { pop << /ImageType 3 @@ -187,8 +187,8 @@ L3?{ }if }if exch -{imagemask}{image}ifelse -end +{imagemask}{image}ifelse +end }bd /cguidfix{statusdict begin mark version end {cvr}stopped{cleartomark 0}{exch pop}ifelse @@ -201,27 +201,27 @@ currentdict end definefont pop /t_array 0 def /t_i 0 def /t_c 1 string def -/x_proc{ +/x_proc{ exch t_array t_i get add exch moveto /t_i t_i 1 add store }bd -/y_proc{ +/y_proc{ t_array t_i get add moveto /t_i t_i 1 add store }bd /xy_proc{ - - t_array t_i 2 copy 1 add get 3 1 roll get + + t_array t_i 2 copy 1 add get 3 1 roll get 4 -1 roll add 3 1 roll add moveto /t_i t_i 2 add store }bd -/sop 0 def -/cp_proc/x_proc ld -/base_charpath +/sop 0 def +/cp_proc/x_proc ld +/base_charpath { /t_array xs /t_i 0 def - { + { t_c 0 3 -1 roll put currentpoint t_c cply sop @@ -229,7 +229,7 @@ currentdict end definefont pop }forall /t_array 0 def }bd -/sop/stroke ld +/sop/stroke ld /nop{}def /xsp/base_charpath ld /ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd @@ -237,12 +237,12 @@ currentdict end definefont pop /xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd /ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd /xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd -/refnt{ +/refnt{ findfont dup length dict copy dup -/Encoding 4 -1 roll put +/Encoding 4 -1 roll put definefont pop }bd -/renmfont{ +/renmfont{ findfont dup length dict copy definefont pop }bd L3? dup dup{save exch}if @@ -266,68 +266,68 @@ L3? dup dup{save exch}if /ymin 0 def /xmax 0 def /xmin 0 def -/setupFunEval +/setupFunEval { begin /nRange Range length 2 idiv store - /mulRange - - [ + /mulRange + + [ 0 1 nRange 1 sub - { - 2 mul/nDim2 xd - Range nDim2 get - Range nDim2 1 add get - 1 index sub - - 255 div - exch + { + 2 mul/nDim2 xd + Range nDim2 get + Range nDim2 1 add get + 1 index sub + + 255 div + exch }for ]store end }bd -/FunEval +/FunEval { begin - - nRange mul /val xd - + + nRange mul /val xd + 0 1 nRange 1 sub { - dup 2 mul/nDim2 xd - val - add DataSource exch get - mulRange nDim2 get mul - mulRange nDim2 1 add get - add - }for + dup 2 mul/nDim2 xd + val + add DataSource exch get + mulRange nDim2 get mul + mulRange nDim2 1 add get + add + }for end }bd -/max +/max { 2 copy lt {exch pop}{pop}ifelse }bd /sh2 -{ - /Coords load aload pop - 3 index 3 index translate - - 3 -1 roll sub - 3 1 roll exch - sub +{ + /Coords load aload pop + 3 index 3 index translate + + 3 -1 roll sub + 3 1 roll exch + sub 2 copy - dup mul exch dup mul add sqrt + dup mul exch dup mul add sqrt dup - scale - atan - - rotate - - /Function load setupFunEval - - - clippath {pathbbox}stopped {0 0 0 0}if newpath + scale + atan + + rotate + + /Function load setupFunEval + + + clippath {pathbbox}stopped {0 0 0 0}if newpath /ymax xs /xmax xs /ymin xs @@ -335,39 +335,39 @@ L3? dup dup{save exch}if currentdict/Extend known { /Extend load 0 get - { - 0/Function load FunEval sc + { + 0/Function load FunEval sc xmin ymin xmin abs ymax ymin sub rectfill }if }if - + /Nsteps/Function load/Size get 0 get 1 sub store /dx 1 Nsteps div store gsave /di ymax ymin sub store /Function load - + 0 1 Nsteps { 1 index FunEval sc 0 ymin dx di rectfill dx 0 translate }for - pop - grestore + pop + grestore currentdict/Extend known { /Extend load 1 get - { - Nsteps/Function load FunEval sc + { + Nsteps/Function load FunEval sc 1 ymin xmax 1 sub abs ymax ymin sub rectfill }if }if }bd -/shp -{ +/shp +{ 4 copy - + dup 0 gt{ 0 exch a1 a0 arc }{ @@ -378,9 +378,9 @@ L3? dup dup{save exch}if }{ pop 0 lineto }ifelse - + fill - + dup 0 gt{ 0 exch a0 a1 arc }{ @@ -391,175 +391,175 @@ L3? dup dup{save exch}if }{ pop 0 lineto }ifelse - + fill }bd /calcmaxs -{ - - xmin dup mul ymin dup mul add sqrt - xmax dup mul ymin dup mul add sqrt - xmin dup mul ymax dup mul add sqrt - xmax dup mul ymax dup mul add sqrt - max max max +{ + + xmin dup mul ymin dup mul add sqrt + xmax dup mul ymin dup mul add sqrt + xmin dup mul ymax dup mul add sqrt + xmax dup mul ymax dup mul add sqrt + max max max }bd /sh3 -{ - /Coords load aload pop - 5 index 5 index translate - 3 -1 roll 6 -1 roll sub - 3 -1 roll 5 -1 roll sub +{ + /Coords load aload pop + 5 index 5 index translate + 3 -1 roll 6 -1 roll sub + 3 -1 roll 5 -1 roll sub 2 copy dup mul exch dup mul add sqrt - /dx xs + /dx xs 2 copy 0 ne exch 0 ne or { - - exch atan rotate + + exch atan rotate }{ pop pop }ifelse - + /r2 xs /r1 xs - /Function load - dup/Size get 0 get 1 sub - /Nsteps xs - setupFunEval - - - - - + /Function load + dup/Size get 0 get 1 sub + /Nsteps xs + setupFunEval + + + + + dx r2 add r1 lt{ - - 0 + + 0 }{ dx r1 add r2 le - { + { 1 - }{ + }{ r1 r2 eq - { + { 2 - }{ + }{ 3 - }ifelse + }ifelse }ifelse }ifelse - /sh3tp xs - clippath {pathbbox}stopped {0 0 0 0}if - newpath + /sh3tp xs + clippath {pathbbox}stopped {0 0 0 0}if + newpath /ymax xs /xmax xs /ymin xs /xmin xs - + dx dup mul r2 r1 sub dup mul sub dup 0 gt { sqrt r2 r1 sub atan - /a0 exch 180 exch sub store - /a1 a0 neg store + /a0 exch 180 exch sub store + /a1 a0 neg store }{ pop /a0 0 store - /a1 360 store - }ifelse + /a1 360 store + }ifelse currentdict/Extend known { - /Extend load 0 get r1 0 gt and - { - 0/Function load FunEval sc - - - - - { - { + /Extend load 0 get r1 0 gt and + { + 0/Function load FunEval sc + + + + + { + { dx 0 r1 360 0 arcn xmin ymin moveto xmax ymin lineto xmax ymax lineto xmin ymax lineto xmin ymin lineto - eofill + eofill } - { + { r1 0 gt{0 0 r1 0 360 arc fill}if } - { - - - - + { + + + + 0 r1 xmin abs r1 add neg r1 shp } - { - - - r2 r1 gt{ - + { + + + r2 r1 gt{ + 0 r1 - r1 neg r2 r1 sub div dx mul - 0 - shp - }{ - - - - 0 r1 calcmaxs + r1 neg r2 r1 sub div dx mul + 0 + shp + }{ + + + + 0 r1 calcmaxs dup - + r2 add dx mul dx r1 r2 sub sub div - neg - exch 1 index + neg + exch 1 index abs exch sub shp }ifelse - } - }sh3tp get exec + } + }sh3tp get exec }if }if - + /d0 0 store /r0 r1 store /di dx Nsteps div store - /ri r2 r1 sub Nsteps div store - /Function load + /ri r2 r1 sub Nsteps div store + /Function load 0 1 Nsteps - { + { 1 index FunEval sc d0 di add r0 ri add d0 r0 shp { - + d0 0 r0 a1 a0 arc d0 di add 0 r0 ri add a0 a1 arcn fill - - + + d0 0 r0 a0 a1 arc d0 di add 0 r0 ri add a1 a0 arcn fill }pop - - + + /d0 d0 di add store /r0 r0 ri add store }for - pop - + pop + currentdict/Extend known { - /Extend load 1 get r2 0 gt and - { - Nsteps/Function load FunEval sc - - - - - { + /Extend load 1 get r2 0 gt and + { + Nsteps/Function load FunEval sc + + + + + { { dx 0 r2 0 360 arc fill - } + } { dx 0 r2 360 0 arcn xmin ymin moveto @@ -567,68 +567,68 @@ L3? dup dup{save exch}if xmax ymax lineto xmin ymax lineto xmin ymin lineto - eofill - } - { - - + eofill + } + { + + xmax abs r1 add r1 dx r1 shp - } - { - + } + { + r2 r1 gt{ - - - - calcmaxs dup - - r1 add dx mul dx r2 r1 sub sub div - exch 1 index + + + + calcmaxs dup + + r1 add dx mul dx r2 r1 sub sub div + exch 1 index exch sub dx r2 shp - }{ - - r1 neg r2 r1 sub div dx mul - 0 - dx - r2 + }{ + + r1 neg r2 r1 sub div dx mul + 0 + dx + r2 shp }ifelse } - } - sh3tp get exec + } + sh3tp get exec }if }if }bd -/sh -{ +/sh +{ begin /ShadingType load dup dup 2 eq exch 3 eq or - { + { gsave newpath /ColorSpace load scs currentdict/BBox known { - /BBox load aload pop - 2 index sub - 3 index - 3 -1 roll exch sub + /BBox load aload pop + 2 index sub + 3 index + 3 -1 roll exch sub exch rectclip }if 2 eq {sh2}{sh3}ifelse grestore }{ - - pop + + pop (DEBUG: shading type unimplemented\n)print flush }ifelse end }bd {restore}if not dup{save exch}if - L3?{ + L3?{ /sh/shfill ld /csq/clipsave ld /csQ/cliprestore ld @@ -752,22 +752,22 @@ sdmtx 0000000000000000000000000000000000000000000000000000000000000000 cleartomark end %APLT1End - + %RBIEndFontSubset /Helvetica cguidfix /F1.1/Helvetica renmfont -[ /CIEBasedABC 4 dict dup begin -/WhitePoint [ 0.9505 1.0000 1.0891 ] def -/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def -/MatrixABC [ 0.4294 0.2332 0.0202 0.3278 0.6737 0.1105 0.1933 0.0938 0.9580 ] def -/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def +[ /CIEBasedABC 4 dict dup begin +/WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def +/MatrixABC [ 0.4294 0.2332 0.0202 0.3278 0.6737 0.1105 0.1933 0.0938 0.9580 ] def +/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def end ] /Cs1 exch/ColorSpace dr pop -[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def -/DecodeA { { 1.8008 exp } bind exec} bind -def -/MatrixA [ 0.9642 1.0000 0.8249 ] def -/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def -/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def +[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeA { { 1.8008 exp } bind exec} bind +def +/MatrixA [ 0.9642 1.0000 0.8249 ] def +/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def +/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def end ] /Cs2 exch/ColorSpace dr pop %%EndPageSetup 0.60000002 i diff --git a/doc/images/dof-rearr.eps b/doc/images/dof-rearr.eps index 92c715b101d..ed75b271ad5 100644 --- a/doc/images/dof-rearr.eps +++ b/doc/images/dof-rearr.eps @@ -57,32 +57,32 @@ mark /Q/grestore counttomark 2 idiv {ld}repeat pop -/SC{ +/SC{ /ColorSpace fr scs }bd /sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld /soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld /cgmtx matrix def /sdmtx{cgmtx currentmatrix pop}bd -/CM {cgmtx setmatrix}bd -/cm {cmmtx astore CM concat}bd +/CM {cgmtx setmatrix}bd +/cm {cmmtx astore CM concat}bd /W{clip newpath}bd /W*{eoclip newpath}bd statusdict begin product end dup (HP) anchorsearch{ - pop pop pop + pop pop pop true }{ - pop + pop (hp) anchorsearch{ pop pop true }{ pop false }ifelse }ifelse -{ - { - { - pop pop +{ + { + { + pop pop (0)dup 0 4 -1 roll put F charpath }cshow @@ -94,7 +94,7 @@ statusdict begin product end dup (HP) anchorsearch{ /cps {cply stroke}bd /pgsave 0 def /bp{/pgsave save store}bd -/ep{pgsave restore showpage}def +/ep{pgsave restore showpage}def /re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd /scrdict 10 dict def /scrmtx matrix def @@ -104,7 +104,7 @@ statusdict begin product end dup (HP) anchorsearch{ scrmtx astore pop gsave initgraphics -CM +CM patarray exch get scrmtx makepattern @@ -114,13 +114,13 @@ setpattern /cg_BeginEPSF{ userdict save/cg_b4_Inc_state exch put userdict/cg_endepsf/cg_EndEPSF load put - count userdict/cg_op_count 3 -1 roll put + count userdict/cg_op_count 3 -1 roll put countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put 3 sub{end}repeat /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath - false setstrokeadjust false setoverprint + false setstrokeadjust false setoverprint }bd /cg_EndEPSF{ countdictstack 3 sub { end } repeat @@ -145,7 +145,7 @@ L3?{ /ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd }bd - /cg_miaiproc{ + /cg_miaiproc{ string/ImageBandMask xs string/ImageBandData xs /ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter @@ -158,16 +158,16 @@ L3?{ /EI{imsave restore}bd /ID{ counttomark 2 idiv -dup 2 add +dup 2 add dict begin {def} repeat -pop +pop /ImageType 1 def /ImageMatrix[Width 0 0 Height neg 0 Height]def currentdict dup/ImageMask known{ImageMask}{F}ifelse exch L3?{ dup/MaskedImage known - { + { pop << /ImageType 3 @@ -187,8 +187,8 @@ L3?{ }if }if exch -{imagemask}{image}ifelse -end +{imagemask}{image}ifelse +end }bd /cguidfix{statusdict begin mark version end {cvr}stopped{cleartomark 0}{exch pop}ifelse @@ -201,27 +201,27 @@ currentdict end definefont pop /t_array 0 def /t_i 0 def /t_c 1 string def -/x_proc{ +/x_proc{ exch t_array t_i get add exch moveto /t_i t_i 1 add store }bd -/y_proc{ +/y_proc{ t_array t_i get add moveto /t_i t_i 1 add store }bd /xy_proc{ - - t_array t_i 2 copy 1 add get 3 1 roll get + + t_array t_i 2 copy 1 add get 3 1 roll get 4 -1 roll add 3 1 roll add moveto /t_i t_i 2 add store }bd -/sop 0 def -/cp_proc/x_proc ld -/base_charpath +/sop 0 def +/cp_proc/x_proc ld +/base_charpath { /t_array xs /t_i 0 def - { + { t_c 0 3 -1 roll put currentpoint t_c cply sop @@ -229,7 +229,7 @@ currentdict end definefont pop }forall /t_array 0 def }bd -/sop/stroke ld +/sop/stroke ld /nop{}def /xsp/base_charpath ld /ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd @@ -237,12 +237,12 @@ currentdict end definefont pop /xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd /ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd /xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd -/refnt{ +/refnt{ findfont dup length dict copy dup -/Encoding 4 -1 roll put +/Encoding 4 -1 roll put definefont pop }bd -/renmfont{ +/renmfont{ findfont dup length dict copy definefont pop }bd L3? dup dup{save exch}if @@ -266,68 +266,68 @@ L3? dup dup{save exch}if /ymin 0 def /xmax 0 def /xmin 0 def -/setupFunEval +/setupFunEval { begin /nRange Range length 2 idiv store - /mulRange - - [ + /mulRange + + [ 0 1 nRange 1 sub - { - 2 mul/nDim2 xd - Range nDim2 get - Range nDim2 1 add get - 1 index sub - - 255 div - exch + { + 2 mul/nDim2 xd + Range nDim2 get + Range nDim2 1 add get + 1 index sub + + 255 div + exch }for ]store end }bd -/FunEval +/FunEval { begin - - nRange mul /val xd - + + nRange mul /val xd + 0 1 nRange 1 sub { - dup 2 mul/nDim2 xd - val - add DataSource exch get - mulRange nDim2 get mul - mulRange nDim2 1 add get - add - }for + dup 2 mul/nDim2 xd + val + add DataSource exch get + mulRange nDim2 get mul + mulRange nDim2 1 add get + add + }for end }bd -/max +/max { 2 copy lt {exch pop}{pop}ifelse }bd /sh2 -{ - /Coords load aload pop - 3 index 3 index translate - - 3 -1 roll sub - 3 1 roll exch - sub +{ + /Coords load aload pop + 3 index 3 index translate + + 3 -1 roll sub + 3 1 roll exch + sub 2 copy - dup mul exch dup mul add sqrt + dup mul exch dup mul add sqrt dup - scale - atan - - rotate - - /Function load setupFunEval - - - clippath {pathbbox}stopped {0 0 0 0}if newpath + scale + atan + + rotate + + /Function load setupFunEval + + + clippath {pathbbox}stopped {0 0 0 0}if newpath /ymax xs /xmax xs /ymin xs @@ -335,39 +335,39 @@ L3? dup dup{save exch}if currentdict/Extend known { /Extend load 0 get - { - 0/Function load FunEval sc + { + 0/Function load FunEval sc xmin ymin xmin abs ymax ymin sub rectfill }if }if - + /Nsteps/Function load/Size get 0 get 1 sub store /dx 1 Nsteps div store gsave /di ymax ymin sub store /Function load - + 0 1 Nsteps { 1 index FunEval sc 0 ymin dx di rectfill dx 0 translate }for - pop - grestore + pop + grestore currentdict/Extend known { /Extend load 1 get - { - Nsteps/Function load FunEval sc + { + Nsteps/Function load FunEval sc 1 ymin xmax 1 sub abs ymax ymin sub rectfill }if }if }bd -/shp -{ +/shp +{ 4 copy - + dup 0 gt{ 0 exch a1 a0 arc }{ @@ -378,9 +378,9 @@ L3? dup dup{save exch}if }{ pop 0 lineto }ifelse - + fill - + dup 0 gt{ 0 exch a0 a1 arc }{ @@ -391,175 +391,175 @@ L3? dup dup{save exch}if }{ pop 0 lineto }ifelse - + fill }bd /calcmaxs -{ - - xmin dup mul ymin dup mul add sqrt - xmax dup mul ymin dup mul add sqrt - xmin dup mul ymax dup mul add sqrt - xmax dup mul ymax dup mul add sqrt - max max max +{ + + xmin dup mul ymin dup mul add sqrt + xmax dup mul ymin dup mul add sqrt + xmin dup mul ymax dup mul add sqrt + xmax dup mul ymax dup mul add sqrt + max max max }bd /sh3 -{ - /Coords load aload pop - 5 index 5 index translate - 3 -1 roll 6 -1 roll sub - 3 -1 roll 5 -1 roll sub +{ + /Coords load aload pop + 5 index 5 index translate + 3 -1 roll 6 -1 roll sub + 3 -1 roll 5 -1 roll sub 2 copy dup mul exch dup mul add sqrt - /dx xs + /dx xs 2 copy 0 ne exch 0 ne or { - - exch atan rotate + + exch atan rotate }{ pop pop }ifelse - + /r2 xs /r1 xs - /Function load - dup/Size get 0 get 1 sub - /Nsteps xs - setupFunEval - - - - - + /Function load + dup/Size get 0 get 1 sub + /Nsteps xs + setupFunEval + + + + + dx r2 add r1 lt{ - - 0 + + 0 }{ dx r1 add r2 le - { + { 1 - }{ + }{ r1 r2 eq - { + { 2 - }{ + }{ 3 - }ifelse + }ifelse }ifelse }ifelse - /sh3tp xs - clippath {pathbbox}stopped {0 0 0 0}if - newpath + /sh3tp xs + clippath {pathbbox}stopped {0 0 0 0}if + newpath /ymax xs /xmax xs /ymin xs /xmin xs - + dx dup mul r2 r1 sub dup mul sub dup 0 gt { sqrt r2 r1 sub atan - /a0 exch 180 exch sub store - /a1 a0 neg store + /a0 exch 180 exch sub store + /a1 a0 neg store }{ pop /a0 0 store - /a1 360 store - }ifelse + /a1 360 store + }ifelse currentdict/Extend known { - /Extend load 0 get r1 0 gt and - { - 0/Function load FunEval sc - - - - - { - { + /Extend load 0 get r1 0 gt and + { + 0/Function load FunEval sc + + + + + { + { dx 0 r1 360 0 arcn xmin ymin moveto xmax ymin lineto xmax ymax lineto xmin ymax lineto xmin ymin lineto - eofill + eofill } - { + { r1 0 gt{0 0 r1 0 360 arc fill}if } - { - - - - + { + + + + 0 r1 xmin abs r1 add neg r1 shp } - { - - - r2 r1 gt{ - + { + + + r2 r1 gt{ + 0 r1 - r1 neg r2 r1 sub div dx mul - 0 - shp - }{ - - - - 0 r1 calcmaxs + r1 neg r2 r1 sub div dx mul + 0 + shp + }{ + + + + 0 r1 calcmaxs dup - + r2 add dx mul dx r1 r2 sub sub div - neg - exch 1 index + neg + exch 1 index abs exch sub shp }ifelse - } - }sh3tp get exec + } + }sh3tp get exec }if }if - + /d0 0 store /r0 r1 store /di dx Nsteps div store - /ri r2 r1 sub Nsteps div store - /Function load + /ri r2 r1 sub Nsteps div store + /Function load 0 1 Nsteps - { + { 1 index FunEval sc d0 di add r0 ri add d0 r0 shp { - + d0 0 r0 a1 a0 arc d0 di add 0 r0 ri add a0 a1 arcn fill - - + + d0 0 r0 a0 a1 arc d0 di add 0 r0 ri add a1 a0 arcn fill }pop - - + + /d0 d0 di add store /r0 r0 ri add store }for - pop - + pop + currentdict/Extend known { - /Extend load 1 get r2 0 gt and - { - Nsteps/Function load FunEval sc - - - - - { + /Extend load 1 get r2 0 gt and + { + Nsteps/Function load FunEval sc + + + + + { { dx 0 r2 0 360 arc fill - } + } { dx 0 r2 360 0 arcn xmin ymin moveto @@ -567,68 +567,68 @@ L3? dup dup{save exch}if xmax ymax lineto xmin ymax lineto xmin ymin lineto - eofill - } - { - - + eofill + } + { + + xmax abs r1 add r1 dx r1 shp - } - { - + } + { + r2 r1 gt{ - - - - calcmaxs dup - - r1 add dx mul dx r2 r1 sub sub div - exch 1 index + + + + calcmaxs dup + + r1 add dx mul dx r2 r1 sub sub div + exch 1 index exch sub dx r2 shp - }{ - - r1 neg r2 r1 sub div dx mul - 0 - dx - r2 + }{ + + r1 neg r2 r1 sub div dx mul + 0 + dx + r2 shp }ifelse } - } - sh3tp get exec + } + sh3tp get exec }if }if }bd -/sh -{ +/sh +{ begin /ShadingType load dup dup 2 eq exch 3 eq or - { + { gsave newpath /ColorSpace load scs currentdict/BBox known { - /BBox load aload pop - 2 index sub - 3 index - 3 -1 roll exch sub + /BBox load aload pop + 2 index sub + 3 index + 3 -1 roll exch sub exch rectclip }if 2 eq {sh2}{sh3}ifelse grestore }{ - - pop + + pop (DEBUG: shading type unimplemented\n)print flush }ifelse end }bd {restore}if not dup{save exch}if - L3?{ + L3?{ /sh/shfill ld /csq/clipsave ld /csQ/cliprestore ld @@ -781,22 +781,22 @@ sdmtx 0000000000000000000000000000000000000000000000000000000000000000 cleartomark end %APLT1End - + %RBIEndFontSubset /Helvetica cguidfix /F1.1/Helvetica renmfont -[ /CIEBasedABC 4 dict dup begin -/WhitePoint [ 0.9505 1.0000 1.0891 ] def -/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def -/MatrixABC [ 0.4294 0.2332 0.0202 0.3278 0.6737 0.1105 0.1933 0.0938 0.9580 ] def -/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def +[ /CIEBasedABC 4 dict dup begin +/WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def +/MatrixABC [ 0.4294 0.2332 0.0202 0.3278 0.6737 0.1105 0.1933 0.0938 0.9580 ] def +/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def end ] /Cs1 exch/ColorSpace dr pop -[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def -/DecodeA { { 1.8008 exp } bind exec} bind -def -/MatrixA [ 0.9642 1.0000 0.8249 ] def -/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def -/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def +[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeA { { 1.8008 exp } bind exec} bind +def +/MatrixA [ 0.9642 1.0000 0.8249 ] def +/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def +/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def end ] /Cs2 exch/ColorSpace dr pop %%EndPageSetup 0.60000002 i diff --git a/doc/images/dof.eps b/doc/images/dof.eps index 770e04d92c1..6310571f83f 100644 --- a/doc/images/dof.eps +++ b/doc/images/dof.eps @@ -57,32 +57,32 @@ mark /Q/grestore counttomark 2 idiv {ld}repeat pop -/SC{ +/SC{ /ColorSpace fr scs }bd /sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld /soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld /cgmtx matrix def /sdmtx{cgmtx currentmatrix pop}bd -/CM {cgmtx setmatrix}bd -/cm {cmmtx astore CM concat}bd +/CM {cgmtx setmatrix}bd +/cm {cmmtx astore CM concat}bd /W{clip newpath}bd /W*{eoclip newpath}bd statusdict begin product end dup (HP) anchorsearch{ - pop pop pop + pop pop pop true }{ - pop + pop (hp) anchorsearch{ pop pop true }{ pop false }ifelse }ifelse -{ - { - { - pop pop +{ + { + { + pop pop (0)dup 0 4 -1 roll put F charpath }cshow @@ -94,7 +94,7 @@ statusdict begin product end dup (HP) anchorsearch{ /cps {cply stroke}bd /pgsave 0 def /bp{/pgsave save store}bd -/ep{pgsave restore showpage}def +/ep{pgsave restore showpage}def /re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd /scrdict 10 dict def /scrmtx matrix def @@ -104,7 +104,7 @@ statusdict begin product end dup (HP) anchorsearch{ scrmtx astore pop gsave initgraphics -CM +CM patarray exch get scrmtx makepattern @@ -114,13 +114,13 @@ setpattern /cg_BeginEPSF{ userdict save/cg_b4_Inc_state exch put userdict/cg_endepsf/cg_EndEPSF load put - count userdict/cg_op_count 3 -1 roll put + count userdict/cg_op_count 3 -1 roll put countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put 3 sub{end}repeat /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath - false setstrokeadjust false setoverprint + false setstrokeadjust false setoverprint }bd /cg_EndEPSF{ countdictstack 3 sub { end } repeat @@ -145,7 +145,7 @@ L3?{ /ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd }bd - /cg_miaiproc{ + /cg_miaiproc{ string/ImageBandMask xs string/ImageBandData xs /ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter @@ -158,16 +158,16 @@ L3?{ /EI{imsave restore}bd /ID{ counttomark 2 idiv -dup 2 add +dup 2 add dict begin {def} repeat -pop +pop /ImageType 1 def /ImageMatrix[Width 0 0 Height neg 0 Height]def currentdict dup/ImageMask known{ImageMask}{F}ifelse exch L3?{ dup/MaskedImage known - { + { pop << /ImageType 3 @@ -187,8 +187,8 @@ L3?{ }if }if exch -{imagemask}{image}ifelse -end +{imagemask}{image}ifelse +end }bd /cguidfix{statusdict begin mark version end {cvr}stopped{cleartomark 0}{exch pop}ifelse @@ -201,27 +201,27 @@ currentdict end definefont pop /t_array 0 def /t_i 0 def /t_c 1 string def -/x_proc{ +/x_proc{ exch t_array t_i get add exch moveto /t_i t_i 1 add store }bd -/y_proc{ +/y_proc{ t_array t_i get add moveto /t_i t_i 1 add store }bd /xy_proc{ - - t_array t_i 2 copy 1 add get 3 1 roll get + + t_array t_i 2 copy 1 add get 3 1 roll get 4 -1 roll add 3 1 roll add moveto /t_i t_i 2 add store }bd -/sop 0 def -/cp_proc/x_proc ld -/base_charpath +/sop 0 def +/cp_proc/x_proc ld +/base_charpath { /t_array xs /t_i 0 def - { + { t_c 0 3 -1 roll put currentpoint t_c cply sop @@ -229,7 +229,7 @@ currentdict end definefont pop }forall /t_array 0 def }bd -/sop/stroke ld +/sop/stroke ld /nop{}def /xsp/base_charpath ld /ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd @@ -237,12 +237,12 @@ currentdict end definefont pop /xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd /ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd /xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd -/refnt{ +/refnt{ findfont dup length dict copy dup -/Encoding 4 -1 roll put +/Encoding 4 -1 roll put definefont pop }bd -/renmfont{ +/renmfont{ findfont dup length dict copy definefont pop }bd L3? dup dup{save exch}if @@ -266,68 +266,68 @@ L3? dup dup{save exch}if /ymin 0 def /xmax 0 def /xmin 0 def -/setupFunEval +/setupFunEval { begin /nRange Range length 2 idiv store - /mulRange - - [ + /mulRange + + [ 0 1 nRange 1 sub - { - 2 mul/nDim2 xd - Range nDim2 get - Range nDim2 1 add get - 1 index sub - - 255 div - exch + { + 2 mul/nDim2 xd + Range nDim2 get + Range nDim2 1 add get + 1 index sub + + 255 div + exch }for ]store end }bd -/FunEval +/FunEval { begin - - nRange mul /val xd - + + nRange mul /val xd + 0 1 nRange 1 sub { - dup 2 mul/nDim2 xd - val - add DataSource exch get - mulRange nDim2 get mul - mulRange nDim2 1 add get - add - }for + dup 2 mul/nDim2 xd + val + add DataSource exch get + mulRange nDim2 get mul + mulRange nDim2 1 add get + add + }for end }bd -/max +/max { 2 copy lt {exch pop}{pop}ifelse }bd /sh2 -{ - /Coords load aload pop - 3 index 3 index translate - - 3 -1 roll sub - 3 1 roll exch - sub +{ + /Coords load aload pop + 3 index 3 index translate + + 3 -1 roll sub + 3 1 roll exch + sub 2 copy - dup mul exch dup mul add sqrt + dup mul exch dup mul add sqrt dup - scale - atan - - rotate - - /Function load setupFunEval - - - clippath {pathbbox}stopped {0 0 0 0}if newpath + scale + atan + + rotate + + /Function load setupFunEval + + + clippath {pathbbox}stopped {0 0 0 0}if newpath /ymax xs /xmax xs /ymin xs @@ -335,39 +335,39 @@ L3? dup dup{save exch}if currentdict/Extend known { /Extend load 0 get - { - 0/Function load FunEval sc + { + 0/Function load FunEval sc xmin ymin xmin abs ymax ymin sub rectfill }if }if - + /Nsteps/Function load/Size get 0 get 1 sub store /dx 1 Nsteps div store gsave /di ymax ymin sub store /Function load - + 0 1 Nsteps { 1 index FunEval sc 0 ymin dx di rectfill dx 0 translate }for - pop - grestore + pop + grestore currentdict/Extend known { /Extend load 1 get - { - Nsteps/Function load FunEval sc + { + Nsteps/Function load FunEval sc 1 ymin xmax 1 sub abs ymax ymin sub rectfill }if }if }bd -/shp -{ +/shp +{ 4 copy - + dup 0 gt{ 0 exch a1 a0 arc }{ @@ -378,9 +378,9 @@ L3? dup dup{save exch}if }{ pop 0 lineto }ifelse - + fill - + dup 0 gt{ 0 exch a0 a1 arc }{ @@ -391,175 +391,175 @@ L3? dup dup{save exch}if }{ pop 0 lineto }ifelse - + fill }bd /calcmaxs -{ - - xmin dup mul ymin dup mul add sqrt - xmax dup mul ymin dup mul add sqrt - xmin dup mul ymax dup mul add sqrt - xmax dup mul ymax dup mul add sqrt - max max max +{ + + xmin dup mul ymin dup mul add sqrt + xmax dup mul ymin dup mul add sqrt + xmin dup mul ymax dup mul add sqrt + xmax dup mul ymax dup mul add sqrt + max max max }bd /sh3 -{ - /Coords load aload pop - 5 index 5 index translate - 3 -1 roll 6 -1 roll sub - 3 -1 roll 5 -1 roll sub +{ + /Coords load aload pop + 5 index 5 index translate + 3 -1 roll 6 -1 roll sub + 3 -1 roll 5 -1 roll sub 2 copy dup mul exch dup mul add sqrt - /dx xs + /dx xs 2 copy 0 ne exch 0 ne or { - - exch atan rotate + + exch atan rotate }{ pop pop }ifelse - + /r2 xs /r1 xs - /Function load - dup/Size get 0 get 1 sub - /Nsteps xs - setupFunEval - - - - - + /Function load + dup/Size get 0 get 1 sub + /Nsteps xs + setupFunEval + + + + + dx r2 add r1 lt{ - - 0 + + 0 }{ dx r1 add r2 le - { + { 1 - }{ + }{ r1 r2 eq - { + { 2 - }{ + }{ 3 - }ifelse + }ifelse }ifelse }ifelse - /sh3tp xs - clippath {pathbbox}stopped {0 0 0 0}if - newpath + /sh3tp xs + clippath {pathbbox}stopped {0 0 0 0}if + newpath /ymax xs /xmax xs /ymin xs /xmin xs - + dx dup mul r2 r1 sub dup mul sub dup 0 gt { sqrt r2 r1 sub atan - /a0 exch 180 exch sub store - /a1 a0 neg store + /a0 exch 180 exch sub store + /a1 a0 neg store }{ pop /a0 0 store - /a1 360 store - }ifelse + /a1 360 store + }ifelse currentdict/Extend known { - /Extend load 0 get r1 0 gt and - { - 0/Function load FunEval sc - - - - - { - { + /Extend load 0 get r1 0 gt and + { + 0/Function load FunEval sc + + + + + { + { dx 0 r1 360 0 arcn xmin ymin moveto xmax ymin lineto xmax ymax lineto xmin ymax lineto xmin ymin lineto - eofill + eofill } - { + { r1 0 gt{0 0 r1 0 360 arc fill}if } - { - - - - + { + + + + 0 r1 xmin abs r1 add neg r1 shp } - { - - - r2 r1 gt{ - + { + + + r2 r1 gt{ + 0 r1 - r1 neg r2 r1 sub div dx mul - 0 - shp - }{ - - - - 0 r1 calcmaxs + r1 neg r2 r1 sub div dx mul + 0 + shp + }{ + + + + 0 r1 calcmaxs dup - + r2 add dx mul dx r1 r2 sub sub div - neg - exch 1 index + neg + exch 1 index abs exch sub shp }ifelse - } - }sh3tp get exec + } + }sh3tp get exec }if }if - + /d0 0 store /r0 r1 store /di dx Nsteps div store - /ri r2 r1 sub Nsteps div store - /Function load + /ri r2 r1 sub Nsteps div store + /Function load 0 1 Nsteps - { + { 1 index FunEval sc d0 di add r0 ri add d0 r0 shp { - + d0 0 r0 a1 a0 arc d0 di add 0 r0 ri add a0 a1 arcn fill - - + + d0 0 r0 a0 a1 arc d0 di add 0 r0 ri add a1 a0 arcn fill }pop - - + + /d0 d0 di add store /r0 r0 ri add store }for - pop - + pop + currentdict/Extend known { - /Extend load 1 get r2 0 gt and - { - Nsteps/Function load FunEval sc - - - - - { + /Extend load 1 get r2 0 gt and + { + Nsteps/Function load FunEval sc + + + + + { { dx 0 r2 0 360 arc fill - } + } { dx 0 r2 360 0 arcn xmin ymin moveto @@ -567,68 +567,68 @@ L3? dup dup{save exch}if xmax ymax lineto xmin ymax lineto xmin ymin lineto - eofill - } - { - - + eofill + } + { + + xmax abs r1 add r1 dx r1 shp - } - { - + } + { + r2 r1 gt{ - - - - calcmaxs dup - - r1 add dx mul dx r2 r1 sub sub div - exch 1 index + + + + calcmaxs dup + + r1 add dx mul dx r2 r1 sub sub div + exch 1 index exch sub dx r2 shp - }{ - - r1 neg r2 r1 sub div dx mul - 0 - dx - r2 + }{ + + r1 neg r2 r1 sub div dx mul + 0 + dx + r2 shp }ifelse } - } - sh3tp get exec + } + sh3tp get exec }if }if }bd -/sh -{ +/sh +{ begin /ShadingType load dup dup 2 eq exch 3 eq or - { + { gsave newpath /ColorSpace load scs currentdict/BBox known { - /BBox load aload pop - 2 index sub - 3 index - 3 -1 roll exch sub + /BBox load aload pop + 2 index sub + 3 index + 3 -1 roll exch sub exch rectclip }if 2 eq {sh2}{sh3}ifelse grestore }{ - - pop + + pop (DEBUG: shading type unimplemented\n)print flush }ifelse end }bd {restore}if not dup{save exch}if - L3?{ + L3?{ /sh/shfill ld /csq/clipsave ld /csQ/cliprestore ld @@ -766,22 +766,22 @@ sdmtx 0000000000000000000000000000000000000000000000000000000000000000 cleartomark end %APLT1End - + %RBIEndFontSubset /Helvetica cguidfix /F1.1/Helvetica renmfont -[ /CIEBasedABC 4 dict dup begin -/WhitePoint [ 0.9505 1.0000 1.0891 ] def -/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def -/MatrixABC [ 0.4294 0.2332 0.0202 0.3278 0.6737 0.1105 0.1933 0.0938 0.9580 ] def -/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def +[ /CIEBasedABC 4 dict dup begin +/WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def +/MatrixABC [ 0.4294 0.2332 0.0202 0.3278 0.6737 0.1105 0.1933 0.0938 0.9580 ] def +/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def end ] /Cs1 exch/ColorSpace dr pop -[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def -/DecodeA { { 1.8008 exp } bind exec} bind -def -/MatrixA [ 0.9642 1.0000 0.8249 ] def -/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def -/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def +[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeA { { 1.8008 exp } bind exec} bind +def +/MatrixA [ 0.9642 1.0000 0.8249 ] def +/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def +/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def end ] /Cs2 exch/ColorSpace dr pop %%EndPageSetup 0.60000002 i diff --git a/doc/testpio_example.txt b/doc/testpio_example.txt index 07fb3b04b47..21875023bad 100644 --- a/doc/testpio_example.txt +++ b/doc/testpio_example.txt @@ -16,9 +16,9 @@ */ /*! \page testpio_example testpio: a regression and benchmarking code -The testpio directory, included with the release package, tests both the accuracy -and performance of reading and writing data -using the pio library. +The testpio directory, included with the release package, tests both the accuracy +and performance of reading and writing data +using the pio library. The testpio directory contains 3 perl scripts that you can use to build and run the testpio.F90 code.
      @@ -65,7 +65,7 @@ block, io_nml, contains some general settings: ("bin","pnc","snc"), binary, pnetcdf, or serial netcdf - rearr string, type of rearranging to be done + rearr string, type of rearranging to be done ("none","mct","box","boxauto") @@ -77,15 +77,15 @@ block, io_nml, contains some general settings: base integer, base pe associated with nprocIO striding - stride integer, the stride of io pes across the global pe set. A stride=-1 + stride integer, the stride of io pes across the global pe set. A stride=-1 directs PIO to calculate the stride automatically. - num_aggregator integer, mpi-io number of aggregators, only used if no + num_aggregator integer, mpi-io number of aggregators, only used if no pio rearranging is done - dir string, directory to write output data, this must exist + dir string, directory to write output data, this must exist before the model starts up @@ -101,19 +101,19 @@ block, io_nml, contains some general settings: compdof_input string, setting of the compDOF ('namelist' or a filename) - compdof_output string, whether the compDOF is saved to disk + compdof_output string, whether the compDOF is saved to disk ('none' or a filename) Notes: - the "mct" rearr option is not currently available - - if rearr is set to "none", then the computational decomposition is also + - if rearr is set to "none", then the computational decomposition is also going to be used as the IO decomposition. The computation decomposition must therefore be suited to the underlying I/O methods. - if rearr is set to "box", then pio is going to generate an internal IO decomposition automatically and pio will rearrange to that decomp. - - num_aggregator is used with mpi-io and no pio rearranging. mpi-io is only + - num_aggregator is used with mpi-io and no pio rearranging. mpi-io is only used with binary data. - nprocsIO, base, and stride implementation has some special options - if nprocsIO > 0 and stride > 0, then use input values @@ -139,7 +139,7 @@ blocks are identical in use. ("xyz","xzy","yxz","yzx","zxy","zyx") - grddecomp string, sets up the block size with gdx, gdy, and gdz, see + grddecomp string, sets up the block size with gdx, gdy, and gdz, see below, ("x","y","z","xy","xye","xz","xze","yz","yze", "xyz","xyze","setblk") @@ -183,7 +183,7 @@ are provided below. Testpio writes out several files including summary information to stdout, data files to the namelists directory, and a netcdf -file summarizing the decompositions. The key output information +file summarizing the decompositions. The key output information is written to stdout and contains the timing information. In addition, a netcdf file called gdecomp.nc is written that provides both the block and task ids for each gridcell as computed by the decompositions. @@ -237,24 +237,24 @@ combinations of these cpp flags. The decomposition implementation supports the decomposition of a general 3 dimensional "nx * ny * nz" grid into multiple blocks -of gridcells which are then ordered and assigned to processors. -In general, blocks in the decomposition are rectangular, -"gdx * gdy * gdz" and the same size, although some blocks around -the edges of the domain may be smaller if the decomposition is uneven. -Both gridcells within the block and blocks within the domain can be +of gridcells which are then ordered and assigned to processors. +In general, blocks in the decomposition are rectangular, +"gdx * gdy * gdz" and the same size, although some blocks around +the edges of the domain may be smaller if the decomposition is uneven. +Both gridcells within the block and blocks within the domain can be ordered in any of the possible dimension hierarchies, such as "xyz" -where the first dimension is the fastest. +where the first dimension is the fastest. -The gdx, gdy, and gdz inputs allow the user to specify the size in -any dimension and the grddecomp input specifies which dimensions are -to be further optimized. In general, automatic decomposition generation -of 3 dimensional grids can be done in any of possible combination of +The gdx, gdy, and gdz inputs allow the user to specify the size in +any dimension and the grddecomp input specifies which dimensions are +to be further optimized. In general, automatic decomposition generation +of 3 dimensional grids can be done in any of possible combination of dimensions, (x, y, z, xy, xz, yz, or xyz), with the other dimensions having a fixed block size. The automatic generation of the decomposition is based upon an internal algorithm that tries to determine the most "square" blocks with an additional constraint on minimizing the maximum number of gridcells across processors. If evenly divided grids are -desired, use of the "e" addition to grddecomp specifies that the grid +desired, use of the "e" addition to grddecomp specifies that the grid decomposition must be evenly divided. The setblk option uses the prescibed gdx, gdy, and gdz inputs without further automation. @@ -263,7 +263,7 @@ in mapping blocks to processors, but has a few additional options. "cont1d" (contiguous 1d) basically unwraps the blocks in the order specified by the blkorder input and then decomposes that "1d" list of blocks onto processors by contiguously grouping blocks together and allocating -them to a processor. The number of contiguous blocks that are +them to a processor. The number of contiguous blocks that are allocated to a processor is the maximum of the values of bdx, bdy, and bdz inputs. Contiguous blocks are allocated to each processor in turn in a round robin fashion until all blocks are allocated. The @@ -272,13 +272,13 @@ contiguous blocks are set automatically such that each processor recieves only 1 set of contiguous blocks. The ysym2 and ysym4 blkdecomp2 options modify the original block layout such that the tasks assigned to the blocks are 2-way or 4-way symetric -in the y axis. +in the y axis. The decomposition tool is extremely flexible, but arbitrary inputs will not always yield valid decompositions. If a valid decomposition cannot be computed based on the global grid size, -number of pes, number of blocks desired, and decomposition options, -the model will stop. +number of pes, number of blocks desired, and decomposition options, +the model will stop. As indicated above, the IO decomposition must be suited to the IO methods, so decompositions are even further limited by those @@ -306,7 +306,7 @@ Some decomposition examples: Standard xyz ordering, 2d decomp: note: blkdecomp plays no role since there is 1 block per pe
      - nx_global  6       
      + nx_global  6
        ny_global  4
        nz_global  1           ______________________________
        npes       4          |B3  P3        |B4  P4         |
      @@ -327,7 +327,7 @@ note: blkdecomp plays no role since there is 1 block per pe
       Same as above but yxz ordering, 2d decomp
       note: blkdecomp plays no role since there is 1 block per pe
       
      - nx_global  6       
      + nx_global  6
        ny_global  4
        nz_global  1           _____________________________
        npes       4          |B2  P2        |B4  P4        |
      @@ -345,11 +345,11 @@ note: blkdecomp plays no role since there is 1 block per pe
        bdz        0
       
      -xyz grid ordering, 1d x decomp +xyz grid ordering, 1d x decomp note: blkdecomp plays no role since there is 1 block per pe note: blkorder plays no role since it's a 1d decomp
      - nx_global  8       
      + nx_global  8
        ny_global  4
        nz_global  1           _____________________________________
        npes       4          |B1  P1  |B2  P2   |B3  P3  |B4  P4   |
      @@ -369,7 +369,7 @@ xyz grid ordering, 1d x decomp
       
       yxz block ordering, 2d grid decomp, 2d block decomp, 4 block per pe
       
      - nx_global  8       
      + nx_global  8
        ny_global  4
        nz_global  1           _____________________________________
        npes       4          |B4  P2  |B8  P2   |B12  P4 |B16  P4  |
      diff --git a/pio/C_interface_mod.F90 b/pio/C_interface_mod.F90
      index 9e1218f0d01..281362a5596 100644
      --- a/pio/C_interface_mod.F90
      +++ b/pio/C_interface_mod.F90
      @@ -11,7 +11,7 @@
       !
       ! Entity names all have the "C_" prefix, as with ISO-C-Binding, with a
       ! few exceptions.
      -! 
      +!
       module C_interface_mod
       #ifdef _COMPRESSION
         use, intrinsic :: ISO_C_Binding, &
      @@ -45,7 +45,7 @@ module C_interface_mod
       ! have limited support for different character kinds. UTF encoding
       ! adds more complexity. This should be updated as Fortran compilers
       ! include support for more character types.
      -! 
      +!
       
       ! Fortran does not (yet) support unsigned types.
         integer, parameter :: &
      @@ -262,7 +262,7 @@ end function C_realloc
       
       contains
       
      -  ! HACK: For some reason, C_associated was not defined as pure. 
      +  ! HACK: For some reason, C_associated was not defined as pure.
         pure logical &
         function C_associated_pure(ptr) result(associated)
           type(C_ptr), intent(in) :: ptr
      diff --git a/pio/Makefile.conf.in b/pio/Makefile.conf.in
      index 3c9ebd18d73..4bb0a0b9c59 100644
      --- a/pio/Makefile.conf.in
      +++ b/pio/Makefile.conf.in
      @@ -5,14 +5,14 @@ VPATH=$(SRCDIR)
       
       FC		= @FC@
       MPIFC          = @MPIFC@
      -FFLAGS		= @BIT64@ @REAL8@ @ENDIAN@ @FFLAGS@ @FCFLAGS@ 
      +FFLAGS		= @BIT64@ @REAL8@ @ENDIAN@ @FFLAGS@ @FCFLAGS@
       
       FOPTS           = @OPT@
       FCLIBS = @FCLIBS@
       LD = @LD@
       LDFLAGS = @LDFLAGS@
       
      -INCLUDES        = @INCLUDEPATH@ 
      +INCLUDES        = @INCLUDEPATH@
       
       # INCLUDE FLAG FOR LOCATING MODULES (-I, -M, or -p)
       MODINC         = @MODINC@
      @@ -38,7 +38,7 @@ CFLAGS          = @CFLAGS@
       
       # Linking
       
      -LDLIBS = @NETCDF_LDFLAGS@ @NETCDF_LIBS@ @MPILIBS@ @LDLIBS@ 
      +LDLIBS = @NETCDF_LDFLAGS@ @NETCDF_LIBS@ @MPILIBS@ @LDLIBS@
       
       
       # DIRECTORIES
      diff --git a/pio/README.config b/pio/README.config
      index f1d987f5712..c3e99652d2e 100644
      --- a/pio/README.config
      +++ b/pio/README.config
      @@ -23,7 +23,7 @@ BUILD HELP:
       
       
         Example: If configure has trouble finding the correct F90 compiler:
      -    > ./configure F90=pgf90. 
      +    > ./configure F90=pgf90.
       
         You can also direct configure through environment variables:
           > setenv F90 xlf90
      @@ -36,7 +36,7 @@ PLATFORM NOTES:
         > ./configure --host=Linux ac_cv_c_bigendian=yes
       
         On the Cray XT3/XT4 (e.g. jaguar) use:
      -  > ./configure --host=Linux FC=ftn F90=ftn 
      +  > ./configure --host=Linux FC=ftn F90=ftn
       
         On jazz for g95:
         use .soft key @all-mpich_gm-gcc4.0.2-g95-0.50
      diff --git a/pio/alloc_mod.F90.in b/pio/alloc_mod.F90.in
      index f70259d6ef1..7843c7f69f6 100644
      --- a/pio/alloc_mod.F90.in
      +++ b/pio/alloc_mod.F90.in
      @@ -1,6 +1,6 @@
       #define __PIO_FILE__ "alloc_mod.F90.in"
       !>
      -!! @file 
      +!! @file
       !! $Revision$
       !! $LastChangedDate$
       !! @brief Internal allocation routines for PIO
      @@ -15,18 +15,18 @@ module alloc_mod
       
       !>
       !! @private
      -!! PIO internal memory allocation check routines.  
      +!! PIO internal memory allocation check routines.
       !<
         public:: alloc_check
       !>
       !! @private
      -!! PIO internal memory allocation check routines.  
      +!! PIO internal memory allocation check routines.
       !<
      -  public:: dealloc_check 
      +  public:: dealloc_check
       
         interface alloc_check
            ! TYPE long,int,real,double ! DIMS 1,2
      -     module procedure alloc_check_{DIMS}d_{TYPE} 
      +     module procedure alloc_check_{DIMS}d_{TYPE}
            ! TYPE double,long,int,real
            module procedure alloc_check_0d_{TYPE}
        end interface
      @@ -42,19 +42,19 @@ module alloc_mod
       
       !>
       !! @private
      -!! PIO internal memory allocation check routines.  
      +!! PIO internal memory allocation check routines.
       !<
         public :: alloc_print_usage
       
       !>
       !! @private
      -!! PIO internal memory allocation check routines.  
      +!! PIO internal memory allocation check routines.
       !<
         public :: alloc_trace_on
       
       !>
       !! @private
      -!! PIO internal memory allocation check routines.  
      +!! PIO internal memory allocation check routines.
       !<
         public :: alloc_trace_off
       
      @@ -66,7 +66,7 @@ contains
         ! Instantiate all the variations of alloc_check_ and dealloc_check_
         !
       
      -  ! TYPE long,int,real,double 
      +  ! TYPE long,int,real,double
         subroutine alloc_check_1d_{TYPE} (data,varlen,msg)
       
           {VTYPE}, pointer :: data(:)
      @@ -102,7 +102,7 @@ contains
       
         end subroutine alloc_check_1d_{TYPE}
       
      -  ! TYPE long,int,real,double 
      +  ! TYPE long,int,real,double
         subroutine alloc_check_2d_{TYPE} (data,size1, size2,msg)
       
           {VTYPE}, pointer :: data(:,:)
      @@ -214,7 +214,7 @@ end subroutine dealloc_check_0d_{TYPE}
       !>
       !! @private
       !! @fn alloc_print_usage
      -!! PIO internal memory allocation check routines.  
      +!! PIO internal memory allocation check routines.
       !<
         subroutine alloc_print_usage(rank,msg)
       #ifndef NO_MPIMOD
      diff --git a/pio/box_rearrange.F90.in b/pio/box_rearrange.F90.in
      index 1b9f38138d2..cf2a87416b3 100644
      --- a/pio/box_rearrange.F90.in
      +++ b/pio/box_rearrange.F90.in
      @@ -1,7 +1,7 @@
       #define __PIO_FILE__ "box_rearrange.F90.in"
       !>
       !!
      -!! @file 
      +!! @file
       !! $Revision: 819 $
       !! $LastChangedDate: 2013-05-31 13:32:27 -0500 (Fri, 31 May 2013) $
       !! @brief
      @@ -18,7 +18,7 @@
       !!            (imported flow-controlled alltoall logic ("swapm") from
       !!            Community Atmosphere Model) - P. Worley
       !!  20100207  added flow-control logic option to box_rearrange_create - P. Worley
      -!!            
      +!!  
       !<
       
       !#define MEMCHK
      @@ -31,7 +31,7 @@
       
       #include "rearr_options.h"
       
      -!> 
      +!>
       !! \def TAG
       !! Arbitrary mpi message tags used for the rearrange
       !<
      @@ -48,7 +48,7 @@ module box_rearrange
                                 Debug, DebugIO, CheckMPIReturn, pio_fc_gather_offset
       #else
         use pio_support, only : piodie, Debug, DebugIO, CheckMPIReturn, pio_fc_gather_offset
      -                          
      +
       #endif
       #ifdef TIMING
         use perf_mod, only : t_startf, t_stopf  !_EXTERNAL
      @@ -128,7 +128,7 @@ subroutine box_rearrange_comp2io_{TYPE} (IOsystem, ioDesc, s1, src, niodof, &
         integer :: myrank
         integer :: nprocs
         integer :: status(MPI_STATUS_SIZE)
      -  
      +
         integer,pointer :: rfrom(:)     ! rank of ith sender to this ioproc
         integer,pointer :: rtype(:)
       
      @@ -353,7 +353,7 @@ subroutine box_rearrange_comp2io_{TYPE} (IOsystem, ioDesc, s1, src, niodof, &
       
               call MPI_IRECV( dest,1, rtype(i), &             ! buf, count, type
                               rfrom(i), TAG2, &               ! source, tag
      -                        IOsystem%union_comm,rreq(i),ierror )        
      +                        IOsystem%union_comm,rreq(i),ierror )
               call CheckMPIReturn('box_rearrange',ierror)
             end do
       
      @@ -441,7 +441,7 @@ subroutine box_rearrange_io2comp_{TYPE} (IOsystem,ioDesc,s1, iobuf,s2, compbuf,
         integer,pointer :: a2a_recvtypes(:)
         integer,pointer :: sreq(:)
         integer,pointer :: rreq(:)      ! receive requests for comp procs
      - 
      +
       #ifdef _MPISERIAL
         integer :: num_tasks, ioproc, ioindex
         ! begin
      @@ -652,7 +652,7 @@ subroutine box_rearrange_io2comp_{TYPE} (IOsystem,ioDesc,s1, iobuf,s2, compbuf,
       
               call MPI_ISEND( iobuf,1, rtype(i), &                ! buf, count, type
                               rfrom(i), TAG2, &                   ! dest, tag
      -                        IOsystem%union_comm,sreq(i),ierror )        
      +                        IOsystem%union_comm,sreq(i),ierror )
               call CheckMPIReturn(subName,ierror)
       
             end do
      @@ -692,7 +692,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         !
         ! io_comprank
      -  ! 
      +  !
         !   find the rank in union_comm of the ith io processor
         !
       
      @@ -708,7 +708,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         !
         ! gindex_to_coord
      -  ! 
      +  !
         !   find global xyz coordinates given a global index
         !
       
      @@ -729,7 +729,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
       
           tempindex=gindex
       
      -    do i=ndim,2,-1    
      +    do i=ndim,2,-1
              gcoord(i) = tempindex/gstride(i-1)                 ! integer division
              tempindex = tempindex - gcoord(i)*gstride(i-1)   ! remainder
           end do
      @@ -837,8 +837,8 @@ end subroutine box_rearrange_io2comp_{TYPE}
           integer(kind=pio_offset), intent(in) :: start(:,:)       ! start(ndim,nioproc)
           integer(kind=pio_offset), intent(in) :: kount(:,:)       ! count(ndim,nioproc)
       
      -    integer, intent(in) :: gsize(:)         ! global domain size gsize(ndim) 
      -    integer, intent(in) :: ndim   
      +    integer, intent(in) :: gsize(:)         ! global domain size gsize(ndim)
      +    integer, intent(in) :: ndim
           integer, intent(in) :: nioproc
           integer, intent(out) :: dest_ioproc(:)    ! ioproc number to send to
           integer(kind=PIO_OFFSET), intent(out) :: dest_ioindex(:)     ! index in iobuf on that ioproc
      @@ -980,7 +980,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
       
           start = 0
           count = 0
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1027,7 +1027,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
              end do
           endif
       !#endif
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1041,7 +1041,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
                Iosystem%num_aiotasks, ioDesc%dest_ioproc, ioDesc%dest_ioindex )
       
       #ifdef _MPISERIAL
      -! Version for use with mpi-serial. 
      +! Version for use with mpi-serial.
       ! NOTE: cached values in iodesc other than dest_ioproc() and dest_ioindex()
       !       will NOT be allocated in this build
       
      @@ -1052,9 +1052,9 @@ end subroutine box_rearrange_io2comp_{TYPE}
                          'iotasks=', Iosystem%num_iotasks)
           endif
       
      -#else 
      +#else
       ! else not _MPISERIAL
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1069,7 +1069,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
       
           call compute_counts(Iosystem, ioDesc, niodof)
       
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1095,7 +1095,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
       !<
       #ifndef _MPISERIAL
         subroutine compute_counts(Iosystem, ioDesc, niodof)
      -    
      +
           use calcdisplace_mod, only : calcdisplace,GCDblocksize,gcd
       
       
      @@ -1114,7 +1114,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
           integer :: i                  ! loop index
           integer :: iorank             ! i/o task id in i/o communicator + 1
           integer :: io_comprank        ! i/o task id in comp communicator
      -    integer :: nrecvs             ! if i/o task, number of comp tasks sending 
      +    integer :: nrecvs             ! if i/o task, number of comp tasks sending
                                         !   to/receiving from this task (cached)
           integer(kind=pio_offset) :: ioindex            ! offset for data to be sent to i/o task
           integer :: pos                ! array offset
      @@ -1137,7 +1137,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
           integer,pointer :: sr_types(:)
           integer,pointer :: send_counts(:)
           integer,pointer :: send_displs(:)
      -    integer :: rbuf_size          
      +    integer :: rbuf_size
           integer,pointer :: recv_buf(:)
           integer,pointer :: recv_counts(:)
           integer,pointer :: recv_displs(:)
      @@ -1237,7 +1237,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
              do i=1,num_tasks
                 recv_displs(i) = i-1
              end do
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1291,10 +1291,10 @@ end subroutine box_rearrange_io2comp_{TYPE}
                 if (recv_buf(i) /= 0) then
                    nrecvs = nrecvs + 1
                    rcount(nrecvs) = recv_buf(i)
      -             rfrom(nrecvs)  = i-1             
      +             rfrom(nrecvs)  = i-1
                 endif
              enddo
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1320,14 +1320,14 @@ end subroutine box_rearrange_io2comp_{TYPE}
           call alloc_check(s2rindex, ndof, 'sindex temp')
           s2rindex = 0
       
      -    ! spos(i) is the position in sindex() where the 
      +    ! spos(i) is the position in sindex() where the
           ! block of indices going to the ith ioproc starts
           call alloc_check(spos, num_iotasks, 'spos temp')
           spos(1)=1
           do i=2,num_iotasks
              spos(i)=spos(i-1)+scount(i-1)
       
      -       if (scount(i)/=0 .and. spos(i) > ndof) & 
      +       if (scount(i)/=0 .and. spos(i) > ndof) &
                   call piodie(__PIO_FILE__,__LINE__,'spos=',int(spos(i)),'> ndof=',ndof)
           end do
       
      @@ -1386,7 +1386,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
              do i=2,nrecvs
                 recv_displs(rfrom(i)+1) = recv_displs(rfrom(i-1)+1) + rcount(i-1)
              enddo
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1429,13 +1429,13 @@ end subroutine box_rearrange_io2comp_{TYPE}
           !
       
           if (Iosystem%IOproc .and. nrecvs>0) then
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
              print *,__PIO_FILE__,__LINE__,'mem=',rss
           end if
      -#endif 
      +#endif
             !need to cache
              call alloc_check(ioDesc%rtype, nrecvs, 'mpi recv types')
              rtype=>ioDesc%rtype
      @@ -1444,7 +1444,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
                 allocate(bsizeT(nrecvs))
                 do i=1,nrecvs
                    call GCDblocksize(rindex(pos:pos+rcount(i)-1),i8blocksize)
      -             if(rcount(i) > 0) then 
      +             if(rcount(i) > 0) then
                       bsizeT(ii)=int(i8blocksize)
                       ii = ii + 1
                    endif
      @@ -1454,24 +1454,24 @@ end subroutine box_rearrange_io2comp_{TYPE}
                 !       print *,'gcd: receive block lengths: ', bsizeT(1:ii-1)
                 deallocate(bsizeT)
                 !       print *,'GCD calculated for receive loop blocksize: ',blocksize
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
              print *,__PIO_FILE__,__LINE__,'mem=',rss
           end if
      -#endif  
      +#endif
                 call MPI_TYPE_CONTIGUOUS(blocksize,ioDesc%baseTYPE,newTYPEr,ierror)
                 call CheckMPIReturn(subName,ierror)
                 call MPI_TYPE_COMMIT(newTYPEr,ierror)
                 call CheckMPIReturn(subName,ierror)
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
                 call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
                 if(rss>lastrss) then
                    lastrss=rss
                    print *,__PIO_FILE__,__LINE__,'mem=',rss
                 end if
      -#endif 
      +#endif
                 pos = 1
                 do i=1,nrecvs
       
      @@ -1484,38 +1484,38 @@ end subroutine box_rearrange_io2comp_{TYPE}
                         ' count=',rcount(i)
       #endif
       #endif
      -	
      -             len = rcount(i)/blocksize        
      +
      +             len = rcount(i)/blocksize
                    allocate(displace(len))
      -             if(blocksize == 1) then 
      +             if(blocksize == 1) then
                       displace(:) = rindex(pos:pos+rcount(i)-1)
                    else
                       rindex(pos:pos+rcount(i)-1) = rindex(pos:pos+rcount(i)-1)+1
                       call calcdisplace(blocksize,rindex(pos:pos+rcount(i)-1),displace)
                    endif
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
              print *,__PIO_FILE__,__LINE__,'mem=',rss
           end if
      -#endif 
      +#endif
                    !DBG call alloc_print_usage(iosystem%comp_comm,80,'l2629')
                    ! need rindex to contain 0-based displacements here
                    call MPI_TYPE_CREATE_INDEXED_BLOCK( &
                         len, 1, int(displace), &               ! count,blen, disp
                         newTYPEr, rtype(i), ierror )       ! oldtype, newtype
                    call CheckMPIReturn(subName,ierror)
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
              print *,__PIO_FILE__,__LINE__,'mem=',rss
           end if
      -#endif              
      +#endif
                    call MPI_TYPE_COMMIT(rtype(i), ierror)
                    call CheckMPIReturn(subName,ierror)
      -             
      +
                    deallocate(displace)
                    pos = pos + rcount(i)
                 end do
      @@ -1524,7 +1524,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
           endif
           !
           ! Create the mpi types for the comp proc sends
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1540,7 +1540,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
           allocate(bsizeT(num_iotasks))
           ii = 1
           do i=1,num_iotasks
      -       if(scount(i) /= 0) then 
      +       if(scount(i) /= 0) then
                 call GCDblocksize(sindex(pos:pos+scount(i)-1),i8blocksize)
                 bsizeT(ii)=int(i8blocksize)
       	  pos = pos + scount(i)
      @@ -1555,7 +1555,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
           call MPI_TYPE_COMMIT(newTYPEs,ierror)
           call CheckMPIReturn(subName,ierror)
       
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1565,11 +1565,11 @@ end subroutine box_rearrange_io2comp_{TYPE}
       
           pos = 1
           do i=1,num_iotasks
      - 
      +
              if (scount(i) /= 0) then
      -          len = scount(i)/blocksize        
      +          len = scount(i)/blocksize
                 allocate(displace(len))
      -          if(blocksize == 1) then 
      +          if(blocksize == 1) then
                    displace(:) = sindex(pos:pos+scount(i)-1)
                 else
                    sindex(pos:pos+scount(i)-1) = sindex(pos:pos+scount(i)-1)+1
      @@ -1579,10 +1579,10 @@ end subroutine box_rearrange_io2comp_{TYPE}
                      len, 1, int(displace), &        ! count, blen, disp
                      newTYPEs, stype(i), ierror )       ! oldtype, newtype
                 call CheckMPIReturn(subName,ierror)
      -          
      +
                 call MPI_TYPE_COMMIT(stype(i), ierror)
                 call CheckMPIReturn(subName,ierror)
      - 
      +
                 deallocate(displace)
                 pos = pos + scount(i)
              endif
      @@ -1594,7 +1594,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
           !
           ! clean up
           !
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1678,7 +1678,7 @@ end subroutine box_rearrange_io2comp_{TYPE}
              call dealloc_check(ioDesc%stype,'iodesc%stype')
              nullify(iodesc%stype)
           end if
      -       
      +
       ! not _MPISERIAL
       #endif
       
      diff --git a/pio/calcdecomp.F90 b/pio/calcdecomp.F90
      index 740becdb7a4..ceb96e15e8c 100644
      --- a/pio/calcdecomp.F90
      +++ b/pio/calcdecomp.F90
      @@ -1,15 +1,15 @@
       #define __PIO_FILE__ "calcdecomp.F90"
       !>
      -!! @file 
      +!! @file
       !! @brief calcdecomp This module computes the IO decomposition when generated by PO internally.
      -!! 
      +!!
       !! $Revision$
       !! $LastChangedDate$
       !<
       
       module calcdecomp
       #ifdef TESTCALCDECOMP
      -  implicit none 
      +  implicit none
         integer, parameter :: i4=selected_int_kind(6), &
              i8=selected_int_kind(13), pio_offset=i8, r8=selected_real_kind(13)
         logical, parameter :: debug=.false.
      @@ -18,18 +18,18 @@ module calcdecomp
         use pio_kinds, only: i4, r4,r8,i4,i8, PIO_offset
         use pio_types, only: PIO_int, PIO_real, PIO_double
         use pio_support, only : debug, piodie
      -  implicit none 
      +  implicit none
       #endif
       
         public :: CalcStartandCount, pio_set_blocksize
         integer, parameter :: default_blocksize=884736
         integer :: blocksize=default_blocksize
      -contains 
      -!> 
      +contains
      +!>
       !! @defgroup PIO_set_blocksize
      -!!  Sets the contiguous block size read or written from each IO task.   
      -!! The optimal value of this parameter is filesystem specific. 
      -!< 
      +!!  Sets the contiguous block size read or written from each IO task.
      +!! The optimal value of this parameter is filesystem specific.
      +!<
       
         subroutine pio_set_blocksize(newsize)
           integer, intent(in) :: newsize
      @@ -73,7 +73,7 @@ subroutine CalcStartandCount(basetype, ndims, gdims, num_io_procs,myiorank,start
           case(PIO_int)
              basesize = 4
           case(PIO_real)
      -       basesize = 4 
      +       basesize = 4
           case(PIO_double)
              basesize = 8
           end select
      @@ -101,7 +101,7 @@ subroutine CalcStartandCount(basetype, ndims, gdims, num_io_procs,myiorank,start
                       exit
                    end if
                 end do
      -          
      +
       
       
       ! Things work best if use_io_procs is a multiple of gdims(ndims)
      @@ -118,11 +118,11 @@ subroutine CalcStartandCount(basetype, ndims, gdims, num_io_procs,myiorank,start
       
                 ioprocs=use_io_procs
                 tiorank=iorank
      -          
      +
                 do i=ldims,1,-1
                    if(gdims(i)>1) then
                       if(gdims(i)>=ioprocs) then
      -                   
      +
                          call computestartandcount(gdims(i),ioprocs,tiorank,start(i),kount(i))
                          if(start(i)+kount(i)>gdims(i)+1) then
                             print *,__PIO_FILE__,__LINE__,i,ioprocs,gdims(i),start(i),kount(i)
      @@ -134,12 +134,12 @@ subroutine CalcStartandCount(basetype, ndims, gdims, num_io_procs,myiorank,start
                          endif
                          exit  ! Decomposition is complete
                       else
      -                   ! The current dimension cannot complete the decomposition.   Decompose this 
      +                   ! The current dimension cannot complete the decomposition.   Decompose this
                          ! dimension in groups then go on to decompose the next dimesion in each of those
                          ! groups.
                          tioprocs=gdims(i)
                          tiorank = (iorank*tioprocs)/ioprocs
      -                   
      +
                          call computestartandcount(gdims(i),tioprocs, tiorank  , start(i),kount(i))
                          ioprocs=ioprocs/tioprocs
                          tiorank = mod(iorank,ioprocs)
      @@ -213,7 +213,7 @@ end module calcdecomp
       program sandctest
         use calcdecomp  !_EXTERNAL
         implicit none
      -  
      +
       
       !  integer, parameter :: ndims=4
       !  integer, parameter :: gdims(ndims) = (/66,199,10,8/)
      @@ -244,7 +244,7 @@ program sandctest
                     do while(.not. converged)
                        do iorank=0,num_io_procs-1
                           call Calcstartandcount(PIO_double, ndims, gdims, num_io_procs, iorank, start, count, numaiotasks)
      -                    
      +
                           psize=1
                           do n=1,ndims
                              psize=psize*count(n)
      @@ -257,10 +257,10 @@ program sandctest
                              write(*,'(i2,a,2i8,a,2i8,2i12)') iorank,' start =',start,' count=', count, product(gdims), psize
                              if(any(start<0)) then
                                 print *, gdims
      -                          stop 
      +                          stop
                              endif
                           end if
      -                    
      +
                        end do
                        if(tpsize==product(gdims)) then
                           converged=.true.
      diff --git a/pio/calcdisplace_mod.F90 b/pio/calcdisplace_mod.F90
      index 5fee3068704..b5340022824 100644
      --- a/pio/calcdisplace_mod.F90
      +++ b/pio/calcdisplace_mod.F90
      @@ -44,7 +44,7 @@ subroutine calcdisplace(bsize,dof,displace)
           do i=1,numblocks
              ii = (i-1)*lenblocks+1
              dis = dof(ii)-1
      -       dis = dis/lenblocks   
      +       dis = dis/lenblocks
              displace(i) = dis
           enddo
       
      @@ -109,7 +109,7 @@ subroutine calcdisplace_box(gsize,lenblock,start,count,ndim,displace)
              fdim=fdim+1
              bsize=bsize*gsize(fdim)
           enddo
      -    
      +
       
       
           do i=1,ndisp
      @@ -157,7 +157,7 @@ subroutine calcdisplace_box(gsize,lenblock,start,count,ndim,displace)
       
           ! check for strictly increasing
       
      -    do i=1,ndisp-1	
      +    do i=1,ndisp-1
              if(displace(i) > displace(i+1)) then
       !          This is an error but only if you are writing a binary file, so we are going to
       !          silently fail by deallocating the displace array
      @@ -197,18 +197,18 @@ SUBROUTINE GCDblocksize(arr_in,bsize,debug)
       
       
           do  i = 1,n-1  ! compute foward diff of the elements; if =1, still in a contiguous block,
      -       ! if /= 1 , the end of a block has been reached. 
      +       ! if /= 1 , the end of a block has been reached.
              del_arr(i) = (arr_in(i+1) - arr_in(i))
       
           end do
       
      -    numtimes = count( del_arr /= 1) 
      +    numtimes = count( del_arr /= 1)
           numblks  = numtimes + 1   ! the number of contiguous blocks.
      -     
      +
           if(present(debug)) print *,debug,': numtimes:',numtimes
       
           if ( numtimes == 0 ) then    ! new logic to account for the case that there is only
      -       allocate(loc_arr(numblks))  ! one contigious block in which case numtimes=0 and the 
      +       allocate(loc_arr(numblks))  ! one contigious block in which case numtimes=0 and the
           else                         ! error from the assignment in line 87 goes away
              allocate(loc_arr(numtimes))
           end if
      @@ -225,8 +225,8 @@ SUBROUTINE GCDblocksize(arr_in,bsize,debug)
              loc_arr(j) = i
       
           end do
      -    
      -    if(numtimes>0) then 
      +
      +    if(numtimes>0) then
              ii=1
              numgaps = count(del_arr > 1)
              if(numgaps>0) then
      @@ -243,8 +243,8 @@ SUBROUTINE GCDblocksize(arr_in,bsize,debug)
           allocate(blk_len(numblks))
           blk_len(1) = loc_arr(1)
       
      -    do k = 2,numblks-1           ! computes the the length of each block by differencing the 
      -       ! elements of the res array. 
      +    do k = 2,numblks-1           ! computes the the length of each block by differencing the
      +       ! elements of the res array.
       
              blk_len(k)  = loc_arr(k) - loc_arr(k-1)
       
      @@ -254,7 +254,7 @@ SUBROUTINE GCDblocksize(arr_in,bsize,debug)
       
       
       
      -    bsize = gcd_array(blk_len) ! call to compute the gcd of the blk_len array.    
      +    bsize = gcd_array(blk_len) ! call to compute the gcd of the blk_len array.
       
           if(present(debug)) then
       	print *,debug,': numblks,blk_len :',numblks, minval(blk_len),minloc(blk_len),maxval(blk_len),maxloc(blk_len),bsize
      @@ -262,7 +262,7 @@ SUBROUTINE GCDblocksize(arr_in,bsize,debug)
       
       
            if(numgaps>0) then
      -        bsizeg = gcd_array(gaps(1:numgaps)) 
      +        bsizeg = gcd_array(gaps(1:numgaps))
               bsize = gcd_pair(bsize,bsizeg)
       
               if(present(debug)) then
      @@ -290,7 +290,7 @@ integer(kind=pio_offset) function gcd_array_i8(ain) result(bsize)
           integer(i8) :: i,n
       
           bsize=1
      -    n = size(ain) 
      +    n = size(ain)
           ! First check, if an element is 1, then 1 is the gcd (i.e bsize)
           if(n==0 .or. any(ain <= 1)) return
       
      @@ -316,7 +316,7 @@ integer function gcd_array_i4(ain) result(bsize)
           integer(i4) :: i,n
       
           bsize=1
      -    n = size(ain) 
      +    n = size(ain)
           ! First check, if an element is 1, then 1 is the gcd (i.e bsize)
           if(n==0 .or. any(ain <= 1)) return
       
      @@ -349,14 +349,14 @@ integer(kind=pio_offset) FUNCTION gcd_pair_i8(u,v) result(gcd)
              b = x
           end if
       
      -    do 
      +    do
              x = mod(a,b)
              if ( x == 0 ) EXIT
      -       a = b 
      -       b = x 
      +       a = b
      +       b = x
           end do
       
      -    gcd = b 
      +    gcd = b
       
         end FUNCTION gcd_pair_i8
       
      @@ -377,14 +377,14 @@ integer FUNCTION gcd_pair_i4(u,v) result(gcd)
              b = x
           end if
       
      -    do 
      +    do
              x = mod(a,b)
              if ( x == 0 ) EXIT
      -       a = b 
      -       b = x 
      +       a = b
      +       b = x
           end do
       
      -    gcd = b 
      +    gcd = b
       
         end FUNCTION gcd_pair_i4
       
      diff --git a/pio/fdepends.awk b/pio/fdepends.awk
      index 03bab9769da..2980920cf23 100644
      --- a/pio/fdepends.awk
      +++ b/pio/fdepends.awk
      @@ -19,9 +19,9 @@ BEGIN { IGNORECASE=1
       
       
       #
      -# awk reads each line of the filename argument $2 until it finds 
      +# awk reads each line of the filename argument $2 until it finds
       # a "use" or "#include"
      -# 
      +#
       
       
       /^[ \t]*use[ \t]+/ {
      @@ -30,7 +30,7 @@ BEGIN { IGNORECASE=1
               if ( $0 ~ /_EXTERNAL/ ) next
       
               # Assume the second field is the F90 module name,
      -        # remove any comma at the end of the second field (due to 
      +        # remove any comma at the end of the second field (due to
               # ONLY or rename), and print it in a dependency line.
       
               sub(/,$/,"",$2)
      @@ -49,8 +49,8 @@ BEGIN { IGNORECASE=1
                if ( $0 ~ /_EXTERNAL/ ) next
       
                # Remove starting or ending quote or angle bracket
      -         sub(/^["<']/,"",$2) 
      -         sub(/[">']$/,"",$2) 
      +         sub(/^["<']/,"",$2)
      +         sub(/[">']$/,"",$2)
                print PRLINE $2
      - 
      +
             }
      diff --git a/pio/iompi_mod.F90.in b/pio/iompi_mod.F90.in
      index 2a39cadd11a..b5cc563b776 100644
      --- a/pio/iompi_mod.F90.in
      +++ b/pio/iompi_mod.F90.in
      @@ -1,6 +1,6 @@
       #define __PIO_FILE__ "iompi_mod.F90"
       !>
      -!! @file 
      +!! @file
       !! $Revision$
       !! $LastChangedDate$
       !! @brief The MPI-IO direct binary interface to PIO
      @@ -16,9 +16,9 @@ module iompi_mod
       
         use pio_support
         use alloc_mod, only : alloc_check
      -#ifndef NO_C_SIZEOF 
      +#ifndef NO_C_SIZEOF
         use iso_c_binding, only : c_sizeof  ! _EXTERNAL
      -#else 
      +#else
       #define c_sizeof(x)  size(transfer (x, xxx_sizeof_data))
       #endif
       
      @@ -29,7 +29,7 @@ module iompi_mod
         implicit none
         private
       
      -#ifdef NO_MPIMOD  
      +#ifdef NO_MPIMOD
         include 'mpif.h'        ! _EXTERNAL
       #endif
         public :: open_mpiio, create_mpiio, close_mpiio, write_mpiio,read_mpiio
      @@ -52,7 +52,7 @@ module iompi_mod
       
       character(len=*), parameter :: modName='iompi_mod'
       
      -contains 
      +contains
       
        integer function close_mpiio(File) result(ierr)
       
      @@ -70,8 +70,8 @@ contains
            if(File%iosystem%ioproc) then
       #ifdef USEMPIIO
               iotype = File%iotype
      -    
      -        select case(iotype) 
      +
      +        select case(iotype)
               case(iotype_pbinary,iotype_direct_pbinary)
                  call MPI_file_close(File%fh,ierr)
                  if(Check) call CheckMPIreturn('close_mpiio: after call to file_close: ',ierr)
      @@ -103,8 +103,8 @@ contains
            ierr = PIO_noerr
            if(file%iosystem%ioproc) then
               iotype = File%iotype
      -        
      -        select case(iotype) 
      +
      +        select case(iotype)
               case(iotype_pbinary,iotype_direct_pbinary)
                  amode = IOR(MPI_MODE_RDWR,MPI_MODE_CREATE)
                  if(Debug) print *,'OpenFile: io_rank: ',File%iosystem%io_rank,'amode,info: ',amode,File%iosystem%info,'fname: ',fname
      @@ -148,8 +148,8 @@ contains
            ierr = PIO_noerr
            if(File%iosystem%ioproc) then
               iotype = File%iotype
      -        
      -        select case(iotype) 
      +
      +        select case(iotype)
               case(iotype_pbinary,iotype_direct_pbinary)
                  amode = MPI_MODE_RDONLY
                  call MPI_file_open(File%iosystem%IO_comm,fname,amode,File%iosystem%info,File%fh,ierr)
      @@ -196,11 +196,11 @@ contains
       #ifdef TIMING
           call t_startf("PIO:pio_write_mpiio_{TYPE}")
       #endif
      -#ifdef USEMPIIO   
      +#ifdef USEMPIIO
            datarep   = 'native'
            iotype    = File%iotype
            glen      = iodesc%glen
      -     offset    = iodesc%IOmap%start 
      +     offset    = iodesc%IOmap%start
       
            !-------------------------------
            ! write the record control word
      @@ -247,7 +247,7 @@ contains
       
       ! TYPE int,real,double
        integer function read_mpiio_{TYPE} (File,IOBUF,varDesc, iodesc) result(ierr)
      -   
      +
           type (File_desc_t), intent(inout)          :: File     ! file descriptor
           {VTYPE}, intent(out)                      :: IOBUF(:) ! IO buffer
           type (VAR_desc_t), intent(in)               :: varDesc
      @@ -315,21 +315,21 @@ contains
       #endif
        end function read_mpiio_{TYPE}
       
      -          
      +
        subroutine Write_FORTRAN_CntrlWord(File,reclen)
      -           
      +
             type (File_desc_t), intent(inout) :: File
             integer(i4), intent(in) :: reclen
      -           
      +
             character(len=*), parameter :: subName=modName//'::Write_FORTRAN_CntrlWord'
      -      character(len=10) :: datarep 
      +      character(len=10) :: datarep
             integer(kind=PIO_OFFSET) :: offset, offset2, glen
             integer(i4) :: ierr
       
             logical, parameter :: Check = .TRUE.
             integer :: fstatus(MPI_STATUS_SIZE)
       
      -    
      +
       #ifdef USEMPIIO
       
            datarep = 'native'
      diff --git a/pio/ionf_mod.F90 b/pio/ionf_mod.F90
      index 5c3d7fb631a..113d6c64544 100644
      --- a/pio/ionf_mod.F90
      +++ b/pio/ionf_mod.F90
      @@ -9,7 +9,7 @@ module ionf_mod
         use pio_types
         use pio_utils, only: bad_iotype, check_netcdf
       
      -  use pio_support, only : Debug, DebugIO, piodie, DebugAsync   
      +  use pio_support, only : Debug, DebugIO, piodie, DebugAsync
       #ifdef _NETCDF
         use netcdf            ! _EXTERNAL
       #endif
      @@ -23,14 +23,14 @@ module ionf_mod
       #if defined(_PNETCDF) && ! (USE_PNETCDF_MOD)
       #include    /* _EXTERNAL */
       #endif
      - 
      +
       
          public :: create_nf
      -   public :: open_nf 
      -   public :: close_nf 
      -   public :: sync_nf 
      +   public :: open_nf
      +   public :: close_nf
      +   public :: sync_nf
       
      -contains 
      +contains
       
       
       !!!!!!!!!!!!!!!!!!!!!!!!!!!!
      @@ -50,13 +50,13 @@ integer function create_nf(File,fname, amode) result(ierr)
           integer :: nmode, tmpfh
       
           nmode=amode
      -    
      +
           ierr=PIO_noerr
           File%fh=-1
       
           if(File%iosystem%ioproc) then
      -       iotype = File%iotype 
      -       select case (iotype) 
      +       iotype = File%iotype
      +       select case (iotype)
       #ifdef _PNETCDF
              case(PIO_iotype_pnetcdf)
                 ierr  = nfmpi_create(File%iosystem%IO_comm,fname,nmode ,File%iosystem%info,File%fh)
      @@ -65,7 +65,7 @@ integer function create_nf(File,fname, amode) result(ierr)
       #ifdef _NETCDF4
              case(PIO_iotype_netcdf4p)
       !         The 64 bit options are not compatable with hdf5 format files
      -          
      +
                 if(iand(PIO_64BIT_OFFSET,amode)==PIO_64BIT_OFFSET) then
                    nmode = ieor(amode,PIO_64BIT_OFFSET)
                 else if(iand(PIO_64BIT_DATA,amode)==PIO_64BIT_DATA) then
      @@ -73,7 +73,7 @@ integer function create_nf(File,fname, amode) result(ierr)
                 else
                    nmode=amode
                 end if
      -          
      +
                 nmode = ior(nmode,NF90_NETCDF4)
       #ifdef _MPISERIAL
                 ierr = nf90_create(fname, nmode , File%fh)
      @@ -82,7 +82,7 @@ integer function create_nf(File,fname, amode) result(ierr)
                 ierr = nf90_create(fname, nmode, File%fh, &
                      comm=File%iosystem%io_comm, info=File%iosystem%info)
       #endif
      -! Set default to NOFILL for performance.  
      +! Set default to NOFILL for performance.
       !          if(ierr==PIO_NOERR) ierr = nf90_set_fill(File%fh, NF90_NOFILL, nmode)
              case(PIO_iotype_netcdf4c)
                 if(iand(PIO_64BIT_OFFSET,amode)==PIO_64BIT_OFFSET) then
      @@ -100,18 +100,18 @@ integer function create_nf(File,fname, amode) result(ierr)
                    ! Stores the ncid in File%fh
                    ierr = nf90_create(fname, nmode, File%fh, &
                         info=File%iosystem%info )
      -! Set default to NOFILL for performance.  
      +! Set default to NOFILL for performance.
                    if(ierr==PIO_NOERR) &
                         ierr = nf90_set_fill(File%fh, NF90_NOFILL, nmode)
                 endif
      -#endif          
      +#endif
              case(PIO_iotype_netcdf)
                 ! Only io proc 0 will do writing
                 if (File%iosystem%io_rank == 0) then
                    ! Stores the ncid in File%fh
                    ierr = nf90_create(fname, nmode , File%fh)
                    if(Debug .or. Debugasync) print *,__PIO_FILE__,__LINE__,file%fh, ierr, nmode
      -! Set default to NOFILL for performance.  
      +! Set default to NOFILL for performance.
                    if(ierr==NF90_NOERR) &
                         ierr = nf90_set_fill(File%fh, NF90_NOFILL, nmode)
                 endif
      @@ -125,13 +125,13 @@ integer function create_nf(File,fname, amode) result(ierr)
              if(Debug) print *,__PIO_FILE__,__LINE__,file%fh,ierr
           end if
           tmpfh = file%fh
      -    
      +
           call mpi_bcast(tmpfh,1,mpi_integer, file%iosystem%iomaster, file%iosystem%my_comm, mpierr)
      -    
      +
           if(.not. file%iosystem%ioproc) file%fh=-tmpfh
       
           if(Debug.or.DebugAsync) print *,__PIO_FILE__,__LINE__,file%fh,ierr
      -    
      +
           call check_netcdf(File, ierr,__PIO_FILE__,__LINE__)
       
         end function create_nf
      @@ -140,7 +140,7 @@ end function create_nf
       
       !!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ! open_nf
      -  ! 
      +  !
       
         integer function open_nf(File,fname, mode) result(ierr)
       #ifndef NO_MPIMOD
      @@ -160,7 +160,7 @@ integer function open_nf(File,fname, mode) result(ierr)
           if(file%iosystem%ioproc) then
       !       This subroutine seems to break pgi compiler for large files.
       !       call check_file_type(File, fname)
      -       iotype = File%iotype 
      +       iotype = File%iotype
       #ifdef _NETCDF
              if(present(mode)) then
                 if(mode == 1) then
      @@ -196,11 +196,11 @@ integer function open_nf(File,fname, mode) result(ierr)
       #ifdef _NETCDF4
               if(iotype==PIO_iotype_netcdf4p) then
       ! we need to go through some contortions to make sure a file we are opening is okay for parallel access
      -           ierr = nf90_open(fname,amode,File%fh)           
      +           ierr = nf90_open(fname,amode,File%fh)
       	   ierr = nf90_inquire(File%fh,formatnum=format)
       #ifndef MPI_SERIAL
                  if(format == nf90_format_netcdf4) then
      -              ierr = nf90_close(File%fh)	     
      +              ierr = nf90_close(File%fh)
                     ierr = nf90_open(fname,  ior(amode,ior(NF90_NETCDF4,NF90_MPIIO)), File%fh, &
                          comm=File%iosystem%io_comm, info=File%iosystem%info)
                     if(ierr==nf90_enotnc4 .or. ierr==nf90_einval) then
      @@ -216,7 +216,7 @@ integer function open_nf(File,fname, mode) result(ierr)
                    ! Stores the ncid in File%fh
                    ierr = nf90_open(fname,amode,File%fh)
                    if(Debug .or. Debugasync) print *,__PIO_FILE__,__LINE__,file%fh, ierr
      -             ! Set default to NOFILL for performance.  
      +             ! Set default to NOFILL for performance.
                    if(iotype==pio_iotype_netcdf .and. ierr .eq. NF90_NOERR .and. iand(amode, NF90_WRITE) > 0) then
                       ierr = nf90_set_fill(File%fh, NF90_NOFILL, ier2)
                    end if
      @@ -231,7 +231,7 @@ integer function open_nf(File,fname, mode) result(ierr)
           call mpi_bcast(tmpfh,1,mpi_integer, file%iosystem%iomaster, file%iosystem%my_comm, mpierr)
       
           if(.not. file%iosystem%ioproc) file%fh=-tmpfh
      -      
      +
           call check_netcdf(File, ierr,__PIO_FILE__,__LINE__)
       
         end function open_nf
      @@ -250,7 +250,7 @@ integer function close_nf(File) result(ierr)
       
           if(File%iosystem%IOproc) then
              if(Debug) print *,__PIO_FILE__,__LINE__,'CFILE closing : ',file%fh
      -       select case (File%iotype) 
      +       select case (File%iotype)
       #ifdef _PNETCDF
              case(PIO_iotype_pnetcdf)
                 ierr=nfmpi_close(file%fh)
      @@ -286,7 +286,7 @@ integer function sync_nf(File) result(ierr)
       
           if(File%iosystem%IOproc) then
              if(Debug) print *,__PIO_FILE__,__LINE__,'CFILE syncing : ',file%fh
      -       select case (File%iotype) 
      +       select case (File%iotype)
       #ifdef _PNETCDF
              case(PIO_iotype_pnetcdf)
                 ierr=nfmpi_sync(file%fh)
      @@ -304,7 +304,7 @@ integer function sync_nf(File) result(ierr)
           call check_netcdf(File, ierr,__PIO_FILE__,__LINE__)
         end function sync_nf
       
      -  subroutine check_file_type(File, filename) 
      +  subroutine check_file_type(File, filename)
       #ifndef NO_MPIMOD
           use mpi !_EXTERNAL
       #else
      @@ -314,17 +314,17 @@ subroutine check_file_type(File, filename)
           type (File_desc_t), intent(inout) :: File
           character(len=*), intent(in) :: filename
           character(len=4) :: magic
      -    integer :: fh, mpierr, reclength=4, i, eof 
      +    integer :: fh, mpierr, reclength=4, i, eof
           logical :: UNITOK, UNITOP
       
       !   Check format of existing files opened to read.
       
      -    inquire(file=filename, exist=UNITOK) 
      +    inquire(file=filename, exist=UNITOK)
           if(.not. UNITOK) return
       
           magic='fail'
      -   
      -    if(File%iosystem%ioproc) then      
      +
      +    if(File%iosystem%ioproc) then
              if(File%iosystem%io_rank==0) then
       !  Find a unique unit number to open the file
                 do fh=12,99
      @@ -350,10 +350,10 @@ subroutine check_file_type(File, filename)
       #else
                    call piodie(__PIO_FILE__,__LINE__,'You must link with the netcdf4 ',0,&
                         'library built with hdf5 support to read this file',0,filename)
      -#endif       
      -          else 
      +#endif
      +          else
                    ! The HDF identifier could be offset further into the file.
      -             
      +
                    open (unit = fh,file=filename,access='direct',recl=reclength,&
                         form='UNFORMATTED',STATUS='OLD',err=100)
       
      @@ -370,11 +370,11 @@ subroutine check_file_type(File, filename)
                       i=i*2
                    end do
                    close(fh)
      -             if(eof<0) call piodie(__PIO_FILE__,__LINE__,'Unrecognized file format ',0,filename)             
      +             if(eof<0) call piodie(__PIO_FILE__,__LINE__,'Unrecognized file format ',0,filename)
                 end if
       
              end if
      -       
      +
              call mpi_bcast(file%iotype,1,mpi_integer, 0, file%iosystem%io_comm, mpierr)
              call CheckMPIReturn('nf_mod',mpierr)
           end if
      diff --git a/pio/nf_mod.F90 b/pio/nf_mod.F90
      index bdd9928c0eb..c6973ccb1d6 100644
      --- a/pio/nf_mod.F90
      +++ b/pio/nf_mod.F90
      @@ -18,7 +18,7 @@ module nf_mod
         use pio_types, only: file_desc_t, iosystem_desc_t, var_desc_t, pio_noerr, pio_iotype_netcdf, &
       	pio_iotype_pnetcdf, pio_iotype_netcdf4p, pio_iotype_netcdf4c, pio_max_name
       
      -  use pio_support, only : Debug, DebugIO, DebugAsync, piodie   
      +  use pio_support, only : Debug, DebugIO, DebugAsync, piodie
         use pio_utils, only : bad_iotype, check_netcdf
       
       #ifdef _NETCDF
      @@ -51,7 +51,7 @@ module nf_mod
         !  Attribute functions
         !
         public :: pio_def_var,   &
      -       pio_inq_attname,    & 
      +       pio_inq_attname,    &
              pio_inq_att,        &
              pio_inq_attlen,     &
              pio_inq_varid,      &
      @@ -162,7 +162,7 @@ module nf_mod
       !<
         public :: PIO_redef
       
      -!> 
      +!>
       !! \defgroup PIO_inquire
       !<
          public :: PIO_inquire
      @@ -187,7 +187,7 @@ module nf_mod
       !<
         public :: PIO_inquire_dimension
       
      -!> 
      +!>
       !! \defgroup PIO_copy_att
       !<
         public :: PIO_copy_att
      @@ -199,16 +199,16 @@ subroutine defvdfvar(foo) bind(C)
            end subroutine defvdfvar
         end interface
       #endif
      -contains 
      +contains
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inquire
       !! @brief Gets metadata information for netcdf file.
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param nDimensions :  Number of dimensions defined for the netcdf file
      -!! @param nVariables : Number of variables defined for the netcdf file 
      +!! @param nVariables : Number of variables defined for the netcdf file
       !! @param nAttributes : Number of attributes defined for the netcdf file
       !! @param unlimitedDimID : the Unlimited dimension ID
       !! @retval ierr @copydoc error_return
      @@ -241,10 +241,10 @@ integer function pio_inquire(File,nDimensions,nVariables,nAttributes,unlimitedDi
           end if
       
           iotype = File%iotype
      -    
      +
           if(ios%IOproc) then
              select case(iotype)
      -          
      +
       #ifdef _PNETCDF
              case(pio_iotype_pnetcdf)
                 ierr=nfmpi_inq( File%fh,vals(1),vals(2), &
      @@ -261,7 +261,7 @@ integer function pio_inquire(File,nDimensions,nVariables,nAttributes,unlimitedDi
                    ierr=nf90_inquire( File%fh,vals(1),vals(2), &
                         vals(3),vals(4))
                 endif
      -          
      +
                 if(ios%num_iotasks>1) then
                    call MPI_BCAST(vals,4,MPI_INTEGER,0,ios%IO_comm, mpierr)
                    call CheckMPIReturn('nf_mod',mpierr)
      @@ -271,7 +271,7 @@ integer function pio_inquire(File,nDimensions,nVariables,nAttributes,unlimitedDi
       
              case default
                 call bad_iotype(iotype,__PIO_FILE__,__LINE__)
      -          
      +
              end select
           endif
       
      @@ -282,31 +282,31 @@ integer function pio_inquire(File,nDimensions,nVariables,nAttributes,unlimitedDi
              call CheckMPIReturn('nf_mod',mpierr)
           end if
       
      -    if(present(nDimensions)) then	
      +    if(present(nDimensions)) then
              ndimensions = vals(1)
           endif
      -    if(present(nVariables)) then	
      +    if(present(nVariables)) then
              nVariables = vals(2)
           endif
      -    if(present(nAttributes)) then	
      +    if(present(nAttributes)) then
              nAttributes = vals(3)
           endif
      -    if(present(unlimitedDimID)) then	
      +    if(present(unlimitedDimID)) then
              unlimitedDimID = vals(4)
           endif
      -    
      +
         end function pio_inquire
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_att
       !! @brief Gets information about attributes
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varid : The netcdf variable identifier
      -!! @param name : Name of the attribute 
      +!! @param name : Name of the attribute
       !! @param xtype : The type of attribute
      -!! @param len : The length of the attribute 
      +!! @param len : The length of the attribute
       !! @retval ierr @copydoc error_return
       !>
         integer function inq_att_vid(File,varid,name,xtype,len) result(ierr)
      @@ -356,7 +356,7 @@ integer function inq_att_vid(File,varid,name,xtype,len) result(ierr)
       #ifdef _NETCDF
              case(pio_iotype_netcdf4p)
                 ierr=nf90_inquire_attribute( File%fh,varid,name(1:nlen), &
      -               xtype=xtype,len=len)          
      +               xtype=xtype,len=len)
              case(pio_iotype_netcdf, pio_iotype_netcdf4c)
       
                 if (ios%io_rank==0) then
      @@ -388,15 +388,15 @@ end function inq_att_vid
       
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_att
       !! @brief  Gets information about attributes
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param vardesc @copydoc var_desc_t
      -!! @param name : Name of the attribute 
      +!! @param name : Name of the attribute
       !! @param xtype : The type of attribute
      -!! @param len : The length of the attribute 
      +!! @param len : The length of the attribute
       !! @retval ierr @copydoc error_return
       !>
         integer function inq_att_vardesc(File,vardesc,name,xtype,len) result(ierr)
      @@ -436,9 +436,9 @@ integer function inq_att_vid_pio2(File,varid,name,xtype,len) result(ierr)
         end function inq_att_vid_pio2
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_attlen
      -!! @brief Gets the attribute length 
      +!! @brief Gets the attribute length
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varid : attribute id
      @@ -476,7 +476,7 @@ integer function inq_attlen_vid(File,varid,name,len) result(ierr)
              call MPI_BCAST(varid,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
              call MPI_BCAST(nlen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
              call MPI_BCAST(name,nlen,MPI_CHARACTER,ios%CompMaster, ios%my_comm , mpierr)
      -       
      +
           end if
       
           if(ios%IOproc) then
      @@ -523,7 +523,7 @@ integer function inq_attlen_vid_pio2(File,vid,name,len) result(ierr)
           integer, intent(in) :: vid
           character(len=*), intent(in)      :: name
           integer(pio_offset), intent(out)     :: len !Attribute length
      -    
      +
           integer :: ilen
           ierr = inq_attlen_vid(file, vid, name, ilen)
           len = int(ilen,pio_offset)
      @@ -531,9 +531,9 @@ integer function inq_attlen_vid_pio2(File,vid,name,len) result(ierr)
         end function inq_attlen_vid_pio2
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_attlen
      -!! @brief  Gets the attribute length 
      +!! @brief  Gets the attribute length
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param vardesc @copydoc var_desc_t
      @@ -563,13 +563,13 @@ integer function inq_attlen_vardesc_pio2(File,vardesc,name,len) result(ierr)
       
         end function inq_attlen_vardesc_pio2
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_inq_attname
      -!! @brief Returns the name of a netcdf attribute 
      +!! @brief Returns the name of a netcdf attribute
       !! @details
       !! @param File @copydoc file_desc_t
      -!! @param varid :  The variable ID 
      +!! @param varid :  The variable ID
       !! @param attnum : Attribute number returned from function ????
       !! @param name   : Name of the returned attribute
       !! @retval ierr @copydoc error_return
      @@ -640,13 +640,13 @@ integer function inq_attname_vid(File,varid,attnum,name) result(ierr)
           name = tmpname(1:len_trim(tmpname))
         end function inq_attname_vid
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_inq_attname
       !! @brief  Returns the name of a netcdf attribute.
       !! @details
       !! @param File @copydoc file_desc_t
      -!! @param vardesc @copydoc var_desc_t 
      +!! @param vardesc @copydoc var_desc_t
       !! @param attnum : Attribute number returned from function ????
       !! @param name   : Name of the returned attribute
       !! @retval ierr @copydoc error_return
      @@ -661,10 +661,10 @@ integer function inq_attname_vardesc(File,vardesc,attnum,name) result(ierr)
       
         end function inq_attname_vardesc
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_inq_varid
      -!! @brief  Returns the ID of a netcdf variable given its name 
      +!! @brief  Returns the ID of a netcdf variable given its name
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param name : Name of the returned attribute
      @@ -696,7 +696,7 @@ integer function inq_varid_vid(File,name,varid) result(ierr)
                 if(ios%comp_rank==0) call mpi_send(msg, 1, mpi_integer, ios%ioroot, 1, ios%union_comm, ierr)
                 call MPI_BCAST(file%fh,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
              end if
      -       
      +
              call MPI_BCAST(nlen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
              call MPI_BCAST(name,nlen,MPI_CHARACTER,ios%CompMaster, ios%my_comm , mpierr)
           end if
      @@ -735,10 +735,10 @@ integer function inq_varid_vid(File,name,varid) result(ierr)
       
         end function inq_varid_vid
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_inq_varid
      -!! @brief Returns the ID of a netcdf variable given its name 
      +!! @brief Returns the ID of a netcdf variable given its name
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param name   : Name of the returned attribute
      @@ -759,7 +759,7 @@ integer function inq_varid_vardesc(File,name,vardesc) result(ierr)
         end function inq_varid_vardesc
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_varname
       !! @brief Get the name associated with a variable
       !! @details
      @@ -773,13 +773,13 @@ integer function inq_varname_vdesc(File,vardesc,name) result(ierr)
           type (File_desc_t), intent(in)   :: File
           type (Var_desc_t), intent(in)    :: vardesc
           character(len=*), intent(out)    :: name
      -    
      +
           ierr = pio_inq_varname(file,vardesc%varid,name)
       
         end function inq_varname_vdesc
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_varname
       !! @brief Get the name associated with a variable
       !! @details
      @@ -851,13 +851,13 @@ integer function inq_varname_vid(File,varid,name) result(ierr)
         end function inq_varname_vid
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_varndims
       !! @brief Gets the number of dimension associated with a netcdf variable
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varid : The variable identifier
      -!! @param ndims : The number of dimensions for the variable 
      +!! @param ndims : The number of dimensions for the variable
       !! @retval ierr @copydoc error_return
       !>
         integer function inq_varndims_vid(File,varid,ndims) result(ierr)
      @@ -886,7 +886,7 @@ integer function inq_varndims_vid(File,varid,ndims) result(ierr)
              end if
              call MPI_BCAST(varid,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
           end if
      -    
      +
           if(ios%IOproc) then
              select case(iotype)
       
      @@ -924,13 +924,13 @@ integer function inq_varndims_vid(File,varid,ndims) result(ierr)
         end function inq_varndims_vid
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_varndims
       !! @brief Gets the number of dimension associated with a netcdf variable
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param vardesc @copydoc var_desc_t
      -!! @param ndims : The number of dimensions for the variable 
      +!! @param ndims : The number of dimensions for the variable
       !! @retval ierr @copydoc error_return
       !>
         integer function inq_varndims_vdesc(File,vardesc,ndims) result(ierr)
      @@ -943,7 +943,7 @@ integer function inq_varndims_vdesc(File,vardesc,ndims) result(ierr)
         end function inq_varndims_vdesc
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_vartype
       !! @brief Gets metadata information for netcdf file.
       !! @details
      @@ -1014,7 +1014,7 @@ integer function inq_vartype_vid(File,varid,type) result(ierr)
         end function inq_vartype_vid
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_vartype
       !! @brief Gets metadata information for netcdf file.
       !! @details
      @@ -1033,7 +1033,7 @@ integer function inq_vartype_vdesc(File,vardesc,type) result(ierr)
         end function inq_vartype_vdesc
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_vardimid
       !! @brief returns the dimids of the variable as an interger array
       !! @details
      @@ -1060,7 +1060,7 @@ integer function inq_vardimid_vid(File,varid,dimids) result(ierr)
       
           iotype = File%iotype
           ierr=PIO_noerr
      -    
      +
           size_dimids=size(dimids)
       
           if(ios%async_interface) then
      @@ -1108,7 +1108,7 @@ integer function inq_vardimid_vid(File,varid,dimids) result(ierr)
         end function inq_vardimid_vid
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_vardimid
       !! @brief returns the dimids of the variable as an interger array
       !! @details
      @@ -1128,7 +1128,7 @@ integer function inq_vardimid_vdesc(File,vardesc,dimids) result(ierr)
         end function inq_vardimid_vdesc
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_varnatts
       !! @brief Returns the number of attributes associated with a varaible
       !! @details
      @@ -1197,7 +1197,7 @@ integer function inq_varnatts_vid(File,varid,natts) result(ierr)
         end function inq_varnatts_vid
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_varnatts
       !! @brief Returns the number of attributes associated with a varaible
       !! @details
      @@ -1217,7 +1217,7 @@ integer function inq_varnatts_vdesc(File,vardesc,natts) result(ierr)
         end function inq_varnatts_vdesc
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_dimid
       !! @brief Returns the netcdf dimension id for the name.
       !! @details
      @@ -1292,11 +1292,11 @@ integer function pio_inq_dimid(File,name,dimid) result(ierr)
              if(Debugasync) print *,__PIO_FILE__,__LINE__,dimid,ierr,mpierr
              call CheckMPIReturn('nf_mod',mpierr)
           end if
      - 
      +
         end function pio_inq_dimid
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_dimname
       !! @brief Gets the name of a dimension given its ID
       !! @details
      @@ -1317,7 +1317,7 @@ integer function pio_inq_dimname(File,dimid,dimname) result(ierr)
           !------------------
           integer :: iotype, mpierr, msg, ldn
           type(iosystem_desc_t), pointer :: ios
      -    
      +
           ios => File%iosystem
           iotype = File%iotype
           ierr=PIO_noerr
      @@ -1370,9 +1370,9 @@ integer function pio_inq_dimname(File,dimid,dimname) result(ierr)
         end function pio_inq_dimname
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inq_dimlen
      -!! @brief Returns the extent of a netCDF dimension 
      +!! @brief Returns the extent of a netCDF dimension
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param dimid : The netcdf dimension.
      @@ -1392,7 +1392,7 @@ integer function pio_inq_dimlen(File,dimid,dimlen) result(ierr)
           integer :: iotype, mpierr, msg
           integer(kind=PIO_OFFSET) :: clen
           type(iosystem_desc_t), pointer :: ios
      -    
      +
           ios => File%iosystem
           iotype = File%iotype
           ierr=PIO_noerr
      @@ -1443,7 +1443,7 @@ integer function pio_inq_dimlen(File,dimid,dimlen) result(ierr)
       
         end function pio_inq_dimlen
       
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_enddef
       !! @brief Exits netcdf define mode.
      @@ -1508,13 +1508,13 @@ end subroutine endvdfdef
           call check_netcdf(File, ierr,__PIO_FILE__,__LINE__)
         end function PIO_enddef
       
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_redef
      -!! @brief Re-enters netcdf define mode.   
      -!! @details 
      -!! @warning Entering and leaving netcdf define mode causes a file sync operation to 
      -!!          occur, these operations can be very expensive in parallel systems.   We 
      +!! @brief Re-enters netcdf define mode.
      +!! @details
      +!! @warning Entering and leaving netcdf define mode causes a file sync operation to
      +!!          occur, these operations can be very expensive in parallel systems.   We
       !!          recommend structuring your code to minimize calls to this function.
       !! @param File @copydoc file_desc_t
       !! @retval ierr @copydoc error_return
      @@ -1528,7 +1528,7 @@ integer function PIO_redef(File) result(ierr)
           integer :: iotype, mpierr, msg
           logical, parameter :: Check = .TRUE.
           type(iosystem_desc_t), pointer :: ios
      -    
      +
       
           iotype = File%iotype
           ios => file%iosystem
      @@ -1566,7 +1566,7 @@ integer function PIO_redef(File) result(ierr)
           call check_netcdf(File, ierr,__PIO_FILE__,__LINE__)
         end function PIO_redef
       
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_def_dim
       !! @brief Defines the netcdf dimension
      @@ -1607,7 +1607,7 @@ integer function PIO_def_dim(File,name,len,dimid) result(ierr)
              call mpi_bcast(name, nlen, mpi_character, ios%compmaster, ios%intercomm, ierr)
              if(Debugasync) print *,__PIO_FILE__,__LINE__,file%fh, name(1:nlen)
           end if
      -       
      +
           if(ios%IOproc) then
              select case(iotype)
       
      @@ -1640,17 +1640,17 @@ integer function PIO_def_dim(File,name,len,dimid) result(ierr)
              call MPI_BCAST(dimid, 1, MPI_INTEGER, ios%IOMaster, ios%my_Comm, ierr)
           end if
           if(debugasync) print *,__PIO_FILE__,__LINE__,dimid
      -  end function PIO_def_dim    
      +  end function PIO_def_dim
       
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_def_var
       !! @brief Defines a netcdf variable
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param name : The name of the variable to define
      -!! @param type : The type of variable 
      +!! @param type : The type of variable
       !! @param vardesc @copydoc var_desc_t
       !! @retval ierr @copydoc error_return
       !<
      @@ -1666,14 +1666,14 @@ integer function def_var_0d(File,name,type,vardesc) result(ierr)
       
         end function def_var_0d
       
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_def_var
       !! @brief Defines the a netcdf variable
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param name : The name of the variable to define
      -!! @param type : The type of variable 
      +!! @param type : The type of variable
       !! @param dimids : The dimension identifier returned by \ref PIO_def_dim
       !! @param vardesc @copydoc var_desc_t
       !! @retval ierr @copydoc error_return
      @@ -1713,7 +1713,7 @@ integer function def_var_md(File,name,type,dimids,vardesc) result(ierr)
                 call mpi_bcast(file%fh, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
              end if
              call mpi_bcast(type, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      -       
      +
              call mpi_bcast(nlen, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
              call mpi_bcast(name, nlen, mpi_character, ios%compmaster, ios%intercomm, ierr)
              call mpi_bcast(vardesc%ndims, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      @@ -1782,7 +1782,7 @@ integer function def_var_md(File,name,type,dimids,vardesc) result(ierr)
              end select
           endif
           call check_netcdf(File, ierr,__PIO_FILE__,__LINE__)
      -    if(ios%async_interface  .or. ios%num_tasks> ios%num_iotasks) then  
      +    if(ios%async_interface  .or. ios%num_tasks> ios%num_iotasks) then
              call MPI_BCAST(vardesc%varid, 1, MPI_INTEGER, ios%Iomaster, ios%my_Comm, ierr)
           end if
         end function def_var_md
      @@ -1791,10 +1791,10 @@ end function def_var_md
       !! @public
       !! @ingroup PIO_copy_att
       !! @brief No idea what this function does
      -!! @details 
      +!! @details
       !! @param infile @copydoc file_desc_t
       !! @param invarid :
      -!! @param name : 
      +!! @param name :
       !! @param outfile :
       !! @param outvarid :
       !! @retval ierr @copydoc error_return
      @@ -1824,12 +1824,12 @@ integer function pio_copy_att(infile, invarid, name, outfile, outvarid) result(i
              case(pio_iotype_netcdf,PIO_iotype_netcdf4c)
                 if (ios%io_rank==0) then
                    ierr = nf90_copy_att(infile%fh,invarid,name,&
      -                  outfile%fh,outvarid)     
      +                  outfile%fh,outvarid)
                 end if
              case(PIO_iotype_netcdf4p)
                 ierr = nf90_copy_att(infile%fh,invarid,name,&
      -               outfile%fh,outvarid)     
      -#endif    
      +               outfile%fh,outvarid)
      +#endif
              end select
           end if
           call check_netcdf(outFile, ierr,__PIO_FILE__,__LINE__)
      @@ -1837,9 +1837,9 @@ end function pio_copy_att
       
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inquire_variable
      -!! @brief Inquires if a NetCDF variable is present and returns its attributes  
      +!! @brief Inquires if a NetCDF variable is present and returns its attributes
       !! @details
       !! @param ncid : A netcdf file descriptor returned by \ref PIO_openfile or \ref PIO_createfile.
       !! @param varid : The netcdf variable ID.
      @@ -1858,7 +1858,7 @@ integer function inquire_variable_vid(ncid, varid, name, xtype, ndims, dimids, n
           integer, dimension(:), optional, intent(out) :: dimids
           integer,               optional, intent(out) :: natts
       
      -    
      +
           if(present(name)) ierr = pio_inq_varname(ncid, varid, name)
           if(present(ndims)) ierr = pio_inq_varndims(ncid, varid, ndims)
           if(present(dimids)) ierr = pio_inq_vardimid(ncid, varid, dimids)
      @@ -1870,9 +1870,9 @@ integer function inquire_variable_vid(ncid, varid, name, xtype, ndims, dimids, n
         end function inquire_variable_vid
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inquire_variable
      -!! @brief Inquires if a NetCDF variable is present and returns its attributes  
      +!! @brief Inquires if a NetCDF variable is present and returns its attributes
       !! @details
       !! @param ncid : A netcdf file descriptor returned by \ref PIO_openfile or \ref PIO_createfile.
       !! @param vardesc @copydoc var_desc_t
      @@ -1900,9 +1900,9 @@ integer function inquire_variable_vdesc(ncid, vardesc, name, xtype, ndims, dimid
         end function inquire_variable_vdesc
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_inquire_dimension
      -!! @brief  Get information about a particular dimension in netcdf file 
      +!! @brief  Get information about a particular dimension in netcdf file
       !! @details
       !! @param ncid : A netcdf file descriptor returned by \ref PIO_openfile or \ref PIO_createfile.
       !! @param dimid : The netcdf dimension ID.
      diff --git a/pio/pio.F90 b/pio/pio.F90
      index b1627850b07..b8e3a828a30 100644
      --- a/pio/pio.F90
      +++ b/pio/pio.F90
      @@ -1,7 +1,7 @@
       !>
      -!! @file 
      +!! @file
       !! @brief User interface Module for PIO, this is the only file a user program should 'use'
      -!! 
      +!!
       !! $Revision: 856 $
       !! $LastChangedDate: 2013-11-19 15:48:54 -0600 (Tue, 19 Nov 2013) $
       !<
      @@ -37,7 +37,7 @@ module pio
       	pio_iotype_vdc2, &
               pio_rearr_box, pio_internal_error, pio_bcast_error, pio_return_error
       
      -  use piodarray, only : pio_read_darray, pio_write_darray, pio_set_buffer_size_limit  
      +  use piodarray, only : pio_read_darray, pio_write_darray, pio_set_buffer_size_limit
       
         use nf_mod, only:        &
              PIO_enddef,            &
      @@ -59,7 +59,7 @@ module pio
              PIO_redef     ,          &
              PIO_copy_att  ,       &
              PIO_inquire_variable , &
      -       PIO_inquire_dimension 
      +       PIO_inquire_dimension
       
         use pionfatt_mod, only : PIO_put_att   => put_att,        &
              PIO_get_att   => get_att
      @@ -67,7 +67,7 @@ module pio
         use pionfget_mod, only : PIO_get_var   => get_var
       
         use calcdecomp, only : pio_set_blocksize
      -   
      +
       
       
         implicit none
      diff --git a/pio/pio_kinds.F90 b/pio/pio_kinds.F90
      index f0f9bef491e..1655a4fd5ec 100644
      --- a/pio/pio_kinds.F90
      +++ b/pio/pio_kinds.F90
      @@ -1,6 +1,6 @@
       !>
       !! @file pio_kinds.F90
      -!! @brief basic data types 
      +!! @brief basic data types
       !!
       !! $Revision$
       !! $LastChangedDate$
      diff --git a/pio/pio_mpi_utils.F90 b/pio/pio_mpi_utils.F90
      index 5b3ebdadc3c..c22ac340001 100644
      --- a/pio/pio_mpi_utils.F90
      +++ b/pio/pio_mpi_utils.F90
      @@ -1,9 +1,9 @@
       #define __PIO_FILE__ "pio_mpi_utils.F90"
       module pio_mpi_utils
      -  
      +
         implicit none
         private
      -  
      +
         public :: pio_type_to_mpi_type
       
       contains
      diff --git a/pio/pio_msg_callbacks.F90 b/pio/pio_msg_callbacks.F90
      index b5482e243e6..49880c15c5b 100644
      --- a/pio/pio_msg_callbacks.F90
      +++ b/pio/pio_msg_callbacks.F90
      @@ -25,7 +25,7 @@ subroutine pio_callback_handler(iosystem, msg)
       
         call mpi_bcast(fh, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
         file=> lookupfile(fh)
      -  
      +
       
         select case(msg)
         case (PIO_MSG_CLOSE_FILE)
      @@ -33,7 +33,7 @@ subroutine pio_callback_handler(iosystem, msg)
            call pio_closefile(file)
            deallocate(file)
         case (PIO_MSG_DEF_DIM)
      -     ierr = pio_def_dim(file, name, len, id)   
      +     ierr = pio_def_dim(file, name, len, id)
         case (PIO_MSG_DEF_VAR)
            ierr = pio_def_var(file, name, type, dimids, vardesc)
         case (PIO_MSG_ENDDEF)
      @@ -70,7 +70,7 @@ subroutine pio_callback_handler(iosystem, msg)
            call pio_syncfile(file)
         case default
            print *, 'PIO Got unrecognized message ', msg, ierr
      -     call piodie(__PIO_FILE__,__LINE__)  
      +     call piodie(__PIO_FILE__,__LINE__)
         end select
       
       end subroutine pio_callback_handler
      @@ -116,16 +116,16 @@ subroutine create_file_handler(iosystem)
         integer :: namelen
         character(len=:), allocatable :: fname
         type(file_desc_t), pointer :: file
      -  
      +
         call mpi_bcast(namelen, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
      -  allocate(character(len=namelen):: fname )  
      +  allocate(character(len=namelen):: fname )
         call mpi_bcast(fname, namelen, mpi_character, iosystem%compmaster, iosystem%intercomm, ierr)
         call mpi_bcast(iotype, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
      -  
      +
         call mpi_bcast(amode, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
       
         allocate(file)
      -  
      +
         ierr= pio_createfile(iosystem, file, iotype, trim(fname), amode )
         deallocate(fname)
         call add_to_file_list(file)
      @@ -150,22 +150,22 @@ subroutine open_file_handler(iosystem)
       
         integer :: ierr
         integer :: iotype, amode
      -  
      +
         character(len=:), allocatable :: fname
         type(file_desc_t), pointer :: file
         integer :: namelen
       
       
         call mpi_bcast(namelen, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
      -  allocate(character(len=namelen):: fname )  
      +  allocate(character(len=namelen):: fname )
         call mpi_bcast(fname, namelen, mpi_character, iosystem%compmaster, iosystem%intercomm, ierr)
       
         call mpi_bcast(iotype, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
      -  
      +
         call mpi_bcast(amode, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
       
         allocate(file)
      -  
      +
         ierr= pio_openfile(iosystem, file, iotype, trim(fname), amode)
         deallocate(fname)
         call add_to_file_list(file)
      @@ -196,14 +196,14 @@ subroutine initdecomp_dof_handler(iosystem)
       
         call mpi_bcast(basepiotype, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
         call mpi_bcast(dims_size, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
      -  call mpi_bcast(dims(1:dims_size), dims_size, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)  
      -  
      +  call mpi_bcast(dims(1:dims_size), dims_size, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
      +
         allocate(iodesc)
       
         compdof=0
         call add_to_iodesc_list(iodesc)
       
      -  call mpi_bcast(iodesc%async_id, 1, mpi_integer, iosystem%iomaster, iosystem%intercomm, ierr)  
      +  call mpi_bcast(iodesc%async_id, 1, mpi_integer, iosystem%iomaster, iosystem%intercomm, ierr)
       
         call pio_initdecomp(iosystem, basepiotype, dims(1:dims_size), compdof, iodesc)
       
      @@ -231,7 +231,7 @@ subroutine writedarray_handler(iosystem)
         integer(i4) :: fillval_int, aint(1)
         real(r4) :: fillval_real, areal(1)
         real(r8) :: fillval_double, adouble(1)
      -  
      +
       
         call mpi_bcast(fh, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
         call mpi_bcast(v%varid, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
      @@ -297,7 +297,7 @@ subroutine readdarray_handler(iosystem)
         real(r8) :: adouble(1)
       
         if(debugasync) print *,__PIO_FILE__,__LINE__
      -  
      +
         call mpi_bcast(fh, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
         call mpi_bcast(v%varid, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
         call mpi_bcast(v%rec, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
      @@ -330,12 +330,12 @@ subroutine seterrorhandling_handler(ios)
         implicit none
       #ifdef NO_MPIMOD
         include 'mpif.h' !_EXTERNAL
      -#endif 
      +#endif
         type(iosystem_desc_t), intent(inout) :: ios
         integer :: method, ierr
       
         call mpi_bcast(method, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      -  
      +
         call pio_seterrorhandling(ios, method)
       
       end subroutine seterrorhandling_handler
      @@ -354,15 +354,15 @@ subroutine string_handler_for_att(file, varid, name, strlen, msg)
       
         if(msg==PIO_MSG_GETATT) then
            if(Debugasync) print *,__PIO_FILE__,__LINE__, varid, name
      -     ierr = pio_get_att(file, varid, name, str )  
      +     ierr = pio_get_att(file, varid, name, str )
            if(Debugasync) print *,__PIO_FILE__,__LINE__, str
         else
      -     ierr = pio_put_att(file, varid, name, str )  
      +     ierr = pio_put_att(file, varid, name, str )
         end if
       end subroutine string_handler_for_att
       
       subroutine att_handler(ios, msg)
      -  
      +
         use pio, only : iosystem_desc_t, file_desc_t, pio_get_att, pio_max_name, pio_put_att
         use pio_kinds, only : i4, r4, r8
         use pio_msg_mod, only : lookupfile, pio_msg_putatt, pio_msg_getatt
      @@ -385,7 +385,7 @@ subroutine att_handler(ios, msg)
         integer(i4) :: ivar
       
         if(Debugasync) print *,__PIO_FILE__,__LINE__
      -  
      +
         call mpi_bcast(fh, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
         call mpi_bcast(varid, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
         call mpi_bcast(itype, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      @@ -394,7 +394,7 @@ subroutine att_handler(ios, msg)
         if(Debugasync) print *,__PIO_FILE__,__LINE__, itype,nlen
       
         file=> lookupfile(fh)
      -  
      +
         select case(itype)
         case (TYPETEXT)
            call mpi_bcast(strlen, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      @@ -419,13 +419,13 @@ subroutine att_handler(ios, msg)
               ierr = pio_put_att(file, varid, name(1:nlen), ivar)
            end if
         end select
      -  
      +
       end subroutine att_handler
       
       
       
       subroutine att_1d_handler(ios, msg)
      -  
      +
         use pio, only : iosystem_desc_t, file_desc_t, pio_get_att, pio_max_name, pio_put_att
         use pio_kinds, only : i4, r4, r8
         use pio_msg_mod, only : lookupfile, pio_msg_getatt_1d, pio_msg_putatt_1d
      @@ -447,7 +447,7 @@ subroutine att_1d_handler(ios, msg)
         real(r4), allocatable :: rvar(:)
         real(r8), allocatable :: dvar(:)
         integer(i4), allocatable :: ivar(:)
      -  
      +
         call mpi_bcast(fh, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
         call mpi_bcast(varid, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
         call mpi_bcast(itype, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      @@ -456,7 +456,7 @@ subroutine att_1d_handler(ios, msg)
         call MPI_BCAST(clen,1,MPI_INTEGER,ios%CompMaster, ios%intercomm , ierr)
       
         file=> lookupfile(fh)
      -  
      +
         select case(itype)
         case (TYPEREAL)
            allocate(rvar(clen))
      @@ -483,7 +483,7 @@ subroutine att_1d_handler(ios, msg)
            end if
            deallocate(ivar)
         end select
      -  
      +
       end subroutine att_1d_handler
       
       
      diff --git a/pio/pio_msg_getput_callbacks.F90.in b/pio/pio_msg_getput_callbacks.F90.in
      index 3a0c8ad3f16..2a75c28ac37 100644
      --- a/pio/pio_msg_getput_callbacks.F90.in
      +++ b/pio/pio_msg_getput_callbacks.F90.in
      @@ -1,9 +1,9 @@
       ! Not a module - this line is required by genf90.pl
       !>
      -!! @file 
      +!! @file
       !! $Revision$
       !! $LastChangedDate$
      -!! @brief Callback functions for Asyncronous IO 
      +!! @brief Callback functions for Asyncronous IO
       !<
       subroutine string_handler_for_var1(file, varid, index, ndims, strlen, msg)
         use pio, only : file_desc_t, pio_get_var, pio_put_var
      @@ -16,9 +16,9 @@ subroutine string_handler_for_var1(file, varid, index, ndims, strlen, msg)
         integer :: ierr
       
         if(msg==PIO_MSG_GETVAR1) then
      -     ierr = pio_get_var(file, varid, index, str )  
      +     ierr = pio_get_var(file, varid, index, str )
         else
      -     ierr = pio_put_var(file, varid, index, str )  
      +     ierr = pio_put_var(file, varid, index, str )
         end if
       end subroutine string_handler_for_var1
       
      @@ -56,7 +56,7 @@ subroutine var1_handler(ios, msg)
       
         if(itype == TYPETEXT) then
            call mpi_bcast(strlen, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      -     
      +
            call string_handler_for_var1(file, varid, index, size_index, strlen, msg)
         else
            if(msg==pio_msg_getvar1) then
      @@ -117,9 +117,9 @@ subroutine vara_{DIMS}d_handler(ios, msg)
         call mpi_bcast(count, ndims, mpi_integer, ios%compmaster, ios%intercomm, ierr)
       
         call MPI_BCAST(dims,{DIMS},MPI_INTEGER,ios%CompMaster, ios%intercomm , ierr)
      -  
      +
         file=> lookupfile(fh)
      -  
      +
         select case(itype)
         case (TYPETEXT)
            call mpi_bcast(strlen, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      @@ -192,16 +192,16 @@ subroutine string_handler_for_var_0d(file, varid, strlen, msg)
         integer :: ierr
       
         if(msg==PIO_MSG_GETVAR_0D) then
      -     ierr = pio_get_var(file, varid, str )  
      +     ierr = pio_get_var(file, varid, str )
         else
      -     ierr = pio_put_var(file, varid, str )  
      +     ierr = pio_put_var(file, varid, str )
         end if
       end subroutine string_handler_for_var_0d
      -  
      +
       subroutine var_0d_handler (ios, msg)
         use pio, only : iosystem_desc_t, file_desc_t, pio_get_var, pio_put_var
         use pio_kinds, only : i4, r4, r8, pio_offset
      -  use pio_msg_mod, only : lookupfile, pio_msg_getvar_0d 
      +  use pio_msg_mod, only : lookupfile, pio_msg_getvar_0d
         use pio_support, only : debugAsync, piodie
       #ifndef NO_MPIMOD
         use mpi ! _EXTERNAL
      @@ -219,13 +219,13 @@ subroutine var_0d_handler (ios, msg)
         real(r4) :: rvar
         real(r8) :: dvar
         integer(i4) :: ivar
      -  
      +
         call mpi_bcast(fh, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
         call mpi_bcast(varid, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
         call mpi_bcast(itype, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
       
         file=> lookupfile(fh)
      -  
      +
         select case(itype)
         case (TYPETEXT)
            call mpi_bcast(strlen, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      @@ -249,7 +249,7 @@ subroutine var_0d_handler (ios, msg)
               ierr = pio_put_var(file, varid, ivar)
            end if
         end select
      -  
      +
       end subroutine var_0d_handler
       
       ! DIMS 1,2,3,4,5
      @@ -261,7 +261,7 @@ subroutine string_handler_for_var_{DIMS}d (file, varid, strlen, dims, msg)
         integer, intent(in) :: varid, strlen, dims({DIMS}), msg
       
         character(len=strlen), allocatable :: str{DIMSTR}
      -  integer :: ierr  
      +  integer :: ierr
       
       #if({DIMS} == 1)
         allocate(str(dims(1)))
      @@ -275,14 +275,14 @@ subroutine string_handler_for_var_{DIMS}d (file, varid, strlen, dims, msg)
         allocate(str(dims(1),dims(2),dims(3),dims(4),dims(5)))
       #endif
         if(msg == PIO_MSG_GETVAR_{DIMS}D) then
      -     ierr = pio_get_var(file, varid, str )  
      +     ierr = pio_get_var(file, varid, str )
         else
      -     ierr = pio_put_var(file, varid, str )  
      +     ierr = pio_put_var(file, varid, str )
         end if
         deallocate(str)
       
       end subroutine string_handler_for_var_{DIMS}d
      -  
      +
       ! DIMS 1,2,3,4,5
       subroutine string_handler_for_vara_{DIMS}d (file, varid, start, count, strlen, dims, msg)
         use pio_msg_mod, only : pio_msg_getvara_{DIMS}d
      @@ -306,15 +306,15 @@ subroutine string_handler_for_vara_{DIMS}d (file, varid, start, count, strlen, d
         allocate(str(dims(1),dims(2),dims(3),dims(4),dims(5)))
       #endif
         if(msg==pio_msg_getvara_{DIMS}d) then
      -     ierr = pio_get_var(file, varid, start, count, str )  
      +     ierr = pio_get_var(file, varid, start, count, str )
         else
            str = ' '
      -     ierr = pio_put_var(file, varid, start, count, str )  
      +     ierr = pio_put_var(file, varid, start, count, str )
         end if
         deallocate(str)
       
       end subroutine string_handler_for_vara_{DIMS}d
      -  
      +
       
       ! DIMS 1,2,3,4,5
       subroutine var_{DIMS}d_handler (ios, msg)
      @@ -340,7 +340,7 @@ subroutine var_{DIMS}d_handler (ios, msg)
         real(r4), allocatable    :: rvar{DIMSTR}
         real(r8), allocatable    :: dvar{DIMSTR}
         integer(i4), allocatable :: ivar{DIMSTR}
      -  
      +
         call mpi_bcast(fh, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
         call mpi_bcast(varid, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
         call mpi_bcast(itype, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      @@ -350,7 +350,7 @@ subroutine var_{DIMS}d_handler (ios, msg)
       
       
         file=> lookupfile(fh)
      -  
      +
         select case(itype)
         case (TYPETEXT)
            call mpi_bcast(strlen, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      @@ -386,9 +386,9 @@ subroutine var_{DIMS}d_handler (ios, msg)
         allocate(dvar(dims(1),dims(2),dims(3),dims(4),dims(5)))
       #endif
            if(msg==pio_msg_getvar_{DIMS}d ) then
      -        ierr = pio_get_var(file, varid,  dvar)  
      +        ierr = pio_get_var(file, varid,  dvar)
            else
      -        ierr = pio_put_var(file, varid,  dvar)  
      +        ierr = pio_put_var(file, varid,  dvar)
            end if
            deallocate(dvar)
         case (TYPEINT)
      @@ -410,6 +410,6 @@ subroutine var_{DIMS}d_handler (ios, msg)
            end if
            deallocate(ivar)
         end select
      -  
      +
       end subroutine var_{DIMS}d_handler
       
      diff --git a/pio/pio_msg_mod.F90 b/pio/pio_msg_mod.F90
      index 19df5a98bde..e393bb2b2f7 100644
      --- a/pio/pio_msg_mod.F90
      +++ b/pio/pio_msg_mod.F90
      @@ -20,7 +20,7 @@ module pio_msg_mod
          integer, parameter, public :: pio_msg_enddef = 313
          integer, parameter, public :: pio_msg_redef = 314
          integer, parameter, public :: pio_msg_initdecomp_dof = 315
      -   
      +
          integer, parameter, public :: pio_msg_writedarray = 320
          integer, parameter, public :: pio_msg_readdarray = 325
          integer, parameter, public :: pio_msg_inquire = 330
      @@ -74,9 +74,9 @@ module pio_msg_mod
          integer, parameter, public :: PIO_MSG_SYNC_FILE = 500
          integer, parameter, public :: PIO_MSG_FREEDECOMP = 502
       
      -   integer, parameter, public :: pio_msg_exit = 999   
      +   integer, parameter, public :: pio_msg_exit = 999
      +
       
      -   
          type :: file_desc_list
             type(file_desc_t), pointer :: file => null()
             type(file_desc_list), pointer :: next => null()
      @@ -107,7 +107,7 @@ end subroutine pio_msg_handler_init
       
       
         subroutine pio_msg_handler(numcomps, iosystem)
      -!    use pio_types, only : 
      +!    use pio_types, only :
       #ifdef TIMING
           use perf_mod        ! _EXTERNAL
       #endif
      @@ -126,7 +126,7 @@ subroutine pio_msg_handler(numcomps, iosystem)
           integer :: req(numcomps)
           integer :: index
       
      -#ifdef TIMING    
      +#ifdef TIMING
           call t_startf('pio_msg_mod')
       #endif
           if(iorank==0) then
      @@ -134,7 +134,7 @@ subroutine pio_msg_handler(numcomps, iosystem)
              do index=1,numcomps
                 ios=>iosystem(index)
                 if(ios%io_comm .ne. mpi_comm_null) then
      -             call mpi_irecv(msg, 1, mpi_integer, ios%comproot, 1, ios%union_comm, req(index), ierr)       
      +             call mpi_irecv(msg, 1, mpi_integer, ios%comproot, 1, ios%union_comm, req(index), ierr)
                 end if
              enddo
           end if
      @@ -152,7 +152,7 @@ subroutine pio_msg_handler(numcomps, iosystem)
              call mpi_bcast(msg, 1, mpi_integer, 0, io_comm, ierr)
       
              if(debugasync) print *,__PIO_FILE__,__LINE__, msg ,' recieved on ', index
      -       select case(msg) 
      +       select case(msg)
              case (PIO_MSG_CREATE_FILE)
                 call create_file_handler(ios)
              case (PIO_MSG_OPEN_FILE)
      @@ -222,7 +222,7 @@ subroutine pio_msg_handler(numcomps, iosystem)
              case (PIO_MSG_PUTATT)
                 call att_handler(ios, msg)
              case (PIO_MSG_PUTATT_1D)
      -          call att_1d_handler(ios, msg)          
      +          call att_1d_handler(ios, msg)
              case (PIO_MSG_FREEDECOMP)
                 call freedecomp_handler(ios)
              case (PIO_MSG_EXIT)
      @@ -232,7 +232,7 @@ subroutine pio_msg_handler(numcomps, iosystem)
                 exit
              case default
                 call pio_callback_handler(ios,msg)
      -       end select   
      +       end select
              if(iorank==0) then
                 call mpi_irecv(msg, 1, mpi_integer, ios%comproot, 1, ios%union_comm, req(index), ierr)
              end if
      @@ -331,7 +331,7 @@ function delete_from_iodesc_list(id) result(iodesc)
                       nullify(previtem%next)
                    end if
                    deallocate(list_item)
      -          else if(associated(list_item%next)) then  
      +          else if(associated(list_item%next)) then
                    nextitem => list_item%next
                    list_item%iodesc=>nextitem%iodesc
                    list_item%index = nextitem%index
      @@ -341,7 +341,7 @@ function delete_from_iodesc_list(id) result(iodesc)
                       nullify(list_item%next)
                    end if
                    deallocate(nextitem)
      -             
      +
                 end if
       
                 exit
      @@ -404,11 +404,11 @@ function lookupfile(fh) result(file)
           type(file_desc_list), pointer :: list_item
       
           integer :: fh1
      -    
      +
           fh1 = abs(fh)
       
           list_item=> top_file
      -    
      +
           do while(associated(list_item%file) )
              if(abs(list_item%file%fh) == fh1) then
                 file => list_item%file
      @@ -441,7 +441,7 @@ function lookupiodesc(async_id) result(iodesc)
           if(.not.associated(iodesc)) then
              call piodie(__PIO_FILE__,__LINE__)
           end if
      -    
      +
         end function lookupiodesc
       
       end module pio_msg_mod
      diff --git a/pio/pio_nf_utils.F90 b/pio/pio_nf_utils.F90
      index 3a4e90514ba..e6241821f87 100644
      --- a/pio/pio_nf_utils.F90
      +++ b/pio/pio_nf_utils.F90
      @@ -31,11 +31,11 @@ subroutine copy_pio_var01d(ifh, ofh, ivid, ovid, length, strlength)
         character(len=length), allocatable :: cval(:)
       
         integer :: ierr
      -  
      +
       !  ierr = pio_inq_vartype(ifh, ivid, itype)
       !  ierr = pio_inq_vartype(ofh, ovid, otype)
       
      -  
      +
         if( ivid%type.ne.ovid%type) then
            write(6,*) 'WARNING: copy_pio_var coercing type ', ivid%type, ' to ',ovid%type
         end if
      @@ -79,11 +79,11 @@ subroutine copy_pio_var2d(ifh, ofh, ivid, ovid, length)
       !  character(len=length), allocatable :: cval(:,:)
       
         integer :: ierr
      -  
      +
       !  ierr = pio_inq_vartype(ifh, ivid, itype)
       !  ierr = pio_inq_vartype(ofh, ovid, otype)
       
      -  
      +
         if( ivid%type.ne.ovid%type) then
            write(6,*) 'WARNING: copy_pio_var coercing type ', ivid%type, ' to ',ovid%type
         end if
      diff --git a/pio/pio_spmd_utils.F90.in b/pio/pio_spmd_utils.F90.in
      index fd35f87120f..1819ace570c 100644
      --- a/pio/pio_spmd_utils.F90.in
      +++ b/pio/pio_spmd_utils.F90.in
      @@ -1,5 +1,5 @@
       !>
      -!! @file 
      +!! @file
       !! $Revision$
       !! $LastChangedDate$
       !! @brief SPMD helper routines
      @@ -90,14 +90,14 @@ contains
             rcvbuf, rbuf_siz, rcvlths, rdispls, rtypes,  &
             comm, comm_hs, comm_isend, comm_maxreq       )
       
      -!----------------------------------------------------------------------- 
      -! 
      -!> Purpose: 
      -!!   Reduced version of original swapm (for swap of multiple messages 
      -!!   using MPI point-to-point routines), more efficiently implementing a 
      +!-----------------------------------------------------------------------
      +!
      +!> Purpose:
      +!!   Reduced version of original swapm (for swap of multiple messages
      +!!   using MPI point-to-point routines), more efficiently implementing a
       !!   subset of the swap protocols.
      -!! 
      -!! Method: 
      +!!
      +!! Method:
       !! comm_protocol:
       !!  comm_isend == .true.: use nonblocking send, else use blocking send
       !!  comm_hs == .true.: use handshaking protocol
      @@ -108,7 +108,7 @@ contains
       !!
       !! Author of original version:  P. Worley
       !! Ported from CAM: P. Worley, May 2009
      -!< 
      +!<
       !-----------------------------------------------------------------------
       #ifdef TIMING
         use perf_mod, only : t_startf, t_stopf   ! _EXTERNAL
      @@ -128,7 +128,7 @@ contains
                                                      !  should be sent from
          integer, intent(in)   :: stypes(0:nprocs-1) ! MPI data types
          integer, intent(in)   :: rcvlths(0:nprocs-1)! length of incoming messages
      -   integer, intent(in)   :: rdispls(0:nprocs-1)! offset from beginning of receive 
      +   integer, intent(in)   :: rdispls(0:nprocs-1)! offset from beginning of receive
                                                      !  buffer where incoming messages
                                                      !  should be placed
          integer, intent(in)   :: rtypes(0:nprocs-1) ! MPI data types
      @@ -137,7 +137,7 @@ contains
          integer, intent(in)   :: comm               ! MPI communicator
          logical, intent(in)   :: comm_hs            ! handshaking protocol?
          logical, intent(in)   :: comm_isend         ! nonblocking send protocol?
      -   integer, intent(in)   :: comm_maxreq        ! maximum number of outstanding 
      +   integer, intent(in)   :: comm_maxreq        ! maximum number of outstanding
                                                      !  nonblocking requests
       
       !---------------------------Output arguments--------------------------
      @@ -157,23 +157,23 @@ contains
          integer :: tag                              ! MPI message tag
          integer :: offset_t                         ! MPI message tag offset, for addressing
                                                      !  message conflict bug (if necessary)
      -   integer :: offset_s                         ! index of message beginning in 
      +   integer :: offset_s                         ! index of message beginning in
                                                      !  send buffer
      -   integer :: offset_r                         ! index of message beginning in 
      +   integer :: offset_r                         ! index of message beginning in
                                                      !  receive buffer
          integer :: sndids(nprocs)                   ! send request ids
          integer :: rcvids(nprocs)                   ! receive request ids
          integer :: hs_rcvids(nprocs)                ! handshake receive request ids
       
      -   integer :: maxreq, maxreqh                  ! maximum number of outstanding 
      +   integer :: maxreq, maxreqh                  ! maximum number of outstanding
                                                      !  nonblocking requests (and half)
          integer :: hs                               ! handshake variable
          integer :: rstep                            ! "receive" step index
       
          logical :: handshake, sendd                 ! protocol option flags
       
      -   integer :: ier                              ! return error status    
      -   integer :: status(MPI_STATUS_SIZE)          ! MPI status 
      +   integer :: ier                              ! return error status
      +   integer :: status(MPI_STATUS_SIZE)          ! MPI status
       !
       !-------------------------------------------------------------------------------------
       !
      @@ -282,7 +282,7 @@ contains
             enddo
             rstep = maxreq
       
      -      ! Send (and start receiving) data 
      +      ! Send (and start receiving) data
             do istep=1,steps
                p = swapids(istep)
       
      @@ -381,7 +381,7 @@ contains
             enddo
             rstep = maxreq
       
      -      ! Send (and start receiving) data 
      +      ! Send (and start receiving) data
             do istep=1,steps
                p = swapids(istep)
       
      @@ -474,7 +474,7 @@ contains
             enddo
             rstep = maxreq
       
      -      ! Send (and start receiving) data 
      +      ! Send (and start receiving) data
             do istep=1,steps
                p = swapids(istep)
       
      @@ -541,7 +541,7 @@ contains
             enddo
             rstep = maxreq
       
      -      ! Send (and start receiving) data 
      +      ! Send (and start receiving) data
             do istep=1,steps
                p = swapids(istep)
       
      diff --git a/pio/pio_support.F90 b/pio/pio_support.F90
      index 640c4b226f3..e9d34ad000d 100644
      --- a/pio/pio_support.F90
      +++ b/pio/pio_support.F90
      @@ -87,7 +87,7 @@ subroutine piodie (file,line, msg, ival1, msg2, ival2, msg3, ival3, mpirank)
       
           character(len=*), parameter :: subName=modName//'::pio_die'
           integer :: ierr, myrank=-1
      -    
      +
           if(present(mpirank)) myrank=mpirank
       
           if (present(ival3)) then
      @@ -121,9 +121,9 @@ subroutine piodie (file,line, msg, ival1, msg2, ival2, msg3, ival3, mpirank)
       
       #endif
       
      -    ! passing an argument of 1 to mpi_abort will lead to a STOPALL output 
      +    ! passing an argument of 1 to mpi_abort will lead to a STOPALL output
           ! error code of 257
      -    call mpi_abort (MPI_COMM_WORLD, 1, ierr)  
      +    call mpi_abort (MPI_COMM_WORLD, 1, ierr)
       
       #ifdef CPRNAG
           stop
      @@ -282,7 +282,7 @@ subroutine pio_readdof (file, DOF, comm, punit)
           ! Author: T Craig
           !
           ! Change History
      -    ! 
      +    !
           !-----------------------------------------------------------------------
           ! $Id$
           !-----------------------------------------------------------------------
      @@ -398,25 +398,25 @@ subroutine pio_fc_gather_offset ( sendbuf, sendcnt, sendtype, &
                                         recvbuf, recvcnt, recvtype, &
                                         root, comm, flow_cntl )
       
      -!----------------------------------------------------------------------- 
      -! 
      -!> Purpose: 
      -!!   Gather collective with additional flow control, so as to 
      -!!   be more robust when used with high process counts. 
      +!-----------------------------------------------------------------------
      +!
      +!> Purpose:
      +!!   Gather collective with additional flow control, so as to
      +!!   be more robust when used with high process counts.
       !!
      -!! Method: 
      -!!   If flow_cntl optional parameter 
      +!! Method:
      +!!   If flow_cntl optional parameter
       !!     < 0: use MPI_Gather
      -!!     >= 0: use point-to-point with handshaking messages and 
      -!!           preposting receive requests up to 
      -!!           max(min(1,flow_cntl),max_gather_block_size) 
      +!!     >= 0: use point-to-point with handshaking messages and
      +!!           preposting receive requests up to
      +!!           max(min(1,flow_cntl),max_gather_block_size)
       !!           ahead if optional flow_cntl parameter is present.
       !!           Otherwise, fc_gather_flow_cntl is used in its place.
       !!     Default value is 64.
      -!! 
      +!!
       !! Author of original version:  P. Worley
       !! Ported from CAM: P. Worley, Jan 2010
      -!< 
      +!<
       !-----------------------------------------------------------------------
       
       !-----------------------------------------------------------------------
      @@ -458,8 +458,8 @@ subroutine pio_fc_gather_offset ( sendbuf, sendcnt, sendtype, &
       
          integer :: rcvid(max_gather_block_size)  ! receive request ids
       
      -   integer :: ier                           ! return error status    
      -   integer :: status(MPI_STATUS_SIZE)       ! MPI status 
      +   integer :: ier                           ! return error status
      +   integer :: status(MPI_STATUS_SIZE)       ! MPI status
       
       !
       !-------------------------------------------------------------------------------------
      @@ -481,7 +481,7 @@ subroutine pio_fc_gather_offset ( sendbuf, sendcnt, sendtype, &
          endif
       
          if (fc_gather) then
      - 
      +
             ! Determine task id and size of communicator
             call mpi_comm_rank (comm, mytask, ier)
             call mpi_comm_size (comm, nprocs, ier)
      @@ -542,7 +542,7 @@ subroutine pio_fc_gather_offset ( sendbuf, sendcnt, sendtype, &
             call CheckMPIReturn(subName,ier)
       
          else
      - 
      +
             call mpi_gather (sendbuf, sendcnt, sendtype, &
                              recvbuf, recvcnt, recvtype, &
                              root, comm, ier)
      diff --git a/pio/pio_types.F90 b/pio/pio_types.F90
      index 5a1fbeab7fe..7fcf92709b7 100644
      --- a/pio/pio_types.F90
      +++ b/pio/pio_types.F90
      @@ -1,8 +1,8 @@
       #define __PIO_FILE__ "pio_types.F90"
       !>
      -!! @file 
      +!! @file
       !! @brief Derived datatypes and constants for PIO
      -!! 
      +!!
       !! $Revision: 943 $
       !! $LastChangedDate: 2014-02-14 10:20:17 -0600 (Fri, 14 Feb 2014) $
       !<
      @@ -19,7 +19,7 @@ module pio_types
           use pnetcdf
       #endif
           implicit none
      -    private 
      +    private
       #ifdef NO_MPIMOD
           include 'mpif.h'                             ! _EXTERNAL
       #endif
      @@ -36,7 +36,7 @@ module pio_types
       
       !>
       !! @defgroup PIO_rearr_method PIO_rearr_method
      -!! @public 
      +!! @public
       !! @brief The three choices to control rearrangement are:
       !! @details
       !!  - PIO_rearr_none : Do not use any form of rearrangement
      @@ -47,7 +47,7 @@ module pio_types
       
       !>
       !! @defgroup PIO_rearr_comm_t PIO_rearr_comm_t
      -!! @public 
      +!! @public
       !! @brief The two choices for rearranger communication
       !! @details
       !!  - PIO_rearr_comm_p2p : Point to point
      @@ -60,7 +60,7 @@ module pio_types
       
       !>
       !! @defgroup PIO_rearr_comm_dir PIO_rearr_comm_dir
      -!! @public 
      +!! @public
       !! @brief The four choices for rearranger communication direction
       !! @details
       !!  - PIO_rearr_comm_fc_2d_enable : COMM procs to IO procs and vice versa
      @@ -79,7 +79,7 @@ module pio_types
       !! @defgroup PIO_rearr_comm_fc_options PIO_rearr_comm_fc_options
       !! @brief Type that defines the PIO rearranger options
       !! @details
      -!!  - enable_hs : Enable handshake (true/false) 
      +!!  - enable_hs : Enable handshake (true/false)
       !!  - enable_isend : Enable Isends (true/false)
       !!  - max_pend_req : Maximum pending requests (To indicated unlimited
       !!                    number of requests use PIO_REARR_COMM_UNLIMITED_PEND_REQ)
      @@ -115,19 +115,19 @@ module pio_types
           !------------------------------------
       !>
       !! @public
      -!! @defgroup iosystem_desc_t 
      +!! @defgroup iosystem_desc_t
       !! @brief A defined PIO system descriptor created by @ref PIO_init (see pio_types)
       !<
           type, public :: IOSystem_desc_t
       #ifdef SEQUENCE
       	sequence
       #endif
      -        
      +
               integer(i4)              :: union_comm=MPI_COMM_NULL ! The intracomm union of comp and io communicators (for async only)
               integer(i4)              :: IO_comm=MPI_COMM_NULL            ! The IO communicator
               integer(i4)              :: comp_comm=MPI_COMM_NULL          ! The Compute communicator
               integer(i4)              :: intercomm=MPI_COMM_NULL          ! the intercomm (may be MPI_COMM_NULL)
      -        
      +
               integer(i4)              :: my_comm=MPI_COMM_NULL            ! either comp_comm or intercomm
               integer(i4)              :: num_tasks          !  number of tasks
               integer(i4)              :: num_iotasks        ! total number of IO tasks
      @@ -140,7 +140,7 @@ module pio_types
       !
               integer(i4)              :: Info=MPI_INFO_NULL  ! MPI-IO info structure
               integer(i4)              :: numOST              ! The number of Object Storage Target (OST) to use.  This is a hardware raid device.
      -        
      +
       ! rank of the io and comp roots in the intercomm
               integer(i4)              :: IOMaster           ! The intercom of the io_rank 0
               integer(i4)              :: compMaster           ! The intercom of the comp_rank 0
      @@ -170,7 +170,7 @@ module pio_types
           integer, parameter :: MAX_IO_SYSTEMS=6
           type(iosystem_list_t), save :: iosystems(MAX_IO_SYSTEMS)
       
      -!> 
      +!>
       !! @private
       !! @struct io_data_list
       !! @brief Linked list of buffers for pnetcdf non-blocking interface
      @@ -183,11 +183,11 @@ module pio_types
              type(io_data_list), pointer :: next => null()
           end type io_data_list
       
      -     
      -!> 
      +
      +!>
       !! @defgroup file_desc_t
       !! File descriptor returned by \ref PIO_openfile or \ref PIO_createfile (see pio_types)
      -!! 
      +!!
       !>
           type, public :: File_desc_t
              type(iosystem_desc_t), pointer :: iosystem => null()
      @@ -195,7 +195,7 @@ module pio_types
              integer :: buffsize=0
              integer(i4) :: fh
              integer(kind=PIO_OFFSET) :: offset             ! offset into file
      -       integer(i4)              :: iotype             ! Type of IO to perform see parameter statement below     
      +       integer(i4)              :: iotype             ! Type of IO to perform see parameter statement below
              logical                  :: file_is_open = .false.
           end type File_desc_t
       
      @@ -216,15 +216,15 @@ module pio_types
       !>
       !! @private
       !! @defgroup iodesc_generate io descriptors, generating
      -!! @brief The io descriptor structure in defined in this subroutine 
      +!! @brief The io descriptor structure in defined in this subroutine
       !! and subsequently used in @ref PIO_read_darray, @ref PIO_write_darray,
       !! @ref PIO_put_var, @ref PIO_get_var calls (see pio_types).
       !<
       
       !>
      -!! @public 
      +!! @public
       !! @struct io_desc_t
      -!! @brief  An io descriptor handle that is generated in @ref PIO_initdecomp 
      +!! @brief  An io descriptor handle that is generated in @ref PIO_initdecomp
       !! (see pio_types)
       !<
          type, public :: io_desc_t
      @@ -250,7 +250,7 @@ module pio_types
               integer,pointer :: rfrom(:)=> NULL()   ! rfrom(nrecvs)= rank of ith sender
               integer,pointer :: rtype(:)=> NULL()   ! rtype(nrecvs)=mpi types for receives
       
      -        
      +
               ! needed on all procs
               integer,pointer :: scount(:)=> NULL()  ! scount(num_iotasks)= # sends to ith ioproc
               integer,pointer :: stype(:)=> NULL()   ! stype(num_iotasks)=mpi type for sends
      @@ -271,20 +271,20 @@ module pio_types
       
       !>
       !! @public
      -!! @defgroup var_desc_t 
      -!! @brief A variable descriptor returned from @ref PIO_def_var (see pio_types) 
      +!! @defgroup var_desc_t
      +!! @brief A variable descriptor returned from @ref PIO_def_var (see pio_types)
       !<
           type, public :: Var_desc_t
       #ifdef SEQUENCE
       	sequence
      -#endif	
      +#endif
               integer(i4)     :: varID
      -        integer(i4)     :: rec   ! This is a record number or pointer into the unlim dimension of the	    
      +        integer(i4)     :: rec   ! This is a record number or pointer into the unlim dimension of the
                                        ! netcdf file
       	integer(i4)     :: type
               integer(i4)     :: ndims ! number of dimensions as defined on the netcdf file.
       	character(len=50) :: name ! vdc needed variable
      -    end type 
      +    end type
       
       !>
       !! @defgroup PIO_iotype PIO_iotype
      @@ -297,7 +297,7 @@ module pio_types
       !!   - PIO_iotype_pnetcdf : parallel read/write of pNetCDF files (netcdf3)
       !!   - PIO_iotype_netcdf : serial read/write of NetCDF files using 'base_node' (netcdf3)
       !!   - PIO_iotype_netcdf4c : parallel read/serial write of NetCDF4 (HDF5) files with data compression
      -!!   - PIO_iotype_netcdf4p : parallel read/write of NETCDF4 (HDF5) files 
      +!!   - PIO_iotype_netcdf4p : parallel read/write of NETCDF4 (HDF5) files
       !>
           integer(i4), public, parameter ::  &
               PIO_iotype_pbinary = 1, &! use MPI-IO with data types to read/write C like binary files
      @@ -305,9 +305,9 @@ module pio_types
               PIO_iotype_binary  = 4, &   ! serial read/write of binary files using 'base_node'
               PIO_iotype_pnetcdf = 5, &   ! parallel read/write of pNetCDF files
               PIO_iotype_netcdf  = 6, &   ! serial read/write of NetCDF file using 'base_node'
      -        PIO_iotype_netcdf4c = 7, &  ! netcdf4 (hdf5 format) file opened for compression (serial write access only)   
      +        PIO_iotype_netcdf4c = 7, &  ! netcdf4 (hdf5 format) file opened for compression (serial write access only)
               PIO_iotype_netcdf4p = 8, &  ! netcdf4 (hdf5 format) file opened in parallel (all netcdf4 files for read will be opened this way)
      -        PIO_iotype_vdc2 = 10        ! VDC2 format file opened for compressed parallel write 
      +        PIO_iotype_vdc2 = 10        ! VDC2 format file opened for compressed parallel write
       
       
       ! These are for backward compatability and should not be used or expanded upon
      @@ -320,11 +320,11 @@ module pio_types
       
       
       
      -!> 
      +!>
       !! @public
      -!! @defgroup PIO_error_method error_methods 
      +!! @defgroup PIO_error_method error_methods
       !! @details
      -!! The three types of error handling methods are: 
      +!! The three types of error handling methods are:
       !!  - PIO_INTERNAL_ERROR  : abort on error from any task
       !!  - PIO_BCAST_ERROR     : broadcast an error from io_rank 0 to all tasks in comm
       !!  - PIO_RETURN_ERROR    : do nothing - allow the user to handle it
      @@ -334,11 +334,11 @@ module pio_types
         integer(i4), public, parameter :: PIO_RETURN_ERROR = -53
       
       !>
      -!! @public 
      +!! @public
       !! @defgroup error_return error return codes
       !! @brief : The error return code; ierr != PIO_noerr indicates
      -!! an error. (see @ref PIO_seterrorhandling ) 
      -!> 
      +!! an error. (see @ref PIO_seterrorhandling )
      +!>
       
       !>
       !! @struct use_PIO_kinds
      @@ -347,11 +347,11 @@ module pio_types
       !<
       
       !>
      -!! @public 
      +!! @public
       !! @defgroup PIO_kinds PIO_kinds
       !! @brief The base types supported by PIO are:
       !! @details
      -!!  - PIO_double : 8-byte reals or double precision 
      +!!  - PIO_double : 8-byte reals or double precision
       !!  - PIO_real : 4-byte reals
       !!  - PIO_int :  4-byte integers
       !!  - PIO_char : character
      @@ -369,11 +369,11 @@ module pio_types
          integer, public, parameter :: PIO_noerr  = nf_noerr
          integer, public, parameter :: PIO_WRITE  = nf_write
          integer, public, parameter :: PIO_nowrite  = nf_nowrite
      -   integer, public, parameter :: PIO_CLOBBER = nf_clobber	
      -   integer, public, parameter :: PIO_NOCLOBBER = nf_NOclobber	
      +   integer, public, parameter :: PIO_CLOBBER = nf_clobber
      +   integer, public, parameter :: PIO_NOCLOBBER = nf_NOclobber
          integer, public, parameter :: PIO_NOFILL = nf_nofill
          integer, public, parameter :: PIO_MAX_NAME = nf_max_name
      -   integer, public, parameter :: PIO_MAX_VAR_DIMS = nf_max_var_dims
      +   integer, public, parameter :: PIO_MAX_VAR_DIMS = min(128,nf_max_var_dims)
          integer, public, parameter :: PIO_64BIT_OFFSET = nf_64bit_offset
          integer, public, parameter :: PIO_64BIT_DATA = nf_64bit_data
       
      @@ -388,8 +388,8 @@ module pio_types
          integer, public, parameter :: PIO_noerr  = nf90_noerr
          integer, public, parameter :: PIO_WRITE  = nf90_write
          integer, public, parameter :: PIO_nowrite = nf90_nowrite
      -   integer, public, parameter :: PIO_CLOBBER = nf90_clobber	
      -   integer, public, parameter :: PIO_NOCLOBBER = nf90_NOclobber	
      +   integer, public, parameter :: PIO_CLOBBER = nf90_clobber
      +   integer, public, parameter :: PIO_NOCLOBBER = nf90_NOclobber
          integer, public, parameter :: PIO_NOFILL = nf90_nofill
          integer, public, parameter :: PIO_MAX_NAME = nf90_max_name
          integer, public, parameter :: PIO_MAX_VAR_DIMS = nf90_max_var_dims
      diff --git a/pio/pio_utils.F90 b/pio/pio_utils.F90
      index 2013313e41a..690f81dafbc 100644
      --- a/pio/pio_utils.F90
      +++ b/pio/pio_utils.F90
      @@ -3,7 +3,7 @@ module pio_utils
         use pio_types, only : pio_int, pio_real, pio_double, pio_char
         use pio_types, only : iotype_netcdf, iotype_pnetcdf, PIO_internal_error
         use pio_types, only : PIO_iotype_netcdf4p, pio_iotype_netcdf4c
      -  use pio_types, only : PIO_bcast_error 
      +  use pio_types, only : PIO_bcast_error
         use pio_kinds, only : i4, r4, r8
         use pio_support, only : checkmpireturn, piodie, Debug
       
      @@ -27,10 +27,10 @@ module pio_utils
       #endif
       #endif
       
      -  public :: check_netcdf 
      -  public :: bad_iotype 
      +  public :: check_netcdf
      +  public :: bad_iotype
      +
       
      -  
       
       contains
       
      @@ -48,7 +48,7 @@ subroutine check_netcdf(File, status, filestr, line)
       !  3: do nothing - allow the user to handle it PIO_RETURN_ERROR
       !
           iotype = file%iotype
      -    
      +
           if(Debug) call mpi_barrier(file%iosystem%union_comm, mpierr)
       
           select case(iotype)
      @@ -112,6 +112,6 @@ subroutine bad_iotype(iotype,file,line)
       
         end subroutine bad_iotype
       
      -  
      +
       
       end module pio_utils
      diff --git a/pio/piodarray.F90.in b/pio/piodarray.F90.in
      index 05cecca1357..bcd1a0c20a5 100644
      --- a/pio/piodarray.F90.in
      +++ b/pio/piodarray.F90.in
      @@ -1,6 +1,6 @@
       #define __PIO_FILE__ 'piodarray'
       !>
      -!! @file 
      +!! @file
       !! $Revision$
       !! $LastChangedDate$
       !! @brief Read and write Routines for decomposed data.
      @@ -51,8 +51,8 @@ module piodarray
         character, private :: xxx_sizeof_data(32)
       #endif
       
      -  
      -!> 
      +
      +!>
       !! @defgroup PIO_write_darray PIO_write_darray
       !! @brief The overloaded PIO_write_darray writes a distributed array to disk.
       !<
      @@ -63,7 +63,7 @@ module piodarray
         end interface
       
       
      -!> 
      +!>
       !! @defgroup PIO_read_darray PIO_read_darray
       !! @brief The overloaded PIO_read_darray function reads a distributed array from disk.
       !<
      @@ -85,7 +85,7 @@ module piodarray
         end interface
       
       #ifdef _COMPRESSION
      -  interface 
      +  interface
            subroutine WriteVDC2Var(iobuf, start, kount, iocomm, ts, lod, reflevel, iotasks, name ) bind(C)
              use, intrinsic :: iso_c_binding
              type(c_ptr), intent(in), value :: iobuf
      @@ -127,7 +127,7 @@ contains
         end subroutine pio_set_buffer_size_limit_i4
       
         subroutine pio_set_buffer_size_limit_i8(limit)
      -    integer(pio_offset), intent(in) :: limit 
      +    integer(pio_offset), intent(in) :: limit
       
           if(limit<0) then
              call piodie(__PIO_FILE__,__LINE__,' bad value to pio_set_buffer_size_limit')
      @@ -138,10 +138,10 @@ contains
       
       
       ! TYPE real,int,double
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_write_darray
      -!! @brief Writes a 1D array of type {TYPE}. 
      +!! @brief Writes a 1D array of type {TYPE}.
       !! @details
       !! @param File    \ref file_desc_t
       !! @param varDesc \ref var_desc_t
      @@ -149,7 +149,7 @@ contains
       !! @param array  : The data to be written
       !! @param iostat : The status returned from this routine (see \ref PIO_seterrorhandling for details)
       !! @param fillval : An optional fill value to fill holes in the data written
      -!<  
      +!<
         subroutine write_darray_1d_{TYPE} (File,varDesc,ioDesc, array, iostat, fillval)
           use pio_msg_mod, only : pio_msg_writedarray
           ! !DESCRIPTION:
      @@ -192,10 +192,10 @@ contains
              call mpi_bcast(vardesc%rec, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
              call mpi_bcast(vardesc%ndims, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
              call mpi_bcast(iodesc%async_id, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      -       itype = {MPITYPE}  
      +       itype = {MPITYPE}
              call mpi_bcast(itype, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
              if(debugasync) print *,__PIO_FILE__,__LINE__, {MPITYPE}
      -       
      +
              if(present(fillval)) then
                 hasfill = 1
                 call mpi_bcast(hasfill, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      @@ -231,15 +231,15 @@ contains
       #endif
       #endif
           end select
      -    
      +
         end subroutine write_darray_1d_{TYPE}
       
       ! TYPE real,int,double
       ! DIMS 2,3,4,5,6,7
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_write_darray
      -!! @brief Writes a {DIMS}D array of type {TYPE}. 
      +!! @brief Writes a {DIMS}D array of type {TYPE}.
       !! @details
       !! @param File @ref file_desc_t
       !! @param varDesc @ref var_desc_t
      @@ -247,7 +247,7 @@ contains
       !! @param array  : The data to be written
       !! @param iostat : The status returned from this routine (see \ref PIO_seterrorhandling for details)
       !! @param fillval : An optional fill value to fill holes in the data written
      -!<  
      +!<
         subroutine write_darray_{DIMS}d_{TYPE} (File,varDesc,ioDesc, array, iostat, fillval)
           ! !INPUT PARAMETERS:
       
      @@ -271,7 +271,7 @@ contains
       ! This code is required due to a bug in gfortran 4.7.2
       #if (__GFORTRAN__) &&  (__GNUC__ == 4) && (__GNUC_MINOR__ < 8)
           {VTYPE}, allocatable :: acopy(:)
      -    integer :: isize 
      +    integer :: isize
       
           isize= size(array)
           allocate(acopy(isize))
      @@ -296,7 +296,7 @@ contains
         end subroutine write_darray_{DIMS}d_{TYPE}
       
       ! TYPE real,int,double
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_read_darray
       !! @brief
      @@ -332,12 +332,12 @@ contains
           integer(i4), intent(out) :: iostat
       
           character(len=*), parameter :: subName=modName//'::read_darray_{TYPE}'
      -	
      +
           type(iosystem_desc_t), pointer :: ios
           integer :: ierr, msg, itype
       
       
      -    array = 0	
      +    array = 0
           ios => File%iosystem
       
           if(ios%async_interface .and. .not. ios%ioproc) then
      @@ -351,7 +351,7 @@ contains
              call mpi_bcast(iodesc%async_id, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
              itype = {MPITYPE}
              call mpi_bcast(itype, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
      -       if(DebugAsync) print *,__PIO_FILE__,__LINE__, {MPITYPE}       
      +       if(DebugAsync) print *,__PIO_FILE__,__LINE__, {MPITYPE}
           endif
       
           select case(File%iotype)
      @@ -370,18 +370,18 @@ contains
           end select
       
         end subroutine read_darray_1d_{TYPE}
      - 
      +
       ! TYPE real,int,double
       ! DIMS 2,3,4,5,6,7
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_read_darray
      -!! @brief Reads a {DIMS}D array of type {TYPE}. 
      +!! @brief Reads a {DIMS}D array of type {TYPE}.
       !! @details
       !! @param File @ref file_desc_t
       !! @param varDesc @ref var_desc_t
       !! @param ioDesc @ref io_desc_t
      -!! @param array  : The read data  
      +!! @param array  : The read data
       !! @param iostat : The status returned from this routine (see \ref PIO_seterrorhandling for details)
       !<
         subroutine read_darray_{DIMS}d_{TYPE} (File,varDesc,ioDesc, array, iostat)
      @@ -412,7 +412,7 @@ contains
       ! TYPE real,int,double
       !>
       !! @private
      -!! @brief Write a 1D array of type {TYPE} defined by varDesc using the decomposition described in iodesc to the netcdf or pnetcdf file File. 
      +!! @brief Write a 1D array of type {TYPE} defined by varDesc using the decomposition described in iodesc to the netcdf or pnetcdf file File.
       !! @details
       !! @param File @ref file_desc_t
       !! @param varDesc @ref var_desc_t
      @@ -489,7 +489,7 @@ contains
       
       
           ! ---------------------------------------------------------
      -    ! pull information out of the decomposition data structure 
      +    ! pull information out of the decomposition data structure
           ! ---------------------------------------------------------
           len        = iodesc%IOmap%length
       
      @@ -505,8 +505,8 @@ contains
           call t_startf("PIO:pio_rearrange_write")
           call t_startf("PIO:pre_pio_write_nf")
       #endif
      -    if(UseRearranger) then 
      -       if (IOproc) then 
      +    if(UseRearranger) then
      +       if (IOproc) then
                 if(Debug) print *, subName,': IAM: ',File%iosystem%comp_rank, &
                      'Before call to allocate(IOBUF): ',len, iodesc%write%n_elemtype
       
      @@ -541,7 +541,7 @@ contains
              call alloc_check(array2,size(array),'array2')
       
              call rearrange_io2comp(File%iosystem,iodesc,IOBUF,array2)
      -	
      +
              do i=1,size(array)
                 if (array(i) /= array2(i)) then
                    print *, subName,': error: write ping-pong test failed on index',i
      @@ -565,7 +565,7 @@ contains
              else
                 iobuf=>array
              end if
      -    endif   ! if(UseRearranger) 
      +    endif   ! if(UseRearranger)
       #ifdef TIMING
           call t_stopf("PIO:pio_rearrange_write")
       #endif
      @@ -593,7 +593,7 @@ contains
                    ndims = ndims+1
                    call alloc_check(start,ndims)
                    call alloc_check(count,ndims)
      -             
      +
                    start(1:ndims-1)=iodesc%start
                    count(1:ndims-1)=iodesc%count
                    start(ndims:ndims)=vardesc%rec
      @@ -632,7 +632,7 @@ contains
       
       
           else
      -       ! some compilers have problems passing 
      +       ! some compilers have problems passing
              ! unassociated pointers when they are intent in
              call alloc_check(start, 0)
              call alloc_check(count, 0)
      @@ -642,7 +642,7 @@ contains
           call t_stopf("PIO:pre_pio_write_nf")
           call t_startf("PIO:pio_write_nf")
       #endif
      -    ierr = write_nf(File,IOBUF,varDesc,iodesc,start,count, request) 
      +    ierr = write_nf(File,IOBUF,varDesc,iodesc,start,count, request)
       #ifdef TIMING
           call t_stopf("PIO:pio_write_nf")
       #endif
      @@ -688,7 +688,7 @@ contains
       !! @param array  : The data to be written
       !! @param iostat : The status returned from this routine (see \ref PIO_seterrorhandling for details)
       !! @param fillval : An optional fill value to fill holes in the data written
      -!<  
      +!<
         subroutine write_darray_bin_{TYPE}(File,varDesc,ioDesc,array, iostat, fillval)
       
           ! !DESCRIPTION:
      @@ -735,7 +735,7 @@ contains
       #endif
       
           logical (log_kind) :: IOproc     ! true if IO processor
      -    integer (i4) ::  len,           &! length of IO decomp segmap 
      +    integer (i4) ::  len,           &! length of IO decomp segmap
                iotype,        &! type of IO to perform
                varID           ! variable ID
           integer (i4) :: ierr
      @@ -759,7 +759,7 @@ contains
           len        = iodesc%IOmap%length
       
           ierr = pio_noerr
      -    if (IOproc) then       
      +    if (IOproc) then
              if(userearranger) then
                 call alloc_check(IOBUF,len,' TYPE :IOBUF')
       
      @@ -772,7 +772,7 @@ contains
                 iobuf=>array
              end if
              !------------------------------------------------
      -       !  set the IO buffer to a particular test pattern 
      +       !  set the IO buffer to a particular test pattern
              !------------------------------------------------
              !JMD	IOBUF(:) = File%iosystem%io_rank
              if(Debug) print *, subName,': {comp,io}_rank: ',File%iosystem%comp_rank,File%iosystem%io_rank,  &
      @@ -784,18 +784,18 @@ contains
           !-----------------------------------------
           !NEED HELP:
           !
      -    !  Need a call to a data rearranger here 
      +    !  Need a call to a data rearranger here
           !
      -    !        call ESMF_rearrange() 
      -    !  
      -    !              or 
      +    !        call ESMF_rearrange()
      +    !
      +    !              or
           !
           !        call MCT_rearrange()
           !-----------------------------------------
       #ifdef TIMING
           call t_startf("PIO:pio_rearrange_write")
       #endif
      -    if(UseRearranger) then 
      +    if(UseRearranger) then
              !------------------------------------
              ! Rearrange data from comp->io decomp
              !------------------------------------
      @@ -830,7 +830,7 @@ contains
           call t_stopf("PIO:pio_rearrange_write")
       #endif
       
      -    if(IOProc) then 
      +    if(IOProc) then
       #ifdef TIMING
           call t_startf("PIO:pio_write_bin")
       #endif
      @@ -863,10 +863,10 @@ contains
       
       
       ! TYPE real,int,double
      -!> 
      +!>
       !! @private
       !! @brief Read a 1D array of type {TYPE} defined by varDesc using the decomposition
      -!! described in ioDesc to the netcdf or pnetcdf file File. 
      +!! described in ioDesc to the netcdf or pnetcdf file File.
       !! @details
       !! @param File @ref file_desc_t
       !! @param varDesc @ref var_desc_t
      @@ -911,7 +911,7 @@ contains
                IOBUF                ! local IO buffer
       
           logical (log_kind) :: IOproc     ! true if an IO processor
      -    integer (i4) ::  len,           &! local length of IO decomp 
      +    integer (i4) ::  len,           &! local length of IO decomp
                iotype,        &! type of IO to perform
                ndims
           integer(pio_offset), dimension(PIO_MAX_VAR_DIMS) :: start, count
      @@ -954,11 +954,11 @@ contains
              endif
       
              !-----------------------------
      -       ! allocate temporary IO buffer 
      +       ! allocate temporary IO buffer
              !-----------------------------
              if(userearranger) then
                 if((File%iotype == pio_iotype_netcdf .or. File%iotype == pio_iotype_netcdf4c) &
      -               .and. file%iosystem%io_rank==0) then	
      +               .and. file%iosystem%io_rank==0) then
                    call alloc_check(IOBUF,iodesc%maxiobuflen,' TYPE :IOBUF')
                 else
                    call alloc_check(IOBUF,len,' TYPE :IOBUF')
      @@ -990,8 +990,8 @@ contains
                 start(1:ndims)=iodesc%start
                 count(1:ndims)=iodesc%count
              end if
      -    else 
      -       ndims=1	
      +    else
      +       ndims=1
              if(userearranger) then
                 call alloc_check(IOBUF,0,'IOBUF')
              end if
      @@ -1013,13 +1013,13 @@ contains
       #ifdef TIMING
           call t_startf("PIO:pio_rearrange_read")
       #endif
      -    if(UseRearranger) then 
      +    if(UseRearranger) then
              !------------------------------------
              ! Rearrange data from io->comp decomp
              !------------------------------------
       
              ! "array" is comp data
      -       call rearrange_io2comp(File%iosystem,iodesc,IOBUF,array) 
      +       call rearrange_io2comp(File%iosystem,iodesc,IOBUF,array)
       
       #if DEBUG_REARR
              call alloc_check(iobuf2,size(IOBUF),'iobuf2')
      @@ -1040,7 +1040,7 @@ contains
       !!!!!!! end debug
       #endif
              ! --------------------------
      -       ! deallocate IO buffer 
      +       ! deallocate IO buffer
              ! --------------------------
              call dealloc_check(IOBUF)
       
      @@ -1062,10 +1062,10 @@ contains
         end subroutine read_darray_nf_{TYPE}
       
       ! TYPE real,int,double
      -!> 
      +!>
       !! @private
      -!! @brief  Read an array of type {TYPE} defined by varDesc using the decomposition 
      -!!  described in ioDesc to the netcdf or pnetcdf file File. 
      +!! @brief  Read an array of type {TYPE} defined by varDesc using the decomposition
      +!!  described in ioDesc to the netcdf or pnetcdf file File.
       !! @details
       !! @param File @ref file_desc_t
       !! @param varDesc @ref var_desc_t
      @@ -1110,7 +1110,7 @@ contains
                IOBUF                ! local IO buffer
       
           logical (log_kind) :: IOproc     ! true if an IO processor
      -    integer (i4) ::  len,           &! local length of IO decomp 
      +    integer (i4) ::  len,           &! local length of IO decomp
                iotype          ! type of IO to perform
       
       
      @@ -1142,13 +1142,13 @@ contains
           ! -----------------------------------------------------
       
           !    len    = iodesc%IOmap%length
      -    len    = iodesc%Read%n_words 
      +    len    = iodesc%Read%n_words
           ierr = pio_noerr
       
           if (IOproc) then
       
              !-----------------------------
      -       ! allocate temporary IO buffer 
      +       ! allocate temporary IO buffer
              !-----------------------------
              if(userearranger) then
                 call alloc_check(IOBUF,len,'read_darray_ :IOBUF')
      @@ -1181,13 +1181,13 @@ contains
       #ifdef TIMING
           call t_startf("PIO:pio_rearrange_read")
       #endif
      -    if(UseRearranger) then 
      +    if(UseRearranger) then
              !------------------------------------
              ! Rearrange data from io->comp decomp
              !------------------------------------
       
              ! "array" is comp data
      -       call rearrange_io2comp(File%iosystem,iodesc,IOBUF,array) 
      +       call rearrange_io2comp(File%iosystem,iodesc,IOBUF,array)
       
       
       #if DEBUG_REARR
      @@ -1210,7 +1210,7 @@ contains
       !!!!!!! end debug
       #endif
              ! --------------------------
      -       ! deallocate IO buffer 
      +       ! deallocate IO buffer
              ! --------------------------
              call dealloc_check(IOBUF)
           endif
      @@ -1230,7 +1230,7 @@ contains
       
         end subroutine read_darray_bin_{TYPE}
       
      -  ! TYPE real,int,double  
      +  ! TYPE real,int,double
         subroutine add_data_to_buffer_{TYPE} (File, IOBUF, request)
           use pio_types, only : io_data_list
           type(file_desc_t) :: File
      @@ -1247,7 +1247,7 @@ contains
              do while(associated(ptr%next))
                 ptr => ptr%next
              end do
      -       
      +
              allocate(ptr%next)
              ptr=>ptr%next
              nullify(ptr%next)
      @@ -1269,7 +1269,7 @@ contains
              call darray_write_complete(File)
           endif
       
      -!    if(debug) 
      +!    if(debug)
       
         end subroutine add_data_to_buffer_{TYPE}
       
      @@ -1279,7 +1279,7 @@ contains
           use pio_types, only : io_data_list
       #ifdef _PNETCDF
       #ifndef USE_PNETCDF_MOD
      -#   include    
      +#   include 
       #endif
       #endif
       
      @@ -1290,7 +1290,7 @@ contains
       
           if(associated(file%data_list_top)) then
       
      -       cnt=1 
      +       cnt=1
              ptr=>file%data_list_top
              do while(associated(ptr))
                 cnt=cnt+1
      @@ -1298,7 +1298,7 @@ contains
              end do
              allocate(array_of_requests(cnt), status(cnt))
              ptr=>file%data_list_top
      -       cnt=1 
      +       cnt=1
              do while(associated(ptr))
                 array_of_requests(cnt)=ptr%request
                 cnt=cnt+1
      @@ -1331,7 +1331,7 @@ contains
              deallocate(array_of_requests)
              deallocate(status)
           end if
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1339,7 +1339,7 @@ contains
           end if
       #endif
         end subroutine darray_write_complete
      -    
      +
       
       #ifdef _COMPRESSION
       
      @@ -1392,7 +1392,7 @@ contains
           iotype     = File%iotype
           UseRearranger  = File%iosystem%UseRearranger
       
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1400,7 +1400,7 @@ contains
           end if
       #endif
       
      -    ! pull information out of the decomposition data structure 
      +    ! pull information out of the decomposition data structure
           len        = iodesc%IOmap%length
           ndims      = size(iodesc%start)
           call alloc_check(start,ndims)
      @@ -1410,8 +1410,8 @@ contains
       
       
       
      -    if(UseRearranger) then 
      -       if (IOproc) then 
      +    if(UseRearranger) then
      +       if (IOproc) then
       
                 if(Debug) print *, 'write_vdc2_real: IAM: ',File%iosystem%comp_rank,'Before call to allocate(IOBUF): ',len
                 call alloc_check(IOBUF,len,' TYPE :IOBUF')
      @@ -1433,7 +1433,7 @@ contains
              !--------------------------------------------
           else
              iobuf=>array
      -    endif   ! if(UseRearranger) 
      +    endif   ! if(UseRearranger)
       
       
           if (IOproc) then
      @@ -1446,7 +1446,7 @@ contains
           if(UseRearranger) call dealloc_check(IOBUF)
       
       
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1503,7 +1503,7 @@ subroutine read_vdc2_real(File, Vardesc, iodesc, array, iostat)
           iotype     = File%iotype
           UseRearranger  = File%iosystem%UseRearranger
       
      -    ! pull information out of the decomposition data structure 
      +    ! pull information out of the decomposition data structure
           len        = iodesc%IOmap%length
           ndims      = size(iodesc%start)
           call alloc_check(start,ndims)
      @@ -1511,8 +1511,8 @@ subroutine read_vdc2_real(File, Vardesc, iodesc, array, iostat)
           start      = iodesc%start
           count      = iodesc%count
       
      -    if(UseRearranger) then 
      -       if (IOproc) then 
      +    if(UseRearranger) then
      +       if (IOproc) then
       
                 if(Debug) print *, 'read_vdc2_real: IAM: ',File%iosystem%comp_rank,'Before call to allocate(IOBUF): ',len
                 call alloc_check(IOBUF,len,' TYPE :IOBUF')
      @@ -1536,7 +1536,7 @@ subroutine read_vdc2_real(File, Vardesc, iodesc, array, iostat)
              !--------------------------------------------
           else
              iobuf=>array
      -    endif   ! if(UseRearranger) 
      +    endif   ! if(UseRearranger)
       
           if(UseRearranger) call dealloc_check(IOBUF)
       
      diff --git a/pio/piolib_mod.F90 b/pio/piolib_mod.F90
      index 5d9a44aa576..46a8738b366 100644
      --- a/pio/piolib_mod.F90
      +++ b/pio/piolib_mod.F90
      @@ -12,9 +12,9 @@
       
       #include "rearr_options.h"
       !>
      -!! @file 
      +!! @file
       !! @brief Initialization Routines for PIO
      -!! 
      +!!
       !! $Revision$
       !! $LastChangedDate$
       !<
      @@ -38,7 +38,7 @@ module piolib_mod
           use piovdc
           use C_interface_mod, only : F_C_STRING_DUP
       #endif
      -  use pio_mpi_utils, only : PIO_type_to_mpi_type 
      +  use pio_mpi_utils, only : PIO_type_to_mpi_type
         use iompi_mod
         use rearrange
       #ifdef TIMING
      @@ -79,10 +79,10 @@ module piolib_mod
              PIO_setnum_OST,    &
              PIO_FILE_IS_OPEN,  &
              pio_iotask_rank
      - 
      +
       #ifdef MEMCHK
      -!> this is an internal variable for memory leak debugging 
      -!! it is used when macro memchk is defined and it causes each task to print the 
      +!> this is an internal variable for memory leak debugging
      +!! it is used when macro memchk is defined and it causes each task to print the
       !! memory resident set size anytime it changes within pio.
       !<
         integer :: lastrss=0
      @@ -95,28 +95,28 @@ module piolib_mod
         !  module variables
         !
         !-----------------------------------------------------------------------
      -!> 
      +!>
       !! @defgroup PIO_openfile PIO_openfile
      -!< 
      +!<
         interface PIO_openfile
            module procedure PIO_openfile
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_syncfile PIO_syncfile
       !<
         interface PIO_syncfile
            module procedure syncfile
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_createfile PIO_createfile
       !<
         interface PIO_createfile
            module procedure createfile
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_setframe PIO_setframe
       !! @brief sets the unlimited dimension for netcdf file for record number for binary files
       !<
      @@ -125,14 +125,14 @@ module piolib_mod
            module procedure setframe_pio2
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_advanceframe PIO_advanceframe
       !<
         interface PIO_advanceframe
            module procedure advanceframe
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_closefile PIO_closefile
       !<
         interface PIO_closefile
      @@ -140,7 +140,7 @@ module piolib_mod
         end interface
       
       
      -!> 
      +!>
       !! @defgroup PIO_freedecomp PIO_freedecomp
       !! free memory associated with a io descriptor
       !<
      @@ -149,17 +149,17 @@ module piolib_mod
            module procedure freedecomp_file
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_init PIO_init
       !! initializes the pio subsystem
       !<
         interface PIO_init
            module procedure init_intracom
            module procedure init_intercom
      -     
      +
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_finalize PIO_finalize
       !! Shuts down and cleans up any memory associated with the pio library.
       !<
      @@ -176,7 +176,7 @@ module piolib_mod
         interface PIO_initdecomp
            module procedure PIO_initdecomp_dof_i4  ! previous name: initdecomop_1dof_nf_box
            module procedure PIO_initdecomp_dof_i8  ! previous name: initdecomop_1dof_nf_box
      -     module procedure PIO_initdecomp_dof_i8_vdc 
      +     module procedure PIO_initdecomp_dof_i8_vdc
            module procedure initdecomp_1dof_nf_i4
            module procedure initdecomp_1dof_nf_i8
            module procedure initdecomp_1dof_bin_i4
      @@ -189,7 +189,7 @@ module piolib_mod
            module procedure PIO_initdecomp_dof_dof
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_dupiodesc PIO_dupiodesc
       !! duplicates an eisting io descriptor
       !<
      @@ -197,15 +197,15 @@ module piolib_mod
            module procedure dupiodesc
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_setiotype PIO_setiotype
       !!  sets the io type used by pio
       !<
      -  interface PIO_setiotype 
      +  interface PIO_setiotype
            module procedure setiotype
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_numtoread PIO_numtoread
       !! returns the total number of words to read
       !<
      @@ -213,7 +213,7 @@ module piolib_mod
            module procedure numtoread
         end interface
       
      -!> 
      +!>
       !! @defgroup PIO_numtowrite PIO_numtowrite
       !! returns the total number of words to write
       !<
      @@ -222,17 +222,17 @@ module piolib_mod
         end interface
       
       
      -!> 
      +!>
       !! @defgroup PIO_getnumiotasks PIO_getnumiotasks
      -!!  returns the actual number of IO-tasks used.  PIO 
      -!!  will reset the total number of IO-tasks if certain 
      +!!  returns the actual number of IO-tasks used.  PIO
      +!!  will reset the total number of IO-tasks if certain
       !!  conditions are meet
       !<
         interface PIO_getnumiotasks
            module procedure getnumiotasks
         end interface
       
      -!> 
      +!>
       !!  @defgroup PIO_setdebuglevel PIO_setdebuglevel
       !!  sets the level of debug information that pio will generate.
       !<
      @@ -240,7 +240,7 @@ module piolib_mod
            module procedure setdebuglevel
         end interface
       
      -!> 
      +!>
       !!  @defgroup PIO_seterrorhandling PIO_seterrorhandling
       !!  sets the form of error handling for pio.
       !!
      @@ -275,8 +275,8 @@ end subroutine createvdf
       #endif
       
       contains
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_file_is_open
       !! @brief This logical function indicates if a file is open.
       !! @details
      @@ -288,36 +288,36 @@ logical function PIO_FILE_IS_OPEN(File)
         end function PIO_FILE_IS_OPEN
       
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_get_local_array_size
       !! @brief This function returns the expected local size of an array associated with iodesc
       !! @details
      -!! @param iodesc 
      +!! @param iodesc
       !! @copydoc io_desc_t
       !<
         integer function PIO_get_local_array_size(iodesc)
      -    type(io_desc_t), intent(in) :: iodesc   
      +    type(io_desc_t), intent(in) :: iodesc
           PIO_get_local_array_size = iodesc%compsize
         end function PIO_get_local_array_size
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_advanceframe
      -!! @brief advances the record dimension of a variable in a netcdf format file 
      +!! @brief advances the record dimension of a variable in a netcdf format file
       !!  or the block address in a binary file
       !! @details
      -!! @param[in,out] vardesc @copybrief var_desc_t 
      +!! @param[in,out] vardesc @copybrief var_desc_t
       !<
         subroutine advanceframe(vardesc)
           type(var_desc_t), intent(inout) :: vardesc
           vardesc%rec=vardesc%rec+1
         end subroutine advanceframe
       
      -!> 
      -!! @public 
      -!! @ingroup PIO_setframe 
      -!! @brief sets the record dimension of a variable in a netcdf format file 
      +!>
      +!! @public
      +!! @ingroup PIO_setframe
      +!! @brief sets the record dimension of a variable in a netcdf format file
       !! or the block address in a binary file
       !! @details
       !! @param vardesc @copydoc var_desc_t
      @@ -336,15 +336,15 @@ subroutine setframe_pio2(pioid,vardesc,frame)
           call setframe(vardesc,frame)
         end subroutine setframe_pio2
       
      -!>  
      +!>
       !! @public
       !! @ingroup PIO_setdebuglevel
      -!! @brief sets the level of debug information output to stdout by pio 
      +!! @brief sets the level of debug information output to stdout by pio
       !! @details
       !! @param level : default value is 0, allowed values 0-3
       !<
         subroutine setdebuglevel(level)
      -    integer(i4), intent(in) :: level	
      +    integer(i4), intent(in) :: level
           if(level.eq.0) then
              debug=.false.
              debugio=.false.
      @@ -373,7 +373,7 @@ subroutine setdebuglevel(level)
              debug=.true.
              debugio=.true.
              debugasync=.true.
      -    
      +
           end if
         end subroutine setdebuglevel
       
      @@ -395,7 +395,7 @@ subroutine seterrorhandlingf(file, method,oldmethod)
         end subroutine seterrorhandlingf
       
       !>
      -!! @ingroup PIO_seterrorhandling 
      +!! @ingroup PIO_seterrorhandling
       !! @public
       !! @brief set the pio error handling method for the iosystem
       !! @param iosystem : a defined pio system descriptor, see PIO_types
      @@ -426,16 +426,16 @@ subroutine seterrorhandlingi(ios, method,oldmethod)
           end if
         end subroutine seterrorhandlingi
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_initdecomp
       !! @brief Implements the @ref decomp_bc for PIO_initdecomp
      -!! @details  This provides the ability to describe a computational 
      -!! decomposition in PIO that has a block-cyclic form.  That is 
      +!! @details  This provides the ability to describe a computational
      +!! decomposition in PIO that has a block-cyclic form.  That is
       !! something that can be described using start and count arrays.
       !! Optional parameters for this subroutine allows for the specification
       !! of io decomposition using iostart and iocount arrays.  If iostart
      -!! and iocount arrays are not specified by the user, and rearrangement 
      +!! and iocount arrays are not specified by the user, and rearrangement
       !! is turned on then PIO will calculate a suitable IO decomposition
       !! @param iosystem @copydoc iosystem_desc_t
       !! @param basepiotype @copydoc use_PIO_kinds
      @@ -450,11 +450,11 @@ subroutine PIO_initdecomp_bc(iosystem,basepiotype,dims,compstart,compcount,iodes
           type (iosystem_desc_t), intent(inout) :: iosystem
           integer(i4), intent(in)               :: basepiotype
           integer(i4), intent(in)               :: dims(:)
      -    integer (kind=PIO_OFFSET)             :: compstart(:)  
      -    integer (kind=PIO_OFFSET)             :: compcount(:)    
      +    integer (kind=PIO_OFFSET)             :: compstart(:)
      +    integer (kind=PIO_OFFSET)             :: compcount(:)
           type (IO_desc_t), intent(out)         :: iodesc
      -    integer (kind=PIO_OFFSET),optional    :: iostart(:)  
      -    integer (kind=PIO_OFFSET),optional    :: iocount(:)    
      +    integer (kind=PIO_OFFSET),optional    :: iostart(:)
      +    integer (kind=PIO_OFFSET),optional    :: iocount(:)
       
       !    character(len=*), parameter :: '::PIO_initdecomp_bc'
       
      @@ -467,12 +467,12 @@ end subroutine PIO_initdecomp_bc
       !! @ingroup PIO_initdecomp
       !! @brief Implements the @ref decomp_dof for PIO_initdecomp
       !! @details  This provides the ability to describe a computational
      -!! decomposition in PIO using degrees of freedom method. This is  
      -!! a decomposition that can not be easily described using a start  
      -!! and count metehod (see @ref decomp_dof).  This subroutine also 
      -!! requires the user to specify the IO decomposition using the 
      -!! degree of freedom method.  This version of the subroutine 
      -!! is most suitable for those who want complete control over 
      +!! decomposition in PIO using degrees of freedom method. This is
      +!! a decomposition that can not be easily described using a start
      +!! and count metehod (see @ref decomp_dof).  This subroutine also
      +!! requires the user to specify the IO decomposition using the
      +!! degree of freedom method.  This version of the subroutine
      +!! is most suitable for those who want complete control over
       !! the actions of PIO.
       !! @param iosystem @copydoc iosystem_desc_t
       !! @param basepiotype @copydoc use_PIO_kinds
      @@ -495,14 +495,14 @@ subroutine PIO_initdecomp_dof_dof(iosystem,basepiotype,dims,compdof,iodesc,iodof
       
         end subroutine PIO_initdecomp_dof_dof
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_initdecomp
       !! @brief A deprecated interface to the PIO_initdecomp method.
       !! @details
       !! @deprecated
       !! @param iosystem : a defined pio system descriptor, see PIO_types
      -!! @param basepiotype : the type of variable(s) associated with this iodesc.  
      +!! @param basepiotype : the type of variable(s) associated with this iodesc.
       !! @copydoc PIO_kinds
       !! @param dims : an array of the global length of each dimesion of the variable(s)
       !! @param lenblocks :
      @@ -519,8 +519,8 @@ subroutine initdecomp_2dof_bin_i4(iosystem,basepiotype,dims,lenblocks,compdof,io
           integer(i4), intent(in)           :: dims(:)
           integer (i4), intent(in)          :: lenblocks
           integer (i4), intent(in)          :: compdof(:)   !> global degrees of freedom for computational decomposition
      -    integer (i4), intent(in)          :: iodofr(:)     !> global degrees of freedom for io decomposition 
      -    integer (i4), intent(in)          :: iodofw(:)     !> global degrees of freedom for io decomposition 
      +    integer (i4), intent(in)          :: iodofr(:)     !> global degrees of freedom for io decomposition
      +    integer (i4), intent(in)          :: iodofw(:)     !> global degrees of freedom for io decomposition
           type (io_desc_t), intent(inout)     :: iodesc
       
       
      @@ -537,8 +537,8 @@ subroutine initdecomp_2dof_bin_i8(iosystem,basepiotype,dims,lenblocks,compdof,io
           integer(i4), intent(in)           :: dims(:)
           integer (i4), intent(in)          :: lenblocks
           integer (kind=pio_offset), intent(in)          :: compdof(:)   !> global degrees of freedom for computational decomposition
      -    integer (kind=pio_offset), intent(in)          :: iodofr(:)     !> global degrees of freedom for io decomposition 
      -    integer (kind=pio_offset), intent(in)          :: iodofw(:)     !> global degrees of freedom for io decomposition 
      +    integer (kind=pio_offset), intent(in)          :: iodofr(:)     !> global degrees of freedom for io decomposition
      +    integer (kind=pio_offset), intent(in)          :: iodofw(:)     !> global degrees of freedom for io decomposition
           type (io_desc_t), intent(inout)     :: iodesc
       
           integer(kind=PIO_offset) :: start(1), count(1)
      @@ -573,7 +573,7 @@ subroutine initdecomp_2dof_bin_i8(iosystem,basepiotype,dims,lenblocks,compdof,io
           glength= product(int(dims,kind=PIO_OFFSET))
           if(glength > int(huge(i),kind=pio_offset)) then
              call piodie( __PIO_FILE__,__LINE__, &
      -            'requested array size too large for this interface ')       
      +            'requested array size too large for this interface ')
           endif
       
       
      @@ -581,7 +581,7 @@ subroutine initdecomp_2dof_bin_i8(iosystem,basepiotype,dims,lenblocks,compdof,io
           lengthr = size(iodofr);
           lengthw = size(iodofw)
           if(lenblocks>0) then
      -       ndispw=size(iodofw)/lenblocks 
      +       ndispw=size(iodofw)/lenblocks
              ndispr=size(iodofr)/lenblocks
           else
              ndispw=0
      @@ -633,19 +633,19 @@ subroutine initdecomp_2dof_bin_i8(iosystem,basepiotype,dims,lenblocks,compdof,io
         end subroutine initdecomp_2dof_bin_i8
       
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_initdecomp
       !! @brief A deprecated interface to the PIO_initdecomp method.
       !! @details
       !! @deprecated
       !! @param iosystem : a defined pio system descriptor, see PIO_types
      -!! @param basepiotype : the type of variable(s) associated with this iodesc.  
      +!! @param basepiotype : the type of variable(s) associated with this iodesc.
       !! @copydoc PIO_kinds
       !! @param dims : an array of the global length of each dimesion of the variable(s)
      -!! @param lenblocks : 
      +!! @param lenblocks :
       !! @param compdof : mapping of the storage order of the variable to its memory order
      -!! @param iodofr : 
      +!! @param iodofr :
       !! @param iodesc @copydoc iodesc_generate
       !<
         subroutine initdecomp_1dof_bin_i8(iosystem,basepiotype,dims,lenblocks,compdof,iodofr,iodesc)
      @@ -654,7 +654,7 @@ subroutine initdecomp_1dof_bin_i8(iosystem,basepiotype,dims,lenblocks,compdof,io
           integer(i4), intent(in)           :: dims(:)
           integer(i4), intent(in)          :: lenblocks
           integer(kind=pio_offset), intent(in)          :: compdof(:)   ! global degrees of freedom for computational decomposition
      -    integer(kind=pio_offset), intent(in)          :: iodofr(:)     ! global degrees of freedom for io decomposition 
      +    integer(kind=pio_offset), intent(in)          :: iodofr(:)     ! global degrees of freedom for io decomposition
           type (io_desc_t), intent(inout)     :: iodesc
       
           integer(kind=PIO_offset) :: start(1), count(1)
      @@ -671,7 +671,7 @@ subroutine initdecomp_1dof_bin_i4(iosystem,basepiotype,dims,lenblocks,compdof,io
           integer(i4), intent(in)           :: dims(:)
           integer (i4), intent(in)          :: lenblocks
           integer (i4), intent(in)          :: compdof(:)   ! global degrees of freedom for computational decomposition
      -    integer (i4), intent(in)          :: iodofr(:)     ! global degrees of freedom for io decomposition 
      +    integer (i4), intent(in)          :: iodofr(:)     ! global degrees of freedom for io decomposition
           type (io_desc_t), intent(inout)     :: iodesc
       
           integer(kind=PIO_offset) :: start(1), count(1)
      @@ -683,8 +683,8 @@ subroutine initdecomp_1dof_bin_i4(iosystem,basepiotype,dims,lenblocks,compdof,io
                int(compdof,kind=PIO_OFFSET),int(iodofr,kind=PIO_OFFSET),start, count, iodesc)
         end subroutine initdecomp_1dof_bin_i4
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_initdecomp
       !! @brief A deprecated interface to the PIO_initdecomp method.
       !! @details
      @@ -693,12 +693,12 @@ end subroutine initdecomp_1dof_bin_i4
       !! @param basepiotype : the type of variable(s) associated with this iodesc.
       !! @copydoc PIO_kinds
       !! @param dims : an array of the global length of each dimesion of the variable(s)
      -!! @param lenblocks : 
      +!! @param lenblocks :
       !! @param compdof : mapping of the storage order of the variable to its memory order
      -!! @param iodofr : 
      +!! @param iodofr :
       !! @param iodofw :
       !! @param start : used with count to give a block description of the shape of the data
      -!! @param count : 
      +!! @param count :
       !! @param iodesc @copydoc iodesc_generate
       !<
         subroutine initdecomp_2dof_nf_i4(iosystem,basepiotype,dims,lenblocks,compdof,iodofr,iodofw,start, count, iodesc)
      @@ -707,8 +707,8 @@ subroutine initdecomp_2dof_nf_i4(iosystem,basepiotype,dims,lenblocks,compdof,iod
           integer(i4), intent(in)           :: dims(:)
           integer (i4), intent(in)          :: lenblocks
           integer (i4), intent(in)          :: compdof(:)   ! global degrees of freedom for computational decomposition
      -    integer (i4), intent(in)          :: iodofr(:)     ! global degrees of freedom for io decomposition 
      -    integer (i4), intent(in)          :: iodofw(:)     ! global degrees of freedom for io decomposition 
      +    integer (i4), intent(in)          :: iodofr(:)     ! global degrees of freedom for io decomposition
      +    integer (i4), intent(in)          :: iodofw(:)     ! global degrees of freedom for io decomposition
       
           type (io_desc_t), intent(inout)     :: iodesc
       
      @@ -727,8 +727,8 @@ subroutine initdecomp_2dof_nf_i8(iosystem,basepiotype,dims,lenblocks,compdof,iod
           integer(i4), intent(in)           :: dims(:)
           integer (i4), intent(in)          :: lenblocks
           integer (kind=pio_offset), intent(in)          :: compdof(:)   ! global degrees of freedom for computational decomposition
      -    integer (kind=pio_offset), intent(in)          :: iodofr(:)     ! global degrees of freedom for io decomposition 
      -    integer (kind=pio_offset), intent(in)          :: iodofw(:)     ! global degrees of freedom for io decomposition 
      +    integer (kind=pio_offset), intent(in)          :: iodofr(:)     ! global degrees of freedom for io decomposition
      +    integer (kind=pio_offset), intent(in)          :: iodofw(:)     ! global degrees of freedom for io decomposition
       
           type (io_desc_t), intent(inout)     :: iodesc
       
      @@ -744,26 +744,26 @@ subroutine initdecomp_2dof_nf_i8(iosystem,basepiotype,dims,lenblocks,compdof,iod
       
           if(debug) then
              print *, __PIO_FILE__,__LINE__,iodesc%read%filetype,iodesc%read%elemtype,&
      -            iodesc%read%n_elemtype,iodesc%read%n_words   
      +            iodesc%read%n_elemtype,iodesc%read%n_words
              print *, __PIO_FILE__,__LINE__,iodesc%write%filetype,iodesc%write%elemtype,&
                   iodesc%write%n_elemtype,iodesc%write%n_words
           end if
       
         end subroutine initdecomp_2dof_nf_i8
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_initdecomp
       !! @brief A deprecated interface to the PIO_initdecomp method.
       !! @details
       !! @deprecated
       !! @param iosystem : a defined PIO system descriptor, see pio_types
      -!! @param basepiotype : The type of variable(s) associated with this iodesc.  
      +!! @param basepiotype : The type of variable(s) associated with this iodesc.
       !! @copydoc PIO_kinds
       !! @param dims : an array of the global length of each dimesion of the variable(s)
      -!! @param lenblocks : 
      +!! @param lenblocks :
       !! @param compdof : mapping of the storage order of the variable to its memory order
      -!! @param iodof : 
      +!! @param iodof :
       !! @param start :
       !! @param count :
       !! @param iodesc @copydoc iodesc_generate
      @@ -775,9 +775,9 @@ subroutine initdecomp_1dof_nf_i4(iosystem,basepiotype,dims,lenblocks,compdof,iod
           integer(i4), intent(in)           :: dims(:)
           integer (i4), intent(in) :: lenblocks
           integer (i4), intent(in)          :: compdof(:)   ! global degrees of freedom for computational decomposition
      -    integer (i4), intent(in)          :: iodof(:)     ! global degrees of freedom for io decomposition 
      +    integer (i4), intent(in)          :: iodof(:)     ! global degrees of freedom for io decomposition
           type (io_desc_t), intent(inout)     :: iodesc
      -    integer :: piotype	
      +    integer :: piotype
           integer(kind=PIO_offset), intent(in) :: start(:), count(:)
       
           call initdecomp_1dof_nf_i8(iosystem, basepiotype,dims,lenblocks,int(compdof,kind=pio_offset),int(iodof,kind=pio_offset),&
      @@ -791,7 +791,7 @@ subroutine initdecomp_1dof_nf_i8(iosystem,basepiotype,dims,lenblocks,compdof,iod
           integer(i4), intent(in)           :: dims(:)
           integer (i4), intent(in) :: lenblocks
           integer (kind=pio_offset), intent(in)          :: compdof(:)   ! global degrees of freedom for computational decomposition
      -    integer (kind=pio_offset), intent(in)          :: iodof(:)     ! global degrees of freedom for io decomposition 
      +    integer (kind=pio_offset), intent(in)          :: iodof(:)     ! global degrees of freedom for io decomposition
           type (io_desc_t), intent(inout)     :: iodesc
           integer :: piotype
           integer(kind=PIO_offset), intent(in) :: start(:), count(:)
      @@ -824,7 +824,7 @@ subroutine initdecomp_1dof_nf_i8(iosystem,basepiotype,dims,lenblocks,compdof,iod
       #ifdef TIMING
           call t_startf("PIO:PIO_initdecomp")
       #endif
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -843,7 +843,7 @@ subroutine initdecomp_1dof_nf_i8(iosystem,basepiotype,dims,lenblocks,compdof,iod
           if(glength > huge(ndisp)) then
              print *,__PIO_FILE__,__LINE__,dims,glength
              call piodie( __PIO_FILE__,__LINE__, &
      -            'requested array size too large for this interface ')       
      +            'requested array size too large for this interface ')
           endif
       
           if(lenblocks>0) then
      @@ -853,7 +853,7 @@ subroutine initdecomp_1dof_nf_i8(iosystem,basepiotype,dims,lenblocks,compdof,iod
           end if
           call alloc_check(displace,int(ndisp))
       
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -866,13 +866,13 @@ subroutine initdecomp_1dof_nf_i8(iosystem,basepiotype,dims,lenblocks,compdof,iod
           iodesc%start(1:size(start)) = start(:)
           iodesc%count(1:size(count)) = count(:)
           !--------------------------------------------
      -    ! calculate mpi data structure displacements 
      +    ! calculate mpi data structure displacements
           !--------------------------------------------
           if(lenblocks>0) then
              if(debug) print *,'PIO_initdecomp: calcdisplace',ndisp,size(iodof),lenblocks
              call calcdisplace(lenblocks,iodof,displace)
           end if
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -883,19 +883,19 @@ subroutine initdecomp_1dof_nf_i8(iosystem,basepiotype,dims,lenblocks,compdof,iod
           n_iotasks = iosystem%num_iotasks
           length = size(iodof)
           !
      -    !   this facilitates the use of seperate read and write descripters. 
      +    !   this facilitates the use of seperate read and write descripters.
           !
           iodesc%iomap%start  = iosystem%io_rank*length
           iodesc%iomap%length = length
           iodesc%glen = glength
       
           if(debug) print *,'iam: ',iosystem%io_rank,'initdecomp: userearranger: ',userearranger, glength
      -    if(userearranger) then 
      +    if(userearranger) then
                    call piodie( __PIO_FILE__,__LINE__, &
                         'this interface does not use rearranger')
      -       
      +
           endif
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -905,25 +905,25 @@ subroutine initdecomp_1dof_nf_i8(iosystem,basepiotype,dims,lenblocks,compdof,iod
       
       
           !---------------------------------------------
      -    !  the setup for the mpi-io type information 
      +    !  the setup for the mpi-io type information
           !---------------------------------------------
      -    if(iosystem%ioproc) then 
      +    if(iosystem%ioproc) then
              !-----------------------------------------------
      -       ! setup the data structure for the io operation 
      +       ! setup the data structure for the io operation
              !-----------------------------------------------
              iodesc%write%n_elemtype = ndisp
              iodesc%write%n_words    = iodesc%write%n_elemtype*lenblocks
       
              call genindexedblock(lenblocks,piotype,iodesc%write%elemtype,iodesc%write%filetype,int(displace))
       
      -       
      +
       !       call gensubarray(dims,piotype,iodesc,iodesc%write)
       
       
       
              if(debug) print *,'initdecomp: at the end of subroutine',iodesc%write%n_elemtype,iodesc%write%n_words
           endif
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -933,13 +933,13 @@ subroutine initdecomp_1dof_nf_i8(iosystem,basepiotype,dims,lenblocks,compdof,iod
           call dupiodesc2(iodesc%write,iodesc%read)
           if(debug) then
              print *, __PIO_FILE__,__LINE__,iodesc%read%filetype,iodesc%read%elemtype,&
      -            iodesc%read%n_elemtype,iodesc%read%n_words   
      +            iodesc%read%n_elemtype,iodesc%read%n_words
              print *, __PIO_FILE__,__LINE__,iodesc%write%filetype,iodesc%write%elemtype,&
                   iodesc%write%n_elemtype,iodesc%write%n_words
           end if
           call dealloc_check(displace)
       
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -985,7 +985,7 @@ subroutine PIO_initdecomp_dof_i4(iosystem,basepiotype,dims,compdof, iodesc, iost
           integer(i4), intent(in), optional:: num_ts, bsize(3)
           allocate(internal_compdof(size(compdof)))
           internal_compdof = int(compdof,kind=pio_offset)
      -    
      +
           call pio_initdecomp_dof_i8(iosystem, basepiotype, dims, internal_compdof, &
                iodesc, iostart, iocount,rearr)
       
      @@ -1049,7 +1049,7 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
              call mpi_bcast(dims, size(dims), mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
       
              if(DebugAsync) print*,__PIO_FILE__,__LINE__
      -       call mpi_bcast(iodesc%async_id, 1, mpi_integer, iosystem%iomaster, iosystem%intercomm, ierr)  
      +       call mpi_bcast(iodesc%async_id, 1, mpi_integer, iosystem%iomaster, iosystem%intercomm, ierr)
              if(DebugAsync) print*,__PIO_FILE__,__LINE__, iodesc%async_id
           endif
       
      @@ -1064,7 +1064,7 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
           if (iosystem%comp_rank == 0 .and.  present(rearr)) then
              print *,'WARNING: Rearr optional argument is a pio2 feature, ignored in pio1'
           endif
      -    
      +
       
       
           if(DebugAsync) print*,__PIO_FILE__,__LINE__
      @@ -1075,7 +1075,7 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
           ! (decompmap_t) to something basic for
           ! testing.
           !-------------------------------------------
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1092,21 +1092,21 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
           ! total global size
           !---------------------
           glength= product(int(dims,kind=PIO_OFFSET))
      -    if(glength > huge(int(i,kind=pio_offset))) then !not sure if this works, glength is pio_offset, if its > pio_offset range then 
      +    if(glength > huge(int(i,kind=pio_offset))) then !not sure if this works, glength is pio_offset, if its > pio_offset range then
              call piodie( __PIO_FILE__,__LINE__, & !it will simply wrap around rather than be > max_int(pio_offset)
                   'requested array size too large for this interface ') !might be better to use a temp 8 byte int to store results
      -                                                                  !of dims product and compare to the maxint(pio_offset)       
      +                                                                  !of dims product and compare to the maxint(pio_offset)
           endif
       
      -       
      +
       
           ! remember iocount() is only defined on io procs
           call alloc_check(iodesc%start,ndims)
           call alloc_check(iodesc%count,ndims)
           iodesc%basetype=piotype
      -       
      +
           iodesc%compsize=size(compdof)
      -       
      +
           iodesc%start=0
           iodesc%count=0
       
      @@ -1120,7 +1120,7 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
              else if(present(iostart) .or. present(iocount)) then
                 call piodie( __PIO_FILE__,__LINE__, &
                      'both optional parameters start and count must be provided')
      -       else	       
      +       else
                 call calcstartandcount(basepiotype, ndims, dims, iosystem%num_iotasks, iosystem%io_rank,&
                      iodesc%start, iodesc%count,iosystem%num_aiotasks)
              endif
      @@ -1151,20 +1151,20 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
              if(debug) print *,'IAM: ',iosystem%comp_rank,' after getiostartandcount: count is: ',iodesc%count,&
                   ' lenblocks =',lenblocks,' ndisp=',ndisp
       
      -       if(debug) print *,'IAM: ',iosystem%comp_rank,' after getiostartandcount, num_aiotasks is: ', iosystem%num_aiotasks       
      +       if(debug) print *,'IAM: ',iosystem%comp_rank,' after getiostartandcount, num_aiotasks is: ', iosystem%num_aiotasks
              !--------------------------------------------
      -       ! calculate mpi data structure displacements 
      +       ! calculate mpi data structure displacements
              !--------------------------------------------
      -      
      +
              if(debug) print *,'PIO_initdecomp: calcdisplace', &
                   ndisp,iosize,lenblocks, iodesc%start, iodesc%count
              call calcdisplace_box(dims,lenblocks,iodesc%start,iodesc%count,ndims,displace)
      -          
      +
              n_iotasks = iosystem%num_iotasks
              length = iosize                      ! rml
       
              !
      -       !   this facilitates the use of seperate read and write descripters. 
      +       !   this facilitates the use of seperate read and write descripters.
              !
       
              iodesc%iomap%start  = iosystem%io_rank*length
      @@ -1173,7 +1173,7 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
           endif
           if(DebugAsync) print*,__PIO_FILE__,__LINE__
       
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1183,14 +1183,14 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
           if(debug) print *,__PIO_FILE__,__LINE__,'iam: ',iosystem%io_rank, &
                'initdecomp: userearranger: ',userearranger, glength
       
      -    if(userearranger) then 
      +    if(userearranger) then
              call MPI_BCAST(iosystem%num_aiotasks,1,mpi_integer,iosystem%iomaster,&
                   iosystem%my_comm,ierr)
              call rearrange_create( iosystem,compdof,dims,ndims,iodesc)
           endif
       
           if(DebugAsync) print*,__PIO_FILE__,__LINE__
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1199,14 +1199,14 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
       #endif
       
           !---------------------------------------------
      -    !  the setup for the mpi-io type information 
      +    !  the setup for the mpi-io type information
           !---------------------------------------------
      -    if(iosystem%ioproc) then 
      +    if(iosystem%ioproc) then
              !-----------------------------------------------
      -       ! setup the data structure for the io operation 
      +       ! setup the data structure for the io operation
              !-----------------------------------------------
              call gensubarray(dims,piotype,iodesc,iodesc%write)
      -       
      +
              if(debug) print *,__PIO_FILE__,__LINE__,iodesc%write%n_elemtype, &
               iodesc%write%n_words,iodesc%write%elemtype,iodesc%write%filetype, lenblocks
       
      @@ -1217,7 +1217,7 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
              iodesc%write%filetype = mpi_datatype_null
           endif
       
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1226,13 +1226,13 @@ subroutine PIO_initdecomp_dof_i8(iosystem,basepiotype,dims,compdof, iodesc, iost
       #endif
       
           call dupiodesc2(iodesc%write,iodesc%read)
      -    
      +
       
           if (associated(displace)) then
              call dealloc_check(displace)
           endif
       
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1304,7 +1304,7 @@ subroutine PIO_initdecomp_dof_i8_vdc(iosystem,dims,compdof, iodesc, num_ts, bsiz
              call mpi_bcast(dims, dsize, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
       
              if(DebugAsync) print*,__PIO_FILE__,__LINE__
      -       call mpi_bcast(iodesc%async_id, 1, mpi_integer, iosystem%iomaster, iosystem%intercomm, ierr)  
      +       call mpi_bcast(iodesc%async_id, 1, mpi_integer, iosystem%iomaster, iosystem%intercomm, ierr)
              if(DebugAsync) print*,__PIO_FILE__,__LINE__, iodesc%async_id
           endif
       
      @@ -1324,7 +1324,7 @@ subroutine PIO_initdecomp_dof_i8_vdc(iosystem,dims,compdof, iodesc, num_ts, bsiz
           ! (decompmap_t) to something basic for
           ! testing.
           !-------------------------------------------
      -#ifdef MEMCHK	
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1341,21 +1341,21 @@ subroutine PIO_initdecomp_dof_i8_vdc(iosystem,dims,compdof, iodesc, num_ts, bsiz
           ! total global size
           !---------------------
           glength= product(int(dims,kind=PIO_OFFSET))
      -    if(glength > huge(int(i,kind=pio_offset))) then !not sure if this works, glength is pio_offset, if its > pio_offset range then 
      +    if(glength > huge(int(i,kind=pio_offset))) then !not sure if this works, glength is pio_offset, if its > pio_offset range then
              call piodie( __PIO_FILE__,__LINE__, & !it will simply wrap around rather than be > max_int(pio_offset)
                   'requested array size too large for this interface ') !might be better to use a temp 8 byte int to store results
      -                                                                  !of dims product and compare to the maxint(pio_offset)       
      +                                                                  !of dims product and compare to the maxint(pio_offset)
           endif
       
      -       
      +
       
           ! remember iocount() is only defined on io procs
           call alloc_check(iodesc%start,ndims)
           call alloc_check(iodesc%count,ndims)
           iodesc%basetype=piotype
      -       
      +
           iodesc%compsize=size(compdof)
      -       
      +
           iodesc%start=0
           iodesc%count=0
       
      @@ -1367,19 +1367,19 @@ subroutine PIO_initdecomp_dof_i8_vdc(iosystem,dims,compdof, iodesc, num_ts, bsiz
                 vdc_bsize = bsize
              endif
              vdc_ts = num_ts
      -       
      +
              iosystem%num_aiotasks = iosystem%num_iotasks
       
              call init_vdc2(iosystem%io_rank, dims, vdc_bsize, vdc_iostart, vdc_iocount, iosystem%num_aiotasks)
      -          
      +
              if(debug) then
                 print *, 'rank: ', iosystem%comp_rank, ' pio_init iostart: ' , vdc_iostart, ' iocount: ', vdc_iocount
              endif
      -          
      -       vdc_dims = dims	
      +
      +       vdc_dims = dims
              iodesc%start = vdc_iostart
              iodesc%count = vdc_iocount
      -#endif	
      +#endif
       
              iosize=1
              do i=1,ndims
      @@ -1395,7 +1395,7 @@ subroutine PIO_initdecomp_dof_i8_vdc(iosystem,dims,compdof, iodesc, num_ts, bsiz
           endif
           if(DebugAsync) print*,__PIO_FILE__,__LINE__
       
      -    if(userearranger) then 
      +    if(userearranger) then
              call MPI_BCAST(iosystem%num_aiotasks,1,mpi_integer,iosystem%iomaster,&
                   iosystem%my_comm,ierr)
              call rearrange_create( iosystem,compdof,dims,ndims,iodesc)
      @@ -1407,8 +1407,8 @@ subroutine PIO_initdecomp_dof_i8_vdc(iosystem,dims,compdof, iodesc, num_ts, bsiz
           iodesc%write%filetype = mpi_datatype_null
       
           call dupiodesc2(iodesc%write,iodesc%read)
      -    
      -#ifdef MEMCHK	
      +
      +#ifdef MEMCHK
           call GPTLget_memusage(msize, rss, mshare, mtext, mstack)
           if(rss>lastrss) then
              lastrss=rss
      @@ -1444,7 +1444,7 @@ end subroutine dupiodesc2
         ! genindexedblock
         !
         ! given input lenblocks, basetype, and displacement
      -  ! create two mpi types: 
      +  ! create two mpi types:
         !   elemtype - a single block of basetype repeated lenblocks times
         !   filetype - elemtype repeated at each entry in displacement()
         !              (i.e. size(displacement) entries)
      @@ -1457,9 +1457,9 @@ subroutine genindexedblock(lenblocks,basetype,elemtype,filetype,displace)
           use pio_support, only : mpi_type_create_indexed_block
       #endif
           integer(i4), intent(in) :: lenblocks     ! length of blocks
      -    integer(i4), intent(in) :: basetype      ! base mpi type 
      +    integer(i4), intent(in) :: basetype      ! base mpi type
           integer(i4), intent(inout) :: elemtype   ! elementary mpi type
      -    integer(i4), intent(inout) :: filetype   ! file mpi type 
      +    integer(i4), intent(inout) :: filetype   ! file mpi type
           integer(i4), intent(in) :: displace(:)   ! mpi displacement in the array
       
           integer(i4) :: numblocks,i,ierr, prev
      @@ -1536,14 +1536,14 @@ subroutine gensubarray(gdims,mpidatatype, iodesc, iodesc2)
           integer, intent(in) :: mpidatatype
           type(IO_desc_t), intent(in) :: iodesc
           type(IO_desc2_t), intent(inout) :: iodesc2
      -    
      +
           integer :: ndims, ierr
           integer, allocatable :: lstart(:), lcount(:)
       
           ndims = size(gdims)
       #ifdef _MPISERIAL
              iodesc2%elemtype=mpidatatype
      -       iodesc2%filetype=mpidatatype          
      +       iodesc2%filetype=mpidatatype
              iodesc2%n_elemtype = 0
              iodesc2%n_words = 0
       #else
      @@ -1568,19 +1568,19 @@ subroutine gensubarray(gdims,mpidatatype, iodesc, iodesc2)
              call checkmpireturn('mpi_type_create_subarray in initdecomp',ierr)
              call mpi_type_commit(iodesc2%filetype,ierr)
              call checkmpireturn('mpi_type_commit in initdecomp',ierr)
      -       deallocate(lstart,lcount)     
      +       deallocate(lstart,lcount)
       
       #else
              iodesc2%filetype=mpi_datatype_null
       #endif
           else
              iodesc2%elemtype=mpidatatype
      -       iodesc2%filetype=mpidatatype          
      +       iodesc2%filetype=mpidatatype
              iodesc2%n_elemtype = 0
              iodesc2%n_words = 0
           endif
       #endif
      -    
      +
       
       
       
      @@ -1603,7 +1603,7 @@ subroutine init_iosystem_rearr_options(iosystem)
       #ifdef _NO_FLOW_CONTROL
           iosystem%rearr_opts%fcd = PIO_rearr_comm_fc_2d_disable
       #else
      -    ! We ignore the following flags 
      +    ! We ignore the following flags
           ! 1) _MPISERIAL : The flow control code is never used when _MPISERIAL is set
           ! 2) _USE_COMP2IO_FC/_USE_IO2COMP_FC : These flags are not currently used
           !  (These were experimental flags). The user can explicitly control
      @@ -1696,12 +1696,12 @@ function PIO_set_rearr_opts(iosystem, comm_type, fcd,&
       
         end function PIO_set_rearr_opts
       
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_init
      -!! @brief initialize the pio subsystem. 
      +!! @brief initialize the pio subsystem.
       !! @details  This is a collective call.  Input parameters are read on comp_rank=0
      -!!   values on other tasks are ignored.  This variation of PIO_init locates the IO tasks on a subset 
      +!!   values on other tasks are ignored.  This variation of PIO_init locates the IO tasks on a subset
       !!   of the compute tasks.
       !! @param comp_rank mpi rank of each participating task,
       !! @param comp_comm the mpi communicator which defines the collective.
      @@ -1716,7 +1716,7 @@ subroutine init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stri
           use pio_types, only : pio_internal_error, pio_rearr_none, pio_rearr_opt_t
           integer(i4), intent(in) :: comp_rank
           integer(i4), intent(in) :: comp_comm
      -    integer(i4), intent(in) :: num_iotasks 
      +    integer(i4), intent(in) :: num_iotasks
           integer(i4), intent(in) :: num_aggregator
           integer(i4), intent(in) :: stride
           integer(i4), intent(in) :: rearr
      @@ -1724,10 +1724,10 @@ subroutine init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stri
       
           integer(i4), intent(in),optional :: base
           type (pio_rearr_opt_t), intent(in), optional :: rearr_opts
      -    
      +
           integer(i4) :: n_iotasks
           integer(i4) :: length
      -    integer(i4) :: ngseg,io_rank,i,lbase, io_comm,ierr 
      +    integer(i4) :: ngseg,io_rank,i,lbase, io_comm,ierr
           integer(i4) :: lstride, itmp
           integer(i4), pointer :: iotmp(:),iotmp2(:)
       
      @@ -1777,7 +1777,7 @@ subroutine init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stri
       
           if(check) call checkmpireturn('init: after call to comm_size: ',ierr)
           ! ---------------------------------------
      -    ! need some more error checking code for 
      +    ! need some more error checking code for
           ! setting of number of io nodes
           ! ---------------------------------------
       
      @@ -1826,8 +1826,8 @@ subroutine init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stri
           call alloc_check(iotmp,iosystem%num_tasks,'init:num_tasks')
           call alloc_check(iotmp2,iosystem%num_tasks,'init:num_tasks')
           !---------------------------------------------------
      -    ! Note:  n_iotasks get overwritten (set correctly) in 
      -    ! determineiotasks   
      +    ! Note:  n_iotasks get overwritten (set correctly) in
      +    ! determineiotasks
           !
           ! Entry: it is the number of IO-clients per IO-node
           ! Exit:  is is the total number of IO-tasks
      @@ -1838,7 +1838,7 @@ subroutine init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stri
              rearrFlag = 1
           endif
       
      -    ! more diagnostics (AB)	
      +    ! more diagnostics (AB)
           if (debug) print *,__PIO_FILE__,__LINE__,iosystem%comp_rank, 'START determineiotasks (num_tasks, n_iotasks, lstride, lbase)', &
                iosystem%num_tasks, n_iotasks, lstride, lbase
       
      @@ -1853,19 +1853,19 @@ subroutine init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stri
       
           ! now determine the iomaster and ioranks to populate iosystem
           iotmp(:)=0
      -    if(iotask == 1) then 
      +    if(iotask == 1) then
              iosystem%ioproc = .true.
              iotmp(comp_rank + 1) = 1
           endif
       
      -    iotmp2(:)=0 
      +    iotmp2(:)=0
           call MPI_allreduce(iotmp, iotmp2, iosystem%num_tasks, MPI_INTEGER, MPI_SUM, comp_comm, ierr)
           call CheckMPIReturn('Call to MPI_ALLREDUCE()',ierr,__PIO_FILE__,__LINE__)
           call alloc_check(iosystem%ioranks,n_iotasks,'init:n_ioranks')
           j=1
           iosystem%iomaster = -1
           do i=1, iosystem%num_tasks
      -       if(iotmp2(i) == 1) then 
      +       if(iotmp2(i) == 1) then
                 iosystem%ioranks(j) = i-1
           	  j=j+1
           	  if(iosystem%iomaster<0) iosystem%iomaster = i-1
      @@ -1923,7 +1923,7 @@ subroutine init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stri
       #endif
       
           !---------------------------------
      -    ! initialize the rearranger system 
      +    ! initialize the rearranger system
           !---------------------------------
       
           if (iosystem%userearranger) then
      @@ -1953,10 +1953,10 @@ subroutine init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stri
           call mpi_group_free(mpi_group_io, ierr)
           if(check) call checkmpireturn('init: after call to group_free: ',ierr)
       
      -    
      +
           if(iosystem%ioproc) call mpi_comm_rank(iosystem%io_comm,iosystem%io_rank,ierr)
           if(check) call checkmpireturn('init: after call to comm_rank: ',ierr)
      -    ! turn on mpi-io aggregation 
      +    ! turn on mpi-io aggregation
           !DBG    print *,'PIO_init: before call to setnumagg'
           itmp = num_aggregator
           call mpi_bcast(itmp, 1, mpi_integer, 0, iosystem%comp_comm, ierr)
      @@ -1966,21 +1966,21 @@ subroutine init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stri
                iosystem%io_rank, iosystem%iomaster, iosystem%comp_comm, iosystem%io_comm
       
       
      -    if(itmp .gt. 0) then 
      +    if(itmp .gt. 0) then
              write(cb_nodes,('(i5)')) itmp
       #ifdef BGx
               call PIO_set_hint(iosystem,"bgl_nodes_pset",trim(adjustl(cb_nodes)))
       #else
              call PIO_set_hint(iosystem,"cb_nodes",trim(adjustl(cb_nodes)))
      -#endif       
      +#endif
           endif
       
       #ifdef PIO_GPFS_HINTS
           call PIO_set_hint(iosystem,"ibm_largeblock_io","true")
       #endif
       #ifdef PIO_LUSTRE_HINTS
      -    call PIO_set_hint(iosystem, 'romio_ds_read','disable') 
      -    call PIO_set_hint(iosystem,'romio_ds_write','disable') 
      +    call PIO_set_hint(iosystem, 'romio_ds_read','disable')
      +    call PIO_set_hint(iosystem,'romio_ds_write','disable')
       #endif
           iosystem%num_aiotasks = iosystem%num_iotasks
           iosystem%numost = PIO_NUM_OST
      @@ -1993,18 +1993,18 @@ subroutine init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stri
         end subroutine init_intracom
       
       
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_init
       !! @brief Initialize the pio subsystem.
       !! @details  This is a collective call.  Input parameters are read on comp_rank=0
       !!   values on other tasks are ignored.  This variation of PIO_init sets up a distinct set of tasks
      -!!   to handle IO, these tasks do not return from this call.  Instead they go to an internal loop 
      -!!   and wait to receive further instructions from the computational tasks 
      +!!   to handle IO, these tasks do not return from this call.  Instead they go to an internal loop
      +!!   and wait to receive further instructions from the computational tasks
       !! @param component_count The number of computational components to associate with this IO component
       !! @param peer_comm  The communicator from which all other communicator arguments are derived
       !! @param comp_comms The computational communicator for each of the computational components
      -!! @param io_comm    The io communicator 
      +!! @param io_comm    The io communicator
       !! @param iosystem a derived type which can be used in subsequent pio operations (defined in PIO_types).
       !<
         subroutine init_intercom(component_count, peer_comm, comp_comms, io_comm, iosystem, rearr_opts)
      @@ -2020,19 +2020,19 @@ subroutine init_intercom(component_count, peer_comm, comp_comms, io_comm, iosyst
           integer :: ierr
           logical :: is_inter
           logical, parameter :: check=.true.
      -  
      +
           integer :: i, j, iam, io_leader, comp_leader
           integer(i4), pointer :: iotmp(:)
           character(len=5) :: cb_nodes
           integer :: itmp
      -    
      +
       #ifdef TIMING
           call t_startf("PIO:PIO_init")
       #endif
       #if defined(NO_MPI2) || defined(_MPISERIAL)
           call piodie( __PIO_FILE__,__LINE__, &
            'The PIO async interface requires an MPI2 complient MPI library')
      -#else 
      +#else
           do i=1,component_count
              iosystem(i)%error_handling = PIO_internal_error
              iosystem(i)%comp_comm = comp_comms(i)
      @@ -2044,7 +2044,7 @@ subroutine init_intercom(component_count, peer_comm, comp_comms, io_comm, iosyst
              iosystem(i)%comproot = MPI_PROC_NULL
              iosystem(i)%ioroot = MPI_PROC_NULL
              iosystem(i)%compmaster= MPI_PROC_NULL
      -       iosystem(i)%iomaster = MPI_PROC_NULL 
      +       iosystem(i)%iomaster = MPI_PROC_NULL
              iosystem(i)%numOST = PIO_num_OST
              if(present(rearr_opts)) then
                 iosystem(i)%rearr_opts = rearr_opts
      @@ -2057,7 +2057,7 @@ subroutine init_intercom(component_count, peer_comm, comp_comms, io_comm, iosyst
              if(io_comm/=MPI_COMM_NULL) then
                 ! Find the rank of the io leader in peer_comm
                 call mpi_comm_rank(io_comm,iosystem(i)%io_rank, ierr)
      -          if(iosystem(i)%io_rank==0) then 
      +          if(iosystem(i)%io_rank==0) then
                    call mpi_comm_rank(peer_comm, iam, ierr)
                 else
                    iam = -1
      @@ -2081,7 +2081,7 @@ subroutine init_intercom(component_count, peer_comm, comp_comms, io_comm, iosyst
                 ! Find the rank of the comp leader in peer_comm
                 iosystem(i)%comp_rank = -1
                 if(comp_comms(i)/=MPI_COMM_NULL) then
      -             call mpi_comm_rank(comp_comms(i),iosystem(i)%comp_rank, ierr)          
      +             call mpi_comm_rank(comp_comms(i),iosystem(i)%comp_rank, ierr)
                    if(iosystem(i)%comp_rank==0) then
                       call mpi_comm_rank(peer_comm, iam, ierr)
                    else
      @@ -2104,7 +2104,7 @@ subroutine init_intercom(component_count, peer_comm, comp_comms, io_comm, iosyst
                 call mpi_comm_size(iosystem(i)%union_comm, iosystem(i)%num_tasks, ierr)
                 if(check) call checkmpireturn('init: after call to comm_size: ',ierr)
       
      -             
      +
                 if(io_comm /= MPI_COMM_NULL) then
                    call mpi_comm_size(io_comm, iosystem(i)%num_iotasks, ierr)
                    if(check) call checkmpireturn('init: after call to comm_size: ',ierr)
      @@ -2135,12 +2135,12 @@ subroutine init_intercom(component_count, peer_comm, comp_comms, io_comm, iosyst
       
                 iosystem(i)%userearranger = .true.
                 iosystem(i)%rearr = PIO_rearr_box
      -          
      +
                 if(Debugasync) print *,__PIO_FILE__,__LINE__
      -          
      +
                 call MPI_allreduce(iosystem(i)%comproot, j, 1, MPI_INTEGER, MPI_MAX,iosystem(i)%union_comm,ierr)
                 call CheckMPIReturn('Call to MPI_ALLREDUCE()',ierr,__PIO_FILE__,__LINE__)
      -          
      +
                 iosystem%comproot=j
                 call MPI_allreduce(iosystem(i)%ioroot, j, 1, MPI_INTEGER, MPI_MAX,iosystem(i)%union_comm,ierr)
                 call CheckMPIReturn('Call to MPI_ALLREDUCE()',ierr,__PIO_FILE__,__LINE__)
      @@ -2178,37 +2178,37 @@ subroutine init_intercom(component_count, peer_comm, comp_comms, io_comm, iosyst
       
                 if(Debugasync) print *,__PIO_FILE__,__LINE__,iosystem(i)%ioranks
                 call dealloc_check(iotmp)
      -          
      +
                 !---------------------------------
      -          ! initialize the rearranger system 
      +          ! initialize the rearranger system
                 !---------------------------------
                 if (iosystem(i)%userearranger) then
                    call rearrange_init(iosystem(i))
                 endif
              end if
      -    
      +
       #if defined(USEMPIIO) || defined(_PNETCDF) || defined(_NETCDF4)
       #ifndef _MPISERIAL
              call mpi_info_create(iosystem(i)%info,ierr)
      -       ! turn on mpi-io aggregation 
      +       ! turn on mpi-io aggregation
              !DBG    print *,'PIO_init: before call to setnumagg'
       !       itmp = num_aggregator
       !       call mpi_bcast(itmp, 1, mpi_integer, 0, iosystem%union_comm, ierr)
      -!       if(itmp .gt. 0) then 
      +!       if(itmp .gt. 0) then
       !          write(cb_nodes,('(i5)')) itmp
       !#ifdef BGx
       !          call PIO_set_hint(iosystem(i),"bgl_nodes_pset",trim(adjustl(cb_nodes)))
       !#else
       !          call PIO_set_hint(iosystem(i),"cb_nodes",trim(adjustl(cb_nodes)))
      -!#endif       
      +!#endif
       !       endif
       
       #ifdef PIO_GPFS_HINTS
              call PIO_set_hint(iosystem(i),"ibm_largeblock_io","true")
       #endif
       #ifdef PIO_LUSTRE_HINTS
      -       call PIO_set_hint(iosystem(i), 'romio_ds_read','disable') 
      -       call PIO_set_hint(iosystem(i),'romio_ds_write','disable') 
      +       call PIO_set_hint(iosystem(i), 'romio_ds_read','disable')
      +       call PIO_set_hint(iosystem(i),'romio_ds_write','disable')
       #endif
       #endif
       #endif
      @@ -2221,8 +2221,8 @@ subroutine init_intercom(component_count, peer_comm, comp_comms, io_comm, iosyst
           iosystem%numost = PIO_NUM_OST
       
           ! This routine does not return
      -    if(io_comm /= MPI_COMM_NULL) call pio_msg_handler(component_count,iosystem) 
      -    
      +    if(io_comm /= MPI_COMM_NULL) call pio_msg_handler(component_count,iosystem)
      +
           if(DebugAsync) print*,__PIO_FILE__,__LINE__, iosystem(1)%ioranks
       #ifdef TIMING
           call t_stopf("PIO:PIO_init")
      @@ -2256,12 +2256,12 @@ subroutine pio_recommend_iotasks(comm, ioproc, numiotasks, miniotasks, maxiotask
           call mpi_comm_size(comm,num_tasks,ierr)
           call mpi_comm_rank(comm,iam,ierr)
       
      -#ifdef BGx    
      +#ifdef BGx
           call alloc_check(iotmp,num_tasks,'init:num_tasks')
           call alloc_check(iotmp2,num_tasks,'init:num_tasks')
           !---------------------------------------------------
      -    ! Note for Blue Gene n_iotasks get overwritten in 
      -    ! determineiotasks   
      +    ! Note for Blue Gene n_iotasks get overwritten in
      +    ! determineiotasks
           !
           ! Entry: it is the number of IO-clients per IO-node
           ! Exit:  is is the total number of IO-tasks
      @@ -2271,11 +2271,11 @@ subroutine pio_recommend_iotasks(comm, ioproc, numiotasks, miniotasks, maxiotask
           call determineiotasks(comm,numiotasks,1,0,1,iotask)
       
           iotmp(:)=0
      -    if(iotask==1) then 
      +    if(iotask==1) then
              ioproc = .true.
              iotmp(iam+1) = 1
           endif
      -    iotmp2(:)=0 
      +    iotmp2(:)=0
           call MPI_allreduce(iotmp,iotmp2,num_tasks,MPI_INTEGER,MPI_SUM,comm,ierr)
           call CheckMPIReturn('Call to MPI_ALLREDUCE()',ierr,__PIO_FILE__,__LINE__)
       
      @@ -2291,7 +2291,7 @@ subroutine pio_recommend_iotasks(comm, ioproc, numiotasks, miniotasks, maxiotask
         end subroutine pio_recommend_iotasks
       
       
      -!> 
      +!>
       !! @public
       !! @defgroup PIO_set_hint  PIO_set_hint
       !! @brief set file system hints using mpi_info_set
      @@ -2304,7 +2304,7 @@ end subroutine pio_recommend_iotasks
         subroutine PIO_set_hint(iosystem, hint, hintval)
           type (iosystem_desc_t), intent(inout)  :: iosystem  ! io descriptor to initalize
           character(len=*), intent(in) :: hint, hintval
      -    
      +
           integer :: ierr
       #if defined(USEMPIIO) || defined(_PNETCDF) || defined(_NETCDF4)
       #ifndef _MPISERIAL
      @@ -2320,18 +2320,18 @@ subroutine PIO_set_hint(iosystem, hint, hintval)
         end subroutine PIO_set_hint
       
       
      -!> 
      +!>
       !! @public
      -!! @ingroup PIO_finalize 
      +!! @ingroup PIO_finalize
       !! @brief finalizes the pio subsystem.
       !! @details This is a collective call which expects the following parameters
       !! @param iosystem : @copydoc io_desc_t
       !! @retval ierr @copydoc  error_return
       !<
         subroutine finalize(iosystem,ierr)
      -     type (iosystem_desc_t), intent(inout) :: iosystem 
      +     type (iosystem_desc_t), intent(inout) :: iosystem
            integer(i4), intent(out) :: ierr
      -     
      +
            integer :: msg
       
            if(iosystem%async_interface .and. iosystem%comp_rank==0) then
      @@ -2341,12 +2341,12 @@ subroutine finalize(iosystem,ierr)
            end if
            If (associated (iosystem%ioranks)) deallocate (iosystem%ioranks)
       #ifndef _MPISERIAL
      -     if(iosystem%info .ne. mpi_info_null) then 
      -        call mpi_info_free(iosystem%info,ierr) 
      +     if(iosystem%info .ne. mpi_info_null) then
      +        call mpi_info_free(iosystem%info,ierr)
               iosystem%info=mpi_info_null
               !print *,'IAM: ',iosystem%comp_rank, ' finalize (1) error = ', ierr
            endif
      -     if(iosystem%io_comm .ne. mpi_comm_null .and. .not. iosystem%async_interface) then 
      +     if(iosystem%io_comm .ne. mpi_comm_null .and. .not. iosystem%async_interface) then
               call mpi_comm_free(iosystem%io_comm,ierr)
               iosystem%io_comm=mpi_comm_null
               !print *,'IAM: ',iosystem%comp_rank, ' finalize (2) error = ', ierr
      @@ -2360,7 +2360,7 @@ end subroutine finalize
       !>
       !! @public
       !! @ingroup PIO_getnumiotasks
      -!! @brief This returns the number of IO-tasks that PIO is using 
      +!! @brief This returns the number of IO-tasks that PIO is using
       !! @param iosystem : a defined pio system descriptor, see PIO_types
       !! @param numiotasks : the number of IO-tasks
       !<
      @@ -2384,8 +2384,8 @@ end subroutine getnumiotasks
         ! rml: possible problem here wrt dubbing the box rearranger
         ! data, as well as maybe the mct rearranger???
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_dupiodesc
       !! @brief duplicates an existing io descriptor
       !! @details
      @@ -2419,37 +2419,37 @@ subroutine dupiodesc(src,dest)
       
           dest%basetype = src%basetype
       
      -    if(associated(src%dest_ioproc)) then 
      +    if(associated(src%dest_ioproc)) then
              n = size(src%dest_ioproc)
              allocate(dest%dest_ioproc(n))
              dest%dest_ioproc(:) = src%dest_ioproc(:)
           endif
       
      -    if(associated(src%dest_ioindex)) then 
      +    if(associated(src%dest_ioindex)) then
              n = size(src%dest_ioindex)
              allocate(dest%dest_ioindex(n))
              dest%dest_ioindex(:) = src%dest_ioindex(:)
           endif
       
      -    if(associated(src%rfrom)) then 
      +    if(associated(src%rfrom)) then
              n = size(src%rfrom)
              allocate(dest%rfrom(n))
              dest%rfrom(:) = src%rfrom(:)
           endif
       
      -    if(associated(src%rtype)) then 
      +    if(associated(src%rtype)) then
              n = size(src%rtype)
              allocate(dest%rtype(n))
              dest%rtype(:) = src%rtype(:)
           endif
       
      -    if(associated(src%scount)) then 
      +    if(associated(src%scount)) then
              n = size(src%scount)
              allocate(dest%scount(n))
              dest%scount(:) = src%scount(:)
           endif
       
      -    if(associated(src%stype)) then 
      +    if(associated(src%stype)) then
              n = size(src%stype)
              allocate(dest%stype(n))
              dest%stype(:) = src%stype(:)
      @@ -2481,8 +2481,8 @@ subroutine copy_decompmap(src,dest)
       
         end subroutine copy_decompmap
       
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_setiotype
       !! @brief sets the desired type of io to perform
       !! @details
      @@ -2496,7 +2496,7 @@ subroutine setiotype(file,iotype,rearr,rearr_opts)
           use pio_types
       
           type (file_desc_t), intent(inout) :: file
      -    integer(i4), intent(in) :: iotype 
      +    integer(i4), intent(in) :: iotype
           integer(i4), intent(in) :: rearr
           type (PIO_rearr_opt_t), intent(in), optional :: rearr_opts
       
      @@ -2504,7 +2504,7 @@ subroutine setiotype(file,iotype,rearr,rearr_opts)
           ! FIXME: Ideally the file_desc_t should contain a pointer to
           ! iodesc_t and the rearranger and its options should be set
           ! there - so that we can control the rearranger to be used
      -    ! on a per file basis. The current design only contains 
      +    ! on a per file basis. The current design only contains
           ! a pointer to the iosystem_desc_t in the file_desc_t,
           ! so each call results in setting the global rearr not
           ! per file rearranger
      @@ -2522,7 +2522,7 @@ end subroutine setiotype
       !! @brief returns the global number of words to read for this io descriptor
       !! @details
       !! @param iodesc : @copydoc io_desc_t
      -!! @retval num   :  the number of words to read 
      +!! @retval num   :  the number of words to read
       !<
         integer function numtoread(iodesc) result(num)
       
      @@ -2547,16 +2547,16 @@ integer function numtowrite(iodesc) result(num)
       
         end function numtowrite
       
      -!> 
      +!>
       !! @public
      -!! @ingroup PIO_createfile 
      +!! @ingroup PIO_createfile
       !! @brief create a file using pio
       !! @details  Input parameters are read on comp task 0 and ignored elsewhere
       !! @param iosystem : a defined pio system descriptor created by a call to @ref PIO_init (see PIO_types)
       !! @param file	:  the returned file descriptor
       !! @param iotype : @copydoc PIO_iotype
       !! @param fname : the name of the file to open
      -!! @param amode_in : the creation mode flag. the following flags are available: PIO_clobber, PIO_noclobber. 
      +!! @param amode_in : the creation mode flag. the following flags are available: PIO_clobber, PIO_noclobber.
       !! @retval ierr @copydoc error_return
       !<
         integer function createfile(iosystem, file,iotype, fname, amode_in) result(ierr)
      @@ -2568,7 +2568,7 @@ integer function createfile(iosystem, file,iotype, fname, amode_in) result(ierr)
           integer, intent(in) :: iotype
           character(len=*), intent(in)  :: fname
           integer, optional, intent(in) :: amode_in
      -    
      +
           ! ===================
           !  local variables
           ! ===================
      @@ -2594,15 +2594,15 @@ integer function createfile(iosystem, file,iotype, fname, amode_in) result(ierr)
           if(debug.or.debugasync) print *,'createfile: {comp,io}_rank:',iosystem%comp_rank,iosystem%io_rank, &
                'io proc: ',iosystem%ioproc,iosystem%async_interface, iotype
           ierr=PIO_noerr
      -    
      +
       
           if(present(amode_in)) then
              amode = amode_in
      -    else	
      +    else
              amode = 0
           end if
       
      -    file%iotype = iotype 
      +    file%iotype = iotype
       
       
       
      @@ -2624,7 +2624,7 @@ integer function createfile(iosystem, file,iotype, fname, amode_in) result(ierr)
           ! set some iotype specific stuff
           !--------------------------------
       
      -#if defined(USEMPIIO) 
      +#if defined(USEMPIIO)
           if ( (file%iotype==pio_iotype_pbinary .or. file%iotype==pio_iotype_direct_pbinary) &
                .and. (.not. iosystem%userearranger) ) then
              write(rd_buffer,('(i9)')) 16*1024*1024
      @@ -2663,7 +2663,7 @@ integer function createfile(iosystem, file,iotype, fname, amode_in) result(ierr)
              ierr = create_mpiio(file,myfname)
           case( pio_iotype_pnetcdf, pio_iotype_netcdf, pio_iotype_netcdf4p, pio_iotype_netcdf4c)
              if(debug) print *,__PIO_FILE__,__LINE__,' open: ', trim(myfname), amode
      -       ierr = create_nf(file,trim(myfname), amode)	
      +       ierr = create_nf(file,trim(myfname), amode)
              if(debug .and. iosystem%io_rank==0)print *,__PIO_FILE__,__LINE__,' open: ', myfname, file%fh, ierr
           case(pio_iotype_binary)
              print *,'createfile: io type not supported'
      @@ -2679,7 +2679,7 @@ integer function createfile(iosystem, file,iotype, fname, amode_in) result(ierr)
       #endif
           end select
           if(ierr==0) file%file_is_open=.true.
      -	
      +
           if(debug .and. file%iosystem%io_rank==0) print *,__PIO_FILE__,__LINE__,'open: ',file%fh, myfname
           deallocate(myfname)
       #ifdef TIMING
      @@ -2715,9 +2715,9 @@ integer function PIO_getnum_OST(iosystem) result(numOST)
            type (iosystem_desc_t), intent(inout), target :: iosystem
            numOST = iosystem%numOST
         end function PIO_getnum_OST
      -!> 
      +!>
       !! @public
      -!! @ingroup PIO_openfile 
      +!! @ingroup PIO_openfile
       !! @brief open an existing file using pio
       !! @details  Input parameters are read on comp task 0 and ignored elsewhere.
       !! @param iosystem : a defined pio system descriptor created by a call to @ref PIO_init (see PIO_types)
      @@ -2730,7 +2730,7 @@ end function PIO_getnum_OST
       !! PIO_write. setting the PIO_write flag opens the dataset with
       !! read-write access. ("writing" means any kind of change to the dataset,
       !! including appending or changing data, adding or renaming dimensions,
      -!! variables, and attributes, or deleting attributes.) 
      +!! variables, and attributes, or deleting attributes.)
       !! @retval ierr @copydoc error_return
       !<
         integer function PIO_openfile(iosystem, file, iotype, fname,mode, CheckMPI) result(ierr)
      @@ -2765,21 +2765,21 @@ integer function PIO_openfile(iosystem, file, iotype, fname,mode, CheckMPI) resu
       
           if(present(mode)) then
              amode = mode
      -    else	
      +    else
              amode = 0
           end if
           !--------------------------------
           ! set some iotype specific stuff
           !--------------------------------
       
      -    if(iosystem%num_iotasks.eq.1.and.iotype.eq.pio_iotype_pnetcdf) then	
      +    if(iosystem%num_iotasks.eq.1.and.iotype.eq.pio_iotype_pnetcdf) then
       #if defined(_NETCDF)
              file%iotype=pio_iotype_netcdf
       #else
      -       file%iotype = iotype 
      -#endif       
      +       file%iotype = iotype
      +#endif
           else
      -       file%iotype = iotype 
      +       file%iotype = iotype
           end if
       
       #if defined(USEMPIIO)
      @@ -2813,7 +2813,7 @@ integer function PIO_openfile(iosystem, file, iotype, fname,mode, CheckMPI) resu
              if(iosystem%comp_rank==0) then
                 call mpi_send(msg, 1, mpi_integer, iosystem%ioroot, 1, iosystem%union_comm, ierr)
              end if
      -       
      +
              call mpi_bcast(namelen, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
              call mpi_bcast(myfname, namelen, mpi_character, iosystem%compmaster, iosystem%intercomm, ierr)
              call mpi_bcast(iotype, 1, mpi_integer, iosystem%compmaster, iosystem%intercomm, ierr)
      @@ -2849,10 +2849,10 @@ integer function PIO_openfile(iosystem, file, iotype, fname,mode, CheckMPI) resu
       #endif
         end function PIO_openfile
       
      -!> 
      -!! @public 
      -!! @ingroup PIO_syncfile 
      -!! @brief synchronizing a file forces all writes to complete before the subroutine returns. 
      +!>
      +!! @public
      +!! @ingroup PIO_syncfile
      +!! @brief synchronizing a file forces all writes to complete before the subroutine returns.
       !!
       !! @param file @copydoc file_desc_t
       !<
      @@ -2862,15 +2862,15 @@ subroutine syncfile(file)
           type (file_desc_t), target :: file
           integer :: ierr, msg
           type(iosystem_desc_t), pointer :: ios
      -     
      - 
      +
      +
           ios => file%iosystem
           if(ios%async_interface .and. .not. ios%ioproc) then
              msg = PIO_MSG_SYNC_FILE
              if(ios%comp_rank==0) then
                 call mpi_send(msg, 1, mpi_integer, ios%ioroot, 1, ios%union_comm, ierr)
              end if
      -      
      +
              call mpi_bcast(file%fh, 1, mpi_integer, ios%compmaster, ios%intercomm, ierr)
           end if
       
      @@ -2879,11 +2879,11 @@ subroutine syncfile(file)
              call darray_write_complete(file)
              ierr = sync_nf(file)
           case(pio_iotype_pbinary, pio_iotype_direct_pbinary)
      -    case(pio_iotype_binary) 
      +    case(pio_iotype_binary)
           end select
         end subroutine syncfile
      -!> 
      -!! @public 
      +!>
      +!! @public
       !! @ingroup PIO_freedecomp
       !! @brief free all allocated storage associated with this decomposition
       !! @details
      @@ -2916,7 +2916,7 @@ subroutine freedecomp_ios(ios,iodesc)
       
              if((iodesc%read%filetype .ne. mpi_datatype_null)  &
       	  .and. (iodesc%read%filetype .ne. iodesc%write%filetype) .and. &
      -	  iodesc%read%n_words>0) then 
      +	  iodesc%read%n_words>0) then
                 call mpi_type_free(iodesc%read%filetype,ierr)
                 call checkmpireturn('freedecomp mpi_type_free: ',ierr)
                 call mpi_type_free(iodesc%read%elemtype,ierr)
      @@ -2924,14 +2924,14 @@ subroutine freedecomp_ios(ios,iodesc)
                 iodesc%read%filetype=mpi_datatype_null
              endif
              if(iodesc%write%filetype .ne. mpi_datatype_null .and. &
      -	  iodesc%write%n_words>0) then 
      +	  iodesc%write%n_words>0) then
                 call mpi_type_free(iodesc%write%filetype,ierr)
                 call checkmpireturn('freedecomp mpi_type_free: ',ierr)
                 call mpi_type_free(iodesc%write%elemtype,ierr)
                 call checkmpireturn('freedecomp mpi_type_free: ',ierr)
                 iodesc%write%filetype=mpi_datatype_null
              endif
      -   
      +
           end if
       #endif
       
      @@ -2941,12 +2941,12 @@ subroutine freedecomp_ios(ios,iodesc)
           end if
       
           if(associated(iodesc%count)) then
      -       call dealloc_check(iodesc%count,'iodesc%count')    
      +       call dealloc_check(iodesc%count,'iodesc%count')
              nullify(iodesc%count)
           end if
         end subroutine freedecomp_ios
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_freedecomp
       !! @brief free all allocated storage associated with this decomposition
       !! @details
      @@ -2963,19 +2963,19 @@ subroutine freedecomp_file(file,iodesc)
       
         end subroutine freedecomp_file
       
      -!> 
      +!>
       !! @public
       !! @ingroup PIO_closefile
       !! @brief close a disk file
       !! @details
       !! @param file @copydoc file_desc_t
      -!< 
      +!<
         subroutine closefile(file)
           use piodarray, only : darray_write_complete
           type (file_desc_t),intent(inout)   :: file
       
           integer :: ierr, msg
      -    integer :: iotype 
      +    integer :: iotype
           logical, parameter :: check = .true.
       
       #ifdef TIMING
      @@ -2991,7 +2991,7 @@ subroutine closefile(file)
       
           if(debug .and. file%iosystem%io_rank==0) &
             print *,__PIO_FILE__,__LINE__,'close: ',file%fh
      -    iotype = file%iotype 
      +    iotype = file%iotype
           select case(iotype)
           case(pio_iotype_pbinary, pio_iotype_direct_pbinary)
              ierr = close_mpiio(file)
      diff --git a/pio/pionfatt_mod.F90.in b/pio/pionfatt_mod.F90.in
      index 9e4d8ad55ea..b6432e0a0bc 100644
      --- a/pio/pionfatt_mod.F90.in
      +++ b/pio/pionfatt_mod.F90.in
      @@ -1,6 +1,6 @@
       #define __PIO_FILE__ "pionfatt_mod.F90"
       !>
      -!! @file 
      +!! @file
       !! $Revision$
       !! $LastChangedDate$
       !! @brief NetCDF attribute interface to PIO
      @@ -19,14 +19,14 @@ module pionfatt_mod
       #endif
       #ifdef USE_PNETCDF_MOD
         use pnetcdf
      -#endif  
      +#endif
         implicit none
       #ifdef _PNETCDF
       #ifndef USE_PNETCDF_MOD
       #  include   /* _EXTERNAL */
       #endif
       #endif
      -  include 'mpif.h'  ! _EXTERNAL 
      +  include 'mpif.h'  ! _EXTERNAL
       
       
       !>
      @@ -51,14 +51,14 @@ module pionfatt_mod
         end interface
       
       !>
      -!!  @public 
      +!!  @public
       !!  @defgroup PIO_put_att PIO_put_att
      -!!  @brief Writes an netcdf attribute to a file 
      +!!  @brief Writes an netcdf attribute to a file
       !<
       !>
      -!! @public 
      +!! @public
       !! @defgroup PIO_get_att PIO_get_att
      -!! @brief Reads  an netcdf attribute from a file 
      +!! @brief Reads  an netcdf attribute from a file
       !<
       
         private :: modName
      @@ -67,14 +67,14 @@ module pionfatt_mod
       contains
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_put_att
       !! @brief Writes an netcdf attribute to a file
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varid : The netcdf variable identifier
       !! @param name : name of the attribute to add
      -!! @param value : The value for the netcdf attribute 
      +!! @param value : The value for the netcdf attribute
       !! @retval ierr @copydoc error_return
       !<
         integer function put_att_{TYPE} (File, varid, name, value) result(ierr)
      @@ -83,7 +83,7 @@ contains
           integer, intent(in) :: varid
           character(len=*), intent(in) :: name
           {VTYPE}, intent(in) :: value
      -    
      +
           type(iosystem_desc_t), pointer :: ios
       #if ({ITYPE} != TYPETEXT)
       #ifdef DEBUG
      @@ -116,15 +116,15 @@ contains
              nlen=len_trim(name)
              call MPI_BCAST(nlen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
              call MPI_BCAST(name,nlen,MPI_CHARACTER,ios%CompMaster, ios%my_comm , mpierr)
      -#if ({ITYPE} == TYPETEXT)	
      -       call MPI_BCAST(clen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)	
      +#if ({ITYPE} == TYPETEXT)
      +       call MPI_BCAST(clen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
       #endif
           end if
       
           if(ios%async_interface) then
              call MPI_BCAST(value, clen, {MPITYPE}, ios%compmaster, ios%my_comm, mpierr)
           end if
      -	
      +
           if(Ios%IOproc) then
              select case(iotype)
       #ifdef _PNETCDF
      @@ -141,7 +141,7 @@ contains
                    print *,__PIO_FILE__,__LINE__,chkval,value, mpierr
                    call piodie(__PIO_FILE__,__LINE__,'attributes do not match')
                 end if
      -#endif             
      +#endif
       #undef DEBUG
       #ifdef USE_PNETCDF_MOD
                 ierr =nf90mpi_put_att (File%fh,varid,name,value)
      @@ -173,14 +173,14 @@ contains
       !pl The next line is needed by genf90.pl, do not remove it.
       ! TYPE real,double,int
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_put_att
       !! @brief Writes an netcdf attribute to a file
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varid : The netcdf variable identifier
       !! @param name : name of the attribute to add
      -!! @param value : The value for the netcdf attribute 
      +!! @param value : The value for the netcdf attribute
       !! @retval ierr @copydoc error_return
       !<
         integer function put_att_1d_{TYPE} (File, varid, name, value) result(ierr)
      @@ -190,7 +190,7 @@ contains
           character(len=*), intent(in) :: name
           {VTYPE}, intent(in) :: value(:)
           type(iosystem_desc_t), pointer :: ios
      -	
      +
       #ifdef DEBUG
           {VTYPE} :: chkval
       #endif
      @@ -217,9 +217,9 @@ contains
              nlen = len(name)
              call MPI_BCAST(nlen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
              call MPI_BCAST(name,nlen,MPI_CHARACTER,ios%CompMaster, ios%my_comm , mpierr)
      -       call MPI_BCAST(clen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)	
      +       call MPI_BCAST(clen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
           end if
      -    
      +
           call mpi_barrier(ios%union_comm, mpierr)
       
           if(ios%async_interface) then
      @@ -241,7 +241,7 @@ contains
                    print *,__PIO_FILE__,__LINE__,chkval,value, mpierr
                    call piodie(__PIO_FILE__,__LINE__,'attributes do not match')
                 end if
      -#endif             
      +#endif
       #undef DEBUG
                 ierr= nfmpi_put_att_{TYPE} (File%fh,varid,name, nf_{TYPE} , int(clen,kind=PIO_OFFSET),value)
       #endif
      @@ -263,14 +263,14 @@ contains
         end function put_att_1d_{TYPE}
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_put_att
       !! @brief Writes an netcdf attribute to a file
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varDesc @copydoc var_desc_t
       !! @param name : name of the attribute to add
      -!! @param value : The value for the netcdf attribute 
      +!! @param value : The value for the netcdf attribute
       !! @retval ierr @copydoc error_return
       !<
         integer function put_att_desc_{TYPE} (File,varDesc,name,value) result(ierr)
      @@ -286,14 +286,14 @@ contains
       
       ! TYPE real,int,double
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_put_att
       !! @brief Writes an netcdf attribute to a file
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varDesc @copydoc var_desc_t
       !! @param name : name of the attribute to add
      -!! @param value : The value for the netcdf attribute 
      +!! @param value : The value for the netcdf attribute
       !! @retval ierr @copydoc error_return
       !<
         integer function put_att_desc_1d_{TYPE} (File,varDesc,name,value) result(ierr)
      @@ -311,14 +311,14 @@ contains
       
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_get_att
       !! @brief Reads an netcdf attribute from a  file
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varDesc @copydoc var_desc_t
       !! @param name : name of the attribute to get
      -!! @param value : The value for the netcdf attribute 
      +!! @param value : The value for the netcdf attribute
       !! @retval ierr @copydoc error_return
       !<
         integer function get_att_desc_{TYPE} (File,varDesc,name,value) result(ierr)
      @@ -336,14 +336,14 @@ contains
       
       ! TYPE real,int,double
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_get_att
       !! @brief Reads an netcdf attribute from a  file
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varDesc @copydoc var_desc_t
       !! @param name : name of the attribute to get
      -!! @param value : The value for the netcdf attribute 
      +!! @param value : The value for the netcdf attribute
       !! @retval ierr @copydoc error_return
       !<
         integer function get_att_desc_1d_{TYPE} (File,varDesc,name,value) result(ierr)
      @@ -360,18 +360,18 @@ contains
         end function get_att_desc_1d_{TYPE}
       
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_get_att
       !! @brief Reads an netcdf attribute from a  file
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varid : The netcdf variable identifier
       !! @param name : name of the attribute to get
      -!! @param value : The value for the netcdf attribute 
      +!! @param value : The value for the netcdf attribute
       !! @retval ierr @copydoc error_return
       !<
         integer function get_att_{TYPE} (File,varid,name,value) result(ierr)
      -    use pio_msg_mod, only : pio_msg_getatt	
      +    use pio_msg_mod, only : pio_msg_getatt
           type (File_desc_t), intent(in) , target :: File
           integer(i4), intent(in)        :: varid
           character(len=*), intent(in)   :: name
      @@ -386,7 +386,7 @@ contains
       
           iotype = File%iotype
           ierr=PIO_noerr
      -#if ({ITYPE} == TYPETEXT)	
      +#if ({ITYPE} == TYPETEXT)
           clen = len(value)
           value = ' '
       #endif
      @@ -401,8 +401,8 @@ contains
              nlen = len(name)
              call MPI_BCAST(nlen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
              call MPI_BCAST(name,nlen,MPI_CHARACTER,ios%CompMaster, ios%my_comm , mpierr)
      -#if ({ITYPE} == TYPETEXT)	
      -       call MPI_BCAST(clen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)	
      +#if ({ITYPE} == TYPETEXT)
      +       call MPI_BCAST(clen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
       #endif
           end if
       
      @@ -441,14 +441,14 @@ contains
       
       ! TYPE real,int,double
       !>
      -!! @public 
      +!! @public
       !! @ingroup PIO_get_att
       !! @brief Reads an netcdf attribute from a  file
       !! @details
       !! @param File @copydoc file_desc_t
       !! @param varid : The netcdf variable identifier
       !! @param name : name of the attribute to get
      -!! @param value : The value for the netcdf attribute 
      +!! @param value : The value for the netcdf attribute
       !! @retval ierr @copydoc error_return
       !<
         integer function get_att_1d_{TYPE} (File,varid,name,value) result(ierr)
      diff --git a/pio/pionfget_mod.F90.in b/pio/pionfget_mod.F90.in
      index bc3bf57ee74..ffa305582c6 100644
      --- a/pio/pionfget_mod.F90.in
      +++ b/pio/pionfget_mod.F90.in
      @@ -1,6 +1,6 @@
       #define __PIO_FILE__ "pionfget_mod.F90"
       !>
      -!! @file 
      +!! @file
       !! $Revision$
       !! $LastChangedDate$
       !! @brief Read Routines for non-decomposed NetCDF data.
      @@ -40,8 +40,8 @@ module pionfget_mod
       !! @defgroup PIO_get_var PIO_get_var
       !! @brief Reads non-decomposed data from a NetCDF file
       !! @details The get_var interface is provided as a simplified interface to
      -!!  read variables from a NetCDF format file.   The variable is read on the 
      -!!  root IO task and broadcast in its entirety to all tasks.  
      +!!  read variables from a NetCDF format file.   The variable is read on the
      +!!  root IO task and broadcast in its entirety to all tasks.
       !<
         public :: get_var
         interface get_var
      @@ -80,7 +80,7 @@ CONTAINS
           call t_startf("PIO:pio_get_var1_{TYPE}")
       #endif
           ierr=0
      -    iotype = File%iotype 
      +    iotype = File%iotype
           ios => File%iosystem
           sofindex = size(index)
       
      @@ -89,9 +89,9 @@ CONTAINS
           ival(1:ilen) = ' '
       #else
           ilen=1
      -#endif	
      +#endif
           if(Debug) print *,__PIO_FILE__,__LINE__,index, ilen
      -    
      +
           if(ios%async_interface .and. .not. ios%ioproc ) then
              msg=PIO_MSG_GETVAR1
              if(ios%comp_rank==0) call mpi_send(msg, 1, mpi_integer, ios%ioroot, 1, ios%union_comm, ierr)
      @@ -108,7 +108,7 @@ CONTAINS
       
       
           if(File%iosystem%IOProc) then
      -       select case (iotype) 
      +       select case (iotype)
       #ifdef _PNETCDF
              case(pio_iotype_pnetcdf)
                 ierr = nfmpi_begin_indep_data(File%fh)
      @@ -145,7 +145,7 @@ CONTAINS
           ilen = len(ival)
       #else
           ilen=1
      -#endif	
      +#endif
       
           call MPI_Bcast(ival, ilen, {MPITYPE} , File%iosystem%IOMaster, File%iosystem%MY_comm, mpierr)
           call CheckMPIReturn(subName, mpierr)
      @@ -204,7 +204,7 @@ CONTAINS
       !!   the variable's dimensions. Hence, if the variable is a record
       !!   variable, the first element of count corresponds to a count of the
       !!   number of records to read.
      -!! Note: setting any element of the count array to zero causes the function to exit without error, and without doing anything. 
      +!! Note: setting any element of the count array to zero causes the function to exit without error, and without doing anything.
       !! @param ival : The value for the netcdf metadata
       !! @retval ierr @ref error_return
       !<
      @@ -212,7 +212,7 @@ CONTAINS
           type (File_desc_t), intent(in) :: File
           integer, intent(in) :: varid, start(:), count(:)
           {VTYPE}, intent(out) :: ival{DIMSTR}
      -         
      +
           character(len=*), parameter :: subName=modName//'::get_vara_{DIMS}d_{TYPE}'
       
           integer :: dims({DIMS})
      @@ -223,7 +223,7 @@ CONTAINS
           call t_startf("PIO:pio_get_vara_{DIMS}d_{TYPE}")
       #endif
           ierr=0
      -    iotype = File%iotype 
      +    iotype = File%iotype
           isize=1
           do i=1,size(count)
              isize=isize*count(i)
      @@ -250,7 +250,7 @@ CONTAINS
              end do
              call MPI_BCAST(dims,{DIMS},MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
       #endif
      -#if({ITYPE} == TYPETEXT) 
      +#if({ITYPE} == TYPETEXT)
                 call MPI_BCAST(ilen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
       #endif
       
      @@ -263,7 +263,7 @@ CONTAINS
       
       
           if(File%iosystem%IOProc) then
      -       select case (iotype) 
      +       select case (iotype)
       #ifdef _PNETCDF
              case(pio_iotype_pnetcdf)
                 ierr = nfmpi_get_vara_all (File%fh, varid, int(start,kind=PIO_OFFSET), &
      @@ -281,7 +281,7 @@ CONTAINS
                    call MPI_BCAST(ival,int(isize), {MPITYPE} ,0,ios%IO_comm, mpierr)
                    call CheckMPIReturn(subName,mpierr)
                 end if
      -	  
      +
       
       #endif
              end select
      @@ -324,7 +324,7 @@ CONTAINS
       !!   the variable's dimensions. Hence, if the variable is a record
       !!   variable, the first element of count corresponds to a count of the
       !!   number of records to read.
      -!! Note: setting any element of the count array to zero causes the function to exit without error, and without doing anything. 
      +!! Note: setting any element of the count array to zero causes the function to exit without error, and without doing anything.
       !! @param ival : The value for the netcdf metadata
       !! @retval ierr @ref error_return
       !<
      @@ -368,13 +368,13 @@ CONTAINS
           call t_startf("PIO:pio_get_var_{DIMS}d_{TYPE}")
       #endif
           ierr=0
      -    iotype = File%iotype 
      -    isize=1	
      +    iotype = File%iotype
      +    isize=1
       #if ({DIMS} > 0)
           isize= size(ival)
       #endif
       #if ({ITYPE} == TYPETEXT)
      -    ilen = len(ival)	
      +    ilen = len(ival)
           isize = isize*ilen
           ival{DIMSTR} = ' '
       #endif
      @@ -392,7 +392,7 @@ CONTAINS
              end do
              call MPI_BCAST(dims,{DIMS},MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
       #endif
      -#if({ITYPE} == TYPETEXT) 
      +#if({ITYPE} == TYPETEXT)
                 call MPI_BCAST(ilen,1,MPI_INTEGER,ios%CompMaster, ios%my_comm , mpierr)
       #endif
       
      @@ -402,7 +402,7 @@ CONTAINS
       
       
           if(File%iosystem%IOProc) then
      -       select case (iotype) 
      +       select case (iotype)
       #ifdef _PNETCDF
              case(pio_iotype_pnetcdf)
                 ierr = nfmpi_get_var_all(File%fh, varid, ival, isize, {MPITYPE})
      diff --git a/pio/pionfread_mod.F90.in b/pio/pionfread_mod.F90.in
      index 7daa39aba80..c4aba92540a 100644
      --- a/pio/pionfread_mod.F90.in
      +++ b/pio/pionfread_mod.F90.in
      @@ -1,6 +1,6 @@
       #define __PIO_FILE__ "pionfread_mod.F90.in"
       !>
      -!! @file 
      +!! @file
       !! $Revision$
       !! $LastChangedDate$
       !! @brief Decomposed Read interface to NetCDF
      @@ -10,7 +10,7 @@ module pionfread_mod
         implicit none
       
         private
      -!> 
      +!>
       !! @private
       !<
         public :: read_nf
      @@ -32,7 +32,7 @@ contains
       	pio_noerr, pio_iotype_netcdf4p, pio_iotype_netcdf4c, pio_iotype_pnetcdf, pio_iotype_netcdf, &
       	pio_max_var_dims
           use pio_kinds, only : pio_offset, i4, r4, r8
      -    use pio_utils, only : check_netcdf, bad_iotype 
      +    use pio_utils, only : check_netcdf, bad_iotype
           use pio_support, only : Debug, DebugIO, piodie, checkmpireturn
           use alloc_mod, only: alloc_check
       #ifdef _NETCDF
      @@ -80,7 +80,7 @@ contains
       
           ndims = size(start)
           if (File%iosystem%IOproc) then
      -       select case (iotype) 
      +       select case (iotype)
       #ifdef _PNETCDF
              case(pio_iotype_pnetcdf)
                 if(DebugIO) print *,__PIO_FILE__,__LINE__, &
      @@ -102,7 +102,7 @@ contains
              case(pio_iotype_netcdf4p)
       ! all reads can be parallel in netcdf4 format
                 ierr= nf90_get_var(File%fh, vardesc%varid, iobuf, start=int(start),count=int(count))
      -       case(pio_iotype_netcdf, pio_iotype_netcdf4c)	
      +       case(pio_iotype_netcdf, pio_iotype_netcdf4c)
                 iobuf_size=size(IOBUF)
                 call MPI_REDUCE( iobuf_size,max_iobuf_size, &
                      1,MPI_INTEGER,MPI_MAX,0,File%iosystem%IO_comm,mpierr )
      @@ -120,7 +120,7 @@ contains
                 endif
       
                 ! create temporaries of size int (netcdf limitation)
      -	 
      +
       	  temp_start=1
       	  temp_count=1
                 if (File%iosystem%io_rank>0) then
      diff --git a/pio/pionfwrite_mod.F90.in b/pio/pionfwrite_mod.F90.in
      index 03d5f8c23cf..6628abb59eb 100644
      --- a/pio/pionfwrite_mod.F90.in
      +++ b/pio/pionfwrite_mod.F90.in
      @@ -1,6 +1,6 @@
       #define __PIO_FILE__ "pionfwrite_mod.F90"
       !>
      -!! @file 
      +!! @file
       !! $Revision$
       !! $LastChangedDate$
       !! @brief Decomposed Write interface to NetCDF
      @@ -35,7 +35,7 @@ contains
       	pio_iotype_netcdf, pio_iotype_pnetcdf, pio_iotype_netcdf4p, pio_iotype_netcdf4c, pio_max_var_dims
           use pio_utils, only : check_netcdf, bad_iotype
           use alloc_mod, only: alloc_check
      -    use pio_support, only : Debug, DebugIO, piodie, checkmpireturn 
      +    use pio_support, only : Debug, DebugIO, piodie, checkmpireturn
       
       #ifdef _NETCDF
           use netcdf, only : nf90_put_var, nf90_inquire_variable   !_EXTERNAL
      @@ -90,7 +90,7 @@ contains
           if(file%iosystem%ioproc) then
              iotype = File%iotype
       
      -       select case (iotype) 
      +       select case (iotype)
       #ifdef _PNETCDF
              case(pio_iotype_pnetcdf)
       #ifdef DEBUG
      @@ -114,7 +114,7 @@ contains
       
       #ifdef _NETCDF
       #ifdef _NETCDF4
      -       case(PIO_iotype_netcdf4p)	
      +       case(PIO_iotype_netcdf4p)
                 ierr=nf90_var_par_access(File%fh, vardesc%varid, NF90_COLLECTIVE)
                 ierr=nf90_put_var(File%fh, vardesc%varid, iobuf,start=int(start),count=int(count))
       #endif
      @@ -138,12 +138,12 @@ contains
                       end if
                    end if
                 endif
      -	
      +
                 if(File%iosystem%io_rank==0) then
      -             ierr=nf90_inquire_variable(File%fh,vardesc%varid,ndims=ndims)	
      +             ierr=nf90_inquire_variable(File%fh,vardesc%varid,ndims=ndims)
                 end if
                 call MPI_BCAST(ndims,1,MPI_INTEGER,0,file%iosystem%io_comm,ierr)
      -          
      +
                 temp_start(1:ndims)=int(start(1:ndims))
       
                 temp_count(1:ndims)=int(count(1:ndims))
      @@ -167,11 +167,11 @@ contains
                            {MPITYPE}, &
                            0,File%iosystem%io_rank,File%iosystem%IO_comm,mpierr )
                       call CheckMPIReturn(subName, mpierr)
      -                
      +
                       call MPI_SEND( temp_start,ndims,MPI_INTEGER, &
                            0,File%iosystem%num_iotasks+File%iosystem%io_rank,File%iosystem%IO_comm,mpierr )
                       call CheckMPIReturn(subName, mpierr)
      -                
      +
                       call MPI_SEND( temp_count,ndims,MPI_INTEGER, &
                            0,2*File%iosystem%num_iotasks+File%iosystem%io_rank,File%iosystem%IO_comm,mpierr )
       
      @@ -179,7 +179,7 @@ contains
                    endif
                 endif
       
      -          if (File%iosystem%io_rank==0) then 
      +          if (File%iosystem%io_rank==0) then
                    fh = file%fh
                    vid = vardesc%varid
                    ierr=nf90_put_var( fh, vid,IOBUF,temp_start(1:ndims),temp_count(1:ndims))
      diff --git a/pio/piovdc.F90 b/pio/piovdc.F90
      index 69c9e858eea..c8e3c9743c1 100644
      --- a/pio/piovdc.F90
      +++ b/pio/piovdc.F90
      @@ -5,9 +5,9 @@
       !> @brief The piovdc library for writing Vapor Data Collection (VDC) 2 data files
       !> https://wiki.ucar.edu/display/dasg/PIOVDC
       !> 
      -!> @details The piovdc library is used to write VDC2 data files in a -!> parallel manner using PIO. After the prerequisite library functions are -!> used, a call to pio_writedarray is made, writing the passed +!> @details The piovdc library is used to write VDC2 data files in a +!> parallel manner using PIO. After the prerequisite library functions are +!> used, a call to pio_writedarray is made, writing the passed !> data to an on disk VDC2 collection.
      !> PRE-REQUISITES:
      !> VDF meta-file must be generated, using either rawtovdf or vdfcreate @@ -18,16 +18,16 @@ !> After a successful write, VDC2 data will be in a directory located in !> the same directory as the vdf file, using the vdf name, appended with _data !> (ex. ghost.vdf generates VDC2 data in the dir ghost_data in the vdf dir) -!> If no compression is enabled, a single, uncompressed file will be +!> If no compression is enabled, a single, uncompressed file will be !> generated using PIO instead of a VDC module piovdc use pio_kinds, only : i4, r4, pio_offset implicit none integer (i4) :: vdc_dims(3), vdc_bsize(3), vdc_ts - integer (kind=PIO_OFFSET) :: vdc_iostart(3), vdc_iocount(3) + integer (kind=PIO_OFFSET) :: vdc_iostart(3), vdc_iocount(3) contains - !> @brief subroutine checks start/count for out of bounds, adjusts if the start/count is too high, + !> @brief subroutine checks start/count for out of bounds, adjusts if the start/count is too high, !> zeroes start if it is invalid !> POST-EFFECTS: !>
      all start/counts are now legal, non-IO tasks have zeroed start counts @@ -51,7 +51,7 @@ subroutine adjust_bounds(global_dims, start, count, rank) #endif start = (/ 0, 0, 0/) count = (/ 0, 0, 0/) - else + else !start is legit but count might not be, check & adjust to the boundaries if(count(1) + start(1) - 1 .GT. global_dims(1)) then count(1) = global_dims(1) - start(1) + 1 @@ -74,7 +74,7 @@ end subroutine adjust_bounds !> POST-EFFECTS: !>
      Each MPI Task is now either and IO task or a computational task. IO tasks have nonzero start/counts !> @param[in] rank int rank of the current MPI task - !> @param[inout] nioprocs int represents the max possible # of IO procs, + !> @param[inout] nioprocs int represents the max possible # of IO procs, !> @algorithm will try to get as close as possible to this # and return it in nioprocs !> @param[in] blockdims int(3) global grid dimensions represented as VDC blocks !> @param[out] start int(3) iostart for the current MPI task @@ -104,7 +104,7 @@ subroutine auto_get_start_count(rank, nioprocs, block_dims, start, count, bsize, count = INT(block_dims * bsize) else do slab_counter=1, nslabs - do counter=1, nlinesPslab + do counter=1, nlinesPslab proc_count = CEILING(nlinesPslab / REAL(counter)) * CEILING(nslabs / REAL(slab_counter)) !test to see if counter # of lines per processor per slab is possible if (nioprocs >= proc_count) then @@ -116,7 +116,7 @@ subroutine auto_get_start_count(rank, nioprocs, block_dims, start, count, bsize, call adjust_bounds(data_dims, start, count, rank) if(proc_count .eq. nioprocs) then !using max #of procs, suitable solution found (for now) found = .TRUE. - exit + exit end if if (found) then exit @@ -151,17 +151,17 @@ subroutine init_vdc2(rank, data_dims, vdc_bsize, iostart, iocount, ioprocs) integer(i4), dimension(:), intent(in) :: data_dims, vdc_bsize integer (i4), intent(inout):: ioprocs !locals - real(r4) :: vdc_blocks(3) + real(r4) :: vdc_blocks(3) integer (i4) :: ierr - print *, 'Calling get start count...block_dims: ', data_dims/real(vdc_bsize), ' bsize: ' , & + print *, 'Calling get start count...block_dims: ', data_dims/real(vdc_bsize), ' bsize: ' , & vdc_bsize, ' ioprocs: ', ioprocs, ' dims: ', data_dims, ' rank: ',rank vdc_blocks = data_dims/real(vdc_bsize) call auto_get_start_count (rank, ioprocs, vdc_blocks, iostart, iocount, vdc_bsize, data_dims) -#ifdef DEBUG +#ifdef DEBUG print *, 'Retrieved VDF start count', iostart, '-', iocount, 'rank: ' , rank #endif diff --git a/pio/rearrange.F90.in b/pio/rearrange.F90.in index 771330dd1c0..44d74daade1 100644 --- a/pio/rearrange.F90.in +++ b/pio/rearrange.F90.in @@ -1,6 +1,6 @@ #define __PIO_FILE__ "rearrange.F90" !> -!! @file +!! @file !! $Revision$ !! $LastChangedDate$ !! @brief Generic interface to the rearrange layer @@ -22,7 +22,7 @@ module rearrange private save -!> +!> !! @private !< public :: rearrange_init, & @@ -117,7 +117,7 @@ contains !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! rearrange_init -! +! ! called from initFile_ ! @@ -150,7 +150,7 @@ contains integer, intent(in) :: dims(:) integer, intent(in) :: ndims type (IO_desc_t) :: ioDesc - + #ifdef TIMING call t_startf("PIO:pio_rearrange_create_box") #endif @@ -192,7 +192,7 @@ contains case (PIO_rearr_box) call box_rearrange_free(Iosystem,ioDesc) case (PIO_rearr_none) - ! do nothing + ! do nothing case default call piodie(__PIO_FILE__,__LINE__,'Unrecognized rearranger:',Iosystem%rearr) diff --git a/pio/topology.c b/pio/topology.c index b1e2f8b7987..fd4c9ca847e 100644 --- a/pio/topology.c +++ b/pio/topology.c @@ -8,7 +8,7 @@ #include #include -#ifdef BGL +#ifdef BGL #include #include @@ -73,7 +73,7 @@ char my_name[255]; void identity(MPI_Fint *comm, int *iotask) { - + MPI_Comm comm2; comm2 = MPI_Comm_f2c(*comm); MPI_Comm_rank(comm2,&rank); @@ -102,7 +102,7 @@ void identity(MPI_Fint *comm, int *iotask) get_personality (&pers, sizeof(pers)); #endif int numIONodes,numPsets,numNodesInPset,rankInPset; -#if defined(BGL) || defined(BGP) +#if defined(BGL) || defined(BGP) Personality_getLocationString (&pers, message); numIONodes = Personality_numIONodes (&pers); numNodesInPset = Personality_numNodesInPset (&pers); @@ -112,23 +112,23 @@ void identity(MPI_Fint *comm, int *iotask) int numpsets, psetID, psetsize, psetrank; bgq_pset_info (comm2, &numpsets, &psetID, &psetsize, &psetrank); - - numIONodes = numpsets; - numNodesInPset = psetsize; - rankInPset = rank; + + numIONodes = numpsets; + numNodesInPset = psetsize; + rankInPset = rank; #endif #ifdef BGL numPsets = Personality_numPsets (&pers); #endif -#ifdef BGP +#ifdef BGP rankInPset --; numPsets = BGP_Personality_numComputeNodes(&pers)/numNodesInPset; #endif #ifdef BGQ - numPsets = numpsets; + numPsets = numpsets; #endif - + if(rank == 0) { printf("number of IO nodes in block: %i \n",numIONodes);} if(rank == 0) { printf("number of Psets in block : %i \n",numPsets);} if(rank == 0) { printf("number of compute nodes in Pset: %i \n",numNodesInPset);} @@ -165,26 +165,26 @@ void identity(MPI_Fint *comm, int *iotask) } -void determineiotasks(const MPI_Comm comm, const int stride, const int rearr, +void determineiotasks(const MPI_Comm comm, const int stride, const int rearr, int *numiotasks,int *base, int *iamIOtask) { -/* +/* Returns the correct numiotasks and the flag iamIOtask Some concepts: - processor set: A group of processors on the Blue Gene system which have + processor set: A group of processors on the Blue Gene system which have one or more IO processor (Pset) - IO-node: A special Blue Gene node dedicated to performing IO. There + IO-node: A special Blue Gene node dedicated to performing IO. There are one or more per processor set - IO-client: This is software concept. This refers to the MPI task - which performs IO for the PIO library + IO-client: This is software concept. This refers to the MPI task + which performs IO for the PIO library */ - int psetNum; + int psetNum; int coreId; int iam; int task_count; @@ -215,16 +215,16 @@ void determineiotasks(const MPI_Comm comm, const int stride, const int rearr, #else get_personality (&pers, sizeof(pers)); #endif - + int numIONodes,numPsets,numNodesInPset,rankInPset; int numiotasks_per_node,remainder,numIONodes_per_pset; int lstride; - + /* Number of computational nodes in processor set */ - #ifdef BGQ + #ifdef BGQ int numpsets, psetID, psetsize, psetrank; bgq_pset_info (comm,&numpsets, &psetID, &psetsize, &psetrank); - numIONodes = numpsets; + numIONodes = numpsets; numNodesInPset = psetsize; #else /* total number of IO-nodes */ @@ -234,8 +234,8 @@ void determineiotasks(const MPI_Comm comm, const int stride, const int rearr, /* printf("Determine io tasks: me %i : nodes in pset= %i ionodes = %i\n", rank, numNodesInPset, numIONodes); */ - - if((*numiotasks) < 0 ) { + + if((*numiotasks) < 0 ) { /* negative numiotasks value indicates that this is the number per IO-node */ (*numiotasks) = - (*numiotasks); if((*numiotasks) > numNodesInPset) { @@ -264,7 +264,7 @@ void determineiotasks(const MPI_Comm comm, const int stride, const int rearr, numiotasks_per_node = 8; /* default number of IO-client per IO-node is not otherwise specificied */ } remainder = 0; - } + } /* number of IO nodes with a larger number of io-client per io-node */ if(remainder > 0) { @@ -277,26 +277,26 @@ void determineiotasks(const MPI_Comm comm, const int stride, const int rearr, } lstride = min(np,floor((float)numNodesInPset/(float)numiotasks_per_node)); } - + /* Number of processor sets */ #ifdef BGL numPsets = Personality_numPsets (&pers); #endif -#ifdef BGP +#ifdef BGP numPsets = BGP_Personality_numComputeNodes(&pers)/numNodesInPset; #endif #ifdef BGQ - numPsets = numpsets; + numPsets = numpsets; #endif - + /* number of IO nodes in processor set (I need to add - code to deal with the case where numIONodes_per_pset != 1 works + code to deal with the case where numIONodes_per_pset != 1 works correctly) */ numIONodes_per_pset = numIONodes/numPsets; - + /* Determine which core on node.... I don't want to put more than one io-task per node */ coreId = get_processor_id (); - + /* What is the rank of this node in the processor set */ #ifdef BGQ psetNum = psetID; @@ -306,49 +306,49 @@ void determineiotasks(const MPI_Comm comm, const int stride, const int rearr, psetNum = Personality_psetNum (&pers); rankInPset = Personality_rankInPset (&pers); #endif -#ifdef BGP +#ifdef BGP rankInPset--; #endif - + /* printf("Pset #: %i has %i nodes in Pset; base = %i\n",psetNum,numNodesInPset, base); */ - + (*iamIOtask) = 0; /* initialize to zero */ - + if (numiotasks_per_node == numNodesInPset) base = 0; /* Reset the base to 0 if we are using all tasks */ - /* start stridding MPI tasks from base task */ + /* start stridding MPI tasks from base task */ iam = max(0,rankInPset-(*base)); if (iam >= 0) { /* mark tasks that will be IO-tasks or IO-clients */ /* printf("iam = %d lstride = %d coreID = %d\n",iam,lstride,coreId); */ if((iam % lstride == 0) && (coreId == 0) ) { /* only io tasks indicated by stride and coreId = 0 */ - if((iam/lstride) < numiotasks_per_node) { + if((iam/lstride) < numiotasks_per_node) { /* only set the first (numiotasks_per_node - 1) tasks */ (*iamIOtask) = 1; } else if ((iam/lstride) == numiotasks_per_node) { - /* If there is an uneven number of io-clients to io-nodes - allocate the first remainder - 1 processor sets to + /* If there is an uneven number of io-clients to io-nodes + allocate the first remainder - 1 processor sets to have a total of numiotasks_per_node */ if(psetNum < remainder) {(*iamIOtask) = 1; - }; + }; } } /* printf("comm = %d iam = %d lstride = %d coreID = %d iamIOtask = %i \n",comm2, iam,lstride,coreId,(*iamIOtask)); */ } - }else{ + }else{ /* We are not doing rearrangement.... so all tasks are io-tasks */ (*iamIOtask) = 1; } - - /*printf("comm = %d myrank = %i iotask = %i \n", comm2, rank, (*iamIOtask));*/ - + + /*printf("comm = %d myrank = %i iotask = %i \n", comm2, rank, (*iamIOtask));*/ + /* now we need to correctly determine the numiotasks */ MPI_Allreduce(iamIOtask, &task_count, 1, MPI_INT, MPI_SUM, comm); (*numiotasks) = task_count; - - + + } int bgq_ion_id (void) @@ -412,7 +412,7 @@ int bgq_pset_info (MPI_Fint comm2, int* tot_pset, int* psetID, int* pset_size, i // Compute the ION BridgeNode ID key = bgq_ion_id (); - + // Create the pset_comm per bridge node status = MPI_Comm_split ( comp_comm2, key, comp_rank, &pset_comm); if ( MPI_SUCCESS != status) @@ -424,7 +424,7 @@ int bgq_pset_info (MPI_Fint comm2, int* tot_pset, int* psetID, int* pset_size, i // Calculate the rank in pset and pset size MPI_Comm_rank (pset_comm, rank_in_pset); MPI_Comm_size (pset_comm, pset_size); - + // Create the Bridge root nodes communicator bridge_root = 0; if (0 == *rank_in_pset) @@ -467,7 +467,7 @@ int bgq_pset_info (MPI_Fint comm2, int* tot_pset, int* psetID, int* pset_size, i } // Broadcast the PSET ID to all ranks in the psetcomm MPI_Bcast ( psetID, 1, MPI_INT, 0, pset_comm); - + // Free the split comm MPI_Comm_free (&pset_comm); diff --git a/scripts/Utils.pm b/scripts/Utils.pm index cb4fc5796f8..ef1eadc044d 100644 --- a/scripts/Utils.pm +++ b/scripts/Utils.pm @@ -83,27 +83,27 @@ sub preambleResource{ $preambleResource = ""; }elsif($host =~ "edinburgh" or $host =~ "carver"){ $nodes = ceil($pecount/$corespernode); - $preambleResource = "#PBS -l nodes=$nodes:ppn=$corespernode\n"; + $preambleResource = "#PBS -l nodes=$nodes:ppn=$corespernode\n"; }elsif($host =~ "aum"){ $nodes = ceil($pecount/$corespernode); - $preambleResource = "#PBS -l nodes=$nodes:ppn=$corespernode\n"; + $preambleResource = "#PBS -l nodes=$nodes:ppn=$corespernode\n"; }elsif($host =~ "cyberstar" ){ $nodes = ceil($pecount/$corespernode); - $preambleResource = "#PBS -l nodes=$nodes:nehalem:ppn=$corespernode\n"; + $preambleResource = "#PBS -l nodes=$nodes:nehalem:ppn=$corespernode\n"; }elsif($host =~ "lynx" or $host =~ "hopper"){ my $pecnt = $corespernode*ceil($pecount/$corespernode); - $preambleResource = "#PBS -l mppwidth=$pecnt\n"; + $preambleResource = "#PBS -l mppwidth=$pecnt\n"; }elsif($host =~ "athena" or $host =~ /janus/){ my $pecnt = $corespernode*ceil($pecount/$corespernode); - $preambleResource = "#PBS -l size=$pecnt\n"; + $preambleResource = "#PBS -l size=$pecnt\n"; }elsif($host =~ "kraken"){ my $pecnt = $corespernode*ceil($pecount/$corespernode); - $preambleResource = "#PBS -l size=$pecnt\n"; + $preambleResource = "#PBS -l size=$pecnt\n"; }elsif($host =~ "titan"){ my $nodecnt = ceil($pecount/$corespernode); - $preambleResource = "#PBS -l nodes=$nodecnt\n"; + $preambleResource = "#PBS -l nodes=$nodecnt\n"; }elsif($host =~ "columbia" or $host =~ "pleiades"){ - $preambleResource = "#PBS -l ncpus=$pecount\n"; + $preambleResource = "#PBS -l ncpus=$pecount\n"; } } @@ -160,10 +160,10 @@ sub loadmodules{ carver => "/usr/common/nsg/opt/Modules/default/", columbia => "/usr/share/modules/"}; #HOST SPECIFIC END - + return unless(defined $modpath->{$host}); - + #HOST SPECIFIC START if($host =~ "titan"){ require "/opt/modules/default/init/perl"; @@ -173,7 +173,7 @@ sub loadmodules{ module(" swap xt-asyncpe xt-asyncpe/5.16"); module("load szip/2.1"); module(" switch pgi pgi/12.10.0"); - module(" load netcdf-hdf5parallel/4.2.0"); + module(" load netcdf-hdf5parallel/4.2.0"); module(" load parallel-netcdf/1.3.1"); module("list"); }elsif($host eq "eos"){ @@ -197,19 +197,19 @@ sub loadmodules{ module(" load torque moab"); module(" load xt-mpt"); module(" switch pgi pgi/7.1.6"); - module(" load netcdf/3.6.2"); + module(" load netcdf/3.6.2"); module(" load p-netcdf/1.1.1"); module(" swap xt-asyncpe xt-asyncpe/1.0c"); module(" swap xt-binutils-quadcore xt-binutils-quadcore/2.0.1"); }elsif($host =~ "kraken"){ require "/opt/modules/default/init/perl"; module_check($modpath,$host); - module(" load netcdf/3.6.3"); + module(" load netcdf/3.6.3"); module(" load p-netcdf/1.2.0"); }elsif($host =~ "hopper"){ require "/opt/modules/default/init/perl"; module_check($modpath,$host); - module(" load cray-netcdf-hdf5parallel/4.3.0"); + module(" load cray-netcdf-hdf5parallel/4.3.0"); module(" load cray-parallel-netcdf/1.3.1.1"); module("list"); }elsif($host =~ "pleiades"){ @@ -244,7 +244,7 @@ sub loadmodules{ # module("load pnetcdf/1.3.0"); module("list"); }elsif($host eq "erebus"){ - require "/glade/apps/opt/lmod/lmod/init/perl"; + require "/glade/apps/opt/lmod/lmod/init/perl"; module_check($modpath,$host); module("load intel/13.1.2"); module("load ncarcompilers/1.0"); @@ -257,7 +257,7 @@ sub loadmodules{ module("list"); }elsif($host eq "yellowstone_pgi"){ print "Loading modules for $host\n"; - require "/glade/apps/opt/lmod/lmod/init/perl"; + require "/glade/apps/opt/lmod/lmod/init/perl"; module_check($modpath,"yellowstone"); module("rm netcdf"); module("rm intel"); @@ -271,7 +271,7 @@ sub loadmodules{ module("list"); }elsif($host eq "yellowstone_gnu"){ print "Loading modules for $host\n"; - require "/glade/apps/opt/lmod/lmod/init/perl"; + require "/glade/apps/opt/lmod/lmod/init/perl"; module_check($modpath,"yellowstone"); module("rm netcdf"); module("rm intel"); @@ -284,7 +284,7 @@ sub loadmodules{ module("load ncarbinlibs/0.0"); module("list"); }elsif($host eq "yellowstone"){ - require "/glade/apps/opt/lmod/lmod/init/perl"; + require "/glade/apps/opt/lmod/lmod/init/perl"; module_check($modpath,$host); # module("purge"); module("load intel/13.1.2"); @@ -297,7 +297,7 @@ sub loadmodules{ module("load cmake"); module("list"); } - + #HOST SPECIFIC END } diff --git a/scripts/config.pl b/scripts/config.pl index f115e6cadee..0f3d96600a6 100644 --- a/scripts/config.pl +++ b/scripts/config.pl @@ -7,7 +7,7 @@ my $compiler; my $build; my $result = GetOptions("host=s"=>\$host, - "compiler=s"=>\$compiler, + "compiler=s"=>\$compiler, "build=s"=>\$build); @@ -55,7 +55,7 @@ mkdir "$scratch"; chdir "$scratch" or die "Could not make directory $scratch"; - + system("cmake $cmake_opts -DCMAKE_VERBOSE_MAKEFILE=1 $piosrc"); system("gmake -j 4"); diff --git a/scripts/testpio_yellowstone.pl b/scripts/testpio_yellowstone.pl index 3d39aed5a83..20b2227305d 100755 --- a/scripts/testpio_yellowstone.pl +++ b/scripts/testpio_yellowstone.pl @@ -3,7 +3,7 @@ use File::Copy ; #BSUB -P P93300606 # project code #BSUB -W 0:40 # wall-clock time (hrs:mins) -#BSUB -n 64 # number of tasks in job +#BSUB -n 64 # number of tasks in job #BSUB -R "span[ptile=16]" # run 16 MPI tasks per node #BSUB -J testpio # job name #BSUB -o testpio.%J.out # output file name in which %J is replaced by the job ID @@ -68,6 +68,6 @@ print "FAIL \n"; print T "FAIL \n"; } - + } close(T); diff --git a/tests/testpio/CMakeLists.txt b/tests/testpio/CMakeLists.txt index e1b83c2ad4b..2678d672249 100644 --- a/tests/testpio/CMakeLists.txt +++ b/tests/testpio/CMakeLists.txt @@ -1,5 +1,5 @@ -SET(SRC check_mod.F90 gdecomp_mod.F90 kinds_mod.F90 namelist_mod.F90 +SET(SRC check_mod.F90 gdecomp_mod.F90 kinds_mod.F90 namelist_mod.F90 testpio.F90 utils_mod.F90) INCLUDE_DIRECTORIES(${PIO_INCLUDE_DIRS}) diff --git a/tests/testpio/MPASA30km.csh b/tests/testpio/MPASA30km.csh index a141354fa98..e030403c359 100755 --- a/tests/testpio/MPASA30km.csh +++ b/tests/testpio/MPASA30km.csh @@ -1,7 +1,7 @@ #!/usr/bin/csh set id = `date "+%m%d%y-%H%M"` set host = 'kraken' -#./testpio_bench.pl --maxiter 10 --iofmt pnc --numvars 10 --pecount 120 --bench MPASA30km -numIO 20 --partdir /lustre/scratch/jdennis/MPAS --logfile-suffix trunk_close +#./testpio_bench.pl --maxiter 10 --iofmt pnc --numvars 10 --pecount 120 --bench MPASA30km -numIO 20 --partdir /lustre/scratch/jdennis/MPAS --logfile-suffix trunk_close #./testpio_bench.pl --maxiter 10 --iofmt pnc --numvars 10 --pecount 240 --bench MPASA30km -numIO 40 --partdir /lustre/scratch/jdennis/MPAS --logfile-suffix trunk_close #./testpio_bench.pl --maxiter 10 --iofmt pnc --numvars 10 --pecount 480 --bench MPASA30km -numIO 80 --partdir /lustre/scratch/jdennis/MPAS --logfile-suffix trunk_close #./testpio_bench.pl --maxiter 10 --iofmt pnc --numvars 10 --pecount 960 --bench MPASA30km -numIO 160 --partdir /lustre/scratch/jdennis/MPAS --logfile-suffix trunk_close diff --git a/tests/testpio/README.testpio b/tests/testpio/README.testpio index db914e3c772..7156a9e1e38 100644 --- a/tests/testpio/README.testpio +++ b/tests/testpio/README.testpio @@ -1,7 +1,7 @@ TESTPIO README -Testpio tests both the accuracy and performance of reading and writing data +Testpio tests both the accuracy and performance of reading and writing data using the pio library. The tests are controlled via namelist. There are a set of general namelist and then namelist to setup a computational decomposition and an IO decomposition. The computational decomposition @@ -21,34 +21,34 @@ block, io_nml, contains some general settings: nx_global - integer, global size of "x" dimension ny_global - integer, global size of "y" dimension nz_global - integer, glboal size of "z" dimension - ioFMT - string, type and i/o method of data file + ioFMT - string, type and i/o method of data file ("bin","pnc","snc"), binary, pnetcdf, or serial netcdf - rearr - string, type of rearranging to be done + rearr - string, type of rearranging to be done ("none","mct","box","boxauto") nprocsIO - integer, number of IO processors used only when rearr is not "none", if rearr is "none", then the IO decomposition will be the computational decomposition base - integer, base pe associated with nprocIO striding stride - integer, the stride of io pes across the global pe set - num_aggregator - integer, mpi-io number of aggregators, only used if no + num_aggregator - integer, mpi-io number of aggregators, only used if no pio rearranging is done - dir - string, directory to write output data, this must exist + dir - string, directory to write output data, this must exist before the model starts up num_iodofs - tests either 1dof or 2dof init decomp interfaces (1,2) maxiter - integer, the number of trials for the test DebugLevel - integer, sets the debug level (0,1,2,3) compdof_input - string, setting of the compDOF ('namelist' or a filename) - compdof_output - string, whether the compDOF is saved to disk + compdof_output - string, whether the compDOF is saved to disk ('none' or a filename) Notes: - the "mct" rearr option is not currently available - - if rearr is set to "none", then the computational decomposition is also + - if rearr is set to "none", then the computational decomposition is also going to be used as the IO decomposition. The computation decomposition must therefore be suited to the underlying I/O methods. - if rearr is set to "box", then pio is going to generate an internal IO decomposition automatically and pio will rearrange to that decomp. - - num_aggregator is used with mpi-io and no pio rearranging. mpi-io is only + - num_aggregator is used with mpi-io and no pio rearranging. mpi-io is only used with binary data. - nprocsIO, base, and stride implementation has some special options if nprocsIO > 0 and stride > 0, then use input values @@ -66,7 +66,7 @@ blocks are identical in use. increasing this increases the flexibility of decompositions. grdorder - string, sets the gridcell ordering within the block ("xyz","xzy","yxz","yzx","zxy","zyx") - grddecomp - string, sets up the block size with gdx, gdy, and gdz, see + grddecomp - string, sets up the block size with gdx, gdy, and gdz, see below, ("x","y","z","xy","xye","xz","xze","yz","yze", "xyz","xyze","setblk") gdx - integer, "x" size of block @@ -89,7 +89,7 @@ are provided below. Testpio writes out several files including summary information to stdout, data files to the namelist dir directory, and a netcdf -file summarizing the decompositions. The key output information +file summarizing the decompositions. The key output information is stdout, which contains the timing information. In addition, a netcdf file called gdecomp.nc is written that provides both the block and task ids for each gridcell as computed by the decompositions. @@ -110,7 +110,7 @@ option to testpio_run.pl There are several testpio_in files for the pio test suite. The ones that come with pio test specific things. In general, there are tests for - sn = serial netcdf and no rearrangement + sn = serial netcdf and no rearrangement sb = serial netcdf and box rearrangement pn = parallel netcdf and no rearrangement pb = parallel netcdf and box rearrangement @@ -121,7 +121,7 @@ and the test number (01, etc) is consistent across I/O methods with 02 = simple 2d xy decomp across all pes with all pes active in I/O 03 = all data on root pe, all pes active in I/O 04 = simple 2d xy decomp with yxz ordering and stride=4 pes active in I/O - 05 = 2d xy decomp with 4 blocks/pe, yxz ordering, xy block decomp, and + 05 = 2d xy decomp with 4 blocks/pe, yxz ordering, xy block decomp, and stride=4 pes active in I/O 06 = 3d xy decomp with 4 blocks/pe, yxz ordering, xy block decomp, and stride=4 pes active in I/O @@ -146,24 +146,24 @@ DECOMPOSITION: The decomposition implementation supports the decomposition of a general 3 dimensional "nx * ny * nz" grid into multiple blocks -of gridcells which are then ordered and assigned to processors. -In general, blocks in the decomposition are rectangular, -"gdx * gdy * gdz" and the same size, although some blocks around -the edges of the domain may be smaller if the decomposition is uneven. -Both gridcells within the block and blocks within the domain can be +of gridcells which are then ordered and assigned to processors. +In general, blocks in the decomposition are rectangular, +"gdx * gdy * gdz" and the same size, although some blocks around +the edges of the domain may be smaller if the decomposition is uneven. +Both gridcells within the block and blocks within the domain can be ordered in any of the possible dimension hierarchies, such as "xyz" -where the first dimension is the fastest. +where the first dimension is the fastest. -The gdx, gdy, and gdz inputs allow the user to specify the size in -any dimension and the grddecomp input specifies which dimensions are -to be further optimized. In general, automatic decomposition generation -of 3 dimensional grids can be done in any of possible combination of +The gdx, gdy, and gdz inputs allow the user to specify the size in +any dimension and the grddecomp input specifies which dimensions are +to be further optimized. In general, automatic decomposition generation +of 3 dimensional grids can be done in any of possible combination of dimensions, (x, y, z, xy, xz, yz, or xyz), with the other dimensions having a fixed block size. The automatic generation of the decomposition is based upon an internal algorithm that tries to determine the most "square" blocks with an additional constraint on minimizing the maximum number of gridcells across processors. If evenly divided grids are -desired, use of the "e" addition to grddecomp specifies that the grid +desired, use of the "e" addition to grddecomp specifies that the grid decomposition must be evenly divided. the setblk option uses the prescibed gdx, gdy, and gdz inputs withtout further automation. @@ -172,7 +172,7 @@ in mapping blocks to processors, but has a few additional options. "cont1d" (contiguous 1d) basically unwraps the blocks in the order specified by the blkorder input and then decomposes that "1d" list of blocks onto processors by contiguously grouping blocks together and allocating -them to a processor. The number of contiguous blocks that are +them to a processor. The number of contiguous blocks that are allocated to a processor is the maximum of the values of bdx, bdy, and bdz inputs. Contiguous blocks are allocated to each processor in turn in a round robin fashion until all blocks are allocated. The @@ -181,13 +181,13 @@ contiguous blocks are set automatically such that each processor recieves only 1 set of contiguous blocks. The ysym2 and ysym4 blkdecomp2 options modify the original block layout such that the tasks assigned to the blocks are 2-way or 4-way symetric -in the y axis. +in the y axis. The decomposition tool is extremely flexible, but arbitrary inputs will not always yield valid decompositions. If a valid decomposition cannot be computed based on the global grid size, -number of pes, number of blocks desired, and decomposition options, -the model will stop. +number of pes, number of blocks desired, and decomposition options, +the model will stop. As indicated above, the IO decomposition must be suited to the IO methods, so decompositions are even further limited by those @@ -212,7 +212,7 @@ Some decomposition examples: Standard xyz ordering, 2d decomp: note: blkdecomp plays no role since there is 1 block per pe - nx_global 6 + nx_global 6 ny_global 4 nz_global 1 ______________________________ npes 4 |B3 P3 |B4 P4 | @@ -231,7 +231,7 @@ Standard xyz ordering, 2d decomp: Same as above but yxz ordering, 2d decomp note: blkdecomp plays no role since there is 1 block per pe - nx_global 6 + nx_global 6 ny_global 4 nz_global 1 _____________________________ npes 4 |B2 P2 |B4 P4 | @@ -248,10 +248,10 @@ Same as above but yxz ordering, 2d decomp bdy 0 |______________|______________| bdz 0 -xyz grid ordering, 1d x decomp +xyz grid ordering, 1d x decomp note: blkdecomp plays no role since there is 1 block per pe note: blkorder plays no role since it's a 1d decomp - nx_global 8 + nx_global 8 ny_global 4 nz_global 1 _____________________________________ npes 4 |B1 P1 |B2 P2 |B3 P3 |B4 P4 | @@ -269,7 +269,7 @@ xyz grid ordering, 1d x decomp bdz 0 yxz block ordering, 2d grid decomp, 2d block decomp, 4 block per pe - nx_global 8 + nx_global 8 ny_global 4 nz_global 1 _____________________________________ npes 4 |B4 P2 |B8 P2 |B12 P4 |B16 P4 | diff --git a/tests/testpio/build_defaults.xml b/tests/testpio/build_defaults.xml index e4591cc0e4c..55691bfc20d 100644 --- a/tests/testpio/build_defaults.xml +++ b/tests/testpio/build_defaults.xml @@ -31,7 +31,7 @@ #BSUB -J testpio_suite #BSUB -W 3:00 " - /> + /> @@ -65,7 +65,7 @@ #BSUB -J testpio_suite #BSUB -W 1:00 ' - /> + /> + /> + /> + /> + /> +/> +/> +/> 0) then @@ -62,7 +62,7 @@ subroutine check_1D_r8(my_comm, fname,wr_array,rd_array,len,iostat) wr_array(maxbadloc), rd_array(maxbadloc) if(present(iostat)) iostat = -20 endif - call dealloc_check(diff) + call dealloc_check(diff) end subroutine check_1D_r8 subroutine check_3D_r8(my_comm, fname,wr_array,rd_array) @@ -76,17 +76,17 @@ subroutine check_3D_r8(my_comm, fname,wr_array,rd_array) real(r8) :: lsum,gsum integer(i4) :: ierr,cbad,rank integer(i4) :: len1,len2,len3 - + len1 = SIZE(wr_array,dim=1) len2 = SIZE(wr_array,dim=2) len3 = SIZE(wr_array,dim=3) - + allocate(diff(len1,len2,len3)) - + diff = wr_array - rd_array cbad = COUNT(diff .ne. 0.0) lsum = SUM(diff) - + call MPI_Allreduce(lsum,gsum,1,MPI_REAL8,MPI_SUM,MY_COMM,ierr) call CheckMPIReturn('Call to MPI_Allreduce()',ierr,__FILE__,__LINE__) @@ -96,7 +96,7 @@ subroutine check_3D_r8(my_comm, fname,wr_array,rd_array) if(lsum .ne. 0.0) print *,'IAM: ', rank, 'File: ',TRIM(fname),& ' Error detected for correctness test(3D,R8): ',lsum,' # bad: ',cbad endif - deallocate(diff) + deallocate(diff) end subroutine check_3D_r8 @@ -111,17 +111,17 @@ subroutine check_3D_r4(my_comm, fname,wr_array,rd_array) real(r4) :: lsum,gsum integer(i4) :: ierr,cbad,rank integer(i4) :: len1,len2,len3 - + len1 = SIZE(wr_array,dim=1) len2 = SIZE(wr_array,dim=2) len3 = SIZE(wr_array,dim=3) - + allocate(diff(len1,len2,len3)) - + diff = wr_array - rd_array cbad = COUNT(diff .ne. 0.0) lsum = SUM(diff) - + call MPI_Allreduce(lsum,gsum,1,MPI_REAL,MPI_SUM,MY_COMM,ierr) call CheckMPIReturn('Call to MPI_Allreduce()',ierr,__FILE__,__LINE__) @@ -131,7 +131,7 @@ subroutine check_3D_r4(my_comm, fname,wr_array,rd_array) if(lsum .ne. 0) print *,'IAM: ', rank, 'File: ',TRIM(fname),& ' Error detected for correctness test(3D,R4): ',lsum,' # bad: ',cbad endif - deallocate(diff) + deallocate(diff) end subroutine check_3D_r4 @@ -146,17 +146,17 @@ subroutine check_3D_i4(my_comm, fname,wr_array,rd_array) integer(i4) :: lsum,gsum integer(i4) :: ierr,cbad,rank integer(i4) :: len1,len2,len3 - + len1 = SIZE(wr_array,dim=1) len2 = SIZE(wr_array,dim=2) len3 = SIZE(wr_array,dim=3) - + allocate(diff(len1,len2,len3)) - + diff = wr_array - rd_array cbad = COUNT(diff .ne. 0.0) lsum = SUM(diff) - + call MPI_Allreduce(lsum,gsum,1,MPI_INTEGER,MPI_SUM,MY_COMM,ierr) call CheckMPIReturn('Call to MPI_Allreduce()',ierr,__FILE__,__LINE__) if(gsum .ne. 0.0) then @@ -165,13 +165,13 @@ subroutine check_3D_i4(my_comm, fname,wr_array,rd_array) if(lsum .ne. 0) print *,'IAM: ', rank, 'File: ',TRIM(fname),& ' Error detected for correctness test(3D,I4): ',lsum,' # bad: ',cbad endif - deallocate(diff) + deallocate(diff) end subroutine check_3D_i4 subroutine check_1D_r4(my_comm,fname,wr_array,rd_array,len,iostat) integer, intent(in) :: my_comm - + character(len=*) :: fname real(r4) :: wr_array(:) real(r4) :: rd_array(:) @@ -181,11 +181,11 @@ subroutine check_1D_r4(my_comm,fname,wr_array,rd_array,len,iostat) real(r4) :: lsum,gsum integer(i4) :: ierr,len,cbad,rank - + ! Set default (no error) value for iostat if present) if(present(iostat)) iostat = PIO_noerr - + call alloc_check(diff,len,' check_1D_r4:diff ') if(len>0) then @@ -195,7 +195,7 @@ subroutine check_1D_r4(my_comm,fname,wr_array,rd_array,len,iostat) else lsum = 0 end if - + call MPI_Allreduce(lsum,gsum,1,MPI_REAL,MPI_SUM,MY_COMM,ierr) call CheckMPIReturn('Call to MPI_Allreduce()',ierr,__FILE__,__LINE__) if(abs(gsum) > tiny(gsum)) then @@ -205,7 +205,7 @@ subroutine check_1D_r4(my_comm,fname,wr_array,rd_array,len,iostat) ' Error detected for correctness test(1D,R4): ',lsum,' # bad: ',cbad if(present(iostat)) iostat = -20 endif - deallocate(diff) + deallocate(diff) end subroutine check_1D_r4 @@ -221,11 +221,11 @@ subroutine check_1D_i4(my_comm, fname,wr_array,rd_array,len,iostat) integer(i4) :: lsum,gsum integer(i4) :: ierr,cbad,rank - + ! Set default (no error) value for iostat if present) if(present(iostat)) iostat = PIO_noerr - + call alloc_check(diff,len,' check_1D_r4:diff ') if(len>0) then diff = wr_array - rd_array @@ -243,7 +243,7 @@ subroutine check_1D_i4(my_comm, fname,wr_array,rd_array,len,iostat) ' Error detected for correctness test(1D,I4): ',lsum,' # bad: ',cbad if(present(iostat)) iostat = -20 endif - deallocate(diff) + deallocate(diff) end subroutine check_1D_i4 diff --git a/tests/testpio/config_bench.xml b/tests/testpio/config_bench.xml index 0f8beaf2ea5..4c2f6840e7a 100644 --- a/tests/testpio/config_bench.xml +++ b/tests/testpio/config_bench.xml @@ -75,39 +75,39 @@ 256 256 256 + 256 256 256 80 48 60 + 80 48 60 32 48 60 + 32 48 60 32 24 60 + 32 24 60 16 24 60 + 16 24 60 16 12 60 + 16 12 60 - + 90 72 100 + 90 72 100 90 36 100 + 90 36 100 45 36 100 + 45 36 100 30 30 100 + 30 30 100 45 18 100 + 45 18 100 20 40 100 + 20 40 100 20 20 100 + 20 20 100 10 10 100 - + 576 6 26 diff --git a/tests/testpio/fdepends.awk b/tests/testpio/fdepends.awk index 03bab9769da..2980920cf23 100644 --- a/tests/testpio/fdepends.awk +++ b/tests/testpio/fdepends.awk @@ -19,9 +19,9 @@ BEGIN { IGNORECASE=1 # -# awk reads each line of the filename argument $2 until it finds +# awk reads each line of the filename argument $2 until it finds # a "use" or "#include" -# +# /^[ \t]*use[ \t]+/ { @@ -30,7 +30,7 @@ BEGIN { IGNORECASE=1 if ( $0 ~ /_EXTERNAL/ ) next # Assume the second field is the F90 module name, - # remove any comma at the end of the second field (due to + # remove any comma at the end of the second field (due to # ONLY or rename), and print it in a dependency line. sub(/,$/,"",$2) @@ -49,8 +49,8 @@ BEGIN { IGNORECASE=1 if ( $0 ~ /_EXTERNAL/ ) next # Remove starting or ending quote or angle bracket - sub(/^["<']/,"",$2) - sub(/[">']$/,"",$2) + sub(/^["<']/,"",$2) + sub(/[">']$/,"",$2) print PRLINE $2 - + } diff --git a/tests/testpio/gdecomp_mod.F90 b/tests/testpio/gdecomp_mod.F90 index 95e8b72dc13..79cdc0ba704 100644 --- a/tests/testpio/gdecomp_mod.F90 +++ b/tests/testpio/gdecomp_mod.F90 @@ -32,7 +32,7 @@ module gdecomp_mod character(len=128):: nml_file ! namelist filename if used character(len=16) :: nml_var ! namelist variable if used end type - + character(len=*),parameter :: modname = 'gdecomp_mod' integer(i4),parameter :: master_task = 0 @@ -51,7 +51,7 @@ subroutine gdecomp_set(gdecomp,nxg,nyg,nzg,gdx,gdy,gdz,bdx,bdy,bdz, & type(gdecomp_type), intent(inout) :: gdecomp ! NOTE: not all of these are optional, but optional allows -! them to be called in arbitrary order +! them to be called in arbitrary order integer(i4),optional :: nxg,nyg,nzg ! global grid size integer(i4),optional :: gdx,gdy,gdz ! block size @@ -175,7 +175,7 @@ subroutine gdecomp_set(gdecomp,nxg,nyg,nzg,gdx,gdy,gdz,bdx,bdy,bdz, & endif end subroutine gdecomp_set - + !================================================================== subroutine gdecomp_read_nml(gdecomp,nml_file,nml_var,my_task,ntasks,gdims) @@ -264,7 +264,7 @@ subroutine gdecomp_read_nml(gdecomp,nml_file,nml_var,my_task,ntasks,gdims) endif end subroutine gdecomp_read_nml - + !================================================================== subroutine gdecomp_print(gdecomp) @@ -386,7 +386,7 @@ subroutine gdecomp_DOF(gdecomp,my_task,DOF,start,count,write_decomp,test) !DBG print *,'IAM: ',my_task,'gdecomp_DOF: point #3 gsiz:',gsiz !DBG print *,'IAM: ',my_task,'gdecomp_DOF: point #3 bsiz:',bsiz - if(wdecomp) then + if(wdecomp) then allocate(blkid(gsiz(1),gsiz(2),gsiz(3))) allocate(tskid(gsiz(1),gsiz(2),gsiz(3))) blkid = -1 @@ -564,7 +564,7 @@ subroutine gdecomp_DOF(gdecomp,my_task,DOF,start,count,write_decomp,test) ! ii = (n3-1)*gsiz(2)*gsiz(1) + (n2-1)*gsiz(1) + n1 nbxyz = ((n3-1)/bsiz(3))*nblk(2)*nblk(1) + ((n2-1)/bsiz(2))*nblk(1) + & ((n1-1)/bsiz(1)) + 1 - if(wdecomp) then + if(wdecomp) then blkid(n1,n2,n3) = bxyzbord(nbxyz) tskid(n1,n2,n3) = bxyzpord(nbxyz) endif @@ -581,7 +581,7 @@ subroutine gdecomp_DOF(gdecomp,my_task,DOF,start,count,write_decomp,test) cntmax = maxval(cnta) ! --- map gridcells to dof --- - + if (testonly) then allocate(testdof(cntmax,0:gnpes-1)) testdof = 0 @@ -669,7 +669,7 @@ subroutine gdecomp_DOF(gdecomp,my_task,DOF,start,count,write_decomp,test) write(6,*) trim(subname),' start and count could NOT be computed ' endif -!------- MASTER TASK WRITE ------------------------------------- +!------- MASTER TASK WRITE ------------------------------------- if (my_task == master_task) then @@ -720,7 +720,7 @@ subroutine gdecomp_DOF(gdecomp,my_task,DOF,start,count,write_decomp,test) if (first_call) then rcode = nf90_create(ncname,nf90_clobber,ncid) else - rcode = nf90_open(ncname,nf90_write,ncid) + rcode = nf90_open(ncname,nf90_write,ncid) endif rcode = nf90_redef(ncid) dname = trim(gdecomp%nml_var)//'_nx' @@ -742,9 +742,9 @@ subroutine gdecomp_DOF(gdecomp,my_task,DOF,start,count,write_decomp,test) endif ! testonly -!------- END MASTER TASK WRITE --------------------------------- +!------- END MASTER TASK WRITE --------------------------------- - if(wdecomp) then + if(wdecomp) then deallocate(blkid,tskid) endif deallocate(cnta,cntb,bxyzbord,bxyzpord,bordpord) @@ -948,7 +948,7 @@ subroutine calcbsiz(npes,gsiz,bsiz,option,ierr) npes2 = npes2/m bs = bs - 1 else - write(6,*) trim(subname),' ERROR: bsiz not allowed ',n,gsiz(n),bsiz(n),m,npes,npes2 + write(6,*) trim(subname),' ERROR: bsiz not allowed ',n,gsiz(n),bsiz(n),m,npes,npes2 call piodie(__FILE__,__LINE__) endif endif @@ -1116,7 +1116,7 @@ end subroutine piodie subroutine mpas_decomp_generator(dim1,dim2,dim3,my_task,fname,dof) integer :: dim1, dim2, dim3 integer, intent(in) :: my_task ! my MPI rank - character(len=*),intent(in) :: fname ! name of MPAS partition file + character(len=*),intent(in) :: fname ! name of MPAS partition file integer(kind=pio_offset), pointer :: dof(:) ! Local variables @@ -1136,7 +1136,7 @@ subroutine mpas_decomp_generator(dim1,dim2,dim3,my_task,fname,dof) ! 1st dimension: vertical ! 2nd dimension: horizontal - gnz = dim1 + gnz = dim1 nCellsGlobal = dim2*dim3 call get_global_id_list(my_task,fname,nCellsSolve,nCellsGlobal,globalIDList) @@ -1201,7 +1201,7 @@ end subroutine get_global_id_list subroutine camlike_decomp_generator(gnx, gny, gnz, myid, ntasks, npr_yz, dof) integer, intent(in) :: gnx, gny, gnz, myid, ntasks, npr_yz(4) - integer(kind=pio_offset), pointer :: dof(:), tdof(:), tchk(:) + integer(kind=pio_offset), pointer :: dof(:), tdof(:), tchk(:) real, pointer :: rdof(:) integer(kind=pio_offset) :: dofsize,tdofsize @@ -1284,7 +1284,7 @@ subroutine camlike_decomp_generator(gnx, gny, gnz, myid, ntasks, npr_yz, dof) end do end do - CALL qsRecursive(1_PIO_OFFSET, dofsize, dof) !kicks off the recursive + CALL qsRecursive(1_PIO_OFFSET, dofsize, dof) !kicks off the recursive deallocate(tdof) @@ -1327,7 +1327,7 @@ integer(kind=pio_offset) FUNCTION qsPartition (loin, hiin, list) hi = hi - 1 END DO IF (hi /= lo) then !move the entry indexed by hi to left side of partition - list(lo) = list(hi) + list(lo) = list(hi) lo = lo + 1 END IF DO !move in from the left @@ -1335,7 +1335,7 @@ integer(kind=pio_offset) FUNCTION qsPartition (loin, hiin, list) lo = lo + 1 END DO IF (hi /= lo) then !move the entry indexed by hi to left side of partition - list(hi) = list(lo) + list(hi) = list(lo) hi = hi - 1 END IF END DO diff --git a/tests/testpio/namelist_mod.F90 b/tests/testpio/namelist_mod.F90 index 03d7d5cd6a3..e551af5fd30 100644 --- a/tests/testpio/namelist_mod.F90 +++ b/tests/testpio/namelist_mod.F90 @@ -21,7 +21,7 @@ module namelist_mod integer(kind=i4), public, parameter :: buffer_size_str_len = 20 integer(kind=i4), public, parameter :: true_false_str_len = 6 integer(kind=i4), public, parameter :: romio_str_len = 10 - + logical, public, save :: async integer(i4), public, save :: nx_global,ny_global,nz_global integer(i4), public, save :: rearr_type @@ -49,9 +49,9 @@ module namelist_mod integer(kind=i4), public, save :: set_lustre_values = 0 !! Set to one for true integer(kind=i4), public, save :: lfs_ost_count = 1 - + character(len=80), save, public :: compdof_input - character(len=80), save, public :: iodof_input + character(len=80), save, public :: iodof_input character(len=80), save, public :: compdof_output character(len=256), save, public :: part_input character(len=256), save, public :: casename @@ -125,7 +125,7 @@ subroutine ReadTestPIO_Namelist(device, nprocs, filename, caller, ierror) character(len=*), parameter :: myname_=myname//'ReadPIO_Namelist' !------------------------------------------------- - ! set default values for namelist io_nml variables + ! set default values for namelist io_nml variables !------------------------------------------------- async = .false. @@ -175,14 +175,14 @@ subroutine ReadTestPIO_Namelist(device, nprocs, filename, caller, ierror) open (device, file=filename,status='old',iostat=ierror) - if(ierror /= 0) then + if(ierror /= 0) then write(*,*) caller,'->',myname_,':: Error opening file ',filename, & ' on device ',device,' with iostat=',ierror ierror = -1 else ierror = 1 endif - + do while (ierror > 0) read(device, nml=io_nml, iostat=ierror) enddo @@ -319,7 +319,7 @@ subroutine ReadTestPIO_Namelist(device, nprocs, filename, caller, ierror) stride = (nprocs-base)/num_iotasks endif elseif (nprocsIO <= 0) then -#ifdef BGx +#ifdef BGx ! A negative value for num_iotasks has a special meaning on Blue Gene num_iotasks = nprocsIO #else @@ -334,7 +334,7 @@ subroutine ReadTestPIO_Namelist(device, nprocs, filename, caller, ierror) endif !------------------------------------------------ - ! reset stride if there are not enough processors + ! reset stride if there are not enough processors !------------------------------------------------ if (base + num_iotasks * (stride-1) > nprocs-1) then stride = FLOOR(real((nprocs - 1 - base),kind=r8)/real(num_iotasks,kind=r8)) @@ -343,9 +343,9 @@ subroutine ReadTestPIO_Namelist(device, nprocs, filename, caller, ierror) !------------------------------------------------------- ! If rearrangement is 'none' reset to the proper values !------------------------------------------------------- - if(trim(rearr) == 'none') then + if(trim(rearr) == 'none') then stride = 1 - num_iotasks = nprocs + num_iotasks = nprocs endif write(*,*) trim(string),' n_iotasks = ',num_iotasks,' (updated)' @@ -382,7 +382,7 @@ subroutine Broadcast_Namelist(caller, myID, root, comm, ierror) integer(i4) :: itmp !------------------------------------------ - ! broadcast namelist info to all processors + ! broadcast namelist info to all processors !------------------------------------------ if(async) then diff --git a/tests/testpio/test_lib.F90 b/tests/testpio/test_lib.F90 index 404de647b24..da8ebf4952c 100644 --- a/tests/testpio/test_lib.F90 +++ b/tests/testpio/test_lib.F90 @@ -2,7 +2,7 @@ program Test_Lib use pio !everything is forwarded from the PIO module, should be the only use necessary use pio_kinds implicit none - + include 'mpif.h' type (Var_desc_t) :: var_handle_no_comp !type handle for normal, uncompressed PIO variables type (Var_desc_t) :: var_handle !type handle for compressed, VDC variables @@ -21,19 +21,19 @@ program Test_Lib integer(i4) :: dims(3) !the 3D grid size used to write VDC data integer(i4) :: n !counter integer(kind=PIO_Offset) :: dpp !data per process, the amount of data each MPI task contributes to the overall file - integer(kind=PIO_Offset),allocatable :: compdof(:) !computational degrees-of-freedom, this array holds the mapping from the local + integer(kind=PIO_Offset),allocatable :: compdof(:) !computational degrees-of-freedom, this array holds the mapping from the local !slice of computational data to the global grid real (r4), allocatable :: array(:), read_array(:) !arrays holding the local computational data #ifdef DEBUG double precision :: start, end, temp !timing variables #endif - + !first set locals for vdc compression and the uncompressed data path dims = (/1024, 1024, 1024/) vdf_path = '/glade/scratch/ypolius/piovdc/libbench.vdf' binary_path = '/glade/scratch/ypolius/piovdc/benchdata.nc' nioprocs = 64 - + !init MPI and retrieve MPI-specific info call MPI_init(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) @@ -44,10 +44,10 @@ program Test_Lib print *, 'Initiating PIO...' endif #endif - + !call PIO_init to initiate iosystem - call PIO_init(rank, MPI_COMM_WORLD, nioprocs, nioprocs, 1, PIO_rearr_box, iosystem, 0) - + call PIO_init(rank, MPI_COMM_WORLD, nioprocs, nioprocs, 1, PIO_rearr_box, iosystem, 0) + #ifdef DEBUG if(rank .eq. 0 ) then print *, 'PIO Initiated procs: ', nioprocs @@ -57,8 +57,8 @@ program Test_Lib !set data-per-process to be the # of grid elements / # of computational procs !conversions to PIO_Offset int to allow for extremely large dims, ex 2048 x 2048 x 2048 dpp = int(dims(1), kind=PIO_Offset) * int(dims(2), kind=PIO_Offset) * int(dims(3), kind=PIO_Offset) / int(nprocs, kind=PIO_Offset) - - !allocate local memory arrays + + !allocate local memory arrays if(allocated(array)) then deallocate(array) endif @@ -80,7 +80,7 @@ program Test_Lib allocate(compdof(dpp)) -#ifdef DEBUG +#ifdef DEBUG if(rank .eq. 0 ) then print *, 'Allocated compdof' print *, 'Filling compdof array...dpp-comp: ', dpp, ' dpp-io: ', product(dims)/nioprocs, ' dims: ' , dims, ' int limit: ' , huge(compdof(1)), ' sample calc: ' , product(dims) @@ -105,7 +105,7 @@ program Test_Lib print *, 'Filled data array: '!, array(1), '-' , array(2) endif #endif - + #ifdef DEBUG if(rank .eq. 0 ) then print *, 'Initializing decomposition...' @@ -118,12 +118,12 @@ program Test_Lib !call init_decomp in order to setup the IO decomposition with PIO ! The optional parameter num_ts is required to indicate the vdc output method - call PIO_initdecomp(iosystem, PIO_real, dims, compdof, iodesc, num_ts=10) - + call PIO_initdecomp(iosystem, PIO_real, dims, compdof, iodesc, num_ts=10) + !example using optional bsize and # timesteps specifiers - !call PIO_initdecomp(iosystem, PIO_real, dims, compdof, iodesc, bsize=(/128, 128, 128/), num_ts=30) + !call PIO_initdecomp(iosystem, PIO_real, dims, compdof, iodesc, bsize=(/128, 128, 128/), num_ts=30) #ifdef DEBUG - if(rank .eq. 0) then + if(rank .eq. 0) then print *, 'Decomposition initialized' print *, 'Creating vdf file' endif @@ -134,13 +134,13 @@ program Test_Lib ierr = PIO_CreateFile(iosystem, file_handle, PIO_iotype_vdc2, vdf_path, PIO_clobber) #ifdef DEBUG - if(rank .eq. 0) then + if(rank .eq. 0) then print *, 'VDF file created' print *, 'Opening vdf var for writing...(vx0)' endif #endif - - !define the variables that will be written into the VDC + + !define the variables that will be written into the VDC !VDC WRITING DOES NOT REQUIRE CREATING DIMS, THERE ARE ALWAYS 3, dims = (/x, y, z/) iostat = PIO_def_var(file_handle, 'vx' , PIO_real,var_handle) @@ -161,7 +161,7 @@ program Test_Lib #endif !to write data call PIO_write_darray, the only difference with compressed vs uncompressed - !writing is that compressed writing requires that the the user inputs the current time step + !writing is that compressed writing requires that the the user inputs the current time step !corresponding to the variable about to be written call PIO_write_darray(file_handle, var_handle, iodesc, array, iostat) @@ -178,7 +178,7 @@ program Test_Lib !to read data call PIO_read_darray, the only difference with compressed vs uncompressed - !reading is that compressed reading requires that the the user inputs the current time step + !reading is that compressed reading requires that the the user inputs the current time step !corresponding to the variable about to be read call PIO_read_darray(file_handle, var_handle, iodesc, read_array, iostat) @@ -187,18 +187,18 @@ program Test_Lib #endif !Setup for UNCOMPRESSED files - + !Same call as the VDF file, but we switch the IO type to netcdf ierr = PIO_CreateFile(iosystem, file_handle_no_comp, PIO_iotype_pnetcdf, binary_path, PIO_clobber) - + !define the dimensions to be used with the file PIO writes iostat = PIO_def_dim(file_handle_no_comp, 'z', dims(3), dim_ids(3)) iostat = PIO_def_dim(file_handle_no_comp, 'y', dims(2), dim_ids(2)) iostat = PIO_def_dim(file_handle_no_comp, 'x', dims(1), dim_ids(1)) - + !define variables to be written iostat = PIO_def_var(file_handle_no_comp, 'vx', PIO_real, dim_ids, var_handle_no_comp) - + !end definition to make file valid ierr = PIO_enddef(file_handle_no_comp) @@ -229,7 +229,7 @@ program Test_Lib #ifdef DEBUG if(rank .eq. 0 ) then - print *, 'Finalized PIO' + print *, 'Finalized PIO' endif #endif diff --git a/tests/testpio/testdecomp.F90 b/tests/testpio/testdecomp.F90 index 9684e14a19d..6ea015fd56e 100644 --- a/tests/testpio/testdecomp.F90 +++ b/tests/testpio/testdecomp.F90 @@ -7,7 +7,7 @@ program testdecomp use gdecomp_mod implicit none - + integer, pointer :: compDOF(:), ioDOF(:) integer :: startcomp(3),cntcomp(3) integer :: startio(3),cntio(3),gdims(3) @@ -23,7 +23,7 @@ program testdecomp num_tasks = 192 gdims(1) = 3600 gdims(2) = 2400 - gdims(3) = 40 + gdims(3) = 40 ! call gdecomp_read_nml(gdecomp,fin,'comp',my_task) ! print *,'after gdecomp_read_nml' diff --git a/tests/testpio/testpio.F90 b/tests/testpio/testpio.F90 index fa1ef6d62b0..010faca5b6c 100644 --- a/tests/testpio/testpio.F90 +++ b/tests/testpio/testpio.F90 @@ -46,7 +46,7 @@ program testpio integer(i4) :: indx integer(i4) :: mode - integer(i4) :: ip,numPhases + integer(i4) :: ip,numPhases character(len=*), parameter :: TestR8CaseName = 'r8_test' character(len=*), parameter :: TestR4CaseName = 'r4_test' character(len=*), parameter :: TestI4CaseName = 'i4_test' @@ -101,11 +101,11 @@ program testpio real(r8) :: dt_write_r8, dt_write_r4, dt_write_i4 ! individual write times real(r8) :: dt_read_r8, dt_read_r4, dt_read_i4 ! individual read times ! Arrays to hold globally reduced read/write times--one element per time trial - real(r8), dimension(:), pointer :: gdt_write_r8, gdt_write_r4, gdt_write_i4 + real(r8), dimension(:), pointer :: gdt_write_r8, gdt_write_r4, gdt_write_i4 real(r8), dimension(:), pointer :: gdt_read_r8, gdt_read_r4, gdt_read_i4 integer(i4) :: nprocs - integer(i4) :: lLength ! local number of words in the computational decomposition + integer(i4) :: lLength ! local number of words in the computational decomposition integer(i4), parameter :: nml_in = 10 character(len=*), parameter :: nml_filename = 'testpio_in' @@ -147,7 +147,7 @@ program testpio call MPI_INIT(ierr) call CheckMPIReturn('Call to MPI_INIT()',ierr,__FILE__,__LINE__) - + ! call enable_abort_on_exit @@ -198,7 +198,7 @@ program testpio endif #endif -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -210,7 +210,7 @@ program testpio !---------------------------------------------------------------- if(Debug) print *,'testpio: before call to readTestPIO_Namelist' - if(my_task == master_task) then + if(my_task == master_task) then call ReadTestPIO_Namelist(nml_in, nprocs, nml_filename, myname, nml_error) endif if(Debug) print *,'testpio: before call to broadcast_namelist' @@ -222,7 +222,7 @@ program testpio ! Checks (num_iotasks can be negative on BGx) !------------------------------------- -#if !defined(BGx) +#if !defined(BGx) if (num_iotasks <= 0) then write(*,*) trim(myname),' ERROR: ioprocs invalid num_iotasks=',num_iotasks call piodie(__FILE__,__LINE__) @@ -232,7 +232,7 @@ program testpio ! ---------------------------------------------------------------- ! if stride is and num_iotasks is incompatible than reset stride (ignore stride on BGx) ! ---------------------------------------------------------------- -#if !defined(BGx) +#if !defined(BGx) if (base + num_iotasks * (stride-1) > nprocs-1) then write(*,*) trim(myname),' ERROR: num_iotasks, base and stride too large', & ' base=',base,' num_iotasks=',num_iotasks,' stride=',stride,' nprocs=',nprocs @@ -241,7 +241,7 @@ program testpio #endif !-------------------------------------- - ! Initalizes the parallel IO subsystem + ! Initalizes the parallel IO subsystem !-------------------------------------- call PIO_setDebugLevel(DebugLevel) @@ -264,7 +264,7 @@ program testpio call MPI_COMM_SIZE(MPI_COMM_COMPUTE,nprocs,ierr) else -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -277,7 +277,7 @@ program testpio call PIO_init(my_task, MPI_COMM_COMPUTE, num_iotasks, num_aggregator, stride, & rearr_type, PIOSYS, base) -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -333,7 +333,7 @@ program testpio trim(ibm_io_sparse_access)) end if end if - if(set_lustre_values /= 0) then + if(set_lustre_values /= 0) then call PIO_setnum_OST(PIOSYS,lfs_ost_count) endif @@ -349,11 +349,11 @@ program testpio if(index(casename,'CAM')==1) then call camlike_decomp_generator(gdims3d(1),gdims3d(2),gdims3d(3),my_task,nprocs,npr_yz,compDOF) - elseif(index(casename,'MPAS')==1) then + elseif(index(casename,'MPAS')==1) then ! print *,'testpio: before call to mpas_decomp_generator: (',TRIM(part_input),') gdims3d: ',gdims3d call mpas_decomp_generator(gdims3d(1),gdims3d(2),gdims3d(3),my_task,part_input,compDOF) else if (trim(compdof_input) == 'namelist') then -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -363,7 +363,7 @@ program testpio if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #1' call gdecomp_read_nml(gdecomp,nml_filename,'comp',PIOSYS%comp_rank,PIOSYS%num_tasks,gDims3D(1:3)) -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -374,7 +374,7 @@ program testpio if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #2' call gdecomp_DOF(gdecomp,PIOSYS%comp_rank,compDOF,start,count) if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #3', minval(compdof),maxval(compdof) -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -407,7 +407,7 @@ program testpio endif endif -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -421,7 +421,7 @@ program testpio call pio_writedof(trim(compdof_output),compDOF,MPI_COMM_COMPUTE,75) endif -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -478,7 +478,7 @@ program testpio else call piodie(__FILE__,__LINE__,' rearr '//trim(rearr)//' not supported') endif -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -501,26 +501,26 @@ program testpio lLength = size(compDOF) !---------------------- - ! allocate and set test arrays + ! allocate and set test arrays !---------------------- if(iotype == PIO_IOTYPE_vdc2) then CheckArrays=.false. TestR8 = .false. TestR4 = .true. TestInt = .false. - TestCombo = .false. + TestCombo = .false. end if - if(TestR8 .or. TestCombo) then + if(TestR8 .or. TestCombo) then call alloc_check(test_r8wr,lLength,'testpio:test_r8wr') endif - if(TestR4 .or. TestCombo) then + if(TestR4 .or. TestCombo) then call alloc_check(test_r4wr,lLength,'testpio:test_r4wr' ) endif - if(TestInt .or. TestCombo) then + if(TestInt .or. TestCombo) then call alloc_check(test_i4wr,lLength,'testpio:test_i4wr') endif - if(TestInt) then + if(TestInt) then call alloc_check(test_i4i ,lLength,'testpio:test_i4i ') call alloc_check(test_i4j ,lLength,'testpio:test_i4j ') call alloc_check(test_i4k ,lLength,'testpio:test_i4k ') @@ -530,26 +530,26 @@ program testpio do n = 1,lLength call c1dto3d(compdof(n),gDims3D(1),gDims3D(2),gDims3D(3),i1,j1,k1) - if(TestInt) then + if(TestInt) then test_i4dof(n) = compdof(n) test_i4i(n) = i1 test_i4j(n) = j1 test_i4k(n) = k1 test_i4m(n) = my_task endif - if(TestR8 .or. TestCombo) then + if(TestR8 .or. TestCombo) then test_r8wr(n) = 10.0_r8*cos(20.*real(i1,kind=r8)/real(gDims3D(1),kind=r8))* & cos(10.*real(j1,kind=r8)/real(gDims3D(2),kind=r8))* & (1.0+1.0*real(j1,kind=r8)/real(gDims3D(2),kind=r8))* & cos(25.*real(k1,kind=r8)/real(gDims3D(3),kind=r8)) endif - if(TestR4 .or. TestCombo) then + if(TestR4 .or. TestCombo) then test_r4wr(n) = 10.0_r4*cos(20.*real(i1,kind=r4)/real(gDims3D(1),kind=r4))* & cos(10.*real(j1,kind=r4)/real(gDims3D(2),kind=r4))* & (1.0+1.0*real(j1,kind=r4)/real(gDims3D(2),kind=r4))* & cos(25.*real(k1,kind=r4)/real(gDims3D(3),kind=r4)) endif - if(TestInt .or. TestCombo) then + if(TestInt .or. TestCombo) then test_i4wr(n) = nint(10.0_r8*cos(20.*real(i1,kind=r8)/real(gDims3D(1),kind=r8))* & cos(10.*real(j1,kind=r8)/real(gDims3D(2),kind=r8))* & (1.0+1.0*real(j1,kind=r8)/real(gDims3D(2),kind=r8))* & @@ -558,7 +558,7 @@ program testpio enddo if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #10' -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -581,7 +581,7 @@ program testpio !-------------------------------- ! allocate arrays for holding globally-reduced timing information !-------------------------------- -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -595,25 +595,25 @@ program testpio call alloc_check(gdt_write_i4, maxiter, ' testpio:gdt_write_i4 ') call alloc_check(gdt_read_i4, maxiter, ' testpio:gdt_read_i4 ') if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #11' -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss print *,__FILE__,__LINE__,'mem=',rss,' it=',it end if #endif - if(splitPhase) then + if(splitPhase) then numPhases = 2 else numPhases = 1 endif do ip=1,numPhases - if(numPhases == 1) then + if(numPhases == 1) then readPhase = .true. writePhase = .true. else - if(ip == 1) then + if(ip == 1) then writePhase = .true. readPhase = .false. else @@ -625,7 +625,7 @@ program testpio do it=1,maxiter -#ifdef MEMCHK +#ifdef MEMCHK call GPTLget_memusage(msize, rss, mshare, mtext, mstack) if(rss>lastrss) then lastrss=rss @@ -638,14 +638,14 @@ program testpio if (trim(rearr) == 'box') then !JMD print *,__FILE__,__LINE__,gdims3d,minval(compdof),maxval(compdof) - + if (trim(iodof_input) == 'namelist') then if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #7' if(TestR8 .or. TestCombo) & call PIO_initDecomp(PIOSYS,PIO_double, gDims3D,compDOF,& IOdesc_r8,startpio,countpio) if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #7.1' - + if(TestR4 .or. TestCombo) then if(iotype == PIO_IOTYPE_vdc2) then call PIO_initDecomp(PIOSYS, gDims3D,compDOF,IOdesc_r4,10) @@ -751,7 +751,7 @@ program testpio endif endif if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #9' - + if(Debug) then write(*,'(a,2(a,i8))') myname,':: After call to initDecomp. comp_rank=',piosys%comp_rank, & ' io_rank=',piosys%io_rank @@ -759,10 +759,10 @@ program testpio call PIO_getnumiotasks(PIOSYS,num_iotasks) !------------ - ! Open file{s} + ! Open file{s} !------------ write(citer,'(i3.3)') it - + fname = TRIM(dir)//'foo.'//citer//'.'//TRIM(Iofmtd) fname_r8 = TRIM(dir)//'foo.r8.'//citer//'.'//TRIM(Iofmtd) fname_r4 = TRIM(dir)//'foo.r4.'//citer//'.'//TRIM(Iofmtd) @@ -777,7 +777,7 @@ program testpio mode = 0 #endif - if(writePhase) then + if(writePhase) then if(TestCombo) then if(Debug) write(*,'(2a,i8)') myname,':: Combination Test: Creating File...it=',it ierr = PIO_CreateFile(PIOSYS,File,iotype,trim(fname), mode) @@ -802,22 +802,22 @@ program testpio call check_pioerr(ierr,__FILE__,__LINE__,' i4 createfile') endif - + allocate(vard_r8(nvars), vard_r4(nvars)) - + !--------------------------- - ! Code specifically for netCDF files + ! Code specifically for netCDF files !--------------------------- - if(iotype == iotype_pnetcdf .or. & + if(iotype == iotype_pnetcdf .or. & iotype == iotype_netcdf .or. & iotype == PIO_iotype_netcdf4p .or. & iotype == PIO_iotype_netcdf4c .or. & iotype == PIO_IOTYPE_vdc2) then - if(TestR8) then + if(TestR8) then !----------------------------------- - ! for the single record real*8 file + ! for the single record real*8 file !----------------------------------- call WriteHeader(File_r8,nx_global,ny_global,nz_global,dimid_x,dimid_y,dimid_z) @@ -834,9 +834,9 @@ program testpio call check_pioerr(iostat,__FILE__,__LINE__,' r8 enddef') endif - if(TestR4) then + if(TestR4) then !----------------------------------- - ! for the single record real*4 file + ! for the single record real*4 file !----------------------------------- if(iotype /= PIO_IOTYPE_vdc2) then call WriteHeader(File_r4,nx_global,ny_global,nz_global,dimid_x,dimid_y,dimid_z) @@ -853,14 +853,14 @@ program testpio call check_pioerr(iostat,__FILE__,__LINE__,' i4 enddef') endif - if(TestInt) then + if(TestInt) then !----------------------------------- - ! for the single record integer file + ! for the single record integer file !----------------------------------- call WriteHeader(File_i4,nx_global,ny_global,nz_global,dimid_x,dimid_y,dimid_z) - iostat = PIO_def_var(File_i4,'fdof',PIO_int,(/dimid_x,dimid_y,dimid_z/),vard_i4dof) + iostat = PIO_def_var(File_i4,'fdof',PIO_int,(/dimid_x,dimid_y,dimid_z/),vard_i4dof) call check_pioerr(iostat,__FILE__,__LINE__,' i4dof defvar') - + iostat = PIO_def_var(File_i4,'field',PIO_int,(/dimid_x,dimid_y,dimid_z/),vard_i4) call check_pioerr(iostat,__FILE__,__LINE__,' i4 defvar') iostat = PIO_def_var(File_i4,'fi',PIO_int,(/dimid_x,dimid_y,dimid_z/),vard_i4i) @@ -876,10 +876,10 @@ program testpio iostat = PIO_enddef(File_i4) call check_pioerr(iostat,__FILE__,__LINE__,' i4 enddef') endif - - if(TestCombo) then + + if(TestCombo) then !----------------------------------- - ! for the multi record file + ! for the multi record file !----------------------------------- call WriteHeader(File,nx_global,ny_global,nz_global,dimid_x,dimid_y,dimid_z) iostat = PIO_def_var(File,'field_r8',PIO_double,(/dimid_x,dimid_y,dimid_z/),vard_r8c) @@ -922,11 +922,11 @@ program testpio endif !------------------------- - ! Time the parallel write + ! Time the parallel write !------------------------- - - + + if(TestR8) then if(iofmtd .ne. 'bin') then iostat = pio_put_var(file_r8,varfn_r8,fname_r8) @@ -982,7 +982,7 @@ program testpio endif if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #13' - if(TestInt) then + if(TestInt) then dt_write_i4 = 0. call MPI_Barrier(MPI_COMM_COMPUTE,ierr) call CheckMPIReturn('Call to MPI_BARRIER()',ierr,__FILE__,__LINE__) @@ -1013,10 +1013,10 @@ program testpio call PIO_write_darray(File_i4,vard_i4m,iodesc_i4,test_i4m,iostat) call check_pioerr(iostat,__FILE__,__LINE__,' i4m write_darray') - call PIO_CloseFile(File_i4) + call PIO_CloseFile(File_i4) endif - if(TestCombo) then + if(TestCombo) then if(iofmtd .ne. 'bin') then iostat = pio_put_var(file,varfn,fname) end if @@ -1031,9 +1031,9 @@ program testpio endif if(Debug) then - write(*,'(a,2(a,i8),i8)') myname,':: After calls to PIO_write_darray. comp_rank=',piosys%comp_rank, & + write(*,'(a,2(a,i8),i8)') myname,':: After calls to PIO_write_darray. comp_rank=',piosys%comp_rank, & ' io_rank=',piosys%io_rank,piosys%io_comm - + endif endif @@ -1042,17 +1042,17 @@ program testpio if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #14' - if (readPhase) then + if (readPhase) then !------------------------------------- ! Open the file back up and check data !------------------------------------- - - if(TestR8) then + + if(TestR8) then ierr = PIO_OpenFile(PIOSYS, File_r8, iotype, fname_r8) call check_pioerr(ierr,__FILE__,__LINE__,' r8 openfile') endif if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #15' - + if(TestR4) then ierr = PIO_OpenFile(PIOSYS,File_r4,iotype, fname_r4) call check_pioerr(ierr,__FILE__,__LINE__,' r4 openfile') @@ -1068,14 +1068,14 @@ program testpio if(Debug) then write(*,'(2a,i8)') myname,':: After calls to PIO_OpenFile. my_task=',my_task endif - + if(Debug) print *,__FILE__,__LINE__ if(iotype == iotype_pnetcdf .or. & iotype == iotype_netcdf .or. & iotype == pio_iotype_vdc2) then do ivar=1,nvars - if(TestR8) then + if(TestR8) then iostat = PIO_inq_varid(file_r8,'filename',varfn_r8) @@ -1083,7 +1083,7 @@ program testpio call check_pioerr(iostat,__FILE__,__LINE__,' r8 inq_varid') endif - if(TestR4) then + if(TestR4) then if(iofmtd(2:3) .eq. 'nc') then iostat = PIO_inq_varid(file_r4,'filename',varfn_r4) end if @@ -1091,15 +1091,15 @@ program testpio !there currently exists no vdc concept of inquiring a variable, the only thing in the var_desc_t !directly used by the writing/reading is var name - iostat = PIO_def_var(File_r4,'field00001', PIO_real, vard_r4(ivar)) - + iostat = PIO_def_var(File_r4,'field00001', PIO_real, vard_r4(ivar)) + else - iostat = PIO_inq_varid(File_r4,'field00001',vard_r4(ivar)) + iostat = PIO_inq_varid(File_r4,'field00001',vard_r4(ivar)) endif call check_pioerr(iostat,__FILE__,__LINE__,' r4 inq_varid') endif end do - if(TestInt) then + if(TestInt) then iostat = PIO_inq_varid(File_i4,'field',vard_i4) call check_pioerr(iostat,__FILE__,__LINE__,' i4 inq_varid') endif @@ -1120,7 +1120,7 @@ program testpio !------------------------- ! Time the parallel read !------------------------- - if(TestR8) then + if(TestR8) then if(iofmtd(2:3) .eq. 'nc') then iostat = pio_get_var(file_r8,varfn_r8, fnamechk) if(fnamechk /= fname_r8) then @@ -1145,7 +1145,7 @@ program testpio call t_stopf('testpio_read') #endif et = MPI_Wtime() - dt_read_r8 = dt_read_r8 + (et - st)/nvars + dt_read_r8 = dt_read_r8 + (et - st)/nvars call check_pioerr(iostat,__FILE__,__LINE__,' r8 read_darray') endif @@ -1195,12 +1195,12 @@ program testpio endif !------------------------------- - ! Print the maximum memory usage + ! Print the maximum memory usage !------------------------------- ! call alloc_print_usage(0,'testpio: after calls to PIO_read_darray') #ifdef TESTMEM -! stop +! stop #endif if(Debug) then @@ -1209,7 +1209,7 @@ program testpio endif !------------------- - ! close the file up + ! close the file up !------------------- if(TestR8) call PIO_CloseFile(File_r8) if(TestR4) call PIO_CloseFile(File_r4) @@ -1225,13 +1225,13 @@ program testpio ! endif !----------------------------- - ! Perform correctness testing + ! Perform correctness testing !----------------------------- if(TestR8 .and. CheckArrays) then call checkpattern(mpi_comm_compute, fname_r8,test_r8wr,test_r8rd,lLength,iostat) call check_pioerr(iostat,__FILE__,__LINE__,' checkpattern r8 test') endif - + if( TestR4 .and. CheckArrays) then call checkpattern(mpi_comm_compute, fname_r4,test_r4wr,test_r4rd,lLength,iostat) call check_pioerr(iostat,__FILE__,__LINE__,' checkpattern r4 test') @@ -1243,15 +1243,15 @@ program testpio endif if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #21' - if(TestCombo .and. CheckArrays) then + if(TestCombo .and. CheckArrays) then !------------------------------------- - ! Open up and read the combined file + ! Open up and read the combined file !------------------------------------- - + ierr = PIO_OpenFile(PIOSYS,File,iotype,fname) call check_pioerr(ierr,__FILE__,__LINE__,' combo test read openfile') - + if(iofmtd(1:2).eq.'nc') then iostat = PIO_inq_varid(File,'field_r8',vard_r8c) call check_pioerr(iostat,__FILE__,__LINE__,' combo test r8 inq_varid') @@ -1266,7 +1266,7 @@ program testpio iostat = PIO_inq_varid(file,'filename',varfn) iostat = pio_get_var(file,varfn, fnamechk) - + if(piosys%io_rank==0 .and. fnamechk /= fname) then print *,__FILE__,__LINE__,'fname chk failed: ',trim(fname),'<>',trim(fnamechk),'<' end if @@ -1280,22 +1280,22 @@ program testpio if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #22' call PIO_CloseFile(File) - + !----------------------------- - ! Check the combined file + ! Check the combined file !----------------------------- call checkpattern(mpi_comm_compute, fname,test_r8wr,test_r8rd,lLength,iostat) call check_pioerr(iostat,__FILE__,__LINE__,' checkpattern test_r8 ') - + call checkpattern(mpi_comm_compute, fname,test_r4wr,test_r4rd,lLength,iostat) call check_pioerr(iostat,__FILE__,__LINE__,' checkpattern test_r4 ') - + call checkpattern(mpi_comm_compute, fname,test_i4wr,test_i4rd,lLength,iostat) call check_pioerr(iostat,__FILE__,__LINE__,' checkpattern test_i4 ') - + endif !--------------------------------------- - ! Print out the performance measurements + ! Print out the performance measurements !--------------------------------------- call MPI_Barrier(MPI_COMM_COMPUTE,ierr) endif @@ -1313,7 +1313,7 @@ program testpio if(writePhase) call GetMaxTime(dt_write_r4, gdt_write_r4(it), MPI_COMM_COMPUTE, ierr) endif if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #24' - + if(TestInt) then ! Maximum read/write times if(readPhase) call GetMaxTime(dt_read_i4, gdt_read_i4(it), MPI_COMM_COMPUTE, ierr) @@ -1334,7 +1334,7 @@ program testpio !-------------------------------- - ! Clean up initialization memory + ! Clean up initialization memory ! note: make sure DOFs are not used later !-------------------------------- if (PIOSYS%comp_rank >= 0) call dealloc_check(compDOF) @@ -1343,24 +1343,24 @@ program testpio endif !---------------------------------- - ! Print summary bandwidth statistics + ! Print summary bandwidth statistics !---------------------------------- if(Debug) print *,'iam: ',PIOSYS%comp_rank,'testpio: point #26' if(TestR8 .or. TestCombo .and. (piosys%io_rank == 0) ) then - call WriteTimeTrialsStats(casename,TestR8CaseName, fname_r8, glenr8, gdt_read_r8, gdt_write_r8, maxiter) + call WriteTimeTrialsStats(casename,TestR8CaseName, fname_r8, glenr8, gdt_read_r8, gdt_write_r8, maxiter) endif if(TestR4 .and. (piosys%io_rank == 0) ) then - call WriteTimeTrialsStats(casename,TestR4CaseName, fname_r4, glenr4, gdt_read_r4, gdt_write_r4, maxiter) + call WriteTimeTrialsStats(casename,TestR4CaseName, fname_r4, glenr4, gdt_read_r4, gdt_write_r4, maxiter) endif if(TestInt .and. (piosys%io_rank == 0) ) then - call WriteTimeTrialsStats(casename,TestI4CaseName, fname_i4, gleni4, gdt_read_i4, gdt_write_i4, maxiter) + call WriteTimeTrialsStats(casename,TestI4CaseName, fname_i4, gleni4, gdt_read_i4, gdt_write_i4, maxiter) endif !------------------------------- - ! Print timers and memory usage + ! Print timers and memory usage !------------------------------- #ifdef TIMING @@ -1478,7 +1478,7 @@ end subroutine WriteStats !============================================================================= - subroutine WriteTimeTrialsStats(casename,TestName, FileName, glen, ReadTimes, WriteTimes, nTrials) + subroutine WriteTimeTrialsStats(casename,TestName, FileName, glen, ReadTimes, WriteTimes, nTrials) implicit none diff --git a/tests/testpio/testpio_bench.pl b/tests/testpio/testpio_bench.pl index fe3a2239640..a47eada67f0 100755 --- a/tests/testpio/testpio_bench.pl +++ b/tests/testpio/testpio_bench.pl @@ -275,7 +275,7 @@ sub usage{ if($attributes{NETCDF_PATH} =~ /netcdf-4/){ $enablenetcdf4="--enable-netcdf4"; } - } + } } if(defined $suites){ @@ -314,7 +314,7 @@ sub usage{ ldz => 0, partfile => 'null', partdir => 'foo', - iofmt => 'pnc', + iofmt => 'pnc', rearr => 'box', numprocsIO => 10, stride => -1, @@ -435,7 +435,7 @@ sub usage{ $configuration{$name}=$value; } $found = 1; - } + } } #my $suffix = $bname . "-" . $pecount; my $suffix = $bname . "_PE-" . $pecount . "_IO-" . $iofmt . "-" . $numIO; @@ -587,8 +587,8 @@ sub usage{ }elsif(/ENV_(.*)/){ print "set $1 $attributes{$_}\n"; print F "\$ENV{$1}=\"$attributes{$_}\"\;\n"; - } - + } + } @@ -659,7 +659,7 @@ sub usage{ my \@testlist = \"$suffix"; # unlink("../pio/Makefile.conf"); # copy("testpio_in","$tstdir"); # copy the namelist file into test directory - + chdir ("$tstdir"); my \$test; my \$run = "$attributes{run}"; @@ -709,7 +709,7 @@ sub usage{ open(LOG,\$log); my \@logout = ; close(LOG); - + my \$cnt = grep /testpio completed successfully/ , \@logout; open(T,">TestStatus"); if(\$cnt>0){ @@ -724,7 +724,7 @@ sub usage{ close(T); } }else{ - print "suite \$suite FAILED to configure or build\\n"; + print "suite \$suite FAILED to configure or build\\n"; } } print "test complete on $host \$passcnt tests PASS, \$failcnt tests FAIL\\n"; diff --git a/tests/testpio/testpio_build.pl b/tests/testpio/testpio_build.pl index 56faccd69fd..720e92df12f 100644 --- a/tests/testpio/testpio_build.pl +++ b/tests/testpio/testpio_build.pl @@ -47,8 +47,8 @@ }elsif(/ENV_(.*)/){ print "set $1 $attributes{$_}\n"; $ENV{$1}="$attributes{$_}"; - } - + } + } diff --git a/tests/testpio/testpio_run.pl b/tests/testpio/testpio_run.pl index 6e7585bc09b..bafd6b2d30c 100755 --- a/tests/testpio/testpio_run.pl +++ b/tests/testpio/testpio_run.pl @@ -79,8 +79,8 @@ sub usage{ # }elsif(/ENV_(.*)/){ # print "set $1 $attributes{$_}\n"; # print F "\$ENV{$1}=\"$attributes{$_}\n\""; -# } - +# } + } if(defined $suites){ @@ -240,7 +240,7 @@ sub usage{ # \$ENV{MP_PROCS} = 1; #system("hostname > $tstdir/hostfile"); #\$ENV{MP_HOSTFILE}="$tstdir/hostfile"; - + # } if("$host" eq "yellowstone_pgi") { \$ENV{LD_PRELOAD}="/opt/ibmhpc/pe1304/ppe.pami/gnu/lib64/pami64/libpami.so"; @@ -249,7 +249,7 @@ sub usage{ if("$host" eq "erebus" or "$host" =~ /^yellowstone/){ # \$ENV{MP_PROCS}=\$saveprocs; # delete \$ENV{MP_HOSTFILE}; - } + } } my \$test; @@ -283,9 +283,9 @@ sub usage{ unlink("testpio") if(-e "testpio"); if($twopass){ - copy("$tstdir/testpio.\$suite","testpio"); + copy("$tstdir/testpio.\$suite","testpio"); }else{ - copy("$tstdir/testpio","testpio"); + copy("$tstdir/testpio","testpio"); } chmod 0755,"testpio"; @@ -323,7 +323,7 @@ sub usage{ open(LOG,\$log); my \@logout = ; close(LOG); - + my \$cnt = grep /testpio completed successfully/ , \@logout; open(T,">TestStatus"); if(\$cnt>0){ @@ -338,7 +338,7 @@ sub usage{ close(T); } }else{ - print "suite \$suite FAILED to configure or build\\n"; + print "suite \$suite FAILED to configure or build\\n"; } } if($twopass && \$thispass==1){ @@ -348,7 +348,7 @@ sub usage{ print "Run ($script) second pass with \$subsys\n"; }else{ exec(\$subsys); - } + } } print "test complete on $host \$passcnt tests PASS, \$failcnt tests FAIL\\n"; diff --git a/tests/testpio/utils_mod.F90 b/tests/testpio/utils_mod.F90 index 4dfd18af0b9..b49f142e2df 100644 --- a/tests/testpio/utils_mod.F90 +++ b/tests/testpio/utils_mod.F90 @@ -11,7 +11,7 @@ module utils_mod !> !! @private -!! @brief Writes netcdf header information for testpio. +!! @brief Writes netcdf header information for testpio. !! @param File @copydoc file_desc_t !! @param nx !! @param ny diff --git a/tests/unittests/CMakeLists.txt b/tests/unittests/CMakeLists.txt index bef13621fc0..dee3e57c8f2 100644 --- a/tests/unittests/CMakeLists.txt +++ b/tests/unittests/CMakeLists.txt @@ -3,7 +3,7 @@ ADD_DEFINITIONS(${PIO_DEFINITIONS}) # Use to trace hdf5 errors with a special netcdf build OPTION(HDF5_LOGGING "Turn on hdf5 logging (requires instrumented netcdf4)" OFF) -if(HDF5_LOGGING) +if(HDF5_LOGGING) ADD_DEFINITIONS(-DLOGGING) endif() diff --git a/tests/unittests/Levy_Notes b/tests/unittests/Levy_Notes index 952c7ab0f50..4fc4a627cf7 100644 --- a/tests/unittests/Levy_Notes +++ b/tests/unittests/Levy_Notes @@ -27,7 +27,7 @@ Frankfurt --------- "write_mpiio_int after call to file_set_view:MPI_ERR_ARG: invalid argument of so me other kind - pio_support::pio_die:: myrank= -1 : ERROR: iompi_mod.F90: 223 + pio_support::pio_die:: myrank= -1 : ERROR: iompi_mod.F90: 223 : (no message)" Yellowstone @@ -35,7 +35,7 @@ Yellowstone "write_mpiio_int after call to file_set_view:Invalid argument, error stack: MPI_ FILE_SET_VIEW(57): Invalid displacement argument - pio_support::pio_die:: myrank= -1 : ERROR: iompi_mod.F90: 223 + pio_support::pio_die:: myrank= -1 : ERROR: iompi_mod.F90: 223 : (no message)" 5) For tests where we expect failure (e.g. writing a file that was opened nowrite) diff --git a/tests/unittests/README b/tests/unittests/README index cd4b24928c1..db7c5626cf6 100644 --- a/tests/unittests/README +++ b/tests/unittests/README @@ -2,4 +2,4 @@ 3) Determine what tests to run by setting namelist values in input.nl -4) Use your machine's mpirun to launch "piotest" with the desired number of tasks +4) Use your machine's mpirun to launch "piotest" with the desired number of tasks diff --git a/tests/unittests/basic_tests.F90 b/tests/unittests/basic_tests.F90 index b8459d9902d..c3b5d9d60b3 100644 --- a/tests/unittests/basic_tests.F90 +++ b/tests/unittests/basic_tests.F90 @@ -6,7 +6,7 @@ module basic_tests - use pio + use pio use global_vars Implicit None diff --git a/tests/unittests/driver.F90 b/tests/unittests/driver.F90 index d5ef9307d66..68ac1203dd5 100644 --- a/tests/unittests/driver.F90 +++ b/tests/unittests/driver.F90 @@ -16,7 +16,7 @@ Program pio_unit_test_driver ! local variables character(len=str_len) :: err_msg - integer :: fail_cnt, test_cnt, ios, test_id, ierr, test_val + integer :: fail_cnt, test_cnt, ios, test_id, ierr, test_val logical :: ltest_bin, ltest_bin_direct, ltest_netcdf, ltest_pnetcdf logical :: ltest_netcdf4p, ltest_netcdf4c namelist/piotest_nml/ltest_bin, & @@ -214,7 +214,7 @@ Program pio_unit_test_driver call MPI_Finalize(ierr) if(fail_cnt>0) then stop 1 - else + else stop 0 endif Contains diff --git a/timing/CMakeLists.txt b/timing/CMakeLists.txt index 6ef34e3acbe..8741699e1c2 100644 --- a/timing/CMakeLists.txt +++ b/timing/CMakeLists.txt @@ -4,7 +4,7 @@ FortranCInterface_HEADER(cmake_fortran_c_interface.h ADD_DEFINITIONS(${PIO_DEFINITIONS}) -SET(TIMING_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} +SET(TIMING_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} CACHE STRING "") INCLUDE_DIRECTORIES(${TIMING_INCLUDE_DIRS}) diff --git a/timing/ChangeLog b/timing/ChangeLog index 3d11911e6b6..8bbbbcfe4fc 100644 --- a/timing/ChangeLog +++ b/timing/ChangeLog @@ -2,15 +2,15 @@ timing_120921: Add code for cmake build, should not have any affect otherwise timing_120803: Bug fix in setting timing_detail_limit default. [Patrick Worley] timing_120731: Correction in Makefile for serial build [Jim Edwards] -timing_120728: Replace process subset optional parameter in t_prf with - outpe_thispe optional parameter. Change def_perf_outpe_num to 0. +timing_120728: Replace process subset optional parameter in t_prf with + outpe_thispe optional parameter. Change def_perf_outpe_num to 0. [Patrick Worley] timing_120717: Retain timestamp on cp in Makefile [Jim Edwards] timing_120710: Correct issue in Makefile [Jim Edwards] timing_120709: Change for BGP to measure on compute nodes rather than IO nodes only, minor Change in Makefile so that gptl can build seperate from csm_share in cesm [Jim Edwards] -timing_120512: Bug fix in global statistics logic for when a thread has no events +timing_120512: Bug fix in global statistics logic for when a thread has no events to contribute to the merge (mods to gptl.c) [Patrick Worley] timing_120419: Minor changes for mpi-serial compile (jedwards) @@ -18,7 +18,7 @@ timing_120408: Make HAVE_COMM_F2C default to true. (jedwards) timing_120110: Update to GPTL 4.1 source (mods to gptl.c and GPTLprint_memusage) [Jim Rosinski (GPTL 4.1), Patrick Worley] timing_120109: Bug fix (adding shr_kind_i8 to shr_kind_mod list) -timing_111205: Update to gptl 4.0 (introducing CESM customizations); +timing_111205: Update to gptl 4.0 (introducing CESM customizations); support for handles in t_startf/t_stopf; support for restricting output to explicitly named process subsets [Jim Rosinski (gptl 4.0), Patrick Worley] @@ -29,7 +29,7 @@ timing_101210: Fix interface to cesm build system, add workaround for xlf bug timing_101202: updated get_memusage and print_memusage from GPTL version 3.7; adds improved support for MacOS and SLASHPROC [Jim Rosinski, Chuck Bardeen (integrated by P. Worley)] -timing_091021: update to GPTL version 3.5; rewrite of GPTLpr_summary: much faster, merging +timing_091021: update to GPTL version 3.5; rewrite of GPTLpr_summary: much faster, merging events from all processes and all threads (not just process 0/thread 0); miscellaneous fixes [Jim Rosinski (gptl 3.5), Joseph Singh, Patrick Worley] @@ -39,7 +39,7 @@ timing_090929: added explicit support for the GPTL-native token HAVE_MPI (indica timing_081221: restore default assumption that gettimeofday available timing_081028: bug fix in include order in gptl_papi.c timing_081026: change in output format to make postprocessing simpler -timing_081024: support for up to one million processes and writing timing files to +timing_081024: support for up to one million processes and writing timing files to subdirectories timing_081017: updated to gptl version 3_4_2. Changed some defaults. [Jim Rosinski, Patrick Worley] @@ -57,8 +57,8 @@ timing_071023: updated to gptl version 2.16, added support for output of global statistics; removed dependencies on shr and CAM routines; renamed gptlutil.c to GPTLutil.c [Patrick Worley, Jim Rosinski] -timing_071019: modified namelist logic to abort if try to set unknown namelist parameters; - changed default number of reporting processes to 1; +timing_071019: modified namelist logic to abort if try to set unknown namelist parameters; + changed default number of reporting processes to 1; reversed meaning and changed names of CPP tokens to NO_C99_INLINE and NO_VPRINTF [Patrick Worley] timing_071010: modified gptl.c to remove the 'inline' specification unless the @@ -67,75 +67,75 @@ timing_071010: modified gptl.c to remove the 'inline' specification unless the timing_070810: added ChangeLog updated to latest version of GPTL (from Jim Rosinski) modified perf_mod.F90: - - added perf_outpe_num and perf_outpe_stride to perf_inparm + - added perf_outpe_num and perf_outpe_stride to perf_inparm namelist to control which processes output timing data - added perf_papi_enable to perf_inparm namelist to enable - PAPI counters + PAPI counters - added papi_inparm namelist and papi_ctr1,2,3,4 namelist parameters to specify PAPI counters [Patrick Worley, Jim Rosinski] -timing_070525: bug fix in gptl.c +timing_070525: bug fix in gptl.c - unitialized pointer, testing for null pter before traversing [Patrick Worley] timing_070328: modified perf_mod.F90 - deleted HIDE_MPI cpp token [Erik Kluzek] -timing_070327: bug fixes in gptl.c - - testing for null pters before traversing +timing_070327: bug fixes in gptl.c + - testing for null pters before traversing links; added missing type declaration to GPTLallocate for sum - bug fixes in perf_mod.F90 - - fixed OMP-related logic, modified settings reporting, + bug fixes in perf_mod.F90 + - fixed OMP-related logic, modified settings reporting, modified to work when namelist input is missing; moved timer depth logic back into gptl.c [Patrick Worley] -timing_070308: added perf_mod.F90 - - defines all t_xxx entry points - calling gptlxxx directly +timing_070308: added perf_mod.F90 + - defines all t_xxx entry points - calling gptlxxx directly and removing all external gptlxxx dependencies, added detail option as an alternative way to disable event timing, added runtime selection of timing_disable, perf_timer, timer_depth_limit, timing_detail_limit, timing_barrier, perf_single_file via namelist parameters - modified f_wrappers.c - - replaced all t_xxx entry points with gptlxxx entry points, + modified f_wrappers.c + - replaced all t_xxx entry points with gptlxxx entry points, added new gptlxxx entry points, deleted _fcd support - modified gptl.c + modified gptl.c - deleted DISABLE_TIMERS cpp token, modified GPTLpr call and logic to move some of support for concatenating timing output into a single file to perf_mod.F90 - modified gptl.h - - exposed gptlxxx entry points and to add support for choice + modified gptl.h + - exposed gptlxxx entry points and to add support for choice of GPTL timer modified gptl.inc - removed t_xxx entry points and expose gptlxxx entry points [Patrick Worley] -timing_061207: modified gptl.c - - improved event output ordering +timing_061207: modified gptl.c + - improved event output ordering [Jim Edwards] -timing_061124: modified gptl.c +timing_061124: modified gptl.c - modified GPTLpr to add option to concatenate all timing data in a single output file, added GPTL_enable - and GPTL_disable as runtime control of event timing, + and GPTL_disable as runtime control of event timing, process 0-only reporting of timing options - unless DEBUG cpp token defined - modified gptl.h + modified gptl.h - redefined GPTLpr parameters - modified f_wrappers.c - - added t_enablef and t_disablef to call GPTL_enable and + modified f_wrappers.c + - added t_enablef and t_disablef to call GPTL_enable and GPTL_disable, added t_pr_onef, added string.h include - bug fix in f_wrappers.c + bug fix in f_wrappers.c - changed character string size declaration from int to size_t - bug fix in gptl_papi.c + bug fix in gptl_papi.c - modified error message - from Jim Edwards modified private.h - increased maximum event name length [Patrick Worley] -timing_061028: modified f_wrappers.c +timing_061028: modified f_wrappers.c - deleted dependency on cfort.h [Patrick Worley] -timing_060524: modified f_wrappers.c - - added support for CRAY cpp token and fixed routine +timing_060524: modified f_wrappers.c + - added support for CRAY cpp token and fixed routine type declarations [Patrick Worley] -timing_051212: original subversion version +timing_051212: original subversion version - see CAM ChangeLog for earlier history diff --git a/timing/GPTLget_memusage.c b/timing/GPTLget_memusage.c index 4ccdef8b2a3..4b0d138b2b6 100644 --- a/timing/GPTLget_memusage.c +++ b/timing/GPTLget_memusage.c @@ -4,7 +4,7 @@ ** Author: Jim Rosinski ** Credit to Chuck Bardeen for MACOS section (__APPLE__ ifdef) ** -** get_memusage: +** get_memusage: ** ** Designed to be called from Fortran, returns information about memory ** usage in each of 5 input int* args. On Linux read from the /proc @@ -63,7 +63,7 @@ int GPTLget_memusage (int *size, int *rss, int *share, int *text, int *datastack long long total; int node_config; - + /* memory available */ Kernel_GetPersonality(&pers, sizeof(pers)); total = BGP_Personality_DDRSizeMB(&pers); @@ -116,7 +116,7 @@ int GPTLget_memusage (int *size, int *rss, int *share, int *text, int *datastack ** arguments, close the file and return. */ - ret = fscanf (fd, "%d %d %d %d %d %d %d", + ret = fscanf (fd, "%d %d %d %d %d %d %d", size, rss, share, text, datastack, &dum, &dum); ret = fclose (fd); return 0; @@ -124,9 +124,9 @@ int GPTLget_memusage (int *size, int *rss, int *share, int *text, int *datastack #elif (defined __APPLE__) FILE *fd; - char cmd[60]; + char cmd[60]; int pid = (int) getpid (); - + sprintf (cmd, "ps -o vsz -o rss -o tsiz -p %d | grep -v RSS", pid); fd = popen (cmd, "r"); @@ -145,7 +145,7 @@ int GPTLget_memusage (int *size, int *rss, int *share, int *text, int *datastack if (getrusage (RUSAGE_SELF, &usage) < 0) return -1; - + *size = -1; *rss = usage.ru_maxrss; *share = -1; diff --git a/timing/GPTLprint_memusage.c b/timing/GPTLprint_memusage.c index 5ab873dccb4..a185d61100f 100644 --- a/timing/GPTLprint_memusage.c +++ b/timing/GPTLprint_memusage.c @@ -30,13 +30,13 @@ int GPTLprint_memusage (const char *str) static const int nbytes = 1024*1024*10; /* allocate 10 MB */ static double blockstomb; /* convert blocks to MB */ void *space; /* allocated space */ - + if (GPTLget_memusage (&size, &rss, &share, &text, &datastack) < 0) return -1; #if (defined HAVE_SLASHPROC || defined __APPLE__) /* - ** Determine size in bytes of memory usage info presented by the OS. Method: allocate a + ** Determine size in bytes of memory usage info presented by the OS. Method: allocate a ** known amount of memory and see how much bigger the process becomes. */ @@ -47,7 +47,7 @@ int GPTLprint_memusage (const char *str) /* ** Estimate bytes per block, then refine to nearest power of 2. ** The assumption is that the OS presents memory usage info in - ** units that are a power of 2. + ** units that are a power of 2. */ bytesperblock = (int) ((nbytes / (double) (size2 - size)) + 0.5); bytesperblock = nearest_powerof2 (bytesperblock); @@ -57,19 +57,19 @@ int GPTLprint_memusage (const char *str) } free (space); } - + if (bytesperblock > 0) - printf ("%s size=%.1f MB rss=%.1f MB share=%.1f MB text=%.1f MB datastack=%.1f MB\n", - str, size*blockstomb, rss*blockstomb, share*blockstomb, + printf ("%s size=%.1f MB rss=%.1f MB share=%.1f MB text=%.1f MB datastack=%.1f MB\n", + str, size*blockstomb, rss*blockstomb, share*blockstomb, text*blockstomb, datastack*blockstomb); else - printf ("%s size=%d rss=%d share=%d text=%d datastack=%d\n", + printf ("%s size=%d rss=%d share=%d text=%d datastack=%d\n", str, size, rss, share, text, datastack); #else /* - ** Use max rss as returned by getrusage. If someone knows how to + ** Use max rss as returned by getrusage. If someone knows how to ** get the process size under AIX please tell me. */ @@ -85,7 +85,7 @@ int GPTLprint_memusage (const char *str) } /* -** nearest_powerof2: +** nearest_powerof2: ** Determine nearest integer which is a power of 2. ** Note: algorithm can't use anything that requires -lm because this is a library, ** and we don't want to burden the user with having to add extra libraries to the @@ -112,7 +112,7 @@ static int nearest_powerof2 (const int val) delta1 = val - lower; delta2 = higher - val; - + if (delta1 < delta2) return lower; else diff --git a/timing/GPTLutil.c b/timing/GPTLutil.c index b1c7cf80df4..f882834d2a1 100644 --- a/timing/GPTLutil.c +++ b/timing/GPTLutil.c @@ -25,10 +25,10 @@ static int max_error = 500; /* max number of error print msgs */ int GPTLerror (const char *fmt, ...) { va_list args; - + va_start (args, fmt); static int num_error = 0; - + if (fmt != NULL && num_error < max_error) { #ifndef NO_VPRINTF (void) vfprintf (stderr, fmt, args); @@ -39,10 +39,10 @@ int GPTLerror (const char *fmt, ...) (void) fprintf (stderr, "Truncating further error print now after %d msgs", num_error); ++num_error; - } - + } + va_end (args); - + if (abort_on_error) exit (-1); diff --git a/timing/Makefile b/timing/Makefile index e5882d1f6b6..37f1dc1198c 100644 --- a/timing/Makefile +++ b/timing/Makefile @@ -32,7 +32,7 @@ SRCS_C = GPTLget_memusage.c \ threadutil.c \ SRCS_F90 = perf_mod.F90 \ - perf_utils.F90 + perf_utils.F90 OBJS= $(SRCS_C:.c=.o) \ $(SRCS_F90:.F90=.o) @@ -61,7 +61,7 @@ SRCS_CPP= $(SRCS_F90:.F90=$(CPPSUF)) .F90.o: @if [ -w $*.f90 ] ; then echo "ERROR: file $*.f90 is writable - the .f90 suffix is reserved for temporary cpp output" ; exit 1; fi $(RM) $*.f90 - $(CPP) $(CPPDEFS) $(CFLAGS) $(COPTS) $(INCLUDES) -o $*.f90 $*.F90 + $(CPP) $(CPPDEFS) $(CFLAGS) $(COPTS) $(INCLUDES) -o $*.f90 $*.F90 chmod a-w $*.f90 $(MPIFC) -c $(FFLAGS) $(FOPTS) $(INCLUDES) $*.f90 else @@ -78,7 +78,7 @@ $(LIB): $(OBJS) $(RM) $@ $(AR) $(ARFLAGS) $@ $(OBJS) - + clean: $(RM) $(LIB) $(OBJS) $(MODFILES) $(SRCS_CPP) diff --git a/timing/README b/timing/README index 2f0991da218..f8f3f7f7a09 100644 --- a/timing/README +++ b/timing/README @@ -18,7 +18,7 @@ Of course these events can only be enabled if the PAPI counters they require are available on the target architecture. -Using GPTL +Using GPTL ---------- C codes making GPTL library calls should #include . Fortran codes @@ -63,7 +63,7 @@ GPTLfinalize() can be called to clean up the GPTL environment. All space malloc'ed by the GPTL library will be freed by this call. -Example +Example ------- From "man GPTLstart", a simple example calling sequence to time a couple of @@ -86,7 +86,7 @@ do_work(); /* do some work */ (void) GPTLpr (mympitaskid); /* print the results to timing. */ -Auto-instrumentation +Auto-instrumentation -------------------- If the regions to be timed are defined by function entry and exit points, and @@ -128,7 +128,7 @@ Running hex2name.pl converts the function addresses back to human-readable function names. It uses the UNIX "nm" utility to do this. -Multi-processor instrumented codes +Multi-processor instrumented codes ---------------------------------- For instrumented codes which make use of threading and/or MPI, a diff --git a/timing/XXXdotF/perf_mod.F b/timing/XXXdotF/perf_mod.F index 405160d2237..711705b1413 100644 --- a/timing/XXXdotF/perf_mod.F +++ b/timing/XXXdotF/perf_mod.F @@ -1,13 +1,13 @@ module perf_mod -C----------------------------------------------------------------------- -C +C----------------------------------------------------------------------- +C C Purpose: This module is responsible for controlling the performance C timer logic. -C +C C Author: P. Worley, January 2007 C C $Id$ -C +C C----------------------------------------------------------------------- C----------------------------------------------------------------------- @@ -29,7 +29,7 @@ module perf_mod C----------------------------------------------------------------------- implicit none C Make the default access private - private + private save C----------------------------------------------------------------------- @@ -62,7 +62,7 @@ module perf_mod C----------------------------------------------------------------------- C- include statements -------------------------------------------------- C----------------------------------------------------------------------- -#include +#include #include "gptl.inc" C----------------------------------------------------------------------- @@ -73,66 +73,66 @@ module perf_mod C ! perf_mod options C !---------------------------------------------------------------------------- C unit number for log output - integer, parameter :: def_p_logunit = 6 + integer, parameter :: def_p_logunit = 6 integer, private :: p_logunit = def_p_logunit C flag indicating whether timing library has been initialized - logical, parameter :: def_timing_initialized = .false. + logical, parameter :: def_timing_initialized = .false. logical, private :: timing_initialized = def_timing_initialized C flag indicating whether timers are disabled - logical, parameter :: def_timing_disable = .false. + logical, parameter :: def_timing_disable = .false. logical, private :: timing_disable = def_timing_disable C flag indicating whether the mpi_barrier in t_barrierf should be called - logical, parameter :: def_timing_barrier = .false. + logical, parameter :: def_timing_barrier = .false. logical, private :: timing_barrier = def_timing_barrier -C integer indicating maximum number of levels of timer nesting - integer, parameter :: def_timer_depth_limit = 99999 +C integer indicating maximum number of levels of timer nesting + integer, parameter :: def_timer_depth_limit = 99999 integer, private :: timer_depth_limit = def_timer_depth_limit C integer indicating maximum detail level to profile - integer, parameter :: def_timing_detail_limit = 1 + integer, parameter :: def_timing_detail_limit = 1 integer, private :: timing_detail_limit = def_timer_depth_limit C integer indicating depth of t_disablef calls - integer, parameter :: init_timing_disable_depth = 0 - integer, private :: timing_disable_depth = + integer, parameter :: init_timing_disable_depth = 0 + integer, private :: timing_disable_depth = & init_timing_disable_depth C current timing detail level - integer, parameter :: init_timing_detail = 0 + integer, parameter :: init_timing_detail = 0 integer, private :: cur_timing_detail = init_timing_detail -C flag indicating whether the performance timer output should be written +C flag indicating whether the performance timer output should be written C to a single file (per component communicator) or to a separate file C for each process - logical, parameter :: def_perf_single_file = .false. + logical, parameter :: def_perf_single_file = .false. logical, private :: perf_single_file = def_perf_single_file -C maximum number of processes writing out +C maximum number of processes writing out C timing data (for this component communicator) integer, parameter :: def_perf_outpe_num = -1 integer, private :: perf_outpe_num = def_perf_outpe_num -C separation between process ids for processes that are writing out +C separation between process ids for processes that are writing out C timing data (for this component communicator) - integer, parameter :: def_perf_outpe_stride = 1 + integer, parameter :: def_perf_outpe_stride = 1 integer, private :: perf_outpe_stride = def_perf_outpe_stride C collect and print out global performance statistics C (for this component communicator) - logical, parameter :: def_perf_global_stats = .false. + logical, parameter :: def_perf_global_stats = .false. logical, private :: perf_global_stats = def_perf_global_stats C integer indicating which timer to use (as defined in gptl.inc) #ifdef UNICOSMP - integer, parameter :: def_perf_timer = GPTLrtc + integer, parameter :: def_perf_timer = GPTLrtc #else - integer, parameter :: def_perf_timer = GPTLmpiwtime + integer, parameter :: def_perf_timer = GPTLmpiwtime #endif - integer, private :: perf_timer = def_perf_timer + integer, private :: perf_timer = def_perf_timer C flag indicating whether the PAPI namelist C should be read and HW performance counters @@ -147,16 +147,16 @@ module perf_mod C PAPI counter ids integer, parameter :: PAPI_NULL = -1 - integer, parameter :: def_papi_ctr1 = PAPI_NULL + integer, parameter :: def_papi_ctr1 = PAPI_NULL integer, private :: papi_ctr1 = def_papi_ctr1 - integer, parameter :: def_papi_ctr2 = PAPI_NULL + integer, parameter :: def_papi_ctr2 = PAPI_NULL integer, private :: papi_ctr2 = def_papi_ctr2 - integer, parameter :: def_papi_ctr3 = PAPI_NULL + integer, parameter :: def_papi_ctr3 = PAPI_NULL integer, private :: papi_ctr3 = def_papi_ctr3 - integer, parameter :: def_papi_ctr4 = PAPI_NULL + integer, parameter :: def_papi_ctr4 = PAPI_NULL integer, private :: papi_ctr4 = def_papi_ctr4 C======================================================================= @@ -167,14 +167,14 @@ module perf_mod C======================================================================== C subroutine t_getLogUnit(LogUnit) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Get log unit number. -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments----------------------------- C C Unit number for log output - integer(SHR_KIND_IN), intent(OUT) :: LogUnit + integer(SHR_KIND_IN), intent(OUT) :: LogUnit C----------------------------------------------------------------------- LogUnit = p_logunit @@ -185,14 +185,14 @@ end subroutine t_getLogUnit C======================================================================== C subroutine t_setLogUnit(LogUnit) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Set log unit number. -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments----------------------------- C C Unit number for log output - integer(SHR_KIND_IN), intent(IN) :: LogUnit + integer(SHR_KIND_IN), intent(IN) :: LogUnit C----------------------------------------------------------------------- p_logunit = LogUnit @@ -215,9 +215,9 @@ subroutine perf_defaultopts(timing_disable_out, & perf_single_file_out, & perf_global_stats_out, & perf_papi_enable_out ) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Return default runtime options -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments----------------------------- C timers disable/enable option @@ -289,16 +289,16 @@ subroutine perf_setopts(mastertask, & perf_single_file_in, & perf_global_stats_in, & perf_papi_enable_in ) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Set runtime options -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments---------------------------- C C master process? logical, intent(in) :: mastertask C Print out to log file? - logical, intent(IN) :: LogPrint + logical, intent(IN) :: LogPrint C timers disable/enable option logical, intent(in), optional :: timing_disable_in C performance timer option @@ -331,21 +331,21 @@ subroutine perf_setopts(mastertask, timing_disable = timing_disable_in if (timing_disable) then ierr = GPTLdisable() - else + else ierr = GPTLenable() endif endif if ( present(perf_timer_in) ) then - if ((perf_timer_in .eq. GPTLgettimeofday) .or. - & (perf_timer_in .eq. GPTLnanotime) .or. - & (perf_timer_in .eq. GPTLrtc) .or. - & (perf_timer_in .eq. GPTLmpiwtime) .or. - & (perf_timer_in .eq. GPTLclockgettime) .or. + if ((perf_timer_in .eq. GPTLgettimeofday) .or. + & (perf_timer_in .eq. GPTLnanotime) .or. + & (perf_timer_in .eq. GPTLrtc) .or. + & (perf_timer_in .eq. GPTLmpiwtime) .or. + & (perf_timer_in .eq. GPTLclockgettime) .or. & (perf_timer_in .eq. GPTLpapitime)) then perf_timer = perf_timer_in else if (mastertask) then - write(p_logunit,*) + write(p_logunit,*) & 'PERF_SETOPTS: illegal timer requested=', & perf_timer_in, '. Request ignored.' endif @@ -378,7 +378,7 @@ subroutine perf_setopts(mastertask, #else if (perf_papi_enable_in) then if (mastertask) then - write(p_logunit,*) + write(p_logunit,*) & 'PERF_SETOPTS: PAPI library not linked in. ', & 'Request to enable PAPI ignored.' endif @@ -388,25 +388,25 @@ subroutine perf_setopts(mastertask, endif C if (mastertask .and. LogPrint) then - write(p_logunit,*) '(t_initf) Using profile_disable=', + write(p_logunit,*) '(t_initf) Using profile_disable=', & timing_disable, ' profile_timer=', perf_timer - write(p_logunit,*) '(t_initf) profile_depth_limit=', - & timer_depth_limit, ' profile_detail_limit=', + write(p_logunit,*) '(t_initf) profile_depth_limit=', + & timer_depth_limit, ' profile_detail_limit=', & timing_detail_limit - write(p_logunit,*) '(t_initf) profile_barrier=', - & timing_barrier, ' profile_outpe_num=', + write(p_logunit,*) '(t_initf) profile_barrier=', + & timing_barrier, ' profile_outpe_num=', & perf_outpe_num - write(p_logunit,*) '(t_initf) profile_outpe_stride=', - & perf_outpe_stride , ' profile_single_file=', + write(p_logunit,*) '(t_initf) profile_outpe_stride=', + & perf_outpe_stride , ' profile_single_file=', & perf_single_file - write(p_logunit,*) '(t_initf) profile_global_stats=', - & perf_global_stats , ' profile_papi_enable=', - & perf_papi_enable - endif + write(p_logunit,*) '(t_initf) profile_global_stats=', + & perf_global_stats , ' profile_papi_enable=', + & perf_papi_enable + endif C #ifdef DEBUG else - write(p_logunit,*) + write(p_logunit,*) & 'PERF_SETOPTS: timing library already initialized.', & ' Request ignored.' #endif @@ -422,9 +422,9 @@ subroutine papi_defaultopts(papi_ctr1_out, & papi_ctr2_out, & papi_ctr3_out, & papi_ctr4_out ) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Return default runtime PAPI counter options -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments----------------------------- C PAPI counter option #1 @@ -458,9 +458,9 @@ subroutine papi_setopts(papi_ctr1_in, & papi_ctr2_in, & papi_ctr3_in, & papi_ctr4_in ) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Set runtime PAPI counter options -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments---------------------------- C @@ -476,10 +476,10 @@ subroutine papi_setopts(papi_ctr1_in, C---------------------------Local workspace----------------------------- C C error return - integer ierr + integer ierr C----------------------------------------------------------------------- if ( .not. timing_initialized ) then - + if ( present(papi_ctr1_in) ) then if (papi_ctr1_in < 0) then papi_ctr1 = papi_ctr1_in @@ -511,7 +511,7 @@ subroutine papi_setopts(papi_ctr1_in, C #ifdef DEBUG else - write(p_logunit,*) + write(p_logunit,*) & 'PAPI_SETOPTS: timing library already initialized.', & 'Request ignored.' #endif @@ -523,16 +523,16 @@ end subroutine papi_setopts C======================================================================== C logical function t_profile_onf() -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Return flag indicating whether profiling is currently active. C Part of workaround to implement FVbarrierclock before C communicators exposed in Pilgrim. Does not check level of C event nesting. -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- - if ((.not. timing_initialized) .or. - & (timing_disable_depth > 0) .or. + if ((.not. timing_initialized) .or. + & (timing_disable_depth > 0) .or. & (cur_timing_detail > timing_detail_limit)) then t_profile_onf = .false. else @@ -544,10 +544,10 @@ end function t_profile_onf C======================================================================== C logical function t_barrier_onf() -C----------------------------------------------------------------------- -C Purpose: Return timing_barrier. Part of workaround to implement -C FVbarrierclock before communicators exposed in Pilgrim. -C Author: P. Worley +C----------------------------------------------------------------------- +C Purpose: Return timing_barrier. Part of workaround to implement +C FVbarrierclock before communicators exposed in Pilgrim. +C Author: P. Worley C----------------------------------------------------------------------- t_barrier_onf = timing_barrier @@ -557,10 +557,10 @@ end function t_barrier_onf C======================================================================== C logical function t_single_filef() -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Return perf_single_file. Used to control output of other C performance data, only spmdstats currently. -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- t_single_filef = perf_single_file @@ -570,27 +570,27 @@ end function t_single_filef C======================================================================== C subroutine t_stampf(wall, usr, sys) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Record wallclock, user, and system times (seconds). -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Output arguments----------------------------- C C wallclock time - real(shr_kind_r8), intent(out) :: wall + real(shr_kind_r8), intent(out) :: wall C user time - real(shr_kind_r8), intent(out) :: usr + real(shr_kind_r8), intent(out) :: usr C system time - real(shr_kind_r8), intent(out) :: sys + real(shr_kind_r8), intent(out) :: sys C C---------------------------Local workspace----------------------------- C C GPTL error return - integer ierr + integer ierr C C----------------------------------------------------------------------- C - if ((.not. timing_initialized) .or. + if ((.not. timing_initialized) .or. & (timing_disable_depth > 0)) then wall = 0.0 usr = 0.0 @@ -598,46 +598,46 @@ subroutine t_stampf(wall, usr, sys) else ierr = GPTLstamp(wall, usr, sys) endif - + return end subroutine t_stampf C C======================================================================== C subroutine t_startf(event) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Start an event timer -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments----------------------------- C C performance timer event name - character(len=*), intent(in) :: event + character(len=*), intent(in) :: event C C---------------------------Local workspace----------------------------- C C GPTL error return - integer ierr + integer ierr C C----------------------------------------------------------------------- C - if ((timing_initialized) .and. - & (timing_disable_depth .eq. 0) .and. + if ((timing_initialized) .and. + & (timing_disable_depth .eq. 0) .and. & (cur_timing_detail .le. timing_detail_limit)) then - + ierr = GPTLstart(event) - + endif - + return end subroutine t_startf C C======================================================================== C subroutine t_stopf(event) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Stop an event timer -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments----------------------------- C @@ -646,34 +646,34 @@ subroutine t_stopf(event) C C---------------------------Local workspace----------------------------- C -C GPTL error return - integer ierr +C GPTL error return + integer ierr C C----------------------------------------------------------------------- C - if ((timing_initialized) .and. - & (timing_disable_depth .eq. 0) .and. + if ((timing_initialized) .and. + & (timing_disable_depth .eq. 0) .and. & (cur_timing_detail .le. timing_detail_limit)) then - + ierr = GPTLstop(event) - + endif - + return end subroutine t_stopf C C======================================================================== C subroutine t_enablef() -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Enable t_startf, t_stopf, t_stampf, and t_barrierf. Ignored C in threaded regions. -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Local workspace----------------------------- C C GPTL error return - integer ierr + integer ierr C C---------------------------Externals----------------------------------- C @@ -703,15 +703,15 @@ end subroutine t_enablef C======================================================================== C subroutine t_disablef() -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Disable t_startf, t_stopf, t_stampf, and t_barrierf. Ignored C in threaded regions. -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Local workspace----------------------------- C C GPTL error return - integer ierr + integer ierr C C---------------------------Externals----------------------------------- C @@ -739,14 +739,14 @@ end subroutine t_disablef C======================================================================== C subroutine t_adj_detailf(detail_adjustment) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Modify current detail level. Ignored in threaded regions. -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments----------------------------- C C user defined increase or decrease in detail level - integer, intent(in) :: detail_adjustment + integer, intent(in) :: detail_adjustment C C---------------------------Externals----------------------------------- C @@ -771,11 +771,11 @@ end subroutine t_adj_detailf C======================================================================== C subroutine t_barrierf(event, mpicom) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Call (and time) mpi_barrier. Ignored inside OpenMP C threaded regions. Note that barrier executed even if C event not recorded because of level of timer event nesting. -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments----------------------------- C mpi communicator id @@ -786,7 +786,7 @@ subroutine t_barrierf(event, mpicom) C---------------------------Local workspace----------------------------- C C GPTL error return - integer ierr + integer ierr C C---------------------------Externals----------------------------------- C @@ -800,8 +800,8 @@ subroutine t_barrierf(event, mpicom) #if ( defined _OPENMP ) if (omp_in_parallel()) return #endif - if ((timing_initialized) .and. - & (timing_disable_depth .eq. 0) .and. + if ((timing_initialized) .and. + & (timing_disable_depth .eq. 0) .and. & (cur_timing_detail .le. timing_detail_limit)) then if (timing_barrier) then @@ -809,32 +809,32 @@ subroutine t_barrierf(event, mpicom) if ( present (event) ) then ierr = GPTLstart(event) endif - + if ( present (mpicom) ) then - call shr_mpi_barrier(mpicom, + call shr_mpi_barrier(mpicom, & 'T_BARRIERF: bad mpi communicator') else - call shr_mpi_barrier(MPI_COMM_WORLD, + call shr_mpi_barrier(MPI_COMM_WORLD, & 'T_BARRIERF: bad mpi communicator') endif - + if ( present (event) ) then ierr = GPTLstop(event) endif - + endif - + endif - + return end subroutine t_barrierf C C======================================================================== C subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Write out performance timer data -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments----------------------------- C @@ -844,39 +844,39 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) integer, intent(in), optional :: mpicom C maximum number of processes writing out timing data integer, intent(in), optional :: num_outpe -C separation between process ids for processes writing out data +C separation between process ids for processes writing out data integer, intent(in), optional :: stride_outpe C C---------------------------Local workspace----------------------------- C C loop index - integer i + integer i C local copy of MPI communicator - integer mpicom2 + integer mpicom2 C communicator local process id - integer me + integer me C local communicator group size - integer npes + integer npes C global process id - integer gme + integer gme C MPI error return - integer ierr + integer ierr C max number of processes writing out timing data - integer outpe_num + integer outpe_num C separation between process ids for processes writing out timing data - integer outpe_stride + integer outpe_stride C max process id for processes writing out timing data - integer max_outpe + integer max_outpe C send/recv variable for single output file logic - integer signal + integer signal C string length - integer str_length + integer str_length C file unit number - integer unitn + integer unitn C length of filename suffix integer cme_adj C Status of message - integer status (MPI_STATUS_SIZE) + integer status (MPI_STATUS_SIZE) C string representation of process id character(len=7) cme C timing output filename @@ -900,11 +900,11 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) mpicom2 = MPI_COMM_WORLD me = gme endif - + do i=1,SHR_KIND_CX+14 fname(i:i) = " " enddo - + unitn = shr_file_getUnit() C Determine which processes are writing out timing data @@ -935,7 +935,7 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) outpe_stride = perf_outpe_stride endif endif -C +C max_outpe = min(outpe_num*outpe_stride, npes) - 1 C If a single timing output file, take turns writing to it. @@ -947,10 +947,10 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) else fname(1:10) = "timing_all" endif - + signal = 0 if (me .eq. 0) then - + if (perf_global_stats) then open( unitn, file=trim(fname), status='UNKNOWN' ) write( unitn, 100) npes @@ -963,7 +963,7 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) if (me .le. max_outpe) then if (perf_global_stats) then - open( unitn, file=trim(fname), status='OLD', + open( unitn, file=trim(fname), status='OLD', & position='APPEND' ) else open( unitn, file=trim(fname), status='UNKNOWN' ) @@ -983,7 +983,7 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) ierr = GPTLpr_summary(mpicom2, 0, trim(fname)) endif - call mpi_recv (signal, 1, mpi_integer, me-1, me-1, mpicom2, + call mpi_recv (signal, 1, mpi_integer, me-1, me-1, mpicom2, & status, ierr) if (ierr /= mpi_success) then write(p_logunit,*) 'T_PRF: mpi_recv failed ierr=',ierr @@ -991,7 +991,7 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) end if if ((mod(me, outpe_stride).eq.0).and.(me.le.max_outpe)) then - open( unitn, file=trim(fname), status='OLD', + open( unitn, file=trim(fname), status='OLD', & position='APPEND' ) write( unitn, 101) me, gme close( unitn ) @@ -1001,7 +1001,7 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) endif - if (me+1 < npes) + if (me+1 < npes) & call mpi_send (signal, 1, mpi_integer, me+1, me, mpicom2, ierr) else @@ -1015,17 +1015,17 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) fname(1:10) = "timing" endif fname(str_length+1:str_length+6) = '_stats' - + if (me .eq. 0) then open( unitn, file=trim(fname), status='UNKNOWN' ) write( unitn, 100) npes close( unitn ) endif - + ierr = GPTLpr_summary(mpicom2, 0, trim(fname)) fname(str_length+1:str_length+6) = ' ' endif - + if ((mod(me, outpe_stride).eq.0).and.(me.le.max_outpe)) then if (npes .le. 10) then write(cme,'(i1.1)') me @@ -1056,16 +1056,16 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe) endif fname(str_length+1:str_length+1) = '.' fname(str_length+2:str_length+cme_adj) = cme - + open( unitn, file=trim(fname), status='UNKNOWN' ) write( unitn, 101) me, gme close( unitn ) - + ierr = GPTLpr_file(0, trim(fname)) endif - + endif - + call shr_file_freeUnit( unitn ) C$OMP END MASTER call t_stopf("t_prf") @@ -1075,10 +1075,10 @@ end subroutine t_prf C C======================================================================== C - subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, + subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, & MasterTask) -C----------------------------------------------------------------------- -C Purpose: Set default values of runtime timing options +C----------------------------------------------------------------------- +C Purpose: Set default values of runtime timing options C before namelists prof_inparm and papi_inparm are read, C read namelists (and broadcast, if SPMD), C then initialize timing library. @@ -1087,38 +1087,38 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, C---------------------------Input arguments----------------------------- C C Name-list filename - character(len=*), intent(IN) :: NLFilename + character(len=*), intent(IN) :: NLFilename C If print out to log file - logical, optional, intent(IN) :: LogPrint + logical, optional, intent(IN) :: LogPrint C Unit number for log output - integer, optional, intent(IN) :: LogUnit + integer, optional, intent(IN) :: LogUnit C MPI communicator - integer, optional, intent(IN) :: mpicom + integer, optional, intent(IN) :: mpicom C If MPI master task - logical, optional, intent(IN) :: MasterTask + logical, optional, intent(IN) :: MasterTask C C---------------------------Local workspace----------------------------- C character(len=*), parameter :: subname = '(T_INITF) ' C If MPI master task - logical :: MasterTask2 + logical :: MasterTask2 C If print to log - logical :: LogPrint2 - + logical :: LogPrint2 + C communicator local process id - integer me + integer me C error return - integer ierr + integer ierr C file unit number - integer unitn + integer unitn C PAPI counter id - integer papi_ctr1_id + integer papi_ctr1_id C PAPI counter id - integer papi_ctr2_id + integer papi_ctr2_id C PAPI counter id - integer papi_ctr3_id + integer papi_ctr3_id C PAPI counter id - integer papi_ctr4_id + integer papi_ctr4_id C C---------------------------Namelists ---------------------------------- C @@ -1143,7 +1143,7 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, character(len=16) papi_ctr2_str character(len=16) papi_ctr3_str character(len=16) papi_ctr4_str - namelist /papi_inparm/ papi_ctr1_str, papi_ctr2_str, + namelist /papi_inparm/ papi_ctr1_str, papi_ctr2_str, & papi_ctr3_str, papi_ctr4_str C----------------------------------------------------------------------- if ( timing_initialized ) then @@ -1174,7 +1174,7 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, else MasterTask2 = .true. end if - + if ( present(LogPrint) ) then LogPrint2 = LogPrint else @@ -1204,25 +1204,25 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, open( unitn, file=trim(NLFilename), status='old', iostat=ierr) if (ierr .eq. 0) then -C Look for prof_inparm group name in the input file. +C Look for prof_inparm group name in the input file. C If found, leave the file positioned at that namelist group. call find_group_name(unitn, 'prof_inparm', status=ierr) C found prof_inparm - if (ierr == 0) then - read(unitn, nml=prof_inparm, iostat=ierr) + if (ierr == 0) then + read(unitn, nml=prof_inparm, iostat=ierr) if (ierr /= 0) then - call shr_sys_abort( - & subname//':: namelist read returns an'// + call shr_sys_abort( + & subname//':: namelist read returns an'// & ' error condition for prof_inparm' ) end if end if close(unitn) - + endif call shr_file_freeUnit( unitn ) - + endif C This logic assumes that there will be only one MasterTask @@ -1263,27 +1263,27 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, papi_ctr2_str = "PAPI_NO_CTR" papi_ctr3_str = "PAPI_NO_CTR" papi_ctr4_str = "PAPI_NO_CTR" - - + + C Read in the papi_inparm namelist from NLFilename if it exists - - write(p_logunit,*) + + write(p_logunit,*) & '(t_initf) Read in papi_inparm namelist from: '//trim(NLFilename) unitn = shr_file_getUnit() ierr = 1 open(unitn,file=trim(NLFilename),status='old',iostat=ierr ) if (ierr .eq. 0) then -C Look for papi_inparm group name in the input file. +C Look for papi_inparm group name in the input file. C If found, leave the file positioned at that namelist group. call find_group_name(unitn, 'papi_inparm', status=ierr) - if (ierr == 0) then + if (ierr == 0) then C found papi_inparm - read(unitn, nml=papi_inparm, iostat=ierr) + read(unitn, nml=papi_inparm, iostat=ierr) if (ierr /= 0) then - call shr_sys_abort( - & subname//':: namelist read returns an'// + call shr_sys_abort( + & subname//':: namelist read returns an'// & ' error condition for papi_inparm' ) end if end if @@ -1294,15 +1294,15 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, call shr_file_freeUnit( unitn ) C if enabled and nothing set, use "defaults" - if ((papi_ctr1_str(1:11) .eq. "PAPI_NO_CTR") .and. - & (papi_ctr2_str(1:11) .eq. "PAPI_NO_CTR") .and. - & (papi_ctr3_str(1:11) .eq. "PAPI_NO_CTR") .and. + if ((papi_ctr1_str(1:11) .eq. "PAPI_NO_CTR") .and. + & (papi_ctr2_str(1:11) .eq. "PAPI_NO_CTR") .and. + & (papi_ctr3_str(1:11) .eq. "PAPI_NO_CTR") .and. & (papi_ctr4_str(1:11) .eq. "PAPI_NO_CTR")) then papi_ctr1_str = "PAPI_TOT_CYC" papi_ctr2_str = "PAPI_FP_OPS" papi_ctr3_str = "PAPI_FP_INS" endif - + if (papi_ctr1_str(1:11) /= "PAPI_NO_CTR") then papi_ctr1_id = gptl_papiname2id(trim(papi_ctr1_str)) endif @@ -1315,7 +1315,7 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, if (papi_ctr4_str(1:11) /= "PAPI_NO_CTR") then papi_ctr4_id = gptl_papiname2id(trim(papi_ctr4_str)) endif - + endif C This logic assumes that there will be only one MasterTask C per communicator, and that this MasterTask is process 0. @@ -1325,7 +1325,7 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, call shr_mpi_bcast( papi_ctr3_id, MPICom ) call shr_mpi_bcast( papi_ctr4_id, MPICom ) end if - + call papi_setopts (papi_ctr1_in=papi_ctr1_id, & papi_ctr2_in=papi_ctr2_id, & papi_ctr3_in=papi_ctr3_id, @@ -1338,18 +1338,18 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, C$OMP MASTER C -C Set options and initialize timing library. -C +C Set options and initialize timing library. +C C Set timer - if (gptlsetutr (perf_timer) < 0) + if (gptlsetutr (perf_timer) < 0) & call shr_sys_abort (subname//':: gptlsetutr') C -C For logical settings, 2nd arg 0 +C For logical settings, 2nd arg 0 C to gptlsetoption means disable, non-zero means enable C C Turn off CPU timing (expensive) C - if (gptlsetoption (gptlcpu, 0) < 0) + if (gptlsetoption (gptlcpu, 0) < 0) & call shr_sys_abort (subname//':: gptlsetoption') C C Set max timer depth @@ -1362,19 +1362,19 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, C if (perf_papi_enable) then if (papi_ctr1 /= PAPI_NULL) then - if (gptlsetoption (papi_ctr1, 1) < 0) + if (gptlsetoption (papi_ctr1, 1) < 0) & call shr_sys_abort (subname//':: gptlsetoption') endif if (papi_ctr2 /= PAPI_NULL) then - if (gptlsetoption (papi_ctr2, 1) < 0) + if (gptlsetoption (papi_ctr2, 1) < 0) & call shr_sys_abort (subname//':: gptlsetoption') endif if (papi_ctr3 /= PAPI_NULL) then - if (gptlsetoption (papi_ctr3, 1) < 0) + if (gptlsetoption (papi_ctr3, 1) < 0) & call shr_sys_abort (subname//':: gptlsetoption') endif if (papi_ctr4 /= PAPI_NULL) then - if (gptlsetoption (papi_ctr4, 1) < 0) + if (gptlsetoption (papi_ctr4, 1) < 0) & call shr_sys_abort (subname//':: gptlsetoption') endif endif @@ -1382,7 +1382,7 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, C Initialize the timing lib. This call must occur after all gptlsetoption C calls and before all other timing lib calls. C - if (gptlinitialize () < 0) + if (gptlinitialize () < 0) & call shr_sys_abort (subname//':: gptlinitialize') timing_initialized = .true. C$OMP END MASTER @@ -1394,14 +1394,14 @@ end subroutine t_initf C======================================================================== C subroutine t_finalizef() -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: shut down timing library -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Local workspace----------------------------- C C GPTL error return - integer ierr + integer ierr C C----------------------------------------------------------------------- C diff --git a/timing/XXXdotF/perf_utils.F b/timing/XXXdotF/perf_utils.F index cfa69425eb2..0848852f38c 100644 --- a/timing/XXXdotF/perf_utils.F +++ b/timing/XXXdotF/perf_utils.F @@ -1,15 +1,15 @@ module perf_utils -C----------------------------------------------------------------------- -C +C----------------------------------------------------------------------- +C C Purpose: This module supplies the csm_share and CAM utilities C needed by perf_mod.F90 (when the csm_share and CAM utilities C are not available). -C +C C Author: P. Worley, October 2007 C C $Id$ -C +C C----------------------------------------------------------------------- C----------------------------------------------------------------------- @@ -17,7 +17,7 @@ module perf_utils C----------------------------------------------------------------------- implicit none C Make the default access private - private + private save C----------------------------------------------------------------------- @@ -31,9 +31,9 @@ module perf_utils public find_group_name public to_lower public shr_mpi_bcast - - interface shr_mpi_bcast ; module procedure - & shr_mpi_bcastl0, + + interface shr_mpi_bcast ; module procedure + & shr_mpi_bcastl0, & shr_mpi_bcasti0 end interface @@ -47,7 +47,7 @@ module perf_utils C----------------------------------------------------------------------- C- include statements -------------------------------------------------- C----------------------------------------------------------------------- -#include +#include #include "gptl.inc" C----------------------------------------------------------------------- @@ -58,11 +58,11 @@ module perf_utils ! precision/kind constants (from csm_share/shr/shr_kind_mod.F90) !---------------------------------------------------------------------------- C 8 byte real - integer,parameter,public :: SHR_KIND_R8 = selected_real_kind(12) + integer,parameter,public :: SHR_KIND_R8 = selected_real_kind(12) C native integer - integer,parameter,public :: SHR_KIND_IN = kind(1) + integer,parameter,public :: SHR_KIND_IN = kind(1) C long char - integer,parameter,public :: SHR_KIND_CL = 256 + integer,parameter,public :: SHR_KIND_CL = 256 C extra-long char integer,parameter,public :: SHR_KIND_CX = 512 @@ -71,7 +71,7 @@ module perf_utils C----------------------------------------------------------------------- C default - integer, parameter :: def_pu_logunit = 6 + integer, parameter :: def_pu_logunit = 6 C unit number for log output integer, private :: pu_logunit = def_pu_logunit @@ -83,14 +83,14 @@ module perf_utils C======================================================================== C subroutine perfutils_setunit(LogUnit) -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- C Purpose: Set log unit number. -C Author: P. Worley +C Author: P. Worley C----------------------------------------------------------------------- C---------------------------Input arguments----------------------------- C C Unit number for log output - integer(SHR_KIND_IN), intent(IN) :: LogUnit + integer(SHR_KIND_IN), intent(IN) :: LogUnit C----------------------------------------------------------------------- pu_logunit = LogUnit C @@ -106,7 +106,7 @@ SUBROUTINE shr_sys_abort(string) IMPLICIT none C error message string - character(*) ,optional :: string + character(*) ,optional :: string C !----- local ----- integer(SHR_KIND_IN) :: ierr @@ -122,7 +122,7 @@ SUBROUTINE shr_sys_abort(string) C------------------------------------------------------------------------------- call shr_sys_flush(pu_logunit) - + if ( present(string) ) then if (len_trim(string) > 0) then write(pu_logunit,*) trim(subName),' ERROR: ',trim(string) @@ -132,15 +132,15 @@ SUBROUTINE shr_sys_abort(string) else write(pu_logunit,*) trim(subName),' ERROR ' endif - + write(pu_logunit,F00) 'WARNING: calling mpi_abort() and stopping' call shr_sys_flush(pu_logunit) call mpi_abort(MPI_COMM_WORLD,0,ierr) call shr_sys_flush(pu_logunit) call abort() - + stop - + END SUBROUTINE shr_sys_abort C=============================================================================== @@ -152,7 +152,7 @@ SUBROUTINE shr_sys_flush(unit) C !----- arguments ----- C flush output buffer for this unit - integer(SHR_KIND_IN) :: unit + integer(SHR_KIND_IN) :: unit C !----- formats ----- character(*),parameter :: subName = '(shr_sys_flush) ' @@ -186,9 +186,9 @@ SUBROUTINE shr_mpi_chkerr(rcode,string) C !----- arguments --- C input MPI error code - integer(SHR_KIND_IN), intent(in) :: rcode + integer(SHR_KIND_IN), intent(in) :: rcode C message - character(*), intent(in) :: string + character(*), intent(in) :: string C !----- local --- character(*),parameter :: subName = '(shr_mpi_chkerr) ' @@ -217,9 +217,9 @@ SUBROUTINE shr_mpi_abort(string,rcode) C !----- arguments --- C message - character(*),optional,intent(in) :: string + character(*),optional,intent(in) :: string C optional code - integer,optional,intent(in) :: rcode + integer,optional,intent(in) :: rcode C !----- local --- character(*),parameter :: subName = '(shr_mpi_abort) ' @@ -233,7 +233,7 @@ SUBROUTINE shr_mpi_abort(string,rcode) write(pu_logunit,*) trim(subName),":",trim(string),rcode endif call MPI_ABORT(MPI_COMM_WORLD,rcode,ierr) - + END SUBROUTINE shr_mpi_abort C=============================================================================== @@ -246,7 +246,7 @@ SUBROUTINE shr_mpi_barrier(comm,string) C !----- arguments --- integer,intent(in) :: comm C message - character(*),optional,intent(in) :: string + character(*),optional,intent(in) :: string C !----- local --- character(*),parameter :: subName = '(shr_mpi_barrier) ' @@ -262,23 +262,23 @@ SUBROUTINE shr_mpi_barrier(comm,string) else call shr_mpi_chkerr(ierr,subName) endif - + END SUBROUTINE shr_mpi_barrier C=============================================================================== C=============================================================================== SUBROUTINE shr_mpi_bcasti0(vec,comm,string) - + IMPLICIT none - + C !----- arguments --- C vector of 1 - integer(SHR_KIND_IN), intent(inout):: vec + integer(SHR_KIND_IN), intent(inout):: vec C mpi communicator - integer(SHR_KIND_IN), intent(in) :: comm + integer(SHR_KIND_IN), intent(in) :: comm C message - character(*),optional,intent(in) :: string + character(*),optional,intent(in) :: string C !----- local --- character(*),parameter :: subName = '(shr_mpi_bcasti0) ' @@ -290,14 +290,14 @@ SUBROUTINE shr_mpi_bcasti0(vec,comm,string) C------------------------------------------------------------------------------- lsize = 1 - + call MPI_BCAST(vec,lsize,MPI_INTEGER,0,comm,ierr) if (present(string)) then call shr_mpi_chkerr(ierr,subName//trim(string)) else call shr_mpi_chkerr(ierr,subName) endif - + END SUBROUTINE shr_mpi_bcasti0 C=============================================================================== @@ -309,11 +309,11 @@ SUBROUTINE shr_mpi_bcastl0(vec,comm,string) C !----- arguments --- C vector of 1 - logical, intent(inout):: vec + logical, intent(inout):: vec C mpi communicator - integer(SHR_KIND_IN), intent(in) :: comm + integer(SHR_KIND_IN), intent(in) :: comm C message - character(*),optional,intent(in) :: string + character(*),optional,intent(in) :: string C !----- local --- character(*),parameter :: subName = '(shr_mpi_bcastl0) ' @@ -332,7 +332,7 @@ SUBROUTINE shr_mpi_bcastl0(vec,comm,string) else call shr_mpi_chkerr(ierr,subName) endif - + END SUBROUTINE shr_mpi_bcastl0 C=============================================================================== @@ -349,7 +349,7 @@ END SUBROUTINE shr_mpi_bcastl0 C 2005-Dec-14 - E. Kluzek - creation C 2007-Oct-21 - P. Worley - dumbed down for use in perf_mod C -C !INTERFACE: ------------------------------------------------------------------ +C !INTERFACE: ------------------------------------------------------------------ INTEGER FUNCTION shr_file_getUnit () @@ -359,15 +359,15 @@ INTEGER FUNCTION shr_file_getUnit () C !----- local parameters ----- C Min unit number to give - integer(SHR_KIND_IN),parameter :: shr_file_minUnit = 10 + integer(SHR_KIND_IN),parameter :: shr_file_minUnit = 10 C Max unit number to give - integer(SHR_KIND_IN),parameter :: shr_file_maxUnit = 99 + integer(SHR_KIND_IN),parameter :: shr_file_maxUnit = 99 C !----- local variables ----- C loop index - integer(SHR_KIND_IN) :: n + integer(SHR_KIND_IN) :: n C If unit opened or not - logical :: opened + logical :: opened !----- formats ----- character(*),parameter :: subName = '(shr_file_getUnit) ' @@ -386,9 +386,9 @@ INTEGER FUNCTION shr_file_getUnit () shr_file_getUnit = n return end do - + call shr_sys_abort( subName//': Error: no available units found' ) - + END FUNCTION shr_file_getUnit C=============================================================================== @@ -403,7 +403,7 @@ END FUNCTION shr_file_getUnit C 2005-Dec-14 - E. Kluzek - creation C 2007-Oct-21 - P. Worley - dumbed down for use in perf_mod C -C !INTERFACE: ------------------------------------------------------------------ +C !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_file_freeUnit ( unit) @@ -412,15 +412,15 @@ SUBROUTINE shr_file_freeUnit ( unit) C !INPUT/OUTPUT PARAMETERS: C unit number to be freed - integer(SHR_KIND_IN),intent(in) :: unit + integer(SHR_KIND_IN),intent(in) :: unit CEOP C !----- local parameters ----- C Min unit number to give - integer(SHR_KIND_IN),parameter :: shr_file_minUnit = 10 + integer(SHR_KIND_IN),parameter :: shr_file_minUnit = 10 C Max unit number to give - integer(SHR_KIND_IN),parameter :: shr_file_maxUnit = 99 + integer(SHR_KIND_IN),parameter :: shr_file_maxUnit = 99 C !----- formats ----- character(*), parameter :: subName = '(shr_file_freeUnit) ' @@ -433,7 +433,7 @@ SUBROUTINE shr_file_freeUnit ( unit) if (unit < 0 .or. unit > shr_file_maxUnit) then !pw if (s_loglev > 0) write(pu_logunit,F00) 'invalid unit number request:', unit else if (unit == 0 .or. unit == 5 .or. unit == 6) then - call shr_sys_abort( + call shr_sys_abort( & subName//': Error: units 0, 5, and 6 must not be freed' ) end if @@ -448,12 +448,12 @@ END SUBROUTINE shr_file_freeUnit subroutine find_group_name(unit, group, status) C--------------------------------------------------------------------------------------- -C Purpose: +C Purpose: C Search a file that contains namelist input for the specified namelist group name. C Leave the file positioned so that the current record is the first record of the C input for the specified group. -C -C Method: +C +C Method: C Read the file line by line. Each line is searched for an '&' which may only C be preceded by blanks, immediately followed by the group name which is case C insensitive. If found then backspace the file so the current record is the @@ -463,34 +463,34 @@ subroutine find_group_name(unit, group, status) C--------------------------------------------------------------------------------------- C fortran unit attached to file - integer, intent(in) :: unit + integer, intent(in) :: unit C namelist group name - character(len=*), intent(in) :: group + character(len=*), intent(in) :: group C 0 for success, -1 if group name not found - integer, intent(out) :: status + integer, intent(out) :: status C ! Local variables integer :: len_grp C io status - integer :: ios + integer :: ios C first 80 characters of input record - character(len=80) :: inrec + character(len=80) :: inrec C left adjusted input record - character(len=80) :: inrec2 + character(len=80) :: inrec2 character(len=len(group)) :: lc_group C !--------------------------------------------------------------------------- len_grp = len_trim(group) lc_group = to_lower(group) - + ios = 0 do while (ios <= 0) - + read(unit, '(a)', iostat=ios, end=102) inrec - - if (ios <= 0) then + + if (ios <= 0) then C ios < 0 indicates an end of record condition C ! look for group name in this record @@ -508,13 +508,13 @@ subroutine find_group_name(unit, group, status) backspace(unit) status = 0 return - + end if end if end if - + end do - + 102 continue ! end of file processing status = -1 @@ -526,33 +526,33 @@ end subroutine find_group_name function to_lower(str) -C----------------------------------------------------------------------- -C Purpose: +C----------------------------------------------------------------------- +C Purpose: C Convert character string to lower case. -C -C Method: +C +C Method: C Use achar and iachar intrinsics to ensure use of ascii collating sequence. C C Author: B. Eaton, July 2001 -C +C C $Id$ -C----------------------------------------------------------------------- +C----------------------------------------------------------------------- implicit none C String to convert to lower case - character(len=*), intent(in) :: str + character(len=*), intent(in) :: str character(len=len(str)) :: to_lower C Local variables C Index - integer :: i + integer :: i C ascii collating sequence - integer :: aseq + integer :: aseq C integer to convert case - integer :: upper_to_lower + integer :: upper_to_lower C Character temporary - character(len=1) :: ctmp + character(len=1) :: ctmp C----------------------------------------------------------------------- upper_to_lower = iachar("a") - iachar("A") @@ -560,10 +560,10 @@ function to_lower(str) ctmp = str(i:i) aseq = iachar(ctmp) if ( aseq >= iachar("A") .and. aseq <= iachar("Z") ) - & ctmp = achar(aseq + upper_to_lower) + & ctmp = achar(aseq + upper_to_lower) to_lower(i:i) = ctmp end do - + end function to_lower C=============================================================================== diff --git a/timing/f_wrappers.c b/timing/f_wrappers.c index 02f4b756780..b1da29ec4eb 100644 --- a/timing/f_wrappers.c +++ b/timing/f_wrappers.c @@ -2,7 +2,7 @@ ** $Id: f_wrappers.c,v 1.56 2010-12-29 18:46:42 rosinski Exp $ ** ** Author: Jim Rosinski -** +** ** Fortran wrappers for timing library routines */ @@ -175,12 +175,12 @@ int gptlsetoption (int *option, int *val); int gptlenable (void); int gptldisable (void); int gptlsetutr (int *option); -int gptlquery (const char *name, int *t, int *count, int *onflg, double *wallclock, - double *usr, double *sys, long long *papicounters_out, int *maxcounters, +int gptlquery (const char *name, int *t, int *count, int *onflg, double *wallclock, + double *usr, double *sys, long long *papicounters_out, int *maxcounters, int nc); int gptlquerycounters (const char *name, int *t, long long *papicounters_out, int nc); int gptlget_wallclock (const char *name, int *t, double *value, int nc); -int gptlget_eventvalue (const char *timername, const char *eventname, int *t, double *value, +int gptlget_eventvalue (const char *timername, const char *eventname, int *t, double *value, int nc1, int nc2); int gptlget_nregions (int *t, int *nregions); int gptlget_regionname (int *t, int *region, char *name, int nc); @@ -258,7 +258,7 @@ int gptlpr_summary (int *fcomm) #endif #else int ccomm = 0; -#endif +#endif return GPTLpr_summary (ccomm); } @@ -278,7 +278,7 @@ int gptlpr_summary_file (int *fcomm, char *file, int nc1) #endif #else int ccomm = 0; -#endif +#endif if ( ! (locfile = (char *) malloc (nc1+1))) return GPTLerror ("gptlpr_summary_file: malloc error\n"); @@ -304,7 +304,7 @@ int gptlbarrier (int *fcomm, char *name, int nc1) #endif #else int ccomm = 0; -#endif +#endif numchars = MIN (nc1, MAX_CHARS); strncpy (cname, name, numchars); @@ -394,8 +394,8 @@ int gptlsetutr (int *option) return GPTLsetutr (*option); } -int gptlquery (const char *name, int *t, int *count, int *onflg, double *wallclock, - double *usr, double *sys, long long *papicounters_out, int *maxcounters, +int gptlquery (const char *name, int *t, int *count, int *onflg, double *wallclock, + double *usr, double *sys, long long *papicounters_out, int *maxcounters, int nc) { char cname[MAX_CHARS+1]; @@ -430,7 +430,7 @@ int gptlget_wallclock (const char *name, int *t, double *value, int nc) return GPTLget_wallclock (cname, *t, value); } -int gptlget_eventvalue (const char *timername, const char *eventname, int *t, double *value, +int gptlget_eventvalue (const char *timername, const char *eventname, int *t, double *value, int nc1, int nc2) { char ctimername[MAX_CHARS+1]; diff --git a/timing/gptl.c b/timing/gptl.c index 6346bf1b999..19c0ff7fa6a 100644 --- a/timing/gptl.c +++ b/timing/gptl.c @@ -17,7 +17,7 @@ #include #ifndef HAVE_C99_INLINE -#define inline +#define inline #endif #ifdef HAVE_PAPI @@ -134,7 +134,7 @@ static char **timerlist; /* list of all timers */ typedef struct { int val; /* depth in calling tree */ int padding[31]; /* padding is to mitigate false cache sharing */ -} Nofalse; +} Nofalse; static Timer ***callstack; /* call stack */ static Nofalse *stackidx; /* index into callstack: */ @@ -260,7 +260,7 @@ int GPTLsetoption (const int option, /* option */ switch (option) { case GPTLcpu: #ifdef HAVE_TIMES - cpustats.enabled = (bool) val; + cpustats.enabled = (bool) val; if (verbose) printf ("%s: cpustats = %d\n", thisfunc, val); #else @@ -268,56 +268,56 @@ int GPTLsetoption (const int option, /* option */ return GPTLerror ("%s: times() not available\n", thisfunc); #endif return 0; - case GPTLwall: - wallstats.enabled = (bool) val; + case GPTLwall: + wallstats.enabled = (bool) val; if (verbose) printf ("%s: boolean wallstats = %d\n", thisfunc, val); return 0; - case GPTLoverhead: - overheadstats.enabled = (bool) val; + case GPTLoverhead: + overheadstats.enabled = (bool) val; if (verbose) printf ("%s: boolean overheadstats = %d\n", thisfunc, val); return 0; - case GPTLdepthlimit: - depthlimit = val; + case GPTLdepthlimit: + depthlimit = val; if (verbose) printf ("%s: depthlimit = %d\n", thisfunc, val); return 0; - case GPTLverbose: - verbose = (bool) val; + case GPTLverbose: + verbose = (bool) val; #ifdef HAVE_PAPI (void) GPTL_PAPIsetoption (GPTLverbose, val); #endif if (verbose) printf ("%s: boolean verbose = %d\n", thisfunc, val); return 0; - case GPTLpercent: - percent = (bool) val; + case GPTLpercent: + percent = (bool) val; if (verbose) printf ("%s: boolean percent = %d\n", thisfunc, val); return 0; - case GPTLdopr_preamble: - dopr_preamble = (bool) val; + case GPTLdopr_preamble: + dopr_preamble = (bool) val; if (verbose) printf ("%s: boolean dopr_preamble = %d\n", thisfunc, val); return 0; - case GPTLdopr_threadsort: - dopr_threadsort = (bool) val; + case GPTLdopr_threadsort: + dopr_threadsort = (bool) val; if (verbose) printf ("%s: boolean dopr_threadsort = %d\n", thisfunc, val); return 0; - case GPTLdopr_multparent: - dopr_multparent = (bool) val; + case GPTLdopr_multparent: + dopr_multparent = (bool) val; if (verbose) printf ("%s: boolean dopr_multparent = %d\n", thisfunc, val); return 0; - case GPTLdopr_collision: - dopr_collision = (bool) val; + case GPTLdopr_collision: + dopr_collision = (bool) val; if (verbose) printf ("%s: boolean dopr_collision = %d\n", thisfunc, val); return 0; case GPTLprint_method: - method = (Method) val; + method = (Method) val; if (verbose) printf ("%s: print_method = %s\n", thisfunc, methodstr (method)); return 0; @@ -338,8 +338,8 @@ int GPTLsetoption (const int option, /* option */ printf ("%s: boolean sync_mpi = %d\n", thisfunc, val); return 0; - /* - ** Allow GPTLmultiplex to fall through because it will be handled by + /* + ** Allow GPTLmultiplex to fall through because it will be handled by ** GPTL_PAPIsetoption() */ @@ -405,7 +405,7 @@ int GPTLsetutr (const int option) ** GPTLinitialize (): Initialization routine must be called from single-threaded ** region before any other timing routines may be called. The need for this ** routine could be eliminated if not targetting timing library for threaded -** capability. +** capability. ** ** return value: 0 (success) or GPTLerror (failure) */ @@ -469,12 +469,12 @@ int GPTLinitialize (void) return GPTLerror ("%s: Failure from GPTL_PAPIinitialize\n", thisfunc); #endif - /* + /* ** Call init routine for underlying timing routine. */ if ((*funclist[funcidx].funcinit)() < 0) { - fprintf (stderr, "%s: Failure initializing %s. Reverting underlying timer to %s\n", + fprintf (stderr, "%s: Failure initializing %s. Reverting underlying timer to %s\n", thisfunc, funclist[funcidx].name, funclist[0].name); funcidx = 0; } @@ -620,12 +620,12 @@ int GPTLstart_instr (void *self) ptr = getentry_instr (hashtable[t], self, &indx); - /* - ** Recursion => increment depth in recursion and return. We need to return + /* + ** Recursion => increment depth in recursion and return. We need to return ** because we don't want to restart the timer. We want the reported time for ** the timer to reflect the outermost layer of recursion. */ - + if (ptr && ptr->onflg) { ++ptr->recurselvl; return 0; @@ -662,7 +662,7 @@ int GPTLstart_instr (void *self) return GPTLerror ("%s: update_ptr error\n", thisfunc); return (0); -} +} /* ** GPTLstart: start a timer @@ -700,15 +700,15 @@ int GPTLstart (const char *name) /* timer name */ return 0; } - /* + /* ** ptr will point to the requested timer in the current list, - ** or NULL if this is a new entry + ** or NULL if this is a new entry */ ptr = getentry (hashtable[t], name, &indx); - /* - ** Recursion => increment depth in recursion and return. We need to return + /* + ** Recursion => increment depth in recursion and return. We need to return ** because we don't want to restart the timer. We want the reported time for ** the timer to reflect the outermost layer of recursion. */ @@ -786,7 +786,7 @@ int GPTLstart_handle (const char *name, /* timer name */ } /* - ** If on input, handle references a non-zero value, assume it's a previously returned Timer* + ** If on input, handle references a non-zero value, assume it's a previously returned Timer* ** passed in by the user. If zero, generate the hash entry and return it to the user. */ @@ -795,9 +795,9 @@ int GPTLstart_handle (const char *name, /* timer name */ } else { ptr = getentry (hashtable[t], name, &indx); } - - /* - ** Recursion => increment depth in recursion and return. We need to return + + /* + ** Recursion => increment depth in recursion and return. We need to return ** because we don't want to restart the timer. We want the reported time for ** the timer to reflect the outermost layer of recursion. */ @@ -869,7 +869,7 @@ static int update_ll_hash (Timer *ptr, const int t, const unsigned int indx) last[t] = ptr; ++hashtable[t][indx].nument; nument = hashtable[t][indx].nument; - + eptr = (Timer **) realloc (hashtable[t][indx].entries, nument * sizeof (Timer *)); if ( ! eptr) return GPTLerror ("update_ll_hash: realloc error\n"); @@ -898,7 +898,7 @@ static inline int update_ptr (Timer *ptr, const int t) if (cpustats.enabled && get_cpustamp (&ptr->cpu.last_utime, &ptr->cpu.last_stime) < 0) return GPTLerror ("update_ptr: get_cpustamp error"); - + if (wallstats.enabled) { tp2 = (*ptr2wtimefunc) (); ptr->wall.last = tp2; @@ -922,9 +922,9 @@ static inline int update_ptr (Timer *ptr, const int t) ** Return value: 0 (success) or GPTLerror (failure) */ -static inline int update_parent_info (Timer *ptr, - Timer **callstackt, - int stackidxt) +static inline int update_parent_info (Timer *ptr, + Timer **callstackt, + int stackidxt) { int n; /* loop index through known parents */ Timer *pptr; /* pointer to parent in callstack */ @@ -941,7 +941,7 @@ static inline int update_parent_info (Timer *ptr, callstackt[stackidxt] = ptr; - /* + /* ** If the region has no parent, bump its orphan count ** (should never happen since "GPTL_ROOT" added). */ @@ -1010,7 +1010,7 @@ int GPTLstop_instr (void *self) return GPTLerror ("%s: GPTLinitialize has not been called\n", thisfunc); /* Get the timestamp */ - + if (wallstats.enabled) { tp1 = (*ptr2wtimefunc) (); } @@ -1033,7 +1033,7 @@ int GPTLstop_instr (void *self) ptr = getentry_instr (hashtable[t], self, &indx); - if ( ! ptr) + if ( ! ptr) return GPTLerror ("%s: timer for %p had not been started.\n", thisfunc, self); if ( ! ptr->onflg ) @@ -1041,7 +1041,7 @@ int GPTLstop_instr (void *self) ++ptr->count; - /* + /* ** Recursion => decrement depth in recursion and return. We need to return ** because we don't want to stop the timer. We want the reported time for ** the timer to reflect the outermost layer of recursion. @@ -1085,7 +1085,7 @@ int GPTLstop (const char *name) /* timer name */ return GPTLerror ("%s: GPTLinitialize has not been called\n", thisfunc); /* Get the timestamp */ - + if (wallstats.enabled) { tp1 = (*ptr2wtimefunc) (); } @@ -1114,7 +1114,7 @@ int GPTLstop (const char *name) /* timer name */ ++ptr->count; - /* + /* ** Recursion => decrement depth in recursion and return. We need to return ** because we don't want to stop the timer. We want the reported time for ** the timer to reflect the outermost layer of recursion. @@ -1160,7 +1160,7 @@ int GPTLstop_handle (const char *name, /* timer name */ return GPTLerror ("%s: GPTLinitialize has not been called\n", thisfunc); /* Get the timestamp */ - + if (wallstats.enabled) { tp1 = (*ptr2wtimefunc) (); } @@ -1182,7 +1182,7 @@ int GPTLstop_handle (const char *name, /* timer name */ } /* - ** If on input, handle references a non-zero value, assume it's a previously returned Timer* + ** If on input, handle references a non-zero value, assume it's a previously returned Timer* ** passed in by the user. If zero, generate the hash entry and return it to the user. */ @@ -1198,7 +1198,7 @@ int GPTLstop_handle (const char *name, /* timer name */ ++ptr->count; - /* + /* ** Recursion => decrement depth in recursion and return. We need to return ** because we don't want to stop the timer. We want the reported time for ** the timer to reflect the outermost layer of recursion. @@ -1224,7 +1224,7 @@ int GPTLstop_handle (const char *name, /* timer name */ } /* -** update_stats: update stats inside ptr. Called by GPTLstop, GPTLstop_instr, +** update_stats: update stats inside ptr. Called by GPTLstop, GPTLstop_instr, ** GPTLstop_handle ** ** Input arguments: @@ -1237,9 +1237,9 @@ int GPTLstop_handle (const char *name, /* timer name */ ** Return value: 0 (success) or GPTLerror (failure) */ -static inline int update_stats (Timer *ptr, - const double tp1, - const long usr, +static inline int update_stats (Timer *ptr, + const double tp1, + const long usr, const long sys, const int t) { @@ -1375,7 +1375,7 @@ int GPTLreset (void) return 0; } -/* +/* ** GPTLpr_set_append: set GPTLpr_file and GPTLpr_summary_file ** to use append mode */ @@ -1386,20 +1386,20 @@ int GPTLpr_set_append (void) return 0; } -/* +/* ** GPTLpr_query_append: query whether GPTLpr_file and GPTLpr_summary_file ** use append mode */ int GPTLpr_query_append (void) { - if (pr_append) + if (pr_append) return 1; - else + else return 0; } -/* +/* ** GPTLpr_set_write: set GPTLpr_file and GPTLpr_summary_file ** to use write mode */ @@ -1410,20 +1410,20 @@ int GPTLpr_set_write (void) return 0; } -/* +/* ** GPTLpr_query_write: query whether GPTLpr_file and GPTLpr_summary_file ** use write mode */ int GPTLpr_query_write (void) { - if (pr_append) + if (pr_append) return 0; - else + else return 1; } -/* +/* ** GPTLpr: Print values of all timers ** ** Input arguments: @@ -1448,7 +1448,7 @@ int GPTLpr (const int id) /* output file will be named "timing." */ return 0; } -/* +/* ** GPTLpr_file: Print values of all timers ** ** Input arguments: @@ -1500,9 +1500,9 @@ int GPTLpr_file (const char *outfile) /* output file to write */ /* 2 is for "/" plus null */ if (outdir) - totlen = strlen (outdir) + strlen (outfile) + 2; + totlen = strlen (outdir) + strlen (outfile) + 2; else - totlen = strlen (outfile) + 2; + totlen = strlen (outfile) + 2; outpath = (char *) GPTLallocate (totlen); @@ -1619,11 +1619,11 @@ int GPTLpr_file (const char *outfile) /* output file to write */ } sum = (float *) GPTLallocate (nthreads * sizeof (float)); - + for (t = 0; t < nthreads; ++t) { /* - ** Construct tree for printing timers in parent/child form. get_max_depth() must be called + ** Construct tree for printing timers in parent/child form. get_max_depth() must be called ** AFTER construct_tree() because it relies on the per-parent children arrays being complete. */ @@ -1671,7 +1671,7 @@ int GPTLpr_file (const char *outfile) /* output file to write */ printself_andchildren (timers[t], fp, t, -1, tot_overhead); - /* + /* ** Sum of overhead across timers is meaningful. ** Factor of 2 is because there are 2 utr calls per start/stop pair. */ @@ -1721,8 +1721,8 @@ int GPTLpr_file (const char *outfile) /* output file to write */ /* Start at next to skip dummy */ for (ptr = timers[0]->next; ptr; ptr = ptr->next) { - - /* + + /* ** To print sum stats, first create a new timer then copy thread 0 ** stats into it. then sum using "add", and finally print. */ @@ -1874,7 +1874,7 @@ int GPTLpr_file (const char *outfile) /* output file to write */ totmem += gptlmem; fprintf (fp, "\n"); fprintf (fp, "Thread %d total memory usage = %g KB\n", t, gptlmem*.001); - fprintf (fp, " Hashmem = %g KB\n" + fprintf (fp, " Hashmem = %g KB\n" " Regionmem = %g KB (papimem portion = %g KB)\n" " Parent/child arrays = %g KB\n", hashmem*.001, regionmem*.001, papimem*.001, pchmem*.001); @@ -1892,7 +1892,7 @@ int GPTLpr_file (const char *outfile) /* output file to write */ return 0; } -/* +/* ** construct_tree: Build the parent->children tree starting with knowledge of ** parent list for each child. ** @@ -1944,7 +1944,7 @@ int construct_tree (Timer *timerst, Method method) } break; case GPTLfull_tree: - /* + /* ** Careful: this one can create *lots* of output! */ for (n = 0; n < ptr->nparent; ++n) { @@ -1959,7 +1959,7 @@ int construct_tree (Timer *timerst, Method method) return 0; } -/* +/* ** methodstr: Return a pointer to a string which represents the method ** ** Input arguments: @@ -1980,9 +1980,9 @@ static char *methodstr (Method method) return "Unknown"; } -/* +/* ** newchild: Add an entry to the children list of parent. Use function -** is_descendant() to prevent infinite loops. +** is_descendant() to prevent infinite loops. ** ** Input arguments: ** parent: parent node @@ -2017,7 +2017,7 @@ static int newchild (Timer *parent, Timer *child) } /* - ** To guarantee no loops, ensure that proposed parent isn't already a descendant of + ** To guarantee no loops, ensure that proposed parent isn't already a descendant of ** proposed child */ @@ -2040,13 +2040,13 @@ static int newchild (Timer *parent, Timer *child) return 0; } -/* +/* ** get_max_depth: Determine the maximum call tree depth by traversing the ** tree recursively ** ** Input arguments: ** ptr: Starting timer -** startdepth: current depth when function invoked +** startdepth: current depth when function invoked ** ** Return value: maximum depth */ @@ -2064,7 +2064,7 @@ static int get_max_depth (const Timer *ptr, const int startdepth) return maxdepth; } -/* +/* ** num_descendants: Determine the number of descendants of a timer by traversing ** the tree recursively. This function is not currently used. It could be ** useful in a pruning algorithm @@ -2086,7 +2086,7 @@ static int num_descendants (Timer *ptr) return ptr->num_desc; } -/* +/* ** is_descendant: Determine whether node2 is in the descendant list for ** node1 ** @@ -2114,7 +2114,7 @@ static int is_descendant (const Timer *node1, const Timer *node2) return 0; } -/* +/* ** printstats: print a single timer ** ** Input arguments: @@ -2224,7 +2224,7 @@ static void printstats (const Timer *timer, else fprintf (fp, "%13.3e ", timer->nbytes / timer->count); #endif - + #ifdef HAVE_PAPI GPTL_PAPIpr (fp, &timer->aux, t, timer->count, timer->wall.accum); #endif @@ -2232,13 +2232,13 @@ static void printstats (const Timer *timer, fprintf (fp, "\n"); } -/* -** print_multparentinfo: +/* +** print_multparentinfo: ** ** Input arguments: ** Input/output arguments: */ -void print_multparentinfo (FILE *fp, +void print_multparentinfo (FILE *fp, Timer *ptr) { int n; @@ -2263,7 +2263,7 @@ void print_multparentinfo (FILE *fp, fprintf (fp, "%8.1e %-32s\n\n", (float) ptr->count, ptr->name); } -/* +/* ** add: add the contents of tin to tout ** ** Input arguments: @@ -2272,14 +2272,14 @@ void print_multparentinfo (FILE *fp, ** tout: output timer summed into */ -static void add (Timer *tout, +static void add (Timer *tout, const Timer *tin) { tout->count += tin->count; if (wallstats.enabled) { tout->wall.accum += tin->wall.accum; - + tout->wall.max = MAX (tout->wall.max, tin->wall.max); tout->wall.min = MIN (tout->wall.min, tin->wall.min); } @@ -2293,8 +2293,8 @@ static void add (Timer *tout, #endif } -/* -** GPTLpr_summary: Gather and print summary stats across +/* +** GPTLpr_summary: Gather and print summary stats across ** threads and MPI tasks ** ** Input arguments: @@ -2315,10 +2315,10 @@ int GPTLpr_summary (int comm) } #ifdef HAVE_MPI -int GPTLpr_summary_file (MPI_Comm comm, +int GPTLpr_summary_file (MPI_Comm comm, const char *outfile) #else -int GPTLpr_summary_file (int comm, +int GPTLpr_summary_file (int comm, const char *outfile) #endif { @@ -2362,7 +2362,7 @@ int GPTLpr_summary_file (int comm, return GPTLerror ("%s: GPTLinitialize() has not been called\n", thisfunc); /* - ** Each process gathers stats for its threads. + ** Each process gathers stats for its threads. ** Binary tree used combine results. ** Master prints results. */ @@ -2411,7 +2411,7 @@ int GPTLpr_summary_file (int comm, /* allocate storage for data for all timers */ if( !( storage = malloc( sizeof(Summarystats) * count ) ) && count ) return GPTLerror ("%s: memory allocation failed\n", thisfunc); - + if ( (ret = collect_data( iam, comm, &count, &storage) ) != 0 ) return GPTLerror ("%s: master collect_data failed\n", thisfunc); @@ -2526,7 +2526,7 @@ static int merge_thread_data() /* count timers for thread 0 */ count_r = 0; - for (ptr = timers[0]->next; ptr; ptr = ptr->next) count_r++; + for (ptr = timers[0]->next; ptr; ptr = ptr->next) count_r++; timerlist = (char **) GPTLallocate( sizeof (char *)); if( !( timerlist[0] = (char *)malloc( count_r * length * sizeof (char)) ) && count_r) @@ -2551,7 +2551,7 @@ static int merge_thread_data() /* count timers for thread */ count[t] = 0; - for (ptr = timers[t]->next; ptr; ptr = ptr->next) count[t]++; + for (ptr = timers[t]->next; ptr; ptr = ptr->next) count[t]++; if( count[t] > max_count || max_count == 0 ) max_count = count[t]; @@ -2587,24 +2587,24 @@ static int merge_thread_data() k = 0; n = 0; num_newtimers = 0; - while( k < count[0] && n < count[t] ) { + while( k < count[0] && n < count[t] ) { /* linear comparison of timers */ compare = strcmp( sort[0][k], sort[t][n] ); - if( compare == 0 ) { + if( compare == 0 ) { /* both have, nothing needs to be done */ k++; n++; continue; } - if( compare < 0 ) { + if( compare < 0 ) { /* event that only master has, nothing needs to be done */ k++; continue; } - if( compare > 0 ) { + if( compare > 0 ) { /* event that only slave thread has, need to add */ newtimers[num_newtimers] = sort[t][n]; n++; @@ -2612,8 +2612,8 @@ static int merge_thread_data() } } - while( n < count[t] ) { - /* adds any remaining timers, since we know that all the rest + while( n < count[t] ) { + /* adds any remaining timers, since we know that all the rest are new since have checked all master thread timers */ newtimers[num_newtimers] = sort[t][n]; num_newtimers++; @@ -2622,7 +2622,7 @@ static int merge_thread_data() if( num_newtimers ) { /* sorts by memory address to restore original order */ - qsort( newtimers, num_newtimers, sizeof(char*), ncmp ); + qsort( newtimers, num_newtimers, sizeof(char*), ncmp ); /* reallocate memory to hold additional timers */ if( !( sort[0] = realloc( sort[0], (count[0] + num_newtimers) * sizeof (char *)) ) ) @@ -2631,7 +2631,7 @@ static int merge_thread_data() return GPTLerror ("%s: memory reallocation failed\n", thisfunc); k = count[0]; - for (n = 0; n < num_newtimers; n++) { + for (n = 0; n < num_newtimers; n++) { /* add new found timers */ memcpy( timerlist[0] + (count[0] + n) * length, newtimers[n], length * sizeof (char) ); } @@ -2639,7 +2639,7 @@ static int merge_thread_data() count[0] += num_newtimers; /* reassign pointers in sort since realloc will have broken them if it moved the memory. */ - x = 0; + x = 0; for (k = 0; k < count[0]; k++) { sort[0][k] = timerlist[0] + x; x += length; @@ -2649,7 +2649,7 @@ static int merge_thread_data() } } - free(sort[0]); + free(sort[0]); /* don't free timerlist[0], since needed for subsequent steps in gathering global statistics */ for (t = 1; t < nthreads; t++) { free(sort[t]); @@ -2679,14 +2679,14 @@ static int merge_thread_data() */ #ifdef HAVE_MPI -static int collect_data(const int iam, +static int collect_data(const int iam, MPI_Comm comm, - int *count, + int *count, Summarystats **summarystats_cumul ) #else -static int collect_data(const int iam, +static int collect_data(const int iam, int comm, - int *count, + int *count, Summarystats **summarystats_cumul ) #endif { @@ -2809,11 +2809,11 @@ static int collect_data(const int iam, { compare = strcmp(sort_master[k], sort_slave[n]); - if (compare == 0) { + if (compare == 0) { /* matching timers found */ /* find element number of the name in original timerlist so that it can be matched with its summarystats */ - m_index = get_index( timerlist[0], sort_master[k] ); + m_index = get_index( timerlist[0], sort_master[k] ); s_index = get_index( timers_slave, sort_slave[n] ); get_summarystats (&summarystats[m_index], &summarystats_slave[s_index]); @@ -2822,7 +2822,7 @@ static int collect_data(const int iam, continue; } - if (compare > 0) { + if (compare > 0) { /* s1 >s2 . slave has event; master does not */ newtimers[num_newtimers] = sort_slave[n]; num_newtimers++; @@ -2834,7 +2834,7 @@ static int collect_data(const int iam, k++; } - while (n < count_slave) { + while (n < count_slave) { /* add all remaining timers which only the slave has */ newtimers[num_newtimers] = sort_slave[n]; num_newtimers++; @@ -2842,7 +2842,7 @@ static int collect_data(const int iam, } /* sort by memory address to get original order */ - qsort (newtimers, num_newtimers, sizeof(char*), ncmp); + qsort (newtimers, num_newtimers, sizeof(char*), ncmp); /* reallocate to hold new timer names and summary stats from slave */ if (!(timerlist[0] = realloc( timerlist[0], length * (*count + num_newtimers) * sizeof (char) ) )) @@ -2922,7 +2922,7 @@ static int collect_data(const int iam, ** Return value: index of element in list */ -int get_index( const char * list, +int get_index( const char * list, const char * element ) { return (( element - list ) / ( MAX_CHARS + 1 )); @@ -2955,7 +2955,7 @@ static int ncmp( const char **x, const char **y ) GPTLerror("%s: shared memory address between timers\n", thisfunc); } -/* +/* ** get_threadstats: gather stats for timer "name" over all threads ** ** Input arguments: @@ -2965,7 +2965,7 @@ static int ncmp( const char **x, const char **y ) ** summarystats: max/min stats over all threads */ -void get_threadstats (const int iam, +void get_threadstats (const int iam, const char *name, Summarystats *summarystats) { @@ -3017,7 +3017,7 @@ void get_threadstats (const int iam, summarystats->papimax[n] = value; summarystats->papimax_t[n] = t; } - + if (value < summarystats->papimin[n] || summarystats->papimin[n] == 0.) { summarystats->papimin[n] = value; summarystats->papimin_t[n] = t; @@ -3030,7 +3030,7 @@ void get_threadstats (const int iam, if ( summarystats->count ) summarystats->processes = 1; } -/* +/* ** get_summarystats: write max/min stats into mpistats based on comparison ** with summarystats_slave ** @@ -3040,7 +3040,7 @@ void get_threadstats (const int iam, ** summarystats: stats (starts out as master stats) */ -void get_summarystats (Summarystats *summarystats, +void get_summarystats (Summarystats *summarystats, const Summarystats *summarystats_slave) { if (summarystats_slave->count == 0) return; @@ -3051,7 +3051,7 @@ void get_summarystats (Summarystats *summarystats, summarystats->wallmax_t = summarystats_slave->wallmax_t; } - if ((summarystats_slave->wallmin < summarystats->wallmin) || + if ((summarystats_slave->wallmin < summarystats->wallmin) || (summarystats->count == 0)){ summarystats->wallmin = summarystats_slave->wallmin; summarystats->wallmin_p = summarystats_slave->wallmin_p; @@ -3068,7 +3068,7 @@ void get_summarystats (Summarystats *summarystats, summarystats->papimax_t[n] = summarystats_slave->papimax_t[n]; } - if ((summarystats_slave->papimin[n] < summarystats->papimin[n]) || + if ((summarystats_slave->papimin[n] < summarystats->papimin[n]) || (summarystats->count == 0)){ summarystats->papimin[n] = summarystats_slave->papimin[n]; summarystats->papimin_p[n] = summarystats_slave->papimin_p[n]; @@ -3085,7 +3085,7 @@ void get_summarystats (Summarystats *summarystats, summarystats->threads += summarystats_slave->threads; } -/* +/* ** GPTLbarrier: When MPI enabled, set and time an MPI barrier ** ** Input arguments: @@ -3138,10 +3138,10 @@ static inline int get_cpustamp (long *usr, long *sys) } /* -** GPTLquery: return current status info about a timer. If certain stats are not +** GPTLquery: return current status info about a timer. If certain stats are not ** enabled, they should just have zeros in them. If PAPI is not enabled, input ** counter info is ignored. -** +** ** Input args: ** name: timer name ** maxcounters: max number of PAPI counters to get info for @@ -3156,7 +3156,7 @@ static inline int get_cpustamp (long *usr, long *sys) ** papicounters_out: accumulated PAPI counters */ -int GPTLquery (const char *name, +int GPTLquery (const char *name, int t, int *count, int *onflg, @@ -3169,14 +3169,14 @@ int GPTLquery (const char *name, Timer *ptr; /* linked list pointer */ unsigned int indx; /* linked list index returned from getentry (unused) */ static const char *thisfunc = "GPTLquery"; - + if ( ! initialized) return GPTLerror ("%s: GPTLinitialize has not been called\n", thisfunc); - + /* ** If t is < 0, assume the request is for the current thread */ - + if (t < 0) { if ((t = get_thread_num ()) < 0) return GPTLerror ("%s: get_thread_num failure\n", thisfunc); @@ -3184,7 +3184,7 @@ int GPTLquery (const char *name, if (t >= maxthreads) return GPTLerror ("%s: requested thread %d is too big\n", thisfunc, t); } - + ptr = getentry (hashtable[t], name, &indx); if ( !ptr) return GPTLerror ("%s: requested timer %s does not have a name hash\n", thisfunc, name); @@ -3203,7 +3203,7 @@ int GPTLquery (const char *name, /* ** GPTLquerycounters: return current PAPI counters for a timer. ** THIS ROUTINE ID DEPRECATED. USE GPTLget_eventvalue() instead -** +** ** Input args: ** name: timer name ** t: thread number (if < 0, the request is for the current thread) @@ -3212,21 +3212,21 @@ int GPTLquery (const char *name, ** papicounters_out: accumulated PAPI counters */ -int GPTLquerycounters (const char *name, +int GPTLquerycounters (const char *name, int t, long long *papicounters_out) { Timer *ptr; /* linked list pointer */ unsigned int indx; /* hash index returned from getentry */ static const char *thisfunc = "GPTLquery_counters"; - + if ( ! initialized) return GPTLerror ("%s: GPTLinitialize has not been called\n", thisfunc); - + /* ** If t is < 0, assume the request is for the current thread */ - + if (t < 0) { if ((t = get_thread_num ()) < 0) return GPTLerror ("%s: get_thread_num failure\n", thisfunc); @@ -3234,7 +3234,7 @@ int GPTLquerycounters (const char *name, if (t >= maxthreads) return GPTLerror ("%s: requested thread %d is too big\n", thisfunc, t); } - + ptr = getentry (hashtable[t], name, &indx); if ( !ptr) return GPTLerror ("%s: requested timer %s does not have a name hash\n", thisfunc, name); @@ -3248,7 +3248,7 @@ int GPTLquerycounters (const char *name, /* ** GPTLget_wallclock: return wallclock accumulation for a timer. -** +** ** Input args: ** timername: timer name ** t: thread number (if < 0, the request is for the current thread) @@ -3265,17 +3265,17 @@ int GPTLget_wallclock (const char *timername, Timer *ptr; /* linked list pointer */ unsigned int indx; /* hash index returned from getentry (unused) */ static const char *thisfunc = "GPTLget_wallclock"; - + if ( ! initialized) return GPTLerror ("%s: GPTLinitialize has not been called\n", thisfunc); if ( ! wallstats.enabled) return GPTLerror ("%s: wallstats not enabled\n", thisfunc); - + /* ** If t is < 0, assume the request is for the current thread */ - + if (t < 0) { if ((t = get_thread_num ()) < 0) return GPTLerror ("%s: bad return from get_thread_num\n", thisfunc); @@ -3283,9 +3283,9 @@ int GPTLget_wallclock (const char *timername, if (t >= maxthreads) return GPTLerror ("%s: requested thread %d is too big\n", thisfunc, t); } - - /* - ** Don't know whether hashtable entry for timername was generated with + + /* + ** Don't know whether hashtable entry for timername was generated with ** *_instr() or not, so try both possibilities */ @@ -3305,7 +3305,7 @@ int GPTLget_wallclock (const char *timername, /* ** GPTLget_eventvalue: return PAPI-based event value for a timer. All values will be ** returned as doubles, even if the event is not derived. -** +** ** Input args: ** timername: timer name ** eventname: event name (must be currently enabled) @@ -3324,14 +3324,14 @@ int GPTLget_eventvalue (const char *timername, Timer *ptr; /* linked list pointer */ unsigned int indx; /* hash index returned from getentry (unused) */ static const char *thisfunc = "GPTLget_eventvalue"; - + if ( ! initialized) return GPTLerror ("%s: GPTLinitialize has not been called\n", thisfunc); - + /* ** If t is < 0, assume the request is for the current thread */ - + if (t < 0) { if ((t = get_thread_num ()) < 0) return GPTLerror ("%s: get_thread_num failure\n", thisfunc); @@ -3339,9 +3339,9 @@ int GPTLget_eventvalue (const char *timername, if (t >= maxthreads) return GPTLerror ("%s: requested thread %d is too big\n", thisfunc, t); } - - /* - ** Don't know whether hashtable entry for timername was generated with + + /* + ** Don't know whether hashtable entry for timername was generated with ** *_instr() or not, so try both possibilities */ @@ -3357,13 +3357,13 @@ int GPTLget_eventvalue (const char *timername, #ifdef HAVE_PAPI return GPTL_PAPIget_eventvalue (eventname, &ptr->aux, value); #else - return GPTLerror ("%s: PAPI not enabled\n", thisfunc); + return GPTLerror ("%s: PAPI not enabled\n", thisfunc); #endif } /* ** GPTLget_nregions: return number of regions (i.e. timer names) for this thread -** +** ** Input args: ** t: thread number (if < 0, the request is for the current thread) ** @@ -3371,7 +3371,7 @@ int GPTLget_eventvalue (const char *timername, ** nregions: number of regions */ -int GPTLget_nregions (int t, +int GPTLget_nregions (int t, int *nregions) { Timer *ptr; /* walk through linked list */ @@ -3379,11 +3379,11 @@ int GPTLget_nregions (int t, if ( ! initialized) return GPTLerror ("%s: GPTLinitialize has not been called\n", thisfunc); - + /* ** If t is < 0, assume the request is for the current thread */ - + if (t < 0) { if ((t = get_thread_num ()) < 0) return GPTLerror ("%s: get_thread_num failure\n", thisfunc); @@ -3391,9 +3391,9 @@ int GPTLget_nregions (int t, if (t >= maxthreads) return GPTLerror ("%s: requested thread %d is too big\n", thisfunc, t); } - + *nregions = 0; - for (ptr = timers[t]->next; ptr; ptr = ptr->next) + for (ptr = timers[t]->next; ptr; ptr = ptr->next) ++*nregions; return 0; @@ -3401,7 +3401,7 @@ int GPTLget_nregions (int t, /* ** GPTLget_regionname: return region name for this thread -** +** ** Input args: ** t: thread number (if < 0, the request is for the current thread) ** region: region number @@ -3423,11 +3423,11 @@ int GPTLget_regionname (int t, /* thread number */ if ( ! initialized) return GPTLerror ("%s: GPTLinitialize has not been called\n", thisfunc); - + /* ** If t is < 0, assume the request is for the current thread */ - + if (t < 0) { if ((t = get_thread_num ()) < 0) return GPTLerror ("%s: get_thread_num failure\n", thisfunc); @@ -3435,7 +3435,7 @@ int GPTLget_regionname (int t, /* thread number */ if (t >= maxthreads) return GPTLerror ("%s: requested thread %d is too big\n", thisfunc, t); } - + ptr = timers[t]->next; for (i = 0; i < region; i++) { if ( ! ptr) @@ -3446,7 +3446,7 @@ int GPTLget_regionname (int t, /* thread number */ if (ptr) { ncpy = MIN (nc, strlen (ptr->name)); strncpy (name, ptr->name, ncpy); - + /* ** Adding the \0 is only important when called from C */ @@ -3523,7 +3523,7 @@ static inline Timer *getentry (const Hashentry *hashtable, /* hash table */ const unsigned char *c; /* pointer to elements of "name" */ Timer *ptr = 0; /* return value when entry not found */ - /* + /* ** Hash value is sum of: chars times their 1-based position index, modulo tablesize */ @@ -3535,7 +3535,7 @@ static inline Timer *getentry (const Hashentry *hashtable, /* hash table */ *indx %= tablesize; - /* + /* ** If nument exceeds 1 there was a hash collision and we must search ** linearly through an array for a match */ @@ -3723,7 +3723,7 @@ static int init_papitime () return GPTLerror ("%s: not enabled\n", thisfunc); #endif } - + static inline double utr_papitime () { #ifdef HAVE_PAPI @@ -3735,8 +3735,8 @@ static inline double utr_papitime () #endif } -/* -** Probably need to link with -lrt for this one to work +/* +** Probably need to link with -lrt for this one to work */ static int init_clock_gettime () @@ -3831,7 +3831,7 @@ static inline double utr_gettimeofday () #endif } -/* +/* ** Determine underlying timing routine overhead: call it 1000 times. */ @@ -3852,7 +3852,7 @@ static double utr_getoverhead () */ static void printself_andchildren (const Timer *ptr, - FILE *fp, + FILE *fp, const int t, const int depth, const double tot_overhead) @@ -3868,9 +3868,9 @@ static void printself_andchildren (const Timer *ptr, #ifdef ENABLE_PMPI /* -** GPTLgetentry: called ONLY from pmpi.c (i.e. not a public entry point). Returns a pointer to the +** GPTLgetentry: called ONLY from pmpi.c (i.e. not a public entry point). Returns a pointer to the ** requested timer name by calling internal function getentry() -** +** ** Return value: 0 (NULL) or the return value of getentry() */ @@ -3894,7 +3894,7 @@ Timer *GPTLgetentry (const char *name) } /* -** GPTLpr_file_has_been_called: Called ONLY from pmpi.c (i.e. not a public entry point). Return +** GPTLpr_file_has_been_called: Called ONLY from pmpi.c (i.e. not a public entry point). Return ** whether GPTLpr_file has been called. MPI_Finalize wrapper needs ** to know whether it needs to call GPTLpr. */ @@ -3917,7 +3917,7 @@ int GPTLpr_has_been_called (void) ** $Id: gptl.c,v 1.157 2011-03-28 20:55:18 rosinski Exp $ ** ** Author: Jim Rosinski -** +** ** Utility functions handle thread-based GPTL needs. */ @@ -3925,7 +3925,7 @@ int GPTLpr_has_been_called (void) #define MAX_THREADS 128 /**********************************************************************************/ -/* +/* ** 3 sets of routines: OMP threading, PTHREADS, unthreaded */ @@ -3951,13 +3951,13 @@ static int threadinit (void) if (omp_get_thread_num () != 0) return GPTLerror ("OMP %s: MUST only be called by the master thread\n", thisfunc); - /* - ** Allocate the threadid array which maps physical thread IDs to logical IDs + /* + ** Allocate the threadid array which maps physical thread IDs to logical IDs ** For OpenMP this will be just threadid_omp[iam] = iam; */ - if (threadid_omp) - return GPTLerror ("OMP %s: has already been called.\nMaybe mistakenly called by multiple threads?", + if (threadid_omp) + return GPTLerror ("OMP %s: has already been called.\nMaybe mistakenly called by multiple threads?", thisfunc); maxthreads = MAX ((1), (omp_get_max_threads ())); @@ -3975,7 +3975,7 @@ static int threadinit (void) #ifdef VERBOSE printf ("OMP %s: Set maxthreads=%d\n", thisfunc, maxthreads); #endif - + return 0; } @@ -4018,7 +4018,7 @@ static inline int get_thread_num (void) if (t == threadid_omp[t]) return t; - /* + /* ** Thread id not found. Modify threadid_omp with our ID, then start PAPI events if required. ** Due to the setting of threadid_omp, everything below here will only execute once per thread. */ @@ -4049,7 +4049,7 @@ static inline int get_thread_num (void) /* ** nthreads = maxthreads based on setting in threadinit */ - + nthreads = maxthreads; #ifdef VERBOSE printf ("OMP %s: nthreads=%d\n", thisfunc, nthreads); @@ -4069,7 +4069,7 @@ static void print_threadmapping (FILE *fp) } /**********************************************************************************/ -/* +/* ** PTHREADS */ @@ -4096,7 +4096,7 @@ static int threadinit (void) static const char *thisfunc = "threadinit"; /* - ** The following test is not rock-solid, but it's pretty close in terms of guaranteeing that + ** The following test is not rock-solid, but it's pretty close in terms of guaranteeing that ** threadinit gets called by only 1 thread. Problem is, mutex hasn't yet been initialized ** so we can't use it. */ @@ -4112,7 +4112,7 @@ static int threadinit (void) ** Previously, t_mutex = PTHREAD_MUTEX_INITIALIZER on the static declaration line was ** adequate to initialize the mutex. But this failed in programs that invoked ** GPTLfinalize() followed by GPTLinitialize(). - ** "man pthread_mutex_init" indicates that passing NULL as the second argument to + ** "man pthread_mutex_init" indicates that passing NULL as the second argument to ** pthread_mutex_init() should appropriately initialize the mutex, assuming it was ** properly destroyed by a previous call to pthread_mutex_destroy(); */ @@ -4121,16 +4121,16 @@ static int threadinit (void) if ((ret = pthread_mutex_init ((pthread_mutex_t *) &t_mutex, NULL)) != 0) return GPTLerror ("PTHREADS %s: mutex init failure: ret=%d\n", thisfunc, ret); #endif - - /* - ** Allocate the threadid array which maps physical thread IDs to logical IDs + + /* + ** Allocate the threadid array which maps physical thread IDs to logical IDs */ - if (threadid) + if (threadid) return GPTLerror ("PTHREADS %s: threadid not null\n", thisfunc); else if ( ! (threadid = (pthread_t *) GPTLallocate (MAX_THREADS * sizeof (pthread_t)))) return GPTLerror ("PTHREADS %s: malloc failure for %d elements of threadid\n", thisfunc, MAX_THREADS); - + maxthreads = MAX_THREADS; /* @@ -4175,7 +4175,7 @@ static void threadfinalize () ** ** Output results: ** nthreads: Updated number of threads -** threadid: Our thread id added to list on 1st call +** threadid: Our thread id added to list on 1st call ** ** Return value: thread number (success) or GPTLerror (failure) */ @@ -4210,7 +4210,7 @@ static inline int get_thread_num (void) return t; #endif - /* + /* ** Thread id not found. Define a critical region, then start PAPI counters if ** necessary and modify threadid[] with our id. */ @@ -4234,7 +4234,7 @@ static inline int get_thread_num (void) threadid[nthreads] = mythreadid; #ifdef VERBOSE - printf ("PTHREADS %s: 1st call threadid=%lu maps to location %d\n", + printf ("PTHREADS %s: 1st call threadid=%lu maps to location %d\n", thisfunc, (unsigned long) mythreadid, nthreads); #endif @@ -4247,14 +4247,14 @@ static inline int get_thread_num (void) if (GPTLget_npapievents () > 0) { #ifdef VERBOSE - printf ("PTHREADS get_thread_num: Starting EventSet threadid=%lu location=%d\n", + printf ("PTHREADS get_thread_num: Starting EventSet threadid=%lu location=%d\n", (unsigned long) mythreadid, nthreads); #endif if (GPTLcreate_and_start_events (nthreads) < 0) { if (unlock_mutex () < 0) fprintf (stderr, "PTHREADS %s: mutex unlock failure\n", thisfunc); - return GPTLerror ("PTHREADS %s: error from GPTLcreate_and_start_events for thread %d\n", + return GPTLerror ("PTHREADS %s: error from GPTLcreate_and_start_events for thread %d\n", thisfunc, nthreads); } } diff --git a/timing/gptl.inc b/timing/gptl.inc index 4d9d782a794..2ed2ca5c070 100644 --- a/timing/gptl.inc +++ b/timing/gptl.inc @@ -97,7 +97,7 @@ integer gptlstart_handle integer gptlstop integer gptlstop_handle - integer gptlstamp + integer gptlstamp integer gptlpr_set_append integer gptlpr_query_append integer gptlpr_set_write @@ -107,7 +107,7 @@ integer gptlpr_summary integer gptlpr_summary_file integer gptlbarrier - integer gptlreset + integer gptlreset integer gptlfinalize integer gptlget_memusage integer gptlprint_memusage @@ -130,7 +130,7 @@ external gptlstart_handle external gptlstop external gptlstop_handle - external gptlstamp + external gptlstamp external gptlpr_set_append external gptlpr_query_append external gptlpr_set_write @@ -140,7 +140,7 @@ external gptlpr_summary external gptlpr_summary_file external gptlbarrier - external gptlreset + external gptlreset external gptlfinalize external gptlget_memusage external gptlprint_memusage diff --git a/timing/gptl_papi.c b/timing/gptl_papi.c index a8e42fd132e..941316918be 100644 --- a/timing/gptl_papi.c +++ b/timing/gptl_papi.c @@ -5,7 +5,7 @@ ** ** Contains routines which interface to PAPI library */ - + #include "private.h" #include "gptl.h" @@ -149,8 +149,8 @@ static const Entry derivedtable [] = { }; static const int nderivedentries = sizeof (derivedtable) / sizeof (Entry); -static int npapievents = 0; /* number of PAPI events: initialize to 0 */ -static int nevents = 0; /* number of events: initialize to 0 */ +static int npapievents = 0; /* number of PAPI events: initialize to 0 */ +static int nevents = 0; /* number of events: initialize to 0 */ static int *EventSet; /* list of events to be counted by PAPI */ static long_long **papicounters; /* counters returned from PAPI */ @@ -171,11 +171,11 @@ static int enable (int); static int getderivedidx (int); /* -** GPTL_PAPIsetoption: enable or disable PAPI event defined by "counter". Called +** GPTL_PAPIsetoption: enable or disable PAPI event defined by "counter". Called ** from GPTLsetoption. Since all events are off by default, val=false degenerates ** to a no-op. Coded this way to be consistent with the rest of GPTL ** -** Input args: +** Input args: ** counter: PAPI counter ** val: true or false for enable or disable ** @@ -219,7 +219,7 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ break; } - /* + /* ** If val is false, return an error if the event has already been enabled. ** Otherwise just warn that attempting to disable a PAPI-based event ** that has already been enabled doesn't work--for now it's just a no-op @@ -238,10 +238,10 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ /* If the event has already been enabled for printing, exit */ if (already_enabled (counter)) - return GPTLerror ("GPTL_PAPIsetoption: counter %d has already been enabled\n", + return GPTLerror ("GPTL_PAPIsetoption: counter %d has already been enabled\n", counter); - /* + /* ** Initialize PAPI if it hasn't already been done. ** From here on down we can assume the intent is to enable (not disable) an option */ @@ -267,7 +267,7 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (PAPI_TOT_INS); pr_event[nevents].denomidx = enable (PAPI_TOT_CYC); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_TOT_INS / PAPI_TOT_CYC\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_TOT_INS / PAPI_TOT_CYC\n", pr_event[nevents].event.namestr); ++nevents; return 0; @@ -278,18 +278,18 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (PAPI_FP_OPS); pr_event[nevents].denomidx = enable (PAPI_LST_INS); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_FP_OPS / PAPI_LST_INS\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_FP_OPS / PAPI_LST_INS\n", pr_event[nevents].event.namestr); } else if (canenable2 (PAPI_FP_OPS, PAPI_L1_DCA)) { pr_event[nevents].event = derivedtable[idx]; pr_event[nevents].numidx = enable (PAPI_FP_OPS); pr_event[nevents].denomidx = enable (PAPI_L1_DCA); #ifdef DEBUG - printf ("GPTL_PAPIsetoption: pr_event %d is derived and will be PAPI event %d / %d\n", + printf ("GPTL_PAPIsetoption: pr_event %d is derived and will be PAPI event %d / %d\n", nevents, pr_event[nevents].numidx, pr_event[nevents].denomidx); #endif if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_FP_OPS / PAPI_L1_DCA\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_FP_OPS / PAPI_L1_DCA\n", pr_event[nevents].event.namestr); } else { return GPTLerror ("GPTL_PAPIsetoption: GPTL_CI unavailable\n"); @@ -305,7 +305,7 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (PAPI_FP_OPS); pr_event[nevents].denomidx = enable (PAPI_TOT_CYC); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_FP_OPS / PAPI_TOT_CYC\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_FP_OPS / PAPI_TOT_CYC\n", pr_event[nevents].event.namestr); ++nevents; return 0; @@ -318,7 +318,7 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (PAPI_FP_OPS); pr_event[nevents].denomidx = enable (PAPI_TOT_INS); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_FP_OPS / PAPI_TOT_INS\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_FP_OPS / PAPI_TOT_INS\n", pr_event[nevents].event.namestr); ++nevents; return 0; @@ -329,14 +329,14 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (PAPI_LST_INS); pr_event[nevents].denomidx = enable (PAPI_TOT_INS); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_LST_INS / PAPI_TOT_INS\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_LST_INS / PAPI_TOT_INS\n", pr_event[nevents].event.namestr); } else if (canenable2 (PAPI_L1_DCA, PAPI_TOT_INS)) { pr_event[nevents].event = derivedtable[idx]; pr_event[nevents].numidx = enable (PAPI_L1_DCA); pr_event[nevents].denomidx = enable (PAPI_TOT_INS); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L1_DCA / PAPI_TOT_INS\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L1_DCA / PAPI_TOT_INS\n", pr_event[nevents].event.namestr); } else { return GPTLerror ("GPTL_PAPIsetoption: GPTL_LSTPI unavailable\n"); @@ -352,7 +352,7 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (PAPI_L1_DCM); pr_event[nevents].denomidx = enable (PAPI_L1_DCA); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L1_DCM / PAPI_L1_DCA\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L1_DCM / PAPI_L1_DCA\n", pr_event[nevents].event.namestr); ++nevents; return 0; @@ -363,14 +363,14 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (PAPI_LST_INS); pr_event[nevents].denomidx = enable (PAPI_L1_DCM); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_LST_INS / PAPI_L1_DCM\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_LST_INS / PAPI_L1_DCM\n", pr_event[nevents].event.namestr); } else if (canenable2 (PAPI_L1_DCA, PAPI_L1_DCM)) { pr_event[nevents].event = derivedtable[idx]; pr_event[nevents].numidx = enable (PAPI_L1_DCA); pr_event[nevents].denomidx = enable (PAPI_L1_DCM); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L1_DCA / PAPI_L1_DCM\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L1_DCA / PAPI_L1_DCM\n", pr_event[nevents].event.namestr); } else { return GPTLerror ("GPTL_PAPIsetoption: GPTL_LSTPDCM unavailable\n"); @@ -389,7 +389,7 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (PAPI_L2_TCM); pr_event[nevents].denomidx = enable (PAPI_L2_TCA); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L2_TCM / PAPI_L2_TCA\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L2_TCM / PAPI_L2_TCA\n", pr_event[nevents].event.namestr); ++nevents; return 0; @@ -400,14 +400,14 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (PAPI_LST_INS); pr_event[nevents].denomidx = enable (PAPI_L2_TCM); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_LST_INS / PAPI_L2_TCM\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_LST_INS / PAPI_L2_TCM\n", pr_event[nevents].event.namestr); } else if (canenable2 (PAPI_L1_DCA, PAPI_L2_TCM)) { pr_event[nevents].event = derivedtable[idx]; pr_event[nevents].numidx = enable (PAPI_L1_DCA); pr_event[nevents].denomidx = enable (PAPI_L2_TCM); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L1_DCA / PAPI_L2_TCM\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L1_DCA / PAPI_L2_TCM\n", pr_event[nevents].event.namestr); } else { return GPTLerror ("GPTL_PAPIsetoption: GPTL_LSTPL2M unavailable\n"); @@ -423,7 +423,7 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (PAPI_L3_TCM); pr_event[nevents].denomidx = enable (PAPI_L3_TCR); if (verbose) - printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L3_TCM / PAPI_L3_TCR\n", + printf ("GPTL_PAPIsetoption: enabling derived event %s = PAPI_L3_TCM / PAPI_L3_TCR\n", pr_event[nevents].event.namestr); ++nevents; return 0; @@ -444,11 +444,11 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ pr_event[nevents].numidx = enable (counter); pr_event[nevents].denomidx = -1; /* flag says not derived (no denominator) */ } else { - return GPTLerror ("GPTL_PAPIsetoption: Can't enable event \n", + return GPTLerror ("GPTL_PAPIsetoption: Can't enable event \n", papitable[n].longstr); } if (verbose) - printf ("GPTL_PAPIsetoption: enabling PAPI preset event %s\n", + printf ("GPTL_PAPIsetoption: enabling PAPI preset event %s\n", pr_event[nevents].event.namestr); ++nevents; return 0; @@ -458,9 +458,9 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ /* ** Check native events last: If PAPI_event_code_to_name fails, give up */ - + if ((ret = PAPI_event_code_to_name (counter, eventname)) != PAPI_OK) - return GPTLerror ("GPTL_PAPIsetoption: name not found for counter %d: PAPI_strerror: %s\n", + return GPTLerror ("GPTL_PAPIsetoption: name not found for counter %d: PAPI_strerror: %s\n", counter, PAPI_strerror (ret)); /* @@ -514,12 +514,12 @@ int GPTL_PAPIsetoption (const int counter, /* PAPI counter (or option) */ /* ** canenable: determine whether a PAPI counter can be enabled ** -** Input args: +** Input args: ** counter: PAPI counter ** ** Return value: 0 (success) or non-zero (failure) */ - + int canenable (int counter) { char eventname[PAPI_MAX_STR_LEN]; /* returned from PAPI_event_code_to_name */ @@ -539,13 +539,13 @@ int canenable (int counter) /* ** canenable2: determine whether 2 PAPI counters can be enabled ** -** Input args: +** Input args: ** counter1: PAPI counter ** counter2: PAPI counter ** ** Return value: 0 (success) or non-zero (failure) */ - + int canenable2 (int counter1, int counter2) { char eventname[PAPI_MAX_STR_LEN]; /* returned from PAPI_event_code_to_name */ @@ -573,12 +573,12 @@ int canenable2 (int counter1, int counter2) ** well as output directly. E.g. PAPI_FP_OPS is used to compute ** computational intensity, and floating point ops per instruction. ** -** Input args: +** Input args: ** counter: PAPI counter ** ** Return value: index into papieventlist (success) or negative (not found) */ - + int papievent_is_enabled (int counter) { int n; @@ -591,14 +591,14 @@ int papievent_is_enabled (int counter) /* ** already_enabled: determine whether a PAPI-based event has already been -** enabled for printing. +** enabled for printing. ** -** Input args: +** Input args: ** counter: PAPI or derived counter ** ** Return value: 1 (true) or 0 (false) */ - + int already_enabled (int counter) { int n; @@ -613,12 +613,12 @@ int already_enabled (int counter) ** enable: enable a PAPI event. ASSUMES that canenable() has already determined ** that the event can be enabled. ** -** Input args: +** Input args: ** counter: PAPI counter ** ** Return value: index into papieventlist */ - + int enable (int counter) { int n; @@ -643,7 +643,7 @@ int enable (int counter) /* ** getderivedidx: find the table index of a derived counter ** -** Input args: +** Input args: ** counter: derived counter ** ** Return value: index into derivedtable (success) or GPTLerror (failure) @@ -672,7 +672,7 @@ int GPTL_PAPIlibraryinit () if ((ret = PAPI_is_initialized ()) == PAPI_NOT_INITED) { if ((ret = PAPI_library_init (PAPI_VER_CURRENT)) != PAPI_VER_CURRENT) { - fprintf (stderr, "GPTL_PAPIlibraryinit: ret=%d PAPI_VER_CURRENT=%d\n", + fprintf (stderr, "GPTL_PAPIlibraryinit: ret=%d PAPI_VER_CURRENT=%d\n", ret, (int) PAPI_VER_CURRENT); return GPTLerror ("GPTL_PAPIlibraryinit: PAPI_library_init failure:%s\n", PAPI_strerror (ret)); @@ -683,16 +683,16 @@ int GPTL_PAPIlibraryinit () /* ** GPTL_PAPIinitialize(): Initialize the PAPI interface. Called from GPTLinitialize. -** PAPI_library_init must be called before any other PAPI routines. +** PAPI_library_init must be called before any other PAPI routines. ** PAPI_thread_init is called subsequently if threading is enabled. ** Finally, allocate space for PAPI counters and start them. ** -** Input args: +** Input args: ** maxthreads: number of threads ** ** Return value: 0 (success) or GPTLerror or -1 (failure) */ - + int GPTL_PAPIinitialize (const int maxthreads, /* number of threads */ const bool verbose_flag, /* output verbosity */ int *nevents_out, /* nevents needed by gptl.c */ @@ -748,8 +748,8 @@ int GPTL_PAPIinitialize (const int maxthreads, /* number of threads */ ** Threaded routine to create the "event set" (PAPI terminology) and start ** the counters. This is only done once, and is called from get_thread_num ** for the first time for the thread. -** -** Input args: +** +** Input args: ** t: thread number ** ** Return value: 0 (success) or GPTLerror (failure) @@ -764,7 +764,7 @@ int GPTLcreate_and_start_events (const int t) /* thread number */ /* Create the event set */ if ((ret = PAPI_create_eventset (&EventSet[t])) != PAPI_OK) - return GPTLerror ("GPTLcreate_and_start_events: thread %d failure creating eventset: %s\n", + return GPTLerror ("GPTLcreate_and_start_events: thread %d failure creating eventset: %s\n", t, PAPI_strerror (ret)); if (verbose) @@ -797,20 +797,20 @@ int GPTLcreate_and_start_events (const int t) /* thread number */ if ((ret = PAPI_cleanup_eventset (EventSet[t])) != PAPI_OK) return GPTLerror ("GPTLcreate_and_start_events: %s\n", PAPI_strerror (ret)); - + if ((ret = PAPI_destroy_eventset (&EventSet[t])) != PAPI_OK) return GPTLerror ("GPTLcreate_and_start_events: %s\n", PAPI_strerror (ret)); if ((ret = PAPI_create_eventset (&EventSet[t])) != PAPI_OK) - return GPTLerror ("GPTLcreate_and_start_events: failure creating eventset: %s\n", + return GPTLerror ("GPTLcreate_and_start_events: failure creating eventset: %s\n", PAPI_strerror (ret)); if ((ret = PAPI_multiplex_init ()) != PAPI_OK) - return GPTLerror ("GPTLcreate_and_start_events: failure from PAPI_multiplex_init%s\n", + return GPTLerror ("GPTLcreate_and_start_events: failure from PAPI_multiplex_init%s\n", PAPI_strerror (ret)); if ((ret = PAPI_set_multiplex (EventSet[t])) != PAPI_OK) - return GPTLerror ("GPTLcreate_and_start_events: failure from PAPI_set_multiplex: %s\n", + return GPTLerror ("GPTLcreate_and_start_events: failure from PAPI_set_multiplex: %s\n", PAPI_strerror (ret)); for (n = 0; n < npapievents; n++) { @@ -825,20 +825,20 @@ int GPTLcreate_and_start_events (const int t) /* thread number */ /* Start the event set. It will only be read from now on--never stopped */ if ((ret = PAPI_start (EventSet[t])) != PAPI_OK) - return GPTLerror ("GPTLcreate_and_start_events: failed to start event set: %s\n", + return GPTLerror ("GPTLcreate_and_start_events: failed to start event set: %s\n", PAPI_strerror (ret)); return 0; } /* -** GPTL_PAPIstart: Start the PAPI counters (actually they are just read). +** GPTL_PAPIstart: Start the PAPI counters (actually they are just read). ** Called from GPTLstart. ** -** Input args: +** Input args: ** t: thread number ** -** Output args: +** Output args: ** aux: struct containing the counters ** ** Return value: 0 (success) or GPTLerror (failure) @@ -849,7 +849,7 @@ int GPTL_PAPIstart (const int t, /* thread number */ { int ret; /* return code from PAPI lib calls */ int n; /* loop index */ - + /* If no events are to be counted just return */ if (npapievents == 0) @@ -860,25 +860,25 @@ int GPTL_PAPIstart (const int t, /* thread number */ if ((ret = PAPI_read (EventSet[t], papicounters[t])) != PAPI_OK) return GPTLerror ("GPTL_PAPIstart: %s\n", PAPI_strerror (ret)); - /* + /* ** Store the counter values. When GPTL_PAPIstop is called, the counters ** will again be read, and differenced with the values saved here. */ for (n = 0; n < npapievents; n++) aux->last[n] = papicounters[t][n]; - + return 0; } /* -** GPTL_PAPIstop: Stop the PAPI counters (actually they are just read). +** GPTL_PAPIstop: Stop the PAPI counters (actually they are just read). ** Called from GPTLstop. ** ** Input args: ** t: thread number ** -** Input/output args: +** Input/output args: ** aux: struct containing the counters ** ** Return value: 0 (success) or GPTLerror (failure) @@ -900,8 +900,8 @@ int GPTL_PAPIstop (const int t, /* thread number */ if ((ret = PAPI_read (EventSet[t], papicounters[t])) != PAPI_OK) return GPTLerror ("GPTL_PAPIstop: %s\n", PAPI_strerror (ret)); - - /* + + /* ** Accumulate the difference since timer start in aux. ** Negative accumulation can happen when multiplexing is enabled, so don't ** set count to BADCOUNT in that case. @@ -924,14 +924,14 @@ int GPTL_PAPIstop (const int t, /* thread number */ ** GPTL_PAPIprstr: Print the descriptive string for all enabled PAPI events. ** Called from GPTLpr. ** -** Input args: +** Input args: ** fp: file descriptor */ void GPTL_PAPIprstr (FILE *fp) { int n; - + if (narrowprint) { for (n = 0; n < nevents; n++) { fprintf (fp, "%8.8s ", pr_event[n].event.str8); @@ -957,7 +957,7 @@ void GPTL_PAPIprstr (FILE *fp) ** GPTL_PAPIpr: Print PAPI counter values for all enabled events, including ** derived events. Called from GPTLpr. ** -** Input args: +** Input args: ** fp: file descriptor ** aux: struct containing the counters */ @@ -989,7 +989,7 @@ void GPTL_PAPIpr (FILE *fp, /* file descriptor to write denomidx = pr_event[n].denomidx; #ifdef DEBUG - printf ("GPTL_PAPIpr: derived event: numidx=%d denomidx=%d values = %ld %ld\n", + printf ("GPTL_PAPIpr: derived event: numidx=%d denomidx=%d values = %ld %ld\n", numidx, denomidx, (long) aux->accum[numidx], (long) aux->accum[denomidx]); #endif /* Protect against divide by zero */ @@ -1003,7 +1003,7 @@ void GPTL_PAPIpr (FILE *fp, /* file descriptor to write } else { /* Raw PAPI event */ #ifdef DEBUG - printf ("GPTL_PAPIpr: raw event: numidx=%d value = %ld\n", + printf ("GPTL_PAPIpr: raw event: numidx=%d value = %ld\n", numidx, (long) aux->accum[numidx]); #endif if (aux->accum[numidx] < PRTHRESH) @@ -1055,12 +1055,12 @@ void GPTL_PAPIprintenabled (FILE *fp) fprintf (fp, " %s\n", eventname); fprintf (fp, "\n"); } -} +} /* ** GPTL_PAPIadd: Accumulate PAPI counters. Called from add. ** -** Input/Output args: +** Input/Output args: ** auxout: auxout = auxout + auxin ** ** Input args: @@ -1071,7 +1071,7 @@ void GPTL_PAPIadd (Papistats *auxout, /* output struct */ const Papistats *auxin) /* input struct */ { int n; - + for (n = 0; n < npapievents; n++) if (auxin->accum[n] == BADCOUNT || auxout->accum[n] == BADCOUNT) auxout->accum[n] = BADCOUNT; @@ -1229,7 +1229,7 @@ int GPTLevent_name_to_code (const char *name, int *code) int n; /* loop over derived entries */ /* - ** First check derived events + ** First check derived events */ for (n = 0; n < nderivedentries; ++n) { @@ -1272,7 +1272,7 @@ int GPTLevent_code_to_name (const int code, char *name) int n; /* loop over derived entries */ /* - ** First check derived events + ** First check derived events */ for (n = 0; n < nderivedentries; ++n) { diff --git a/timing/perf_mod.F90 b/timing/perf_mod.F90 index 2e38c491c67..a4e25cc1f4d 100644 --- a/timing/perf_mod.F90 +++ b/timing/perf_mod.F90 @@ -1,14 +1,14 @@ module perf_mod -!----------------------------------------------------------------------- -! +!----------------------------------------------------------------------- +! ! Purpose: This module is responsible for controlling the performance ! timer logic. -! +! ! Author: P. Worley, January 2007 ! ! $Id$ -! +! !----------------------------------------------------------------------- !----------------------------------------------------------------------- @@ -62,7 +62,7 @@ module perf_mod !----------------------------------------------------------------------- !- include statements -------------------------------------------------- !----------------------------------------------------------------------- -#include +#include #include "gptl.inc" !----------------------------------------------------------------------- @@ -93,7 +93,7 @@ module perf_mod integer, parameter :: def_timer_depth_limit = 99999 ! default integer, private :: timer_depth_limit = def_timer_depth_limit ! integer indicating maximum number of levels of - ! timer nesting + ! timer nesting integer, parameter :: def_timing_detail_limit = 1 ! default integer, private :: timing_detail_limit = def_timing_detail_limit @@ -111,19 +111,19 @@ module perf_mod logical, parameter :: def_perf_single_file = .false. ! default logical, private :: perf_single_file = def_perf_single_file ! flag indicating whether the performance timer - ! output should be written to a single file - ! (per component communicator) or to a + ! output should be written to a single file + ! (per component communicator) or to a ! separate file for each process integer, parameter :: def_perf_outpe_num = 0 ! default integer, private :: perf_outpe_num = def_perf_outpe_num - ! maximum number of processes writing out + ! maximum number of processes writing out ! timing data (for this component communicator) integer, parameter :: def_perf_outpe_stride = 1 ! default integer, private :: perf_outpe_stride = def_perf_outpe_stride ! separation between process ids for processes - ! that are writing out timing data + ! that are writing out timing data ! (for this component communicator) logical, parameter :: def_perf_global_stats = .true. ! default @@ -176,9 +176,9 @@ module perf_mod !======================================================================== ! subroutine t_getLogUnit(LogUnit) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Get log unit number. -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments----------------------------- ! @@ -193,9 +193,9 @@ end subroutine t_getLogUnit !======================================================================== ! subroutine t_setLogUnit(LogUnit) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Set log unit number. -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments----------------------------- ! @@ -222,9 +222,9 @@ subroutine perf_defaultopts(timing_disable_out, & perf_single_file_out, & perf_global_stats_out, & perf_papi_enable_out ) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Return default runtime options -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments----------------------------- ! timers disable/enable option @@ -296,16 +296,16 @@ subroutine perf_setopts(mastertask, & perf_single_file_in, & perf_global_stats_in, & perf_papi_enable_in ) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Set runtime options -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments---------------------------- ! ! master process? logical, intent(in) :: mastertask ! Print out to log file? - logical, intent(IN) :: LogPrint + logical, intent(IN) :: LogPrint ! timers disable/enable option logical, intent(in), optional :: timing_disable_in ! performance timer option @@ -337,7 +337,7 @@ subroutine perf_setopts(mastertask, & timing_disable = timing_disable_in if (timing_disable) then ierr = GPTLdisable() - else + else ierr = GPTLenable() endif endif @@ -392,17 +392,17 @@ subroutine perf_setopts(mastertask, & endif ! if (mastertask .and. LogPrint) then - write(p_logunit,*) '(t_initf) Using profile_disable=', timing_disable, & + write(p_logunit,*) '(t_initf) Using profile_disable=', timing_disable, & ' profile_timer=', perf_timer - write(p_logunit,*) '(t_initf) profile_depth_limit=', timer_depth_limit, & + write(p_logunit,*) '(t_initf) profile_depth_limit=', timer_depth_limit, & ' profile_detail_limit=', timing_detail_limit write(p_logunit,*) '(t_initf) profile_barrier=', timing_barrier, & ' profile_outpe_num=', perf_outpe_num write(p_logunit,*) '(t_initf) profile_outpe_stride=', perf_outpe_stride , & ' profile_single_file=', perf_single_file write(p_logunit,*) '(t_initf) profile_global_stats=', perf_global_stats , & - ' profile_papi_enable=', perf_papi_enable - endif + ' profile_papi_enable=', perf_papi_enable + endif ! #ifdef DEBUG else @@ -420,9 +420,9 @@ subroutine papi_defaultopts(papi_ctr1_out, & papi_ctr2_out, & papi_ctr3_out, & papi_ctr4_out ) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Return default runtime PAPI counter options -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments----------------------------- ! PAPI counter option #1 @@ -456,9 +456,9 @@ subroutine papi_setopts(papi_ctr1_in, & papi_ctr2_in, & papi_ctr3_in, & papi_ctr4_in ) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Set runtime PAPI counter options -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments---------------------------- ! @@ -518,12 +518,12 @@ end subroutine papi_setopts !======================================================================== ! logical function t_profile_onf() -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Return flag indicating whether profiling is currently active. ! Part of workaround to implement FVbarrierclock before ! communicators exposed in Pilgrim. Does not check level of ! event nesting. -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- if ((.not. timing_initialized) .or. & @@ -539,10 +539,10 @@ end function t_profile_onf !======================================================================== ! logical function t_barrier_onf() -!----------------------------------------------------------------------- -! Purpose: Return timing_barrier. Part of workaround to implement -! FVbarrierclock before communicators exposed in Pilgrim. -! Author: P. Worley +!----------------------------------------------------------------------- +! Purpose: Return timing_barrier. Part of workaround to implement +! FVbarrierclock before communicators exposed in Pilgrim. +! Author: P. Worley !----------------------------------------------------------------------- t_barrier_onf = timing_barrier @@ -552,10 +552,10 @@ end function t_barrier_onf !======================================================================== ! logical function t_single_filef() -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Return perf_single_file. Used to control output of other ! performance data, only spmdstats currently. -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- t_single_filef = perf_single_file @@ -565,9 +565,9 @@ end function t_single_filef !======================================================================== ! subroutine t_stampf(wall, usr, sys) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Record wallclock, user, and system times (seconds). -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Output arguments----------------------------- ! @@ -596,14 +596,14 @@ end subroutine t_stampf !======================================================================== ! subroutine t_startf(event, handle) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Start an event timer -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments----------------------------- ! ! performance timer event name - character(len=*), intent(in) :: event + character(len=*), intent(in) :: event ! !---------------------------Input/Output arguments---------------------- ! @@ -634,14 +634,14 @@ end subroutine t_startf !======================================================================== ! subroutine t_stopf(event, handle) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Stop an event timer -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments----------------------------- ! ! performance timer event name - character(len=*), intent(in) :: event + character(len=*), intent(in) :: event ! !---------------------------Input/Output arguments---------------------- ! @@ -672,10 +672,10 @@ end subroutine t_stopf !======================================================================== ! subroutine t_enablef() -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Enable t_startf, t_stopf, t_stampf, and t_barrierf. Ignored ! in threaded regions. -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Local workspace----------------------------- ! @@ -709,10 +709,10 @@ end subroutine t_enablef !======================================================================== ! subroutine t_disablef() -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Disable t_startf, t_stopf, t_stampf, and t_barrierf. Ignored ! in threaded regions. -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Local workspace----------------------------- ! @@ -744,9 +744,9 @@ end subroutine t_disablef !======================================================================== ! subroutine t_adj_detailf(detail_adjustment) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Modify current detail level. Ignored in threaded regions. -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments----------------------------- ! @@ -776,11 +776,11 @@ end subroutine t_adj_detailf !======================================================================== ! subroutine t_barrierf(event, mpicom) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Call (and time) mpi_barrier. Ignored inside OpenMP ! threaded regions. Note that barrier executed even if ! event not recorded because of level of timer event nesting. -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments----------------------------- ! mpi communicator id @@ -835,9 +835,9 @@ end subroutine t_barrierf ! subroutine t_prf(filename, mpicom, num_outpe, stride_outpe, & single_file, global_stats, output_thispe) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Write out performance timer data -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments----------------------------- ! @@ -847,7 +847,7 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe, & integer, intent(in), optional :: mpicom ! maximum number of processes writing out timing data integer, intent(in), optional :: num_outpe - ! separation between process ids for processes writing out data + ! separation between process ids for processes writing out data integer, intent(in), optional :: stride_outpe ! enable/disable the writing of data to a single file logical, intent(in), optional :: single_file @@ -862,7 +862,7 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe, & ! all data to a single file logical glb_stats ! flag indicting whether to compute ! global statistics - logical pr_write ! flag indicating whether the current + logical pr_write ! flag indicating whether the current ! GPTL output mode is write logical write_data ! flag indicating whether this process ! should output its timing data @@ -916,7 +916,7 @@ subroutine t_prf(filename, mpicom, num_outpe, stride_outpe, & if (GPTLpr_query_write() == 1) then pr_write = .true. ierr = GPTLpr_set_append() - else + else pr_write=.false. endif @@ -1113,8 +1113,8 @@ end subroutine t_prf !======================================================================== ! subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, MasterTask) -!----------------------------------------------------------------------- -! Purpose: Set default values of runtime timing options +!----------------------------------------------------------------------- +! Purpose: Set default values of runtime timing options ! before namelists prof_inparm and papi_inparm are read, ! read namelists (and broadcast, if SPMD), ! then initialize timing library. @@ -1224,12 +1224,12 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, MasterTask) open( unitn, file=trim(NLFilename), status='old', iostat=ierr ) if (ierr .eq. 0) then - ! Look for prof_inparm group name in the input file. + ! Look for prof_inparm group name in the input file. ! If found, leave the file positioned at that namelist group. call find_group_name(unitn, 'prof_inparm', status=ierr) if (ierr == 0) then ! found prof_inparm - read(unitn, nml=prof_inparm, iostat=ierr) + read(unitn, nml=prof_inparm, iostat=ierr) if (ierr /= 0) then call shr_sys_abort( subname//':: namelist read returns an'// & ' error condition for prof_inparm' ) @@ -1291,12 +1291,12 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, MasterTask) ierr = 1 open( unitn, file=trim(NLFilename), status='old', iostat=ierr ) if (ierr .eq. 0) then - ! Look for papi_inparm group name in the input file. + ! Look for papi_inparm group name in the input file. ! If found, leave the file positioned at that namelist group. call find_group_name(unitn, 'papi_inparm', status=ierr) if (ierr == 0) then ! found papi_inparm - read(unitn, nml=papi_inparm, iostat=ierr) + read(unitn, nml=papi_inparm, iostat=ierr) if (ierr /= 0) then call shr_sys_abort( subname//':: namelist read returns an'// & ' error condition for papi_inparm' ) @@ -1355,12 +1355,12 @@ subroutine t_initf(NLFilename, LogPrint, LogUnit, mpicom, MasterTask) !$OMP MASTER ! - ! Set options and initialize timing library. - ! + ! Set options and initialize timing library. + ! ! Set timer if (gptlsetutr (perf_timer) < 0) call shr_sys_abort (subname//':: gptlsetutr') ! - ! For logical settings, 2nd arg 0 + ! For logical settings, 2nd arg 0 ! to gptlsetoption means disable, non-zero means enable ! ! Turn off CPU timing (expensive) @@ -1404,9 +1404,9 @@ end subroutine t_initf !======================================================================== ! subroutine t_finalizef() -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: shut down timing library -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Local workspace----------------------------- ! diff --git a/timing/perf_utils.F90 b/timing/perf_utils.F90 index af223cb3c47..241caefa199 100644 --- a/timing/perf_utils.F90 +++ b/timing/perf_utils.F90 @@ -1,15 +1,15 @@ module perf_utils -!----------------------------------------------------------------------- -! +!----------------------------------------------------------------------- +! ! Purpose: This module supplies the csm_share and CAM utilities ! needed by perf_mod.F90 (when the csm_share and CAM utilities ! are not available). -! +! ! Author: P. Worley, October 2007 ! ! $Id$ -! +! !----------------------------------------------------------------------- !----------------------------------------------------------------------- @@ -46,7 +46,7 @@ module perf_utils !----------------------------------------------------------------------- !- include statements -------------------------------------------------- !----------------------------------------------------------------------- -#include +#include #include "gptl.inc" !----------------------------------------------------------------------- @@ -78,9 +78,9 @@ module perf_utils !======================================================================== ! subroutine perfutils_setunit(LogUnit) -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- ! Purpose: Set log unit number. -! Author: P. Worley +! Author: P. Worley !----------------------------------------------------------------------- !---------------------------Input arguments----------------------------- ! @@ -330,7 +330,7 @@ END SUBROUTINE shr_mpi_bcastl0 ! 2005-Dec-14 - E. Kluzek - creation ! 2007-Oct-21 - P. Worley - dumbed down for use in perf_mod ! -! !INTERFACE: ------------------------------------------------------------------ +! !INTERFACE: ------------------------------------------------------------------ INTEGER FUNCTION shr_file_getUnit () @@ -380,7 +380,7 @@ END FUNCTION shr_file_getUnit ! 2005-Dec-14 - E. Kluzek - creation ! 2007-Oct-21 - P. Worley - dumbed down for use in perf_mod ! -! !INTERFACE: ------------------------------------------------------------------ +! !INTERFACE: ------------------------------------------------------------------ SUBROUTINE shr_file_freeUnit ( unit) @@ -421,12 +421,12 @@ END SUBROUTINE shr_file_freeUnit subroutine find_group_name(unit, group, status) !--------------------------------------------------------------------------------------- -! Purpose: +! Purpose: ! Search a file that contains namelist input for the specified namelist group name. ! Leave the file positioned so that the current record is the first record of the ! input for the specified group. -! -! Method: +! +! Method: ! Read the file line by line. Each line is searched for an '&' which may only ! be preceded by blanks, immediately followed by the group name which is case ! insensitive. If found then backspace the file so the current record is the @@ -492,17 +492,17 @@ end subroutine find_group_name function to_lower(str) -!----------------------------------------------------------------------- -! Purpose: +!----------------------------------------------------------------------- +! Purpose: ! Convert character string to lower case. -! -! Method: +! +! Method: ! Use achar and iachar intrinsics to ensure use of ascii collating sequence. ! ! Author: B. Eaton, July 2001 -! +! ! $Id$ -!----------------------------------------------------------------------- +!----------------------------------------------------------------------- implicit none character(len=*), intent(in) :: str ! String to convert to lower case @@ -521,7 +521,7 @@ function to_lower(str) ctmp = str(i:i) aseq = iachar(ctmp) if ( aseq >= iachar("A") .and. aseq <= iachar("Z") ) & - ctmp = achar(aseq + upper_to_lower) + ctmp = achar(aseq + upper_to_lower) to_lower(i:i) = ctmp end do diff --git a/timing/private.h b/timing/private.h index 8d14b1479a0..c8a52a9f356 100644 --- a/timing/private.h +++ b/timing/private.h @@ -32,7 +32,7 @@ /* longest timer name allowed (probably safe to just change) */ #define MAX_CHARS 63 -/* +/* ** max allowable number of PAPI counters, or derived events. For convenience, ** set to max (# derived events, # papi counters required) so "avail" lists ** all available options. @@ -61,7 +61,7 @@ typedef struct { long long last[MAX_AUX]; /* array of saved counters from "start" */ long long accum[MAX_AUX]; /* accumulator for counters */ } Papistats; - + typedef struct { int counter; /* PAPI or Derived counter */ char *namestr; /* PAPI or Derived counter as string */ @@ -84,7 +84,7 @@ typedef struct TIMER { #endif #ifdef HAVE_PAPI Papistats aux; /* PAPI stats */ -#endif +#endif Wallstats wall; /* wallclock stats */ Cpustats cpu; /* cpu stats */ unsigned long count; /* number of start/stop calls */ @@ -127,7 +127,7 @@ extern void __cyg_profile_func_exit (void *, void *); }; #endif -/* +/* ** These are needed for communication between gptl.c and gptl_papi.c */ diff --git a/timing/threadutil.c b/timing/threadutil.c index 85d9c52d155..86e4681c1ca 100644 --- a/timing/threadutil.c +++ b/timing/threadutil.c @@ -2,7 +2,7 @@ ** $Id: threadutil.c,v 1.28 2009/12/31 01:51:59 rosinski Exp $ ** ** Author: Jim Rosinski -** +** ** Utility functions handle thread-based GPTL needs. */ @@ -21,7 +21,7 @@ static bool first = true; /**********************************************************************************/ -/* +/* ** 3 sets of routines: OMP threading, PTHREADS, unthreaded */ @@ -62,7 +62,7 @@ int threadinit (int *nthreads, int *maxthreads) #ifdef VERBOSE printf ("OMP threadinit: Set *maxthreads=%d *nthreads=%d\n", *maxthreads, *nthreads); #endif - + return 0; } @@ -138,7 +138,7 @@ void print_threadmapping (int nthreads, FILE *fp) } /**********************************************************************************/ -/* +/* ** PTHREADS */ @@ -179,7 +179,7 @@ int threadinit (int *nthreads, int *maxthreads) first = false; /* - ** Initialize nthreads to 0 and define the threadid array now that initialization + ** Initialize nthreads to 0 and define the threadid array now that initialization ** is done. The actual value will be determined as get_thread_num is called. */ @@ -228,8 +228,8 @@ int get_thread_num (int *nthreads, int *maxthreads) return GPTLerror ("get_thread_num: mutex lock failure\n"); /* - ** Loop over known physical thread IDs. When my id is found, map it - ** to logical thread id for indexing. If not found return a negative + ** Loop over known physical thread IDs. When my id is found, map it + ** to logical thread id for indexing. If not found return a negative ** number. ** A critical region is necessary because acess to ** the array threadid must be by only one thread at a time. @@ -251,7 +251,7 @@ int get_thread_num (int *nthreads, int *maxthreads) return GPTLerror ("get_thread_num: nthreads=%d is too big Recompile " "with larger value of MAX_THREADS\n", *nthreads); - } + } threadid[n] = mythreadid; @@ -268,7 +268,7 @@ int get_thread_num (int *nthreads, int *maxthreads) if (GPTLget_npapievents () > 0) { #ifdef VERBOSE - printf ("PTHREADS get_thread_num: Starting EventSet threadid=%lu location=%d\n", + printf ("PTHREADS get_thread_num: Starting EventSet threadid=%lu location=%d\n", (unsigned long) mythreadid, n); #endif if (GPTLcreate_and_start_events (n) < 0) { @@ -286,7 +286,7 @@ int get_thread_num (int *nthreads, int *maxthreads) printf ("PTHREADS get_thread_num: *nthreads=%d\n", *nthreads); #endif } - + if (unlock_mutex () < 0) return GPTLerror ("get_thread_num: mutex unlock failure\n");