From 1d6a85394e1e584bd0cffad17341e90a45c862e2 Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Wed, 7 May 2014 18:17:28 -0400 Subject: [PATCH 01/10] fixed some memory leaks --- src/global.F90 | 23 ++++++++++++++++++++++- src/plot.F90 | 3 +++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/global.F90 b/src/global.F90 index 57e849b95..3987698f0 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -481,8 +481,29 @@ contains call sab_dict % clear() call xs_listing_dict % clear() - ! Clear statepoint batch set + ! Clear statepoint and sourcepoint batch set call statepoint_batch % clear() + call sourcepoint_batch % clear() + + ! Deallocate entropy mesh + if (associated(entropy_mesh)) then + if (allocated(entropy_mesh % lower_left)) & + deallocate(entropy_mesh % lower_left) + if (allocated(entropy_mesh % upper_right)) & + deallocate(entropy_mesh % upper_right) + if (allocated(entropy_mesh % width)) deallocate(entropy_mesh % width) + deallocate(entropy_mesh) + end if + + ! Deallocate ufs + if (allocated(source_frac)) deallocate(source_frac) + if (associated(ufs_mesh)) then + if (allocated(ufs_mesh % lower_left)) deallocate(ufs_mesh % lower_left) + if (allocated(ufs_mesh % upper_right)) & + deallocate(ufs_mesh % upper_right) + if (allocated(ufs_mesh % width)) deallocate(ufs_mesh % width) + deallocate(ufs_mesh) + end if end subroutine free_memory diff --git a/src/plot.F90 b/src/plot.F90 index 9e8348db7..7ad178a7d 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -175,6 +175,9 @@ contains ! Free up space call deallocate_image(img) + ! Clear particle + call p % clear() + end subroutine create_ppm !=============================================================================== From 434f2097c544f4977cd9fb554d497be1ae96f6cd Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Wed, 7 May 2014 22:12:54 -0400 Subject: [PATCH 02/10] moved cmfd communicator to be able to deallocate it --- src/cmfd_input.F90 | 9 ++------- src/finalize.F90 | 5 ++++- src/global.F90 | 3 +++ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/cmfd_input.F90 b/src/cmfd_input.F90 index 6f259f949..ad02b542a 100644 --- a/src/cmfd_input.F90 +++ b/src/cmfd_input.F90 @@ -20,9 +20,6 @@ contains use cmfd_header, only: allocate_cmfd -#ifdef PETSC - integer :: new_comm ! new mpi communicator -#endif integer :: color ! color group of processor ! Read in cmfd input file @@ -37,12 +34,10 @@ contains ! Split up procs #ifdef PETSC - call MPI_COMM_SPLIT(MPI_COMM_WORLD, color, 0, new_comm, mpi_err) -#endif + call MPI_COMM_SPLIT(MPI_COMM_WORLD, color, 0, cmfd_comm, mpi_err) ! assign to PETSc -#ifdef PETSC - PETSC_COMM_WORLD = new_comm + PETSC_COMM_WORLD = cmfd_comm ! Initialize PETSc on all procs call PetscInitialize(PETSC_NULL_CHARACTER, mpi_err) diff --git a/src/finalize.F90 b/src/finalize.F90 index 9d5f5c633..4e074725d 100644 --- a/src/finalize.F90 +++ b/src/finalize.F90 @@ -40,7 +40,10 @@ contains #ifdef PETSC ! Finalize PETSc - if (cmfd_run) call PetscFinalize(mpi_err) + if (cmfd_run) then + call PetscFinalize(mpi_err) + call MPI_COMM_FREE(cmfd_comm, mpi_err) + end if #endif ! Stop timers and show timing statistics diff --git a/src/global.F90 b/src/global.F90 index 3987698f0..02b99bfc8 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -303,6 +303,9 @@ module global ! Is CMFD active logical :: cmfd_run = .false. + + ! CMFD communicator + integer :: cmfd_comm ! Timing objects type(Timer) :: time_cmfd ! timer for whole cmfd calculation From 0291c0f047861629eaefb02a98d4ac9ee4471f38 Mon Sep 17 00:00:00 2001 From: Nick Horelik Date: Thu, 8 May 2014 10:50:42 -0400 Subject: [PATCH 03/10] Fixed off-by-one indexing error in the plotter --- src/plot.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plot.F90 b/src/plot.F90 index 7ad178a7d..e7642314f 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -158,7 +158,7 @@ contains call position_rgb(p, pl, rgb, id) ! Create a pixel at (x,y) with color (r,g,b) - call set_pixel(img, x, y, rgb(1), rgb(2), rgb(3)) + call set_pixel(img, x-1, y-1, rgb(1), rgb(2), rgb(3)) ! Advance pixel in first direction p % coord0 % xyz(in_i) = p % coord0 % xyz(in_i) + in_pixel From 49c3d97c45c081ec9fdde881c1e783af364dcd6b Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Thu, 8 May 2014 11:49:02 -0400 Subject: [PATCH 04/10] deallocate neutron balance res --- src/cmfd_header.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmfd_header.F90 b/src/cmfd_header.F90 index 3d7786ab8..73bc0e016 100644 --- a/src/cmfd_header.F90 +++ b/src/cmfd_header.F90 @@ -194,6 +194,7 @@ contains if (allocated(this % dom)) deallocate(this % dom) if (allocated(this % k_cmfd)) deallocate(this % k_cmfd) if (allocated(this % entropy)) deallocate(this % entropy) + if (allocated(this % resnb)) deallocate(this % resnb) end subroutine deallocate_cmfd From 7bdb4536e34f09248602d72b30f653f09a52ddce Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Thu, 8 May 2014 12:31:21 -0400 Subject: [PATCH 05/10] added valgrind suppressions for HDF5 create/open --- tests/run_tests.py | 1 + tests/valgrind.supp | 63 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 tests/valgrind.supp diff --git a/tests/run_tests.py b/tests/run_tests.py index 837ae2ff6..12e6632ce 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -76,6 +76,7 @@ set(CTEST_UPDATE_COMMAND "git") set(CTEST_CONFIGURE_COMMAND "${{CMAKE_COMMAND}} -H${{CTEST_SOURCE_DIRECTORY}} -B${{CTEST_BINARY_DIRECTORY}} ${{CTEST_BUILD_OPTIONS}}") set(CTEST_MEMORYCHECK_COMMAND "{valgrind_cmd}") set(CTEST_MEMORYCHECK_COMMAND_OPTIONS "--tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes") +set(CTEST_MEMORYCHECK_SUPPRESSIONS_FILE ${{CTEST_SOURCE_DIRECTORY}}/../tests/valgrind.supp) set(MEM_CHECK {mem_check}) set(ENV{{MEM_CHECK}} ${{MEM_CHECK}}) diff --git a/tests/valgrind.supp b/tests/valgrind.supp new file mode 100644 index 000000000..ad302c539 --- /dev/null +++ b/tests/valgrind.supp @@ -0,0 +1,63 @@ +{ + Create HDF5 statepoint file + Memcheck:Addr4 + fun:H5_build_extpath + fun:H5F_open + fun:H5Fcreate + fun:h5fcreate_c_ + fun:__h5f_MOD_h5fcreate_f + fun:__hdf5_interface_MOD_hdf5_file_create + fun:__output_interface_MOD_file_create + fun:__state_point_MOD_write_state_point + fun:__eigenvalue_MOD_finalize_batch + fun:__eigenvalue_MOD_run_eigenvalue + fun:MAIN__ + fun:main +} +{ + Open HDF5 statepoint file + Memcheck:Addr4 + fun:H5_build_extpath + fun:H5F_open + fun:H5Fopen + fun:h5fopen_c_ + fun:__h5f_MOD_h5fopen_f + fun:__hdf5_interface_MOD_hdf5_file_open + fun:__output_interface_MOD_file_open + fun:__state_point_MOD_write_source_point + fun:__eigenvalue_MOD_finalize_batch + fun:__eigenvalue_MOD_run_eigenvalue + fun:MAIN__ + fun:main +} +{ + Create HDF5 summary file + Memcheck:Addr4 + fun:H5_build_extpath + fun:H5F_open + fun:H5Fcreate + fun:h5fcreate_c_ + fun:__h5f_MOD_h5fcreate_f + fun:__hdf5_interface_MOD_hdf5_file_create + fun:__output_interface_MOD_file_create + fun:__hdf5_summary_MOD_hdf5_write_summary + fun:__initialize_MOD_initialize_run + fun:MAIN__ + fun:main +} +{ + Create HDF5 track file + Memcheck:Addr4 + fun:H5_build_extpath + fun:H5F_open + fun:H5Fcreate + fun:h5fcreate_c_ + fun:__h5f_MOD_h5fcreate_f + fun:__hdf5_interface_MOD_hdf5_file_create + fun:__output_interface_MOD_file_create + fun:__track_output_MOD_finalize_particle_track + fun:__tracking_MOD_transport + fun:__eigenvalue_MOD_run_eigenvalue + fun:MAIN__ + fun:main +} From 8a5d2ca550ca33ed3cd8e891b0b878d3cc0100f2 Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Thu, 8 May 2014 13:27:18 -0400 Subject: [PATCH 06/10] fixed basic debug build warnings for output interface --- src/output_interface.F90 | 492 ++++++++++++++++++++++++++++++--------- 1 file changed, 378 insertions(+), 114 deletions(-) diff --git a/src/output_interface.F90 b/src/output_interface.F90 index 3c04ba36d..e25af5532 100644 --- a/src/output_interface.F90 +++ b/src/output_interface.F90 @@ -77,13 +77,15 @@ module output_interface procedure, public :: file_create => file_create procedure, public :: file_open => file_open procedure, public :: file_close => file_close - procedure, public :: write_attribute_string => write_attribute_string procedure, public :: write_tally_result => write_tally_result procedure, public :: read_tally_result => read_tally_result procedure, public :: write_source_bank => write_source_bank procedure, public :: read_source_bank => read_source_bank +#ifdef HDF5 + procedure, public :: write_attribute_string => write_attribute_string procedure, public :: open_group => open_group procedure, public :: close_group => close_group +#endif end type BinaryOutput contains @@ -133,11 +135,10 @@ contains ! FILE_OPEN opens an existing file for reading or read/writing !=============================================================================== - subroutine file_open(self, filename, mode, serial, unit) + subroutine file_open(self, filename, mode, serial) character(*), intent(in) :: filename ! name of file to be opened character(*), intent(in) :: mode ! file access mode - integer, optional, intent(in) :: unit ! optional unit number logical, optional, intent(in) :: serial ! processor rank to write from class(BinaryOutput) :: self @@ -214,30 +215,30 @@ contains ! OPEN_GROUP call hdf5 routine to open a group within binary output context !=============================================================================== +#ifdef HDF5 subroutine open_group(self, group) character(*), intent(in) :: group ! HDF5 group name class(BinaryOutput) :: self -#ifdef HDF5 call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) -#endif end subroutine open_group +#endif !=============================================================================== ! CLOSE_GROUP call hdf5 routine to close a group within binary output context !=============================================================================== +#ifdef HDF5 subroutine close_group(self) class(BinaryOutput) :: self -#ifdef HDF5 call hdf5_close_group(self % hdf5_grp) -#endif end subroutine close_group +#endif !=============================================================================== ! WRITE_DOUBLE writes double precision scalar data @@ -251,8 +252,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -263,18 +274,18 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_double(self % hdf5_grp, name, buffer) + call hdf5_write_double(self % hdf5_grp, name_, buffer) else - call hdf5_write_double_parallel(self % hdf5_grp, name, buffer, collect_) + call hdf5_write_double_parallel(self % hdf5_grp, name_, buffer, collect_) end if # else - call hdf5_write_double(self % hdf5_grp, name, buffer) + call hdf5_write_double(self % hdf5_grp, name_, buffer) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -302,9 +313,19 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ - ! Set up collective vs. independent I/O + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect else @@ -314,18 +335,18 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_double(self % hdf5_grp, name, buffer) + call hdf5_read_double(self % hdf5_grp, name_, buffer) else - call hdf5_read_double_parallel(self % hdf5_grp, name, buffer, collect_) + call hdf5_read_double_parallel(self % hdf5_grp, name_, buffer, collect_) end if # else - call hdf5_read_double(self % hdf5_grp, name, buffer) + call hdf5_read_double(self % hdf5_grp, name_, buffer) # endif ! Check if HDf5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -354,8 +375,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -366,19 +397,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_double_1Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_double_1Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_write_double_1Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_write_double_1Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_write_double_1Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_double_1Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -407,8 +438,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -419,19 +460,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_double_1Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_double_1Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_read_double_1Darray_parallel(self % hdf5_grp, name, buffer, & + call hdf5_read_double_1Darray_parallel(self % hdf5_grp, name_, buffer, & length, collect_) end if # else - call hdf5_read_double_1Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_double_1Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -460,8 +501,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -472,19 +523,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_double_2Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_double_2Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_write_double_2Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_write_double_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_write_double_2Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_double_2Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -513,8 +564,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -525,19 +586,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_double_2Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_double_2Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_read_double_2Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_read_double_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_read_double_2Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_double_2Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -566,8 +627,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -578,19 +649,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_double_3Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_double_3Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_write_double_3Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_write_double_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_write_double_3Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_double_3Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -619,8 +690,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -631,19 +712,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_double_3Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_double_3Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_read_double_3Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_read_double_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_read_double_3Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_double_3Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -673,9 +754,19 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ - ! Set up collective vs. independent I/O + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect else @@ -685,20 +776,20 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_double_4Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_double_4Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_write_double_4Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_write_double_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else ! Write the data in serial - call hdf5_write_double_4Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_double_4Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -730,9 +821,19 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ - ! Set up collective vs. independent I/O + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect else @@ -742,19 +843,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_double_4Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_double_4Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_read_double_4Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_read_double_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_read_double_4Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_double_4Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -784,8 +885,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -796,18 +907,18 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_integer(self % hdf5_grp, name, buffer) + call hdf5_write_integer(self % hdf5_grp, name_, buffer) else - call hdf5_write_integer_parallel(self % hdf5_grp, name, buffer, collect_) + call hdf5_write_integer_parallel(self % hdf5_grp, name_, buffer, collect_) end if # else - call hdf5_write_integer(self % hdf5_grp, name, buffer) + call hdf5_write_integer(self % hdf5_grp, name_, buffer) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -835,9 +946,19 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ - ! Set up collective vs. independent I/O + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect else @@ -847,18 +968,18 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_integer(self % hdf5_grp, name, buffer) + call hdf5_read_integer(self % hdf5_grp, name_, buffer) else - call hdf5_read_integer_parallel(self % hdf5_grp, name, buffer, collect_) + call hdf5_read_integer_parallel(self % hdf5_grp, name_, buffer, collect_) end if # else - call hdf5_read_integer(self % hdf5_grp, name, buffer) + call hdf5_read_integer(self % hdf5_grp, name_, buffer) # endif ! Check if HDf5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -887,8 +1008,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -899,19 +1030,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_integer_1Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_integer_1Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_write_integer_1Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_write_integer_1Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_write_integer_1Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_integer_1Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -940,8 +1071,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -952,20 +1093,20 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_integer_1Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_integer_1Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_read_integer_1Darray_parallel(self % hdf5_grp, name, buffer, & + call hdf5_read_integer_1Darray_parallel(self % hdf5_grp, name_, buffer, & length, collect_) end if # else ! Read the data in serial - call hdf5_read_integer_1Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_integer_1Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -994,8 +1135,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -1006,19 +1157,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_integer_2Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_integer_2Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_write_integer_2Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_write_integer_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_write_integer_2Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_integer_2Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -1047,8 +1198,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -1059,19 +1220,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_integer_2Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_integer_2Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_read_integer_2Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_read_integer_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_read_integer_2Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_integer_2Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -1100,8 +1261,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -1112,19 +1283,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_integer_3Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_integer_3Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_write_integer_3Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_write_integer_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_write_integer_3Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_integer_3Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -1153,8 +1324,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -1165,19 +1346,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_integer_3Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_integer_3Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_read_integer_3Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_read_integer_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_read_integer_3Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_integer_3Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -1207,9 +1388,19 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ - ! Set up collective vs. independent I/O + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect else @@ -1219,19 +1410,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_integer_4Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_integer_4Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_write_integer_4Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_write_integer_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_write_integer_4Darray(self % hdf5_grp, name, buffer, length) + call hdf5_write_integer_4Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -1263,9 +1454,19 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ - ! Set up collective vs. independent I/O + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect else @@ -1275,19 +1476,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_integer_4Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_integer_4Darray(self % hdf5_grp, name_, buffer, length) else - call hdf5_read_integer_4Darray_parallel(self % hdf5_grp, name, buffer, length, & + call hdf5_read_integer_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if # else - call hdf5_read_integer_4Darray(self % hdf5_grp, name, buffer, length) + call hdf5_read_integer_4Darray(self % hdf5_grp, name_, buffer, length) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -1317,8 +1518,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -1329,19 +1540,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_long(self % hdf5_grp, name, buffer, hdf5_integer8_t) + call hdf5_write_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) else - call hdf5_write_long_parallel(self % hdf5_grp, name, buffer, & + call hdf5_write_long_parallel(self % hdf5_grp, name_, buffer, & hdf5_integer8_t, collect_) end if # else - call hdf5_write_long(self % hdf5_grp, name, buffer, hdf5_integer8_t) + call hdf5_write_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -1369,8 +1580,18 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name logical :: collect_ + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -1381,19 +1602,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_long(self % hdf5_grp, name, buffer, hdf5_integer8_t) + call hdf5_read_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) else - call hdf5_read_long_parallel(self % hdf5_grp, name, buffer, & + call hdf5_read_long_parallel(self % hdf5_grp, name_, buffer, & hdf5_integer8_t, collect_) end if # else - call hdf5_read_long(self % hdf5_grp, name, buffer, hdf5_integer8_t) + call hdf5_read_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -1421,12 +1642,22 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name integer :: n logical :: collect_ ! Get string length n = len_trim(buffer) + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -1437,19 +1668,19 @@ contains #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_write_string(self % hdf5_grp, name, buffer, n) + call hdf5_write_string(self % hdf5_grp, name_, buffer, n) else - call hdf5_write_string_parallel(self % hdf5_grp, name, buffer, n, collect_) + call hdf5_write_string_parallel(self % hdf5_grp, name_, buffer, n, collect_) end if # else ! Write the data - call hdf5_write_string(self % hdf5_grp, name, buffer, n) + call hdf5_write_string(self % hdf5_grp, name_, buffer, n) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -1477,12 +1708,22 @@ contains logical, intent(in), optional :: collect ! collective I/O class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name integer :: n logical :: collect_ ! Get string length n = len(buffer) + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + ! Set up collective vs. independent I/O if (present(collect)) then collect_ = collect @@ -1490,21 +1731,22 @@ contains collect_ = .true. end if + #ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif # ifdef MPI if (self % serial) then - call hdf5_read_string(self % hdf5_grp, name, buffer, n) + call hdf5_read_string(self % hdf5_grp, name_, buffer, n) else - call hdf5_read_string_parallel(self % hdf5_grp, name, buffer, n, collect_) + call hdf5_read_string_parallel(self % hdf5_grp, name_, buffer, n, collect_) end if # else - call hdf5_read_string(self % hdf5_grp, name, buffer, n) + call hdf5_read_string(self % hdf5_grp, name_, buffer, n) # endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) @@ -1524,6 +1766,7 @@ contains ! WRITE_ATTRIBUTE_STRING !=============================================================================== +#ifdef HDF5 subroutine write_attribute_string(self, var, attr_type, attr_str, group) character(*), intent(in) :: var ! variable name for attr @@ -1532,7 +1775,6 @@ contains character(*), intent(in), optional :: group ! HDF5 group name class(BinaryOutput) :: self -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) @@ -1545,9 +1787,9 @@ contains ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#endif end subroutine write_attribute_string +#endif !=============================================================================== ! WRITE_TALLY_RESULT writes an OpenMC TallyResult type @@ -1561,15 +1803,26 @@ contains type(TallyResult), intent(in), target :: buffer(n1, n2) ! data to write class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name + #ifndef HDF5 integer :: j,k ! iteration counters #endif + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + #ifdef HDF5 ! Open up sub-group if present if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh end if @@ -1581,7 +1834,7 @@ contains call h5screate_simple_f(1, dims1, dspace, hdf5_err) ! Create the dataset - call h5dcreate_f(self % hdf5_grp, name, hdf5_tallyresult_t, dspace, dset, & + call h5dcreate_f(self % hdf5_grp, name_, hdf5_tallyresult_t, dspace, dset, & hdf5_err) ! Set pointer to first value and write @@ -1621,15 +1874,26 @@ contains type(TallyResult), intent(inout), target :: buffer(n1, n2) ! read data here class(BinaryOutput) :: self + character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name + character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name + #ifndef HDF5 integer :: j,k ! iteration counters #endif + ! Set name + name_ = trim(name) + + ! Set group + if (present(group)) then + group_ = trim(group) + end if + #ifdef HDF5 ! Open up sub-group if present if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) + call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh end if From 5ca12328e48577d21065a861aa36657a5969b96d Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Thu, 8 May 2014 14:11:10 -0400 Subject: [PATCH 07/10] fixed rest of basic-debug build warnings --- src/ace.F90 | 2 +- src/cmfd_data.F90 | 3 ++- src/cmfd_jfnk_solver.F90 | 21 +++++++++++++++++++-- src/cmfd_power_solver.F90 | 8 ++++++++ src/eigenvalue.F90 | 2 +- src/matrix_header.F90 | 20 ++++++++++++-------- src/vector_header.F90 | 12 ++++++++---- 7 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index ea97c80be..e3327b2da 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -1330,7 +1330,7 @@ contains ! Now we can fill the inelastic_data(i) attributes do i = 1, NE_in - XSS_index = LOCC(i) + XSS_index = int(LOCC(i)) NE_out = table % inelastic_data(i) % n_e_out do j = 1, NE_out table % inelastic_data(i) % e_out(j) = XSS(XSS_index + 1) diff --git a/src/cmfd_data.F90 b/src/cmfd_data.F90 index 8dd0fa35f..b5612dcd0 100644 --- a/src/cmfd_data.F90 +++ b/src/cmfd_data.F90 @@ -800,7 +800,7 @@ contains !=============================================================================== ! FIX_NEUTRON_BALANCE is a method to adjust parameters to have perfect balance !=============================================================================== - +#ifdef DEVELOPMENTAL subroutine fix_neutron_balance() use constants, only: ONE, ZERO, CMFD_NOACCEL @@ -926,6 +926,7 @@ contains end do ZLOOP end subroutine fix_neutron_balance +#endif !=============================================================================== ! COMPUTE_EFFECTIVE_DOWNSCATTER changes downscatter rate for zero upscatter diff --git a/src/cmfd_jfnk_solver.F90 b/src/cmfd_jfnk_solver.F90 index 7bd21a875..0180de6c2 100644 --- a/src/cmfd_jfnk_solver.F90 +++ b/src/cmfd_jfnk_solver.F90 @@ -16,7 +16,9 @@ module cmfd_jfnk_solver type(Matrix) :: jac_prec ! Jacobian preconditioner object type(Matrix) :: loss ! CMFD loss matrix type(Matrix) :: prod ! CMFD production matrix +#ifdef PETSC type(JFNKSolver) :: jfnk ! JFNK solver object +#endif type(Vector) :: resvec ! JFNK residual vector type(Vector) :: xvec ! JFNK solution vector @@ -51,9 +53,9 @@ contains #endif ! Set up residual and jacobian routines +#ifdef PETSC jfnk_data % res_proc_ptr => compute_nonlinear_residual jfnk_data % jac_proc_ptr => build_jacobian_matrix -#ifdef PETSC call jfnk % set_functions(jfnk_data, resvec, jac_prec) #endif @@ -104,8 +106,10 @@ contains ! Assemble matrices and use PETSc call loss % assemble() call prod % assemble() +#ifdef PETSC call loss % setup_petsc() call prod % setup_petsc() +#endif ! Check for mathematical adjoint if (adjoint_calc .and. trim(cmfd_adjoint_type) == 'math') & @@ -133,14 +137,18 @@ contains end if ! Set up vectors for PETSc +#ifdef PETSC call resvec % setup_petsc() call xvec % setup_petsc() +#endif ! Build jacobian from initial guess call build_jacobian_matrix(xvec) ! Set up Jacobian for PETSc +#ifdef PETSC call jac_prec % setup_petsc() +#endif ! Set dominance ratio to 0 cmfd % dom(current_batch) = ZERO @@ -262,7 +270,7 @@ contains !=============================================================================== ! COMPUTE_NONLINEAR_RESIDUAL computes the residual of the nonlinear equations !=============================================================================== - +#ifdef PETSC subroutine compute_nonlinear_residual(x, res) use global, only: cmfd_write_matrices @@ -310,7 +318,9 @@ contains else filename = 'res.bin' end if +#ifdef PETSC call res % write_petsc_binary(filename) +#endif ! Write out solution vector if (adjoint_calc) then @@ -318,11 +328,14 @@ contains else filename = 'x.bin' end if +#ifdef PETSC call x % write_petsc_binary(filename) +#endif end if end subroutine compute_nonlinear_residual +#endif !=============================================================================== ! COMPUTE_ADJOINT calculates mathematical adjoint by taking transposes @@ -333,13 +346,17 @@ contains use global, only: cmfd_write_matrices ! Transpose matrices +#ifdef PETSC call loss % transpose() call prod % transpose() +#endif ! Write out matrix in binary file (debugging) if (cmfd_write_matrices) then +#ifdef PETSC call loss % write_petsc_binary('adj_lossmat.bin') call loss % write_petsc_binary('adj_prodmat.bin') +#endif end if end subroutine compute_adjoint diff --git a/src/cmfd_power_solver.F90 b/src/cmfd_power_solver.F90 index f2761d0a1..65b60bc89 100644 --- a/src/cmfd_power_solver.F90 +++ b/src/cmfd_power_solver.F90 @@ -29,7 +29,9 @@ module cmfd_power_solver type(Vector) :: s_n ! new source vector type(Vector) :: s_o ! old flux vector type(Vector) :: serr_v ! error in source +#ifdef PETSC type(GMRESSolver) :: gmres ! gmres solver +#endif contains @@ -169,13 +171,17 @@ contains use global, only: cmfd_write_matrices ! Transpose matrices +#ifdef PETSC call loss % transpose() call prod % transpose() +#endif ! Write out matrix in binary file (debugging) if (cmfd_write_matrices) then +#ifdef PETSC call loss % write_petsc_binary('adj_lossmat.bin') call prod % write_petsc_binary('adj_prodmat.bin') +#endif end if end subroutine compute_adjoint @@ -320,7 +326,9 @@ contains else filename = 'fluxvec.bin' end if +#ifdef PETSC call phi_n % write_petsc_binary(filename) +#endif end if end subroutine extract_results diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 4d3202569..2608891e3 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -39,7 +39,7 @@ contains subroutine run_eigenvalue() type(Particle) :: p - integer :: i_work + integer(8) :: i_work if (master) call header("K EIGENVALUE SIMULATION", level=1) diff --git a/src/matrix_header.F90 b/src/matrix_header.F90 index 591eeaaed..24307b10b 100644 --- a/src/matrix_header.F90 +++ b/src/matrix_header.F90 @@ -27,13 +27,17 @@ module matrix_header procedure :: assemble => matrix_assemble procedure :: get_row => matrix_get_row procedure :: get_col => matrix_get_col + procedure :: vector_multiply => matrix_vector_multiply +#ifdef PETSC + procedure :: transpose => matrix_transpose procedure :: setup_petsc => matrix_setup_petsc procedure :: write_petsc_binary => matrix_write_petsc_binary - procedure :: transpose => matrix_transpose - procedure :: vector_multiply => matrix_vector_multiply +#endif end type matrix +#ifdef PETSC integer :: petsc_err +#endif contains @@ -267,6 +271,7 @@ contains ! MATRIX_SETUP_PETSC configures the row/col vectors and links to a PETSc object !=============================================================================== +#ifdef PETSC subroutine matrix_setup_petsc(self) class(Matrix), intent(inout) :: self ! matrix instance @@ -276,50 +281,49 @@ contains self % col = self % col - 1 ! Link to petsc -#ifdef PETSC call MatCreateSeqAIJWithArrays(PETSC_COMM_WORLD, self % n, self % n, & self % row, self % col, self % val, self % petsc_mat, petsc_err) -#endif ! Petsc is now active self % petsc_active = .true. end subroutine matrix_setup_petsc +#endif !=============================================================================== ! MATRIX_WRITE_PETSC_BINARY writes a PETSc matrix binary file !=============================================================================== +#ifdef PETSC subroutine matrix_write_petsc_binary(self, filename) character(*), intent(in) :: filename ! file name to write to class(Matrix), intent(in) :: self ! matrix instance -#ifdef PETSC type(PetscViewer) :: viewer ! a petsc viewer instance call PetscViewerBinaryOpen(PETSC_COMM_WORLD, trim(filename), & FILE_MODE_WRITE, viewer, petsc_err) call MatView(self % petsc_mat, viewer, petsc_err) call PetscViewerDestroy(viewer, petsc_err) -#endif end subroutine matrix_write_petsc_binary +#endif !=============================================================================== ! MATRIX_TRANSPOSE uses PETSc to transpose a matrix !=============================================================================== +#ifdef PETSC subroutine matrix_transpose(self) class(Matrix), intent(inout) :: self ! matrix instance -#ifdef PETSC call MatTranspose(self % petsc_mat, MAT_REUSE_MATRIX, self % petsc_mat, & petsc_err) -#endif end subroutine matrix_transpose +#endif !=============================================================================== ! MATRIX_VECTOR_MULTIPLY allow a vector to multiply the matrix diff --git a/src/vector_header.F90 b/src/vector_header.F90 index 3d1bd9afa..e050981c7 100644 --- a/src/vector_header.F90 +++ b/src/vector_header.F90 @@ -21,11 +21,15 @@ module vector_header procedure :: create => vector_create procedure :: destroy => vector_destroy procedure :: add_value => vector_add_value +#ifdef PETSC procedure :: setup_petsc => vector_setup_petsc procedure :: write_petsc_binary => vector_write_petsc_binary +#endif end type Vector +#ifdef PETSC integer :: petsc_err ! petsc error code +#endif contains @@ -88,39 +92,39 @@ contains ! VECTOR_SETUP_PETSC links the data to a PETSc vector !=============================================================================== +#ifdef PETSC subroutine vector_setup_petsc(self) class(Vector), intent(inout) :: self ! vector instance ! Link to PETSc -#ifdef PETSC call VecCreateSeqWithArray(PETSC_COMM_WORLD, 1, self % n, self % val, & self % petsc_vec, petsc_err) -#endif ! Set that PETSc is now active self % petsc_active = .true. end subroutine vector_setup_petsc +#endif !=============================================================================== ! VECTOR_WRITE_PETSC_BINARY writes the PETSc vector to a binary file !=============================================================================== +#ifdef PETSC subroutine vector_write_petsc_binary(self, filename) character(*), intent(in) :: filename ! name of file to write to class(Vector), intent(in) :: self ! vector instance -#ifdef PETSC type(PetscViewer) :: viewer ! PETSc viewer instance call PetscViewerBinaryOpen(PETSC_COMM_WORLD, trim(filename), & FILE_MODE_WRITE, viewer, petsc_err) call VecView(self % petsc_vec, viewer, petsc_err) call PetscViewerDestroy(viewer, petsc_err) -#endif end subroutine vector_write_petsc_binary +#endif end module vector_header From 70cc7ed06c410000a09c35c062d0458aa389393f Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Thu, 8 May 2014 14:11:27 -0400 Subject: [PATCH 08/10] fixed hdf5, mpi build warnings --- src/eigenvalue.F90 | 2 +- src/output_interface.F90 | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 2608891e3..72fb27f92 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -256,7 +256,7 @@ contains & temp_sites(:) ! local array of extra sites on each node #ifdef MPI - integer :: n ! number of sites to send/recv + integer(8) :: n ! number of sites to send/recv integer :: neighbor ! processor to send/recv data from integer :: request(20) ! communication request for send/recving sites integer :: n_request ! number of communication requests diff --git a/src/output_interface.F90 b/src/output_interface.F90 index e25af5532..799fc4d21 100644 --- a/src/output_interface.F90 +++ b/src/output_interface.F90 @@ -1878,7 +1878,9 @@ contains character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name #ifndef HDF5 +# ifndef MPI integer :: j,k ! iteration counters +# endif #endif ! Set name @@ -1937,12 +1939,15 @@ contains class(BinaryOutput) :: self -#ifdef HDF5 - integer(8) :: offset(1) ! source data offset -#elif MPI +#ifdef MPI +# ifndef HDF5 integer(MPI_OFFSET_KIND) :: offset ! offset of data integer :: size_offset_kind ! the data offset kind integer :: size_bank ! size of bank to write +# endif +# ifdef HDF5 + integer(8) :: offset(1) ! source data offset +# endif #endif #ifdef HDF5 @@ -2054,12 +2059,14 @@ contains class(BinaryOutput) :: self -#ifdef HDF5 - integer(8) :: offset(1) ! offset of data -#elif MPI +#ifdef MPI +# ifndef HDF5 integer(MPI_OFFSET_KIND) :: offset ! offset of data - integer :: size_offset_kind ! the data offset kind integer :: size_bank ! size of bank to read +# endif +# ifdef HDF5 + integer(8) :: offset(1) ! offset of data +# endif #endif #ifdef HDF5 From af6b4eaffa96671ae013fbe725016cb6342e611d Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Thu, 8 May 2014 14:22:12 -0400 Subject: [PATCH 09/10] initialized list --- src/xml/openmc_fox.F90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/xml/openmc_fox.F90 b/src/xml/openmc_fox.F90 index fd4165efd..461c6bc2b 100644 --- a/src/xml/openmc_fox.F90 +++ b/src/xml/openmc_fox.F90 @@ -41,6 +41,8 @@ module openmc_fox logical :: doneChildren, doneAttributes, allElements integer :: i, i_tree + list => null() + if (.not.associated(doc)) then if (getFoX_checks().or.FoX_NODE_IS_NULL<200) then call throw_exception(FoX_NODE_IS_NULL, "getElementsByTagName", ex) From 287f9866232f8e77efc234d17112a33e73c62d83 Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Thu, 8 May 2014 14:25:37 -0400 Subject: [PATCH 10/10] fixed openmp build warnings --- src/eigenvalue.F90 | 4 ++-- src/initialize.F90 | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 72fb27f92..37edb922c 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -834,8 +834,8 @@ contains subroutine join_bank_from_threads() - integer :: total ! total number of fission bank sites - integer :: i ! loop index for threads + integer(8) :: total ! total number of fission bank sites + integer :: i ! loop index for threads ! Initialize the total number of fission bank sites total = 0 diff --git a/src/initialize.F90 b/src/initialize.F90 index 52869a281..c36977510 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -416,7 +416,7 @@ contains #ifdef _OPENMP ! Read and set number of OpenMP threads - n_threads = str_to_int(argv(i)) + n_threads = int(str_to_int(argv(i)), 4) if (n_threads < 1) then message = "Invalid number of threads specified on command line." call fatal_error()