Compute h(T,Y,p0) for one boundary state using Cantera.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(case_params_t), | intent(in) | :: | params | |||
| real(kind=rk), | intent(in) | :: | temperature | |||
| real(kind=rk), | intent(out) | :: | h_value | |||
| real(kind=rk), | intent(in), | optional | :: | Y_point(:) |
subroutine enthalpy_from_temperature_cantera_point(params, temperature, h_value, Y_point) type(case_params_t), intent(in) :: params real(rk), intent(in) :: temperature real(rk), intent(out) :: h_value real(rk), intent(in), optional :: Y_point(:) integer :: n_len, nsp real(rk) :: T_arr(1), P_arr(1) real(rk) :: h_arr(1), cp_arr(1), lambda_arr(1), rho_arr(1) real(rk), allocatable :: Y_local(:,:) character(kind=c_char), allocatable :: c_names_flat(:) if (params%nspecies <= 0) then call fatal_error('energy', 'Cantera boundary enthalpy requires at least one species') end if nsp = max(1, params%nspecies) allocate(Y_local(nsp, 1)) Y_local = zero if (present(Y_point)) then if (size(Y_point) < params%nspecies) then call fatal_error('energy', 'Y_point has incompatible size for Cantera boundary enthalpy') end if Y_local(1:params%nspecies, 1) = max(zero, Y_point(1:params%nspecies)) if (sum(Y_local(1:params%nspecies, 1)) > tiny_safe) then Y_local(1:params%nspecies, 1) = Y_local(1:params%nspecies, 1) / & sum(Y_local(1:params%nspecies, 1)) else Y_local(1, 1) = 1.0_rk end if else Y_local(1, 1) = 1.0_rk end if T_arr(1) = temperature P_arr(1) = params%background_press call build_c_species_names(params, c_names_flat, n_len) call cantera_update_thermo_c(1, T_arr, P_arr, params%nspecies, Y_local, & h_arr, cp_arr, lambda_arr, rho_arr, & params%energy_reference_T, c_names_flat, n_len) h_value = h_arr(1) deallocate(Y_local) deallocate(c_names_flat) end subroutine enthalpy_from_temperature_cantera_point