37 . PM, IPM, MULTI_FVM, CURRENT_TIME, BUFMAT, NPF, TF, NUMMAT,MATPARAM)
44 USE matparam_def_mod,
ONLY : matparam_struct_
49#include "implicit_f.inc"
57#include "vect01_c.inc"
58#include "tabsiz_c.inc"
62 TYPE(matparam_struct_),
DIMENSION(NUMMAT),
INTENT(IN) :: MATPARAM
63 INTEGER,
INTENT(IN) :: NUMMAT
64 TYPE(),
TARGET,
DIMENSION(NGROUP) :: ELBUF_TAB
65 INTEGER,
INTENT(IN) :: IPARG(NPARG, NGROUP)
66 INTEGER,
INTENT(IN) :: ITASK
67 INTEGER,
INTENT(IN),
TARGET :: IXS(NIXS, *), IXQ(NIXQ, *), IXTG(NIXTG, *)
68 INTEGER,
INTENT(IN) :: IPM(NPROPMI, NUMMAT)
69 my_real,
INTENT(IN) :: pm(npropm, nummat)
70 TYPE(multi_fvm_struct),
INTENT(INOUT),
TARGET :: MULTI_FVM
71 my_real,
INTENT(IN) :: current_time, timestep
72 my_real,
INTENT(INOUT) :: bufmat(*)
73 INTEGER,
INTENT(IN)::(SNPC)
78 TYPE(g_bufel_),
POINTER :: GBUF
79 TYPE(l_bufel_),
POINTER :: LBUF
80 TYPE(buf_eos_),
POINTER :: EBUF
81 INTEGER,
DIMENSION(:, :),
POINTER ::
84 INTEGER :: NBMAT, IMAT, LOCAL_MATID, MATLAW
86 my_real,
DIMENSION(:),
POINTER :: rho, ssp, vol, pres, eint, tau, speeint, feint, fp
87 INTEGER :: ITER, MAX_ITER, REMAINING_ELTS
90 my_real :: grun(mvsiz, multi_fvm%NBMAT), coef(mvsiz)
92 INTEGER :: NBMAT_INCELL(MVSIZ)
94 my_real :: error(mvsiz), relaxed_pressure(mvsiz)
95 my_real :: pres_incr(mvsiz), tau_incr(mvsiz, multi_fvm%NBMAT)
96 INTEGER :: CV_INDICATOR(MVSIZ)
97 my_real,
TARGET :: volwt(mvsiz, multi_fvm%NBMAT), eintwt(mvsiz, multi_fvm%NBMAT),
98 . rhowt(mvsiz, multi_fvm%NBMAT), preswt(mvsiz, multi_fvm%NBMAT),
99 . sspwt(mvsiz, multi_fvm%NBMAT),
100 . masswt(mvsiz, multi_fvm%NBMAT), tauwt(mvsiz, multi_fvm%NBMAT),
101 . speeintwt(mvsiz, multi_fvm%NBMAT), alphawt(mvsiz, multi_fvm%NBMAT),
102 . mfracwt(mvsiz, multi_fvm%NBMAT),
103 . fpwt(mvsiz, multi_fvm%NBMAT), fewt(mvsiz, multi_fvm%NBMAT),
104 . fe0wt(mvsiz, multi_fvm%NBMAT), tau0wt(mvsiz, multi_fvm%NBMAT)
105 my_real :: dpdtau, dpde, p0(mvsiz), coef1, lim_tau(mvsiz, multi_fvm%NBMAT), lim
106 INTEGER :: NIX,NVAREOS
108 INTEGER :: NVARTMP_EOS
117 pshift = multi_fvm%PRES_SHIFT
119 DO ng = itask + 1, ngroup, nthread
127 IF (multi_fvm%SYM == 0)
THEN
128 ix => ixs(1:nixs, 1 + nft:nel + nft)
130 ELSEIF (ity == 2)
THEN
132 ix => ixq(1:nixq, 1 + nft:nel + nft)
136 ix => ixtg(1:nixtg, 1 + nft:nel
140 nbmat = multi_fvm%NBMAT
143 sigold(1 + 0 * nel : 1 * nel)=gbuf%SIG(1 + 0 * nel : 1 * nel)
144 sigold(1 + 1 * nel : 2 * nel)=gbuf%SIG(1 + 1 * nel : 2 * nel)
145 sigold(1 + 2 * nel : 3 * nel)=gbuf%SIG(1 + 2 * nel : 3 * nel)
146 sigold(1 + 3 * nel : 4 * nel)=gbuf%SIG(1 + 3 * nel : 4 * nel)
147 sigold(1 + 4 * nel : 5 * nel)=gbuf%SIG(1 + 4 * nel : 5 * nel)
148 sigold(1 + 5 * nel : 6 * nel)=gbuf%SIG(1 + 5 * nel : 6 * nel)
150 lbuf => elbuf_tab(ng)%BUFLY(1)%LBUF(1, 1, 1)
152 IF(
ASSOCIATED(ix))
THEN
153 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
157 matlaw = matparam(local_matid)%ILAW
158 pres => multi_fvm%PRES(1 + nft : nel + nft)
159 ssp => multi_fvm%SOUND_SPEED(1 + nft : nel + nft)
161 eint => multi_fvm%EINT(
162 rho => multi_fvm%RHO(1 + nft : nel + nft)
163 ebuf => elbuf_tab(ng)%BUFLY(1)%EOS(1, 1, 1)
164 nvareos = elbuf_tab(ng)%BUFLY(1)%NVAR_EOS
165 nvartmp_eos = elbuf_tab(ng)%BUFLY(1)%NVARTMP_EOS
167 1 1, matlaw, local_matid, nel,
168 2 eint, pres, rho, ssp,
169 3 vol, grun(1:nel,1),pm, ipm,
170 4 npropm, npropmi, bufmat, gbuf%OFF,
171 5 gbuf%TEMP, lbuf%BFRAC, gbuf%TB, gbuf%DELTAX
172 6 current_time, sigold, snpc, stf,
173 7 npf, tf, ebuf%VAR, nvareos,
174 7 matparam(local_matid), nvartmp_eos, ebuf%VARTMP, nummat ,
177 IF (multi_fvm%SOUND_SPEED(ii + nft) > zero)
THEN
178 multi_fvm%SOUND_SPEED(ii + nft) = sqrt(multi_fvm%SOUND_SPEED(ii + nft))
180 multi_fvm%SOUND_SPEED(ii + nft) = em10
183 IF (matlaw == 5)
THEN
189 gbuf%SIG(1 + 0 * nel : 1 * nel) = -pres(1:nel)
190 gbuf%SIG(1 + 1 * nel : 2 * nel) = gbuf%SIG(1 + 0 * nel : 1 * nel)
191 gbuf%SIG(1 + 2 * nel : 3 * nel) = gbuf%SIG(1 + 0 * nel : 1 * nel)
196 nbmat_incell(1:nel) = 0
200 IF (multi_fvm%PHASE_ALPHA(imat, i) > zero .AND.
201 . multi_fvm%PHASE_ALPHA(imat, i) * multi_fvm%PHASE_RHO(imat, i)
202 . / multi_fvm%RHO(i) > em14)
THEN
205 nbmat_incell(ii) = nbmat_incell(ii) + 1
213 IF (nbmat_incell(ii) == 1 .AND.
214 . multi_fvm%PHASE_ALPHA(imat, i
THEN
215 multi_fvm%PHASE_EINT(imat, i) = multi_fvm%EINT(i)
227 volwt(ii, imat) = gbuf%VOL(ii) * multi_fvm%PHASE_ALPHA(imat, i)
229 alphawt(ii, imat) = multi_fvm%PHASE_ALPHA(imat, i)
231 eintwt(ii, imat) = multi_fvm%PHASE_EINT(imat, i)
235 rhowt(ii, imat) = multi_fvm%PHASE_RHO(imat, i)
237 mfracwt(ii, imat) = alphawt(ii, imat) * rhowt
239 tauwt(ii, imat) = zero
241 speeintwt(ii, imat) = zero
242 IF (rhowt(ii, imat) > zero)
THEN
243 tauwt(ii, imat) = one / rhowt(ii, imat)
244 speeintwt(ii, imat) = eintwt(ii, imat) / rhowt(ii, imat)
246 tau0wt(ii, imat) = tauwt(ii, imat)
248 masswt(ii, imat) = rhowt(ii, imat) * alphawt(ii, imat)
250 preswt(ii, imat) = zero
252 sspwt(ii, imat) = zero
254 grun(ii, imat) = zero
265 IF (nbmat_incell(ii) > 1)
THEN
267 remaining_elts = remaining_elts + 1
269 relaxed_pressure(ii) = multi_fvm%PRES(ii + nft)
274 IF(
ASSOCIATED(ix))
THEN
275 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
279 matlaw = matparam(local_matid)%ILAW
280 pres => preswt(1:nel, imat)
281 ssp => sspwt(1:nel, imat)
282 vol => volwt(1:nel, imat)
283 rho => rhowt(1:nel, imat)
284 eint => eintwt(1:nel, imat)
285 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
286 ebuf => elbuf_tab(ng)%BUFLY(imat)%EOS(1, 1, 1)
287 nvareos = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
288 nvartmp_eos = elbuf_tab(ng)%BUFLY(imat)%NVARTMP_EOS
291 1 1, matlaw, local_matid, nel,
292 2 eint, pres, rho, ssp,
293 3 vol, grun(1:nel,imat),pm, ipm,
294 4 npropm, npropmi, bufmat, lbuf%OFF,
295 5 lbuf%TEMP, lbuf%BFRAC, gbuf%TB, gbuf%DELTAX,
296 6 current_time, sigold, snpc, stf,
297 7 npf, tf, ebuf%VAR, nvareos,
298 7 matparam(local_matid), nvartmp_eos, ebuf%VARTMP, nummat ,
302 p0(ii) = p0(ii) + alphawt(ii, imat) * pres(ii)
308 IF (alphawt(ii, imat) /= zero)
THEN
309 fe0wt(ii, imat) = speeintwt(ii, imat)
314 IF (timestep == zero)
THEN
316 relaxed_pressure(ii) = p0(ii)
328 IF (remaining_elts == 0) cont = .false.
330 DO WHILE(iter < max_iter .AND. cont)
333 pres_incr(1:nel) = zero
336 feint => fewt(1:nel, imat)
337 fp => fpwt(1:nel, imat)
338 ssp => sspwt(1:nel, imat)
339 pres => preswt(1:nel, imat)
340 tau => tauwt(1:nel, imat)
341 rho => rhowt(1:nel, imat)
342 speeint => speeintwt(1:nel, imat)
344 IF (cv_indicator(ii) /= 1)
THEN
345 IF (alphawt(ii, imat) /= zero .AND.
346 . mfracwt(ii, imat) > em14)
THEN
347 fp(ii) = pres(ii) - relaxed_pressure(ii)
348 dpde = grun(ii, imat) / tau(ii)
349 dpdtau = - (ssp(ii) - grun(ii, imat) * (pres(ii) + pshift) * tau(ii)) / tau(ii) / tau(ii)
350 coef1 = masswt(ii, imat) / (dpdtau - (relaxed_pressure(ii) + pshift) * dpde)
351 coef(ii) = coef(ii) + coef1 * (one + grun(ii, imat))
352 pres_incr(ii) = pres_incr(ii) - fp(ii) * coef1
361 IF (cv_indicator(ii) /= 1)
THEN
362 pres_incr(ii) = pres_incr(ii) / coef(ii)
363 error(ii) = abs(pres_incr(ii))
366 lim_tau(1:nel, 1:nbmat) = one
368 fp => fpwt(1:nel, imat)
369 ssp => sspwt(1:nel, imat)
370 pres => preswt(1:nel, imat)
371 tau => tauwt(1:nel, imat)
372 rho => rhowt(1:nel, imat)
373 speeint => speeintwt(1:nel, imat)
375 IF (cv_indicator(ii) /= 1)
THEN
376 IF (alphawt(ii, imat) /= zero .AND.
377 . mfracwt(ii, imat) > em14)
THEN
378 dpdtau = - (ssp(ii) - grun(ii, imat) * (pres(ii) + pshift) * tau(ii)) / tau(ii) / tau(ii)
379 dpde = grun(ii, imat) / tau(ii)
380 coef1 = one / (dpdtau - (relaxed_pressure(ii) + pshift) * dpde)
381 tau_incr(ii, imat) = coef1 * (pres_incr(ii) * (one + grun(ii, imat)) + fp(ii))
383 IF (tau(ii) - tau_incr(ii, imat) < zero
384 . .AND. tau_incr(ii, imat) > zero)
THEN
385 lim =
min(one, half * tau(ii) / tau_incr(ii, imat))
387 lim_tau(ii, imat) = lim
395 pres => preswt(1:nel, imat)
396 ssp => sspwt(1:nel, imat)
397 vol => volwt(1:nel, imat)
398 rho => rhowt(1:nel, imat)
399 eint => eintwt(1:nel, imat)
400 tau => tauwt(1:nel, imat)
402 IF (cv_indicator(ii) /= 1)
THEN
403 IF (alphawt(ii, imat) /= zero .AND.
404 . mfracwt(ii, imat) > em14)
THEN
405 lim = minval(lim_tau(ii, 1:nbmat))
406 tau(ii) = tau(ii) - lim * tau_incr(ii, imat)
408 rho(ii) = one / tau(ii)
409 alphawt(ii, imat) = masswt(ii, imat) * tau(ii)
410 vol(ii) = alphawt(ii, imat) * gbuf%VOL(ii)
416 IF (cv_indicator(ii) /= 1)
THEN
417 relaxed_pressure(ii) = relaxed_pressure(ii) - pres_incr(ii)
421 eint => eintwt(1:nel, imat)
422 rho => rhowt(1:nel, imat)
423 speeint => speeintwt(1:nel, imat)
424 tau => tauwt(1:nel, imat)
426 IF (cv_indicator(ii) /= 1)
THEN
427 IF (alphawt(ii, imat) /= zero .AND.
428 . mfracwt(ii, imat) > em14)
THEN
430 speeint(ii) = fe0wt(ii, imat) -
431 . (relaxed_pressure(ii) + pshift) * (tau(ii) - tau0wt(ii, imat))
432 eint(ii) = rho(ii) * speeint(ii)
438 IF (cv_indicator(ii) /= 1)
THEN
439 IF (error(ii) < tol * (one + abs(relaxed_pressure(ii))))
THEN
441 remaining_elts = remaining_elts - 1
445 IF (remaining_elts == 0)
THEN
450 IF(
ASSOCIATED(ix))
THEN
451 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
455 matlaw = matparam(local_matid)%ILAW
456 pres => preswt(1:nel, imat)
457 ssp => sspwt(1:nel, imat)
458 vol => volwt(1:nel, imat)
459 rho => rhowt(1:nel, imat)
460 eint => eintwt(1:nel, imat)
461 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
462 ebuf => elbuf_tab(ng)%BUFLY(imat)%EOS(1, 1, 1)
463 nvareos = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
464 nvartmp_eos = elbuf_tab(ng)%BUFLY(imat)%NVARTMP_EOS
467 1 0, matlaw, local_matid, nel,
468 2 eint, pres, rho, ssp,
469 3 vol, grun(1:nel,imat),pm, ipm,
470 4 npropm, npropmi, bufmat, lbuf%OFF,
471 5 lbuf%TEMP, lbuf%BFRAC
472 6 current_time, sigold, snpc, stf,
473 7 npf, tf, ebuf%VAR, nvareos,
474 8 matparam(local_matid), nvartmp_eos, ebuf%VARTMP , nummat
481 IF (eintwt(ii, imat) < zero)
THEN
483 eintwt(ii, imat) = -eintwt(ii, imat)
487 IF (remaining_elts /= 0 .AND. idbg)
THEN
488 print*,
"*** CV PB IN PRESSURE EQUILIBRIUM",
" CYCLE", ncycle,
"GROUPE", ng
490 IF (cv_indicator(ii) == 0 .AND.
ASSOCIATED(ix))
THEN
491 WRITE(*,
'(A,I10,A,I10)')
"LOCAL_ID ", ii + nft,
" GLOBAL_ID ", ix(nix, ii)
493 WRITE(*,*)
"MAT ", imat,
", alph : ", alphawt(ii, imat),
", PRES : ", preswt(ii, imat)
494 . ,
", EINT : ", eintwt(ii, imat)
506 IF(
ASSOCIATED(ix))
THEN
507 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
511 matlaw = matparam(local_matid)%ILAW
512 pres => preswt(1:nel, imat)
513 ssp => sspwt(1:nel, imat)
514 vol => volwt(1:nel, imat)
515 rho => rhowt(1:nel, imat)
516 eint => eintwt(1:nel, imat)
518 ebuf => elbuf_tab(ng)%BUFLY(imat)%EOS(1, 1, 1)
519 nvareos = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
520 nvartmp_eos = elbuf_tab(ng)%BUFLY(imat)%NVARTMP_EOS
522 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
523 multi_fvm%PHASE_EINT(imat, 1 + nft : nel + nft) = eintwt(1:nel, imat)
524 multi_fvm%PHASE_RHO(imat, 1 + nft : nel + nft) = rhowt(1:nel, imat)
527 multi_fvm%PHASE_ALPHA(imat, i) = volwt(ii, imat) / gbuf%VOL(ii)
533 3 vol, grun(1:nel,imat),pm, ipm,
534 4 npropm, npropmi, bufmat,
535 5 lbuf%TEMP, lbuf%BFRAC, gbuf%TB, gbuf%DELTAX,
536 6 current_time, sigold, snpc, stf,
537 7 npf, tf, ebuf%VAR, nvareos,
538 8 matparam(local_matid), nvartmp_eos, ebuf%VARTMP, nummat ,
566 IF (multi_fvm%PHASE_ALPHA(imat, i) > zero .AND.
567 . mfracwt(ii, imat) > em14)
THEN
568 one_over_grun = one_over_grun * grun(ii, imat)
571 IF (nbmat_incell(ii) > 1 .AND. one_over_grun > zero)
THEN
574 remaining_elts = remaining_elts + 1
579 IF (remaining_elts == 0) cont = .false.
583 DO WHILE(iter < max_iter .AND. cont)
589 fe(1:nel) = - multi_fvm%EINT(1 + nft : nel + nft)
590 pres_incr(1:nel) = zero
592 pres => preswt(1:nel, imat)
593 vol => volwt(1:nel, imat)
594 eint => eintwt(1:nel, imat)
595 fp => fpwt(1:nel, imat)
597 IF (vol(ii) > zero .AND.
598 . mfracwt(ii, imat) > em14)
THEN
599 IF (cv_indicator(ii) /= 1)
THEN
601 IF (grun(ii, imat) > zero)
THEN
602 one_over_grun = one / grun(ii, imat)
604 vol_frac = alphawt(ii, imat)
606 fp(ii) = pres(ii) - relaxed_pressure(ii)
607 IF (one_over_grun > zero)
THEN
608 fe(ii) = fe(ii) + vol_frac * eint(ii)
611 pres_incr(ii) = pres_incr(ii) + vol_frac * one_over_grun * fp(ii)
612 coef(ii) = coef(ii) + vol_frac * one_over_grun
619 IF (cv_indicator(ii) /= 1)
THEN
620 IF (coef(ii) /= zero)
THEN
622 pres_incr(ii) = (fe(ii) - pres_incr(ii)) / coef(ii)
623 relaxed_pressure(ii) = relaxed_pressure(ii) - pres_incr(ii)
625 error(ii) = abs(pres_incr(ii))
631 pres => preswt(1:nel, imat)
632 vol => volwt(1:nel, imat)
633 rho => rhowt(1:nel, imat)
634 eint => eintwt(1:nel, imat)
635 fp => fpwt(1:nel, imat)
637 IF (cv_indicator(ii) /= 1)
THEN
638 IF (vol(ii) > zero .AND. grun(ii, imat) > zero .AND.
639 . mfracwt(ii, imat) > em14)
THEN
641 IF ((fp(ii) + pres_incr(ii)) > zero)
THEN
642 lim =
max(zero,
min (one, half * eint(ii) * grun(ii, imat)
643 . / (fp(ii) + pres_incr(ii))))
645 eint(ii) = eint(ii) - lim * (fp(ii) + pres_incr(ii)) / grun(ii, imat)
650 IF(
ASSOCIATED(ix))
THEN
651 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
655 matlaw = matparam(local_matid)%ILAW
656 ssp => sspwt(1:nel, imat)
657 vol => volwt(1:nel, imat)
658 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
660 nvareos = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
661 nvartmp_eos = elbuf_tab(ng)%BUFLY(imat)%NVARTMP_EOS
663 1 0, matlaw, local_matid, nel,
666 4 npropm, npropmi, bufmat, lbuf%OFF,
669 7 npf, tf, ebuf%VAR, nvareos,
670 8 matparam(local_matid),nvartmp_eos, ebuf%VARTMP, nummat ,
674 IF (cv_indicator(ii) /= 1)
THEN
675 IF (error(ii) < tol * (one + abs(relaxed_pressure(ii))))
THEN
677 remaining_elts = remaining_elts - 1
681 IF (remaining_elts == 0)
THEN
687 IF (eintwt(ii, imat) < zero)
THEN
692 IF (remaining_elts /= 0 .AND. cont .AND. idbg)
THEN
693 print*,
"*** CV PB IN ENERGY RESET",
"CYCLE", ncycle,
"GROUPE", ng
699 gbuf%SIG(1:nel) = zero
701 multi_fvm%SOUND_SPEED(1 + nft
703 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
704 multi_fvm%PHASE_EINT(imat, 1 + nft : nel + nft) = eintwt(1:nel, imat)
705 multi_fvm%PHASE_RHO(imat, 1 + nft : nel + nft) = rhowt(1:nel, imat)
707 multi_fvm%PHASE_PRES(imat, 1 + nft : nel + nft) = preswt(1:nel, imat)
708 IF(
ASSOCIATED(ix))
THEN
709 local_matid = matparam(ix(1,1))%MULTIMAT%MID(imat)
714 matlaw = matparam(local_matid)%ILAW
718 vol_frac = multi_fvm%PHASE_ALPHA(imat, i)
719 gbuf%SIG(ii) = gbuf%SIG(ii) - preswt(ii, imat) * vol_frac
720 multi_fvm%SOUND_SPEED(ii + nft
721 . vol_frac * rhowt(ii, imat) *
max(sspwt(ii, imat), em20)
722 IF (matlaw == 5)
THEN
723 multi_fvm%BFRAC(imat, i) = lbuf%BFRAC(ii)
725 multi_fvm%BFRAC(imat, i) = zero
738 gbuf%SIG(1 + 1 * nel : 2 * nel) = gbuf%SIG(1 + 0 * nel : 1 * nel)
739 gbuf%SIG(1 + 2 * nel : 3 * nel) = gbuf%SIG(1 + 0 * nel : 1 * nel)
743 multi_fvm%SOUND_SPEED(ii + nft) = sqrt(multi_fvm%SOUND_SPEED(ii + nft)
744 . / multi_fvm%RHO(i))
745 multi_fvm%PRES(ii + nft) = -gbuf%SIG(ii)
750 gbuf%TEMP(1:nel) = zero
752 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
754 gbuf%TEMP(ii) = gbuf%TEMP(ii) + mfracwt(ii, imat)*lbuf%TEMP(ii)
759 ENDDO ! ng = itask + 1, ngroup, nthread