ClapeyronThermo / Clapeyron.jl

Clapeyron provides a framework for the development and use of fluid-thermodynamic models, including SAFT, cubic, activity, multi-parameter, and COSMO-SAC.
MIT License
198 stars 51 forks source link

Error When calculating sle_solubility for composite function using pharmaPCSAFT #212

Closed samuel-zhang01 closed 11 months ago

samuel-zhang01 commented 11 months ago

I've been playing around with modelling a PC-SAFT based model with binary interaction parameters $k{slope}$ and $k{intercept}$. I found pharmaPCSAFT. However when using pharmaPCSAFT in CompositeModel, sle_solubility failed to calculate the CompositeModel. The same calculations were done in PCSAFT and ogSAFT without problems. I've linked my database files. data.zip

Could you please help me with this error?

using Clapeyron, PyCal
model=CompositeModel(["ethanol2013","lidocaine2013"];fluid=pharmaPCSAFT,solid=SolidHfus,gas=pharmaPCSAFT,gas_userlocations=["data/"],fluid_userlocations=["data/"],solid_userlocations=["data/"])
sle_solubility(model,101325,298,[1.,0.];solute=["lidocaine2013"])
┌ Error: pharmaPCSAFT{BasicIdeal} cannot be splitted
└ @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lOneK\src\utils\split_model.jl:452
Closest candidates are:
  split_model(!Matched::Clapeyron.GroupParameter, ::Any)
   @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lOneK\src\utils\split_model.jl:259
  split_model(!Matched::Clapeyron.PairParameter, ::Any)
   @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lOneK\src\utils\split_model.jl:238
  split_model(!Matched::AssocParam{T}, ::Any) where T
   @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lOneK\src\utils\split_model.jl:253
  ...

Stacktrace:
  [1] (::Clapeyron.var"#173#174"{Clapeyron.pharmaPCSAFTParam, Vector{Vector{Int64}}})(i::Symbol)
    @ Clapeyron .\none:0
  [2] iterate(g::Base.Generator{NTuple{9, Symbol}, Clapeyron.var"#173#174"{Clapeyron.pharmaPCSAFTParam, Vector{Vector{Int64}}}}, s::Int64)
    @ Base .\generator.jl:47
  [3] split_model(params::EoSParam, splitter::Vector{Vector{Int64}})
    @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lOneK\src\utils\split_model.jl:288
  [4] auto_split_model(model::EoSModel, subset::Nothing)
    @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lOneK\src\utils\split_model.jl:441
  [5] split_model (repeats 2 times)
    @ C:\Users\USER\.julia\packages\Clapeyron\lOneK\src\utils\split_model.jl:363 [inlined]
  [6] activity_coefficient(model::pharmaPCSAFT{BasicIdeal}, p::Float64, T::Int64, z::Vector{Float64}; phase::Symbol, threaded::Bool)
    @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lOneK\src\methods\pT.jl:338
...
    @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lOneK\src\methods\property_solvers\multicomponent\solids\sle_solubility.jl:59
  [9] sle_solubility(model::CompositeModel{pharmaPCSAFT{BasicIdeal}, pharmaPCSAFT{BasicIdeal}, SolidHfus, pharmaPCSAFT{BasicIdeal}, Nothing}, p::Float64, T::Int64, z::Vector{Float64}; solute::Vector{String})
    @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lOneK\src\methods\property_solvers\multicomponent\solids\sle_solubility.jl:28
 [10] top-level scope
    @ c:\Users\USER\Documents\solubility-of-lidocaine\solubility.ipynb:3
pw0908 commented 11 months ago

Hi Samuel,

Thanks for bringing this up! This was a minor bug that we missed. The commit I just pushed should fix this bug. @longemen3000 shall we bump versions?

samuel-zhang01 commented 11 months ago

Thanks Pierre!

samuel-zhang01 commented 11 months ago

Unfortunately, after the fix, there are still some errors on my side. I'm not sure if this a local problem but there seems to be a conversion error.

InexactError: Int64(3.125281051899621e-10)

Stacktrace:
  [1] Int64
    @ .\float.jl:900 [inlined]
  [2] convert
    @ .\number.jl:7 [inlined]
  [3] setindex!
    @ .\array.jl:969 [inlined]
  [4] d(model::pharmaPCSAFT{BasicIdeal}, V::ForwardDiff.Dual{ForwardDiff.Tag{Clapeyron.var"#fAᵣ#209"{pharmaPCSAFT{BasicIdeal}, Int64, Vector{Float64}}, ForwardDiff.Dual{ForwardDiff.Tag{Clapeyron.var"#fAᵣ#209"{pharmaPCSAFT{BasicIdeal}, Int64, Vector{Float64}}, Float64}, Float64, 1}}, ForwardDiff.Dual{ForwardDiff.Tag{Clapeyron.var"#fAᵣ#209"{pharmaPCSAFT{BasicIdeal}, Int64, Vector{Float64}}, Float64}, Float64, 1}, 1}, T::Int64, z::Vector{Float64})
    @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lzs2z\src\models\SAFT\PCSAFT\variants\PharmaPCSAFT.jl:80
  [5] macro expansion
    @ C:\Users\USER\.julia\packages\Clapeyron\lzs2z\src\utils\macros.jl:77 [inlined]
  [6] data(model::pharmaPCSAFT{BasicIdeal}, V::ForwardDiff.Dual{ForwardDiff.Tag{Clapeyron.var"#fAᵣ#209"{pharmaPCSAFT{BasicIdeal}, Int64, Vector{Float64}}, ForwardDiff.Dual{ForwardDiff.Tag{Clapeyron.var"#fAᵣ#209"{pharmaPCSAFT{BasicIdeal}, Int64, Vector{Float64}}, Float64}, Float64, 1}}, ForwardDiff.Dual{ForwardDiff.Tag{Clapeyron.var"#fAᵣ#209"{pharmaPCSAFT{BasicIdeal}, Int64, Vector{Float64}}, Float64}, Float64, 1}, 1}, T::Int64, z::Vector{Float64})
    @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lzs2z\src\models\SAFT\PCSAFT\PCSAFT.jl:78
  [7] macro expansion
    @ C:\Users\USER\.julia\packages\Clapeyron\lzs2z\src\utils\macros.jl:77 [inlined]
  [8] a_res
    @ C:\Users\USER\.julia\packages\Clapeyron\lzs2z\src\models\SAFT\PCSAFT\PCSAFT.jl:73 [inlined]
  [9] eos_res(model::pharmaPCSAFT{BasicIdeal}, V::ForwardDiff.Dual{ForwardDiff.Tag{Clapeyron.var"#fAᵣ#209"{pharmaPCSAFT{BasicIdeal}, Int64, Vector{Float64}}, ForwardDiff.Dual{ForwardDiff.Tag{Clapeyron.var"#fAᵣ#209"{pharmaPCSAFT{BasicIdeal}, Int64, Vector{Float64}}, Float64}, Float64, 1}}, ForwardDiff.Dual{ForwardDiff.Tag{Clapeyron.var"#fAᵣ#209"{pharmaPCSAFT{BasicIdeal}, Int64, Vector{Float64}}, Float64}, Float64, 1}, 1}, T::Int64, z::Vector{Float64})
    @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lzs2z\src\base\EoSModel.jl:80
 [10] fAᵣ
    @ C:\Users\USER\.julia\packages\Clapeyron\lzs2z\src\methods\VT.jl:130 [inlined]
 [11] f∂f
    @ C:\Users\USER\.julia\packages\Clapeyron\lzs2z\src\modules\solvers\ad.jl:40 [inlined]
...
    @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lzs2z\src\methods\property_solvers\multicomponent\solids\sle_solubility.jl:59
 [27] sle_solubility(model::CompositeModel{pharmaPCSAFT{BasicIdeal}, pharmaPCSAFT{BasicIdeal}, SolidHfus, pharmaPCSAFT{BasicIdeal}, Nothing}, p::Float64, T::Int64, z::Vector{Float64}; solute::Vector{String})
    @ Clapeyron C:\Users\USER\.julia\packages\Clapeyron\lzs2z\src\methods\property_solvers\multicomponent\solids\sle_solubility.jl:28
 [28] top-level scope
    @ c:\Users\USER\Documents\solubility-of-lidocaine\solubility.ipynb:2
pw0908 commented 11 months ago

Hi Samuel,

This error is a bit more subtle. In short, within Julia, 298 is Int64 while 298. is Float64. When you pass through an integer temperature through Clapeyron, it gets confused as most values are Floats and there's no easy conversion. Nevertheless, the fix is simple, just use:

sle_solubility(model,101325.,298.,[1.,0.];solute=["lidocaine2013"])
2-element Vector{Float64}:
 0.9778550968509979
 0.02214490314900212