da_proc_sum_count_obs.inc
References to this file elsewhere.
1 subroutine da_proc_sum_count_obs (count_obs)
2
3 !---------------------------------------------------------------------------
4 ! Purpose: Do MPI sum operation across processors to get the global sum of
5 ! count_obs. The sum is returned only on the root processor,
6 ! i.e., processor 0. (In this way, we do not have to do all-to-all
7 ! communication.)
8 !----------------------------------------------------------------------------
9
10 implicit none
11
12 integer, parameter:: numvals = num_ob_indexes*4
13
14 type (count_obs_type), intent(inout) :: count_obs
15
16 integer :: sumval(1:numvals) ! Sum across processors.
17 integer :: procval(1:numvals) ! Partial values on processor to sum.
18 integer :: offset ! Index into procval and sumval arrays.
19
20 #ifdef DM_PARALLEL
21
22 offset = 1
23 call da_pack_count_obs(count_obs % num_synop, offset, procval)
24 call da_pack_count_obs(count_obs % num_sound, offset, procval)
25 call da_pack_count_obs(count_obs % num_sound, offset, procval)
26 call da_pack_count_obs(count_obs % num_satem, offset, procval)
27 call da_pack_count_obs(count_obs % num_geoamv, offset, procval)
28 call da_pack_count_obs(count_obs % num_polaramv, offset, procval)
29 call da_pack_count_obs(count_obs % num_metar, offset, procval)
30 call da_pack_count_obs(count_obs % num_airep, offset, procval)
31 call da_pack_count_obs(count_obs % num_ships, offset, procval)
32 call da_pack_count_obs(count_obs % num_pilot, offset, procval)
33 call da_pack_count_obs(count_obs % num_gpspw, offset, procval)
34 call da_pack_count_obs(count_obs % num_ssmi_retrieval, offset, procval)
35 call da_pack_count_obs(count_obs % num_ssmi_tb, offset, procval)
36 call da_pack_count_obs(count_obs % num_ssmt1, offset, procval)
37 call da_pack_count_obs(count_obs % num_ssmt2, offset, procval)
38 call da_pack_count_obs(count_obs % num_qscat, offset, procval)
39 call da_pack_count_obs(count_obs % num_profiler, offset, procval)
40 call da_pack_count_obs(count_obs % num_bogus, offset, procval)
41 call da_pack_count_obs(count_obs % num_buoy, offset, procval)
42
43 call mpi_reduce(procval, sumval, numvals, mpi_integer, mpi_sum, root, comm, ierr)
44
45 if (myproc == root) then
46 offset = 1
47 call da_unpack_count_obs(count_obs % num_synop, offset, sumval)
48 call da_unpack_count_obs(count_obs % num_sound, offset, sumval)
49 call da_unpack_count_obs(count_obs % num_sound, offset, sumval)
50 call da_unpack_count_obs(count_obs % num_satem, offset, sumval)
51 call da_unpack_count_obs(count_obs % num_geoamv, offset, sumval)
52 call da_unpack_count_obs(count_obs % num_polaramv, offset, sumval)
53 call da_unpack_count_obs(count_obs % num_metar, offset, sumval)
54 call da_unpack_count_obs(count_obs % num_airep, offset, sumval)
55 call da_unpack_count_obs(count_obs % num_ships, offset, sumval)
56 call da_unpack_count_obs(count_obs % num_pilot, offset, sumval)
57 call da_unpack_count_obs(count_obs % num_gpspw, offset, sumval)
58 call da_unpack_count_obs(count_obs % num_ssmi_retrieval, offset, procval)
59 call da_unpack_count_obs(count_obs % num_ssmi_tb, offset, procval)
60 call da_unpack_count_obs(count_obs % num_ssmt1, offset, sumval)
61 call da_unpack_count_obs(count_obs % num_ssmt2, offset, sumval)
62 call da_unpack_count_obs(count_obs % num_qscat, offset, sumval)
63 call da_unpack_count_obs(count_obs % num_profiler, offset, sumval)
64 call da_unpack_count_obs(count_obs % num_bogus, offset, sumval)
65 call da_unpack_count_obs(count_obs % num_buoy, offset, sumval)
66 end if
67 #endif
68
69 end subroutine da_proc_sum_count_obs
70
71