23 std::valarray<double>& bl)
27 if (cl.size() != 2 *
m_Np) {
32 if (bl.size() !=
m_Np) {
37 for (
int i = 0; i < 2 *
m_Np; ++i) {
41 for (
int i = 0; i <
m_Np; ++i) {
74 for (
int l = 0; l <
m_Np; l++) {
75 x2R +=
m_bl[l] / (x * x +
m_cl[2 * l]);
77 x2R = x2R * (x * x +
m_cl[2 * m_Np - 1]);
96 double rk = sqrt(1.0 - 1.0 / (bmax * bmax));
97 double emmc = 1.0 - rk * rk;
106 for (
int i_prec = 0; i_prec < Nprec + 1; i_prec++) {
109 for (
int i = 0; i < 20; i++) {
113 if (cn < 0.0)
goto succeeded;
129 double FK = UK / (2.0 *
m_Np + 1.0);
131 for (
int l = 0; l < 2 *
m_Np; l++) {
134 m_cl[l] = sn * sn / (1.0 - sn * sn);
139 for (
int l = 0; l <
m_Np; l++) {
140 d0 = d0 * (1.0 +
m_cl[2 * l]) / (1.0 +
m_cl[2 * l + 1]);
143 for (
int l = 0; l <
m_Np; l++) {
145 for (
int i = 0; i <
m_Np; i++) {
153 double Dx = (bmax - 1.0) / Nj;
158 for (
int jx = 0; jx <= Nj; jx++) {
159 double x = 1.0 + Dx * jx;
160 double sgnx =
sign(x);
161 if (fabs(sgnx) > d1) d1 = sgnx;
162 if (fabs(sgnx) < d2) d2 = sgnx;
185 double dmax = d1 - 1.0;
186 if (dmax < 1.0 - d2) dmax = 1.0 - d2;
193 double& sn,
double& cn,
double& dn)
205 const double epsilon = DBL_EPSILON;
211 if (abs(emmc) > 1.0) {
213 vout.
crucial(
"parameter m = %f must be smaller then 1.\n", emmc);
215 }
else if (abs(emmc) < 2.0 * epsilon) {
219 }
else if (abs(emmc - 1) < 2.0 * epsilon) {
230 nu[0] = sqrt(1.0 - emmc);
232 while (abs(mu[n] - nu[n]) > epsilon * abs(mu[n] + nu[n]))
234 mu[n + 1] = 0.5 * (mu[n] + nu[n]);
235 nu[n + 1] = sqrt(mu[n] * nu[n]);
243 double sin_umu = sin(uu * mu[n]);
244 double cos_umu = cos(uu * mu[n]);
248 if (abs(sin_umu < cos_umu)) {
249 double cot = sin_umu / cos_umu;
250 double cs = mu[n] * cot;
256 double r = cs * cs / mu[n + 1];
258 dn = (r + nu[n]) / (r + mu[n]);
261 double sqrtm1 = sqrt(1.0 - emmc);
264 cn = dn * (cos_umu > 0 ? 1 : -1) / sqrt(1 + cs * cs);
265 sn = cn * cs / sqrtm1;
267 double cot = cos_umu / sin_umu;
268 double cs = mu[n] * cot;
274 double r = cs * cs / mu[n + 1];
276 dn = (r + nu[n]) / (r + mu[n]);
279 sn = (sin_umu > 0 ? 1 : -1) / sqrt(1 + cs * cs);