@@ -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