Skip to content

Commit 2ce9308

Browse files
committed
Merge remote-tracking branch 'upstream/master' into openmp_nvidia_merged_master
2 parents 10f3361 + eb152c5 commit 2ce9308

File tree

23 files changed

+717
-1186
lines changed

23 files changed

+717
-1186
lines changed

examples/1D_inert_shocktube/case.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@
7070
"mapped_weno": "T",
7171
"mp_weno": "T",
7272
"riemann_solver": 2,
73-
"wave_speeds": 2,
74-
"avg_state": 1,
73+
"wave_speeds": 1,
74+
"avg_state": 2,
7575
"bc_x%beg": -2,
7676
"bc_x%end": -3,
7777
# Chemistry

src/common/m_chemistry.fpp

Lines changed: 164 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ module m_chemistry
1010

1111
use m_thermochem, only: &
1212
num_species, molecular_weights, get_temperature, get_net_production_rates, &
13-
gas_constant, get_mixture_molecular_weight
13+
get_mole_fractions, get_species_binary_mass_diffusivities, &
14+
get_species_mass_diffusivities_mixavg, gas_constant, get_mixture_molecular_weight, &
15+
get_mixture_energy_mass, get_mixture_thermal_conductivity_mixavg, get_species_enthalpies_rt, &
16+
get_mixture_viscosity_mixavg
1417

1518
use m_global_parameters
1619

@@ -23,8 +26,28 @@ module m_chemistry
2326
$:GPU_DECLARE(create='[molecular_weights_nonparameter]')
2427
#:endblock DEF_AMD
2528

29+
type(int_bounds_info) :: isc1, isc2, isc3
30+
$:GPU_DECLARE(create='[isc1, isc2, isc3]')
31+
integer, dimension(3) :: offsets
32+
$:GPU_DECLARE(create='[offsets]')
33+
2634
contains
2735

36+
subroutine compute_viscosity_and_inversion(T_L, Ys_L, T_R, Ys_R, Re_L, Re_R)
37+
38+
$:GPU_ROUTINE(function_name='compute_viscosity_and_inversion',parallelism='[seq]', &
39+
& cray_inline=True)
40+
41+
real(wp), intent(inout) :: T_L, T_R, Re_L, Re_R
42+
real(wp), dimension(num_species), intent(inout) :: Ys_R, Ys_L
43+
44+
call get_mixture_viscosity_mixavg(T_L, Ys_L, Re_L)
45+
call get_mixture_viscosity_mixavg(T_R, Ys_R, Re_R)
46+
Re_L = 1.0_wp/Re_L
47+
Re_R = 1.0_wp/Re_R
48+
49+
end subroutine compute_viscosity_and_inversion
50+
2851
subroutine s_compute_q_T_sf(q_T_sf, q_cons_vf, bounds)
2952

3053
! Initialize the temperature field at the start of the simulation to
@@ -140,4 +163,144 @@ contains
140163

141164
end subroutine s_compute_chemistry_reaction_flux
142165

166+
subroutine s_compute_chemistry_diffusion_flux(idir, q_prim_qp, flux_src_vf, irx, iry, irz)
167+
168+
type(scalar_field), dimension(sys_size), intent(in) :: q_prim_qp
169+
type(scalar_field), dimension(sys_size), intent(inout) :: flux_src_vf
170+
type(int_bounds_info), intent(in) :: irx, iry, irz
171+
172+
integer, intent(in) :: idir
173+
174+
real(wp), dimension(num_species) :: Xs_L, Xs_R, Xs_cell, Ys_L, Ys_R, Ys_cell
175+
real(wp), dimension(num_species) :: mass_diffusivities_mixavg1, mass_diffusivities_mixavg2
176+
real(wp), dimension(num_species) :: mass_diffusivities_mixavg_Cell, dXk_dxi, h_l, h_r, h_k
177+
real(wp), dimension(num_species) :: Mass_Diffu_Flux
178+
real(wp) :: Mass_Diffu_Energy
179+
real(wp) :: MW_L, MW_R, MW_cell, Rgas_L, Rgas_R, T_L, T_R, P_L, P_R, rho_L, rho_R, rho_cell, rho_Vic
180+
real(wp) :: lambda_L, lambda_R, lambda_Cell, dT_dxi, grid_spacing
181+
182+
integer :: x, y, z, i, n, eqn
183+
integer, dimension(3) :: offsets
184+
185+
isc1 = irx; isc2 = iry; isc3 = irz
186+
187+
$:GPU_UPDATE(device='[isc1,isc2,isc3]')
188+
189+
if (chemistry) then
190+
! Set offsets based on direction using array indexing
191+
offsets = 0
192+
offsets(idir) = 1
193+
194+
#:call GPU_PARALLEL_LOOP(collapse=3, private='[Ys_L, Ys_R, Ys_cell, Xs_L, Xs_R, mass_diffusivities_mixavg1, mass_diffusivities_mixavg2, mass_diffusivities_mixavg_Cell, h_l, h_r, Xs_cell, h_k, dXk_dxi,Mass_Diffu_Flux]', copyin='[offsets]')
195+
do z = isc3%beg, isc3%end
196+
do y = isc2%beg, isc2%end
197+
do x = isc1%beg, isc1%end
198+
! Calculate grid spacing using direction-based indexing
199+
select case (idir)
200+
case (1)
201+
grid_spacing = x_cc(x + 1) - x_cc(x)
202+
case (2)
203+
grid_spacing = y_cc(y + 1) - y_cc(y)
204+
case (3)
205+
grid_spacing = z_cc(z + 1) - z_cc(z)
206+
end select
207+
208+
! Extract species mass fractions
209+
$:GPU_LOOP(parallelism='[seq]')
210+
do i = chemxb, chemxe
211+
Ys_L(i - chemxb + 1) = q_prim_qp(i)%sf(x, y, z)
212+
Ys_R(i - chemxb + 1) = q_prim_qp(i)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
213+
Ys_cell(i - chemxb + 1) = 0.5_wp*(Ys_L(i - chemxb + 1) + Ys_R(i - chemxb + 1))
214+
end do
215+
216+
! Calculate molecular weights and mole fractions
217+
call get_mixture_molecular_weight(Ys_L, MW_L)
218+
call get_mixture_molecular_weight(Ys_R, MW_R)
219+
MW_cell = 0.5_wp*(MW_L + MW_R)
220+
221+
call get_mole_fractions(MW_L, Ys_L, Xs_L)
222+
call get_mole_fractions(MW_R, Ys_R, Xs_R)
223+
224+
! Calculate gas constants and thermodynamic properties
225+
Rgas_L = gas_constant/MW_L
226+
Rgas_R = gas_constant/MW_R
227+
228+
P_L = q_prim_qp(E_idx)%sf(x, y, z)
229+
P_R = q_prim_qp(E_idx)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
230+
231+
rho_L = q_prim_qp(1)%sf(x, y, z)
232+
rho_R = q_prim_qp(1)%sf(x + offsets(1), y + offsets(2), z + offsets(3))
233+
234+
T_L = P_L/rho_L/Rgas_L
235+
T_R = P_R/rho_R/Rgas_R
236+
237+
rho_cell = 0.5_wp*(rho_L + rho_R)
238+
dT_dxi = (T_R - T_L)/grid_spacing
239+
240+
! Get transport properties
241+
call get_species_mass_diffusivities_mixavg(P_L, T_L, Ys_L, mass_diffusivities_mixavg1)
242+
call get_species_mass_diffusivities_mixavg(P_R, T_R, Ys_R, mass_diffusivities_mixavg2)
243+
244+
call get_mixture_thermal_conductivity_mixavg(T_L, Ys_L, lambda_L)
245+
call get_mixture_thermal_conductivity_mixavg(T_R, Ys_R, lambda_R)
246+
247+
call get_species_enthalpies_rt(T_L, h_l)
248+
call get_species_enthalpies_rt(T_R, h_r)
249+
250+
! Calculate species properties and gradients
251+
$:GPU_LOOP(parallelism='[seq]')
252+
do i = chemxb, chemxe
253+
h_l(i - chemxb + 1) = h_l(i - chemxb + 1)*gas_constant*T_L/molecular_weights(i - chemxb + 1)
254+
h_r(i - chemxb + 1) = h_r(i - chemxb + 1)*gas_constant*T_R/molecular_weights(i - chemxb + 1)
255+
Xs_cell(i - chemxb + 1) = 0.5_wp*(Xs_L(i - chemxb + 1) + Xs_R(i - chemxb + 1))
256+
h_k(i - chemxb + 1) = 0.5_wp*(h_l(i - chemxb + 1) + h_r(i - chemxb + 1))
257+
dXk_dxi(i - chemxb + 1) = (Xs_R(i - chemxb + 1) - Xs_L(i - chemxb + 1))/grid_spacing
258+
end do
259+
260+
! Calculate mixture-averaged diffusivities
261+
$:GPU_LOOP(parallelism='[seq]')
262+
do i = chemxb, chemxe
263+
mass_diffusivities_mixavg_Cell(i - chemxb + 1) = &
264+
(mass_diffusivities_mixavg2(i - chemxb + 1) + mass_diffusivities_mixavg1(i - chemxb + 1))/2.0_wp
265+
end do
266+
267+
lambda_Cell = 0.5_wp*(lambda_R + lambda_L)
268+
269+
! Calculate mass diffusion fluxes
270+
rho_Vic = 0.0_wp
271+
Mass_Diffu_Energy = 0.0_wp
272+
273+
$:GPU_LOOP(parallelism='[seq]')
274+
do eqn = chemxb, chemxe
275+
Mass_Diffu_Flux(eqn - chemxb + 1) = rho_cell*mass_diffusivities_mixavg_Cell(eqn - chemxb + 1)* &
276+
molecular_weights(eqn - chemxb + 1)/MW_cell*dXk_dxi(eqn - chemxb + 1)
277+
rho_Vic = rho_Vic + Mass_Diffu_Flux(eqn - chemxb + 1)
278+
Mass_Diffu_Energy = Mass_Diffu_Energy + h_k(eqn - chemxb + 1)*Mass_Diffu_Flux(eqn - chemxb + 1)
279+
end do
280+
281+
! Apply corrections for mass conservation
282+
$:GPU_LOOP(parallelism='[seq]')
283+
do eqn = chemxb, chemxe
284+
Mass_Diffu_Energy = Mass_Diffu_Energy - h_k(eqn - chemxb + 1)*Ys_cell(eqn - chemxb + 1)*rho_Vic
285+
Mass_Diffu_Flux(eqn - chemxb + 1) = Mass_Diffu_Flux(eqn - chemxb + 1) - rho_Vic*Ys_cell(eqn - chemxb + 1)
286+
end do
287+
288+
! Add thermal conduction contribution
289+
Mass_Diffu_Energy = lambda_Cell*dT_dxi + Mass_Diffu_Energy
290+
291+
! Update flux arrays
292+
flux_src_vf(E_idx)%sf(x, y, z) = flux_src_vf(E_idx)%sf(x, y, z) - Mass_Diffu_Energy
293+
294+
$:GPU_LOOP(parallelism='[seq]')
295+
do eqn = chemxb, chemxe
296+
flux_src_vf(eqn)%sf(x, y, z) = flux_src_vf(eqn)%sf(x, y, z) - Mass_diffu_Flux(eqn - chemxb + 1)
297+
end do
298+
end do
299+
end do
300+
end do
301+
#:endcall GPU_PARALLEL_LOOP
302+
end if
303+
304+
end subroutine s_compute_chemistry_diffusion_flux
305+
143306
end module m_chemistry

src/common/m_variables_conversion.fpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1642,7 +1642,7 @@ contains
16421642
integer :: q
16431643

16441644
if (chemistry) then
1645-
if (avg_state == 1 .and. abs(c_c) > Chem_Tolerance) then
1645+
if (avg_state == 1 .and. abs(c_c) > verysmall) then
16461646
c = sqrt(c_c - (gamma - 1.0_wp)*(vel_sum - H))
16471647
else
16481648
c = sqrt((1.0_wp + 1.0_wp/gamma)*pres/rho)

src/pre_process/include/1dHardcodedIC.fpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#:def Hardcoded1DVariables()
22
! Place any declaration of intermediate variables here
3+
real(wp) :: x_mid_diffu, width_sq, profile_shape, temp, molar_mass_inv, y1, y2, y3, y4
34
#:enddef
45

56
#:def Hardcoded1D()
@@ -20,6 +21,34 @@
2021
! 1D_titarevtorro cases: "patch_icpp(2)%alpha_rho(1)": "1 + 0.1*sin(20*x*pi)"
2122
q_prim_vf(contxb + 0)%sf(i, 0, 0) = 1 + 0.1*sin(20*x_cc(i)*pi)
2223

24+
case (182)
25+
! This patch is a hard-coded for test suite optimization (multiple component diffusion)
26+
x_mid_diffu = 0.05_wp/2.0_wp
27+
width_sq = (2.5_wp*10.0_wp**(-3.0_wp))**2
28+
profile_shape = 1.0_wp - 0.5_wp*exp(-(x_cc(i) - x_mid_diffu)**2/width_sq)
29+
q_prim_vf(momxb)%sf(i, 0, 0) = 0.0_wp
30+
q_prim_vf(E_idx)%sf(i, 0, 0) = 1.01325_wp*(10.0_wp)**5
31+
q_prim_vf(advxb)%sf(i, 0, 0) = 1.0_wp
32+
33+
y1 = (0.195_wp - 0.142_wp)*profile_shape + 0.142_wp
34+
y2 = (0.0_wp - 0.1_wp)*profile_shape + 0.1_wp
35+
y3 = (0.214_wp - 0.0_wp)*profile_shape + 0.0_wp
36+
y4 = (0.591_wp - 0.758_wp)*profile_shape + 0.758_wp
37+
38+
q_prim_vf(chemxb)%sf(i, 0, 0) = y1
39+
q_prim_vf(chemxb + 1)%sf(i, 0, 0) = y2
40+
q_prim_vf(chemxb + 2)%sf(i, 0, 0) = y3
41+
q_prim_vf(chemxb + 3)%sf(i, 0, 0) = y4
42+
43+
temp = (320.0_wp - 1350.0_wp)*profile_shape + 1350.0_wp
44+
45+
molar_mass_inv = y1/31.998_wp + &
46+
y2/18.01508_wp + &
47+
y3/16.04256_wp + &
48+
y4/28.0134_wp
49+
50+
q_prim_vf(contxb)%sf(i, 0, 0) = 1.01325_wp*(10.0_wp)**5/(temp*8.3144626_wp*1000.0_wp*molar_mass_inv)
51+
2352
case default
2453
call s_int_to_str(patch_id, iStr)
2554
call s_mpi_abort("Invalid hcid specified for patch "//trim(iStr))

src/simulation/m_global_parameters.fpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,6 +1312,8 @@ contains
13121312
13131313
$:GPU_UPDATE(device='[Bx0, powell]')
13141314
1315+
$:GPU_UPDATE(device='[chem_params]')
1316+
13151317
$:GPU_UPDATE(device='[cont_damage,tau_star,cont_damage_s,alpha_bar]')
13161318
13171319
#:if not MFC_CASE_OPTIMIZATION

0 commit comments

Comments
 (0)