]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MINICERN/mathlib/gen/v/rvnspc64.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / MINICERN / mathlib / gen / v / rvnspc64.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1996/04/01 15:02:58 mclareni
6* Mathlib gen
7*
8*
9#include "gen/pilot.h"
10#if defined(CERNLIB_DOUBLE)
11 FUNCTION DVNSPC(R,RHO,D)
12C
13#include "gen/imp64.inc"
14C
15 CHARACTER*(*) NAME
16 PARAMETER(NAME='DVNSPC')
17#endif
18#if !defined(CERNLIB_DOUBLE)
19 FUNCTION RVNSPC(R,RHO,D)
20C
21 CHARACTER*(*) NAME
22 PARAMETER(NAME='RVNSPC')
23#endif
24C
25C Based on
26C F. LAMARCHE and C. LEROY, Evaluation of the volume of
27C a sphere with a cylinder by elliptic integrals,
28C Computer Phys. Comm. 59 (1990) 359-369
29C
30 PARAMETER (Z1 = 1)
31 PARAMETER (C1 = 4*Z1/3, C2 = 2*Z1/3, C3 = 4*Z1/9, C4 = Z1/3)
32 PARAMETER (PI = 3.14159 26535 89793 24D0)
33 PARAMETER (SF = 4*PI/3, SFH = 2*PI/3, C0 = 2*PI/3-8*Z1/9)
34
35 RS=ABS(R)
36 RC=ABS(RHO)
37 DA=ABS(D)
38 DR=RS-RC
39 RS2=RS**2
40 RS3=RS2*RS
41 IF(RC .EQ. 0 .OR. RS .EQ. 0 .OR. DA .GE. RS+RC) THEN
42 V=0
43 ELSEIF(DR .LE. DA .AND. DA .LE. -DR) THEN
44 V=SF*RS3
45 ELSEIF(DA .EQ. RC .AND. RS .EQ. 2*DA) THEN
46 V=C0*RS3
47 ELSEIF(DA .EQ. 0) THEN
48 V=RS3
49 IF(RS .GT. RC) V=V-SQRT(RS2-RC**2)**3
50 V=SF*V
51 ELSE
52 BP=DA+RC
53 BM=DA-RC
54 BP2=BP**2
55 A=MAX(RS2,BP2)
56 B=MIN(RS2,BP2)
57 C=BM**2
58 AB=A-B
59 AC=A-C
60 BC=B-C
61 S=BP*BM
62 XK2=BC/AC
63 XK=SQRT(XK2)
64 IF(DA .LT. DR) THEN
65 IF(C .EQ. 0) THEN
66#if defined(CERNLIB_DOUBLE)
67 V=SFH*RS3+C3*SQRT(A)*(AB*DELIKC(XK)-2*(A+AB)*DELIEC(XK))
68 ELSE
69 V=C1*(DELI3C(SQRT(1-XK2),XK2,B/C)*A**2*S/C
70 1 -DELIKC(XK)*(A*S-C4*AB*AC)
71 2 -DELIEC(XK)*AC*(S+C2*(AB+AC)))/SQRT(AC)
72#endif
73#if !defined(CERNLIB_DOUBLE)
74 V=SFH*RS3+C3*SQRT(A)*(AB*RELIKC(XK)-2*(A+AB)*RELIEC(XK))
75 ELSE
76 V=C1*(RELI3C(SQRT(1-XK2),XK2,B/C)*A**2*S/C
77 1 -RELIKC(XK)*(A*S-C4*AB*AC)
78 2 -RELIEC(XK)*AC*(S+C2*(AB+AC)))/SQRT(AC)
79#endif
80 IF(RC .GT. DA) V=V+SF*RS3
81 ENDIF
82 ELSEIF(DA .EQ. DR) THEN
83 V=C1*(RS3*ATAN2(2*SQRT(DA*RC),BM)-SQRT(AC)*(S+C2*AC))
84 ELSE
85 IF(C .EQ. 0) THEN
86#if defined(CERNLIB_DOUBLE)
87 V=SFH*RS3+C3*(AB*(B-2*AB)*DELIKC(XK)+2*A*(AB-B)*DELIEC(XK))/
88 1 SQRT(A)
89 ELSE
90 V=C1*(DELI3C(SQRT(1-XK2),XK2,B/C)*B**2*S/C
91 1 +DELIKC(XK)*(S*(AB-B)+C4*AB*(BC-2*AB))
92 2 -DELIEC(XK)*AC*(S-C2*(AB-BC)))/SQRT(AC)
93#endif
94#if !defined(CERNLIB_DOUBLE)
95 V=SFH*RS3+C3*(AB*(B-2*AB)*RELIKC(XK)+2*A*(AB-B)*RELIEC(XK))/
96 1 SQRT(A)
97 ELSE
98 V=C1*(RELI3C(SQRT(1-XK2),XK2,B/C)*B**2*S/C
99 1 +RELIKC(XK)*(S*(AB-B)+C4*AB*(BC-2*AB))
100 2 -RELIEC(XK)*AC*(S-C2*(AB-BC)))/SQRT(AC)
101#endif
102 IF(RC .GT. DA) V=V+SF*RS3
103 ENDIF
104 ENDIF
105 ENDIF
106#if defined(CERNLIB_DOUBLE)
107 DVNSPC=V
108#endif
109#if !defined(CERNLIB_DOUBLE)
110 RVNSPC=V
111#endif
112 RETURN
113 END