1
2 double precision function zfermim12(x)
3 implicit none
4 save
5
6
7c..this routine applies a rational function expansion to get the fermi-dirac
8c..integral of order -1/2 evaluated at x. maximum error is 1.23d-12.
9c..reference: antia apjs 84,101 1993
10
11
12c..declare
13 integer i,m1,k1,m2,k2
14C double precision x,an,a1(12),b1(12),a2(12),b2(12),rn,den,xx ! KC 2025-05-31
15 double precision x,a1(12),b1(12),a2(12),b2(12),rn,den,xx
16
17
18c..load the coefficients of the expansion
19C data an,m1,k1,m2,k2 /-0.5d0, 7, 7, 11, 11/ ! KC 2025-05-31
20 data m1,k1,m2,k2 /7, 7, 11, 11/
21 data (a1(i),i=1,8)/ 1.71446374704454d7, 3.88148302324068d7,
22 1 1 3.16743385304962d7, 1.14587609192151d7,
23 2 2 1.83696370756153d6, 1.14980998186874d5,
24 3 3 1.98276889924768d3, 1.0d0/
25 data (b1(i),i=1,8)/ 9.67282587452899d6, 2.87386436731785d7,
26 1 1 3.26070130734158d7, 1.77657027846367d7,
27 2 2 4.81648022267831d6, 6.13709569333207d5,
28 3 3 3.13595854332114d4, 4.35061725080755d2/
29 data (a2(i),i=1,12)/-4.46620341924942d-15, -1.58654991146236d-12,
30 1 1 -4.44467627042232d-10, -6.84738791621745d-8,
31 2 2 -6.64932238528105d-6, -3.69976170193942d-4,
32 3 3 -1.12295393687006d-2, -1.60926102124442d-1,
33 4 4 -8.52408612877447d-1, -7.45519953763928d-1,
34 5 5 2.98435207466372d0, 1.0d0/
35 data (b2(i),i=1,12)/-2.23310170962369d-15, -7.94193282071464d-13,
36 1 1 -2.22564376956228d-10, -3.43299431079845d-8,
37 2 2 -3.33919612678907d-6, -1.86432212187088d-4,
38 3 3 -5.69764436880529d-3, -8.34904593067194d-2,
39 4 4 -4.78770844009440d-1, -4.99759250374148d-1,
40 5 5 1.86795964993052d0, 4.16485970495288d-1/
41
42
43
44 if (x .lt. 2.0d0) then
45 xx = exp(x)
46 rn = xx + a1(m1)
47 do i=m1-1,1,-1
48 rn = rn*xx + a1(i)
49 enddo
50 den = b1(k1+1)
51 do i=k1,1,-1
52 den = den*xx + b1(i)
53 enddo
54 zfermim12 = xx * rn/den
55c..
56 else
57 xx = 1.0d0/(x*x)
58 rn = xx + a2(m2)
59 do i=m2-1,1,-1
60 rn = rn*xx + a2(i)
61 enddo
62 den = b2(k2+1)
63 do i=k2,1,-1
64 den = den*xx + b2(i)
65 enddo
66 zfermim12 = sqrt(x)*rn/den
67 end if
68 return
69 end
70
1"""Python version of zfermim12.f (YREC 7be4133): the Fermi-Dirac integral
2of order -1/2 (Antia 1993)."""
3
4import math
5
6# DATA: Antia's coefficients (index 0 unused; Fortran lines 20–40).
7M1, K1, M2, K2 = 7, 7, 11, 11
8A1 = [0.0, 1.71446374704454e7, 3.88148302324068e7, 3.16743385304962e7,
9 1.14587609192151e7, 1.83696370756153e6, 1.14980998186874e5,
10 1.98276889924768e3, 1.0]
11B1 = [0.0, 9.67282587452899e6, 2.87386436731785e7, 3.26070130734158e7,
12 1.77657027846367e7, 4.81648022267831e6, 6.13709569333207e5,
13 3.13595854332114e4, 4.35061725080755e2]
14A2 = [0.0, -4.46620341924942e-15, -1.58654991146236e-12,
15 -4.44467627042232e-10, -6.84738791621745e-8, -6.64932238528105e-6,
16 -3.69976170193942e-4, -1.12295393687006e-2, -1.60926102124442e-1,
17 -8.52408612877447e-1, -7.45519953763928e-1, 2.98435207466372e0, 1.0]
18B2 = [0.0, -2.23310170962369e-15, -7.94193282071464e-13,
19 -2.22564376956228e-10, -3.43299431079845e-8, -3.33919612678907e-6,
20 -1.86432212187088e-4, -5.69764436880529e-3, -8.34904593067194e-2,
21 -4.78770844009440e-1, -4.99759250374148e-1, 1.86795964993052e0,
22 4.16485970495288e-1]
23
24
25def zfermim12(x: float) -> float:
26 """F_{-1/2}(x) by Antia's two rational approximations, in exp(x) below
27 x = 2 and in 1/x^2 above.
28
29 Translates: zfermim12.f#ZFERMIM12 (7be4133)
30
31 Arguments: x, the degeneracy parameter. Returns the integral.
32
33 """
34
35 # Below x = 2: a rational function of exp(x) (Fortran lines 44–54).
36 if x < 2.0:
37 xx = math.exp(x)
38 rn = xx + A1[M1]
39 for i in range(M1 - 1, 0, -1):
40 rn = rn * xx + A1[i]
41 den = B1[K1 + 1]
42 for i in range(K1, 0, -1):
43 den = den * xx + B1[i]
44 return xx * rn / den
45
46 # From x = 2: a rational function of 1/x**2 (Fortran lines 56–66).
47 xx = 1.0 / (x * x)
48 rn = xx + A2[M2]
49 for i in range(M2 - 1, 0, -1):
50 rn = rn * xx + A2[i]
51 den = B2[K2 + 1]
52 for i in range(K2, 0, -1):
53 den = den * xx + B2[i]
54 return math.sqrt(x) * rn / den