I have managed to get a simple CVode program running. Hurray! :-)
    
    
    proc f(t: realtype, y: N_Vector, ydot: N_Vector, user_data: pointer): cint 
{.cdecl.} =
        NV_Ith_S(ydot, 0) = NV_Ith_S(y, 0)
        NV_Ith_S(ydot, 1) = NV_Ith_S(y, 1)
        NV_Ith_S(ydot, 2) = NV_Ith_S(y, 2)
    
    var cvode_mem: pointer = nil
    cvode_mem = CVodeCreate(CV_ADAMS)
    var t0 = 0.0
    var y0 = newNVector([1.0, 1.0, 1.0])
    var A = SUNDenseMatrix(3, 3)
    let reltol = 1e-8
    let abstol = 1e-8
    var flag = CVodeInit(cvode_mem, f, t0, y0.rawVector[])
    flag = CVodeSStolerances(cvode_mem, reltol, abstol)
    var LS = SUNLinSol_SPGMR(y0.rawVector[], 0, 0)
    flag = CVodeSetLinearSolver(cvode_mem, LS, A)
    var t: realtype = 0.0
    var tout = 1.0
    flag = CVode(cvode_mem, tout, y0.rawVector[], addr(t), CV_NORMAL)
    
    import math
    var correct = newNVector(@[exp(1.0), exp(1.0), exp(1.0)])
    echo y0
    echo "Error: ", correct - y0
    
    CVodeFree(addr(cvode_mem))
    flag = SUNLinSolFree(LS)
    SUNMatDestroy(A)
    
    
    Run

Reply via email to