[Dart-dev] DART/branches Revision: 11705
dart at ucar.edu
dart at ucar.edu
Fri Jun 9 10:43:10 MDT 2017
hendric at ucar.edu
2017-06-09 10:43:06 -0600 (Fri, 09 Jun 2017)
67
parallel read seems to be working for reading ensemble
members.
Modified: DART/branches/rma_par_single_file/assimilation_code/modules/io/direct_netcdf_mod.f90
===================================================================
--- DART/branches/rma_par_single_file/assimilation_code/modules/io/direct_netcdf_mod.f90 2017-06-08 16:26:31 UTC (rev 11704)
+++ DART/branches/rma_par_single_file/assimilation_code/modules/io/direct_netcdf_mod.f90 2017-06-09 16:43:06 UTC (rev 11705)
@@ -401,7 +401,7 @@
if (copies_read >= ens_size) exit
! what to do if a variable is larger than the memory limit?
- start_var = 1 ! read first variable first
+ start_var = 1 ! read first variable first !start_pos
istart = dart_index ! position in state_ens_handle%copies
my_copy = copies_read + my_pe + 1
@@ -1325,6 +1325,8 @@
!-------------------------------------------------
!> Find pes for loop indices
+!> if you have M tasks and N ensemble members, only the first
+!> N + extra copy tasks will send, everyone will receive.
subroutine get_pe_loops(ens_size, recv_start, recv_end, send_start, send_end)
@@ -1331,13 +1333,12 @@
integer, intent(in) :: ens_size
integer, intent(out) :: recv_start !< for RECIEVING_PE_LOOP
-integer, intent(out) :: recv_end !< for RECIEVING_PE_LOOP
+integer, intent(out) :: recv_end !< for RECIEVING_PE_LOOP
integer, intent(out) :: send_start !< for RECEIVE_FROM_EACH_LOOP
-integer, intent(out) :: send_end !< for RECEIVE_FROM_EACH_LOOP
+integer, intent(out) :: send_end !< for RECEIVE_FROM_EACH_LOOP
-
recv_start = 0
-recv_end = task_count() -1
+recv_end = task_count() -1
send_start = recv_start
@@ -1379,11 +1380,12 @@
if (state_ens_handle%distribution_type == 1) then
!>@todo MPI vector data type or packing could/should be used here?
+
+ ! need a contiguous array to send variables with MPI
allocate(buffer(elm_count))
buffer = variable_block(start:elm_count*task_count():task_count())
print*, 'MAP :: size -', map_pe_to_task(state_ens_handle, recv_pe), ':: size(buffer)', size(buffer)
- call send_to(map_pe_to_task(state_ens_handle, recv_pe), &
- buffer)
+ call send_to(map_pe_to_task(state_ens_handle, recv_pe), buffer)
deallocate(buffer)
else
@@ -1553,7 +1555,7 @@
integer :: get_start_rank
-get_start_rank = mod(get_sum_variables_below(variable, domain), task_count())+my_task_id()
+get_start_rank = mod(get_sum_variables_below(variable, domain), task_count())
end function get_start_rank
Modified: DART/branches/rma_par_single_file/assimilation_code/modules/io/single_file_io_mod.f90
===================================================================
--- DART/branches/rma_par_single_file/assimilation_code/modules/io/single_file_io_mod.f90 2017-06-08 16:26:31 UTC (rev 11704)
+++ DART/branches/rma_par_single_file/assimilation_code/modules/io/single_file_io_mod.f90 2017-06-09 16:43:06 UTC (rev 11705)
@@ -395,15 +395,16 @@
! NetCDF IO variables
integer :: my_ncid, varid, MemDimID, TimeDimID, ret, icopy, ivar, jdim, istart, iend
-integer :: ens_size, member_size, elm_count, time_size, var_size, domain, sending_pe, my_pe
+integer :: member_size, elm_count, time_size, var_size, domain, sending_pe, my_pe
integer :: ndims, member_dim, dcount, start_pos, end_pos, start_rank, end_rank
integer :: recv_pe, recv_start, recv_end, send_start, send_end, start_point, end_point
+integer :: ens_size, extra_size
real(r8), allocatable :: var_block(:)
character(len=NF90_MAX_NAME) :: fname, dimname, varname, copyname, extraname
integer, dimension(NF90_MAX_VAR_DIMS) :: dim_lengths
integer, dimension(NF90_MAX_VAR_DIMS) :: dim_start_point
-logical :: do_perturb, has_member_dim, is_reader
-integer :: ensemble_member, copies_read, my_copy
+logical :: do_perturb, has_member_dim, is_reader, is_extra_copy
+integer :: ens_mem, copies_read, my_copy, start_var, num_state_variables
! check whether file_info handle is initialized
! if (task_count() > 1) then
! call error_handler(E_ERR,'read_singlefile', &
@@ -420,15 +421,17 @@
! do this once
name_handle = get_stage_metadata(file_info)
-ens_size = state_ens_handle%num_copies
+ens_size = state_ens_handle%num_copies - state_ens_handle%num_extras
+extra_size = state_ens_handle%num_extras
+! recv_* and send_* are PE's that variables are sent and received
call get_pe_loops(ens_size, recv_start, recv_end, send_start, send_end)
print*, '****************************************************************************************** '
write(*,'(6A15)') &
More information about the Dart-dev
mailing list