Dear all, I am trying to call some Fortran code in Julia, but I have a hard time doing so... I have read the docs, looked at the wrapping of ARPACK and other libraries... But I did not find any way to make it work.
I am trying to wrap a spline function library (gcvspl.f, https://github.com/charlesll/Spectra.jl/tree/master/Dependencies), which I want to use in my project, Spectra.jl. I already have a wrapper in Python, but this was easier to wrap with using f2py. In Julia, I understand that I have to do it properly. The function I am trying to call is: GCVSPL ( X, Y, NY, WX, WY, M, N, K, MD, VAL, C, NC, WK, IER) (LINE 42 of GCVSPL.f) X(N) ( I ) Independent variables, Float64 Y(NY,K) ( I ) Input data to be smoothed (or interpolated), Float64 NY ( I ) First dimension of array Y(NY,K), with NY.ge.N, Integer WX(N) ( I ) Weight factor array, Float64 WY(K) ( I ) Weight factor array, Float64 M ( I ) M = 1,2,3,4 correspond to linear, cubic, quintic, and heptic splines, respectively. Integer N ( I ) Number of observations per dataset, Integer K ( I ) Number of datasets, with K.ge.1., Integer MD ( I ) Optimization mode switch, Integer VAL ( I ) Mode value, as described above under MD., Array of Float64 C(NC,K) ( O ) Spline coefficients, Array of Float64 NC ( I ) First dimension of array C(NC,K), NC.ge.N., Integer WK(IWK) (I/W/O) Work vector, IWK.ge.6*(N*M+1)+N, Array of Float64 IER ( O ) Error parameter, Integer with I and O designating Inputs and Outputs, respectively. From this and my previous Python wrap, I generated a fake dataset and tried to use this function with ccall: x = collect(0.0:1.0:100) y = 2.0.*x.^2 - 100.0 + x +0.0003.*x.^5 ese = y./10000 NN::Int64 = length(y) wx = 1./(ese.^2) # relative variance of observations wy = zeros([1])+1 # systematic errors... not used so put them to 1, works under the Python wrap VAL = ese.^2 M::Int64 = 2 N::Int64 = length(x) K::Int64 = 1 # number of y columns MD::Int64 = 2 #spline mode NC::Int64 = length(y) # initialising stuffs for outputs... isit the right way? c = ones(NN,NC) WK = [1.,1.,1.,1.,1.,1.] IER::Int64 = 0 ccall( (:gcvspl_, "./libgcvspl.so"), Void, (Ptr{Float64},Ptr{Float64},Ptr{ Int64},Ptr{Float64},Ptr{Float64},Ptr{Int64},Ptr{Int64},Ptr{Int64},Ptr{Int64 },Ptr{Float64},Ptr{Float64},Ptr{Int64},Ptr{Float64},Ptr{Int64}),x,y,NN,wx,wy ,M,N,K,MD,VAL,c,NN,WK,IER) This code does not work, returning me some convert problems... Notably, I get this one: LoadError: MethodError: `convert` has no method matching convert(::Type{Ptr{Float64}}, ::Array{Int64,1}) That I don't understand... In the "examples" (code already wrapped...) available online, that was the way people wrapped stuffs... Do anyone has some clue about doing this wrapping? The gcvspl.f code is available in https://github.com/charlesll/Spectra.jl/tree/master/Dependencies . Thanks in advance! Best, Charles.
