1 subroutine DBI0K0 (x, BI0, BK0, want, status) 2c Copyright (c) 1996 California Institute of Technology, Pasadena, CA. 3c ALL RIGHTS RESERVED. 4c Based on Government Sponsored Research NAS7-03001. 5C>> 1998-10-29 DBI0K0 Krogh Moved external statement up for mangle. 6c>> 1996-04-27 DBI0K0 Krogh Changes to use .C. and C%%. 7C>> 1995-11-28 DBI0K0 Krogh Changes to simplify conversion to C. 8C>> 1994-10-20 DBI0K0 Krogh Changes to use M77CON 9C>> 1990-10-18 DBI0K0 WV Snyder JPL Use Cody K0 for small X 10C>> 1990-09-25 DBI0K0 WV Snyder JPL Use Fullerton codes from CMLIB 11C--D replaces "?": ?BI0K0, ?CSEVL, ?ERM1, ?INITS 12c 13c Compute hyperbolic Bessel functions I0 and K0. 14c Approximations for K0(X) on 0 < X < BOUNDK originally produced 15c by W. James Cody, ANL. Other approximations originally produced 16c by Wayne Fullerton, LASL. 17c 18c ***** Formal Arguments *********************************** 19c 20c X [in] is the argument at which the functions are to be evaluated. 21c BI0, BK0 [out] are the function values. 22c WANT [integer,in] indicates the functions to be computed, and their 23c scaling: 24c ABS(WANT) = 25c 1 means compute I0(X) 26c 2 means compute K0(X) 27c 3 means compute both of I0(X) and K0(X) 28c WANT < 0 means compute EXP(-X)*I0(X) and/or EXP(X)*K0(X). 29c WANT=0 or ABS(WANT) > 3 causes an error message to be produced. 30c STATUS [integer,out] indicates the outcome: 31c 0 means normal computation, 32c 1 means K0(X) is zero due to underflow, 33c < 0 means an error occurred: 34c -1 means WANT=0 or ABS(WANT)>3, 35c -2 means X was so big that I0(X) overflowed, 36c -3 means X was zero or negative and K0(X) is to be computed. 37c Negative values of STATUS are produced when the error message 38c processor is called with LEVEL=0; positive values of STATUS are 39c accompanied by LEVEL=-2. See the description of the error message 40c handler for a description of the error level effects. 41c If status = -2 then BI0 = the largest representable number; 42c if status = -3 then BK0 = the largest representable number. 43c ------------------------------------------------------------------ 44 double precision X, BI0, BK0 45 integer WANT, STATUS 46c 47c ***** External References ******************************** 48c 49 external DCSEVL, IERM1, DINITS, D1MACH, DERM1 50 double precision D1MACH, DCSEVL 51c 52c ***** Local Variables ************************************ 53c 54 double precision BI0CS(18), AI0CS(46), AI02CS(69) 55 double precision AK0CS(38), AK02CS(33) 56 double precision P(6), Q(2), PP(10), QQ(10), F(4), G(3) 57 double precision SUMF, SUMG, SUMP, SUMQ, Y, Z 58 double precision EXP10, EXPM10, LSQ2PI, LSQPI2 59 parameter (EXP10 = (+.2202646579480671651695790D+5)) 60C EXP10 = EXP(10) 61 parameter (EXPM10 = (+.4539992976248485153559152D-4)) 62C EXPM10 = EXP(-10) 63 parameter (LSQ2PI = (+.9189385332046727417803296D+0)) 64C LSQ2PI = LOG(SQRT (2 PI)) 65 parameter (LSQPI2 = (+.2257913526447274323630975D+0)) 66C LSQPI2 = LOG(SQRT(PI / 2)) 67 double precision BOUNDK, XIMAX, XIN, XISML, XKMAX, XKN, XKSML 68 integer I, NTI0, NTAI0, NTAI02, NTAK0, NTAK02 69 save NTI0, NTAI0, NTAI02, XIMAX, XISML 70 save BOUNDK, NTAK0, NTAK02, XKMAX, XKSML 71c 72c ***** Data *********************************************** 73c 74c SERIES FOR BI0 ON THE INTERVAL 0. TO 9.00000D+00 75c WITH WEIGHTED ERROR 9.51D-34 76c LOG WEIGHTED ERROR 33.02 77c SIGNIFICANT FIGURES REQUIRED 33.31 78c DECIMAL PLACES REQUIRED 33.65 79c 80 data BI0CS / -.7660547252839144951081894976243285D-1, 81 * +.1927337953993808269952408750881196D+01, 82 * +.2282644586920301338937029292330415D+00, 83 * +.1304891466707290428079334210691888D-01, 84 * +.4344270900816487451378682681026107D-03, 85 * +.9422657686001934663923171744118766D-05, 86 * +.1434006289510691079962091878179957D-06, 87 * +.1613849069661749069915419719994611D-08, 88 * +.1396650044535669699495092708142522D-10, 89 * +.9579451725505445344627523171893333D-13, 90 * +.5333981859862502131015107744000000D-15, 91 * +.2458716088437470774696785919999999D-17, 92 * +.9535680890248770026944341333333333D-20, 93 * +.3154382039721427336789333333333333D-22, 94 * +.9004564101094637431466666666666666D-25, 95 * +.2240647369123670016000000000000000D-27, 96 * +.4903034603242837333333333333333333D-30, 97 * +.9508172606122666666666666666666666D-33/ 98c 99c SERIES FOR AI0 ON THE INTERVAL 1.25000D-01 TO 3.33333D-01 100c WITH WEIGHTED ERROR 2.74D-32 101c LOG WEIGHTED ERROR 31.56 102c SIGNIFICANT FIGURES REQUIRED 30.15 103c DECIMAL PLACES REQUIRED 32.39 104c 105c++ Save data by elements if ~.C. 106 data AI0CS(1) / +.7575994494023795942729872037438D-1 / 107 data AI0CS(2) / +.7591380810823345507292978733204D-2 / 108 data AI0CS(3) / +.4153131338923750501863197491382D-3 / 109 data AI0CS(4) / +.1070076463439073073582429702170D-4 / 110 data AI0CS(5) / -.7901179979212894660750319485730D-5 / 111 data AI0CS(6) / -.7826143501438752269788989806909D-6 / 112 data AI0CS(7) / +.2783849942948870806381185389857D-6 / 113 data AI0CS(8) / +.8252472600612027191966829133198D-8 / 114 data AI0CS(9) / -.1204463945520199179054960891103D-7 / 115 data AI0CS(10) / +.1559648598506076443612287527928D-8 / 116 data AI0CS(11) / +.2292556367103316543477254802857D-9 / 117 data AI0CS(12) / -.1191622884279064603677774234478D-9 / 118 data AI0CS(13) / +.1757854916032409830218331247743D-10 / 119 data AI0CS(14) / +.1128224463218900517144411356824D-11 / 120 data AI0CS(15) / -.1146848625927298877729633876982D-11 / 121 data AI0CS(16) / +.2715592054803662872643651921606D-12 / 122 data AI0CS(17) / -.2415874666562687838442475720281D-13 / 123 data AI0CS(18) / -.6084469888255125064606099639224D-14 / 124 data AI0CS(19) / +.3145705077175477293708360267303D-14 / 125 data AI0CS(20) / -.7172212924871187717962175059176D-15 / 126 data AI0CS(21) / +.7874493403454103396083909603327D-16 / 127 data AI0CS(22) / +.1004802753009462402345244571839D-16 / 128 data AI0CS(23) / -.7566895365350534853428435888810D-17 / 129 data AI0CS(24) / +.2150380106876119887812051287845D-17 / 130 data AI0CS(25) / -.3754858341830874429151584452608D-18 / 131 data AI0CS(26) / +.2354065842226992576900757105322D-19 / 132 data AI0CS(27) / +.1114667612047928530226373355110D-19 / 133 data AI0CS(28) / -.5398891884396990378696779322709D-20 / 134 data AI0CS(29) / +.1439598792240752677042858404522D-20 / 135 data AI0CS(30) / -.2591916360111093406460818401962D-21 / 136 data AI0CS(31) / +.2238133183998583907434092298240D-22 / 137 data AI0CS(32) / +.5250672575364771172772216831999D-23 / 138 data AI0CS(33) / -.3249904138533230784173432285866D-23 / 139 data AI0CS(34) / +.9924214103205037927857284710400D-24 / 140 data AI0CS(35) / -.2164992254244669523146554299733D-24 / 141 data AI0CS(36) / +.3233609471943594083973332991999D-25 / 142 data AI0CS(37) / -.1184620207396742489824733866666D-26 / 143 data AI0CS(38) / -.1281671853950498650548338687999D-26 / 144 data AI0CS(39) / +.5827015182279390511605568853333D-27 / 145 data AI0CS(40) / -.1668222326026109719364501503999D-27 / 146 data AI0CS(41) / +.3625309510541569975700684800000D-28 / 147 data AI0CS(42) / -.5733627999055713589945958399999D-29 / 148 data AI0CS(43) / +.3736796722063098229642581333333D-30 / 149 data AI0CS(44) / +.1602073983156851963365512533333D-30 / 150 data AI0CS(45) / -.8700424864057229884522495999999D-31 / 151 data AI0CS(46) / +.2741320937937481145603413333333D-31 / 152c 153c SERIES FOR AI02 ON THE INTERVAL 0. TO 1.25000D-01 154c WITH WEIGHTED ERROR 1.97D-32 155c LOG WEIGHTED ERROR 31.71 156c SIGNIFICANT FIGURES REQUIRED 30.15 157c DECIMAL PLACES REQUIRED 32.63 158c 159c++ Save data by elements if ~.C. 160 data AI02CS(1) / +.5449041101410883160789609622680D-1 / 161 data AI02CS(2) / +.3369116478255694089897856629799D-2 / 162 data AI02CS(3) / +.6889758346916823984262639143011D-4 / 163 data AI02CS(4) / +.2891370520834756482966924023232D-5 / 164 data AI02CS(5) / +.2048918589469063741827605340931D-6 / 165 data AI02CS(6) / +.2266668990498178064593277431361D-7 / 166 data AI02CS(7) / +.3396232025708386345150843969523D-8 / 167 data AI02CS(8) / +.4940602388224969589104824497835D-9 / 168 data AI02CS(9) / +.1188914710784643834240845251963D-10 / 169 data AI02CS(10) / -.3149916527963241364538648629619D-10 / 170 data AI02CS(11) / -.1321581184044771311875407399267D-10 / 171 data AI02CS(12) / -.1794178531506806117779435740269D-11 / 172 data AI02CS(13) / +.7180124451383666233671064293469D-12 / 173 data AI02CS(14) / +.3852778382742142701140898017776D-12 / 174 data AI02CS(15) / +.1540086217521409826913258233397D-13 / 175 data AI02CS(16) / -.4150569347287222086626899720156D-13 / 176 data AI02CS(17) / -.9554846698828307648702144943125D-14 / 177 data AI02CS(18) / +.3811680669352622420746055355118D-14 / 178 data AI02CS(19) / +.1772560133056526383604932666758D-14 / 179 data AI02CS(20) / -.3425485619677219134619247903282D-15 / 180 data AI02CS(21) / -.2827623980516583484942055937594D-15 / 181 data AI02CS(22) / +.3461222867697461093097062508134D-16 / 182 data AI02CS(23) / +.4465621420296759999010420542843D-16 / 183 data AI02CS(24) / -.4830504485944182071255254037954D-17 / 184 data AI02CS(25) / -.7233180487874753954562272409245D-17 / 185 data AI02CS(26) / +.9921475412173698598880460939810D-18 / 186 data AI02CS(27) / +.1193650890845982085504399499242D-17 / 187 data AI02CS(28) / -.2488709837150807235720544916602D-18 / 188 data AI02CS(29) / -.1938426454160905928984697811326D-18 / 189 data AI02CS(30) / +.6444656697373443868783019493949D-19 / 190 data AI02CS(31) / +.2886051596289224326481713830734D-19 / 191 data AI02CS(32) / -.1601954907174971807061671562007D-19 / 192 data AI02CS(33) / -.3270815010592314720891935674859D-20 / 193 data AI02CS(34) / +.3686932283826409181146007239393D-20 / 194 data AI02CS(35) / +.1268297648030950153013595297109D-22 / 195 data AI02CS(36) / -.7549825019377273907696366644101D-21 / 196 data AI02CS(37) / +.1502133571377835349637127890534D-21 / 197 data AI02CS(38) / +.1265195883509648534932087992483D-21 / 198 data AI02CS(39) / -.6100998370083680708629408916002D-22 / 199 data AI02CS(40) / -.1268809629260128264368720959242D-22 / 200 data AI02CS(41) / +.1661016099890741457840384874905D-22 / 201 data AI02CS(42) / -.1585194335765885579379705048814D-23 / 202 data AI02CS(43) / -.3302645405968217800953817667556D-23 / 203 data AI02CS(44) / +.1313580902839239781740396231174D-23 / 204 data AI02CS(45) / +.3689040246671156793314256372804D-24 / 205 data AI02CS(46) / -.4210141910461689149219782472499D-24 / 206 data AI02CS(47) / +.4791954591082865780631714013730D-25 / 207 data AI02CS(48) / +.8459470390221821795299717074124D-25 / 208 data AI02CS(49) / -.4039800940872832493146079371810D-25 / 209 data AI02CS(50) / -.6434714653650431347301008504695D-26 / 210 data AI02CS(51) / +.1225743398875665990344647369905D-25 / 211 data AI02CS(52) / -.2934391316025708923198798211754D-26 / 212 data AI02CS(53) / -.1961311309194982926203712057289D-26 / 213 data AI02CS(54) / +.1503520374822193424162299003098D-26 / 214 data AI02CS(55) / -.9588720515744826552033863882069D-28 / 215 data AI02CS(56) / -.3483339380817045486394411085114D-27 / 216 data AI02CS(57) / +.1690903610263043673062449607256D-27 / 217 data AI02CS(58) / +.1982866538735603043894001157188D-28 / 218 data AI02CS(59) / -.5317498081491816214575830025284D-28 / 219 data AI02CS(60) / +.1803306629888392946235014503901D-28 / 220 data AI02CS(61) / +.6213093341454893175884053112422D-29 / 221 data AI02CS(62) / -.7692189292772161863200728066730D-29 / 222 data AI02CS(63) / +.1858252826111702542625560165963D-29 / 223 data AI02CS(64) / +.1237585142281395724899271545541D-29 / 224 data AI02CS(65) / -.1102259120409223803217794787792D-29 / 225 data AI02CS(66) / +.1886287118039704490077874479431D-30 / 226 data AI02CS(67) / +.2160196872243658913149031414060D-30 / 227 data AI02CS(68) / -.1605454124919743200584465949655D-30 / 228 data AI02CS(69) / +.1965352984594290603938848073318D-31 / 229c 230c ------------------------------------------------------------------- 231C 232C Coefficients for K0 from Cody for XSMALL .LE. ARG .LE. 1.0 233C 234c ------------------------------------------------------------------- 235 DATA P/ 5.8599221412826100000D-04, 1.3166052564989571850D-01, 236 1 1.1999463724910714109D+01, 4.6850901201934832188D+02, 237 2 5.9169059852270512312D+03, 2.4708152720399552679D+03/ 238 DATA Q/-2.4994418972832303646D+02, 2.1312714303849120380D+04/ 239 DATA F/-1.6414452837299064100D+00,-2.9601657892958843866D+02, 240 1 -1.7733784684952985886D+04,-4.0320340761145482298D+05/ 241 DATA G/-2.5064972445877992730D+02, 2.9865713163054025489D+04, 242 1 -1.6128136304458193998D+06/ 243c ------------------------------------------------------------------- 244C 245C Coefficients for K0 from Cody for 1.0 .LT. ARG .LT. BOUNDK 246C 247c ------------------------------------------------------------------- 248 DATA PP/ 1.1394980557384778174D+02, 3.6832589957340267940D+03, 249 1 3.1075408980684392399D+04, 1.0577068948034021957D+05, 250 2 1.7398867902565686251D+05, 1.5097646353289914539D+05, 251 3 7.1557062783764037541D+04, 1.8321525870183537725D+04, 252 4 2.3444738764199315021D+03, 1.1600249425076035558D+02/ 253 DATA QQ/ 2.0013443064949242491D+02, 4.4329628889746408858D+03, 254 1 3.1474655750295278825D+04, 9.7418829762268075784D+04, 255 2 1.5144644673520157801D+05, 1.2689839587977598727D+05, 256 3 5.8824616785857027752D+04, 1.4847228371802360957D+04, 257 4 1.8821890840982713696D+03, 9.2556599177304839811D+01/ 258c ------------------------------------------------------------------- 259C 260C SERIES FOR AK0 ON THE INTERVAL 1.25000D-01 TO 5.00000D-01 261C WITH WEIGHTED ERROR 2.85D-32 262C LOG WEIGHTED ERROR 31.54 263C SIGNIFICANT FIGURES REQUIRED 30.19 264C DECIMAL PLACES REQUIRED 32.33 265C 266c++ Save data by elements if ~.C. 267 data AK0CS(1) / -.7643947903327941424082978270088D-1 / 268 data AK0CS(2) / -.2235652605699819052023095550791D-1 / 269 data AK0CS(3) / +.7734181154693858235300618174047D-3 / 270 data AK0CS(4) / -.4281006688886099464452146435416D-4 / 271 data AK0CS(5) / +.3081700173862974743650014826660D-5 / 272 data AK0CS(6) / -.2639367222009664974067448892723D-6 / 273 data AK0CS(7) / +.2563713036403469206294088265742D-7 / 274 data AK0CS(8) / -.2742705549900201263857211915244D-8 / 275 data AK0CS(9) / +.3169429658097499592080832873403D-9 / 276 data AK0CS(10) / -.3902353286962184141601065717962D-10 / 277 data AK0CS(11) / +.5068040698188575402050092127286D-11 / 278 data AK0CS(12) / -.6889574741007870679541713557984D-12 / 279 data AK0CS(13) / +.9744978497825917691388201336831D-13 / 280 data AK0CS(14) / -.1427332841884548505389855340122D-13 / 281 data AK0CS(15) / +.2156412571021463039558062976527D-14 / 282 data AK0CS(16) / -.3349654255149562772188782058530D-15 / 283 data AK0CS(17) / +.5335260216952911692145280392601D-16 / 284 data AK0CS(18) / -.8693669980890753807639622378837D-17 / 285 data AK0CS(19) / +.1446404347862212227887763442346D-17 / 286 data AK0CS(20) / -.2452889825500129682404678751573D-18 / 287 data AK0CS(21) / +.4233754526232171572821706342400D-19 / 288 data AK0CS(22) / -.7427946526454464195695341294933D-20 / 289 data AK0CS(23) / +.1323150529392666866277967462400D-20 / 290 data AK0CS(24) / -.2390587164739649451335981465599D-21 / 291 data AK0CS(25) / +.4376827585923226140165712554666D-22 / 292 data AK0CS(26) / -.8113700607345118059339011413333D-23 / 293 data AK0CS(27) / +.1521819913832172958310378154666D-23 / 294 data AK0CS(28) / -.2886041941483397770235958613333D-24 / 295 data AK0CS(29) / +.5530620667054717979992610133333D-25 / 296 data AK0CS(30) / -.1070377329249898728591633066666D-25 / 297 data AK0CS(31) / +.2091086893142384300296328533333D-26 / 298 data AK0CS(32) / -.4121713723646203827410261333333D-27 / 299 data AK0CS(33) / +.8193483971121307640135680000000D-28 / 300 data AK0CS(34) / -.1642000275459297726780757333333D-28 / 301 data AK0CS(35) / +.3316143281480227195890346666666D-29 / 302 data AK0CS(36) / -.6746863644145295941085866666666D-30 / 303 data AK0CS(37) / +.1382429146318424677635413333333D-30 / 304 data AK0CS(38) / -.2851874167359832570811733333333D-31 / 305C 306C SERIES FOR AK02 ON THE INTERVAL 0. TO 1.25000D-01 307C WITH WEIGHTED ERROR 2.30D-32 308C LOG WEIGHTED ERROR 31.64 309C SIGNIFICANT FIGURES REQUIRED 29.68 310C DECIMAL PLACES REQUIRED 32.40 311C 312c++ Save data by elements if ~.C. 313 data AK02CS(1) / -.1201869826307592239839346212452D-1 / 314 data AK02CS(2) / -.9174852691025695310652561075713D-2 / 315 data AK02CS(3) / +.1444550931775005821048843878057D-3 / 316 data AK02CS(4) / -.4013614175435709728671021077879D-5 / 317 data AK02CS(5) / +.1567831810852310672590348990333D-6 / 318 data AK02CS(6) / -.7770110438521737710315799754460D-8 / 319 data AK02CS(7) / +.4611182576179717882533130529586D-9 / 320 data AK02CS(8) / -.3158592997860565770526665803309D-10 / 321 data AK02CS(9) / +.2435018039365041127835887814329D-11 / 322 data AK02CS(10) / -.2074331387398347897709853373506D-12 / 323 data AK02CS(11) / +.1925787280589917084742736504693D-13 / 324 data AK02CS(12) / -.1927554805838956103600347182218D-14 / 325 data AK02CS(13) / +.2062198029197818278285237869644D-15 / 326 data AK02CS(14) / -.2341685117579242402603640195071D-16 / 327 data AK02CS(15) / +.2805902810643042246815178828458D-17 / 328 data AK02CS(16) / -.3530507631161807945815482463573D-18 / 329 data AK02CS(17) / +.4645295422935108267424216337066D-19 / 330 data AK02CS(18) / -.6368625941344266473922053461333D-20 / 331 data AK02CS(19) / +.9069521310986515567622348800000D-21 / 332 data AK02CS(20) / -.1337974785423690739845005311999D-21 / 333 data AK02CS(21) / +.2039836021859952315522088960000D-22 / 334 data AK02CS(22) / -.3207027481367840500060869973333D-23 / 335 data AK02CS(23) / +.5189744413662309963626359466666D-24 / 336 data AK02CS(24) / -.8629501497540572192964607999999D-25 / 337 data AK02CS(25) / +.1472161183102559855208038400000D-25 / 338 data AK02CS(26) / -.2573069023867011283812351999999D-26 / 339 data AK02CS(27) / +.4601774086643516587376640000000D-27 / 340 data AK02CS(28) / -.8411555324201093737130666666666D-28 / 341 data AK02CS(29) / +.1569806306635368939301546666666D-28 / 342 data AK02CS(30) / -.2988226453005757788979199999999D-29 / 343 data AK02CS(31) / +.5796831375216836520618666666666D-30 / 344 data AK02CS(32) / -.1145035994347681332155733333333D-30 / 345 data AK02CS(33) / +.2301266594249682802005333333333D-31 / 346c 347 data NTI0 /0/ 348c 349c ***** Statement Functions ******************************** 350c 351 xin(z) = ximax + 0.5*log(z/(1.0+1.0/(8.0*z))**2) 352 xkn(z) = xkmax - 0.5*log(z/(1.0-1.0/(8.0*z))**2) 353c 354c ***** Executable Statements ****************************** 355c 356 if (nti0 .le. 0) then 357 z = 0.1*D1MACH(3) 358 boundk = 1.757 - 6.22d-3 * log(z) 359 call DINITS (bi0cs, 18, z, nti0 ) 360 call DINITS (ai0cs, 46, z, ntai0 ) 361 call DINITS (ai02cs, 69, z, ntai02) 362 call DINITS (ak0cs, 38, z, ntak0 ) 363 call DINITS (ak02cs, 33, z, ntak02) 364 xisml = sqrt (80.0D0*z) 365 ximax = log(D1MACH(2)) + lsq2pi 366 ximax = xin(xin(ximax)) 367 xksml = sqrt (10.0*z*p(6)/p(5)) 368c xksml = sqrt (10.0*z*min(p(6)/p(5),q(2)/q(1))) 369 xkmax = lsqpi2 - log(D1MACH(1)) 370 xkmax = xkn(xkn(xkn(xkmax))) 371 end if 372c 373 if (want.eq.0 .or. abs(want).gt.3) then 374 call ierm1('DBI0K0',-1,0,'WANT = 0 OR ABS(WANT) > 3','WANT', 375 1 want,'.') 376 status=-1 377 return 378 end if 379 status = 0 380c 381c Compute I0 if requested. 382c 383 if (abs(want) .ne. 2) then 384 y = abs(x) 385 if (y.le.3.0) then 386 if (y.le.xisml) then 387 BI0 = 1.0D0 388 else 389 BI0 = 2.75D0 + DCSEVL(y*y/4.5D0-1.0D0, bi0cs, nti0) 390 end if 391 if (want.lt.0) BI0 = exp(-y) * BI0 392 else 393 if (y .le. 8.0D0) then 394 BI0 = DCSEVL ((48.0D0/y-11.0D0)/5.0D0, ai0cs, ntai0) 395 else 396 BI0 = DCSEVL (16.0D0/y-1.0D0, ai02cs, ntai02) 397 end if 398 BI0 = (0.375D0 + BI0) / sqrt(y) 399 if (want .gt. 0) then 400 if (y .gt. ximax) then 401 call DERM1('DBI0K0',-2,0,'ABS(X) SO BIG I0 OVERFLOWS', 402 1 'X',x,'.') 403 status = -2 404 BI0 = D1MACH(2) 405c y > ximax => y > xkmax 406 BK0 = 0.0 407 if (x .gt. 0.0) return 408 else 409 BI0 = (exp(y-10.0) * BI0) * exp10 410 end if 411 end if 412 end if 413 end if 414c 415c Compute K0 if requested. 416c 417 if (abs(want) .gt. 1) then 418 if (x .le. 0.0D0) then 419 call DERM1('DBI0K0',-3,0,'X IS ZERO OR NEGATIVE','X',x,'.') 420 status = -3 421 BK0 = D1MACH(2) 422 else if (x .le. 1.0) then 423c 0.0 < x <= 1.0 424 BK0 = log(x) 425 if (x .lt. xksml) then 426c 0.0 <= x < xksml 427 BK0 = p(6)/q(2) - BK0 428 else 429c xksml <= x <= 1.0 430 y = x*x 431 sump = ((((p(1)*y+p(2))*y+p(3))*y+p(4))*y+p(5))*y+p(6) 432 sumq = (y + q(1))*y + q(2) 433 sumf = ((f(1)*y + f(2))*y + f(3))*y + f(4) 434 sumg = ((y + g(1))*y + g(2))*y + g(3) 435 BK0 = sump/sumq - y * sumf * BK0 / sumg - BK0 436 end if 437 if (want .lt. 0) BK0 = exp(x) * BK0 438 else if (x .le. boundk) then 439c 1.0 < x <= boundk 440 y = 1.0 / x 441 sump = pp(1) 442 do 120 i = 2, 10 443 sump = sump*y + pp(i) 444120 continue 445 sumq = y 446 do 140 i = 1, 9 447 sumq = (sumq + qq(i))*y 448140 continue 449 sumq = sumq + qq(10) 450 BK0 = sump / (sumq * sqrt(x)) 451 if (want .gt. 0) BK0 = exp(-x) * BK0 452 else 453c boundk < x 454 y = 16.0D0 / x 455 if (x .le. 8.0D0) then 456 BK0 = DCSEVL ((y-5.0D0)/3.0D0, ak0cs, ntak0) 457 else 458 BK0 = DCSEVL (y-1.0D0, ak02cs, ntak02) 459 end if 460 BK0 = (1.25D0 + BK0) / sqrt(x) 461 if (want .gt. 0) then 462 if (x .gt. xkmax) then 463 call DERM1('DBI0K0',1,-2,'X SO BIG K0 UNDERFLOWS','X', 464 1 x,'.') 465 BK0 = 0.0 466 status = 1 467 else 468 BK0 = (exp(10.0-x) * BK0) * expm10 469 end if 470 end if 471 end if 472 end if 473C 474 return 475c 476 end 477