Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sffe/sffe_cmplx_gsl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sffe/sffe_cmplx_gsl.c')
-rw-r--r--src/sffe/sffe_cmplx_gsl.c294
1 files changed, 294 insertions, 0 deletions
diff --git a/src/sffe/sffe_cmplx_gsl.c b/src/sffe/sffe_cmplx_gsl.c
new file mode 100644
index 0000000..6006663
--- /dev/null
+++ b/src/sffe/sffe_cmplx_gsl.c
@@ -0,0 +1,294 @@
+/*/////////////////////////////////////////////////////////////////////////////////////
+// project : sFFe ( SegFault (or Segmentation Fault :) ) formula evalutaor )
+// author : Mateusz Malczak ( mateusz@malczak.info )
+// wpage : www.segfaultlabs.com/projects/sffe
+///////////////////////////////////////////////////////////////////////////////////////
+// special build for XaoS, for more info visit
+// http://www.segfaultlabs.com/projects/sfXaos
+/////////////////////////////////////////////////////////////////////////////////////*/
+
+#include <config.h>
+#ifdef SFFE_CMPLX_GSL
+
+#include "sffe.h"
+#include "sffe_cmplx_gsl.h"
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_complex_math.h>
+#include <math.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ const sffunction sfcmplxfunc[sffnctscount] = {
+ /* nie uwzgledniaj w wyszukaniu funkcji */
+ {sfpow, 2, "^\0"}, {sfadd, 2, "+\0"}, {sfsub, 2, "-\0"}, {sfmul, 2,
+ "*\0"},
+ {sfdiv, 2, "/\0"},
+ /* ponizej uwzgledniaj w wyszukaniu funkcji */
+ {sfsin, 1, "SIN\0"}, {sfcos, 1, "COS\0"}, {sftan, 1, "TAN\0"},
+ {sfcot, 1, "COT\0"},
+ {sfasin, 1, "ASIN\0"}, {sfacos, 1, "ACOS\0"}, {sfatan, 1,
+ "ATAN\0"}, {sfacot,
+ 1,
+ "ACOT\0"},
+ {sfatan2, 2, "ATAN2\0"},
+ {sfsinh, 1, "SINH\0"}, {sfcosh, 1, "COSH\0"}, {sftanh, 1,
+ "TANH\0"}, {sfcoth,
+ 1,
+ "COTH\0"},
+ {sfexp, 1, "EXP\0"}, {sflog, 1, "LOG\0"}, {sflog10, 1, "LOG10\0"},
+ {sflog2, 1, "LOG2\0"},
+ {sflogN, 2, "LOGN\0"}, {sflogN, 2, "LOGCN\0"},
+ /*power functions */
+ {sfpow, 2, "POW\0"}, {sfpowd, 2, "POWD\0"}, {sfpow, 2, "POWI\0"},
+ {sfpow, 2, "POWDC\0"},
+ {sfsqr, 1, "SQR\0"}, {sfsqrt, 1, "SQRT\0"}, {sfrtni, 3, "RTNI"},
+ {sfinv, 1, "INV\n"},
+ {sfceil, 1, "CEIL\0"}, {sffloor, 1, "FLOOR\0"}, {sfabs, 1,
+ "ABS\0"}, {sfrabs,
+ 1,
+ "RABS\0"},
+ {sfre, 1, "RE\0"}, {sfim, 1, "IM\0"},
+ {NULL, 1, "RAD\0"}, {NULL, 1, "DEG\0"},
+ {NULL, 1, "SIGN\0"}, {NULL, 1, "TRUNC\0"}, {sfrand, 1, "RAND\0"}
+ };
+
+ const char sfcnames[sfvarscount][5] =
+ { "PI\0", "PI_2\0", "PI2\0", "E\0", "I\0", "RND\0" };
+
+ const cfptr sfcvals[sfvarscount] =
+ { sfcPI, sfcPI2, sfc2PI, sfcE, sfcI, sfcRND };
+
+ sfarg *sfadd(sfarg * const p) { /* + */
+ sfvalue(p) =
+ gsl_complex_add(sfvalue(sfaram2(p)), sfvalue(sfaram1(p)));
+ return sfaram2(p);
+ };
+
+ sfarg *sfsub(sfarg * const p) { /* - */
+ sfvalue(p) =
+ gsl_complex_sub(sfvalue(sfaram2(p)), sfvalue(sfaram1(p)));
+ return sfaram2(p);
+ };
+
+ sfarg *sfmul(sfarg * const p) { /* * */
+ sfvalue(p) =
+ gsl_complex_mul(sfvalue(sfaram2(p)), sfvalue(sfaram1(p)));
+ return sfaram2(p);
+ };
+
+ sfarg *sfdiv(sfarg * const p) { /* / */
+ sfvalue(p) =
+ gsl_complex_div(sfvalue(sfaram2(p)), sfvalue(sfaram1(p)));
+ return sfaram2(p);
+ };
+
+
+ sfarg *sfsin(sfarg * const p) { /* sin */
+ sfvalue(p) = gsl_complex_sin(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfcos(sfarg * const p) { /* cos */
+ sfvalue(p) = gsl_complex_cos(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sftan(sfarg * const p) { /* tan */
+ sfvalue(p) = gsl_complex_tan(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfcot(sfarg * const p) { /* ctan */
+ sfvalue(p) = gsl_complex_cot(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+
+ sfarg *sfasin(sfarg * const p) { /* asin */
+ sfvalue(p) = gsl_complex_arcsin(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfacos(sfarg * const p) { /* acos */
+ sfvalue(p) = gsl_complex_arccos(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfatan(sfarg * const p) { /* atan */
+ sfvalue(p) = gsl_complex_arctan(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfacot(sfarg * const p) { /* actan */
+ sfvalue(p) = gsl_complex_arccot(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfatan2(sfarg * const p) { /* atan2 */
+ return sfaram2(p);
+ };
+
+ sfarg *sfsinh(sfarg * const p) { /* sinh */
+ sfvalue(p) = gsl_complex_sinh(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfcosh(sfarg * const p) { /* cosh */
+ sfvalue(p) = gsl_complex_cosh(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sftanh(sfarg * const p) { /* tanh */
+ sfvalue(p) = gsl_complex_tanh(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfcoth(sfarg * const p) { /* ctanh */
+ sfvalue(p) = gsl_complex_coth(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+
+ sfarg *sfexp(sfarg * const p) { /* exp */
+ sfvalue(p) = gsl_complex_exp(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sflog(sfarg * const p) { /* log */
+ sfvalue(p) = gsl_complex_log(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sflog10(sfarg * const p) { /* log10 */
+ sfvalue(p) = gsl_complex_log10(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sflog2(sfarg * const p) { /* log2 */
+ sfNumber base;
+ real(base) = 2;
+ imag(base) = 0;
+ sfvalue(p) = gsl_complex_log_b(sfvalue(sfaram1(p)), base);
+ return sfaram1(p);
+ };
+
+ sfarg *sflogN(sfarg * const p) { /* logN */
+ sfvalue(p) =
+ gsl_complex_log_b(sfvalue(sfaram1(p)), sfvalue(sfaram2(p)));
+ return sfaram2(p);
+ };
+
+
+ sfarg *sfpow(sfarg * const p) { /* cmplx pow */
+ sfvalue(p) =
+ gsl_complex_pow(sfvalue(sfaram2(p)), sfvalue(sfaram1(p)));
+ return sfaram2(p);
+ };
+
+ sfarg *sfpowd(sfarg * const p) { /* int pow */
+ sfvalue(p) =
+ gsl_complex_pow_real(sfvalue(sfaram2(p)),
+ GSL_REAL(sfvalue(sfaram1(p))));
+ return sfaram2(p);
+ };
+
+ sfarg *sfsqr(sfarg * const p) { /* sqr */
+ sfvalue(p) =
+ gsl_complex_pow(sfvalue(sfaram1(p)), sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfsqrt(sfarg * const p) { /* sqrt */
+ sfvalue(p) = gsl_complex_sqrt(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfrtni(sfarg * const p) { /* rtni */
+ double nrz =
+ pow(gsl_complex_abs(sfvalue(sfaram3(p))),
+ 1.0 / (double) (int) real(sfvalue(sfaram2(p))));
+ double alfi =
+ (gsl_complex_arg(sfvalue(sfaram3(p))) +
+ 8 * atan(1.0) * (double) (int) real(sfvalue(sfaram1(p)))) /
+ (double) (int) real(sfvalue(sfaram2(p)));
+
+ cmplxset(sfvalue(sfaram3(p)), nrz * cos(alfi), nrz * sin(alfi));
+ return sfaram3(p);
+ };
+
+ sfarg *sfinv(sfarg * const p) { /* cinv */
+ sfvalue(p) = gsl_complex_inverse(sfvalue(sfaram1(p)));
+ return sfaram1(p);
+ };
+
+ sfarg *sfceil(sfarg * const p) { /* ceil */
+ //sfvalue(p) = ceil( sfvalue( sfaram1(p) ) );
+ return sfaram1(p);
+ };
+
+ sfarg *sffloor(sfarg * const p) { /* floor */
+ //sfvalue(p) = floor( sfvalue( sfaram1(p) ) );
+ return sfaram1(p);
+ };
+
+ sfarg *sfabs(sfarg * const p) { /* abs - |z| */
+ GSL_REAL(sfvalue(p)) = gsl_complex_abs(sfvalue(sfaram1(p)));
+ GSL_IMAG(sfvalue(p)) = 0.0;
+ return sfaram1(p);
+ };
+
+ sfarg *sfrabs(sfarg * const p) { /* abs - real numbers */
+ GSL_REAL(sfvalue(p)) = GSL_REAL(sfvalue(sfaram1(p)));
+ if (GSL_REAL(sfvalue(p)) < 0)
+ GSL_REAL(sfvalue(p)) = -GSL_REAL(sfvalue(p));
+ GSL_IMAG(sfvalue(p)) = 0;
+ return sfaram1(p);
+ };
+
+ sfarg *sfre(sfarg * const p) { /* RE */
+ GSL_REAL(sfvalue(p)) = GSL_REAL(sfvalue(sfaram1(p)));
+ GSL_IMAG(sfvalue(p)) = 0.0;
+ return sfaram1(p);
+ };
+
+ sfarg *sfim(sfarg * const p) { /* IM */
+ GSL_REAL(sfvalue(p)) = GSL_IMAG(sfvalue(sfaram1(p)));
+ GSL_IMAG(sfvalue(p)) = 0.0;
+ return sfaram1(p);
+ };
+
+ sfarg *sfrand(sfarg * const p) { /* rand */
+ GSL_REAL(sfvalue(p)) =
+ GSL_REAL(sfvalue(sfaram1(p))) * (double) rand() /
+ (double) RAND_MAX;
+ GSL_IMAG(sfvalue(p)) = 0;
+ return sfaram1(p);
+ };
+
+//const eval
+ void sfcPI(sfNumber * cnst) {
+ GSL_SET_COMPLEX(cnst, 4 * atan(1), 0);
+ };
+ void sfcPI2(sfNumber * cnst) {
+ GSL_SET_COMPLEX(cnst, 2 * atan(1), 0);
+ };
+ void sfc2PI(sfNumber * cnst) {
+ GSL_SET_COMPLEX(cnst, 8 * atan(1), 0);
+ };
+ void sfcE(sfNumber * cnst) {
+ GSL_SET_COMPLEX(cnst, exp(1), 0);
+ };
+ void sfcI(sfNumber * cnst) {
+ GSL_SET_COMPLEX(cnst, 0, 1);
+ };
+ void sfcRND(sfNumber * cnst) {
+ GSL_SET_COMPLEX(cnst, rand(), 0);
+ };
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif