1 | include(dom.inc)
2 |
3 | SUBROUTINE SCATTER(vect_cell, vect, ndata)
4 |
5 | USE mod_pmm
6 | USE mod_slave
7 | #ifdef USEPALM
8 | USE palmlib
9 | #endif
10 |
11 | IMPLICIT NONE
12 |
13 | ! IN
14 | DOM_INT :: ndata
15 | DOM_REAL, DIMENSION(ndata,is_ncells) :: vect_cell
16 |
17 | ! LOCAL
18 | DOM_INT :: j, i, k, inode, ierr
19 | DOM_REAL, DIMENSION(ndata,is_nnodes) :: local_vect
20 | DOM_INT, DIMENSION(is_nnodes) :: nodecount,total_nodecount
21 |
22 | ! OUT
23 | DOM_REAL,DIMENSION(ndata,is_nnodes) :: vect
24 |
25 | vect = 0.
26 |
27 | ! -----------------------------!
28 | ! Initializing local cell data !
29 | ! -----------------------------!
30 |
31 | local_vect = 0.
32 | nodecount = 0
33 | total_nodecount = 0
34 |
35 | DO j= is_cellb, is_cellf
36 | DO inode=1, is_cnodes(j)
37 | k = is_cnnode(inode,j)
38 | nodecount(k) = nodecount(k) + 1
39 | local_vect(:,k) = local_vect(:,k) + vect_cell(:,j)
40 | ENDDO
41 | ENDDO
42 |
43 | #ifdef USEPALM
44 | CALL MPI_ALLREDUCE(local_vect, vect, is_nnodes*ndata, &
45 | & MPI_DOUBLE_PRECISION,MPI_SUM, PL_COMM_EXEC , &
46 | & ierr)
47 |
48 | CALL MPI_ALLREDUCE(nodecount, total_nodecount, is_nnodes, &
49 | & MPI_INTEGER, MPI_SUM, PL_COMM_EXEC , &
50 | & ierr)
51 |
52 | #else
53 | CALL MPI_ALLREDUCE(local_vect, vect, is_nnodes*ndata, &
54 | & MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD, &
55 | & ierr)
56 |
57 | CALL MPI_ALLREDUCE(nodecount, total_nodecount, is_nnodes, &
58 | & MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, &
59 | & ierr)
60 | #endif
61 |
62 | DO i=1,ndata
63 | vect(i,:) = vect(i,:) / real(total_nodecount(:))
64 | ENDDO
65 |
66 | END SUBROUTINE SCATTER
scatter.F could be called by: