From 013f72915b3ae34bf83af73c4a55fb51545a80fe Mon Sep 17 00:00:00 2001 From: Franz Zotter Date: Sat, 22 Jan 2011 21:10:28 +0000 Subject: [mtx_bessel] added, using math.h bessel functions Jn,Yn for integer n svn path=/trunk/externals/iem/iemmatrix/; revision=14774 --- src/iemmatrix_sources.c | 1 + src/iemmatrix_sources.h | 1 + src/mtx_bessel.c | 186 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+) create mode 100644 src/mtx_bessel.c (limited to 'src') diff --git a/src/iemmatrix_sources.c b/src/iemmatrix_sources.c index 2e6b4f4..d6e3431 100644 --- a/src/iemmatrix_sources.c +++ b/src/iemmatrix_sources.c @@ -12,6 +12,7 @@ void iemmatrix_sources_setup(void) iemtx_add_setup(); /* mtx_add.c */ iemtx_and_setup(); /* mtx_and.c */ iemtx_atan_setup(); /* mtx_atan.c */ + iemtx_bessel_setup(); /* mtx_bessel.c */ iemtx_bitand_setup(); /* mtx_bitand.c */ iemtx_bitleft_setup(); /* mtx_bitleft.c */ iemtx_bitor_setup(); /* mtx_bitor.c */ diff --git a/src/iemmatrix_sources.h b/src/iemmatrix_sources.h index df6dc7b..cd1e9ab 100644 --- a/src/iemmatrix_sources.h +++ b/src/iemmatrix_sources.h @@ -10,6 +10,7 @@ void iemtx_abs_setup(void); /* mtx_abs.c */ void iemtx_add_setup(void); /* mtx_add.c */ void iemtx_and_setup(void); /* mtx_and.c */ void iemtx_atan_setup(void); /* mtx_atan.c */ +void iemtx_bessel_setup(void); /* mtx_bessel.c */ void iemtx_bitand_setup(void); /* mtx_bitand.c */ void iemtx_bitleft_setup(void); /* mtx_bitleft.c */ void iemtx_bitor_setup(void); /* mtx_bitor.c */ diff --git a/src/mtx_bessel.c b/src/mtx_bessel.c new file mode 100644 index 0000000..77ac9ea --- /dev/null +++ b/src/mtx_bessel.c @@ -0,0 +1,186 @@ +/* + * iemmatrix + * + * objects for manipulating simple matrices + * mostly refering to matlab/octave matrix functions + * this functions depends on the GNU scientific library + * + * Copyright (c) 2009, Franz Zotter + * IEM, Graz, Austria + * + * For information on usage and redistribution, and for a DISCLAIMER OF ALL + * WARRANTIES, see the file, "LICENSE.txt," in this distribution. + * + */ + +#include "iemmatrix.h" +#include "math.h" +#include + +static t_class *mtx_bessel_class; + +typedef struct _MTXBessel_ MTXBessel; +struct _MTXBessel_ +{ + t_object x_obj; + t_outlet *list_h_re_out; + t_outlet *list_h_im_out; + t_atom *list_h_re; + t_atom *list_h_im; + double *kr; + double *h_re; + double *h_im; + size_t nmax; + size_t l; +}; + +static void allocMTXBesseldata (MTXBessel *x) +{ + x->kr=(double*)calloc(x->l,sizeof(double)); + if (x->list_h_re_out!=0) { + x->list_h_re=(t_atom*)calloc(x->l*(x->nmax+1)+2,sizeof(t_atom)); + x->h_re=(double*)calloc(x->l*(x->nmax+1),sizeof(double)); + } + if (x->list_h_im_out!=0) { + x->list_h_im=(t_atom*)calloc(x->l*(x->nmax+1)+2,sizeof(t_atom)); + x->h_im=(double*)calloc(x->l*(x->nmax+1),sizeof(double)); + } +} + +static void deleteMTXBesseldata (MTXBessel *x) +{ + if (x->kr!=0) + free(x->kr); + if (x->h_re!=0) + free(x->h_re); + if (x->h_im!=0) + free(x->h_im); + if (x->list_h_re!=0) + free(x->list_h_re); + if (x->list_h_im!=0) + free(x->list_h_im); + x->list_h_re=0; + x->list_h_im=0; + x->h_re=0; + x->h_im=0; + x->kr=0; +} + +static void *newMTXBessel (t_symbol *s, int argc, t_atom *argv) +{ + int nmax; + char whichfunction = 'j'; + t_symbol *fsym; + MTXBessel *x = (MTXBessel *) pd_new (mtx_bessel_class); + x->list_h_re = 0; + x->list_h_im = 0; + x->list_h_im_out = 0; + x->list_h_re_out = 0; + x->kr = 0; + x->h_re = 0; + x->h_im = 0; + x->l=0; + fsym=atom_getsymbol(argv); + if (fsym->s_name!=0) + whichfunction=fsym->s_name[0]; + switch (whichfunction) { + default: + case 'J': + x->list_h_re_out = outlet_new (&x->x_obj, gensym("matrix")); + break; + case 'H': + x->list_h_re_out = outlet_new (&x->x_obj, gensym("matrix")); + case 'Y': + x->list_h_im_out = outlet_new (&x->x_obj, gensym("matrix")); + } + nmax=(int) atom_getfloat(argv+1); + if (nmax<0) + nmax=0; + x->nmax=nmax; + + return ((void *) x); +} + +static void mTXBesselBang (MTXBessel *x) +{ + if (x->list_h_im!=0) { + outlet_anything(x->list_h_im_out, gensym("matrix"), x->l*(x->nmax+1)+2, x->list_h_im); + } + if (x->list_h_re!=0) { + outlet_anything(x->list_h_re_out, gensym("matrix"), x->l*(x->nmax+1)+2, x->list_h_re); + } +} + +static void mTXBesselMatrix (MTXBessel *x, t_symbol *s, + int argc, t_atom *argv) +{ + int rows = atom_getint (argv++); + int columns = atom_getint (argv++); + int size = rows * columns; + int in_size = argc-2; + int n,m,ofs; + + + /* size check */ + if (!size) + post("mtx_bessel: invalid dimensions"); + else if (in_sizel!=columns) { + deleteMTXBesseldata(x); + x->l=columns; + allocMTXBesseldata(x); + } + for (n=0;nl;n++) { + x->kr[n]=(double) atom_getfloat(argv+n); + } + + if (x->h_re!=0) + for (m=0;ml;m++) + for (n=0;nnmax+1;n++) + x->h_re[n+m*(x->nmax+1)]=jnf(n,x->kr[m]); + + if (x->h_im!=0) + for (m=0;ml;m++) + for (n=0;nnmax+1;n++) + x->h_im[n+m*(x->nmax+1)]=ynf(n,x->kr[m]); + + + if (x->h_re!=0) { + SETFLOAT(x->list_h_re+1,(float)(x->nmax+1)); + SETFLOAT(x->list_h_re,(float)x->l); + for (n=0;nl*(x->nmax+1);n++) + SETFLOAT(x->list_h_re+n+2,(float)x->h_re[n]); + } + + if (x->h_im!=0) { + SETFLOAT(x->list_h_im+1,(float)(x->nmax+1)); + SETFLOAT(x->list_h_im,(float)x->l); + for (n=0;nl*(x->nmax+1);n++) + SETFLOAT(x->list_h_im+n+2,(float)x->h_im[n]); + } + + mTXBesselBang(x); + } +} + +void mtx_bessel_setup (void) +{ + mtx_bessel_class = class_new + (gensym("mtx_bessel"), + (t_newmethod) newMTXBessel, + (t_method) deleteMTXBesseldata, + sizeof (MTXBessel), + CLASS_DEFAULT, A_GIMME, 0); + class_addbang (mtx_bessel_class, (t_method) mTXBesselBang); + class_addmethod (mtx_bessel_class, (t_method) mTXBesselMatrix, gensym("matrix"), A_GIMME,0); +} + +void iemtx_bessel_setup(void){ + mtx_bessel_setup(); +} + + -- cgit v1.2.1