Skip to content

Gas Species

Gas Species module.

The superclass for the Gas species classes. It contains a few gas species with its properties and functionality to calculate the density of the gas and do emission rate conversions from m^3/s to kg/hr and back

GasSpecies dataclass

Bases: ABC

Defines the properties of a particular gas species.

Attributes:

Name Type Description
global_background float

Global background concentration [ppm]

half_life float

Half life of gas [hr]

__molar_gas_constant float

R, molar gas constant [JK^-1mol^-1]

Source code in src/pyelq/gas_species.py
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
@dataclass
class GasSpecies(ABC):
    """Defines the properties of a particular gas species.

    Attributes:
        global_background (float, optional): Global background concentration [ppm]
        half_life (float, optional): Half life of gas [hr]
        __molar_gas_constant (float): R, molar gas constant [JK^-1mol^-1]

    """

    global_background: float = field(init=False)
    half_life: float = field(init=False)
    __molar_gas_constant: float = 8.31446261815324

    @property
    @abstractmethod
    def name(self) -> str:
        """Str: Name of gas."""

    @property
    @abstractmethod
    def molar_mass(self) -> float:
        """Float: Molar Mass [g/mol]."""

    @property
    @abstractmethod
    def formula(self) -> str:
        """Str: Chemical formula of gas."""

    def gas_density(
        self, temperature: Union[np.ndarray, float] = 273.15, pressure: Union[np.ndarray, float] = 101.325
    ) -> np.ndarray:
        """Calculating the density of the gas.

        Calculating the density of the gas given temperature and pressure if temperature and pressure are not provided
        we use Standard Temperature and Pressure (STP).

        https://en.wikipedia.org/wiki/Ideal_gas_law

        Args:
            temperature (Union[np.ndarray, float], optional): Array of temperatures [Kelvin],
                defaults to 273.15 [K]
            pressure (Union[np.ndarray, float], optional): Array of pressures [kPa],
                defaults to 101.325 [kPa]

        Returns:
             density (np.ndarray): Array of gas density values [kg/m^3]

        """
        specific_gas_constant = self.__molar_gas_constant / self.molar_mass
        density = np.divide(pressure, (temperature * specific_gas_constant))
        return density

    def convert_emission_m3s_to_kghr(
        self,
        emission_m3s: Union[np.ndarray, float],
        temperature: Union[np.ndarray, float] = 273.15,
        pressure: Union[np.ndarray, float] = 101.325,
    ) -> np.ndarray:
        """Converting emission rates from m^3/s to kg/hr given temperature and pressure.

         If temperature and pressure are not provided we use Standard Temperature and Pressure (STP).

        Args:
            emission_m3s (Union[np.ndarray, float]): Array of emission rates [m^3/s]
            temperature (Union[np.ndarray, float], optional): Array of temperatures [Kelvin],
                defaults to 273.15 [K]
            pressure (Union[np.ndarray, float], optional): Array of pressures [kPa],
                defaults to 101.325 [kPa]

        Returns:
             emission_kghr (np.ndarray): [p x 1] array of emission rates in  [kg/hr]

        """
        density = self.gas_density(temperature=temperature, pressure=pressure)
        emission_kghr = np.multiply(emission_m3s, density) * 3600
        return emission_kghr

    def convert_emission_kghr_to_m3s(
        self,
        emission_kghr: Union[np.ndarray, float],
        temperature: Union[np.ndarray, float] = 273.15,
        pressure: Union[np.ndarray, float] = 101.325,
    ) -> np.ndarray:
        """Converting emission rates from  kg/hr to m^3/s given temperature and pressure.

        If temperature and pressure are not provided we use Standard Temperature and Pressure (STP).

        Args:
            emission_kghr (np.ndarray): Array of emission rates in  [kg/hr]
            temperature (Union[np.ndarray, float], optional): Array of temperatures [Kelvin],
                defaults to 273.15 [K]
            pressure (Union[np.ndarray, float], optional): Array of pressures [kPa],
                defaults to 101.325 [kPa]

        Returns:
             emission_m3s (Union[np.ndarray, float]): Array of emission rates [m^3/s]

        """
        density = self.gas_density(temperature=temperature, pressure=pressure)
        emission_m3s = np.divide(emission_kghr, density) / 3600
        return emission_m3s

name: str abstractmethod property

molar_mass: float abstractmethod property

formula: str abstractmethod property

gas_density(temperature=273.15, pressure=101.325)

Calculating the density of the gas.

Calculating the density of the gas given temperature and pressure if temperature and pressure are not provided we use Standard Temperature and Pressure (STP).

https://en.wikipedia.org/wiki/Ideal_gas_law

Parameters:

Name Type Description Default
temperature Union[ndarray, float]

Array of temperatures [Kelvin], defaults to 273.15 [K]

273.15
pressure Union[ndarray, float]

Array of pressures [kPa], defaults to 101.325 [kPa]

101.325

Returns:

Name Type Description
density ndarray

Array of gas density values [kg/m^3]

Source code in src/pyelq/gas_species.py
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
def gas_density(
    self, temperature: Union[np.ndarray, float] = 273.15, pressure: Union[np.ndarray, float] = 101.325
) -> np.ndarray:
    """Calculating the density of the gas.

    Calculating the density of the gas given temperature and pressure if temperature and pressure are not provided
    we use Standard Temperature and Pressure (STP).

    https://en.wikipedia.org/wiki/Ideal_gas_law

    Args:
        temperature (Union[np.ndarray, float], optional): Array of temperatures [Kelvin],
            defaults to 273.15 [K]
        pressure (Union[np.ndarray, float], optional): Array of pressures [kPa],
            defaults to 101.325 [kPa]

    Returns:
         density (np.ndarray): Array of gas density values [kg/m^3]

    """
    specific_gas_constant = self.__molar_gas_constant / self.molar_mass
    density = np.divide(pressure, (temperature * specific_gas_constant))
    return density

convert_emission_m3s_to_kghr(emission_m3s, temperature=273.15, pressure=101.325)

Converting emission rates from m^3/s to kg/hr given temperature and pressure.

If temperature and pressure are not provided we use Standard Temperature and Pressure (STP).

Parameters:

Name Type Description Default
emission_m3s Union[ndarray, float]

Array of emission rates [m^3/s]

required
temperature Union[ndarray, float]

Array of temperatures [Kelvin], defaults to 273.15 [K]

273.15
pressure Union[ndarray, float]

Array of pressures [kPa], defaults to 101.325 [kPa]

101.325

Returns:

Name Type Description
emission_kghr ndarray

[p x 1] array of emission rates in [kg/hr]

Source code in src/pyelq/gas_species.py
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
def convert_emission_m3s_to_kghr(
    self,
    emission_m3s: Union[np.ndarray, float],
    temperature: Union[np.ndarray, float] = 273.15,
    pressure: Union[np.ndarray, float] = 101.325,
) -> np.ndarray:
    """Converting emission rates from m^3/s to kg/hr given temperature and pressure.

     If temperature and pressure are not provided we use Standard Temperature and Pressure (STP).

    Args:
        emission_m3s (Union[np.ndarray, float]): Array of emission rates [m^3/s]
        temperature (Union[np.ndarray, float], optional): Array of temperatures [Kelvin],
            defaults to 273.15 [K]
        pressure (Union[np.ndarray, float], optional): Array of pressures [kPa],
            defaults to 101.325 [kPa]

    Returns:
         emission_kghr (np.ndarray): [p x 1] array of emission rates in  [kg/hr]

    """
    density = self.gas_density(temperature=temperature, pressure=pressure)
    emission_kghr = np.multiply(emission_m3s, density) * 3600
    return emission_kghr

convert_emission_kghr_to_m3s(emission_kghr, temperature=273.15, pressure=101.325)

Converting emission rates from kg/hr to m^3/s given temperature and pressure.

If temperature and pressure are not provided we use Standard Temperature and Pressure (STP).

Parameters:

Name Type Description Default
emission_kghr ndarray

Array of emission rates in [kg/hr]

required
temperature Union[ndarray, float]

Array of temperatures [Kelvin], defaults to 273.15 [K]

273.15
pressure Union[ndarray, float]

Array of pressures [kPa], defaults to 101.325 [kPa]

101.325

Returns:

Name Type Description
emission_m3s Union[ndarray, float]

Array of emission rates [m^3/s]

Source code in src/pyelq/gas_species.py
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
def convert_emission_kghr_to_m3s(
    self,
    emission_kghr: Union[np.ndarray, float],
    temperature: Union[np.ndarray, float] = 273.15,
    pressure: Union[np.ndarray, float] = 101.325,
) -> np.ndarray:
    """Converting emission rates from  kg/hr to m^3/s given temperature and pressure.

    If temperature and pressure are not provided we use Standard Temperature and Pressure (STP).

    Args:
        emission_kghr (np.ndarray): Array of emission rates in  [kg/hr]
        temperature (Union[np.ndarray, float], optional): Array of temperatures [Kelvin],
            defaults to 273.15 [K]
        pressure (Union[np.ndarray, float], optional): Array of pressures [kPa],
            defaults to 101.325 [kPa]

    Returns:
         emission_m3s (Union[np.ndarray, float]): Array of emission rates [m^3/s]

    """
    density = self.gas_density(temperature=temperature, pressure=pressure)
    emission_m3s = np.divide(emission_kghr, density) / 3600
    return emission_m3s

CH4 dataclass

Bases: GasSpecies

Defines the properties of CH4.

Source code in src/pyelq/gas_species.py
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
@dataclass
class CH4(GasSpecies):
    """Defines the properties of CH4."""

    @property
    def name(self):
        """Str: Name of gas."""
        return "Methane"

    @property
    def molar_mass(self):
        """Float: Molar Mass [g/mol]."""
        return 16.04246

    @property
    def formula(self):
        """Str: Chemical formula of gas."""
        return "CH4"

    global_background = 1.85

name property

molar_mass property

formula property

C2H6 dataclass

Bases: GasSpecies

Defines the properties of C2H6.

Source code in src/pyelq/gas_species.py
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
@dataclass
class C2H6(GasSpecies):
    """Defines the properties of C2H6."""

    @property
    def name(self):
        """Str: Name of gas."""
        return "Ethane"

    @property
    def molar_mass(self):
        """Float: Molar Mass [g/mol]."""
        return 30.06904

    @property
    def formula(self):
        """Str: Chemical formula of gas."""
        return "C2H6"

    global_background = 5e-4

name property

molar_mass property

formula property

C3H8 dataclass

Bases: GasSpecies

Defines the properties of C3H8.

Source code in src/pyelq/gas_species.py
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
@dataclass
class C3H8(GasSpecies):
    """Defines the properties of C3H8."""

    @property
    def name(self):
        """Str: Name of gas."""
        return "Propane"

    @property
    def molar_mass(self):
        """Float: Molar Mass [g/mol]."""
        return 46.0055

    @property
    def formula(self):
        """Str: Chemical formula of gas."""
        return "C3H8"

    global_background = 5e-4

name property

molar_mass property

formula property

CO2 dataclass

Bases: GasSpecies

Defines the properties of CO2.

Source code in src/pyelq/gas_species.py
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
@dataclass
class CO2(GasSpecies):
    """Defines the properties of CO2."""

    @property
    def name(self):
        """Str: Name of gas."""
        return "Carbon Dioxide"

    @property
    def molar_mass(self):
        """Float: Molar Mass [g/mol]."""
        return 44.0095

    @property
    def formula(self):
        """Str: Chemical formula of gas."""
        return "CO2"

    global_background = 400

name property

molar_mass property

formula property

NO2 dataclass

Bases: GasSpecies

Defines the properties of NO2.

Source code in src/pyelq/gas_species.py
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
@dataclass
class NO2(GasSpecies):
    """Defines the properties of NO2."""

    @property
    def name(self):
        """Str: Name of gas."""
        return "Nitrogen Dioxide"

    @property
    def molar_mass(self):
        """Float: Molar Mass [g/mol]."""
        return 46.0055

    @property
    def formula(self):
        """Str: Chemical formula of gas."""
        return "NO2"

    global_background = 0
    half_life = 12

name property

molar_mass property

formula property