40 . PM, IPM, MULTI_FVM, ALE_CONNECTIVITY, WGRID, XGRID, ITAB, NBMAT, CURRENT_TIME, BUFMAT)
52#include "implicit_f.inc"
65 TYPE(),
INTENT(INOUT) :: TIMERS
66 TYPE(elbuf_struct_),
TARGET,
DIMENSION(NGROUP) :: ELBUF_TAB
67 INTEGER,
INTENT(IN) :: IPARG(NPARG, *)
68 INTEGER,
INTENT(IN) :: ITASK
69 INTEGER,
INTENT(IN) :: IXS(NIXS, *), IXQ(NIXQ, *), IXTG(NIXTG, *)
70 INTEGER,
INTENT(IN) :: IPM(NPROPMI, *)
71 my_real,
INTENT(IN) :: pm(npropm, *)
72 TYPE(multi_fvm_struct),
INTENT(INOUT) :: MULTI_FVM
73 my_real,
INTENT(IN) :: wgrid(3, *), xgrid(3, *), current_time
74 INTEGER,
INTENT(IN) :: ITAB(*), NBMAT
75 my_real,
INTENT(INOUT) :: bufmat(*)
80 INTEGER :: II, I, J, NB_FACE, NB_FACE2, KFACE, , NG, IMAT
81 my_real :: valk, vall, nx(6), ny(6), nz(6),
82 . xk(3), xf(3, 6), delta, lim_rho, xl(3, 6)
83 my_real :: maxval_rho, minval_rho,
86 . maxval_w, minval_w, lim_velx, lim_vely, lim_velz, lim_vel
87 my_real :: maxval_pres, minval_pres, lim_pres
88 my_real :: phase_maxval_rho(nbmat), phase_minval_rho(nbmat),
89 . phase_maxval_alpha(nbmat), phase_minval_alpha(nbmat),
90 . phase_maxval_pres(nbmat), phase_minval_pres(nbmat),
91 . phase_lim_alpha(nbmat), phase_lim_rho(nbmat), phase_lim_pres(nbmat)
92 my_real :: peps, meps, limface(6)
93 TYPE(g_bufel_),
POINTER :: GBUF
94 TYPE(l_bufel_),
POINTER :: LBUF
95 INTEGER :: (6), FACE_LIST(6), NEL, ITY, ISOLNOD, NFT, MATLAW,
96 . node1, node2, node3, node4
97 my_real :: sumx, sumy, sumz, vol, one_over_vol, lim_alpha
99 my_real,
DIMENSION(:),
POINTER :: volume
100 my_real :: x1(3), x2(3), x3(3), x4(3)
101 my_real :: mat(3, 3), rhs(3), sol(3), matm1(3, 3), det, mattest(3, 3)
106 IF(itask == 0)
CALL startime(timers,macro_timer_muscl)
107 eps_int = five * em02
109 DO ng = itask + 1, ngroup, nthread
110 matlaw = iparg(1, ng)
111 IF (matlaw == 151)
THEN
115 isolnod = iparg(28, ng)
117 gbuf => elbuf_tab(ng)%GBUF
118 IF (multi_fvm%SYM == 0)
THEN
119 volume => gbuf%VOL(1:nel)
121 volume => gbuf%AREA(1:nel)
133 SELECT CASE (multi_fvm%SYM)
138 IF (isolnod == 4)
THEN
153 ELSEIF (ity == 7)
THEN
164 iad = ale_connectivity%ee_connect%iad_connect(i)
172 one_over_vol = one / vol
174 xk(1:3) = multi_fvm%ELEM_DATA%CENTROID(1:3, i)
177 DO iface = 1, nb_face
178 kface = face_list(
iface)
179 j = ale_connectivity%ee_connect%connected(iad + kface - 1)
180 xf(1:3, kface) = multi_fvm%FACE_DATA%CENTROID(1:3, kface, i)
183 xl(1:3, kface) = multi_fvm%ELEM_DATA%CENTROID(1:3, j)
185 xl(1:3, kface) = two * xf(1:3, kface) - xk(1:3)
187 nx(kface) = multi_fvm%FACE_DATA%NORMAL(1, kface, i)
188 ny(kface) = multi_fvm%FACE_DATA%NORMAL(2, kface, i)
189 nz(kface) = multi_fvm%FACE_DATA%NORMAL(3, kface, i)
190 mat(1, 1) = mat(1, 1) + (xl(1, kface) - xk(1)) * (xl(1, kface) - xk(1))
191 mat(1, 2) = mat(1, 2) + (xl(1, kface) - xk(1)) * (xl(2, kface) - xk(2))
192 mat(1, 3) = mat(1, 3) + (xl(1, kface) - xk(1)) * (xl(3, kface) - xk(3))
193 mat(2, 1) = mat(2, 1) + (xl(2, kface) - xk
194 mat(2, 2) = mat(2, 2) + (xl(2, kface) - xk(2)) * (xl(2, kface) - xk(2))
195 mat(2, 3) = mat(2, 3) + (xl(2, kface) - xk(2)) * (xl(3, kface) - xk(3))
196 mat(3, 1) = mat(3, 1) + (xl
197 mat(3, 2) = mat(3, 2) + (xl(3, kface) - xk(3)) * (xl(2, kface) - xk(2))
198 mat(3, 3) = mat(3, 3) + (xl(3, kface) - xk(3)) * (xl(3, kface) - xk(3))
201 IF (multi_fvm%SYM /= 0)
THEN
210 . - mat(2, 2) * mat(1, 3)**2 - mat(3, 3) * mat(1, 2)**2
211 . + two * mat(1, 2) * mat(1, 3) * mat(2, 3)
212 IF (det /= zero)
THEN
218 matm1(1, 1) = mat(2, 2) * mat(3, 3) - mat(2, 3)**2
220 matm1(1, 3) = mat(1, 2) * mat(2, 3) - mat(1, 3) * mat(2, 2)
221 matm1(2, 2) = mat(1, 1) * mat(3, 3) - mat(1, 3)**2
222 matm1(2, 3) = -mat(1, 1) * mat(2, 3) + mat(1, 2) * mat(1, 3)
223 matm1(3, 3) = mat(1, 1) * mat(2, 2) - mat(1, 2)**2
224 matm1(2, 1) = matm1(1, 2)
225 matm1(3, 1) = matm1(1, 3)
226 matm1(3, 2) = matm1(2, 3)
228 matm1(1:3, 1:3) = matm1(1:3, 1:3) * det
232 IF (multi_fvm%SYM == 1)
THEN
240 x1(1:3) = xgrid(1:3, node1)
243 x4(1:3) = xgrid(1:3, node4)
244 ELSE IF (ity == 7)
THEN
249 x1(1:3) = xgrid(1:3, node1)
250 x2(1:3) = xgrid(1:3, node2)
251 x3(1:3) = xgrid(1:3, node3)
256 maxval_u = multi_fvm%VEL(1, i)
258 maxval_v = multi_fvm%VEL(2, i)
260 maxval_w = multi_fvm%VEL(3, i)
268 maxval_rho = multi_fvm%RHO(i)
269 minval_rho = maxval_rho
271 maxval_pres = multi_fvm%EINT(i)
272 minval_pres = maxval_pres
279 phase_maxval_rho(imat) = multi_fvm%PHASE_RHO(imat, i)
280 phase_minval_rho(imat) = phase_maxval_rho(imat)
282 phase_maxval_pres(imat) = multi_fvm%PHASE_EINT(imat, i)
283 phase_minval_pres(imat) = phase_maxval_pres(imat)
285 phase_maxval_alpha(imat) = multi_fvm%PHASE_ALPHA(imat, i)
286 phase_minval_alpha(imat) = phase_maxval_alpha(imat)
290 IF (multi_fvm%MUSCL == 1)
THEN
292 valk = multi_fvm%VEL(1, i)
294 DO iface = 1, nb_face
295 kface = face_list(
iface)
299 vall = multi_fvm%VEL(1, j)
300 maxval_u =
max(maxval_u, vall)
301 minval_u =
min(minval_u, vall)
302 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
303 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
304 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
308 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
314 DO iface = 1, nb_face
315 kface = face_list(
iface)
316 delta = sumx * (xf(1, kface) - xk(1)) +
317 . sumy * (xf(2, kface) - xk(2)) +
318 . sumz * (xf(3, kface) - xk(3))
319 IF (delta > zero)
THEN
320 limface(kface) = half * (maxval_u - valk) / delta
322 limface(kface) = half * (minval_u - valk) / delta
324 CALL limiter(limface(kface), one)
326 lim_velx = minval(limface(1:6))
327 multi_fvm%GRAD_U(1, i) = sumx * lim_velx
328 multi_fvm%GRAD_U(2, i) = sumy * lim_velx
329 multi_fvm%GRAD_U(3, i) = sumz * lim_velx
331 valk = multi_fvm%VEL(2, i)
333 DO iface = 1, nb_face
334 kface = face_list(
iface)
338 vall = multi_fvm%VEL(2, j)
339 maxval_v =
max(maxval_v, vall)
340 minval_v =
min(minval_v, vall)
341 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
343 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
346 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
352 DO iface = 1, nb_face
353 kface = face_list(
iface)
354 delta = sumx * (xf(1, kface) - xk(1)) +
355 . sumy * (xf(2, kface) - xk(2)) +
356 . sumz * (xf(3, kface) - xk(3))
357 IF (delta > zero)
THEN
358 limface(kface) = half * (maxval_v - valk) / delta
359 ELSE IF (delta < zero)
THEN
360 limface(kface) = half * (minval_v - valk) / delta
362 CALL limiter(limface(kface), one)
364 lim_vely = minval(limface(1:6))
365 multi_fvm%GRAD_V(1, i) = sumx * lim_vely
366 multi_fvm%GRAD_V(2, i) = sumy * lim_vely
367 multi_fvm%GRAD_V(3, i) = sumz * lim_vely
369 valk = multi_fvm%VEL(3, i)
371 DO iface = 1, nb_face
372 kface = face_list(
iface)
376 vall = multi_fvm%VEL(
377 maxval_w =
max(maxval_w, vall)
378 minval_w =
min(minval_w, vall)
379 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk
380 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
381 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
384 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
390 DO iface = 1, nb_face
391 kface = face_list(
iface)
392 delta = sumx * (xf(1, kface) - xk(1)) +
393 . sumy * (xf(2, kface) - xk(2)) +
394 . sumz * (xf(3, kface) - xk(3))
395 IF (delta > zero)
THEN
396 limface(kface) = half * (maxval_w - valk) / delta
397 ELSE IF (delta < zero)
THEN
398 limface(kface) = half * (minval_w - valk) / delta
400 CALL limiter(limface(kface), one)
402 lim_velz = minval(limface(1:6))
403 multi_fvm%GRAD_W(1, i) = sumx * lim_velz
404 multi_fvm%GRAD_W(2, i) = sumy * lim_velz
405 multi_fvm%GRAD_W(3, i) = sumz * lim_velz
413 IF (multi_fvm%MUSCL == 1)
THEN
414 valk = multi_fvm%RHO(i)
416 DO iface = 1, nb_face
417 kface = face_list(
iface)
421 vall = multi_fvm%RHO(j)
422 maxval_rho =
max(maxval_rho, vall)
423 minval_rho =
min(minval_rho, vall)
424 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
425 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk
426 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
429 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
435 DO iface = 1, nb_face
436 kface = face_list(
iface)
437 delta = sumx * (xf(1, kface) - xk(1)) +
438 . sumy * (xf(2, kface) - xk(2)) +
439 . sumz * (xf(3, kface) - xk(3))
440 IF (delta > zero)
THEN
441 limface(kface) = half * (maxval_rho - valk) / delta
442 ELSE IF (delta < zero)
THEN
443 limface(kface) = half * (minval_rho - valk
447 lim_rho = minval(limface(1:6))
448 multi_fvm%GRAD_RHO(1, i) = sumx * lim_rho
449 multi_fvm%GRAD_RHO(2, i) = sumy * lim_rho
450 multi_fvm%GRAD_RHO(3, i) = sumz * lim_rho
452 valk = multi_fvm%EINT(i)
454 DO iface = 1, nb_face
455 kface = face_list(
iface)
459 vall = multi_fvm%EINT(j)
460 maxval_pres =
max(maxval_pres, vall)
461 minval_pres =
min(minval_pres, vall)
462 rhs(1) = rhs(1) + (valk
463 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
464 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
467 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
475 kface = face_list(
iface)
476 delta = sumx * (xf(1, kface) - xk(1)) +
477 . sumy * (xf(2, kface) - xk(2)) +
478 . sumz * (xf(3, kface) - xk(3))
479 IF (delta > zero)
THEN
480 limface(kface) = half * (maxval_pres - valk) / delta
481 ELSE IF (delta < zero)
THEN
482 limface(kface) = half * (minval_pres - valk) / delta
484 CALL limiter(limface(kface), one)
486 lim_pres = minval(limface(1:6))
487 multi_fvm%GRAD_PRES(1, i) = sumx
488 multi_fvm%GRAD_PRES(2, i) = sumy * lim_pres
489 multi_fvm%GRAD_PRES(3, i) = sumz * lim_pres
497 valk = multi_fvm%PHASE_ALPHA
499 DO iface = 1, nb_face
500 kface = face_list(
iface)
504 vall = multi_fvm%PHASE_ALPHA(imat, j)
505 phase_maxval_alpha(imat) =
max(phase_maxval_alpha(imat), vall)
506 phase_minval_alpha(imat) =
min(phase_minval_alpha(imat), vall)
507 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
508 rhs(2) = rhs(2) + (valk - vall
509 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
512 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
518 DO iface = 1, nb_face
519 kface = face_list(
iface)
520 delta = sumx * (xf(1, kface) - xk(1)) +
521 . sumy * (xf(2, kface) - xk(2)) +
522 . sumz * (xf(3, kface) - xk(3))
523 IF (delta > zero)
THEN
524 limface(kface) = half * (phase_maxval_alpha(imat) - valk) / delta
525 ELSE IF (delta < zero)
THEN
526 limface(kface) = half * (phase_minval_alpha(imat) - valk) / delta
528 CALL limiter(limface(kface), multi_fvm%BETA)
530 phase_lim_alpha(imat) = minval(limface(1:6))
531 multi_fvm%PHASE_GRAD_ALPHA(1, imat, i) = sumx * phase_lim_alpha(imat)
532 multi_fvm%PHASE_GRAD_ALPHA(2, imat, i) = sumy * phase_lim_alpha(imat)
533 multi_fvm%PHASE_GRAD_ALPHA(3, imat, i) = sumz * phase_lim_alpha(imat)
535 IF (multi_fvm%MUSCL == 1)
THEN
536 valk = multi_fvm%PHASE_RHO(imat, i)
538 DO iface = 1, nb_face
539 kface = face_list(
iface)
543 vall = multi_fvm%PHASE_RHO(imat, j)
544 phase_maxval_rho(imat) =
max(phase_maxval_rho(imat), vall)
545 phase_minval_rho(imat) =
min(phase_minval_rho(imat), vall)
546 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
547 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
548 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
551 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
557 DO iface = 1, nb_face
558 kface = face_list(
iface)
560 . sumy * (xf(2, kface) - xk(2)) +
562 IF (delta > zero)
THEN
563 limface(kface) = half * (phase_maxval_rho(imat) - valk) / delta
564 ELSE IF (delta < zero)
THEN
565 limface(kface) = half * (phase_minval_rho(imat) - valk) / delta
567 IF (valk + delta <= zero)
THEN
568 limface(kface) = zero
570 CALL limiter(limface(kface), one)
573 phase_lim_rho(imat) = minval(limface(1:6))
574 multi_fvm%PHASE_GRAD_RHO(1, imat, i) = sumx * phase_lim_rho(imat)
575 multi_fvm%PHASE_GRAD_RHO(2, imat, i) = sumy * phase_lim_rho(imat)
576 multi_fvm%PHASE_GRAD_RHO(3, imat, i) = sumz * phase_lim_rho(imat)
578 valk = multi_fvm%PHASE_EINT(imat, i)
580 DO iface = 1, nb_face
581 kface = face_list(
iface)
585 vall = multi_fvm%PHASE_EINT(imat, j)
586 phase_maxval_pres(imat) =
max(phase_maxval_pres(imat), vall)
587 phase_minval_pres(imat) =
min(phase_minval_pres(imat), vall)
588 rhs(1) = rhs(1) + (valk - vall) * (xl(1, kface) - xk(1))
589 rhs(2) = rhs(2) + (valk - vall) * (xl(2, kface) - xk(2))
590 rhs(3) = rhs(3) + (valk - vall) * (xl(3, kface) - xk(3))
593 sol(1:3) = matmul(matm1(1:3, 1:3), rhs(1:3))
599 DO iface = 1, nb_face
600 kface = face_list(
iface)
601 delta = sumx * (xf(1, kface) - xk(1)) +
602 . sumy * (xf(2, kface) - xk(2)) +
603 . sumz * (xf(3, kface) - xk(3))
604 IF (delta > zero)
THEN
605 limface(kface) = half * (phase_maxval_pres(imat) - valk) / delta
606 ELSE IF (delta < zero)
THEN
607 limface(kface) = half * (phase_minval_pres(imat) - valk) / delta
609 CALL limiter(limface(kface), one)
611 phase_lim_pres(imat) = minval(limface(1:6))
612 multi_fvm%PHASE_GRAD_PRES(1, imat, i) = sumx * phase_lim_pres(imat)
613 multi_fvm%PHASE_GRAD_PRES(2, imat, i) = sumy * phase_lim_pres(imat)
614 multi_fvm%PHASE_GRAD_PRES(3, imat, i) = sumz * phase_lim_pres(imat)
621 IF(itask == 0)
CALL stoptime(timers,macro_timer_muscl)