Source code for rxn_network.entries.corrections

"""Energy correction classes for entry objects."""

from __future__ import annotations

import math

from pymatgen.entries.computed_entries import CompositionEnergyAdjustment

CARBONATE_CORRECTION = 0.830  # eV per (CO3)2- anion in composition; see Jupyter NB for fitting
PCO2 = 0.0004  # partial pressure of CO2 in the atmosphere (it's around 0.04%)


[docs] class CarbonateCorrection(CompositionEnergyAdjustment): """Supplies a carbonate correction due to systematic GGA errors in carbonate formation energies. See provided jupyter NB for fitting of the correction: data/fit_carbonate_correction.ipynb """ def __init__(self, num_ions: int, carbonate_correction: float = CARBONATE_CORRECTION): """Initalizes a carbonate correction object. Args: num_ions: Number of carbonate ions in the composition object carbonate_correction: Energy correction, eV per (CO3)2- anion """ self._num_ions = num_ions self._carbonate_correction = carbonate_correction super().__init__( adj_per_atom=carbonate_correction, n_atoms=num_ions, name="Carbonate Correction", description=("Correction for dGf with (CO3)2- anion, as fit to MP data (300 K)."), ) @property def num_ions(self) -> int: """Number of carbonate ions ion the composition object.""" return self._num_ions @property def carbonate_correction(self) -> float: """Energy correction for carbonate ion, eV per (CO3)2- anion.""" return self._carbonate_correction
[docs] class CarbonDioxideAtmosphericCorrection(CompositionEnergyAdjustment): """Supplies a correction to the energy of CO2 due to its low partial pressure in the standard atmosphere (0.04%). """ def __init__(self, n_atoms: int, temp: float, pco2: float = PCO2): """Initalizes a carbon dioxide correction object. Args: n_atoms: Number of atoms in the composition object temp: Temperature at which the correction is applied, in K pco2: Partial pressure of CO2 in the atmosphere, in atm """ self._pco2 = pco2 self._temp = temp super().__init__( adj_per_atom=self.get_dmu(), n_atoms=n_atoms, name="Atmospheric CO2 Correction", description=("Correction for CO2 energy based on partial pressure in the atmosphere"), )
[docs] def get_dmu(self) -> float: """Returns the change in chemical potential of CO2 due to the atmospheric pCO2 at a given temperature. This is calculated by the formula: dmu = (1/3)*kTlnP(CO2). The factor of 1/3 accounts for the number of atoms in one formula unit of CO2, since the correction must be in eV/atom. """ return (1 / 3) * 8.617e-5 * self.temp * math.log(self.pco2)
@property def temp(self) -> float: """Temperature at which the correction is applied, in K.""" return self._temp @property def pco2(self) -> float: """Partial pressure of CO2 in the atmosphere, in atm.""" return self._pco2