Utility functions¶
The petitRADTRANS.nat_cst package contains some useful utility functions for generating spectra and observables, the use of which are shown below. It also contains useful constants, see the nat_cst code documentation. First we load the package:
[4]:
from petitRADTRANS import nat_cst as nc
import numpy as np
Planck function¶
The planck function \(B_\nu(T)\), in units of erg/cm\(^2\)/s/Hz/steradian, for a given frequency array, can be generated like this:
[5]:
# Define wavelength array, in cm
lamb = np.logspace(-5,-2,100)
# Convert to frequencies
freq = nc.c / lamb
# Calculate Planck function at 5750 K
planck = nc.b(5750., freq)
Let’s plot the Planck function:
[6]:
# Plot Planck function
import pylab as plt
plt.rcParams['figure.figsize'] = (10, 6)
plt.plot(lamb/1e-4, planck)
plt.xscale('log')
plt.xlabel('Wavelength (micron)')
plt.ylabel('Intensity (erg/cm$^2$/s/Hz/sterad)')
plt.show()
plt.clf()

<Figure size 720x432 with 0 Axes>
PHOENIX and ATLAS9 stellar model spectra¶
Within petitRADTRANS the PHOENIX and ATLAS9 stellar spectra can be used, as described in Appendix A of van Boekel et al. (2012). The PHOENIX model refrence, for stellar effective temperatures < 10,000 K is Husser et al. (2013). The ATLAS9 model references for effective temperatures > 10,000 K are Kurucz (1979, 1992, 1994).
The models can be acessed like this, this is for a 5750 K effective temperature star on the main sequence:
[7]:
stellar_spec = nc.get_PHOENIX_spec(5750)
wlen_in_cm = stellar_spec[:,0]
flux_star = stellar_spec[:,1]
Let’s plot the spectrum, and also overplot the black body flux from the previous section (note the required factor of \(\pi\) to convert the black body intensity to flux):
[8]:
import pylab as plt
plt.plot(wlen_in_cm/1e-4, flux_star, label = 'PHOENIX model')
plt.plot(lamb/1e-4, np.pi*planck, label = 'black body flux')
plt.title(r'$T_{\rm eff}=5750$ K')
plt.xscale('log')
plt.xlabel('Wavelength (micron)')
plt.ylabel('Surface flux (erg/cm$^2$/s/Hz/sterad)')
plt.legend(loc = 'best', frameon = False)
plt.show()
plt.clf()

<Figure size 720x432 with 0 Axes>
Guillot temperature model¶
In petitRADTRANS, one can use analytical atmospheric P-T profile from Guillot (2010), his Equation 29:
with \(\tau = P\kappa_{\rm IR}/g\). Here, \(\tau\) is the optical depth, \(P\) the pressure, \(\kappa_{\rm IR}\) the atmospheric opacity in the IR wavelengths (i.e. the cross-section per unit mass), \(g\) the atmospheric surface gravity, \(\gamma\) is the ratio between the optical and IR opacity, \(T_{\rm equ}\) the atmospheric equilibrium temperature, and \(T_{\rm int}\) is the planetary internal temperature.
Let’s define an example, all units are cgs units, except for the pressure, which is in bars:
[9]:
from petitRADTRANS.physics import guillot_global
kappa_IR = 0.01
gamma = 0.4
T_int = 200.
T_equ = 1500.
gravity = 1e1**2.45
pressures = np.logspace(-6, 2, 100)
temperature = guillot_global(pressures, kappa_IR, gamma, gravity, T_int, T_equ)
Let’s plot the P-T profile:
[10]:
plt.plot(temperature, pressures)
plt.yscale('log')
plt.ylim([1e2, 1e-6])
plt.xlabel('T (K)')
plt.ylabel('P (bar)')
plt.show()
plt.clf()

<Figure size 720x432 with 0 Axes>
[ ]: