|
|
1.1 root 1: #
2: /* elliptic integral routine, R.Bulirsch,
3: * Numerische Mathematik 7(1965) 78-90
4: * calculate integral from 0 to x+iy of
5: * (a+b*t^2)/((1+t^2)*sqrt((1+t^2)*(1+kc^2*t^2)))
6: * yields about D valid figures, where CC=10e-D
7: * for a*b>=0, except at branchpoints x=0,y=+_i,+_i/kc;
8: * there the accuracy may be reduced.
9: * fails for kc=0 or x<0
10: * return(1) for success, return(0) for fail
11: *
12: * special case a=b=1 is equivalent to
13: * standard elliptic integral of first kind
14: * from 0 to atan(x+iy) of
15: * 1/sqrt(1-k^2*(sin(t))^2) where k^2=1-kc^2
16: */
17:
18: #define ROOTINF 10.e18
19: #define PI 3.1415926535897932
20: #define CC 1.e-6
21:
22: double fabs(), log(), sqrt(), atan2();
23:
24: elco2(x,y,kc,a,b,u,v)
25: double x,y,kc,a,b;
26: float *u, *v;
27: {
28: double c,d,dn1,dn2,e,e1,e2,f,f1,f2,h,k,m,m1,m2,sy;
29: double d1[13],d2[13];
30: int i,l;
31: if(kc==0||x<0)
32: return(0);
33: sy = y>0? 1: y==0? 0: -1;
34: y = fabs(y);
35: csq(x,y,&c,&e2);
36: d = kc*kc;
37: k = 1-d;
38: e1 = 1+c;
39: cdiv2(1+d*c,d*e2,e1,e2,&f1,&f2);
40: f2 = -k*x*y*2/f2;
41: csqr(f1,f2,&dn1,&dn2);
42: if(f1<0) {
43: f1 = dn1;
44: dn1 = -dn2;
45: dn2 = -f1;
46: }
47: if(k<0) {
48: dn1 = fabs(dn1);
49: dn2 = fabs(dn2);
50: }
51: c = 1+dn1;
52: cmul(e1,e2,c,dn2,&f1,&f2);
53: cdiv(x,y,f1,f2,&d1[0],&d2[0]);
54: h = a-b;
55: d = f = m = 1;
56: kc = fabs(kc);
57: e = a;
58: a += b;
59: l = 4;
60: for(i=1;;i++) {
61: m1 = (kc+m)/2;
62: m2 = m1*m1;
63: k *= f/(m2*4);
64: b += e*kc;
65: e = a;
66: cdiv2(kc+m*dn1,m*dn2,c,dn2,&f1,&f2);
67: csqr(f1/m1,k*dn2*2/f2,&dn1,&dn2);
68: cmul(dn1,dn2,x,y,&f1,&f2);
69: x = fabs(f1);
70: y = fabs(f2);
71: a += b/m1;
72: l *= 2;
73: c = 1 +dn1;
74: d *= k/2;
75: cmul(x,y,x,y,&e1,&e2);
76: k *= k;
77:
78: cmul(c,dn2,1+e1*m2,e2*m2,&f1,&f2);
79: cdiv(d*x,d*y,f1,f2,&d1[i],&d2[i]);
80: if(k<=CC)
81: break;
82: kc = sqrt(m*kc);
83: f = m2;
84: m = m1;
85: }
86: f1 = f2 = 0;
87: for(;i>=0;i--) {
88: f1 += d1[i];
89: f2 += d2[i];
90: }
91: x *= m1;
92: y *= m1;
93: cdiv2(1-y,x,1+y,-x,&e1,&e2);
94: e2 = x*2/e2;
95: d = a/(m1*l);
96: *u = atan2(e2,e1);
97: if(*u<0)
98: *u += PI;
99: a = d*sy/2;
100: *u = d*(*u) + f1*h;
101: *v = (-1-log(e1*e1+e2*e2))*a + f2*h*sy + a;
102: return(1);
103: }
104:
105: cdiv2(c1,c2,d1,d2,e1,e2)
106: double c1,c2,d1,d2;
107: double *e1,*e2;
108: {
109: double t;
110: if(fabs(d2)>fabs(d1)) {
111: t = d1, d1 = d2, d2 = t;
112: t = c1, c1 = c2, c2 = t;
113: }
114: if(fabs(d1)>ROOTINF)
115: *e2 = ROOTINF*ROOTINF;
116: else
117: *e2 = d1*d1 + d2*d2;
118: t = d2/d1;
119: *e1 = (c1+t*c2)/(d1+t*d2); /* (c1*d1+c2*d2)/(d1*d1+d2*d2) */
120: }
121:
122: /* complex square root of |x|+iy */
123: csqr(c1,c2,e1,e2)
124: double c1,c2;
125: double *e1,*e2;
126: {
127: double r2;
128: r2 = c1*c1 + c2*c2;
129: if(r2<=0) {
130: *e1 = *e2 = 0;
131: return;
132: }
133: *e1 = sqrt((sqrt(r2) + fabs(c1))/2);
134: *e2 = c2/(*e1*2);
135: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.