48 . NG, ELBUF_TAB, IPARG, ITASK,
50 . PM, IPM, MULTI_FVM, ALE_CONNECTIVITY, WGRID, XGRID, ITAB, NBMAT, CURRENT_TIME, BUFMAT,
51 . ID_GLOBAL_VOIS,FACE_VOIS,NPF,TF,ISPMD,MATPARAM)
73 USE matparam_def_mod,
ONLY : matparam_struct_
75 USE multi_muscl_compute_pressure_mod ,
ONLY : multi_muscl_compute_pressure
79#include "implicit_f.inc"
91 COMMON /tablesizf/ stf,snpc
96 TYPE(matparam_struct_),
DIMENSION(NUMMAT),
INTENT(IN) :: MATPARAM
97 INTEGER,
INTENT(IN) :: NG, ISPMD
98 TYPE(ELBUF_STRUCT_),
TARGET,
DIMENSION(NGROUP) :: ELBUF_TAB
99 INTEGER,
INTENT(IN) :: IPARG(NPARG, NGROUP)
100 INTEGER,
INTENT(IN) :: ITASK
101 INTEGER,
INTENT(IN) :: IXS(NIXS, *), IXQ(NIXQ, *), IXTG(NIXTG, *)
102 INTEGER,
INTENT(IN) :: IPM(NPROPMI, NUMMAT)
103 my_real,
INTENT(IN) :: pm(npropm, nummat)
104 TYPE(multi_fvm_struct),
INTENT(INOUT) :: MULTI_FVM
106 INTEGER,
INTENT(IN) :: ID_GLOBAL_VOIS(*),FACE_VOIS(*)
107 my_real,
INTENT(IN) :: wgrid(3, *), xgrid(3, *), current_time
108 INTEGER,
INTENT(IN) :: ITAB(*), NBMAT
109 my_real,
INTENT(INOUT) :: BUFMAT(*)
111 INTEGER,
INTENT(IN) :: NPF(SNPC)
112 my_real,
INTENT(IN) :: tf(stf)
116 INTEGER :: II, JJ, KFACE, I, J, , KK, ID_OUT, IARRAY(2)
117 INTEGER :: ITY, NFT, NEL
119 INTEGER :: KFACE3,I_OLD,J_OLD,KFACE_OLD,KFACE2_OLD
120 INTEGER :: ID_GLOBAL_VOIS_1,ID_GLOBAL_VOIS_2
121 INTEGER,
DIMENSION(MVSIZ) :: GLOBAL_ID_CURRENT_ELM
123 INTEGER :: NB_FACE, ELEMID, NUMEL_SPMD
124 INTEGER :: LOCAL_MATID(NBMAT), MATLAW(NBMAT),IDX(6), NVAREOS(NBMAT),NVARTMP_EOS(NBMAT)
125 my_real :: fii(5), normal_velii, normal_veljj, vii(5), velii2, veljj2, surf
126 my_real :: sl, sr, sstar, pstar, fiistar(5), sub_fiistar(3), viistar(5), pp(5),sub_viistar(3)
127 my_real :: sspii(1), sspjj(1), rhoii(1), rhojj(1), pii(1), pjj(1), nx, ny, nz, normalw
128 my_real :: vxii, vyii, vzii
129 my_real :: vxjj, vyjj, vzjj, vx, vy, vz, normvel, ssp, rho, p
130 my_real :: machii, machjj, pstar2, theta, alphaii
131 my_real :: sub_rhoii, sub_rhoeintii,alphastar, sub_rhostar, sub_estar, sub_pii, wfac(3)
132 my_real :: xf(3), xk(3), xl(3)
133 my_real :: eintii(1), eintjj(1)
134 my_real :: phase_rhoii(nbmat), phase_presii(nbmat), phase_eintii(nbmat)
136 my_real :: phase_rhojj(nbmat), phase_presjj(nbmat), phase_eintjj(nbmat)
137 my_real :: phase_sspjj(nbmat), phase_alphajj(nbmat), cumul_alpha, pshift
139 TYPE(lbuf_ptr) :: LBUFS(NBMAT)
140 TYPE(ebuf_ptr) :: EBUFS(NBMAT)
141 TYPE(g_bufel_),
POINTER :: GBUF
142 TYPE(),
POINTER :: EBUF
148 gbuf => elbuf_tab(ng)%GBUF
153 pshift = multi_fvm%PRES_SHIFT
162 lbufs(imat)%LBUF => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
163 ebufs(imat)%EBUF => elbuf_tab(ng)%BUFLY(imat)%EOS(1, 1, 1)
164 nvareos(imat) = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
165 nvartmp_eos(imat) = elbuf_tab(ng)%BUFLY(imat)%NVARTMP_EOS
170 NULLIFY( lbufs(imat)%LBUF, ebufs(imat)%EBUF )
171 ebuf => elbuf_tab(ng)%BUFLY(1)%EOS(1,1,1)
172 nvareos(1) = elbuf_tab(ng)%BUFLY(1)%NVAR_EOS
173 nvartmp_eos(1) = elbuf_tab(ng)%BUFLY(1)%NVARTMP_EOS
177 SELECT CASE (multi_fvm%SYM)
183 local_matid(imat) = matparam(ixs(1, 1 + nft))%MULTIMAT%MID(imat)
187 global_id_current_elm(ii) = ixs(nixs,i)
195 local_matid(imat) = matparam(ixq(1, 1 + nft))%MULTIMAT%MID(imat)
199 global_id_current_elm(ii) = ixq(nixq,i)
201 ELSEIF (ity == 7)
THEN
206 local_matid(imat) = matparam(ixtg(1, 1 + nft))%MULTIMAT%MID(imat)
210 global_id_current_elm(ii) = ixtg(nixtg,i)
220 iad = ale_connectivity%ee_connect%iad_connect(i)
221 nb_face = ale_connectivity%ee_connect%iad_connect(i+1) -
222 . ale_connectivity%ee_connect%iad_connect(i)
225 DO kface3 = 1, nb_face
226 jj = ale_connectivity%ee_connect%connected(iad + kface3 - 1)
229 nx = multi_fvm%FACE_DATA%NORMAL(1, kface3, i_old)
230 ny = multi_fvm%FACE_DATA%NORMAL(2, kface3, i_old)
231 nz = multi_fvm%FACE_DATA%NORMAL(3, kface3, i_old)
232 surf = multi_fvm%FACE_DATA%SURF(kface3, i_old)
233 wfac(1:3) = multi_fvm%FACE_DATA%WFAC(1:3, kface3, i_old)
235 id_global_vois_1 = global_id_current_elm(ii)
236 id_global_vois_2 = id_global_vois( nb_face * (i_old - 1) + kface3 )
239 IF (j_old <= numel_spmd)
THEN
240 kface2_old = multi_fvm%FVM_CONNECTIVITY%KVOIS(nb_face * (i_old - 1) + kface3)
242 kface2_old = face_vois( nb_face * (i_old - 1) + kface3 )
247 IF (j_old > 0 .AND. i_old < j_old)
THEN
250 IF(id_global_vois_1<id_global_vois_2)
THEN
268 normalw = wfac(1) * nx + wfac(2) * ny + wfac(3) * nz
276 xk(1:3) = multi_fvm%ELEM_DATA%CENTROID(1:3, i)
277 xl(1:3) = multi_fvm%ELEM_DATA%CENTROID(1:3, j)
278 xf(1:3) = multi_fvm%FACE_DATA%CENTROID(1:3, kface, i)
281 vxii = multi_fvm%VEL(1, i)
282 vyii = multi_fvm%VEL(2, i)
283 vzii = multi_fvm%VEL(3, i)
285 IF (multi_fvm%MUSCL == 1)
THEN
286 vxii = vxii + multi_fvm%GRAD_U(1, i) * (xf(1) - xk(1))
287 . + multi_fvm%GRAD_U(2, i) * (xf(2) - xk(2))
288 . + multi_fvm%GRAD_U(3, i) * (xf(3) - xk(3))
289 vyii = vyii + multi_fvm%GRAD_V(1, i) * (xf(1) - xk(1))
290 . + multi_fvm%GRAD_V(2, i) * (xf(2) - xk(2))
291 . + multi_fvm%GRAD_V(3, i) * (xf(3) - xk(3))
292 vzii = vzii + multi_fvm%GRAD_W(1, i) * (xf(1) - xk(1))
293 . + multi_fvm%GRAD_W(2, i) * (xf(2) - xk(2))
294 . + multi_fvm%GRAD_W(3, i) * (xf(3) - xk(3))
298 velii2 = vxii * vxii + vyii * vyii + vzii * vzii
300 normal_velii = vxii * nx + vyii * ny + vzii * nz
302 IF (multi_fvm%NBMAT == 1)
THEN
304 rhoii(1) = multi_fvm%RHO(i)
305 eintii(1) = multi_fvm%EINT(i)
307 IF (multi_fvm%MUSCL == 1)
THEN
308 rhoii(1) = rhoii(1) + multi_fvm%GRAD_RHO(1, i) * (xf(1) - xk(1))
309 . + multi_fvm%GRAD_RHO(2, i) * (xf(2) - xk(2))
310 . + multi_fvm%GRAD_RHO(3, i) * (xf(3) - xk(3))
311 eintii(1) = eintii(1) + multi_fvm%GRAD_PRES(1, i) * (xf(1) - xk(1))
312 . + multi_fvm%GRAD_PRES(2, i
313 . + multi_fvm%GRAD_PRES(3, i) * (xf(3) - xk(3))
315 matlaw(1) = ipm(2, local_matid(1))
316 CALL multi_muscl_compute_pressure(matlaw(1), local_matid(1), pm, ipm, npropm, npropmi,
317 . eintii(1), rhoii(1), pii(1), sspii(1),
318 . multi_fvm%BFRAC(1, i), gbuf%TB(ii:), gbuf%DELTAX(ii:), current_time,
319 . bufmat, gbuf%OFF(ii:), gbuf%SIG(ii+idx(1):ii+idx(6)), snpc, stf, npf, tf, ebuf%VAR, nvareos(1),
320 . matparam(local_matid(1)) ,nvartmp_eos(1), ebuf%VARTMP,nummat,gbuf%ABURN(ii:))
331 phase_alphaii(imat) = multi_fvm%PHASE_ALPHA(imat, i)
332 . + multi_fvm%PHASE_GRAD_ALPHA(1, imat, i) * (xf(1) - xk
333 . + multi_fvm%PHASE_GRAD_ALPHA(2, imat, i) * (xf(
334 . + multi_fvm%PHASE_GRAD_ALPHA(3, imat, i) * (xf(3) - xk(3))
335 phase_alphaii(imat) =
max(phase_alphaii(imat), zero)
336 cumul_alpha = cumul_alpha + phase_alphaii(imat)
340 phase_alphaii(imat) = phase_alphaii(imat) / cumul_alpha
341 phase_rhoii(imat) = multi_fvm%PHASE_RHO(imat, i)
342 phase_eintii(imat) = multi_fvm%PHASE_EINT(imat, i)
343 IF (multi_fvm%MUSCL == 1)
THEN
344 phase_rhoii(imat) = phase_rhoii(imat)
345 . + multi_fvm%PHASE_GRAD_RHO(1, imat, i) * (xf(1) - xk(1))
346 . + multi_fvm%PHASE_GRAD_RHO(2, imat, i) * (xf(2) - xk
347 . + multi_fvm%PHASE_GRAD_RHO(3, imat, i) * (xf(3) - xk(3))
348 phase_eintii(imat) = phase_eintii(imat)
350 . + multi_fvm%PHASE_GRAD_PRES(2, imat, i) * (xf(2) - xk(2))
351 . + multi_fvm%PHASE_GRAD_PRES(3, imat, i) * (xf(3) - xk(3))
354 rhoii(1) = rhoii(1) + phase_alphaii(imat) * phase_rhoii(imat)
355 matlaw(imat) = ipm(2, local_matid(imat))
356 IF (phase_alphaii(imat) > zero)
THEN
357 nvareos = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
358 CALL multi_muscl_compute_pressure(matlaw(imat), local_matid(imat), pm, ipm,
359 . phase_eintii(imat), phase_rhoii(imat), phase_presii(imat), phase_sspii(imat),
360 . multi_fvm%BFRAC(imat, i), gbuf%TB(ii:), gbuf%DELTAX(ii:), current_time,
361 . bufmat, lbufs(imat)%LBUF%OFF(ii:),lbufs(imat)%LBUF%SIG(ii+idx(1):ii+idx(6)), snpc,stf,npf,tf,
362 . ebufs(imat)%EBUF%VAR,nvareos(imat), matparam(local_matid(imat)),
363 . nvartmp_eos(imat),ebufs(imat)%EBUF%VARTMP,nummat,gbuf%ABURN(ii:))
365 pii(1) = pii(1) + phase_alphaii(imat) * phase_presii(imat)
366 eintii(1) = eintii(1) + phase_alphaii(imat) * phase_eintii(imat)
367 sspii(1) = sspii(1) + phase_alphaii(imat) * phase_rhoii(imat) *
max(em20, phase_sspii(imat))
370 IF (sspii(1) / rhoii(1) > zero)
THEN
371 sspii(1) = sqrt(sspii(1) / rhoii(1))
373 sspii(1) = multi_fvm%SOUND_SPEED(i)
378 vxjj = multi_fvm%VEL(1, j)
379 vyjj = multi_fvm%VEL(2, j)
380 vzjj = multi_fvm%VEL(3, j)
381 IF (multi_fvm%MUSCL == 1)
THEN
383 . + multi_fvm%GRAD_U(1, j) * (xf(1) - xl(1))
384 . + multi_fvm%GRAD_U(2, j) * (xf(2) - xl(2))
385 . + multi_fvm%GRAD_U(3, j) * (xf(3) - xl(3))
387 . + multi_fvm%GRAD_V(1, j) * (xf(1) - xl(1))
388 . + multi_fvm%GRAD_V(2, j) * (xf(2) - xl(2))
389 . + multi_fvm%GRAD_V(3, j) * (xf(3) - xl(3))
391 . + multi_fvm%GRAD_W(1, j) * (xf(1) - xl(1))
392 . + multi_fvm%GRAD_W(2, j) * (xf(2) - xl(2))
393 . + multi_fvm%GRAD_W(3, j) * (xf(3) - xl(3))
396 normal_veljj = vxjj * nx + vyjj * ny + vzjj * nz
397 veljj2 = vxjj * vxjj + vyjj * vyjj + vzjj * vzjj
400 IF (multi_fvm%NBMAT == 1)
THEN
402 rhojj(1) = multi_fvm%RHO(j)
403 eintjj(1) = multi_fvm%EINT(j)
404 IF (multi_fvm%MUSCL == 1)
THEN
406 . + multi_fvm%GRAD_RHO(1, j) * (xf(1) - xl(1))
407 . + multi_fvm%GRAD_RHO(2, j) * (xf(2) - xl(2))
408 . + multi_fvm%GRAD_RHO(3, j) * (xf(3) - xl(3))
409 eintjj(1) = eintjj(1)
410 . + multi_fvm%GRAD_PRES(1, j) * (xf(1) - xl(1))
411 . + multi_fvm%GRAD_PRES(2, j) * (xf(2) - xl(2))
412 . + multi_fvm%GRAD_PRES(3, j) * (xf(3) - xl(3))
414 matlaw(1) = ipm(2, local_matid(1))
415 nvareos = elbuf_tab(ng)%BUFLY(1)%NVAR_EOS
416 CALL multi_muscl_compute_pressure(matlaw(1), local_matid(1), pm, ipm, npropm, npropmi,
417 . eintjj(1), rhojj(1), pjj(1), sspjj(1),
418 . multi_fvm%BFRAC(1, j), gbuf%TB(ii:), gbuf%DELTAX(ii:), current_time,
419 . bufmat, gbuf%OFF(ii:),gbuf%SIG(ii+idx(1):ii+idx(6)), snpc,stf,npf,tf,ebuf%VAR,nvareos(1),
420 . matparam(local_matid(1)),
421 . nvartmp_eos(1),ebuf%VARTMP,nummat,gbuf%ABURN(ii:))
422 sspjj(1) = sqrt(sspjj(1))
430 phase_alphajj(imat) = multi_fvm%PHASE_ALPHA(imat, j)
431 . + multi_fvm%PHASE_GRAD_ALPHA(1, imat, j) * (xf(1) - xl(1))
432 . + multi_fvm%PHASE_GRAD_ALPHA(2, imat, j) * (xf(2) - xl(2))
433 . + multi_fvm%PHASE_GRAD_ALPHA(3, imat, j) * (xf(3) - xl(3))
434 phase_alphajj(imat) =
max(phase_alphajj(imat), zero)
435 cumul_alpha = cumul_alpha + phase_alphajj(imat)
439 phase_alphajj(imat) = phase_alphajj(imat) / cumul_alpha
440 phase_rhojj(imat) = multi_fvm%PHASE_RHO(imat, j)
441 phase_eintjj(imat) = multi_fvm%PHASE_EINT(imat, j)
442 IF (multi_fvm%MUSCL == 1)
THEN
443 phase_rhojj(imat) = phase_rhojj(imat)
444 . + multi_fvm%PHASE_GRAD_RHO(1, imat, j) * (xf
445 . + multi_fvm%PHASE_GRAD_RHO(2, imat, j) * (xf(2) - xl(2))
446 . + multi_fvm%PHASE_GRAD_RHO(3, imat, j) * (xf(3) - xl(3))
447 phase_eintjj(imat) = phase_eintjj(imat)
448 . + multi_fvm%PHASE_GRAD_PRES(1, imat, j) * (xf(1) - xl
449 . + multi_fvm%PHASE_GRAD_PRES(2, imat, j) * (xf(2) - xl(2))
450 . + multi_fvm%PHASE_GRAD_PRES(3, imat, j) * (xf(3) - xl(3))
453 rhojj(1) = rhojj(1) + phase_alphajj(imat) * phase_rhojj(imat)
454 matlaw(imat) = ipm(2, local_matid(imat))
455 IF (phase_alphajj(imat) > zero)
THEN
457 CALL multi_muscl_compute_pressure(matlaw(imat), local_matid(imat), pm, ipm, npropm, npropmi,
458 . phase_eintjj(imat), phase_rhojj(imat), phase_presjj(imat), phase_sspjj(imat),
459 . multi_fvm%BFRAC(imat, j), gbuf%TB(ii:), gbuf%DELTAX(ii:), current_time,
460 . bufmat, lbufs(imat)%LBUF%OFF(ii:),lbufs(imat)%LBUF%SIG(ii+idx(1):ii+idx(6)),snpc,stf,npf,tf,
461 . ebufs(imat)%EBUF%VAR,nvareos(imat), matparam(local_matid(imat)),
462 . nvartmp_eos(imat),ebufs(imat)%EBUF%VARTMP,nummat,gbuf%ABURN(ii:))
464 pjj(1) = pjj(1) + phase_alphajj(imat) * phase_presjj(imat)
465 eintjj = eintjj + phase_alphajj(imat) * phase_eintjj(imat)
466 sspjj(1) = sspjj(1) + phase_alphajj(imat) * phase_rhojj(imat) *
max(em20, phase_sspjj(imat))
469 IF (sspjj(1) / rhojj(1) > zero)
THEN
470 sspjj(1) = sqrt(sspjj(1) / rhojj(1))
472 sspjj(1) = multi_fvm%SOUND_SPEED(j)
476 machii = abs(normal_velii) / sspii(1)
477 machjj = abs(normal_veljj) / sspjj(1)
480 sl =
min(normal_velii -
481 sr =
max(normal_velii + sspii(1), normal_veljj + sspjj(1))
484 sstar = pjj(1) - pii(1) + rhoii(1) * normal_velii * (sl - normal_velii) -
485 . rhojj(1) * normal_veljj * (sr - normal_veljj)
486 sstar = sstar / (rhoii(1) * (sl - normal_velii) -
487 . rhojj(1) * (sr - normal_veljj))
490 pstar2 = pii(1) + rhoii(1) * (sstar - normal_velii) * (sl - normal_velii)
491 IF (
min(machii, machjj) < em01)
THEN
492 theta =
min(machii, machjj)
496 pstar = (one - theta) * half * (pii(1) + pjj(1)) + theta * pstar2
497 IF (multi_fvm%LOWMACH_OPT)
THEN
502 pp(5) = sstar * (pstar + pshift)
508 pp(5) = sstar * (pstar2 + pshift)
511 IF (sl > normalw)
THEN
513 vii(2) = rhoii(1) * vxii
514 vii(3) = rhoii(1) * vyii
515 vii(4) = rhoii(1) * vzii
516 vii(5) = eintii(1) + half * rhoii(1) * velii2
517! normal physical flux current element
518 fii(1) = vii(1) * normal_velii
519 fii(2) = vii(2) * normal_velii + pii(1) * nx
520 fii(3) = vii(3) * normal_velii + pii(1) * ny
521 fii(4) = vii(4) * normal_velii + pii(1) * nz
522 fii(5) = (vii(5) + pii(1) + pshift) * normal_velii
526 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction * (fii(1:5) - normalw * vii(1:5)) * surf
527 multi_fvm%FLUXES(6, kface_old, i_old) = direction * normal_velii * surf
532 alphaii = phase_alphaii(imat)
533 sub_rhoii = phase_rhoii(imat)
534 sub_rhoeintii = phase_eintii(imat)
535 sub_viistar(1) = alphaii
536 sub_viistar(2) = alphaii * sub_rhoii
537 sub_viistar(3) = alphaii * sub_rhoeintii
538 sub_fiistar(1:3) = sub_viistar(1:3) * normal_velii
539 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
540 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
541 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction *
542 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
543 multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old) = direction *
544 . (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
548 ELSEIF (sl <= normalw .AND. normalw <= sstar)
THEN
550 vii(2) = rhoii(1) * vxii
551 vii(3) = rhoii(1) * vyii
552 vii(4) = rhoii(1) * vzii
553 vii(5) = eintii(1) + half * rhoii(1) * velii2
555 fii(1) = vii(1) * normal_velii
556 fii(2) = vii(2) * normal_velii + pii(1) * nx
557 fii(3) = vii(3) * normal_velii + pii(1) * ny
558 fii(4) = vii(4) * normal_velii + pii(1) * nz
559 fii(5) = (vii(5) + pii(1) + pshift) * normal_velii
563 viistar(1:5) = fii(1:5) - (sl) * vii(1:5) - pp(1:5)
564 viistar(1:5) = viistar(1:5) / (sstar - sl)
565 fiistar(1:5) = viistar(1:5) * sstar + pp(1:5)
566 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction *
567 . (fiistar(1:5) - normalw * viistar(1:5)) * surf
568 multi_fvm%FLUXES(6, kface_old, i_old) = direction * sstar * surf
573 matlaw(imat) = ipm(2, local_matid(imat))
574 alphastar = phase_alphaii(imat)
575 sub_rhostar = phase_rhoii
577 sub_rhoii = phase_rhoii(imat)
578 sub_rhoeintii = phase_eintii(imat)
579 sub_pii = phase_presii(imat)
580 sub_estar = phase_eintii(imat) / phase_rhoii(imat) -
583 IF (sub_estar < zero)
THEN
589 sub_viistar(1) = alphastar
590 sub_viistar(2) = alphastar * sub_rhostar
591 sub_viistar(3) = alphastar * sub_rhostar * sub_estar
593 sub_fiistar(1:3) = sub_viistar(1:3) * sstar
594 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
595 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
596 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction *
597 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
598 multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old) = direction *
599 . (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
603 ELSE IF (sstar < normalw .AND. normalw <= sr)
THEN
605 vii(2) = rhojj(1) * vxjj
606 vii(3) = rhojj(1) * vyjj
607 vii(4) = rhojj(1) * vzjj
608 vii(5) = eintjj(1) + half * rhojj(1) * veljj2
610 fii(1) = vii(1) * normal_veljj
611 fii(2) = vii(2) * normal_veljj + pjj(1) * nx
612 fii(3) = vii(3) * normal_veljj + pjj(1) * ny
613 fii(4) = vii(4) * normal_veljj + pjj(1) * nz
614 fii(5) = (vii(5) + pjj(1) + pshift) * normal_veljj
618 viistar(1:5) = fii(1:5) - (sr) * vii(1:5) - pp(1:5)
619 viistar(1:5) = viistar(1:5) / (sstar - sr)
620 fiistar(1:5) = viistar(1:5) * sstar + pp(1:5)
621 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction *
622 . (fiistar(1:5) - normalw * viistar(1:5)) * surf
623 multi_fvm%FLUXES(6, kface_old, i_old) = direction * sstar * surf
628 matlaw(imat) = ipm(2, local_matid(imat))
629 alphastar = phase_alphajj(imat)
630 sub_rhostar = phase_rhojj(imat) * (normal_veljj - sr) / (sstar - sr)
631 IF (alphastar > zero)
THEN
632 sub_rhoii = phase_rhojj(imat)
633 sub_rhoeintii = phase_eintjj(imat)
634 sub_pii = phase_presjj(imat)
635 sub_estar = phase_eintjj(imat) / phase_rhojj(imat) -
636 . phase_presjj(imat) * (one / sub_rhostar - one / phase_rhojj(imat))
637 IF (sub_estar < zero)
THEN
644 sub_viistar(1) = phase_alphajj(imat)
645 sub_viistar(2) = phase_alphajj(imat) * sub_rhostar
646 sub_viistar(3) = phase_alphajj(imat) * sub_rhostar * sub_estar
647 sub_fiistar(1:3) = sub_viistar(1:3) * sstar
648 multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old) = direction *
649 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
650 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction
651 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
652 multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old) = direction *
653 . (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
656 ELSE IF (sr < normalw)
THEN
658 vii(2) = rhojj(1) * vxjj
659 vii(3) = rhojj(1) * vyjj
660 vii(4) = rhojj(1) * vzjj
661 vii(5) = eintjj(1) + half * rhojj(1) * veljj2
663 fii(1) = vii(1) * normal_veljj
664 fii(2) = vii(2) * normal_veljj + pjj(1) * nx
665 fii(3) = vii(3) * normal_veljj + pjj(1) * ny
666 fii(4) = vii(4) * normal_veljj + pjj(1) * nz
667 fii(5) = (vii(5) + pjj(1) + pshift) * normal_veljj
671 multi_fvm%FLUXES(1:5, kface_old, i_old) = direction * (fii(1:5) - normalw * vii(1:5)) * surf
672 multi_fvm%FLUXES(6, kface_old, i_old) = direction * normal_veljj * surf
677 alphaii = phase_alphajj(imat)
678 sub_rhoii = phase_rhojj(imat)
679 sub_rhoeintii = phase_eintjj(imat)
680 sub_viistar(1) = alphaii
681 sub_viistar(2) = alphaii * sub_rhoii
682 sub_viistar(3) = alphaii * sub_rhoeintii
683 sub_fiistar(1:3) = sub_viistar(1:3) * normal_veljj
684 multi_fvm%SUBVOL_FLUXES
685 . (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
686 multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old) = direction *
687 . (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
688 multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old) = direction *
689 . (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
696 iarray(1:2)=(/iout,istdo/)
699 WRITE(id_out,*)
" **error : MUSCL FLUXES CALCULATION"
700 WRITE(id_out,*)
" potential instability with elem id = ", global_id_current_elm(ii)
701 WRITE(id_out,*)
" face id = ", kface3
702 WRITE(id_out,*)
" sound speed = ", sspii(1)
703 WRITE(id_out,*)
" adjacent sound speed = ", sspjj(1)
704 WRITE(id_out,*)
" normal velocity = ", normal_velii
705 WRITE(id_out,*)
" adjacent normal velocity = ", normal_veljj
707 WRITE(id_out,*)
" recommendations :"
708 WRITE(id_out,*)
" -1- check EoS parameters and unit system"
709 WRITE(id_out,*)
" -2- check boundary conditions (type, parameters, and proximity from important gradients);"
711 .
" -3- update BETA parameters in /ALE/MUSCL option (find compromise between precision and stability)"
716#include "lockoff.inc"
721 IF (j_old <= numel_spmd)
THEN
723 multi_fvm%FLUXES(1:6, kface2_old, j_old) = -multi_fvm%FLUXES(1:6, kface_old, i_old)
726 multi_fvm%SUBVOL_FLUXES(imat, kface2_old, j_old) = -multi_fvm%SUBVOL_FLUXES(imat, kface_old, i_old)
727 multi_fvm%SUBMASS_FLUXES(imat, kface2_old, j_old) = -multi_fvm%SUBMASS_FLUXES(imat, kface_old, i_old)
728 multi_fvm%SUBENER_FLUXES(imat, kface2_old, j_old) = -multi_fvm%SUBENER_FLUXES(imat, kface_old, i_old)
733 ELSE IF (j_old <= 0)
THEN
735 vx = multi_fvm%VEL(1, elemid)
736 vy = multi_fvm%VEL(2, elemid)
737 vz = multi_fvm%VEL(3, elemid)
738 normvel = vx * nx + vy * ny + vz
739 normalw = wfac(1) * nx + wfac(2) * ny + wfac(3) * nz
740 ssp = multi_fvm%SOUND_SPEED(elemid)
741 rho = multi_fvm%RHO(elemid)
743 sl =
min(normvel - ssp, two * normalw - normvel - ssp)
749 p = multi_fvm%PRES(elemid)
750 pstar = p + rho * (sstar - normvel) * (sl - normvel)
756 pp(5) = sstar * (pstar + pshift)
757 multi_fvm%FLUXES(1:5, kface3, elemid) = surf * pp(1:5)
758 multi_fvm%FLUXES(6, kface3, elemid) = surf * normalw
763 multi_fvm%SUBVOL_FLUXES(imat, kface3, i_old) = zero
764 multi_fvm%SUBMASS_FLUXES(imat, kface3, i_old) = zero
765 multi_fvm%SUBENER_FLUXES(imat, kface3, i_old) = zero
769! -----------------------------------------------
subroutine resol(timers, element, nodes, coupling, af, iaf, iskwn, neth, ipart, nom_opt, kxx, ixx, ixtg, ixs, ixq, ixt, ixp, ixr, ifill, mat_elem, ims, npc, ibcl, ibfv, idum, las, laccelm, nnlink, lnlink, iparg, dd_iad, igrv, iexlnk, kinet, ipari, nprw, iconx, npby, lpby, lrivet, nstrf, ljoint, nodpor, monvol, ilink, llink, linale, neflsw, nnflsw, icut, cluster, itask, inoise, thke, damp, pm, skews, geo, eani, bufmat, bufgeo, bufsf, w, veul, fill, dfill, alph, wb, dsave, asave, msnf, tf, forc, vel, fsav, fzero, xlas, accelm, agrv, fr_wave, failwave, parts0, elbuf, rwbuf, sensors, rwsav, rby, rivet, secbuf, volmon, lambda, wa, fv, partsav, uwa, val2, phi, segvar, r, crflsw, flsw, fani, xcut, anin, tani, secfcum, bufnois, idata, rdata, iframe, kxsp, ixsp, nod2sp, ispsym, ispcond, xframe, spbuf, xspsym, vspsym, pv, fsavd, ibvel, lbvel, wasph, w16, isphio, lprtsph, lonfsph, vsphio, fbvel, lagbuf, ibcslag, iactiv, dampr, gjbufi, gjbufr, rbmpc, ibmpc, sphveln, nbrcvois, nbsdvois, lnrcvois, lnsdvois, nercvois, nesdvois, lercvois, lesdvois, npsegcom, lsegcom, nporgeo, ixtg1, npbyl, lpbyl, rbyl, igeo, ipm, madprt, madsh4, madsh3, madsol, madnod, madfail, iad_rby, fr_rby, fr_wall, iad_rby2, fr_rby2, iad_i2m, fr_i2m, addcni2, procni2, iadi2, fr_mv, iadmv2, fr_ll, fr_rl, iadcj, fr_cj, fr_sec, iad_sec, iad_cut, fr_cut, rg_cut, newfront, fr_mad, fxbipm, fxbrpm, fxbnod, fxbmod, fxbglm, fxbcpm, fxbcps, fxblm, fxbfls, fxbdls, fxbdep, fxbvit, fxbacc, fxbelm, fxbsig, fxbgrvi, fxbgrvr, eigipm, eigibuf, eigrpm, lnodpor, fr_i18, graphe, iflow, rflow, lgrav, dd_r2r, fasolfr, fr_lagf, llagf, lprw, icontact, rcontact, sh4tree, sh3tree, ipadmesh, padmesh, msc, mstg, inc, intg, ptg, iskwp, nskwp, isensp, nsensp, iaccp, naccp, ipart_state, acontact, pcontact, factiv, sh4trim, sh3trim, mscnd, incnd, ibfflux, fbfflux, rbym, irbym, lnrbym, icodrbym, ibcv, fconv, ibftemp, fbftemp, iad_rbym, fr_rbym, weight_rm, ms_ply, zi_ply, inod_pxfem, iel_pxfem, iadc_pxfem, adsky_pxfem, icode_ply, icodt_ply, iskew_ply, admsms, madclnod, nom_sect, mcpc, mcptg, dmelc, dmeltg, mssa, dmels, mstr, dmeltr, msp, dmelp, msrt, dmelrt, ibcr, fradia, res_sms, table, irbe2, lrbe2, iad_rbe2, fr_rbe2, phie, msf, procne_pxfem, iadsdp_pxfem, iadrcp_pxfem, icfield, lcfield, cfield, msz2, diag_sms, iloadp, lloadp, loadp, inod_crk, iel_crk, iadc_crk, adsky_crk, cne_crk, procne_crk, iadsdp_crk, iadrcp_crk, ibufssg_io, ibc_ply, dmint2, ibordnode, elbuf_tab, por, nodedge, iad_edge, fr_edge, fr_nbedge, crknodiad, lgauge, gauge, igaup, ngaup, nodlevxf, dd_r2r_elem, nodglobxfe, sph2sol, sol2sph, irst, dmsph, wagap, xfem_tab, elcutc, nodenr, kxfenod2elc, enrtag, rthbu f, kxig3d, ixig3d, knot, wige, wsmcomp, stack, cputime_mp_glob, cputime_mp, tab_ump, poin_ump, sol2sph_typ, irunn_bis, addcsrect, iad_frnor, fr_nor, procnor, iad_fredg, fr_edg, drape_sh4n, drape_sh3n, tab_mat, nativ0_sms, multi_fvm, segquadfr, ms_2d, h3d_data, subsets, igrnod, igrbric, igrquad, igrsh4n, igrsh3n, igrtruss, igrbeam, igrspring, igrpart, igrsurf, forneqs, nloc_dmg, iskwp_l, knotlocpc, knotlocel, pinch_data, tag_skins6, ale_connectivity, xcell, xface, ne_nercvois, ne_nesdvois, ne_lercvois, ne_lesdvois, ibcscyc, lbcscyc, t_monvol, id_global_vois, face_vois, dynain_data, fcont_max, ebcs_tab, diffusion, kloadpinter, loadpinter, dgaploadint, drapeg, user_windows, output, interfaces, dt, loads, python, dpl0cld, vel0cld, ndamp_vrel, id_damp_vrel, fr_damp_vrel, ndamp_vrel_rbyg, names_and_titles, unitab, liflow, lrflow, glob_therm, pblast, rbe3)