| 1 | !!****if* source/physics/Eos/EosNuclear/Eos_nucOneZone
|
|---|
| 2 | !!
|
|---|
| 3 | !! NAME
|
|---|
| 4 | !!
|
|---|
| 5 | !! Eos_nucOneZone
|
|---|
| 6 | !!
|
|---|
| 7 | !! SYNOPSIS
|
|---|
| 8 | !!
|
|---|
| 9 | !! call Eos_nucOneZone(real(INOUT) :: xdens,
|
|---|
| 10 | !! real(INOUT) :: xtemp,
|
|---|
| 11 | !! real(IN) :: xye,
|
|---|
| 12 | !! real(INOUT) :: xener,
|
|---|
| 13 | !! real(INOUT) :: xpres,
|
|---|
| 14 | !! real(INOUT) :: xentr,
|
|---|
| 15 | !! real(OUT) :: xVar,
|
|---|
| 16 | !! integer(IN) :: mode)
|
|---|
| 17 | !!
|
|---|
| 18 | !! DESCRIPTION
|
|---|
| 19 | !!
|
|---|
| 20 | !! Routine for cranking the EOS on a single zone, in any old
|
|---|
| 21 | !! mode you like. Calls kernel routine nuc_eos_full. Can also
|
|---|
| 22 | !! be used to recover values from the table that are not provided
|
|---|
| 23 | !! by nuc_eos_short without doing a full EOS solve.
|
|---|
| 24 | !!
|
|---|
| 25 | !! ARGUMENTS
|
|---|
| 26 | !!
|
|---|
| 27 | !! mode : Eos mode
|
|---|
| 28 | !!
|
|---|
| 29 | !! NOTES
|
|---|
| 30 | !! Parts of this subunit are released under a different license than the
|
|---|
| 31 | !! usual FLASH license. Specifically, some subroutines in the kernel
|
|---|
| 32 | !! directory are released under the Creative Commons
|
|---|
| 33 | !! attribution-noncommercial-share alike license. Basically, if you use this
|
|---|
| 34 | !! subunit in your work, the license requires that you cite the two articles
|
|---|
| 35 | !! mentioned below. More details may be found here:
|
|---|
| 36 | !! stellarcollapse.org/equationofstate.
|
|---|
| 37 | !!
|
|---|
| 38 | !! * O'Connor, E.P., & Ott, C.D. 2010, CQGra, 27, 114103
|
|---|
| 39 | !! * Couch, S.M. 2013, ApJ, 765, 29
|
|---|
| 40 | !!
|
|---|
| 41 | !!
|
|---|
| 42 | !!***
|
|---|
| 43 |
|
|---|
| 44 | subroutine Eos_nucOneZone(xDens,xTemp,xYe,xEner,xPres,xEntr,xdedt,xCs2,xXp,xXn,xXa,xXh,xVar,varID,mode)
|
|---|
| 45 |
|
|---|
| 46 | #include "Flash.h"
|
|---|
| 47 | #include "constants.h"
|
|---|
| 48 |
|
|---|
| 49 | #ifndef _CIVL
|
|---|
| 50 |
|
|---|
| 51 | use Driver_interface, ONLY : Driver_abortFlash
|
|---|
| 52 | use eosmodule, ONLY : precision, temp_mev_to_kelvin, e_zeroPoint, alltables
|
|---|
| 53 |
|
|---|
| 54 | implicit none
|
|---|
| 55 |
|
|---|
| 56 | real, intent(INOUT) :: xDens
|
|---|
| 57 | real, intent(IN) :: xYe
|
|---|
| 58 | real, intent(INOUT) :: xTemp, xEner, xEntr, xPres
|
|---|
| 59 | integer, intent(IN) :: mode, varID
|
|---|
| 60 | real, intent(OUT) :: xXp, xXn, xXa,xXh,xdedt,xCs2,xVar
|
|---|
| 61 |
|
|---|
| 62 | interface
|
|---|
| 63 | subroutine nuc_eos_full(xrho,xtemp,xye,xenr,xprs,xent,xcs2,xdedt,&
|
|---|
| 64 | xdpderho,xdpdrhoe,xxa,xxh,xxn,xxp,xabar,xzbar,xmu_e,xmu_n,xmu_p, &
|
|---|
| 65 | xmuhat,keytemp,keyerr,rfeps)
|
|---|
| 66 | implicit none
|
|---|
| 67 | real*8, intent(in) :: xye
|
|---|
| 68 | real*8, intent(inout) :: xrho,xtemp,xenr,xent
|
|---|
| 69 | real*8, intent(out) :: xprs,xcs2,xdedt
|
|---|
| 70 | real*8, intent(out) :: xdpderho,xdpdrhoe,xxa,xxh,xxn,xxp
|
|---|
| 71 | real*8, intent(out) :: xabar,xzbar,xmu_e,xmu_n,xmu_p,xmuhat
|
|---|
| 72 | real*8, intent(in) :: rfeps
|
|---|
| 73 | integer, intent(in) :: keytemp
|
|---|
| 74 | integer, intent(out) :: keyerr
|
|---|
| 75 | end subroutine nuc_eos_full
|
|---|
| 76 | end interface
|
|---|
| 77 |
|
|---|
| 78 | real :: xAbar,xZbar,xMu_e,xMu_n,xMu_p,xMuhat
|
|---|
| 79 |
|
|---|
| 80 | real, parameter :: KtoMev = 1./temp_mev_to_kelvin
|
|---|
| 81 |
|
|---|
| 82 | integer :: xMode, err
|
|---|
| 83 | real :: xdpderho, xGamc
|
|---|
| 84 | real :: xdpdrhoe,xGame
|
|---|
| 85 |
|
|---|
| 86 | real :: d1,d2,d3
|
|---|
| 87 | real :: lr, lt
|
|---|
| 88 |
|
|---|
| 89 | ! index var mapping:
|
|---|
| 90 | ! 0 -> full eos call
|
|---|
| 91 | ! 1 -> logpress
|
|---|
| 92 | ! 2 -> logenergy
|
|---|
| 93 | ! 3 -> entropy
|
|---|
| 94 | ! 4 -> munu
|
|---|
| 95 | ! 5 -> cs2
|
|---|
| 96 | ! 6 -> dedT
|
|---|
| 97 | ! 7 -> dpdrhoe
|
|---|
| 98 | ! 8 -> dpderho
|
|---|
| 99 | ! 9 -> muhat
|
|---|
| 100 | ! 10 -> mu_e
|
|---|
| 101 | ! 11 -> mu_p
|
|---|
| 102 | ! 12 -> mu_n
|
|---|
| 103 | ! 13 -> xa
|
|---|
| 104 | ! 14 -> xh
|
|---|
| 105 | ! 15 -> xn
|
|---|
| 106 | ! 16 -> xp
|
|---|
| 107 | ! 17 -> abar
|
|---|
| 108 | ! 18 -> zbar
|
|---|
| 109 | ! 19 -> gamma
|
|---|
| 110 | ! 20 -> mu_nu
|
|---|
| 111 |
|
|---|
| 112 | select case(mode)
|
|---|
| 113 | case(MODE_DENS_EI)
|
|---|
| 114 | xMode = 0
|
|---|
| 115 | case(MODE_DENS_TEMP)
|
|---|
| 116 | xMode = 1
|
|---|
| 117 | case(MODE_DENS_ENTR)
|
|---|
| 118 | xMode = 2
|
|---|
| 119 | case default
|
|---|
| 120 | call Driver_abortFlash('[Eos] Error: unsupported mode for Nuclear Eos')
|
|---|
| 121 | end select
|
|---|
| 122 |
|
|---|
| 123 | xTemp = xTemp * KtoMev
|
|---|
| 124 | xEner = xEner - e_zeroPoint
|
|---|
| 125 |
|
|---|
| 126 | if (varID == 0) then
|
|---|
| 127 | call nuc_eos_full(xDens,xTemp,xYe,xEner,xPres,xEntr,xCs2,xdedt,&
|
|---|
| 128 | xdpderho,xdpdrhoe,xXa,xXh,xXn,xXp,xAbar,xZbar,xMu_e,xMu_n,xMu_p, &
|
|---|
| 129 | xMuhat,xMode,err,precision)
|
|---|
| 130 | elseif (varID == 20) then
|
|---|
| 131 | ! this mode should only be used when grabbing variables for an already
|
|---|
| 132 | ! consistent thermodynamics. Don't call this if thermo state has changed!
|
|---|
| 133 | lr = log10(xDens)
|
|---|
| 134 | lt = log10(xTemp)
|
|---|
| 135 | call findthis(lr,lt,xYe,xMu_e,alltables(:,:,:,10),d1,d2,d3)
|
|---|
| 136 | call findthis(lr,lt,xYe,xMu_p,alltables(:,:,:,11),d1,d2,d3)
|
|---|
| 137 | call findthis(lr,lt,xYe,xMu_n,alltables(:,:,:,12),d1,d2,d3)
|
|---|
| 138 |
|
|---|
| 139 | xVar = xMu_e - xMu_n + xMu_p
|
|---|
| 140 |
|
|---|
| 141 | else
|
|---|
| 142 | lr = log10(xDens)
|
|---|
| 143 | lt = log10(xTemp)
|
|---|
| 144 | call findthis(lr,lt,xYe,xVar,alltables(:,:,:,varID),d1,d2,d3)
|
|---|
| 145 | endif
|
|---|
| 146 |
|
|---|
| 147 | ! if (err /= 0) then
|
|---|
| 148 | ! call Driver_abortFlash('[Eos] Error in Eos_nucOneZone')
|
|---|
| 149 | ! endif
|
|---|
| 150 |
|
|---|
| 151 | xTemp = xTemp * temp_mev_to_kelvin
|
|---|
| 152 | xEner = xEner + e_zeroPoint
|
|---|
| 153 |
|
|---|
| 154 | return
|
|---|
| 155 |
|
|---|
| 156 | #else
|
|---|
| 157 | use eosmodule, ONLY : precision, temp_mev_to_kelvin, e_zeroPoint, alltables
|
|---|
| 158 |
|
|---|
| 159 | implicit none
|
|---|
| 160 |
|
|---|
| 161 | real, intent(INOUT) :: xDens
|
|---|
| 162 | real, intent(IN) :: xYe
|
|---|
| 163 | real, intent(INOUT) :: xTemp, xEner, xEntr, xPres
|
|---|
| 164 | integer, intent(IN) :: mode, varID
|
|---|
| 165 | real, intent(OUT) :: xXp, xXn, xXa,xXh,xdedt,xCs2,xVar
|
|---|
| 166 | real :: lr, lt
|
|---|
| 167 | real :: d1,d2,d3
|
|---|
| 168 |
|
|---|
| 169 | xTemp = xTemp * KtoMev
|
|---|
| 170 | xEner = xEner - e_zeroPoint
|
|---|
| 171 |
|
|---|
| 172 | lr = log10(xDens)
|
|---|
| 173 | lt = log10(xTemp)
|
|---|
| 174 | call findthis(lr,lt,xYe,xVar,alltables(:,:,:,varID),d1,d2,d3)
|
|---|
| 175 |
|
|---|
| 176 | xTemp = xTemp * temp_mev_to_kelvin
|
|---|
| 177 | xEner = xEner + e_zeroPoint
|
|---|
| 178 |
|
|---|
| 179 | return
|
|---|
| 180 | #endif
|
|---|
| 181 |
|
|---|
| 182 | end subroutine Eos_nucOneZone
|
|---|