]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MINICERN/mathlib/gen/c/reli264.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / MINICERN / mathlib / gen / c / reli264.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1996/04/01 15:02:11 mclareni
6* Mathlib gen
7*
8*
9#include "gen/pilot.h"
10#if defined(CERNLIB_DOUBLE)
11 FUNCTION DELI2(X,AKP,A,B,MODE)
12C
13#include "gen/imp64.inc"
14C
15 CHARACTER*(*) NAME
16 PARAMETER(NAME='RELI2/DELI2')
17#endif
18#if !defined(CERNLIB_DOUBLE)
19 FUNCTION RELI2(X,AKP,A,B,MODE)
20C
21 CHARACTER*(*) NAME
22 PARAMETER(NAME='RELI2')
23#endif
24C
25C Translation of Algol procedure el2(x,kc,a,b) in
26C R. BULIRSCH Numerical Calculation of Elliptic Integrals and
27C Elliptic Functions, Numer. Math. 7 (1965) 78-90,
28C extended for (k sub c)**2 < 0 (MODE = -1)
29C
30 PARAMETER (ID = 16)
31 PARAMETER (PI = 3.14159 26535 89793 24D0)
32 PARAMETER (Z1 = 1, Z10 = 10, HF = Z1/2)
33 PARAMETER (CA = Z10**(-ID/2), CB = Z10**(-(ID+2)))
34
35 CHARACTER*80 ERRTXT
36
37 IF(X .EQ. 0 .OR. AKP .EQ. 0) THEN
38#if defined(CERNLIB_DOUBLE)
39 H=B*DASINH(X)+(A-B)*X/SQRT(1+X**2)
40#endif
41#if !defined(CERNLIB_DOUBLE)
42 H=B*ASINH(X)+(A-B)*X/SQRT(1+X**2)
43#endif
44 ELSE
45 IF(MODE .EQ. 1) THEN
46 XX=X
47 BKP=AKP
48 AA=A
49 BB=B
50 ELSEIF(MODE .EQ. -1) THEN
51 W=1-(AKP*X)**2
52 IF(W .GT. 0) THEN
53 W1=1/SQRT(1+AKP**2)
54 XX=X/(W1*SQRT(W))
55 BKP=AKP*W1
56 AA=A*W1
57 BB=(B+A*AKP**2)*W1**3
58 ELSE
59 H=0
60 WRITE(ERRTXT,101) X,AKP
61 CALL MTLPRT(NAME,'C346.1',ERRTXT)
62 GO TO 9
63 ENDIF
64 ELSE
65 H=0
66 WRITE(ERRTXT,102) MODE
67 CALL MTLPRT(NAME,'C346.2',ERRTXT)
68 GO TO 9
69 ENDIF
70 C=XX**2
71 D=1+C
72 PP=SQRT((1+BKP**2*C)/D)
73 D=XX/D
74 C=D/(2*PP)
75 Z=AA-BB
76 XI=AA
77 AA=HF*(AA+BB)
78 Y=ABS(1/XX)
79 F=0
80 L=0
81 XM=1
82 YKP=ABS(BKP)
83 1 BB=XI*YKP+BB
84 E=XM*YKP
85 G=E/PP
86 D=F*G+D
87 F=C
88 XI=AA
89 PP=G+PP
90 C=HF*(D/PP+C)
91 G=XM
92 XM=YKP+XM
93 AA=HF*(BB/XM+AA)
94 Y=Y-E/Y
95 IF(Y .EQ. 0) Y=SQRT(E)*CB
96 IF(ABS(G-YKP) .GT. CA*G) THEN
97 YKP=2*SQRT(E)
98 L=2*L
99 IF(Y .LT. 0) L=L+1
100 GO TO 1
101 ENDIF
102 IF(Y .LT. 0) L=L+1
103 E=(ATAN(XM/Y)+PI*L)*AA/XM
104 IF(XX .LT. 0) E=-E
105 H=E+C*Z
106 ENDIF
107#if defined(CERNLIB_DOUBLE)
108 9 DELI2=H
109#endif
110#if !defined(CERNLIB_DOUBLE)
111 9 RELI2=H
112#endif
113 RETURN
114 101 FORMAT('X = ',1P,D15.8,' AKP = ',D15.8,' ILLEGAL',
115 1 '[(AKP * X)**2 >= 1]')
116 102 FORMAT('MODE = ',I5,' ILLEGAL')
117 END