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