summaryrefslogtreecommitdiff
path: root/Dragon/src/XDRKIN.f
blob: 4608e41ff8e027a7521153d0f928d700a9d44f27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
*DECK XDRKIN
      SUBROUTINE XDRKIN(DX,NBX,MLOG,BIV,PASV,XLIMV)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Construct Bickley tables for KI1(X), KI2(X), KI3(X), KI4(X), KI5(X),
* taking into account logarithmic singularities for KI1(X) and KI2(X).
*
*Copyright:
* Copyright (C) 2002 Ecole Polytechnique de Montreal
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version
*
*Author(s): R. Roy
*
*Parameters: input
* DX      step for tables (here, DX=0.02d0).
* NBX     nb element in tables (here, NBX=600).
* MLOG    interval for logarithmic singularities (suggested values:
*         MLOG(1)=30, MLOG(2)=15, MLOG(3)= 0, MLOG(4)= 0, MLOG(5)= 0).
*
*Parameters: output
* BIV     elements of quadratic BICKLEY table.
* PASV    step quadratic of BICKLEY table.
* XLMV    upper limit of quadratic BICKLEY table.
*
*-----------------------------------------------------------------------
*
      IMPLICIT NONE
***** CALLS:    *AKIN10* ROUTINE FOR ACCURATE KIN(X) BICKLEY VALUES
*               *AK0BES* ROUTINE FOR ACCURATE K0(X)   BESSEL VALUES
*               *AK1BES* ROUTINE FOR ACCURATE K1(X)   BESSEL VALUES
*----
*  SUBROUTINE ARGUMENTS
*----
      DOUBLE PRECISION DX
      INTEGER NBX,MLOG(5)
      REAL BIV(0:NBX,3,5),PASV(5),XLIMV(5)
*----
*  LOCAL VARIABLES
*----
      INTEGER  I,KI,IORD
      DOUBLE PRECISION X, AKIN(-1:10), AK0BES, AK1BES
      DOUBLE PRECISION GAMMA, PIO2, PAS, XLIM
      DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: C0, C1, C2
      PARAMETER ( GAMMA=0.57721566490153D0,
     >            PIO2= 1.57079632679490D0 )
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(C0(5,0:NBX), C1(5,0:NBX), C2(5,0:NBX))
*
      IF( MLOG(3).GT.0.OR.MLOG(4).GT.0.OR.MLOG(5).GT.0 )GOTO 99
*
      IF( NBX .NE.   600 )GOTO 97
      IF( DX  .NE.0.02D0 )GOTO 98
      PAS=   1.0D0/DX
      XLIM=  DBLE(NBX)*DX
      DO 10 I=1,5
      XLIMV(I)=REAL(XLIM)
      PASV(I)=REAL(PAS)
   10 CONTINUE
*----
*  FIRST, WE CONSTRUCT THE TABLES USING ACCURATE *AKIN10* VALUES
*----
      X= 0.D0
      CALL AKIN10(X,AKIN(1))
      AKIN( 0)= 0.D0
      AKIN(-1)= 0.D0
      DO 30 I= 0, NBX-1
         DO 20 KI= 1, 5
            C2(KI,I)=   0.5D0 * AKIN(KI-2)
            C1(KI,I)= -(AKIN(KI-1)+X*AKIN(KI-2))
            C0(KI,I)=   AKIN(KI)+X*(AKIN(KI-1)+X*C2(KI,I))
   20    CONTINUE
         X= X + DX
         CALL AKIN10(X,AKIN(1))
         AKIN( 0)= AK0BES(X)
         AKIN(-1)= AK1BES(X)
   30 CONTINUE
      DO 40 KI= 1, 5
         C0(KI,NBX)= 0.D0
         C1(KI,NBX)= 0.D0
         C2(KI,NBX)= 0.D0
   40 CONTINUE
*----
*  KI1(X) ADJUSTMENTS
*----
      X= 0.D0
      DO 50 I= 1, MLOG(1)-1
         X= X + DX
         C0(1,I)= C0(1,I) + 0.5D0*X
         C1(1,I)= C1(1,I) - LOG(X)
         C2(1,I)= C2(1,I) - 0.5D0/X
   50 CONTINUE
*
      C1(1,0)= GAMMA-(LOG(2.D0)+1.D0)
*----
*  KI2(X) ADJUSTMENTS
*----
      X= 0.D0
      DO 60 I= 1, MLOG(2)-1
         X= X + DX
         C0(2,I)= C0(2,I) + 0.25D0*X*X
         C1(2,I)= C1(2,I) - X
         C2(2,I)= C2(2,I) + 0.5D0*LOG(X) +0.75D0
   60 CONTINUE
*
      C1(2,0)=  -PIO2
      C2(2,0)=   0.5D0*(LOG(2.D0)+1.5D0-GAMMA)
*----
*  OUTPUT VALUES
*----
      DO 80 I= 0, NBX
        DO 70 IORD=1,5
          BIV(I,1,IORD)= REAL(C0(IORD,I))
          BIV(I,2,IORD)= REAL(C1(IORD,I))
          BIV(I,3,IORD)= REAL(C2(IORD,I))
   70   CONTINUE
   80 CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(C2, C1, C0)
      RETURN
*----
*  ERROR SECTION
*----
   97 CALL XABORT('XDRKIN: KIN TABLES HAVE MORE THAN 600 ELEMENTS')
   98 CALL XABORT('XDRKIN: KIN TABLES HAVE A STEP OF 0.02')
   99 CALL XABORT('XDRKIN: NO LOG SINGULARITY TAKEN FOR KI345')
      END