Thanks Kyle - looks like the error I was getting from JLD was unrelated, as
I just managed to save a Spline2D type with it. I'll try your approach.
Nice to hear that I can drop the collect calls as well.
Scott
On Friday, 14 August 2015 00:15:06 UTC+1, Kyle Barbary wrote:
>
> Hi Scott,
>
> Dierckx.Spline2D is simply a type that holds Vectors of spline
> coefficients, so it should work with JLD like any other type (but I admit
> that I’m not that familiar with JLD). I’d probably do something like this:
>
> using Dierckx
>
> type LogPTGridEOS
> logP::LinSpace{Float64}
> logT::LinSpace{Float64}
> densities::Matrix{Float64}
> spline::Spline2D
>
> # calculate the spline coefficients when you create a new instance
> LogPTGridEOS(logP, logT, densities) = new(logP, logT, densities,
> Spline2D(logP, logT, densities))
> end
>
> grid = LogPTGridEOS(linspace(0.0, 1.0, 10), linspace(0.0, 1.0, 10), ones(10,
> 10))
>
> using JLD
> save("myfile.jld", "grid", grid)
>
> Then your call method would simply be
>
> call(grid::LogPTGridEOS, p, t) = evaluate(grid.spline, log10(p), log10(t))
>
> Note that the latest version of Dierckx can accept LinSpace, Range or any
> AbstractVector as inputs (internally collected into a Vector).
>
> — Kyle
>
>
> On Thu, Aug 13, 2015 at 3:41 PM, Scott T <[email protected]
> <javascript:>> wrote:
>
>> That's a really nice solution, thanks.
>>
>> Scott
>>
>>
>> On Thursday, 13 August 2015 22:19:35 UTC+1, Tim Holy wrote:
>>>
>>> There are several possible solutions, but one is to use the new custom
>>> serialization facilities to discard/recreate the interp_func when you
>>> save/load the object:
>>>
>>> https://github.com/JuliaLang/JLD.jl/blob/master/doc/jld.md#custom-serialization
>>>
>>>
>>> --Tim
>>>
>>> On Thursday, August 13, 2015 12:37:59 PM Scott T wrote:
>>> > Hi everyone,
>>> >
>>> > I'm wondering what the most Julian way to handle the following
>>> situation
>>> > is. I know it can't be complicated, but am not quite sure how to go
>>> about
>>> > it.
>>> >
>>> > I'm doing some simple interpolation using Dierckx.jl
>>> > <https://github.com/kbarbary/Dierckx.jl>, getting densities of
>>> materials
>>> > from a pressure-temperature pair.
>>> >
>>> > I have a type which holds pressure and temperature axes, and density
>>> values
>>> > on the (logarithmic) grid that these define:
>>> >
>>> > type LogPTGridEOS
>>> > logP::LinSpace{Float64}
>>> > logT::LinSpace{Float64}
>>> > densities::Matrix{Float64}
>>> > end
>>> >
>>> > I want to be able to easily store and load instances of this type, and
>>> am
>>> > using JLD.jl <https://github.com/JuliaLang/JLD.jl> for this. This
>>> lets me
>>> > save and load from HDF5 ".jld" files, which preserve the type
>>> information
>>> > (nice).
>>> >
>>> > To interpolate on the grid, I first need to make an interpolating
>>> function,
>>> > then evaluate it:
>>> >
>>> > function call(eos::LogPTGridEOS, P, T)
>>> > interp_func = Dierckx.Spline2D(collect(eos.logP),
>>> collect(eos.logT), eos
>>> > .densities) # collect because Dierckx needs arrays
>>> > interpolated_density = Dierckx.evaluate(interp_func, log10(P),
>>> log10(T))
>>> > # remember this is a log-log grid
>>> > end
>>> >
>>> > But the interpolating function made in that first line could just be
>>> called
>>> > over and over again, avoiding any overhead from reconstructing it (the
>>> slow
>>> > bit). How can I best cache this function for re-use? I considered
>>> storing
>>> > it in the type itself by adding an "interp_func" field, but this
>>> messes up
>>> > saving it via JLD since JLD can't save a pointer. Am I right in
>>> thinking I
>>> > should make a wrapper type which holds the original type plus a
>>> reference
>>> > to the interpolation function, or is there a nicer way to do this?
>>> >
>>> > Cheers,
>>> > Scott
>>>
>>>
>