pynucastro usage examples#
This notebook illustrates some of the higher-level data structures in pynucastro
.
[1]:
import pynucastro as pyna
Examining a single rate#
There are several ways to load a single rate. If you down load the specific rate file from the JINA ReacLib website, then you can load the rate via load_rate()
and just giving that file name, e.g.,
c13pg = pyna.load_rate("c13-pg-n14-nacr")
However, an easier way to do this is to pass in the shorthand name for the rate to a library. Here we’ll read in the entire ReacLib library and get the \({}^{12}\mathrm{C}(\alpha,\gamma){}^{16}\mathrm{O}\) rate. The result will be a Rate
object (or an object of a class derived from Rate
). There are a lot of methods in the Rate
class that allow you to explore the rate.
[2]:
rl = pyna.ReacLibLibrary()
c13pg = rl.get_rate_by_name("c13(p,g)n14")
A Rate
can display itself nicely
[3]:
c13pg
[3]:
C13 + p ⟶ N14 + 𝛾
the original reaclib source#
we can easily see the original source from ReacLib
[4]:
print(c13pg.original_source)
4
p c13 n14 nacrr 7.55100e+00
1.518250e+01-1.355430e+01 0.000000e+00 0.000000e+00
0.000000e+00 0.000000e+00-1.500000e+00
4
p c13 n14 nacrn 7.55100e+00
1.851550e+01 0.000000e+00-1.372000e+01-4.500180e-01
3.708230e+00-1.705450e+00-6.666670e-01
4
p c13 n14 nacrr 7.55100e+00
1.396370e+01-5.781470e+00 0.000000e+00-1.967030e-01
1.421260e-01-2.389120e-02-1.500000e+00
This is a rate that consists of 3 sets, each of which has 7 coefficients in a form:
reference for the rate#
We can find the reference in the literature that provided the rate (if available)
[5]:
c13pg.source
[5]:
{'Label': 'nacr',
'Author': 'Angulo C.',
'Title': 'A compilation of charged-particle induced thermonuclear reaction rates',
'Publisher': 'Nuclear Physics, A656, 3-183',
'Year': '1999',
'URL': 'https://reaclib.jinaweb.org/labels.php?action=viewLabel&label=nacr'}
evaluate the rate at a given temperature (in K)#
This is just the temperature dependent portion of the rate, usually expressed as \(N_A \langle \sigma v \rangle\)
[6]:
c13pg.eval(1.e9)
[6]:
3883.4778216250666
nuclei involved#
The nuclei involved are all Nucleus
objects. They have members Z
and N
that give the proton and neutron number
[7]:
print(c13pg.reactants)
print(c13pg.products)
[p, C13]
[N14]
[8]:
r2 = c13pg.reactants[1]
Note that each of the nuclei are a pynucastro Nucleus
type
[9]:
type(r2)
[9]:
pynucastro.nucdata.nucleus.Nucleus
[10]:
print(r2.Z, r2.N)
6 7
temperature sensitivity#
We can find the temperature sensitivity about some reference temperature. This is the exponent when we write the rate as
.
We can estimate this given a reference temperature, \(T_0\)
[11]:
c13pg.get_rate_exponent(2.e7)
[11]:
16.21089670710968
plot the rate’s temperature dependence#
A reaction rate has a complex temperature dependence that is defined in the reaclib files. The plot()
method will plot this for us
[12]:
fig = c13pg.plot()
density dependence#
A rate also knows its density dependence – this is inferred from the reactants in the rate description and is used to construct the terms needed to write a reaction network. Note: since we want reaction rates per gram, this number is 1 less than the number of nuclei
[13]:
c13pg.dens_exp
[13]:
1
Working with a group of rates#
A RateCollection()
class allows us to work with a group of rates. This is used to explore their relationship. Other classes (introduced soon) are built on this and will allow us to output network code directly.
Here we create a list with some of the individual rates in the ReacLib library
[14]:
rate_names = ["c12(p,g)n13",
"c13(p,g)n14",
"n13(,)c13",
"n13(p,g)o14",
"n14(p,g)o15",
"n15(p,a)c12",
"o14(,)n14",
"o15(,)n15"]
rates = rl.get_rate_by_name(rate_names)
rc = pyna.RateCollection(rates=rates)
Printing a rate collection shows all the rates
[15]:
print(rc)
C12 + p ⟶ N13 + 𝛾
C13 + p ⟶ N14 + 𝛾
N13 ⟶ C13 + e⁺ + 𝜈
N13 + p ⟶ O14 + 𝛾
N14 + p ⟶ O15 + 𝛾
N15 + p ⟶ He4 + C12
O14 ⟶ N14 + e⁺ + 𝜈
O15 ⟶ N15 + e⁺ + 𝜈
More detailed information is provided by network_overview()
[16]:
print(rc.network_overview())
p
consumed by:
C12 + p ⟶ N13 + 𝛾
C13 + p ⟶ N14 + 𝛾
N13 + p ⟶ O14 + 𝛾
N14 + p ⟶ O15 + 𝛾
N15 + p ⟶ He4 + C12
produced by:
He4
consumed by:
produced by:
N15 + p ⟶ He4 + C12
C12
consumed by:
C12 + p ⟶ N13 + 𝛾
produced by:
N15 + p ⟶ He4 + C12
C13
consumed by:
C13 + p ⟶ N14 + 𝛾
produced by:
N13 ⟶ C13 + e⁺ + 𝜈
N13
consumed by:
N13 ⟶ C13 + e⁺ + 𝜈
N13 + p ⟶ O14 + 𝛾
produced by:
C12 + p ⟶ N13 + 𝛾
N14
consumed by:
N14 + p ⟶ O15 + 𝛾
produced by:
C13 + p ⟶ N14 + 𝛾
O14 ⟶ N14 + e⁺ + 𝜈
N15
consumed by:
N15 + p ⟶ He4 + C12
produced by:
O15 ⟶ N15 + e⁺ + 𝜈
O14
consumed by:
O14 ⟶ N14 + e⁺ + 𝜈
produced by:
N13 + p ⟶ O14 + 𝛾
O15
consumed by:
O15 ⟶ N15 + e⁺ + 𝜈
produced by:
N14 + p ⟶ O15 + 𝛾
show a network diagram#
We visualize the network using NetworkX. By default, this does not show H or He unless we have H + H or triple-alpha reactions in the network. This is intended to reduce clutter.
[17]:
fig = rc.plot()
There are many options that can be used to configure this plot, for instance, creating a rotated version (useful for very large nets).
Explore the network’s rates#
To evaluate the rates, we need a composition
[18]:
comp = pyna.Composition(rc.get_nuclei())
comp.set_solar_like()
Interactive exploration is enabled through the Explorer
class, which takes a RateCollection
and a Composition
[19]:
re = pyna.Explorer(rc, comp)
re.explore()