26 std::vector<double>& bl)
30 if (cl.size() != 2 *
m_Np) {
35 if (bl.size() !=
m_Np) {
40 for (
int i = 0; i < 2 *
m_Np; ++i) {
44 for (
int i = 0; i <
m_Np; ++i) {
77 for (
int l = 0; l <
m_Np; l++) {
78 x2R +=
m_bl[l] / (x * x +
m_cl[2 * l]);
80 x2R = x2R * (x * x +
m_cl[2 * m_Np - 1]);
99 double rk = sqrt(1.0 - 1.0 / (bmax * bmax));
100 double emmc = 1.0 - rk * rk;
109 for (
int i_prec = 0; i_prec < Nprec + 1; i_prec++) {
112 for (
int i = 0; i < 20; i++) {
116 if (cn < 0.0)
goto succeeded;
132 double FK = UK / (2.0 *
m_Np + 1.0);
134 for (
int l = 0; l < 2 *
m_Np; l++) {
137 m_cl[l] = sn * sn / (1.0 - sn * sn);
142 for (
int l = 0; l <
m_Np; l++) {
143 d0 = d0 * (1.0 +
m_cl[2 * l]) / (1.0 +
m_cl[2 * l + 1]);
146 for (
int l = 0; l <
m_Np; l++) {
148 for (
int i = 0; i <
m_Np; i++) {
156 double Dx = (bmax - 1.0) / Nj;
161 for (
int jx = 0; jx <= Nj; jx++) {
162 double x = 1.0 + Dx * jx;
163 double sgnx =
sign(x);
164 if (fabs(sgnx) > d1) d1 = sgnx;
165 if (fabs(sgnx) < d2) d2 = sgnx;
188 double dmax = d1 - 1.0;
189 if (dmax < 1.0 - d2) dmax = 1.0 - d2;
196 double& sn,
double& cn,
double& dn)
208 const double epsilon = DBL_EPSILON;
214 if (abs(emmc) > 1.0) {
216 vout.
crucial(
"parameter m = %f must be smaller then 1.\n", emmc);
218 }
else if (abs(emmc) < 2.0 * epsilon) {
222 }
else if (abs(emmc - 1) < 2.0 * epsilon) {
233 nu[0] = sqrt(1.0 - emmc);
235 while (abs(mu[n] - nu[n]) > epsilon * abs(mu[n] + nu[n]))
237 mu[n + 1] = 0.5 * (mu[n] + nu[n]);
238 nu[n + 1] = sqrt(mu[n] * nu[n]);
246 double sin_umu = sin(uu * mu[n]);
247 double cos_umu = cos(uu * mu[n]);
251 if (abs(sin_umu < cos_umu)) {
252 double cot = sin_umu / cos_umu;
253 double cs = mu[n] * cot;
259 double r = cs * cs / mu[n + 1];
261 dn = (r + nu[n]) / (r + mu[n]);
264 double sqrtm1 = sqrt(1.0 - emmc);
267 cn = dn * (cos_umu > 0 ? 1 : -1) / sqrt(1 + cs * cs);
268 sn = cn * cs / sqrtm1;
270 double cot = cos_umu / sin_umu;
271 double cs = mu[n] * cot;
277 double r = cs * cs / mu[n + 1];
279 dn = (r + nu[n]) / (r + mu[n]);
282 sn = (sin_umu > 0 ? 1 : -1) / sqrt(1 + cs * cs);
void detailed(const char *format,...)
void get_sign_parameters(std::vector< double > &cl, std::vector< double > &bl)
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)
Bridge::VerboseLevel m_vl
static const std::string class_name
std::vector< double > m_bl
void crucial(const char *format,...)
std::vector< double > m_cl