39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
67 USE elbufdef_mod
69 use element_mod , only : nixs
70
71
72
73#include "implicit_f.inc"
74
75
76
77#include "mvsiz_p.inc"
78
79
80
81#include "param_c.inc"
82#include "inter22.inc"
83#include "task_c.inc"
84#include "com01_c.inc"
85#include "com04_c.inc"
86#include "com08_c.inc"
87
88
89
90 INTEGER :: IXS(NIXS,*), IPARG(NPARG,*),ISILENT, NV46,IPM(NPROPMI,*)
91 my_real :: pm(npropm,*),flux(6,*), flu1(*),x(3,*)
92 TYPE (ELBUF_STRUCT_), DIMENSION(NGROUP),TARGET :: ELBUF_TAB
93 my_real,
INTENT(IN) :: w(3,numnod)
94
95
96
97 INTEGER MAT, MLW, NC(8), I, IE,J, K, Kv,L,ITASK, IDm, IDV, II
98 INTEGER IDvm, IBvm, NGvm, IEvm, IEV, Jm, IMAT, IALEFVM_FLG
99 INTEGER IB,IBv, NIN, NBCUT, ICELL,NCELL,NGm
100 my_real :: cellflux(6,9,
nb,5),reduc,upwl(6)
102 INTEGER :: NBF,NBL, MCELL,iNOD,ICELLv, numnod_, numnod_V
103 TYPE(G_BUFEL_) ,POINTER :: GBUF
104 my_real :: face , z(3), zadj(3), zzadj_, cf(3), zcf(3),zzadj(3)
106 INTEGER :: NUM, NADJ, IADJ, JV, NG, IE_M, IEm, IBm
107 my_real :: facev, ddvol, valel(6), valvois(6,6,5), sr1, sr2, srf
108 my_real :: wface(3), wfacev(3), wfaceb(3,6)
109 LOGICAL debug_outp
110 INTEGER :: NC1,NC2,NC3,NC4,NC5,NC6,NC7,NC8
111
112
113
114 IF(int22 == 0)RETURN
115
116
117
118 ibvm = 0
119
120
121
122 nin = 1
123 nbf = 1+itask*
nb/nthread
124 nbl = (itask+1)*
nb/nthread
126
127
128
129
130
131 debug_outp = .false.
133 debug_outp = .false.
135 do ib=nbf,nbl
138 enddo
140 debug_outp = .true.
141 endif
142 endif
143 if(debug_outp)then
144 print *, " |---------eflux3_int22_fvm.F---------|"
145 print *, " | THREAD INFORMATION |"
146 print *, " |------------------------------------|"
147 print *, " NCYCLE =", ncycle
148 endif
149
150
151
152
153
154
155
156
157 DO ib=nbf,nbl
163 icell = 0
164
165
166
167
168 flux(1:6,ie) = zero
169 flu1(ie) = zero
170
171
172
173
174
175
176
180 DO j=1,nv46
181 lnorm(j) = sqrt(
norm(1,j)**2 +
norm(2,j)**2 +
norm(3,j)**2 )
182 norm(1:3,j) =
norm(1:3,j) / lnorm(j)
183 ENDDO
184
185
186
187
188
189 ii = ie
190 nc1 = ixs(2,ii)
191 nc2 = ixs(3,ii)
192 nc3 = ixs(4,ii)
193 nc4 = ixs(5,ii)
194 nc5 = ixs(6,ii)
195 nc6 = ixs(7,ii)
196 nc7 = ixs(8,ii)
197 nc8 = ixs(9,ii)
198
199 wfaceb(1,1) = fourth*(w(1,nc1)+w(1,nc2)+w(1,nc3)+w(1,nc4))
200 wfaceb(2,1) = fourth*(w(2,nc1)+w(2,nc2)+w(2,nc3)+w(2,nc4))
201 wfaceb(3,1) = fourth*(w(3,nc1)+w(3,nc2)+w(3,nc3)+w(3,nc4))
202
203 wfaceb(1,2) = fourth*(w(1,nc3)+w(1,nc4)+w(1,nc7)+w(1,nc8))
204 wfaceb(2,2) = fourth*(w(2,nc3)+w(2,nc4)+w(2,nc7)+w(2,nc8))
205 wfaceb(3,2) = fourth*(w(3,nc3)+w(3,nc4)+w(3,nc7)+w(3,nc8))
206
207
208 wfaceb(1,3) = fourth*(w(1,nc5)+w(1,nc6)+w(1,nc7)+w(1,nc8))
209 wfaceb(2,3) = fourth*(w(2,nc5)+w(2,nc6)+w(2,nc7)+w(2,nc8))
210 wfaceb(3,3) = fourth*(w(3,nc5)+w(3,nc6)+w(3,nc7)+w(3,nc8))
211
212 wfaceb(1,4) = fourth*(w(1,nc1)+w(1,nc2)+w(1,nc5)+w(1,nc6))
213 wfaceb(2,4) = fourth*(w(2,nc1)+w(2,nc2)+w(2,nc5)+w(2,nc6))
214 wfaceb(3,4) = fourth*(w(3,nc1)+w(3,nc2)+w(3,nc5)+w(3,nc6))
215
216 wfaceb(1,5) = fourth*(w(1,nc2)+w(1,nc3)+w(1,nc6)+w(1,nc7))
217 wfaceb(2,5) = fourth*(w(2,nc2)+w(2,nc3
218 wfaceb(3,5) = fourth*(w(3,nc2)+w(3,nc3)+w(3,nc6)+w(3,nc7))
219
220 wfaceb(1,6) = fourth*(w(1,nc1)+w(1,nc4)+w(1,nc5)+w(1,nc8))
221 wfaceb(2,6) = fourth*(w(2,nc1)+w(2,nc4)+w(2,nc5)+w(2,nc8))
222 wfaceb(3,6) = fourth*(w(3,nc1)+w(3,nc4)+w(3,nc5)+w(3,nc8))
223
224 IF(nbcut==0)THEN
225 brick_list(nin,ib)%POLY(1)%FACE(1)%W(1:3) = wfaceb(1:3,1)
226 brick_list(nin,ib)%POLY(1)%FACE(2)%W(1:3) = wfaceb(1:3,2)
227 brick_list(nin,ib)%POLY(1)%FACE(3)%W(1:3) = wfaceb(1:3,3)
228 brick_list(nin,ib)%POLY(1)%FACE(4)%W(1:3) = wfaceb(1:3,4)
229 brick_list(nin,ib)%POLY(1)%FACE(5)%W(1:3) = wfaceb(1:3,5)
230 brick_list(nin,ib)%POLY(1)%FACE(6)%W(1:3) = wfaceb(1:3,6)
231 ENDIF
232
233
234
235
236 DO WHILE (icell<=ncell)
237 icell = icell +1
238 IF (icell>ncell .AND. ncell/=0)icell=9
240 jm =
brick_list(nin,ib)%POLY(icell)%WhereIsMain(1)
241 iem =
brick_list(nin,ib)%POLY(icell)%WhereIsMain(3)
245 gbuf =>elbuf_tab(ngm)%GBUF
247 valel(2)
252 sr1 = sqrt(valel(4))
253 DO j=1,nv46
254 nadj =
brick_list(nin,ib)%POLY(icell)%FACE(j)%NAdjCell
258 cellflux(j,icell,ib,1:5) = zero
259 DO iadj=1,nadj
260 icellv =
brick_list(nin,ib)%POLY(icell)%FACE(j)%Adjacent_Cell(iadj)
261 IF(icellv==0)THEN
262 valvois(j,1:3,iadj) = -valel
263 valvois(j,4,iadj) = valel(4)
264 ELSE
265
266 IF(ibvTHEN
267 ievm =
brick_list(nin,ibv)%POLY(icellv)%WhereIsMain(3)
268 ibvm =
brick_list(nin,ibv)%POLY(icellv)%WhereIsMain(4)
277 ELSE
278
285 ENDIF
286 ENDIF
287 sr2 = sqrt(valvois(j,4,iadj))
288
289
290
291 imat = ixs(1,ie)
292 ialefvm_flg = ipm(251,imat)
294
295 vf = zero
297 CASE(1)
298
299 vf(1) = half * (valel(1)/valel(4)+valvois(j,1,iadj)/valvois(j,4,iadj))
300 vf(2) = half * (valel(2)/valel(4)+valvois(j,2,iadj)/valvois(j,4,iadj))
301 vf(3) = half * (valel(3)/valel(4)+valvois(j,3,iadj)/valvois(j,4,iadj))
302 vf(1) = vf(1)
303 vf(2) = vf(2)
304 vf(3) = vf(3)
305 CASE(2)
306
307 vf(1) = (valel(1)+valvois(j,1,iadj))/(valel(4)+valvois(j,4,iadj))
308 vf(2) = (valel(2)+valvois(j,2,iadj))/(valel(4)+valvois(j,4,iadj))
309 vf(3) = (valel(3)+valvois(j,3,iadj))/(valel(4)+valvois(j,4,iadj))
310 vf(1) = vf(1)
311 vf(2) = vf(2)
312 vf(3) = vf(3)
313 CASE(3)
314
315 vf(1) = (valel(1)/sr1+valvois(j,1,iadj)/sr2)/(sr1+sr2)
316 vf(2) = (valel(2)/sr1+valvois(j,2,iadj)/sr2)/(sr1+sr2)
317 vf(3) = (valel(3)/sr1+valvois(j,3,iadj)/sr2)/(sr1+sr2)
318 vf(1) = vf(1)
319 vf(2) = vf(2)
320 vf(3) = vf(3)
321 CASE(4)
322 IF(dt1==zero)THEN
323 vf(1) = (valel(1) +valvois(j,1,iadj) )
324 . /(valel(4) +valvois(j,4,iadj) )
325 vf(2) = (valel(2) +valvois(j,2,iadj) )
326 . /(valel(4) +valvois(j,4,iadj) )
327 vf(3) = (valel(3) +valvois(j,3,iadj) )
328 . /(valel(4) +valvois(j,4,iadj) )
329 ELSE
330
331
332 vf(1) = (valel(1)*valel(5)+valvois(j,1,iadj)*valvois(j,5,iadj))
333 . /(valel(4)*valel(5)+valvois(j,4,iadj)*valvois(j,5,iadj))
334 vf(2) = (valel(2)*valel(5)+valvois(j,2,iadj)*valvois(j,5,iadj))
335 . /(valel(4)*valel(5)+valvois(j,4,iadj)*valvois(j,5,iadj))
336 vf(3) = (valel(3)*valel(5)+valvois(j,3,iadj)*valvois(j,5,iadj))
337 . /(valel(4)*valel(5)+valvois(j,4,iadj)*valvois(j,5,iadj))
338
339 ENDIF
340 vf(1) = vf(1)
341 vf(2) = vf(2)
342 vf(3) = vf(3)
343
344 CASE(5)
345
346 IF(dt1==zero)THEN
347 vf(1) = (valel(1) +valvois(j,1,iadj) )
348 . /(valel(4) +valvois(j,4,iadj) )
349 vf(2) = (valel(2) +valvois(j,2,iadj) )
350 . /(valel(4) +valvois(j,4,iadj) )
351 vf(3) = (valel(3) +valvois(j,3,iadj) )
352 . /(valel(4) +valvois(j,4,iadj) )
353 ELSE
354 term2 = ( valel(6)-valvois(j,6,iadj) )/ (valel(4)*valel(5)+valvois(j,4,iadj)*valvois(j,5,iadj))
355 vf(1) = (valel(1)*valel(5)+valvois(j,1,iadj)*valvois(j,5,iadj))
356 . /(valel(4)*valel(5)+valvois(j,4,iadj)*valvois(j,5,iadj)) + term2 *
norm(1,j)
357 vf(2) = (valel(2)*valel(5)+valvois(j,2,iadj)*valvois(j,5,iadj))
358 . /(valel(4)*valel(5)+valvois(j,4,iadj)*valvois(j,5,iadj)) + term2 *
norm(2,j)
359 vf(3) = (valel(3)*valel(5)+valvois(j,3,iadj)*valvois(j,5,iadj))
360 . /(valel(4)*valel(5)+valvois(j,4,iadj)*valvois(j,5,iadj)) + term2 *
norm(3,j)
361 ENDIF
362 vf(1) = vf(1)
363 vf(2) = vf(2)
364 vf(3) = vf(3)
365
366 CASE(6)
368 IF(ibv /=0)THEN
369 zadj(1:3) =
brick_list(nin,ibvm)%ScellCenter(1:3)
370 ELSE
371 nc(1) = ixs(2,iev)
372 nc(2) = ixs(3,iev)
373 nc(3) = ixs(4,iev)
374 nc(4) = ixs(5,iev)
375 nc(5) = ixs(6,iev)
376 nc(6) = ixs(7,iev)
377 nc(7) = ixs(8,iev)
378 nc(8) = ixs(9,iev)
379 zadj(1) = one_over_8*sum(x(1,nc(1:8)))
380 zadj(2) = one_over_8*sum(x(2,nc(1:8)))
381 zadj(3) = one_over_8*sum(x(3,nc(1:8)))
382 ENDIF
383
384 cf(1:3) =
brick_list(nin,ib)%POLY(icell)%FACE(j)%Center(1:3)
385 IF(ibv /= 0)THEN
386 face =
brick_list(nin,ib)%POLY(icell)%FACE(j)%Surf
387 facev =
brick_list(nin,ibv)%POLY(icellv)%FACE(jv)%Surf
388 IF(facev<face) cf(1:3) =
brick_list(nin,ibv)%POLY(icellv
389 ENDIF
390 zzadj(1) = zadj(1)-z(1)
391 zzadj(2) = zadj(2)-z(2)
392 zzadj(3) = zadj(3)-z(3)
393 zcf(1) = cf(1) - z(1)
394 zcf(2) = cf(2) - z(2)
395
396 ps = zcf(1)*zzadj(1) + zcf(2)*zzadj(2) + zcf(3)*zzadj(3)
397 zzadj_ = zzadj(1)**2 + zzadj(2)**2 + zzadj(3)**2
398 lambda = ps
399
400
401
402
404 lambda = sin(half*3.14159265358979d00*lambda)
405 lambda = lambda * lambda
406
407 sr1 = valel(4)
408 sr2 = valvois(j,4,iadj
409 srf = sr1 + lambda*(sr2-sr1)
410
411 vf(1)
412 vf(2) = valel(2) + lambda*(valvois(j
413 vf(3) = valel(3) + lambda*(valvois(j,3,iadj)-valel(3))
414
415 vf(1) = vf(1) / srf
416 vf(2) = vf(2) / srf
417 vf(3) = vf(3) / srf
418
419
420
421
422 vf(1) = vf(1)
423 vf(2) = vf(2)
424 vf(3) = vf(3)
425 END SELECT
426
427 cellflux(j,icell,ib,iadj) = (vf(1)*
norm(1,j) + vf(2)*
norm(2,j) + vf(3)*
norm(3,j))
428
429 wface(1) =
brick_list(nin,ib)%POLY(icell)%FACE(j
430 wface(2) =
brick_list(nin,ib)%POLY(icell)%FACE(j)%W(2)
431 wface(3) =
brick_list(nin,ib)%POLY(icell)%FACE(j)%W(3)
432
433 IF(icellv /=0)THEN
434 wfacev(1) =
brick_list(nin,ib)%POLY(icellv)%FACE(jv)%W(1)
435 wfacev(2) =
brick_list(nin,ib)%POLY(icellv)%FACE(jv)%W(2)
436 wfacev(3) =
brick_list(nin,ib)%POLY(icellv)%FACE(jv)%W(3)
437 ELSE
438 wfacev(1) = wface(1)
439 wfacev(2) = wface(2)
440 wfacev(3) = wface(3)
441 ENDIF
442
443 wface(1) = half*(wface(1)+wfacev(1))
444 wface(2) = half*(wface(2)+wfacev(2))
445 wface(3) = half*(wface(3)+wfacev(3))
446
447
448 brick_list(nin,ib)%POLY(icell)%FACE(j)%Vel(1) = vf(1)-wface(1)
449 brick_list(nin,ib)%POLY(icell)%FACE(j)%Vel(2) = vf(2)-wface(2)
450 brick_list(nin,ib)%POLY(icell)%FACE(j)%Vel(3) = vf(3)-wface(3)
451
452
453
454
455
456
457 numnod_ =
brick_list(nin,ib)%POLY(icell)%NumNOD
458 k = 0
459 DO l=1,numnod_
460 inod =
brick_list(nin,ib)%POLY(icell)%ListNodID(l)
461 IF(
int22_buf%IsNodeOnFace(inod,j))k = k +1
462 ENDDO
463 face =
brick_list(nin,ib)%POLY(icell)%FACE(j)%Surf
464 IF(ibv==0)THEN
465
466 facev = face
467 numnod_v = 8
468 kv = 1
469 ELSE
470 facev =
brick_list(nin,ibv)%POLY(icellv)%FACE(jv)%Surf
471 numnod_ =
brick_list(nin,ibv)%POLY(icellv)%NumNOD
472 kv = 0
473 DO l=1,numnod_
474 inod =
brick_list(nin,ibv)%POLY(icellv)%ListNodID(l)
475 IF(
int22_buf%IsNodeOnFace(inod,jv))kv= kv +1
476 ENDDO
477 ENDIF
478 face =
min(face,facev)
479 If(k==0 .OR. kv==0) face = zero
480 IF(ibv/=0 .AND. ibm==ibvm) face=zero
481 cellflux(j,icell,ib,iadj) = face * cellflux(j,icell,ib,iadj)
482 brick_list(nin,ib)%POLY(icell)%FACE(j)%Adjacent_FLUX(iadj) = cellflux(j,icell,ib,iadj)
483 enddo
484 enddo
485 enddo
486 enddo
487
488
489
490
491 if(debug_outp)then
493 print *, " |------e22flux3_int22_fvm.F------|"
494 do ib=nbf,nbl
497 icell = 0
499 DO WHILE (icell<=ncell)
500 icell = icell +1
501 IF (icell>ncell .AND. ncell/=0)icell=9
502
503 print *, " brique =", ixs(11,ie)
504 print *, " NCYCLE =", ncycle
505 print *, " icell =", icell
506 print *, " mcell =", mcell
507 print *, " nbcut =", nbcut
508 do i=1,6
509 nadj =
brick_list(nin,ib)%POLY(icell)%FACE(i)%NAdjCell
510 write (*,fmt='(A,I10,A,5E26.14)') " phi(1:5,",i,")=", cellflux(i,icell,ib,1:nadj)
511 enddo
512 enddo
513 enddo
514 print *, " ------------------------"
515 endif
516 endif
517
518
519
520
521
523
524
525
526
527
528
529 DO ib=nbf,nbl
534 icell = 0
535 DO WHILE (icell<=ncell)
536 icell = icell +1
537 IF (icell>ncell .AND. ncell/=0)icell=9
538 DO j=1,6
539 brick_list(nin,ib)%POLY(icell)%FACE(j)%Adjacent_upwFLUX (1) = zero
540 brick_list(nin,ib)%POLY(icell)%FACE(j)%Adjacent_upwFLUX (2) = zero
541 brick_list(nin,ib)%POLY(icell)%FACE(j)%Adjacent_upwFLUX (3) = zero
542 brick_list(nin,ib)%POLY(icell)%FACE(j)%Adjacent_upwFLUX (4) = zero
543 brick_list(nin,ib)%POLY(icell)%FACE(j)%Adjacent_upwFLUX (5) = zero
544 enddo
545
546 brick_list(nin,ib)%POLY(icell)%Adjacent_FLU1 = zero
547
548
549
550 ie_m =
brick_list(nin,ib)%POLY(icell)%WhereIsMain(3)
551 mat = ixs(1,ie_m)
552 upwl(1:6) = pm(16,mat)
553 reduc = pm(92,mat)
554 ddvol = zero
555 DO j=1,6
556 nadj =
brick_list(nin,ib)%POLY(icell)%FACE(j)%NAdjCell
558 IF(iclose==1) nadj=0
559 DO iadj = 1,nadj
563 icellv =
brick_list(nin,ib)%POLY(icell)%FACE(j)%Adjacent_Cell(iadj)
564 IF(idv==0)THEN
565 cellflux(j,icell,ib,iadj)=cellflux(j,icell,ib,iadj)*reduc
566 ELSEIF(idv>0)THEN
568 isilent = iparg(64,ng)
569 IF(isilent==1)THEN
570 upwl(j)=one
571 cellflux(j,icell,ib,iadj)=cellflux(j,icell,ib,iadj)*pm(92,ixs(1,idv))
572 ENDIF
573 ENDIF
574 brick_list(nin,ib)%POLY(icell)%FACE(j)%Adjacent_upwFLUX(iadj) =
575 . cellflux(j,icell,ib,iadj)-upwl(j)*abs(cellflux(j,icell,ib,iadj))
576 brick_list(nin,ib)%POLY(icell)%Adjacent_FLU1 =
577 .
brick_list(nin,ib)%POLY(icell)%Adjacent_FLU1 + cellflux(j,icell,ib,iadj)+upwl(j)*abs(cellflux(j,icell,ib,iadj))
578
579 ddvol = ddvol + cellflux(j,icell,ib,iadj)
580
581 enddo
582 enddo
583
585
586
587 enddo
588 enddo
589
590
592
593
594
595
596
597
598 IF(int22>0)THEN
599 nin = 1
600 DO ib=nbf,nbl
604 ddvol = zero
605 DO k=1,num
607 icellv =
brick_list(nin,ib)%SecndList%ICELLv(k)
608 ddvol = ddvol +
brick_list(nin,ibv)%POLY(icellv)%DDVOL
609 ENDDO
610 ddvol = ddvol +
brick_list(nin,ib)%POLY(mcell)%DDVOL
611
613 enddo
614 ENDIF
615
616
618
619
620 RETURN
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB
type(alefvm_buffer_), target alefvm_buffer
type(alefvm_param_), target alefvm_param
type(brick_entity), dimension(:,:), allocatable, target brick_list
type(int22_buf_t) int22_buf