Module diskchef.chemistry.williams_best_co

Expand source code
from dataclasses import dataclass

import numpy as np
from astropy import units as u

import diskchef.engine
from diskchef.chemistry.base import ChemistryModel
from diskchef.physics.williams_best import WilliamsBest2014


@dataclass
class ChemistryWB2014(ChemistryModel):
    """Calculates chemistry according to Williams & Best 2014

    Eq. 5-7
    https://iopscience.iop.org/article/10.1088/0004-637X/788/1/59/pdf


    Usage:

    >>> # Define physics first
    >>> physics = WilliamsBest2014(radial_bins=3, vertical_bins=3)
    >>> # Define chemistry class using the physics instance
    >>> chemistry = ChemistryWB2014(physics)
    >>> # chemistry.table is pointing to the physics.table
    >>> chemistry.table  # doctest: +NORMALIZE_WHITESPACE
    <CTable length=9>
       Radius       Height    Height to radius Gas density  Dust density Gas temperature Dust temperature   n(H+2H2)
         AU           AU                         g / cm3      g / cm3           K               K           1 / cm3
      float64      float64        float64        float64      float64        float64         float64        float64
    ------------ ------------ ---------------- ------------ ------------ --------------- ---------------- ------------
    1.000000e-01 0.000000e+00     0.000000e+00 1.153290e-15 1.153290e-17    7.096268e+02     7.096268e+02 5.095483e+08
    1.000000e-01 3.500000e-02     3.500000e-01 5.024587e-34 5.024587e-36    3.548134e+03     3.548134e+03 2.219970e-10
    1.000000e-01 7.000000e-02     7.000000e-01 5.921268e-72 5.921268e-74    3.548134e+03     3.548134e+03 2.616143e-48
    7.071068e+00 0.000000e+00     0.000000e+00 2.285168e-13 2.285168e-15    6.820453e+01     6.820453e+01 1.009636e+11
    7.071068e+00 2.474874e+00     3.500000e-01 2.716386e-17 2.716386e-19    3.410227e+02     3.410227e+02 1.200157e+07
    7.071068e+00 4.949747e+00     7.000000e-01 7.189026e-23 7.189026e-25    3.410227e+02     3.410227e+02 3.176265e+01
    5.000000e+02 0.000000e+00     0.000000e+00 2.871710e-20 2.871710e-22    6.555359e+00     6.555359e+00 1.268783e+04
    5.000000e+02 1.750000e+02     3.500000e-01 6.929036e-22 6.929036e-24    2.625083e+01     2.625083e+01 3.061396e+02
    5.000000e+02 3.500000e+02     7.000000e-01 8.170464e-23 8.170464e-25    3.277680e+01     3.277680e+01 3.609885e+01

    >>> # Now run chemistry calculations
    >>> chemistry.run_chemistry()
    >>> # This updates chemistry.table with new columns
    >>> chemistry.table.colnames  # doctest: +NORMALIZE_WHITESPACE
    ['Radius', 'Height', 'Height to radius', 'Gas density', 'Dust density', 'Gas temperature', 'Dust temperature',
    'n(H+2H2)', 'H2', 'H2 number density', 'H2 column density towards star', 'H2 column density upwards', 'CO']
    >>> chemistry.table['H2']
    <Column name='H2' dtype='float64' format='e' length=9>
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01

    >>> # Remember that chemistry.table is just a pointer to chemistry.physics.table:
    >>> chemistry.table is chemistry.physics.table
    True
    """
    midplane_co_abundance: float = 0
    molecular_layer_co_abundance: float = 1e-4
    co_freezeout_temperature: u.Quantity = 20 * u.K
    atmosphere_co_abundance: float = 0
    h2_column_denisty_that_shields_co: u.Quantity = 1.3e21 / u.cm ** 2

    def run_chemistry(self):
        self.table["H2"] = 0.5
        self.calculate_column_density_towards_star("H2")
        self.calculate_column_density_upwards("H2")

        self.table["CO"] = self.midplane_co_abundance
        self.table["CO"][
            self.table["Gas temperature"] > self.co_freezeout_temperature
            ] = self.molecular_layer_co_abundance

        self.table["CO"][
            (self.table["H2 column density towards star"] < self.h2_column_denisty_that_shields_co)
            | (self.table["H2 column density upwards"] < self.h2_column_denisty_that_shields_co)
            ] = self.atmosphere_co_abundance


@dataclass
class NonzeroChemistryWB2014(ChemistryWB2014):
    """
    Subclass of ChemistryWB2014 that has non-zero default midplane and atmosphere abundance

    Usage:

    >>> physics = WilliamsBest2014(radial_bins=3, vertical_bins=3)
    >>> chemistry = NonzeroChemistryWB2014(physics)
    >>> chemistry.run_chemistry()
    >>> chemistry.table["CO"].info.format = "e"
    >>> chemistry.table["CO"]
    <Column name='CO' dtype='float64' format='e' length=9>
    1.000000e-10
    1.000000e-10
    1.000000e-10
    1.000000e-04
    1.000000e-10
    1.000000e-10
    1.000000e-10
    1.000000e-10
    1.000000e-10
    """
    midplane_co_abundance: float = 1e-6
    atmosphere_co_abundance: float = 1e-10

Classes

class ChemistryWB2014 (physics: PhysicsBase = None, molar_mass: Unit("g / mol") = <Quantity 2.33 g / mol>, hydrogen_mass_fraction: float = 0.739, initial_abundances: Abundances = {'H2': 0.5, 'CO': 5e-05}, midplane_co_abundance: float = 0, molecular_layer_co_abundance: float = 0.0001, co_freezeout_temperature: astropy.units.quantity.Quantity = <Quantity 20. K>, atmosphere_co_abundance: float = 0, h2_column_denisty_that_shields_co: astropy.units.quantity.Quantity = <Quantity 1.3e+21 1 / cm2>)

Calculates chemistry according to Williams & Best 2014

Eq. 5-7 https://iopscience.iop.org/article/10.1088/0004-637X/788/1/59/pdf

Usage:

>>> # Define physics first
>>> physics = WilliamsBest2014(radial_bins=3, vertical_bins=3)
>>> # Define chemistry class using the physics instance
>>> chemistry = ChemistryWB2014(physics)
>>> # chemistry.table is pointing to the physics.table
>>> chemistry.table  # doctest: +NORMALIZE_WHITESPACE
<CTable length=9>
   Radius       Height    Height to radius Gas density  Dust density Gas temperature Dust temperature   n(H+2H2)
     AU           AU                         g / cm3      g / cm3           K               K           1 / cm3
  float64      float64        float64        float64      float64        float64         float64        float64
------------ ------------ ---------------- ------------ ------------ --------------- ---------------- ------------
1.000000e-01 0.000000e+00     0.000000e+00 1.153290e-15 1.153290e-17    7.096268e+02     7.096268e+02 5.095483e+08
1.000000e-01 3.500000e-02     3.500000e-01 5.024587e-34 5.024587e-36    3.548134e+03     3.548134e+03 2.219970e-10
1.000000e-01 7.000000e-02     7.000000e-01 5.921268e-72 5.921268e-74    3.548134e+03     3.548134e+03 2.616143e-48
7.071068e+00 0.000000e+00     0.000000e+00 2.285168e-13 2.285168e-15    6.820453e+01     6.820453e+01 1.009636e+11
7.071068e+00 2.474874e+00     3.500000e-01 2.716386e-17 2.716386e-19    3.410227e+02     3.410227e+02 1.200157e+07
7.071068e+00 4.949747e+00     7.000000e-01 7.189026e-23 7.189026e-25    3.410227e+02     3.410227e+02 3.176265e+01
5.000000e+02 0.000000e+00     0.000000e+00 2.871710e-20 2.871710e-22    6.555359e+00     6.555359e+00 1.268783e+04
5.000000e+02 1.750000e+02     3.500000e-01 6.929036e-22 6.929036e-24    2.625083e+01     2.625083e+01 3.061396e+02
5.000000e+02 3.500000e+02     7.000000e-01 8.170464e-23 8.170464e-25    3.277680e+01     3.277680e+01 3.609885e+01
>>> # Now run chemistry calculations
>>> chemistry.run_chemistry()
>>> # This updates chemistry.table with new columns
>>> chemistry.table.colnames  # doctest: +NORMALIZE_WHITESPACE
['Radius', 'Height', 'Height to radius', 'Gas density', 'Dust density', 'Gas temperature', 'Dust temperature',
'n(H+2H2)', 'H2', 'H2 number density', 'H2 column density towards star', 'H2 column density upwards', 'CO']
>>> chemistry.table['H2']
<Column name='H2' dtype='float64' format='e' length=9>
5.000000e-01
5.000000e-01
5.000000e-01
5.000000e-01
5.000000e-01
5.000000e-01
5.000000e-01
5.000000e-01
5.000000e-01
>>> # Remember that chemistry.table is just a pointer to chemistry.physics.table:
>>> chemistry.table is chemistry.physics.table
True
Expand source code
@dataclass
class ChemistryWB2014(ChemistryModel):
    """Calculates chemistry according to Williams & Best 2014

    Eq. 5-7
    https://iopscience.iop.org/article/10.1088/0004-637X/788/1/59/pdf


    Usage:

    >>> # Define physics first
    >>> physics = WilliamsBest2014(radial_bins=3, vertical_bins=3)
    >>> # Define chemistry class using the physics instance
    >>> chemistry = ChemistryWB2014(physics)
    >>> # chemistry.table is pointing to the physics.table
    >>> chemistry.table  # doctest: +NORMALIZE_WHITESPACE
    <CTable length=9>
       Radius       Height    Height to radius Gas density  Dust density Gas temperature Dust temperature   n(H+2H2)
         AU           AU                         g / cm3      g / cm3           K               K           1 / cm3
      float64      float64        float64        float64      float64        float64         float64        float64
    ------------ ------------ ---------------- ------------ ------------ --------------- ---------------- ------------
    1.000000e-01 0.000000e+00     0.000000e+00 1.153290e-15 1.153290e-17    7.096268e+02     7.096268e+02 5.095483e+08
    1.000000e-01 3.500000e-02     3.500000e-01 5.024587e-34 5.024587e-36    3.548134e+03     3.548134e+03 2.219970e-10
    1.000000e-01 7.000000e-02     7.000000e-01 5.921268e-72 5.921268e-74    3.548134e+03     3.548134e+03 2.616143e-48
    7.071068e+00 0.000000e+00     0.000000e+00 2.285168e-13 2.285168e-15    6.820453e+01     6.820453e+01 1.009636e+11
    7.071068e+00 2.474874e+00     3.500000e-01 2.716386e-17 2.716386e-19    3.410227e+02     3.410227e+02 1.200157e+07
    7.071068e+00 4.949747e+00     7.000000e-01 7.189026e-23 7.189026e-25    3.410227e+02     3.410227e+02 3.176265e+01
    5.000000e+02 0.000000e+00     0.000000e+00 2.871710e-20 2.871710e-22    6.555359e+00     6.555359e+00 1.268783e+04
    5.000000e+02 1.750000e+02     3.500000e-01 6.929036e-22 6.929036e-24    2.625083e+01     2.625083e+01 3.061396e+02
    5.000000e+02 3.500000e+02     7.000000e-01 8.170464e-23 8.170464e-25    3.277680e+01     3.277680e+01 3.609885e+01

    >>> # Now run chemistry calculations
    >>> chemistry.run_chemistry()
    >>> # This updates chemistry.table with new columns
    >>> chemistry.table.colnames  # doctest: +NORMALIZE_WHITESPACE
    ['Radius', 'Height', 'Height to radius', 'Gas density', 'Dust density', 'Gas temperature', 'Dust temperature',
    'n(H+2H2)', 'H2', 'H2 number density', 'H2 column density towards star', 'H2 column density upwards', 'CO']
    >>> chemistry.table['H2']
    <Column name='H2' dtype='float64' format='e' length=9>
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01
    5.000000e-01

    >>> # Remember that chemistry.table is just a pointer to chemistry.physics.table:
    >>> chemistry.table is chemistry.physics.table
    True
    """
    midplane_co_abundance: float = 0
    molecular_layer_co_abundance: float = 1e-4
    co_freezeout_temperature: u.Quantity = 20 * u.K
    atmosphere_co_abundance: float = 0
    h2_column_denisty_that_shields_co: u.Quantity = 1.3e21 / u.cm ** 2

    def run_chemistry(self):
        self.table["H2"] = 0.5
        self.calculate_column_density_towards_star("H2")
        self.calculate_column_density_upwards("H2")

        self.table["CO"] = self.midplane_co_abundance
        self.table["CO"][
            self.table["Gas temperature"] > self.co_freezeout_temperature
            ] = self.molecular_layer_co_abundance

        self.table["CO"][
            (self.table["H2 column density towards star"] < self.h2_column_denisty_that_shields_co)
            | (self.table["H2 column density upwards"] < self.h2_column_denisty_that_shields_co)
            ] = self.atmosphere_co_abundance

Ancestors

Subclasses

Class variables

var atmosphere_co_abundance : float
var co_freezeout_temperature : astropy.units.quantity.Quantity
var h2_column_denisty_that_shields_co : astropy.units.quantity.Quantity
var midplane_co_abundance : float
var molecular_layer_co_abundance : float

Inherited members

class NonzeroChemistryWB2014 (physics: PhysicsBase = None, molar_mass: Unit("g / mol") = <Quantity 2.33 g / mol>, hydrogen_mass_fraction: float = 0.739, initial_abundances: Abundances = {'H2': 0.5, 'CO': 5e-05}, midplane_co_abundance: float = 1e-06, molecular_layer_co_abundance: float = 0.0001, co_freezeout_temperature: astropy.units.quantity.Quantity = <Quantity 20. K>, atmosphere_co_abundance: float = 1e-10, h2_column_denisty_that_shields_co: astropy.units.quantity.Quantity = <Quantity 1.3e+21 1 / cm2>)

Subclass of ChemistryWB2014 that has non-zero default midplane and atmosphere abundance

Usage:

>>> physics = WilliamsBest2014(radial_bins=3, vertical_bins=3)
>>> chemistry = NonzeroChemistryWB2014(physics)
>>> chemistry.run_chemistry()
>>> chemistry.table["CO"].info.format = "e"
>>> chemistry.table["CO"]
<Column name='CO' dtype='float64' format='e' length=9>
1.000000e-10
1.000000e-10
1.000000e-10
1.000000e-04
1.000000e-10
1.000000e-10
1.000000e-10
1.000000e-10
1.000000e-10
Expand source code
@dataclass
class NonzeroChemistryWB2014(ChemistryWB2014):
    """
    Subclass of ChemistryWB2014 that has non-zero default midplane and atmosphere abundance

    Usage:

    >>> physics = WilliamsBest2014(radial_bins=3, vertical_bins=3)
    >>> chemistry = NonzeroChemistryWB2014(physics)
    >>> chemistry.run_chemistry()
    >>> chemistry.table["CO"].info.format = "e"
    >>> chemistry.table["CO"]
    <Column name='CO' dtype='float64' format='e' length=9>
    1.000000e-10
    1.000000e-10
    1.000000e-10
    1.000000e-04
    1.000000e-10
    1.000000e-10
    1.000000e-10
    1.000000e-10
    1.000000e-10
    """
    midplane_co_abundance: float = 1e-6
    atmosphere_co_abundance: float = 1e-10

Ancestors

Class variables

var atmosphere_co_abundance : float
var midplane_co_abundance : float

Inherited members