37 SUBROUTINE multi_nrf_ebcs(ITASK, EBCS_ID, MULTI_FVM, NELEM, ELEM_LIST, FACE_LIST,
38 . FVM_INLET_DATA, IXS, IXQ, IXTG, XGRID, WGRID, IPM, PM, FUNC_VALUE,
39 . EBCS,NPF,TF,FSAVSURF,TIMESTEP,MATPARAM)
46 USE matparam_def_mod ,
ONLY : matparam_struct_
51#include "implicit_f.inc"
64 COMMON /tablesizf/ stf,snpc
70 INTEGER,
INTENT(IN) :: EBCS_ID
71 TYPE(multi_fvm_struct),
INTENT(INOUT) :: MULTI_FVM
72 INTEGER,
INTENT(IN) :: ITASK, NELEM, ELEM_LIST(NELEM), FACE_LIST(NELEM)
73 INTEGER,
INTENT(IN) :: IXS(NIXS, *), IXQ(NIXQ, *), (NIXTG, *)
74 my_real,
INTENT(IN) :: xgrid(3, *), wgrid(3, *)
75 INTEGER,
INTENT(IN) :: IPM(NPROPMI, *)
76 my_real,
INTENT(IN) :: pm(npropm, *), func_value(*)
77 TYPE(fvm_inlet_data_struct),
INTENT(IN) :: FVM_INLET_DATA
78 TYPE(t_ebcs_nrf),
INTENT(INOUT) :: EBCS
79 INTEGER,
INTENT(IN) :: NPF(SNPC)
80 my_real,
INTENT(IN) :: tf(stf), timestep
81 TYPE(matparam_struct_),
DIMENSION(NUMMAT),
INTENT(IN) :: MATPARAM
85 INTEGER :: IELEM, ELEMID, NODE_ID
86 INTEGER :: KFACE, NB_NOD_FOUND, KNOD, KK, JJ
87 my_real :: x1(3), x2(3), x3(3), x4(3), p, normvel, vx, vy, vz, ssp, surf, nx, ny, nz
88 my_real :: rho, sstar, pstar, pfac, sl, sr, wfac(3), vii(5), vel2, normalw
89 my_real :: fii(5), fjj(5), viistar(5), fiistar(5), fjjstar(5), pp(5)
90 INTEGER :: NODE1, NODE2, IMAT, NBMAT
91 INTEGER :: MATLAW(MULTI_FVM%), LOCAL_MATID(MULTI_FVM%NBMAT)
92 my_real :: phase_rhoii(multi_fvm%NBMAT), phase_presii(multi_fvm%NBMAT),
93 . phase_eintii(multi_fvm%NBMAT), phase_sspii(multi_fvm%NBMAT),
94 . phase_alphaii(multi_fvm%NBMAT), phase_rhojj(multi_fvm%NBMAT),
95 . phase_presjj(multi_fvm%NBMAT), phase_eintjj(multi_fvm%NBMAT),
96 . phase_sspjj(multi_fvm%NBMAT), phase_alphajj(multi_fvm%NBMAT)
97 my_real :: dummy(6),dummy2(1), rhoii, pii, eintii, vxii, vyii, vzii
98 . p_jj, normal_veljj, vxjj, vyjj, vzjj, velii2, alphaii, sub_rhoii, sub_rhoeintii, sub_viistar
99 . sub_fiistar(3), alphastar, sub_rhostar, sub_pii, veljj2, sub_estar, eintjj
100 INTEGER :: IELEM_START, IELEM_END, ID_SURF
101 my_real :: TCAR_P, TCAR_VF,ALPHA,BETA,DP0,Vnew,Vold,Pvois,POld,MACH,RHOC2,ROC,PSURF
102 INTEGER :: VARTMP_EOS(1,128)
103 INTEGER :: NVARTMP_EOS
112 tcar_vf = ebcs%TCAR_VF
113 id_surf = ebcs%SURF_ID
116 alpha = timestep/tcar_p
117 beta = timestep/
max(timestep,tcar_vf)
118 IF(tcar_vf>=ep20)beta=zero
119 IF(timestep == zero)
THEN
124 nbmat = multi_fvm%NBMAT
125 ielem_start = 1 + itask * nelem / nthread
126 ielem_end = (1 + itask) * nelem / nthread
129 DO ielem = ielem_start, ielem_end
130 elemid = elem_list(ielem)
131 IF (elemid <= numels)
THEN
133 local_matid(imat) = ipm(20 + imat, ixs(1, elemid
134 matlaw(imat) = ipm(2, local_matid(imat))
136 ELSE IF (elemid <= numels + numelq)
THEN
138 local_matid(imat) = ipm(20 + imat, ixq(1, elemid))
139 matlaw(imat) = ipm(2, local_matid(imat))
143 local_matid(imat) = ipm(20 + imat, ixtg(1, elemid))
144 matlaw(imat) = ipm(2, local_matid(imat
149 kface = face_list(ielem)
151 nx = multi_fvm%FACE_DATA%NORMAL(1, kface, elemid)
152 ny = multi_fvm%FACE_DATA%NORMAL(2, kface, elemid)
153 nz = multi_fvm%FACE_DATA%NORMAL(3, kface, elemid)
154 surf = multi_fvm%FACE_DATA%SURF(kface, elemid
155 wfac(1:3) = multi_fvm%FACE_DATA%WFAC(1:3, kface, elemid)
157 normalw = wfac(1) * nx + wfac(2) * ny + wfac
160 rhoii = multi_fvm%RHO(elemid)
161 pii = multi_fvm%PRES(elemid)
162 eintii = multi_fvm%EINT(elemid)
163 vxii = multi_fvm%VEL(1, elemid)
164 vyii = multi_fvm%VEL(2, elemid)
165 vzii = multi_fvm%VEL(3, elemid)
166 velii2 = vxii**2 + vyii**2 + vzii**2
169 phase_alphaii(imat) = multi_fvm%PHASE_ALPHA
170 phase_eintii(imat) = multi_fvm%PHASE_EINT(imat, elemid)
171 phase_rhoii(imat) = multi_fvm%PHASE_RHO(imat, elemid)
172 phase_presii(imat) = multi_fvm%PHASE_PRES
175 phase_alphaii(1) = one
176 phase_eintii(1) = eintii
177 phase_rhoii(1) = rhoii
178 phase_presii(1) = pii
180 sspii = multi_fvm%SOUND_SPEED(elemid)
181 normal_velii = vxii * nx + vyii
186 phase_rhojj(imat) = fvm_inlet_data%VAL_RHO(imat)
187 phase_rhojj(imat) = phase_rhoii(imat)
188 phase_alphajj(imat) = fvm_inlet_data%VAL_ALPHA
189 phase_alphajj(imat) = phase_alphaii(imat)
190 rhojj = rhojj + phase_rhojj(imat) * phase_alphajj(imat)
198 phase_eintjj(imat) = fvm_inlet_data%VAL_PRES(imat)
199 phase_eintjj(imat) = phase_eintii(imat)
200 IF (phase_alphajj(imat) > zero)
THEN
202 1 0, matlaw(imat), local_matid(imat), 1,
203 2 phase_eintjj(imat), phase_presjj
204 3 dummy2, dummy, pm, ipm,
205 4 npropm, npropmi, dummy, dummy2,
206 5 dummy, multi_fvm%BFRAC
207 6 dummy(1), dummy, snpc, stf,
209 7 matparam(local_matid(imat)), nvartmp_eos
210 sspjj = sspjj + phase_alphajj(imat) * phase_rhojj(imat) *
max(em20, phase_sspjj(imat))
211 p_jj = p_jj + phase_presjj(imat) * phase_alphajj(imat)
212 eintjj = eintjj + phase_alphajj(imat) * phase_eintjj(imat)
219 pold = ebcs%pold(ielem)
220 dp0 = ebcs%DP0(ielem)
221 IF(ncycle == 1)pold=pvois+dp0
222 vold = ebcs%vold(ielem)
223 IF(ncycle == 1) vold=normal_velii
224 ebcs%vold(ielem) = vnew
226 IF(mach >= one .AND. vnew > zero)
THEN
230 rhoc2 = rhojj*sspii*sspii
231 roc = sqrt(rhojj*rhoc2)
232 p_jj = one/(one+alpha)*(pold+roc*(vnew-vold))+alpha*(pvois+dp0)/(alpha + one)
235 ebcs%pold(ielem) = p_jj
237 IF (sspjj / rhojj > zero)
THEN
238 sspjj = sqrt(sspjj / rhojj)
240 sspjj = multi_fvm%SOUND_SPEED(elemid)
244 vxjj = fvm_inlet_data%VAL_VEL(1)
246 vyjj = fvm_inlet_data%VAL_VEL(2)
248 vzjj = fvm_inlet_data%VAL_VEL(3)
250 normal_veljj = vxjj * nx + vyjj * ny + vzjj * nz
252 veljj2 = vxjj**2 + vyjj**2 + vzjj**2
254 sl =
min(normal_velii - sspii, normal_veljj - sspjj)
255 sr =
max(normal_velii + sspii, normal_veljj + sspjj)
258 sstar = p_jj - pii + rhoii * normal_velii * (sl - normal_velii) - rhojj * normal_veljj * (sr - normal_veljj)
259 sstar = sstar / (rhoii * (sl - normal_velii) - rhojj * (sr - normal_veljj))
261 pstar = pii + rhoii * (sstar - normal_velii) * (sl - normal_velii)
266 pp(5) = sstar * pstar
268 IF (sl > normalw)
THEN
270 vii(2) = rhoii * vxii
271 vii(3) = rhoii * vyii
272 vii(4) = rhoii * vzii
273 vii(5) = eintii + half * rhoii * velii2
275 fii(1) = vii(1) * normal_velii
276 fii(2) = vii(2) * normal_velii + pii * nx
277 fii(3) = vii(3) * normal_velii + pii * ny
278 fii(4) = vii(4) * normal_velii + pii * nz
279 fii(5) = (vii(5) + pii) * normal_velii
285 multi_fvm%FLUXES(1:5, kface, elemid) = (fii(1:5) - normalw * vii(1:5)) * surf
286 multi_fvm%FLUXES(6, kface, elemid) = normal_velii * surf
291 alphaii = phase_alphaii(imat)
292 sub_rhoii = phase_rhoii(imat)
293 sub_rhoeintii = phase_eintii(imat)
294 sub_viistar(1) = alphaii
295 sub_viistar(2) = alphaii * sub_rhoii
296 sub_viistar(3) = alphaii * sub_rhoeintii
297 sub_fiistar(1:3) = sub_viistar(1:3) * normal_velii
298 multi_fvm%SUBVOL_FLUXES(imat, kface, elemid) = (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
299 multi_fvm%SUBMASS_FLUXES(imat, kface, elemid) = (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
300 multi_fvm%SUBENER_FLUXES(imat, kface, elemid) = (sub_fiistar(3) - normalw
304 ELSEIF (sl <= normalw .AND. normalw <= sstar)
THEN
306 vii(2) = rhoii * vxii
307 vii(3) = rhoii * vyii
308 vii(4) = rhoii * vzii
309 vii(5) = eintii + half * rhoii * velii2
311 fii(1) = vii(1) * normal_velii
312 fii(2) = vii(2) * normal_velii + pii * nx
313 fii(3) = vii(3) * normal_velii + pii * ny
314 fii(4) = vii(4) * normal_velii + pii * nz
315 fii(5) = (vii(5) + pii) * normal_velii
321 viistar(1:5) = fii(1:5) - (sl) * vii(1:5) - pp(1:5)
322 viistar(1:5) = viistar(1:5) / (sstar - sl)
323 fiistar(1:5) = viistar(1:5) * sstar + pp(1:5)
324 multi_fvm%FLUXES(1:5, kface, elemid) = (fiistar(1:5) - normalw * viistar(1:5)) * surf
325 multi_fvm%FLUXES(6, kface, elemid) = sstar * surf
330 matlaw(imat) = ipm(2, local_matid(imat))
331 alphastar = phase_alphaii(imat)
332 sub_rhostar = phase_rhoii(imat) * (normal_velii - sl) / (sstar - sl)
333 IF (alphastar > zero)
THEN
334 sub_rhoii = phase_rhoii(imat)
335 sub_rhoeintii = phase_eintii(imat)
336 sub_pii = phase_presii(imat)
337 sub_estar = phase_eintii(imat) / phase_rhoii(imat) -
338 . phase_presii(imat) * (one / sub_rhostar - one / phase_rhoii(imat))
340 IF (sub_estar < zero)
THEN
346 sub_viistar(1) = alphastar
347 sub_viistar(2) = alphastar * sub_rhostar
348 sub_viistar(3) = alphastar * sub_rhostar * sub_estar
350 sub_fiistar(1:3) = sub_viistar(1:3) * sstar
351 multi_fvm%SUBVOL_FLUXES(imat, kface, elemid) = (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
352 multi_fvm%SUBMASS_FLUXES(imat, kface, elemid) = (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
353 multi_fvm%SUBENER_FLUXES(imat, kface, elemid) = (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
357 ELSE IF (sstar < normalw .AND. normalw <= sr)
THEN
359 vii(2) = rhojj * vxjj
360 vii(3) = rhojj * vyjj
361 vii(4) = rhojj * vzjj
362 vii(5) = eintjj + half * rhojj * veljj2
364 fii(1) = vii(1) * normal_veljj
365 fii(2) = vii(2) * normal_veljj + p_jj * nx
366 fii(3) = vii(3) * normal_veljj + p_jj * ny
367 fii(4) = vii(4) * normal_veljj + p_jj * nz
368 fii(5) = (vii(5) + p_jj) * normal_veljj
374 viistar(1:5) = fii(1:5) - (sr) * vii(1:5) - pp(1:5)
375 viistar(1:5) = viistar(1:5) / (sstar - sr)
376 fiistar(1:5) = viistar(1:5) * sstar + pp(1:5)
377 multi_fvm%FLUXES(1:5, kface, elemid) = (fiistar(1:5) - normalw * viistar(1:5)) * surf
378 multi_fvm%FLUXES(6, kface, elemid) = sstar * surf
383 matlaw(imat) = ipm(2, local_matid(imat))
384 alphastar = phase_alphajj(imat)
385 sub_rhostar = phase_rhojj(imat) * (normal_veljj - sr) / (sstar - sr)
386 IF (alphastar > zero)
THEN
387 sub_rhoii = phase_rhojj(imat)
388 sub_rhoeintii = phase_eintjj(imat)
389 sub_pii = phase_presjj(imat)
390 sub_estar = phase_eintjj(imat) / phase_rhojj(imat) -
391 . phase_presjj(imat) * (one / sub_rhostar - one / phase_rhojj(imat))
392 IF (sub_estar < zero)
THEN
399 sub_viistar(1) = phase_alphajj(imat)
400 sub_viistar(2) = phase_alphajj(imat) * sub_rhostar
401 sub_viistar(3) = phase_alphajj(imat) * sub_rhostar * sub_estar
402 sub_fiistar(1:3) = sub_viistar(1:3) * sstar
403 multi_fvm%SUBVOL_FLUXES(imat, kface, elemid) = (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
404 multi_fvm%SUBMASS_FLUXES(imat, kface, elemid) = (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
405 multi_fvm%SUBENER_FLUXES(imat, kface, elemid) = (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
408 ELSE IF (sr < normalw)
THEN
410 vii(2) = rhojj * vxjj
411 vii(3) = rhojj * vyjj
412 vii(4) = rhojj * vzjj
413 vii(5) = eintjj + half * rhojj * veljj2
415 fii(1) = vii(1) * normal_veljj
416 fii(2) = vii(2) * normal_veljj + p_jj * nx
417 fii(3) = vii(3) * normal_veljj + p_jj * ny
418 fii(4) = vii(4) * normal_veljj + p_jj * nz
419 fii(5) = (vii(5) + p_jj) * normal_veljj
425 multi_fvm%FLUXES(1:5, kface, elemid) = (fii(1:5) - normalw * vii(1:5)) * surf
426 multi_fvm%FLUXES(6, kface, elemid) = normal_veljj * surf
431 alphaii = phase_alphajj(imat)
432 sub_rhoii = phase_rhojj(imat)
433 sub_rhoeintii = phase_eintjj(imat)
434 sub_viistar(1) = alphaii
435 sub_viistar(2) = alphaii * sub_rhoii
436 sub_viistar(3) = alphaii * sub_rhoeintii
437 sub_fiistar(1:3) = sub_viistar(1:3) * normal_veljj
438 multi_fvm%SUBVOL_FLUXES(imat, kface, elemid) = (sub_fiistar(1) - normalw * sub_viistar(1)) * surf
439 multi_fvm%SUBMASS_FLUXES(imat, kface, elemid) = (sub_fiistar(2) - normalw * sub_viistar(2)) * surf
440 multi_fvm%SUBENER_FLUXES(imat, kface, elemid) = (sub_fiistar(3) - normalw * sub_viistar(3)) * surf
450 fsavsurf(2,id_surf) = fsavsurf(2,id_surf) + multi_fvm%FLUXES(1, kface, elemid)
451 fsavsurf(3,id_surf) = fsavsurf(3,id_surf) + multi_fvm%FLUXES(1, kface, elemid) / vii(1)
452 fsavsurf(4,id_surf) = fsavsurf(4,id_surf) + surf*psurf
453 fsavsurf(6,id_surf) = fsavsurf(6,id_surf) + multi_fvm%FLUXES(1, kface, elemid)