37 . PM, IPM, MULTI_FVM, ALE_CONNECTIVITY, WGRID, XGRID, ITAB, NBMAT, CURRENT_TIME, BUFMAT,
38 . ID_GLOBAL_VOIS,NPF,TF)
59 use element_mod ,
only : nixs,nixq,nixtg
63#include "implicit_f.inc"
73 COMMON /tablesizf/ stf,snpc
78 INTEGER,
INTENT(IN) :: NG
79 TYPE(ELBUF_STRUCT_),
TARGET,
DIMENSION(NGROUP) :: ELBUF_TAB
80 INTEGER,
INTENT(IN) :: IPARG(NPARG, *)
81 INTEGER,
INTENT(IN) :: ITASK
82 INTEGER,
INTENT(IN) :: IXS(NIXS, *), IXQ(NIXQ, *), IXTG(NIXTG, *)
83 INTEGER,
INTENT(IN) :: IPM(NPROPMI, *)
84 my_real,
INTENT(IN) :: pm(npropm, *)
85 TYPE(multi_fvm_struct),
INTENT(INOUT) :: MULTI_FVM
87 INTEGER,
INTENT(IN) :: ID_GLOBAL_VOIS(*)
88 my_real,
INTENT(IN) :: WGRID(3, *), XGRID(3, *), CURRENT_TIME
89 INTEGER,
INTENT(IN) :: ITAB(*), NBMAT
90 my_real,
INTENT(INOUT) :: bufmat(*)
92 INTEGER,
INTENT(IN) :: NPF(SNPC)
93 my_real,
INTENT(IN) :: tf(stf)
97 TYPE(g_bufel_),
POINTER :: GBUF, GBUFJJ
98 TYPE(L_BUFEL_),
POINTER :: LBUF
100 INTEGER :: II, JJ, KFACE, I, J, KFACE2, NGJJ, NFTJJ, NELJJ, IFACE
101 INTEGER :: NEL, ISOLNOD, ITY, NFT
103 my_real :: x1(3), x2(3), x3(3), x4(3)
104 my_real :: lambdaii, lambdaf, normuii, normujj
105 my_real :: fii(5), sub_fii(3), fjj(5), normal_velii, normal_veljj, vii(5), sub_vii(3), vjj(5),
106 . velii2, veljj2, surf
107 my_real :: sl, sr, sstar, pstar, fiistar(5), sub_fiistar(3), fjjstar(5), viistar
109 my_real :: sspii, sspjj, rhoii, rhojj, pii, pjj, nx, ny, nz, normalw
110 INTEGER :: NODE1, NODE2, NODE3, NODE4
111 my_real :: vxii, vyii, vzii
112 my_real :: vxjj, vyjj, vzjj, vx, vy, vz, normvel, ssp, rho, p
113 INTEGER :: NB_FACE, ELEMID, NUMEL_SPMD
114 my_real :: machii, machjj, pstar2, theta, alphaii, sub_rhoii, sub_rhoeintii,
115 . alphastar, sub_rhostar, sub_estar, sub_pii, wfac(3)
116 TYPE(lbuf_ptr) :: LBUFS(NBMAT)
117 INTEGER :: LOCAL_MATID(NBMAT), MATLAW(NBMAT)
118 my_real :: xf(3), xk(3), xl(3)
119 my_real :: massflux1, massflux2, pshift
121 INTEGER :: KFACE3,I_OLD,J_OLD,KFACE_OLD,KFACE2_OLD
122 INTEGER :: ID_GLOBAL_VOIS_1,ID_GLOBAL_VOIS_2,IJK
123 INTEGER,
DIMENSION(MVSIZ) :: GLOBAL_ID_CURRENT_ELM
129 gbuf => elbuf_tab(ng)%GBUF
133 isolnod = iparg(28, ng)
135 pshift = multi_fvm%PRES_SHIFT
140 lbufs(imat)%LBUF => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
144 SELECT CASE (multi_fvm%SYM)
150 local_matid(imat) = ipm(20 + imat, ixs(1, 1 + nft))
154 global_id_current_elm(ii) = ixs(nixs,i)
162 local_matid(imat) = ipm(20 + imat, ixq(1, 1 + nft))
166 global_id_current_elm(ii) = ixq(nixq,i)
168 ELSEIF (ity == 7)
THEN
173 local_matid(imat) = ipm(20 + imat, ixtg(1, 1 + nft))
177 global_id_current_elm(ii) = ixtg(nixtg,i)
187 iad = ale_connectivity%ee_connect%iad_connect(i)
188 nb_face =ale_connectivity%ee_connect%iad_connect(i+1) -
189 . ale_connectivity%ee_connect%iad_connect(i)
192 DO kface3 = 1, nb_face
193 jj = ale_connectivity%ee_connect%connected(iad + kface3 - 1)
196 nx = multi_fvm%FACE_DATA%NORMAL(1, kface3, i_old)
197 ny = multi_fvm%FACE_DATA%NORMAL(2, kface3, i_old)
198 nz = multi_fvm%FACE_DATA%NORMAL(3, kface3, i_old)
199 surf = multi_fvm%FACE_DATA%SURF(kface3, i_old)
200 wfac(1:3) = multi_fvm%FACE_DATA%WFAC(1:3, kface3, i_old)
202 id_global_vois_1 = global_id_current_elm(ii)
203 id_global_vois_2 = id_global_vois( nb_face * (i_old - 1) + kface3 )
205 IF (j_old > 0 .AND. i_old < j_old)
THEN
208 kface2_old = multi_fvm%FVM_CONNECTIVITY%KVOIS(nb_face
210 IF(id_global_vois_1<id_global_vois_2)
THEN
213 kface2 = multi_fvm%FVM_CONNECTIVITY%KVOIS(nb_face * (i_old - 1) + kface
218 kface = multi_fvm%FVM_CONNECTIVITY%KVOIS(nb_face * (i_old - 1) + kface3)
233 rhoii = multi_fvm%RHO(i)
234 vxii = multi_fvm%VEL(1, i)
235 vyii = multi_fvm%VEL(2, i)
236 vzii = multi_fvm%VEL(3, i)
237 velii2 = vxii * vxii + vyii * vyii + vzii * vzii
240 pii = multi_fvm%PRES(i)
242 sspii = multi_fvm%SOUND_SPEED(i)
246 rhojj = multi_fvm%RHO(j)
248 pjj = multi_fvm%PRES(j)
250 normal_velii = vxii * nx + vyii * ny + vzii * nz
253 vxjj = multi_fvm%VEL(1, j)
254 vyjj = multi_fvm%VEL(2, j)
255 vzjj = multi_fvm%VEL(3, j)
257 normal_veljj = vxjj * nx + vyjj * ny + vzjj * nz
258 veljj2 = vxjj * vxjj + vyjj * vyjj + vzjj * vzjj
260 sspjj = multi_fvm%SOUND_SPEED(j)
262 normalw = wfac(1) * nx + wfac(2) * ny + wfac(3) * nz
265 machii = abs(normal_velii) / sspii
266 machjj = abs(normal_veljj) / sspjj
269 sl =
min(normal_velii - sspii, normal_veljj - sspjj)
270 sr =
max(normal_velii + sspii, normal_veljj + sspjj)
273 sstar = pjj - pii + rhoii * normal_velii * (sl - normal_velii
274 . rhojj * normal_veljj * (sr - normal_veljj)
276 sstar = sstar / (rhoii * (sl - normal_velii) -
277 . rhojj * (sr - normal_veljj))
282 pstar2 = pii + rhoii * (sstar
284 IF (
min(machii, machjj) < em01)
THEN
285 theta =
min(machii, machjj)
289 pstar = (one - theta) * half * (pii + pjj) + theta * pstar2
290 IF (multi_fvm%LOWMACH_OPT)
THEN
295 pp(5) = sstar * (pstar + pshift
301 pp(5) = sstar * (pstar2 + pshift)
304 IF (sl > normalw)
THEN
309 vii(2) = rhoii * vxii
310 vii(3) = rhoii * vyii
311 vii(4) = rhoii * vzii
312 vii(5) = multi_fvm%EINT(i) + half
314 fii(1) = vii(1) * normal_velii
315 fii(2) = vii(2) * normal_velii + pii * nx
316 fii(3) = vii(3) * normal_velii + pii * ny
317 fii(4) = vii(4) * normal_velii + pii * nz
318 fii(5) = (vii(5) + pii + pshift) * normal_velii
319 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction * (fii(1:5) - normalw * vii(1:5)) * surf
320 multi_fvm%FLUXES(6, kface_old, i_old) = direction * normal_velii * surf
321 massflux1 = multi_fvm%FLUXES(1, kface_old, i_old)
327 alphaii = multi_fvm%PHASE_ALPHA(imat, i)
328 sub_rhoii = multi_fvm%PHASE_RHO(imat, i)
329 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, i)
330 sub_viistar(1) = alphaii
331 sub_viistar(2) = alphaii * sub_rhoii
332 sub_viistar(3) = alphaii * sub_rhoeintii
333 sub_fiistar(1:3) = sub_viistar(1:3) * normal_velii
334 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
335 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
336 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction *
337 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
338 multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old) = direction *
339 . (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
340 massflux2 = massflux2 + multi_fvm%SUBMASS_FLUXES(imat, kface_old
344 ELSEIF (sl <= normalw .AND. normalw <= sstar)
THEN
347 vii(2) = rhoii * vxii
348 vii(3) = rhoii * vyii
349 vii(4) = rhoii * vzii
350 vii(5) = multi_fvm%EINT(i) + half * rhoii * velii2
352 fii(1) = vii(1) * normal_velii
353 fii(2) = vii(2) * normal_velii + pii * nx
354 fii(3) = vii(3) * normal_velii + pii * ny
355 fii(4) = vii(4) * normal_velii + pii * nz
356 fii(5) = (vii(5) + pii + pshift) * normal_velii
360 viistar(1:5) = fii(1:5) - (sl) * vii(1:5) - pp(1:5)
361 viistar(1:5) = viistar(1:5) / (sstar - sl)
362 fiistar(1:5) = viistar(1:5) * sstar + pp(1:5)
363 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction *
364 . (fiistar(1:5) - normalw * viistar(1:5)) * surf
365 multi_fvm%FLUXES(6, kface_old, i_old) = direction * sstar * surf
366 massflux1 = multi_fvm%FLUXES(1, kface_old, i_old)
372 matlaw(imat) = ipm(2, local_matid(imat))
373 alphaii = multi_fvm%PHASE_ALPHA(imat, i)
374 sub_rhoii = multi_fvm%PHASE_RHO(imat, i)
375 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, i)
377 sub_rhostar = sub_rhoii * (normal_velii - sl) / (sstar - sl)
378 sub_pii = multi_fvm%PHASE_PRES(imat, i)
379 IF (alphastar > zero)
THEN
384 sub_estar = sub_rhoeintii / sub_rhoii -
385 . sub_pii * (one / sub_rhostar - one / sub_rhoii)
389 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, i)
390 sub_viistar(1) = alphastar
391 sub_viistar(2) = alphastar * sub_rhostar
392 sub_viistar(3) = alphaii * sub_rhostar * sub_estar
393 sub_fiistar(1:3) = sub_viistar(1:3) * sstar
394 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
395 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
396 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction *
397 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
398 multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old) = direction *
399 . (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
400 massflux2 = massflux2 + multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old)
403 ELSEIF (sstar < normalw .AND. normalw <= sr)
THEN
406 vii(2) = rhojj * vxjj
407 vii(3) = rhojj * vyjj
408 vii(4) = rhojj * vzjj
409 vii(5) = multi_fvm%EINT(j) + half * rhojj * veljj2
411 fii(1) = vii(1) * normal_veljj
412 fii(2) = vii(2) * normal_veljj + pjj * nx
413 fii(3) = vii(3) * normal_veljj + pjj * ny
414 fii(4) = vii(4) * normal_veljj + pjj* nz
415 fii(5) = (vii(5) + pjj + pshift) * normal_veljj
420 viistar(1:5) = viistar(1:5) / (sstar
421 fiistar(1:5) = viistar(1:5) *
422 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction *
423 . (fiistar(1:5) - normalw * viistar(1:5)) * surf
424 multi_fvm%FLUXES(6, kface_old, i_old) = direction * sstar * surf
425 massflux1 = multi_fvm%FLUXES(1, kface_old, i_old)
431 matlaw(imat) = ipm(2, local_matid(imat))
432 alphaii = multi_fvm%PHASE_ALPHA(imat, j)
433 sub_rhoii = multi_fvm%PHASE_RHO(imat, j)
434 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, j
436 sub_rhostar = sub_rhoii * (normal_veljj - sr) / (sstar - sr)
437 sub_pii = multi_fvm%PHASE_PRES(imat, j)
438 IF (alphastar > zero)
THEN
443 sub_estar = sub_rhoeintii / sub_rhoii -
444 . sub_pii * (one / sub_rhostar - one / sub_rhoii)
449 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, j)
450 sub_viistar(1) = alphastar
451 sub_viistar(2) = alphastar * sub_rhostar
452 sub_viistar(3) = alphaii * sub_rhostar * sub_estar
453 sub_fiistar(1:3) = sub_viistar(1:3) * sstar
454 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
455 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
456 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction *
457 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
458 multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old) = direction *
459 . (sub_fiistar(3) - normalw * sub_viistar
460 massflux2 = massflux2 + multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old)
463 ELSE IF (sr < normalw)
THEN
468 vii(2) = rhojj * vxjj
469 vii(3) = rhojj * vyjj
470 vii(4) = rhojj * vzjj
471 vii(5) = multi_fvm%EINT(j) + half * rhojj * veljj2
473 fii(1) = vii(1) * normal_veljj
474 fii(2) = vii(2) * normal_veljj + pjj * nx
475 fii(3) = vii(3) * normal_veljj + pjj * ny
476 fii(4) = vii(4) * normal_veljj + pjj * nz
477 fii(5) = (vii(5) + pjj + pshift) * normal_veljj
478 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction
479 multi_fvm%FLUXES(6, kface_old, i_old) = direction * normal_veljj * surf
480 massflux1 = multi_fvm%FLUXES(1, kface_old, i_old)
486 alphaii = multi_fvm%PHASE_ALPHA(imat, j
487 sub_rhoii = multi_fvm%PHASE_RHO(imat, j)
488 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, j)
489 sub_viistar(1) = alphaii
490 sub_viistar(2) = alphaii * sub_rhoii
491 sub_viistar(3) = alphaii * sub_rhoeintii
492 sub_fiistar(1:3) = sub_viistar(1:3) * normal_veljj
493 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
494 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
496 . (sub_fiistar(2) - normalw
497 multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old) = direction *
498 . (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
499 massflux2 = massflux2 + multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old)
507 IF (j_old <= numel_spmd)
THEN
508 multi_fvm%FLUXES(1:6, kface2_old, j_old) = -multi_fvm%FLUXES(1:6, kface_old, i_old)
511 multi_fvm%SUBVOL_FLUXES(imat
512 multi_fvm%SUBMASS_FLUXES(imat, kface2_old, j_old) = -multi_fvm%SUBMASS_FLUXES
513 multi_fvm%SUBENER_FLUXES(imat, kface2_old, j_old) = -multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old)
520 ELSE IF(j_old <= 0)
THEN
522 vx = multi_fvm%VEL(1, elemid)
523 vy = multi_fvm%VEL(2, elemid)
524 vz = multi_fvm%VEL(3, elemid)
525 normvel = vx * nx + vy * ny + vz
526 normalw = wfac(1) * nx + wfac(2) * ny + wfac(3) * nz
527 ssp = multi_fvm%SOUND_SPEED(elemid)
528 rho = multi_fvm%RHO(elemid)
530 sl =
min(normvel - ssp, two * normalw - normvel - ssp)
531 sr =
max(normvel + ssp, two * normalw - normvel + ssp)
536 p = multi_fvm%PRES(elemid)
537 pstar = p + rho * (sstar - normvel) * (sl - normvel)
543 pp(5) = sstar * (pstar + pshift)
544 multi_fvm%FLUXES(1:5, kface3, elemid) = surf * pp(1:5)
545 multi_fvm%FLUXES(6, kface3, elemid) = surf * normalw
550 multi_fvm%SUBVOL_FLUXES(imat, kface3, i_old) = zero
551 multi_fvm%SUBMASS_FLUXES(imat, kface3, i_old) = zero
552 multi_fvm%SUBENER_FLUXES(imat, kface3, i_old) = zero