Blame sum/gsl_sum.h

Packit 67cb25
/* sum/gsl_sum.h
Packit 67cb25
 * 
Packit 67cb25
 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough
Packit 67cb25
 * 
Packit 67cb25
 * This program is free software; you can redistribute it and/or modify
Packit 67cb25
 * it under the terms of the GNU General Public License as published by
Packit 67cb25
 * the Free Software Foundation; either version 3 of the License, or (at
Packit 67cb25
 * your option) any later version.
Packit 67cb25
 * 
Packit 67cb25
 * This program is distributed in the hope that it will be useful, but
Packit 67cb25
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 67cb25
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 67cb25
 * General Public License for more details.
Packit 67cb25
 * 
Packit 67cb25
 * You should have received a copy of the GNU General Public License
Packit 67cb25
 * along with this program; if not, write to the Free Software
Packit 67cb25
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
/* Author:  G. Jungman */
Packit 67cb25
Packit 67cb25
Packit 67cb25
#ifndef __GSL_SUM_H__
Packit 67cb25
#define __GSL_SUM_H__
Packit 67cb25
Packit 67cb25
#include <stdlib.h>
Packit 67cb25
Packit 67cb25
#undef __BEGIN_DECLS
Packit 67cb25
#undef __END_DECLS
Packit 67cb25
#ifdef __cplusplus
Packit 67cb25
# define __BEGIN_DECLS extern "C" {
Packit 67cb25
# define __END_DECLS }
Packit 67cb25
#else
Packit 67cb25
# define __BEGIN_DECLS          /* empty */
Packit 67cb25
# define __END_DECLS            /* empty */
Packit 67cb25
#endif
Packit 67cb25
Packit 67cb25
__BEGIN_DECLS
Packit 67cb25
Packit 67cb25
/*  Workspace for Levin U Transform with error estimation,
Packit 67cb25
 *   
Packit 67cb25
 *   size        = number of terms the workspace can handle
Packit 67cb25
 *   sum_plain   = simple sum of series
Packit 67cb25
 *   q_num       = backward diagonal of numerator; length = size
Packit 67cb25
 *   q_den       = backward diagonal of denominator; length = size
Packit 67cb25
 *   dq_num      = table of numerator derivatives; length = size**2
Packit 67cb25
 *   dq_den      = table of denominator derivatives; length = size**2
Packit 67cb25
 *   dsum        = derivative of sum wrt term i; length = size
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
typedef struct
Packit 67cb25
{
Packit 67cb25
  size_t size;
Packit 67cb25
  size_t i;                     /* position in array */
Packit 67cb25
  size_t terms_used;            /* number of calls */
Packit 67cb25
  double sum_plain;
Packit 67cb25
  double *q_num;
Packit 67cb25
  double *q_den;
Packit 67cb25
  double *dq_num;
Packit 67cb25
  double *dq_den;
Packit 67cb25
  double *dsum;
Packit 67cb25
}
Packit 67cb25
gsl_sum_levin_u_workspace;
Packit 67cb25
Packit 67cb25
gsl_sum_levin_u_workspace *gsl_sum_levin_u_alloc (size_t n);
Packit 67cb25
void gsl_sum_levin_u_free (gsl_sum_levin_u_workspace * w);
Packit 67cb25
Packit 67cb25
/* Basic Levin-u acceleration method.
Packit 67cb25
 *
Packit 67cb25
 *   array       = array of series elements
Packit 67cb25
 *   n           = size of array
Packit 67cb25
 *   sum_accel   = result of summation acceleration
Packit 67cb25
 *   err         = estimated error   
Packit 67cb25
 *
Packit 67cb25
 * See [Fessler et al., ACM TOMS 9, 346 (1983) and TOMS-602]
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
int gsl_sum_levin_u_accel (const double *array,
Packit 67cb25
                           const size_t n,
Packit 67cb25
                           gsl_sum_levin_u_workspace * w,
Packit 67cb25
                           double *sum_accel, double *abserr);
Packit 67cb25
Packit 67cb25
/* Basic Levin-u acceleration method with constraints on the terms
Packit 67cb25
 * used,
Packit 67cb25
 *
Packit 67cb25
 *   array       = array of series elements
Packit 67cb25
 *   n           = size of array
Packit 67cb25
 *   min_terms   = minimum number of terms to sum
Packit 67cb25
 *   max_terms   = maximum number of terms to sum
Packit 67cb25
 *   sum_accel   = result of summation acceleration
Packit 67cb25
 *   err         = estimated error   
Packit 67cb25
 *
Packit 67cb25
 * See [Fessler et al., ACM TOMS 9, 346 (1983) and TOMS-602] 
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
int gsl_sum_levin_u_minmax (const double *array,
Packit 67cb25
                            const size_t n,
Packit 67cb25
                            const size_t min_terms,
Packit 67cb25
                            const size_t max_terms,
Packit 67cb25
                            gsl_sum_levin_u_workspace * w,
Packit 67cb25
                            double *sum_accel, double *abserr);
Packit 67cb25
Packit 67cb25
/* Basic Levin-u step w/o reference to the array of terms.
Packit 67cb25
 * We only need to specify the value of the current term
Packit 67cb25
 * to execute the step. See TOMS-745.
Packit 67cb25
 *
Packit 67cb25
 * sum = t0 + ... + t_{n-1} + term;  term = t_{n}
Packit 67cb25
 *
Packit 67cb25
 *   term   = value of the series term to be added
Packit 67cb25
 *   n      = position of term in series (starting from 0)
Packit 67cb25
 *   sum_accel = result of summation acceleration
Packit 67cb25
 *   sum_plain = simple sum of series
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
gsl_sum_levin_u_step (const double term,
Packit 67cb25
                      const size_t n,
Packit 67cb25
                      const size_t nmax,
Packit 67cb25
                      gsl_sum_levin_u_workspace * w, 
Packit 67cb25
                      double *sum_accel);
Packit 67cb25
Packit 67cb25
/* The following functions perform the same calculation without
Packit 67cb25
   estimating the errors. They require O(N) storage instead of O(N^2).
Packit 67cb25
   This may be useful for summing many similar series where the size
Packit 67cb25
   of the error has already been estimated reliably and is not
Packit 67cb25
   expected to change.  */
Packit 67cb25
Packit 67cb25
typedef struct
Packit 67cb25
{
Packit 67cb25
  size_t size;
Packit 67cb25
  size_t i;                     /* position in array */
Packit 67cb25
  size_t terms_used;            /* number of calls */
Packit 67cb25
  double sum_plain;
Packit 67cb25
  double *q_num;
Packit 67cb25
  double *q_den;
Packit 67cb25
  double *dsum;
Packit 67cb25
}
Packit 67cb25
gsl_sum_levin_utrunc_workspace;
Packit 67cb25
Packit 67cb25
gsl_sum_levin_utrunc_workspace *gsl_sum_levin_utrunc_alloc (size_t n);
Packit 67cb25
void gsl_sum_levin_utrunc_free (gsl_sum_levin_utrunc_workspace * w);
Packit 67cb25
Packit 67cb25
int gsl_sum_levin_utrunc_accel (const double *array,
Packit 67cb25
                                const size_t n,
Packit 67cb25
                                gsl_sum_levin_utrunc_workspace * w,
Packit 67cb25
                                double *sum_accel, double *abserr_trunc);
Packit 67cb25
Packit 67cb25
int gsl_sum_levin_utrunc_minmax (const double *array,
Packit 67cb25
                                 const size_t n,
Packit 67cb25
                                 const size_t min_terms,
Packit 67cb25
                                 const size_t max_terms,
Packit 67cb25
                                 gsl_sum_levin_utrunc_workspace * w,
Packit 67cb25
                                 double *sum_accel, double *abserr_trunc);
Packit 67cb25
Packit 67cb25
int gsl_sum_levin_utrunc_step (const double term,
Packit 67cb25
                               const size_t n,
Packit 67cb25
                               gsl_sum_levin_utrunc_workspace * w, 
Packit 67cb25
                               double *sum_accel);
Packit 67cb25
Packit 67cb25
__END_DECLS
Packit 67cb25
Packit 67cb25
#endif /* __GSL_SUM_H__ */