36
37
38
40
41
42
43 USE spmd_comm_world_mod, ONLY : spmd_comm_world
44#include "implicit_f.inc"
45
46
47
48#include "spmd.inc"
49
50
51
52#include "com01_c.inc"
53#include "task_c.inc"
54
55
56
57 INTEGER NODGLOB(*),NOD_PXFEM(*)
58 INTEGER IPLY,IFUNC,EMPSIZPL
59
60
61
62
63#ifdef MPI
64 INTEGER MSGOFF,MSGOFF2,STAT(MPI_STATUS_SIZE,NSPMD-1), IERR
65 INTEGER I, , ND, EMPL, P, ITAG
66 INTEGER PLYSIZ
67
68 REAL , DIMENSION(:,:), ALLOCATABLE :: WRTBUF
70 * , DIMENSION(:,:), ALLOCATABLE :: fsendbuf,frecbuf
71 INTEGER, DIMENSION(:), ALLOCATABLE :: ISENDBUF,IRECBUF
72
73 DATA msgoff/7060/
74 DATA msgoff2/7061/
75
76
77
78 IF (ispmd ==0) THEN
79 plysiz =
plynod(iply)%PLYNUMNODS
80 ALLOCATE(wrtbuf(3,
plysizg(iply)))
81
82
83 DO nd=1,plysiz
85 n = nod_pxfem(i)
86 empl =
plynod(iply)%PLYNODID(nd)-empsizpl
87
88 IF (ifunc==1)THEN
89 wrtbuf(1,empl)=
ply(iply)%V(1,n)
90 wrtbuf(2,empl)=
ply(iply)%V(2,n)
91 wrtbuf(3,empl)=
ply(iply)%V(3,n)
92
93 ELSEIF (ifunc==2)THEN
94 wrtbuf(1,empl)=
ply(iply)%U(1,n)
95 wrtbuf(2,empl)=
ply(iply)%U(2,n)
96 wrtbuf(3,empl)=
ply(iply)%U(3,n)
97
98 ELSEIF (ifunc==3)THEN
99 wrtbuf(1,empl)=
ply(iply)%A(1,n)
100 wrtbuf(2,empl)=
ply(iply)%A(2,n)
101 wrtbuf(3,empl)=
ply(iply)%A(3,n)
102 ELSE
103 wrtbuf(1,empl)= zero
104 wrtbuf(2,empl)= zero
105 wrtbuf(3,empl)= zero
106 ENDIF
107 END DO
108
109 DO p=2,nspmd
113 itag=msgoff
115 . it_spmd(p),itag, spmd_comm_world, stat, ierr)
116 itag=msgoff2
118 . it_spmd(p),itag, spmd_comm_world, stat, ierr)
119
121 empl = irecbuf(i)-empsizpl
122 wrtbuf(1,empl)=frecbuf(1,i)
123 wrtbuf(2,empl)=frecbuf(2,i)
124 wrtbuf(3,empl)=frecbuf(3,i)
125 ENDDO
126 DEALLOCATE(irecbuf,frecbuf)
127 ENDIF
128 ENDDO
130 DEALLOCATE(wrtbuf)
131 empsizpl = empsizpl +
plysizg(iply)
132 ELSE
133 plysiz =
plynod(iply)%PLYNUMNODS
134 ALLOCATE (fsendbuf(3,plysiz))
135 ALLOCATE (isendbuf(plysiz))
136 IF (plysiz > 0) THEN
137 DO nd=1,plysiz
138 i =
plynod(iply)%NODES(nd)
139 n = nod_pxfem(i)
140
141 IF (ifunc==1)THEN
142 fsendbuf(1,nd) =
ply(iply)%V(1,n)
143 fsendbuf(2,nd) =
ply(iply)%V(2,n)
144 fsendbuf(3,nd) =
ply(iply)%V(3,n)
145
146 ELSEIF (ifunc==2)THEN
147 fsendbuf(1,nd) =
ply(iply)%U(1,n)
148 fsendbuf(2,nd) =
ply(iply)%U(2,n)
149 fsendbuf(3,nd) =
ply(iply)%U(3,n)
150
151 ELSEIF (ifunc==3)THEN
152 fsendbuf(1,nd) =
ply(iply)%A(1,n)
153 fsendbuf(2,nd) =
ply(iply)%A(2,n)
154 fsendbuf(3,nd) =
ply(iply)%A(3,n)
155 ELSE
156 fsendbuf(1,nd) = zero
157 fsendbuf(2,nd) = zero
158 fsendbuf(3,nd) = zero
159 ENDIF
160
161 isendbuf(nd) =
plynod(iply)%PLYNODID(nd)
162 END DO
163
164 itag=msgoff
165 CALL mpi_send(isendbuf,plysiz,mpi_integer,it_spmd(1),
166 . itag,spmd_comm_world,ierr)
167
168 itag=msgoff2
169 CALL mpi_send(fsendbuf,plysiz*3,real,it_spmd(1),
170 . itag,spmd_comm_world,ierr)
171
172 DEALLOCATE(isendbuf,fsendbuf)
173 ENDIF
174 ENDIF
175
176#endif
177 RETURN
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
type(plynods), dimension(:), allocatable plynod
type(ply_data), dimension(:), allocatable ply
integer, dimension(:), allocatable plysizg
integer, dimension(:,:), allocatable plyiadnod
void write_r_c(float *w, int *len)