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