@@ -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+
2634contains
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+
143306end module m_chemistry
0 commit comments