LCOV - code coverage report
Current view: top level - shared/common/src/28_numeric_noabirule - m_bessel.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 10.9 % 238 26
Test Date: 2026-11-08 02:25:56 Functions: 25.0 % 4 1
Branches: 9.8 % 122 12

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_bessel
       2                 :             : !! NAME
       3                 :             : !! m_bessel
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !! Bessel functions
       7                 :             : !!
       8                 :             : !! COPYRIGHT
       9                 :             : !!  Copyright (C) 2008-2026 ABINIT group (MG)
      10                 :             : !!  This file is distributed under the terms of the
      11                 :             : !!  GNU General Public License, see ~abinit/COPYING
      12                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
      13                 :             : !!
      14                 :             : !! SOURCE
      15                 :             : 
      16                 :             : #if defined HAVE_CONFIG_H
      17                 :             : #include "config.h"
      18                 :             : #endif
      19                 :             : 
      20                 :             : #include "abi_common.h"
      21                 :             : 
      22                 :             : module m_bessel
      23                 :             : 
      24                 :             :  implicit none
      25                 :             : 
      26                 :             :  private
      27                 :             : 
      28                 :             :  public :: CALJY0
      29                 :             :  public :: CALJY1
      30                 :             :  public :: CALCK0
      31                 :             :  public :: CALCK1
      32                 :             : 
      33                 :             : contains
      34                 :             : !!***
      35                 :             : 
      36                 :           0 : SUBROUTINE CALJY0(ARG,RESULT,JINT)
      37                 :             : 
      38                 :             : !---------------------------------------------------------------------
      39                 :             : !
      40                 :             : ! This packet computes zero-order Bessel functions of the first and
      41                 :             : !   second kind (J0 and Y0), for real arguments X, where 0 < X <= XMAX
      42                 :             : !   for Y0, and |X| <= XMAX for J0.  It contains two function-type
      43                 :             : !   subprograms,  BESJ0  and  BESY0,  and one subroutine-type
      44                 :             : !   subprogram,  CALJY0.  The calling statements for the primary
      45                 :             : !   entries are:
      46                 :             : !
      47                 :             : !           Y = BESJ0(X)
      48                 :             : !   and
      49                 :             : !           Y = BESY0(X),
      50                 :             : !
      51                 :             : !   where the entry points correspond to the functions J0(X) and Y0(X),
      52                 :             : !   respectively.  The routine  CALJY0  is intended for internal packet
      53                 :             : !   use only, all computations within the packet being concentrated in
      54                 :             : !   this one routine.  The function subprograms invoke  CALJY0  with
      55                 :             : !   the statement
      56                 :             : !           CALL CALJY0(ARG,RESULT,JINT),
      57                 :             : !   where the parameter usage is as follows:
      58                 :             : !
      59                 :             : !      Function                  Parameters for CALJY0
      60                 :             : !       call              ARG             RESULT          JINT
      61                 :             : !
      62                 :             : !     BESJ0(ARG)     |ARG| .LE. XMAX       J0(ARG)          0
      63                 :             : !     BESY0(ARG)   0 .LT. ARG .LE. XMAX    Y0(ARG)          1
      64                 :             : !
      65                 :             : !   The main computation uses unpublished minimax rational
      66                 :             : !   approximations for X .LE. 8.0, and an approximation from the
      67                 :             : !   book  Computer Approximations  by Hart, et. al., Wiley and Sons,
      68                 :             : !   New York, 1968, for arguments larger than 8.0   Part of this
      69                 :             : !   transportable packet is patterned after the machine-dependent
      70                 :             : !   FUNPACK program BESJ0(X), but cannot match that version for
      71                 :             : !   efficiency or accuracy.  This version uses rational functions
      72                 :             : !   that are theoretically accurate to at least 18 significant decimal
      73                 :             : !   digits for X <= 8, and at least 18 decimal places for X > 8.  The
      74                 :             : !   accuracy achieved depends on the arithmetic system, the compiler,
      75                 :             : !   the intrinsic functions, and proper selection of the machine-
      76                 :             : !   dependent constants.
      77                 :             : !
      78                 :             : !*******************************************************************
      79                 :             : !
      80                 :             : ! Explanation of machine-dependent constants
      81                 :             : !
      82                 :             : !   XINF   = largest positive machine number
      83                 :             : !   XMAX   = largest acceptable argument.  The functions AINT, SIN
      84                 :             : !            and COS must perform properly for  ABS(X) .LE. XMAX.
      85                 :             : !            We recommend that XMAX be a small integer multiple of
      86                 :             : !            sqrt(1/eps), where eps is the smallest positive number
      87                 :             : !            such that  1+eps > 1.
      88                 :             : !   XSMALL = positive argument such that  1.0-(X/2)**2 = 1.0
      89                 :             : !            to machine precision for all  ABS(X) .LE. XSMALL.
      90                 :             : !            We recommend that  XSMALL < sqrt(eps)/beta, where beta
      91                 :             : !            is the floating-point radix (usually 2 or 16).
      92                 :             : !
      93                 :             : !     Approximate values for some important machines are
      94                 :             : !
      95                 :             : !                          eps      XMAX     XSMALL      XINF
      96                 :             : !
      97                 :             : !  CDC 7600      (S.P.)  7.11E-15  1.34E+08  2.98E-08  1.26E+322
      98                 :             : !  CRAY-1        (S.P.)  7.11E-15  1.34E+08  2.98E-08  5.45E+2465
      99                 :             : !  IBM PC (8087) (S.P.)  5.96E-08  8.19E+03  1.22E-04  3.40E+38
     100                 :             : !  IBM PC (8087) (D.P.)  1.11D-16  2.68D+08  3.72D-09  1.79D+308
     101                 :             : !  IBM 195       (D.P.)  2.22D-16  6.87D+09  9.09D-13  7.23D+75
     102                 :             : !  UNIVAC 1108   (D.P.)  1.73D-18  4.30D+09  2.33D-10  8.98D+307
     103                 :             : !  VAX 11/780    (D.P.)  1.39D-17  1.07D+09  9.31D-10  1.70D+38
     104                 :             : !
     105                 :             : !*******************************************************************
     106                 :             : !*******************************************************************
     107                 :             : !
     108                 :             : ! Error Returns
     109                 :             : !
     110                 :             : !  The program returns the value zero for  X .GT. XMAX, and returns
     111                 :             : !    -XINF when BESLY0 is called with a negative or zero argument.
     112                 :             : !
     113                 :             : !
     114                 :             : ! Intrinsic functions required are:
     115                 :             : !
     116                 :             : !     ABS, AINT, COS, LOG, SIN, SQRT
     117                 :             : !
     118                 :             : !
     119                 :             : !  Latest modification: June 2, 1989
     120                 :             : !
     121                 :             : !  Author: W. J. Cody
     122                 :             : !          Mathematics and Computer Science Division
     123                 :             : !          Argonne National Laboratory
     124                 :             : !          Argonne, IL 60439
     125                 :             : !
     126                 :             : !  Taken from http://www.netlib.org/specfun/j0y0
     127                 :             : !
     128                 :             : !--------------------------------------------------------------------
     129                 :             :       !IMPLICIT NONE
     130                 :             :       INTEGER :: I,JINT
     131                 :             : !CS    REAL
     132                 :             :        DOUBLE PRECISION :: &
     133                 :             : &            ARG,AX,CONS,DOWN,EIGHT,FIVE5,FOUR,ONE,ONEOV8,PI2,PJ0,&
     134                 :             : &            PJ1,PLG,PROD,PY0,PY1,PY2,P0,P1,P17,QJ0,QJ1,QLG,QY0,QY1,&
     135                 :             : &            QY2,Q0,Q1,RESJ,RESULT,R0,R1,SIXTY4,THREE,TWOPI,TWOPI1,&
     136                 :             : &            TWOPI2,TWO56,UP,W,WSQ,XDEN,XINF,XMAX,XNUM,XSMALL,XJ0,&
     137                 :             : &            XJ1,XJ01,XJ02,XJ11,XJ12,XY,XY0,XY01,XY02,XY1,XY11,XY12,&
     138                 :             : &            XY2,XY21,XY22,Z,ZERO,ZSQ
     139                 :             :       DIMENSION :: PJ0(7),PJ1(8),PLG(4),PY0(6),PY1(7),PY2(8),P0(6),P1(6),&
     140                 :             : &               QJ0(5),QJ1(7),QLG(4),QY0(5),QY1(6),QY2(7),Q0(5),Q1(5)
     141                 :             : !-------------------------------------------------------------------
     142                 :             : !  Mathematical constants
     143                 :             : !    CONS = ln(.5) + Euler's gamma
     144                 :             : !-------------------------------------------------------------------
     145                 :             : !CS    DATA ZERO,ONE,THREE,FOUR,EIGHT/0.0E0,1.0E0,3.0E0,4.0E0,8.0E0/,
     146                 :             : !CS   1     FIVE5,SIXTY4,ONEOV8,P17/5.5E0,64.0E0,0.125E0,1.716E-1/,
     147                 :             : !CS   2     TWO56,CONS/256.0E0,-1.1593151565841244881E-1/,
     148                 :             : !CS   3     PI2,TWOPI/6.3661977236758134308E-1,6.2831853071795864769E0/,
     149                 :             : !CS   4     TWOPI1,TWOPI2/6.28125E0,1.9353071795864769253E-3/
     150                 :             :      DATA ZERO,ONE,THREE,FOUR,EIGHT/0.0D0,1.0D0,3.0D0,4.0D0,8.0D0/,&
     151                 :             : &        FIVE5,SIXTY4,ONEOV8,P17/5.5D0,64.0D0,0.125D0,1.716D-1/,&
     152                 :             : &        TWO56,CONS/256.0D0,-1.1593151565841244881D-1/,&
     153                 :             : &        PI2,TWOPI/6.3661977236758134308D-1,6.2831853071795864769D0/,&
     154                 :             : &        TWOPI1,TWOPI2/6.28125D0,1.9353071795864769253D-3/
     155                 :             : !-------------------------------------------------------------------
     156                 :             : !  Machine-dependent constants
     157                 :             : !-------------------------------------------------------------------
     158                 :             : !CS    DATA XMAX/8.19E+03/,XSMALL/1.22E-09/,XINF/1.7E+38/
     159                 :             :       DATA XMAX/1.07D+09/,XSMALL/9.31D-10/,XINF/1.7D+38/
     160                 :             : !-------------------------------------------------------------------
     161                 :             : !  Zeroes of Bessel functions
     162                 :             : !-------------------------------------------------------------------
     163                 :             : !CS    DATA XJ0/2.4048255576957727686E+0/,XJ1/5.5200781102863106496E+0/,
     164                 :             : !CS   1     XY0/8.9357696627916752158E-1/,XY1/3.9576784193148578684E+0/,
     165                 :             : !CS   2     XY2/7.0860510603017726976E+0/,
     166                 :             : !CS   3     XJ01/ 616.0E+0/, XJ02/-1.4244423042272313784E-03/,
     167                 :             : !CS   4     XJ11/1413.0E+0/, XJ12/ 5.4686028631064959660E-04/,
     168                 :             : !CS   5     XY01/ 228.0E+0/, XY02/ 2.9519662791675215849E-03/,
     169                 :             : !CS   6     XY11/1013.0E+0/, XY12/ 6.4716931485786837568E-04/,
     170                 :             : !CS   7     XY21/1814.0E+0/, XY22/ 1.1356030177269762362E-04/
     171                 :             :       DATA XJ0/2.4048255576957727686D+0/,XJ1/5.5200781102863106496D+0/,&
     172                 :             : &          XY0/8.9357696627916752158D-1/,XY1/3.9576784193148578684D+0/,&
     173                 :             : &          XY2/7.0860510603017726976D+0/,&
     174                 :             : &          XJ01/ 616.0D+0/, XJ02/-1.4244423042272313784D-03/,&
     175                 :             : &          XJ11/1413.0D+0/, XJ12/ 5.4686028631064959660D-04/,&
     176                 :             : &          XY01/ 228.0D+0/, XY02/ 2.9519662791675215849D-03/,&
     177                 :             : &          XY11/1013.0D+0/, XY12/ 6.4716931485786837568D-04/,&
     178                 :             : &          XY21/1814.0D+0/, XY22/ 1.1356030177269762362D-04/
     179                 :             : !C-------------------------------------------------------------------
     180                 :             : !C  Coefficients for rational approximation to ln(x/a)
     181                 :             : !C--------------------------------------------------------------------
     182                 :             : !CS    DATA PLG/-2.4562334077563243311E+01,2.3642701335621505212E+02,
     183                 :             : !CS   1         -5.4989956895857911039E+02,3.5687548468071500413E+02/
     184                 :             : !CS    DATA QLG/-3.5553900764052419184E+01,1.9400230218539473193E+02,
     185                 :             : !CS   1         -3.3442903192607538956E+02,1.7843774234035750207E+02/
     186                 :             :        DATA PLG/-2.4562334077563243311D+01,2.3642701335621505212D+02,&
     187                 :             : &               -5.4989956895857911039D+02,3.5687548468071500413D+02/
     188                 :             :        DATA QLG/-3.5553900764052419184D+01,1.9400230218539473193D+02,&
     189                 :             : &               -3.3442903192607538956D+02,1.7843774234035750207D+02/
     190                 :             : !C-------------------------------------------------------------------
     191                 :             : !C  Coefficients for rational approximation of
     192                 :             : !C  J0(X) / (X**2 - XJ0**2),  XSMALL  <  |X|  <=  4.0
     193                 :             : !C--------------------------------------------------------------------
     194                 :             : !CS    DATA PJ0/6.6302997904833794242E+06,-6.2140700423540120665E+08,
     195                 :             : !CS   1         2.7282507878605942706E+10,-4.1298668500990866786E+11,
     196                 :             : !CS   2        -1.2117036164593528341E-01, 1.0344222815443188943E+02,
     197                 :             : !CS   3        -3.6629814655107086448E+04/
     198                 :             : !CS    DATA QJ0/4.5612696224219938200E+05, 1.3985097372263433271E+08,
     199                 :             : !CS   1         2.6328198300859648632E+10, 2.3883787996332290397E+12,
     200                 :             : !CS   2         9.3614022392337710626E+02/
     201                 :             :     DATA PJ0/6.6302997904833794242D+06,-6.2140700423540120665D+08,&
     202                 :             : &            2.7282507878605942706D+10,-4.1298668500990866786D+11,&
     203                 :             : &           -1.2117036164593528341D-01, 1.0344222815443188943D+02,&
     204                 :             : &           -3.6629814655107086448D+04/
     205                 :             :     DATA QJ0/4.5612696224219938200D+05, 1.3985097372263433271D+08,&
     206                 :             : &            2.6328198300859648632D+10, 2.3883787996332290397D+12,&
     207                 :             : &            9.3614022392337710626D+02/
     208                 :             : !C-------------------------------------------------------------------
     209                 :             : !C  Coefficients for rational approximation of
     210                 :             : !C  J0(X) / (X**2 - XJ1**2),  4.0  <  |X|  <=  8.0
     211                 :             : !C-------------------------------------------------------------------
     212                 :             : !CS    DATA PJ1/4.4176707025325087628E+03, 1.1725046279757103576E+04,
     213                 :             : !CS   1         1.0341910641583726701E+04,-7.2879702464464618998E+03,
     214                 :             : !CS   2        -1.2254078161378989535E+04,-1.8319397969392084011E+03,
     215                 :             : !CS   3         4.8591703355916499363E+01, 7.4321196680624245801E+02/
     216                 :             : !CS    DATA QJ1/3.3307310774649071172E+02,-2.9458766545509337327E+03,
     217                 :             : !CS   1         1.8680990008359188352E+04,-8.4055062591169562211E+04,
     218                 :             : !CS   2         2.4599102262586308984E+05,-3.5783478026152301072E+05,
     219                 :             : !CS   3        -2.5258076240801555057E+01/
     220                 :             :     DATA PJ1/4.4176707025325087628D+03, 1.1725046279757103576D+04,&
     221                 :             : &            1.0341910641583726701D+04,-7.2879702464464618998D+03,&
     222                 :             : &           -1.2254078161378989535D+04,-1.8319397969392084011D+03,&
     223                 :             : &            4.8591703355916499363D+01, 7.4321196680624245801D+02/
     224                 :             :     DATA QJ1/3.3307310774649071172D+02,-2.9458766545509337327D+03,&
     225                 :             : &            1.8680990008359188352D+04,-8.4055062591169562211D+04,&
     226                 :             : &            2.4599102262586308984D+05,-3.5783478026152301072D+05,&
     227                 :             : &           -2.5258076240801555057D+01/
     228                 :             : !C-------------------------------------------------------------------
     229                 :             : !C  Coefficients for rational approximation of
     230                 :             : !C    (Y0(X) - 2 LN(X/XY0) J0(X)) / (X**2 - XY0**2),
     231                 :             : !C        XSMALL  <  |X|  <=  3.0
     232                 :             : !C--------------------------------------------------------------------
     233                 :             : !CS    DATA PY0/1.0102532948020907590E+04,-2.1287548474401797963E+06,
     234                 :             : !CS   1         2.0422274357376619816E+08,-8.3716255451260504098E+09,
     235                 :             : !CS   2         1.0723538782003176831E+11,-1.8402381979244993524E+01/
     236                 :             : !CS    DATA QY0/6.6475986689240190091E+02, 2.3889393209447253406E+05,
     237                 :             : !CS   1         5.5662956624278251596E+07, 8.1617187777290363573E+09,
     238                 :             : !CS   2         5.8873865738997033405E+11/
     239                 :             :      DATA PY0/1.0102532948020907590D+04,-2.1287548474401797963D+06,&
     240                 :             : &             2.0422274357376619816D+08,-8.3716255451260504098D+09,&
     241                 :             : &             1.0723538782003176831D+11,-1.8402381979244993524D+01/
     242                 :             :      DATA QY0/6.6475986689240190091D+02, 2.3889393209447253406D+05,&
     243                 :             : &             5.5662956624278251596D+07, 8.1617187777290363573D+09,&
     244                 :             : &             5.8873865738997033405D+11/
     245                 :             : !C-------------------------------------------------------------------
     246                 :             : !C  Coefficients for rational approximation of
     247                 :             : !C    (Y0(X) - 2 LN(X/XY1) J0(X)) / (X**2 - XY1**2),
     248                 :             : !C        3.0  <  |X|  <=  5.5
     249                 :             : !C--------------------------------------------------------------------
     250                 :             : !CS    DATA PY1/-1.4566865832663635920E+04, 4.6905288611678631510E+06,
     251                 :             : !CS   1         -6.9590439394619619534E+08, 4.3600098638603061642E+10,
     252                 :             : !CS   2         -5.5107435206722644429E+11,-2.2213976967566192242E+13,
     253                 :             : !CS   3          1.7427031242901594547E+01/
     254                 :             : !CS    DATA QY1/ 8.3030857612070288823E+02, 4.0669982352539552018E+05,
     255                 :             : !CS   1          1.3960202770986831075E+08, 3.4015103849971240096E+10,
     256                 :             : !CS   2          5.4266824419412347550E+12, 4.3386146580707264428E+14/
     257                 :             :       DATA PY1/-1.4566865832663635920D+04, 4.6905288611678631510D+06,&
     258                 :             : &              -6.9590439394619619534D+08, 4.3600098638603061642D+10,&
     259                 :             : &              -5.5107435206722644429D+11,-2.2213976967566192242D+13,&
     260                 :             : &               1.7427031242901594547D+01/
     261                 :             :       DATA QY1/ 8.3030857612070288823D+02, 4.0669982352539552018D+05,&
     262                 :             : &               1.3960202770986831075D+08, 3.4015103849971240096D+10,&
     263                 :             : &               5.4266824419412347550D+12, 4.3386146580707264428D+14/
     264                 :             : !C-------------------------------------------------------------------
     265                 :             : !C  Coefficients for rational approximation of
     266                 :             : !C    (Y0(X) - 2 LN(X/XY2) J0(X)) / (X**2 - XY2**2),
     267                 :             : !C        5.5  <  |X|  <=  8.0
     268                 :             : !C--------------------------------------------------------------------
     269                 :             : !CS    DATA PY2/ 2.1363534169313901632E+04,-1.0085539923498211426E+07,
     270                 :             : !CS   1          2.1958827170518100757E+09,-1.9363051266772083678E+11,
     271                 :             : !CS   2         -1.2829912364088687306E+11, 6.7016641869173237784E+14,
     272                 :             : !CS   3         -8.0728726905150210443E+15,-1.7439661319197499338E+01/
     273                 :             : !CS    DATA QY2/ 8.7903362168128450017E+02, 5.3924739209768057030E+05,
     274                 :             : !CS   1          2.4727219475672302327E+08, 8.6926121104209825246E+10,
     275                 :             : !CS   2          2.2598377924042897629E+13, 3.9272425569640309819E+15,
     276                 :             : !CS   3          3.4563724628846457519E+17/
     277                 :             :     DATA PY2/ 2.1363534169313901632D+04,-1.0085539923498211426D+07,&
     278                 :             : &             2.1958827170518100757D+09,-1.9363051266772083678D+11,&
     279                 :             : &            -1.2829912364088687306D+11, 6.7016641869173237784D+14,&
     280                 :             : &            -8.0728726905150210443D+15,-1.7439661319197499338D+01/
     281                 :             :     DATA QY2/ 8.7903362168128450017D+02, 5.3924739209768057030D+05,&
     282                 :             : &             2.4727219475672302327D+08, 8.6926121104209825246D+10,&
     283                 :             : &             2.2598377924042897629D+13, 3.9272425569640309819D+15,&
     284                 :             : &             3.4563724628846457519D+17/
     285                 :             : !C-------------------------------------------------------------------
     286                 :             : !C  Coefficients for Hart,s approximation,  |X| > 8.0
     287                 :             : !C-------------------------------------------------------------------
     288                 :             : !CS    DATA P0/3.4806486443249270347E+03, 2.1170523380864944322E+04,
     289                 :             : !CS   1        4.1345386639580765797E+04, 2.2779090197304684302E+04,
     290                 :             : !CS   2        8.8961548424210455236E-01, 1.5376201909008354296E+02/
     291                 :             : !CS    DATA Q0/3.5028735138235608207E+03, 2.1215350561880115730E+04,
     292                 :             : !CS   1        4.1370412495510416640E+04, 2.2779090197304684318E+04,
     293                 :             : !CS   2        1.5711159858080893649E+02/
     294                 :             : !CS    DATA P1/-2.2300261666214198472E+01,-1.1183429920482737611E+02,
     295                 :             : !CS   1        -1.8591953644342993800E+02,-8.9226600200800094098E+01,
     296                 :             : !CS   2        -8.8033303048680751817E-03,-1.2441026745835638459E+00/
     297                 :             : !CS    DATA Q1/1.4887231232283756582E+03, 7.2642780169211018836E+03,
     298                 :             : !CS   1        1.1951131543434613647E+04, 5.7105024128512061905E+03,
     299                 :             : !CS   2        9.0593769594993125859E+01/
     300                 :             :     DATA P0/3.4806486443249270347D+03, 2.1170523380864944322D+04,&
     301                 :             : &           4.1345386639580765797D+04, 2.2779090197304684302D+04,&
     302                 :             : &           8.8961548424210455236D-01, 1.5376201909008354296D+02/
     303                 :             :     DATA Q0/3.5028735138235608207D+03, 2.1215350561880115730D+04,&
     304                 :             : &           4.1370412495510416640D+04, 2.2779090197304684318D+04,&
     305                 :             : &           1.5711159858080893649D+02/
     306                 :             :     DATA P1/-2.2300261666214198472D+01,-1.1183429920482737611D+02,&
     307                 :             : &           -1.8591953644342993800D+02,-8.9226600200800094098D+01,&
     308                 :             : &           -8.8033303048680751817D-03,-1.2441026745835638459D+00/
     309                 :             :     DATA Q1/1.4887231232283756582D+03, 7.2642780169211018836D+03,&
     310                 :             : &           1.1951131543434613647D+04, 5.7105024128512061905D+03,&
     311                 :             : &           9.0593769594993125859D+01/
     312                 :             : !C-------------------------------------------------------------------
     313                 :             : !C  Check for error conditions
     314                 :             : !C-------------------------------------------------------------------
     315                 :           0 :       AX = ABS(ARG)
     316   [ #  #  #  # ]:           0 :       IF ((JINT .EQ. 1) .AND. (ARG .LE. ZERO)) THEN
     317                 :           0 :             RESULT = -XINF
     318                 :           0 :             GO TO 2000
     319         [ #  # ]:           0 :          ELSE IF (AX .GT. XMAX) THEN
     320                 :           0 :             RESULT = ZERO
     321                 :           0 :             GO TO 2000
     322                 :             :       END IF
     323         [ #  # ]:           0 :       IF (AX .GT. EIGHT) GO TO 800
     324         [ #  # ]:           0 :       IF (AX .LE. XSMALL) THEN
     325         [ #  # ]:           0 :          IF (JINT .EQ. 0) THEN
     326                 :           0 :                RESULT = ONE
     327                 :             :             ELSE
     328                 :           0 :                RESULT = PI2 * (LOG(AX) + CONS)
     329                 :             :          END IF
     330                 :             :          GO TO 2000
     331                 :             :       END IF
     332                 :             : !C-------------------------------------------------------------------
     333                 :             : !C  Calculate J0 for appropriate interval, preserving
     334                 :             : !C     accuracy near the zero of J0
     335                 :             : !C-------------------------------------------------------------------
     336                 :           0 :       ZSQ = AX * AX
     337         [ #  # ]:           0 :       IF (AX .LE. FOUR) THEN
     338                 :           0 :             XNUM = (PJ0(5) * ZSQ + PJ0(6)) * ZSQ + PJ0(7)
     339                 :           0 :             XDEN = ZSQ + QJ0(5)
     340         [ #  # ]:           0 :             DO 50 I = 1, 4
     341                 :           0 :                XNUM = XNUM * ZSQ + PJ0(I)
     342                 :           0 :                XDEN = XDEN * ZSQ + QJ0(I)
     343                 :           0 :    50       CONTINUE
     344                 :           0 :             PROD = ((AX - XJ01/TWO56) - XJ02) * (AX + XJ0)
     345                 :             :          ELSE
     346                 :           0 :             WSQ = ONE - ZSQ / SIXTY4
     347                 :           0 :             XNUM = PJ1(7) * WSQ + PJ1(8)
     348                 :           0 :             XDEN = WSQ + QJ1(7)
     349         [ #  # ]:           0 :             DO 220 I = 1, 6
     350                 :           0 :                XNUM = XNUM * WSQ + PJ1(I)
     351                 :           0 :                XDEN = XDEN * WSQ + QJ1(I)
     352                 :           0 :   220       CONTINUE
     353                 :           0 :             PROD = (AX + XJ1) * ((AX - XJ11/TWO56) - XJ12)
     354                 :             :       END IF
     355                 :           0 :       RESULT = PROD * XNUM / XDEN
     356         [ #  # ]:           0 :       IF (JINT .EQ. 0) GO TO 2000
     357                 :             : !C-------------------------------------------------------------------
     358                 :             : !C  Calculate Y0.  First find  RESJ = pi/2 ln(x/xn) J0(x),
     359                 :             : !C    where xn is a zero of Y0
     360                 :             : !C-------------------------------------------------------------------
     361         [ #  # ]:           0 :       IF (AX .LE. THREE) THEN
     362                 :           0 :             UP = (AX-XY01/TWO56)-XY02
     363                 :           0 :             XY = XY0
     364         [ #  # ]:           0 :          ELSE IF (AX .LE. FIVE5) THEN
     365                 :           0 :             UP = (AX-XY11/TWO56)-XY12
     366                 :           0 :             XY = XY1
     367                 :             :          ELSE
     368                 :           0 :             UP = (AX-XY21/TWO56)-XY22
     369                 :           0 :             XY = XY2
     370                 :             :       END IF
     371                 :           0 :       DOWN = AX + XY
     372         [ #  # ]:           0 :       IF (ABS(UP) .LT. P17*DOWN) THEN
     373                 :           0 :             W = UP/DOWN
     374                 :           0 :             WSQ = W*W
     375                 :           0 :             XNUM = PLG(1)
     376                 :           0 :             XDEN = WSQ + QLG(1)
     377         [ #  # ]:           0 :             DO 320 I = 2, 4
     378                 :           0 :                XNUM = XNUM*WSQ + PLG(I)
     379                 :           0 :                XDEN = XDEN*WSQ + QLG(I)
     380                 :           0 :   320       CONTINUE
     381                 :           0 :             RESJ = PI2 * RESULT * W * XNUM/XDEN
     382                 :             :          ELSE
     383                 :           0 :             RESJ = PI2 * RESULT * LOG(AX/XY)
     384                 :             :       END IF
     385                 :             : !C-------------------------------------------------------------------
     386                 :             : !C  Now calculate Y0 for appropriate interval, preserving
     387                 :             : !C     accuracy near the zero of Y0
     388                 :             : !C-------------------------------------------------------------------
     389         [ #  # ]:           0 :       IF (AX .LE. THREE) THEN
     390                 :           0 :             XNUM = PY0(6) * ZSQ + PY0(1)
     391                 :           0 :             XDEN = ZSQ + QY0(1)
     392         [ #  # ]:           0 :             DO 340 I = 2, 5
     393                 :           0 :                XNUM = XNUM * ZSQ + PY0(I)
     394                 :           0 :                XDEN = XDEN * ZSQ + QY0(I)
     395                 :           0 :   340       CONTINUE
     396         [ #  # ]:           0 :          ELSE IF (AX .LE. FIVE5) THEN
     397                 :           0 :             XNUM = PY1(7) * ZSQ + PY1(1)
     398                 :           0 :             XDEN = ZSQ + QY1(1)
     399         [ #  # ]:           0 :             DO 360 I = 2, 6
     400                 :           0 :                XNUM = XNUM * ZSQ + PY1(I)
     401                 :           0 :                XDEN = XDEN * ZSQ + QY1(I)
     402                 :           0 :   360       CONTINUE
     403                 :             :          ELSE
     404                 :           0 :             XNUM = PY2(8) * ZSQ + PY2(1)
     405                 :           0 :             XDEN = ZSQ + QY2(1)
     406         [ #  # ]:           0 :             DO 380 I = 2, 7
     407                 :           0 :                XNUM = XNUM * ZSQ + PY2(I)
     408                 :           0 :                XDEN = XDEN * ZSQ + QY2(I)
     409                 :           0 :   380       CONTINUE
     410                 :             :       END IF
     411                 :           0 :       RESULT = RESJ + UP * DOWN * XNUM / XDEN
     412                 :           0 :       GO TO 2000
     413                 :             : !C-------------------------------------------------------------------
     414                 :             : !C  Calculate J0 or Y0 for |ARG|  >  8.0
     415                 :             : !C-------------------------------------------------------------------
     416                 :           0 :   800 Z = EIGHT / AX
     417                 :           0 :       W = AX / TWOPI
     418                 :           0 :       W = AINT(W) + ONEOV8
     419                 :           0 :       W = (AX - W * TWOPI1) - W * TWOPI2
     420                 :           0 :       ZSQ = Z * Z
     421                 :           0 :       XNUM = P0(5) * ZSQ + P0(6)
     422                 :           0 :       XDEN = ZSQ + Q0(5)
     423                 :           0 :       UP = P1(5) * ZSQ + P1(6)
     424                 :           0 :       DOWN = ZSQ + Q1(5)
     425         [ #  # ]:           0 :       DO 850 I = 1, 4
     426                 :           0 :          XNUM = XNUM * ZSQ + P0(I)
     427                 :           0 :          XDEN = XDEN * ZSQ + Q0(I)
     428                 :           0 :          UP = UP * ZSQ + P1(I)
     429                 :           0 :          DOWN = DOWN * ZSQ + Q1(I)
     430                 :           0 :   850 CONTINUE
     431                 :           0 :       R0 = XNUM / XDEN
     432                 :           0 :       R1 = UP / DOWN
     433         [ #  # ]:           0 :       IF (JINT .EQ. 0) THEN
     434                 :           0 :             RESULT = SQRT(PI2/AX) * (R0*COS(W) - Z*R1*SIN(W))
     435                 :             :          ELSE
     436                 :           0 :             RESULT = SQRT(PI2/AX) * (R0*SIN(W) + Z*R1*COS(W))
     437                 :             :       END IF
     438                 :           0 :  2000 RETURN
     439                 :             : !C---------- Last line of CALJY0 ----------
     440                 :             :       END subroutine caljy0
     441                 :             : 
     442                 :             :       DOUBLE PRECISION FUNCTION BESJ0(X)
     443                 :             : !CS    REAL FUNCTION BESJ0(X)
     444                 :             : !--------------------------------------------------------------------
     445                 :             : !
     446                 :             : ! This subprogram computes approximate values for Bessel functions
     447                 :             : !   of the first kind of order zero for arguments  |X| <= XMAX
     448                 :             : !   (see comments heading CALJY0).
     449                 :             : !
     450                 :             : !--------------------------------------------------------------------
     451                 :             :       !IMPLICIT NONE
     452                 :             :       INTEGER :: JINT
     453                 :             : !S    REAL  X, RESULT
     454                 :             :       DOUBLE PRECISION :: X, RESULT
     455                 :             : !--------------------------------------------------------------------
     456                 :             :       JINT=0
     457                 :             :       CALL CALJY0(X,RESULT,JINT)
     458                 :             :       BESJ0 = RESULT
     459                 :             :       RETURN
     460                 :             : !---------- Last line of BESJ0 ----------
     461                 :             :       END function besj0
     462                 :             :       DOUBLE PRECISION FUNCTION BESY0(X)
     463                 :             : !CS    REAL FUNCTION BESY0(X)
     464                 :             : !C--------------------------------------------------------------------
     465                 :             : !C
     466                 :             : !C This subprogram computes approximate values for Bessel functions
     467                 :             : !C   of the second kind of order zero for arguments 0 < X <= XMAX
     468                 :             : !C   (see comments heading CALJY0).
     469                 :             : !C
     470                 :             : !C--------------------------------------------------------------------
     471                 :             :       !IMPLICIT NONE
     472                 :             :       INTEGER JINT
     473                 :             : !CS    REAL  X, RESULT
     474                 :             :       DOUBLE PRECISION :: X, RESULT
     475                 :             : !--------------------------------------------------------------------
     476                 :             :       JINT=1
     477                 :             :       CALL CALJY0(X,RESULT,JINT)
     478                 :             :       BESY0 = RESULT
     479                 :             :       RETURN
     480                 :             : !---------- Last line of BESY0 ----------
     481                 :             :       END function besy0
     482                 :             : 
     483                 :           0 : SUBROUTINE CALJY1(ARG,RESULT,JINT)
     484                 :             : 
     485                 :             : !---------------------------------------------------------------------
     486                 :             : !
     487                 :             : ! This packet computes first-order Bessel functions of the first and
     488                 :             : !   second kind (J1 and Y1), for real arguments X, where 0 < X <= XMAX
     489                 :             : !   for Y1, and |X| <= XMAX for J1.  It contains two function-type
     490                 :             : !   subprograms,  BESJ1  and  BESY1,  and one subroutine-type
     491                 :             : !   subprogram,  CALJY1.  The calling statements for the primary
     492                 :             : !   entries are:
     493                 :             : !
     494                 :             : !           Y = BESJ1(X)
     495                 :             : !   and
     496                 :             : !           Y = BESY1(X),
     497                 :             : !
     498                 :             : !   where the entry points correspond to the functions J1(X) and Y1(X),
     499                 :             : !   respectively.  The routine  CALJY1  is intended for internal packet
     500                 :             : !   use only, all computations within the packet being concentrated in
     501                 :             : !   this one routine.  The function subprograms invoke  CALJY1  with
     502                 :             : !   the statement
     503                 :             : !           CALL CALJY1(ARG,RESULT,JINT),
     504                 :             : !   where the parameter usage is as follows:
     505                 :             : !
     506                 :             : !      Function                  Parameters for CALJY1
     507                 :             : !       call              ARG             RESULT          JINT
     508                 :             : !
     509                 :             : !     BESJ1(ARG)     |ARG| .LE. XMAX       J1(ARG)          0
     510                 :             : !     BESY1(ARG)   0 .LT. ARG .LE. XMAX    Y1(ARG)          1
     511                 :             : !
     512                 :             : !   The main computation uses unpublished minimax rational
     513                 :             : !   approximations for X .LE. 8.0, and an approximation from the
     514                 :             : !   book  Computer Approximations  by Hart, et. al., Wiley and Sons,
     515                 :             : !   New York, 1968, for arguments larger than 8.0   Part of this
     516                 :             : !   transportable packet is patterned after the machine-dependent
     517                 :             : !   FUNPACK program BESJ1(X), but cannot match that version for
     518                 :             : !   efficiency or accuracy.  This version uses rational functions
     519                 :             : !   that are theoretically accurate to at least 18 significant decimal
     520                 :             : !   digits for X <= 8, and at least 18 decimal places for X > 8.  The
     521                 :             : !   accuracy achieved depends on the arithmetic system, the compiler,
     522                 :             : !   the intrinsic functions, and proper selection of the machine-
     523                 :             : !   dependent constants.
     524                 :             : !
     525                 :             : !*******************************************************************
     526                 :             : !
     527                 :             : ! Explanation of machine-dependent constants
     528                 :             : !
     529                 :             : !   XINF   = largest positive machine number
     530                 :             : !   XMAX   = largest acceptable argument.  The functions AINT, SIN
     531                 :             : !            and COS must perform properly for  ABS(X) .LE. XMAX.
     532                 :             : !            We recommend that XMAX be a small integer multiple of
     533                 :             : !            sqrt(1/eps), where eps is the smallest positive number
     534                 :             : !            such that  1+eps > 1.
     535                 :             : !   XSMALL = positive argument such that  1.0-(1/2)(X/2)**2 = 1.0
     536                 :             : !            to machine precision for all  ABS(X) .LE. XSMALL.
     537                 :             : !            We recommend that  XSMALL < sqrt(eps)/beta, where beta
     538                 :             : !            is the floating-point radix (usually 2 or 16).
     539                 :             : !
     540                 :             : !     Approximate values for some important machines are
     541                 :             : !
     542                 :             : !                          eps      XMAX     XSMALL      XINF
     543                 :             : !
     544                 :             : !  CDC 7600      (S.P.)  7.11E-15  1.34E+08  2.98E-08  1.26E+322
     545                 :             : !  CRAY-1        (S.P.)  7.11E-15  1.34E+08  2.98E-08  5.45E+2465
     546                 :             : !  IBM PC (8087) (S.P.)  5.96E-08  8.19E+03  1.22E-04  3.40E+38
     547                 :             : !  IBM PC (8087) (D.P.)  1.11D-16  2.68D+08  3.72D-09  1.79D+308
     548                 :             : !  IBM 195       (D.P.)  2.22D-16  6.87D+09  9.09D-13  7.23D+75
     549                 :             : !  UNIVAC 1108   (D.P.)  1.73D-18  4.30D+09  2.33D-10  8.98D+307
     550                 :             : !  VAX 11/780    (D.P.)  1.39D-17  1.07D+09  9.31D-10  1.70D+38
     551                 :             : !
     552                 :             : !*******************************************************************
     553                 :             : !*******************************************************************
     554                 :             : !
     555                 :             : ! Error Returns
     556                 :             : !
     557                 :             : !  The program returns the value zero for  X .GT. XMAX, and returns
     558                 :             : !    -XINF when BESLY1 is called with a negative or zero argument.
     559                 :             : !
     560                 :             : !
     561                 :             : ! Intrinsic functions required are:
     562                 :             : !
     563                 :             : !     ABS, AINT, COS, LOG, SIN, SQRT
     564                 :             : !
     565                 :             : !
     566                 :             : !  Author: W. J. Cody
     567                 :             : !          Mathematics and Computer Science Division
     568                 :             : !          Argonne National Laboratory
     569                 :             : !          Argonne, IL 60439
     570                 :             : !
     571                 :             : !  Latest modification: November 10, 1987
     572                 :             : !
     573                 :             : !  Taken from http://www.netlib.org/specfun/j1y1
     574                 :             : !
     575                 :             : !--------------------------------------------------------------------
     576                 :             :       !IMPLICIT NONE
     577                 :             :       INTEGER :: I,JINT
     578                 :             :       DIMENSION :: PJ0(7),PJ1(8),PLG(4),PY0(7),PY1(9),P0(6),P1(6),&
     579                 :             : &                  QJ0(5),QJ1(7),QLG(4),QY0(6),QY1(8),Q0(6),Q1(6)
     580                 :             : !CS    REAL
     581                 :             :        DOUBLE PRECISION :: &
     582                 :             : &        ARG,AX,DOWN,EIGHT,FOUR,HALF,PI2,PJ0,PJ1,PLG,PROD,PY0,&
     583                 :             : &        PY1,P0,P1,P17,QJ0,QJ1,QLG,QY0,QY1,Q0,Q1,RESJ,RESULT,&
     584                 :             : &        RTPI2,R0,R1,THROV8,TWOPI,TWOPI1,TWOPI2,TWO56,UP,W,WSQ,&
     585                 :             : &        XDEN,XINF,XMAX,XNUM,XSMALL,XJ0,XJ1,XJ01,XJ02,XJ11,XJ12,&
     586                 :             : &        XY,XY0,XY01,XY02,XY1,XY11,XY12,Z,ZERO,ZSQ
     587                 :             : !-------------------------------------------------------------------
     588                 :             : !  Mathematical constants
     589                 :             : !-------------------------------------------------------------------
     590                 :             : !CS    DATA EIGHT/8.0E0/,
     591                 :             : !CS   1     FOUR/4.0E0/,HALF/0.5E0/,THROV8/0.375E0/,
     592                 :             : !CS   2     PI2/6.3661977236758134308E-1/,P17/1.716E-1/
     593                 :             : !CS   3     TWOPI/6.2831853071795864769E+0/,ZERO/0.0E0/,
     594                 :             : !CS   4     TWOPI1/6.28125E0/,TWOPI2/1.9353071795864769253E-03/
     595                 :             : !CS   5     TWO56/256.0E+0/,RTPI2/7.9788456080286535588E-1/
     596                 :             :       DATA EIGHT/8.0D0/,&
     597                 :             : &          FOUR/4.0D0/,HALF/0.5D0/,THROV8/0.375D0/,&
     598                 :             : &          PI2/6.3661977236758134308D-1/,P17/1.716D-1/&
     599                 :             : &          TWOPI/6.2831853071795864769D+0/,ZERO/0.0D0/,&
     600                 :             : &          TWOPI1/6.28125D0/,TWOPI2/1.9353071795864769253D-03/&
     601                 :             : &          TWO56/256.0D+0/,RTPI2/7.9788456080286535588D-1/
     602                 :             : !-------------------------------------------------------------------
     603                 :             : !  Machine-dependent constants
     604                 :             : !-------------------------------------------------------------------
     605                 :             : !CS    DATA XMAX/8.19E+03/,XSMALL/1.22E-09/,XINF/1.7E+38/
     606                 :             :       DATA XMAX/1.07D+09/,XSMALL/9.31D-10/,XINF/1.7D+38/
     607                 :             : !-------------------------------------------------------------------
     608                 :             : !  Zeroes of Bessel functions
     609                 :             : !-------------------------------------------------------------------
     610                 :             : !CS    DATA XJ0/3.8317059702075123156E+0/,XJ1/7.0155866698156187535E+0/,
     611                 :             : !CS   1     XY0/2.1971413260310170351E+0/,XY1/5.4296810407941351328E+0/,
     612                 :             : !CS   2     XJ01/ 981.0E+0/, XJ02/-3.2527979248768438556E-04/,
     613                 :             : !CS   3     XJ11/1796.0E+0/, XJ12/-3.8330184381246462950E-05/,
     614                 :             : !CS   4     XY01/ 562.0E+0/, XY02/ 1.8288260310170351490E-03/,
     615                 :             : !CS   5     XY11/1390.0E+0/, XY12/-6.4592058648672279948E-06/
     616                 :             :       DATA XJ0/3.8317059702075123156D+0/,XJ1/7.0155866698156187535D+0/,&
     617                 :             : &          XY0/2.1971413260310170351D+0/,XY1/5.4296810407941351328D+0/,&
     618                 :             : &          XJ01/ 981.0D+0/, XJ02/-3.2527979248768438556D-04/,&
     619                 :             : &          XJ11/1796.0D+0/, XJ12/-3.8330184381246462950D-05/,&
     620                 :             : &          XY01/ 562.0D+0/, XY02/ 1.8288260310170351490D-03/,&
     621                 :             : &          XY11/1390.0D+0/, XY12/-6.4592058648672279948D-06/
     622                 :             : !-------------------------------------------------------------------
     623                 :             : !  Coefficients for rational approximation to ln(x/a)
     624                 :             : !--------------------------------------------------------------------
     625                 :             : !CS    DATA PLG/-2.4562334077563243311E+01,2.3642701335621505212E+02,
     626                 :             : !CS   1         -5.4989956895857911039E+02,3.5687548468071500413E+02/
     627                 :             : !CS    DATA QLG/-3.5553900764052419184E+01,1.9400230218539473193E+02,
     628                 :             : !CS   1         -3.3442903192607538956E+02,1.7843774234035750207E+02/
     629                 :             :       DATA PLG/-2.4562334077563243311D+01,2.3642701335621505212D+02,&
     630                 :             : &              -5.4989956895857911039D+02,3.5687548468071500413D+02/
     631                 :             :       DATA QLG/-3.5553900764052419184D+01,1.9400230218539473193D+02,&
     632                 :             : &              -3.3442903192607538956D+02,1.7843774234035750207D+02/
     633                 :             : !-------------------------------------------------------------------
     634                 :             : !  Coefficients for rational approximation of
     635                 :             : !  J1(X) / (X * (X**2 - XJ0**2)),  XSMALL  <  |X|  <=  4.0
     636                 :             : !--------------------------------------------------------------------
     637                 :             : !CS    DATA PJ0/9.8062904098958257677E+05,-1.1548696764841276794E+08,
     638                 :             : !CS   1       6.6781041261492395835E+09,-1.4258509801366645672E+11,
     639                 :             : !CS   2      -4.4615792982775076130E+03, 1.0650724020080236441E+01,
     640                 :             : !CS   3      -1.0767857011487300348E-02/
     641                 :             : !CS    DATA QJ0/5.9117614494174794095E+05, 2.0228375140097033958E+08,
     642                 :             : !CS   1       4.2091902282580133541E+10, 4.1868604460820175290E+12,
     643                 :             : !CS   2       1.0742272239517380498E+03/
     644                 :             :       DATA PJ0/9.8062904098958257677D+05,-1.1548696764841276794D+08,&
     645                 :             : &              6.6781041261492395835D+09,-1.4258509801366645672D+11,&
     646                 :             : &             -4.4615792982775076130D+03, 1.0650724020080236441D+01,&
     647                 :             : &             -1.0767857011487300348D-02/
     648                 :             :       DATA QJ0/5.9117614494174794095D+05, 2.0228375140097033958D+08,&
     649                 :             : &              4.2091902282580133541D+10, 4.1868604460820175290D+12,&
     650                 :             : &              1.0742272239517380498D+03/
     651                 :             : !-------------------------------------------------------------------
     652                 :             : !  Coefficients for rational approximation of
     653                 :             : !  J1(X) / (X * (X**2 - XJ1**2)),  4.0  <  |X|  <=  8.0
     654                 :             : !-------------------------------------------------------------------
     655                 :             : !CS    DATA PJ1/4.6179191852758252280E+00,-7.1329006872560947377E+03,
     656                 :             : !CS   1       4.5039658105749078904E+06,-1.4437717718363239107E+09,
     657                 :             : !CS   2       2.3569285397217157313E+11,-1.6324168293282543629E+13,
     658                 :             : !CS   3       1.1357022719979468624E+14, 1.0051899717115285432E+15/
     659                 :             : !CS    DATA QJ1/1.1267125065029138050E+06, 6.4872502899596389593E+08,
     660                 :             : !CS   1       2.7622777286244082666E+11, 8.4899346165481429307E+13,
     661                 :             : !CS   2       1.7128800897135812012E+16, 1.7253905888447681194E+18,
     662                 :             : !CS   3       1.3886978985861357615E+03/
     663                 :             :      DATA PJ1/4.6179191852758252280D+00,-7.1329006872560947377D+03,&
     664                 :             : &             4.5039658105749078904D+06,-1.4437717718363239107D+09,&
     665                 :             : &             2.3569285397217157313D+11,-1.6324168293282543629D+13,&
     666                 :             : &             1.1357022719979468624D+14, 1.0051899717115285432D+15/
     667                 :             :      DATA QJ1/1.1267125065029138050D+06, 6.4872502899596389593D+08,&
     668                 :             : &             2.7622777286244082666D+11, 8.4899346165481429307D+13,&
     669                 :             : &             1.7128800897135812012D+16, 1.7253905888447681194D+18,&
     670                 :             : &             1.3886978985861357615D+03/
     671                 :             : !-------------------------------------------------------------------
     672                 :             : !  Coefficients for rational approximation of
     673                 :             : !    (Y1(X) - 2 LN(X/XY0) J1(X)) / (X**2 - XY0**2),
     674                 :             : !        XSMALL  <  |X|  <=  4.0
     675                 :             : !--------------------------------------------------------------------
     676                 :             : !CS    DATA PY0/2.2157953222280260820E+05,-5.9157479997408395984E+07,
     677                 :             : !CS   1         7.2144548214502560419E+09,-3.7595974497819597599E+11,
     678                 :             : !CS   2         5.4708611716525426053E+12, 4.0535726612579544093E+13,
     679                 :             : !CS   3        -3.1714424660046133456E+02/
     680                 :             : !CS    DATA QY0/8.2079908168393867438E+02, 3.8136470753052572164E+05,
     681                 :             : !CS   1         1.2250435122182963220E+08, 2.7800352738690585613E+10,
     682                 :             : !CS   2         4.1272286200406461981E+12, 3.0737873921079286084E+14/
     683                 :             :       DATA PY0/2.2157953222280260820D+05,-5.9157479997408395984D+07,&
     684                 :             : &              7.2144548214502560419D+09,-3.7595974497819597599D+11,&
     685                 :             : &              5.4708611716525426053D+12, 4.0535726612579544093D+13,&
     686                 :             : &             -3.1714424660046133456D+02/
     687                 :             :       DATA QY0/8.2079908168393867438D+02, 3.8136470753052572164D+05,&
     688                 :             : &              1.2250435122182963220D+08, 2.7800352738690585613D+10,&
     689                 :             : &              4.1272286200406461981D+12, 3.0737873921079286084D+14/
     690                 :             : !--------------------------------------------------------------------
     691                 :             : !  Coefficients for rational approximation of
     692                 :             : !    (Y1(X) - 2 LN(X/XY1) J1(X)) / (X**2 - XY1**2),
     693                 :             : !        4.0  <  |X|  <=  8.0
     694                 :             : !--------------------------------------------------------------------
     695                 :             : !CS    DATA PY1/ 1.9153806858264202986E+06,-1.1957961912070617006E+09,
     696                 :             : !CS   1          3.7453673962438488783E+11,-5.9530713129741981618E+13,
     697                 :             : !CS   2          4.0686275289804744814E+15,-2.3638408497043134724E+16,
     698                 :             : !CS   3         -5.6808094574724204577E+18, 1.1514276357909013326E+19,
     699                 :             : !CS   4         -1.2337180442012953128E+03/
     700                 :             : !CS    DATA QY1/ 1.2855164849321609336E+03, 1.0453748201934079734E+06,
     701                 :             : !CS   1          6.3550318087088919566E+08, 3.0221766852960403645E+11,
     702                 :             : !CS   2          1.1187010065856971027E+14, 3.0837179548112881950E+16,
     703                 :             : !CS   3          5.6968198822857178911E+18, 5.3321844313316185697E+20/
     704                 :             :        DATA PY1/ 1.9153806858264202986D+06,-1.1957961912070617006D+09,&
     705                 :             : &                3.7453673962438488783D+11,-5.9530713129741981618D+13,&
     706                 :             : &                4.0686275289804744814D+15,-2.3638408497043134724D+16,&
     707                 :             : &               -5.6808094574724204577D+18, 1.1514276357909013326D+19,&
     708                 :             : &               -1.2337180442012953128D+03/
     709                 :             :       DATA QY1/ 1.2855164849321609336D+03, 1.0453748201934079734D+06,&
     710                 :             : &               6.3550318087088919566D+08, 3.0221766852960403645D+11,&
     711                 :             : &               1.1187010065856971027D+14, 3.0837179548112881950D+16,&
     712                 :             : &               5.6968198822857178911D+18, 5.3321844313316185697D+20/
     713                 :             : !-------------------------------------------------------------------
     714                 :             : !  Coefficients for Hart,s approximation,  |X| > 8.0
     715                 :             : !-------------------------------------------------------------------
     716                 :             : !CS    DATA P0/-1.0982405543459346727E+05,-1.5235293511811373833E+06,
     717                 :             : !CS   1         -6.6033732483649391093E+06,-9.9422465050776411957E+06,
     718                 :             : !CS   2         -4.4357578167941278571E+06,-1.6116166443246101165E+03/
     719                 :             : !CS    DATA Q0/-1.0726385991103820119E+05,-1.5118095066341608816E+06,
     720                 :             : !CS   1         -6.5853394797230870728E+06,-9.9341243899345856590E+06,
     721                 :             : !CS   2         -4.4357578167941278568E+06,-1.4550094401904961825E+03/
     722                 :             : !CS    DATA P1/ 1.7063754290207680021E+03, 1.8494262873223866797E+04,
     723                 :             : !CS   1          6.6178836581270835179E+04, 8.5145160675335701966E+04,
     724                 :             : !CS   2          3.3220913409857223519E+04, 3.5265133846636032186E+01/
     725                 :             : !CS    DATA Q1/ 3.7890229745772202641E+04, 4.0029443582266975117E+05,
     726                 :             : !CS   1          1.4194606696037208929E+06, 1.8194580422439972989E+06,
     727                 :             : !CS   2          7.0871281941028743574E+05, 8.6383677696049909675E+02/
     728                 :             :       DATA P0/-1.0982405543459346727D+05,-1.5235293511811373833D+06,&
     729                 :             : &             -6.6033732483649391093D+06,-9.9422465050776411957D+06,&
     730                 :             : &             -4.4357578167941278571D+06,-1.6116166443246101165D+03/
     731                 :             :       DATA Q0/-1.0726385991103820119D+05,-1.5118095066341608816D+06,&
     732                 :             : &             -6.5853394797230870728D+06,-9.9341243899345856590D+06,&
     733                 :             : &             -4.4357578167941278568D+06,-1.4550094401904961825D+03/
     734                 :             :       DATA P1/ 1.7063754290207680021D+03, 1.8494262873223866797D+04,&
     735                 :             : &              6.6178836581270835179D+04, 8.5145160675335701966D+04,&
     736                 :             : &              3.3220913409857223519D+04, 3.5265133846636032186D+01/
     737                 :             :       DATA Q1/ 3.7890229745772202641D+04, 4.0029443582266975117D+05,&
     738                 :             : &              1.4194606696037208929D+06, 1.8194580422439972989D+06,&
     739                 :             : &              7.0871281941028743574D+05, 8.6383677696049909675D+02/
     740                 :             : !-------------------------------------------------------------------
     741                 :             : !  Check for error conditions
     742                 :             : !-------------------------------------------------------------------
     743                 :           0 :       AX = ABS(ARG)
     744   [ #  #  #  #  :           0 :       IF ((JINT .EQ. 1) .AND. ((ARG .LE. ZERO) .OR.&
             #  #  #  # ]
     745                 :             : &        ((ARG .LT. HALF) .AND. (AX*XINF .LT. PI2)))) THEN
     746                 :           0 :             RESULT = -XINF
     747                 :           0 :             GO TO 2000
     748         [ #  # ]:           0 :          ELSE IF (AX .GT. XMAX) THEN
     749                 :           0 :             RESULT = ZERO
     750                 :           0 :             GO TO 2000
     751                 :             :       END IF
     752         [ #  # ]:           0 :       IF (AX .GT. EIGHT) THEN
     753                 :             :             GO TO 800
     754         [ #  # ]:           0 :          ELSE IF (AX .LE. XSMALL) THEN
     755         [ #  # ]:           0 :             IF (JINT .EQ. 0) THEN
     756                 :           0 :                   RESULT = ARG * HALF
     757                 :             :                ELSE
     758                 :           0 :                   RESULT = -PI2 / AX
     759                 :             :             END IF
     760                 :             :             GO TO 2000
     761                 :             :       END IF
     762                 :             : !-------------------------------------------------------------------
     763                 :             : !  Calculate J1 for appropriate interval, preserving
     764                 :             : !     accuracy near the zero of J1
     765                 :             : !-------------------------------------------------------------------
     766                 :           0 :       ZSQ = AX * AX
     767         [ #  # ]:           0 :       IF (AX .LE. FOUR) THEN
     768                 :           0 :             XNUM = (PJ0(7) * ZSQ + PJ0(6)) * ZSQ + PJ0(5)
     769                 :           0 :             XDEN = ZSQ + QJ0(5)
     770         [ #  # ]:           0 :             DO 50 I = 1, 4
     771                 :           0 :                XNUM = XNUM * ZSQ + PJ0(I)
     772                 :           0 :                XDEN = XDEN * ZSQ + QJ0(I)
     773                 :           0 :    50       CONTINUE
     774                 :           0 :             PROD = ARG * ((AX - XJ01/TWO56) - XJ02) * (AX + XJ0)
     775                 :             :          ELSE
     776                 :           0 :             XNUM = PJ1(1)
     777                 :           0 :             XDEN = (ZSQ + QJ1(7)) * ZSQ + QJ1(1)
     778         [ #  # ]:           0 :             DO 220 I = 2, 6
     779                 :           0 :                XNUM = XNUM * ZSQ + PJ1(I)
     780                 :           0 :                XDEN = XDEN * ZSQ + QJ1(I)
     781                 :           0 :   220       CONTINUE
     782                 :           0 :             XNUM = XNUM * (AX - EIGHT) * (AX + EIGHT) + PJ1(7)
     783                 :           0 :             XNUM = XNUM * (AX - FOUR) * (AX + FOUR) + PJ1(8)
     784                 :           0 :             PROD = ARG * ((AX - XJ11/TWO56) - XJ12) * (AX + XJ1)
     785                 :             :       END IF
     786                 :           0 :       RESULT = PROD * (XNUM / XDEN)
     787         [ #  # ]:           0 :       IF (JINT .EQ. 0) GO TO 2000
     788                 :             : !-------------------------------------------------------------------
     789                 :             : !  Calculate Y1.  First find  RESJ = pi/2 ln(x/xn) J1(x),
     790                 :             : !    where xn is a zero of Y1
     791                 :             : !-------------------------------------------------------------------
     792         [ #  # ]:           0 :       IF (AX .LE. FOUR) THEN
     793                 :           0 :             UP = (AX-XY01/TWO56)-XY02
     794                 :           0 :             XY = XY0
     795                 :             :          ELSE
     796                 :           0 :             UP = (AX-XY11/TWO56)-XY12
     797                 :           0 :             XY = XY1
     798                 :             :       END IF
     799                 :           0 :       DOWN = AX + XY
     800         [ #  # ]:           0 :       IF (ABS(UP) .LT. P17*DOWN) THEN
     801                 :           0 :             W = UP/DOWN
     802                 :           0 :             WSQ = W*W
     803                 :           0 :             XNUM = PLG(1)
     804                 :           0 :             XDEN = WSQ + QLG(1)
     805         [ #  # ]:           0 :             DO 320 I = 2, 4
     806                 :           0 :                XNUM = XNUM*WSQ + PLG(I)
     807                 :           0 :                XDEN = XDEN*WSQ + QLG(I)
     808                 :           0 :   320       CONTINUE
     809                 :           0 :             RESJ = PI2 * RESULT * W * XNUM/XDEN
     810                 :             :          ELSE
     811                 :           0 :             RESJ = PI2 * RESULT * LOG(AX/XY)
     812                 :             :       END IF
     813                 :             : !-------------------------------------------------------------------
     814                 :             : !  Now calculate Y1 for appropriate interval, preserving
     815                 :             : !     accuracy near the zero of Y1
     816                 :             : !-------------------------------------------------------------------
     817         [ #  # ]:           0 :       IF (AX .LE. FOUR) THEN
     818                 :           0 :             XNUM = PY0(7) * ZSQ + PY0(1)
     819                 :           0 :             XDEN = ZSQ + QY0(1)
     820         [ #  # ]:           0 :             DO 340 I = 2, 6
     821                 :           0 :                XNUM = XNUM * ZSQ + PY0(I)
     822                 :           0 :                XDEN = XDEN * ZSQ + QY0(I)
     823                 :           0 :   340       CONTINUE
     824                 :             :          ELSE
     825                 :           0 :             XNUM = PY1(9) * ZSQ + PY1(1)
     826                 :           0 :             XDEN = ZSQ + QY1(1)
     827         [ #  # ]:           0 :             DO 360 I = 2, 8
     828                 :           0 :                XNUM = XNUM * ZSQ + PY1(I)
     829                 :           0 :                XDEN = XDEN * ZSQ + QY1(I)
     830                 :           0 :   360       CONTINUE
     831                 :             :       END IF
     832                 :           0 :       RESULT = RESJ + (UP*DOWN/AX) * XNUM / XDEN
     833                 :           0 :       GO TO 2000
     834                 :             : !-------------------------------------------------------------------
     835                 :             : !  Calculate J1 or Y1 for |ARG|  >  8.0
     836                 :             : !-------------------------------------------------------------------
     837                 :           0 :   800 Z = EIGHT / AX
     838                 :           0 :       W = AINT(AX/TWOPI) + THROV8
     839                 :           0 :       W = (AX - W * TWOPI1) - W * TWOPI2
     840                 :           0 :       ZSQ = Z * Z
     841                 :           0 :       XNUM = P0(6)
     842                 :           0 :       XDEN = ZSQ + Q0(6)
     843                 :           0 :       UP = P1(6)
     844                 :           0 :       DOWN = ZSQ + Q1(6)
     845         [ #  # ]:           0 :       DO 850 I = 1, 5
     846                 :           0 :          XNUM = XNUM * ZSQ + P0(I)
     847                 :           0 :          XDEN = XDEN * ZSQ + Q0(I)
     848                 :           0 :          UP = UP * ZSQ + P1(I)
     849                 :           0 :          DOWN = DOWN * ZSQ + Q1(I)
     850                 :           0 :   850 CONTINUE
     851                 :           0 :       R0 = XNUM / XDEN
     852                 :           0 :       R1 = UP / DOWN
     853         [ #  # ]:           0 :       IF (JINT .EQ. 0) THEN
     854                 :           0 :             RESULT = (RTPI2/SQRT(AX)) * (R0*COS(W) - Z*R1*SIN(W))
     855                 :             :          ELSE
     856                 :           0 :             RESULT = (RTPI2/SQRT(AX)) * (R0*SIN(W) + Z*R1*COS(W))
     857                 :             :       END IF
     858   [ #  #  #  # ]:           0 :       IF ((JINT .EQ. 0) .AND. (ARG .LT. ZERO)) RESULT = -RESULT
     859                 :           0 :  2000 RETURN
     860                 :             : !---------- Last card of CALJY1 ----------
     861                 :             :       END subroutine caljy1
     862                 :             : 
     863                 :             :       DOUBLE PRECISION FUNCTION BESJ1(X)
     864                 :             : !--------------------------------------------------------------------
     865                 :             : !
     866                 :             : ! This subprogram computes approximate values for Bessel functions
     867                 :             : !   of the first kind of order zero for arguments  |X| <= XMAX
     868                 :             : !   (see comments heading CALJY1).
     869                 :             : !
     870                 :             : !--------------------------------------------------------------------
     871                 :             :       !IMPLICIT NONE
     872                 :             :       INTEGER :: JINT
     873                 :             : !CS    REAL
     874                 :             :      DOUBLE PRECISION :: &
     875                 :             : &        RESULT,X
     876                 :             : !--------------------------------------------------------------------
     877                 :             :       JINT=0
     878                 :             :       CALL CALJY1(X,RESULT,JINT)
     879                 :             :       BESJ1 = RESULT
     880                 :             :       RETURN
     881                 :             : !---------- Last card of BESJ1 ----------
     882                 :             :       END function besj1
     883                 :             : 
     884                 :             : 
     885                 :             :       DOUBLE PRECISION FUNCTION BESY1(X)
     886                 :             : !--------------------------------------------------------------------
     887                 :             : !
     888                 :             : ! This subprogram computes approximate values for Bessel functions
     889                 :             : !   of the second kind of order zero for arguments 0 < X <= XMAX
     890                 :             : !   (see comments heading CALJY1).
     891                 :             : !
     892                 :             : !--------------------------------------------------------------------
     893                 :             :       !IMPLICIT NONE
     894                 :             :       INTEGER :: JINT
     895                 :             : !CS    REAL
     896                 :             :      DOUBLE PRECISION :: &
     897                 :             : &        RESULT,X
     898                 :             : !--------------------------------------------------------------------
     899                 :             :       JINT=1
     900                 :             :       CALL CALJY1(X,RESULT,JINT)
     901                 :             :       BESY1 = RESULT
     902                 :             :       RETURN
     903                 :             : !---------- Last card of BESY1 ----------
     904                 :             :       END function besy1
     905                 :             : !!***
     906                 :             : 
     907                 :             : !!****f* ABINIT/CALCK0
     908                 :             : !! NAME
     909                 :             : !!
     910                 :             : !! FUNCTION
     911                 :             : !!
     912                 :             : !! INPUTS
     913                 :             : !!
     914                 :             : !! OUTPUT
     915                 :             : !!
     916                 :             : !! SIDE EFFECTS
     917                 :             : !!
     918                 :             : !! NOTES
     919                 :             : !!
     920                 :             : !! SOURCE
     921                 :             : 
     922                 :     5345190 : SUBROUTINE CALCK0(ARG,RESULT,JINT)
     923                 :             : 
     924                 :             : !--------------------------------------------------------------------
     925                 :             : !
     926                 :             : ! This packet computes modified Bessel functions of the second kind
     927                 :             : !   and order zero, K0(X) and EXP(X)*K0(X), for real
     928                 :             : !   arguments X.  It contains two function type subprograms, BESK0
     929                 :             : !   and BESEK0, and one subroutine type subprogram, CALCK0.
     930                 :             : !   the calling statements for the primary entries are
     931                 :             : !
     932                 :             : !                   Y=BESK0(X)
     933                 :             : !   and
     934                 :             : !                   Y=BESEK0(X)
     935                 :             : !
     936                 :             : !   where the entry points correspond to the functions K0(X) and
     937                 :             : !   EXP(X)*K0(X), respectively.  The routine CALCK0 is
     938                 :             : !   intended for internal packet use only, all computations within
     939                 :             : !   the packet being concentrated in this routine.  The function
     940                 :             : !   subprograms invoke CALCK0 with the statement
     941                 :             : !          CALL CALCK0(ARG,RESULT,JINT)
     942                 :             : !   where the parameter usage is as follows
     943                 :             : !
     944                 :             : !      Function                     Parameters for CALCK0
     945                 :             : !       Call              ARG                  RESULT          JINT
     946                 :             : !
     947                 :             : !     BESK0(ARG)   0 .LT. ARG .LE. XMAX       K0(ARG)           1
     948                 :             : !     BESEK0(ARG)     0 .LT. ARG           EXP(ARG)*K0(ARG)     2
     949                 :             : !
     950                 :             : !   The main computation evaluates slightly modified forms of near
     951                 :             : !   minimax rational approximations generated by Russon and Blair,
     952                 :             : !   Chalk River (Atomic Energy of Canada Limited) Report AECL-3461,
     953                 :             : !   1969.  This transportable program is patterned after the
     954                 :             : !   machine-dependent FUNPACK packet NATSK0, but cannot match that
     955                 :             : !   version for efficiency or accuracy.  This version uses rational
     956                 :             : !   functions that theoretically approximate K-SUB-0(X) to at
     957                 :             : !   least 18 significant decimal digits.  The accuracy achieved
     958                 :             : !   depends on the arithmetic system, the compiler, the intrinsic
     959                 :             : !   functions, and proper selection of the machine-dependent
     960                 :             : !   constants.
     961                 :             : !
     962                 :             : !*******************************************************************
     963                 :             : !*******************************************************************
     964                 :             : !
     965                 :             : ! Explanation of machine-dependent constants
     966                 :             : !
     967                 :             : !   beta   = Radix for the floating-point system
     968                 :             : !   minexp = Smallest representable power of beta
     969                 :             : !   maxexp = Smallest power of beta that overflows
     970                 :             : !   XSMALL = Argument below which BESK0 and BESEK0 may
     971                 :             : !            each be represented by a constant and a log.
     972                 :             : !            largest X such that  1.0 + X = 1.0  to machine
     973                 :             : !            precision.
     974                 :             : !   XINF   = Largest positive machine number; approximately
     975                 :             : !            beta**maxexp
     976                 :             : !   XMAX   = Largest argument acceptable to BESK0;  Solution to
     977                 :             : !            equation:
     978                 :             : !               W(X) * (1-1/8X+9/128X**2) = beta**minexp
     979                 :             : !            where  W(X) = EXP(-X)*SQRT(PI/2X)
     980                 :             : !
     981                 :             : !
     982                 :             : !     Approximate values for some important machines are:
     983                 :             : !
     984                 :             : !
     985                 :             : !                           beta       minexp       maxexp
     986                 :             : !
     987                 :             : !  CRAY-1        (S.P.)       2        -8193         8191
     988                 :             : !  Cyber 180/185
     989                 :             : !    under NOS   (S.P.)       2         -975         1070
     990                 :             : !  IEEE (IBM/XT,
     991                 :             : !    SUN, etc.)  (S.P.)       2         -126          128
     992                 :             : !  IEEE (IBM/XT,
     993                 :             : !    SUN, etc.)  (D.P.)       2        -1022         1024
     994                 :             : !  IBM 3033      (D.P.)      16          -65           63
     995                 :             : !  VAX D-Format  (D.P.)       2         -128          127
     996                 :             : !  VAX G-Format  (D.P.)       2        -1024         1023
     997                 :             : !
     998                 :             : !
     999                 :             : !                          XSMALL       XINF         XMAX
    1000                 :             : !
    1001                 :             : ! CRAY-1        (S.P.)    3.55E-15   5.45E+2465    5674.858
    1002                 :             : ! Cyber 180/855
    1003                 :             : !   under NOS   (S.P.)    1.77E-15   1.26E+322      672.788
    1004                 :             : ! IEEE (IBM/XT,
    1005                 :             : !   SUN, etc.)  (S.P.)    5.95E-8    3.40E+38        85.337
    1006                 :             : ! IEEE (IBM/XT,
    1007                 :             : !   SUN, etc.)  (D.P.)    1.11D-16   1.79D+308      705.342
    1008                 :             : ! IBM 3033      (D.P.)    1.11D-16   7.23D+75       177.852
    1009                 :             : ! VAX D-Format  (D.P.)    6.95D-18   1.70D+38        86.715
    1010                 :             : ! VAX G-Format  (D.P.)    5.55D-17   8.98D+307      706.728
    1011                 :             : !
    1012                 :             : !*******************************************************************
    1013                 :             : !*******************************************************************
    1014                 :             : !
    1015                 :             : ! Error returns
    1016                 :             : !
    1017                 :             : !  The program returns the value XINF for ARG .LE. 0.0, and the
    1018                 :             : !  BESK0 entry returns the value 0.0 for ARG .GT. XMAX.
    1019                 :             : !
    1020                 :             : !
    1021                 :             : !  Intrinsic functions required are:
    1022                 :             : !
    1023                 :             : !     EXP, LOG, SQRT
    1024                 :             : !
    1025                 :             : !  Latest modification: March 19, 1990
    1026                 :             : !
    1027                 :             : !  Authors: W. J. Cody and Laura Stoltz
    1028                 :             : !           Mathematics and Computer Science Division
    1029                 :             : !           Argonne National Laboratory
    1030                 :             : !           Argonne, IL 60439
    1031                 :             : !
    1032                 :             : !  Original subroutine from netlib http://www.netlib.org/specfun/k0
    1033                 :             : !  Slightly modified by MG to follow f90 rules and double precision arithmetic
    1034                 :             : !
    1035                 :             : !--------------------------------------------------------------------
    1036                 :             :       !IMPLICIT NONE
    1037                 :             :       INTEGER :: I,JINT
    1038                 :             : !CS    REAL
    1039                 :             :       DOUBLE PRECISION :: ARG,RESULT,SUMF,SUMG,SUMP,SUMQ,TEMP
    1040                 :             : !CS    REAL
    1041                 :             :       DOUBLE PRECISION :: X,XX
    1042                 :             : !CS    REAL
    1043                 :             :       DOUBLE PRECISION :: P(6),Q(2),PP(10),QQ(10),F(4),G(3)
    1044                 :             : !C--------------------------------------------------------------------
    1045                 :             : !C  Mathematical constants
    1046                 :             : !C--------------------------------------------------------------------
    1047                 :             : !CS    REAL, PARAMETER  ::             ONE=1.0E0,ZERO=0.0E0
    1048                 :             :       DOUBLE PRECISION,PARAMETER ::  ONE=1.0D0,ZERO=0.0D0
    1049                 :             : !C--------------------------------------------------------------------
    1050                 :             : !C  Machine-dependent constants
    1051                 :             : !C--------------------------------------------------------------------
    1052                 :             : !CS    REAL.PARAMETER ::             XSMALL=5.95E-8, XINF=3.40E+38 ,XMAX=85.337E0
    1053                 :             :       DOUBLE PRECISION,PARAMETER :: XSMALL=1.11D-16,XINF=1.79D+308,XMAX=705.342D0
    1054                 :             : !--------------------------------------------------------------------
    1055                 :             : !
    1056                 :             : !     Coefficients for XSMALL .LE.  ARG  .LE. 1.0
    1057                 :             : !
    1058                 :             : !--------------------------------------------------------------------
    1059                 :             : !S    DATA   P/ 5.8599221412826100000E-04, 1.3166052564989571850E-01,
    1060                 :             : !S   1          1.1999463724910714109E+01, 4.6850901201934832188E+02,
    1061                 :             : !S   2          5.9169059852270512312E+03, 2.4708152720399552679E+03/
    1062                 :             : !S    DATA   Q/-2.4994418972832303646E+02, 2.1312714303849120380E+04/
    1063                 :             : !S    DATA   F/-1.6414452837299064100E+00,-2.9601657892958843866E+02,
    1064                 :             : !S   1         -1.7733784684952985886E+04,-4.0320340761145482298E+05/
    1065                 :             : !S    DATA   G/-2.5064972445877992730E+02, 2.9865713163054025489E+04,
    1066                 :             : !S   1         -1.6128136304458193998E+06/
    1067                 :             :      DATA    P/5.8599221412826100000D-04,1.3166052564989571850D-01,&
    1068                 :             : &              1.1999463724910714109D+01,4.6850901201934832188D+02,&
    1069                 :             : &              5.9169059852270512312D+03,2.4708152720399552679D+03/
    1070                 :             :      DATA    Q/-2.4994418972832303646D+02, 2.1312714303849120380D+04/
    1071                 :             :      DATA    F/-1.6414452837299064100D+00,-2.9601657892958843866D+02,&
    1072                 :             : &              -1.7733784684952985886D+04,-4.0320340761145482298D+05/
    1073                 :             :      DATA    G/-2.5064972445877992730D+02, 2.9865713163054025489D+04,&
    1074                 :             : &              -1.6128136304458193998D+06/
    1075                 :             : !--------------------------------------------------------------------
    1076                 :             : !
    1077                 :             : !     Coefficients for  1.0 .LT. ARG
    1078                 :             : !
    1079                 :             : !--------------------------------------------------------------------
    1080                 :             : !S    DATA  PP/ 1.1394980557384778174E+02, 3.6832589957340267940E+03,
    1081                 :             : !S   1          3.1075408980684392399E+04, 1.0577068948034021957E+05,
    1082                 :             : !S   2          1.7398867902565686251E+05, 1.5097646353289914539E+05,
    1083                 :             : !S   3          7.1557062783764037541E+04, 1.8321525870183537725E+04,
    1084                 :             : !S   4          2.3444738764199315021E+03, 1.1600249425076035558E+02/
    1085                 :             : !S    DATA  QQ/ 2.0013443064949242491E+02, 4.4329628889746408858E+03,
    1086                 :             : !S   1          3.1474655750295278825E+04, 9.7418829762268075784E+04,
    1087                 :             : !S   2          1.5144644673520157801E+05, 1.2689839587977598727E+05,
    1088                 :             : !S   3          5.8824616785857027752E+04, 1.4847228371802360957E+04,
    1089                 :             : !S   4          1.8821890840982713696E+03, 9.2556599177304839811E+01/
    1090                 :             :      DATA  PP/  1.1394980557384778174D+02, 3.6832589957340267940D+03,&
    1091                 :             : &               3.1075408980684392399D+04, 1.0577068948034021957D+05,&
    1092                 :             : &               1.7398867902565686251D+05, 1.5097646353289914539D+05,&
    1093                 :             : &               7.1557062783764037541D+04, 1.8321525870183537725D+04,&
    1094                 :             : &               2.3444738764199315021D+03, 1.1600249425076035558D+02/
    1095                 :             :      DATA  QQ/  2.0013443064949242491D+02, 4.4329628889746408858D+03, &
    1096                 :             : &                3.1474655750295278825D+04, 9.7418829762268075784D+04,&
    1097                 :             : &                1.5144644673520157801D+05, 1.2689839587977598727D+05,&
    1098                 :             : &                5.8824616785857027752D+04, 1.4847228371802360957D+04,&
    1099                 :             : &                1.8821890840982713696D+03, 9.2556599177304839811D+01/
    1100                 :             : !--------------------------------------------------------------------
    1101                 :     5345190 :       X = ARG
    1102         [ +  - ]:     5345190 :       IF (X .GT. ZERO) THEN
    1103         [ +  + ]:     5345190 :             IF (X .LE. ONE) THEN
    1104                 :             : !--------------------------------------------------------------------
    1105                 :             : !     0.0 .LT.  ARG  .LE. 1.0
    1106                 :             : !--------------------------------------------------------------------
    1107                 :     1708190 :                   TEMP = LOG(X)
    1108         [ -  + ]:     1708190 :                   IF (X .LT. XSMALL) THEN
    1109                 :             : !--------------------------------------------------------------------
    1110                 :             : !     Return for small ARG
    1111                 :             : !--------------------------------------------------------------------
    1112                 :           0 :                         RESULT = P(6)/Q(2) - TEMP
    1113                 :             :                      ELSE
    1114                 :     1708190 :                         XX = X * X
    1115                 :             :                         SUMP = ((((P(1)*XX + P(2))*XX + P(3))*XX +&
    1116                 :     1708190 :                                P(4))*XX + P(5))*XX + P(6)
    1117                 :     1708190 :                         SUMQ = (XX + Q(1))*XX + Q(2)
    1118                 :     1708190 :                         SUMF = ((F(1)*XX + F(2))*XX + F(3))*XX + F(4)
    1119                 :     1708190 :                         SUMG = ((XX + G(1))*XX + G(2))*XX + G(3)
    1120                 :     1708190 :                         RESULT = SUMP/SUMQ - XX*SUMF*TEMP/SUMG - TEMP
    1121         [ -  + ]:     1708190 :                         IF (JINT .EQ. 2) RESULT = RESULT * EXP(X)
    1122                 :             :                   END IF
    1123   [ +  -  -  + ]:     3637000 :                ELSE IF ((JINT .EQ. 1) .AND. (X .GT. XMAX)) THEN
    1124                 :             : !--------------------------------------------------------------------
    1125                 :             : !     Error return for ARG .GT. XMAX
    1126                 :             : !--------------------------------------------------------------------
    1127                 :           0 :                   RESULT = ZERO
    1128                 :             :                ELSE
    1129                 :             : !--------------------------------------------------------------------
    1130                 :             : !     1.0 .LT. ARG
    1131                 :             : !--------------------------------------------------------------------
    1132                 :     3637000 :                   XX = ONE / X
    1133                 :     3637000 :                   SUMP = PP(1)
    1134         [ +  + ]:    36370000 :                   DO 120 I = 2, 10
    1135                 :    32733000 :                      SUMP = SUMP*XX + PP(I)
    1136                 :     3637000 :   120             CONTINUE
    1137                 :             :                   SUMQ = XX
    1138         [ +  + ]:    36370000 :                   DO 140 I = 1, 9
    1139                 :    32733000 :                      SUMQ = (SUMQ + QQ(I))*XX
    1140                 :     3637000 :   140             CONTINUE
    1141                 :     3637000 :                   SUMQ = SUMQ + QQ(10)
    1142                 :     3637000 :                   RESULT = SUMP / SUMQ / SQRT(X)
    1143         [ +  - ]:     3637000 :                   IF (JINT .EQ. 1) RESULT = RESULT * EXP(-X)
    1144                 :             :             END IF
    1145                 :             :          ELSE
    1146                 :             : !--------------------------------------------------------------------
    1147                 :             : !     Error return for ARG .LE. 0.0
    1148                 :             : !--------------------------------------------------------------------
    1149                 :           0 :             RESULT = XINF
    1150                 :             :       END IF
    1151                 :             : !--------------------------------------------------------------------
    1152                 :             : !     Update error counts, etc.
    1153                 :             : !--------------------------------------------------------------------
    1154                 :     5345190 :       RETURN
    1155                 :             : !---------- Last line of CALCK0 ----------
    1156                 :             :       END subroutine calck0
    1157                 :             : !!***
    1158                 :             : 
    1159                 :             : !S    REAL
    1160                 :             :       DOUBLE PRECISION FUNCTION BESK0(X)
    1161                 :             : !--------------------------------------------------------------------
    1162                 :             : !
    1163                 :             : ! This function program computes approximate values for the
    1164                 :             : !   modified Bessel function of the second kind of order zero
    1165                 :             : !   for arguments 0.0 .LT. ARG .LE. XMAX (see comments heading
    1166                 :             : !   CALCK0).
    1167                 :             : !
    1168                 :             : !  Authors: W. J. Cody and Laura Stoltz
    1169                 :             : !
    1170                 :             : !  Latest Modification: January 19, 1988
    1171                 :             : !
    1172                 :             : !--------------------------------------------------------------------
    1173                 :             :       !IMPLICIT NONE
    1174                 :             :       INTEGER :: JINT
    1175                 :             : !S    REAL
    1176                 :             :       DOUBLE PRECISION :: X, RESULT
    1177                 :             : !--------------------------------------------------------------------
    1178                 :             :       JINT = 1
    1179                 :             :       CALL CALCK0(X,RESULT,JINT)
    1180                 :             :       BESK0 = RESULT
    1181                 :             :       RETURN
    1182                 :             : !---------- Last line of BESK0 ----------
    1183                 :             :       END function besk0
    1184                 :             : !!***
    1185                 :             : 
    1186                 :             : !S    REAL
    1187                 :             :       DOUBLE PRECISION FUNCTION BESEK0(X)
    1188                 :             : !--------------------------------------------------------------------
    1189                 :             : !
    1190                 :             : ! This function program computes approximate values for the
    1191                 :             : !   modified Bessel function of the second kind of order zero
    1192                 :             : !   multiplied by the Exponential function, for arguments
    1193                 :             : !   0.0 .LT. ARG.
    1194                 :             : !
    1195                 :             : !  Authors: W. J. Cody and Laura Stoltz
    1196                 :             : !
    1197                 :             : !  Latest Modification: January 19, 1988
    1198                 :             : !
    1199                 :             : !--------------------------------------------------------------------
    1200                 :             :       !IMPLICIT NONE
    1201                 :             :       INTEGER JINT
    1202                 :             : !S    REAL
    1203                 :             :       DOUBLE PRECISION :: X,RESULT
    1204                 :             : !--------------------------------------------------------------------
    1205                 :             :       JINT = 2
    1206                 :             :       CALL CALCK0(X,RESULT,JINT)
    1207                 :             :       BESEK0 = RESULT
    1208                 :             :       RETURN
    1209                 :             : !---------- Last line of BESEK0 ----------
    1210                 :             :       END function BESEK0
    1211                 :             : !!***
    1212                 :             : 
    1213                 :             : !!****f* ABINIT/CALCK1
    1214                 :             : !! NAME
    1215                 :             : !!  CALCK1
    1216                 :             : !!
    1217                 :             : !! FUNCTION
    1218                 :             : !!
    1219                 :             : !! INPUTS
    1220                 :             : !!
    1221                 :             : !! OUTPUT
    1222                 :             : !!
    1223                 :             : !! SIDE EFFECTS
    1224                 :             : !!
    1225                 :             : !! NOTES
    1226                 :             : !!
    1227                 :             : !! SOURCE
    1228                 :             : 
    1229                 :           0 : SUBROUTINE CALCK1(ARG,RESULT,JINT)
    1230                 :             : 
    1231                 :             : !--------------------------------------------------------------------
    1232                 :             : !
    1233                 :             : ! This packet computes modified Bessel functions of the second kind
    1234                 :             : !   and order one,  K1(X)  and  EXP(X)*K1(X), for real arguments X.
    1235                 :             : !   It contains two function type subprograms, BESK1  and  BESEK1,
    1236                 :             : !   and one subroutine type subprogram, CALCK1.  The calling
    1237                 :             : !   statements for the primary entries are
    1238                 :             : !
    1239                 :             : !                   Y=BESK1(X)
    1240                 :             : !   and
    1241                 :             : !                   Y=BESEK1(X)
    1242                 :             : !
    1243                 :             : !   where the entry points correspond to the functions K1(X) and
    1244                 :             : !   EXP(X)*K1(X), respectively.  The routine CALCK1 is intended
    1245                 :             : !   for internal packet use only, all computations within the
    1246                 :             : !   packet being concentrated in this routine.  The function
    1247                 :             : !   subprograms invoke CALCK1 with the statement
    1248                 :             : !          CALL CALCK1(ARG,RESULT,JINT)
    1249                 :             : !   where the parameter usage is as follows
    1250                 :             : !
    1251                 :             : !      Function                      Parameters for CALCK1
    1252                 :             : !        Call             ARG                  RESULT          JINT
    1253                 :             : !
    1254                 :             : !     BESK1(ARG)  XLEAST .LT. ARG .LT. XMAX    K1(ARG)          1
    1255                 :             : !     BESEK1(ARG)     XLEAST .LT. ARG       EXP(ARG)*K1(ARG)    2
    1256                 :             : !
    1257                 :             : !   The main computation evaluates slightly modified forms of near
    1258                 :             : !   minimax rational approximations generated by Russon and Blair,
    1259                 :             : !   Chalk River (Atomic Energy of Canada Limited) Report AECL-3461,
    1260                 :             : !   1969.  This transportable program is patterned after the
    1261                 :             : !   machine-dependent FUNPACK packet NATSK1, but cannot match that
    1262                 :             : !   version for efficiency or accuracy.  This version uses rational
    1263                 :             : !   functions that theoretically approximate K-SUB-1(X) to at
    1264                 :             : !   least 18 significant decimal digits.  The accuracy achieved
    1265                 :             : !   depends on the arithmetic system, the compiler, the intrinsic
    1266                 :             : !   functions, and proper selection of the machine-dependent
    1267                 :             : !   constants.
    1268                 :             : !
    1269                 :             : !*******************************************************************
    1270                 :             : !*******************************************************************
    1271                 :             : !
    1272                 :             : ! Explanation of machine-dependent constants
    1273                 :             : !
    1274                 :             : !   beta   = Radix for the floating-point system
    1275                 :             : !   minexp = Smallest representable power of beta
    1276                 :             : !   maxexp = Smallest power of beta that overflows
    1277                 :             : !   XLEAST = Smallest acceptable argument, i.e., smallest machine
    1278                 :             : !            number X such that 1/X is machine representable.
    1279                 :             : !   XSMALL = Argument below which BESK1(X) and BESEK1(X) may
    1280                 :             : !            each be represented by 1/X.  A safe value is the
    1281                 :             : !            largest X such that  1.0 + X = 1.0  to machine
    1282                 :             : !            precision.
    1283                 :             : !   XINF   = Largest positive machine number; approximately
    1284                 :             : !            beta**maxexp
    1285                 :             : !   XMAX   = Largest argument acceptable to BESK1;  Solution to
    1286                 :             : !            equation:
    1287                 :             : !               W(X) * (1+3/8X-15/128X**2) = beta**minexp
    1288                 :             : !            where  W(X) = EXP(-X)*SQRT(PI/2X)
    1289                 :             : !
    1290                 :             : !
    1291                 :             : !     Approximate values for some important machines are:
    1292                 :             : !
    1293                 :             : !                           beta       minexp       maxexp
    1294                 :             : !
    1295                 :             : !  CRAY-1        (S.P.)       2        -8193         8191
    1296                 :             : !  Cyber 180/185
    1297                 :             : !    under NOS   (S.P.)       2         -975         1070
    1298                 :             : !  IEEE (IBM/XT,
    1299                 :             : !    SUN, etc.)  (S.P.)       2         -126          128
    1300                 :             : !  IEEE (IBM/XT,
    1301                 :             : !    SUN, etc.)  (D.P.)       2        -1022         1024
    1302                 :             : !  IBM 3033      (D.P.)      16          -65           63
    1303                 :             : !  VAX D-Format  (D.P.)       2         -128          127
    1304                 :             : !  VAX G-Format  (D.P.)       2        -1024         1023
    1305                 :             : !
    1306                 :             : !
    1307                 :             : !                         XLEAST     XSMALL      XINF       XMAX
    1308                 :             : !
    1309                 :             : ! CRAY-1                1.84E-2466  3.55E-15  5.45E+2465  5674.858
    1310                 :             : ! Cyber 180/855
    1311                 :             : !   under NOS   (S.P.)  3.14E-294   1.77E-15  1.26E+322    672.789
    1312                 :             : ! IEEE (IBM/XT,
    1313                 :             : !   SUN, etc.)  (S.P.)  1.18E-38    5.95E-8   3.40E+38      85.343
    1314                 :             : ! IEEE (IBM/XT,
    1315                 :             : !   SUN, etc.)  (D.P.)  2.23D-308   1.11D-16  1.79D+308    705.343
    1316                 :             : ! IBM 3033      (D.P.)  1.39D-76    1.11D-16  7.23D+75     177.855
    1317                 :             : ! VAX D-Format  (D.P.)  5.88D-39    6.95D-18  1.70D+38      86.721
    1318                 :             : ! VAX G-Format  (D.P.)  1.12D-308   5.55D-17  8.98D+307    706.728
    1319                 :             : !
    1320                 :             : !*******************************************************************
    1321                 :             : !*******************************************************************
    1322                 :             : !
    1323                 :             : ! Error returns
    1324                 :             : !
    1325                 :             : !  The program returns the value XINF for ARG .LE. 0.0 and the
    1326                 :             : !   BESK1 entry returns the value 0.0 for ARG .GT. XMAX.
    1327                 :             : !
    1328                 :             : !
    1329                 :             : !  Intrinsic functions required are:
    1330                 :             : !
    1331                 :             : !     LOG, SQRT, EXP
    1332                 :             : !
    1333                 :             : !
    1334                 :             : !  Authors: W. J. Cody and Laura Stoltz
    1335                 :             : !           Mathematics and Computer Science Division
    1336                 :             : !           Argonne National Laboratory
    1337                 :             : !           Argonne, IL 60439
    1338                 :             : !
    1339                 :             : !  Latest modification: January 28, 1988
    1340                 :             : !  Taken from http://www.netlib.org/specfun/k1
    1341                 :             : !
    1342                 :             : !--------------------------------------------------------------------
    1343                 :             :       !IMPLICIT NONE
    1344                 :             :       INTEGER :: I,JINT
    1345                 :             : !CS    REAL
    1346                 :             :       DOUBLE PRECISION :: &
    1347                 :             : &         ARG,F,G,ONE,P,PP,Q,QQ,RESULT,SUMF,SUMG,&
    1348                 :             : &         SUMP,SUMQ,X,XINF,XMAX,XLEAST,XSMALL,XX,ZERO
    1349                 :             :       DIMENSION P(5),Q(3),PP(11),QQ(9),F(5),G(3)
    1350                 :             : !--------------------------------------------------------------------
    1351                 :             : !  Mathematical constants
    1352                 :             : !--------------------------------------------------------------------
    1353                 :             : !CS    DATA ONE/1.0E0/,ZERO/0.0E0/
    1354                 :             :        DATA ONE/1.0D0/,ZERO/0.0D0/
    1355                 :             : !--------------------------------------------------------------------
    1356                 :             : !  Machine-dependent constants
    1357                 :             : !--------------------------------------------------------------------
    1358                 :             : !CS    DATA XLEAST/1.18E-38/,XSMALL/5.95E-8/,XINF/3.40E+38/,
    1359                 :             : !CS   1     XMAX/85.343E+0/
    1360                 :             :      DATA XLEAST/2.23D-308/,XSMALL/1.11D-16/,XINF/1.79D+308/,&
    1361                 :             : &         XMAX/705.343D+0/
    1362                 :             : !--------------------------------------------------------------------
    1363                 :             : !  Coefficients for  XLEAST .LE.  ARG  .LE. 1.0
    1364                 :             : !--------------------------------------------------------------------
    1365                 :             : !CS    DATA   P/ 4.8127070456878442310E-1, 9.9991373567429309922E+1,
    1366                 :             : !CS   1          7.1885382604084798576E+3, 1.7733324035147015630E+5,
    1367                 :             : !CS   2          7.1938920065420586101E+5/
    1368                 :             : !CS    DATA   Q/-2.8143915754538725829E+2, 3.7264298672067697862E+4,
    1369                 :             : !CS   1         -2.2149374878243304548E+6/
    1370                 :             : !CS    DATA   F/-2.2795590826955002390E-1,-5.3103913335180275253E+1,
    1371                 :             : !CS   1         -4.5051623763436087023E+3,-1.4758069205414222471E+5,
    1372                 :             : !CS   2         -1.3531161492785421328E+6/
    1373                 :             : !CS    DATA   G/-3.0507151578787595807E+2, 4.3117653211351080007E+4,
    1374                 :             : !CS   2         -2.7062322985570842656E+6/
    1375                 :             :       DATA   P/ 4.8127070456878442310D-1, 9.9991373567429309922D+1,&
    1376                 :             : &             7.1885382604084798576D+3, 1.7733324035147015630D+5,&
    1377                 :             : &             7.1938920065420586101D+5/
    1378                 :             :     DATA   Q/-2.8143915754538725829D+2, 3.7264298672067697862D+4,&
    1379                 :             : &            -2.2149374878243304548D+6/
    1380                 :             :     DATA   F/-2.2795590826955002390D-1,-5.3103913335180275253D+1,&
    1381                 :             : &            -4.5051623763436087023D+3,-1.4758069205414222471D+5,&
    1382                 :             : &            -1.3531161492785421328D+6/
    1383                 :             :     DATA   G/-3.0507151578787595807D+2, 4.3117653211351080007D+4,&
    1384                 :             : &            -2.7062322985570842656D+6/
    1385                 :             : !--------------------------------------------------------------------
    1386                 :             : !  Coefficients for  1.0 .LT.  ARG
    1387                 :             : !--------------------------------------------------------------------
    1388                 :             : !CS    DATA  PP/ 6.4257745859173138767E-2, 7.5584584631176030810E+0,
    1389                 :             : !CS   1          1.3182609918569941308E+2, 8.1094256146537402173E+2,
    1390                 :             : !CS   2          2.3123742209168871550E+3, 3.4540675585544584407E+3,
    1391                 :             : !CS   3          2.8590657697910288226E+3, 1.3319486433183221990E+3,
    1392                 :             : !CS   4          3.4122953486801312910E+2, 4.4137176114230414036E+1,
    1393                 :             : !CS   5          2.2196792496874548962E+0/
    1394                 :             : !CS    DATA  QQ/ 3.6001069306861518855E+1, 3.3031020088765390854E+2,
    1395                 :             : !CS   1          1.2082692316002348638E+3, 2.1181000487171943810E+3,
    1396                 :             : !CS   2          1.9448440788918006154E+3, 9.6929165726802648634E+2,
    1397                 :             : !CS   3          2.5951223655579051357E+2, 3.4552228452758912848E+1,
    1398                 :             : !CS   4          1.7710478032601086579E+0/
    1399                 :             :     DATA  PP/ 6.4257745859173138767D-2, 7.5584584631176030810D+0,&
    1400                 :             : &             1.3182609918569941308D+2, 8.1094256146537402173D+2,&
    1401                 :             : &             2.3123742209168871550D+3, 3.4540675585544584407D+3,&
    1402                 :             : &             2.8590657697910288226D+3, 1.3319486433183221990D+3,&
    1403                 :             : &             3.4122953486801312910D+2, 4.4137176114230414036D+1,&
    1404                 :             : &             2.2196792496874548962D+0/
    1405                 :             :     DATA  QQ/ 3.6001069306861518855D+1, 3.3031020088765390854D+2,&
    1406                 :             : &             1.2082692316002348638D+3, 2.1181000487171943810D+3,&
    1407                 :             : &             1.9448440788918006154D+3, 9.6929165726802648634D+2,&
    1408                 :             : &             2.5951223655579051357D+2, 3.4552228452758912848D+1,&
    1409                 :             : &             1.7710478032601086579D+0/
    1410                 :             : !--------------------------------------------------------------------
    1411                 :           0 :       X = ARG
    1412         [ #  # ]:           0 :       IF (X .LT. XLEAST) THEN
    1413                 :             : !--------------------------------------------------------------------
    1414                 :             : !  Error return for  ARG  .LT. XLEAST
    1415                 :             : !--------------------------------------------------------------------
    1416                 :           0 :             RESULT = XINF
    1417         [ #  # ]:           0 :          ELSE IF (X .LE. ONE) THEN
    1418                 :             : !--------------------------------------------------------------------
    1419                 :             : !  XLEAST .LE.  ARG  .LE. 1.0
    1420                 :             : !--------------------------------------------------------------------
    1421         [ #  # ]:           0 :             IF (X .LT. XSMALL) THEN
    1422                 :             : !--------------------------------------------------------------------
    1423                 :             : !  Return for small ARG
    1424                 :             : !--------------------------------------------------------------------
    1425                 :           0 :                   RESULT = ONE / X
    1426                 :             :                ELSE
    1427                 :           0 :                   XX = X * X
    1428                 :             :                   SUMP = ((((P(1)*XX + P(2))*XX + P(3))*XX + P(4))*XX &
    1429                 :           0 : &                        + P(5))*XX + Q(3)
    1430                 :           0 :                   SUMQ = ((XX + Q(1))*XX + Q(2))*XX + Q(3)
    1431                 :             :                   SUMF = (((F(1)*XX + F(2))*XX + F(3))*XX + F(4))*XX &
    1432                 :           0 : &                        + F(5)
    1433                 :           0 :                   SUMG = ((XX + G(1))*XX + G(2))*XX + G(3)
    1434                 :           0 :                   RESULT = (XX * LOG(X) * SUMF/SUMG + SUMP/SUMQ) / X
    1435         [ #  # ]:           0 :                   IF (JINT .EQ. 2) RESULT = RESULT * EXP(X)
    1436                 :             :             END IF
    1437   [ #  #  #  # ]:           0 :          ELSE IF ((JINT .EQ. 1) .AND. (X .GT. XMAX)) THEN
    1438                 :             : !--------------------------------------------------------------------
    1439                 :             : !  Error return for  ARG  .GT. XMAX
    1440                 :             : !--------------------------------------------------------------------
    1441                 :           0 :             RESULT = ZERO
    1442                 :             :          ELSE
    1443                 :             : !--------------------------------------------------------------------
    1444                 :             : !  1.0 .LT.  ARG
    1445                 :             : !--------------------------------------------------------------------
    1446                 :           0 :             XX = ONE / X
    1447                 :           0 :             SUMP = PP(1)
    1448         [ #  # ]:           0 :             DO 120 I = 2, 11
    1449                 :           0 :                SUMP = SUMP * XX + PP(I)
    1450                 :           0 :   120       CONTINUE
    1451                 :             :             SUMQ = XX
    1452         [ #  # ]:           0 :             DO 140 I = 1, 8
    1453                 :           0 :                SUMQ = (SUMQ + QQ(I)) * XX
    1454                 :           0 :   140       CONTINUE
    1455                 :           0 :             SUMQ = SUMQ + QQ(9)
    1456                 :           0 :             RESULT = SUMP / SUMQ / SQRT(X)
    1457         [ #  # ]:           0 :             IF (JINT .EQ. 1) RESULT = RESULT * EXP(-X)
    1458                 :             :       END IF
    1459                 :           0 :       RETURN
    1460                 :             : !---------- Last line of CALCK1 ----------
    1461                 :             :       END subroutine calck1
    1462                 :             : !!***
    1463                 :             : 
    1464                 :             : !CS    REAL
    1465                 :             :       DOUBLE PRECISION FUNCTION BESK1(X)
    1466                 :             : !--------------------------------------------------------------------
    1467                 :             : !
    1468                 :             : ! This function program computes approximate values for the
    1469                 :             : !   modified Bessel function of the second kind of order one
    1470                 :             : !   for arguments  XLEAST .LE. ARG .LE. XMAX.
    1471                 :             : !
    1472                 :             : !--------------------------------------------------------------------
    1473                 :             :       !IMPLICIT NONE
    1474                 :             :       INTEGER :: JINT
    1475                 :             : !CS    REAL
    1476                 :             :       DOUBLE PRECISION :: &
    1477                 :             : &         X, RESULT
    1478                 :             : !--------------------------------------------------------------------
    1479                 :             :       JINT = 1
    1480                 :             :       CALL CALCK1(X,RESULT,JINT)
    1481                 :             :       BESK1 = RESULT
    1482                 :             :       RETURN
    1483                 :             : !---------- Last line of BESK1 ----------
    1484                 :             :       END function besk1
    1485                 :             : !!***
    1486                 :             : 
    1487                 :             : !CS    REAL
    1488                 :             :       DOUBLE PRECISION  FUNCTION BESEK1(X)
    1489                 :             : !--------------------------------------------------------------------
    1490                 :             : !
    1491                 :             : ! This function program computes approximate values for the
    1492                 :             : !   modified Bessel function of the second kind of order one
    1493                 :             : !   multiplied by the exponential function, for arguments
    1494                 :             : !   XLEAST .LE. ARG .LE. XMAX.
    1495                 :             : !
    1496                 :             : !--------------------------------------------------------------------
    1497                 :             :       !IMPLICIT NONE
    1498                 :             :       INTEGER JINT
    1499                 :             : !CS    REAL
    1500                 :             :       DOUBLE PRECISION :: &
    1501                 :             : &         X, RESULT
    1502                 :             : !--------------------------------------------------------------------
    1503                 :             :       JINT = 2
    1504                 :             :       CALL CALCK1(X,RESULT,JINT)
    1505                 :             :       BESEK1 = RESULT
    1506                 :             :       RETURN
    1507                 :             : !---------- Last line of BESEK1 ----------
    1508                 :             :       END function besek1
    1509                 :             : !!***
    1510                 :             : 
    1511                 :             : end module m_bessel
    1512                 :             : !!***
        

Generated by: LCOV version 2.3-1