|
Packit |
67cb25 |
/* specfunc/ellint.c
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
|
|
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 |
#include <config.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_math.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_errno.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_precision.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_sf_ellint.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#include "error.h"
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
inline
|
|
Packit |
67cb25 |
static double locMAX3(double x, double y, double z)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xy = GSL_MAX(x, y);
|
|
Packit |
67cb25 |
return GSL_MAX(xy, z);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
inline
|
|
Packit |
67cb25 |
static double locMAX4(double x, double y, double z, double w)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xy = GSL_MAX(x, y);
|
|
Packit |
67cb25 |
double xyz = GSL_MAX(xy, z);
|
|
Packit |
67cb25 |
return GSL_MAX(xyz, w);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* based on Carlson's algorithms:
|
|
Packit |
67cb25 |
[B. C. Carlson Numer. Math. 33, 1 (1979)]
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
see also:
|
|
Packit |
67cb25 |
[B.C. Carlson, Special Functions of Applied Mathematics (1977)]
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* According to Carlson's algorithm, the errtol parameter
|
|
Packit |
67cb25 |
typically effects the relative error in the following way:
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
relative error < 16 errtol^6 / (1 - 2 errtol)
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
errtol precision
|
|
Packit |
67cb25 |
------ ----------
|
|
Packit |
67cb25 |
0.001 1.0e-17
|
|
Packit |
67cb25 |
0.003 2.0e-14
|
|
Packit |
67cb25 |
0.01 2.0e-11
|
|
Packit |
67cb25 |
0.03 2.0e-8
|
|
Packit |
67cb25 |
0.1 2.0e-5
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_RC_e(double x, double y, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const double lolim = 5.0 * GSL_DBL_MIN;
|
|
Packit |
67cb25 |
const double uplim = 0.2 * GSL_DBL_MAX;
|
|
Packit |
67cb25 |
const gsl_prec_t goal = GSL_MODE_PREC(mode);
|
|
Packit |
67cb25 |
const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );
|
|
Packit |
67cb25 |
const double prec = gsl_prec_eps[goal];
|
|
Packit |
67cb25 |
const int nmax = 10000;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if(x < 0.0 || y < 0.0 || x + y < lolim) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(GSL_MAX(x, y) < uplim) {
|
|
Packit |
67cb25 |
const double c1 = 1.0 / 7.0;
|
|
Packit |
67cb25 |
const double c2 = 9.0 / 22.0;
|
|
Packit |
67cb25 |
double xn = x;
|
|
Packit |
67cb25 |
double yn = y;
|
|
Packit |
67cb25 |
double mu, sn, lamda, s;
|
|
Packit |
67cb25 |
int n = 0;
|
|
Packit |
67cb25 |
while(1) {
|
|
Packit |
67cb25 |
mu = (xn + yn + yn) / 3.0;
|
|
Packit |
67cb25 |
sn = (yn + mu) / mu - 2.0;
|
|
Packit |
67cb25 |
if (fabs(sn) < errtol) break;
|
|
Packit |
67cb25 |
lamda = 2.0 * sqrt(xn) * sqrt(yn) + yn;
|
|
Packit |
67cb25 |
xn = (xn + lamda) * 0.25;
|
|
Packit |
67cb25 |
yn = (yn + lamda) * 0.25;
|
|
Packit |
67cb25 |
n++;
|
|
Packit |
67cb25 |
if(n==nmax) {
|
|
Packit |
67cb25 |
MAXITER_ERROR (result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
s = sn * sn * (0.3 + sn * (c1 + sn * (0.375 + sn * c2)));
|
|
Packit |
67cb25 |
result->val = (1.0 + s) / sqrt(mu);
|
|
Packit |
67cb25 |
result->err = prec * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_RD_e(double x, double y, double z, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const gsl_prec_t goal = GSL_MODE_PREC(mode);
|
|
Packit |
67cb25 |
const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );
|
|
Packit |
67cb25 |
const double prec = gsl_prec_eps[goal];
|
|
Packit |
67cb25 |
const double lolim = 2.0/pow(GSL_DBL_MAX, 2.0/3.0);
|
|
Packit |
67cb25 |
const double uplim = pow(0.1*errtol/GSL_DBL_MIN, 2.0/3.0);
|
|
Packit |
67cb25 |
const int nmax = 10000;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if(GSL_MIN(x,y) < 0.0 || GSL_MIN(x+y,z) < lolim) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(locMAX3(x,y,z) < uplim) {
|
|
Packit |
67cb25 |
const double c1 = 3.0 / 14.0;
|
|
Packit |
67cb25 |
const double c2 = 1.0 / 6.0;
|
|
Packit |
67cb25 |
const double c3 = 9.0 / 22.0;
|
|
Packit |
67cb25 |
const double c4 = 3.0 / 26.0;
|
|
Packit |
67cb25 |
double xn = x;
|
|
Packit |
67cb25 |
double yn = y;
|
|
Packit |
67cb25 |
double zn = z;
|
|
Packit |
67cb25 |
double sigma = 0.0;
|
|
Packit |
67cb25 |
double power4 = 1.0;
|
|
Packit |
67cb25 |
double ea, eb, ec, ed, ef, s1, s2;
|
|
Packit |
67cb25 |
double mu, xndev, yndev, zndev;
|
|
Packit |
67cb25 |
int n = 0;
|
|
Packit |
67cb25 |
while(1) {
|
|
Packit |
67cb25 |
double xnroot, ynroot, znroot, lamda;
|
|
Packit |
67cb25 |
double epslon;
|
|
Packit |
67cb25 |
mu = (xn + yn + 3.0 * zn) * 0.2;
|
|
Packit |
67cb25 |
xndev = (mu - xn) / mu;
|
|
Packit |
67cb25 |
yndev = (mu - yn) / mu;
|
|
Packit |
67cb25 |
zndev = (mu - zn) / mu;
|
|
Packit |
67cb25 |
epslon = locMAX3(fabs(xndev), fabs(yndev), fabs(zndev));
|
|
Packit |
67cb25 |
if (epslon < errtol) break;
|
|
Packit |
67cb25 |
xnroot = sqrt(xn);
|
|
Packit |
67cb25 |
ynroot = sqrt(yn);
|
|
Packit |
67cb25 |
znroot = sqrt(zn);
|
|
Packit |
67cb25 |
lamda = xnroot * (ynroot + znroot) + ynroot * znroot;
|
|
Packit |
67cb25 |
sigma += power4 / (znroot * (zn + lamda));
|
|
Packit |
67cb25 |
power4 *= 0.25;
|
|
Packit |
67cb25 |
xn = (xn + lamda) * 0.25;
|
|
Packit |
67cb25 |
yn = (yn + lamda) * 0.25;
|
|
Packit |
67cb25 |
zn = (zn + lamda) * 0.25;
|
|
Packit |
67cb25 |
n++;
|
|
Packit |
67cb25 |
if(n==nmax) {
|
|
Packit |
67cb25 |
MAXITER_ERROR (result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
ea = xndev * yndev;
|
|
Packit |
67cb25 |
eb = zndev * zndev;
|
|
Packit |
67cb25 |
ec = ea - eb;
|
|
Packit |
67cb25 |
ed = ea - 6.0 * eb;
|
|
Packit |
67cb25 |
ef = ed + ec + ec;
|
|
Packit |
67cb25 |
s1 = ed * (- c1 + 0.25 * c3 * ed - 1.5 * c4 * zndev * ef);
|
|
Packit |
67cb25 |
s2 = zndev * (c2 * ef + zndev * (- c3 * ec + zndev * c4 * ea));
|
|
Packit |
67cb25 |
result->val = 3.0 * sigma + power4 * (1.0 + s1 + s2) / (mu * sqrt(mu));
|
|
Packit |
67cb25 |
result->err = prec * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_RF_e(double x, double y, double z, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const double lolim = 5.0 * GSL_DBL_MIN;
|
|
Packit |
67cb25 |
const double uplim = 0.2 * GSL_DBL_MAX;
|
|
Packit |
67cb25 |
const gsl_prec_t goal = GSL_MODE_PREC(mode);
|
|
Packit |
67cb25 |
const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );
|
|
Packit |
67cb25 |
const double prec = gsl_prec_eps[goal];
|
|
Packit |
67cb25 |
const int nmax = 10000;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if(x < 0.0 || y < 0.0 || z < 0.0) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(x+y < lolim || x+z < lolim || y+z < lolim) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(locMAX3(x,y,z) < uplim) {
|
|
Packit |
67cb25 |
const double c1 = 1.0 / 24.0;
|
|
Packit |
67cb25 |
const double c2 = 3.0 / 44.0;
|
|
Packit |
67cb25 |
const double c3 = 1.0 / 14.0;
|
|
Packit |
67cb25 |
double xn = x;
|
|
Packit |
67cb25 |
double yn = y;
|
|
Packit |
67cb25 |
double zn = z;
|
|
Packit |
67cb25 |
double mu, xndev, yndev, zndev, e2, e3, s;
|
|
Packit |
67cb25 |
int n = 0;
|
|
Packit |
67cb25 |
while(1) {
|
|
Packit |
67cb25 |
double epslon, lamda;
|
|
Packit |
67cb25 |
double xnroot, ynroot, znroot;
|
|
Packit |
67cb25 |
mu = (xn + yn + zn) / 3.0;
|
|
Packit |
67cb25 |
xndev = 2.0 - (mu + xn) / mu;
|
|
Packit |
67cb25 |
yndev = 2.0 - (mu + yn) / mu;
|
|
Packit |
67cb25 |
zndev = 2.0 - (mu + zn) / mu;
|
|
Packit |
67cb25 |
epslon = locMAX3(fabs(xndev), fabs(yndev), fabs(zndev));
|
|
Packit |
67cb25 |
if (epslon < errtol) break;
|
|
Packit |
67cb25 |
xnroot = sqrt(xn);
|
|
Packit |
67cb25 |
ynroot = sqrt(yn);
|
|
Packit |
67cb25 |
znroot = sqrt(zn);
|
|
Packit |
67cb25 |
lamda = xnroot * (ynroot + znroot) + ynroot * znroot;
|
|
Packit |
67cb25 |
xn = (xn + lamda) * 0.25;
|
|
Packit |
67cb25 |
yn = (yn + lamda) * 0.25;
|
|
Packit |
67cb25 |
zn = (zn + lamda) * 0.25;
|
|
Packit |
67cb25 |
n++;
|
|
Packit |
67cb25 |
if(n==nmax) {
|
|
Packit |
67cb25 |
MAXITER_ERROR (result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
e2 = xndev * yndev - zndev * zndev;
|
|
Packit |
67cb25 |
e3 = xndev * yndev * zndev;
|
|
Packit |
67cb25 |
s = 1.0 + (c1 * e2 - 0.1 - c2 * e3) * e2 + c3 * e3;
|
|
Packit |
67cb25 |
result->val = s / sqrt(mu);
|
|
Packit |
67cb25 |
result->err = prec * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_RJ_e(double x, double y, double z, double p, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const gsl_prec_t goal = GSL_MODE_PREC(mode);
|
|
Packit |
67cb25 |
const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );
|
|
Packit |
67cb25 |
const double prec = gsl_prec_eps[goal];
|
|
Packit |
67cb25 |
const double lolim = pow(5.0 * GSL_DBL_MIN, 1.0/3.0);
|
|
Packit |
67cb25 |
const double uplim = 0.3 * pow(0.2 * GSL_DBL_MAX, 1.0/3.0);
|
|
Packit |
67cb25 |
const int nmax = 10000;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if(x < 0.0 || y < 0.0 || z < 0.0) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(x + y < lolim || x + z < lolim || y + z < lolim || p < lolim) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(locMAX4(x,y,z,p) < uplim) {
|
|
Packit |
67cb25 |
const double c1 = 3.0 / 14.0;
|
|
Packit |
67cb25 |
const double c2 = 1.0 / 3.0;
|
|
Packit |
67cb25 |
const double c3 = 3.0 / 22.0;
|
|
Packit |
67cb25 |
const double c4 = 3.0 / 26.0;
|
|
Packit |
67cb25 |
double xn = x;
|
|
Packit |
67cb25 |
double yn = y;
|
|
Packit |
67cb25 |
double zn = z;
|
|
Packit |
67cb25 |
double pn = p;
|
|
Packit |
67cb25 |
double sigma = 0.0;
|
|
Packit |
67cb25 |
double power4 = 1.0;
|
|
Packit |
67cb25 |
double mu, xndev, yndev, zndev, pndev;
|
|
Packit |
67cb25 |
double ea, eb, ec, e2, e3, s1, s2, s3;
|
|
Packit |
67cb25 |
int n = 0;
|
|
Packit |
67cb25 |
while(1) {
|
|
Packit |
67cb25 |
double xnroot, ynroot, znroot;
|
|
Packit |
67cb25 |
double lamda, alfa, beta;
|
|
Packit |
67cb25 |
double epslon;
|
|
Packit |
67cb25 |
gsl_sf_result rcresult;
|
|
Packit |
67cb25 |
int rcstatus;
|
|
Packit |
67cb25 |
mu = (xn + yn + zn + pn + pn) * 0.2;
|
|
Packit |
67cb25 |
xndev = (mu - xn) / mu;
|
|
Packit |
67cb25 |
yndev = (mu - yn) / mu;
|
|
Packit |
67cb25 |
zndev = (mu - zn) / mu;
|
|
Packit |
67cb25 |
pndev = (mu - pn) / mu;
|
|
Packit |
67cb25 |
epslon = locMAX4(fabs(xndev), fabs(yndev), fabs(zndev), fabs(pndev));
|
|
Packit |
67cb25 |
if(epslon < errtol) break;
|
|
Packit |
67cb25 |
xnroot = sqrt(xn);
|
|
Packit |
67cb25 |
ynroot = sqrt(yn);
|
|
Packit |
67cb25 |
znroot = sqrt(zn);
|
|
Packit |
67cb25 |
lamda = xnroot * (ynroot + znroot) + ynroot * znroot;
|
|
Packit |
67cb25 |
alfa = pn * (xnroot + ynroot + znroot) + xnroot * ynroot * znroot;
|
|
Packit |
67cb25 |
alfa = alfa * alfa;
|
|
Packit |
67cb25 |
beta = pn * (pn + lamda) * (pn + lamda);
|
|
Packit |
67cb25 |
rcstatus = gsl_sf_ellint_RC_e(alfa, beta, mode, &rcresult);
|
|
Packit |
67cb25 |
if(rcstatus != GSL_SUCCESS) {
|
|
Packit |
67cb25 |
result->val = 0.0;
|
|
Packit |
67cb25 |
result->err = 0.0;
|
|
Packit |
67cb25 |
return rcstatus;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
sigma += power4 * rcresult.val;
|
|
Packit |
67cb25 |
power4 *= 0.25;
|
|
Packit |
67cb25 |
xn = (xn + lamda) * 0.25;
|
|
Packit |
67cb25 |
yn = (yn + lamda) * 0.25;
|
|
Packit |
67cb25 |
zn = (zn + lamda) * 0.25;
|
|
Packit |
67cb25 |
pn = (pn + lamda) * 0.25;
|
|
Packit |
67cb25 |
n++;
|
|
Packit |
67cb25 |
if(n==nmax) {
|
|
Packit |
67cb25 |
MAXITER_ERROR (result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
ea = xndev * (yndev + zndev) + yndev * zndev;
|
|
Packit |
67cb25 |
eb = xndev * yndev * zndev;
|
|
Packit |
67cb25 |
ec = pndev * pndev;
|
|
Packit |
67cb25 |
e2 = ea - 3.0 * ec;
|
|
Packit |
67cb25 |
e3 = eb + 2.0 * pndev * (ea - ec);
|
|
Packit |
67cb25 |
s1 = 1.0 + e2 * (- c1 + 0.75 * c3 * e2 - 1.5 * c4 * e3);
|
|
Packit |
67cb25 |
s2 = eb * (0.5 * c2 + pndev * (- c3 - c3 + pndev * c4));
|
|
Packit |
67cb25 |
s3 = pndev * ea * (c2 - pndev * c3) - c2 * pndev * ec;
|
|
Packit |
67cb25 |
result->val = 3.0 * sigma + power4 * (s1 + s2 + s3) / (mu * sqrt(mu));
|
|
Packit |
67cb25 |
result->err = prec * fabs(result->val);
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* [Carlson, Numer. Math. 33 (1979) 1, (4.1)] */
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_F_e(double phi, double k, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* Angular reduction to -pi/2 < phi < pi/2 (we should really use an
|
|
Packit |
67cb25 |
exact reduction but this will have to do for now) BJG */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double nc = floor(phi/M_PI + 0.5);
|
|
Packit |
67cb25 |
double phi_red = phi - nc * M_PI;
|
|
Packit |
67cb25 |
phi = phi_red;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double sin_phi = sin(phi);
|
|
Packit |
67cb25 |
double sin2_phi = sin_phi*sin_phi;
|
|
Packit |
67cb25 |
double x = 1.0 - sin2_phi;
|
|
Packit |
67cb25 |
double y = 1.0 - k*k*sin2_phi;
|
|
Packit |
67cb25 |
gsl_sf_result rf;
|
|
Packit |
67cb25 |
int status = gsl_sf_ellint_RF_e(x, y, 1.0, mode, &rf);
|
|
Packit |
67cb25 |
result->val = sin_phi * rf.val;
|
|
Packit |
67cb25 |
result->err = GSL_DBL_EPSILON * fabs(result->val) + fabs(sin_phi*rf.err);
|
|
Packit |
67cb25 |
if (nc == 0) {
|
|
Packit |
67cb25 |
return status;
|
|
Packit |
67cb25 |
} else {
|
|
Packit |
67cb25 |
gsl_sf_result rk; /* add extra terms from periodicity */
|
|
Packit |
67cb25 |
const int rkstatus = gsl_sf_ellint_Kcomp_e(k, mode, &rk;;
|
|
Packit |
67cb25 |
result->val += 2*nc*rk.val;
|
|
Packit |
67cb25 |
result->err += 2*fabs(nc)*rk.err;
|
|
Packit |
67cb25 |
return GSL_ERROR_SELECT_2(status, rkstatus);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* [Carlson, Numer. Math. 33 (1979) 1, (4.2)] */
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_E_e(double phi, double k, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* Angular reduction to -pi/2 < phi < pi/2 (we should really use an
|
|
Packit |
67cb25 |
exact reduction but this will have to do for now) BJG */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double nc = floor(phi/M_PI + 0.5);
|
|
Packit |
67cb25 |
double phi_red = phi - nc * M_PI;
|
|
Packit |
67cb25 |
phi = phi_red;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const double sin_phi = sin(phi);
|
|
Packit |
67cb25 |
const double sin2_phi = sin_phi * sin_phi;
|
|
Packit |
67cb25 |
const double x = 1.0 - sin2_phi;
|
|
Packit |
67cb25 |
const double y = 1.0 - k*k*sin2_phi;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if(x < GSL_DBL_EPSILON) {
|
|
Packit |
67cb25 |
gsl_sf_result re;
|
|
Packit |
67cb25 |
const int status = gsl_sf_ellint_Ecomp_e(k, mode, &re);
|
|
Packit |
67cb25 |
/* could use A&S 17.4.14 to improve the value below */
|
|
Packit |
67cb25 |
result->val = 2*nc*re.val + GSL_SIGN(sin_phi) * re.val;
|
|
Packit |
67cb25 |
result->err = 2*fabs(nc)*re.err + re.err;
|
|
Packit |
67cb25 |
return status;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
gsl_sf_result rf, rd;
|
|
Packit |
67cb25 |
const double sin3_phi = sin2_phi * sin_phi;
|
|
Packit |
67cb25 |
const int rfstatus = gsl_sf_ellint_RF_e(x, y, 1.0, mode, &rf);
|
|
Packit |
67cb25 |
const int rdstatus = gsl_sf_ellint_RD_e(x, y, 1.0, mode, &rd);
|
|
Packit |
67cb25 |
result->val = sin_phi * rf.val - k*k/3.0 * sin3_phi * rd.val;
|
|
Packit |
67cb25 |
result->err = GSL_DBL_EPSILON * fabs(sin_phi * rf.val);
|
|
Packit |
67cb25 |
result->err += fabs(sin_phi*rf.err);
|
|
Packit |
67cb25 |
result->err += k*k/3.0 * GSL_DBL_EPSILON * fabs(sin3_phi * rd.val);
|
|
Packit |
67cb25 |
result->err += k*k/3.0 * fabs(sin3_phi*rd.err);
|
|
Packit |
67cb25 |
if (nc == 0) {
|
|
Packit |
67cb25 |
return GSL_ERROR_SELECT_2(rfstatus, rdstatus);
|
|
Packit |
67cb25 |
} else {
|
|
Packit |
67cb25 |
gsl_sf_result re; /* add extra terms from periodicity */
|
|
Packit |
67cb25 |
const int restatus = gsl_sf_ellint_Ecomp_e(k, mode, &re);
|
|
Packit |
67cb25 |
result->val += 2*nc*re.val;
|
|
Packit |
67cb25 |
result->err += 2*fabs(nc)*re.err;
|
|
Packit |
67cb25 |
return GSL_ERROR_SELECT_3(rfstatus, rdstatus, restatus);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* [Carlson, Numer. Math. 33 (1979) 1, (4.3)] */
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_P_e(double phi, double k, double n, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* Angular reduction to -pi/2 < phi < pi/2 (we should really use an
|
|
Packit |
67cb25 |
exact reduction but this will have to do for now) BJG */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double nc = floor(phi/M_PI + 0.5);
|
|
Packit |
67cb25 |
double phi_red = phi - nc * M_PI;
|
|
Packit |
67cb25 |
phi = phi_red;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* FIXME: need to handle the case of small x, as for E,F */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const double sin_phi = sin(phi);
|
|
Packit |
67cb25 |
const double sin2_phi = sin_phi * sin_phi;
|
|
Packit |
67cb25 |
const double sin3_phi = sin2_phi * sin_phi;
|
|
Packit |
67cb25 |
const double x = 1.0 - sin2_phi;
|
|
Packit |
67cb25 |
const double y = 1.0 - k*k*sin2_phi;
|
|
Packit |
67cb25 |
gsl_sf_result rf;
|
|
Packit |
67cb25 |
gsl_sf_result rj;
|
|
Packit |
67cb25 |
const int rfstatus = gsl_sf_ellint_RF_e(x, y, 1.0, mode, &rf);
|
|
Packit |
67cb25 |
const int rjstatus = gsl_sf_ellint_RJ_e(x, y, 1.0, 1.0 + n*sin2_phi, mode, &rj;;
|
|
Packit |
67cb25 |
result->val = sin_phi * rf.val - n/3.0*sin3_phi * rj.val;
|
|
Packit |
67cb25 |
result->err = GSL_DBL_EPSILON * fabs(sin_phi * rf.val);
|
|
Packit |
67cb25 |
result->err += fabs(sin_phi * rf.err);
|
|
Packit |
67cb25 |
result->err += n/3.0 * GSL_DBL_EPSILON * fabs(sin3_phi*rj.val);
|
|
Packit |
67cb25 |
result->err += n/3.0 * fabs(sin3_phi*rj.err);
|
|
Packit |
67cb25 |
if (nc == 0) {
|
|
Packit |
67cb25 |
return GSL_ERROR_SELECT_2(rfstatus, rjstatus);
|
|
Packit |
67cb25 |
} else {
|
|
Packit |
67cb25 |
gsl_sf_result rp; /* add extra terms from periodicity */
|
|
Packit |
67cb25 |
const int rpstatus = gsl_sf_ellint_Pcomp_e(k, n, mode, &rp);
|
|
Packit |
67cb25 |
result->val += 2*nc*rp.val;
|
|
Packit |
67cb25 |
result->err += 2*fabs(nc)*rp.err;
|
|
Packit |
67cb25 |
return GSL_ERROR_SELECT_3(rfstatus, rjstatus, rpstatus);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* [Carlson, Numer. Math. 33 (1979) 1, (4.4)] */
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_D_e(double phi, double k, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* Angular reduction to -pi/2 < phi < pi/2 (we should really use an
|
|
Packit |
67cb25 |
exact reduction but this will have to do for now) BJG */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double nc = floor(phi/M_PI + 0.5);
|
|
Packit |
67cb25 |
double phi_red = phi - nc * M_PI;
|
|
Packit |
67cb25 |
phi = phi_red;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* FIXME: need to handle the case of small x, as for E,F */
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const double sin_phi = sin(phi);
|
|
Packit |
67cb25 |
const double sin2_phi = sin_phi * sin_phi;
|
|
Packit |
67cb25 |
const double sin3_phi = sin2_phi * sin_phi;
|
|
Packit |
67cb25 |
const double x = 1.0 - sin2_phi;
|
|
Packit |
67cb25 |
const double y = 1.0 - k*k*sin2_phi;
|
|
Packit |
67cb25 |
gsl_sf_result rd;
|
|
Packit |
67cb25 |
const int status = gsl_sf_ellint_RD_e(x, y, 1.0, mode, &rd);
|
|
Packit |
67cb25 |
result->val = sin3_phi/3.0 * rd.val;
|
|
Packit |
67cb25 |
result->err = GSL_DBL_EPSILON * fabs(result->val) + fabs(sin3_phi/3.0 * rd.err);
|
|
Packit |
67cb25 |
if (nc == 0) {
|
|
Packit |
67cb25 |
return status;
|
|
Packit |
67cb25 |
} else {
|
|
Packit |
67cb25 |
gsl_sf_result rd; /* add extra terms from periodicity */
|
|
Packit |
67cb25 |
const int rdstatus = gsl_sf_ellint_Dcomp_e(k, mode, &rd);
|
|
Packit |
67cb25 |
result->val += 2*nc*rd.val;
|
|
Packit |
67cb25 |
result->err += 2*fabs(nc)*rd.err;
|
|
Packit |
67cb25 |
return GSL_ERROR_SELECT_2(status, rdstatus);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_Dcomp_e(double k, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
if(k*k >= 1.0) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
} else {
|
|
Packit |
67cb25 |
const double y = 1.0 - k*k; /* FIXME: still need to handle k~=~1 */
|
|
Packit |
67cb25 |
gsl_sf_result rd;
|
|
Packit |
67cb25 |
const int status = gsl_sf_ellint_RD_e(0.0, y, 1.0, mode, &rd);
|
|
Packit |
67cb25 |
result->val = (1.0/3.0) * rd.val;
|
|
Packit |
67cb25 |
result->err = GSL_DBL_EPSILON * fabs(result->val) + fabs(1.0/3.0 * rd.err);
|
|
Packit |
67cb25 |
return status;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* [Carlson, Numer. Math. 33 (1979) 1, (4.5)] */
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_Kcomp_e(double k, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
if(k*k >= 1.0) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(k*k >= 1.0 - GSL_SQRT_DBL_EPSILON) {
|
|
Packit |
67cb25 |
/* [Abramowitz+Stegun, 17.3.34] */
|
|
Packit |
67cb25 |
const double y = 1.0 - k*k;
|
|
Packit |
67cb25 |
const double a[] = { 1.38629436112, 0.09666344259, 0.03590092383 };
|
|
Packit |
67cb25 |
const double b[] = { 0.5, 0.12498593597, 0.06880248576 };
|
|
Packit |
67cb25 |
const double ta = a[0] + y*(a[1] + y*a[2]);
|
|
Packit |
67cb25 |
const double tb = -log(y) * (b[0] + y*(b[1] + y*b[2]));
|
|
Packit |
67cb25 |
result->val = ta + tb;
|
|
Packit |
67cb25 |
result->err = 2.0 * GSL_DBL_EPSILON * (fabs(result->val) + fabs(k/y));
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
/* This was previously computed as,
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return gsl_sf_ellint_RF_e(0.0, 1.0 - k*k, 1.0, mode, result);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
but this underestimated the total error for small k, since the
|
|
Packit |
67cb25 |
argument y=1-k^2 is not exact (there is an absolute error of
|
|
Packit |
67cb25 |
GSL_DBL_EPSILON near y=0 due to cancellation in the subtraction).
|
|
Packit |
67cb25 |
Taking the singular behavior of -log(y) above gives an error
|
|
Packit |
67cb25 |
of 0.5*epsilon/y near y=0. (BJG) */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double y = 1.0 - k*k;
|
|
Packit |
67cb25 |
int status = gsl_sf_ellint_RF_e(0.0, y, 1.0, mode, result);
|
|
Packit |
67cb25 |
result->err += 0.5 * GSL_DBL_EPSILON / y;
|
|
Packit |
67cb25 |
return status ;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* [Carlson, Numer. Math. 33 (1979) 1, (4.6)] */
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_Ecomp_e(double k, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
if(k*k >= 1.0) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else if(k*k >= 1.0 - GSL_SQRT_DBL_EPSILON) {
|
|
Packit |
67cb25 |
/* [Abramowitz+Stegun, 17.3.36] */
|
|
Packit |
67cb25 |
const double y = 1.0 - k*k;
|
|
Packit |
67cb25 |
const double a[] = { 0.44325141463, 0.06260601220, 0.04757383546 };
|
|
Packit |
67cb25 |
const double b[] = { 0.24998368310, 0.09200180037, 0.04069697526 };
|
|
Packit |
67cb25 |
const double ta = 1.0 + y*(a[0] + y*(a[1] + a[2]*y));
|
|
Packit |
67cb25 |
const double tb = -y*log(y) * (b[0] + y*(b[1] + b[2]*y));
|
|
Packit |
67cb25 |
result->val = ta + tb;
|
|
Packit |
67cb25 |
result->err = 2.0 * GSL_DBL_EPSILON * result->val;
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
gsl_sf_result rf;
|
|
Packit |
67cb25 |
gsl_sf_result rd;
|
|
Packit |
67cb25 |
const double y = 1.0 - k*k;
|
|
Packit |
67cb25 |
const int rfstatus = gsl_sf_ellint_RF_e(0.0, y, 1.0, mode, &rf);
|
|
Packit |
67cb25 |
const int rdstatus = gsl_sf_ellint_RD_e(0.0, y, 1.0, mode, &rd);
|
|
Packit |
67cb25 |
result->val = rf.val - k*k/3.0 * rd.val;
|
|
Packit |
67cb25 |
result->err = rf.err + k*k/3.0 * rd.err;
|
|
Packit |
67cb25 |
return GSL_ERROR_SELECT_2(rfstatus, rdstatus);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* [Carlson, Numer. Math. 33 (1979) 1, (4.3) phi=pi/2] */
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sf_ellint_Pcomp_e(double k, double n, gsl_mode_t mode, gsl_sf_result * result)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
if(k*k >= 1.0) {
|
|
Packit |
67cb25 |
DOMAIN_ERROR(result);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
/* FIXME: need to handle k ~=~ 1 cancellations */
|
|
Packit |
67cb25 |
else {
|
|
Packit |
67cb25 |
gsl_sf_result rf;
|
|
Packit |
67cb25 |
gsl_sf_result rj;
|
|
Packit |
67cb25 |
const double y = 1.0 - k*k;
|
|
Packit |
67cb25 |
const int rfstatus = gsl_sf_ellint_RF_e(0.0, y, 1.0, mode, &rf);
|
|
Packit |
67cb25 |
const int rjstatus = gsl_sf_ellint_RJ_e(0.0, y, 1.0, 1.0 + n, mode, &rj;;
|
|
Packit |
67cb25 |
result->val = rf.val - (n/3.0) * rj.val;
|
|
Packit |
67cb25 |
result->err = rf.err + fabs(n/3.0) * rj.err;
|
|
Packit |
67cb25 |
return GSL_ERROR_SELECT_2(rfstatus, rjstatus);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#include "eval.h"
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_Kcomp(double k, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_Kcomp_e(k, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_Ecomp(double k, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_Ecomp_e(k, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_Pcomp(double k, double n, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_Pcomp_e(k, n, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_Dcomp(double k, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_Dcomp_e(k, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_F(double phi, double k, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_F_e(phi, k, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_E(double phi, double k, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_E_e(phi, k, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_P(double phi, double k, double n, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_P_e(phi, k, n, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_D(double phi, double k, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_D_e(phi, k, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_RC(double x, double y, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_RC_e(x, y, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_RD(double x, double y, double z, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_RD_e(x, y, z, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_RF(double x, double y, double z, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_RF_e(x, y, z, mode, &result));
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double gsl_sf_ellint_RJ(double x, double y, double z, double p, gsl_mode_t mode)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
EVAL_RESULT(gsl_sf_ellint_RJ_e(x, y, z, p, mode, &result));
|
|
Packit |
67cb25 |
}
|