36 . PM, IPM, MULTI_FVM, ALE_CONNECTIVITY, WGRID, XGRID, ITAB, NBMAT, CURRENT_TIME, BUFMAT,
37 . ID_GLOBAL_VOIS,NPF,TF)
46! --> element1 drives
the computation
61#include "implicit_f.inc"
71 COMMON /tablesizf/ stf,snpc
76 INTEGER,
INTENT(IN) :: NG
77 TYPE(ELBUF_STRUCT_),
TARGET,
DIMENSION(NGROUP) :: ELBUF_TAB
78 INTEGER,
INTENT(IN) :: IPARG(NPARG, *)
79 INTEGER,
INTENT(IN) :: ITASK
80 INTEGER,
INTENT(IN) :: IXS(NIXS, *), IXQ(NIXQ, *), IXTG(NIXTG, *)
81 INTEGER,
INTENT(IN) :: IPM(NPROPMI, *)
82 my_real,
INTENT(IN) :: pm(npropm, *)
83 TYPE(multi_fvm_struct),
INTENT(INOUT) :: MULTI_FVM
85 INTEGER,
INTENT(IN) :: ID_GLOBAL_VOIS(*)
86 my_real,
INTENT(IN) :: WGRID(3, *), XGRID(3, *), CURRENT_TIME
87 INTEGER,
INTENT(IN) :: ITAB(*), NBMAT
88 my_real,
INTENT(INOUT) :: bufmat(*)
89 TYPE(),
INTENT(IN) :: ALE_CONNECTIVITY
90 INTEGER,
INTENT(IN) :: NPF(SNPC)
91 my_real,
INTENT(IN) :: tf(stf)
95 TYPE(g_bufel_),
POINTER :: GBUF, GBUFJJ
96 TYPE(L_BUFEL_),
POINTER :: LBUF
98 INTEGER :: II, JJ, KFACE, I, J, KFACE2, NGJJ, NFTJJ, NELJJ, IFACE
99 INTEGER :: NEL, ISOLNOD, ITY, NFT
101 my_real :: x1(3), x2(3), x3(3), x4(3)
102 my_real :: lambdaii, lambdaf, normuii, normujj
103 my_real :: fii(5), sub_fii(3), fjj(5), normal_velii, normal_veljj, vii(5), sub_vii(3), vjj(5
104 . velii2, veljj2, surf
107 my_real :: sspii, sspjj, rhoii, rhojj, pii, pjj, nx, ny, nz, normalw
108 INTEGER :: NODE1, NODE2, NODE3, NODE4
109 my_real :: vxii, vyii, vzii
110 my_real :: vxjj, vyjj, vzjj, vx, vy, vz, normvel, ssp, rho, p
111 INTEGER :: NB_FACE, ELEMID, NUMEL_SPMD
112 my_real :: machii, machjj, pstar2, theta, alphaii, sub_rhoii, sub_rhoeintii,
113 . alphastar, sub_rhostar, sub_estar, sub_pii, wfac(3)
114 TYPE(lbuf_ptr) :: LBUFS(NBMAT)
115 INTEGER :: LOCAL_MATID(NBMAT), (NBMAT)
116 my_real :: xf(3), xk(3), xl(3)
117 my_real :: massflux1, massflux2, pshift
119 INTEGER :: KFACE3,I_OLD,J_OLD,KFACE_OLD,KFACE2_OLD
120 INTEGER :: ID_GLOBAL_VOIS_1,ID_GLOBAL_VOIS_2,IJK
121 INTEGER,
DIMENSION(MVSIZ) ::
127 gbuf => elbuf_tab(ng)%GBUF
131 isolnod = iparg(28, ng)
133 pshift = multi_fvm%PRES_SHIFT
138 lbufs(imat)%LBUF => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
142 SELECT CASE (multi_fvm%SYM)
148 local_matid(imat) = ipm(20 + imat, ixs(1, 1 + nft))
152 global_id_current_elm(ii) = ixs(nixs,i)
160 local_matid(imat) = ipm(20 + imat, ixq(1, 1 + nft))
164 global_id_current_elm(ii) = ixq
166 ELSEIF (ity == 7)
THEN
171 local_matid(imat) = ipm(20 + imat, ixtg(1, 1 + nft))
175 global_id_current_elm(ii) = ixtg(nixtg,i)
185 iad = ale_connectivity%ee_connect%iad_connect(i)
186 nb_face =ale_connectivity%ee_connect%iad_connect(i+1) -
187 . ale_connectivity%ee_connect%iad_connect(i)
190 DO kface3 = 1, nb_face
191 jj = ale_connectivity%ee_connect%connected(iad + kface3 - 1)
194 nx = multi_fvm%FACE_DATA%NORMAL(1, kface3, i_old)
195 ny = multi_fvm%FACE_DATA%NORMAL(2, kface3, i_old)
196 nz = multi_fvm%FACE_DATA%NORMAL(3, kface3, i_old)
197 surf = multi_fvm%FACE_DATA%SURF(kface3, i_old)
198 wfac(1:3) = multi_fvm%FACE_DATA%WFAC(1:3, kface3, i_old)
200 id_global_vois_1 = global_id_current_elm(ii)
201 id_global_vois_2 = id_global_vois( nb_face * (i_old - 1) + kface3 )
202! -----------------------------------------------
203 IF (j_old > 0 .AND. i_old < j_old)
THEN
206 kface2_old = multi_fvm%FVM_CONNECTIVITY%KVOIS(nb_face * (i_old - 1) + kface3)
208 IF(id_global_vois_1<id_global_vois_2)
THEN
211 kface2 = multi_fvm%FVM_CONNECTIVITY%KVOIS(nb_face * (i_old - 1) + kface)
216 kface = multi_fvm%FVM_CONNECTIVITY%KVOIS(nb_face * (i_old - 1) + kface3)
231 rhoii = multi_fvm%RHO(i)
232 vxii = multi_fvm%VEL(1, i)
233 vyii = multi_fvm%VEL(2, i)
234 vzii = multi_fvm%VEL(3, i)
235 velii2 = vxii * vxii + vyii * vyii + vzii * vzii
238 pii = multi_fvm%PRES(i)
240 sspii = multi_fvm%SOUND_SPEED(i)
244 rhojj = multi_fvm%RHO(j)
246 pjj = multi_fvm%PRES(j)
248 normal_velii = vxii * nx + vyii * ny + vzii * nz
251 vxjj = multi_fvm%VEL(1, j)
252 vyjj = multi_fvm%VEL(2, j)
253 vzjj = multi_fvm%VEL(3, j)
255 normal_veljj = vxjj * nx + vyjj * ny + vzjj * nz
256 veljj2 = vxjj * vxjj + vyjj * vyjj + vzjj * vzjj
258 sspjj = multi_fvm%SOUND_SPEED(j)
260 normalw = wfac(1) * nx + wfac(2) * ny + wfac(3) * nz
263 machii = abs(normal_velii) / sspii
264 machjj = abs(normal_veljj) / sspjj
267 sl =
min(normal_velii - sspii, normal_veljj - sspjj)
268 sr =
max(normal_velii + sspii, normal_veljj + sspjj)
271 sstar = pjj - pii + rhoii * normal_velii * (sl - normal_velii) -
272 . rhojj * normal_veljj * (sr - normal_veljj)
274 sstar = sstar / (rhoii * (sl - normal_velii) -
275 . rhojj * (sr - normal_veljj))
280 pstar2 = pii + rhoii * (sstar - normal_velii) * (sl - normal_velii)
282 IF (
min(machii, machjj) < em01)
THEN
283 theta =
min(machii, machjj)
287 pstar = (one - theta) * half * (pii + pjj) +
288 IF (multi_fvm%LOWMACH_OPT)
THEN
293 pp(5) = sstar * (pstar + pshift)
299 pp(5) = sstar * (pstar2 + pshift)
302 IF (sl > normalw)
THEN
307 vii(2) = rhoii * vxii
308 vii(3) = rhoii * vyii
309 vii(4) = rhoii * vzii
310 vii(5) = multi_fvm%EINT(i) + half * rhoii * velii2
312 fii(1) = vii(1) * normal_velii
313 fii(2) = vii(2) * normal_velii + pii * nx
314 fii(3) = vii(3) * normal_velii + pii * ny
315 fii(4) = vii(4) * normal_velii + pii * nz
316 fii(5) = (vii(5) + pii + pshift) * normal_velii
317 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction * (fii(1:5) - normalw * vii(1:5)) * surf
318 multi_fvm%FLUXES(6, kface_old, i_old) = direction
319 massflux1 = multi_fvm%FLUXES(1, kface_old, i_old)
325 alphaii = multi_fvm%PHASE_ALPHA(imat, i)
326 sub_rhoii = multi_fvm%PHASE_RHO(imat, i)
327 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, i)
328 sub_viistar(1) = alphaii
329 sub_viistar(2) = alphaii * sub_rhoii
330 sub_viistar(3) = alphaii * sub_rhoeintii
331 sub_fiistar(1:3) = sub_viistar(1:3) * normal_velii
332 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
333 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
334 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction *
335 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
336 multi_fvm%SUBENER_FLUXES(imat, kface_old
337 . (sub_fiistar(3) - normalw * sub_viistar
338 massflux2 = massflux2 + multi_fvm%SUBMASS_FLUXES(imat, kface_old
342 ELSEIF (sl <= normalw .AND. normalw <= sstar)
THEN
345 vii(2) = rhoii * vxii
346 vii(3) = rhoii * vyii
347 vii(4) = rhoii * vzii
348 vii(5) = multi_fvm%EINT(i) + half * rhoii * velii2
350 fii(1) = vii(1) * normal_velii
351 fii(2) = vii(2) * normal_velii + pii * nx
353 fii(4) = vii(4) * normal_velii + pii * nz
359 viistar(1:5) = viistar(1:5) / (sstar - sl)
360 fiistar(1:5) = viistar(1:5) * sstar + pp(1:5)
361 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction *
362 . (fiistar(1:5) - normalw * viistar(1:5)) * surf
363 multi_fvm%FLUXES(6, kface_old, i_old) = direction * sstar * surf
364 massflux1 = multi_fvm%FLUXES(1, kface_old, i_old)
370 matlaw(imat) = ipm(2, local_matid(imat))
371 alphaii = multi_fvm%PHASE_ALPHA(imat, i)
372 sub_rhoii = multi_fvm%PHASE_RHO(imat, i)
373 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, i)
375 sub_rhostar = sub_rhoii * (normal_velii - sl) / (sstar - sl)
376 sub_pii = multi_fvm%PHASE_PRES(imat, i)
377 IF (alphastar > zero)
THEN
382 sub_estar = sub_rhoeintii / sub_rhoii -
383 . sub_pii * (one / sub_rhostar - one / sub_rhoii)
387 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, i)
388 sub_viistar(1) = alphastar
389 sub_viistar(2) = alphastar * sub_rhostar
390 sub_viistar(3) = alphaii * sub_rhostar * sub_estar
391 sub_fiistar(1:3) = sub_viistar(1:3) * sstar
392 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
393 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
394 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction *
395 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
396 multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old) = direction *
397 . (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
398 massflux2 = massflux2 + multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old)
401 ELSEIF (sstar < normalw .AND. normalw <= sr)
THEN
404 vii(2) = rhojj * vxjj
405 vii(3) = rhojj * vyjj
406 vii(4) = rhojj * vzjj
407 vii(5) = multi_fvm%EINT(j) + half * rhojj * veljj2
409 fii(1) = vii(1) * normal_veljj
411 fii(3) = vii(3) * normal_veljj + pjj * ny
412 fii(4) = vii(4) * normal_veljj + pjj
413 fii(5) = (vii(5) + pjj + pshift) * normal_veljj
417 viistar(1:5) = fii(1:5) - (sr) * vii(1:5) - pp(1:5)
418 viistar(1:5) = viistar(1:5) / (sstar - sr)
419 fiistar(1:5) = viistar(1:5) * sstar + pp(1:5)
420 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction *
421 . (fiistar(1:5) - normalw * viistar(1:5)) * surf
422 multi_fvm%FLUXES(6, kface_old, i_old) = direction * sstar * surf
423 massflux1 = multi_fvm%FLUXES(1, kface_old, i_old)
429 matlaw(imat) = ipm(2, local_matid(imat))
430 alphaii = multi_fvm%PHASE_ALPHA(imat, j)
431 sub_rhoii = multi_fvm%PHASE_RHO(imat, j)
432 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, j)
434 sub_rhostar = sub_rhoii * (normal_veljj - sr) / (sstar - sr)
435 sub_pii = multi_fvm%PHASE_PRES(imat, j)
436 IF (alphastar > zero)
THEN
441 sub_estar = sub_rhoeintii / sub_rhoii -
442 . sub_pii * (one / sub_rhostar - one / sub_rhoii)
447 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, j)
448 sub_viistar(1) = alphastar
449 sub_viistar(2) = alphastar * sub_rhostar
450 sub_viistar(3) = alphaii * sub_rhostar
451 sub_fiistar(1:3) = sub_viistar(1:3) * sstar
452 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
453 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
454 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction
455 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
456 multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old) = direction
457 . (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
458 massflux2 = massflux2 + multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old)
461 ELSE IF (sr < normalw)
THEN
466 vii(2) = rhojj * vxjj
467 vii(3) = rhojj * vyjj
468 vii(4) = rhojj * vzjj
469 vii(5) = multi_fvm%EINT(j) + half * rhojj
471 fii(1) = vii(1) * normal_veljj
472 fii(2) = vii(2) * normal_veljj + pjj * nx
473 fii(3) = vii(3) * normal_veljj +
474 fii(4) = vii(4) * normal_veljj + pjj * nz
475 fii(5) = (vii(5) + pjj + pshift) * normal_veljj
476 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction * (fii(1:5) - normalw * vii(1:5)) * surf
477 multi_fvm%FLUXES(6, kface_old, i_old
478 massflux1 = multi_fvm%FLUXES(1, kface_old, i_old)
484 alphaii = multi_fvm%PHASE_ALPHA
485 sub_rhoii = multi_fvm%PHASE_RHO(imat, j)
486 sub_rhoeintii = multi_fvm%PHASE_EINT(imat, j)
487 sub_viistar(1) = alphaii
488 sub_viistar(2) = alphaii * sub_rhoii
489 sub_viistar(3) = alphaii * sub_rhoeintii
490 sub_fiistar(1:3) = sub_viistar
491 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
492 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
493 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction *
494 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
495 multi_fvm%SUBENER_FLUXES(imat, kface_old
496 . (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
497 massflux2 = massflux2 + multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old)
505 IF (j_old <= numel_spmd
THEN
506 multi_fvm%FLUXES(1:6, kface2_old, j_old) = -multi_fvm%FLUXES(1:6, kface_old, i_old)
509 multi_fvm%SUBVOL_FLUXES(imat, kface2_old,
510 multi_fvm%SUBMASS_FLUXES(imat, kface2_old
511 multi_fvm%SUBENER_FLUXES(imat, kface2_old, j_old) = -multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old)
517! -----------------------------------------------
518 ELSE IF(j_old <= 0)
THEN
520 vx = multi_fvm%VEL(1, elemid)
521 vy = multi_fvm%VEL(2, elemid)
522 vz = multi_fvm%VEL(3, elemid)
523 normvel = vx * nx + vy * ny + vz
524 normalw = wfac(1) * nx + wfac(2) * ny + wfac(3) * nz
525 ssp = multi_fvm%SOUND_SPEED(elemid)
526 rho = multi_fvm%RHO(elemid)
528 sl =
min(normvel - ssp, two * normalw - normvel - ssp)
529 sr =
max(normvel + ssp, two * normalw - normvel + ssp)
534 p = multi_fvm%PRES(elemid)
535 pstar = p + rho * (sstar - normvel) * (sl - normvel)
541 pp(5) = sstar * (pstar + pshift)
542 multi_fvm%FLUXES(1:5, kface3, elemid) = surf * pp(1:5)
543 multi_fvm%FLUXES(6, kface3, elemid) = surf * normalw
548 multi_fvm%SUBVOL_FLUXES(imat, kface3, i_old) = zero
549 multi_fvm%SUBMASS_FLUXES(imat, kface3, i_old) = zero
550 multi_fvm%SUBENER_FLUXES(imat, kface3, i_old) = zero