This article demonstrate how to use GSL in Origin C.
Note: To use Visual Studio build 64bit dlls from a GSL source code of v2.5:
|
First you need download the GSL dlls from http://gnuwin32.sourceforge.net/packages/gsl.htm. You need just two dlls (libgsl.dll and libgslcblas.dll), and you can put them into the same folder where you are going to keep your Origin C files. For example, in a folder called c:\oc\. When using the downloaded dlls, please pay attention to the version issues.
To use libgsl.dll in Origin C, you will need a header file that provides the prototypes of the gsl functions. You can copy and translate(if needed) the necessary prototype/definition from GSL header files, for example, call it ocgsl.h, and create in the c:\oc\ folder.
// when loading the dll, need to load the correct version, // see the "version issues" link above for more details #pragma dll(libgsl, header) // this is OC special pragma, // header keyword is to indicate libgsl.dll is in same location as this file #define GSL_EXPORT // for OC, this is not needed, so make it empty // you can directly search and copy gsl function prototypes here GSL_EXPORT double gsl_sf_zeta_int (const int n); GSL_EXPORT int gsl_fit_linear (const double * x, const size_t xstride, const double * y, const size_t ystride, const size_t n, double * c0, double * c1, double * cov00, double * cov01, double * cov11, double * sumsq);
Note: Please don't write #pragma dll(libgslcblas, header) in code, or it may cause compile error. |
The following is a simple OC file to show how to call gsl_sf_zeta_int and gsl_fit_linear
#include <Origin.h> #include "ocgsl.h" // Example of using Riemann Zeta Function in GSL void gsl_test_zeta_function() { double result1 = gsl_sf_zeta_int(2); double result2 = pi*pi/6; printf("Zeta(2) = %f\n", result1); printf("pi^2/6 = %f\n", result2); } // Example of using linear fit in GSL void gsl_test_linear_fit(int npts = 10) { vector vx(npts), vy(npts); const double ds = 2, di = 10; for(int ii=0; ii<npts; ++ii) { vx[ii] = ii; vy[ii] = ii*ds + di + (rand()%100-50)*0.05; } for(ii=0; ii<npts; ++ii) printf("%.2f\t%.2f\n", vx[ii], vy[ii]); double c0, c1, cov00, cov01, cov11, sumsq; gsl_fit_linear(vx, 1, vy, 1, npts, &c0, &c1, &cov00, &cov01, &cov11, &sumsq); printf("Slope=%f, Intercept=%f", c1, c0); }
There is also an exampleto show how to use gsl functions in a fitting function.
Origin C doesn't support external functions that return a struct type variable, so those functions return this kind of data can not be used in Origin C, e.g.
gsl_complex gsl_complex_add (gsl_complex a, gsl_complex b)
since it returns a gsl_complex type of data, and gsl_complex is defined as:
typedef struct { double dat[2]; }gsl_complex;