LCOV - code coverage report
Current view: top level - net/private - net_approx21.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 96.1 % 1578 1517
Test Date: 2026-01-06 18:03:11 Functions: 88.5 % 26 23

            Line data    Source code
       1              : ! ***********************************************************************
       2              : !
       3              : !   Copyright (C) 2014  Frank Timmes & The MESA Team
       4              : !
       5              : !   This program is free software: you can redistribute it and/or modify
       6              : !   it under the terms of the GNU Lesser General Public License
       7              : !   as published by the Free Software Foundation,
       8              : !   either version 3 of the License, or (at your option) any later version.
       9              : !
      10              : !   This program is distributed in the hope that it will be useful,
      11              : !   but WITHOUT ANY WARRANTY; without even the implied warranty of
      12              : !   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
      13              : !   See the GNU Lesser General Public License for more details.
      14              : !
      15              : !   You should have received a copy of the GNU Lesser General Public License
      16              : !   along with this program. If not, see <https://www.gnu.org/licenses/>.
      17              : !
      18              : ! ***********************************************************************
      19              : 
      20              :       module net_approx21
      21              :       use const_def, only: dp, qp, avo, clight
      22              :       use utils_lib, only: is_bad, mesa_error
      23              :       use math_lib
      24              : 
      25              : 
      26              :       implicit none
      27              : 
      28              : 
      29              : 
      30              :       !logical :: plus_co56 ! Must now be passed as an argument
      31              : 
      32              :       logical, parameter :: reduced_net_for_testing = .true.
      33              :       !logical, parameter :: reduced_net_for_testing = .false.
      34              : 
      35              :       integer, parameter :: species_21 = 21, species_co56 = 22
      36              : 
      37              : 
      38              :       integer :: iso_cid(species_co56)  ! these are corresponding chem ids for the isos
      39              :          ! e.g., iso_cid(ife52) is = the iso number for fe52 as defined in mesa/chem
      40              :          ! Define as largest possible array
      41              :       integer :: &  ! these are indices in y vector
      42              :          ih1, &
      43              :          ihe3, &
      44              :          ihe4, &
      45              :          ic12, &
      46              :          in14, &
      47              :          io16, &
      48              :          ine20, &
      49              :          img24, &
      50              :          isi28, &
      51              :          is32, &
      52              :          iar36, &
      53              :          ica40, &
      54              :          iti44, &
      55              :          icr48, &
      56              :          icrx, &
      57              :          ife52, &
      58              :          ife53, &
      59              :          ife54, &
      60              :          ife55, &
      61              :          ife56, &
      62              :          ico56, &
      63              :          ini56, &
      64              :          ineut, &
      65              :          iprot
      66              : 
      67              :       integer, parameter :: approx21_num_mesa_reactions_21 = 93, approx21_nrat = 116
      68              :       integer, parameter :: approx21_num_mesa_reactions_co56 = approx21_num_mesa_reactions_21+1, &
      69              :                               approx21_plus_co56_nrat = approx21_nrat+1
      70              : 
      71              :       ! integer :: num_mesa_reactions
      72              :       ! integer :: num_reactions
      73              : 
      74              :       integer :: rate_id(approx21_num_mesa_reactions_co56)  ! rate ids for the mesa reactions
      75              :          ! e.g., rate_id(ir3a) is reaction id for triple alpha as defined in mesa/rates
      76              :          ! Define as largest possible array
      77              :       integer :: &  ! these are indices in rates arrays
      78              :          ir3a, &
      79              :          irg3a, &
      80              :          ircag, &
      81              :          ir1212, &
      82              :          ir1216, &
      83              :          ir1616, &
      84              :          iroga, &
      85              :          iroag, &
      86              :          irnega, &
      87              :          irneag, &
      88              :          irmgga, &
      89              :          irmgag, &
      90              :          irsiga, &
      91              :          irmgap, &
      92              :          iralpa, &
      93              :          iralpg, &
      94              :          irsigp, &
      95              :          irsiag, &
      96              :          irsga, &
      97              :          irsiap, &
      98              :          irppa, &
      99              :          irppg, &
     100              :          irsgp, &
     101              :          irsag, &
     102              :          irarga, &
     103              :          irsap, &
     104              :          irclpa, &
     105              :          irclpg, &
     106              :          irargp, &
     107              :          irarag, &
     108              :          ircaga, &
     109              :          irarap, &
     110              :          irkpa, &
     111              :          irkpg, &
     112              :          ircagp, &
     113              :          ircaag, &
     114              :          irtiga, &
     115              :          ircaap, &
     116              :          irscpa, &
     117              :          irscpg, &
     118              :          irtigp, &
     119              :          irtiag, &
     120              :          ircrga, &
     121              :          irtiap, &
     122              :          irvpa , &
     123              :          irvpg, &
     124              :          ircrgp, &
     125              :          ircrag, &
     126              :          irfega, &
     127              :          ircrap, &
     128              :          irmnpa, &
     129              :          irmnpg, &
     130              :          irfegp, &
     131              :          irfeag, &
     132              :          irniga, &
     133              :          irfeap, &
     134              :          ircopa, &
     135              :          ircopg, &
     136              :          irnigp, &
     137              : 
     138              :          ! for fe54 photodisintegration
     139              :          ir52ng, &
     140              :          ir53gn, &
     141              :          ir53ng, &
     142              :          ir54gn, &
     143              :          irfepg, &
     144              :          ircogp, &
     145              : 
     146              :          ! for he4 photodisintegration
     147              :          irheng, &
     148              :          irhegn, &
     149              :          irhng, &
     150              :          irdgn, &
     151              :          irdpg, &
     152              :          irhegp, &
     153              : 
     154              :          ! weak reactions
     155              :          irpen, &
     156              :          irnep, &
     157              :          irn56ec, &
     158              :          irco56ec, &
     159              : 
     160              :          ! ppchain
     161              :          irpp, &
     162              :          ir33, &
     163              :          irhe3ag, &
     164              :          ir_be7_wk_li7, &
     165              :          ir_be7_pg_b8, &
     166              : 
     167              :          ! cno cycles
     168              :          ircpg, &
     169              :          irnpg, &
     170              :          iropg, &
     171              :          irnag, &
     172              : 
     173              :          ! for reactions to fe56
     174              :          ir54ng, &
     175              :          ir55gn, &
     176              :          ir55ng, &
     177              :          ir56gn, &
     178              :          irfe54ap, &
     179              :          irco57pa, &
     180              :          irfe56pg, &
     181              :          irco57gp, &
     182              : 
     183              :          ! for n15 branching
     184              :          irn15pa, &
     185              :          irn15pg, &
     186              : 
     187              :          ! the equilibrium links
     188              :          ifa, &
     189              :          ifg, &
     190              : 
     191              :          irr1, &
     192              :          irs1, &
     193              :          irt1, &
     194              :          iru1, &
     195              :          irv1, &
     196              :          irw1, &
     197              :          irx1, &
     198              : 
     199              :          ir1f54, &
     200              :          ir2f54, &
     201              :          ir3f54, &
     202              :          ir4f54, &
     203              :          ir5f54, &
     204              :          ir6f54, &
     205              :          ir7f54, &
     206              :          ir8f54, &
     207              : 
     208              :          iralf1, &
     209              :          iralf2, &
     210              : 
     211              :          irfe56_aux1, &
     212              :          irfe56_aux2, &
     213              :          irfe56_aux3, &
     214              :          irfe56_aux4
     215              : 
     216              :       ! names
     217              :       character (len=40) :: ratnam(approx21_plus_co56_nrat)
     218              :          ! Define as largest possible array
     219              : 
     220              :       contains
     221              : 
     222              : 
     223              : 
     224              :       ! call this after get raw rates
     225         4553 :          subroutine approx21_pa_pg_fractions( &
     226         4553 :             ratraw,dratrawdt,dratrawdd,ierr)
     227              :          real(dp), dimension(:) :: ratraw,dratrawdt,dratrawdd
     228              :          integer, intent(out) :: ierr
     229              : 
     230              :          include 'formats'
     231              : 
     232         4553 :          ierr = 0
     233              : 
     234         4553 :          call set1(ifa,irn15pg,irn15pa)
     235         4553 :          ratraw(ifg)    = 1.0d0 - ratraw(ifa)
     236         4553 :          dratrawdt(ifg) = -dratrawdt(ifa)
     237         4553 :          dratrawdd(ifg) = -dratrawdd(ifa)
     238              : 
     239         4553 :          call set1(irr1,iralpg,iralpa)  ! al27
     240         4553 :          call set1(irs1,irppg,irppa)   ! p31
     241         4553 :          call set1(irt1,irclpg,irclpa)  ! cl35
     242         4553 :          call set1(iru1,irkpg,irkpa)   ! k39
     243         4553 :          call set1(irv1,irscpg,irscpa)  ! sc43
     244         4553 :          call set1(irw1,irvpg,irvpa)   ! v47
     245         4553 :          call set1(irx1,irmnpg,irmnpa)  ! mn51
     246              : 
     247              : 
     248              :          contains
     249              : 
     250        36424 :          subroutine set1(ifa,irn15pg,irn15pa)
     251              :             integer, intent(in) :: ifa,irn15pg,irn15pa
     252              :             real(dp) :: ff1,dff1dt,dff1dd,ff2,dff2dt,dff2dd, &
     253              :                tot,dtotdt,dtotdd,invtot
     254              : 
     255        36424 :             ff1 = ratraw(irn15pg)
     256        36424 :             dff1dt = dratrawdt(irn15pg)
     257        36424 :             dff1dd = dratrawdd(irn15pg)
     258              : 
     259        36424 :             ff2 = ratraw(irn15pa)
     260        36424 :             dff2dt = dratrawdt(irn15pa)
     261        36424 :             dff2dd = dratrawdd(irn15pa)
     262              : 
     263        36424 :             tot            = ff1 + ff2
     264        36424 :             dtotdt         = dff1dt + dff2dt
     265        36424 :             dtotdd         = dff1dd + dff2dd
     266              : 
     267        36424 :             if (tot > 1d-30) then
     268        36416 :                invtot         = 1.0d0/tot
     269        36416 :                ratraw(ifa)    = ff2 * invtot
     270        36416 :                dratrawdt(ifa) = dff2dt * invtot - ff2 * invtot*invtot * dtotdt
     271        36416 :                dratrawdd(ifa) = dff2dd * invtot - ff2 * invtot*invtot * dtotdd
     272              :             else
     273            8 :                ratraw(ifa)    = 0.0d0
     274            8 :                dratrawdt(ifa) = 0.0d0
     275            8 :                dratrawdd(ifa) = 0.0d0
     276              :             end if
     277              : 
     278        36424 :          end subroutine set1
     279              : 
     280              :       end subroutine approx21_pa_pg_fractions
     281              : 
     282              : 
     283              :          ! call this before screening
     284         4553 :          subroutine approx21_weak_rates( &
     285         4553 :                y, ratraw, dratrawdt, dratrawdd, &
     286              :                temp, den, ye, eta, zbar, &
     287              :                weak_rate_factor,  plus_co56, ierr)
     288              :             use rates_lib, only: eval_ecapnuc_rate
     289              :             use net_derivs, only: eval_ni56_ec_rate, eval_co56_ec_rate
     290              : 
     291              :             real(dp), dimension(:) :: y, ratraw, dratrawdt, dratrawdd
     292              :             real(dp), intent(in) :: temp, den, ye, eta, zbar, weak_rate_factor
     293              :             logical, intent(in) :: plus_co56
     294              :             integer, intent(out) :: ierr
     295              : 
     296              :             real(dp) :: rpen, rnep, spen, snep, &
     297              :                rate, d_rate_dlnT, d_rate_dlnRho, Q, Qneu
     298              :             include 'formats'
     299              : 
     300         4553 :             ierr = 0
     301              : 
     302         4553 :             call eval_ecapnuc_rate(eta, temp, den, rpen, rnep, spen, snep)
     303              : 
     304         4553 :             ratraw(irpen) = rpen
     305         4553 :             dratrawdt(irpen) = 0
     306         4553 :             dratrawdd(irpen) = 0
     307              :             if (rpen > 0) then
     308              :                Qneu = spen/rpen
     309              :             else
     310              :                Qneu = 0
     311              :             end if
     312              : 
     313         4553 :             ratraw(irnep) = rnep
     314         4553 :             dratrawdt(irnep) = 0
     315         4553 :             dratrawdd(irnep) = 0
     316              :             if (rnep > 0) then
     317              :                Qneu = snep/rnep
     318              :             else
     319              :                Qneu = 0
     320              :             end if
     321              : 
     322              :             call eval_ni56_ec_rate( &
     323              :                temp, den, ye, eta, zbar, weak_rate_factor, &
     324              :                rate, d_rate_dlnT, d_rate_dlnRho, Q, Qneu, &
     325         4553 :                ierr)
     326         4553 :             if (ierr /= 0) then
     327              :                !write(*,*) 'failed in eval_ni56_ec_rate'
     328              :                return
     329              :             end if
     330         4553 :             ratraw(irn56ec) = rate
     331         4553 :             dratrawdt(irn56ec) = 0
     332         4553 :             dratrawdd(irn56ec) = 0
     333              : 
     334         4553 :             if (plus_co56) then
     335              :                call eval_co56_ec_rate( &
     336              :                   temp, den, ye, eta, zbar, weak_rate_factor, &
     337              :                   rate, d_rate_dlnT, d_rate_dlnRho, Q, Qneu, &
     338            2 :                   ierr)
     339            2 :                if (ierr /= 0) then
     340              :                   !write(*,*) 'failed in eval_co56_ec_rate'
     341              :                   return
     342              :                end if
     343            2 :                ratraw(irco56ec) = rate
     344            2 :                dratrawdt(irco56ec) = 0
     345            2 :                dratrawdd(irco56ec) = 0
     346              :             end if
     347              : 
     348         4553 :          end subroutine approx21_weak_rates
     349              : 
     350              : 
     351              :          ! call this after screening -- depends on y, so don't reuse results.
     352         4553 :          subroutine approx21_special_reactions( &
     353         4553 :                btemp, bden, abar, zbar, y, &
     354              :                use_3a_FL, conv_eps_3a, &
     355         4553 :                ratdum, dratdumdt, dratdumdd, dratdumdy1, dratdumdy2, &
     356              :                plus_co56, ierr)
     357         4553 :             use math_lib
     358              :             use utils_lib, only: mesa_error
     359              :             use rates_lib, only: eval_FL_epsnuc_3alf
     360              :             real(dp), intent(in) :: &
     361              :                btemp, bden, abar, zbar, y(:), conv_eps_3a
     362              :             logical, intent(in) :: use_3a_fl
     363              :             real(dp), dimension(:) :: &
     364              :                ratdum,dratdumdt,dratdumdd,dratdumdy1,dratdumdy2
     365              :             logical, intent(in) ::  plus_co56
     366              :             integer, intent(out) :: ierr
     367              : 
     368              :             real(dp) :: denom, denomdt, denomdd, zz, xx, eps, deps_dT, deps_dRho
     369              :             real(dp), parameter :: tiny_denom = 1d-50, tiny_y = 1d-30
     370              :             integer :: i
     371              :             logical :: okay
     372              :             include 'formats'
     373              : 
     374         4553 :             ierr = 0
     375              : 
     376         4553 :             if (use_3a_FL) then
     377              :                ! Fushiki and Lamb, Apj, 317, 368-388, 1987
     378            0 :                if (y(ihe4) < tiny_y) then
     379            0 :                   ratdum(ir3a)     = 0.0d0
     380            0 :                   dratdumdt(ir3a)  = 0.0d0
     381            0 :                   dratdumdd(ir3a)  = 0.0d0
     382              :                else
     383              :                   call eval_FL_epsnuc_3alf( &
     384            0 :                      btemp, bden, 4*y(ihe4), abar/zbar, eps, deps_dT, deps_dRho)
     385              :                   ! convert from eps back to rate
     386            0 :                   xx = conv_eps_3a*y(ihe4)*y(ihe4)*y(ihe4)/6d0
     387            0 :                   ratdum(ir3a) = eps/xx
     388            0 :                   dratdumdt(ir3a) = deps_dT/xx
     389            0 :                   dratdumdd(ir3a) = deps_dRho/xx
     390              :                end if
     391              :             end if
     392              : 
     393              : 
     394         4553 :             okay = .true.
     395       427984 :             do i=1,num_mesa_reactions(plus_co56)
     396       427984 :                if (ratdum(i) < 0d0) then
     397            0 :                   write(*,2) 'approx21 missing rate for ' // ratnam(i), i, ratdum(i), &
     398            0 :                      btemp, log10(btemp), bden, log10(bden)
     399            0 :                   okay = .false.
     400              :                end if
     401              :             end do
     402         4553 :             if (.not. okay) call mesa_error(__FILE__,__LINE__)
     403              : 
     404              :             ! for debugging: sum(cat)/eps_nuc
     405              : 
     406              :             if (reduced_net_for_testing) then
     407              : 
     408              :                !if (.true.) then
     409              : 
     410              :                !end if
     411              : 
     412              :                if (.false.) then
     413              : 
     414              :                   ! turn off PP
     415              :                   call turn_off_reaction(irpp)
     416              :                   call turn_off_reaction(ir33)
     417              :                   call turn_off_reaction(irhe3ag)
     418              : 
     419              :                   !turn off CNO
     420              :                   call turn_off_reaction(ircpg)
     421              :                   call turn_off_reaction(irnpg)
     422              :                   call turn_off_reaction(iropg)
     423              : 
     424              :                   ! turn off n14ag + 3alpha
     425              :                   call turn_off_reaction(irnag)
     426              :                   call turn_off_reaction(ir3a)
     427              :                   call turn_off_reaction(irg3a)
     428              : 
     429              :                   !c12+c12, c12ag, o16ag
     430              :                   call turn_off_reaction(ir1212)
     431              :                   call turn_off_reaction(iroag)
     432              :                   call turn_off_reaction(irnega)
     433              :                   call turn_off_reaction(ircag)
     434              :                   call turn_off_reaction(iroga)
     435              : 
     436              :                   !Ne/O burn
     437              :                   call turn_off_reaction(ir1216)
     438              :                   call turn_off_reaction(ir1616)
     439              :                   call turn_off_reaction(irneag)
     440              :                   call turn_off_reaction(irmgga)
     441              : 
     442              :                   !alpha links
     443              :                   call turn_off_reaction(irmgag)
     444              :                   call turn_off_reaction(irsiga)
     445              :                   call turn_off_reaction(irmgap)
     446              :                   call turn_off_reaction(iralpa)
     447              :                   call turn_off_reaction(iralpg)
     448              :                   call turn_off_reaction(irsigp)
     449              :                   call turn_off_reaction(irsiag)
     450              :                   call turn_off_reaction(irsga)
     451              : 
     452              :                   call turn_off_reaction(irppa)
     453              :                   call turn_off_reaction(irppg)
     454              :                   call turn_off_reaction(irsiap)
     455              :                   call turn_off_reaction(irsgp)
     456              : 
     457              :                   call turn_off_reaction(irsag)
     458              :                   call turn_off_reaction(irarga)
     459              :                   call turn_off_reaction(irsap)
     460              :                   call turn_off_reaction(irclpa)
     461              :                   call turn_off_reaction(irclpg)
     462              :                   call turn_off_reaction(irargp)
     463              : 
     464              :                   call turn_off_reaction(irarag)
     465              :                   call turn_off_reaction(ircaga)
     466              :                   call turn_off_reaction(irarap)
     467              :                   call turn_off_reaction(irkpa)
     468              :                   call turn_off_reaction(irkpg)
     469              :                   call turn_off_reaction(ircagp)
     470              : 
     471              :                   call turn_off_reaction(ircaag)
     472              :                   call turn_off_reaction(irtiga)
     473              :                   call turn_off_reaction(ircaap)
     474              :                   call turn_off_reaction(irscpa)
     475              :                   call turn_off_reaction(irscpg)
     476              :                   call turn_off_reaction(irtigp)
     477              :                   call turn_off_reaction(irtiag)
     478              : 
     479              :                   call turn_off_reaction(ircrga)
     480              :                   call turn_off_reaction(irtiap)
     481              :                   call turn_off_reaction(irvpa )
     482              :                   call turn_off_reaction(irvpg)
     483              :                   call turn_off_reaction(ircrgp)
     484              :                   call turn_off_reaction(ircrag)
     485              :                   call turn_off_reaction(irfega)
     486              :                   call turn_off_reaction(ircrap)
     487              :                   call turn_off_reaction(irmnpa)
     488              :                   call turn_off_reaction(irmnpg)
     489              :                   call turn_off_reaction(irfegp)
     490              :                   call turn_off_reaction(irfeag)
     491              : 
     492              :                   !iron group
     493              :                   call turn_off_reaction(irniga)
     494              :                   call turn_off_reaction(irfeap)
     495              :                   call turn_off_reaction(ircopa)
     496              : 
     497              :                   call turn_off_reaction(irnigp)
     498              :                   call turn_off_reaction(irfepg)
     499              :                   call turn_off_reaction(ircogp)
     500              : 
     501              :                   call turn_off_reaction(irheng)
     502              :                   call turn_off_reaction(irhegn)
     503              : 
     504              :                   call turn_off_reaction(irhng)
     505              :                   call turn_off_reaction(irdgn)
     506              : 
     507              :                   call turn_off_reaction(irdpg)
     508              :                   call turn_off_reaction(irhegp)
     509              : 
     510              :                   call turn_off_reaction(irpen)
     511              :                   call turn_off_reaction(irnep)
     512              : 
     513              :                   call turn_off_reaction(ircopg)
     514              : 
     515              :                   call turn_off_reaction(ir54ng)
     516              :                   call turn_off_reaction(ir55gn)
     517              :                   call turn_off_reaction(ir55ng)
     518              :                   call turn_off_reaction(ir56gn)
     519              : 
     520              :                   call turn_off_reaction(ir52ng)
     521              :                   call turn_off_reaction(ir53gn)
     522              :                   call turn_off_reaction(ir53ng)
     523              :                   call turn_off_reaction(ir54gn)
     524              : 
     525              :                   call turn_off_reaction(irfe56pg)
     526              :                   call turn_off_reaction(irco57gp)
     527              : 
     528              :                   call turn_off_reaction(irfe54ap)
     529              :                   call turn_off_reaction(irco57pa)
     530              : 
     531              :                   call turn_off_reaction(irco56ec)
     532              :                   call turn_off_reaction(irn56ec)
     533              : 
     534              :                end if
     535              : 
     536              :                !if (.true.) then
     537              : 
     538              : 
     539              :                !end if
     540              : 
     541              :             end if
     542              : 
     543              :    ! fe52(n,g)fe53(n,g)fe54 equilibrium links
     544         4553 :          ratdum(ir1f54)     = 0.0d0
     545         4553 :          dratdumdy1(ir1f54) = 0.0d0
     546         4553 :          dratdumdt(ir1f54)  = 0.0d0
     547         4553 :          dratdumdd(ir1f54)  = 0.0d0
     548              : 
     549         4553 :          ratdum(ir2f54)     = 0.0d0
     550         4553 :          dratdumdy1(ir2f54) = 0.0d0
     551         4553 :          dratdumdt(ir2f54)  = 0.0d0
     552         4553 :          dratdumdd(ir2f54)  = 0.0d0
     553              : 
     554         4553 :          denom   = ratdum(ir53gn) + y(ineut)*ratdum(ir53ng)
     555         4553 :          denomdt = dratdumdt(ir53gn) + y(ineut)*dratdumdt(ir53ng)
     556         4553 :          denomdd = dratdumdd(ir53gn) + y(ineut)*dratdumdd(ir53ng)
     557              : 
     558         4553 :          if (denom > tiny_denom .and. btemp > 1.5d9) then
     559         2967 :          zz      = 1.0d0/denom
     560              : 
     561         2967 :          ratdum(ir1f54)     = ratdum(ir54gn)*ratdum(ir53gn)*zz
     562         2967 :          dratdumdy1(ir1f54) = -ratdum(ir1f54)*zz * ratdum(ir53ng)
     563         2967 :          dratdumdt(ir1f54)  = dratdumdt(ir54gn)*ratdum(ir53gn)*zz &
     564              :                               + ratdum(ir54gn)*dratdumdt(ir53gn)*zz &
     565         2967 :                               - ratdum(ir1f54)*zz*denomdt
     566         2967 :          dratdumdd(ir1f54) = dratdumdd(ir54gn)*ratdum(ir53gn)*zz &
     567              :                            + ratdum(ir54gn)*dratdumdd(ir53gn)*zz &
     568         2967 :                            - ratdum(ir1f54)*zz*denomdd
     569              : 
     570         2967 :          ratdum(ir2f54)     = ratdum(ir52ng)*ratdum(ir53ng)*zz
     571         2967 :          dratdumdy1(ir2f54) = -ratdum(ir2f54)*zz * ratdum(ir53ng)
     572         2967 :          dratdumdt(ir2f54)  = dratdumdt(ir52ng)*ratdum(ir53ng)*zz &
     573              :                               + ratdum(ir52ng)*dratdumdt(ir53ng)*zz &
     574         2967 :                               - ratdum(ir2f54)*zz*denomdt
     575         2967 :          dratdumdd(ir2f54) = dratdumdd(ir52ng)*ratdum(ir53ng)*zz &
     576              :                            + ratdum(ir52ng)*dratdumdd(ir53ng)*zz &
     577         2967 :                            - ratdum(ir2f54)*zz*denomdd
     578              :          end if
     579              : 
     580              :    ! fe54(n,g)fe55(n,g)fe56 equilibrium links
     581         4553 :          ratdum(irfe56_aux1)     = 0.0d0
     582         4553 :          dratdumdy1(irfe56_aux1) = 0.0d0
     583         4553 :          dratdumdt(irfe56_aux1)  = 0.0d0
     584         4553 :          dratdumdd(irfe56_aux1)  = 0.0d0
     585              : 
     586         4553 :          ratdum(irfe56_aux2)     = 0.0d0
     587         4553 :          dratdumdy1(irfe56_aux2) = 0.0d0
     588         4553 :          dratdumdt(irfe56_aux2)  = 0.0d0
     589         4553 :          dratdumdd(irfe56_aux2)  = 0.0d0
     590              : 
     591         4553 :          denom   = ratdum(ir55gn)    + y(ineut)*ratdum(ir55ng)
     592         4553 :          denomdt = dratdumdt(ir55gn) + y(ineut)*dratdumdt(ir55ng)
     593         4553 :          denomdd = dratdumdd(ir55gn) + y(ineut)*dratdumdd(ir55ng)
     594              : 
     595         4553 :          if (denom > tiny_denom .and. btemp > 1.5d9) then
     596         2967 :          zz      = 1.0d0/denom
     597              : 
     598         2967 :          ratdum(irfe56_aux1)     = ratdum(ir56gn)*ratdum(ir55gn)*zz
     599         2967 :          dratdumdy1(irfe56_aux1) = -ratdum(irfe56_aux1)*zz * ratdum(ir55ng)
     600         2967 :          dratdumdt(irfe56_aux1)  = dratdumdt(ir56gn)*ratdum(ir55gn)*zz &
     601              :                                  + ratdum(ir56gn)*dratdumdt(ir55gn)*zz &
     602         2967 :                                  - ratdum(irfe56_aux1)*zz*denomdt
     603         2967 :          dratdumdd(irfe56_aux1)  = dratdumdd(ir56gn)*ratdum(ir55gn)*zz &
     604              :                                  + ratdum(ir56gn)*dratdumdd(ir55gn)*zz &
     605         2967 :                                  - ratdum(irfe56_aux1)*zz*denomdd
     606              : 
     607         2967 :          ratdum(irfe56_aux2)     = ratdum(ir54ng)*ratdum(ir55ng)*zz
     608         2967 :          dratdumdy1(irfe56_aux2) = -ratdum(irfe56_aux2)*zz * ratdum(ir55ng)
     609         2967 :          dratdumdt(irfe56_aux2)  = dratdumdt(ir54ng)*ratdum(ir55ng)*zz &
     610              :                                  + ratdum(ir54ng)*dratdumdt(ir55ng)*zz &
     611         2967 :                                  - ratdum(irfe56_aux2)*zz*denomdt
     612         2967 :          dratdumdd(irfe56_aux2) = dratdumdd(ir54ng)*ratdum(ir55ng)*zz &
     613              :                                  + ratdum(ir54ng)*dratdumdd(ir55ng)*zz &
     614         2967 :                                  - ratdum(irfe56_aux2)*zz*denomdd
     615              : 
     616              :          end if
     617              : 
     618              :    ! fe54(a,p)co57(g,p)fe56 equilibrium links
     619              : 
     620         4553 :          ratdum(irfe56_aux3)     = 0.0d0
     621         4553 :          dratdumdy1(irfe56_aux3) = 0.0d0
     622         4553 :          dratdumdt(irfe56_aux3)  = 0.0d0
     623         4553 :          dratdumdd(irfe56_aux3)  = 0.0d0
     624              : 
     625         4553 :          ratdum(irfe56_aux4)     = 0.0d0
     626         4553 :          dratdumdy1(irfe56_aux4) = 0.0d0
     627         4553 :          dratdumdt(irfe56_aux4)  = 0.0d0
     628         4553 :          dratdumdd(irfe56_aux4)  = 0.0d0
     629              : 
     630         4553 :          denom   = ratdum(irco57gp)    + y(iprot)*ratdum(irco57pa)
     631         4553 :          denomdt = dratdumdt(irco57gp) + y(iprot)*dratdumdt(irco57pa)
     632         4553 :          denomdd = dratdumdd(irco57gp) + y(iprot)*dratdumdd(irco57pa)
     633              : 
     634         4553 :          if (denom > tiny_denom .and. btemp > 1.5d9) then
     635         2967 :          zz      = 1.0d0/denom
     636              : 
     637         2967 :          ratdum(irfe56_aux3)     = ratdum(irfe56pg) * ratdum(irco57pa) * zz
     638         2967 :          dratdumdy1(irfe56_aux3) = -ratdum(irfe56_aux3) * zz * ratdum(irco57pa)
     639         2967 :          dratdumdt(irfe56_aux3)  = dratdumdt(irfe56pg) * ratdum(irco57pa) * zz &
     640              :                                  + ratdum(irfe56pg) * dratdumdt(irco57pa) * zz &
     641         2967 :                                  - ratdum(irfe56_aux3) * zz * denomdt
     642         2967 :          dratdumdd(irfe56_aux3)  = dratdumdd(irfe56pg) * ratdum(irco57pa) * zz &
     643              :                                  + ratdum(irfe56pg) * dratdumdd(irco57pa) * zz &
     644         2967 :                                  - ratdum(irfe56_aux3) * zz * denomdd
     645              : 
     646         2967 :          ratdum(irfe56_aux4)     = ratdum(irfe54ap) * ratdum(irco57gp) * zz
     647         2967 :          dratdumdy1(irfe56_aux4) = -ratdum(irfe56_aux4) * zz * ratdum(irco57pa)
     648         2967 :          dratdumdt(irfe56_aux4)  = dratdumdt(irfe54ap) * ratdum(irco57gp) * zz &
     649              :                                  + ratdum(irfe54ap) * dratdumdt(irco57gp) * zz &
     650         2967 :                                  - ratdum(irfe56_aux4) * zz * denomdt
     651         2967 :          dratdumdd(irfe56_aux4)  = dratdumdd(irfe54ap) * ratdum(irco57gp) * zz &
     652              :                                  + ratdum(irfe54ap) * dratdumdd(irco57gp) * zz &
     653         2967 :                                  - ratdum(irfe56_aux4) * zz * denomdd
     654              :          end if
     655              : 
     656              : 
     657              :    ! fe54(p,g)co55(p,g)ni56 equilibrium links r3f54 r4f54
     658              :    ! fe52(a,p)co55(g,p)fe54 equilibrium links r5f54 r6f54
     659              :    ! fe52(a,p)co55(p,g)ni56 equilibrium links r7f54 r8f54
     660              : 
     661         4553 :          ratdum(ir3f54)     = 0.0d0
     662         4553 :          dratdumdy1(ir3f54) = 0.0d0
     663         4553 :          dratdumdt(ir3f54)  = 0.0d0
     664         4553 :          dratdumdd(ir3f54)  = 0.0d0
     665              : 
     666         4553 :          ratdum(ir4f54)     = 0.0d0
     667         4553 :          dratdumdy1(ir4f54) = 0.0d0
     668         4553 :          dratdumdt(ir4f54)  = 0.0d0
     669         4553 :          dratdumdd(ir4f54)  = 0.0d0
     670              : 
     671         4553 :          ratdum(ir5f54)     = 0.0d0
     672         4553 :          dratdumdy1(ir5f54) = 0.0d0
     673         4553 :          dratdumdt(ir5f54)  = 0.0d0
     674         4553 :          dratdumdd(ir5f54)  = 0.0d0
     675              : 
     676         4553 :          ratdum(ir6f54)     = 0.0d0
     677         4553 :          dratdumdy1(ir6f54) = 0.0d0
     678         4553 :          dratdumdt(ir6f54)  = 0.0d0
     679         4553 :          dratdumdd(ir6f54)  = 0.0d0
     680              : 
     681         4553 :          ratdum(ir7f54)     = 0.0d0
     682         4553 :          dratdumdy1(ir7f54) = 0.0d0
     683         4553 :          dratdumdt(ir7f54)  = 0.0d0
     684         4553 :          dratdumdd(ir7f54)  = 0.0d0
     685              : 
     686         4553 :          ratdum(ir8f54)     = 0.0d0
     687         4553 :          dratdumdy1(ir8f54) = 0.0d0
     688         4553 :          dratdumdt(ir8f54)  = 0.0d0
     689         4553 :          dratdumdd(ir8f54)  = 0.0d0
     690              : 
     691         4553 :          denom   = ratdum(ircogp)+y(iprot)*(ratdum(ircopg)+ratdum(ircopa))
     692              : 
     693         4553 :          if (denom > tiny_denom .and. btemp > 1.5d9) then
     694              : 
     695         2967 :          denomdt = dratdumdt(ircogp) &
     696         2967 :                   + y(iprot)*(dratdumdt(ircopg) + dratdumdt(ircopa))
     697         2967 :          denomdd = dratdumdd(ircogp) &
     698         2967 :                   + y(iprot)*(dratdumdd(ircopg) + dratdumdd(ircopa))
     699              : 
     700         2967 :          zz      = 1.0d0/denom
     701              : 
     702         2967 :          ratdum(ir3f54)     = ratdum(irfepg) * ratdum(ircopg) * zz
     703              :          dratdumdy1(ir3f54) = -ratdum(ir3f54) * zz * &
     704         2967 :                               (ratdum(ircopg) + ratdum(ircopa))
     705         2967 :          dratdumdt(ir3f54)  = dratdumdt(irfepg) * ratdum(ircopg) * zz &
     706              :                   + ratdum(irfepg) * dratdumdt(ircopg) * zz &
     707         2967 :                   - ratdum(ir3f54)*zz*denomdt
     708         2967 :          dratdumdd(ir3f54)  = dratdumdd(irfepg) * ratdum(ircopg) * zz &
     709              :                   + ratdum(irfepg) * dratdumdd(ircopg) * zz &
     710         2967 :                   - ratdum(ir3f54)*zz*denomdd
     711              : 
     712         2967 :          ratdum(ir4f54)     = ratdum(irnigp) * ratdum(ircogp) * zz
     713              :          dratdumdy1(ir4f54) = -ratdum(ir4f54) * zz * &
     714         2967 :                               (ratdum(ircopg)+ratdum(ircopa))
     715         2967 :          dratdumdt(ir4f54)  =  dratdumdt(irnigp) * ratdum(ircogp) * zz &
     716              :                   + ratdum(irnigp) * dratdumdt(ircogp) * zz &
     717         2967 :                   - ratdum(ir4f54)*zz*denomdt
     718         2967 :          dratdumdd(ir4f54)  = dratdumdd(irnigp) * ratdum(ircogp) * zz &
     719              :                   + ratdum(irnigp) * dratdumdd(ircogp) * zz &
     720         2967 :                   - ratdum(ir4f54)*zz*denomdd
     721              : 
     722         2967 :          ratdum(ir5f54)     = ratdum(irfepg) * ratdum(ircopa) * zz
     723              :          dratdumdy1(ir5f54) = -ratdum(ir5f54) * zz * &
     724         2967 :                               (ratdum(ircopg)+ratdum(ircopa))
     725              :          dratdumdt(ir5f54)  = dratdumdt(irfepg) * ratdum(ircopa) * zz &
     726              :                   + ratdum(irfepg) * dratdumdt(ircopa) * zz &
     727         2967 :                   - ratdum(ir5f54) * zz * denomdt
     728              :          dratdumdd(ir5f54)  = dratdumdd(irfepg) * ratdum(ircopa) * zz &
     729              :                   + ratdum(irfepg) * dratdumdd(ircopa) * zz &
     730         2967 :                   - ratdum(ir5f54) * zz * denomdd
     731              : 
     732         2967 :          ratdum(ir6f54)     = ratdum(irfeap) * ratdum(ircogp) * zz
     733              :          dratdumdy1(ir6f54) = -ratdum(ir6f54) * zz * &
     734         2967 :                               (ratdum(ircopg)+ratdum(ircopa))
     735         2967 :          dratdumdt(ir6f54)  = dratdumdt(irfeap) * ratdum(ircogp) * zz &
     736              :                   + ratdum(irfeap) * dratdumdt(ircogp) * zz &
     737         2967 :                   - ratdum(ir6f54) * zz * denomdt
     738         2967 :          dratdumdd(ir6f54)  = dratdumdd(irfeap) * ratdum(ircogp) * zz &
     739              :                   + ratdum(irfeap) * dratdumdd(ircogp) * zz &
     740         2967 :                   - ratdum(ir6f54) * zz * denomdd
     741              : 
     742         2967 :          ratdum(ir7f54)     = ratdum(irfeap) * ratdum(ircopg) * zz
     743              : 
     744              :          dratdumdy1(ir7f54) = -ratdum(ir7f54) * zz * &
     745         2967 :                               (ratdum(ircopg)+ratdum(ircopa))
     746              :          dratdumdt(ir7f54)  = dratdumdt(irfeap) * ratdum(ircopg) * zz &
     747              :                   + ratdum(irfeap) * dratdumdt(ircopg) * zz &
     748         2967 :                   - ratdum(ir7f54) * zz * denomdt
     749              :          dratdumdd(ir7f54)  = dratdumdd(irfeap) * ratdum(ircopg) * zz &
     750              :                   + ratdum(irfeap) * dratdumdd(ircopg) * zz &
     751         2967 :                   - ratdum(ir7f54) * zz * denomdd
     752              : 
     753         2967 :          ratdum(ir8f54)     = ratdum(irnigp) * ratdum(ircopa) * zz
     754              : 
     755              :          dratdumdy1(ir8f54) = -ratdum(ir8f54) * zz * &
     756         2967 :                               (ratdum(ircopg)+ratdum(ircopa))
     757              :          dratdumdt(ir8f54)  = dratdumdt(irnigp) * ratdum(ircopa) * zz &
     758              :                   + ratdum(irnigp) * dratdumdt(ircopa) * zz &
     759         2967 :                   - ratdum(ir8f54) * zz * denomdt
     760              :          dratdumdd(ir8f54)  = dratdumdd(irnigp) * ratdum(ircopa) * zz &
     761              :                   + ratdum(irnigp) * dratdumdd(ircopa) * zz &
     762         2967 :                   - ratdum(ir8f54) * zz * denomdd
     763              : 
     764              : 
     765              :          end if
     766              : 
     767              : 
     768              :    ! p(n,g)h2(n,g)3h(p,g)he4   photodisintegrated n and p back to he4 equilibrium links
     769              :    ! p(n,g)h2(p,g)he3(n,g)he4
     770              : 
     771         4553 :          ratdum(iralf1)     = 0.0d0
     772         4553 :          dratdumdy1(iralf1) = 0.0d0
     773         4553 :          dratdumdy2(iralf1) = 0.0d0
     774         4553 :          dratdumdt(iralf1)  = 0.0d0
     775         4553 :          dratdumdd(iralf1)  = 0.0d0
     776              : 
     777         4553 :          ratdum(iralf2)     = 0.0d0
     778         4553 :          dratdumdy1(iralf2) = 0.0d0
     779         4553 :          dratdumdy2(iralf2) = 0.0d0
     780         4553 :          dratdumdt(iralf2)  = 0.0d0
     781         4553 :          dratdumdd(iralf2)  = 0.0d0
     782              : 
     783         9106 :          denom  = ratdum(irhegp)*ratdum(irdgn) + &
     784         4553 :                   y(ineut)*ratdum(irheng)*ratdum(irdgn) + &
     785        18212 :                   y(ineut)*y(iprot)*ratdum(irheng)*ratdum(irdpg)
     786              : 
     787         4553 :          if (denom > tiny_denom .and. btemp > 1.5d9) then
     788              : 
     789         2967 :          denomdt  = dratdumdt(irhegp)*ratdum(irdgn) &
     790         2967 :                   + ratdum(irhegp)*dratdumdt(irdgn) &
     791         2967 :                   +  y(ineut) * (dratdumdt(irheng)*ratdum(irdgn) &
     792              :                               + ratdum(irheng)*dratdumdt(irdgn)) &
     793              :                   +  y(ineut)*y(iprot) * (dratdumdt(irheng)*ratdum(irdpg) &
     794         2967 :                                        + ratdum(irheng)*dratdumdt(irdpg))
     795              : 
     796         2967 :          denomdd  = dratdumdd(irhegp)*ratdum(irdgn) &
     797         2967 :                   + ratdum(irhegp)*dratdumdd(irdgn) &
     798         2967 :                   +  y(ineut) * (dratdumdd(irheng)*ratdum(irdgn) &
     799              :                               + ratdum(irheng)*dratdumdd(irdgn)) &
     800              :                   +  y(ineut)*y(iprot) * (dratdumdd(irheng)*ratdum(irdpg) &
     801         2967 :                                        + ratdum(irheng)*dratdumdd(irdpg))
     802              : 
     803         2967 :          zz = 1.0d0/denom
     804              : 
     805         2967 :          ratdum(iralf1)     = ratdum(irhegn) * ratdum(irhegp)* &
     806         2967 :                               ratdum(irdgn) * zz
     807              :          dratdumdy1(iralf1) = -ratdum(iralf1) * zz * &
     808              :                               (ratdum(irheng)*ratdum(irdgn) + &
     809         2967 :                               y(iprot)*ratdum(irheng)*ratdum(irdpg))
     810              :          dratdumdy2(iralf1) = -ratdum(iralf1) * zz * y(ineut) * &
     811         2967 :                               ratdum(irheng) * ratdum(irdpg)
     812         2967 :          dratdumdt(iralf1)  = dratdumdt(irhegn)*ratdum(irhegp)* &
     813              :                               ratdum(irdgn) * zz &
     814              :                   + ratdum(irhegn)*dratdumdt(irhegp)*ratdum(irdgn)*zz &
     815              :                   + ratdum(irhegn)*ratdum(irhegp)*dratdumdt(irdgn)*zz &
     816         2967 :                   - ratdum(iralf1)*zz*denomdt
     817         2967 :          dratdumdd(iralf1)  = dratdumdd(irhegn) * ratdum(irhegp)* &
     818              :                               ratdum(irdgn) * zz &
     819              :                   + ratdum(irhegn)*dratdumdd(irhegp)*ratdum(irdgn)*zz &
     820              :                   + ratdum(irhegn)*ratdum(irhegp)*dratdumdd(irdgn)*zz &
     821         2967 :                   - ratdum(iralf1)*zz*denomdd
     822              : 
     823              : 
     824              :          ratdum(iralf2)     = ratdum(irheng)*ratdum(irdpg)* &
     825         2967 :                               ratdum(irhng)*zz
     826              :          dratdumdy1(iralf2) = -ratdum(iralf2) * zz * &
     827              :                               (ratdum(irheng)*ratdum(irdgn) + &
     828         2967 :                                  y(iprot)*ratdum(irheng)*ratdum(irdpg))
     829              : 
     830              : 
     831              :          denom  = ratdum(irhegp)*ratdum(irdgn) + &
     832              :                   y(ineut)*ratdum(irheng)*ratdum(irdgn) + &
     833         2967 :                   y(ineut)*y(iprot)*ratdum(irheng)*ratdum(irdpg)
     834              : 
     835         2967 :          if (is_bad(dratdumdy1(iralf2))) then
     836            0 :             write(*,1) 'denom', denom
     837            0 :             write(*,1) 'zz', zz
     838            0 :             write(*,1) 'dratdumdy1(iralf2)', dratdumdy1(iralf2)
     839            0 :             write(*,1) 'ratdum(irhegp)*ratdum(irdgn)', ratdum(irhegp)*ratdum(irdgn)
     840            0 :             write(*,1) 'y(ineut)*ratdum(irheng)*ratdum(irdgn)', y(ineut)*ratdum(irheng)*ratdum(irdgn)
     841            0 :             write(*,1) 'y(ineut)*y(iprot)*ratdum(irheng)*ratdum(irdpg)', &
     842            0 :                y(ineut)*y(iprot)*ratdum(irheng)*ratdum(irdpg)
     843            0 :             write(*,1) 'ratdum(irhegp)', ratdum(irhegp)
     844            0 :             write(*,1) 'ratdum(irdgn)', ratdum(irdgn)
     845            0 :             write(*,1) 'ratdum(irheng)', ratdum(irheng)
     846            0 :             write(*,1) 'ratdum(irdgn)', ratdum(irdgn)
     847            0 :             write(*,1) 'y(ineut)', y(ineut)
     848            0 :             write(*,1) 'y(iprot)', y(iprot)
     849            0 :             stop
     850              :          end if
     851              : 
     852              : 
     853              :          dratdumdy2(iralf2) = -ratdum(iralf2) * zz * y(ineut)* &
     854         2967 :                               ratdum(irheng) * ratdum(irdpg)
     855              :          dratdumdt(iralf2)  = dratdumdt(irheng)*ratdum(irdpg) * &
     856              :                               ratdum(irhng) * zz &
     857              :                   + ratdum(irheng)*dratdumdt(irdpg)*ratdum(irhng)*zz &
     858         2967 :                   + ratdum(irheng)*ratdum(irdpg)*dratdumdt(irhng)*zz &
     859         2967 :                   - ratdum(iralf2)*zz*denomdt
     860              :          dratdumdd(iralf2)  = dratdumdd(irheng)*ratdum(irdpg)* &
     861              :                               ratdum(irhng)*zz &
     862              :                   + ratdum(irheng)*dratdumdd(irdpg)*ratdum(irhng)*zz &
     863         2967 :                   + ratdum(irheng)*ratdum(irdpg)*dratdumdd(irhng)*zz &
     864         2967 :                   - ratdum(iralf2)*zz*denomdd
     865              : 
     866              :          end if
     867              : 
     868              : 
     869              : 
     870              :    ! he3(a,g)be7(p,g)8b(e+nu)8be(2a)
     871              :    ! beta limit he3+he4 by the 8B decay half life
     872         4553 :          if (y(ihe4) > tiny_y) then
     873         4551 :          xx            = 0.896d0/y(ihe4)
     874         4551 :          ratdum(irhe3ag)  = min(ratdum(irhe3ag),xx)
     875         4551 :          if (ratdum(irhe3ag) == xx) then
     876         4550 :          dratdumdy1(irhe3ag) = -xx/y(ihe4)
     877         4550 :          dratdumdt(irhe3ag)  = 0.0d0
     878         4550 :          dratdumdd(irhe3ag)  = 0.0d0
     879              :          else
     880            1 :          dratdumdy1(irhe3ag) = 0.0d0
     881              :          end if
     882              :          end if
     883              : 
     884              : 
     885              :    ! beta limit n14(p,g)o15(enu)o16  and o16(p,g)f17(e+nu)17o(p,a)n14
     886         5863 :          if (y(ih1) > tiny_y) then
     887              : 
     888         1310 :             xx = 5.68d-03/(y(ih1)*1.57d0)
     889         1310 :             ratdum(irnpg) = min(ratdum(irnpg),xx)
     890         1310 :             if (ratdum(irnpg) == xx) then
     891            0 :             dratdumdy1(irnpg) = -xx/y(ih1)
     892            0 :             dratdumdt(irnpg)  = 0.0d0
     893            0 :             dratdumdd(irnpg)  = 0.0d0
     894              :             else
     895         1310 :             dratdumdy1(irnpg) = 0.0d0
     896              :             end if
     897              : 
     898         1310 :             xx = 0.0105d0/y(ih1)
     899         1310 :             ratdum(iropg) = min(ratdum(iropg),xx)
     900         1310 :             if (ratdum(iropg) == xx) then
     901            0 :             dratdumdy1(iropg) = -xx/y(ih1)
     902            0 :             dratdumdt(iropg)  = 0.0d0
     903            0 :             dratdumdd(iropg)  = 0.0d0
     904              :             else
     905         1310 :             dratdumdy1(iropg) = 0.0d0
     906              :             end if
     907              : 
     908              :          end if
     909              : 
     910              : 
     911              :          contains
     912              : 
     913              :          subroutine turn_off_reaction(i)
     914              :             integer, intent(in) :: i
     915              :             if (i == 0) return
     916              :             ratdum(i) = 0
     917              :             dratdumdt(i) = 0
     918              :             dratdumdd(i) = 0
     919              :             dratdumdy1(i) = 0
     920              :             dratdumdy2(i) = 0
     921         4553 :          end subroutine turn_off_reaction
     922              : 
     923              :          end subroutine approx21_special_reactions
     924              : 
     925              : 
     926        10597 :          subroutine approx21_dydt( &
     927        10597 :             y, rate, ratdum, dydt, deriva, &
     928              :             fe56ec_fake_factor_in, min_T, fe56ec_n_neut, temp, den, plus_co56, ierr)
     929              :          logical, intent(in) :: deriva  ! false for dydt, true for partials wrt T, Rho
     930              :          real(dp), dimension(:), intent(in) :: y, rate, ratdum
     931              :          integer, intent(in) :: fe56ec_n_neut
     932              :          real(dp), dimension(:), intent(out) :: dydt
     933              :          real(dp), intent(in) :: fe56ec_fake_factor_in, temp, den
     934              :          real(dp) :: fe56ec_fake_factor, min_T
     935              :          logical, intent(in) ::  plus_co56
     936              :          integer, intent(out) :: ierr
     937              : 
     938              :          integer :: i
     939              : 
     940              :    ! quad precision dydt sums
     941              :          real(qp) :: a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,&
     942              :             a11,a12,a13,a14,a15,a16,a17,a18,a19,a20
     943        21194 :          real(qp) :: qray(species(plus_co56))
     944              : 
     945              :          logical :: okay
     946              : 
     947              :          include 'formats'
     948              : 
     949        10597 :          ierr = 0
     950              : 
     951              :          ! Turn on special fe56ec rate above some temperature
     952        10597 :          fe56ec_fake_factor = 0d0
     953        10597 :          if(.not.deriva) then
     954        10597 :             fe56ec_fake_factor = eval_fe56ec_fake_factor(fe56ec_fake_factor_in, min_T, temp)
     955              :          end if
     956              : 
     957       233140 :          dydt(1:species(plus_co56)) = 0.0d0
     958       233140 :          qray(1:species(plus_co56)) = 0.0_qp
     959              : 
     960              :    ! hydrogen reactions
     961        10597 :          a1 = -1.5d0 * y(ih1) * y(ih1) * rate(irpp)
     962        10597 :          a2 =  y(ihe3) * y(ihe3) * rate(ir33)
     963        10597 :          a3 = -y(ihe3) * y(ihe4) * rate(irhe3ag)
     964        10597 :          a4 = -2.0d0 * y(ic12) * y(ih1) * rate(ircpg)
     965        10597 :          a5 = -2.0d0 * y(in14) * y(ih1) * rate(irnpg)
     966        10597 :          a6 = -2.0d0 * y(io16) * y(ih1) * rate(iropg)
     967        10597 :          a7 = -3.0d0 * y(ih1) * rate(irpen)
     968              : 
     969        10597 :          qray(ih1) = qray(ih1) + a1 + a2 + a3 + a4 + a5 + a6 + a7
     970              : 
     971              :    ! he3 reactions
     972              : 
     973        10597 :          a1  =  0.5d0 * y(ih1) * y(ih1) * rate(irpp)
     974        10597 :          a2  = -y(ihe3) * y(ihe3) * rate(ir33)
     975        10597 :          a3  = -y(ihe3) * y(ihe4) * rate(irhe3ag)
     976        10597 :          a4  =  y(ih1) * rate(irpen)
     977              : 
     978        10597 :          qray(ihe3) = qray(ihe3) + a1 + a2 + a3 + a4
     979              : 
     980              : 
     981              :    ! he4 reactions
     982              :    ! heavy ion reactions
     983        10597 :          a1  = 0.5d0 * y(ic12) * y(ic12) * rate(ir1212)
     984        10597 :          a2  = 0.5d0 * y(ic12) * y(io16) * rate(ir1216)
     985        10597 :          a3  = 0.56d0 * 0.5d0 * y(io16) * y(io16) * rate(ir1616)
     986        10597 :          a4 = -y(ihe4) * y(in14) * rate(irnag) * 1.5d0  ! n14 + 1.5 alpha => ne20
     987        10597 :          qray(ihe4) =  qray(ihe4) + a1 + a2 + a3 + a4
     988              : 
     989              : 
     990              :    ! (a,g) and (g,a) reactions
     991              : 
     992        10597 :          a1  = -0.5d0 * y(ihe4) * y(ihe4) * y(ihe4) * rate(ir3a)
     993        10597 :          a2  =  3.0d0 * y(ic12) * rate(irg3a)
     994        10597 :          a3  = -y(ihe4) * y(ic12) * rate(ircag)
     995        10597 :          a4  =  y(io16) * rate(iroga)
     996        10597 :          a5  = -y(ihe4) * y(io16) * rate(iroag)
     997        10597 :          a6  =  y(ine20) * rate(irnega)
     998        10597 :          a7  = -y(ihe4) * y(ine20) * rate(irneag)
     999        10597 :          a8  =  y(img24) * rate(irmgga)
    1000        10597 :          a9  = -y(ihe4) * y(img24)* rate(irmgag)
    1001        10597 :          a10 =  y(isi28) * rate(irsiga)
    1002        10597 :          a11 = -y(ihe4) * y(isi28)*rate(irsiag)
    1003        10597 :          a12 =  y(is32) * rate(irsga)
    1004              : 
    1005              :          qray(ihe4) =  qray(ihe4) + &
    1006        10597 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12
    1007              : 
    1008        10597 :          a1  = -y(ihe4) * y(is32) * rate(irsag)
    1009        10597 :          a2  =  y(iar36) * rate(irarga)
    1010        10597 :          a3  = -y(ihe4) * y(iar36)*rate(irarag)
    1011        10597 :          a4  =  y(ica40) * rate(ircaga)
    1012        10597 :          a5  = -y(ihe4) * y(ica40)*rate(ircaag)
    1013        10597 :          a6  =  y(iti44) * rate(irtiga)
    1014        10597 :          a7  = -y(ihe4) * y(iti44)*rate(irtiag)
    1015        10597 :          a8  =  y(icr48) * rate(ircrga)
    1016        10597 :          a9  = -y(ihe4) * y(icr48)*rate(ircrag)
    1017        10597 :          a10 =  y(ife52) * rate(irfega)
    1018        10597 :          a11 = -y(ihe4) * y(ife52) * rate(irfeag)
    1019        10597 :          a12 =  y(ini56) * rate(irniga)
    1020              : 
    1021              :          qray(ihe4) =  qray(ihe4) + &
    1022        10597 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12
    1023              : 
    1024              : 
    1025              :    ! (a,p)(p,g) and (g,p)(p,a) reactions
    1026              : 
    1027        10597 :          if (.not.deriva) then
    1028         4553 :          a1  =  0.34d0*0.5d0*y(io16)*y(io16)*rate(irs1)*rate(ir1616)
    1029         4553 :          a2  = -y(ihe4) * y(img24) * rate(irmgap)*(1.0d0-rate(irr1))
    1030         4553 :          a3  =  y(isi28) * rate(irsigp) * rate(irr1)
    1031         4553 :          a4  = -y(ihe4) * y(isi28) * rate(irsiap)*(1.0d0-rate(irs1))
    1032         4553 :          a5  =  y(is32) * rate(irsgp) * rate(irs1)
    1033         4553 :          a6  = -y(ihe4) * y(is32) * rate(irsap)*(1.0d0-rate(irt1))
    1034         4553 :          a7  =  y(iar36) * rate(irargp) * rate(irt1)
    1035         4553 :          a8  = -y(ihe4) * y(iar36) * rate(irarap)*(1.0d0-rate(iru1))
    1036         4553 :          a9  =  y(ica40) * rate(ircagp) * rate(iru1)
    1037         4553 :          a10 = -y(ihe4) * y(ica40) * rate(ircaap)*(1.0d0-rate(irv1))
    1038         4553 :          a11 =  y(iti44) * rate(irtigp) * rate(irv1)
    1039         4553 :          a12 = -y(ihe4) * y(iti44) * rate(irtiap)*(1.0d0-rate(irw1))
    1040         4553 :          a13 =  y(icr48) * rate(ircrgp) * rate(irw1)
    1041         4553 :          a14 = -y(ihe4) * y(icr48) * rate(ircrap)*(1.0d0-rate(irx1))
    1042         4553 :          a15 =  y(ife52) * rate(irfegp) * rate(irx1)
    1043              : 
    1044              :          qray(ihe4) = qray(ihe4) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + &
    1045         4553 :             a8 + a9 + a10 + a11 + a12 + a13 + a14 + a15
    1046              : 
    1047              :          else
    1048         6044 :          a1  =  0.34d0*0.5d0*y(io16)*y(io16) * ratdum(irs1)*rate(ir1616)
    1049         6044 :          a2  =  0.34d0*0.5d0*y(io16)*y(io16) * rate(irs1) * ratdum(ir1616)
    1050         6044 :          a3  = -y(ihe4)*y(img24) * rate(irmgap)*(1.0d0 - ratdum(irr1))
    1051         6044 :          a4  =  y(ihe4)*y(img24) * ratdum(irmgap)*rate(irr1)
    1052         6044 :          a5  =  y(isi28) * ratdum(irsigp) * rate(irr1)
    1053         6044 :          a6  =  y(isi28) * rate(irsigp) * ratdum(irr1)
    1054         6044 :          a7  = -y(ihe4)*y(isi28) * rate(irsiap)*(1.0d0 - ratdum(irs1))
    1055         6044 :          a8  =  y(ihe4)*y(isi28) * ratdum(irsiap) * rate(irs1)
    1056         6044 :          a9  =  y(is32) * ratdum(irsgp) * rate(irs1)
    1057         6044 :          a10 =  y(is32) * rate(irsgp) * ratdum(irs1)
    1058              : 
    1059         6044 :          qray(ihe4) =  qray(ihe4) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
    1060              : 
    1061         6044 :          a1  = -y(ihe4)*y(is32) * rate(irsap)*(1.0d0 - ratdum(irt1))
    1062         6044 :          a2  =  y(ihe4)*y(is32) * ratdum(irsap)*rate(irt1)
    1063         6044 :          a3  =  y(iar36) * ratdum(irargp) * rate(irt1)
    1064         6044 :          a4  =  y(iar36) * rate(irargp) * ratdum(irt1)
    1065         6044 :          a5  = -y(ihe4)*y(iar36) * rate(irarap)*(1.0d0 - ratdum(iru1))
    1066         6044 :          a6  =  y(ihe4)*y(iar36) * ratdum(irarap)*rate(iru1)
    1067         6044 :          a7  =  y(ica40) * ratdum(ircagp) * rate(iru1)
    1068         6044 :          a8  =  y(ica40) * rate(ircagp) * ratdum(iru1)
    1069         6044 :          a9  = -y(ihe4)*y(ica40) * rate(ircaap)*(1.0d0-ratdum (irv1))
    1070         6044 :          a10 =  y(ihe4)*y(ica40) * ratdum(ircaap)*rate(irv1)
    1071         6044 :          a11 =  y(iti44) * ratdum(irtigp) * rate(irv1)
    1072         6044 :          a12 =  y(iti44) * rate(irtigp) * ratdum(irv1)
    1073              : 
    1074              :          qray(ihe4) =  qray(ihe4) + &
    1075         6044 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12
    1076              : 
    1077         6044 :          a1  = -y(ihe4)*y(iti44) * rate(irtiap)*(1.0d0 - ratdum(irw1))
    1078         6044 :          a2  =  y(ihe4)*y(iti44) * ratdum(irtiap)*rate(irw1)
    1079         6044 :          a3  =  y(icr48) * ratdum(ircrgp) * rate(irw1)
    1080         6044 :          a4  =  y(icr48) * rate(ircrgp) * ratdum(irw1)
    1081         6044 :          a5  = -y(ihe4)*y(icr48) * rate(ircrap)*(1.0d0 - ratdum(irx1))
    1082         6044 :          a6  =  y(ihe4)*y(icr48) * ratdum(ircrap)*rate(irx1)
    1083         6044 :          a7  =  y(ife52) * ratdum(irfegp) * rate(irx1)
    1084         6044 :          a8  =  y(ife52) * rate(irfegp) * ratdum(irx1)
    1085              : 
    1086         6044 :          qray(ihe4) = qray(ihe4) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1087              :          end if
    1088              : 
    1089              : 
    1090              :    ! photodisintegration reactions
    1091        10597 :          a1 =  y(ife54) * y(iprot) * y(iprot) * rate(ir5f54)
    1092        10597 :          a2 = -y(ife52) * y(ihe4) * rate(ir6f54)
    1093        10597 :          a3 = -y(ife52) * y(ihe4) * y(iprot) * rate(ir7f54)
    1094        10597 :          a4 =  y(ini56) * y(iprot) * rate(ir8f54)
    1095        10597 :          a5 = -y(ihe4) * rate(iralf1)
    1096        10597 :          a6 =  y(ineut)*y(ineut) * y(iprot)*y(iprot) * rate(iralf2)
    1097        10597 :          a7 =  y(ife56) * y(iprot) * y(iprot) * rate(irfe56_aux3)
    1098        10597 :          a8 = -y(ife54) * y(ihe4) * rate(irfe56_aux4)
    1099              : 
    1100        10597 :          qray(ihe4) =  qray(ihe4) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1101              : 
    1102              : 
    1103              :    ! ppchain
    1104        10597 :          a1 = 0.5d0 * y(ihe3) * y(ihe3) * rate(ir33)
    1105        10597 :          a2 = y(ihe3) * y(ihe4) * rate(irhe3ag)
    1106              : 
    1107        10597 :          qray(ihe4) =  qray(ihe4) + a1 + a2
    1108              : 
    1109              : 
    1110              :    ! cno cycles
    1111        10597 :          a1 = y(io16) * y(ih1) * rate(iropg)
    1112              : 
    1113        10597 :          qray(ihe4) =  qray(ihe4) + a1 + a2
    1114              : 
    1115        10597 :          if (.not. deriva) then
    1116         4553 :             a1 = y(in14) * y(ih1) * rate(ifa) * rate(irnpg)
    1117         4553 :             qray(ihe4) =  qray(ihe4) + a1
    1118              :          else
    1119         6044 :             a1 = y(in14) * y(ih1) * rate(ifa) * ratdum(irnpg)
    1120         6044 :             a2 = y(in14) * y(ih1) * ratdum(ifa) * rate(irnpg)
    1121         6044 :             qray(ihe4) =  qray(ihe4) + a1 + a2
    1122              :          end if
    1123              : 
    1124              : 
    1125              :    ! c12 reactions
    1126        10597 :          a1 = -y(ic12) * y(ic12) * rate(ir1212)
    1127        10597 :          a2 = -y(ic12) * y(io16) * rate(ir1216)
    1128        10597 :          a3 =  (1d0/6d0) * y(ihe4) * y(ihe4) * y(ihe4) * rate(ir3a)
    1129        10597 :          a4 = -y(ic12) * rate(irg3a)
    1130        10597 :          a5 = -y(ic12) * y(ihe4) * rate(ircag)
    1131        10597 :          a6 =  y(io16) * rate(iroga)
    1132        10597 :          a7 = -y(ic12) * y(ih1) * rate(ircpg)
    1133              : 
    1134        10597 :          qray(ic12) =  qray(ic12) + a1 + a2 + a3 + a4 + a5 + a6 + a7
    1135              : 
    1136        10597 :          if (.not. deriva) then
    1137         4553 :             a1 =  y(in14) * y(ih1) * rate(ifa) * rate(irnpg)
    1138         4553 :             qray(ic12) =  qray(ic12) + a1
    1139              :          else
    1140         6044 :             a1 =  y(in14) * y(ih1) * rate(ifa) * ratdum(irnpg)
    1141         6044 :             a2 =  y(in14) * y(ih1) * ratdum(ifa) * rate(irnpg)
    1142         6044 :             qray(ic12) =  qray(ic12) + a1 + a2
    1143              :          end if
    1144              : 
    1145              : 
    1146              :    ! n14 reactions
    1147        10597 :          a1 =  y(ic12) * y(ih1) * rate(ircpg)
    1148        10597 :          a2 = -y(in14) * y(ih1) * rate(irnpg)
    1149        10597 :          a3 =  y(io16) * y(ih1) * rate(iropg)
    1150        10597 :          a4 = -y(ihe4) * y(in14) * rate(irnag)  ! n14 + 1.5 alpha => ne20
    1151              : 
    1152        10597 :          qray(in14) =  qray(in14) + a1 + a2 + a3 + a4
    1153              : 
    1154              : 
    1155              :    ! o16 reactions
    1156        10597 :          a1 = -y(ic12) * y(io16) * rate(ir1216)
    1157        10597 :          a2 = -y(io16) * y(io16) * rate(ir1616)
    1158        10597 :          a3 =  y(ic12) * y(ihe4) * rate(ircag)
    1159        10597 :          a4 = -y(io16) * y(ihe4) * rate(iroag)
    1160        10597 :          a5 = -y(io16) * rate(iroga)
    1161        10597 :          a6 =  y(ine20) * rate(irnega)
    1162        10597 :          a7 = -y(io16) * y(ih1) * rate(iropg)
    1163              : 
    1164        10597 :          qray(io16) =  qray(io16) + a1 + a2 + a3 + a4 + a5 + a6 + a7
    1165              : 
    1166        10597 :          if (.not. deriva) then
    1167         4553 :             a1 =  y(in14) * y(ih1) * rate(ifg) * rate(irnpg)
    1168         4553 :             qray(io16) =  qray(io16) + a1
    1169              :          else
    1170         6044 :             a1 =  y(in14) * y(ih1) * rate(ifg) * ratdum(irnpg)
    1171         6044 :             a2 =  y(in14) * y(ih1) * ratdum(ifg) * rate(irnpg)
    1172         6044 :             qray(io16) =  qray(io16) + a1 + a2
    1173              :          end if
    1174              : 
    1175              : 
    1176              :    ! ne20 reactions
    1177        10597 :          a1 =  0.5d0 * y(ic12) * y(ic12) * rate(ir1212)
    1178        10597 :          a2 =  y(io16) * y(ihe4) * rate(iroag)
    1179        10597 :          a3 = -y(ine20) * y(ihe4) * rate(irneag)
    1180        10597 :          a4 = -y(ine20) * rate(irnega)
    1181        10597 :          a5 =  y(img24) * rate(irmgga)
    1182        10597 :          a6 =  y(in14) * y(ihe4) * rate(irnag)  ! n14 + 1.5 alpha => ne20
    1183              : 
    1184        10597 :          qray(ine20) =  qray(ine20) + a1 + a2 + a3 + a4 + a5 + a6
    1185              : 
    1186              : 
    1187              :    ! mg24 reactions
    1188        10597 :          a1 =  0.5d0 * y(ic12) * y(io16) * rate(ir1216)
    1189        10597 :          a2 =  y(ine20) * y(ihe4) * rate(irneag)
    1190        10597 :          a3 = -y(img24) * y(ihe4) * rate(irmgag)
    1191        10597 :          a4 = -y(img24) * rate(irmgga)
    1192        10597 :          a5 =  y(isi28) * rate(irsiga)
    1193              : 
    1194        10597 :          qray(img24) =  qray(img24) + a1 + a2 + a3 + a4 + a5
    1195              : 
    1196        10597 :          if (.not.deriva) then
    1197         4553 :          a1 = -y(img24) * y(ihe4) * rate(irmgap)*(1.0d0-rate(irr1))
    1198         4553 :          a2 =  y(isi28) * rate(irr1) * rate(irsigp)
    1199              : 
    1200         4553 :          qray(img24) =  qray(img24) + a1 + a2
    1201              : 
    1202              :          else
    1203         6044 :          a1 = -y(img24)*y(ihe4) * rate(irmgap)*(1.0d0 - ratdum(irr1))
    1204         6044 :          a2 =  y(img24)*y(ihe4) * ratdum(irmgap)*rate(irr1)
    1205         6044 :          a3 =  y(isi28) * ratdum(irr1) * rate(irsigp)
    1206         6044 :          a4 =  y(isi28) * rate(irr1) * ratdum(irsigp)
    1207              : 
    1208         6044 :          qray(img24) =  qray(img24) + a1 + a2 + a3 + a4
    1209              :          end if
    1210              : 
    1211              : 
    1212              :    ! si28 reactions
    1213        10597 :          a1 =  0.5d0 * y(ic12) * y(io16) * rate(ir1216)
    1214        10597 :          a2 =  0.56d0 * 0.5d0*y(io16) * y(io16) * rate(ir1616)
    1215        10597 :          a3 =  y(img24) * y(ihe4) * rate(irmgag)
    1216        10597 :          a4 = -y(isi28) * y(ihe4) * rate(irsiag)
    1217        10597 :          a5 = -y(isi28) * rate(irsiga)
    1218        10597 :          a6 =  y(is32) * rate(irsga)
    1219              : 
    1220        10597 :          qray(isi28) =  qray(isi28) + a1 + a2 + a3 + a4 + a5 + a6
    1221              : 
    1222        10597 :          if (.not.deriva) then
    1223              : 
    1224         4553 :          a1 =  0.34d0*0.5d0*y(io16)*y(io16)*rate(irs1)*rate(ir1616)
    1225         4553 :          a2 =  y(img24) * y(ihe4) * rate(irmgap)*(1.0d0-rate(irr1))
    1226         4553 :          a3 = -y(isi28) * rate(irr1) * rate(irsigp)
    1227         4553 :          a4 = -y(isi28) * y(ihe4) * rate(irsiap)*(1.0d0-rate(irs1))
    1228         4553 :          a5 =  y(is32) * rate(irs1) * rate(irsgp)
    1229              : 
    1230         4553 :          qray(isi28) =  qray(isi28) + a1 + a2 + a3 + a4 + a5
    1231              : 
    1232              :          else
    1233         6044 :          a1  =  0.34d0*0.5d0*y(io16)*y(io16) * ratdum(irs1)*rate(ir1616)
    1234         6044 :          a2  =  0.34d0*0.5d0*y(io16)*y(io16) * rate(irs1)*ratdum(ir1616)
    1235         6044 :          a3  =  y(img24)*y(ihe4) * rate(irmgap)*(1.0d0 - ratdum(irr1))
    1236         6044 :          a4  = -y(img24)*y(ihe4) * ratdum(irmgap)*rate(irr1)
    1237         6044 :          a5  = -y(isi28) * ratdum(irr1) * rate(irsigp)
    1238         6044 :          a6  = -y(isi28) * rate(irr1) * ratdum(irsigp)
    1239         6044 :          a7  = -y(isi28)*y(ihe4) * rate(irsiap)*(1.0d0 - ratdum(irs1))
    1240         6044 :          a8  =  y(isi28)*y(ihe4) * ratdum(irsiap)*rate(irs1)
    1241         6044 :          a9  = y(is32) * ratdum(irs1) * rate(irsgp)
    1242         6044 :          a10 = y(is32) * rate(irs1) * ratdum(irsgp)
    1243              : 
    1244              :          qray(isi28) =  qray(isi28) + &
    1245         6044 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
    1246              :          end if
    1247              : 
    1248              : 
    1249              :    ! s32 reactions
    1250        10597 :          a1 =  0.1d0 * 0.5d0*y(io16) * y(io16) * rate(ir1616)
    1251        10597 :          a2 =  y(isi28) * y(ihe4) * rate(irsiag)
    1252        10597 :          a3 = -y(is32) * y(ihe4) * rate(irsag)
    1253        10597 :          a4 = -y(is32) * rate(irsga)
    1254        10597 :          a5 =  y(iar36) * rate(irarga)
    1255              : 
    1256        10597 :          qray(is32) =  qray(is32) + a1 + a2 + a3 + a4 + a5
    1257              : 
    1258        10597 :          if (.not.deriva) then
    1259              : 
    1260         4553 :          a1 =  0.34d0*0.5d0*y(io16)*y(io16)* rate(ir1616)*(1.0d0-rate(irs1))
    1261         4553 :          a2 =  y(isi28) * y(ihe4) * rate(irsiap)*(1.0d0-rate(irs1))
    1262         4553 :          a3 = -y(is32) * rate(irs1) * rate(irsgp)
    1263         4553 :          a4 = -y(is32) * y(ihe4) * rate(irsap)*(1.0d0-rate(irt1))
    1264         4553 :          a5 =  y(iar36) * rate(irt1) * rate(irargp)
    1265              : 
    1266         4553 :          qray(is32) =  qray(is32) + a1 + a2 + a3 + a4 + a5
    1267              : 
    1268              :          else
    1269         6044 :          a1  =  0.34d0*0.5d0*y(io16)*y(io16) * rate(ir1616)*(1.0d0-ratdum(irs1))
    1270         6044 :          a2  = -0.34d0*0.5d0*y(io16)*y(io16) * ratdum(ir1616)*rate(irs1)
    1271         6044 :          a3  =  y(isi28)*y(ihe4) * rate(irsiap)*(1.0d0-ratdum(irs1))
    1272         6044 :          a4  = -y(isi28)*y(ihe4) * ratdum(irsiap)*rate(irs1)
    1273         6044 :          a5  = -y(is32) * ratdum(irs1) * rate(irsgp)
    1274         6044 :          a6  = -y(is32) * rate(irs1) * ratdum(irsgp)
    1275         6044 :          a7  = -y(is32)*y(ihe4) * rate(irsap)*(1.0d0-ratdum(irt1))
    1276         6044 :          a8  =  y(is32)*y(ihe4) * ratdum(irsap)*rate(irt1)
    1277         6044 :          a9  =  y(iar36) * ratdum(irt1) * rate(irargp)
    1278         6044 :          a10 =  y(iar36) * rate(irt1) * ratdum(irargp)
    1279              : 
    1280              :          qray(is32) =  qray(is32) + &
    1281         6044 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
    1282              :          end if
    1283              : 
    1284              : 
    1285              :    ! ar36 reactions
    1286        10597 :          a1 =  y(is32) * y(ihe4) * rate(irsag)
    1287        10597 :          a2 = -y(iar36) * y(ihe4) * rate(irarag)
    1288        10597 :          a3 = -y(iar36) * rate(irarga)
    1289        10597 :          a4 =  y(ica40) * rate(ircaga)
    1290              : 
    1291        10597 :          qray(iar36) =  qray(iar36) + a1 + a2 + a3 + a4
    1292              : 
    1293        10597 :          if (.not.deriva) then
    1294         4553 :          a1 = y(is32) * y(ihe4) * rate(irsap)*(1.0d0-rate(irt1))
    1295         4553 :          a2 = -y(iar36) * rate(irt1) * rate(irargp)
    1296         4553 :          a3 = -y(iar36) * y(ihe4) * rate(irarap)*(1.0d0-rate(iru1))
    1297         4553 :          a4 =  y(ica40) * rate(ircagp) * rate(iru1)
    1298              : 
    1299         4553 :          qray(iar36) =  qray(iar36) + a1 + a2 + a3 + a4
    1300              : 
    1301              :          else
    1302         6044 :          a1 =  y(is32)*y(ihe4) * rate(irsap)*(1.0d0 - ratdum(irt1))
    1303         6044 :          a2 = -y(is32)*y(ihe4) * ratdum(irsap)*rate(irt1)
    1304         6044 :          a3 = -y(iar36) * ratdum(irt1) * rate(irargp)
    1305         6044 :          a4 = -y(iar36) * rate(irt1) * ratdum(irargp)
    1306         6044 :          a5 = -y(iar36)*y(ihe4) * rate(irarap)*(1.0d0-ratdum(iru1))
    1307         6044 :          a6 =  y(iar36)*y(ihe4) * ratdum(irarap)*rate(iru1)
    1308         6044 :          a7 =  y(ica40) * ratdum(ircagp) * rate(iru1)
    1309         6044 :          a8 =  y(ica40) * rate(ircagp) * ratdum(iru1)
    1310              : 
    1311         6044 :          qray(iar36) =  qray(iar36) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1312              :          end if
    1313              : 
    1314              : 
    1315              :    ! ca40 reactions
    1316        10597 :          a1 =  y(iar36) * y(ihe4) * rate(irarag)
    1317        10597 :          a2 = -y(ica40) * y(ihe4) * rate(ircaag)
    1318        10597 :          a3 = -y(ica40) * rate(ircaga)
    1319        10597 :          a4 =  y(iti44) * rate(irtiga)
    1320              : 
    1321        10597 :          qray(ica40) =  qray(ica40) + a1 + a2 + a3 + a4
    1322              : 
    1323        10597 :          if (.not.deriva) then
    1324              : 
    1325         4553 :          a1 =  y(iar36) * y(ihe4) * rate(irarap)*(1.0d0-rate(iru1))
    1326         4553 :          a2 = -y(ica40) * rate(ircagp) * rate(iru1)
    1327         4553 :          a3 = -y(ica40) * y(ihe4) * rate(ircaap)*(1.0d0-rate(irv1))
    1328         4553 :          a4 =  y(iti44) * rate(irtigp) * rate(irv1)
    1329              : 
    1330         4553 :          qray(ica40) =  qray(ica40) + a1 + a2 + a3 + a4
    1331              : 
    1332              :          else
    1333         6044 :          a1 =  y(iar36)*y(ihe4) * rate(irarap)*(1.0d0-ratdum(iru1))
    1334         6044 :          a2 = -y(iar36)*y(ihe4) * ratdum(irarap)*rate(iru1)
    1335         6044 :          a3 = -y(ica40) * ratdum(ircagp) * rate(iru1)
    1336         6044 :          a4 = -y(ica40) * rate(ircagp) * ratdum(iru1)
    1337         6044 :          a5 = -y(ica40)*y(ihe4) * rate(ircaap)*(1.0d0-ratdum(irv1))
    1338         6044 :          a6 =  y(ica40)*y(ihe4) * ratdum(ircaap)*rate(irv1)
    1339         6044 :          a7 =  y(iti44) * ratdum(irtigp) * rate(irv1)
    1340         6044 :          a8 =  y(iti44) * rate(irtigp) * ratdum(irv1)
    1341              : 
    1342         6044 :          qray(ica40) =  qray(ica40) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1343              :          end if
    1344              : 
    1345              : 
    1346              :    ! ti44 reactions
    1347        10597 :          a1 =  y(ica40) * y(ihe4) * rate(ircaag)
    1348        10597 :          a2 = -y(iti44) * y(ihe4) * rate(irtiag)
    1349        10597 :          a3 = -y(iti44) * rate(irtiga)
    1350        10597 :          a4 =  y(icr48) * rate(ircrga)
    1351              : 
    1352        10597 :          qray(iti44) =  qray(iti44) + a1 + a2 + a3 + a4
    1353              : 
    1354        10597 :          if (.not.deriva) then
    1355         4553 :          a1 =  y(ica40) * y(ihe4) * rate(ircaap)*(1.0d0-rate(irv1))
    1356         4553 :          a2 = -y(iti44) * rate(irv1) * rate(irtigp)
    1357         4553 :          a3 = -y(iti44) * y(ihe4) * rate(irtiap)*(1.0d0-rate(irw1))
    1358         4553 :          a4 =  y(icr48) * rate(irw1) * rate(ircrgp)
    1359              : 
    1360         4553 :          qray(iti44) =  qray(iti44) + a1 + a2 + a3 + a4
    1361              : 
    1362              :          else
    1363         6044 :          a1 =  y(ica40)*y(ihe4) * rate(ircaap)*(1.0d0-ratdum(irv1))
    1364         6044 :          a2 = -y(ica40)*y(ihe4) * ratdum(ircaap)*rate(irv1)
    1365         6044 :          a3 = -y(iti44) * ratdum(irv1) * rate(irtigp)
    1366         6044 :          a4 = -y(iti44) * rate(irv1) * ratdum(irtigp)
    1367         6044 :          a5 = -y(iti44)*y(ihe4) * rate(irtiap)*(1.0d0-ratdum(irw1))
    1368         6044 :          a6 =  y(iti44)*y(ihe4) * ratdum(irtiap)*rate(irw1)
    1369         6044 :          a7 =  y(icr48) * ratdum(irw1) * rate(ircrgp)
    1370         6044 :          a8 =  y(icr48) * rate(irw1) * ratdum(ircrgp)
    1371              : 
    1372         6044 :          qray(iti44) =  qray(iti44) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1373              :          end if
    1374              : 
    1375              : 
    1376              :    ! cr48 reactions
    1377        10597 :          a1 =  y(iti44) * y(ihe4) * rate(irtiag)
    1378        10597 :          a2 = -y(icr48) * y(ihe4) * rate(ircrag)
    1379        10597 :          a3 = -y(icr48) * rate(ircrga)
    1380        10597 :          a4 =  y(ife52) * rate(irfega)
    1381              : 
    1382        10597 :          qray(icr48) =  qray(icr48) + a1 + a2 + a3 + a4
    1383              : 
    1384        10597 :          if (.not.deriva) then
    1385         4553 :          a1 =  y(iti44) * y(ihe4) * rate(irtiap)*(1.0d0-rate(irw1))
    1386         4553 :          a2 = -y(icr48) * rate(irw1) * rate(ircrgp)
    1387         4553 :          a3 = -y(icr48) * y(ihe4) * rate(ircrap)*(1.0d0-rate(irx1))
    1388         4553 :          a4 =  y(ife52) * rate(irx1) * rate(irfegp)
    1389              : 
    1390         4553 :          qray(icr48) =  qray(icr48) + a1 + a2 + a3 + a4
    1391              : 
    1392              :          else
    1393         6044 :          a1 =  y(iti44)*y(ihe4) * rate(irtiap)*(1.0d0-ratdum(irw1))
    1394         6044 :          a2 = -y(iti44)*y(ihe4) * ratdum(irtiap)*rate(irw1)
    1395         6044 :          a3 = -y(icr48) * ratdum(irw1) * rate(ircrgp)
    1396         6044 :          a4 = -y(icr48) * rate(irw1) * ratdum(ircrgp)
    1397         6044 :          a5 = -y(icr48)*y(ihe4) * rate(ircrap)*(1.0d0-ratdum(irx1))
    1398         6044 :          a6 =  y(icr48)*y(ihe4) * ratdum(ircrap)*rate(irx1)
    1399         6044 :          a7 =  y(ife52) * ratdum(irx1) * rate(irfegp)
    1400         6044 :          a8 =  y(ife52) * rate(irx1) * ratdum(irfegp)
    1401              : 
    1402         6044 :          qray(icr48) =  qray(icr48) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1403              :          end if
    1404              : 
    1405              : 
    1406              :    ! crx reactions
    1407        10597 :          a1 = y(ife56) * fe56ec_fake_factor * rate(irn56ec)
    1408              : 
    1409        10597 :          qray(icrx) = qray(icrx) + a1
    1410              : 
    1411              :    ! fe52 reactions
    1412        10597 :          a1 =  y(icr48) * y(ihe4) * rate(ircrag)
    1413        10597 :          a2 = -y(ife52) * y(ihe4) * rate(irfeag)
    1414        10597 :          a3 = -y(ife52) * rate(irfega)
    1415        10597 :          a4 =  y(ini56) * rate(irniga)
    1416              : 
    1417        10597 :          qray(ife52) =  qray(ife52) + a1 + a2 + a3 + a4
    1418              : 
    1419        10597 :          if (.not.deriva) then
    1420         4553 :          a1 =  y(icr48) * y(ihe4) * rate(ircrap)*(1.0d0-rate(irx1))
    1421         4553 :          a2 = -y(ife52) * rate(irx1) * rate(irfegp)
    1422              : 
    1423         4553 :          qray(ife52) =  qray(ife52) + a1 + a2
    1424              : 
    1425              :          else
    1426         6044 :          a1 =  y(icr48)*y(ihe4) * rate(ircrap)*(1.0d0-ratdum(irx1))
    1427         6044 :          a2 = -y(icr48)*y(ihe4) * ratdum(ircrap)*rate(irx1)
    1428         6044 :          a3 = -y(ife52) * ratdum(irx1) * rate(irfegp)
    1429         6044 :          a4 = -y(ife52) * rate(irx1) * ratdum(irfegp)
    1430              : 
    1431         6044 :          qray(ife52) =  qray(ife52) + a1 + a2 + a3 + a4
    1432              :          end if
    1433              : 
    1434        10597 :          a1 =  y(ife54) * rate(ir1f54)
    1435        10597 :          a2 = -y(ife52) * y(ineut) * y(ineut) * rate(ir2f54)
    1436        10597 :          a3 =  y(ife54) * y(iprot) * y(iprot) * rate(ir5f54)
    1437        10597 :          a4 = -y(ife52) * y(ihe4) * rate(ir6f54)
    1438        10597 :          a5 = -y(ife52) * y(ihe4) * y(iprot) * rate(ir7f54)
    1439        10597 :          a6 =  y(ini56) * y(iprot) * rate(ir8f54)
    1440              : 
    1441        10597 :          qray(ife52) =  qray(ife52) + a1 + a2 + a3 + a4 + a5 + a6
    1442              : 
    1443              : 
    1444              :    ! fe54 reactions
    1445        10597 :          a1  = -y(ife54) * rate(ir1f54)
    1446        10597 :          a2  =  y(ife52) * y(ineut) * y(ineut) * rate(ir2f54)
    1447        10597 :          a3  = -y(ife54) * y(iprot) * y(iprot) * rate(ir3f54)
    1448        10597 :          a4  =  y(ini56) * rate(ir4f54)
    1449        10597 :          a5  = -y(ife54) * y(iprot) * y(iprot) * rate(ir5f54)
    1450        10597 :          a6  =  y(ife52) * y(ihe4) * rate(ir6f54)
    1451        10597 :          a7  =  y(ife56) * rate(irfe56_aux1)
    1452        10597 :          a8  = -y(ife54) * y(ineut) * y(ineut) * rate(irfe56_aux2)
    1453        10597 :          a9  =  y(ife56) * y(iprot) * y(iprot) * rate(irfe56_aux3)
    1454        10597 :          a10 = -y(ife54) * y(ihe4) * rate(irfe56_aux4)
    1455              : 
    1456        10597 :          qray(ife54) =  qray(ife54) + &
    1457        10597 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
    1458              : 
    1459              : 
    1460              :    ! fe56 reactions
    1461        10597 :          if (plus_co56) then
    1462            6 :             a1 =  y(ico56) * rate(irco56ec)
    1463              :          else
    1464        10591 :             a1 =  y(ini56) * rate(irn56ec)
    1465              :          end if
    1466        10597 :          a2 = -y(ife56) * fe56ec_fake_factor * rate(irn56ec)
    1467        10597 :          a3 = -y(ife56) * rate(irfe56_aux1)
    1468        10597 :          a4 =  y(ife54) * y(ineut) * y(ineut) * rate(irfe56_aux2)
    1469        10597 :          a5 = -y(ife56) * y(iprot) * y(iprot) * rate(irfe56_aux3)
    1470        10597 :          a6 =  y(ife54) * y(ihe4) * rate(irfe56_aux4)
    1471              : 
    1472        10597 :          qray(ife56) =  qray(ife56) + a1 + a2 + a3 + a4 + a5 + a6
    1473              : 
    1474        10597 :          if (plus_co56) then
    1475              :       ! co56 reactions
    1476            6 :             a1 =  y(ini56) * rate(irn56ec)
    1477            6 :             a2 = -y(ico56) * rate(irco56ec)
    1478              : 
    1479            6 :             qray(ico56) =  qray(ico56) + a1 + a2
    1480              :          end if
    1481              : 
    1482              :    ! ni56 reactions
    1483        10597 :          a1 =  y(ife52) * y(ihe4) * rate(irfeag)
    1484        10597 :          a2 = -y(ini56) * rate(irniga)
    1485        10597 :          a3 = -y(ini56) * rate(irn56ec)
    1486              : 
    1487        10597 :          qray(ini56) =  qray(ini56) + a1 + a2 + a3
    1488              : 
    1489        10597 :          a1 =  y(ife54) * y(iprot) * y(iprot) * rate(ir3f54)
    1490        10597 :          a2 = -y(ini56) * rate(ir4f54)
    1491        10597 :          a3 =  y(ife52) * y(ihe4)* y(iprot) * rate(ir7f54)
    1492        10597 :          a4 = -y(ini56) * y(iprot) * rate(ir8f54)
    1493              : 
    1494        10597 :          qray(ini56) =  qray(ini56) + a1 + a2 + a3 + a4
    1495              : 
    1496              :    ! neutrons
    1497        10597 :          a1 =  2.0d0 * y(ife54) * rate(ir1f54)
    1498        10597 :          a2 = -2.0d0 * y(ife52) * y(ineut) * y(ineut) * rate(ir2f54)
    1499        10597 :          a3 =  2.0d0 * y(ihe4) * rate(iralf1)
    1500        10597 :          a4 = -2.0d0 * y(ineut)*y(ineut) * y(iprot)*y(iprot) * rate(iralf2)
    1501        10597 :          a5 =  y(iprot) * rate(irpen)
    1502        10597 :          a6 = -y(ineut) * rate(irnep)
    1503        10597 :          a7 =  2.0d0 * y(ife56) * rate(irfe56_aux1)
    1504        10597 :          a8 = -2.0d0 * y(ife54) * y(ineut) * y(ineut) * rate(irfe56_aux2)
    1505        10597 :          a9 = -fe56ec_n_neut * y(ife56) * fe56ec_fake_factor * rate(irn56ec)
    1506              : 
    1507        10597 :          qray(ineut) =  qray(ineut) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9
    1508              : 
    1509              :    ! photodisintegration protons
    1510        10597 :          a1  = -2.0d0 * y(ife54) * y(iprot) * y(iprot) * rate(ir3f54)
    1511        10597 :          a2  =  2.0d0 * y(ini56) * rate(ir4f54)
    1512        10597 :          a3  = -2.0d0 * y(ife54) * y(iprot) * y(iprot) * rate(ir5f54)
    1513        10597 :          a4  =  2.0d0 * y(ife52) * y(ihe4) * rate(ir6f54)
    1514        10597 :          a5  =  2.0d0 * y(ihe4) * rate(iralf1)
    1515        10597 :          a6  = -2.0d0 * y(ineut)*y(ineut) * y(iprot)*y(iprot) * rate(iralf2)
    1516        10597 :          a7  = -y(iprot) * rate(irpen)
    1517        10597 :          a8  =  y(ineut) * rate(irnep)
    1518        10597 :          a9  = -2.0d0 * y(ife56) * y(iprot) * y(iprot) * rate(irfe56_aux3)
    1519        10597 :          a10 =  2.0d0 * y(ife54) * y(ihe4) * rate(irfe56_aux4)
    1520              : 
    1521        10597 :          qray(iprot) =  qray(iprot) + &
    1522        10597 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
    1523              : 
    1524              :    ! now set the real(dp) return argument dydt
    1525        10597 :          okay = .true.
    1526       233140 :          do i=1,species(plus_co56)
    1527       222543 :             dydt(i) = qray(i)
    1528       233140 :             if (is_bad(dydt(i))) then
    1529            0 :                write(*,*) 'dydt(i)', i, dydt(i), y(i)
    1530            0 :                okay = .false.
    1531              :             end if
    1532              :          end do
    1533        10597 :          if (.not. okay) then
    1534              : 
    1535            0 :             write(*,*) 'log10(temp) = ',safe_log10(temp)
    1536            0 :             write(*,*) 'log10(rho) = ',safe_log10(den)
    1537              : 
    1538            0 :             do i=1,num_reactions(plus_co56)
    1539            0 :                write(*,*) trim(ratnam(i)), i, rate(i)
    1540              :             end do
    1541            0 :             call mesa_error(__FILE__,__LINE__,'approx21_dydt')
    1542              :          end if
    1543              : 
    1544        10597 :          end subroutine approx21_dydt
    1545              : 
    1546              : 
    1547         4553 :          real(dp) function approx21_eval_PPII_fraction(y, rate) result(fII)
    1548              :             real(dp), dimension(:), intent(in) :: y, rate
    1549              :             real(dp) :: rateII, rateIII, rsum
    1550              :             include 'formats'
    1551         4553 :             rateII  = rate(ir_be7_wk_li7)
    1552         4553 :             rateIII = y(ih1) * rate(ir_be7_pg_b8)
    1553         4553 :             rsum = rateII + rateIII
    1554         4553 :             if (rsum < 1d-50) then
    1555              :                fII = 0.5d0
    1556              :             else
    1557         4181 :                fII = rateII / rsum
    1558              :             end if
    1559         4553 :          end function approx21_eval_PPII_fraction
    1560              : 
    1561              : 
    1562        10597 :          subroutine approx21_eps_info( &
    1563        10597 :                n, y, mion, dydt, rate, fII, &
    1564              :                Qtotal_rpp, Qneu_rpp, &
    1565              :                Qr33, &
    1566              :                Qtotal_rpp2, Qneu_rpp2, &
    1567              :                Qtotal_rpp3, Qneu_rpp3, &
    1568              :                Qtotal_rcpg, Qneu_rcpg, &
    1569              :                Qtotal_rnpg, Qneu_rnpg, &
    1570              :                Qtotal_ropg, Qneu_ropg, &
    1571              :                Qrn14_to_o16, &
    1572              :                Qtotal_rpen, Qneu_rpen, &
    1573              :                Qtotal_rnep, Qneu_rnep, &
    1574              :                Qtotal_rni56ec, Qneu_rni56ec, &
    1575              :                Qtotal_rco56ec, Qneu_rco56ec, &
    1576              :                Qtotal_rfe56ec, Qneu_rfe56ec, &
    1577              :                Qrn14ag, &
    1578              :                Qr3alf, &
    1579              :                Qrc12ag, Qro16ag,&
    1580              :                Qr1212, &
    1581              :                Qr1216_to_mg24, Qr1216_to_si28, &
    1582              :                Qr1616a, Qr1616g, &
    1583              :                Qrne20ag, &
    1584              :                Qrmg24ag, &
    1585              :                Qrsi28ag, &
    1586              :                Qrs32ag, &
    1587              :                Qrar36ag, &
    1588              :                Qrca40ag, &
    1589              :                Qrti44ag, &
    1590              :                Qrcr48ag, &
    1591              :                Qrfe52ag, &
    1592              :                Qrfe52ng, &
    1593              :                Qrfe53ng, &
    1594              :                Qrfe54ng, &
    1595              :                Qrfe55ng, &
    1596              :                Qrfe52neut_to_fe54, &
    1597              :                Qrfe52aprot_to_fe54, &
    1598              :                Qrfe54ng_to_fe56, &
    1599              :                Qrfe54aprot_to_fe56, &
    1600              :                Qrfe52aprot_to_ni56, &
    1601              :                Qrfe54prot_to_ni56, &
    1602              :                Qrhe4_breakup, &
    1603              :                Qrhe4_rebuild, &
    1604              :                eps_total, eps_neu, &
    1605        10597 :                do_eps_nuc_categories, eps_nuc_categories, &
    1606              :                dbg, &
    1607              :                plus_co56, &
    1608              :                ierr)
    1609              :             use const_def, only: Qconv
    1610              :             use chem_def, only: num_categories, category_name, chem_isos, &
    1611              :                ipp, icno, i3alf, i_burn_c, i_burn_n, i_burn_o, i_burn_ne, i_burn_na, &
    1612              :                i_burn_mg, i_burn_si, i_burn_s, i_burn_ar, i_burn_ca, i_burn_ti, i_burn_cr, &
    1613              :                i_burn_fe, icc, ico, ioo, ipnhe4, iphoto, i_ni56_co56, i_co56_fe56, iother
    1614              :             use net_def, only: Net_Info
    1615              :             type (Net_Info) :: n
    1616              :             real(dp), dimension(:), intent(in) :: y, mion, dydt, rate
    1617              :             real(dp), intent(in) :: fII, &
    1618              :                Qtotal_rpp, Qneu_rpp, Qr33, &
    1619              :                Qtotal_rpp2, Qneu_rpp2, &
    1620              :                Qtotal_rpp3, Qneu_rpp3, &
    1621              :                Qtotal_rcpg, Qneu_rcpg, &
    1622              :                Qtotal_rnpg, Qneu_rnpg, &
    1623              :                Qtotal_ropg, Qneu_ropg, &
    1624              :                Qrn14_to_o16, Qtotal_rpen, Qneu_rpen, &
    1625              :                Qtotal_rnep, Qneu_rnep, &
    1626              :                Qtotal_rni56ec, Qneu_rni56ec, &
    1627              :                Qtotal_rco56ec, Qneu_rco56ec, &
    1628              :                Qtotal_rfe56ec, Qneu_rfe56ec, &
    1629              :                Qrn14ag, &
    1630              :                Qr3alf, &
    1631              :                Qrc12ag, Qro16ag, &
    1632              :                Qr1212, &
    1633              :                Qr1216_to_mg24, Qr1216_to_si28, &
    1634              :                Qr1616a, Qr1616g, &
    1635              :                Qrne20ag, &
    1636              :                Qrmg24ag, &
    1637              :                Qrsi28ag, &
    1638              :                Qrs32ag, &
    1639              :                Qrar36ag, &
    1640              :                Qrca40ag, &
    1641              :                Qrti44ag, &
    1642              :                Qrcr48ag, &
    1643              :                Qrfe52ag, &
    1644              :                Qrfe52ng, &
    1645              :                Qrfe53ng, &
    1646              :                Qrfe54ng, &
    1647              :                Qrfe55ng, &
    1648              :                Qrfe52neut_to_fe54, &
    1649              :                Qrfe52aprot_to_fe54, &
    1650              :                Qrfe54ng_to_fe56, &
    1651              :                Qrfe54aprot_to_fe56, &
    1652              :                Qrfe52aprot_to_ni56, &
    1653              :                Qrfe54prot_to_ni56, &
    1654              :                Qrhe4_breakup, &
    1655              :                Qrhe4_rebuild
    1656              :             logical, intent(in) :: do_eps_nuc_categories
    1657              :             real(dp), intent(out) :: eps_total, eps_neu, eps_nuc_categories(:)
    1658              :             logical, intent(in) :: dbg
    1659              :             integer, intent(out) :: ierr
    1660              : 
    1661              :             integer :: i, fe56ec_n_neut
    1662              :             real(qp) :: a1, a2, xx, eps_neu_q, eps_nuc_cat(num_categories), eps_total_q, &
    1663              :                eps_nuc_q, sum_categories_q
    1664              :             real(dp) :: enuc_conv2, sum_categories, eps_nuc, fe56ec_fake_factor
    1665              :             logical, intent(in) ::  plus_co56
    1666              : 
    1667              :             include 'formats'
    1668              : 
    1669              :             !write(*,1) 'reaction_Qs(irn14_to_o16) Qrn14_to_o16*Qconv', Qrn14_to_o16*Qconv
    1670              : 
    1671        10597 :             ierr = 0
    1672              : 
    1673        10597 :             xx = 0.0_qp
    1674       233140 :             do i=1,species(plus_co56)
    1675       222543 :                a1 = dydt(i)
    1676       222543 :                a2 = mion(i)
    1677       233140 :                xx = xx + a1*a2
    1678              :             end do
    1679        10597 :             eps_total_q = -m3(avo,clight,clight) * xx
    1680        10597 :             eps_total = eps_total_q
    1681              : 
    1682              :             fe56ec_fake_factor = eval_fe56ec_fake_factor( &
    1683        21194 :                n% g% fe56ec_fake_factor, n% g% min_T_for_fe56ec_fake_factor, n% temp)
    1684        10597 :             fe56ec_n_neut = n% g% fe56ec_n_neut
    1685              : 
    1686              :             eps_neu_q = &
    1687        21194 :                m5(Qneu_rpp, 0.5d0, y(ih1), y(ih1), rate(irpp)) + &
    1688        31791 :                m5(Qneu_rpp2, y(ihe3), y(ihe4), rate(irhe3ag), fII) + &
    1689              :                m5(Qneu_rpp3, y(ihe3), y(ihe4), rate(irhe3ag), (1d0-fII)) + &
    1690        21194 :                m4(Qneu_rcpg, y(ic12), y(ih1), rate(ircpg)) + &
    1691        31791 :                m5(Qneu_rnpg, y(in14), y(ih1), rate(irnpg), rate(ifa)) + &
    1692        21194 :                m4(Qneu_ropg, y(io16), y(ih1), rate(iropg)) + &
    1693        10597 :                m3(Qneu_rpen, y(ih1), rate(irpen)) + &
    1694        10597 :                m3(Qneu_rpen, y(iprot), rate(irpen)) + &
    1695        21194 :                m3(Qneu_rnep, y(ineut), rate(irnep)) + &
    1696       180149 :                m4(Qneu_rfe56ec, y(ife56), fe56ec_fake_factor, rate(irn56ec))
    1697              : 
    1698        10597 :             if (plus_co56) then
    1699              :                eps_neu_q = eps_neu_q + &
    1700            6 :                   m3(Qneu_rni56ec, y(ini56), rate(irn56ec)) + &
    1701           12 :                   m3(Qneu_rco56ec, y(ico56), rate(irco56ec))
    1702              :             else
    1703              :                eps_neu_q = eps_neu_q + &
    1704        10591 :                   m3(Qneu_rni56ec + Qneu_rco56ec, y(ini56), rate(irn56ec))
    1705              :             end if
    1706        10597 :             eps_neu_q = eps_neu_q * Qconv
    1707        10597 :             eps_neu = eps_neu_q
    1708              : 
    1709        10597 :             eps_nuc_q = eps_total_q - eps_neu_q
    1710        10597 :             eps_nuc = eps_nuc_q
    1711              : 
    1712        10597 :             if (.not. do_eps_nuc_categories) return
    1713              : 
    1714       113825 :             do i=1,num_categories
    1715       113825 :                eps_nuc_cat(i) = 0d0
    1716              :             end do
    1717              : 
    1718              :             ! Set the rates
    1719       532703 :             n% raw_rate = 0d0
    1720       532703 :             n% screened_rate = 0d0
    1721       532703 :             n% eps_nuc_rate = 0d0
    1722       532703 :             n% eps_neu_rate = 0d0
    1723              : 
    1724              :             ! Set neutrinos first
    1725         4553 :             n% eps_neu_rate(irpp) = m5(Qneu_rpp, 0.5d0, y(ih1), y(ih1), rate(irpp))
    1726         4553 :             n% eps_neu_rate(irhe3ag) = m5(Qneu_rpp2, y(ihe3), y(ihe4), rate(irhe3ag), fII) + &
    1727         4553 :                                        m5(Qneu_rpp3, y(ihe3), y(ihe4), rate(irhe3ag), (1d0-fII))
    1728         4553 :             n% eps_neu_rate(ircpg) = m4(Qneu_rcpg, y(ic12), y(ih1), rate(ircpg))
    1729         4553 :             n% eps_neu_rate(irnpg) = m5(Qneu_rnpg, y(in14), y(ih1), rate(irnpg), rate(ifa))
    1730         4553 :             n% eps_neu_rate(iropg) = m4(Qneu_ropg, y(io16), y(ih1), rate(iropg))
    1731         4553 :             n% eps_neu_rate(irpen) = m3(Qneu_rpen, y(ih1), rate(irpen)) + &
    1732         4553 :                                     m3(Qneu_rpen, y(iprot), rate(irpen))
    1733         4553 :             n% eps_neu_rate(irnep) = m3(Qneu_rnep, y(ineut), rate(irnep))
    1734         4553 :             n% eps_neu_rate(irn56ec) = m4(Qneu_rfe56ec, y(ife56), fe56ec_fake_factor, rate(irn56ec))
    1735         4553 :             if (plus_co56) then
    1736              :                n% eps_neu_rate(irn56ec) = n% eps_neu_rate(irn56ec) + &
    1737            2 :                   m3(Qneu_rni56ec, y(ini56), rate(irn56ec)) + &
    1738            4 :                   m3(Qneu_rco56ec, y(ico56), rate(irco56ec))
    1739              :             else
    1740              :                n% eps_neu_rate(irn56ec) = n% eps_neu_rate(irn56ec) + &
    1741         4551 :                   m3(Qneu_rni56ec + Qneu_rco56ec, y(ini56), rate(irn56ec))
    1742              :             end if
    1743              : 
    1744       532703 :             n% eps_neu_rate = n% eps_neu_rate * Qconv
    1745              : 
    1746        18212 :             call set_eps_nuc(Qtotal_rpp - Qneu_rpp,[0.5d0, y(ih1), y(ih1)],irpp, ipp)
    1747        18212 :             call set_eps_nuc(Qr33, [0.5d0, y(ihe3), y(ihe3)], ir33, ipp)
    1748              :             call set_eps_nuc(( &
    1749              :                               (Qtotal_rpp2 - Qneu_rpp2)*fII + &
    1750              :                               (Qtotal_rpp3 - Qneu_rpp3)*(1d0 - fII)), &
    1751        13659 :                               [y(ihe3), y(ihe4)],irhe3ag, ipp)
    1752              : 
    1753        13659 :             call set_eps_nuc(Qtotal_rcpg - Qneu_rcpg, [y(ic12), y(ih1)],ircpg,icno)
    1754        13659 :             call set_eps_nuc(Qtotal_rcpg - Qneu_rnpg, [y(in14), y(ih1)],irnpg,icno)
    1755        18212 :             call set_eps_nuc(Qtotal_ropg - Qneu_ropg, [y(io16), y(ih1),rate(ifa)],iropg,icno)
    1756              : 
    1757        22765 :             call set_eps_nuc(Qr3alf, [1d0/6d0,y(ihe4), y(ihe4), y(ihe4)],ir3a,i3alf)
    1758              : 
    1759        13659 :             call set_eps_nuc(Qrc12ag, [y(ic12), y(ihe4)],ircag,i_burn_c)
    1760              : 
    1761        13659 :             call set_eps_nuc(Qrn14ag, [ y(ihe4), y(in14)],irnag,i_burn_n)
    1762        18212 :             call set_eps_nuc(Qrn14_to_o16, [y(in14), y(ih1),rate(ifg)],irnpg,i_burn_n)
    1763              : 
    1764        13659 :             call set_eps_nuc(Qro16ag, [y(io16), y(ihe4)], iroag, i_burn_o)
    1765              : 
    1766        18212 :             call set_eps_nuc(Qr1212, [0.5d0,y(ic12), y(ic12)],ir1212,icc)
    1767              : 
    1768        13659 :             call set_eps_nuc(0.5d0*(Qr1216_to_mg24 + Qr1216_to_si28), [y(ic12), y(io16)], ir1216, ico )
    1769              : 
    1770              :             ! these make he4 + si28
    1771        18212 :             call set_eps_nuc( Qr1616a * (0.56d0 + 0.34d0*rate(irs1)), [0.5d0,y(io16), y(io16)], ir1616, ioo)
    1772              :             ! these make s32
    1773        18212 :             call set_eps_nuc( Qr1616g * (0.1d0 + 0.34d0*(1d0 - rate(irs1))) , [0.5d0,y(io16), y(io16)], ir1616, ioo )
    1774              : 
    1775        13659 :             call set_eps_nuc(Qrne20ag, [y(ihe4), y(ine20)], irneag, i_burn_ne)
    1776              : 
    1777        13659 :             call set_eps_nuc(Qrmg24ag, [y(ihe4), y(img24)],irmgag,i_burn_mg)
    1778        18212 :             call set_eps_nuc(Qrmg24ag, [y(ihe4), y(img24),1.0d0-rate(irr1)],irmgap,i_burn_mg)
    1779              : 
    1780        13659 :             call set_eps_nuc(Qrsi28ag, [y(ihe4), y(isi28)],irsiag,i_burn_si)
    1781        18212 :             call set_eps_nuc(Qrsi28ag, [y(ihe4), y(isi28),(1.0d0-rate(irs1))],irsiap,i_burn_si)
    1782              : 
    1783        13659 :             call set_eps_nuc(Qrs32ag, [y(ihe4), y(is32)], irsag, i_burn_s)
    1784        18212 :             call set_eps_nuc(Qrs32ag, [y(ihe4), y(is32),(1.0d0-rate(irt1))], irsap, i_burn_s)
    1785              : 
    1786        13659 :             call set_eps_nuc(Qrar36ag, [y(ihe4), y(iar36)], irarag, i_burn_ar)
    1787        18212 :             call set_eps_nuc(Qrar36ag, [y(ihe4), y(iar36),(1.0d0-rate(iru1))], irarap, i_burn_ar)
    1788              : 
    1789        13659 :             call set_eps_nuc(Qrca40ag, [y(ihe4), y(ica40)], ircaag, i_burn_ca)
    1790        18212 :             call set_eps_nuc(Qrca40ag, [y(ihe4), y(ica40), (1.0d0-rate(irv1))], ircaap, i_burn_ca)
    1791              : 
    1792        13659 :             call set_eps_nuc(Qrti44ag, [y(ihe4), y(iti44)], irtiag, i_burn_ti)
    1793        18212 :             call set_eps_nuc(Qrti44ag, [y(ihe4), y(iti44),(1.0d0-rate(irw1))], irtiap, i_burn_ti)
    1794              : 
    1795        13659 :             call set_eps_nuc(Qrcr48ag, [y(ihe4), y(icr48)], ircrag, i_burn_cr)
    1796        18212 :             call set_eps_nuc(Qrcr48ag, [y(ihe4), y(icr48),(1.0d0-rate(irx1))], ircrap, i_burn_cr)
    1797              : 
    1798        13659 :             call set_eps_nuc(Qrfe52ag, [y(ihe4), y(ife52)], irfeag, i_burn_fe)
    1799        18212 :             call set_eps_nuc(Qrfe52aprot_to_ni56, [y(ife52), y(ihe4), y(iprot)], ir7f54, i_burn_fe)
    1800        18212 :             call set_eps_nuc(Qrfe52neut_to_fe54, [ y(ife52), y(ineut), y(ineut)], ir2f54, i_burn_fe)
    1801        18212 :             call set_eps_nuc(Qrfe54ng_to_fe56, [ y(ife54), y(ineut), y(ineut)], irfe56_aux2, i_burn_fe)
    1802        13659 :             call set_eps_nuc(Qrfe52aprot_to_fe54, [y(ife52), y(ihe4)], ir6f54, i_burn_fe)
    1803        13659 :             call set_eps_nuc(Qrfe54aprot_to_fe56, [y(ife54), y(ihe4)], irfe56_aux4, i_burn_fe)
    1804        18212 :             call set_eps_nuc(Qrfe54prot_to_ni56, [y(ife54), y(iprot),y(iprot)], ir3f54, i_burn_fe)
    1805        13659 :             call set_eps_nuc(Qtotal_rfe56ec - Qneu_rfe56ec, [y(ife56),fe56ec_fake_factor], irn56ec, i_burn_fe)
    1806              : 
    1807        22765 :             call set_eps_nuc(Qrhe4_rebuild, [y(ineut),y(ineut), y(iprot),y(iprot)],iralf2,ipnhe4)
    1808              : 
    1809         9106 :             call set_eps_nuc(Qtotal_rpen, [y(ih1)],irpen,iother)
    1810         9106 :             call set_eps_nuc(Qtotal_rpen, [y(iprot)],irpen,iother)
    1811         9106 :             call set_eps_nuc(Qtotal_rnep, [y(ineut)],irnep,iother)
    1812              : 
    1813              :                ! m4(Qrfe52aprot_to_ni56, y(ini56), y(iprot), rate(ir8f54)) + &
    1814              :                ! m5(Qrfe52aprot_to_fe54, y(ife54), y(iprot), y(iprot), rate(ir5f54)) + &
    1815              :                ! m3(Qrfe52ag, y(ini56), rate(irniga)) + &
    1816              :                ! m3(Qrfe52neut_to_fe54, y(ife54), rate(ir1f54)) + &
    1817              :                ! m3(Qrfe54ng_to_fe56, y(ife56), rate(irfe56_aux1)) + &
    1818              :                ! m5(Qrfe54aprot_to_fe56, y(ife56), y(iprot), y(iprot), rate(irfe56_aux3)) + &
    1819              :                ! m3(Qrfe54prot_to_ni56, y(ini56), rate(ir4f54)))
    1820              : 
    1821         9106 :             call set_eps_nuc(Qrhe4_breakup,[ y(ihe4)],iralf1,iphoto)  ! note: Qrhe4_breakup < 0
    1822         9106 :             call set_eps_nuc(-Qrc12ag,[ y(io16)],iroga, iphoto)  ! all the rest are > 0 Q's for forward reactions
    1823         9106 :             call set_eps_nuc(-Qr3alf,[ y(ic12)],irg3a, iphoto)
    1824         9106 :             call set_eps_nuc(-Qro16ag,[ y(ine20)],irnega, iphoto)
    1825         9106 :             call set_eps_nuc(-Qrne20ag,[ y(img24)],irmgga, iphoto)
    1826              : 
    1827         9106 :             call set_eps_nuc(-Qrmg24ag,[ y(isi28)],irsiga, iphoto)
    1828        13659 :             call set_eps_nuc(-Qrmg24ag,[ y(isi28),rate(irr1)],irsigp, iphoto)
    1829              : 
    1830         9106 :             call set_eps_nuc(-Qrsi28ag,[ y(is32)],irsga, iphoto)
    1831        13659 :             call set_eps_nuc(-Qrsi28ag,[ y(is32),rate(irs1)],irsgp, iphoto)
    1832              : 
    1833         9106 :             call set_eps_nuc(-Qrs32ag,[ y(iar36)],irarga, iphoto)
    1834        13659 :             call set_eps_nuc(-Qrs32ag,[ y(iar36),rate(irt1)],irargp, iphoto)
    1835              : 
    1836         9106 :             call set_eps_nuc(-Qrar36ag,[ y(ica40)],ircaga, iphoto)
    1837        13659 :             call set_eps_nuc(-Qrar36ag,[ y(ica40),rate(iru1)],ircagp, iphoto)
    1838              : 
    1839         9106 :             call set_eps_nuc(-Qrca40ag,[ y(iti44)],irtiga, iphoto)
    1840        13659 :             call set_eps_nuc(-Qrca40ag,[ y(iti44),rate(irv1)],irtigp, iphoto)
    1841              : 
    1842         9106 :             call set_eps_nuc(-Qrti44ag,[ y(icr48)],ircrga, iphoto)
    1843        13659 :             call set_eps_nuc(-Qrti44ag,[ y(icr48),rate(irw1)],ircrgp, iphoto)
    1844              : 
    1845         9106 :             call set_eps_nuc(-Qrcr48ag,[ y(ife52)],irfega, iphoto)
    1846        13659 :             call set_eps_nuc(-Qrcr48ag,[ y(ife52),rate(irx1)],irfegp, iphoto)
    1847              : 
    1848        13659 :             call set_eps_nuc(-Qrfe52aprot_to_ni56,[ y(ini56), y(iprot)],ir8f54, iphoto)
    1849        18212 :             call set_eps_nuc(-Qrfe52aprot_to_fe54,[ y(ife54), y(iprot), y(iprot)],ir5f54, iphoto)
    1850         9106 :             call set_eps_nuc(-Qrfe52ag,[ y(ini56)],irniga, iphoto)
    1851         9106 :             call set_eps_nuc(-Qrfe52neut_to_fe54,[ y(ife54)],ir1f54, iphoto)
    1852         9106 :             call set_eps_nuc(-Qrfe54ng_to_fe56,[ y(ife56)],irfe56_aux1, iphoto)
    1853        18212 :             call set_eps_nuc(-Qrfe54aprot_to_fe56,[ y(ife56), y(iprot), y(iprot)],irfe56_aux3, iphoto)
    1854         9106 :             call set_eps_nuc(-Qrfe54prot_to_ni56,[ y(ini56)],ir4f54, iphoto)
    1855              : 
    1856              : 
    1857              : 
    1858         9106 :             call set_eps_nuc(Qtotal_rni56ec - Qneu_rni56ec, [y(ini56)], irn56ec, i_ni56_co56)
    1859              : 
    1860         4553 :             if (plus_co56) then
    1861            4 :                call set_eps_nuc(Qtotal_rco56ec - Qneu_rco56ec, [y(ico56)], irco56ec, i_co56_fe56)
    1862              :             else
    1863         9102 :                call set_eps_nuc(Qtotal_rco56ec - Qneu_rco56ec, [y(ini56)], irn56ec, i_co56_fe56)
    1864              : 
    1865              :             end if
    1866              : 
    1867       113825 :             eps_nuc_cat = eps_nuc_cat * Qconv
    1868       532703 :             n% eps_nuc_rate = n% eps_nuc_rate * Qconv
    1869              : 
    1870       113825 :             do i=1,num_categories
    1871       113825 :                eps_nuc_categories(i) = eps_nuc_cat(i)
    1872              :             end do
    1873              : 
    1874              :             ! check eps_nuc vs sum(eps_nuc_cat)
    1875              : 
    1876              :             sum_categories_q = sum(eps_nuc_cat)
    1877              :             sum_categories = sum_categories_q
    1878              : 
    1879              :             if (.false. .and. &
    1880              :                abs(eps_nuc) > 1d-10*abs(eps_nuc_cat(iphoto)) .and. abs(eps_nuc) > 1d0 .and. &
    1881         4553 :                abs(sum_categories - eps_nuc) > 1d-2*min(abs(sum_categories),abs(eps_nuc))) then
    1882              :             !$OMP critical (net21_crit1)
    1883              :                !write(*,*) '>>>>> problem in net_approx21_procs.inc, approx21_eps_info <<<<<<'
    1884              :                !write(*,*) ' please report it.  can edit the file in eos/private to remove this test. '
    1885              :                write(*,1) 'logT', n% logT
    1886              :                write(*,1) 'approx21_eps_info'
    1887              :                write(*,'(A)')
    1888              :                do i=1,num_categories
    1889              :                   if (abs(eps_nuc_categories(i)) > 1d-6) then
    1890              :                      write(*,1) trim(category_name(i)), eps_nuc_categories(i)
    1891              :                   end if
    1892              :                end do
    1893              :                write(*,*)
    1894              :                write(*,1) 'eps_total', eps_total
    1895              :                write(*,1) 'eps_neu', eps_neu
    1896              :                write(*,1) 'eps_nuc', eps_nuc
    1897              :                write(*,1) 'sum(cat)', sum_categories_q
    1898              :                write(*,1) 'sum(cat) - eps_nuc', sum_categories_q - eps_nuc_q
    1899              :                write(*,1) 'sum(cat)/eps_nuc - 1', (sum_categories_q - eps_nuc_q)/eps_nuc_q
    1900              :                write(*,'(A)')
    1901              :                call mesa_error(__FILE__,__LINE__)
    1902              :             !$OMP end critical (net21_crit1)
    1903              :             end if
    1904              : 
    1905              :             ! for debugging use reduced_net_for_testing
    1906              : 
    1907              :             if (.false. .and. n% logT >= 9.220336900d0 .and. n% logT <= 9.2203369009d0 .and. &
    1908              :                abs(eps_nuc) > 1d-10*abs(eps_nuc_cat(iphoto)) .and. abs(eps_nuc) > 1d0 .and. &
    1909        10597 :                abs(sum_categories - eps_nuc) > 1d-2*min(abs(sum_categories),abs(eps_nuc))) then
    1910              :                write(*,1) 'logT', n% logT
    1911              :                write(*,2) 'icrx ' // trim(chem_isos% name(n% g% approx21_ye_iso)), icrx
    1912              :                write(*,2) 'fe56ec_n_neut', fe56ec_n_neut
    1913              :                write(*,1) 'fe56ec_fake_factor', fe56ec_fake_factor
    1914              :                write(*,'(A)')
    1915              :                do i=1,num_categories
    1916              :                   write(*,1) trim(category_name(i)), eps_nuc_categories(i)
    1917              :                end do
    1918              :                write(*,*)
    1919              :                write(*,1) 'eps_total', eps_total
    1920              :                write(*,1) 'eps_neu', eps_neu
    1921              :                write(*,1) 'eps_nuc', eps_nuc
    1922              :                write(*,1) 'sum(cat)', sum_categories
    1923              :                write(*,1) 'sum(cat) - eps_nuc', sum_categories_q - eps_nuc_q
    1924              :                write(*,1) 'sum(cat)/eps_nuc - 1', (sum_categories_q - eps_nuc_q)/eps_nuc_q
    1925              :                call mesa_error(__FILE__,__LINE__,'approx21_eps_info')
    1926              :             end if
    1927              : 
    1928              : 
    1929              :             contains
    1930              : 
    1931              :             real(qp) function m2(a1,a2)
    1932              :                real(dp), intent(in) :: a1, a2
    1933              :                real(qp) :: q1, q2
    1934              :                q1 = a1; q2 = a2; m2 = q1*q2
    1935        10597 :             end function m2
    1936              : 
    1937        34853 :             real(qp) function m3(a1,a2,a3)
    1938              :                real(dp), intent(in) :: a1, a2, a3
    1939              :                real(qp) :: q1, q2, q3
    1940        24256 :                q1 = a1; q2 = a2; q3 = a3; m3 = q1*q2*q3
    1941              :             end function m3
    1942              : 
    1943        24256 :             real(qp) function m4(a1,a2,a3,a4)
    1944              :                real(dp), intent(in) :: a1, a2, a3, a4
    1945              :                real(qp) :: q1, q2, q3, q4
    1946        13659 :                q1 = a1; q2 = a2; q3 = a3; q4 = a4; m4 = q1*q2*q3*q4
    1947              :             end function m4
    1948              : 
    1949        24256 :             real(qp) function m5(a1,a2,a3,a4,a5)
    1950              :                real(dp), intent(in) :: a1, a2, a3, a4, a5
    1951              :                real(qp) :: q1, q2, q3, q4, q5
    1952        24256 :                q1 = a1; q2 = a2; q3 = a3; q4 = a4; q5 = a5; m5 = q1*q2*q3*q4*q5
    1953              :             end function m5
    1954              : 
    1955              : 
    1956       318710 :             subroutine set_eps_nuc(q, ys, rat_id, eps_id)
    1957              :                real(dp),intent(in) :: q
    1958              :                real(dp),intent(in)  :: ys(:)
    1959              :                integer :: rat_id, eps_id
    1960              :                real(qp) :: val1,val2,val3
    1961              : 
    1962       969789 :                val1 = product(real(ys,kind=qp))
    1963       318710 :                val2 = val1 * real(rate(rat_id),kind=qp)
    1964              : 
    1965       318710 :                val3 = real(q,kind=qp) * val2
    1966              : 
    1967       318710 :                eps_nuc_cat(eps_id) = eps_nuc_cat(eps_id) + val3
    1968              : 
    1969       318710 :                if(rat_id < ifa) then
    1970       254968 :                   n% raw_rate(rat_id) = n% raw_rate(rat_id) + val1 * real(n% rate_raw(rat_id),kind=qp)
    1971       254968 :                   n% screened_rate(rat_id)  = n% screened_rate(rat_id) + val2
    1972       254968 :                   n% eps_nuc_rate(rat_id) = n% eps_nuc_rate(rat_id) + val3
    1973              :                else
    1974        63742 :                   n% raw_rate(rat_id) = 0d0
    1975        63742 :                   n% screened_rate(rat_id)  = 0d0
    1976        63742 :                   n% eps_nuc_rate(rat_id) = 0d0
    1977              :                end if
    1978              : 
    1979       318710 :             end subroutine set_eps_nuc
    1980              : 
    1981              : 
    1982              :          end subroutine approx21_eps_info
    1983              : 
    1984              : 
    1985         3022 :          subroutine approx21_d_epsneu_dy( &
    1986         3022 :                y, rate, &
    1987              :                Qneu_rpp, Qneu_rpp2, Qneu_rpp3, &
    1988              :                Qneu_rcpg, Qneu_rnpg, Qneu_ropg, &
    1989         3022 :                d_epsneu_dy, plus_co56, ierr)
    1990              :             use const_def, only: Qconv
    1991              :             real(dp), dimension(:), intent(in) :: y, rate
    1992              :             real(dp), intent(in) :: &
    1993              :                Qneu_rpp, Qneu_rpp2, Qneu_rpp3, &
    1994              :                Qneu_rcpg, Qneu_rnpg, Qneu_ropg
    1995              :             real(dp), intent(inout) :: d_epsneu_dy(:)
    1996              :             logical, intent(in) ::  plus_co56
    1997              :             integer, intent(out) :: ierr
    1998              : 
    1999              :             real(dp) :: fII
    2000              : 
    2001         3022 :             ierr = 0
    2002              : 
    2003         3022 :             fII = 0.5d0  ! fix this
    2004              : 
    2005        69508 :             d_epsneu_dy(1:species(plus_co56)) = 0d0
    2006              : 
    2007         3022 :             d_epsneu_dy(ih1) = Qconv*( &
    2008         6044 :                Qneu_rpp * y(ih1) * rate(irpp) + &  ! rpp_to_he3
    2009         6044 :                Qneu_rcpg * y(ic12) * rate(ircpg) + &  ! C of CNO
    2010         6044 :                Qneu_rnpg * y(in14) * rate(irnpg) + &  ! N of CNO
    2011        21154 :                Qneu_ropg * y(io16) * rate(iropg))  ! O of CNO
    2012              : 
    2013         3022 :             d_epsneu_dy(ihe3) = Qconv*( &
    2014         6044 :                Qneu_rpp2 * y(ihe4) * rate(irhe3ag) * fII + &  ! r34_pp2
    2015         9066 :                Qneu_rpp3 * y(ihe4) * rate(irhe3ag) * (1d0-fII))  ! r34_pp3
    2016              : 
    2017         3022 :             d_epsneu_dy(ihe4) = Qconv*( &
    2018         3022 :                Qneu_rpp2 * y(ihe3) * rate(irhe3ag) * fII + &  ! r34_pp2
    2019         3022 :                Qneu_rpp3 * y(ihe3) * rate(irhe3ag) * (1d0-fII))  ! r34_pp3
    2020              : 
    2021         3022 :             d_epsneu_dy(ic12) = Qconv* &
    2022         3022 :                Qneu_rcpg * y(ih1) * rate(ircpg)  ! C of CNO
    2023              : 
    2024         3022 :             d_epsneu_dy(in14) = Qconv* &
    2025         3022 :                Qneu_rnpg * y(ih1) * rate(irnpg)  ! N of CNO
    2026              : 
    2027         3022 :             d_epsneu_dy(io16) = Qconv* &
    2028         3022 :                Qneu_ropg * y(ih1) * rate(iropg)  ! O of CNO
    2029              : 
    2030         3022 :          end subroutine approx21_d_epsneu_dy
    2031              : 
    2032              : 
    2033         3022 :          subroutine approx21_dfdy( &
    2034         3022 :             y, dfdy, fe56ec_fake_factor_in, min_T, fe56ec_n_neut, &
    2035         3022 :             ratdum, dratdumdt, dratdumdd, dratdumdy1, dratdumdy2, btemp, plus_co56, ierr)
    2036              :          real(dp), intent(in) :: fe56ec_fake_factor_in, min_T, btemp
    2037              :          integer, intent(in) :: fe56ec_n_neut
    2038              :          real(dp), intent(in), dimension(:) :: &
    2039              :             y, ratdum, dratdumdt, dratdumdd, dratdumdy1, dratdumdy2
    2040              :          real(dp), intent(inout) :: dfdy(:,:)
    2041              :          logical, intent(in) ::  plus_co56
    2042              :          integer, intent(out) :: ierr
    2043              : 
    2044              :          integer :: i,j
    2045              :          real(dp) :: abar,zbar,ye,taud,taut, b1, &
    2046              :                snuda,snudz,enuc,velx,posx,zz
    2047              :          real(dp) :: fe56ec_fake_factor
    2048              : 
    2049         3022 :          ierr = 0
    2050              : 
    2051              :          ! Turn on special fe56ec rate above some temperature
    2052         3022 :          fe56ec_fake_factor=eval_fe56ec_fake_factor(fe56ec_fake_factor_in,min_T,btemp)
    2053              : 
    2054              :          ! NOTE: use of quad precision for dfdy doesn't make a difference.
    2055              : 
    2056      1402296 :          dfdy(1:species(plus_co56),1:species(plus_co56)) = 0.0d0
    2057              : 
    2058              :    ! h1 jacobian elements
    2059         9066 :          dfdy(ih1,ih1)  = -3.0d0 * y(ih1) * ratdum(irpp) &
    2060         6044 :                         - 2.0d0 * y(ic12) * ratdum(ircpg) &
    2061         6044 :                         - 2.0d0 * y(in14) * ratdum(irnpg) &
    2062         3022 :                         - 2.0d0 * y(in14) * y(ih1) * dratdumdy1(irnpg) &
    2063         6044 :                         - 2.0d0 * y(io16) * ratdum(iropg) &
    2064         3022 :                         - 2.0d0 * y(io16) * y(ih1) * dratdumdy1(iropg) &
    2065        27198 :                         - 3.0d0 * ratdum(irpen)
    2066              : 
    2067         9066 :          dfdy(ih1,ihe3) = 2.0d0 * y(ihe3) * ratdum(ir33) &
    2068         9066 :                         - y(ihe4) * ratdum(irhe3ag)
    2069              : 
    2070         3022 :          dfdy(ih1,ihe4) = -y(ihe3) * ratdum(irhe3ag) &
    2071         3022 :                         - y(ihe3) * y(ihe4) * dratdumdy1(irhe3ag)
    2072              : 
    2073         3022 :          dfdy(ih1,ic12) = -2.0d0 * y(ih1) * ratdum(ircpg)
    2074              : 
    2075         3022 :          dfdy(ih1,in14) = -2.0d0 * y(ih1) * ratdum(irnpg)
    2076              : 
    2077         3022 :          dfdy(ih1,io16) = -2.0d0 * y(ih1) * ratdum(iropg)
    2078              : 
    2079              : 
    2080              :    ! he3 jacobian elements
    2081         3022 :          dfdy(ihe3,ih1)  =  y(ih1) * ratdum(irpp) &
    2082         3022 :                         + ratdum(irpen)
    2083              : 
    2084              :          dfdy(ihe3,ihe3) = -2.0d0 * y(ihe3) * ratdum(ir33) &
    2085         3022 :                         - y(ihe4) * ratdum(irhe3ag)
    2086              : 
    2087              :          dfdy(ihe3,ihe4) = -y(ihe3) * ratdum(irhe3ag) &
    2088         3022 :                         - y(ihe3) * y(ihe4) * dratdumdy1(irhe3ag)
    2089              : 
    2090              : 
    2091              :    ! he4 jacobian elements
    2092         3022 :          dfdy(ihe4,ih1)  = y(in14) * ratdum(ifa) * ratdum(irnpg) &
    2093              :                         + y(in14) * y(ih1) * ratdum(ifa) * dratdumdy1(irnpg) &
    2094              :                         + y(io16) * ratdum(iropg) &
    2095         3022 :                         + y(io16) * y(ih1) * dratdumdy1(iropg)
    2096              : 
    2097              :          dfdy(ihe4,ihe3)  = y(ihe3) * ratdum(ir33) &
    2098         3022 :                         + y(ihe4) * ratdum(irhe3ag)
    2099              : 
    2100              : 
    2101         3022 :          dfdy(ihe4,ihe4)  = -1.5d0 * y(ihe4) * y(ihe4) * ratdum(ir3a) &
    2102         3022 :                            - y(ic12) * ratdum(ircag) &
    2103         3022 :                            - y(io16) * ratdum(iroag) &
    2104         6044 :                            - y(ine20) * ratdum(irneag) &
    2105         6044 :                            - y(img24) * ratdum(irmgag) &
    2106         6044 :                            - y(isi28) * ratdum(irsiag) &
    2107         6044 :                            - y(is32) * ratdum(irsag) &
    2108         6044 :                            - y(iar36) * ratdum(irarag) &
    2109         6044 :                            - y(ica40) * ratdum(ircaag) &
    2110         6044 :                            - y(iti44) * ratdum(irtiag) &
    2111         6044 :                            - y(icr48) * ratdum(ircrag) &
    2112        60440 :                            - y(ife52) * ratdum(irfeag)
    2113              : 
    2114              :          dfdy(ihe4,ihe4)  = dfdy(ihe4,ihe4) &
    2115         6044 :                            - y(img24) * ratdum(irmgap) * (1.0d0-ratdum(irr1)) &
    2116         6044 :                            - y(isi28) * ratdum(irsiap) * (1.0d0-ratdum(irs1)) &
    2117         6044 :                            - y(is32) * ratdum(irsap) * (1.0d0-ratdum(irt1)) &
    2118         6044 :                            - y(iar36) * ratdum(irarap) * (1.0d0-ratdum(iru1)) &
    2119         6044 :                            - y(ica40) * ratdum(ircaap) * (1.0d0-ratdum(irv1)) &
    2120         6044 :                            - y(iti44) * ratdum(irtiap) * (1.0d0-ratdum(irw1)) &
    2121        39286 :                            - y(icr48) * ratdum(ircrap) * (1.0d0-ratdum(irx1))
    2122              : 
    2123              :          dfdy(ihe4,ihe4)  = dfdy(ihe4,ihe4) &
    2124         3022 :                            - y(ife52) * ratdum(ir6f54) &
    2125         6044 :                            - y(ife52) * y(iprot) * ratdum(ir7f54) &
    2126         3022 :                            - ratdum(iralf1) &
    2127        15110 :                            - y(ife54) * ratdum(irfe56_aux4)
    2128              : 
    2129              : 
    2130              :          dfdy(ihe4,ihe4)  = dfdy(ihe4,ihe4) &
    2131              :                         + y(ihe3) * ratdum(irhe3ag) &
    2132              :                         + y(ihe3) * y(ihe4) * dratdumdy1(irhe3ag) &
    2133         3022 :                         - y(in14) * ratdum(irnag) * 1.5d0
    2134              : 
    2135              : 
    2136         3022 :          dfdy(ihe4,ic12)  = y(ic12) * ratdum(ir1212) &
    2137         3022 :                            + 0.5d0 * y(io16) * ratdum(ir1216) &
    2138         3022 :                            + 3.0d0 * ratdum(irg3a) &
    2139         9066 :                            - y(ihe4) * ratdum(ircag)
    2140              : 
    2141              : 
    2142              :          dfdy(ihe4,in14)  = y(ih1) * ratdum(ifa) * ratdum(irnpg) &
    2143         3022 :                         - y(ihe4) * ratdum(irnag) * 1.5d0
    2144              : 
    2145              : 
    2146              :          dfdy(ihe4,io16)  = 0.5d0 * y(ic12) * ratdum(ir1216) &
    2147         3022 :                            + 1.12d0 * 0.5d0*y(io16) * ratdum(ir1616) &
    2148              :                            + 0.68d0 * ratdum(irs1) * 0.5d0*y(io16) * ratdum(ir1616) &
    2149         3022 :                            + ratdum(iroga) &
    2150              :                            - y(ihe4) * ratdum(iroag) &
    2151         6044 :                            + y(ih1) * ratdum(iropg)
    2152              : 
    2153         3022 :          dfdy(ihe4,ine20) =  ratdum(irnega) &
    2154         3022 :                         - y(ihe4) * ratdum(irneag)
    2155              : 
    2156         3022 :          dfdy(ihe4,img24) =   ratdum(irmgga) &
    2157              :                            - y(ihe4) * ratdum(irmgag) &
    2158         3022 :                            - y(ihe4) * ratdum(irmgap) * (1.0d0-ratdum(irr1))
    2159              : 
    2160         6044 :          dfdy(ihe4,isi28) =   ratdum(irsiga) &
    2161              :                            - y(ihe4) * ratdum(irsiag) &
    2162              :                            - y(ihe4) * ratdum(irsiap) * (1.0d0-ratdum(irs1)) &
    2163         6044 :                            + ratdum(irr1) * ratdum(irsigp)
    2164              : 
    2165         6044 :          dfdy(ihe4,is32)  =   ratdum(irsga) &
    2166              :                            - y(ihe4) * ratdum(irsag) &
    2167              :                            - y(ihe4) * ratdum(irsap) * (1.0d0-ratdum(irt1)) &
    2168         6044 :                            + ratdum(irs1) * ratdum(irsgp)
    2169              : 
    2170         6044 :          dfdy(ihe4,iar36) =   ratdum(irarga) &
    2171              :                            - y(ihe4) * ratdum(irarag) &
    2172              :                            - y(ihe4) * ratdum(irarap) * (1.0d0-ratdum(iru1)) &
    2173         6044 :                            + ratdum(irt1) * ratdum(irargp)
    2174              : 
    2175         6044 :          dfdy(ihe4,ica40) =   ratdum(ircaga) &
    2176              :                            - y(ihe4) * ratdum(ircaag) &
    2177              :                            - y(ihe4) * ratdum(ircaap) * (1.0d0-ratdum(irv1)) &
    2178         6044 :                            + ratdum(iru1) * ratdum(ircagp)
    2179              : 
    2180         6044 :          dfdy(ihe4,iti44) =   ratdum(irtiga) &
    2181              :                            - y(ihe4) * ratdum(irtiag) &
    2182              :                            - y(ihe4) * ratdum(irtiap) * (1.0d0-ratdum(irw1)) &
    2183         6044 :                            + ratdum(irv1) * ratdum(irtigp)
    2184              : 
    2185         6044 :          dfdy(ihe4,icr48) =   ratdum(ircrga) &
    2186              :                            - y(ihe4) * ratdum(ircrag) &
    2187              :                            - y(ihe4) * ratdum(ircrap) * (1.0d0-ratdum(irx1)) &
    2188         6044 :                            + ratdum(irw1) * ratdum(ircrgp)
    2189              : 
    2190         6044 :          dfdy(ihe4,ife52) =   ratdum(irfega) &
    2191              :                            - y(ihe4) * ratdum(irfeag) &
    2192         3022 :                            + ratdum(irx1) * ratdum(irfegp) &
    2193              :                            - y(ihe4) * ratdum(ir6f54) &
    2194         6044 :                            - y(ihe4) * y(iprot) * ratdum(ir7f54)
    2195              : 
    2196         3022 :          dfdy(ihe4,ife54) =   y(iprot) * y(iprot) * ratdum(ir5f54) &
    2197         3022 :                            - y(ihe4) * ratdum(irfe56_aux4)
    2198              : 
    2199         3022 :          dfdy(ihe4,ife56) =   y(iprot) * y(iprot) * ratdum(irfe56_aux3)
    2200              : 
    2201         6044 :          dfdy(ihe4,ini56) =   ratdum(irniga) &
    2202         6044 :                            + y(iprot) * ratdum(ir8f54)
    2203              : 
    2204              : 
    2205         6044 :          dfdy(ihe4,ineut) = -y(ihe4) * dratdumdy1(iralf1) &
    2206         6044 :                         + 2.0d0 * y(ineut) * y(iprot)*y(iprot) * ratdum(iralf2) &
    2207         9066 :                         + y(ineut)*y(ineut) * y(iprot)*y(iprot) * dratdumdy1(iralf2)
    2208              : 
    2209              :          include 'formats'
    2210              : 
    2211         3022 :          dfdy(ihe4,iprot) =   2.0d0 * y(ife54) * y(iprot) * ratdum(ir5f54) &
    2212         3022 :                            + y(ife54) * y(iprot) * y(iprot) * dratdumdy1(ir5f54) &
    2213         3022 :                            - y(ihe4) * y(ife52) * dratdumdy1(ir6f54) &
    2214              :                            - y(ife52) * y(ihe4) * ratdum(ir7f54) &
    2215         3022 :                            - y(ife52) * y(ihe4) * y(iprot) * dratdumdy1(ir7f54) &
    2216         3022 :                            + y(ini56) * ratdum(ir8f54) &
    2217         3022 :                            + y(ini56) * y(iprot) * dratdumdy1(ir8f54) &
    2218         3022 :                            - y(ihe4) * dratdumdy2(iralf1) &
    2219              :                            + 2.0d0 * y(ineut)*y(ineut) * y(iprot) * ratdum(iralf2) &
    2220         3022 :                            + y(ineut)*y(ineut) * y(iprot)*y(iprot) * dratdumdy2(iralf2) &
    2221         3022 :                            + 2.0d0 * y(ife56) * y(iprot) * ratdum(irfe56_aux3) &
    2222         3022 :                            + y(ife56) * y(iprot) * y(iprot) * dratdumdy1(irfe56_aux3) &
    2223         3022 :                            - y(ihe4) * y(ife54) * dratdumdy1(irfe56_aux4)
    2224              : 
    2225              : 
    2226              : 
    2227              :    ! c12 jacobian elements
    2228         3022 :          dfdy(ic12,ih1)  = -y(ic12) * ratdum(ircpg) &
    2229              :                         + y(in14) * ratdum(ifa) * ratdum(irnpg) &
    2230         3022 :                         + y(in14) * y(ih1) * ratdum(ifa) * dratdumdy1(irnpg)
    2231              : 
    2232              :          dfdy(ic12,ihe4) = 0.5d0 * y(ihe4) * y(ihe4) * ratdum(ir3a) &
    2233         3022 :                         - y(ic12) * ratdum(ircag)
    2234              : 
    2235              :          dfdy(ic12,ic12) = -2.0d0 * y(ic12) * ratdum(ir1212) &
    2236              :                         - y(io16) * ratdum(ir1216) &
    2237              :                         - ratdum(irg3a) &
    2238              :                         - y(ihe4) * ratdum(ircag) &
    2239         3022 :                         - y(ih1) * ratdum(ircpg)
    2240              : 
    2241         3022 :          dfdy(ic12,in14) = y(ih1) * ratdum(ifa) * ratdum(irnpg)
    2242              : 
    2243              :          dfdy(ic12,io16) = -y(ic12) * ratdum(ir1216) &
    2244         3022 :                         + ratdum(iroga)
    2245              : 
    2246              : 
    2247              :    ! n14 jacobian elements
    2248         3022 :          dfdy(in14,ih1)  = y(ic12) * ratdum(ircpg) &
    2249              :                         - y(in14) * ratdum(irnpg) &
    2250              :                         - y(in14) * y(ih1) * dratdumdy1(irnpg) &
    2251              :                         + y(io16) * ratdum(iropg) &
    2252         3022 :                         + y(io16) * y(ih1) * dratdumdy1(iropg)
    2253              : 
    2254         3022 :          dfdy(in14,ihe4) = -y(in14) * ratdum(irnag)
    2255              : 
    2256         3022 :          dfdy(in14,ic12) = y(ih1) * ratdum(ircpg)
    2257              : 
    2258              :          dfdy(in14,in14) = -y(ih1) * ratdum(irnpg) &
    2259         3022 :                         - y(ihe4) * ratdum(irnag)
    2260              : 
    2261         3022 :          dfdy(in14,io16) = y(ih1) * ratdum(iropg)
    2262              : 
    2263              : 
    2264              : 
    2265              :    ! o16 jacobian elements
    2266         3022 :          dfdy(io16,ih1) = y(in14) * ratdum(ifg) * ratdum(irnpg) &
    2267              :                      + y(in14) * y(ih1) * ratdum(ifg) * dratdumdy1(irnpg) &
    2268              :                      - y(io16) * ratdum(iropg) &
    2269         3022 :                      - y(io16) * y(ih1) * dratdumdy1(iropg)
    2270              : 
    2271              :          dfdy(io16,ihe4) = y(ic12)*ratdum(ircag) &
    2272         3022 :                         - y(io16)*ratdum(iroag)
    2273              : 
    2274              :          dfdy(io16,ic12) = -y(io16)*ratdum(ir1216) &
    2275         3022 :                         + y(ihe4)*ratdum(ircag)
    2276              : 
    2277         3022 :          dfdy(io16,in14) = y(ih1) * ratdum(ifg) * ratdum(irnpg)
    2278              : 
    2279              :          dfdy(io16,io16) = - y(ic12) * ratdum(ir1216) &
    2280              :                         - 2.0d0 * y(io16) * ratdum(ir1616) &
    2281              :                         - y(ihe4) * ratdum(iroag) &
    2282              :                         - ratdum(iroga) &
    2283         3022 :                         - y(ih1) * ratdum(iropg)
    2284              : 
    2285         3022 :          dfdy(io16,ine20) = ratdum(irnega)
    2286              : 
    2287              : 
    2288              :    ! ne20 jacobian elements
    2289         3022 :          dfdy(ine20,ihe4)  = y(io16) * ratdum(iroag) &
    2290              :                         - y(ine20) * ratdum(irneag) &
    2291         3022 :                         + y(in14) * ratdum(irnag)
    2292              : 
    2293         3022 :          dfdy(ine20,ic12)  = y(ic12) * ratdum(ir1212)
    2294              : 
    2295         3022 :          dfdy(ine20,in14)  = y(ihe4) * ratdum(irnag)
    2296              : 
    2297         3022 :          dfdy(ine20,io16)  = y(ihe4) * ratdum(iroag)
    2298              : 
    2299              :          dfdy(ine20,ine20) = -y(ihe4) * ratdum(irneag) &
    2300         3022 :                            - ratdum(irnega)
    2301              : 
    2302         3022 :          dfdy(ine20,img24) = ratdum(irmgga)
    2303              : 
    2304              : 
    2305              : 
    2306              :    ! mg24 jacobian elements
    2307         3022 :          dfdy(img24,ihe4)  = y(ine20) * ratdum(irneag) &
    2308              :                            -y(img24) * ratdum(irmgag) &
    2309         3022 :                            -y(img24) * ratdum(irmgap) * (1.0d0-ratdum(irr1))
    2310              : 
    2311         3022 :          dfdy(img24,ic12)  = 0.5d0 * y(io16) * ratdum(ir1216)
    2312              : 
    2313         3022 :          dfdy(img24,io16)  = 0.5d0 * y(ic12) * ratdum(ir1216)
    2314              : 
    2315         3022 :          dfdy(img24,ine20) = y(ihe4) * ratdum(irneag)
    2316              : 
    2317              :          dfdy(img24,img24) = -y(ihe4) * ratdum(irmgag) &
    2318              :                            - ratdum(irmgga) &
    2319         3022 :                            - y(ihe4)*ratdum(irmgap)*(1.0d0-ratdum(irr1))
    2320              : 
    2321              :          dfdy(img24,isi28) = ratdum(irsiga) &
    2322         3022 :                            + ratdum(irr1) * ratdum(irsigp)
    2323              : 
    2324              : 
    2325              : 
    2326              :    ! si28 jacobian elements
    2327         3022 :          dfdy(isi28,ihe4)  = y(img24) * ratdum(irmgag) &
    2328              :                         - y(isi28) * ratdum(irsiag) &
    2329              :                         + y(img24) * ratdum(irmgap) * (1.0d0-ratdum(irr1)) &
    2330         3022 :                         - y(isi28) * ratdum(irsiap) * (1.0d0-ratdum(irs1))
    2331              : 
    2332         3022 :          dfdy(isi28,ic12)  = 0.5d0 * y(io16) * ratdum(ir1216)
    2333              : 
    2334              :          dfdy(isi28,io16)  =   0.5d0 * y(ic12) * ratdum(ir1216) &
    2335              :                            + 1.12d0 * 0.5d0*y(io16) * ratdum(ir1616) &
    2336         3022 :                            + 0.68d0 * 0.5d0*y(io16) * ratdum(irs1) * ratdum(ir1616)
    2337              : 
    2338              :          dfdy(isi28,img24) = y(ihe4) * ratdum(irmgag) &
    2339         3022 :                         + y(ihe4) * ratdum(irmgap) * (1.0d0-ratdum(irr1))
    2340              : 
    2341              :          dfdy(isi28,isi28) = -y(ihe4) * ratdum(irsiag) &
    2342              :                            - ratdum(irsiga) &
    2343              :                            - ratdum(irr1) * ratdum(irsigp) &
    2344         3022 :                            - y(ihe4) * ratdum(irsiap) * (1.0d0-ratdum(irs1))
    2345              : 
    2346              :          dfdy(isi28,is32)  = ratdum(irsga) &
    2347         3022 :                         + ratdum(irs1) * ratdum(irsgp)
    2348              : 
    2349              : 
    2350              : 
    2351              :    ! s32 jacobian elements
    2352         3022 :          dfdy(is32,ihe4)  = y(isi28) * ratdum(irsiag) &
    2353              :                         - y(is32) * ratdum(irsag) &
    2354              :                         + y(isi28) * ratdum(irsiap) * (1.0d0-ratdum(irs1)) &
    2355         3022 :                         - y(is32) * ratdum(irsap) * (1.0d0-ratdum(irt1))
    2356              : 
    2357              :          dfdy(is32,io16)  = &
    2358              :                         + 0.68d0*0.5d0*y(io16)*ratdum(ir1616)*(1.0d0-ratdum(irs1)) &
    2359         3022 :                            + 0.2d0 * 0.5d0*y(io16) * ratdum(ir1616)
    2360              : 
    2361              :          dfdy(is32,isi28) = y(ihe4) * ratdum(irsiag) &
    2362         3022 :                         + y(ihe4) * ratdum(irsiap) * (1.0d0-ratdum(irs1))
    2363              : 
    2364              :          dfdy(is32,is32)  = -y(ihe4) * ratdum(irsag) &
    2365              :                         - ratdum(irsga) &
    2366              :                         - ratdum(irs1) * ratdum(irsgp) &
    2367         3022 :                         - y(ihe4) * ratdum(irsap) * (1.0d0-ratdum(irt1))
    2368              : 
    2369              :          dfdy(is32,iar36) = ratdum(irarga) &
    2370         3022 :                         + ratdum(irt1) * ratdum(irargp)
    2371              : 
    2372              : 
    2373              : 
    2374              :    ! ar36 jacobian elements
    2375         3022 :          dfdy(iar36,ihe4)  = y(is32) * ratdum(irsag) &
    2376              :                         - y(iar36) * ratdum(irarag) &
    2377              :                         + y(is32) * ratdum(irsap) * (1.0d0-ratdum(irt1)) &
    2378         3022 :                         - y(iar36) * ratdum(irarap) * (1.0d0-ratdum(iru1))
    2379              : 
    2380              :          dfdy(iar36,is32)  = y(ihe4) * ratdum(irsag) &
    2381         3022 :                            + y(ihe4) * ratdum(irsap) * (1.0d0-ratdum(irt1))
    2382              : 
    2383              :          dfdy(iar36,iar36) = -y(ihe4) * ratdum(irarag) &
    2384              :                            - ratdum(irarga) &
    2385              :                            - ratdum(irt1) * ratdum(irargp) &
    2386         3022 :                            - y(ihe4) * ratdum(irarap) * (1.0d0-ratdum(iru1))
    2387              : 
    2388              :          dfdy(iar36,ica40) = ratdum(ircaga) &
    2389         3022 :                         + ratdum(ircagp) * ratdum(iru1)
    2390              : 
    2391              : 
    2392              : 
    2393              :    ! ca40 jacobian elements
    2394         3022 :          dfdy(ica40,ihe4)   = y(iar36) * ratdum(irarag) &
    2395              :                            - y(ica40) * ratdum(ircaag) &
    2396              :                            + y(iar36) * ratdum(irarap)*(1.0d0-ratdum(iru1)) &
    2397         3022 :                            - y(ica40) * ratdum(ircaap)*(1.0d0-ratdum(irv1))
    2398              : 
    2399              :          dfdy(ica40,iar36)  = y(ihe4) * ratdum(irarag) &
    2400         3022 :                            + y(ihe4) * ratdum(irarap)*(1.0d0-ratdum(iru1))
    2401              : 
    2402              :          dfdy(ica40,ica40)  = -y(ihe4) * ratdum(ircaag) &
    2403              :                            - ratdum(ircaga) &
    2404              :                            - ratdum(ircagp) * ratdum(iru1) &
    2405         3022 :                            - y(ihe4) * ratdum(ircaap)*(1.0d0-ratdum(irv1))
    2406              : 
    2407              :          dfdy(ica40,iti44)  = ratdum(irtiga) &
    2408         3022 :                            + ratdum(irtigp) * ratdum(irv1)
    2409              : 
    2410              : 
    2411              : 
    2412              :    ! ti44 jacobian elements
    2413         3022 :          dfdy(iti44,ihe4)   = y(ica40) * ratdum(ircaag) &
    2414              :                            - y(iti44) * ratdum(irtiag) &
    2415              :                            + y(ica40) * ratdum(ircaap)*(1.0d0-ratdum(irv1)) &
    2416         3022 :                            - y(iti44) * ratdum(irtiap)*(1.0d0-ratdum(irw1))
    2417              : 
    2418              :          dfdy(iti44,ica40)  = y(ihe4) * ratdum(ircaag) &
    2419         3022 :                            + y(ihe4) * ratdum(ircaap)*(1.0d0-ratdum(irv1))
    2420              : 
    2421              :          dfdy(iti44,iti44)  = -y(ihe4) * ratdum(irtiag) &
    2422              :                            - ratdum(irtiga) &
    2423              :                            - ratdum(irv1) * ratdum(irtigp) &
    2424         3022 :                            - y(ihe4) * ratdum(irtiap)*(1.0d0-ratdum(irw1))
    2425              : 
    2426              :          dfdy(iti44,icr48)  = ratdum(ircrga) &
    2427         3022 :                            + ratdum(irw1) * ratdum(ircrgp)
    2428              : 
    2429              : 
    2430              : 
    2431              :    ! cr48 jacobian elements
    2432         3022 :          dfdy(icr48,ihe4)  = y(iti44) * ratdum(irtiag) &
    2433              :                         - y(icr48) * ratdum(ircrag) &
    2434              :                         + y(iti44) * ratdum(irtiap)*(1.0d0-ratdum(irw1)) &
    2435         3022 :                         - y(icr48) * ratdum(ircrap)*(1.0d0-ratdum(irx1))
    2436              : 
    2437              :          dfdy(icr48,iti44) = y(ihe4) * ratdum(irtiag) &
    2438         3022 :                         + y(ihe4) * ratdum(irtiap)*(1.0d0-ratdum(irw1))
    2439              : 
    2440              :          dfdy(icr48,icr48) = -y(ihe4) * ratdum(ircrag) &
    2441              :                            - ratdum(ircrga) &
    2442              :                            - ratdum(irw1) * ratdum(ircrgp) &
    2443         3022 :                            - y(ihe4) * ratdum(ircrap)*(1.0d0-ratdum(irx1))
    2444              : 
    2445              :          dfdy(icr48,ife52) = ratdum(irfega) &
    2446         3022 :                         + ratdum(irx1) * ratdum(irfegp)
    2447              : 
    2448              : 
    2449              :    ! crx jacobian elements
    2450         3022 :          dfdy(icrx,ife56)  = fe56ec_fake_factor * ratdum(irn56ec)
    2451              : 
    2452              : 
    2453              :    ! fe52 jacobian elements
    2454         3022 :          dfdy(ife52,ihe4)  = y(icr48) * ratdum(ircrag) &
    2455              :                         - y(ife52) * ratdum(irfeag) &
    2456              :                         + y(icr48) * ratdum(ircrap) * (1.0d0-ratdum(irx1)) &
    2457              :                         - y(ife52) * ratdum(ir6f54) &
    2458         3022 :                         - y(ife52) * y(iprot) * ratdum(ir7f54)
    2459              : 
    2460              :          dfdy(ife52,icr48) = y(ihe4) * ratdum(ircrag) &
    2461         3022 :                         + y(ihe4) * ratdum(ircrap) * (1.0d0-ratdum(irx1))
    2462              : 
    2463              :          dfdy(ife52,ife52) = - y(ihe4) * ratdum(irfeag) &
    2464              :                            - ratdum(irfega) &
    2465              :                            - ratdum(irx1) * ratdum(irfegp) &
    2466         3022 :                            - y(ineut) * y(ineut) * ratdum(ir2f54) &
    2467              :                            - y(ihe4) * ratdum(ir6f54) &
    2468         3022 :                            - y(ihe4) * y(iprot) * ratdum(ir7f54)
    2469              : 
    2470         3022 :          dfdy(ife52,ife54) = ratdum(ir1f54) + &
    2471         3022 :                            y(iprot) * y(iprot) * ratdum(ir5f54)
    2472              : 
    2473              :          dfdy(ife52,ini56) = ratdum(irniga) &
    2474         3022 :                         + y(iprot) * ratdum(ir8f54)
    2475              : 
    2476              :          dfdy(ife52,ineut) = &
    2477         3022 :                            y(ife54) * dratdumdy1(ir1f54) &
    2478              :                            - 2.0d0 * y(ife52) * y(ineut) * ratdum(ir2f54) &
    2479         3022 :                            - y(ife52) * y(ineut) * y(ineut) * dratdumdy1(ir2f54)
    2480              : 
    2481              :          dfdy(ife52,iprot) = 2.0d0 * y(ife54) * y(iprot) * ratdum(ir5f54) &
    2482              :                         + y(ife54) * y(iprot) * y(iprot) * dratdumdy1(ir5f54) &
    2483              :                         - y(ihe4) * y(ife52) * dratdumdy1(ir6f54) &
    2484              :                         - y(ife52) * y(ihe4) * ratdum(ir7f54) &
    2485              :                         - y(ife52) * y(ihe4) * y(iprot) * dratdumdy1(ir7f54) &
    2486              :                         + y(ini56) * ratdum(ir8f54) &
    2487         3022 :                         + y(ini56) * y(iprot) * dratdumdy1(ir8f54)
    2488              : 
    2489              : 
    2490              :    ! fe54 jacobian elements
    2491         3022 :          dfdy(ife54,ihe4)  = y(ife52) * ratdum(ir6f54) &
    2492         3022 :                            - y(ife54) * ratdum(irfe56_aux4)
    2493              : 
    2494              :          dfdy(ife54,ife52) = &
    2495              :                               y(ineut) * y(ineut) * ratdum(ir2f54) + &
    2496         3022 :                               y(ihe4) * ratdum(ir6f54)
    2497              : 
    2498              :          dfdy(ife54,ife54) = &
    2499              :                            - ratdum(ir1f54) &
    2500         3022 :                            - y(ineut) * y(ineut) * ratdum(irfe56_aux2) &
    2501         3022 :                            - y(iprot) * y(iprot) * ratdum(ir3f54) &
    2502              :                            - y(iprot) * y(iprot) * ratdum(ir5f54) &
    2503         6044 :                            - y(ihe4) * ratdum(irfe56_aux4)
    2504              : 
    2505              :          dfdy(ife54,ife56) = &
    2506         3022 :                            ratdum(irfe56_aux1) + &
    2507         3022 :                            y(iprot) * y(iprot) * ratdum(irfe56_aux3)
    2508              : 
    2509         3022 :          dfdy(ife54,ini56) = ratdum(ir4f54)
    2510              : 
    2511              :          dfdy(ife54,ineut) = &
    2512              :                            - y(ife54) * dratdumdy1(ir1f54) &
    2513              :                            + 2.0d0 * y(ife52) * y(ineut) * ratdum(ir2f54) &
    2514              :                            + y(ife52) * y(ineut) * y(ineut) * dratdumdy1(ir2f54) &
    2515         3022 :                            + y(ife56) * dratdumdy1(irfe56_aux1) &
    2516              :                            - 2.0d0 * y(ife54) * y(ineut) * ratdum(irfe56_aux2) &
    2517         3022 :                            - y(ife54) * y(ineut) * y(ineut) * dratdumdy1(irfe56_aux2)
    2518              : 
    2519              :          dfdy(ife54,iprot) = -2.0d0 * y(ife54) * y(iprot) * ratdum(ir3f54) &
    2520         3022 :                            - y(ife54) * y(iprot) * y(iprot) * dratdumdy1(ir3f54) &
    2521         3022 :                            + y(ini56) * dratdumdy1(ir4f54) &
    2522              :                            - 2.0d0 * y(ife54) * y(iprot) * ratdum(ir5f54) &
    2523              :                            - y(ife54) * y(iprot) * y(iprot) * dratdumdy1(ir5f54) &
    2524              :                            + y(ihe4) * y(ife52) * dratdumdy1(ir6f54) &
    2525              :                            + 2.0d0 * y(ife56) * y(iprot) * ratdum(irfe56_aux3) &
    2526              :                            + y(ife56) * y(iprot) * y(iprot) * dratdumdy1(irfe56_aux3) &
    2527         3022 :                            - y(ihe4) * y(ife54) * dratdumdy1(irfe56_aux4)
    2528              : 
    2529              : 
    2530              :    ! fe56 jacobian elements
    2531              : 
    2532         3022 :          dfdy(ife56,ihe4)  = y(ife54) * ratdum(irfe56_aux4)
    2533              : 
    2534              : 
    2535              :          dfdy(ife56,ife54) = &
    2536              :                            y(ineut) * y(ineut) * ratdum(irfe56_aux2) + &
    2537         3022 :                            y(ihe4) * ratdum(irfe56_aux4)
    2538              : 
    2539              :          dfdy(ife56,ife56)  = - fe56ec_fake_factor * ratdum(irn56ec) &
    2540              :                               - ratdum(irfe56_aux1) &
    2541         3022 :                               - y(iprot) * y(iprot) * ratdum(irfe56_aux3)
    2542              : 
    2543         3022 :          if (plus_co56) then
    2544            2 :             dfdy(ife56,ico56)  = ratdum(irco56ec)
    2545              :          else
    2546         3020 :             dfdy(ife56,ini56)  = ratdum(irn56ec)
    2547              :          end if
    2548              : 
    2549              : 
    2550              :          dfdy(ife56,ineut) =  &
    2551              :                            -y(ife56) * dratdumdy1(irfe56_aux1) &
    2552              :                            + 2.0d0 * y(ife54) * y(ineut) * ratdum(irfe56_aux2) &
    2553         3022 :                            + y(ife54) * y(ineut) * y(ineut) * dratdumdy1(irfe56_aux2)
    2554              : 
    2555              : 
    2556              :          dfdy(ife56,iprot) = -2.0d0 * y(ife56) * y(iprot) * ratdum(irfe56_aux3) &
    2557              :                            - y(ife56) * y(iprot) * y(iprot) * dratdumdy1(irfe56_aux3) &
    2558         3022 :                            + y(ihe4) * y(ife54) * dratdumdy1(irfe56_aux4)
    2559              : 
    2560         3022 :          if (plus_co56) then
    2561              :    ! co56 jacobian elements
    2562            2 :             dfdy(ico56,ini56) =  ratdum(irn56ec)
    2563            2 :             dfdy(ico56,ico56) = -ratdum(irco56ec)
    2564              :          end if
    2565              : 
    2566              : 
    2567              :    ! ni56 jacobian elements
    2568         3022 :          dfdy(ini56,ihe4)  = y(ife52) * ratdum(irfeag) &
    2569         3022 :                         + y(ife52) * y(iprot) * ratdum(ir7f54)
    2570              : 
    2571              :          dfdy(ini56,ife52) = y(ihe4) * ratdum(irfeag) &
    2572         3022 :                         + y(ihe4)* y(iprot) * ratdum(ir7f54)
    2573              : 
    2574         3022 :          dfdy(ini56,ife54) = y(iprot) * y(iprot) * ratdum(ir3f54)
    2575              : 
    2576              :          dfdy(ini56,ini56) = -ratdum(irniga) &
    2577              :                            - ratdum(ir4f54) &
    2578              :                            - y(iprot) * ratdum(ir8f54) &
    2579         3022 :                            - ratdum(irn56ec)
    2580              : 
    2581              :          dfdy(ini56,iprot) = 2.0d0 * y(ife54) * y(iprot) * ratdum(ir3f54) &
    2582              :                         + y(ife54) * y(iprot) * y(iprot) * dratdumdy1(ir3f54) &
    2583              :                         - y(ini56) * dratdumdy1(ir4f54) &
    2584              :                         + y(ife52) * y(ihe4)* ratdum(ir7f54) &
    2585              :                         + y(ife52) * y(ihe4)* y(iprot) * dratdumdy1(ir7f54) &
    2586              :                         - y(ini56) * ratdum(ir8f54) &
    2587         3022 :                         - y(ini56) * y(iprot) * dratdumdy1(ir8f54)
    2588              : 
    2589              : 
    2590              :    ! photodisintegration neutrons jacobian elements
    2591         3022 :          dfdy(ineut,ihe4)  = 2.0d0 * ratdum(iralf1)
    2592              : 
    2593         3022 :          dfdy(ineut,ife52) = -2.0d0 * y(ineut) * y(ineut) * ratdum(ir2f54)
    2594              : 
    2595              :          dfdy(ineut,ife54) =  2.0d0 * ratdum(ir1f54) &
    2596         3022 :                            - 2.0d0 * y(ineut) * y(ineut) * ratdum(irfe56_aux2)
    2597              : 
    2598              :          dfdy(ineut,ife56) = 2.0d0 * ratdum(irfe56_aux1) &
    2599         3022 :                            - fe56ec_n_neut * fe56ec_fake_factor * ratdum(irn56ec)
    2600              : 
    2601              :          dfdy(ineut,ineut) = &
    2602              :                            2.0d0 * y(ife54) * dratdumdy1(ir1f54) &
    2603              :                            - 4.0d0 * y(ife52) * y(ineut) * ratdum(ir2f54) &
    2604              :                            - 2.0d0 * y(ife52) * y(ineut) * y(ineut) * dratdumdy1(ir2f54) &
    2605              :                            + 2.0d0 * y(ihe4) * dratdumdy1(iralf1) &
    2606              :                            - 4.0d0 * y(ineut) * y(iprot)*y(iprot) * ratdum(iralf2) &
    2607              :                            - 2.0d0 * y(ineut)*y(ineut) * y(iprot)*y(iprot) * dratdumdy1(iralf2) &
    2608         3022 :                            - ratdum(irnep) &
    2609              :                            + 2.0d0 * y(ife56) * dratdumdy1(irfe56_aux1) &
    2610              :                            - 4.0d0 * y(ife54) * y(ineut) * ratdum(irfe56_aux2) &
    2611         3022 :                            - 2.0d0 * y(ife54) * y(ineut) * y(ineut) * dratdumdy1(irfe56_aux2)
    2612              : 
    2613              :          dfdy(ineut,iprot) = 2.0d0 * y(ihe4) * dratdumdy2(iralf1) &
    2614              :                         - 4.0d0 * y(ineut)*y(ineut) * y(iprot) * ratdum(iralf2) &
    2615              :                         - 2.0d0 * y(ineut)*y(ineut) * y(iprot)*y(iprot) * dratdumdy2(iralf2) &
    2616         3022 :                         + ratdum(irpen)
    2617              : 
    2618              :    ! photodisintegration protons jacobian elements
    2619         3022 :          dfdy(iprot,ihe4)  = 2.0d0 * y(ife52) * ratdum(ir6f54) &
    2620              :                            + 2.0d0 * ratdum(iralf1) &
    2621         3022 :                            + 2.0d0 * y(ife54) * ratdum(irfe56_aux4)
    2622              : 
    2623         3022 :          dfdy(iprot,ife52) = 2.0d0 * y(ihe4) * ratdum(ir6f54)
    2624              : 
    2625              :          dfdy(iprot,ife54) = -2.0d0 * y(iprot) * y(iprot) * ratdum(ir3f54) &
    2626              :                            - 2.0d0 * y(iprot) * y(iprot) * ratdum(ir5f54) &
    2627         3022 :                            + 2.0d0 * y(ihe4) * ratdum(irfe56_aux4)
    2628              : 
    2629         3022 :          dfdy(iprot,ife56) = -2.0d0 * y(iprot) * y(iprot) * ratdum(irfe56_aux3)
    2630              : 
    2631         3022 :          dfdy(iprot,ini56) = 2.0d0 * ratdum(ir4f54)
    2632              : 
    2633              :          dfdy(iprot,ineut) = 2.0d0 * y(ihe4) * dratdumdy1(iralf1) &
    2634              :                         - 4.0d0 * y(ineut) * y(iprot)*y(iprot) * ratdum(iralf2) &
    2635              :                         - 2.0d0 * y(ineut)*y(ineut) * y(iprot)*y(iprot) * dratdumdy1(iralf2) &
    2636         3022 :                         + ratdum(irnep)
    2637              : 
    2638              :          dfdy(iprot,iprot) = -4.0d0 * y(ife54) * y(iprot) * ratdum(ir3f54) &
    2639              :                            - 2.0d0 * y(ife54) * y(iprot)*y(iprot)*dratdumdy1(ir3f54) &
    2640              :                            + 2.0d0 * y(ini56) * dratdumdy1(ir4f54) &
    2641              :                            - 4.0d0 * y(ife54) * y(iprot) * ratdum(ir5f54) &
    2642              :                            - 2.0d0 * y(ife54) * y(iprot)*y(iprot)*dratdumdy1(ir5f54) &
    2643              :                            + 2.0d0 * y(ihe4) * y(ife52) * dratdumdy1(ir6f54) &
    2644              :                            + 2.0d0 * y(ihe4) * dratdumdy2(iralf1) &
    2645              :                            - 4.0d0 * y(ineut)*y(ineut) * y(iprot) * ratdum(iralf2) &
    2646              :                            - 2.0d0 * y(ineut)*y(ineut) * y(iprot)*y(iprot) * dratdumdy2(iralf2) &
    2647              :                            - ratdum(irpen) &
    2648              :                            - 4.0d0 * y(ife56) * y(iprot) * ratdum(irfe56_aux3) &
    2649              :                            - 2.0d0 * y(ife56) * y(iprot) * y(iprot) * dratdumdy1(irfe56_aux3) &
    2650         3022 :                            + 2.0d0 * y(ihe4) * y(ife54) * dratdumdy1(irfe56_aux4)
    2651              : 
    2652         3022 :          end subroutine approx21_dfdy
    2653              : 
    2654              : 
    2655         3022 :          subroutine approx21_dfdT_dfdRho( &  ! epstotal includes neutrinos
    2656         6044 :                y, mion, dfdy, ratdum, dratdumdt, dratdumdd, &
    2657              :                fe56ec_fake_factor, min_T, fe56ec_n_neut, temp, den, &
    2658         6044 :                dfdT, dfdRho, d_epstotal_dy,  plus_co56, ierr)
    2659              :             real(dp), intent(in), dimension(:) :: &
    2660              :                y, mion, ratdum, dratdumdt, dratdumdd
    2661              :             real(dp), intent(in) :: fe56ec_fake_factor, min_T, temp, den, dfdy(:,:)
    2662              :             integer, intent(in) :: fe56ec_n_neut
    2663              :             real(dp), intent(inout), dimension(:) :: d_epstotal_dy, dfdT, dfdRho
    2664              :             logical, intent(in) ::  plus_co56
    2665              :             integer, intent(out) :: ierr
    2666              : 
    2667              :             integer :: i, j
    2668              :             real(dp) :: enuc_conv2
    2669              :             logical, parameter :: deriva = .true.
    2670              : 
    2671              :             ! temperature dependence of the rate equations
    2672        66486 :             dfdT(1:species(plus_co56)) = 0d0
    2673              :             call approx21_dydt( &
    2674              :                y,dratdumdt,ratdum,dfdT,deriva,&
    2675         3022 :                fe56ec_fake_factor,min_T,fe56ec_n_neut,temp,den,plus_co56,ierr)
    2676         3022 :             if (ierr /= 0) return
    2677              : 
    2678              :             ! density dependence of the rate equations
    2679        66486 :             dfdRho(1:species(plus_co56)) = 0d0
    2680              :             call approx21_dydt( &
    2681              :                y,dratdumdd,ratdum,dfdRho,deriva,&
    2682         3022 :                fe56ec_fake_factor,min_T,fe56ec_n_neut,temp,den,plus_co56,ierr)
    2683         3022 :             if (ierr /= 0) return
    2684              : 
    2685              :             ! energy generation rate partials (total energy; do neutrinos elsewhere)
    2686         3022 :             enuc_conv2 = -avo*clight*clight
    2687        66486 :             d_epstotal_dy(1:species(plus_co56)) = 0d0
    2688        66486 :             do j=1,species(plus_co56)
    2689      1396252 :                do i=1,species(plus_co56)
    2690      1396252 :                   d_epstotal_dy(j) = d_epstotal_dy(j) + dfdy(i,j)*mion(i)
    2691              :                end do
    2692        66486 :                d_epstotal_dy(j) = d_epstotal_dy(j) * enuc_conv2
    2693              :             end do
    2694              : 
    2695              :          end subroutine approx21_dfdT_dfdRho
    2696              : 
    2697              : 
    2698            5 :          subroutine mark_approx21(handle, ierr)
    2699              :             use net_def, only: Net_General_Info, get_net_ptr
    2700              :             use chem_def, only: chem_isos
    2701              :             integer, intent(in) :: handle
    2702              :             integer, intent(out) :: ierr
    2703              :             type (Net_General_Info), pointer :: g
    2704              :             include 'formats'
    2705            5 :             call get_net_ptr(handle, g, ierr)
    2706            5 :             if (ierr /= 0) then
    2707            0 :                write(*,*) 'invalid handle for do_mark_approx21_on_coprocessor'
    2708            0 :                return
    2709              :             end if
    2710              :             call mark_approx21_isos( &
    2711            5 :                g% net_iso, chem_isos% name(g% approx21_ye_iso),g% add_co56_to_approx21, ierr)
    2712            5 :             if (ierr /= 0) return
    2713            5 :             call mark_approx21_reactions(g% net_reaction,g% add_co56_to_approx21, ierr)
    2714            5 :             if (ierr /= 0) return
    2715            5 :          end subroutine mark_approx21
    2716              : 
    2717              : 
    2718            5 :          subroutine set_approx21(handle, ierr)
    2719            5 :             use net_def, only: Net_General_Info, get_net_ptr
    2720              :             use chem_def, only: chem_isos
    2721              :             integer, intent(in) :: handle
    2722              :             integer, intent(out) :: ierr
    2723              :             type (Net_General_Info), pointer :: g
    2724              :             include 'formats'
    2725            5 :             call get_net_ptr(handle, g, ierr)
    2726            5 :             if (ierr /= 0) then
    2727            0 :                write(*,*) 'invalid handle for do_mark_approx21_on_coprocessor'
    2728            0 :                return
    2729              :             end if
    2730              :             call set_approx21_isos( &
    2731            5 :                g% net_iso, chem_isos% name(g% approx21_ye_iso),g% add_co56_to_approx21,ierr)
    2732            5 :             if (ierr /= 0) return
    2733            5 :             call set_approx21_reactions(g% net_reaction,g% add_co56_to_approx21,ierr)
    2734            5 :             if (ierr /= 0) return
    2735            5 :          end subroutine set_approx21
    2736              : 
    2737              : 
    2738            5 :          subroutine mark_approx21_isos(itab, ye_iso_name,plus_co56, ierr)
    2739            5 :             use chem_lib, only: chem_get_iso_id
    2740              :             integer :: itab(:)
    2741              :             character (len=*), intent(in) :: ye_iso_name
    2742              :             logical, intent(in) :: plus_co56
    2743              :             integer, intent(out) :: ierr
    2744              :             integer :: i, cid
    2745            5 :             ierr = 0
    2746              : 
    2747            5 :             call do1('h1')
    2748            5 :             call do1('he3')
    2749            5 :             call do1('he4')
    2750            5 :             call do1('c12')
    2751            5 :             call do1('n14')
    2752            5 :             call do1('o16')
    2753            5 :             call do1('ne20')
    2754            5 :             call do1('mg24')
    2755            5 :             call do1('si28')
    2756            5 :             call do1('s32')
    2757            5 :             call do1('ar36')
    2758            5 :             call do1('ca40')
    2759            5 :             call do1('ti44')
    2760            5 :             call do1('cr48')
    2761            5 :             call do1('fe52')
    2762            5 :             call do1('fe54')
    2763            5 :             call do1('fe56')
    2764            5 :             if (plus_co56) call do1('co56')
    2765            5 :             call do1('ni56')
    2766            5 :             call do1('neut')
    2767            5 :             call do1('prot')
    2768            5 :             call do1(ye_iso_name)
    2769              : 
    2770              :             contains
    2771              : 
    2772          107 :             subroutine do1(str)
    2773            5 :                use utils_lib, only: mesa_error
    2774              :                character (len=*), intent(in) :: str
    2775              :                integer :: cid
    2776          107 :                cid = chem_get_iso_id(str)
    2777          107 :                if (cid <= 0) then
    2778            0 :                   ierr = -1
    2779            0 :                   write(*,*) 'mark_approx21_isos failed for ' // trim(str)
    2780            0 :                   call mesa_error(__FILE__,__LINE__)
    2781              :                end if
    2782          107 :                itab(cid) = 1
    2783          107 :             end subroutine do1
    2784              : 
    2785              :          end subroutine mark_approx21_isos
    2786              : 
    2787              : 
    2788            5 :          subroutine set_approx21_isos(itab, ye_iso_name, plus_co56, ierr)
    2789              :             use chem_lib, only: chem_get_iso_id
    2790              :             use const_def, only: ev2erg, clight
    2791              :             integer :: itab(:)
    2792              :             character (len=*), intent(in) :: ye_iso_name
    2793              :             logical, intent(in) :: plus_co56
    2794              :             integer, intent(out) :: ierr
    2795              :             integer :: i, cid
    2796            5 :             ierr = 0
    2797              : 
    2798            5 :             ih1   = do1('h1')
    2799            5 :             ihe3  = do1('he3')
    2800            5 :             ihe4  = do1('he4')
    2801            5 :             ic12  = do1('c12')
    2802            5 :             in14  = do1('n14')
    2803            5 :             io16  = do1('o16')
    2804            5 :             ine20 = do1('ne20')
    2805            5 :             img24 = do1('mg24')
    2806            5 :             isi28 = do1('si28')
    2807            5 :             is32  = do1('s32')
    2808            5 :             iar36 = do1('ar36')
    2809            5 :             ica40 = do1('ca40')
    2810            5 :             iti44 = do1('ti44')
    2811            5 :             icr48 = do1('cr48')
    2812            5 :             ife52 = do1('fe52')
    2813            5 :             ife54 = do1('fe54')
    2814            5 :             ife56 = do1('fe56')
    2815            5 :             if (plus_co56) ico56 = do1('co56')
    2816            5 :             ini56 = do1('ni56')
    2817            5 :             ineut = do1('neut')
    2818            5 :             iprot = do1('prot')
    2819            5 :             icrx = do1(ye_iso_name)
    2820            5 :             iso_cid(icrx) = -1  ! different for different approx21 nets
    2821              : 
    2822              :             contains
    2823              : 
    2824          107 :             integer function do1(str)
    2825            5 :                use chem_def, only: chem_isos
    2826              :                use utils_lib, only: mesa_error
    2827              :                character (len=*), intent(in) :: str
    2828              :                integer :: cid
    2829          107 :                cid = chem_get_iso_id(str)
    2830          107 :                if (cid <= 0) then
    2831            0 :                   write(*,*) 'set_approx21_isos failed for ' // trim(str)
    2832            0 :                   call mesa_error(__FILE__,__LINE__)
    2833              :                end if
    2834          107 :                do1 = itab(cid)
    2835          107 :                iso_cid(do1) = cid
    2836          107 :             end function do1
    2837              : 
    2838              :          end subroutine set_approx21_isos
    2839              : 
    2840              : 
    2841            5 :          subroutine mark_approx21_reactions(rtab, plus_co56, ierr)
    2842              :             use rates_lib, only: rates_reaction_id
    2843              :             integer :: rtab(:)
    2844              :             logical, intent(in) :: plus_co56
    2845              :             integer, intent(out) :: ierr
    2846              :             integer :: i, ir
    2847              :             include 'formats'
    2848            5 :             ierr = 0
    2849              : 
    2850            5 :             call do1('r_he4_he4_he4_to_c12')
    2851            5 :             call do1('r_c12_to_he4_he4_he4')
    2852            5 :             call do1('r_c12_ag_o16')
    2853            5 :             call do1('r1212')
    2854            5 :             call do1('r1216')
    2855            5 :             call do1('r1616')
    2856            5 :             call do1('r_o16_ga_c12')
    2857            5 :             call do1('r_o16_ag_ne20')
    2858            5 :             call do1('r_ne20_ga_o16')
    2859            5 :             call do1('r_ne20_ag_mg24')
    2860            5 :             call do1('r_mg24_ga_ne20')
    2861              : 
    2862            5 :             call do1('r_mg24_ag_si28')
    2863            5 :             call do1('r_si28_ga_mg24')
    2864            5 :             call do1('r_mg24_ap_al27')
    2865            5 :             call do1('r_al27_pa_mg24')
    2866            5 :             call do1('r_al27_pg_si28')
    2867            5 :             call do1('r_si28_gp_al27')
    2868            5 :             call do1('r_si28_ag_s32')
    2869            5 :             call do1('r_s32_ga_si28')
    2870            5 :             call do1('r_si28_ap_p31')
    2871            5 :             call do1('r_p31_pa_si28')
    2872            5 :             call do1('r_p31_pg_s32')
    2873            5 :             call do1('r_s32_gp_p31')
    2874            5 :             call do1('r_s32_ag_ar36')
    2875            5 :             call do1('r_ar36_ga_s32')
    2876            5 :             call do1('r_s32_ap_cl35')
    2877            5 :             call do1('r_cl35_pa_s32')
    2878            5 :             call do1('r_cl35_pg_ar36')
    2879            5 :             call do1('r_ar36_gp_cl35')
    2880            5 :             call do1('r_ar36_ag_ca40')
    2881            5 :             call do1('r_ca40_ga_ar36')
    2882            5 :             call do1('r_ar36_ap_k39')
    2883            5 :             call do1('r_k39_pa_ar36')
    2884            5 :             call do1('r_k39_pg_ca40')
    2885            5 :             call do1('r_ca40_gp_k39')
    2886            5 :             call do1('r_ca40_ag_ti44')
    2887            5 :             call do1('r_ti44_ga_ca40')
    2888            5 :             call do1('r_ca40_ap_sc43')
    2889            5 :             call do1('r_sc43_pa_ca40')
    2890            5 :             call do1('r_sc43_pg_ti44')
    2891            5 :             call do1('r_ti44_gp_sc43')
    2892            5 :             call do1('r_ti44_ag_cr48')
    2893            5 :             call do1('r_cr48_ga_ti44')
    2894            5 :             call do1('r_ti44_ap_v47')
    2895            5 :             call do1('r_v47_pa_ti44')
    2896            5 :             call do1('r_v47_pg_cr48')
    2897            5 :             call do1('r_cr48_gp_v47')
    2898            5 :             call do1('r_cr48_ag_fe52')
    2899            5 :             call do1('r_fe52_ga_cr48')
    2900            5 :             call do1('r_cr48_ap_mn51')
    2901            5 :             call do1('r_mn51_pa_cr48')
    2902            5 :             call do1('r_mn51_pg_fe52')
    2903            5 :             call do1('r_fe52_gp_mn51')
    2904            5 :             call do1('r_fe52_ag_ni56')
    2905            5 :             call do1('r_ni56_ga_fe52')
    2906            5 :             call do1('r_fe52_ap_co55')
    2907            5 :             call do1('r_co55_pa_fe52')
    2908            5 :             call do1('r_co55_pg_ni56')
    2909            5 :             call do1('r_ni56_gp_co55')
    2910              : 
    2911              :             ! for fe54 photodisintegration
    2912            5 :             call do1('r_fe52_ng_fe53')
    2913            5 :             call do1('r_fe53_gn_fe52')
    2914            5 :             call do1('r_fe53_ng_fe54')
    2915            5 :             call do1('r_fe54_gn_fe53')
    2916            5 :             call do1('r_fe54_pg_co55')
    2917            5 :             call do1('r_co55_gp_fe54')
    2918              : 
    2919              :             ! for he4 photodisintegration
    2920            5 :             call do1('r_he3_ng_he4')
    2921            5 :             call do1('r_he4_gn_he3')
    2922            5 :             call do1('r_h1_ng_h2')
    2923            5 :             call do1('r_h2_gn_h1')
    2924            5 :             call do1('r_h2_pg_he3')
    2925            5 :             call do1('r_he3_gp_h2')
    2926              : 
    2927              :             ! for weak reactions
    2928            5 :             call do1('rprot_to_neut')
    2929            5 :             call do1('rneut_to_prot')
    2930              : 
    2931            5 :             if (plus_co56) then
    2932            2 :                call do1('rni56ec_to_co56')
    2933            2 :                call do1('rco56ec_to_fe56')
    2934              :             else
    2935            3 :                call do1('rni56ec_to_fe56')
    2936              :             end if
    2937              : 
    2938              :             ! ppchain
    2939            5 :             call do1('rpp_to_he3')
    2940            5 :             call do1('r_he3_he3_to_h1_h1_he4')
    2941            5 :             call do1('r_he3_ag_be7')
    2942            5 :             call do1('r_be7_wk_li7')
    2943            5 :             call do1('r_be7_pg_b8')
    2944              : 
    2945              :             ! cno cycles
    2946            5 :             call do1('r_c12_pg_n13')
    2947            5 :             call do1('r_n14_pg_o15')
    2948            5 :             call do1('r_o16_pg_f17')
    2949            5 :             call do1('r_n15_pg_o16')
    2950            5 :             call do1('r_n15_pa_c12')
    2951            5 :             call do1('r_n14_ag_f18')
    2952              : 
    2953              :             ! for reactions to fe56
    2954            5 :             call do1('r_fe54_ng_fe55')
    2955            5 :             call do1('r_fe55_gn_fe54')
    2956            5 :             call do1('r_fe55_ng_fe56')
    2957            5 :             call do1('r_fe56_gn_fe55')
    2958            5 :             call do1('r_fe54_ap_co57')
    2959            5 :             call do1('r_co57_pa_fe54')
    2960            5 :             call do1('r_fe56_pg_co57')
    2961            5 :             call do1('r_co57_gp_fe56')
    2962              : 
    2963              :             contains
    2964              : 
    2965          467 :             subroutine do1(str)
    2966              :                use utils_lib, only: mesa_error
    2967              :                character (len=*), intent(in) :: str
    2968              :                integer :: ir
    2969          467 :                ir = rates_reaction_id(str)
    2970          467 :                if (ir <= 0) then
    2971            0 :                   ierr = -1
    2972            0 :                   write(*,*) 'mark_approx21_reactions failed for ' // trim(str)
    2973            0 :                   call mesa_error(__FILE__,__LINE__)
    2974              :                end if
    2975          467 :                rtab(ir) = 1
    2976          467 :             end subroutine do1
    2977              : 
    2978              :          end subroutine mark_approx21_reactions
    2979              : 
    2980              : 
    2981            5 :          subroutine set_approx21_reactions(rtab, plus_co56, ierr)
    2982              :             use rates_lib, only: rates_reaction_id
    2983              :             use utils_lib, only: mesa_error
    2984              :             integer :: rtab(:)
    2985              :             logical, intent(in) :: plus_co56
    2986              :             integer, intent(out) :: ierr
    2987            5 :             ierr = 0
    2988              : 
    2989            5 :             ir3a = do1('r_he4_he4_he4_to_c12')
    2990            5 :             irg3a = do1('r_c12_to_he4_he4_he4')
    2991            5 :             ircag = do1('r_c12_ag_o16')
    2992            5 :             ir1212 = do1('r1212')
    2993            5 :             ir1216 = do1('r1216')
    2994            5 :             ir1616 = do1('r1616')
    2995            5 :             iroga = do1('r_o16_ga_c12')
    2996            5 :             iroag = do1('r_o16_ag_ne20')
    2997            5 :             irnega = do1('r_ne20_ga_o16')
    2998            5 :             irneag = do1('r_ne20_ag_mg24')
    2999            5 :             irmgga = do1('r_mg24_ga_ne20')
    3000              : 
    3001            5 :             irmgag = do1('r_mg24_ag_si28')
    3002            5 :             irsiga = do1('r_si28_ga_mg24')
    3003            5 :             irmgap = do1('r_mg24_ap_al27')
    3004            5 :             iralpa = do1('r_al27_pa_mg24')
    3005            5 :             iralpg = do1('r_al27_pg_si28')
    3006            5 :             irsigp = do1('r_si28_gp_al27')
    3007            5 :             irsiag = do1('r_si28_ag_s32')
    3008            5 :             irsga = do1('r_s32_ga_si28')
    3009            5 :             irsiap = do1('r_si28_ap_p31')
    3010            5 :             irppa = do1('r_p31_pa_si28')
    3011            5 :             irppg = do1('r_p31_pg_s32')
    3012            5 :             irsgp = do1('r_s32_gp_p31')
    3013            5 :             irsag = do1('r_s32_ag_ar36')
    3014            5 :             irarga = do1('r_ar36_ga_s32')
    3015            5 :             irsap = do1('r_s32_ap_cl35')
    3016            5 :             irclpa = do1('r_cl35_pa_s32')
    3017            5 :             irclpg = do1('r_cl35_pg_ar36')
    3018            5 :             irargp = do1('r_ar36_gp_cl35')
    3019            5 :             irarag = do1('r_ar36_ag_ca40')
    3020            5 :             ircaga = do1('r_ca40_ga_ar36')
    3021            5 :             irarap = do1('r_ar36_ap_k39')
    3022            5 :             irkpa = do1('r_k39_pa_ar36')
    3023            5 :             irkpg = do1('r_k39_pg_ca40')
    3024            5 :             ircagp = do1('r_ca40_gp_k39')
    3025            5 :             ircaag = do1('r_ca40_ag_ti44')
    3026            5 :             irtiga = do1('r_ti44_ga_ca40')
    3027            5 :             ircaap = do1('r_ca40_ap_sc43')
    3028            5 :             irscpa = do1('r_sc43_pa_ca40')
    3029            5 :             irscpg = do1('r_sc43_pg_ti44')
    3030            5 :             irtigp = do1('r_ti44_gp_sc43')
    3031            5 :             irtiag = do1('r_ti44_ag_cr48')
    3032            5 :             ircrga = do1('r_cr48_ga_ti44')
    3033            5 :             irtiap = do1('r_ti44_ap_v47')
    3034            5 :             irvpa = do1('r_v47_pa_ti44')
    3035            5 :             irvpg = do1('r_v47_pg_cr48')
    3036            5 :             ircrgp = do1('r_cr48_gp_v47')
    3037            5 :             ircrag = do1('r_cr48_ag_fe52')
    3038            5 :             irfega = do1('r_fe52_ga_cr48')
    3039            5 :             ircrap = do1('r_cr48_ap_mn51')
    3040            5 :             irmnpa = do1('r_mn51_pa_cr48')
    3041            5 :             irmnpg = do1('r_mn51_pg_fe52')
    3042            5 :             irfegp = do1('r_fe52_gp_mn51')
    3043            5 :             irfeag = do1('r_fe52_ag_ni56')
    3044            5 :             irniga = do1('r_ni56_ga_fe52')
    3045            5 :             irfeap = do1('r_fe52_ap_co55')
    3046            5 :             ircopa = do1('r_co55_pa_fe52')
    3047            5 :             ircopg = do1('r_co55_pg_ni56')
    3048            5 :             irnigp = do1('r_ni56_gp_co55')
    3049              : 
    3050              :             ! for fe54 photodisintegration
    3051            5 :             ir52ng = do1('r_fe52_ng_fe53')
    3052            5 :             ir53gn = do1('r_fe53_gn_fe52')
    3053            5 :             ir53ng = do1('r_fe53_ng_fe54')
    3054            5 :             ir54gn = do1('r_fe54_gn_fe53')
    3055            5 :             irfepg = do1('r_fe54_pg_co55')
    3056            5 :             ircogp = do1('r_co55_gp_fe54')
    3057              : 
    3058              :             ! for he4 photodisintegration
    3059            5 :             irheng = do1('r_he3_ng_he4')
    3060            5 :             irhegn = do1('r_he4_gn_he3')
    3061            5 :             irhng = do1('r_h1_ng_h2')
    3062            5 :             irdgn = do1('r_h2_gn_h1')
    3063            5 :             irdpg = do1('r_h2_pg_he3')
    3064            5 :             irhegp = do1('r_he3_gp_h2')
    3065              : 
    3066              :             ! for weak reactions
    3067            5 :             irpen = do1('rprot_to_neut')
    3068            5 :             irnep = do1('rneut_to_prot')
    3069              : 
    3070            5 :             if (plus_co56) then
    3071            2 :                irn56ec = do1('rni56ec_to_co56')
    3072            2 :                irco56ec = do1('rco56ec_to_fe56')
    3073              :             else
    3074            3 :                irn56ec = do1('rni56ec_to_fe56')
    3075              :             end if
    3076              : 
    3077              :             ! ppchain
    3078            5 :             irpp = do1('rpp_to_he3')
    3079            5 :             ir33 = do1('r_he3_he3_to_h1_h1_he4')
    3080            5 :             irhe3ag = do1('r_he3_ag_be7')
    3081            5 :             ir_be7_wk_li7 = do1('r_be7_wk_li7')
    3082            5 :             ir_be7_pg_b8 = do1('r_be7_pg_b8')
    3083              : 
    3084              :             ! cno cycles
    3085            5 :             ircpg = do1('r_c12_pg_n13')
    3086            5 :             irnpg = do1('r_n14_pg_o15')
    3087            5 :             iropg = do1('r_o16_pg_f17')
    3088            5 :             irn15pg = do1('r_n15_pg_o16')
    3089            5 :             irn15pa = do1('r_n15_pa_c12')
    3090            5 :             irnag = do1('r_n14_ag_f18')
    3091              : 
    3092              :             ! for reactions to fe56
    3093            5 :             ir54ng = do1('r_fe54_ng_fe55')
    3094            5 :             ir55gn = do1('r_fe55_gn_fe54')
    3095            5 :             ir55ng = do1('r_fe55_ng_fe56')
    3096            5 :             ir56gn = do1('r_fe56_gn_fe55')
    3097            5 :             irfe54ap = do1('r_fe54_ap_co57')
    3098            5 :             irco57pa = do1('r_co57_pa_fe54')
    3099            5 :             irfe56pg = do1('r_fe56_pg_co57')
    3100            5 :             irco57gp = do1('r_co57_gp_fe56')
    3101              : 
    3102              :             ! the equilibrium links come after the mesa reactions
    3103            5 :             ifa = num_mesa_reactions(plus_co56)+1
    3104            5 :             ifg = ifa+1
    3105              : 
    3106            5 :             irr1 = ifg+1
    3107            5 :             irs1 = irr1+1
    3108            5 :             irt1 = irs1+1
    3109            5 :             iru1 = irt1+1
    3110            5 :             irv1 = iru1+1
    3111            5 :             irw1 = irv1+1
    3112            5 :             irx1 = irw1+1
    3113              : 
    3114            5 :             ir1f54 = irx1+1
    3115            5 :             ir2f54 = ir1f54+1
    3116            5 :             ir3f54 = ir2f54+1
    3117            5 :             ir4f54 = ir3f54+1
    3118            5 :             ir5f54 = ir4f54+1
    3119            5 :             ir6f54 = ir5f54+1
    3120            5 :             ir7f54 = ir6f54+1
    3121            5 :             ir8f54 = ir7f54+1
    3122              : 
    3123            5 :             iralf1 = ir8f54+1
    3124            5 :             iralf2 = iralf1+1
    3125              : 
    3126            5 :             irfe56_aux1 = iralf2+1
    3127            5 :             irfe56_aux2 = irfe56_aux1+1
    3128            5 :             irfe56_aux3 = irfe56_aux2+1
    3129            5 :             irfe56_aux4 = irfe56_aux3+1
    3130              : 
    3131            5 :             if( (plus_co56 .and. irfe56_aux4 /= num_reactions(plus_co56)) .or. &
    3132            5 :                (.not.plus_co56 .and. irfe56_aux4 /= num_reactions(plus_co56))) then
    3133            0 :                write(*,*) 'set_approx21_reactions found bad num_reactions'
    3134            0 :                write(*,*) plus_co56,irfe56_aux4,num_reactions(plus_co56)
    3135            0 :                call mesa_error(__FILE__,__LINE__)
    3136              :             end if
    3137              : 
    3138            5 :             call init_approx21(plus_co56)
    3139              : 
    3140              :             contains
    3141              : 
    3142          467 :             integer function do1(str)
    3143              :                use utils_lib, only: mesa_error
    3144              :                character (len=*), intent(in) :: str
    3145              :                integer :: ir
    3146          467 :                ir = rates_reaction_id(str)
    3147          467 :                if (ir <= 0) then
    3148            0 :                   write(*,*) 'set_approx21_reactions failed for ' // trim(str)
    3149            0 :                   call mesa_error(__FILE__,__LINE__)
    3150              :                end if
    3151          467 :                do1 = rtab(ir)
    3152          467 :                if (do1 <= 0) then
    3153            0 :                   write(*,*) 'set_approx21_reactions failed to find rate for ' // trim(str)
    3154            0 :                   call mesa_error(__FILE__,__LINE__)
    3155              :                end if
    3156          467 :                rate_id(do1) = ir
    3157          467 :             end function do1
    3158              : 
    3159              :          end subroutine set_approx21_reactions
    3160              : 
    3161              : 
    3162              :          ! call this after have set rate numbers
    3163            5 :          subroutine init_approx21(plus_co56)
    3164              :             integer :: i
    3165              :             logical, intent(in) :: plus_co56
    3166              :             include 'formats'
    3167              : 
    3168              :             ! set the names of the reaction rates (use mesa standard names)
    3169              : 
    3170            5 :             ratnam(ir3a)   = 'r_he4_he4_he4_to_c12'
    3171            5 :             ratnam(irg3a)  = 'r_c12_to_he4_he4_he4'
    3172            5 :             ratnam(ircag)  = 'r_c12_ag_o16'
    3173            5 :             ratnam(ir1212) = 'r1212'
    3174            5 :             ratnam(ir1216) = 'r1216'
    3175            5 :             ratnam(ir1616) = 'r1616'
    3176            5 :             ratnam(iroga)  = 'r_o16_ga_c12'
    3177            5 :             ratnam(iroag)  = 'r_o16_ag_ne20'
    3178            5 :             ratnam(irnega) = 'r_ne20_ga_o16'
    3179            5 :             ratnam(irneag) = 'r_ne20_ag_mg24'
    3180            5 :             ratnam(irmgga) = 'r_mg24_ga_ne20'
    3181              : 
    3182            5 :             ratnam(irmgag) = 'r_mg24_ag_si28'
    3183            5 :             ratnam(irsiga) = 'r_si28_ga_mg24'
    3184            5 :             ratnam(irmgap) = 'r_mg24_ap_al27'
    3185            5 :             ratnam(iralpa) = 'r_al27_pa_mg24'
    3186            5 :             ratnam(iralpg) = 'r_al27_pg_si28'
    3187            5 :             ratnam(irsigp) = 'r_si28_gp_al27'
    3188            5 :             ratnam(irsiag) = 'r_si28_ag_s32'
    3189            5 :             ratnam(irsga)  = 'r_s32_ga_si28'
    3190            5 :             ratnam(irsiap) = 'r_si28_ap_p31'
    3191            5 :             ratnam(irppa)  = 'r_p31_pa_si28'
    3192            5 :             ratnam(irppg)  = 'r_p31_pg_s32'
    3193            5 :             ratnam(irsgp)  = 'r_s32_gp_p31'
    3194            5 :             ratnam(irsag)  = 'r_s32_ag_ar36'
    3195            5 :             ratnam(irarga) = 'r_ar36_ga_s32'
    3196            5 :             ratnam(irsap)  = 'r_s32_ap_cl35'
    3197            5 :             ratnam(irclpa) = 'r_cl35_pa_s32'
    3198            5 :             ratnam(irclpg) = 'r_cl35_pg_ar36'
    3199            5 :             ratnam(irargp) = 'r_ar36_gp_cl35'
    3200            5 :             ratnam(irarag) = 'r_ar36_ag_ca40'
    3201            5 :             ratnam(ircaga) = 'r_ca40_ga_ar36'
    3202            5 :             ratnam(irarap) = 'r_ar36_ap_k39'
    3203            5 :             ratnam(irkpa)  = 'r_k39_pa_ar36'
    3204            5 :             ratnam(irkpg)  = 'r_k39_pg_ca40'
    3205            5 :             ratnam(ircagp) = 'r_ca40_gp_k39'
    3206            5 :             ratnam(ircaag) = 'r_ca40_ag_ti44'
    3207            5 :             ratnam(irtiga) = 'r_ti44_ga_ca40'
    3208            5 :             ratnam(ircaap) = 'r_ca40_ap_sc43'
    3209            5 :             ratnam(irscpa) = 'r_sc43_pa_ca40'
    3210            5 :             ratnam(irscpg) = 'r_sc43_pg_ti44'
    3211            5 :             ratnam(irtigp) = 'r_ti44_gp_sc43'
    3212            5 :             ratnam(irtiag) = 'r_ti44_ag_cr48'
    3213            5 :             ratnam(ircrga) = 'r_cr48_ga_ti44'
    3214            5 :             ratnam(irtiap) = 'r_ti44_ap_v47'
    3215            5 :             ratnam(irvpa)  = 'r_v47_pa_ti44'
    3216            5 :             ratnam(irvpg)  = 'r_v47_pg_cr48'
    3217            5 :             ratnam(ircrgp) = 'r_cr48_gp_v47'
    3218            5 :             ratnam(ircrag) = 'r_cr48_ag_fe52'
    3219            5 :             ratnam(irfega) = 'r_fe52_ga_cr48'
    3220            5 :             ratnam(ircrap) = 'r_cr48_ap_mn51'
    3221            5 :             ratnam(irmnpa) = 'r_mn51_pa_cr48'
    3222            5 :             ratnam(irmnpg) = 'r_mn51_pg_fe52'
    3223            5 :             ratnam(irfegp) = 'r_fe52_gp_mn51'
    3224            5 :             ratnam(irfeag) = 'r_fe52_ag_ni56'
    3225            5 :             ratnam(irniga) = 'r_ni56_ga_fe52'
    3226            5 :             ratnam(irfeap) = 'r_fe52_ap_co55'
    3227            5 :             ratnam(ircopa) = 'r_co55_pa_fe52'
    3228            5 :             ratnam(ircopg) = 'r_co55_pg_ni56'
    3229            5 :             ratnam(irnigp) = 'r_ni56_gp_co55'
    3230              : 
    3231              :             ! for fe54 photodisintegration
    3232            5 :             ratnam(ir52ng) = 'r_fe52_ng_fe53'
    3233            5 :             ratnam(ir53gn) = 'r_fe53_gn_fe52'
    3234            5 :             ratnam(ir53ng) = 'r_fe53_ng_fe54'
    3235            5 :             ratnam(ir54gn) = 'r_fe54_gn_fe53'
    3236            5 :             ratnam(irfepg) = 'r_fe54_pg_co55'
    3237            5 :             ratnam(ircogp) = 'r_co55_gp_fe54'
    3238              : 
    3239              :             ! for he4 photodisintegration
    3240            5 :             ratnam(irheng)  = 'r_he3_ng_he4'
    3241            5 :             ratnam(irhegn)  = 'r_he4_gn_he3'
    3242            5 :             ratnam(irhng)   = 'r_h1_ng_h2'
    3243            5 :             ratnam(irdgn)   = 'r_h2_gn_h1'
    3244            5 :             ratnam(irdpg)   = 'r_h2_pg_he3'
    3245            5 :             ratnam(irhegp)  = 'r_he3_gp_h2'
    3246              : 
    3247              :             ! for weak reactions
    3248            5 :             ratnam(irpen)   = 'rprot_to_neut'
    3249            5 :             ratnam(irnep)   = 'rneut_to_prot'
    3250              : 
    3251            5 :             if (plus_co56) then
    3252            2 :                ratnam(irn56ec) = 'r_ni56_wk_co56'
    3253            2 :                ratnam(irco56ec) = 'r_co56_wk_fe56'
    3254              :             else
    3255            3 :                ratnam(irn56ec) = 'rni56ec_to_fe56'
    3256              :             end if
    3257              : 
    3258              :             ! ppchain
    3259            5 :             ratnam(irpp)    = 'rpp_to_he3'
    3260            5 :             ratnam(ir33)    = 'r_he3_he3_to_h1_h1_he4'
    3261            5 :             ratnam(irhe3ag) = 'r_he3_ag_be7'
    3262            5 :             ratnam(ir_be7_wk_li7) = 'r_be7_wk_li7'
    3263            5 :             ratnam(ir_be7_pg_b8) = 'r_be7_pg_b8'
    3264              : 
    3265              :             ! cno cycles
    3266            5 :             ratnam(ircpg)   = 'r_c12_pg_n13'
    3267            5 :             ratnam(irnpg)   = 'r_n14_pg_o15'
    3268            5 :             ratnam(iropg)   = 'r_o16_pg_f17'
    3269              : 
    3270            5 :             ratnam(irn15pg) = 'r_n15_pg_o16'
    3271            5 :             ratnam(irn15pa) = 'r_n15_pa_c12'
    3272              : 
    3273            5 :             ratnam(irnag)   = 'r_n14_ag_f18'
    3274              : 
    3275            5 :             ratnam(ir54ng)   = 'r_fe54_ng_fe55'
    3276            5 :             ratnam(ir55gn)   = 'r_fe55_gn_fe54'
    3277            5 :             ratnam(ir55ng)   = 'r_fe55_ng_fe56'
    3278            5 :             ratnam(ir56gn)   = 'r_fe56_gn_fe55'
    3279            5 :             ratnam(irfe54ap) = 'r_fe54_ap_co57'
    3280            5 :             ratnam(irco57pa) = 'r_co57_pa_fe54'
    3281            5 :             ratnam(irfe56pg) = 'r_fe56_pg_co57'
    3282            5 :             ratnam(irco57gp) = 'r_co57_gp_fe56'
    3283              : 
    3284              : 
    3285              :             ! the combo links
    3286              : 
    3287            5 :             ratnam(ifa)     ='fa'  ! this is fraction of n15 that goes to c12 by pa
    3288            5 :             ratnam(ifg)     ='fg'  ! this is fraction of n15 that goes to o16 by pg
    3289              : 
    3290            5 :             ratnam(irr1)   = 'r1'
    3291            5 :             ratnam(irs1)   = 's1'
    3292            5 :             ratnam(irt1)   = 't1'
    3293            5 :             ratnam(iru1)   = 'u1'
    3294            5 :             ratnam(irv1)   = 'v1'
    3295            5 :             ratnam(irw1)   = 'w1'
    3296            5 :             ratnam(irx1)   = 'x1'
    3297              : 
    3298            5 :             ratnam(ir1f54) = 'r1f54'
    3299            5 :             ratnam(ir2f54) = 'r2f54'
    3300            5 :             ratnam(ir3f54) = 'r3f54'  ! rfe54prot_to_ni56
    3301            5 :             ratnam(ir4f54) = 'r4f54'  ! rni56gprot_to_fe54
    3302            5 :             ratnam(ir5f54) = 'r5f54'
    3303            5 :             ratnam(ir6f54) = 'r6f54'
    3304            5 :             ratnam(ir7f54) = 'r7f54'  ! rfe52aprot_to_ni56
    3305            5 :             ratnam(ir8f54) = 'r8f54'  ! rni56gprot_to_fe52
    3306              : 
    3307            5 :             ratnam(iralf1) = 'ralf1'
    3308            5 :             ratnam(iralf2) = 'ralf2'
    3309              : 
    3310            5 :             ratnam(irfe56_aux1) = 'rfe56aux1'
    3311            5 :             ratnam(irfe56_aux2) = 'rfe56aux2'
    3312            5 :             ratnam(irfe56_aux3) = 'rfe56aux3'
    3313            5 :             ratnam(irfe56_aux4) = 'rfe56aux4'
    3314              : 
    3315              :             return
    3316              : 
    3317              :             do i=1,num_mesa_reactions(plus_co56)
    3318              :                write(*,2) trim(ratnam(i)), i
    3319              :             end do
    3320              :             write(*,*) ''
    3321              :             do i=num_mesa_reactions(plus_co56)+1,num_reactions(plus_co56)
    3322              :                write(*,2) 'extra ' // trim(ratnam(i)), i
    3323              :             end do
    3324              :             call mesa_error(__FILE__,__LINE__,'init_approx21')
    3325              : 
    3326              :          end subroutine init_approx21
    3327              : 
    3328        18172 :          real(dp) function eval_fe56ec_fake_factor(fe56ec_fake_factor,min_T,temp)
    3329              :             real(dp), intent(in) :: fe56ec_fake_factor,min_T,temp
    3330              : 
    3331        18172 :             eval_fe56ec_fake_factor = 0.d0
    3332        18172 :             if(temp >= min_T)then
    3333        14830 :                eval_fe56ec_fake_factor = fe56ec_fake_factor
    3334              :             end if
    3335              : 
    3336            0 :          end function eval_fe56ec_fake_factor
    3337              : 
    3338              : 
    3339        13671 :          pure integer function num_reactions(plus_co56)
    3340              :             logical, intent(in) :: plus_co56
    3341              : 
    3342        13671 :             if(plus_co56) then
    3343              :                num_reactions = approx21_plus_co56_nrat
    3344              :             else
    3345        13661 :                num_reactions = approx21_nrat
    3346              :             end if
    3347              : 
    3348        13666 :          end function num_reactions
    3349              : 
    3350              : 
    3351         4558 :          pure integer function num_mesa_reactions(plus_co56)
    3352              :             logical, intent(in) :: plus_co56
    3353              : 
    3354         4558 :             if(plus_co56) then
    3355              :                num_mesa_reactions = approx21_num_mesa_reactions_co56
    3356              :             else
    3357         4554 :                num_mesa_reactions = approx21_num_mesa_reactions_21
    3358              :             end if
    3359              : 
    3360            0 :          end function num_mesa_reactions
    3361              : 
    3362        30260 :          pure integer function species(plus_co56)
    3363              :             logical, intent(in) :: plus_co56
    3364              : 
    3365        30260 :             if(plus_co56) then
    3366              :                species = species_co56
    3367              :             else
    3368        30242 :                species = species_21
    3369              :             end if
    3370              : 
    3371            0 :          end function species
    3372              : 
    3373              : 
    3374              :       end module net_approx21
        

Generated by: LCOV version 2.0-1