# Tutorial - Transfer-matrix simulation additive binary gas mixture¶

In this tutorial we provide an example of applying the Transfer-matrix method to simulate the adsorption of additive binary gas mixtures on solid surfaces. The additive gas mixture means that lateral interactions have been introduced between the adsorbed particles for each component of the gas mixture. In this tutorial we use SUrface Science MOdeling and Simulation Toolkit (SuSMoST)

Please have a look at the following script `here`

and read below what the script does.

## Libraries¶

In this block we include libraries. Here numpy is standard library. `susmost`

is a general library that contains modules required for setting structure of model and applying the Transfer-matrix method.

```
import numpy as np
from susmost import make_single_point_zmatrix, make_square_plane_cell, \
normal_lattice_task, transferm, SiteStateType, register_property, \
sitestate, nearest_int, make_tensor, solve_TM
```

## Constants¶

Here we define the constants.

```
INF_E = 1E6
k_B = 8.3144598E-3
a = 1.0
r_cut_off= 8.0 + .0001
```

In the table below, we show the constants and their descriptions.

Constant |
Description |
---|---|

INF_E |
Prohibitive energy level |

k_B |
Gas constant, kJ/(mol*K) |

a |
Lattice constant |

r_cut_off |
Parameter required to calculate the transfer-matrix |

Note

If `k_B`

is measured in kJ/K, then `k_B`

is the Boltzmann constant .

## Parameters¶

Here we define the parameters.

```
N = 6
T = 100.0
eAA = 4.
eBB = 6.
dop_int = {('mol_A','mol_B'):0.0,('mol_A','mol_A'):eAA,('mol_B','mol_B'):eBB}
interaction = lambda cc1,cc2: nearest_int(cc1,cc2,dop_int=dop_int)
```

In the table below, we show the parameters and their descriptions.

Parameter |
Description |
---|---|

N |
Width of the semi-infinite system (infinite in one direction and finite in perpendicular one) |

T |
Temperature, K |

eAA |
Interaction energy A-A, kJ/mol |

eBB |
Interaction energy B-B, kJ/mol |

dop_int, interaction |
Interaction energy between neighbor sites of the lattice depending on their states, kJ/mol |

Here we set the lattice geometry that models the solid surface.

```
cell,atoms = make_square_plane_cell(a)
register_property('coverage_A','==', None, sitestate.join_cover)
register_property('coverage_B','==', None, sitestate.join_cover)
```

In this models we use a square lattice with lattice parameter `a`

(make_square_plane_cell(a) and etc.). The lattice constant `a`

specifies the location of the nodes.
We set the properties of each node (`coverage_A`

, `coverage_B`

).

## Initial data¶

In this block we initialize input data.
Here `mus`

- array of chemical potential differences in the gas and adsorption layer \(\mu_g - \mu_a \approx-RTlnp\), `covs`

- array of coverages, \(\beta=1/(k_B T)\).

```
beta = 1./(k_B*T)
mus = []
covs = []
```

## Calculation of coverages¶

Set interval in what we change the pressure in the gas phase. `molA_state`

, `molB_state`

and `empty_state`

specifies the shape of the nodes (`make_single_point_zmatrix()`

), sets the energy of adsorption for each state of the lattice site (molecule A - `muA`

, molecule B - `muB`

, empty - `0`

), assigns the mark to all the possible surface states (molecule A - atom `N`

, molecule B - `O`

, empty - `H`

), sets the properties of each node (molecule A - `coverage=1., coverage_A=1., coverage_B=0.`

, molecule B - `coverage=1., coverage_A=0., coverage_B=1.`

, empty - `coverage=0., coverage_A=0., coverage_B=0.`

).

The lattice model description is stored in `lt`

as objects of the class `LatticeTask`

.

Set `W`

as a tensor of interaction that can be used to solve eigenvalue problem [1] (read more: interface round a face [2] ), `avg_cov`

is the average cover corresponding to each ring (where `avg_cov`

is the total average cover, `avg_covA`

and `avg_covB`

are the average covers by A and B molecules) and `tm_sol`

as solution of transfer-matrix.

In result we’ll get an array of the calculated coverages by transfer-matrix method `covs`

(where `cov`

is the total coverage, `covA`

and `covB`

are the fractional coverages by A and B molecules) and the chemical potential `mus`

.

```
for muA in np.arange(-20., 20.+0.0001, 2. ):
molA_state = SiteStateType('mol_A', make_single_point_zmatrix(), muA, ['N'],
coverage=1., coverage_A=1., coverage_B=0.)
molB_state = SiteStateType('mol_B', make_single_point_zmatrix(), 0.0, ['O'],
coverage=1., coverage_A=0., coverage_B=1.)
empty_state = SiteStateType('Empty',make_single_point_zmatrix(), 0.0, ['H'],
coverage=0., coverage_A=0., coverage_B=0.)
lt = normal_lattice_task([molA_state, molB_state, empty_state], cell, atoms, interaction, r_cut_off, INF_E)
W = make_tensor(lt, beta)
avg_cov = transferm.average_props(lt.states, N, 'coverage', beta)
avg_covA = transferm.average_props(lt.states, N, 'coverage_A', beta)
avg_covB = transferm.average_props(lt.states, N, 'coverage_B', beta)
tm_sol = solve_TM(W, N, symmetric=True)
cov = sum(tm_sol.probs*np.array(avg_cov))
covA = sum(tm_sol.probs*np.array(avg_covA))
covB = sum(tm_sol.probs*np.array(avg_covB))
covs.append([cov, covA, covB] )
mus.append(muA)
print ("muA ==", muA, "theta == ",cov)
```

## Results¶

In the Fig.1 the fractional surface coverages with molecules A and B, and the total surface coverage are shown as functions of the chemical potential of the molecules A in the adlayer. It is worth to note that the equivalence of the chemical potentials in gas phase and in the adlayer is supposed. Therefore, the lower values of the chemical potential of the molecule A in the adlayer, the higher pressure of the gas A in the gas phase mixture.