Fit Function: JEEXC5

Fit Function \[\begin{align*} \sigma (pe) &= c1 \; \sqrt{\frac{u}{u+1}} \frac{1}{u + \text{pcf}(4)} \begin{cases} \ln(u + 16) & \text{if } \text{pcf}(1)= 1 \\ 1 & \text{if } \text{pcf}(1)= 2 \\ \end{cases} \\ \end{align*}\]
Comments Python code requires NumPy imported as `np` as well as `warnings`. The values of `c1`, and `u` are specific to the code and should be referred to the source code for actual values and details.

Fortran

Arguments
namedescriptionunitstype(s)
pt requested photon energy eV real, dimension(:)
pcf coefficient data array real, dimension(9)
kncf number of coefficients in the data array integer
pfit cross section cm2 real, dimension(:)
kermsg error message character
Return values
namedescriptionunitstype(s)
pfit cross section cm2 real, dimension(:)
Code
c
c###################################################################
c
      subroutine jeexc5(pe, pcf, kncf, pfit, kermsg)
c
c     this is a subroutine to calculate a cross section
c     in cm[2] as function of electron energy in ev.
c     for details see doc=h-he-plasma , used for  reactions
c     2.3.14, 2.3.15, 2.3.16, 2.3.17a, 2.3.17b
c     (see doc=h-he-plasma.)
c
c     pcf is the coefficient data array, where
c
c     pcf(1) =   ttype , type of expression
c                if ttype = 1 expression contains ln (u + 16)
c                if ttype = 2 expression contains 1 instead of ln term
c
c     pcf(2) =   normalisation coefficient a
c
c     pcf(3)  =   coefficient c
c
c     pcf(4)  =   coefficient phi
c
c     pcf(5)  =   principal quantum number of the initial state
c
c     pcf(6)  =   principal quantum number of the final state
c
c    - warning- .
c
c        the coefficient array pcf is updated by this routine to
c     include energy independent constants. these coefficients can be
c     used in subsequent calls for the same entry. the coefficeients
c     added are, see doc=h-he-plasma for meaning,
c
c     pcf(7) = threshold energy for the transition
c
c     pe = electron energy (ev)
c
c     kermsg = blank if no errors
c
c     pfit = cross section in cm[2]
c
c     written by j. j. smith , iaea atomic and molecular data unit
c
c------------------------------------------------------------------------
c
      double precision pe, pcf, pfit
      integer n, m, ttype
      dimension pcf(7)
      character*(*) kermsg
      data ry/13.58/

      ttype=pcf(1)
      a=pcf(2)
      c=pcf(3)
      phi=pcf(4)
      n=pcf(5)
      m=pcf(6)
      an = n
      am = m
c
c        first call to jeexc5 determine energy independent
c        parameters and place in pcf for further use
c
      if (kncf .eq. 6) then
         eth = 4.0 *ry * ( 1.0/(an*an) - 1.0/(am*am))
         pcf(7) = eth
        kncf = 7
      else if (kncf .eq. 7) then
          eth  = pcf(7)
      else
          kermsg = ' incorrect number of coefficients passed to eexchd'
          return
      endif
c
      if (pe .lt. eth) then
        pfit = 0.0
        return
      endif
c
      u = (pe - eth) /  eth
      c1= a * (c/(am**3)) * ((ry/eth)**2)
      pfit = c1 * sqrt(u/(u+1.0))
      if (ttype .eq. 1) then
        pfit = pfit * log ( (u + 16.0))/ (u + phi)
        else  if (ttype .eq. 2) then
          pfit = pfit / (u + phi)
        else
          pfit=0.0
          kermsg = 'invalid first coefficient must be 1 or 2 '
      endif
c
      return
c
      end

Python

Arguments
namedescriptionunitstype(s)
pt requested photon energy eV float, np.ndarray
pcf coefficient data array float, np.ndarray
kncf number of coefficients in the data array int
Return values
namedescriptionunitstype(s)
pfit cross section cm2 float, np.ndarray
Code
def jeexc5(pe, pcf, kncf):
    """
    This function calculates the cross section in cm2 as function of electron energy.

    pe: electron energy in eV
    pcf: parameter data array
        pcf[0]: type of the analytic fit
        pcf[1:4]: fit coeffcient
        pcf[4]: principle quantum number of the initial state
        pcf[5]: principle quantum number of the final state
        pcf[6]: threshold energy
    """
    ry = 13.58

    # First call to determine energy independent parameters
    if kncf == 6:
        eth = 4.0 * ry * (1.0 / (pcf[4]**2) - 1.0 / (pcf[5]**2))
        pcf[6] = eth
        kncf = 7
    elif kncf == 7:
        eth = pcf[6]
    else:
        raise ValueError("Incorrect number of coefficients passed to eexchd")

    if pe < eth:
        warnings.warn('Energy below threshold. Cross section set to 0.')
        pfit = 0.0
        return pfit

    u = (pe - eth)/eth
    c1 = pcf[1] * (pcf[2] / (pcf[5]**3)) * ((ry / eth)**2)
    pfit = c1 * np.sqrt(u / (u + 1.0))

    if pcf[0] == 1:
        pfit *= np.log(u + 16.0) / (u + pcf[[3])
    elif pcf[0] == 2:
        pfit /= u + pcf[3]
    else:
        raise ValueError("Invalid first coefficient; must be 1 or 2")
    
    return pfit