From d1cb9dbdea9d777833cd7f2148ea7ac5bcdb7d8b Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 28 Aug 2016 11:07:02 +0200 Subject: basis: add the basis of even cosines --- basis.c | 30 ++++++++++++++++++++++++++++++ basis.h | 1 + 2 files changed, 31 insertions(+) diff --git a/basis.c b/basis.c index face638..bb3a8e9 100644 --- a/basis.c +++ b/basis.c @@ -101,6 +101,33 @@ static const BasisSet sb_even_basis = { .colloc_point = sb_even_colloc_point, }; +static double cos_even_eval(const BasisSetContext *s, double coord, int idx) +{ + return cos(2 * idx * coord); +} + +static double cos_even_eval_diff1(const BasisSetContext *s, double coord, int idx) +{ + return -2 * idx * sin(2 * idx * coord); +} + +static double cos_even_eval_diff2(const BasisSetContext *s, double coord, int idx) +{ + return -4 * SQR(idx) * cos(2 * idx * coord); +} + +static double cos_even_colloc_point(const BasisSetContext *s, int order, int idx) +{ + return M_PI * idx / (2 * order); +} + +static const BasisSet cos_even_basis = { + .eval = cos_even_eval, + .eval_diff1 = cos_even_eval_diff1, + .eval_diff2 = cos_even_eval_diff2, + .colloc_point = cos_even_colloc_point, +}; + double bdi_basis_eval(BasisSetContext *s, enum BSEvalType type, double coord, int order) { double (*eval)(const BasisSetContext *s, double coord, int order); @@ -138,6 +165,9 @@ BasisSetContext *bdi_basis_init(enum BasisFamily family, double sf) s->bs = &sb_even_basis; s->sf = sf; break; + case BASIS_FAMILY_COS_EVEN: + s->bs = &cos_even_basis; + break; default: free(s); return NULL; diff --git a/basis.h b/basis.h index 6b6f3c4..68c9597 100644 --- a/basis.h +++ b/basis.h @@ -26,6 +26,7 @@ enum BSEvalType { enum BasisFamily { BASIS_FAMILY_SB_EVEN, + BASIS_FAMILY_COS_EVEN, }; typedef struct BasisSetContext BasisSetContext; -- cgit v1.2.3