41 . PM, IPM, MULTI_FVM, ALE_CONNECTIVITY, WGRID, XGRID, ITAB, NBMAT, CURRENT_TIME, BUFMAT)
50 use element_mod ,
only : nixs,nixq,nixtg
54#include "implicit_f.inc"
67 TYPE(timer_),
INTENT(INOUT) :: TIMERS
68 TYPE(elbuf_struct_),
TARGET,
DIMENSION(NGROUP) :: ELBUF_TAB
69 INTEGER,
INTENT(IN) :: IPARG(, *)
70 INTEGER,
INTENT(IN) :: ITASK
71 INTEGER,
INTENT(IN) :: IXS(NIXS, *), (NIXQ, *), IXTG(NIXTG, *)
72 INTEGER,
INTENT(IN) :: IPM(NPROPMI, *)
73 my_real,
INTENT(IN) :: pm(npropm, *)
74 TYPE(multi_fvm_struct),
INTENT(INOUT) :: MULTI_FVM
75 my_real,
INTENT(IN) :: wgrid(3, *), xgrid(3, *), current_time
76 INTEGER,
INTENT(IN) :: ITAB(*), NBMAT
77 my_real,
INTENT(INOUT) :: bufmat(*)
82 INTEGER :: II, I, J, NB_FACE, NB_FACE2, KFACE, IFACE, NG, IMAT
83 my_real :: valk, vall, nx(6), ny(6), nz(6),
84 . xk(3), xf(3, 6), delta, lim_rho, xl(3, 6)
85 my_real :: maxval_rho, minval_rho,
88 . maxval_w, minval_w, lim_velx, lim_vely, lim_velz, lim_vel
89 my_real :: maxval_pres, minval_pres, lim_pres
90 my_real :: phase_maxval_rho(nbmat), phase_minval_rho(nbmat),
91 . phase_maxval_alpha(nbmat), phase_minval_alpha(nbmat),
92 . phase_maxval_pres(nbmat), phase_minval_pres(nbmat),
93 . phase_lim_alpha(nbmat), phase_lim_rho(nbmat), phase_lim_pres(nbmat)
94 my_real :: peps, meps, limface(6)
95 TYPE(g_bufel_),
POINTER :: GBUF
96 TYPE(),
POINTER :: LBUF
97 INTEGER :: VOIS(6), FACE_LIST(6), NEL, ITY, ISOLNOD, NFT, MATLAW,
98 . node1, node2, node3, node4
99 my_real :: sumx, sumy, sumz, vol, one_over_vol, lim_alpha
101 my_real,
DIMENSION(:),
POINTER :: volume
102 my_real :: x1(3), x2(3), x3(3), x4
103 my_real :: mat(3, 3), rhs(3), sol
108 IF(itask == 0)
CALL startime(timers,macro_timer_muscl)
109 eps_int = five * em02
111 DO ng = itask + 1, ngroup, nthread
112 matlaw = iparg(1, ng)
113 IF (matlaw == 151)
THEN
117 isolnod = iparg(28, ng)
119 gbuf => elbuf_tab(ng)%GBUF
120 IF (multi_fvm%SYM == 0)
THEN
121 volume => gbuf%VOL(1:nel)
123 volume => gbuf%AREA(1:nel)
130 face_list(iface) = iface
135 SELECT CASE (multi_fvm%SYM)
140 IF (isolnod == 4)
THEN
155 ELSEIF (ity == 7)
THEN
166 iad = ale_connectivity%ee_connect%iad_connect(i)
174 one_over_vol = one / vol
176 xk(1:3) = multi_fvm%ELEM_DATA%CENTROID(1:3, i)
179 DO iface = 1, nb_face
180 kface = face_list(iface)
181 j = ale_connectivity%ee_connect%connected(iad + kface - 1)
182 xf(1:3, kface) = multi_fvm%FACE_DATA%CENTROID(1:3, kface, i)
185 xl(1:3, kface) = multi_fvm%ELEM_DATA%CENTROID(1:3, j)
187 xl(1:3, kface) = two * xf(1:3, kface) - xk(1:3)
189 nx(kface) = multi_fvm%FACE_DATA%NORMAL(1, kface, i)
190 ny(kface) = multi_fvm%FACE_DATA%NORMAL(2, kface, i)
191 nz(kface) = multi_fvm%FACE_DATA%NORMAL(3, kface, i)
192 mat(1, 1) = mat(1, 1) + (xl(1, kface) - xk(1)) * (xl(1, kface) - xk(1))
193 mat(1, 2) = mat(1, 2) + (xl(1, kface) - xk(1)) * (xl(2, kface) - xk(2))
194 mat(1, 3) = mat(1, 3) + (xl(1, kface) - xk(1)) * (xl(3, kface) - xk(3))
195 mat(2, 1) = mat(2, 1) + (xl(2, kface) - xk(2)) * (xl(1, kface) - xk(1))
196 mat(2, 2) = mat(2, 2) + (xl(2, kface) - xk(2)) * (xl(2, kface) - xk(2))
197 mat(2, 3) = mat(2, 3) + (xl(2, kface) - xk(2)) * (xl(3, kface) - xk(3))
198 mat(3, 1) = mat(3, 1) + (xl(3, kface) - xk(3)) * (xl(1, kface) - xk(1))
199 mat(3, 2) = mat(3, 2) + (xl(3, kface) - xk(3)) * (xl(2, kface) - xk(2))
200 mat(3, 3) = mat(3, 3) + (xl(3, kface) - xk(3)) * (xl(3, kface) - xk(3))
203 IF (multi_fvm%SYM /= 0)
THEN
211 det = mat(1, 1) * mat(2, 2) * mat(3, 3) - mat(1, 1) * mat(2, 3)**2
212 . - mat(2, 2) * mat(1, 3)**2 - mat(3, 3) * mat(1, 2)**2
213 . + two * mat(1, 2) * mat(1, 3) * mat(2, 3)
214 IF (det /= zero)
THEN
220 matm1(1, 1) = mat(2, 2) * mat(3, 3) - mat(2, 3)**2
221 matm1(1, 2) = -mat(1, 2) * mat(3, 3) + mat(1, 3) * mat(2, 3)
222 matm1(1, 3) = mat(1, 2) * mat(2, 3) - mat(1, 3) * mat(2, 2)
223 matm1(2, 2) = mat(1, 1) * mat(3, 3) - mat(1, 3)**2
224 matm1(2, 3) = -mat(1, 1) * mat(2, 3) + mat(1, 2) * mat(1, 3)
225 matm1(3, 3) = mat(1, 1) * mat(2, 2) - mat(1, 2)**2
226 matm1(2, 1) = matm1(1, 2)
227 matm1(3, 1) = matm1(1, 3)
228 matm1(3, 2) = matm1(2, 3)
230 matm1(1:3, 1:3) = matm1(1:3, 1:3) * det
234 IF (multi_fvm%SYM == 1)
THEN
242 x1(1:3) = xgrid(1:3, node1)
243 x2(1:3) = xgrid(1:3, node2)
244 x3(1:3) = xgrid(1:3, node3)
245 x4(1:3) = xgrid(1:3, node4)
246 ELSE IF (ity == 7)
THEN
251 x1(1:3) = xgrid(1:3, node1)
252 x2(1:3) = xgrid(1:3, node2)
253 x3(1:3) = xgrid(1:3, node3)
258 maxval_u = multi_fvm%VEL(1, i)
260 maxval_v = multi_fvm%VEL(2, i)
262 maxval_w = multi_fvm%VEL(3, i)
270 maxval_rho = multi_fvm%RHO(i)
271 minval_rho = maxval_rho
273 maxval_pres = multi_fvm%EINT(i)
274 minval_pres = maxval_pres
281 phase_maxval_rho(imat) = multi_fvm%PHASE_RHO(imat, i)
282 phase_minval_rho(imat) = phase_maxval_rho(imat)
284 phase_maxval_pres(imat) = multi_fvm%PHASE_EINT(imat, i)
285 phase_minval_pres(imat) = phase_maxval_pres(imat)
287 phase_maxval_alpha(imat) = multi_fvm%PHASE_ALPHA(imat, i)
288 phase_minval_alpha(imat) = phase_maxval_alpha(imat)
292 IF (multi_fvm%MUSCL == 1)
THEN
294 valk = multi_fvm%VEL(1, i)
296 DO iface = 1, nb_face
297 kface = face_list(iface)
301 vall = multi_fvm%VEL(1, j)
302 maxval_u =
max(maxval_u, vall)
303 minval_u =
min(minval_u, vall)
304 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
305 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
306 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
310 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
316 DO iface = 1, nb_face
317 kface = face_list(iface)
318 delta = sumx * (xf(1, kface) - xk(1)) +
319 . sumy * (xf(2, kface) - xk(2)) +
320 . sumz * (xf(3, kface) - xk(3))
321 IF (delta > zero)
THEN
322 limface(kface) = half * (maxval_u - valk) / delta
323 ELSE IF (delta < zero)
THEN
324 limface(kface) = half * (minval_u - valk) / delta
326 CALL limiter(limface(kface), one)
328 lim_velx = minval(limface(1:6))
329 multi_fvm%GRAD_U(1, i) = sumx * lim_velx
330 multi_fvm%GRAD_U(2, i) = sumy * lim_velx
331 multi_fvm%GRAD_U(3, i) = sumz * lim_velx
333 valk = multi_fvm%VEL(2, i)
335 DO iface = 1, nb_face
336 kface = face_list(iface)
340 vall = multi_fvm%VEL(2, j)
341 maxval_v =
max(maxval_v, vall)
342 minval_v =
min(minval_v, vall)
343 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
344 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
345 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
348 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
354 DO iface = 1, nb_face
355 kface = face_list(iface)
356 delta = sumx * (xf(1, kface) - xk(1)) +
357 . sumy * (xf(2, kface) - xk(2)) +
358 . sumz * (xf(3, kface) - xk(3))
359 IF (delta > zero)
THEN
360 limface(kface) = half * (maxval_v - valk) / delta
361 ELSE IF (delta < zero)
THEN
362 limface(kface) = half * (minval_v - valk) / delta
364 CALL limiter(limface(kface), one)
366 lim_vely = minval(limface(1:6))
367 multi_fvm%GRAD_V(1, i) = sumx * lim_vely
368 multi_fvm%GRAD_V(2, i) = sumy * lim_vely
369 multi_fvm%GRAD_V(3, i) = sumz * lim_vely
371 valk = multi_fvm%VEL(3, i)
373 DO iface = 1, nb_face
374 kface = face_list(iface)
378 vall = multi_fvm%VEL(3, j)
379 maxval_w =
max(maxval_w, vall)
380 minval_w =
min(minval_w, vall)
382 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
383 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
386 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
392 DO iface = 1, nb_face
393 kface = face_list(iface)
394 delta = sumx * (xf(1, kface) - xk(1)) +
395 . sumy * (xf(2, kface)
396 . sumz * (xf(3, kface) - xk(3))
397 IF (delta > zero)
THEN
398 limface(kface) = half * (maxval_w - valk) / delta
399 ELSE IF (delta < zero)
THEN
400 limface(kface) = half * (minval_w - valk) / delta
402 CALL limiter(limface(kface), one)
404 lim_velz = minval(limface(1:6))
405 multi_fvm%GRAD_W(1, i) = sumx * lim_velz
406 multi_fvm%GRAD_W(2, i) = sumy * lim_velz
407 multi_fvm%GRAD_W(3, i) = sumz * lim_velz
415 IF (multi_fvm%MUSCL == 1)
THEN
416 valk = multi_fvm%RHO(i)
418 DO iface = 1, nb_face
419 kface = face_list(iface)
423 vall = multi_fvm%RHO(j)
424 maxval_rho =
max(maxval_rho, vall)
425 minval_rho =
min(minval_rho, vall)
426 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
427 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
431 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
437 DO iface = 1, nb_face
438 kface = face_list(iface)
439 delta = sumx * (xf(1, kface) - xk(1)) +
440 . sumy * (xf(2, kface) - xk(2)) +
441 . sumz * (xf(3, kface) - xk(3))
442 IF (delta > zero)
THEN
443 limface(kface) = half * (maxval_rho - valk) / delta
444 ELSE IF (delta < zero)
THEN
445 limface(kface) = half * (minval_rho - valk) / delta
447 CALL limiter(limface(kface), one)
449 lim_rho = minval(limface(1:6))
450 multi_fvm%GRAD_RHO(1, i) = sumx * lim_rho
451 multi_fvm%GRAD_RHO(2, i) = sumy * lim_rho
452 multi_fvm%GRAD_RHO(3, i) = sumz * lim_rho
454 valk = multi_fvm%EINT(i)
456 DO iface = 1, nb_face
457 kface = face_list(iface)
461 vall = multi_fvm%EINT(j)
462 maxval_pres =
max(maxval_pres, vall)
463 minval_pres =
min(minval_pres, vall)
464 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
465 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
466 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
469 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
476 DO iface = 1, nb_face
477 kface = face_list(iface)
478 delta = sumx * (xf(1, kface) - xk(1)) +
479 . sumy * (xf(2, kface) - xk(2)) +
480 . sumz * (xf(3, kface) - xk(3))
481 IF (delta > zero)
THEN
482 limface(kface) = half * (maxval_pres - valk) / delta
483 ELSE IF (delta < zero)
THEN
484 limface(kface) = half * (minval_pres - valk) / delta
486 CALL limiter(limface(kface), one)
488 lim_pres = minval(limface(1:6))
489 multi_fvm%GRAD_PRES(1, i) = sumx * lim_pres
490 multi_fvm%GRAD_PRES(2, i) = sumy * lim_pres
491 multi_fvm%GRAD_PRES(3, i) = sumz * lim_pres
499 valk = multi_fvm%PHASE_ALPHA(imat, i)
501 DO iface = 1, nb_face
502 kface = face_list(iface)
506 vall = multi_fvm%PHASE_ALPHA(imat, j)
507 phase_maxval_alpha(imat) =
max(phase_maxval_alpha(imat), vall)
508 phase_minval_alpha(imat) =
min(phase_minval_alpha(imat), vall)
509 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
510 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
514 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
520 DO iface = 1, nb_face
521 kface = face_list(iface)
522 delta = sumx * (xf(1, kface) - xk(1)) +
523 . sumy * (xf(2, kface) - xk(2)) +
524 . sumz * (xf(3, kface) - xk(3))
525 IF (delta > zero)
THEN
526 limface(kface) = half * (phase_maxval_alpha(imat) - valk) / delta
527 ELSE IF (delta < zero)
THEN
528 limface(kface) = half * (phase_minval_alpha(imat) - valk) / delta
530 CALL limiter(limface(kface), multi_fvm%BETA)
532 phase_lim_alpha(imat) = minval(limface(1:6))
533 multi_fvm%PHASE_GRAD_ALPHA(1, imat, i) = sumx * phase_lim_alpha(imat)
534 multi_fvm%PHASE_GRAD_ALPHA(2, imat, i) = sumy * phase_lim_alpha(imat)
535 multi_fvm%PHASE_GRAD_ALPHA(3, imat, i) = sumz * phase_lim_alpha(imat)
537 IF (multi_fvm%MUSCL == 1)
THEN
538 valk = multi_fvm%PHASE_RHO(imat, i)
540 DO iface = 1, nb_face
541 kface = face_list(iface)
545 vall = multi_fvm%PHASE_RHO(imat, j)
546 phase_maxval_rho(imat) =
max(phase_maxval_rho(imat), vall)
547 phase_minval_rho(imat) =
min(phase_minval_rho(imat), vall)
548 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
549 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
550 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
553 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
559 DO iface = 1, nb_face
560 kface = face_list(iface)
561 delta = sumx * (xf(1, kface) - xk(1)) +
562 . sumy * (xf(2, kface) - xk(2)) +
563 . sumz * (xf(3, kface) - xk(3))
564 IF (delta > zero)
THEN
565 limface(kface) = half * (phase_maxval_rho(imat) - valk) / delta
566 ELSE IF (delta < zero)
THEN
567 limface(kface) = half * (phase_minval_rho(imat) - valk) / delta
569 IF (valk + delta <= zero)
THEN
570 limface(kface) = zero
572 CALL limiter(limface(kface), one)
575 phase_lim_rho(imat) = minval(limface(1:6))
576 multi_fvm%PHASE_GRAD_RHO(1, imat, i) = sumx * phase_lim_rho(imat)
577 multi_fvm%PHASE_GRAD_RHO(2, imat, i) = sumy * phase_lim_rho(imat)
578 multi_fvm%PHASE_GRAD_RHO(3, imat, i) = sumz * phase_lim_rho(imat)
580 valk = multi_fvm%PHASE_EINT(imat, i)
582 DO iface = 1, nb_face
583 kface = face_list(iface)
587 vall = multi_fvm%PHASE_EINT(imat, j)
588 phase_maxval_pres(imat) =
max(phase_maxval_pres(imat), vall)
589 phase_minval_pres(imat) =
min(phase_minval_pres(imat), vall)
590 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
591 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
592 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
595 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
601 DO iface = 1, nb_face
602 kface = face_list(iface)
603 delta = sumx * (xf(1, kface) - xk(1)) +
604 . sumy * (xf(2, kface) - xk(2)) +
605 . sumz * (xf(3, kface) - xk(3))
606 IF (delta > zero)
THEN
607 limface(kface) = half * (phase_maxval_pres(imat) - valk) / delta
608 ELSE IF (delta < zero)
THEN
609 limface(kface) = half * (phase_minval_pres(imat) - valk) / delta
611 CALL limiter(limface(kface), one)
613 phase_lim_pres(imat) = minval(limface(1:6))
614 multi_fvm%PHASE_GRAD_PRES(1, imat, i) = sumx * phase_lim_pres(imat)
615 multi_fvm%PHASE_GRAD_PRES(2, imat, i) = sumy * phase_lim_pres(imat)
616 multi_fvm%PHASE_GRAD_PRES(3, imat, i) = sumz * phase_lim_pres(imat)
623 IF(itask == 0)
CALL stoptime(timers,macro_timer_muscl)