diff options
| author | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
|---|---|---|
| committer | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
| commit | 7dfcc480ba1e19bd3232349fc733caef94034292 (patch) | |
| tree | 03ee104eb8846d5cc1a981d267687a729185d3f3 /Utilib/src/AKIN10.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Utilib/src/AKIN10.f')
| -rw-r--r-- | Utilib/src/AKIN10.f | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/Utilib/src/AKIN10.f b/Utilib/src/AKIN10.f new file mode 100644 index 0000000..b7fe2eb --- /dev/null +++ b/Utilib/src/AKIN10.f @@ -0,0 +1,272 @@ +*DECK AKIN10 + SUBROUTINE AKIN10(X,AKIN) +C +C THE SUBROUTINE AKIN10 EVALUATES THE BICKLEY FUNCTIONS KIN(X), +C N = 1,2,...,10, X \ 0, TO A MINIMUM PRECISION OF 12.75 SIGNIFICANT +C FIGURES AND RETURNS THE VALUES KIN(X),N = 1,2,...,10 IN THE ARRAY AKIN +C +C +C ARGUMENT LIST: +C +C X - REAL, X \ 0. +C AKIN - REAL, ONE DIMENSIONAL ARRAY TO STORE KIN(X),N = 1,2,...,10 +C +C +C METHOD: +C +C THE BICKLEY FUNCTIONS SATISFY A RECURSIVE RELATION ENABLING A FUNCTION +C OF ANY ORDER TO BE FOUND IF THREE BICKLEY FUNCTIONS OF CONSECUTIVE +C ORDER ARE KNOWN. THE FORMULA FOR FORWARD RECURSION IS: +C (KI(N))(X) = (X * ((KI(N-3))(X) - (KI(N-1))(X)) / (N-1)) +C + ((N-2) * (KI(N-2))(X)) / (N-1) +C THE FORMULA FOR BACKWARD RECURSION IS: +C (KI(N))(X) = ((N+2) * (KI(N+3))(X)) / X + (KI(N+2))(X) +C - ((N+1) * (KI(N+1))(X)) / X +C FORWARD AND BACKWARD RECURSION WERE TESTED \ SEE "APPROXIMATING THE +C BICKLEY FUNCTIONS KIN(X),N=1,2,...,10",C.A.EDWARDS!. LEAST LOSS OF +C PRECISION WAS OBTAINED BY USING FORWARD RECURSION FOR 0@X@6, AND +C BACKWARD RECUSION FOR X\6. +C +C X \ 6. KI,(X),KI9(X),KI10(X) ARE CALCULATED AND USED IN BACKWARD +C RECURSION TO DERIVE KIN(X),N=7,6,...,1 +C +C 0 < X < 6. KI1(X),KI2(X),KI3(X) ARE CALCULATED AND USED IN FORWARD +C RECURSION TO DERIVE KIN(X),N=4,5,...,10 +C +C RATIONAL POLYNOMIAL APPROXIMATIONS TO THE BICKLEY FUNCTIONS WITH A +C MINIMUM ACCURACY OF 15D WERE OBTAINED FROM "RATIONAL CHEBYSHEV +C APPROXIMATIONS TO THE BICKLEY FUNCTIONS KIN(X)",AECL- AND +C "RATIONAL CHEBYSHEV APPROXIMATIONS TO THE BICKLEY FUNCTION KI3(X), +C X \ 6",AECL-5820. +C +C X = 0. KIN(X) ,N=1,2,...,10 IS APPROXIMATED BY CONSTANTS. +C +C 0 < X < 1. KIN(X),N = 1,2,3 IS APPROXIMATED BY +C R(X) + X**N * ALOG(X) * S(X**2) +C WHERE R AND S ARE RATIONAL POLYNOMIALS IN X AND X**2 RESPECTIVELY. +C +C 1 @ X < 6. KIN(X),N=1,2,3 IS APPROXIMATED BY +C EXP(-X) * R(1. / X) ) / SQRT(X) +C WHERE R IS A RATIONAL POLYNOMIAL IN (1. / X) +C +C 6 @ X < 673.5 KIN(X),N = 8,9,10 IS APPROXIMATED BY +C EXP(-X) * R(1. / X) ) / SQRT(X) +C WHERE R IS A RATIONAL POLYNOMIAL IN (1. / X) +C +C X \ 673.5 KIN(X),1=1,10 IS APPROXIMATED BY ZERO +C +C +C WRITTEN BY P.CHRISTIE, MARCH,1977. +C +C TAKEN FROM *AELIB* LIBRARY (SUBROUTINE NAME: KIN) +C MODIFY BY R.ROY (JULY 1994) IN DOUBLE PRECISION +C + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + DOUBLE PRECISION AKIN(10),LNX + SAVE +C + DATA R1P01,R1P11/-.3916967515498982D+02 , .1501664584981108D+03 / + DATA R1P21,R1P31/ .1531257133183402D+02 , .1398682937631850D+02 / + DATA R1P41,R1P51/ .5454840912170553D+00 , .5720051721276178D+00 / + DATA R1P61,R1P71/ .8766262885587739D-02 , .1001220446004980D-01 / + DATA R1P81,R1P91/ .5167460909383400D-04 , .7945473334662959D-04 / + DATA R1Q01,R1Q11/-.1193155300614385D+03 , .1219596245756669D+01 / + DATA S1P01,S1P11/ .1752373600092810D+05 , .1234654843555450D+04 / + DATA S1P21,S1P31/ .3695696751512241D+02 , .4646979722852471D+00 / + DATA S1P41 / .2337898258663651D-02 / + DATA S1Q01,S1Q11/ .1752373600092810D+05 ,-.2256564898552151D+03 / + DATA R2P01,R2P11/ .1833164538368226D+02 , .2427580524508585D+03 / + DATA R2P21,R2P31/ .1059016416894119D+04 , .1868734192859498D+04 / + DATA R2P41,R2P51/ .1326511766009986D+04 , .3272001530672078D+03 / + DATA R2P61 / .1822929159877549D+02 / + DATA R2Q01,R2Q11/ .1462653804563246D+02 , .2028344160151355D+03 / + DATA R2Q21,R2Q31/ .9570056876282360D+03 , .1922624187690926D+04 / + DATA R2Q41,R2Q51/ .1687760486772990D+04 , .5952592332227032D+03 / + DATA R2Q61 / .6590511376539962D+02 / + DATA R1P02,R1P12/ .4811961706232723D+03 , .1403058999999999D-10 / + DATA R1P22,R1P32/ .1693807200769639D+04 , .7521727532834893D+02 / + DATA R1P42,R1P52/ .4905564077627560D+02 , .9084569646859357D+00 / + DATA R1P62,R1P72/ .1190096804348251D+01 ,-.9999999999999957D-15 / + DATA R1P82 / .1086764750096697D-01 / + DATA R1Q02,R1Q12/ .1810502008060146D+04 ,-.7855291318496802D+02 / + DATA R1Q22 /-.1893578319929816D+02 / + DATA S1P02 /-.1520774316867189D+09 / + DATA S1Q02,S1Q12/ .3041548633734379D+09 ,-.1267311930720872D+08 / + DATA S1Q22,S1Q32/ .2112186548895240D+06 ,-.3143123637802091D+03 / + DATA S1Q42 /-.5631701819761997D+02 / + DATA R2P02,R2P12/ .5766817227841408D+00 , .9534267279889207D+01 / + DATA R2P22,R2P32/ .5320941946830476D+02 , .1244041140268300D+03 / + DATA R2P42,R2P52/ .1239740741934670D+03 , .4801733781249936D+02 / + DATA R2P62,R2P72/ .5596498537189973D+01 , .8407469297501269D-01 / + DATA R2Q02,R2Q12/ .4601255143693006D+00 , .8124881079392082D+01 / + DATA R2Q22,R2Q32/ .5035544525458363D+02 , .1383006201574071D+03 / + DATA R2Q42,R2Q52/ .1754089481769652D+03 , .9747773947009136D+02 / + DATA R2Q62 / .2014290370371339D+02 / + DATA R1P03,R1P13/-.7043581454636306D+06 , .1269499275481224D+07 / + DATA R1P23,R1P33/-.3790509999999980D-08 , .1095667013274141D+07 / + DATA R1P43 / .1173330390873767D+05 / + DATA R1Q03,R1Q13/-.2961415636470914D+07 , .2053835980116203D+06 / + DATA R1Q23,R1Q33/ .6077621585261822D+05 ,-.3942586515380026D+04 / + DATA R1Q43,R1Q53/-.1335161914247710D+03 ,-.1755175839841900D+02 / + DATA R1Q63 /-.5812262590904993D+01 / + DATA S1P03,S1P13/ .3027965765686327D+04 , .3721363059831219D+02 / + DATA S1P23,S1P33/ .5562992588150486D+00 , .2631126488553487D-02 / + DATA S1Q03,S1Q13/ .1816779459411791D+05 ,-.2309130812632629D+03 / + DATA R2P03,R2P13/ .3057730071278506D+00 , .5484114159179143D+01 / + DATA R2P23,R2P33/ .3295675793097689D+02 , .8221915520880930D+02 / + DATA R2P43,R2P53/ .8663638447767516D+02 , .3523089103388543D+02 / + DATA R2P63,R2P73/ .4296855364707056D+01 , .6753131438170179D-01 / + DATA R2Q03,R2Q13/ .2439716682658748D+00 , .4772136519722949D+01 / + DATA R2Q23,R2Q33/ .3279841354751966D+02 , .9980505157913694D+02 / + DATA R2Q43,R2Q53/ .1397165642636965D+03 , .8502251629078864D+02 / + DATA R2Q63 / .1898628899818902D+02 / + DATA R1P08,R1P18/ .2613746296365794D-04 , .1418798411613728D-02 / + DATA R1P28,R1P38/ .2815600768166693D-01 , .2548459851246907D+00 / + DATA R1P48,R1P58/ .1072628589602992D+01 , .1911501312353472D+01 / + DATA R1P68,R1P78/ .1112575911492456D+01 , .8986422681366424D-01 / + DATA R1Q08,R1Q18/ .2085467815725935D-04 , .1218062894916834D-02 / + DATA R1Q28,R1Q38/ .2689392859262307D-01 , .2845497743872052D+00 / + DATA R1Q48,R1Q58/ .1507878566796656D+01 , .3799408842694803D+01 / + DATA R1Q68 / .3846344279573060D+01 / + DATA R1P09,R1P19/ .4238334538408917D-04 , .2673933491122202D-02 / + DATA R1P29,R1P39/ .6307055224810387D-01 , .7008898871037985D+00 / + DATA R1P49,R1P59/ .3808588292608732D+01 , .9546586415461775D+01 / + DATA R1P69,R1P79/ .9312166436472808D+01 , .2271732886275686D+01 / + DATA R1Q09,R1Q19/ .3381701691714022D-04 , .2289893952421851D-02 / + DATA R1Q29,R1Q39/ .5971301111405558D-01 , .7653242147414652D+00 / + DATA R1Q49,R1Q59/ .5098663790807535D+01 , .1715435708724829D+02 / + DATA R1Q69,R1Q79/ .2599209729530514D+02 , .1346934010366220D+02 / + DATA R1P010,R1P110/.2984857391503590D-04, .1966652996666221D-02 / + DATA R1P210,R1P310/.4842493199976428D-01, .5612690964007783D+00 / + DATA R1P410,R1P510/.3176720369338028D+01, .8279846050989022D+01 / + DATA R1P610,R1P710/.8380471295924849D+01, .2115457456609434D+01 / + DATA R1Q010,R1Q110/.2381571628879027D-04, .1691217608476688D-02 / + DATA R1Q210,R1Q310/.4627626853651856D-01, .6224227393849020D+00 / + DATA R1Q410,R1Q510/.4348767092235221D+01, .1531699714433142D+02 / + DATA R1Q610,R1Q710/.2421477559533582D+02, .1303324507927971D+02 / +C +C + IF (X.LT.0.D0) GO TO 400 +C + IF (X.EQ.0.D0) GO TO 300 + IF (X.LT.1.D0) GO TO 200 + IF (X.GE.673.5D0) GO TO 110 + SQRTX = SQRT(X) + EXPX = EXP(-X) + XREC = 1.D0/ X + IF (X.LT.6.D0) GO TO 210 +C +C +C 6 @ X < 673.5 CALCULATE KI(X),KI9(X),KI10(X) +C + AKIN(10) =(((((((((R1P710 * XREC + R1P610) * XREC + R1P510) * XREC + ,+ R1P410) * XREC + R1P310) * XREC + R1P210) * XREC + R1P110) * + ,XREC + R1P010) / ((((((((XREC + R1Q710) * XREC + R1Q610) + ,* XREC + R1Q510) * XREC + R1Q410) * XREC + R1Q310) * XREC + R1Q210 + ,) * XREC + R1Q110) * XREC + R1Q010) ) / SQRTX) * EXPX +C + AKIN(9) =(((((((((R1P79 * XREC + R1P69) * XREC + R1P59) * XREC + ,+ R1P49) * XREC + R1P39) * XREC + R1P29) * XREC + R1P19) * XREC + ,+ R1P09) / ((((((((XREC + R1Q79) * XREC + R1Q69) * XREC + ,+ R1Q59) * XREC + R1Q49) * XREC + R1Q39) * XREC + R1Q29) * XREC + ,+ R1Q19) * XREC + R1Q09) ) / SQRTX) * EXPX +C + AKIN(8) =(((((((((R1P78 * XREC + R1P68) * XREC + R1P58) * XREC + ,+ R1P48) * XREC + R1P38) * XREC + R1P28) * XREC + R1P18) * XREC + ,+ R1P08) / (((((((XREC + R1Q68) * XREC + R1Q58) * XREC + ,+ R1Q48) * XREC + R1Q38) * XREC + R1Q28) * XREC + R1Q18) * XREC + ,+ R1Q08) ) / SQRTX) * EXPX +C +C BACKWARD RECURSION +C + DO 100 I = 1,7 + J = 8 - I + AKIN(J) = ((DBLE(J + 2) * AKIN(J + 3)) - (DBLE(J + 1) + , * AKIN(J + 1))) / X + AKIN(J + 2) + 100 CONTINUE + RETURN +C +C +C X \ 673.5 AUTOMATICALLY SET AKIN(I),I=1,10 EQUAL TO ZERO +C + 110 DO 120 I = 1,10 + AKIN(I)=0.D0 + 120 CONTINUE + RETURN +C +C +C 0 < X < 1. CALCULATE KI1(X),KI2(X),KI3(X) +C + 200 XSQ = X*X + LNX = LOG(X) + XI1 = X - .91169076342161D0 + XI2 = X - .2451000192866D0 + XI3 = X - 1.D0 + XI4 = X - .68448452306295D0 +C + AKIN(1) = (((((((((R1P91 * X + R1P81) * X + R1P71) * X + R1P61) + ,* X + R1P51) * X + R1P41) * X + R1P31) * X + R1P21) * X + R1P11) + ,*XI3 + R1P01) / ((X + R1Q11) * XI3 + R1Q01) + (X * LNX * ((((S1P41 + ,* XSQ + S1P31) * XSQ + S1P21) * XSQ + S1P11) * XSQ + S1P01) / + ,((XSQ + S1Q11) * XSQ + S1Q01)) +C + AKIN(2) = ((((R1P12 * XI1 + R1P02) + ((((R1P52 * X + R1P42) * X + ,+ R1P32) * X + R1P22) + (((R1P82 * XI2 + R1P72) * XI2 + R1P62) + ,* (X**4))) * (XI1 * XI1)) / (R1Q02 + ((( XI3 + R1Q22) * X + ,+ R1Q12) * XI3))) + (XSQ * LNX * ((S1P02) / ((((( XSQ + ,+ S1Q42) * XSQ + S1Q32) * XSQ + S1Q22) * XSQ + S1Q12) * XSQ + ,+ S1Q02)))) +C + AKIN(3) = (((((R1P43 * X + R1P33) * XI4 + R1P23) * XI4 + R1P13) + ,* XI3 + R1P03) / (((((((XI3 + R1Q63) * X + R1Q53) * X + R1Q43) + ,* X + R1Q33) * XI3 + R1Q23) * X + R1Q13) * XI3 + R1Q03)) + (X**3 + ,* LNX * ((((S1P33 * XSQ + S1P23) * XSQ + S1P13) * XSQ + S1P03) / + ,((XSQ + S1Q13) * XSQ + S1Q03))) +C + GO TO 220 +C +C +C 1 @ X < 6. CALCULATE KI1(X),KI2(X),KI3(X) +C + 210 AKIN(1) = (((((((R2P61 * XREC + R2P51) * XREC + R2P41) * XREC + ,+ R2P31) * XREC + R2P21) * XREC + R2P11) * XREC + R2P01) * EXPX) / + ,((((((((XREC + R2Q61) *XREC + R2Q51) * XREC + R2Q41) * XREC + ,+ R2Q31) * XREC + R2Q21) * XREC + R2Q11) * XREC + R2Q01) * SQRTX) +C + AKIN(2) = ((((((((R2P72 * XREC + R2P62) * XREC + R2P52) * XREC + ,+ R2P42) * XREC + R2P32) * XREC + R2P22) * XREC + R2P12) * XREC + ,+ R2P02) * EXPX) / ((((((((XREC + R2Q62) * XREC + R2Q52) * XREC + ,+ R2Q42) * XREC + R2Q32) * XREC + R2Q22) * XREC + R2Q12) * XREC + ,+ R2Q02) * SQRTX) +C + AKIN(3) = ((((((((R2P73 * XREC + R2P63) * XREC + R2P53) * XREC + ,+ R2P43) * XREC + R2P33) * XREC + R2P23) * XREC + R2P13) * XREC + ,+ R2P03) * EXPX) / ((((((((XREC + R2Q63) * XREC + R2Q53) * XREC + ,+ R2Q43) * XREC + R2Q33) * XREC + R2Q23) * XREC + R2Q13) * XREC + ,+ R2Q03) * SQRTX) +C +C FORWARD RECURSION +C + 220 DO 230 I = 1,7 + J = I + 3 + AKIN(J) = (AKIN(J - 3) - AKIN(J - 1)) * X / DBLE(J - 1) + , + DBLE(J - 2) * AKIN(J - 2) / DBLE(J - 1) + 230 CONTINUE + RETURN +C +C +C X = 0. +C + 300 AKIN(1) = 1.57079632679489D0 + AKIN(2) = 1.D0 + AKIN(3) = .78539816339745D0 + AKIN(4) = .66666666666667D0 + AKIN(5) = .58904862254808D0 + AKIN(6) = .53333333333333D0 + AKIN(7) = .49087385212340D0 + AKIN(8) = .45714285714286D0 + AKIN(9) = .42951462060798D0 + AKIN(10)= .40634920634920D0 + RETURN + 400 CALL XABORT('AKIN10: ILLEGAL ARGUMENT FOR BICKLEY FUNCTIONS') + END |
