23 integer,
intent(in) :: comm
24 integer,
intent(in) :: gproc
25 real(kind=
kind_real),
intent(in) :: field_in(geom%isc:geom%iec,geom%jsc:geom%jec)
26 real(kind=
kind_real),
intent(out) :: field_out(1:geom%npx-1,1:geom%npy-1,6)
28 integer :: comm_size, comm_rank, ierr, n, ji, jj, jc, npx_l, npy_l, npx_g, npy_g
29 integer,
allocatable :: isc_l(:), iec_l(:), jsc_l(:), jec_l(:), til_l(:)
30 integer,
allocatable :: counts(:), displs(:), vectorcounts(:), vectordispls(:)
31 real(kind=
kind_real),
allocatable :: vector_g(:), vector_l(:)
35 call mpi_comm_size(comm, comm_size, ierr)
36 call mpi_comm_rank(comm, comm_rank, ierr)
38 npx_l = geom%iec-geom%isc+1
39 npy_l = geom%jec-geom%jsc+1
45 allocate(counts(comm_size), displs(comm_size))
53 allocate(isc_l(comm_size), iec_l(comm_size), jsc_l(comm_size), jec_l(comm_size), til_l(comm_size))
54 call mpi_allgatherv(geom%isc, 1, mpi_int, isc_l, counts, displs, mpi_int, comm, ierr)
55 call mpi_allgatherv(geom%iec, 1, mpi_int, iec_l, counts, displs, mpi_int, comm, ierr)
56 call mpi_allgatherv(geom%jsc, 1, mpi_int, jsc_l, counts, displs, mpi_int, comm, ierr)
57 call mpi_allgatherv(geom%jec, 1, mpi_int, jec_l, counts, displs, mpi_int, comm, ierr)
58 call mpi_allgatherv(geom%ntile, 1, mpi_int, til_l, counts, displs, mpi_int, comm, ierr)
59 deallocate(counts,displs)
63 allocate(vectorcounts(comm_size), vectordispls(comm_size))
68 do jj = jsc_l(jc),jec_l(jc)
69 do ji = isc_l(jc),iec_l(jc)
73 vectorcounts(jc) = n - vectordispls(jc)
76 allocate(vector_l(npx_l*npy_l))
78 do jj = geom%jsc,geom%jec
79 do ji = geom%isc,geom%iec
81 vector_l(n) = field_in(ji,jj)
86 allocate(vector_g(npx_g*npy_g*6))
87 call mpi_gatherv( vector_l, npx_l*npy_l, mpi_double_precision, &
88 vector_g, vectorcounts, vectordispls, mpi_double_precision, &
90 deallocate(vector_l,vectorcounts,vectordispls)
96 if (comm_rank == gproc)
then
99 do jj = jsc_l(jc),jec_l(jc)
100 do ji = isc_l(jc),iec_l(jc)
102 field_out(ji,jj,til_l(jc)) = vector_g(n)
107 deallocate(isc_l, iec_l, jsc_l, jec_l)
120 integer,
intent(in) :: comm
121 integer,
intent(in) :: gproc
122 real(kind=
kind_real),
intent(in) :: field_in(1:geom%npx-1,1:geom%npy-1,6)
123 real(kind=
kind_real),
intent(out) :: field_out(geom%isc:geom%iec,geom%jsc:geom%jec)
125 integer :: comm_size, comm_rank, ierr, n, ji, jj, jc, npx_l, npy_l, npx_g, npy_g
126 integer,
allocatable :: isc_l(:), iec_l(:), jsc_l(:), jec_l(:), til_l(:)
127 integer,
allocatable :: counts(:), displs(:), vectorcounts(:), vectordispls(:)
128 real(kind=
kind_real),
allocatable :: vector_g(:), vector_l(:)
132 call mpi_comm_size(comm, comm_size, ierr)
133 call mpi_comm_rank(comm, comm_rank, ierr)
135 npx_l = geom%iec-geom%isc+1
136 npy_l = geom%jec-geom%jsc+1
142 allocate(counts(comm_size), displs(comm_size))
150 allocate(isc_l(comm_size), iec_l(comm_size), jsc_l(comm_size), jec_l(comm_size), til_l(comm_size))
151 call mpi_allgatherv(geom%isc, 1, mpi_int, isc_l, counts, displs, mpi_int, comm, ierr)
152 call mpi_allgatherv(geom%iec, 1, mpi_int, iec_l, counts, displs, mpi_int, comm, ierr)
153 call mpi_allgatherv(geom%jsc, 1, mpi_int, jsc_l, counts, displs, mpi_int, comm, ierr)
154 call mpi_allgatherv(geom%jec, 1, mpi_int, jec_l, counts, displs, mpi_int, comm, ierr)
155 call mpi_allgatherv(geom%ntile, 1, mpi_int, til_l, counts, displs, mpi_int, comm, ierr)
156 deallocate(counts,displs)
161 allocate(vector_g(npx_g*npy_g*6))
162 allocate(vectorcounts(comm_size), vectordispls(comm_size))
167 do jj = jsc_l(jc),jec_l(jc)
168 do ji = isc_l(jc),iec_l(jc)
172 vectorcounts(jc) = n - vectordispls(jc)
175 if (comm_rank == gproc)
then
178 do jj = jsc_l(jc),jec_l(jc)
179 do ji = isc_l(jc),iec_l(jc)
181 vector_g(n) = field_in(ji,jj,til_l(jc))
187 deallocate(isc_l, iec_l, jsc_l, jec_l)
190 allocate(vector_l(npx_l*npy_l))
192 call mpi_scatterv( vector_g, vectorcounts, vectordispls, mpi_double_precision, &
193 vector_l, npx_l*npy_l, mpi_double_precision, &
196 deallocate(vector_g,vectorcounts,vectordispls)
201 do jj = geom%jsc,geom%jec
202 do ji = geom%isc,geom%iec
204 field_out(ji,jj) = vector_l(n)