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 (*),NOD_PXFEM(*)
58 INTEGER IPLY,IFUNC,EMPSIZPL
59 REAL R4
60
61
62
63#ifdef MPI
64 INTEGER MSGOFF,MSGOFF2,STAT(,NSPMD-1), IERR
65 INTEGER I,N,ND,EMPL,P,ITAG,EMP
66 INTEGER PLYSIZ
68 . vn,val
69
70 REAL , DIMENSION(:,:), ALLOCATABLE :: WRTBUF
72 * , DIMENSION(:,:), ALLOCATABLE :: fsendbuf,frecbuf
73 INTEGER, DIMENSION(:), ALLOCATABLE :: ,IRECBUF
74
75 DATA msgoff/7060/
76 DATA msgoff2/7061/
77
78
79
80 IF (ispmd ==0) THEN
81 plysiz =
plynod(iply)%PLYNUMNODS
82 ALLOCATE(wrtbuf(3,
plysizg(iply)))
83
84
85 DO nd=1,plysiz
87 n = nod_pxfem(i)
88 empl =
plynod(iply)%PLYNODID(nd)-empsizpl
89
90 IF (ifunc==1)THEN
91 wrtbuf(1,empl)=
ply(iply)%V(1,n)
92 wrtbuf(2,empl)=
ply(iply)%V(2,n)
93 wrtbuf(3,empl)=
ply(iply)%V(3,n)
94
95 ELSEIF (ifunc==2)THEN
96 wrtbuf(1,empl)=
ply(iply)%U(1,n)
97 wrtbuf(2,empl)=
ply(iply)%U(2,n)
98 wrtbuf(3,empl)=
ply(iply)%U(3,n)
99
100 ELSEIF (ifunc==3)THEN
101 wrtbuf(1,empl)=
ply(iply)%A(1,n)
102 wrtbuf(2,empl)=
ply(iply)%A(2,n)
103 wrtbuf(3,empl)=
ply(iply)%A(3,n)
104 ELSE
105 wrtbuf(1,empl)= zero
106 wrtbuf(2,empl)= zero
107 wrtbuf(3,empl)= zero
108 ENDIF
109 END DO
110
111 DO p=2,nspmd
115 itag=msgoff
117 . it_spmd(p),itag, spmd_comm_world, stat
118 itag=msgoff2
120 . it_spmd(p),itag, spmd_comm_world, stat, ierr)
121
123 empl = irecbuf(i)-empsizpl
124 wrtbuf(1,empl)=frecbuf(1,i)
125 wrtbuf(2,empl)=frecbuf(2,i)
126 wrtbuf(3,empl)=frecbuf(3,i)
127 ENDDO
128 DEALLOCATE(irecbuf,frecbuf)
129 ENDIF
130 ENDDO
132 DEALLOCATE(wrtbuf)
133 empsizpl = empsizpl +
plysizg(iply)
134 ELSE
135 plysiz =
plynod(iply)%PLYNUMNODS
136 ALLOCATE (fsendbuf(3,plysiz))
137 ALLOCATE (isendbuf(plysiz))
138 IF (plysiz > 0) THEN
139 DO nd=1,plysiz
140 i =
plynod(iply)%NODES(nd)
141 n = nod_pxfem(i)
142
143 IF (ifunc==1)THEN
144 fsendbuf(1,nd) =
ply(iply)%V(1,n)
145 fsendbuf(2,nd) =
ply(iply)%V(2,n)
146 fsendbuf(3,nd) =
ply(iply)%V(3,n)
147
148 ELSEIF (ifunc==2)THEN
149 fsendbuf(1,nd) =
ply(iply)%U(1,n)
150 fsendbuf(2,nd) =
ply(iply)%U(2,n)
151 fsendbuf(3,nd) =
ply(iply)%U(3,n)
152
153 ELSEIF (ifunc==3)THEN
154 fsendbuf(1,nd) =
ply(iply)%A(1,n)
155 fsendbuf(2,nd) =
ply(iply)%A(2,n)
156 fsendbuf(3,nd) =
ply(iply)%A(3,n)
157 ELSE
158 fsendbuf(1,nd) = zero
159 fsendbuf(2,nd) = zero
160 fsendbuf(3,nd) = zero
161 ENDIF
162
163 isendbuf(nd) =
plynod(iply)%PLYNODID(nd)
164 END DO
165
166 itag=msgoff
167 CALL mpi_send(isendbuf,plysiz,mpi_integer,it_spmd(1),
168 . itag,spmd_comm_world,ierr)
169
170 itag=msgoff2
171 CALL mpi_send(fsendbuf,plysiz*3,real,it_spmd(1),
172 . itag,spmd_comm_world,ierr)
173
174 DEALLOCATE(isendbuf,fsendbuf)
175 ENDIF
176 ENDIF
177
178#endif
179 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)