Skip to content

Commit b4942ca

Browse files
author
Thomas Jackson
committed
Fix GPU access to surface molecular weights
1 parent 26769f1 commit b4942ca

1 file changed

Lines changed: 27 additions & 24 deletions

File tree

src/simulation/m_ibm.fpp

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ contains
173173
real(wp), dimension(nb*nmom) :: nmom_IP
174174
real(wp), dimension(nb*nnode) :: presb_IP, massv_IP
175175
real(wp), dimension(num_species) :: Ys_IP, Ys_g
176+
real(wp) :: W_species(num_species)
176177
#:endif
177178
real(wp) :: T_IP, mw_IP, e_IP !< Image-point temperature, mixture MW, and mass-specific internal energy (chemistry)
178179
real(wp) :: v_blow_eff !< Effective surface blowing speed (after any pressure-coupled burn-rate scaling)
@@ -296,8 +297,10 @@ contains
296297
! Heterogeneous reacting surface.
297298
d = abs(real(gp%levelset, kind=wp))
298299

299-
call s_solve_surface(pres_IP, T_IP, patch_ib(patch_id)%Twall, d, Ys_IP, patch_ib(patch_id)%thermal_bc, &
300-
& Ys_s, T_s, mdot_s, surface_converged)
300+
W_species(:) = molecular_weights(:)
301+
302+
call s_solve_surface(pres_IP, T_IP, patch_ib(patch_id)%Twall, d, Ys_IP, W_species, &
303+
& patch_ib(patch_id)%thermal_bc, Ys_s, T_s, mdot_s, surface_converged)
301304

302305
if (surface_converged) then
303306
call get_mixture_molecular_weight(Ys_s, mw_s)
@@ -1673,12 +1676,12 @@ contains
16731676
end subroutine s_finalize_ibm_module
16741677
16751678
!> Species flux residual at a heterogeneous reacting surface.
1676-
subroutine s_surface_species_residual(pres, T_s, d, Ys_IP, Ys_s, R_species, omega_s, mdot_s)
1679+
subroutine s_surface_species_residual(pres, T_s, d, Ys_IP, Ys_s, W_species, R_species, omega_s, mdot_s)
16771680
16781681
$:GPU_ROUTINE(parallelism='[seq]')
16791682
16801683
real(wp), intent(in) :: pres, T_s, d
1681-
real(wp), intent(in) :: Ys_IP(num_species), Ys_s(num_species)
1684+
real(wp), intent(in) :: Ys_IP(num_species), Ys_s(num_species), W_species(num_species)
16821685
real(wp), intent(out) :: R_species(num_species), omega_s(num_species), mdot_s
16831686
real(wp) :: mw_IP, mw_s, rho_s, sum_BG
16841687
real(wp) :: Xs_IP(num_species), Xs_s(num_species)
@@ -1690,27 +1693,27 @@ contains
16901693
rho_s = pres*mw_s/(gas_constant*T_s)
16911694
16921695
do k = 1, num_species
1693-
Xs_IP(k) = Ys_IP(k)*mw_IP/molecular_weights(k)
1694-
Xs_s(k) = Ys_s(k)*mw_s/molecular_weights(k)
1696+
Xs_IP(k) = Ys_IP(k)*mw_IP/W_species(k)
1697+
Xs_s(k) = Ys_s(k)*mw_s/W_species(k)
16951698
end do
16961699
16971700
call get_species_mass_diffusivities_mixavg(pres, T_s, Ys_s, D_s)
16981701
call get_surface_net_production_rates(rho_s, T_s, Ys_s, omega_s)
16991702
17001703
mdot_s = 0._wp
17011704
do k = 1, num_species
1702-
mdot_s = mdot_s + molecular_weights(k)*omega_s(k)
1705+
mdot_s = mdot_s + W_species(k)*omega_s(k)
17031706
end do
17041707
17051708
sum_BG = 0._wp
17061709
do k = 1, num_species
1707-
B_s(k) = rho_s*D_s(k)*molecular_weights(k)/mw_s
1710+
B_s(k) = rho_s*D_s(k)*W_species(k)/mw_s
17081711
G_s(k) = (Xs_IP(k) - Xs_s(k))/d
17091712
sum_BG = sum_BG + B_s(k)*G_s(k)
17101713
end do
17111714
17121715
do k = 1, num_species
1713-
R_species(k) = -B_s(k)*G_s(k) + Ys_s(k)*(sum_BG + mdot_s) - molecular_weights(k)*omega_s(k)
1716+
R_species(k) = -B_s(k)*G_s(k) + Ys_s(k)*(sum_BG + mdot_s) - W_species(k)*omega_s(k)
17141717
end do
17151718
17161719
end subroutine s_surface_species_residual
@@ -1737,19 +1740,19 @@ contains
17371740
end subroutine s_surface_energy_residual
17381741
17391742
!> Assemble the Newton residual for Ns species, with temperature appended only when it is solved.
1740-
subroutine s_surface_residual(pres, T_IP, T_s, d, Ys_IP, Ys_s, solve_temperature, flux_scale, energy_scale, R, R_species, &
1741-
& omega_s, mdot_s)
1743+
subroutine s_surface_residual(pres, T_IP, T_s, d, Ys_IP, Ys_s, W_species, solve_temperature, flux_scale, energy_scale, R, &
1744+
& R_species, omega_s, mdot_s)
17421745
17431746
$:GPU_ROUTINE(parallelism='[seq]')
17441747
17451748
real(wp), intent(in) :: pres, T_IP, T_s, d, flux_scale, energy_scale
1746-
real(wp), intent(in) :: Ys_IP(num_species), Ys_s(num_species)
1749+
real(wp), intent(in) :: Ys_IP(num_species), Ys_s(num_species), W_species(num_species)
17471750
logical, intent(in) :: solve_temperature
17481751
real(wp), intent(out) :: R(num_species + 1), R_species(num_species), omega_s(num_species), mdot_s
17491752
real(wp) :: R_energy
17501753
integer :: k
17511754
1752-
call s_surface_species_residual(pres, T_s, d, Ys_IP, Ys_s, R_species, omega_s, mdot_s)
1755+
call s_surface_species_residual(pres, T_s, d, Ys_IP, Ys_s, W_species, R_species, omega_s, mdot_s)
17531756
17541757
R = 0._wp
17551758
do k = 1, num_species - 1
@@ -1765,12 +1768,12 @@ contains
17651768
end subroutine s_surface_residual
17661769
17671770
!> Newton solve for a reacting surface. thermal_bc=0: zero-normal-gradient T; 1: prescribed T; 2: energy balance.
1768-
subroutine s_solve_surface(pres, T_IP, T_wall, d, Ys_IP, thermal_bc, Ys_s, T_s, mdot_s, converged)
1771+
subroutine s_solve_surface(pres, T_IP, T_wall, d, Ys_IP, W_species, thermal_bc, Ys_s, T_s, mdot_s, converged)
17691772
17701773
$:GPU_ROUTINE(parallelism='[seq]')
17711774
17721775
real(wp), intent(in) :: pres, T_IP, T_wall, d
1773-
real(wp), intent(in) :: Ys_IP(num_species)
1776+
real(wp), intent(in) :: Ys_IP(num_species), W_species(num_species)
17741777
integer, intent(in) :: thermal_bc
17751778
real(wp), intent(out) :: Ys_s(num_species), T_s, mdot_s
17761779
logical, intent(out) :: converged
@@ -1810,16 +1813,16 @@ contains
18101813
18111814
nsolve = num_species + merge(1, 0, solve_temperature)
18121815
1813-
call s_surface_species_residual(pres, T_s, d, Ys_IP, Ys_s, R_species, omega_s, mdot_s)
1816+
call s_surface_species_residual(pres, T_s, d, Ys_IP, Ys_s, W_species, R_species, omega_s, mdot_s)
18141817
flux_scale = max(maxval(abs(R_species)), 1.e-12_wp)
18151818
energy_scale = 1._wp
18161819
if (solve_temperature) then
18171820
call s_surface_energy_residual(pres, T_IP, T_s, d, Ys_s, R_energy)
18181821
energy_scale = max(abs(R_energy), 1._wp)
18191822
end if
18201823
1821-
call s_surface_residual(pres, T_IP, T_s, d, Ys_IP, Ys_s, solve_temperature, flux_scale, energy_scale, R, R_species, &
1822-
& omega_s, mdot_s)
1824+
call s_surface_residual(pres, T_IP, T_s, d, Ys_IP, Ys_s, W_species, solve_temperature, flux_scale, energy_scale, R, &
1825+
& R_species, omega_s, mdot_s)
18231826
norm_R = maxval(abs(R(1:nsolve)))
18241827
if (norm_R < tol) then
18251828
converged = .true.
@@ -1834,8 +1837,8 @@ contains
18341837
if (Ys_s(j) + dx > 1._wp) dx = -dx
18351838
Ys_pert(j) = Ys_pert(j) + dx
18361839
1837-
call s_surface_residual(pres, T_IP, T_pert, d, Ys_IP, Ys_pert, solve_temperature, flux_scale, energy_scale, &
1838-
& R_pert, R_species_pert, omega_pert, mdot_pert)
1840+
call s_surface_residual(pres, T_IP, T_pert, d, Ys_IP, Ys_pert, W_species, solve_temperature, flux_scale, &
1841+
& energy_scale, R_pert, R_species_pert, omega_pert, mdot_pert)
18391842
A(1:nsolve,j) = (R_pert(1:nsolve) - R(1:nsolve))/dx
18401843
end do
18411844
@@ -1848,8 +1851,8 @@ contains
18481851
T_pert = T_s + dx
18491852
end if
18501853
1851-
call s_surface_residual(pres, T_IP, T_pert, d, Ys_IP, Ys_pert, solve_temperature, flux_scale, energy_scale, &
1852-
& R_pert, R_species_pert, omega_pert, mdot_pert)
1854+
call s_surface_residual(pres, T_IP, T_pert, d, Ys_IP, Ys_pert, W_species, solve_temperature, flux_scale, &
1855+
& energy_scale, R_pert, R_species_pert, omega_pert, mdot_pert)
18531856
A(1:nsolve,nsolve) = (R_pert(1:nsolve) - R(1:nsolve))/dx
18541857
end if
18551858
@@ -1872,8 +1875,8 @@ contains
18721875
where (Ys_trial < 0._wp) Ys_trial = 0._wp
18731876
where (Ys_trial > 1._wp) Ys_trial = 1._wp
18741877
1875-
call s_surface_residual(pres, T_IP, T_trial, d, Ys_IP, Ys_trial, solve_temperature, flux_scale, energy_scale, &
1876-
& R_trial, R_species_trial, omega_trial, mdot_trial)
1878+
call s_surface_residual(pres, T_IP, T_trial, d, Ys_IP, Ys_trial, W_species, solve_temperature, flux_scale, &
1879+
& energy_scale, R_trial, R_species_trial, omega_trial, mdot_trial)
18771880
norm_trial = maxval(abs(R_trial(1:nsolve)))
18781881
if (norm_trial < norm_R) then
18791882
accepted = .true.

0 commit comments

Comments
 (0)