[Dart-dev] DART/branches Revision: 12588
dart at ucar.edu
dart at ucar.edu
Thu May 17 16:33:06 MDT 2018
hendric at ucar.edu
2018-05-17 16:33:06 -0600 (Thu, 17 May 2018)
116
adding a mpi_allreduce for an array of number. this
is currently not working as expected but compiles and
runs.
Modified: DART/branches/rma_closest_member_tool/assimilation_code/modules/utilities/mpi_utilities_mod.f90
===================================================================
--- DART/branches/rma_closest_member_tool/assimilation_code/modules/utilities/mpi_utilities_mod.f90 2018-05-17 19:28:49 UTC (rev 12587)
+++ DART/branches/rma_closest_member_tool/assimilation_code/modules/utilities/mpi_utilities_mod.f90 2018-05-17 22:33:06 UTC (rev 12588)
@@ -89,6 +89,7 @@
module procedure sum_across_tasks_int4
module procedure sum_across_tasks_int8
module procedure sum_across_tasks_real
+ module procedure sum_across_tasks_real_array
end interface
! ---- private data for mpi_utilities ----
@@ -1492,7 +1493,38 @@
end subroutine sum_across_tasks_real
+!-----------------------------------------------------------------------------
+subroutine sum_across_tasks_real_array(addend, sum)
+ real(r8), intent(in) :: addend(:)
+ real(r8), intent(out) :: sum(:)
+ integer :: errcode
+ real(r8), allocatable :: localaddend(:), localsum(:)
+
+! cover routine for MPI all-reduce
+
+if ( .not. module_initialized ) then
+ write(errstring, *) 'initialize_mpi_utilities() must be called first'
+ call error_handler(E_ERR,'sum_across_tasks', errstring, source, revision, revdate)
+endif
+
+allocate(localaddend(size(addend)), localsum(size(addend)))
+localaddend(:) = addend(:)
+
+if (.true.) write(*,*) "PE", myrank, ": Allreduce called"
+
+call MPI_Allreduce(localaddend, localsum, 1, datasize, MPI_SUM, &
+ 0,my_local_comm, errcode)
+if (errcode /= MPI_SUCCESS) then
+ write(errstring, '(a,i8)') 'MPI_Allreduce returned error code ', errcode
+ call error_handler(E_ERR,'sum_across_tasks', errstring, source, revision, revdate)
+endif
+
+sum = localsum
+
+end subroutine sum_across_tasks_real_array
+
+
!-----------------------------------------------------------------------------
! pipe-related utilities
!-----------------------------------------------------------------------------
Modified: DART/branches/rma_closest_member_tool/assimilation_code/programs/closest_member_tool/closest_member_tool.f90
===================================================================
--- DART/branches/rma_closest_member_tool/assimilation_code/programs/closest_member_tool/closest_member_tool.f90 2018-05-17 19:28:49 UTC (rev 12587)
+++ DART/branches/rma_closest_member_tool/assimilation_code/programs/closest_member_tool/closest_member_tool.f90 2018-05-17 22:33:06 UTC (rev 12588)
@@ -48,7 +48,8 @@
use state_structure_mod, only : get_num_domains
use mpi_utilities_mod, only : initialize_mpi_utilities, task_count, &
- finalize_mpi_utilities, my_task_id
+ finalize_mpi_utilities, my_task_id, &
+ sum_across_tasks
use ensemble_manager_mod, only : ensemble_type, init_ensemble_manager, compute_copy_mean, &
get_var_owner_index
@@ -119,10 +120,10 @@
logical :: read_time_from_file = .true.
type(stage_metadata_type) :: input_restart_files
character(len=256) :: string1, my_base, my_desc
-integer :: ENS_SD_COPY, ENS_MEAN_COPY
+integer :: ENS_MEAN_COPY
-real(r8), allocatable :: adiff(:), local_diffs(:)
-integer :: copies, vars, owner, owners_index
+real(r8), allocatable :: adiff(:), local_diffs(:), total_diff(:)
+integer :: copies, vars, owner, owners_index, addend
!> @todo seems like you are using get_state_meta_data just so you can get the kinds.
!> WRF and MPAS will be doing the vertical conversion also.
@@ -158,7 +159,7 @@
! make space for the mean and a single member, plus place to sort list
! for output
-call init_ensemble_manager(ens_handle, ens_size+2, model_size)
+call init_ensemble_manager(ens_handle, ens_size+1, model_size)
call init_ensemble_manager(mean_ens_handle, 1, model_size)
mean_time = set_time_missing()
@@ -214,14 +215,12 @@
call read_state(ens_handle, ens_file_info, .false., member_time)
!#! call read_state(mean_ens_handle, mean_file_info, .false., mean_time)
-ENS_SD_COPY = ens_size + 1
-ENS_MEAN_COPY = ens_size + 2
+ENS_MEAN_COPY = ens_size + 1
print*, 'compute copy mean'
! Compute mean and spread
call compute_copy_mean(ens_handle, 1, ens_size, ENS_MEAN_COPY)
More information about the Dart-dev
mailing list