using System; using HeuristicLab.Problems.DynamicalSystemsModelling; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace AutoDiffForDynamicalModelsTest { [TestClass] public class TestCvodes { [TestMethod] public unsafe void TestCvodesASAMethod() { // test vectors var arr = new double[] { 3.14, 2.71 }; var vec = CVODES.N_VMake_Serial(2, arr); CVODES.N_VDestroy_Serial(vec); vec = CVODES.N_VNew_Serial(10); unsafe { int* content = (int*)*(int*)vec.ToPointer(); long length = *content; Console.WriteLine(*content); int own_data = *(content + 2); Console.WriteLine(own_data); double* data = (double*)*(content + 3); double data0 = *data; } CVODES.N_VConst_Serial(2.0, vec); CVODES.N_VPrint_Serial(vec); Assert.AreEqual(20, CVODES.N_VL1Norm_Serial(vec)); CVODES.N_VDestroy_Serial(vec); // linear oscillator int numberOfEquations = 2; var y = CVODES.N_VNew_Serial(numberOfEquations); // y must be initialized before calling CVodeInit // CVODES.N_VConst_Serial(100.0, y); CVODES.NV_Set_Ith_S(y, 0, 0.5); // x CVODES.NV_Set_Ith_S(y, 1, 1); // v var cvode_mem = CVODES.CVodeCreate(CVODES.MultistepMethod.CV_ADAMS, CVODES.NonlinearSolverIteration.CV_FUNCTIONAL); var flag = CVODES.CVodeInit(cvode_mem, F, 0.0, y); Assert.AreEqual(CVODES.CV_SUCCESS, flag); flag = CVODES.CVodeSStolerances(cvode_mem, 1E-4, 1.0); Assert.AreEqual(CVODES.CV_SUCCESS, flag); var A = CVODES.SUNDenseMatrix(numberOfEquations, numberOfEquations); Assert.AreNotSame(A, IntPtr.Zero); var linearSolver = CVODES.SUNDenseLinearSolver(y, A); Assert.AreNotSame(linearSolver, IntPtr.Zero); flag = CVODES.CVDlsSetLinearSolver(cvode_mem, linearSolver, A); Assert.AreEqual(CVODES.CV_SUCCESS, flag); // flag = CVODES.CVDlsSetJacFn(cvode_mem, JacF); // Assert.AreEqual(CVODES.CV_SUCCESS, flag); // var ns = 1; // number of parameters // var p = new double[1]; // set as user-data // var yS0 = CVODES.N_VCloneVectorArray_Serial(ns, y); // clone the output vector for each parameter, TODO: free // for(int i=0;i