46
47
48
49 USE elbufdef_mod
50 use element_mod , only : nixs
51
52
53
54#include "implicit_f.inc"
55
56
57
58#include "com01_c.inc"
59#include "com08_c.inc"
60#include "scr08_a_c.inc"
61#include "param_c.inc"
62#include "task_c.inc"
63
64
65
66 INTEGER, INTENT(IN) :: NRTS, NRTM, NSN,NMN
67 INTEGER IRECT(4,*), NSV(NSN), ILOC(*), IRTL(NSN), ICODE(*), ISKEW(*),
68 . MSR(*), IRECTS(4,*), LMSR(*), NSEG(*),IXS(NIXS,*),
69 . IPARG(NPARG,*), IELES(*), IELEM(*),NALE(*) ,
70 . INTTH, IEULT, ISIZES, ISIZEM
71
73 . upw, tstif,ttt, stens,
74 . x(3,*), v(3,*), w(3,*), a(3,*), crst(2,*), skew(lskew,*),
75 . pm(npropm,*),ee(*),nor(3,*)
76 TYPE (ELBUF_STRUCT_), TARGET, DIMENSION(NGROUP) :: ELBUF_TAB
77
78
79
80 INTEGER II, N, L, JJ, NN, LL, LL1, LL2, LG, KK, KKK, K1, ,
81 . I1, I2, IERR, IGROU, IELN,
82 . IXX(4), IPERM(0:5),
83 . ITEMP(2), IS, IM, ILEN,
84 . TAGS(ISIZES),TAGM(ISIZEM), LISTS(ISIZES),LISTM(ISIZEM),
85 . ICOMERR(ISIZEM+ISIZES),ICOMNGR(ISIZEM+ISIZES),
86 . ICOMNEL(ISIZEM+ISIZES)
87
89 . h(4), vmx, vmy, vmz, vx, vy, vz, vv, nx, ny, nz, vt,
90 . nnx, nny, nnz, fac, p, x1, y1, z1,x2, y2, z2, tx, ty, tz,
91 . efric, vols, volm, ts, tm ,tstifm, tstifs, dvn, tt2, tt3,
92 . tstift, phi, areas, aream, vn, wn, t2x, t2y, t2z, t2t,
93 . t3x, t3y, t3z, stensx, stensy, stensz,
94 . comarea(isizem+isizes),comstf(isizem+isizes),
95 . comt(isizem+isizes),comvol(isizem+isizes),combuf(isizem+isizes)
96
97
98 DATA iperm/ 4, 1, 2, 3, 4, 1/
99
100
101
102
103 IF(intth/=zero) THEN
104 IF(ispmd==0) THEN
105 DO ii = 1, nrts
106 tags(ii) = 0
107 ENDDO
108 DO ii = 1, nrtm
109 tagm(ii) = 0
110 ENDDO
111 is = 0
112 im = 0
113 DO ii = 1, nsn
114 l = irtl(ii)
115 IF(iloc(ii)>0.AND.nmn>0.AND.tagm(l)==0)THEN
116 im = im + 1
117 listm(im) = l
118 tagm(l) = im
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 ix(3) = msr(irect(3,l))
153 ix(4) = msr(irect(4,l))
154 IF(ielem(l)>0) THEN
156 1 ierr ,comarea(ii),comstf(ii),comt(ii),comvol(ii),
157 2 ielem(l) ,x ,ixs(1,ielem(l)), ix,
158 3 iparg,pm ,elbuf_tab ,igrou ,ieln )
159 icomerr(ii) = ierr
160 icomngr(ii) = igrou
161 icomnel(ii) = ieln
162 ELSE
163 comarea(ii) = zero
164 comstf(ii) = zero
165 comt(ii) = zero
166 comvol(ii) = zero
167 icomerr(ii) = 0
168 icomngr(ii) = 0
169 icomnel(ii) = 0
170 ENDIF
171 combuf(ii) = zero
172 ENDDO
173
174 DO ii = 1, is
175 l = lists(ii)
176 ixx(1)=nsv(irects(1,l))
177 ixx(2)=nsv(irects(2,l))
178 ixx(3)=nsv(irects(3,l))
179 ixx(4)=nsv(irects(4,l))
180 IF(ieles(l)>0) THEN
182 1 ierr ,comarea(im+ii),comstf(im+ii),comt(im+ii),comvol(im+ii),
183 2 ieles(l) ,x,ixs(1,ieles(l)) ,ixx ,
184 3 iparg,pm ,elbuf_tab ,igrou ,ieln )
185 icomerr(im+ii) = ierr
186 icomngr(im+ii) = igrou
187 icomnel(im+ii) = ieln
188 ELSE
189 comarea(im+ii) = zero
190 comstf(im+ii) = zero
191 comt(im+ii) = zero
192 comvol(im+ii) = zero
193 icomerr(im+ii) = 0
194 icomngr(im+ii) = 0
195 icomnel(im+ii) = 0
196 ENDIF
197 combuf(im+ii) = zero
198 ENDDO
199
200 IF (nspmd > 1) THEN
201
202
203
211
212 IF(ispmd/=0) GOTO 900
213 END IF
214
215 ELSE
216 IF(ispmd/=0) RETURN
217 ENDIF
218
219 DO 800 ii=1,nsn
220 ll1=nseg(ii)
221 ll2=nseg(ii+1)-1
222 n=nsv(ii)
223 IF(iloc(ii)>0.AND.nmn>0)THEN
224
225
226
227 l=irtl(ii)
228 DO 10 jj=1,4
229 nn=irect(jj,l)
230 10 ix(jj)=msr(nn)
231
232 CALL shapeh(h,crst(1,ii),crst(2,ii))
233
234
235
236 vmx=zero
237 vmy=zero
238 vmz=zero
239
240 DO 30 jj=1,4
241 vmx=vmx+w(1,ix(jj))*h(jj)
242 vmy=vmy+w(2,ix(jj))*h(jj)
243 30 vmz=vmz+w(3,ix(jj))*h(jj)
244
245 dvn = (vmx-w(1,n)) * nor(1,ii)
246 . + (vmy-w(2,n)) * nor(2,ii)
247 . + (vmz-w(3,n)) * nor(3,ii)
248 w(1,n) = w(1,n) + dvn * nor(1,ii)
249 w(2,n) = w(2,n) + dvn * nor(2,ii)
250 w(3,n) = w(3,n) + dvn * nor(3,ii)
251
252
253
254
255 IF(intth/=zero)THEN
256 kk = tagm(l)
257 efric = half * ee(ii) / (ll2-ll1+1)
258 ierr = icomerr(kk)
259 aream = comarea(kk)
260 tstifm = comstf(kk)
261 tm = comt(kk)
262 volm = comvol(kk)
263 IF(ierr==0) THEN
264 DO ll = ll1,ll2
265 lg = lmsr(ll)
266 jj = tags(lg) + im
267 ierr = icomerr(jj)
268 areas = comarea(jj)
269 tstifs = comstf(jj)
270 ts = comt(jj)
271 vols = comvol(jj)
272 IF(ierr==0) THEN
273 tstift = tstifm + tstifs + tstif
274 phi = areas * dt1 * (tm-ts) / tstift
275 combuf(jj) = combuf(jj)
276 + + (efric+phi)/vols
277 combuf(kk) = combuf(kk)
278 + + (efric-phi)/volm
279 ENDIF
280 ENDDO
281 ENDIF
282
283 ENDIF
284
285 ELSEIF(iloc(ii)<0.OR.nmn==0)THEN
286
287
288
289 iloc(ii) = -iloc(ii)
290
291 vx = v(1,n) - w(1,n)
292 vy = v(2,n) - w(2,n)
293 vz = v(3,n) - w(3,n)
294 vv =
max(em30,sqrt(vx**2+vy**2+vz**2))
295 nnx = zero
296 nny = zero
297 nnz = zero
298
299
300
301 DO 300 ll=ll1,ll2
302 lg=lmsr(ll)
303 DO 200 kkk=1,4
304 kk=kkk
305 200 IF(irects(kk,lg)==ii) GO TO 250
306 250 CONTINUE
307
308
309
310 k1 = iperm(kk-1)
311 k2 = iperm(kk+1)
312 i1 = nsv(irects(k1,lg))
313 i2 = nsv(irects(k2,lg))
314 x1 = x(1,i1) - x(1,n)
315 y1 = x(2,i1) - x(2,n)
316 z1 = x(3,i1) - x(3,n)
317 x2 = x(1,i2) - x(1,n)
318 y2 = x(2,i2) - x(2,n)
319 z2 = x(3,i2) - x(3,n)
320 tx = x1 + x2
321 ty = y1 + y2
322 tz = z1 + z2
323 ttt =
max(em30,sqrt(tx**2+ty**2+tz**2))
324 vt = v(1,n)*tx + v(2,n)*ty + v(3,n)*tz
325 p = onep0001 - upw*(half + sign(half,vt))
326 nx = y1 * z2 - z1 * y2
327 ny = z1 * x2 - x1 * z2
328 nz = x1 * y2 - y1 * x2
329
330 fac = p
331 nnx = nnx + nx*fac
332 nny = nny + ny*fac
333 nnz = nnz + nz*fac
334
335
336
337 IF(stens>zero)THEN
338 t2x = -x1 + x2
339 t2y = -y1 + y2
340 t2z = -z1 + z2
341 tt2 =
max(em30,t2x**2+t2y**2+t2z**2)
342 t2t = (t2x*tx + t2y*ty +t2z*tz) / tt2
343 t3x = tx - t2x * t2t
344 t3y = ty - t2y * t2t
345 t3z = tz - t2z * t2t
346 tt3 = stens * sqrt(tt2/
max(em30,t3x**2+t3y**2+t3z**2))
347 stensx = t3x * tt3
348 stensy = t3y * tt3
349 stensz = t3z * tt3
350 a(1,n) = a(1,n) + stensx
351 a(2,n) = a(2,n) + stensy
352 a(3,n) = a(3,n) + stensz
353 ENDIF
354 300 CONTINUE
355 fac =
max(em30,sqrt(nnx**2+nny**2+nnz**2))
356 nnx = nnx/fac
357 nny = nny/fac
358 nnz = nnz/fac
359
360
361
362
363
364
365
366 IF(icode(n)/=0)THEN
367 dvn = vx * nnx + vy * nny + vz * nnz
368 w(1,n) = w(1,n) + dvn * nnx
369 w(2,n) = w(2,n) + dvn * nny
370 w(3,n) = w(3,n) + dvn * nnz
371 CALL bcs2(w(1,n),skew(1,iskew(n)),iskew(n),icode(n))
372 vn = v(1,n)*nnx + v(2,n)*nny + v(3,n)*nnz
373 wn = w(1,n)*nnx + w(2,n)*nny + w(3,n)*nnz
374
375
376
377 IF(abs(wn)>em30)THEN
378 fac = vn / wn
379 w(1,n) = w(1,n) * fac
380 w(2,n) = w(2,n) * fac
381 w(3,n) = w(3,n) * fac
382 ENDIF
383 ELSEIF(ieult/=0)THEN
384
385
386
387
388 vn = v(1,n)*nnx + v(2,n)*nny + v(3,n)*nnz
389 w(1,n) = vn * nnx
390 w(2,n) = vn * nny
391 w(3,n) = vn * nnz
392 ELSE
393
394
395
396
397 dvn = vx * nnx + vy * nny + vz * nnz
398 w(1,n) = w(1,n) + dvn * nnx
399 w(2,n) = w(2,n) + dvn * nny
400 w(3,n) = w(3,n) + dvn * nnz
401 ENDIF
402 ENDIF
403
404 800 CONTINUE
405
406
407
408 900 CONTINUE
409 IF(intth/=zero) THEN
410 IF(nspmd > 1) THEN
411
412
413
415 END IF
416
417
418
419 DO ii = 1, im
420 l = listm(ii)
421 IF(ielem(l)>0) THEN
422 igrou = icomngr(ii)
423 ieln = icomnel(ii)
424 elbuf_tab(igrou)%GBUF%EINT(ieln) =
425 . elbuf_tab(igrou)%GBUF%EINT(ieln) + combuf(ii)
426 ENDIF
427 ENDDO
428
429 DO ii = 1, is
430 l = lists(ii)
431 IF(ieles(l)>0) THEN
432 igrou = icomngr(im+ii)
433 ieln = icomnel(im+ii)
434 elbuf_tab(igrou)%GBUF%EINT(ieln) =
435 . elbuf_tab(igrou)%GBUF%EINT(ieln) + combuf(im+ii)
436 ENDIF
437 ENDDO
438 ENDIF
439
440 RETURN
subroutine bcs2(a, b, j, k)
subroutine i9grd3(ierr, area, tstif, t, vol, ii, x, ixs, ix, iparg, pm, elbuf_tab, igrou, ieln)
subroutine shapeh(h, s, t)
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)