The issue was that I wasn't storing the Spline2D directly, but rather a 
function which wrapped log10 calls around the arguments. Pulling these out 
into my type's call method and directly storing the Spline inside it works 
perfectly. Thanks! I guess the lesson here is "just store the data inside 
the type, don't try and make it like OO by putting a function inside too". 

Scott

On Friday, 14 August 2015 02:02:03 UTC+1, Scott T wrote:
>
> 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 <sgseab...@gmail.com> 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 
>>>>
>>>>
>>

Reply via email to