1.19.1.1 Calling GNU Scientific Library
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.
- libgsl.dll
- This is the main gsl dll
- libgslcblas.dll
- This dll is needed by libgsl.dll
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.
ocgsl.h
// 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.
|
test_gsl.c
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);
}
Using GSL in a Fitting Function
There is also an exampleto show how to use gsl functions in a fitting function.
Notice on using GSL functions
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;
|