LCOV - code coverage report
Current view: top level - net/private - net_approx21.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 95.8 % 1455 1394
Test Date: 2025-05-08 18:23:42 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         9106 :          subroutine approx21_pa_pg_fractions( &
     226         9106 :             ratraw,dratrawdt,dratrawdd,ierr)
     227              :          real(dp), dimension(:) :: ratraw,dratrawdt,dratrawdd
     228              :          integer, intent(out) :: ierr
     229              : 
     230              :          include 'formats'
     231              : 
     232         9106 :          ierr = 0
     233              : 
     234         9106 :          call set1(ifa,irn15pg,irn15pa)
     235         9106 :          ratraw(ifg)    = 1.0d0 - ratraw(ifa)
     236         9106 :          dratrawdt(ifg) = -dratrawdt(ifa)
     237         9106 :          dratrawdd(ifg) = -dratrawdd(ifa)
     238              : 
     239         9106 :          call set1(irr1,iralpg,iralpa)  ! al27
     240         9106 :          call set1(irs1,irppg,irppa)   ! p31
     241         9106 :          call set1(irt1,irclpg,irclpa)  ! cl35
     242         9106 :          call set1(iru1,irkpg,irkpa)   ! k39
     243         9106 :          call set1(irv1,irscpg,irscpa)  ! sc43
     244         9106 :          call set1(irw1,irvpg,irvpa)   ! v47
     245         9106 :          call set1(irx1,irmnpg,irmnpa)  ! mn51
     246              : 
     247              : 
     248              :          contains
     249              : 
     250        72848 :          subroutine set1(ifa,irn15pg,irn15pa)
     251              :             integer, intent(in) :: ifa,irn15pg,irn15pa
     252        72848 :             real(dp) :: ff1,dff1dt,dff1dd,ff2,dff2dt,dff2dd, &
     253        72848 :                tot,dtotdt,dtotdd,invtot
     254              : 
     255        72848 :             ff1 = ratraw(irn15pg)
     256        72848 :             dff1dt = dratrawdt(irn15pg)
     257        72848 :             dff1dd = dratrawdd(irn15pg)
     258              : 
     259        72848 :             ff2 = ratraw(irn15pa)
     260        72848 :             dff2dt = dratrawdt(irn15pa)
     261        72848 :             dff2dd = dratrawdd(irn15pa)
     262              : 
     263        72848 :             tot            = ff1 + ff2
     264        72848 :             dtotdt         = dff1dt + dff2dt
     265        72848 :             dtotdd         = dff1dd + dff2dd
     266              : 
     267        72848 :             if (tot > 1d-30) then
     268        72832 :                invtot         = 1.0d0/tot
     269        72832 :                ratraw(ifa)    = ff2 * invtot
     270        72832 :                dratrawdt(ifa) = dff2dt * invtot - ff2 * invtot*invtot * dtotdt
     271        72832 :                dratrawdd(ifa) = dff2dd * invtot - ff2 * invtot*invtot * dtotdd
     272              :             else
     273           16 :                ratraw(ifa)    = 0.0d0
     274           16 :                dratrawdt(ifa) = 0.0d0
     275           16 :                dratrawdd(ifa) = 0.0d0
     276              :             end if
     277              : 
     278        72848 :          end subroutine set1
     279              : 
     280              :       end subroutine approx21_pa_pg_fractions
     281              : 
     282              : 
     283              :          ! call this before screening
     284         9106 :          subroutine approx21_weak_rates( &
     285         9106 :                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         9106 :             ierr = 0
     301              : 
     302         9106 :             call eval_ecapnuc_rate(eta, temp, den, rpen, rnep, spen, snep)
     303              : 
     304         9106 :             ratraw(irpen) = rpen
     305         9106 :             dratrawdt(irpen) = 0
     306         9106 :             dratrawdd(irpen) = 0
     307              :             if (rpen > 0) then
     308              :                Qneu = spen/rpen
     309              :             else
     310              :                Qneu = 0
     311              :             end if
     312              : 
     313         9106 :             ratraw(irnep) = rnep
     314         9106 :             dratrawdt(irnep) = 0
     315         9106 :             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         9106 :                ierr)
     326         9106 :             if (ierr /= 0) then
     327              :                !write(*,*) 'failed in eval_ni56_ec_rate'
     328              :                return
     329              :             end if
     330         9106 :             ratraw(irn56ec) = rate
     331         9106 :             dratrawdt(irn56ec) = 0
     332         9106 :             dratrawdd(irn56ec) = 0
     333              : 
     334         9106 :             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            4 :                   ierr)
     339            4 :                if (ierr /= 0) then
     340              :                   !write(*,*) 'failed in eval_co56_ec_rate'
     341              :                   return
     342              :                end if
     343            4 :                ratraw(irco56ec) = rate
     344            4 :                dratrawdt(irco56ec) = 0
     345            4 :                dratrawdd(irco56ec) = 0
     346              :             end if
     347              : 
     348         9106 :          end subroutine approx21_weak_rates
     349              : 
     350              : 
     351              :          ! call this after screening -- depends on y, so don't reuse results.
     352         9106 :          subroutine approx21_special_reactions( &
     353         9106 :                btemp, bden, abar, zbar, y, &
     354              :                use_3a_FL, conv_eps_3a, &
     355         9106 :                ratdum, dratdumdt, dratdumdd, dratdumdy1, dratdumdy2, &
     356              :                plus_co56, ierr)
     357         9106 :             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         9106 :             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         9106 :             ierr = 0
     375              : 
     376         9106 :             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         9106 :             okay = .true.
     395       855968 :             do i=1,num_mesa_reactions(plus_co56)
     396       855968 :                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         9106 :             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         9106 :          ratdum(ir1f54)     = 0.0d0
     545         9106 :          dratdumdy1(ir1f54) = 0.0d0
     546         9106 :          dratdumdt(ir1f54)  = 0.0d0
     547         9106 :          dratdumdd(ir1f54)  = 0.0d0
     548              : 
     549         9106 :          ratdum(ir2f54)     = 0.0d0
     550         9106 :          dratdumdy1(ir2f54) = 0.0d0
     551         9106 :          dratdumdt(ir2f54)  = 0.0d0
     552         9106 :          dratdumdd(ir2f54)  = 0.0d0
     553              : 
     554         9106 :          denom   = ratdum(ir53gn) + y(ineut)*ratdum(ir53ng)
     555         9106 :          denomdt = dratdumdt(ir53gn) + y(ineut)*dratdumdt(ir53ng)
     556         9106 :          denomdd = dratdumdd(ir53gn) + y(ineut)*dratdumdd(ir53ng)
     557              : 
     558         9106 :          if (denom > tiny_denom .and. btemp > 1.5d9) then
     559         5934 :          zz      = 1.0d0/denom
     560              : 
     561         5934 :          ratdum(ir1f54)     = ratdum(ir54gn)*ratdum(ir53gn)*zz
     562         5934 :          dratdumdy1(ir1f54) = -ratdum(ir1f54)*zz * ratdum(ir53ng)
     563              :          dratdumdt(ir1f54)  = dratdumdt(ir54gn)*ratdum(ir53gn)*zz &
     564              :                               + ratdum(ir54gn)*dratdumdt(ir53gn)*zz &
     565         5934 :                               - ratdum(ir1f54)*zz*denomdt
     566              :          dratdumdd(ir1f54) = dratdumdd(ir54gn)*ratdum(ir53gn)*zz &
     567              :                            + ratdum(ir54gn)*dratdumdd(ir53gn)*zz &
     568         5934 :                            - ratdum(ir1f54)*zz*denomdd
     569              : 
     570         5934 :          ratdum(ir2f54)     = ratdum(ir52ng)*ratdum(ir53ng)*zz
     571         5934 :          dratdumdy1(ir2f54) = -ratdum(ir2f54)*zz * ratdum(ir53ng)
     572              :          dratdumdt(ir2f54)  = dratdumdt(ir52ng)*ratdum(ir53ng)*zz &
     573              :                               + ratdum(ir52ng)*dratdumdt(ir53ng)*zz &
     574         5934 :                               - ratdum(ir2f54)*zz*denomdt
     575              :          dratdumdd(ir2f54) = dratdumdd(ir52ng)*ratdum(ir53ng)*zz &
     576              :                            + ratdum(ir52ng)*dratdumdd(ir53ng)*zz &
     577         5934 :                            - ratdum(ir2f54)*zz*denomdd
     578              :          end if
     579              : 
     580              :    ! fe54(n,g)fe55(n,g)fe56 equilibrium links
     581         9106 :          ratdum(irfe56_aux1)     = 0.0d0
     582         9106 :          dratdumdy1(irfe56_aux1) = 0.0d0
     583         9106 :          dratdumdt(irfe56_aux1)  = 0.0d0
     584         9106 :          dratdumdd(irfe56_aux1)  = 0.0d0
     585              : 
     586         9106 :          ratdum(irfe56_aux2)     = 0.0d0
     587         9106 :          dratdumdy1(irfe56_aux2) = 0.0d0
     588         9106 :          dratdumdt(irfe56_aux2)  = 0.0d0
     589         9106 :          dratdumdd(irfe56_aux2)  = 0.0d0
     590              : 
     591         9106 :          denom   = ratdum(ir55gn)    + y(ineut)*ratdum(ir55ng)
     592         9106 :          denomdt = dratdumdt(ir55gn) + y(ineut)*dratdumdt(ir55ng)
     593         9106 :          denomdd = dratdumdd(ir55gn) + y(ineut)*dratdumdd(ir55ng)
     594              : 
     595         9106 :          if (denom > tiny_denom .and. btemp > 1.5d9) then
     596         5934 :          zz      = 1.0d0/denom
     597              : 
     598         5934 :          ratdum(irfe56_aux1)     = ratdum(ir56gn)*ratdum(ir55gn)*zz
     599         5934 :          dratdumdy1(irfe56_aux1) = -ratdum(irfe56_aux1)*zz * ratdum(ir55ng)
     600              :          dratdumdt(irfe56_aux1)  = dratdumdt(ir56gn)*ratdum(ir55gn)*zz &
     601              :                                  + ratdum(ir56gn)*dratdumdt(ir55gn)*zz &
     602         5934 :                                  - ratdum(irfe56_aux1)*zz*denomdt
     603              :          dratdumdd(irfe56_aux1)  = dratdumdd(ir56gn)*ratdum(ir55gn)*zz &
     604              :                                  + ratdum(ir56gn)*dratdumdd(ir55gn)*zz &
     605         5934 :                                  - ratdum(irfe56_aux1)*zz*denomdd
     606              : 
     607         5934 :          ratdum(irfe56_aux2)     = ratdum(ir54ng)*ratdum(ir55ng)*zz
     608         5934 :          dratdumdy1(irfe56_aux2) = -ratdum(irfe56_aux2)*zz * ratdum(ir55ng)
     609              :          dratdumdt(irfe56_aux2)  = dratdumdt(ir54ng)*ratdum(ir55ng)*zz &
     610              :                                  + ratdum(ir54ng)*dratdumdt(ir55ng)*zz &
     611         5934 :                                  - ratdum(irfe56_aux2)*zz*denomdt
     612              :          dratdumdd(irfe56_aux2) = dratdumdd(ir54ng)*ratdum(ir55ng)*zz &
     613              :                                  + ratdum(ir54ng)*dratdumdd(ir55ng)*zz &
     614         5934 :                                  - ratdum(irfe56_aux2)*zz*denomdd
     615              : 
     616              :          end if
     617              : 
     618              :    ! fe54(a,p)co57(g,p)fe56 equilibrium links
     619              : 
     620         9106 :          ratdum(irfe56_aux3)     = 0.0d0
     621         9106 :          dratdumdy1(irfe56_aux3) = 0.0d0
     622         9106 :          dratdumdt(irfe56_aux3)  = 0.0d0
     623         9106 :          dratdumdd(irfe56_aux3)  = 0.0d0
     624              : 
     625         9106 :          ratdum(irfe56_aux4)     = 0.0d0
     626         9106 :          dratdumdy1(irfe56_aux4) = 0.0d0
     627         9106 :          dratdumdt(irfe56_aux4)  = 0.0d0
     628         9106 :          dratdumdd(irfe56_aux4)  = 0.0d0
     629              : 
     630         9106 :          denom   = ratdum(irco57gp)    + y(iprot)*ratdum(irco57pa)
     631         9106 :          denomdt = dratdumdt(irco57gp) + y(iprot)*dratdumdt(irco57pa)
     632         9106 :          denomdd = dratdumdd(irco57gp) + y(iprot)*dratdumdd(irco57pa)
     633              : 
     634         9106 :          if (denom > tiny_denom .and. btemp > 1.5d9) then
     635         5934 :          zz      = 1.0d0/denom
     636              : 
     637         5934 :          ratdum(irfe56_aux3)     = ratdum(irfe56pg) * ratdum(irco57pa) * zz
     638         5934 :          dratdumdy1(irfe56_aux3) = -ratdum(irfe56_aux3) * zz * ratdum(irco57pa)
     639              :          dratdumdt(irfe56_aux3)  = dratdumdt(irfe56pg) * ratdum(irco57pa) * zz &
     640              :                                  + ratdum(irfe56pg) * dratdumdt(irco57pa) * zz &
     641         5934 :                                  - ratdum(irfe56_aux3) * zz * denomdt
     642              :          dratdumdd(irfe56_aux3)  = dratdumdd(irfe56pg) * ratdum(irco57pa) * zz &
     643              :                                  + ratdum(irfe56pg) * dratdumdd(irco57pa) * zz &
     644         5934 :                                  - ratdum(irfe56_aux3) * zz * denomdd
     645              : 
     646         5934 :          ratdum(irfe56_aux4)     = ratdum(irfe54ap) * ratdum(irco57gp) * zz
     647         5934 :          dratdumdy1(irfe56_aux4) = -ratdum(irfe56_aux4) * zz * ratdum(irco57pa)
     648              :          dratdumdt(irfe56_aux4)  = dratdumdt(irfe54ap) * ratdum(irco57gp) * zz &
     649              :                                  + ratdum(irfe54ap) * dratdumdt(irco57gp) * zz &
     650         5934 :                                  - ratdum(irfe56_aux4) * zz * denomdt
     651              :          dratdumdd(irfe56_aux4)  = dratdumdd(irfe54ap) * ratdum(irco57gp) * zz &
     652              :                                  + ratdum(irfe54ap) * dratdumdd(irco57gp) * zz &
     653         5934 :                                  - 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         9106 :          ratdum(ir3f54)     = 0.0d0
     662         9106 :          dratdumdy1(ir3f54) = 0.0d0
     663         9106 :          dratdumdt(ir3f54)  = 0.0d0
     664         9106 :          dratdumdd(ir3f54)  = 0.0d0
     665              : 
     666         9106 :          ratdum(ir4f54)     = 0.0d0
     667         9106 :          dratdumdy1(ir4f54) = 0.0d0
     668         9106 :          dratdumdt(ir4f54)  = 0.0d0
     669         9106 :          dratdumdd(ir4f54)  = 0.0d0
     670              : 
     671         9106 :          ratdum(ir5f54)     = 0.0d0
     672         9106 :          dratdumdy1(ir5f54) = 0.0d0
     673         9106 :          dratdumdt(ir5f54)  = 0.0d0
     674         9106 :          dratdumdd(ir5f54)  = 0.0d0
     675              : 
     676         9106 :          ratdum(ir6f54)     = 0.0d0
     677         9106 :          dratdumdy1(ir6f54) = 0.0d0
     678         9106 :          dratdumdt(ir6f54)  = 0.0d0
     679         9106 :          dratdumdd(ir6f54)  = 0.0d0
     680              : 
     681         9106 :          ratdum(ir7f54)     = 0.0d0
     682         9106 :          dratdumdy1(ir7f54) = 0.0d0
     683         9106 :          dratdumdt(ir7f54)  = 0.0d0
     684         9106 :          dratdumdd(ir7f54)  = 0.0d0
     685              : 
     686         9106 :          ratdum(ir8f54)     = 0.0d0
     687         9106 :          dratdumdy1(ir8f54) = 0.0d0
     688         9106 :          dratdumdt(ir8f54)  = 0.0d0
     689         9106 :          dratdumdd(ir8f54)  = 0.0d0
     690              : 
     691         9106 :          denom   = ratdum(ircogp)+y(iprot)*(ratdum(ircopg)+ratdum(ircopa))
     692              : 
     693         9106 :          if (denom > tiny_denom .and. btemp > 1.5d9) then
     694              : 
     695              :          denomdt = dratdumdt(ircogp) &
     696         5934 :                   + y(iprot)*(dratdumdt(ircopg) + dratdumdt(ircopa))
     697              :          denomdd = dratdumdd(ircogp) &
     698         5934 :                   + y(iprot)*(dratdumdd(ircopg) + dratdumdd(ircopa))
     699              : 
     700         5934 :          zz      = 1.0d0/denom
     701              : 
     702         5934 :          ratdum(ir3f54)     = ratdum(irfepg) * ratdum(ircopg) * zz
     703              :          dratdumdy1(ir3f54) = -ratdum(ir3f54) * zz * &
     704         5934 :                               (ratdum(ircopg) + ratdum(ircopa))
     705              :          dratdumdt(ir3f54)  = dratdumdt(irfepg) * ratdum(ircopg) * zz &
     706              :                   + ratdum(irfepg) * dratdumdt(ircopg) * zz &
     707         5934 :                   - ratdum(ir3f54)*zz*denomdt
     708              :          dratdumdd(ir3f54)  = dratdumdd(irfepg) * ratdum(ircopg) * zz &
     709              :                   + ratdum(irfepg) * dratdumdd(ircopg) * zz &
     710         5934 :                   - ratdum(ir3f54)*zz*denomdd
     711              : 
     712         5934 :          ratdum(ir4f54)     = ratdum(irnigp) * ratdum(ircogp) * zz
     713              :          dratdumdy1(ir4f54) = -ratdum(ir4f54) * zz * &
     714         5934 :                               (ratdum(ircopg)+ratdum(ircopa))
     715              :          dratdumdt(ir4f54)  =  dratdumdt(irnigp) * ratdum(ircogp) * zz &
     716              :                   + ratdum(irnigp) * dratdumdt(ircogp) * zz &
     717         5934 :                   - ratdum(ir4f54)*zz*denomdt
     718              :          dratdumdd(ir4f54)  = dratdumdd(irnigp) * ratdum(ircogp) * zz &
     719              :                   + ratdum(irnigp) * dratdumdd(ircogp) * zz &
     720         5934 :                   - ratdum(ir4f54)*zz*denomdd
     721              : 
     722         5934 :          ratdum(ir5f54)     = ratdum(irfepg) * ratdum(ircopa) * zz
     723              :          dratdumdy1(ir5f54) = -ratdum(ir5f54) * zz * &
     724         5934 :                               (ratdum(ircopg)+ratdum(ircopa))
     725              :          dratdumdt(ir5f54)  = dratdumdt(irfepg) * ratdum(ircopa) * zz &
     726              :                   + ratdum(irfepg) * dratdumdt(ircopa) * zz &
     727         5934 :                   - ratdum(ir5f54) * zz * denomdt
     728              :          dratdumdd(ir5f54)  = dratdumdd(irfepg) * ratdum(ircopa) * zz &
     729              :                   + ratdum(irfepg) * dratdumdd(ircopa) * zz &
     730         5934 :                   - ratdum(ir5f54) * zz * denomdd
     731              : 
     732         5934 :          ratdum(ir6f54)     = ratdum(irfeap) * ratdum(ircogp) * zz
     733              :          dratdumdy1(ir6f54) = -ratdum(ir6f54) * zz * &
     734         5934 :                               (ratdum(ircopg)+ratdum(ircopa))
     735              :          dratdumdt(ir6f54)  = dratdumdt(irfeap) * ratdum(ircogp) * zz &
     736              :                   + ratdum(irfeap) * dratdumdt(ircogp) * zz &
     737         5934 :                   - ratdum(ir6f54) * zz * denomdt
     738              :          dratdumdd(ir6f54)  = dratdumdd(irfeap) * ratdum(ircogp) * zz &
     739              :                   + ratdum(irfeap) * dratdumdd(ircogp) * zz &
     740         5934 :                   - ratdum(ir6f54) * zz * denomdd
     741              : 
     742         5934 :          ratdum(ir7f54)     = ratdum(irfeap) * ratdum(ircopg) * zz
     743              : 
     744              :          dratdumdy1(ir7f54) = -ratdum(ir7f54) * zz * &
     745         5934 :                               (ratdum(ircopg)+ratdum(ircopa))
     746              :          dratdumdt(ir7f54)  = dratdumdt(irfeap) * ratdum(ircopg) * zz &
     747              :                   + ratdum(irfeap) * dratdumdt(ircopg) * zz &
     748         5934 :                   - ratdum(ir7f54) * zz * denomdt
     749              :          dratdumdd(ir7f54)  = dratdumdd(irfeap) * ratdum(ircopg) * zz &
     750              :                   + ratdum(irfeap) * dratdumdd(ircopg) * zz &
     751         5934 :                   - ratdum(ir7f54) * zz * denomdd
     752              : 
     753         5934 :          ratdum(ir8f54)     = ratdum(irnigp) * ratdum(ircopa) * zz
     754              : 
     755              :          dratdumdy1(ir8f54) = -ratdum(ir8f54) * zz * &
     756         5934 :                               (ratdum(ircopg)+ratdum(ircopa))
     757              :          dratdumdt(ir8f54)  = dratdumdt(irnigp) * ratdum(ircopa) * zz &
     758              :                   + ratdum(irnigp) * dratdumdt(ircopa) * zz &
     759         5934 :                   - ratdum(ir8f54) * zz * denomdt
     760              :          dratdumdd(ir8f54)  = dratdumdd(irnigp) * ratdum(ircopa) * zz &
     761              :                   + ratdum(irnigp) * dratdumdd(ircopa) * zz &
     762         5934 :                   - 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         9106 :          ratdum(iralf1)     = 0.0d0
     772         9106 :          dratdumdy1(iralf1) = 0.0d0
     773         9106 :          dratdumdy2(iralf1) = 0.0d0
     774         9106 :          dratdumdt(iralf1)  = 0.0d0
     775         9106 :          dratdumdd(iralf1)  = 0.0d0
     776              : 
     777         9106 :          ratdum(iralf2)     = 0.0d0
     778         9106 :          dratdumdy1(iralf2) = 0.0d0
     779         9106 :          dratdumdy2(iralf2) = 0.0d0
     780         9106 :          dratdumdt(iralf2)  = 0.0d0
     781         9106 :          dratdumdd(iralf2)  = 0.0d0
     782              : 
     783              :          denom  = ratdum(irhegp)*ratdum(irdgn) + &
     784              :                   y(ineut)*ratdum(irheng)*ratdum(irdgn) + &
     785         9106 :                   y(ineut)*y(iprot)*ratdum(irheng)*ratdum(irdpg)
     786              : 
     787         9106 :          if (denom > tiny_denom .and. btemp > 1.5d9) then
     788              : 
     789              :          denomdt  = dratdumdt(irhegp)*ratdum(irdgn) &
     790              :                   + ratdum(irhegp)*dratdumdt(irdgn) &
     791              :                   +  y(ineut) * (dratdumdt(irheng)*ratdum(irdgn) &
     792              :                               + ratdum(irheng)*dratdumdt(irdgn)) &
     793              :                   +  y(ineut)*y(iprot) * (dratdumdt(irheng)*ratdum(irdpg) &
     794         5934 :                                        + ratdum(irheng)*dratdumdt(irdpg))
     795              : 
     796              :          denomdd  = dratdumdd(irhegp)*ratdum(irdgn) &
     797              :                   + ratdum(irhegp)*dratdumdd(irdgn) &
     798              :                   +  y(ineut) * (dratdumdd(irheng)*ratdum(irdgn) &
     799              :                               + ratdum(irheng)*dratdumdd(irdgn)) &
     800              :                   +  y(ineut)*y(iprot) * (dratdumdd(irheng)*ratdum(irdpg) &
     801         5934 :                                        + ratdum(irheng)*dratdumdd(irdpg))
     802              : 
     803         5934 :          zz = 1.0d0/denom
     804              : 
     805              :          ratdum(iralf1)     = ratdum(irhegn) * ratdum(irhegp)* &
     806         5934 :                               ratdum(irdgn) * zz
     807              :          dratdumdy1(iralf1) = -ratdum(iralf1) * zz * &
     808              :                               (ratdum(irheng)*ratdum(irdgn) + &
     809         5934 :                               y(iprot)*ratdum(irheng)*ratdum(irdpg))
     810              :          dratdumdy2(iralf1) = -ratdum(iralf1) * zz * y(ineut) * &
     811         5934 :                               ratdum(irheng) * ratdum(irdpg)
     812              :          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         5934 :                   - ratdum(iralf1)*zz*denomdt
     817              :          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         5934 :                   - ratdum(iralf1)*zz*denomdd
     822              : 
     823              : 
     824              :          ratdum(iralf2)     = ratdum(irheng)*ratdum(irdpg)* &
     825         5934 :                               ratdum(irhng)*zz
     826              :          dratdumdy1(iralf2) = -ratdum(iralf2) * zz * &
     827              :                               (ratdum(irheng)*ratdum(irdgn) + &
     828         5934 :                                  y(iprot)*ratdum(irheng)*ratdum(irdpg))
     829              : 
     830              : 
     831              :          denom  = ratdum(irhegp)*ratdum(irdgn) + &
     832              :                   y(ineut)*ratdum(irheng)*ratdum(irdgn) + &
     833         5934 :                   y(ineut)*y(iprot)*ratdum(irheng)*ratdum(irdpg)
     834              : 
     835         5934 :          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         5934 :                               ratdum(irheng) * ratdum(irdpg)
     855              :          dratdumdt(iralf2)  = dratdumdt(irheng)*ratdum(irdpg) * &
     856              :                               ratdum(irhng) * zz &
     857              :                   + ratdum(irheng)*dratdumdt(irdpg)*ratdum(irhng)*zz &
     858              :                   + ratdum(irheng)*ratdum(irdpg)*dratdumdt(irhng)*zz &
     859         5934 :                   - ratdum(iralf2)*zz*denomdt
     860              :          dratdumdd(iralf2)  = dratdumdd(irheng)*ratdum(irdpg)* &
     861              :                               ratdum(irhng)*zz &
     862              :                   + ratdum(irheng)*dratdumdd(irdpg)*ratdum(irhng)*zz &
     863              :                   + ratdum(irheng)*ratdum(irdpg)*dratdumdd(irhng)*zz &
     864         5934 :                   - 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         9106 :          if (y(ihe4) > tiny_y) then
     873         9102 :          xx            = 0.896d0/y(ihe4)
     874         9102 :          ratdum(irhe3ag)  = min(ratdum(irhe3ag),xx)
     875         9102 :          if (ratdum(irhe3ag) == xx) then
     876         9100 :          dratdumdy1(irhe3ag) = -xx/y(ihe4)
     877         9100 :          dratdumdt(irhe3ag)  = 0.0d0
     878         9100 :          dratdumdd(irhe3ag)  = 0.0d0
     879              :          else
     880            2 :          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        11726 :          if (y(ih1) > tiny_y) then
     887              : 
     888         2620 :             xx = 5.68d-03/(y(ih1)*1.57d0)
     889         2620 :             ratdum(irnpg) = min(ratdum(irnpg),xx)
     890         2620 :             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         2620 :             dratdumdy1(irnpg) = 0.0d0
     896              :             end if
     897              : 
     898         2620 :             xx = 0.0105d0/y(ih1)
     899         2620 :             ratdum(iropg) = min(ratdum(iropg),xx)
     900         2620 :             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         2620 :             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         9106 :          end subroutine turn_off_reaction
     922              : 
     923              :          end subroutine approx21_special_reactions
     924              : 
     925              : 
     926        21194 :          subroutine approx21_dydt( &
     927        21194 :             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        21194 :          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        21194 :          real(qp) :: a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,&
     942        21194 :             a11,a12,a13,a14,a15,a16,a17,a18,a19,a20
     943       466280 :          real(qp) :: qray(species(plus_co56))
     944              : 
     945              :          logical :: okay
     946              : 
     947              :          include 'formats'
     948              : 
     949        21194 :          ierr = 0
     950              : 
     951              :          ! Turn on special fe56ec rate above some temperature
     952        21194 :          fe56ec_fake_factor = 0d0
     953        21194 :          if(.not.deriva) then
     954        21194 :             fe56ec_fake_factor = eval_fe56ec_fake_factor(fe56ec_fake_factor_in, min_T, temp)
     955              :          end if
     956              : 
     957       466280 :          dydt(1:species(plus_co56)) = 0.0d0
     958       466280 :          qray(1:species(plus_co56)) = 0.0_qp
     959              : 
     960              :    ! hydrogen reactions
     961        21194 :          a1 = -1.5d0 * y(ih1) * y(ih1) * rate(irpp)
     962        21194 :          a2 =  y(ihe3) * y(ihe3) * rate(ir33)
     963        21194 :          a3 = -y(ihe3) * y(ihe4) * rate(irhe3ag)
     964        21194 :          a4 = -2.0d0 * y(ic12) * y(ih1) * rate(ircpg)
     965        21194 :          a5 = -2.0d0 * y(in14) * y(ih1) * rate(irnpg)
     966        21194 :          a6 = -2.0d0 * y(io16) * y(ih1) * rate(iropg)
     967        21194 :          a7 = -3.0d0 * y(ih1) * rate(irpen)
     968              : 
     969        21194 :          qray(ih1) = qray(ih1) + a1 + a2 + a3 + a4 + a5 + a6 + a7
     970              : 
     971              :    ! he3 reactions
     972              : 
     973        21194 :          a1  =  0.5d0 * y(ih1) * y(ih1) * rate(irpp)
     974        21194 :          a2  = -y(ihe3) * y(ihe3) * rate(ir33)
     975        21194 :          a3  = -y(ihe3) * y(ihe4) * rate(irhe3ag)
     976        21194 :          a4  =  y(ih1) * rate(irpen)
     977              : 
     978        21194 :          qray(ihe3) = qray(ihe3) + a1 + a2 + a3 + a4
     979              : 
     980              : 
     981              :    ! he4 reactions
     982              :    ! heavy ion reactions
     983        21194 :          a1  = 0.5d0 * y(ic12) * y(ic12) * rate(ir1212)
     984        21194 :          a2  = 0.5d0 * y(ic12) * y(io16) * rate(ir1216)
     985        21194 :          a3  = 0.56d0 * 0.5d0 * y(io16) * y(io16) * rate(ir1616)
     986        21194 :          a4 = -y(ihe4) * y(in14) * rate(irnag) * 1.5d0  ! n14 + 1.5 alpha => ne20
     987        21194 :          qray(ihe4) =  qray(ihe4) + a1 + a2 + a3 + a4
     988              : 
     989              : 
     990              :    ! (a,g) and (g,a) reactions
     991              : 
     992        21194 :          a1  = -0.5d0 * y(ihe4) * y(ihe4) * y(ihe4) * rate(ir3a)
     993        21194 :          a2  =  3.0d0 * y(ic12) * rate(irg3a)
     994        21194 :          a3  = -y(ihe4) * y(ic12) * rate(ircag)
     995        21194 :          a4  =  y(io16) * rate(iroga)
     996        21194 :          a5  = -y(ihe4) * y(io16) * rate(iroag)
     997        21194 :          a6  =  y(ine20) * rate(irnega)
     998        21194 :          a7  = -y(ihe4) * y(ine20) * rate(irneag)
     999        21194 :          a8  =  y(img24) * rate(irmgga)
    1000        21194 :          a9  = -y(ihe4) * y(img24)* rate(irmgag)
    1001        21194 :          a10 =  y(isi28) * rate(irsiga)
    1002        21194 :          a11 = -y(ihe4) * y(isi28)*rate(irsiag)
    1003        21194 :          a12 =  y(is32) * rate(irsga)
    1004              : 
    1005              :          qray(ihe4) =  qray(ihe4) + &
    1006        21194 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12
    1007              : 
    1008        21194 :          a1  = -y(ihe4) * y(is32) * rate(irsag)
    1009        21194 :          a2  =  y(iar36) * rate(irarga)
    1010        21194 :          a3  = -y(ihe4) * y(iar36)*rate(irarag)
    1011        21194 :          a4  =  y(ica40) * rate(ircaga)
    1012        21194 :          a5  = -y(ihe4) * y(ica40)*rate(ircaag)
    1013        21194 :          a6  =  y(iti44) * rate(irtiga)
    1014        21194 :          a7  = -y(ihe4) * y(iti44)*rate(irtiag)
    1015        21194 :          a8  =  y(icr48) * rate(ircrga)
    1016        21194 :          a9  = -y(ihe4) * y(icr48)*rate(ircrag)
    1017        21194 :          a10 =  y(ife52) * rate(irfega)
    1018        21194 :          a11 = -y(ihe4) * y(ife52) * rate(irfeag)
    1019        21194 :          a12 =  y(ini56) * rate(irniga)
    1020              : 
    1021              :          qray(ihe4) =  qray(ihe4) + &
    1022        21194 :             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        21194 :          if (.not.deriva) then
    1028         9106 :          a1  =  0.34d0*0.5d0*y(io16)*y(io16)*rate(irs1)*rate(ir1616)
    1029         9106 :          a2  = -y(ihe4) * y(img24) * rate(irmgap)*(1.0d0-rate(irr1))
    1030         9106 :          a3  =  y(isi28) * rate(irsigp) * rate(irr1)
    1031         9106 :          a4  = -y(ihe4) * y(isi28) * rate(irsiap)*(1.0d0-rate(irs1))
    1032         9106 :          a5  =  y(is32) * rate(irsgp) * rate(irs1)
    1033         9106 :          a6  = -y(ihe4) * y(is32) * rate(irsap)*(1.0d0-rate(irt1))
    1034         9106 :          a7  =  y(iar36) * rate(irargp) * rate(irt1)
    1035         9106 :          a8  = -y(ihe4) * y(iar36) * rate(irarap)*(1.0d0-rate(iru1))
    1036         9106 :          a9  =  y(ica40) * rate(ircagp) * rate(iru1)
    1037         9106 :          a10 = -y(ihe4) * y(ica40) * rate(ircaap)*(1.0d0-rate(irv1))
    1038         9106 :          a11 =  y(iti44) * rate(irtigp) * rate(irv1)
    1039         9106 :          a12 = -y(ihe4) * y(iti44) * rate(irtiap)*(1.0d0-rate(irw1))
    1040         9106 :          a13 =  y(icr48) * rate(ircrgp) * rate(irw1)
    1041         9106 :          a14 = -y(ihe4) * y(icr48) * rate(ircrap)*(1.0d0-rate(irx1))
    1042         9106 :          a15 =  y(ife52) * rate(irfegp) * rate(irx1)
    1043              : 
    1044              :          qray(ihe4) = qray(ihe4) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + &
    1045         9106 :             a8 + a9 + a10 + a11 + a12 + a13 + a14 + a15
    1046              : 
    1047              :          else
    1048        12088 :          a1  =  0.34d0*0.5d0*y(io16)*y(io16) * ratdum(irs1)*rate(ir1616)
    1049        12088 :          a2  =  0.34d0*0.5d0*y(io16)*y(io16) * rate(irs1) * ratdum(ir1616)
    1050        12088 :          a3  = -y(ihe4)*y(img24) * rate(irmgap)*(1.0d0 - ratdum(irr1))
    1051        12088 :          a4  =  y(ihe4)*y(img24) * ratdum(irmgap)*rate(irr1)
    1052        12088 :          a5  =  y(isi28) * ratdum(irsigp) * rate(irr1)
    1053        12088 :          a6  =  y(isi28) * rate(irsigp) * ratdum(irr1)
    1054        12088 :          a7  = -y(ihe4)*y(isi28) * rate(irsiap)*(1.0d0 - ratdum(irs1))
    1055        12088 :          a8  =  y(ihe4)*y(isi28) * ratdum(irsiap) * rate(irs1)
    1056        12088 :          a9  =  y(is32) * ratdum(irsgp) * rate(irs1)
    1057        12088 :          a10 =  y(is32) * rate(irsgp) * ratdum(irs1)
    1058              : 
    1059        12088 :          qray(ihe4) =  qray(ihe4) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
    1060              : 
    1061        12088 :          a1  = -y(ihe4)*y(is32) * rate(irsap)*(1.0d0 - ratdum(irt1))
    1062        12088 :          a2  =  y(ihe4)*y(is32) * ratdum(irsap)*rate(irt1)
    1063        12088 :          a3  =  y(iar36) * ratdum(irargp) * rate(irt1)
    1064        12088 :          a4  =  y(iar36) * rate(irargp) * ratdum(irt1)
    1065        12088 :          a5  = -y(ihe4)*y(iar36) * rate(irarap)*(1.0d0 - ratdum(iru1))
    1066        12088 :          a6  =  y(ihe4)*y(iar36) * ratdum(irarap)*rate(iru1)
    1067        12088 :          a7  =  y(ica40) * ratdum(ircagp) * rate(iru1)
    1068        12088 :          a8  =  y(ica40) * rate(ircagp) * ratdum(iru1)
    1069        12088 :          a9  = -y(ihe4)*y(ica40) * rate(ircaap)*(1.0d0-ratdum (irv1))
    1070        12088 :          a10 =  y(ihe4)*y(ica40) * ratdum(ircaap)*rate(irv1)
    1071        12088 :          a11 =  y(iti44) * ratdum(irtigp) * rate(irv1)
    1072        12088 :          a12 =  y(iti44) * rate(irtigp) * ratdum(irv1)
    1073              : 
    1074              :          qray(ihe4) =  qray(ihe4) + &
    1075        12088 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12
    1076              : 
    1077        12088 :          a1  = -y(ihe4)*y(iti44) * rate(irtiap)*(1.0d0 - ratdum(irw1))
    1078        12088 :          a2  =  y(ihe4)*y(iti44) * ratdum(irtiap)*rate(irw1)
    1079        12088 :          a3  =  y(icr48) * ratdum(ircrgp) * rate(irw1)
    1080        12088 :          a4  =  y(icr48) * rate(ircrgp) * ratdum(irw1)
    1081        12088 :          a5  = -y(ihe4)*y(icr48) * rate(ircrap)*(1.0d0 - ratdum(irx1))
    1082        12088 :          a6  =  y(ihe4)*y(icr48) * ratdum(ircrap)*rate(irx1)
    1083        12088 :          a7  =  y(ife52) * ratdum(irfegp) * rate(irx1)
    1084        12088 :          a8  =  y(ife52) * rate(irfegp) * ratdum(irx1)
    1085              : 
    1086        12088 :          qray(ihe4) = qray(ihe4) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1087              :          end if
    1088              : 
    1089              : 
    1090              :    ! photodisintegration reactions
    1091        21194 :          a1 =  y(ife54) * y(iprot) * y(iprot) * rate(ir5f54)
    1092        21194 :          a2 = -y(ife52) * y(ihe4) * rate(ir6f54)
    1093        21194 :          a3 = -y(ife52) * y(ihe4) * y(iprot) * rate(ir7f54)
    1094        21194 :          a4 =  y(ini56) * y(iprot) * rate(ir8f54)
    1095        21194 :          a5 = -y(ihe4) * rate(iralf1)
    1096        21194 :          a6 =  y(ineut)*y(ineut) * y(iprot)*y(iprot) * rate(iralf2)
    1097        21194 :          a7 =  y(ife56) * y(iprot) * y(iprot) * rate(irfe56_aux3)
    1098        21194 :          a8 = -y(ife54) * y(ihe4) * rate(irfe56_aux4)
    1099              : 
    1100        21194 :          qray(ihe4) =  qray(ihe4) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1101              : 
    1102              : 
    1103              :    ! ppchain
    1104        21194 :          a1 = 0.5d0 * y(ihe3) * y(ihe3) * rate(ir33)
    1105        21194 :          a2 = y(ihe3) * y(ihe4) * rate(irhe3ag)
    1106              : 
    1107        21194 :          qray(ihe4) =  qray(ihe4) + a1 + a2
    1108              : 
    1109              : 
    1110              :    ! cno cycles
    1111        21194 :          a1 = y(io16) * y(ih1) * rate(iropg)
    1112              : 
    1113        21194 :          qray(ihe4) =  qray(ihe4) + a1 + a2
    1114              : 
    1115        21194 :          if (.not. deriva) then
    1116         9106 :             a1 = y(in14) * y(ih1) * rate(ifa) * rate(irnpg)
    1117         9106 :             qray(ihe4) =  qray(ihe4) + a1
    1118              :          else
    1119        12088 :             a1 = y(in14) * y(ih1) * rate(ifa) * ratdum(irnpg)
    1120        12088 :             a2 = y(in14) * y(ih1) * ratdum(ifa) * rate(irnpg)
    1121        12088 :             qray(ihe4) =  qray(ihe4) + a1 + a2
    1122              :          end if
    1123              : 
    1124              : 
    1125              :    ! c12 reactions
    1126        21194 :          a1 = -y(ic12) * y(ic12) * rate(ir1212)
    1127        21194 :          a2 = -y(ic12) * y(io16) * rate(ir1216)
    1128        21194 :          a3 =  (1d0/6d0) * y(ihe4) * y(ihe4) * y(ihe4) * rate(ir3a)
    1129        21194 :          a4 = -y(ic12) * rate(irg3a)
    1130        21194 :          a5 = -y(ic12) * y(ihe4) * rate(ircag)
    1131        21194 :          a6 =  y(io16) * rate(iroga)
    1132        21194 :          a7 = -y(ic12) * y(ih1) * rate(ircpg)
    1133              : 
    1134        21194 :          qray(ic12) =  qray(ic12) + a1 + a2 + a3 + a4 + a5 + a6 + a7
    1135              : 
    1136        21194 :          if (.not. deriva) then
    1137         9106 :             a1 =  y(in14) * y(ih1) * rate(ifa) * rate(irnpg)
    1138         9106 :             qray(ic12) =  qray(ic12) + a1
    1139              :          else
    1140        12088 :             a1 =  y(in14) * y(ih1) * rate(ifa) * ratdum(irnpg)
    1141        12088 :             a2 =  y(in14) * y(ih1) * ratdum(ifa) * rate(irnpg)
    1142        12088 :             qray(ic12) =  qray(ic12) + a1 + a2
    1143              :          end if
    1144              : 
    1145              : 
    1146              :    ! n14 reactions
    1147        21194 :          a1 =  y(ic12) * y(ih1) * rate(ircpg)
    1148        21194 :          a2 = -y(in14) * y(ih1) * rate(irnpg)
    1149        21194 :          a3 =  y(io16) * y(ih1) * rate(iropg)
    1150        21194 :          a4 = -y(ihe4) * y(in14) * rate(irnag)  ! n14 + 1.5 alpha => ne20
    1151              : 
    1152        21194 :          qray(in14) =  qray(in14) + a1 + a2 + a3 + a4
    1153              : 
    1154              : 
    1155              :    ! o16 reactions
    1156        21194 :          a1 = -y(ic12) * y(io16) * rate(ir1216)
    1157        21194 :          a2 = -y(io16) * y(io16) * rate(ir1616)
    1158        21194 :          a3 =  y(ic12) * y(ihe4) * rate(ircag)
    1159        21194 :          a4 = -y(io16) * y(ihe4) * rate(iroag)
    1160        21194 :          a5 = -y(io16) * rate(iroga)
    1161        21194 :          a6 =  y(ine20) * rate(irnega)
    1162        21194 :          a7 = -y(io16) * y(ih1) * rate(iropg)
    1163              : 
    1164        21194 :          qray(io16) =  qray(io16) + a1 + a2 + a3 + a4 + a5 + a6 + a7
    1165              : 
    1166        21194 :          if (.not. deriva) then
    1167         9106 :             a1 =  y(in14) * y(ih1) * rate(ifg) * rate(irnpg)
    1168         9106 :             qray(io16) =  qray(io16) + a1
    1169              :          else
    1170        12088 :             a1 =  y(in14) * y(ih1) * rate(ifg) * ratdum(irnpg)
    1171        12088 :             a2 =  y(in14) * y(ih1) * ratdum(ifg) * rate(irnpg)
    1172        12088 :             qray(io16) =  qray(io16) + a1 + a2
    1173              :          end if
    1174              : 
    1175              : 
    1176              :    ! ne20 reactions
    1177        21194 :          a1 =  0.5d0 * y(ic12) * y(ic12) * rate(ir1212)
    1178        21194 :          a2 =  y(io16) * y(ihe4) * rate(iroag)
    1179        21194 :          a3 = -y(ine20) * y(ihe4) * rate(irneag)
    1180        21194 :          a4 = -y(ine20) * rate(irnega)
    1181        21194 :          a5 =  y(img24) * rate(irmgga)
    1182        21194 :          a6 =  y(in14) * y(ihe4) * rate(irnag)  ! n14 + 1.5 alpha => ne20
    1183              : 
    1184        21194 :          qray(ine20) =  qray(ine20) + a1 + a2 + a3 + a4 + a5 + a6
    1185              : 
    1186              : 
    1187              :    ! mg24 reactions
    1188        21194 :          a1 =  0.5d0 * y(ic12) * y(io16) * rate(ir1216)
    1189        21194 :          a2 =  y(ine20) * y(ihe4) * rate(irneag)
    1190        21194 :          a3 = -y(img24) * y(ihe4) * rate(irmgag)
    1191        21194 :          a4 = -y(img24) * rate(irmgga)
    1192        21194 :          a5 =  y(isi28) * rate(irsiga)
    1193              : 
    1194        21194 :          qray(img24) =  qray(img24) + a1 + a2 + a3 + a4 + a5
    1195              : 
    1196        21194 :          if (.not.deriva) then
    1197         9106 :          a1 = -y(img24) * y(ihe4) * rate(irmgap)*(1.0d0-rate(irr1))
    1198         9106 :          a2 =  y(isi28) * rate(irr1) * rate(irsigp)
    1199              : 
    1200         9106 :          qray(img24) =  qray(img24) + a1 + a2
    1201              : 
    1202              :          else
    1203        12088 :          a1 = -y(img24)*y(ihe4) * rate(irmgap)*(1.0d0 - ratdum(irr1))
    1204        12088 :          a2 =  y(img24)*y(ihe4) * ratdum(irmgap)*rate(irr1)
    1205        12088 :          a3 =  y(isi28) * ratdum(irr1) * rate(irsigp)
    1206        12088 :          a4 =  y(isi28) * rate(irr1) * ratdum(irsigp)
    1207              : 
    1208        12088 :          qray(img24) =  qray(img24) + a1 + a2 + a3 + a4
    1209              :          end if
    1210              : 
    1211              : 
    1212              :    ! si28 reactions
    1213        21194 :          a1 =  0.5d0 * y(ic12) * y(io16) * rate(ir1216)
    1214        21194 :          a2 =  0.56d0 * 0.5d0*y(io16) * y(io16) * rate(ir1616)
    1215        21194 :          a3 =  y(img24) * y(ihe4) * rate(irmgag)
    1216        21194 :          a4 = -y(isi28) * y(ihe4) * rate(irsiag)
    1217        21194 :          a5 = -y(isi28) * rate(irsiga)
    1218        21194 :          a6 =  y(is32) * rate(irsga)
    1219              : 
    1220        21194 :          qray(isi28) =  qray(isi28) + a1 + a2 + a3 + a4 + a5 + a6
    1221              : 
    1222        21194 :          if (.not.deriva) then
    1223              : 
    1224         9106 :          a1 =  0.34d0*0.5d0*y(io16)*y(io16)*rate(irs1)*rate(ir1616)
    1225         9106 :          a2 =  y(img24) * y(ihe4) * rate(irmgap)*(1.0d0-rate(irr1))
    1226         9106 :          a3 = -y(isi28) * rate(irr1) * rate(irsigp)
    1227         9106 :          a4 = -y(isi28) * y(ihe4) * rate(irsiap)*(1.0d0-rate(irs1))
    1228         9106 :          a5 =  y(is32) * rate(irs1) * rate(irsgp)
    1229              : 
    1230         9106 :          qray(isi28) =  qray(isi28) + a1 + a2 + a3 + a4 + a5
    1231              : 
    1232              :          else
    1233        12088 :          a1  =  0.34d0*0.5d0*y(io16)*y(io16) * ratdum(irs1)*rate(ir1616)
    1234        12088 :          a2  =  0.34d0*0.5d0*y(io16)*y(io16) * rate(irs1)*ratdum(ir1616)
    1235        12088 :          a3  =  y(img24)*y(ihe4) * rate(irmgap)*(1.0d0 - ratdum(irr1))
    1236        12088 :          a4  = -y(img24)*y(ihe4) * ratdum(irmgap)*rate(irr1)
    1237        12088 :          a5  = -y(isi28) * ratdum(irr1) * rate(irsigp)
    1238        12088 :          a6  = -y(isi28) * rate(irr1) * ratdum(irsigp)
    1239        12088 :          a7  = -y(isi28)*y(ihe4) * rate(irsiap)*(1.0d0 - ratdum(irs1))
    1240        12088 :          a8  =  y(isi28)*y(ihe4) * ratdum(irsiap)*rate(irs1)
    1241        12088 :          a9  = y(is32) * ratdum(irs1) * rate(irsgp)
    1242        12088 :          a10 = y(is32) * rate(irs1) * ratdum(irsgp)
    1243              : 
    1244              :          qray(isi28) =  qray(isi28) + &
    1245        12088 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
    1246              :          end if
    1247              : 
    1248              : 
    1249              :    ! s32 reactions
    1250        21194 :          a1 =  0.1d0 * 0.5d0*y(io16) * y(io16) * rate(ir1616)
    1251        21194 :          a2 =  y(isi28) * y(ihe4) * rate(irsiag)
    1252        21194 :          a3 = -y(is32) * y(ihe4) * rate(irsag)
    1253        21194 :          a4 = -y(is32) * rate(irsga)
    1254        21194 :          a5 =  y(iar36) * rate(irarga)
    1255              : 
    1256        21194 :          qray(is32) =  qray(is32) + a1 + a2 + a3 + a4 + a5
    1257              : 
    1258        21194 :          if (.not.deriva) then
    1259              : 
    1260         9106 :          a1 =  0.34d0*0.5d0*y(io16)*y(io16)* rate(ir1616)*(1.0d0-rate(irs1))
    1261         9106 :          a2 =  y(isi28) * y(ihe4) * rate(irsiap)*(1.0d0-rate(irs1))
    1262         9106 :          a3 = -y(is32) * rate(irs1) * rate(irsgp)
    1263         9106 :          a4 = -y(is32) * y(ihe4) * rate(irsap)*(1.0d0-rate(irt1))
    1264         9106 :          a5 =  y(iar36) * rate(irt1) * rate(irargp)
    1265              : 
    1266         9106 :          qray(is32) =  qray(is32) + a1 + a2 + a3 + a4 + a5
    1267              : 
    1268              :          else
    1269        12088 :          a1  =  0.34d0*0.5d0*y(io16)*y(io16) * rate(ir1616)*(1.0d0-ratdum(irs1))
    1270        12088 :          a2  = -0.34d0*0.5d0*y(io16)*y(io16) * ratdum(ir1616)*rate(irs1)
    1271        12088 :          a3  =  y(isi28)*y(ihe4) * rate(irsiap)*(1.0d0-ratdum(irs1))
    1272        12088 :          a4  = -y(isi28)*y(ihe4) * ratdum(irsiap)*rate(irs1)
    1273        12088 :          a5  = -y(is32) * ratdum(irs1) * rate(irsgp)
    1274        12088 :          a6  = -y(is32) * rate(irs1) * ratdum(irsgp)
    1275        12088 :          a7  = -y(is32)*y(ihe4) * rate(irsap)*(1.0d0-ratdum(irt1))
    1276        12088 :          a8  =  y(is32)*y(ihe4) * ratdum(irsap)*rate(irt1)
    1277        12088 :          a9  =  y(iar36) * ratdum(irt1) * rate(irargp)
    1278        12088 :          a10 =  y(iar36) * rate(irt1) * ratdum(irargp)
    1279              : 
    1280              :          qray(is32) =  qray(is32) + &
    1281        12088 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
    1282              :          end if
    1283              : 
    1284              : 
    1285              :    ! ar36 reactions
    1286        21194 :          a1 =  y(is32) * y(ihe4) * rate(irsag)
    1287        21194 :          a2 = -y(iar36) * y(ihe4) * rate(irarag)
    1288        21194 :          a3 = -y(iar36) * rate(irarga)
    1289        21194 :          a4 =  y(ica40) * rate(ircaga)
    1290              : 
    1291        21194 :          qray(iar36) =  qray(iar36) + a1 + a2 + a3 + a4
    1292              : 
    1293        21194 :          if (.not.deriva) then
    1294         9106 :          a1 = y(is32) * y(ihe4) * rate(irsap)*(1.0d0-rate(irt1))
    1295         9106 :          a2 = -y(iar36) * rate(irt1) * rate(irargp)
    1296         9106 :          a3 = -y(iar36) * y(ihe4) * rate(irarap)*(1.0d0-rate(iru1))
    1297         9106 :          a4 =  y(ica40) * rate(ircagp) * rate(iru1)
    1298              : 
    1299         9106 :          qray(iar36) =  qray(iar36) + a1 + a2 + a3 + a4
    1300              : 
    1301              :          else
    1302        12088 :          a1 =  y(is32)*y(ihe4) * rate(irsap)*(1.0d0 - ratdum(irt1))
    1303        12088 :          a2 = -y(is32)*y(ihe4) * ratdum(irsap)*rate(irt1)
    1304        12088 :          a3 = -y(iar36) * ratdum(irt1) * rate(irargp)
    1305        12088 :          a4 = -y(iar36) * rate(irt1) * ratdum(irargp)
    1306        12088 :          a5 = -y(iar36)*y(ihe4) * rate(irarap)*(1.0d0-ratdum(iru1))
    1307        12088 :          a6 =  y(iar36)*y(ihe4) * ratdum(irarap)*rate(iru1)
    1308        12088 :          a7 =  y(ica40) * ratdum(ircagp) * rate(iru1)
    1309        12088 :          a8 =  y(ica40) * rate(ircagp) * ratdum(iru1)
    1310              : 
    1311        12088 :          qray(iar36) =  qray(iar36) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1312              :          end if
    1313              : 
    1314              : 
    1315              :    ! ca40 reactions
    1316        21194 :          a1 =  y(iar36) * y(ihe4) * rate(irarag)
    1317        21194 :          a2 = -y(ica40) * y(ihe4) * rate(ircaag)
    1318        21194 :          a3 = -y(ica40) * rate(ircaga)
    1319        21194 :          a4 =  y(iti44) * rate(irtiga)
    1320              : 
    1321        21194 :          qray(ica40) =  qray(ica40) + a1 + a2 + a3 + a4
    1322              : 
    1323        21194 :          if (.not.deriva) then
    1324              : 
    1325         9106 :          a1 =  y(iar36) * y(ihe4) * rate(irarap)*(1.0d0-rate(iru1))
    1326         9106 :          a2 = -y(ica40) * rate(ircagp) * rate(iru1)
    1327         9106 :          a3 = -y(ica40) * y(ihe4) * rate(ircaap)*(1.0d0-rate(irv1))
    1328         9106 :          a4 =  y(iti44) * rate(irtigp) * rate(irv1)
    1329              : 
    1330         9106 :          qray(ica40) =  qray(ica40) + a1 + a2 + a3 + a4
    1331              : 
    1332              :          else
    1333        12088 :          a1 =  y(iar36)*y(ihe4) * rate(irarap)*(1.0d0-ratdum(iru1))
    1334        12088 :          a2 = -y(iar36)*y(ihe4) * ratdum(irarap)*rate(iru1)
    1335        12088 :          a3 = -y(ica40) * ratdum(ircagp) * rate(iru1)
    1336        12088 :          a4 = -y(ica40) * rate(ircagp) * ratdum(iru1)
    1337        12088 :          a5 = -y(ica40)*y(ihe4) * rate(ircaap)*(1.0d0-ratdum(irv1))
    1338        12088 :          a6 =  y(ica40)*y(ihe4) * ratdum(ircaap)*rate(irv1)
    1339        12088 :          a7 =  y(iti44) * ratdum(irtigp) * rate(irv1)
    1340        12088 :          a8 =  y(iti44) * rate(irtigp) * ratdum(irv1)
    1341              : 
    1342        12088 :          qray(ica40) =  qray(ica40) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1343              :          end if
    1344              : 
    1345              : 
    1346              :    ! ti44 reactions
    1347        21194 :          a1 =  y(ica40) * y(ihe4) * rate(ircaag)
    1348        21194 :          a2 = -y(iti44) * y(ihe4) * rate(irtiag)
    1349        21194 :          a3 = -y(iti44) * rate(irtiga)
    1350        21194 :          a4 =  y(icr48) * rate(ircrga)
    1351              : 
    1352        21194 :          qray(iti44) =  qray(iti44) + a1 + a2 + a3 + a4
    1353              : 
    1354        21194 :          if (.not.deriva) then
    1355         9106 :          a1 =  y(ica40) * y(ihe4) * rate(ircaap)*(1.0d0-rate(irv1))
    1356         9106 :          a2 = -y(iti44) * rate(irv1) * rate(irtigp)
    1357         9106 :          a3 = -y(iti44) * y(ihe4) * rate(irtiap)*(1.0d0-rate(irw1))
    1358         9106 :          a4 =  y(icr48) * rate(irw1) * rate(ircrgp)
    1359              : 
    1360         9106 :          qray(iti44) =  qray(iti44) + a1 + a2 + a3 + a4
    1361              : 
    1362              :          else
    1363        12088 :          a1 =  y(ica40)*y(ihe4) * rate(ircaap)*(1.0d0-ratdum(irv1))
    1364        12088 :          a2 = -y(ica40)*y(ihe4) * ratdum(ircaap)*rate(irv1)
    1365        12088 :          a3 = -y(iti44) * ratdum(irv1) * rate(irtigp)
    1366        12088 :          a4 = -y(iti44) * rate(irv1) * ratdum(irtigp)
    1367        12088 :          a5 = -y(iti44)*y(ihe4) * rate(irtiap)*(1.0d0-ratdum(irw1))
    1368        12088 :          a6 =  y(iti44)*y(ihe4) * ratdum(irtiap)*rate(irw1)
    1369        12088 :          a7 =  y(icr48) * ratdum(irw1) * rate(ircrgp)
    1370        12088 :          a8 =  y(icr48) * rate(irw1) * ratdum(ircrgp)
    1371              : 
    1372        12088 :          qray(iti44) =  qray(iti44) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1373              :          end if
    1374              : 
    1375              : 
    1376              :    ! cr48 reactions
    1377        21194 :          a1 =  y(iti44) * y(ihe4) * rate(irtiag)
    1378        21194 :          a2 = -y(icr48) * y(ihe4) * rate(ircrag)
    1379        21194 :          a3 = -y(icr48) * rate(ircrga)
    1380        21194 :          a4 =  y(ife52) * rate(irfega)
    1381              : 
    1382        21194 :          qray(icr48) =  qray(icr48) + a1 + a2 + a3 + a4
    1383              : 
    1384        21194 :          if (.not.deriva) then
    1385         9106 :          a1 =  y(iti44) * y(ihe4) * rate(irtiap)*(1.0d0-rate(irw1))
    1386         9106 :          a2 = -y(icr48) * rate(irw1) * rate(ircrgp)
    1387         9106 :          a3 = -y(icr48) * y(ihe4) * rate(ircrap)*(1.0d0-rate(irx1))
    1388         9106 :          a4 =  y(ife52) * rate(irx1) * rate(irfegp)
    1389              : 
    1390         9106 :          qray(icr48) =  qray(icr48) + a1 + a2 + a3 + a4
    1391              : 
    1392              :          else
    1393        12088 :          a1 =  y(iti44)*y(ihe4) * rate(irtiap)*(1.0d0-ratdum(irw1))
    1394        12088 :          a2 = -y(iti44)*y(ihe4) * ratdum(irtiap)*rate(irw1)
    1395        12088 :          a3 = -y(icr48) * ratdum(irw1) * rate(ircrgp)
    1396        12088 :          a4 = -y(icr48) * rate(irw1) * ratdum(ircrgp)
    1397        12088 :          a5 = -y(icr48)*y(ihe4) * rate(ircrap)*(1.0d0-ratdum(irx1))
    1398        12088 :          a6 =  y(icr48)*y(ihe4) * ratdum(ircrap)*rate(irx1)
    1399        12088 :          a7 =  y(ife52) * ratdum(irx1) * rate(irfegp)
    1400        12088 :          a8 =  y(ife52) * rate(irx1) * ratdum(irfegp)
    1401              : 
    1402        12088 :          qray(icr48) =  qray(icr48) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
    1403              :          end if
    1404              : 
    1405              : 
    1406              :    ! crx reactions
    1407        21194 :          a1 = y(ife56) * fe56ec_fake_factor * rate(irn56ec)
    1408              : 
    1409        21194 :          qray(icrx) = qray(icrx) + a1
    1410              : 
    1411              :    ! fe52 reactions
    1412        21194 :          a1 =  y(icr48) * y(ihe4) * rate(ircrag)
    1413        21194 :          a2 = -y(ife52) * y(ihe4) * rate(irfeag)
    1414        21194 :          a3 = -y(ife52) * rate(irfega)
    1415        21194 :          a4 =  y(ini56) * rate(irniga)
    1416              : 
    1417        21194 :          qray(ife52) =  qray(ife52) + a1 + a2 + a3 + a4
    1418              : 
    1419        21194 :          if (.not.deriva) then
    1420         9106 :          a1 =  y(icr48) * y(ihe4) * rate(ircrap)*(1.0d0-rate(irx1))
    1421         9106 :          a2 = -y(ife52) * rate(irx1) * rate(irfegp)
    1422              : 
    1423         9106 :          qray(ife52) =  qray(ife52) + a1 + a2
    1424              : 
    1425              :          else
    1426        12088 :          a1 =  y(icr48)*y(ihe4) * rate(ircrap)*(1.0d0-ratdum(irx1))
    1427        12088 :          a2 = -y(icr48)*y(ihe4) * ratdum(ircrap)*rate(irx1)
    1428        12088 :          a3 = -y(ife52) * ratdum(irx1) * rate(irfegp)
    1429        12088 :          a4 = -y(ife52) * rate(irx1) * ratdum(irfegp)
    1430              : 
    1431        12088 :          qray(ife52) =  qray(ife52) + a1 + a2 + a3 + a4
    1432              :          end if
    1433              : 
    1434        21194 :          a1 =  y(ife54) * rate(ir1f54)
    1435        21194 :          a2 = -y(ife52) * y(ineut) * y(ineut) * rate(ir2f54)
    1436        21194 :          a3 =  y(ife54) * y(iprot) * y(iprot) * rate(ir5f54)
    1437        21194 :          a4 = -y(ife52) * y(ihe4) * rate(ir6f54)
    1438        21194 :          a5 = -y(ife52) * y(ihe4) * y(iprot) * rate(ir7f54)
    1439        21194 :          a6 =  y(ini56) * y(iprot) * rate(ir8f54)
    1440              : 
    1441        21194 :          qray(ife52) =  qray(ife52) + a1 + a2 + a3 + a4 + a5 + a6
    1442              : 
    1443              : 
    1444              :    ! fe54 reactions
    1445        21194 :          a1  = -y(ife54) * rate(ir1f54)
    1446        21194 :          a2  =  y(ife52) * y(ineut) * y(ineut) * rate(ir2f54)
    1447        21194 :          a3  = -y(ife54) * y(iprot) * y(iprot) * rate(ir3f54)
    1448        21194 :          a4  =  y(ini56) * rate(ir4f54)
    1449        21194 :          a5  = -y(ife54) * y(iprot) * y(iprot) * rate(ir5f54)
    1450        21194 :          a6  =  y(ife52) * y(ihe4) * rate(ir6f54)
    1451        21194 :          a7  =  y(ife56) * rate(irfe56_aux1)
    1452        21194 :          a8  = -y(ife54) * y(ineut) * y(ineut) * rate(irfe56_aux2)
    1453        21194 :          a9  =  y(ife56) * y(iprot) * y(iprot) * rate(irfe56_aux3)
    1454        21194 :          a10 = -y(ife54) * y(ihe4) * rate(irfe56_aux4)
    1455              : 
    1456              :          qray(ife54) =  qray(ife54) + &
    1457        21194 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
    1458              : 
    1459              : 
    1460              :    ! fe56 reactions
    1461        21194 :          if (plus_co56) then
    1462           12 :             a1 =  y(ico56) * rate(irco56ec)
    1463              :          else
    1464        21182 :             a1 =  y(ini56) * rate(irn56ec)
    1465              :          end if
    1466        21194 :          a2 = -y(ife56) * fe56ec_fake_factor * rate(irn56ec)
    1467        21194 :          a3 = -y(ife56) * rate(irfe56_aux1)
    1468        21194 :          a4 =  y(ife54) * y(ineut) * y(ineut) * rate(irfe56_aux2)
    1469        21194 :          a5 = -y(ife56) * y(iprot) * y(iprot) * rate(irfe56_aux3)
    1470        21194 :          a6 =  y(ife54) * y(ihe4) * rate(irfe56_aux4)
    1471              : 
    1472        21194 :          qray(ife56) =  qray(ife56) + a1 + a2 + a3 + a4 + a5 + a6
    1473              : 
    1474        21194 :          if (plus_co56) then
    1475              :       ! co56 reactions
    1476           12 :             a1 =  y(ini56) * rate(irn56ec)
    1477           12 :             a2 = -y(ico56) * rate(irco56ec)
    1478              : 
    1479           12 :             qray(ico56) =  qray(ico56) + a1 + a2
    1480              :          end if
    1481              : 
    1482              :    ! ni56 reactions
    1483        21194 :          a1 =  y(ife52) * y(ihe4) * rate(irfeag)
    1484        21194 :          a2 = -y(ini56) * rate(irniga)
    1485        21194 :          a3 = -y(ini56) * rate(irn56ec)
    1486              : 
    1487        21194 :          qray(ini56) =  qray(ini56) + a1 + a2 + a3
    1488              : 
    1489        21194 :          a1 =  y(ife54) * y(iprot) * y(iprot) * rate(ir3f54)
    1490        21194 :          a2 = -y(ini56) * rate(ir4f54)
    1491        21194 :          a3 =  y(ife52) * y(ihe4)* y(iprot) * rate(ir7f54)
    1492        21194 :          a4 = -y(ini56) * y(iprot) * rate(ir8f54)
    1493              : 
    1494        21194 :          qray(ini56) =  qray(ini56) + a1 + a2 + a3 + a4
    1495              : 
    1496              :    ! neutrons
    1497        21194 :          a1 =  2.0d0 * y(ife54) * rate(ir1f54)
    1498        21194 :          a2 = -2.0d0 * y(ife52) * y(ineut) * y(ineut) * rate(ir2f54)
    1499        21194 :          a3 =  2.0d0 * y(ihe4) * rate(iralf1)
    1500        21194 :          a4 = -2.0d0 * y(ineut)*y(ineut) * y(iprot)*y(iprot) * rate(iralf2)
    1501        21194 :          a5 =  y(iprot) * rate(irpen)
    1502        21194 :          a6 = -y(ineut) * rate(irnep)
    1503        21194 :          a7 =  2.0d0 * y(ife56) * rate(irfe56_aux1)
    1504        21194 :          a8 = -2.0d0 * y(ife54) * y(ineut) * y(ineut) * rate(irfe56_aux2)
    1505        21194 :          a9 = -fe56ec_n_neut * y(ife56) * fe56ec_fake_factor * rate(irn56ec)
    1506              : 
    1507        21194 :          qray(ineut) =  qray(ineut) + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9
    1508              : 
    1509              :    ! photodisintegration protons
    1510        21194 :          a1  = -2.0d0 * y(ife54) * y(iprot) * y(iprot) * rate(ir3f54)
    1511        21194 :          a2  =  2.0d0 * y(ini56) * rate(ir4f54)
    1512        21194 :          a3  = -2.0d0 * y(ife54) * y(iprot) * y(iprot) * rate(ir5f54)
    1513        21194 :          a4  =  2.0d0 * y(ife52) * y(ihe4) * rate(ir6f54)
    1514        21194 :          a5  =  2.0d0 * y(ihe4) * rate(iralf1)
    1515        21194 :          a6  = -2.0d0 * y(ineut)*y(ineut) * y(iprot)*y(iprot) * rate(iralf2)
    1516        21194 :          a7  = -y(iprot) * rate(irpen)
    1517        21194 :          a8  =  y(ineut) * rate(irnep)
    1518        21194 :          a9  = -2.0d0 * y(ife56) * y(iprot) * y(iprot) * rate(irfe56_aux3)
    1519        21194 :          a10 =  2.0d0 * y(ife54) * y(ihe4) * rate(irfe56_aux4)
    1520              : 
    1521              :          qray(iprot) =  qray(iprot) + &
    1522        21194 :             a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
    1523              : 
    1524              :    ! now set the real(dp) return argument dydt
    1525        21194 :          okay = .true.
    1526       466280 :          do i=1,species(plus_co56)
    1527       445086 :             dydt(i) = qray(i)
    1528       466280 :             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        21194 :          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        21194 :          end subroutine approx21_dydt
    1545              : 
    1546              : 
    1547         9106 :          real(dp) function approx21_eval_PPII_fraction(y, rate) result(fII)
    1548              :             real(dp), dimension(:), intent(in) :: y, rate
    1549         9106 :             real(dp) :: rateII, rateIII, rsum
    1550              :             include 'formats'
    1551         9106 :             rateII  = rate(ir_be7_wk_li7)
    1552         9106 :             rateIII = y(ih1) * rate(ir_be7_pg_b8)
    1553         9106 :             rsum = rateII + rateIII
    1554         9106 :             if (rsum < 1d-50) then
    1555              :                fII = 0.5d0
    1556              :             else
    1557         8362 :                fII = rateII / rsum
    1558              :             end if
    1559         9106 :          end function approx21_eval_PPII_fraction
    1560              : 
    1561              : 
    1562        21194 :          subroutine approx21_eps_info( &
    1563        21194 :                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        21194 :                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       529850 :             real(qp) :: a1, a2, xx, eps_neu_q, eps_nuc_cat(num_categories), eps_total_q, &
    1663        21194 :                eps_nuc_q, sum_categories_q
    1664        21194 :             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        21194 :             ierr = 0
    1672              : 
    1673        21194 :             xx = 0.0_qp
    1674       466280 :             do i=1,species(plus_co56)
    1675       445086 :                a1 = dydt(i)
    1676       445086 :                a2 = mion(i)
    1677       466280 :                xx = xx + a1*a2
    1678              :             end do
    1679        21194 :             eps_total_q = -m3(avo,clight,clight) * xx
    1680        21194 :             eps_total = eps_total_q
    1681              : 
    1682              :             fe56ec_fake_factor = eval_fe56ec_fake_factor( &
    1683        42388 :                n% g% fe56ec_fake_factor, n% g% min_T_for_fe56ec_fake_factor, n% temp)
    1684        21194 :             fe56ec_n_neut = n% g% fe56ec_n_neut
    1685              : 
    1686              :             eps_neu_q = &
    1687              :                m5(Qneu_rpp, 0.5d0, y(ih1), y(ih1), rate(irpp)) + &
    1688              :                m5(Qneu_rpp2, y(ihe3), y(ihe4), rate(irhe3ag), fII) + &
    1689              :                m5(Qneu_rpp3, y(ihe3), y(ihe4), rate(irhe3ag), (1d0-fII)) + &
    1690              :                m4(Qneu_rcpg, y(ic12), y(ih1), rate(ircpg)) + &
    1691              :                m5(Qneu_rnpg, y(in14), y(ih1), rate(irnpg), rate(ifa)) + &
    1692              :                m4(Qneu_ropg, y(io16), y(ih1), rate(iropg)) + &
    1693              :                m3(Qneu_rpen, y(ih1), rate(irpen)) + &
    1694              :                m3(Qneu_rpen, y(iprot), rate(irpen)) + &
    1695              :                m3(Qneu_rnep, y(ineut), rate(irnep)) + &
    1696        21194 :                m4(Qneu_rfe56ec, y(ife56), fe56ec_fake_factor, rate(irn56ec))
    1697              : 
    1698        21194 :             if (plus_co56) then
    1699              :                eps_neu_q = eps_neu_q + &
    1700              :                   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        21182 :                   m3(Qneu_rni56ec + Qneu_rco56ec, y(ini56), rate(irn56ec))
    1705              :             end if
    1706        21194 :             eps_neu_q = eps_neu_q * Qconv
    1707        21194 :             eps_neu = eps_neu_q
    1708              : 
    1709        21194 :             eps_nuc_q = eps_total_q - eps_neu_q
    1710        21194 :             eps_nuc = eps_nuc_q
    1711              : 
    1712        21194 :             if (.not. do_eps_nuc_categories) return
    1713              : 
    1714       227650 :             do i=1,num_categories
    1715       227650 :                eps_nuc_cat(i) = 0d0
    1716              :             end do
    1717              : 
    1718              :             ! Set the rates
    1719      1065406 :             n% raw_rate = 0d0
    1720      1065406 :             n% screened_rate = 0d0
    1721      1065406 :             n% eps_nuc_rate = 0d0
    1722      1065406 :             n% eps_neu_rate = 0d0
    1723              : 
    1724              :             ! Set neutrinos first
    1725         9106 :             n% eps_neu_rate(irpp) = m5(Qneu_rpp, 0.5d0, y(ih1), y(ih1), rate(irpp))
    1726              :             n% eps_neu_rate(irhe3ag) = m5(Qneu_rpp2, y(ihe3), y(ihe4), rate(irhe3ag), fII) + &
    1727         9106 :                                        m5(Qneu_rpp3, y(ihe3), y(ihe4), rate(irhe3ag), (1d0-fII))
    1728         9106 :             n% eps_neu_rate(ircpg) = m4(Qneu_rcpg, y(ic12), y(ih1), rate(ircpg))
    1729         9106 :             n% eps_neu_rate(irnpg) = m5(Qneu_rnpg, y(in14), y(ih1), rate(irnpg), rate(ifa))
    1730         9106 :             n% eps_neu_rate(iropg) = m4(Qneu_ropg, y(io16), y(ih1), rate(iropg))
    1731              :             n% eps_neu_rate(irpen) = m3(Qneu_rpen, y(ih1), rate(irpen)) + &
    1732         9106 :                                     m3(Qneu_rpen, y(iprot), rate(irpen))
    1733         9106 :             n% eps_neu_rate(irnep) = m3(Qneu_rnep, y(ineut), rate(irnep))
    1734         9106 :             n% eps_neu_rate(irn56ec) = m4(Qneu_rfe56ec, y(ife56), fe56ec_fake_factor, rate(irn56ec))
    1735         9106 :             if (plus_co56) then
    1736              :                n% eps_neu_rate(irn56ec) = n% eps_neu_rate(irn56ec) + &
    1737              :                   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         9102 :                   m3(Qneu_rni56ec + Qneu_rco56ec, y(ini56), rate(irn56ec))
    1742              :             end if
    1743              : 
    1744      1065406 :             n% eps_neu_rate = n% eps_neu_rate * Qconv
    1745              : 
    1746        36424 :             call set_eps_nuc(Qtotal_rpp - Qneu_rpp,[0.5d0, y(ih1), y(ih1)],irpp, ipp)
    1747        36424 :             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        27318 :                               [y(ihe3), y(ihe4)],irhe3ag, ipp)
    1752              : 
    1753        27318 :             call set_eps_nuc(Qtotal_rcpg - Qneu_rcpg, [y(ic12), y(ih1)],ircpg,icno)
    1754        27318 :             call set_eps_nuc(Qtotal_rcpg - Qneu_rnpg, [y(in14), y(ih1)],irnpg,icno)
    1755        36424 :             call set_eps_nuc(Qtotal_ropg - Qneu_ropg, [y(io16), y(ih1),rate(ifa)],iropg,icno)
    1756              : 
    1757        45530 :             call set_eps_nuc(Qr3alf, [1d0/6d0,y(ihe4), y(ihe4), y(ihe4)],ir3a,i3alf)
    1758              : 
    1759        27318 :             call set_eps_nuc(Qrc12ag, [y(ic12), y(ihe4)],ircag,i_burn_c)
    1760              : 
    1761        27318 :             call set_eps_nuc(Qrn14ag, [ y(ihe4), y(in14)],irnag,i_burn_n)
    1762        36424 :             call set_eps_nuc(Qrn14_to_o16, [y(in14), y(ih1),rate(ifg)],irnpg,i_burn_n)
    1763              : 
    1764        27318 :             call set_eps_nuc(Qro16ag, [y(io16), y(ihe4)], iroag, i_burn_o)
    1765              : 
    1766        36424 :             call set_eps_nuc(Qr1212, [0.5d0,y(ic12), y(ic12)],ir1212,icc)
    1767              : 
    1768        27318 :             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        36424 :             call set_eps_nuc( Qr1616a * (0.56d0 + 0.34d0*rate(irs1)), [0.5d0,y(io16), y(io16)], ir1616, ioo)
    1772              :             ! these make s32
    1773        36424 :             call set_eps_nuc( Qr1616g * (0.1d0 + 0.34d0*(1d0 - rate(irs1))) , [0.5d0,y(io16), y(io16)], ir1616, ioo )
    1774              : 
    1775        27318 :             call set_eps_nuc(Qrne20ag, [y(ihe4), y(ine20)], irneag, i_burn_ne)
    1776              : 
    1777        27318 :             call set_eps_nuc(Qrmg24ag, [y(ihe4), y(img24)],irmgag,i_burn_mg)
    1778        36424 :             call set_eps_nuc(Qrmg24ag, [y(ihe4), y(img24),1.0d0-rate(irr1)],irmgap,i_burn_mg)
    1779              : 
    1780        27318 :             call set_eps_nuc(Qrsi28ag, [y(ihe4), y(isi28)],irsiag,i_burn_si)
    1781        36424 :             call set_eps_nuc(Qrsi28ag, [y(ihe4), y(isi28),(1.0d0-rate(irs1))],irsiap,i_burn_si)
    1782              : 
    1783        27318 :             call set_eps_nuc(Qrs32ag, [y(ihe4), y(is32)], irsag, i_burn_s)
    1784        36424 :             call set_eps_nuc(Qrs32ag, [y(ihe4), y(is32),(1.0d0-rate(irt1))], irsap, i_burn_s)
    1785              : 
    1786        27318 :             call set_eps_nuc(Qrar36ag, [y(ihe4), y(iar36)], irarag, i_burn_ar)
    1787        36424 :             call set_eps_nuc(Qrar36ag, [y(ihe4), y(iar36),(1.0d0-rate(iru1))], irarap, i_burn_ar)
    1788              : 
    1789        27318 :             call set_eps_nuc(Qrca40ag, [y(ihe4), y(ica40)], ircaag, i_burn_ca)
    1790        36424 :             call set_eps_nuc(Qrca40ag, [y(ihe4), y(ica40), (1.0d0-rate(irv1))], ircaap, i_burn_ca)
    1791              : 
    1792        27318 :             call set_eps_nuc(Qrti44ag, [y(ihe4), y(iti44)], irtiag, i_burn_ti)
    1793        36424 :             call set_eps_nuc(Qrti44ag, [y(ihe4), y(iti44),(1.0d0-rate(irw1))], irtiap, i_burn_ti)
    1794              : 
    1795        27318 :             call set_eps_nuc(Qrcr48ag, [y(ihe4), y(icr48)], ircrag, i_burn_cr)
    1796        36424 :             call set_eps_nuc(Qrcr48ag, [y(ihe4), y(icr48),(1.0d0-rate(irx1))], ircrap, i_burn_cr)
    1797              : 
    1798        27318 :             call set_eps_nuc(Qrfe52ag, [y(ihe4), y(ife52)], irfeag, i_burn_fe)
    1799        36424 :             call set_eps_nuc(Qrfe52aprot_to_ni56, [y(ife52), y(ihe4), y(iprot)], ir7f54, i_burn_fe)
    1800        36424 :             call set_eps_nuc(Qrfe52neut_to_fe54, [ y(ife52), y(ineut), y(ineut)], ir2f54, i_burn_fe)
    1801        36424 :             call set_eps_nuc(Qrfe54ng_to_fe56, [ y(ife54), y(ineut), y(ineut)], irfe56_aux2, i_burn_fe)
    1802        27318 :             call set_eps_nuc(Qrfe52aprot_to_fe54, [y(ife52), y(ihe4)], ir6f54, i_burn_fe)
    1803        27318 :             call set_eps_nuc(Qrfe54aprot_to_fe56, [y(ife54), y(ihe4)], irfe56_aux4, i_burn_fe)
    1804        36424 :             call set_eps_nuc(Qrfe54prot_to_ni56, [y(ife54), y(iprot),y(iprot)], ir3f54, i_burn_fe)
    1805        27318 :             call set_eps_nuc(Qtotal_rfe56ec - Qneu_rfe56ec, [y(ife56),fe56ec_fake_factor], irn56ec, i_burn_fe)
    1806              : 
    1807        45530 :             call set_eps_nuc(Qrhe4_rebuild, [y(ineut),y(ineut), y(iprot),y(iprot)],iralf2,ipnhe4)
    1808              : 
    1809        18212 :             call set_eps_nuc(Qtotal_rpen, [y(ih1)],irpen,iother)
    1810        18212 :             call set_eps_nuc(Qtotal_rpen, [y(iprot)],irpen,iother)
    1811        18212 :             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        18212 :             call set_eps_nuc(Qrhe4_breakup,[ y(ihe4)],iralf1,iphoto)  ! note: Qrhe4_breakup < 0
    1822        18212 :             call set_eps_nuc(-Qrc12ag,[ y(io16)],iroga, iphoto)  ! all the rest are > 0 Q's for forward reactions
    1823        18212 :             call set_eps_nuc(-Qr3alf,[ y(ic12)],irg3a, iphoto)
    1824        18212 :             call set_eps_nuc(-Qro16ag,[ y(ine20)],irnega, iphoto)
    1825        18212 :             call set_eps_nuc(-Qrne20ag,[ y(img24)],irmgga, iphoto)
    1826              : 
    1827        18212 :             call set_eps_nuc(-Qrmg24ag,[ y(isi28)],irsiga, iphoto)
    1828        27318 :             call set_eps_nuc(-Qrmg24ag,[ y(isi28),rate(irr1)],irsigp, iphoto)
    1829              : 
    1830        18212 :             call set_eps_nuc(-Qrsi28ag,[ y(is32)],irsga, iphoto)
    1831        27318 :             call set_eps_nuc(-Qrsi28ag,[ y(is32),rate(irs1)],irsgp, iphoto)
    1832              : 
    1833        18212 :             call set_eps_nuc(-Qrs32ag,[ y(iar36)],irarga, iphoto)
    1834        27318 :             call set_eps_nuc(-Qrs32ag,[ y(iar36),rate(irt1)],irargp, iphoto)
    1835              : 
    1836        18212 :             call set_eps_nuc(-Qrar36ag,[ y(ica40)],ircaga, iphoto)
    1837        27318 :             call set_eps_nuc(-Qrar36ag,[ y(ica40),rate(iru1)],ircagp, iphoto)
    1838              : 
    1839        18212 :             call set_eps_nuc(-Qrca40ag,[ y(iti44)],irtiga, iphoto)
    1840        27318 :             call set_eps_nuc(-Qrca40ag,[ y(iti44),rate(irv1)],irtigp, iphoto)
    1841              : 
    1842        18212 :             call set_eps_nuc(-Qrti44ag,[ y(icr48)],ircrga, iphoto)
    1843        27318 :             call set_eps_nuc(-Qrti44ag,[ y(icr48),rate(irw1)],ircrgp, iphoto)
    1844              : 
    1845        18212 :             call set_eps_nuc(-Qrcr48ag,[ y(ife52)],irfega, iphoto)
    1846        27318 :             call set_eps_nuc(-Qrcr48ag,[ y(ife52),rate(irx1)],irfegp, iphoto)
    1847              : 
    1848        27318 :             call set_eps_nuc(-Qrfe52aprot_to_ni56,[ y(ini56), y(iprot)],ir8f54, iphoto)
    1849        36424 :             call set_eps_nuc(-Qrfe52aprot_to_fe54,[ y(ife54), y(iprot), y(iprot)],ir5f54, iphoto)
    1850        18212 :             call set_eps_nuc(-Qrfe52ag,[ y(ini56)],irniga, iphoto)
    1851        18212 :             call set_eps_nuc(-Qrfe52neut_to_fe54,[ y(ife54)],ir1f54, iphoto)
    1852        18212 :             call set_eps_nuc(-Qrfe54ng_to_fe56,[ y(ife56)],irfe56_aux1, iphoto)
    1853        36424 :             call set_eps_nuc(-Qrfe54aprot_to_fe56,[ y(ife56), y(iprot), y(iprot)],irfe56_aux3, iphoto)
    1854        18212 :             call set_eps_nuc(-Qrfe54prot_to_ni56,[ y(ini56)],ir4f54, iphoto)
    1855              : 
    1856              : 
    1857              : 
    1858        18212 :             call set_eps_nuc(Qtotal_rni56ec - Qneu_rni56ec, [y(ini56)], irn56ec, i_ni56_co56)
    1859              : 
    1860         9106 :             if (plus_co56) then
    1861            8 :                call set_eps_nuc(Qtotal_rco56ec - Qneu_rco56ec, [y(ico56)], irco56ec, i_co56_fe56)
    1862              :             else
    1863        18204 :                call set_eps_nuc(Qtotal_rco56ec - Qneu_rco56ec, [y(ini56)], irn56ec, i_co56_fe56)
    1864              : 
    1865              :             end if
    1866              : 
    1867       227650 :             eps_nuc_cat = eps_nuc_cat * Qconv
    1868      1065406 :             n% eps_nuc_rate = n% eps_nuc_rate * Qconv
    1869              : 
    1870       227650 :             do i=1,num_categories
    1871       227650 :                eps_nuc_categories(i) = eps_nuc_cat(i)
    1872              :             end do
    1873              : 
    1874              :             ! check eps_nuc vs sum(eps_nuc_cat)
    1875              : 
    1876         9106 :             sum_categories_q = sum(eps_nuc_cat)
    1877         9106 :             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         9106 :                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        21194 :                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        21194 :             end function m2
    1936              : 
    1937        60600 :             real(qp) function m3(a1,a2,a3)
    1938              :                real(dp), intent(in) :: a1, a2, a3
    1939        60600 :                real(qp) :: q1, q2, q3
    1940        30300 :                q1 = a1; q2 = a2; q3 = a3; m3 = q1*q2*q3
    1941              :             end function m3
    1942              : 
    1943        30300 :             real(qp) function m4(a1,a2,a3,a4)
    1944              :                real(dp), intent(in) :: a1, a2, a3, a4
    1945        30300 :                real(qp) :: q1, q2, q3, q4
    1946        30300 :                q1 = a1; q2 = a2; q3 = a3; q4 = a4; m4 = q1*q2*q3*q4
    1947              :             end function m4
    1948              : 
    1949        30300 :             real(qp) function m5(a1,a2,a3,a4,a5)
    1950              :                real(dp), intent(in) :: a1, a2, a3, a4, a5
    1951        30300 :                real(qp) :: q1, q2, q3, q4, q5
    1952        30300 :                q1 = a1; q2 = a2; q3 = a3; q4 = a4; q5 = a5; m5 = q1*q2*q3*q4*q5
    1953              :             end function m5
    1954              : 
    1955              : 
    1956       637420 :             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       637420 :                real(qp) :: val1,val2,val3
    1961              : 
    1962      1939578 :                val1 = product(real(ys,kind=qp))
    1963       637420 :                val2 = val1 * real(rate(rat_id),kind=qp)
    1964              : 
    1965       637420 :                val3 = real(q,kind=qp) * val2
    1966              : 
    1967       637420 :                eps_nuc_cat(eps_id) = eps_nuc_cat(eps_id) + val3
    1968              : 
    1969       637420 :                if(rat_id < ifa) then
    1970       509936 :                   n% raw_rate(rat_id) = n% raw_rate(rat_id) + val1 * real(n% rate_raw(rat_id),kind=qp)
    1971       509936 :                   n% screened_rate(rat_id)  = n% screened_rate(rat_id) + val2
    1972       509936 :                   n% eps_nuc_rate(rat_id) = n% eps_nuc_rate(rat_id) + val3
    1973              :                else
    1974       127484 :                   n% raw_rate(rat_id) = 0d0
    1975       127484 :                   n% screened_rate(rat_id)  = 0d0
    1976       127484 :                   n% eps_nuc_rate(rat_id) = 0d0
    1977              :                end if
    1978              : 
    1979       637420 :             end subroutine set_eps_nuc
    1980              : 
    1981              : 
    1982              :          end subroutine approx21_eps_info
    1983              : 
    1984              : 
    1985         6044 :          subroutine approx21_d_epsneu_dy( &
    1986         6044 :                y, rate, &
    1987              :                Qneu_rpp, Qneu_rpp2, Qneu_rpp3, &
    1988              :                Qneu_rcpg, Qneu_rnpg, Qneu_ropg, &
    1989         6044 :                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         6044 :             real(dp) :: fII
    2000              : 
    2001         6044 :             ierr = 0
    2002              : 
    2003         6044 :             fII = 0.5d0  ! fix this
    2004              : 
    2005       132972 :             d_epsneu_dy(1:species(plus_co56)) = 0d0
    2006              : 
    2007              :             d_epsneu_dy(ih1) = Qconv*( &
    2008              :                Qneu_rpp * y(ih1) * rate(irpp) + &  ! rpp_to_he3
    2009              :                Qneu_rcpg * y(ic12) * rate(ircpg) + &  ! C of CNO
    2010              :                Qneu_rnpg * y(in14) * rate(irnpg) + &  ! N of CNO
    2011         6044 :                Qneu_ropg * y(io16) * rate(iropg))  ! O of CNO
    2012              : 
    2013              :             d_epsneu_dy(ihe3) = Qconv*( &
    2014              :                Qneu_rpp2 * y(ihe4) * rate(irhe3ag) * fII + &  ! r34_pp2
    2015         6044 :                Qneu_rpp3 * y(ihe4) * rate(irhe3ag) * (1d0-fII))  ! r34_pp3
    2016              : 
    2017              :             d_epsneu_dy(ihe4) = Qconv*( &
    2018              :                Qneu_rpp2 * y(ihe3) * rate(irhe3ag) * fII + &  ! r34_pp2
    2019         6044 :                Qneu_rpp3 * y(ihe3) * rate(irhe3ag) * (1d0-fII))  ! r34_pp3
    2020              : 
    2021              :             d_epsneu_dy(ic12) = Qconv* &
    2022         6044 :                Qneu_rcpg * y(ih1) * rate(ircpg)  ! C of CNO
    2023              : 
    2024              :             d_epsneu_dy(in14) = Qconv* &
    2025         6044 :                Qneu_rnpg * y(ih1) * rate(irnpg)  ! N of CNO
    2026              : 
    2027              :             d_epsneu_dy(io16) = Qconv* &
    2028         6044 :                Qneu_ropg * y(ih1) * rate(iropg)  ! O of CNO
    2029              : 
    2030         6044 :          end subroutine approx21_d_epsneu_dy
    2031              : 
    2032              : 
    2033         6044 :          subroutine approx21_dfdy( &
    2034         6044 :             y, dfdy, fe56ec_fake_factor_in, min_T, fe56ec_n_neut, &
    2035         6044 :             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         6044 :          real(dp) :: fe56ec_fake_factor
    2048              : 
    2049         6044 :          ierr = 0
    2050              : 
    2051              :          ! Turn on special fe56ec rate above some temperature
    2052         6044 :          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      2798548 :          dfdy(1:species(plus_co56),1:species(plus_co56)) = 0.0d0
    2057              : 
    2058              :    ! h1 jacobian elements
    2059              :          dfdy(ih1,ih1)  = -3.0d0 * y(ih1) * ratdum(irpp) &
    2060              :                         - 2.0d0 * y(ic12) * ratdum(ircpg) &
    2061              :                         - 2.0d0 * y(in14) * ratdum(irnpg) &
    2062              :                         - 2.0d0 * y(in14) * y(ih1) * dratdumdy1(irnpg) &
    2063              :                         - 2.0d0 * y(io16) * ratdum(iropg) &
    2064              :                         - 2.0d0 * y(io16) * y(ih1) * dratdumdy1(iropg) &
    2065         6044 :                         - 3.0d0 * ratdum(irpen)
    2066              : 
    2067              :          dfdy(ih1,ihe3) = 2.0d0 * y(ihe3) * ratdum(ir33) &
    2068         6044 :                         - y(ihe4) * ratdum(irhe3ag)
    2069              : 
    2070              :          dfdy(ih1,ihe4) = -y(ihe3) * ratdum(irhe3ag) &
    2071         6044 :                         - y(ihe3) * y(ihe4) * dratdumdy1(irhe3ag)
    2072              : 
    2073         6044 :          dfdy(ih1,ic12) = -2.0d0 * y(ih1) * ratdum(ircpg)
    2074              : 
    2075         6044 :          dfdy(ih1,in14) = -2.0d0 * y(ih1) * ratdum(irnpg)
    2076              : 
    2077         6044 :          dfdy(ih1,io16) = -2.0d0 * y(ih1) * ratdum(iropg)
    2078              : 
    2079              : 
    2080              :    ! he3 jacobian elements
    2081              :          dfdy(ihe3,ih1)  =  y(ih1) * ratdum(irpp) &
    2082         6044 :                         + ratdum(irpen)
    2083              : 
    2084              :          dfdy(ihe3,ihe3) = -2.0d0 * y(ihe3) * ratdum(ir33) &
    2085         6044 :                         - y(ihe4) * ratdum(irhe3ag)
    2086              : 
    2087              :          dfdy(ihe3,ihe4) = -y(ihe3) * ratdum(irhe3ag) &
    2088         6044 :                         - y(ihe3) * y(ihe4) * dratdumdy1(irhe3ag)
    2089              : 
    2090              : 
    2091              :    ! he4 jacobian elements
    2092              :          dfdy(ihe4,ih1)  = y(in14) * ratdum(ifa) * ratdum(irnpg) &
    2093              :                         + y(in14) * y(ih1) * ratdum(ifa) * dratdumdy1(irnpg) &
    2094              :                         + y(io16) * ratdum(iropg) &
    2095         6044 :                         + y(io16) * y(ih1) * dratdumdy1(iropg)
    2096              : 
    2097              :          dfdy(ihe4,ihe3)  = y(ihe3) * ratdum(ir33) &
    2098         6044 :                         + y(ihe4) * ratdum(irhe3ag)
    2099              : 
    2100              : 
    2101              :          dfdy(ihe4,ihe4)  = -1.5d0 * y(ihe4) * y(ihe4) * ratdum(ir3a) &
    2102              :                            - y(ic12) * ratdum(ircag) &
    2103              :                            - y(io16) * ratdum(iroag) &
    2104              :                            - y(ine20) * ratdum(irneag) &
    2105              :                            - y(img24) * ratdum(irmgag) &
    2106              :                            - y(isi28) * ratdum(irsiag) &
    2107              :                            - y(is32) * ratdum(irsag) &
    2108              :                            - y(iar36) * ratdum(irarag) &
    2109              :                            - y(ica40) * ratdum(ircaag) &
    2110              :                            - y(iti44) * ratdum(irtiag) &
    2111              :                            - y(icr48) * ratdum(ircrag) &
    2112         6044 :                            - y(ife52) * ratdum(irfeag)
    2113              : 
    2114              :          dfdy(ihe4,ihe4)  = dfdy(ihe4,ihe4) &
    2115              :                            - y(img24) * ratdum(irmgap) * (1.0d0-ratdum(irr1)) &
    2116              :                            - y(isi28) * ratdum(irsiap) * (1.0d0-ratdum(irs1)) &
    2117              :                            - y(is32) * ratdum(irsap) * (1.0d0-ratdum(irt1)) &
    2118              :                            - y(iar36) * ratdum(irarap) * (1.0d0-ratdum(iru1)) &
    2119              :                            - y(ica40) * ratdum(ircaap) * (1.0d0-ratdum(irv1)) &
    2120              :                            - y(iti44) * ratdum(irtiap) * (1.0d0-ratdum(irw1)) &
    2121         6044 :                            - y(icr48) * ratdum(ircrap) * (1.0d0-ratdum(irx1))
    2122              : 
    2123              :          dfdy(ihe4,ihe4)  = dfdy(ihe4,ihe4) &
    2124              :                            - y(ife52) * ratdum(ir6f54) &
    2125              :                            - y(ife52) * y(iprot) * ratdum(ir7f54) &
    2126              :                            - ratdum(iralf1) &
    2127         6044 :                            - 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         6044 :                         - y(in14) * ratdum(irnag) * 1.5d0
    2134              : 
    2135              : 
    2136              :          dfdy(ihe4,ic12)  = y(ic12) * ratdum(ir1212) &
    2137              :                            + 0.5d0 * y(io16) * ratdum(ir1216) &
    2138              :                            + 3.0d0 * ratdum(irg3a) &
    2139         6044 :                            - y(ihe4) * ratdum(ircag)
    2140              : 
    2141              : 
    2142              :          dfdy(ihe4,in14)  = y(ih1) * ratdum(ifa) * ratdum(irnpg) &
    2143         6044 :                         - y(ihe4) * ratdum(irnag) * 1.5d0
    2144              : 
    2145              : 
    2146              :          dfdy(ihe4,io16)  = 0.5d0 * y(ic12) * ratdum(ir1216) &
    2147              :                            + 1.12d0 * 0.5d0*y(io16) * ratdum(ir1616) &
    2148              :                            + 0.68d0 * ratdum(irs1) * 0.5d0*y(io16) * ratdum(ir1616) &
    2149              :                            + ratdum(iroga) &
    2150              :                            - y(ihe4) * ratdum(iroag) &
    2151         6044 :                            + y(ih1) * ratdum(iropg)
    2152              : 
    2153              :          dfdy(ihe4,ine20) =  ratdum(irnega) &
    2154         6044 :                         - y(ihe4) * ratdum(irneag)
    2155              : 
    2156              :          dfdy(ihe4,img24) =   ratdum(irmgga) &
    2157              :                            - y(ihe4) * ratdum(irmgag) &
    2158         6044 :                            - y(ihe4) * ratdum(irmgap) * (1.0d0-ratdum(irr1))
    2159              : 
    2160              :          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              :          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              :          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              :          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              :          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              :          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              :          dfdy(ihe4,ife52) =   ratdum(irfega) &
    2191              :                            - y(ihe4) * ratdum(irfeag) &
    2192              :                            + ratdum(irx1) * ratdum(irfegp) &
    2193              :                            - y(ihe4) * ratdum(ir6f54) &
    2194         6044 :                            - y(ihe4) * y(iprot) * ratdum(ir7f54)
    2195              : 
    2196              :          dfdy(ihe4,ife54) =   y(iprot) * y(iprot) * ratdum(ir5f54) &
    2197         6044 :                            - y(ihe4) * ratdum(irfe56_aux4)
    2198              : 
    2199         6044 :          dfdy(ihe4,ife56) =   y(iprot) * y(iprot) * ratdum(irfe56_aux3)
    2200              : 
    2201              :          dfdy(ihe4,ini56) =   ratdum(irniga) &
    2202         6044 :                            + y(iprot) * ratdum(ir8f54)
    2203              : 
    2204              : 
    2205              :          dfdy(ihe4,ineut) = -y(ihe4) * dratdumdy1(iralf1) &
    2206              :                         + 2.0d0 * y(ineut) * y(iprot)*y(iprot) * ratdum(iralf2) &
    2207         6044 :                         + y(ineut)*y(ineut) * y(iprot)*y(iprot) * dratdumdy1(iralf2)
    2208              : 
    2209              :          include 'formats'
    2210              : 
    2211              :          dfdy(ihe4,iprot) =   2.0d0 * y(ife54) * y(iprot) * ratdum(ir5f54) &
    2212              :                            + y(ife54) * y(iprot) * y(iprot) * dratdumdy1(ir5f54) &
    2213              :                            - y(ihe4) * y(ife52) * dratdumdy1(ir6f54) &
    2214              :                            - y(ife52) * y(ihe4) * ratdum(ir7f54) &
    2215              :                            - y(ife52) * y(ihe4) * y(iprot) * dratdumdy1(ir7f54) &
    2216              :                            + y(ini56) * ratdum(ir8f54) &
    2217              :                            + y(ini56) * y(iprot) * dratdumdy1(ir8f54) &
    2218              :                            - y(ihe4) * dratdumdy2(iralf1) &
    2219              :                            + 2.0d0 * y(ineut)*y(ineut) * y(iprot) * ratdum(iralf2) &
    2220              :                            + y(ineut)*y(ineut) * y(iprot)*y(iprot) * dratdumdy2(iralf2) &
    2221              :                            + 2.0d0 * y(ife56) * y(iprot) * ratdum(irfe56_aux3) &
    2222              :                            + y(ife56) * y(iprot) * y(iprot) * dratdumdy1(irfe56_aux3) &
    2223         6044 :                            - y(ihe4) * y(ife54) * dratdumdy1(irfe56_aux4)
    2224              : 
    2225              : 
    2226              : 
    2227              :    ! c12 jacobian elements
    2228              :          dfdy(ic12,ih1)  = -y(ic12) * ratdum(ircpg) &
    2229              :                         + y(in14) * ratdum(ifa) * ratdum(irnpg) &
    2230         6044 :                         + y(in14) * y(ih1) * ratdum(ifa) * dratdumdy1(irnpg)
    2231              : 
    2232              :          dfdy(ic12,ihe4) = 0.5d0 * y(ihe4) * y(ihe4) * ratdum(ir3a) &
    2233         6044 :                         - 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         6044 :                         - y(ih1) * ratdum(ircpg)
    2240              : 
    2241         6044 :          dfdy(ic12,in14) = y(ih1) * ratdum(ifa) * ratdum(irnpg)
    2242              : 
    2243              :          dfdy(ic12,io16) = -y(ic12) * ratdum(ir1216) &
    2244         6044 :                         + ratdum(iroga)
    2245              : 
    2246              : 
    2247              :    ! n14 jacobian elements
    2248              :          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         6044 :                         + y(io16) * y(ih1) * dratdumdy1(iropg)
    2253              : 
    2254         6044 :          dfdy(in14,ihe4) = -y(in14) * ratdum(irnag)
    2255              : 
    2256         6044 :          dfdy(in14,ic12) = y(ih1) * ratdum(ircpg)
    2257              : 
    2258              :          dfdy(in14,in14) = -y(ih1) * ratdum(irnpg) &
    2259         6044 :                         - y(ihe4) * ratdum(irnag)
    2260              : 
    2261         6044 :          dfdy(in14,io16) = y(ih1) * ratdum(iropg)
    2262              : 
    2263              : 
    2264              : 
    2265              :    ! o16 jacobian elements
    2266              :          dfdy(io16,ih1) = y(in14) * ratdum(ifg) * ratdum(irnpg) &
    2267              :                      + y(in14) * y(ih1) * ratdum(ifg) * dratdumdy1(irnpg) &
    2268              :                      - y(io16) * ratdum(iropg) &
    2269         6044 :                      - y(io16) * y(ih1) * dratdumdy1(iropg)
    2270              : 
    2271              :          dfdy(io16,ihe4) = y(ic12)*ratdum(ircag) &
    2272         6044 :                         - y(io16)*ratdum(iroag)
    2273              : 
    2274              :          dfdy(io16,ic12) = -y(io16)*ratdum(ir1216) &
    2275         6044 :                         + y(ihe4)*ratdum(ircag)
    2276              : 
    2277         6044 :          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         6044 :                         - y(ih1) * ratdum(iropg)
    2284              : 
    2285         6044 :          dfdy(io16,ine20) = ratdum(irnega)
    2286              : 
    2287              : 
    2288              :    ! ne20 jacobian elements
    2289              :          dfdy(ine20,ihe4)  = y(io16) * ratdum(iroag) &
    2290              :                         - y(ine20) * ratdum(irneag) &
    2291         6044 :                         + y(in14) * ratdum(irnag)
    2292              : 
    2293         6044 :          dfdy(ine20,ic12)  = y(ic12) * ratdum(ir1212)
    2294              : 
    2295         6044 :          dfdy(ine20,in14)  = y(ihe4) * ratdum(irnag)
    2296              : 
    2297         6044 :          dfdy(ine20,io16)  = y(ihe4) * ratdum(iroag)
    2298              : 
    2299              :          dfdy(ine20,ine20) = -y(ihe4) * ratdum(irneag) &
    2300         6044 :                            - ratdum(irnega)
    2301              : 
    2302         6044 :          dfdy(ine20,img24) = ratdum(irmgga)
    2303              : 
    2304              : 
    2305              : 
    2306              :    ! mg24 jacobian elements
    2307              :          dfdy(img24,ihe4)  = y(ine20) * ratdum(irneag) &
    2308              :                            -y(img24) * ratdum(irmgag) &
    2309         6044 :                            -y(img24) * ratdum(irmgap) * (1.0d0-ratdum(irr1))
    2310              : 
    2311         6044 :          dfdy(img24,ic12)  = 0.5d0 * y(io16) * ratdum(ir1216)
    2312              : 
    2313         6044 :          dfdy(img24,io16)  = 0.5d0 * y(ic12) * ratdum(ir1216)
    2314              : 
    2315         6044 :          dfdy(img24,ine20) = y(ihe4) * ratdum(irneag)
    2316              : 
    2317              :          dfdy(img24,img24) = -y(ihe4) * ratdum(irmgag) &
    2318              :                            - ratdum(irmgga) &
    2319         6044 :                            - y(ihe4)*ratdum(irmgap)*(1.0d0-ratdum(irr1))
    2320              : 
    2321              :          dfdy(img24,isi28) = ratdum(irsiga) &
    2322         6044 :                            + ratdum(irr1) * ratdum(irsigp)
    2323              : 
    2324              : 
    2325              : 
    2326              :    ! si28 jacobian elements
    2327              :          dfdy(isi28,ihe4)  = y(img24) * ratdum(irmgag) &
    2328              :                         - y(isi28) * ratdum(irsiag) &
    2329              :                         + y(img24) * ratdum(irmgap) * (1.0d0-ratdum(irr1)) &
    2330         6044 :                         - y(isi28) * ratdum(irsiap) * (1.0d0-ratdum(irs1))
    2331              : 
    2332         6044 :          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         6044 :                            + 0.68d0 * 0.5d0*y(io16) * ratdum(irs1) * ratdum(ir1616)
    2337              : 
    2338              :          dfdy(isi28,img24) = y(ihe4) * ratdum(irmgag) &
    2339         6044 :                         + 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         6044 :                            - y(ihe4) * ratdum(irsiap) * (1.0d0-ratdum(irs1))
    2345              : 
    2346              :          dfdy(isi28,is32)  = ratdum(irsga) &
    2347         6044 :                         + ratdum(irs1) * ratdum(irsgp)
    2348              : 
    2349              : 
    2350              : 
    2351              :    ! s32 jacobian elements
    2352              :          dfdy(is32,ihe4)  = y(isi28) * ratdum(irsiag) &
    2353              :                         - y(is32) * ratdum(irsag) &
    2354              :                         + y(isi28) * ratdum(irsiap) * (1.0d0-ratdum(irs1)) &
    2355         6044 :                         - 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         6044 :                            + 0.2d0 * 0.5d0*y(io16) * ratdum(ir1616)
    2360              : 
    2361              :          dfdy(is32,isi28) = y(ihe4) * ratdum(irsiag) &
    2362         6044 :                         + 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         6044 :                         - y(ihe4) * ratdum(irsap) * (1.0d0-ratdum(irt1))
    2368              : 
    2369              :          dfdy(is32,iar36) = ratdum(irarga) &
    2370         6044 :                         + ratdum(irt1) * ratdum(irargp)
    2371              : 
    2372              : 
    2373              : 
    2374              :    ! ar36 jacobian elements
    2375              :          dfdy(iar36,ihe4)  = y(is32) * ratdum(irsag) &
    2376              :                         - y(iar36) * ratdum(irarag) &
    2377              :                         + y(is32) * ratdum(irsap) * (1.0d0-ratdum(irt1)) &
    2378         6044 :                         - y(iar36) * ratdum(irarap) * (1.0d0-ratdum(iru1))
    2379              : 
    2380              :          dfdy(iar36,is32)  = y(ihe4) * ratdum(irsag) &
    2381         6044 :                            + 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         6044 :                            - y(ihe4) * ratdum(irarap) * (1.0d0-ratdum(iru1))
    2387              : 
    2388              :          dfdy(iar36,ica40) = ratdum(ircaga) &
    2389         6044 :                         + ratdum(ircagp) * ratdum(iru1)
    2390              : 
    2391              : 
    2392              : 
    2393              :    ! ca40 jacobian elements
    2394              :          dfdy(ica40,ihe4)   = y(iar36) * ratdum(irarag) &
    2395              :                            - y(ica40) * ratdum(ircaag) &
    2396              :                            + y(iar36) * ratdum(irarap)*(1.0d0-ratdum(iru1)) &
    2397         6044 :                            - y(ica40) * ratdum(ircaap)*(1.0d0-ratdum(irv1))
    2398              : 
    2399              :          dfdy(ica40,iar36)  = y(ihe4) * ratdum(irarag) &
    2400         6044 :                            + 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         6044 :                            - y(ihe4) * ratdum(ircaap)*(1.0d0-ratdum(irv1))
    2406              : 
    2407              :          dfdy(ica40,iti44)  = ratdum(irtiga) &
    2408         6044 :                            + ratdum(irtigp) * ratdum(irv1)
    2409              : 
    2410              : 
    2411              : 
    2412              :    ! ti44 jacobian elements
    2413              :          dfdy(iti44,ihe4)   = y(ica40) * ratdum(ircaag) &
    2414              :                            - y(iti44) * ratdum(irtiag) &
    2415              :                            + y(ica40) * ratdum(ircaap)*(1.0d0-ratdum(irv1)) &
    2416         6044 :                            - y(iti44) * ratdum(irtiap)*(1.0d0-ratdum(irw1))
    2417              : 
    2418              :          dfdy(iti44,ica40)  = y(ihe4) * ratdum(ircaag) &
    2419         6044 :                            + 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         6044 :                            - y(ihe4) * ratdum(irtiap)*(1.0d0-ratdum(irw1))
    2425              : 
    2426              :          dfdy(iti44,icr48)  = ratdum(ircrga) &
    2427         6044 :                            + ratdum(irw1) * ratdum(ircrgp)
    2428              : 
    2429              : 
    2430              : 
    2431              :    ! cr48 jacobian elements
    2432              :          dfdy(icr48,ihe4)  = y(iti44) * ratdum(irtiag) &
    2433              :                         - y(icr48) * ratdum(ircrag) &
    2434              :                         + y(iti44) * ratdum(irtiap)*(1.0d0-ratdum(irw1)) &
    2435         6044 :                         - y(icr48) * ratdum(ircrap)*(1.0d0-ratdum(irx1))
    2436              : 
    2437              :          dfdy(icr48,iti44) = y(ihe4) * ratdum(irtiag) &
    2438         6044 :                         + 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         6044 :                            - y(ihe4) * ratdum(ircrap)*(1.0d0-ratdum(irx1))
    2444              : 
    2445              :          dfdy(icr48,ife52) = ratdum(irfega) &
    2446         6044 :                         + ratdum(irx1) * ratdum(irfegp)
    2447              : 
    2448              : 
    2449              :    ! crx jacobian elements
    2450         6044 :          dfdy(icrx,ife56)  = fe56ec_fake_factor * ratdum(irn56ec)
    2451              : 
    2452              : 
    2453              :    ! fe52 jacobian elements
    2454              :          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         6044 :                         - y(ife52) * y(iprot) * ratdum(ir7f54)
    2459              : 
    2460              :          dfdy(ife52,icr48) = y(ihe4) * ratdum(ircrag) &
    2461         6044 :                         + 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              :                            - y(ineut) * y(ineut) * ratdum(ir2f54) &
    2467              :                            - y(ihe4) * ratdum(ir6f54) &
    2468         6044 :                            - y(ihe4) * y(iprot) * ratdum(ir7f54)
    2469              : 
    2470              :          dfdy(ife52,ife54) = ratdum(ir1f54) + &
    2471         6044 :                            y(iprot) * y(iprot) * ratdum(ir5f54)
    2472              : 
    2473              :          dfdy(ife52,ini56) = ratdum(irniga) &
    2474         6044 :                         + y(iprot) * ratdum(ir8f54)
    2475              : 
    2476              :          dfdy(ife52,ineut) = &
    2477              :                            y(ife54) * dratdumdy1(ir1f54) &
    2478              :                            - 2.0d0 * y(ife52) * y(ineut) * ratdum(ir2f54) &
    2479         6044 :                            - 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         6044 :                         + y(ini56) * y(iprot) * dratdumdy1(ir8f54)
    2488              : 
    2489              : 
    2490              :    ! fe54 jacobian elements
    2491              :          dfdy(ife54,ihe4)  = y(ife52) * ratdum(ir6f54) &
    2492         6044 :                            - y(ife54) * ratdum(irfe56_aux4)
    2493              : 
    2494              :          dfdy(ife54,ife52) = &
    2495              :                               y(ineut) * y(ineut) * ratdum(ir2f54) + &
    2496         6044 :                               y(ihe4) * ratdum(ir6f54)
    2497              : 
    2498              :          dfdy(ife54,ife54) = &
    2499              :                            - ratdum(ir1f54) &
    2500              :                            - y(ineut) * y(ineut) * ratdum(irfe56_aux2) &
    2501              :                            - 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              :                            ratdum(irfe56_aux1) + &
    2507         6044 :                            y(iprot) * y(iprot) * ratdum(irfe56_aux3)
    2508              : 
    2509         6044 :          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              :                            + y(ife56) * dratdumdy1(irfe56_aux1) &
    2516              :                            - 2.0d0 * y(ife54) * y(ineut) * ratdum(irfe56_aux2) &
    2517         6044 :                            - y(ife54) * y(ineut) * y(ineut) * dratdumdy1(irfe56_aux2)
    2518              : 
    2519              :          dfdy(ife54,iprot) = -2.0d0 * y(ife54) * y(iprot) * ratdum(ir3f54) &
    2520              :                            - y(ife54) * y(iprot) * y(iprot) * dratdumdy1(ir3f54) &
    2521              :                            + 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         6044 :                            - y(ihe4) * y(ife54) * dratdumdy1(irfe56_aux4)
    2528              : 
    2529              : 
    2530              :    ! fe56 jacobian elements
    2531              : 
    2532         6044 :          dfdy(ife56,ihe4)  = y(ife54) * ratdum(irfe56_aux4)
    2533              : 
    2534              : 
    2535              :          dfdy(ife56,ife54) = &
    2536              :                            y(ineut) * y(ineut) * ratdum(irfe56_aux2) + &
    2537         6044 :                            y(ihe4) * ratdum(irfe56_aux4)
    2538              : 
    2539              :          dfdy(ife56,ife56)  = - fe56ec_fake_factor * ratdum(irn56ec) &
    2540              :                               - ratdum(irfe56_aux1) &
    2541         6044 :                               - y(iprot) * y(iprot) * ratdum(irfe56_aux3)
    2542              : 
    2543         6044 :          if (plus_co56) then
    2544            4 :             dfdy(ife56,ico56)  = ratdum(irco56ec)
    2545              :          else
    2546         6040 :             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         6044 :                            + 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         6044 :                            + y(ihe4) * y(ife54) * dratdumdy1(irfe56_aux4)
    2559              : 
    2560         6044 :          if (plus_co56) then
    2561              :    ! co56 jacobian elements
    2562            4 :             dfdy(ico56,ini56) =  ratdum(irn56ec)
    2563            4 :             dfdy(ico56,ico56) = -ratdum(irco56ec)
    2564              :          end if
    2565              : 
    2566              : 
    2567              :    ! ni56 jacobian elements
    2568              :          dfdy(ini56,ihe4)  = y(ife52) * ratdum(irfeag) &
    2569         6044 :                         + y(ife52) * y(iprot) * ratdum(ir7f54)
    2570              : 
    2571              :          dfdy(ini56,ife52) = y(ihe4) * ratdum(irfeag) &
    2572         6044 :                         + y(ihe4)* y(iprot) * ratdum(ir7f54)
    2573              : 
    2574         6044 :          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         6044 :                            - 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         6044 :                         - y(ini56) * y(iprot) * dratdumdy1(ir8f54)
    2588              : 
    2589              : 
    2590              :    ! photodisintegration neutrons jacobian elements
    2591         6044 :          dfdy(ineut,ihe4)  = 2.0d0 * ratdum(iralf1)
    2592              : 
    2593         6044 :          dfdy(ineut,ife52) = -2.0d0 * y(ineut) * y(ineut) * ratdum(ir2f54)
    2594              : 
    2595              :          dfdy(ineut,ife54) =  2.0d0 * ratdum(ir1f54) &
    2596         6044 :                            - 2.0d0 * y(ineut) * y(ineut) * ratdum(irfe56_aux2)
    2597              : 
    2598              :          dfdy(ineut,ife56) = 2.0d0 * ratdum(irfe56_aux1) &
    2599         6044 :                            - 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              :                            - ratdum(irnep) &
    2609              :                            + 2.0d0 * y(ife56) * dratdumdy1(irfe56_aux1) &
    2610              :                            - 4.0d0 * y(ife54) * y(ineut) * ratdum(irfe56_aux2) &
    2611         6044 :                            - 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         6044 :                         + ratdum(irpen)
    2617              : 
    2618              :    ! photodisintegration protons jacobian elements
    2619              :          dfdy(iprot,ihe4)  = 2.0d0 * y(ife52) * ratdum(ir6f54) &
    2620              :                            + 2.0d0 * ratdum(iralf1) &
    2621         6044 :                            + 2.0d0 * y(ife54) * ratdum(irfe56_aux4)
    2622              : 
    2623         6044 :          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         6044 :                            + 2.0d0 * y(ihe4) * ratdum(irfe56_aux4)
    2628              : 
    2629         6044 :          dfdy(iprot,ife56) = -2.0d0 * y(iprot) * y(iprot) * ratdum(irfe56_aux3)
    2630              : 
    2631         6044 :          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         6044 :                         + 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         6044 :                            + 2.0d0 * y(ihe4) * y(ife54) * dratdumdy1(irfe56_aux4)
    2651              : 
    2652         6044 :          end subroutine approx21_dfdy
    2653              : 
    2654              : 
    2655         6044 :          subroutine approx21_dfdT_dfdRho( &  ! epstotal includes neutrinos
    2656        12088 :                y, mion, dfdy, ratdum, dratdumdt, dratdumdd, &
    2657              :                fe56ec_fake_factor, min_T, fe56ec_n_neut, temp, den, &
    2658        12088 :                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         6044 :             real(dp) :: enuc_conv2
    2669              :             logical, parameter :: deriva = .true.
    2670              : 
    2671              :             ! temperature dependence of the rate equations
    2672       132972 :             dfdT(1:species(plus_co56)) = 0d0
    2673              :             call approx21_dydt( &
    2674              :                y,dratdumdt,ratdum,dfdT,deriva,&
    2675         6044 :                fe56ec_fake_factor,min_T,fe56ec_n_neut,temp,den,plus_co56,ierr)
    2676         6044 :             if (ierr /= 0) return
    2677              : 
    2678              :             ! density dependence of the rate equations
    2679       132972 :             dfdRho(1:species(plus_co56)) = 0d0
    2680              :             call approx21_dydt( &
    2681              :                y,dratdumdd,ratdum,dfdRho,deriva,&
    2682         6044 :                fe56ec_fake_factor,min_T,fe56ec_n_neut,temp,den,plus_co56,ierr)
    2683         6044 :             if (ierr /= 0) return
    2684              : 
    2685              :             ! energy generation rate partials (total energy; do neutrinos elsewhere)
    2686       132972 :             enuc_conv2 = -avo*clight*clight
    2687       132972 :             d_epstotal_dy(1:species(plus_co56)) = 0d0
    2688       132972 :             do j=1,species(plus_co56)
    2689      2792504 :                do i=1,species(plus_co56)
    2690      2792504 :                   d_epstotal_dy(j) = d_epstotal_dy(j) + dfdy(i,j)*mion(i)
    2691              :                end do
    2692       132972 :                d_epstotal_dy(j) = d_epstotal_dy(j) * enuc_conv2
    2693              :             end do
    2694              : 
    2695              :          end subroutine approx21_dfdT_dfdRho
    2696              : 
    2697              : 
    2698           10 :          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           10 :             call get_net_ptr(handle, g, ierr)
    2706           10 :             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           10 :                g% net_iso, chem_isos% name(g% approx21_ye_iso),g% add_co56_to_approx21, ierr)
    2712           10 :             if (ierr /= 0) return
    2713           10 :             call mark_approx21_reactions(g% net_reaction,g% add_co56_to_approx21, ierr)
    2714           10 :             if (ierr /= 0) return
    2715           10 :          end subroutine mark_approx21
    2716              : 
    2717              : 
    2718           10 :          subroutine set_approx21(handle, ierr)
    2719           10 :             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           10 :             call get_net_ptr(handle, g, ierr)
    2726           10 :             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           10 :                g% net_iso, chem_isos% name(g% approx21_ye_iso),g% add_co56_to_approx21,ierr)
    2732           10 :             if (ierr /= 0) return
    2733           10 :             call set_approx21_reactions(g% net_reaction,g% add_co56_to_approx21,ierr)
    2734           10 :             if (ierr /= 0) return
    2735           10 :          end subroutine set_approx21
    2736              : 
    2737              : 
    2738           10 :          subroutine mark_approx21_isos(itab, ye_iso_name,plus_co56, ierr)
    2739           10 :             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           10 :             ierr = 0
    2746              : 
    2747           10 :             call do1('h1')
    2748           10 :             call do1('he3')
    2749           10 :             call do1('he4')
    2750           10 :             call do1('c12')
    2751           10 :             call do1('n14')
    2752           10 :             call do1('o16')
    2753           10 :             call do1('ne20')
    2754           10 :             call do1('mg24')
    2755           10 :             call do1('si28')
    2756           10 :             call do1('s32')
    2757           10 :             call do1('ar36')
    2758           10 :             call do1('ca40')
    2759           10 :             call do1('ti44')
    2760           10 :             call do1('cr48')
    2761           10 :             call do1('fe52')
    2762           10 :             call do1('fe54')
    2763           10 :             call do1('fe56')
    2764           10 :             if (plus_co56) call do1('co56')
    2765           10 :             call do1('ni56')
    2766           10 :             call do1('neut')
    2767           10 :             call do1('prot')
    2768           10 :             call do1(ye_iso_name)
    2769              : 
    2770              :             contains
    2771              : 
    2772          214 :             subroutine do1(str)
    2773           10 :                use utils_lib, only: mesa_error
    2774              :                character (len=*), intent(in) :: str
    2775              :                integer :: cid
    2776          214 :                cid = chem_get_iso_id(str)
    2777          214 :                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          214 :                itab(cid) = 1
    2783          214 :             end subroutine do1
    2784              : 
    2785              :          end subroutine mark_approx21_isos
    2786              : 
    2787              : 
    2788           10 :          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           10 :             ierr = 0
    2797              : 
    2798           10 :             ih1   = do1('h1')
    2799           10 :             ihe3  = do1('he3')
    2800           10 :             ihe4  = do1('he4')
    2801           10 :             ic12  = do1('c12')
    2802           10 :             in14  = do1('n14')
    2803           10 :             io16  = do1('o16')
    2804           10 :             ine20 = do1('ne20')
    2805           10 :             img24 = do1('mg24')
    2806           10 :             isi28 = do1('si28')
    2807           10 :             is32  = do1('s32')
    2808           10 :             iar36 = do1('ar36')
    2809           10 :             ica40 = do1('ca40')
    2810           10 :             iti44 = do1('ti44')
    2811           10 :             icr48 = do1('cr48')
    2812           10 :             ife52 = do1('fe52')
    2813           10 :             ife54 = do1('fe54')
    2814           10 :             ife56 = do1('fe56')
    2815           10 :             if (plus_co56) ico56 = do1('co56')
    2816           10 :             ini56 = do1('ni56')
    2817           10 :             ineut = do1('neut')
    2818           10 :             iprot = do1('prot')
    2819           10 :             icrx = do1(ye_iso_name)
    2820           10 :             iso_cid(icrx) = -1  ! different for different approx21 nets
    2821              : 
    2822              :             contains
    2823              : 
    2824          214 :             integer function do1(str)
    2825           10 :                use chem_def, only: chem_isos
    2826              :                use utils_lib, only: mesa_error
    2827              :                character (len=*), intent(in) :: str
    2828              :                integer :: cid
    2829          214 :                cid = chem_get_iso_id(str)
    2830          214 :                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          214 :                do1 = itab(cid)
    2835          214 :                iso_cid(do1) = cid
    2836          214 :             end function do1
    2837              : 
    2838              :          end subroutine set_approx21_isos
    2839              : 
    2840              : 
    2841           10 :          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           10 :             ierr = 0
    2849              : 
    2850           10 :             call do1('r_he4_he4_he4_to_c12')
    2851           10 :             call do1('r_c12_to_he4_he4_he4')
    2852           10 :             call do1('r_c12_ag_o16')
    2853           10 :             call do1('r1212')
    2854           10 :             call do1('r1216')
    2855           10 :             call do1('r1616')
    2856           10 :             call do1('r_o16_ga_c12')
    2857           10 :             call do1('r_o16_ag_ne20')
    2858           10 :             call do1('r_ne20_ga_o16')
    2859           10 :             call do1('r_ne20_ag_mg24')
    2860           10 :             call do1('r_mg24_ga_ne20')
    2861              : 
    2862           10 :             call do1('r_mg24_ag_si28')
    2863           10 :             call do1('r_si28_ga_mg24')
    2864           10 :             call do1('r_mg24_ap_al27')
    2865           10 :             call do1('r_al27_pa_mg24')
    2866           10 :             call do1('r_al27_pg_si28')
    2867           10 :             call do1('r_si28_gp_al27')
    2868           10 :             call do1('r_si28_ag_s32')
    2869           10 :             call do1('r_s32_ga_si28')
    2870           10 :             call do1('r_si28_ap_p31')
    2871           10 :             call do1('r_p31_pa_si28')
    2872           10 :             call do1('r_p31_pg_s32')
    2873           10 :             call do1('r_s32_gp_p31')
    2874           10 :             call do1('r_s32_ag_ar36')
    2875           10 :             call do1('r_ar36_ga_s32')
    2876           10 :             call do1('r_s32_ap_cl35')
    2877           10 :             call do1('r_cl35_pa_s32')
    2878           10 :             call do1('r_cl35_pg_ar36')
    2879           10 :             call do1('r_ar36_gp_cl35')
    2880           10 :             call do1('r_ar36_ag_ca40')
    2881           10 :             call do1('r_ca40_ga_ar36')
    2882           10 :             call do1('r_ar36_ap_k39')
    2883           10 :             call do1('r_k39_pa_ar36')
    2884           10 :             call do1('r_k39_pg_ca40')
    2885           10 :             call do1('r_ca40_gp_k39')
    2886           10 :             call do1('r_ca40_ag_ti44')
    2887           10 :             call do1('r_ti44_ga_ca40')
    2888           10 :             call do1('r_ca40_ap_sc43')
    2889           10 :             call do1('r_sc43_pa_ca40')
    2890           10 :             call do1('r_sc43_pg_ti44')
    2891           10 :             call do1('r_ti44_gp_sc43')
    2892           10 :             call do1('r_ti44_ag_cr48')
    2893           10 :             call do1('r_cr48_ga_ti44')
    2894           10 :             call do1('r_ti44_ap_v47')
    2895           10 :             call do1('r_v47_pa_ti44')
    2896           10 :             call do1('r_v47_pg_cr48')
    2897           10 :             call do1('r_cr48_gp_v47')
    2898           10 :             call do1('r_cr48_ag_fe52')
    2899           10 :             call do1('r_fe52_ga_cr48')
    2900           10 :             call do1('r_cr48_ap_mn51')
    2901           10 :             call do1('r_mn51_pa_cr48')
    2902           10 :             call do1('r_mn51_pg_fe52')
    2903           10 :             call do1('r_fe52_gp_mn51')
    2904           10 :             call do1('r_fe52_ag_ni56')
    2905           10 :             call do1('r_ni56_ga_fe52')
    2906           10 :             call do1('r_fe52_ap_co55')
    2907           10 :             call do1('r_co55_pa_fe52')
    2908           10 :             call do1('r_co55_pg_ni56')
    2909           10 :             call do1('r_ni56_gp_co55')
    2910              : 
    2911              :             ! for fe54 photodisintegration
    2912           10 :             call do1('r_fe52_ng_fe53')
    2913           10 :             call do1('r_fe53_gn_fe52')
    2914           10 :             call do1('r_fe53_ng_fe54')
    2915           10 :             call do1('r_fe54_gn_fe53')
    2916           10 :             call do1('r_fe54_pg_co55')
    2917           10 :             call do1('r_co55_gp_fe54')
    2918              : 
    2919              :             ! for he4 photodisintegration
    2920           10 :             call do1('r_he3_ng_he4')
    2921           10 :             call do1('r_he4_gn_he3')
    2922           10 :             call do1('r_h1_ng_h2')
    2923           10 :             call do1('r_h2_gn_h1')
    2924           10 :             call do1('r_h2_pg_he3')
    2925           10 :             call do1('r_he3_gp_h2')
    2926              : 
    2927              :             ! for weak reactions
    2928           10 :             call do1('rprot_to_neut')
    2929           10 :             call do1('rneut_to_prot')
    2930              : 
    2931           10 :             if (plus_co56) then
    2932            4 :                call do1('rni56ec_to_co56')
    2933            4 :                call do1('rco56ec_to_fe56')
    2934              :             else
    2935            6 :                call do1('rni56ec_to_fe56')
    2936              :             end if
    2937              : 
    2938              :             ! ppchain
    2939           10 :             call do1('rpp_to_he3')
    2940           10 :             call do1('r_he3_he3_to_h1_h1_he4')
    2941           10 :             call do1('r_he3_ag_be7')
    2942           10 :             call do1('r_be7_wk_li7')
    2943           10 :             call do1('r_be7_pg_b8')
    2944              : 
    2945              :             ! cno cycles
    2946           10 :             call do1('r_c12_pg_n13')
    2947           10 :             call do1('r_n14_pg_o15')
    2948           10 :             call do1('r_o16_pg_f17')
    2949           10 :             call do1('r_n15_pg_o16')
    2950           10 :             call do1('r_n15_pa_c12')
    2951           10 :             call do1('r_n14_ag_f18')
    2952              : 
    2953              :             ! for reactions to fe56
    2954           10 :             call do1('r_fe54_ng_fe55')
    2955           10 :             call do1('r_fe55_gn_fe54')
    2956           10 :             call do1('r_fe55_ng_fe56')
    2957           10 :             call do1('r_fe56_gn_fe55')
    2958           10 :             call do1('r_fe54_ap_co57')
    2959           10 :             call do1('r_co57_pa_fe54')
    2960           10 :             call do1('r_fe56_pg_co57')
    2961           10 :             call do1('r_co57_gp_fe56')
    2962              : 
    2963              :             contains
    2964              : 
    2965          934 :             subroutine do1(str)
    2966              :                use utils_lib, only: mesa_error
    2967              :                character (len=*), intent(in) :: str
    2968              :                integer :: ir
    2969          934 :                ir = rates_reaction_id(str)
    2970          934 :                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          934 :                rtab(ir) = 1
    2976          934 :             end subroutine do1
    2977              : 
    2978              :          end subroutine mark_approx21_reactions
    2979              : 
    2980              : 
    2981           10 :          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           10 :             ierr = 0
    2988              : 
    2989           10 :             ir3a = do1('r_he4_he4_he4_to_c12')
    2990           10 :             irg3a = do1('r_c12_to_he4_he4_he4')
    2991           10 :             ircag = do1('r_c12_ag_o16')
    2992           10 :             ir1212 = do1('r1212')
    2993           10 :             ir1216 = do1('r1216')
    2994           10 :             ir1616 = do1('r1616')
    2995           10 :             iroga = do1('r_o16_ga_c12')
    2996           10 :             iroag = do1('r_o16_ag_ne20')
    2997           10 :             irnega = do1('r_ne20_ga_o16')
    2998           10 :             irneag = do1('r_ne20_ag_mg24')
    2999           10 :             irmgga = do1('r_mg24_ga_ne20')
    3000              : 
    3001           10 :             irmgag = do1('r_mg24_ag_si28')
    3002           10 :             irsiga = do1('r_si28_ga_mg24')
    3003           10 :             irmgap = do1('r_mg24_ap_al27')
    3004           10 :             iralpa = do1('r_al27_pa_mg24')
    3005           10 :             iralpg = do1('r_al27_pg_si28')
    3006           10 :             irsigp = do1('r_si28_gp_al27')
    3007           10 :             irsiag = do1('r_si28_ag_s32')
    3008           10 :             irsga = do1('r_s32_ga_si28')
    3009           10 :             irsiap = do1('r_si28_ap_p31')
    3010           10 :             irppa = do1('r_p31_pa_si28')
    3011           10 :             irppg = do1('r_p31_pg_s32')
    3012           10 :             irsgp = do1('r_s32_gp_p31')
    3013           10 :             irsag = do1('r_s32_ag_ar36')
    3014           10 :             irarga = do1('r_ar36_ga_s32')
    3015           10 :             irsap = do1('r_s32_ap_cl35')
    3016           10 :             irclpa = do1('r_cl35_pa_s32')
    3017           10 :             irclpg = do1('r_cl35_pg_ar36')
    3018           10 :             irargp = do1('r_ar36_gp_cl35')
    3019           10 :             irarag = do1('r_ar36_ag_ca40')
    3020           10 :             ircaga = do1('r_ca40_ga_ar36')
    3021           10 :             irarap = do1('r_ar36_ap_k39')
    3022           10 :             irkpa = do1('r_k39_pa_ar36')
    3023           10 :             irkpg = do1('r_k39_pg_ca40')
    3024           10 :             ircagp = do1('r_ca40_gp_k39')
    3025           10 :             ircaag = do1('r_ca40_ag_ti44')
    3026           10 :             irtiga = do1('r_ti44_ga_ca40')
    3027           10 :             ircaap = do1('r_ca40_ap_sc43')
    3028           10 :             irscpa = do1('r_sc43_pa_ca40')
    3029           10 :             irscpg = do1('r_sc43_pg_ti44')
    3030           10 :             irtigp = do1('r_ti44_gp_sc43')
    3031           10 :             irtiag = do1('r_ti44_ag_cr48')
    3032           10 :             ircrga = do1('r_cr48_ga_ti44')
    3033           10 :             irtiap = do1('r_ti44_ap_v47')
    3034           10 :             irvpa = do1('r_v47_pa_ti44')
    3035           10 :             irvpg = do1('r_v47_pg_cr48')
    3036           10 :             ircrgp = do1('r_cr48_gp_v47')
    3037           10 :             ircrag = do1('r_cr48_ag_fe52')
    3038           10 :             irfega = do1('r_fe52_ga_cr48')
    3039           10 :             ircrap = do1('r_cr48_ap_mn51')
    3040           10 :             irmnpa = do1('r_mn51_pa_cr48')
    3041           10 :             irmnpg = do1('r_mn51_pg_fe52')
    3042           10 :             irfegp = do1('r_fe52_gp_mn51')
    3043           10 :             irfeag = do1('r_fe52_ag_ni56')
    3044           10 :             irniga = do1('r_ni56_ga_fe52')
    3045           10 :             irfeap = do1('r_fe52_ap_co55')
    3046           10 :             ircopa = do1('r_co55_pa_fe52')
    3047           10 :             ircopg = do1('r_co55_pg_ni56')
    3048           10 :             irnigp = do1('r_ni56_gp_co55')
    3049              : 
    3050              :             ! for fe54 photodisintegration
    3051           10 :             ir52ng = do1('r_fe52_ng_fe53')
    3052           10 :             ir53gn = do1('r_fe53_gn_fe52')
    3053           10 :             ir53ng = do1('r_fe53_ng_fe54')
    3054           10 :             ir54gn = do1('r_fe54_gn_fe53')
    3055           10 :             irfepg = do1('r_fe54_pg_co55')
    3056           10 :             ircogp = do1('r_co55_gp_fe54')
    3057              : 
    3058              :             ! for he4 photodisintegration
    3059           10 :             irheng = do1('r_he3_ng_he4')
    3060           10 :             irhegn = do1('r_he4_gn_he3')
    3061           10 :             irhng = do1('r_h1_ng_h2')
    3062           10 :             irdgn = do1('r_h2_gn_h1')
    3063           10 :             irdpg = do1('r_h2_pg_he3')
    3064           10 :             irhegp = do1('r_he3_gp_h2')
    3065              : 
    3066              :             ! for weak reactions
    3067           10 :             irpen = do1('rprot_to_neut')
    3068           10 :             irnep = do1('rneut_to_prot')
    3069              : 
    3070           10 :             if (plus_co56) then
    3071            4 :                irn56ec = do1('rni56ec_to_co56')
    3072            4 :                irco56ec = do1('rco56ec_to_fe56')
    3073              :             else
    3074            6 :                irn56ec = do1('rni56ec_to_fe56')
    3075              :             end if
    3076              : 
    3077              :             ! ppchain
    3078           10 :             irpp = do1('rpp_to_he3')
    3079           10 :             ir33 = do1('r_he3_he3_to_h1_h1_he4')
    3080           10 :             irhe3ag = do1('r_he3_ag_be7')
    3081           10 :             ir_be7_wk_li7 = do1('r_be7_wk_li7')
    3082           10 :             ir_be7_pg_b8 = do1('r_be7_pg_b8')
    3083              : 
    3084              :             ! cno cycles
    3085           10 :             ircpg = do1('r_c12_pg_n13')
    3086           10 :             irnpg = do1('r_n14_pg_o15')
    3087           10 :             iropg = do1('r_o16_pg_f17')
    3088           10 :             irn15pg = do1('r_n15_pg_o16')
    3089           10 :             irn15pa = do1('r_n15_pa_c12')
    3090           10 :             irnag = do1('r_n14_ag_f18')
    3091              : 
    3092              :             ! for reactions to fe56
    3093           10 :             ir54ng = do1('r_fe54_ng_fe55')
    3094           10 :             ir55gn = do1('r_fe55_gn_fe54')
    3095           10 :             ir55ng = do1('r_fe55_ng_fe56')
    3096           10 :             ir56gn = do1('r_fe56_gn_fe55')
    3097           10 :             irfe54ap = do1('r_fe54_ap_co57')
    3098           10 :             irco57pa = do1('r_co57_pa_fe54')
    3099           10 :             irfe56pg = do1('r_fe56_pg_co57')
    3100           10 :             irco57gp = do1('r_co57_gp_fe56')
    3101              : 
    3102              :             ! the equilibrium links come after the mesa reactions
    3103           10 :             ifa = num_mesa_reactions(plus_co56)+1
    3104           10 :             ifg = ifa+1
    3105              : 
    3106           10 :             irr1 = ifg+1
    3107           10 :             irs1 = irr1+1
    3108           10 :             irt1 = irs1+1
    3109           10 :             iru1 = irt1+1
    3110           10 :             irv1 = iru1+1
    3111           10 :             irw1 = irv1+1
    3112           10 :             irx1 = irw1+1
    3113              : 
    3114           10 :             ir1f54 = irx1+1
    3115           10 :             ir2f54 = ir1f54+1
    3116           10 :             ir3f54 = ir2f54+1
    3117           10 :             ir4f54 = ir3f54+1
    3118           10 :             ir5f54 = ir4f54+1
    3119           10 :             ir6f54 = ir5f54+1
    3120           10 :             ir7f54 = ir6f54+1
    3121           10 :             ir8f54 = ir7f54+1
    3122              : 
    3123           10 :             iralf1 = ir8f54+1
    3124           10 :             iralf2 = iralf1+1
    3125              : 
    3126           10 :             irfe56_aux1 = iralf2+1
    3127           10 :             irfe56_aux2 = irfe56_aux1+1
    3128           10 :             irfe56_aux3 = irfe56_aux2+1
    3129           10 :             irfe56_aux4 = irfe56_aux3+1
    3130              : 
    3131           10 :             if( (plus_co56 .and. irfe56_aux4 /= num_reactions(plus_co56)) .or. &
    3132           10 :                (.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           10 :             call init_approx21(plus_co56)
    3139              : 
    3140              :             contains
    3141              : 
    3142          934 :             integer function do1(str)
    3143              :                use utils_lib, only: mesa_error
    3144              :                character (len=*), intent(in) :: str
    3145              :                integer :: ir
    3146          934 :                ir = rates_reaction_id(str)
    3147          934 :                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          934 :                do1 = rtab(ir)
    3152          934 :                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          934 :                rate_id(do1) = ir
    3157          934 :             end function do1
    3158              : 
    3159              :          end subroutine set_approx21_reactions
    3160              : 
    3161              : 
    3162              :          ! call this after have set rate numbers
    3163           10 :          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           10 :             ratnam(ir3a)   = 'r_he4_he4_he4_to_c12'
    3171           10 :             ratnam(irg3a)  = 'r_c12_to_he4_he4_he4'
    3172           10 :             ratnam(ircag)  = 'r_c12_ag_o16'
    3173           10 :             ratnam(ir1212) = 'r1212'
    3174           10 :             ratnam(ir1216) = 'r1216'
    3175           10 :             ratnam(ir1616) = 'r1616'
    3176           10 :             ratnam(iroga)  = 'r_o16_ga_c12'
    3177           10 :             ratnam(iroag)  = 'r_o16_ag_ne20'
    3178           10 :             ratnam(irnega) = 'r_ne20_ga_o16'
    3179           10 :             ratnam(irneag) = 'r_ne20_ag_mg24'
    3180           10 :             ratnam(irmgga) = 'r_mg24_ga_ne20'
    3181              : 
    3182           10 :             ratnam(irmgag) = 'r_mg24_ag_si28'
    3183           10 :             ratnam(irsiga) = 'r_si28_ga_mg24'
    3184           10 :             ratnam(irmgap) = 'r_mg24_ap_al27'
    3185           10 :             ratnam(iralpa) = 'r_al27_pa_mg24'
    3186           10 :             ratnam(iralpg) = 'r_al27_pg_si28'
    3187           10 :             ratnam(irsigp) = 'r_si28_gp_al27'
    3188           10 :             ratnam(irsiag) = 'r_si28_ag_s32'
    3189           10 :             ratnam(irsga)  = 'r_s32_ga_si28'
    3190           10 :             ratnam(irsiap) = 'r_si28_ap_p31'
    3191           10 :             ratnam(irppa)  = 'r_p31_pa_si28'
    3192           10 :             ratnam(irppg)  = 'r_p31_pg_s32'
    3193           10 :             ratnam(irsgp)  = 'r_s32_gp_p31'
    3194           10 :             ratnam(irsag)  = 'r_s32_ag_ar36'
    3195           10 :             ratnam(irarga) = 'r_ar36_ga_s32'
    3196           10 :             ratnam(irsap)  = 'r_s32_ap_cl35'
    3197           10 :             ratnam(irclpa) = 'r_cl35_pa_s32'
    3198           10 :             ratnam(irclpg) = 'r_cl35_pg_ar36'
    3199           10 :             ratnam(irargp) = 'r_ar36_gp_cl35'
    3200           10 :             ratnam(irarag) = 'r_ar36_ag_ca40'
    3201           10 :             ratnam(ircaga) = 'r_ca40_ga_ar36'
    3202           10 :             ratnam(irarap) = 'r_ar36_ap_k39'
    3203           10 :             ratnam(irkpa)  = 'r_k39_pa_ar36'
    3204           10 :             ratnam(irkpg)  = 'r_k39_pg_ca40'
    3205           10 :             ratnam(ircagp) = 'r_ca40_gp_k39'
    3206           10 :             ratnam(ircaag) = 'r_ca40_ag_ti44'
    3207           10 :             ratnam(irtiga) = 'r_ti44_ga_ca40'
    3208           10 :             ratnam(ircaap) = 'r_ca40_ap_sc43'
    3209           10 :             ratnam(irscpa) = 'r_sc43_pa_ca40'
    3210           10 :             ratnam(irscpg) = 'r_sc43_pg_ti44'
    3211           10 :             ratnam(irtigp) = 'r_ti44_gp_sc43'
    3212           10 :             ratnam(irtiag) = 'r_ti44_ag_cr48'
    3213           10 :             ratnam(ircrga) = 'r_cr48_ga_ti44'
    3214           10 :             ratnam(irtiap) = 'r_ti44_ap_v47'
    3215           10 :             ratnam(irvpa)  = 'r_v47_pa_ti44'
    3216           10 :             ratnam(irvpg)  = 'r_v47_pg_cr48'
    3217           10 :             ratnam(ircrgp) = 'r_cr48_gp_v47'
    3218           10 :             ratnam(ircrag) = 'r_cr48_ag_fe52'
    3219           10 :             ratnam(irfega) = 'r_fe52_ga_cr48'
    3220           10 :             ratnam(ircrap) = 'r_cr48_ap_mn51'
    3221           10 :             ratnam(irmnpa) = 'r_mn51_pa_cr48'
    3222           10 :             ratnam(irmnpg) = 'r_mn51_pg_fe52'
    3223           10 :             ratnam(irfegp) = 'r_fe52_gp_mn51'
    3224           10 :             ratnam(irfeag) = 'r_fe52_ag_ni56'
    3225           10 :             ratnam(irniga) = 'r_ni56_ga_fe52'
    3226           10 :             ratnam(irfeap) = 'r_fe52_ap_co55'
    3227           10 :             ratnam(ircopa) = 'r_co55_pa_fe52'
    3228           10 :             ratnam(ircopg) = 'r_co55_pg_ni56'
    3229           10 :             ratnam(irnigp) = 'r_ni56_gp_co55'
    3230              : 
    3231              :             ! for fe54 photodisintegration
    3232           10 :             ratnam(ir52ng) = 'r_fe52_ng_fe53'
    3233           10 :             ratnam(ir53gn) = 'r_fe53_gn_fe52'
    3234           10 :             ratnam(ir53ng) = 'r_fe53_ng_fe54'
    3235           10 :             ratnam(ir54gn) = 'r_fe54_gn_fe53'
    3236           10 :             ratnam(irfepg) = 'r_fe54_pg_co55'
    3237           10 :             ratnam(ircogp) = 'r_co55_gp_fe54'
    3238              : 
    3239              :             ! for he4 photodisintegration
    3240           10 :             ratnam(irheng)  = 'r_he3_ng_he4'
    3241           10 :             ratnam(irhegn)  = 'r_he4_gn_he3'
    3242           10 :             ratnam(irhng)   = 'r_h1_ng_h2'
    3243           10 :             ratnam(irdgn)   = 'r_h2_gn_h1'
    3244           10 :             ratnam(irdpg)   = 'r_h2_pg_he3'
    3245           10 :             ratnam(irhegp)  = 'r_he3_gp_h2'
    3246              : 
    3247              :             ! for weak reactions
    3248           10 :             ratnam(irpen)   = 'rprot_to_neut'
    3249           10 :             ratnam(irnep)   = 'rneut_to_prot'
    3250              : 
    3251           10 :             if (plus_co56) then
    3252            4 :                ratnam(irn56ec) = 'r_ni56_wk_co56'
    3253            4 :                ratnam(irco56ec) = 'r_co56_wk_fe56'
    3254              :             else
    3255            6 :                ratnam(irn56ec) = 'rni56ec_to_fe56'
    3256              :             end if
    3257              : 
    3258              :             ! ppchain
    3259           10 :             ratnam(irpp)    = 'rpp_to_he3'
    3260           10 :             ratnam(ir33)    = 'r_he3_he3_to_h1_h1_he4'
    3261           10 :             ratnam(irhe3ag) = 'r_he3_ag_be7'
    3262           10 :             ratnam(ir_be7_wk_li7) = 'r_be7_wk_li7'
    3263           10 :             ratnam(ir_be7_pg_b8) = 'r_be7_pg_b8'
    3264              : 
    3265              :             ! cno cycles
    3266           10 :             ratnam(ircpg)   = 'r_c12_pg_n13'
    3267           10 :             ratnam(irnpg)   = 'r_n14_pg_o15'
    3268           10 :             ratnam(iropg)   = 'r_o16_pg_f17'
    3269              : 
    3270           10 :             ratnam(irn15pg) = 'r_n15_pg_o16'
    3271           10 :             ratnam(irn15pa) = 'r_n15_pa_c12'
    3272              : 
    3273           10 :             ratnam(irnag)   = 'r_n14_ag_f18'
    3274              : 
    3275           10 :             ratnam(ir54ng)   = 'r_fe54_ng_fe55'
    3276           10 :             ratnam(ir55gn)   = 'r_fe55_gn_fe54'
    3277           10 :             ratnam(ir55ng)   = 'r_fe55_ng_fe56'
    3278           10 :             ratnam(ir56gn)   = 'r_fe56_gn_fe55'
    3279           10 :             ratnam(irfe54ap) = 'r_fe54_ap_co57'
    3280           10 :             ratnam(irco57pa) = 'r_co57_pa_fe54'
    3281           10 :             ratnam(irfe56pg) = 'r_fe56_pg_co57'
    3282           10 :             ratnam(irco57gp) = 'r_co57_gp_fe56'
    3283              : 
    3284              : 
    3285              :             ! the combo links
    3286              : 
    3287           10 :             ratnam(ifa)     ='fa'  ! this is fraction of n15 that goes to c12 by pa
    3288           10 :             ratnam(ifg)     ='fg'  ! this is fraction of n15 that goes to o16 by pg
    3289              : 
    3290           10 :             ratnam(irr1)   = 'r1'
    3291           10 :             ratnam(irs1)   = 's1'
    3292           10 :             ratnam(irt1)   = 't1'
    3293           10 :             ratnam(iru1)   = 'u1'
    3294           10 :             ratnam(irv1)   = 'v1'
    3295           10 :             ratnam(irw1)   = 'w1'
    3296           10 :             ratnam(irx1)   = 'x1'
    3297              : 
    3298           10 :             ratnam(ir1f54) = 'r1f54'
    3299           10 :             ratnam(ir2f54) = 'r2f54'
    3300           10 :             ratnam(ir3f54) = 'r3f54'  ! rfe54prot_to_ni56
    3301           10 :             ratnam(ir4f54) = 'r4f54'  ! rni56gprot_to_fe54
    3302           10 :             ratnam(ir5f54) = 'r5f54'
    3303           10 :             ratnam(ir6f54) = 'r6f54'
    3304           10 :             ratnam(ir7f54) = 'r7f54'  ! rfe52aprot_to_ni56
    3305           10 :             ratnam(ir8f54) = 'r8f54'  ! rni56gprot_to_fe52
    3306              : 
    3307           10 :             ratnam(iralf1) = 'ralf1'
    3308           10 :             ratnam(iralf2) = 'ralf2'
    3309              : 
    3310           10 :             ratnam(irfe56_aux1) = 'rfe56aux1'
    3311           10 :             ratnam(irfe56_aux2) = 'rfe56aux2'
    3312           10 :             ratnam(irfe56_aux3) = 'rfe56aux3'
    3313           10 :             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        36344 :          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        36344 :             eval_fe56ec_fake_factor = 0.d0
    3332        36344 :             if(temp >= min_T)then
    3333        29660 :                eval_fe56ec_fake_factor = fe56ec_fake_factor
    3334              :             end if
    3335              : 
    3336            0 :          end function eval_fe56ec_fake_factor
    3337              : 
    3338              : 
    3339        27342 :          pure integer function num_reactions(plus_co56)
    3340              :             logical, intent(in) :: plus_co56
    3341              : 
    3342        27342 :             if(plus_co56) then
    3343              :                num_reactions = approx21_plus_co56_nrat
    3344              :             else
    3345        27322 :                num_reactions = approx21_nrat
    3346              :             end if
    3347              : 
    3348        27332 :          end function num_reactions
    3349              : 
    3350              : 
    3351         9116 :          pure integer function num_mesa_reactions(plus_co56)
    3352              :             logical, intent(in) :: plus_co56
    3353              : 
    3354         9116 :             if(plus_co56) then
    3355              :                num_mesa_reactions = approx21_num_mesa_reactions_co56
    3356              :             else
    3357         9108 :                num_mesa_reactions = approx21_num_mesa_reactions_21
    3358              :             end if
    3359              : 
    3360            0 :          end function num_mesa_reactions
    3361              : 
    3362        21194 :          pure integer function species(plus_co56)
    3363              :             logical, intent(in) :: plus_co56
    3364              : 
    3365        60520 :             if(plus_co56) then
    3366              :                species = species_co56
    3367              :             else
    3368        60484 :                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