45
46
47
48 USE elbufdef_mod
49 use element_mod , only : nixq
50
51
52
53#include "implicit_f.inc"
54
55
56
57#include "com01_c.inc"
58#include "com08_c.inc"
59#include "scr08_a_c.inc"
60#include "param_c.inc"
61#include "task_c.inc"
62
63
64
65 INTEGER, INTENT(IN) :: NRTS, NRTM,NSN,NMN
66 INTEGER IRECT(4,*), NSV(NSN), ILOC(*), IRTL(NSN), ICODE(*), ISKEW(*),
67 . MSR(*), IRECTS(4,*), LMSR(*), NSEG(*),IXQ(NIXQ,*),
68 . IPARG(NPARG,*), IELES(*), IELEM(*),NALE(*) ,
69 . INTTH, IEULT, ISIZES, ISIZEM
70
72 . upw, tstif,ttt, stens,
73 . x(3,*), v(3,*), w(3,*), a(3,*), crst(2,*), skew(lskew,*),
74 . pm(npropm,*),ee(*)
75 TYPE (ELBUF_STRUCT_), TARGET, DIMENSION(NGROUP) :: ELBUF_TAB
76
77
78
79 INTEGER II, N, L, JJ, NN, LL, LL1, LL2, LG, KK, KKK, K1,
80 . I1, IERR, IGROU, IELN,
81 . IXX(4), IPERM(2), JPERM(2),
82 . ITEMP(2), IS, IM, ILEN,
83 . TAGS(ISIZES),TAGM(ISIZEM), LISTS(ISIZES),LISTM(ISIZEM),
84 . ICOMERR(ISIZEM+ISIZES),ICOMNGR(ISIZEM+ISIZES),
85 . ICOMNEL(ISIZEM+ISIZES)
86
88 . vmy, vmz, vy, vz, vv, ny, nz, vt,
89 . nny, nnz, fac, p, ty, tz,
90 . efric, vols, volm, ts, tm ,tstifm, tstifs, dvn,
91 . tstift, phi, areas, aream, vn, wn, stensy, stensz,
92 . comarea(isizem+isizes),comstf(isizem+isizes),
93 . comt(isizem+isizes),comvol(isizem+isizes),combuf(isizem+isizes)
94
95
96 DATA iperm/ 2, 1/,jperm/ 1, -1/
97
98
99
100
101 IF(intth/=zero) THEN
102 IF(ispmd==0) THEN
103 DO ii = 1, nrts
104 tags(ii) = 0
105 ENDDO
106 DO ii = 1, nrtm
107 tagm(ii) = 0
108 ENDDO
109 is = 0
110 im = 0
111 DO ii = 1, nsn
112 l = irtl(ii)
113 IF(iloc(ii)>0.AND.nmn>0)THEN
114 IF(tagm(l)==0)THEN
115 im = im + 1
116 listm(im) = l
117 tagm(l) = im
118 END IF
119 ll1=nseg(ii)
120 ll2=nseg(ii+1)-1
121 DO ll=ll1,ll2
122 lg = lmsr(ll)
123 IF(tags(lg)==0) THEN
124 is = is + 1
125 lists(is) = lg
126 tags(lg) = is
127 ENDIF
128 ENDDO
129 ENDIF
130 ENDDO
131
132
133
134 itemp(1) = is
135 itemp(2) = im
136 ENDIF
137
138
139
140 IF(nspmd > 1) THEN
142 is = itemp(1)
143 im = itemp(2)
144 ilen = im+is
147 END IF
148 DO ii = 1, im
149 l = listm(ii)
150 ix(1) = msr(irect(1,l))
151 ix(2) = msr(irect(2,l))
152 IF(ielem(l)>0) THEN
154 1 ierr ,comarea(ii),comstf(ii),comt(ii),comvol(ii),
155 2 ielem(l) ,x ,ixq(1,ielem(l)),ix ,
156 3 iparg,pm ,elbuf_tab , igrou ,ieln )
157 icomerr(ii) = ierr
158 icomngr(ii) = igrou
159 icomnel(ii) = ieln
160 ELSE
161 comarea(ii) = zero
162 comstf(ii) = zero
163 comt(ii) = zero
164 comvol(ii) = zero
165 icomerr(ii) = 0
166 icomngr(ii) = 0
167 icomnel(ii) = 0
168 ENDIF
169 combuf(ii) = zero
170 ENDDO
171
172 DO ii = 1, is
173 l = lists(ii)
174 ixx(1)=nsv(irects(1,l))
175 ixx(2)=nsv(irects(2,l))
176 IF(ieles(l)>0) THEN
178 1 ierr ,comarea(im+ii),comstf(im+ii),comt(im+ii),comvol(im+ii),
179 2 ieles(l) ,x ,ixq(1,ieles(l)) ,ixx ,
180 3 iparg,pm ,elbuf_tab ,igrou ,ieln )
181 icomerr(im+ii) = ierr
182 icomngr(im+ii) = igrou
183 icomnel(im+ii) = ieln
184 ELSE
185 comarea(im+ii) = zero
186 comstf(im+ii) = zero
187 comt(im+ii) = zero
188 comvol(im+ii) = zero
189 icomerr(im+ii) = 0
190 icomngr(im+ii) = 0
191 icomnel(im+ii) = 0
192 ENDIF
193 combuf(im+ii) = zero
194 ENDDO
195
196 IF (nspmd > 1) THEN
197
198
199
207
208 IF(ispmd/=0) GOTO 900
209 END IF
210
211 ELSE
212 IF(ispmd/=0) RETURN
213 ENDIF
214
215 DO 800 ii=1,nsn
216 ll1=nseg(ii)
217 ll2=nseg(ii+1)-1
218 n=nsv(ii)
219 IF(iloc(ii)>0.AND.nmn>0)THEN
220
221
222
223 l=irtl(ii)
224 DO 10 jj=1,2
225 nn=irect(jj,l)
226 10 ix(jj)=msr(nn)
227
228 h(1) = half*(one - crst(1,ii))
229 h(2) = half*(one + crst(1,ii))
230
231
232
233 vmy=zero
234 vmz=zero
235
236 DO jj=1,2
237 vmy=vmy+w(2,ix(jj))*h(jj)
238 vmz=vmz+w(3,ix(jj))*h(jj)
239 ENDDO
240
241 w(2,n)=vmy
242 w(3,n)=vmz
243
244
245
246 IF(intth/=zero)THEN
247 kk = tagm(l)
248 efric = half * ee(ii) / (ll2-ll1+1)
249 ierr = icomerr(kk)
250 aream = comarea(kk)
251 tstifm = comstf(kk)
252 tm = comt(kk)
253 volm = comvol(kk)
254 IF(ierr==0) THEN
255 DO ll = ll1,ll2
256 lg = lmsr(ll)
257 jj = tags(lg) + im
258 ierr = icomerr(jj)
259 areas = comarea(jj)
260 tstifs = comstf(jj)
261 ts = comt(jj)
262 vols = comvol(jj)
263 IF(ierr==0) THEN
264 tstift = tstifm + tstifs + tstif
265 phi = areas * dt1 * (tm-ts) / tstift
266 combuf(jj) = combuf(jj)
267 + + (efric+phi)/vols
268 combuf(kk) = combuf(kk)
269 + + (efric-phi)/volm
270 ENDIF
271 ENDDO
272 ENDIF
273
274 ENDIF
275
276 ELSEIF(iloc(ii)<0.OR.nmn==0)THEN
277
278
279
280 iloc(ii) = -iloc(ii)
281
282 vy = v(2,n) - w(2,n)
283 vz = v(3,n) - w(3,n)
284 vv =
max(em30,sqrt(vy**2+vz**2))
285 nny = zero
286 nnz = zero
287
288
289
290 DO 300 ll=ll1,ll2
291 lg=lmsr(ll)
292 DO 200 kkk=1,2
293 kk=kkk
294 200 IF(irects(kk,lg)==ii) GO TO 250
295 250 CONTINUE
296
297
298
299 k1 = iperm(kk)
300 i1 = nsv(irects(k1,lg))
301 ty = x(2,i1) - x(2,n)
302 tz = x(3,i1) - x(3,n)
303 ttt =
max(em30,sqrt(ty**2+tz**2))
304
305 vt = v(2,n)*ty + v(3,n)*tz
306 p = onep0001 - upw*(half + sign(half,vt))
307 ny = tz
308 nz =-ty
309
310 fac = p * jperm(kk)
311 nny = nny + ny*fac
312 nnz = nnz + nz*fac
313
314
315
316 stensy = stens * ty / ttt
317 stensz = stens * tz / ttt
318 a(2,n) = a(2,n) + stensy
319 a(3,n) = a(3,n) + stensz
320 300 CONTINUE
321 fac =
max(em30,sqrt(nny**2+nnz**2))
322 nny = nny/fac
323 nnz = nnz/fac
324
325
326
327 IF(icode(n)/=0)THEN
328
329
330
331 dvn = vy * nny + vz * nnz
332 w(2,n) = w(2,n) + dvn * nny
333 w(3,n) = w(3,n) + dvn * nnz
334 CALL bcs2(w(1,n),skew(1,iskew(n)),iskew(n),icode(n))
335 vn = v(2,n)*nny + v(3,n)*nnz
336 wn = w(2,n)*nny + w(3,n)*nnz
337
338
339
340 IF(abs(wn)>em30)THEN
341 fac = vn / wn
342 w(2,n) = w(2,n) * fac
343 w(3,n) = w(3,n) * fac
344 ENDIF
345 ELSEIF(ieult/=0)THEN
346
347
348
349
350 vn = v(2,n) * nny + v(3,n) * nnz
351 w(2,n) = vn * nny
352 w(3,n) = vn * nnz
353 ELSE
354
355
356
357
358 dvn = vy * nny + vz * nnz
359 w(2,n) = w(2,n) + dvn * nny
360 w(3,n) = w(3,n) + dvn * nnz
361 ENDIF
362 ENDIF
363
364 800 CONTINUE
365
366
367
368 900 CONTINUE
369 IF(intth/=zero) THEN
370 IF(nspmd > 1) THEN
371
372
373
375 END IF
376
377
378
379 DO ii = 1, im
380 l = listm(ii)
381 IF(ielem(l)>0) THEN
382 igrou = icomngr(ii)
383 ieln = icomnel(ii)
384 elbuf_tab(igrou)%GBUF%EINT(ieln) =
385 . elbuf_tab(igrou)%GBUF%EINT(ieln) + combuf(ii)
386 ENDIF
387 ENDDO
388
389 DO ii = 1, is
390 l = lists(ii)
391 IF(ieles(l)>0) THEN
392 igrou = icomngr(im+ii)
393 ieln = icomnel(im+ii)
394 elbuf_tab(igrou)%GBUF%EINT(ieln) =
395 . elbuf_tab(igrou)%GBUF%EINT(ieln) + combuf(im+ii)
396 ENDIF
397 ENDDO
398 ENDIF
399
400 RETURN
subroutine bcs2(a, b, j, k)
subroutine i9grd2(ierr, area, tstif, t, vol, ii, x, ixq, ix, iparg, pm, elbuf_tab, igrou, ieln)
subroutine spmd_ibcast(tabi, tabr, n1, n2, from, add)
subroutine spmd_rbcast(tabi, tabr, n1, n2, from, add)
subroutine spmd_glob_dsum9(v, len)
subroutine spmd_glob_isum9(v, len)