Skip to content

Commit 53be6aa

Browse files
authored
fixed liquid density values (#102)
1 parent 03dba1d commit 53be6aa

4 files changed

Lines changed: 85 additions & 8 deletions

File tree

source/bind/c/bindc.F90

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,9 +1151,11 @@ function cea_mixture_calc_property_tp(mptr, prop_type, len_weights, weights, &
11511151
end if
11521152
select case(prop_type)
11531153
case (CEA_VOLUME)
1154-
prop_value = 1.d-2*mix%calc_pressure(weights(:ns)/sum(weights(:ns)), temperature)/pressure
1154+
prop_value = 1.d-2*mix%calc_pressure( &
1155+
weights(:ns)/sum(weights(:ns)), temperature, include_condensed=.true.)/pressure
11551156
case (CEA_DENSITY)
1156-
prop_value = 1.d2*pressure/mix%calc_pressure(weights(:ns)/sum(weights(:ns)), temperature)
1157+
prop_value = 1.d2*pressure/mix%calc_pressure( &
1158+
weights(:ns)/sum(weights(:ns)), temperature, include_condensed=.true.)
11571159
case (CEA_ENTROPY)
11581160
prop_value = mix%calc_entropy(weights(:ns), temperature, pressure)
11591161
case (CEA_GIBBS_ENERGY)
@@ -1186,9 +1188,11 @@ function cea_mixture_calc_property_tp_multitemp(mptr, prop_type, len_weights, we
11861188
end if
11871189
select case(prop_type)
11881190
case (CEA_VOLUME)
1189-
prop_value = mix%calc_pressure(weights(:ns)/sum(weights(:ns)), temperatures(:ns))/pressure
1191+
prop_value = 1.d-2*mix%calc_pressure( &
1192+
weights(:ns)/sum(weights(:ns)), temperatures(:ns), include_condensed=.true.)/pressure
11901193
case (CEA_DENSITY)
1191-
prop_value = pressure/mix%calc_pressure(weights(:ns)/sum(weights(:ns)), temperatures(:ns))
1194+
prop_value = 1.d2*pressure/mix%calc_pressure( &
1195+
weights(:ns)/sum(weights(:ns)), temperatures(:ns), include_condensed=.true.)
11921196
case (CEA_ENTROPY)
11931197
block
11941198
real(wp) :: pressures(ns)

source/bind/python/tests/test_mixture.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,47 @@ def test_calc_property_rejects_unknown_type(cea_module):
3232
weights = np.array([0.4, 0.6], dtype=np.float64)
3333
with pytest.raises(ValueError):
3434
mix.calc_property(999999, weights, temperature=3000.0)
35+
36+
37+
@pytest.mark.parametrize(
38+
("species", "weights", "temperatures", "expected_density"),
39+
[
40+
(["O2(L)"], np.array([1.0]), np.array([90.0]), 0.2907792655383313),
41+
(
42+
["CH4(L)", "O2(L)"],
43+
np.array([0.2, 0.8]),
44+
np.array([111.0, 90.0]),
45+
0.22505975471169806,
46+
),
47+
],
48+
)
49+
def test_calc_liquid_density_is_finite(
50+
cea_module, species, weights, temperatures, expected_density
51+
):
52+
mix = cea_module.Mixture(species)
53+
54+
density = mix.calc_property(
55+
cea_module.DENSITY, weights, temperature=temperatures, pressure=68.0
56+
)
57+
volume = mix.calc_property(
58+
cea_module.VOLUME, weights, temperature=temperatures, pressure=68.0
59+
)
60+
61+
assert np.isfinite(density)
62+
assert density > 0.0
63+
assert density == pytest.approx(expected_density)
64+
assert density * volume == pytest.approx(1.0)
65+
66+
67+
def test_multitemperature_density_matches_single_temperature(cea_module):
68+
mix = cea_module.Mixture(["O2(L)"])
69+
weights = np.array([1.0])
70+
71+
density_single = mix.calc_property(
72+
cea_module.DENSITY, weights, temperature=90.0, pressure=68.0
73+
)
74+
density_multi = mix.calc_property(
75+
cea_module.DENSITY, weights, temperature=np.array([90.0]), pressure=68.0
76+
)
77+
78+
assert density_multi == pytest.approx(density_single)

source/mixture.f90

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,52 +1068,66 @@ function mixture_calc_frozen_cv_multi(self, weights, temperatures) result(cv)
10681068

10691069
end function
10701070

1071-
function mixture_calc_pressure_single(self, densities, temperature) result(p)
1071+
function mixture_calc_pressure_single(self, densities, temperature, include_condensed) result(p)
1072+
! Condensed species normally have no ideal-gas pressure contribution. The optional
1073+
! override supports fixed-mixture volume and density queries for reactants.
10721074

10731075
! Arguments
10741076
class(Mixture), intent(in) :: self
10751077
real(dp), intent(in) :: densities(:)
10761078
real(dp), intent(in) :: temperature
1079+
logical, intent(in), optional :: include_condensed
10771080

10781081
! Return
10791082
real(dp) :: p
10801083

10811084
! Locals
10821085
integer :: j
10831086
real(dp) :: n, nj
1087+
logical :: include_condensed_
10841088

10851089
call check_array_len(size(densities), self%num_species, 'mixture_calc_pressure_single densities')
10861090

1091+
include_condensed_ = .false.
1092+
if (present(include_condensed)) include_condensed_ = include_condensed
1093+
10871094
n = 0.0d0
10881095
do j = 1, self%num_species
1089-
if (self%is_condensed(j)) cycle
1096+
if (self%is_condensed(j) .and. .not. include_condensed_) cycle
10901097
nj = densities(j)/self%species(j)%molecular_weight
10911098
n = n + nj
10921099
end do
10931100
p = n * gas_constant * temperature
10941101

10951102
end function
10961103

1097-
function mixture_calc_pressure_multi(self, densities, temperatures) result(p)
1104+
function mixture_calc_pressure_multi(self, densities, temperatures, include_condensed) result(p)
1105+
! Condensed species normally have no ideal-gas pressure contribution. The optional
1106+
! override supports fixed-mixture volume and density queries for reactants.
10981107

10991108
! Arguments
11001109
class(Mixture), intent(in) :: self
11011110
real(dp), intent(in) :: densities(:)
11021111
real(dp), intent(in) :: temperatures(:)
1112+
logical, intent(in), optional :: include_condensed
11031113

11041114
! Return
11051115
real(dp) :: p
11061116

11071117
! Locals
11081118
integer :: j
11091119
real(dp) :: nT, nj
1120+
logical :: include_condensed_
11101121

11111122
call check_array_len(size(densities), self%num_species, 'mixture_calc_pressure_multi densities')
11121123
call check_array_len(size(temperatures), self%num_species, 'mixture_calc_pressure_multi temperatures')
11131124

1125+
include_condensed_ = .false.
1126+
if (present(include_condensed)) include_condensed_ = include_condensed
1127+
11141128
nT = 0.0d0
11151129
do j = 1, self%num_species
1116-
if (self%is_condensed(j)) cycle
1130+
if (self%is_condensed(j) .and. .not. include_condensed_) cycle
11171131
nj = densities(j)/self%species(j)%molecular_weight
11181132
nT = nT + nj * temperatures(j)
11191133
end do

source/mixture_test.pf

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,21 @@ contains
292292
@assertRelativelyEqual(0.39655431d3, h0/gas_constant, tol)
293293
end subroutine
294294

295+
@test
296+
subroutine test_calc_pressure_including_condensed
297+
type(Mixture) :: mix
298+
real(dp), parameter :: tol = 1.d-12
299+
real(dp) :: actual, expected
300+
301+
mix = Mixture(all_thermo, ['CH4(L)', 'O2(L) '])
302+
303+
expected = gas_constant*(0.2d0*111.0d0/mix%species(1)%molecular_weight + &
304+
0.8d0*90.0d0/mix%species(2)%molecular_weight)
305+
@assertEqual(0.0d0, mix%calc_pressure([0.2d0, 0.8d0], [111.0d0, 90.0d0]))
306+
actual = mix%calc_pressure([0.2d0, 0.8d0], [111.0d0, 90.0d0], include_condensed=.true.)
307+
@assertRelativelyEqual(expected, actual, tol)
308+
end subroutine
309+
295310
@test
296311
subroutine test_calc_properties
297312
! Taken from output of RP-1311 Example Case 14

0 commit comments

Comments
 (0)