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 >>>> >>>> >>