25 std::valarray<double>& bl)
29 if (cl.size() != 2 *
m_Np) {
34 if (bl.size() !=
m_Np) {
39 for (
int i = 0; i < 2 *
m_Np; ++i) {
43 for (
int i = 0; i <
m_Np; ++i) {
76 for (
int l = 0; l <
m_Np; l++) {
77 x2R +=
m_bl[l] / (x * x +
m_cl[2 * l]);
79 x2R = x2R * (x * x +
m_cl[2 * m_Np - 1]);
98 double rk = sqrt(1.0 - 1.0 / (bmax * bmax));
99 double emmc = 1.0 - rk * rk;
108 for (
int i_prec = 0; i_prec < Nprec + 1; i_prec++) {
111 for (
int i = 0; i < 20; i++) {
115 if (cn < 0.0)
goto succeeded;
131 double FK = UK / (2.0 *
m_Np + 1.0);
133 for (
int l = 0; l < 2 *
m_Np; l++) {
136 m_cl[l] = sn * sn / (1.0 - sn * sn);
141 for (
int l = 0; l <
m_Np; l++) {
142 d0 = d0 * (1.0 +
m_cl[2 * l]) / (1.0 +
m_cl[2 * l + 1]);
145 for (
int l = 0; l <
m_Np; l++) {
147 for (
int i = 0; i <
m_Np; i++) {
155 double Dx = (bmax - 1.0) / Nj;
160 for (
int jx = 0; jx <= Nj; jx++) {
161 double x = 1.0 + Dx * jx;
162 double sgnx =
sign(x);
163 if (fabs(sgnx) > d1) d1 = sgnx;
164 if (fabs(sgnx) < d2) d2 = sgnx;
187 double dmax = d1 - 1.0;
188 if (dmax < 1.0 - d2) dmax = 1.0 - d2;
195 double& sn,
double& cn,
double& dn)
207 const double epsilon = DBL_EPSILON;
213 if (abs(emmc) > 1.0) {
215 vout.
crucial(
"parameter m = %f must be smaller then 1.\n", emmc);
217 }
else if (abs(emmc) < 2.0 * epsilon) {
221 }
else if (abs(emmc - 1) < 2.0 * epsilon) {
232 nu[0] = sqrt(1.0 - emmc);
234 while (abs(mu[n] - nu[n]) > epsilon * abs(mu[n] + nu[n]))
236 mu[n + 1] = 0.5 * (mu[n] + nu[n]);
237 nu[n + 1] = sqrt(mu[n] * nu[n]);
245 double sin_umu = sin(uu * mu[n]);
246 double cos_umu = cos(uu * mu[n]);
250 if (abs(sin_umu < cos_umu)) {
251 double cot = sin_umu / cos_umu;
252 double cs = mu[n] * cot;
258 double r = cs * cs / mu[n + 1];
260 dn = (r + nu[n]) / (r + mu[n]);
263 double sqrtm1 = sqrt(1.0 - emmc);
266 cn = dn * (cos_umu > 0 ? 1 : -1) / sqrt(1 + cs * cs);
267 sn = cn * cs / sqrtm1;
269 double cot = cos_umu / sin_umu;
270 double cs = mu[n] * cot;
276 double r = cs * cs / mu[n + 1];
278 dn = (r + nu[n]) / (r + mu[n]);
281 sn = (sin_umu > 0 ? 1 : -1) / sqrt(1 + cs * cs);
void detailed(const char *format,...)
void set_sign_parameters()
void general(const char *format,...)
void poly_Zolotarev(double bmax, double &UK)
void Jacobi_elliptic(double uu, double emmc, double &sn, double &cn, double &dn)
std::valarray< double > m_bl
Bridge::VerboseLevel m_vl
static const std::string class_name
void crucial(const char *format,...)
void get_sign_parameters(std::valarray< double > &cl, std::valarray< double > &bl)
std::valarray< double > m_cl