35
36
37
39
40
41
42 USE spmd_comm_world_mod, ONLY : spmd_comm_world
43#include "implicit_f.inc"
44
45
46
47#include "spmd.inc"
48
49
50
51#include "task_c.inc"
52
53
54
55 INTEGER NBID1, NBID2, NBID3, FVEL2FA(*), FVINUM(*), FVOFF(2,*)
56
57
58
59#ifdef MPI
60 INTEGER ELOFF, I, PMAIN, II, J, K, KK, N, NN, INOD(4), NND,
61 . ITAG, MSGOFF, LEN, JJ, IAD, IADE, IADF,
62 . STAT(MPI_STATUS_SIZE), IERR, NNTR
63 INTEGER, DIMENSION(:), ALLOCATABLE :: ITAGT, IBUF
64
65 DATA msgoff/7040/
66
67
71 IF (ispmd==0) THEN
72 IF (ispmd==pmain-1) THEN
73 ALLOCATE(itagt(
fvdata(i)%NNTR))
74 ii=0
76 itagt(j)=0
77 ENDDO
78
79 DO j=1,
fvdata(i)%NPOLH_ANIM
80 DO k=
fvdata(i)%IFVPADR_ANIM(j),
81 .
fvdata(i)%IFVPADR_ANIM(j+1)-1
82 kk=
fvdata(i)%IFVPOLH_ANIM(k)
83 DO n=
fvdata(i)%IFVTADR_ANIM(kk),
84 .
fvdata(i)%IFVTADR_ANIM(kk+1)-1
85 nn=
fvdata(i)%IFVPOLY_ANIM(n)
86 IF (itagt(nn)==1) cycle
87 inod(1)=fvoff(1,i)+
fvdata(i)%IFVTRI_ANIM(1,nn)-1
88 inod(2)=fvoff(1,i)+
fvdata(i)%IFVTRI_ANIM(2,nn)-1
89 inod(3)=fvoff(1,i)+
fvdata(i)%IFVTRI_ANIM(3,nn)-1
90 inod(4)=inod(3)
91 ii=ii+1
92
93 nnd=1
94 IF (inod(2)/=inod(1)) nnd=nnd+1
95 IF (inod(3)/=inod(1).AND.
96 . inod(3)/=inod(2)) nnd=nnd+1
97 IF (nnd/=3) THEN
98 inod(1)=nbid1-1
99 inod(2)=nbid2-1
100 inod(3)=nbid3-1
101 inod(4)=inod(3)
102 ENDIF
103
105 itagt(nn)=1
108 ENDDO
109 ENDDO
110 ENDDO
112 DEALLOCATE(itagt)
113 ELSE
114 itag=msgoff
115 CALL mpi_recv(nntr, 1, mpi_integer, it_spmd(pmain),
116 . itag, spmd_comm_world, stat, ierr)
117
118 len=6*nntr
119 ALLOCATE(ibuf(len))
120 itag=msgoff+1
121 CALL mpi_recv(ibuf, len, mpi_integer, it_spmd(pmain),
122 . itag, spmd_comm_world, stat, ierr)
123
124 jj=0
125 DO j=1,nntr
126 inod(1)=fvoff(1,i)+ibuf(jj+1)
127 inod(2)=fvoff(1,i)+ibuf(jj+2)
128 inod(3)=fvoff(1,i)+ibuf(jj+3)
129 inod(4)=fvoff(1,i)+ibuf(jj+4)
130
131
132 nnd=1
133 IF (inod(2)/=inod(1)) nnd=nnd+1
134 IF (inod(3)/=inod(1).AND.
135 . inod(3)/=inod(2)) nnd=nnd+1
136 IF (nnd/=3) THEN
137 inod(1)=nbid1-1
138 inod(2)=nbid2-1
139 inod(3)=nbid3-1
140 inod(4)=inod(3)
141 ENDIF
142
144 jj=jj+4
145
148 ENDDO
150 DEALLOCATE(ibuf)
151 ENDIF
152 ELSE
153 IF (ispmd==pmain-1) THEN
154 itag=msgoff
156 . it_spmd(1), itag, spmd_comm_world,
157 . ierr)
158
160 ALLOCATE(ibuf(len), itagt(
fvdata(i)%NNTR))
161 ii=0
162 iad=0
165
167 itagt(j)=0
168 ENDDO
169
170 DO j=1,
fvdata(i)%NPOLH_ANIM
171 DO k=
fvdata(i)%IFVPADR_ANIM(j),
172 .
fvdata(i)%IFVPADR_ANIM(j+1)-1
173 kk=
fvdata(i)%IFVPOLH_ANIM(k)
174 DO n=
fvdata(i)%IFVTADR_ANIM(kk),
175 .
fvdata(i)%IFVTADR_ANIM(kk+1)-1
176 nn=
fvdata(i)%IFVPOLY_ANIM(n)
177 IF (itagt(nn)==1) cycle
178 inod(1)=
fvdata(i)%IFVTRI_ANIM(1,nn)-1
179 inod(2)=
fvdata(i)%IFVTRI_ANIM(2,nn)-1
180 inod(3)=
fvdata(i)%IFVTRI_ANIM(3,nn)-1
181 inod(4)=inod(3)
182 ii=ii+1
183
184 ibuf(iad+1)=inod(1)
185 ibuf(iad+2)=inod(2)
186 ibuf(iad+3)=inod(3)
187 ibuf(iad+4)=inod(4)
188 iad=iad+4
189 itagt(nn)=1
190 ibuf(iade+nn)=ii
191 ibuf(iadf+ii)=nn
192 ENDDO
193 ENDDO
194 ENDDO
195 itag=msgoff+1
196 CALL mpi_send(ibuf, len, mpi_integer, it_spmd(1),
197 . itag, spmd_comm_world, ierr)
198
199 DEALLOCATE(ibuf, itagt)
200 ENDIF
201 ENDIF
202 ENDDO
203
204#endif
205 RETURN
subroutine eloff(ixs, ixq, ixc, ixp, ixt, ixr, ixtg, iparg, iactiv, time, iflag, nn, elbuf_tab, x, temp, mcp, pm, igroups, mcp_off, igrbric, igrquad, igrsh4n, igrsh3n, igrtruss, igrbeam, igrspring, itherm_fe)
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
type(fvbag_spmd), dimension(:), allocatable fvspmd
type(fvbag_data), dimension(:), allocatable fvdata
void write_i_c(int *w, int *len)