38 . PM, IPM, MULTI_FVM, CURRENT_TIME, BUFMAT, NPF, TF, NUMMAT,MATPARAM)
45 USE matparam_def_mod,
ONLY : matparam_struct_
47 use element_mod ,
only : nixs,nixq,nixtg
51#include "implicit_f.inc"
59#include "vect01_c.inc"
60#include "tabsiz_c.inc"
64 TYPE(matparam_struct_),
DIMENSION(NUMMAT),
INTENT(IN) :: MATPARAM
65 INTEGER,
INTENT(IN) :: NUMMAT
66 TYPE(elbuf_struct_),
TARGET,
DIMENSION(NGROUP) :: ELBUF_TAB
67 INTEGER,
INTENT(IN) :: IPARG(NPARG, NGROUP)
68 INTEGER,
INTENT(IN) :: ITASK
69 INTEGER,
INTENT(IN),
TARGET :: IXS(NIXS, *), IXQ(NIXQ, *), IXTG(NIXTG, *)
70 INTEGER,
INTENT(IN) :: IPM(NPROPMI, NUMMAT)
71 my_real,
INTENT(IN) :: pm(npropm, nummat)
72 TYPE(multi_fvm_struct),
INTENT(INOUT),
TARGET :: MULTI_FVM
73 my_real,
INTENT(IN) :: current_time, timestep
74 my_real,
INTENT(INOUT) :: bufmat
75 INTEGER,
INTENT(IN)::NPF(SNPC)
80 TYPE(g_bufel_),
POINTER :: GBUF
81 TYPE(l_bufel_),
POINTER :: LBUF
82 TYPE(buf_eos_),
POINTER :: EBUF
83 INTEGER,
DIMENSION(:, :),
POINTER :: IX
86 INTEGER :: NBMAT, IMAT, LOCAL_MATID, MATLAW
88 my_real,
DIMENSION(:),
POINTER :: rho, ssp, vol, pres, eint, tau, speeint, feint, fp
89 INTEGER :: ITER, MAX_ITER, REMAINING_ELTS
92 my_real :: grun(mvsiz, multi_fvm%NBMAT), coef(mvsiz)
94 INTEGER :: NBMAT_INCELL()
96 my_real :: error(mvsiz), relaxed_pressure(mvsiz)
97 my_real :: pres_incr(mvsiz), tau_incr(mvsiz, multi_fvm%NBMAT)
98 INTEGER :: CV_INDICATOR(MVSIZ)
99 my_real,
TARGET :: volwt(mvsiz, multi_fvm%NBMAT), eintwt(mvsiz, multi_fvm%NBMAT),
100 . rhowt(mvsiz, multi_fvm%NBMAT), preswt(mvsiz, multi_fvm%NBMAT),
101 . sspwt(mvsiz, multi_fvm%NBMAT),
102 . masswt(mvsiz, multi_fvm%NBMAT), tauwt(mvsiz, multi_fvm%NBMAT),
103 . speeintwt(mvsiz, multi_fvm%NBMAT), alphawt(mvsiz, multi_fvm%NBMAT),
104 . mfracwt(mvsiz, multi_fvm%NBMAT),
105 . fpwt(mvsiz, multi_fvm%NBMAT), fewt(mvsiz, multi_fvm%NBMAT),
106 . fe0wt(mvsiz, multi_fvm%NBMAT), tau0wt(mvsiz, multi_fvm%NBMAT)
107 my_real :: dpdtau, dpde, p0(mvsiz), coef1, lim_tau(mvsiz, multi_fvm%NBMAT), lim
108 INTEGER :: NIX,NVAREOS
110 INTEGER :: NVARTMP_EOS
119 pshift = multi_fvm%PRES_SHIFT
121 DO ng = itask + 1, ngroup, nthread
129 IF (multi_fvm%SYM == 0)
THEN
130 ix => ixs(1:nixs, 1 + nft:nel + nft)
132 ELSEIF (ity == 2)
THEN
134 ix => ixq(1:nixq, 1 + nft:nel + nft)
138 ix => ixtg(1:nixtg, 1 + nft:nel + nft)
142 nbmat = multi_fvm%NBMAT
144 gbuf => elbuf_tab(ng)%GBUF
145 sigold(1 + 0 * nel : 1 * nel)=gbuf%SIG(1 + 0 * nel : 1 * nel)
146 sigold(1 + 1 * nel : 2 * nel)=gbuf%SIG(1 + 1 * nel : 2
147 sigold(1 + 2 * nel : 3 * nel)=gbuf%SIG(1 + 2 * nel : 3 * nel)
148 sigold(1 + 3 * nel : 4 * nel)=gbuf%SIG(1 + 3 * nel : 4 * nel
149 sigold(1 + 4 * nel : 5 * nel)=gbuf%SIG(1 + 4 * nel : 5 * nel)
150 sigold(1 + 5 * nel : 6 * nel)=gbuf%SIG(1 + 5 * nel : 6 * nel)
152 lbuf => elbuf_tab(ng)%BUFLY(1)%LBUF(1, 1, 1)
154 IF(
ASSOCIATED(ix))
THEN
155 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
159 matlaw = matparam(local_matid)%ILAW
160 pres => multi_fvm%PRES(1 + nft : nel + nft)
161 ssp => multi_fvm%SOUND_SPEED(1 + nft : nel + nft)
163 eint => multi_fvm%EINT(1 + nft : nel + nft)
164 rho => multi_fvm%RHO(1 + nft : nel + nft)
165 ebuf => elbuf_tab(ng)%BUFLY(1)%EOS(1, 1, 1)
166 nvareos = elbuf_tab(ng)%BUFLY(1)%NVAR_EOS
167 nvartmp_eos = elbuf_tab(ng)%BUFLY(1)%NVARTMP_EOS
169 1 1, matlaw, local_matid, nel,
170 2 eint, pres, rho, ssp,
171 3 vol, grun(1:nel,1),pm, ipm,
172 4 npropm, npropmi, bufmat, gbuf%OFF,
174 6 current_time, sigold, snpc,
176 7 matparam(local_matid), nvartmp_eos, ebuf%VARTMP
179 IF (multi_fvm%SOUND_SPEED(ii + nft) > zero)
THEN
180 multi_fvm%SOUND_SPEED(ii + nft) = sqrt(multi_fvm%SOUND_SPEED(ii
182 multi_fvm%SOUND_SPEED(ii + nft) = em10
185 IF (matlaw == 5)
THEN
188 multi_fvm%BFRAC(1, i) = lbuf%BFRAC(ii)
191 gbuf%SIG(1 + 0 * nel : 1 * nel) = -pres(1:nel)
192 gbuf%SIG(1 + 1 * nel : 2 * nel) = gbuf%SIG(1 + 0 * nel
193 gbuf%SIG(1 + 2 * nel : 3 * nel) = gbuf%SIG(1 + 0 * nel : 1 * nel)
198 nbmat_incell(1:nel) = 0
202 IF (multi_fvm%PHASE_ALPHA(imat, i) > zero .AND.
203 . multi_fvm%PHASE_ALPHA(imat, i) * multi_fvm%PHASE_RHO(imat, i)
204 . / multi_fvm%RHO(i) > em14)
THEN
207 nbmat_incell(ii) = nbmat_incell(ii) + 1
215 IF (nbmat_incell(ii) == 1 .AND.
216 . multi_fvm%PHASE_ALPHA(imat, i) > zero)
THEN
217 multi_fvm%PHASE_EINT(imat, i) = multi_fvm%EINT(i)
229 volwt(ii, imat) = gbuf%VOL(ii) * multi_fvm%PHASE_ALPHA(imat, i)
231 alphawt(ii, imat) = multi_fvm%PHASE_ALPHA(imat, i)
233 eintwt(ii, imat) = multi_fvm%PHASE_EINT(imat, i)
237 rhowt(ii, imat) = multi_fvm%PHASE_RHO(imat, i)
239 mfracwt(ii, imat) = alphawt(ii, imat) * rhowt(ii, imat) / gbuf%RHO(ii)
241 tauwt(ii, imat) = zero
243 speeintwt(ii, imat) = zero
244 IF (rhowt(ii, imat) > zero)
THEN
245 tauwt(ii, imat) = one / rhowt(ii, imat)
246 speeintwt(ii, imat) = eintwt(ii, imat) / rhowt(ii, imat)
248 tau0wt(ii, imat) = tauwt(ii, imat)
250 masswt(ii, imat) = rhowt(ii, imat) * alphawt(ii, imat)
252 preswt(ii, imat) = zero
254 sspwt(ii, imat) = zero
256 grun(ii, imat) = zero
267 IF (nbmat_incell(ii) > 1)
THEN
269 remaining_elts = remaining_elts + 1
271 relaxed_pressure(ii) = multi_fvm%PRES(ii + nft)
276 IF(
ASSOCIATED(ix))
THEN
277 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
281 matlaw = matparam(local_matid)%ILAW
282 pres => preswt(1:nel, imat)
283 ssp => sspwt(1:nel, imat)
284 vol => volwt(1:nel, imat)
285 rho => rhowt(1:nel, imat)
286 eint => eintwt(1:nel, imat)
287 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
288 ebuf => elbuf_tab(ng)%BUFLY(imat)%EOS(1, 1, 1)
289 nvareos = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
290 nvartmp_eos = elbuf_tab(ng)%BUFLY(imat)%NVARTMP_EOS
293 1 1, matlaw, local_matid, nel,
294 2 eint, pres, rho, ssp,
295 3 vol, grun(1:nel,imat),pm, ipm,
296 4 npropm, npropmi, bufmat, lbuf%OFF,
297 5 lbuf%TEMP, lbuf%BFRAC, gbuf%TB
298 6 current_time, sigold, snpc, stf
304 p0(ii) = p0(ii) + alphawt(ii, imat) * pres(ii)
310 IF (alphawt(ii, imat) /= zero)
THEN
311 fe0wt(ii, imat) = speeintwt(ii, imat)
316 IF (timestep == zero)
THEN
330 IF (remaining_elts == 0) cont = .false.
335 pres_incr(1:nel) = zero
339 fp => fpwt(1:nel, imat)
340 ssp => sspwt(1:nel, imat)
341 pres => preswt(1:nel, imat)
342 tau => tauwt(1:nel, imat)
343 rho => rhowt(1:nel, imat)
344 speeint => speeintwt(1:nel, imat)
346 IF (cv_indicator(ii) /= 1)
THEN
347 IF (alphawt(ii, imat) /= zero .AND.
348 . mfracwt(ii, imat) > em14)
THEN
349 fp(ii) = pres(ii) - relaxed_pressure(ii
350 dpde = grun(ii, imat) / tau(ii)
351 dpdtau = - (ssp(ii) - grun(ii, imat) * (pres(ii) + pshift) * tau(ii)) / tau(ii) / tau(ii)
352 coef1 = masswt(ii, imat) / (dpdtau - (relaxed_pressure(ii) + pshift) * dpde)
353 coef(ii) = coef(ii) + coef1 * (one + grun(ii, imat))
354 pres_incr(ii) = pres_incr(ii) - fp(ii) * coef1
363 IF (cv_indicator(ii) /= 1)
THEN
364 pres_incr(ii) = pres_incr(ii
365 error(ii) = abs(pres_incr(ii))
368 lim_tau(1:nel, 1:nbmat) = one
370 fp => fpwt(1:nel, imat)
371 ssp => sspwt(1:nel, imat)
372 pres => preswt(1:nel, imat
373 tau => tauwt(1:nel, imat)
374 rho => rhowt(1:nel, imat)
375 speeint => speeintwt(1:nel, imat)
378 IF (alphawt(ii, imat) /= zero .AND.
379 . mfracwt(ii, imat) > em14)
THEN
380 dpdtau = - (ssp(ii) - grun(ii, imat) * (pres(ii) + pshift) * tau(ii)) / tau(ii) / tau(ii)
381 dpde = grun(ii, imat) / tau(ii)
382 coef1 = one / (dpdtau - (relaxed_pressure(ii) + pshift) * dpde)
383 tau_incr(ii, imat) = coef1 * (pres_incr(ii) * (one + grun(ii, imat)) + fp(ii))
385 IF (tau(ii) - tau_incr(ii, imat) < zero
386 . .AND. tau_incr(ii, imat) > zero)
THEN
387 lim =
min(one, half * tau(ii) / tau_incr(ii, imat))
389 lim_tau(ii, imat) = lim
397 pres => preswt(1:nel, imat)
398 ssp => sspwt(1:nel, imat)
399 vol => volwt(1:nel, imat)
400 rho => rhowt(1:nel, imat)
401 eint => eintwt(1:nel, imat)
402 tau => tauwt(1:nel, imat)
404 IF (cv_indicator(ii) /= 1)
THEN
405 IF (alphawt(ii, imat) /= zero .AND.
406 . mfracwt(ii, imat) > em14)
THEN
407 lim = minval(lim_tau(ii, 1:nbmat))
408 tau(ii) = tau(ii) - lim * tau_incr(ii, imat)
410 rho(ii) = one / tau(ii)
411 alphawt(ii, imat) = masswt(ii, imat) * tau(ii)
412 vol(ii) = alphawt(ii, imat) * gbuf%VOL(ii)
418 IF (cv_indicator(ii) /= 1)
THEN
419 relaxed_pressure(ii) = relaxed_pressure(ii) - pres_incr(ii)
423 eint => eintwt(1:nel, imat)
424 rho => rhowt(1:nel, imat)
425 speeint => speeintwt(1:nel, imat)
426 tau => tauwt(1:nel, imat)
428 IF (cv_indicator(ii) /= 1)
THEN
429 IF (alphawt(ii, imat) /= zero .AND.
430 . mfracwt(ii, imat) > em14)
THEN
432 speeint(ii) = fe0wt(ii, imat) -
433 . (relaxed_pressure(ii) + pshift) * (tau(ii) - tau0wt(ii, imat))
434 eint(ii) = rho(ii) * speeint(ii)
440 IF (cv_indicator(ii) /= 1)
THEN
441 IF (error(ii) < tol * (one + abs(relaxed_pressure(ii))))
THEN
443 remaining_elts = remaining_elts - 1
447 IF (remaining_elts == 0)
THEN
452 IF(
ASSOCIATED(ix))
THEN
453 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
457 matlaw = matparam(local_matid)%ILAW
458 pres => preswt(1:nel, imat)
459 ssp => sspwt(1:nel, imat)
460 vol => volwt(1:nel, imat)
461 rho => rhowt(1:nel, imat)
462 eint => eintwt(1:nel, imat)
463 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
464 ebuf => elbuf_tab(ng)%BUFLY(imat)%EOS(1, 1, 1)
465 nvareos = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
466 nvartmp_eos = elbuf_tab(ng)%BUFLY(imat)%NVARTMP_EOS
469 1 0, matlaw, local_matid, nel,
470 2 eint, pres, rho, ssp,
473 5 lbuf%TEMP, lbuf%BFRAC, gbuf%TB, gbuf%DELTAX,
474 6 current_time, sigold, snpc, stf,
475 7 npf, tf, ebuf%VAR, nvareos,
476 8 matparam(local_matid), nvartmp_eos, ebuf%VARTMP , nummat ,
483 IF (eintwt(ii, imat) < zero)
THEN
485 eintwt(ii, imat) = -eintwt(ii, imat)
489 IF (remaining_elts /= 0 .AND. idbg)
THEN
490 print*,
"*** CV PB IN PRESSURE EQUILIBRIUM",
" CYCLE", ncycle,
"GROUPE", ng
492 IF (cv_indicator(ii) == 0 .AND.
ASSOCIATED(ix))
THEN
493 WRITE(*,
'(A,I10,A,I10)')
"LOCAL_ID ", ii + nft,
" GLOBAL_ID ", ix(nix, ii)
495 WRITE(*,*)
"MAT ", imat,
", alph : ", alphawt(ii, imat),
", PRES : ", preswt(ii, imat)
496 . ,
", EINT : ", eintwt(ii, imat)
508 IF(
ASSOCIATED(ix))
THEN
509 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
513 matlaw = matparam(local_matid)%ILAW
514 pres => preswt(1:nel, imat)
515 ssp => sspwt(1:nel, imat)
516 vol => volwt(1:nel, imat)
517 rho => rhowt(1:nel, imat)
518 eint => eintwt(1:nel, imat)
520 ebuf => elbuf_tab(ng)%BUFLY(imat)%EOS(1, 1, 1)
521 nvareos = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
522 nvartmp_eos = elbuf_tab(ng)%BUFLY(imat)%NVARTMP_EOS
524 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
525 multi_fvm%PHASE_EINT(imat, 1 + nft : nel + nft) = eintwt(1:nel, imat)
526 multi_fvm%PHASE_RHO(imat, 1 + nft : nel + nft) = rhowt(1:nel, imat)
529 multi_fvm%PHASE_ALPHA(imat, i) = volwt(ii, imat) / gbuf%VOL(ii)
533 1 0, matlaw, local_matid, nel,
534 2 eint, pres, rho, ssp,
535 3 vol, grun(1:nel,imat),pm, ipm,
536 4 npropm, npropmi, bufmat, lbuf%OFF,
537 5 lbuf%TEMP, lbuf%BFRAC, gbuf%TB, gbuf%DELTAX,
538 6 current_time, sigold, snpc, stf,
539 7 npf, tf, ebuf%VAR, nvareos,
540 8 matparam(local_matid), nvartmp_eos, ebuf%VARTMP, nummat ,
568 IF (multi_fvm%PHASE_ALPHA(imat, i) > zero .AND.
569 . mfracwt(ii, imat) > em14)
THEN
570 one_over_grun = one_over_grun * grun(ii, imat)
573 IF (nbmat_incell(ii) > 1 .AND. one_over_grun > zero)
THEN
576 remaining_elts = remaining_elts + 1
581 IF (remaining_elts == 0) cont = .false.
585 DO WHILE(iter < max_iter .AND. cont)
591 fe(1:nel) = - multi_fvm%EINT(1 + nft : nel + nft)
592 pres_incr(1:nel) = zero
594 pres => preswt(1:nel, imat)
595 vol => volwt(1:nel, imat)
596 eint => eintwt(1:nel, imat)
597 fp => fpwt(1:nel, imat)
599 IF (vol(ii) > zero .AND.
600 . mfracwt(ii, imat) > em14)
THEN
601 IF (cv_indicator(ii) /= 1)
THEN
603 IF (grun(ii, imat) > zero)
THEN
604 one_over_grun = one / grun(ii, imat)
606 vol_frac = alphawt(ii, imat)
608 fp(ii) = pres(ii) - relaxed_pressure(ii)
609 IF (one_over_grun > zero)
THEN
610 fe(ii) = fe(ii) + vol_frac * eint(ii)
613 pres_incr(ii) = pres_incr(ii) + vol_frac * one_over_grun * fp(ii)
614 coef(ii) = coef(ii) + vol_frac * one_over_grun
621 IF (cv_indicator(ii) /= 1)
THEN
622 IF (coef(ii) /= zero)
THEN
624 pres_incr(ii) = (fe(ii) - pres_incr(ii)) / coef(ii)
625 relaxed_pressure(ii) = relaxed_pressure(ii) - pres_incr(ii)
627 error(ii) = abs(pres_incr(ii))
633 pres => preswt(1:nel, imat)
634 vol => volwt(1:nel, imat)
635 rho => rhowt(1:nel, imat)
636 eint => eintwt(1:nel, imat)
637 fp => fpwt(1:nel, imat)
639 IF (cv_indicator(ii) /= 1)
THEN
640 IF (vol(ii) > zero .AND. grun(ii, imat) > zero .AND.
641 . mfracwt(ii, imat) > em14)
THEN
643 IF ((fp(ii) + pres_incr(ii)) >
THEN
644 lim =
max(zero,
min(one, half * eint(ii) * grun(ii, imat)
645 . / (fp(ii) + pres_incr(ii))))
647 eint(ii) = eint(ii) - lim * (fp(ii) + pres_incr(ii)) / grun(ii, imat)
652 IF(
ASSOCIATED(ix))
THEN
653 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
657 matlaw = matparam(local_matid)%ILAW
658 ssp => sspwt(1:nel, imat)
659 vol => volwt(1:nel, imat)
661 ebuf => elbuf_tab(ng)%BUFLY(imat)%EOS(1, 1, 1)
662 nvareos = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
663 nvartmp_eos = elbuf_tab(ng)%BUFLY(imat)%NVARTMP_EOS
666 2 eint, pres, rho, ssp,
667 3 vol, grun(1:nel,imat),pm, ipm,
668 4 npropm, npropmi, bufmat, lbuf%OFF,
669 5 lbuf%TEMP, lbuf%BFRAC, gbuf%TB, gbuf%DELTAX,
670 6 current_time, sigold, snpc, stf,
671 7 npf, tf, ebuf%VAR, nvareos,
672 8 matparam(local_matid),nvartmp_eos, ebuf%VARTMP, nummat ,
676 IF (cv_indicator(ii) /= 1)
THEN
677 IF (error(ii) < tol * (one + abs(relaxed_pressure(ii))))
THEN
679 remaining_elts = remaining_elts - 1
683 IF (remaining_elts == 0)
THEN
689 IF (eintwt(ii, imat) < zero)
THEN
694 IF (remaining_elts /= 0 .AND. cont .AND. idbg)
THEN
695 print*,
"*** CV PB IN ENERGY RESET",
"CYCLE", ncycle,
"GROUPE", ng
701 gbuf%SIG(1:nel) = zero
703 multi_fvm%SOUND_SPEED(1 + nft:nel + nft) = zero
705 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
706 multi_fvm%PHASE_EINT(imat, 1 + nft : nel + nft) = eintwt(1:nel, imat)
707 multi_fvm%PHASE_RHO(imat, 1 + nft : nel + nft) = rhowt(1:nel, imat)
709 multi_fvm%PHASE_PRES(imat, 1 + nft : nel + nft) = preswt(1:nel, imat)
710 IF(
ASSOCIATED(ix))
THEN
711 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
716 matlaw = matparam(local_matid)%ILAW
720 vol_frac = multi_fvm%PHASE_ALPHA(imat, i)
721 gbuf%SIG(ii) = gbuf%SIG(ii) - preswt(ii, imat) * vol_frac
722 multi_fvm%SOUND_SPEED(ii + nft) = multi_fvm%SOUND_SPEED(ii + nft) +
723 . vol_frac * rhowt(ii, imat) *
max(sspwt(ii, imat), em20)
724 IF (matlaw == 5)
THEN
725 multi_fvm%BFRAC(imat, i) = lbuf%BFRAC(ii)
727 multi_fvm%BFRAC(imat, i) = zero
740 gbuf%SIG(1 + 1 * nel : 2 * nel) = gbuf%SIG(1 + 0 * nel : 1 * nel)
741 gbuf%SIG(1 + 2 * nel : 3 * nel) = gbuf%SIG(1 + 0 * nel : 1 * nel)
745 multi_fvm%SOUND_SPEED(ii + nft) = sqrt(multi_fvm%SOUND_SPEED(ii + nft)
746 . / multi_fvm%RHO(i))
747 multi_fvm%PRES(ii + nft) = -gbuf%SIG(ii)
752 gbuf%TEMP(1:nel) = zero
754 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
756 gbuf%TEMP(ii) = gbuf%TEMP(ii) + mfracwt(ii, imat)*lbuf%TEMP(ii)