Skip to content

Commit 6fb5e27

Browse files
Allow non-integer values for the number of groups in GC models (#539)
* Allow floats for group numbers * fix tests * make GroupParam parametric * fix tests * add parametric types of GroupParam to gc models * fix `has_groups` * fix test (SAFTgammaMie constructor) * insert proposed changes * Only use one parametric type per model * Update src/database/params/GroupParam.jl --------- Co-authored-by: Andrés Riedemann <38795484+longemen3000@users.noreply.github.com>
1 parent 1a6b3df commit 6fb5e27

File tree

23 files changed

+162
-92
lines changed

23 files changed

+162
-92
lines changed

src/base/EoSModel.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ has_groups(::Type{T}) where T <: EoSModel = _has_groups(T)
194194
Base.@assume_effects :foldable function _has_groups(::Type{T}) where T <: EoSModel
195195
s1 = hasfield(T,:groups)
196196
if s1
197-
return fieldtype(T,:groups) == GroupParam
197+
return fieldtype(T,:groups) <: GroupParam
198198
end
199199
return false
200200
end

src/database/ClapeyronParam.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,6 @@ end
100100
Base.eltype(p::EoSParam) = Float64
101101
Base.eltype(p::ParametricEoSParam{T}) where T = T
102102

103-
const PARSED_GROUP_VECTOR_TYPE = Vector{Tuple{String, Vector{Pair{String, Int64}}}}
104-
105103
function pack_vectors(x::AbstractVector{<:AbstractVector})
106104
return PackedVectorsOfVectors.pack(x)
107105
end

src/database/database_group.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,15 @@ function __GroupParam(components,found_gcpairs,found_intragcpairs,grouplocations
121121
componentstolookup = components[to_lookup]
122122
filepaths = flattenfilepaths(grouplocations,usergrouplocations)
123123

124-
gccomponents_parsed = PARSED_GROUP_VECTOR_TYPE(undef,length(components))
124+
_T = Int64
125+
_eltypepair(::Array{Pair{S,T},1}) where {S,T} = T
126+
for (i,gcp) in enumerate(found_gcpairs)
127+
if !to_lookup[i]
128+
_T = promote_type(_T, _eltypepair(gcp))
129+
end
130+
end
131+
132+
gccomponents_parsed = Vector{Tuple{String, Vector{Pair{String,_T}}}}(undef,length(components))
125133

126134
#fill gccomponents_parsed
127135
for i in 1:length(components)

src/database/params/GroupParam.jl

Lines changed: 68 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,26 +61,26 @@ julia> grouplist = [
6161
```
6262
In this case, `SAFTGammaMie` files support the second order group `CH2OH`.
6363
"""
64-
struct GroupParam <: GroupParameter
64+
struct GroupParam{T<:Number} <: GroupParameter
6565
components::Array{String,1}
6666
groups::Array{Array{String,1},1}
6767
grouptype::Symbol
68-
n_groups::Array{Array{Int,1},1}
69-
n_intergroups::Vector{Matrix{Int}}
68+
n_groups::Array{Array{T,1},1}
69+
n_intergroups::Vector{Matrix{T}}
7070
i_groups::Array{Array{Int,1},1}
7171
flattenedgroups::Array{String,1}
72-
n_flattenedgroups::Array{Array{Int,1},1}
72+
n_flattenedgroups::Array{Array{T,1},1}
7373
sourcecsvs::Array{String,1}
7474
end
7575

76-
function GroupParam(input::PARSED_GROUP_VECTOR_TYPE)
76+
function GroupParam(input::Vector{Tuple{String, Vector{Pair{String,T}}}}) where {T<:Number}
7777
return GroupParam(input,:unknown,String[])
7878
end
7979

8080
format_components(g::GroupParameter) = g
8181

8282
#given components, groups, n_groups, reconstitute GroupParam
83-
function recombine!(param::GroupParameter)
83+
function recombine!(param::GroupParam{T}) where T
8484
components = param.components
8585
groups = param.groups
8686
n_groups = param.n_groups
@@ -102,7 +102,7 @@ function recombine!(param::GroupParameter)
102102
for i in 1:
103103
group = groups[i]
104104
if !isassigned(i_groups,i)
105-
i_groups[i] = Int[]
105+
i_groups[i] = T[]
106106
end
107107
i_group = i_groups[i]
108108
resize!(i_group,length(group))
@@ -148,7 +148,7 @@ function recombine!(param::GroupParameter)
148148
return param
149149
end
150150

151-
function GroupParam(input::PARSED_GROUP_VECTOR_TYPE,grouptype,sourcecsvs::Vector{String},gc_intragroups=nothing)
151+
function GroupParam(input::Vector{Tuple{String, Vector{Pair{String,T}}}},grouptype,sourcecsvs::Vector{String},gc_intragroups=nothing) where {T<:Number}
152152
grouptype = Symbol(grouptype)
153153
components = [first(i) for i input]
154154
raw_groups = [last(i) for i input]
@@ -159,15 +159,20 @@ function GroupParam(input::PARSED_GROUP_VECTOR_TYPE,grouptype,sourcecsvs::Vector
159159
n_flattenedgroups = Vector{Vector{Int}}(undef,0)
160160
empty_intergroup = fill(0,(0,0)) #0x0 Matrix{Int}
161161
n_intergroups = fill(empty_intergroup,length(components))
162-
param = GroupParam(components,
163-
groups,
164-
grouptype,
165-
n_groups,
166-
n_intergroups,
167-
i_groups,
168-
flattenedgroups,
169-
n_flattenedgroups,
170-
sourcecsvs)
162+
163+
_neltype(x) = eltype(eltype(x)) # nested eltype
164+
_T = promote_type(_neltype(n_groups), _neltype(n_intergroups), _neltype(i_groups), _neltype(n_flattenedgroups))
165+
param = GroupParam{_T}(
166+
components,
167+
groups,
168+
grouptype,
169+
n_groups,
170+
n_intergroups,
171+
i_groups,
172+
flattenedgroups,
173+
n_flattenedgroups,
174+
sourcecsvs
175+
)
171176
n_intergroups
172177
#do the rest of the work here
173178
if gc_intragroups != nothing
@@ -177,6 +182,49 @@ function GroupParam(input::PARSED_GROUP_VECTOR_TYPE,grouptype,sourcecsvs::Vector
177182
return param
178183
end
179184

185+
function GroupParam(components,groups,grouptype,n_groups,n_intergroups,i_groups,flattenedgroups,n_flattenedgroups,sourcecsvs)
186+
TT = eltype(eltype(n_groups))
187+
return GroupParam{TT}(components,groups,grouptype,n_groups,n_intergroups,i_groups,flattenedgroups,n_flattenedgroups,sourcecsvs)
188+
end
189+
190+
function Solvers.primalval(param::GroupParam{T}) where T
191+
n_groups2 = Solvers.primalval_eager.(param.n_groups)
192+
n_intergroups2 = Solvers.primalval_eager.(param.n_intergroups)
193+
n_flattenedgroups2 = Solvers.primalval_eager.(param.n_flattenedgroups)
194+
T2 = Solvers.primal_eltype(eltype(eltype(n_groups2)))
195+
param = GroupParam{T2}(
196+
param.components,
197+
param.groups,
198+
param.grouptype,
199+
n_groups2,
200+
n_intergroups2,
201+
param.i_groups,
202+
param.flattenedgroups,
203+
n_flattenedgroups2,
204+
param.sourcecsvs
205+
)
206+
end
207+
208+
Base.eltype(param::GroupParam{T}) where T = T
209+
Base.eltype(param::Type{<:GroupParam{T}}) where T = T
210+
211+
function Base.convert(::Type{GroupParam{T1}},param::GroupParam{T2}) where {T1<:Number,T2<:Number}
212+
n_groups2 = convert.(Vector{T1},param.n_groups)
213+
n_intergroups2 = convert.(Matrix{T1},param.n_intergroups)
214+
n_flattenedgroups2 = convert.(Vector{T1},param.n_flattenedgroups)
215+
param = GroupParam{T1}(
216+
param.components,
217+
param.groups,
218+
param.grouptype,
219+
n_groups2,
220+
n_intergroups2,
221+
param.i_groups,
222+
param.flattenedgroups,
223+
n_flattenedgroups2,
224+
param.sourcecsvs
225+
)
226+
end
227+
180228
function Base.show(io::IO, mime::MIME"text/plain", param::GroupParam)
181229
print(io,string(typeof(param)),"(:",param.grouptype,") ")
182230
len = length(param.components)
@@ -195,14 +243,14 @@ function Base.show(io::IO, param::GroupParam)
195243
print(io,"]")
196244
end
197245

198-
function build_gc_intragroups!(group::GroupParam,gc_intragroups)
246+
function build_gc_intragroups!(group::GroupParam{T}, gc_intragroups) where T
199247
groupnames = group.flattenedgroups
200248
n_gc = length(groupnames)
201249
n_comps = length(group.components)
202-
n_intergroups = [zeros(n_gc,n_gc) for i in 1:n_comps]
250+
203251
n_intergroups = group.n_intergroups
204252
for i in 1:n_comps
205-
n_intergroups[i] = zeros(Int,n_gc,n_gc)
253+
n_intergroups[i] = zeros(T,n_gc,n_gc)
206254
end
207255

208256
for i in 1:n_comps

src/database/params/SiteParam.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ function SiteParam(pairs::Dict{String,SingleParam{Int}},allcomponentsites)
122122
return SiteParam(components,sites,n_sites,sourcecsvs)
123123
end
124124

125-
function SiteParam(input::PARSED_GROUP_VECTOR_TYPE,sourcecsvs=String[])
125+
function SiteParam(input::Vector{Tuple{String, Vector{Pair{String,T}}}},sourcecsvs=String[]) where {T<:Number}
126126
components = [first(i) for i input]
127127
raw_sites = [last(i) for i input]
128128
sites = [first.(sitepairs) for sitepairs raw_sites]

src/models/Activity/UNIFAC/UNIFAC.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
struct UNIFACParam <: EoSParam
2-
A::PairParam{Float64}
3-
B::PairParam{Float64}
4-
C::PairParam{Float64}
5-
R::SingleParam{Float64}
6-
Q::SingleParam{Float64}
1+
struct UNIFACParam{T} <: EoSParam
2+
A::PairParam{T}
3+
B::PairParam{T}
4+
C::PairParam{T}
5+
R::SingleParam{T}
6+
Q::SingleParam{T}
77
end
88

99
abstract type UNIFACModel <: ActivityModel end
1010

11-
struct UNIFAC{c<:EoSModel} <: UNIFACModel
11+
struct UNIFAC{c<:EoSModel,T} <: UNIFACModel
1212
components::Array{String,1}
13-
groups::GroupParam
14-
params::UNIFACParam
13+
groups::GroupParam{T}
14+
params::UNIFACParam{T}
1515
puremodel::EoSVectorParam{c}
1616
references::Array{String,1}
1717
unifac_cache::UNIFACCache

src/models/Activity/UNIFAC/variants/PSRK.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
struct PSRKUNIFAC{c<:EoSModel} <: UNIFACModel
1+
struct PSRKUNIFAC{c<:EoSModel,T} <: UNIFACModel
22
components::Array{String,1}
3-
groups::GroupParam
4-
params::UNIFACParam
3+
groups::GroupParam{T}
4+
params::UNIFACParam{T}
55
puremodel::EoSVectorParam{c}
66
references::Array{String,1}
77
unifac_cache::UNIFACCache

src/models/Activity/UNIFAC/variants/UNIFAC2.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
struct UNIFAC2{c<:EoSModel} <: UNIFACModel
1+
struct UNIFAC2{c<:EoSModel,T} <: UNIFACModel
22
components::Array{String,1}
3-
groups::GroupParam
4-
params::UNIFACParam
3+
groups::GroupParam{T}
4+
params::UNIFACParam{T}
55
puremodel::EoSVectorParam{c}
66
references::Array{String,1}
77
unifac_cache::UNIFACCache

src/models/Activity/UNIFAC/variants/UNIFACFV.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,20 @@ function recombine_unifac_cache!(cache::UNIFACFVCache,groups,params)
3030
return cache
3131
end
3232

33-
struct UNIFACFVParam <: EoSParam
34-
volume::SingleParam{Float64}
35-
A::PairParam{Float64}
36-
R::SingleParam{Float64}
37-
Q::SingleParam{Float64}
38-
Mw::SingleParam{Float64}
33+
struct UNIFACFVParam{T} <: EoSParam
34+
volume::SingleParam{T}
35+
A::PairParam{T}
36+
R::SingleParam{T}
37+
Q::SingleParam{T}
38+
Mw::SingleParam{T}
3939
end
4040

4141
abstract type UNIFACFVModel <: ActivityModel end
4242

43-
struct UNIFACFV{c<:EoSModel} <: UNIFACFVModel
43+
struct UNIFACFV{c<:EoSModel,T} <: UNIFACFVModel
4444
components::Array{String,1}
45-
groups::GroupParam
46-
params::UNIFACFVParam
45+
groups::GroupParam{T}
46+
params::UNIFACFVParam{T}
4747
puremodel::EoSVectorParam{c}
4848
references::Array{String,1}
4949
UNIFACFV_cache::UNIFACFVCache

src/models/Activity/UNIFAC/variants/UNIFACFVPoly.jl

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
struct UNIFACFVPolyParam <: EoSParam
2-
volume::SingleParam{Float64}
3-
c::SingleParam{Float64}
4-
A::PairParam{Float64}
5-
R::SingleParam{Float64}
6-
Q::SingleParam{Float64}
7-
Mw::SingleParam{Float64}
1+
struct UNIFACFVPolyParam{T} <: EoSParam
2+
volume::SingleParam{T}
3+
c::SingleParam{T}
4+
A::PairParam{T}
5+
R::SingleParam{T}
6+
Q::SingleParam{T}
7+
Mw::SingleParam{T}
88
end
99

1010
abstract type UNIFACFVPolyModel <: UNIFACFVModel end
1111

12-
struct UNIFACFVPoly{c<:EoSModel} <: UNIFACFVPolyModel
12+
struct UNIFACFVPoly{c<:EoSModel,T} <: UNIFACFVPolyModel
1313
components::Array{String,1}
14-
groups::GroupParam
15-
params::UNIFACFVPolyParam
14+
groups::GroupParam{T}
15+
params::UNIFACFVPolyParam{T}
1616
puremodel::EoSVectorParam{c}
1717
references::Array{String,1}
1818
UNIFACFV_cache::UNIFACFVCache

0 commit comments

Comments
 (0)