# What is the % odorant vapor in the air stream, as a function of odorant properties, jar dimensions, and air flow rate?

A cynlindrical jar with cross-sectional area $A$ and height $h$ contains a volume $V_{sol}$ of odorant solution (diluted in a solvent with zero vapor pressure), and the remaining volume, above the solution, is called $V_{head}$.  

The flow rate of air into the jar, in mol/s, is $r_{air,in}$.  The gas flow out of the jar consists of the air component $r_{air, out}$ and the odorant component $r_{odor, out}$, also in mol/s.  

The interface between the solution and the jar headspace has odorant molecules leaving with rate $r_{evap}$ and molecules condensing at rate $r_{condense}$, also in mol/s.  

Therefore, the amount of odorant $n_o$ (in moles) in the jar headspace evolves according to:

\begin{equation}
\tag{1}\frac{dn_{odor}}{dt} = r_{evap} - r_{condense} - r_{odor, out}
\end{equation}

And the amount of air $n_{air}$ in the jar headspace evolves according to:

\begin{equation}
\tag{2}\frac{dn_{air}}{dt} = r_{air,in} - r_{air, out}
\end{equation}

Assuming that mixing with odorant vapor in the jar is instantaneous. Then the ratio of odorant efflux out of the jar to air efflux out of the jar is equal to the ratio of odor to air in the headspace of the jar at that moment.

\begin{equation}
\tag{3}\frac{n_{odor}}{n_{air}} = \frac{r_{odor,out}}{r_{air, out}}
\end{equation}

If evaporation is slow compared to the flow rate, we can assume that:

\begin{equation}
\tag{4}r_{air,in} = r_{air,out} + r_{odor, out}
\end{equation}

Combining equations 3 and 4 gives:

$$r_{odor,out} = r_{air,out}\frac{n_{odor}}{n_{air}} = (r_{air,in} - r_{odor, out})\frac{n_{odor}}{n_{air}}$$

$$r_{odor,out}(1+\frac{n_{odor}}{n_{air}}) = r_{air,in}\frac{n_{odor}}{n_{air}}$$

\begin{equation}
\tag{5}r_{odor,out} = \frac{r_{air,in}n_{odor}}{n_{air}+n_{odor}}
\end{equation}

And lastly, if both odorant and air are ideal gases, and air flow does not substantially change pressure in the jar, then the combined air and gas molecules fill the headspace at room temperature and ambient pressure according to:

\begin{equation}
\tag{6}n_{odor} + n_{air} = \frac{P_{room}V_{head}}{RT_{room}} \sim \frac{V_{head}}{22.4 Liters}
\end{equation}

Substituting (6) into (5) gives:

\begin{equation}
\tag{7}r_{odor, out} = \frac{r_{air,in}n_{odor}RT_{room}}{P_{room}V_{head}}
\end{equation}

The evaporation rate is assumed to be indepedent of time, depending (through a function $F_{evap}$ obtained empirically and described later) only upon the partial pressure $P^*_o$ of the liquid odorant, and the surface area $A$ of the liquid-vapor interface, where the partial pressure is equal to the mole fraction $f_o$ of the odorant in the liquid times its intrinsic vapor pressure $P_o$ (at this temperature), according to Raoult's law. 

\begin{equation}
\tag{8}r_{evap} = F_{evap}(P^*_{odor})A
\end{equation}
\begin{equation}
\tag{9}P^*_{odor} = P_{odor}f_{odor}
\end{equation}

Meanwhile, the condensation rate depends upon the molar concentration C_o of odorant vapor in the headspace and the headspace volume according to a constant $k_{condense}$:

\begin{equation}
\tag{10}r_{condense} = k_{condense}AC_{odor}
\end{equation}
\begin{equation}
\tag{11}C_{odor} = n_{odor}/V_{head}
\end{equation}

Substituting (7-11) back into equation (1) gives a first order, linear differential equation in $n_{odor}$:

$$\frac{dn_{odor}}{dt} = F_{evap}(P_{odor},f_{odor})A - \frac{k_{condense}An_{odor}}{V_{head}} - \frac{r_{air,in}n_{odor}RT_{room}}{P_{room}V_{head}}$$

\begin{equation}
\tag{12}\frac{dn_{odor}}{dt} = F_{evap}(P_{odor},f_{odor})A - n_{odor}(\frac{1}{V_{head}}(k_{condense}A + \frac{r_{air,in}RT_{room}}{P_{room}}))
\end{equation}

We can define:
\begin{equation}
\tag{13}u = \frac{1}{V_{head}}(k_{condense}A + \frac{r_{air,in}RT_{room}}{P_{room}})
\end{equation}
and if the headspace volume changes very slowly, we can assume that this is independent of time.

The integrating factor is:
\begin{equation}
e^{\int{u}dt} = e^{ut}\tag{14}
\end{equation}

The canonical solution to (12) is thus:

\begin{equation}
\tag{15}n_{odor}(t) = e^{-ut}(\int{e^{ut}F_{evap}(P_{odor},f_{odor})Adt} + constant)
\end{equation}

Integrating gives:

\begin{equation}
n_{odor}(t) = \frac{F_{evap}(P_{odor},f_{odor})A}{u} + constant*e^{-ut}\tag{16}
\end{equation}

At steady state flow ($t = \infty$), the number of odorant molecules in the headspace is proportional to the evaporation function $F_{evap}$, which depends on the vapor pressure of the odorant, its mole fraction in solution, and the surface area of the liquid-vapor interface). The number of odorant molecules in the headspace is inversely proportional to $u$, which includes a weighted sum of the condensation rate constant and the air inflow rate.

\begin{equation}
\tag{17}
n_{odor}(t=\infty) = \frac{F_{evap}(P_{odor},f_{odor})A}{u}
\end{equation}

At the starting time ($t=0$), we will assume that the jar is already in equilibrium, and the number of odorant molecules in the headspace is determined by the odorant's partial pressure:

\begin{equation}
\tag{18}
n_{odor}(t=0) = \frac{P_{odor}f_{odor}V_{head}}{RT_{room}} = \frac{F_{evap}(P_{odor},f_{odor})A}{u} + constant
\end{equation}

So the constant is equal to:

\begin{equation}
\tag{19}
constant = \frac{P_{odor}f_{odor}V_{head}}{RT_{room}} - \frac{F_{evap}(P_{odor},f_{odor})A}{u}
\end{equation}

Substituting back into (16) gives:

\begin{equation}
n_{odor}(t) = \frac{F_{evap}(P_{odor},f_{odor})A}{u} + (\frac{P_{odor}f_{odor}V_{head}}{RT_{room}} - \frac{F_{evap}(P_{odor},f_{odor})A}{u})*e^{-ut}\tag{20}
\end{equation}

And substituting (13) into (20) gives:

\begin{equation}
n_{odor}(t) = \frac{V_{head}F_{evap}(P_{odor},f_{odor})A}{(k_{condense}A + \frac{r_{air,in}RT_{room}}{P_{room}})} + (\frac{P_{odor}f_{odor}V_{head}}{RT_{room}} - \frac{V_{head}F_{evap}(P_{odor},f_{odor})A}{(k_{condense}A + \frac{r_{air,in}RT_{room}}{P_{room}})})*e^{-(\frac{1}{V_{head}}(k_{condense}A + \frac{r_{air,in}RT_{room}}{P_{room}}))t}\tag{21}
\end{equation}

Subsituting (21) into (5) gives:

\begin{equation}
\frac{r_{odor,out}}{r_{air,in}} = \frac{\frac{V_{head}F_{evap}(P_{odor},f_{odor})A}{(k_{condense}A + \frac{r_{air,in}RT_{room}}{P_{room}})} + (\frac{P_{odor}f_{odor}V_{head}}{RT_{room}} - \frac{V_{head}F_{evap}(P_{odor},f_{odor})A}{(k_{condense}A + \frac{r_{air,in}RT_{room}}{P_{room}})})*e^{-(\frac{1}{V_{head}}(k_{condense}A + \frac{r_{air,in}RT_{room}}{P_{room}}))t}}{\frac{P_{room}V_{head}}{RT_{room}}}
\end{equation}

\begin{equation}
\tag{22}
\frac{r_{odor,out}}{r_{air,in}} = \frac{F_{evap}(P_{odor},f_{odor})}{(\frac{k_{condense}P_{room}}{RT_{room}} + \frac{r_{air,in}}{A})} + (\frac{P_{odor}f_{odor}}{P_{room}} - \frac{F_{evap}(P_{odor},f_{odor})}{(\frac{k_{condense}P_{room}}{RT_{room}} + \frac{r_{air,in}}{A})})*e^{-(\frac{1}{V_{head}}(k_{condense}A + \frac{r_{air,in}RT_{room}}{P_{room}}))t}
\end{equation}

The evaporation rate $F_{evap}$ depends on $P_{odor}$, $f_{odor}$, and $A$. According to *Mackay, D., & van Wesenbeeck, I. (2014). Correlation of Chemical Evaporation Rate with Vapor Pressure. Environmental Science & Technology, 48(17), 10259–10263.
doi:10.1021/es5029074* the pure odorant evaporation rate per unit area has the empirical form:
\begin{equation}
\tag{23}
F^*_{evap}(P_{odor}) = e^{1.0243 ln(\frac{P_{odor}}{P_{unity}} - 15.08)} * F_{unity}
\end{equation}
where $P_{unity} = 1 Pa$ and $F_{unity}= 1\frac{mol}{m^2s}$

Assuming linear dependence on mole fraction in solution:
\begin{equation}
\tag{25}
F_{evap}(P_{odor},f_{odor}) = F^*_{evap}(P_{odor})f_{odor} = f_{odor}e^{1.0243 ln(\frac{P_{odor}}{P_{unity}} - 15.08)} * F_{unity}
\end{equation}

At equilibrium, the condensation rate is equal to the evaporation rate, resulting in a $n_{odor}(t=0)$ given by the partial pressure $P^*_{odor} = P_{odor}f_{odor}$.  Setting (8) and (10) equal and subsituting (18) gives:
\begin{equation}
F_{evap}(P_{odor},f_{odor})A = k_{condense}A\frac{n_{odor}(t=0)}{V_{head}}
\end{equation}

\begin{equation}
\tag{26}
F^*_{evap}(P_{odor})f_{odor}A = k_{condense}A\frac{P_{odor}f_{odor}V_{head}}{V_{head}RT_{room}}
\end{equation}

\begin{equation}
\tag{27}
k_{condense} = \frac{RT_{room}F^*_{evap}(P_{odor})}{P_{odor}}
\end{equation}

Substituting (25) and (26) into (22) gives:
\begin{equation}
\frac{r_{odor,out}}{r_{air,in}}(t) = \frac{F^*_{evap}(P_{odor})f_{odor}}{(\frac{\frac{RT_{room}F^*_{evap}(P_{odor})}{P_{odor}}P_{room}}{RT_{room}} + \frac{r_{air,in}}{A})} + (\frac{P_{odor}f_{odor}}{P_{room}} - \frac{F^*_{evap}(P_{odor})f_{odor}}{(\frac{\frac{RT_{room}F^*_{evap}(P_{odor})}{P_{odor}}P_{room}}{RT_{room}} + \frac{r_{air,in}}{A})})e^{-(\frac{1}{V_{head}}(\frac{RT_{room}F^*_{evap}(P_{odor})}{P_{odor}}A + \frac{r_{air,in}RT_{room}}{P_{room}}))t}
\end{equation}

\begin{equation}
\frac{r_{odor,out}}{r_{air,in}}(t) = f_{odor}(\frac{F^*_{evap}(P_{odor})}{(\frac{F^*_{evap}(P_{odor})}{P_{odor}}P_{room} + \frac{r_{air,in}}{A})} + (\frac{P_{odor}}{P_{room}} - \frac{F^*_{evap}(P_{odor})}{(\frac{F^*_{evap}(P_{odor})}{P_{odor}}P_{room} + \frac{r_{air,in}}{A})})e^{-(\frac{RT_{room}}{V_{head}}(\frac{F^*_{evap}(P_{odor})}{P_{odor}}A + \frac{r_{air,in}}{P_{room}}))t})
\end{equation}

\begin{equation}
\tag{28}
\frac{r_{odor,out}}{r_{air,in}}(t) = f_{odor}(\frac{1}{(\frac{P_{room}}{P_{odor}} + \frac{r_{air,in}}{AF^*_{evap}(P_{odor})})} + (\frac{P_{odor}}{P_{room}} - \frac{1}{(\frac{P_{room}}{P_{odor}} + \frac{r_{air,in}}{AF^*_{evap}(P_{odor})})})e^{-(\frac{RT_{room}}{V_{head}}(\frac{F^*_{evap}(P_{odor})}{P_{odor}}A + \frac{r_{air,in}}{P_{room}}))t})
\end{equation}

This equation, describing the molar fraction of odorant in the air stream, has the functional form:<br><br>
\begin{equation}
\tag{29}
\frac{r_{odor,out}}{r_{air,in}}(t) = f_{odor}(a + (b-a)e^{-ct})
\end{equation}
<br>where $f_{odor}$ is the mole fraction of the odorant in solution, $f_{odor}a$ describes the steady-state fraction in the exiting vapor at $t=0$, $f_{odor}b$ describes the steady-state fraction in the exiting vapor at $t=\infty$, and $\frac{1}{c}$ is the time constant.  

In the vapor pressure regime of most odorants (0.1 - 10 mm Hg), the ratio $\frac{F^*_{evap}(P_{odor})}{P_{odor}}$ does not differ more than $\sim5\%$ from $k_{evap} \sim3.2*10^{-7} \frac{mol}{m^2sPa}$, i.e. $F^*_{evap}$ is linear in $P_{odor}$. This means that the time constant $\frac{1}{c}$ is largely independent of the odorant in question.

Plugging in numbers:


```python
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import quantities as pq
from quantities.constants.statisticalmechanics import R
from IPython.display import Markdown

sns.set(font_scale=1.5)
```


```python
jar_diameter = 6 * pq.cm
jar_height = 5 * pq.cm
height_filled = 1*pq.cm
A = np.pi * (jar_diameter / 2)**2
V_head = A * (jar_height - height_filled)

f_odor = 0.001 # A 0.1% solution
P_room = 1*pq.atm # 1 atmosphere
P_odor = 10.5 * pq.mmHg # Hexanal vapor pressure
T_room = (22 + 273.15)*pq.Kelvin
r_air_in = (1.0*pq.L/pq.min)*P_room/(R*T_room) # 1 L/min convered to mol/s

def F_star_evap(vp):
    # Units of Pascals
    vp = vp.rescale(pq.Pa)
    # Strip units for logarithm
    vp /= vp.units
    # Evaporation rate
    er = np.exp(1.0243*np.log(vp) - 15.08)
    if isinstance(er, np.ndarray):
        er[vp==0] = 0
    # Attach units
    er *= pq.mol / (pq.m**2 * pq.s)
    return er


t = np.linspace(0,5,1000) * pq.s # 1000 ms
# Use the form:
# ratio = f_odor*(a + (b - a)exp(-ct))
a = (1/(P_room/P_odor + r_air_in/(A*F_star_evap(P_odor)))).rescale(pq.dimensionless)
b = (P_odor/P_room).rescale(pq.dimensionless)
c = ((R*T_room/V_head)*(A*F_star_evap(P_odor)/P_odor + r_air_in/P_room)).rescale(1/pq.s)
ratio = f_odor*(a + (b - a)*np.exp(-c*t))

Markdown(r"a = %.3g<br>b= %.3g<br>c = %.3g($s^{-1}$)" % (a, b, c))
```




a = 0.0017<br>b= 0.0138<br>c = 0.168($s^{-1}$)



Here is the decay curve for the fraction of odorant (by mole) in the vapor leaving the jar over time:


```python
plt.plot(t, ratio)
plt.xlabel('Time (s)')
plt.ylabel('Volume fraction odorant\nin air stream')
plt.ylim(0, ratio.max()*1.1);
```


```python
vps = (np.logspace(-1,1,100) * pq.mmHg).rescale(pq.Pa)
ers = np.zeros(vps.shape)
for i, vp in enumerate(vps):
    ers[i] = F_star_evap(vp)
plt.scatter(vps, ers/vps)
plt.xscale('log')
plt.ylim(3e-7,3.5e-7)
plt.xlabel(r'Vapor pressure ($Pa$)')
plt.ylabel(r'Evaporation rate ($\frac{mol}{m^2s}$)');
```


```python
r_air_ins_volume = np.logspace(-4,2,100)*pq.L/pq.min
r_air_ins_mole = (r_air_ins_volume*P_room/(R*T_room)).rescale(pq.mol/pq.s)
k_evap = 3.2e-7*pq.mol/(pq.m**2*pq.s*pq.Pa)
cs = ((R*T_room/V_head)*(A*k_evap + r_air_ins_mole/P_room)).rescale(1/pq.s)
plt.scatter(r_air_ins_volume, 1/cs)
plt.xlabel(r'Air flow rate ($\frac{L}{min}$)')
plt.ylabel(r'Odorant depletion time constant ($s$)')
plt.xscale('log')
plt.yscale('log')
plt.xlim(1e-4,1e2)
plt.ylim(1e-2,1e2);
```

Using the linear form of $F^*_{evap}$, the dependence on $P_{odor}$ of the ratio between the initial and steady-state odorant enrichments disappears:

\begin{equation}
\tag{30}
\frac{b}{a} = 
\frac{\frac{P_{odor}}{P_{room}}}{\frac{1}{(\frac{P_{room}}{P_{odor}} + \frac{r_{air,in}}{AF^*_{evap}(P_{odor})})}} = 
\frac{\frac{P_{odor}}{P_{room}}}{\frac{1}{(\frac{P_{room}}{P_{odor}} + \frac{r_{air,in}}{Ak_{evap}P_{odor}})}} = 
\frac{P_{room}+\frac{r_{air,in}}{Ak_{evap}}}{P_{room}} = 
1+\frac{r_{air,in}}{Ak_{evap}P_{room}}
\end{equation}
The only way to keep this fraction close to 1 is to have a low air-flow rate $r_{air,in}$ or a large solution-vapor interface surface area $A$, i.e. a wide jar.


```python
b_a_ratios = 1 + (r_air_ins_mole/(A*k_evap*P_room)).rescale(pq.dimensionless)
plt.scatter(r_air_ins_volume, b_a_ratios)
plt.xlabel(r'Air flow rate ($\frac{L}{min}$)')
plt.ylabel(r'Odorant enrichment ratio $\frac{initial}{steadystate}$')
plt.xscale('log')
plt.yscale('log')
plt.xlim(1e-4,1e2)
plt.ylim(0.9,1e3);
```

In the interval between stimuli, if air flow through the jar is turned off, the odorant concentration increases again towards its intitial concentration. Here we assume that the pressure change inside the sealed jar due to the odorant realizing its partial pressure is small.<br><br>
\begin{equation}
\tag{31}
\frac{dn_{odor}}{dt} = r_{evap} - r_{condense} = f_{odor}F*_{evap}(P_{odor})A - \frac{RT_{room}F^*_{evap}(P_{odor})An_{odor}}{P_{odor}V_{head}}
\end{equation}

We can define:
\begin{equation}
\tag{32}u^* = \frac{RT_{room}F^*_{evap}(P_{odor})A}{P_{odor}V_{head}}
\end{equation}

with a solution just like (21), except without the term for air influx:<br><br>
\begin{equation}
\tag{32}
n_{odor}(t) = \frac{V_{head}F_{evap}(P_{odor},f_{odor})A}{k_{condense}A} + (\frac{P_{odor}f_{odor}V_{head}}{RT_{room}} - \frac{V_{head}F_{evap}(P_{odor},f_{odor})A}{k_{condense}A})*e^{-(\frac{1}{V_{head}}(k_{condense}A))t}
\end{equation}

\begin{equation}
n_{odor}(t) = e^{-ut}(\int{e^{ut}f_{odor}F^*_{evap}(P_{odor})Adt} + constant)
\end{equation}

\begin{equation}
n_{odor}(t) = \frac{f_{odor}F^*_{evap}(P_{odor})A}{u} + constant*e^{-ut}
\end{equation}
<br>
\begin{equation}
n_{odor}(t) = \frac{f_{odor}F^*_{evap}(P_{odor})A}{\frac{RT_{room}F^*_{evap}(P_{odor})A}{P_{odor}V_{head}}} + constant*e^{-ut}
\end{equation}
<br>
\begin{equation}
\tag{33}n_{odor}(t) = \frac{f_{odor}P_{odor}V_{head}}{RT_{room}} + constant*e^{-\frac{RT_{room}F^*_{evap}(P_{odor})A}{P_{odor}V_{head}}t}
\end{equation}

The value of the constant term depends on how depleted the odorant in the headspace is before the airflow is turned off.  Without less of generality we can simply define it as:
\begin{equation}
\tag{34}
constant = n_{odor}(t=0) - \frac{f_{odor}P_{odor}V_{head}}{RT_{room}}
\end{equation}

giving us:
\begin{equation}
\tag{35}n_{odor}(t) = \frac{f_{odor}P_{odor}V_{head}}{RT_{room}} + (n_{odor}(t=0) - \frac{f_{odor}P_{odor}V_{head}}{RT_{room}})*e^{-\frac{RT_{room}F^*_{evap}(P_{odor})A}{P_{odor}V_{head}}t}
\end{equation}

Therefore, a scenario of a stimulus of duration $T_on$ followed by an interval of duration $T_off$ exhibits the following behavior: The quantity of odorant in the jar headspace is initially $\frac{f_{odor}P_{odor}V_{head}}{RT_{room}}$, which follows trivially from Raoult's law and the ideal gas law.  Once the air flow is turned on, it declines by a factor of $\frac{b}{a} = 1+\frac{r_{air,in}}{Ak_{evap}P_{room}}$ with inverse time constant $c = \frac{RT_{room}}{V_{head}}(\frac{F^*_{evap}(P_{odor})}{P_{odor}}A + \frac{r_{air,in}}{P_{room}})) \sim \frac{RT_{room}}{V_{head}}(k_{evap}A + \frac{r_{air,in}}{P_{room}}))$. When the air is turned off, it returns to its initial value with inverse time constant $c = \frac{RT_{room}F^*_{evap}(P_{odor})A}{P_{odor}V_{head}} \sim \frac{RT_{room}k_{evap}A}{V_{head}}$.


```python
dt = 0.001
T_on = 2
T_off = 8
n_cycles = 10
t = np.arange(0,(T_on+T_off)*n_cycles,dt) * pq.s
t_on = int(T_on / dt)
t_off = int(T_off / dt)
ratios = np.zeros(t.shape)
# Use the form:
# ratio = f_odor*(a + (b - a)exp(-ct))
a = (1/(P_room/P_odor + r_air_in/(A*F_star_evap(P_odor)))).rescale(pq.dimensionless)
b = (P_odor/P_room).rescale(pq.dimensionless)
c_decay = ((R*T_room/V_head)*(A*F_star_evap(P_odor)/P_odor + r_air_in/P_room)).rescale(1/pq.s)
c_recover = ((R*T_room/V_head)*(A*F_star_evap(P_odor)/P_odor)).rescale(1/pq.s)
ratios[0:t_on] = f_odor*(a + (b - a)*np.exp(-c_decay*t[:t_on]))
ratios[t_on:t_on+t_off] = f_odor*(b + (ratios[t_on-1]/f_odor - b)*np.exp(-c_recover*t[:t_off]))
for cycle in range(1,n_cycles):
    ratios[cycle*t_on+cycle*t_off:(cycle+1)*t_on+cycle*t_off] = f_odor*(a + (ratios[cycle*t_on+cycle*t_off-1]/f_odor - a)*np.exp(-c_decay*t[:t_on]))
    ratios[(cycle+1)*t_on+cycle*t_off:(cycle+1)*t_on+(cycle+1)*t_off] = f_odor*(b + (ratios[(cycle+1)*t_on+cycle*t_off-1]/f_odor - b)*np.exp(-c_recover*t[:t_off]))

```

Repeated stimuli (with on time T_on and off time T_off will have an odorant mole fraction in the vapor that changes as follows):


```python
plt.plot(t, ratios)
plt.xlabel('Time ($s$)')
plt.ylabel('Mole fraction of odorant\nin headspace vapor');
plt.ylim(0, ratios[0]*1.1);
```


```python
print("Depletion time constant is %.3g s" % (1/c_decay))
print("Recovery time constant is %.3g s" % (1/c_recover))
```

    Depletion time constant is 5.95 s
    Recovery time constant is 48.4 s


df2301278c859168b3048fdc19dea2cef655d991
ipynb
Jupyter Notebook
notebooks/vapor-phase-concentration.ipynb
asu-meteor/The-Smell-Engine
c80283b324d485756ed38c02ae0fd7f775f7c39f
MIT
2022-03-14T19:46:36.000Z
2022-03-14T19:46:36.000Z
notebooks/vapor-phase-concentration.ipynb
asu-meteor/The-Smell-Engine
c80283b324d485756ed38c02ae0fd7f775f7c39f
MIT
notebooks/vapor-phase-concentration.ipynb
asu-meteor/The-Smell-Engine
c80283b324d485756ed38c02ae0fd7f775f7c39f
MIT
2022-03-14T19:46:51.000Z
2022-03-14T20:16:57.000Z
Qwen/Qwen-72B
1. YES
2. YES