Quick Start

PyChemia is built from several layers of code, the foundations being the ability to manipulate conglomerates of atoms, either molecules or crystals. Before doing more complex operations such execute tasks on various electronic structure codes or running structural searches we need to understand how the fundamental blocks work and that is the purpose of this quick start section.

For the examples presented here you can use the official python terminal, however, the IPython terminal or a Jupyter notebook offers you more power to go across the examples and explore what PyChemia can do for you. At least, installing IPython is very simple on many operating systems.

For example on machines running a debian derivative (Ubuntu, Mint and several others) you can use the following command to install the IPython terminal:

sudo apt-get install python-ipython

or for python 3.x:

sudo apt-get install python3-python

On MacOS using macports:

sudo port install py27-ipython

or for python 3.x:

sudo port install py35-ipython

Element

PyChemia is about materials, molecules, cluster and crystals. A class for elements can become handy to serve as a periodic table and inquire for the properties of a given specie. Alchemy was all about transmuting materials into gold. Lets explore what PyChemia can tell us about that element:

In [1]: import pychemia

In [2]: ele=pychemia.Element('Au')

In [3]: ele.atomic_number
Out[3]: 79

In [4]: ele.name
Out[4]: 'Gold'

In [5]: ele.electronegativity
Out[5]: 2.54

In [6]: ele.group
Out[6]: 11

In [7]: ele.period
Out[7]: 6

In [8]: ele.block
Out[8]: 'd'

In [9]: ele.mass
Out[9]: 196.96654

In [10]: ele.electronic_configuration
Out[10]: ['Xe', '6s1', '4f14', '5d10']

In [11]: ele.is_madelung_exception
Out[11]: True

In [12]: ele.oxidation_states
Out[12]: (-3, -2, -1, 1, 2, 3, 5)

In [13]: ele.oxidation_states_common
Out[13]: (3,)

In [14]: ele.covalent_radius
Out[14]: 1.36

The Element class provide a set of useful properties about all elements in the periodic table. The chapter about Element will explain the several properties that can be accessed on the Element class.

Composition

Now, atoms group themselves into molecules, clusters or crystals. Without entering into the geometry, we can think only about the composition, the list of atoms contained in the molecule or cluster or the list of atoms in the cell that builds the crystal. The Composition class offers a set of routines to manipulate lists of atoms. Lets consider for example Gold(III) oxide (Au2O3):

In [1]: import pychemia

In [2]: comp=pychemia.Composition('Au2O3')

In [3]: comp
Out[3]: Composition({'Au': 2, 'O': 3})

In [4]: comp['Au']
Out[4]: 2

In [5]: comp.nspecies
Out[5]: 2

In [6]: comp.symbols
Out[6]: ['Au', 'Au', 'O', 'O', 'O']

Compositions can be created from the formula and also from a python dictionary and after you can use the composition object to ask for the number of atoms of each specie.

Structure

In most cases, pychemia uses Structures. A PyChemia Structure stores atomic positions and cell parameters for periodic structures. Lets start with a very simple structure, the FCC structure of gold. One way of creating and structure is by directly specifying atomic positions and cell parameters, for example:

In [1]: import pychemia

In [2]: a=4.05

In [3]: b=a/2

In [4]: fcc = pychemia.Structure(symbols=['Au'], cell=[[0, b, b], [b, 0, b], [b, b, 0]], periodicity=True)

In [5]: fcc
Out[5]: Structure(symbols=['Au'], cell=[[0.0, 2.025, 2.025], [2.025, 0.0, 2.025], [2.025, 2.025, 0.0]],
reduced=[[0.0, 0.0, 0.0]], periodicity=True)

You have created your first structure on PyChemia. The structure contains one atom of Gold and the cell is the primitive cell of a FCC structure with one atom. You can ‘see’ the structure using the ‘print’ function:

In [6]: print(fcc)
1

 Symb  (             Positions            ) [     Cell-reduced coordinates     ]
   Au  (     0.0000     0.0000     0.0000 ) [     0.0000     0.0000     0.0000 ]

Periodicity:  X Y Z

Lattice vectors:
     0.0000     2.0250     2.0250
     2.0250     0.0000     2.0250
     2.0250     2.0250     0.0000

We can now be interested in see the spacegroup of the structure just created. A pychemia.crystal.CrystalSymmetry object allow us to get access to symmetry calculations provided by the spglib library:

In [7]: cs=pychemia.crystal.CrystalSymmetry(fcc)

In [8]: cs.number()
Out[8]: 225

In [9]: cs.symbol()
Out[9]: 'Fm-3m'

Both the space group number and the International symbol are accessible from the CrystalSymmetry object. Now we can use the CrystalSymmetry object to recreate the convenctional FCC cell:

In [10]: fcc_conv=cs.refine_cell()

In [11]: fcc
fcc       fcc_conv

In [12]: fcc_conv
Out[12]: Structure(symbols=['Au', 'Au', 'Au', 'Au'], cell=4.05, reduced=[[0.0, 0.0, 0.0], [0.0, 0.5, 0.5],
[0.5, 0.0, 0.5], [0.5, 0.5, 0.0]], periodicity=True)

In [11]: print(fcc_conv)
4

 Symb  (             Positions            ) [     Cell-reduced coordinates     ]
   Au  (     0.0000     0.0000     0.0000 ) [     0.0000     0.0000     0.0000 ]
   Au  (     0.0000     2.0250     2.0250 ) [     0.0000     0.5000     0.5000 ]
   Au  (     2.0250     0.0000     2.0250 ) [     0.5000     0.0000     0.5000 ]
   Au  (     2.0250     2.0250     0.0000 ) [     0.5000     0.5000     0.0000 ]

Periodicity:  X Y Z

Lattice vectors:
     4.0500     0.0000     0.0000
     0.0000     4.0500     0.0000
     0.0000     0.0000     4.0500

The lattice vectors are now making a cube, and the structure is made of 4 gold atoms. Now we can want to create a supercell, 2x2x1 using the supercell method:

In [13]: fcc221=fcc_conv.supercell(size=(2,2,1))

In [14]: print(fcc221)
16

 Symb  (             Positions            ) [     Cell-reduced coordinates     ]
   Au  (     0.0000     0.0000     0.0000 ) [     0.0000     0.0000     0.0000 ]
   Au  (     0.0000     2.0250     2.0250 ) [     0.0000     0.2500     0.5000 ]
   Au  (     2.0250     0.0000     2.0250 ) [     0.2500     0.0000     0.5000 ]
   Au  (     2.0250     2.0250     0.0000 ) [     0.2500     0.2500     0.0000 ]
   Au  (     0.0000     4.0500     0.0000 ) [     0.0000     0.5000     0.0000 ]
   Au  (     0.0000     6.0750     2.0250 ) [     0.0000     0.7500     0.5000 ]
   Au  (     2.0250     4.0500     2.0250 ) [     0.2500     0.5000     0.5000 ]
   Au  (     2.0250     6.0750     0.0000 ) [     0.2500     0.7500     0.0000 ]
   Au  (     4.0500     0.0000     0.0000 ) [     0.5000     0.0000     0.0000 ]
   Au  (     4.0500     2.0250     2.0250 ) [     0.5000     0.2500     0.5000 ]
   Au  (     6.0750     0.0000     2.0250 ) [     0.7500     0.0000     0.5000 ]
   Au  (     6.0750     2.0250     0.0000 ) [     0.7500     0.2500     0.0000 ]
   Au  (     4.0500     4.0500     0.0000 ) [     0.5000     0.5000     0.0000 ]
   Au  (     4.0500     6.0750     2.0250 ) [     0.5000     0.7500     0.5000 ]
   Au  (     6.0750     4.0500     2.0250 ) [     0.7500     0.5000     0.5000 ]
   Au  (     6.0750     6.0750     0.0000 ) [     0.7500     0.7500     0.0000 ]

Periodicity:  X Y Z

Lattice vectors:
     8.1000     0.0000     0.0000
     0.0000     8.1000     0.0000
     0.0000     0.0000     4.0500

PyChemia is much more than just elements, compositions and structures. For the purpose of this introduction, those are the most basic building blocks for most of the of higher level operations such as populations and global searches.

Lattice

For periodic structures, the lattice is fundamental to describe how the geometry of the atoms is repeated. PyChemia offers a class Lattice for manipulate cell parameters both for the real space lattice and the reciprocal one. For example from the example before:

In [1]: import pychemia

In [2]: a=4.05

In [3]: b=a/2

In [4]: fcc = pychemia.Structure(symbols=['Au'], cell=[[0, b, b], [b, 0, b], [b, b, 0]], periodicity=True)

In [5]: lat=fcc.lattice

In [6]: print(lat)
Cell=       0.000        2.025        2.025
            2.025        0.000        2.025
            2.025        2.025        0.000

Angles: alpha =       60.000
         beta =       60.000
        gamma =       60.000

Lengths:    a =        2.864
            b =        2.864
            c =        2.864


In [7]: rlat = lat.reciprocal()

In [8]: print(rlat)
Cell=      -0.247        0.247        0.247
            0.247       -0.247        0.247
            0.247        0.247       -0.247

Angles: alpha =      109.471
         beta =      109.471
        gamma =      109.471

Lengths:    a =        0.428
            b =        0.428
            c =        0.428

As you can see from the example above, the reciprocal lattice can be obtained from the real space lattice. The class is useful to obtain the Brillouin zone via computing the Wigner Seitz from the reciprocal lattice. Those and several other functionality can be accessed from the class as described on the corresponding chapter.