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= 1, is_ncells !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 | ! CALL MPI_ALLREDUCE(local_vect, vect, is_nnodes*ndata, &
44 | ! & MPI_DOUBLE_PRECISION,MPI_SUM, COMM_PARA , &
45 | ! & ierr)
46 |
47 | ! CALL MPI_ALLREDUCE(nodecount, total_nodecount, is_nnodes, &
48 | ! & MPI_INTEGER, MPI_SUM, COMM_PARA , &
49 | ! & ierr)
50 |
51 | vect = local_vect
52 | total_nodecount = nodecount
53 |
54 | DO i=1,ndata
55 | vect(i,:) = vect(i,:) / real(total_nodecount(:))
56 | ENDDO
57 |
58 | END SUBROUTINE SCATTER
scatter.F could be called by: