source: CIVL/mods/dev.civl.abc/examples/fortran/flash/block/Eos_nucOneZone.F90

main
Last change on this file was aad342c, checked in by Stephen Siegel <siegel@…>, 3 years ago

Performing huge refactor to incorporate ABC, GMC, and SARL into CIVL repo and use Java modules.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5664 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 4.9 KB
Line 
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
44subroutine 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
182end subroutine Eos_nucOneZone
Note: See TracBrowser for help on using the repository browser.