Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,20 @@ CoolProp_jll = "3351c21f-4feb-5f29-afb9-f4fcb0e27549"
Markdown = "d6f4376e-aef5-505a-96c1-9c027394607a"
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"

[weakdeps]
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"

[extensions]
CoolPropUnitfulExt = "Unitful"

[compat]
CoolProp_jll = "6.6, 7.1"
julia = "1.3"
Unitful="1"
Unitful = "1"

[extras]
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"

[targets]
test = ["Test"]
test = ["Test", "Unitful"]
57 changes: 57 additions & 0 deletions ext/CoolPropUnitfulExt.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
module CoolPropUnitfulExt
using CoolProp
using Unitful

# units for humid air
const _ha_units = Dict(
"Tdb" => Unitful.u"K",
"Twb" => Unitful.u"K",
"Tdp" => Unitful.u"K",
"D" => Unitful.u"K",
"H" => Unitful.u"J/kg",
"Hha" => Unitful.u"J/kg",
"U" => Unitful.u"J/kg",
"S" => Unitful.u"J/kg/K",
"V" => Unitful.u"m^3/kg",
"Vda" => Unitful.u"m^3/kg",
"Vha" => Unitful.u"m^3/kg",
"cp" => Unitful.u"J/kg/K",
"CV" => Unitful.u"J/kg/K",
"Cha" => Unitful.u"J/kg/K",
"CVha" => Unitful.u"J/kg/K",
"P_w" => Unitful.u"Pa",
)



function CoolProp._get_unit(param::AbstractString, is_ha::Bool,val::Unitful.Quantity)
# First check if it's a humid air parameter
if is_ha && haskey(_ha_units, param)
return _ha_units[param]
end
# Otherwise use the normal parameter info
unit_str = "-"
try
unit_str = CoolProp.get_parameter_information_string(param, "units")
catch
end
if unit_str == "-"
return Unitful.NoUnits
end
try
# The unit uses e.g. Pa-s to mean Pa*s
unit_str = replace(unit_str, "-" => "*")
parsed_unit = Unitful.uparse(unit_str)
if parsed_unit isa Unitful.Quantity
return Unitful.unit(parsed_unit)
end
return parsed_unit
catch err
@warn "Failed to parse unit $(unit_str): " err
end
return Unitful.NoUnits
end

CoolProp._si_value(unit::Unitful.Units, value) = Unitful.ustrip(Unitful.uconvert(unit, value))

end #module
85 changes: 26 additions & 59 deletions src/CoolProp.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#__precompile__()
module CoolProp

import Unitful
using CoolProp_jll

####################################################################################################################
Expand Down Expand Up @@ -85,61 +84,20 @@ function PropsSI(output::AbstractString, name1::AbstractString, value1::Real, na
return val
end

# units for humid air
const _ha_units = Dict(
"Tdb" => Unitful.u"K",
"Twb" => Unitful.u"K",
"Tdp" => Unitful.u"K",
"D" => Unitful.u"K",
"H" => Unitful.u"J/kg",
"Hha" => Unitful.u"J/kg",
"U" => Unitful.u"J/kg",
"S" => Unitful.u"J/kg/K",
"V" => Unitful.u"m^3/kg",
"Vda" => Unitful.u"m^3/kg",
"Vha" => Unitful.u"m^3/kg",
"cp" => Unitful.u"J/kg/K",
"CV" => Unitful.u"J/kg/K",
"Cha" => Unitful.u"J/kg/K",
"CVha" => Unitful.u"J/kg/K",
"P_w" => Unitful.u"Pa",
)

function _get_unit(param::AbstractString, is_ha::Bool)
# First check if it's a humid air parameter
if is_ha && haskey(_ha_units, param)
return _ha_units[param]
end
# Otherwise use the normal parameter info
unit_str = "-"
try
unit_str = get_parameter_information_string(param, "units")
catch
end
if unit_str == "-"
return Unitful.NoUnits
end
try
# The unit uses e.g. Pa-s to mean Pa*s
unit_str = replace(unit_str, "-" => "*")
parsed_unit = Unitful.uparse(unit_str)
if parsed_unit isa Unitful.Quantity
return Unitful.unit(parsed_unit)
end
return parsed_unit
catch err
@warn "Failed to parse unit $(unit_str): " err
end
return Unitful.NoUnits
function _get_unit(param::AbstractString, is_ha::Bool, val::Real)
return _get_unit(param,is_ha,nothing)
end

_si_value(unit, value) = Unitful.ustrip(Unitful.uconvert(unit, value))
_get_unit(param::AbstractString, is_ha::Bool, ::Nothing) = nothing
_si_value(::Nothing,value) = value

function PropsSI(output::AbstractString, name1::AbstractString, value1::Union{Unitful.Quantity,Real}, name2::AbstractString, value2::Union{Unitful.Quantity,Real}, fluid::AbstractString)
unit1 = _get_unit(name1,false)
unit2 = _get_unit(name2,false)
outunit = _get_unit(output,false)
return PropsSI(output, name1, _si_value(unit1,value1), name2, _si_value(unit2,value2), fluid)*outunit
function PropsSI(output::AbstractString, name1::AbstractString, value1::Number, name2::AbstractString, value2::Number, fluid::AbstractString)
unit1 = _get_unit(name1,false,value1)
unit2 = _get_unit(name2,false,value2)
out = PropsSI(output, name1, _si_value(unit1,value1), name2, _si_value(unit2,value2), fluid)
unit1 === nothing && unit2 === nothing && (return out)
unit1 !== nothing && (return out*_get_unit(output,false,value1))
return out*_get_unit(output,false,value2)
end

"""
Expand Down Expand Up @@ -507,6 +465,7 @@ ParamName | Description
"Bibtex-XXX" | A BibTeX key, where XXX is one of the bibtex keys used in get_BibTeXKey
"pure" | "true" if the fluid is pure, "false" otherwise
"formula" | The chemical formula of the fluid in LaTeX form if available, "" otherwise
"JSON" | The JSON string storing all fluid data

# Note
A tabular output for this function is available with `?CoolProp_fluids`
Expand Down Expand Up @@ -713,12 +672,15 @@ function HAPropsSI(output::AbstractString, name1::AbstractString, value1::Real,
return val
end

function HAPropsSI(output::AbstractString, name1::AbstractString, value1::Union{Unitful.Quantity,Real}, name2::AbstractString, value2::Union{Unitful.Quantity,Real}, name3::AbstractString, value3::Union{Unitful.Quantity,Real})
unit1 = _get_unit(name1,true)
unit2 = _get_unit(name2,true)
unit3 = _get_unit(name3,true)
outunit = _get_unit(output,true)
return HAPropsSI(output, name1, _si_value(unit1,value1), name2, _si_value(unit2,value2), name3, _si_value(unit3,value3))*outunit
function HAPropsSI(output::AbstractString, name1::AbstractString, value1::Number, name2::AbstractString, value2::Number, name3::AbstractString, value3::Number)
unit1 = _get_unit(name1,true,value1)
unit2 = _get_unit(name2,true,value2)
unit3 = _get_unit(name3,true,value3)
out = HAPropsSI(output, name1, _si_value(unit1,value1), name2, _si_value(unit2,value2), name3, _si_value(unit3,value3))
unit1 === nothing && unit2 === nothing && unit3 === nothing && (return out)
unit1 !== nothing && (return out*_get_unit(output,true,value1))
unit2 !== nothing && (return out*_get_unit(output,true,value2))
return out*_get_unit(output,true,value3)
end

"""
Expand Down Expand Up @@ -1497,6 +1459,11 @@ for symorigin = [:PropsSI, :PhaseSI, :K2F, :F2K, :HAPropsSI, :AbstractState_fact
@eval const $sym = $symorigin
@eval export $sym, $symorigin
end

if !isdefined(Base, :get_extension)
include("../ext/CoolPropUnitfulExt.jl")
end

const set_reference_stateS = set_reference_state
const set_reference_stateD = set_reference_state
const set_config_string = set_config
Expand Down
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using CoolProp
using Test
using Unitful

include("testThrows.jl");

Expand Down
4 changes: 2 additions & 2 deletions test/testunits.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ let fluid="air"
μ = PropsSI("VISCOSITY", "T", 293K, "P", 101325Pa, fluid)
@test round(μPa*s, μ; digits=2) == 18.2μPa*s

# Test that all parameters return a unit
# Test that all parameters return a unit when an unitful number is being used
for param in split(get_global_param_string("parameter_list"),',')
@test CoolProp._get_unit(param,false) isa FreeUnits
@test CoolProp._get_unit(param,false,1*K) isa FreeUnits
end
end

Expand Down
Loading