Photoelectric effect gif

Here are provided two simple gif images in order to illustrate the photoelectric effect.

Below the threshold energy, nothing append, whatever the light intensity.

No photoelectric effect
No photoelectric effect

Above the threshold energy, each photon bear enough energy in order to extract electrons from the material.

Photoelectric effect
Photoelectric effect

All pictures can be downloaded here :

Bands diagram using VASP and pymatgen

This article presents a python source code in order to plot the bands diagram of graphene calculated using VASP. The plot is done using pymatgen library and RGB coloring adapted from this example. Here is the output obtained with the script :

Graphene bands diagram
Graphene bands diagram

On the band diagram, the contribution of s, (px,py) and pz atomic orbital is map on a RGB scale. Red is associated to a s contribution, green to (px, py) contribution and blue to pz contribution. The same function or procedure can be used to map atomic contributions on the band diagram.

At the end of the article you can find a tarball containing all VASP input/ouput files and the python source code. This calculation is not accurate and is used only for band diagram plotting illustration. For example, you can see a short gap on the DOS which does not exist.

Edit 2016, March 15, update : source code is now python3 and pymatgen version 3.3.5 compatible. You can find the below scripts in an up to date version on github : bandstructureplots

#!/usr/bin/env python
# -*- coding=utf-8 -*-
import sys
import numpy as np
from numpy import array as npa
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.gridspec import GridSpec
import pymatgen as mg
from import Vasprun, Procar
from pymatgen.symmetry.bandstructure import HighSymmKpath
from pymatgen.electronic_structure.core import Spin, Orbital
def rgbline(ax, k, e, red, green, blue, alpha=1.):
    # creation of segments based on
    pts = np.array([k, e]).T.reshape(-1, 1, 2)
    seg = np.concatenate([pts[:-1], pts[1:]], axis=1)
    nseg = len(k) - 1
    r = [0.5 * (red[i] + red[i + 1]) for i in range(nseg)]
    g = [0.5 * (green[i] + green[i + 1]) for i in range(nseg)]
    b = [0.5 * (blue[i] + blue[i + 1]) for i in range(nseg)]
    a = np.ones(nseg, np.float) * alpha
    lc = LineCollection(seg, colors=list(zip(r, g, b, a)), linewidth=2)
if __name__ == "__main__":
    # read data
    # ---------
    # kpoints labels
    path = HighSymmKpath(mg.Structure.from_file("./opt/CONTCAR")).kpath["path"]
    labels = [r"$%s$" % lab for lab in path[0][0:4]]
    # bands
    bands = Vasprun("./bands/vasprun.xml").get_band_structure("./bands/KPOINTS", line_mode=True)
    # projected bands
    data = Procar("./bands/PROCAR").data
    # density of state
    dosrun = Vasprun("./dos/vasprun.xml")
    # set up matplotlib plot
    # ----------------------
    # general options for plot
    font = {'family': 'serif', 'size': 24}
    plt.rc('font', **font)
    # set up 2 graph with aspec ration 2/1
    # plot 1: bands diagram
    # plot 2: Density of State
    gs = GridSpec(1, 2, width_ratios=[2, 1])
    fig = plt.figure(figsize=(11.69, 8.27))
    fig.suptitle("Bands diagram of graphene")
    ax1 = plt.subplot(gs[0])
    ax2 = plt.subplot(gs[1])  # , sharey=ax1)
    # set ylim for the plot
    # ---------------------
    emin = 1e100
    emax = -1e100
    for spin in bands.bands.keys():
        for b in range(bands.nb_bands):
            emin = min(emin, min(bands.bands[spin][b]))
            emax = max(emax, max(bands.bands[spin][b]))
    emin -= bands.efermi + 1
    emax -= bands.efermi - 1
    ax1.set_ylim(emin, emax)
    ax2.set_ylim(emin, emax)
    # Band Diagram
    # ------------
    # sum up contribution over carbon atoms
    data = data[Spin.up].sum(axis=2)
    # sum up px and py contributions and normalize contributions
    contrib = np.zeros((bands.nb_bands, len(bands.kpoints), 3))
    for b in range(bands.nb_bands):
        for k in range(len(bands.kpoints)):
            sc = data[k][b][Orbital.s.value]**2
            pxpyc = data[k][b][Orbital.px.value]**2 + \
            pzc = data[k][b][Orbital.pz.value]**2
            tot = sc + pxpyc + pzc
            if tot != 0.0:
                contrib[b, k, 0] = sc / tot
                contrib[b, k, 1] = pxpyc / tot
                contrib[b, k, 2] = pzc / tot
    # plot bands using rgb mapping
    for b in range(bands.nb_bands):
                [e - bands.efermi for e in bands.bands[Spin.up][b]],
                contrib[b, :, 0],
                contrib[b, :, 1],
                contrib[b, :, 2])
    # style
    ax1.set_ylabel(r"$E - E_f$   /   eV")
    # fermi level at 0
    ax1.hlines(y=0, xmin=0, xmax=len(bands.kpoints), color="k", lw=2)
    # labels
    nlabs = len(labels)
    step = len(bands.kpoints) / (nlabs - 1)
    for i, lab in enumerate(labels):
        ax1.vlines(i * step, emin, emax, "k")
    ax1.set_xticks([i * step for i in range(nlabs)])
    ax1.set_xlim(0, len(bands.kpoints))
    # Density of state
    # ----------------
    ax2.set_xticks(np.arange(0, 1.5, 0.4))
    ax2.set_xticklabels(np.arange(0, 1.5, 0.4))
    ax2.set_xlim(1e-6, 1.5)
    ax2.hlines(y=0, xmin=0, xmax=1.5, color="k", lw=2)
    ax2.set_xlabel("Density of State")
    # s contribution
    ax2.plot(npa(dosrun.pdos[0][Orbital.s][Spin.up]) +
             dosrun.tdos.energies - dosrun.efermi,
             "r-", label="s", linewidth=2)
    # px py contribution
    ax2.plot(npa(dosrun.pdos[0][Orbital.px][Spin.up]) +
             npa(dosrun.pdos[1][Orbital.px][Spin.up]) +
             npa(dosrun.pdos[0][][Spin.up]) +
             dosrun.tdos.energies - dosrun.efermi,
             label="(px, py)",
    # pz contribution
    ax2.plot(npa(dosrun.pdos[0][Orbital.pz][Spin.up]) +
             dosrun.tdos.energies - dosrun.efermi,
             "b-", label="pz", linewidth=2)
    # total dos
                     dosrun.tdos.energies - dosrun.efermi,
                     color=(0.7, 0.7, 0.7),
                     facecolor=(0.7, 0.7, 0.7))
             dosrun.tdos.energies - dosrun.efermi,
             color=(0.6, 0.6, 0.6),
             label="total DOS")
    # plot format style
    # -----------------
    ax2.legend(fancybox=True, shadow=True, prop={'size': 18})
    plt.savefig(sys.argv[0].strip(".py") + ".pdf", format="pdf")

Hereafter there are two more examples for Cu and Si. The script may be simpler as all data can be extracted using pymatgen methods.

Bands diagram of copper

Bands diagram of silicon

Outils pour la symétrie moléculaire : théorie des groupes

En chimie et en physique, on utilise les propriétés de symétrie du système pour simplifier la résolution. L’outils mathématiques à la base de l’utilisation de la symétrie en chimie est la théorie des groupes. Le livre « chimie et théorie des groupes » de Paul H. Walton (édition De Boeck) est un ouvrages bien adapté aux chimistes ou physico-chimistes qui désirent découvrir cette approche.

Lorsqu’on utilise la théorie des groupes, une étape primordiale et très mécanique est la décomposition de la représentation d’un groupe en représentation irréductibles de ce groupe (analogue à déterminer les coordonnées d’un vecteur dans une base orthonormée). Le module python ci-dessous permet d’obtenir automatiquement la décomposition. Voici un exemple :

>>> from groupes import c4v
>>> rep = [4, 0, 0, 2, 0]
>>> print(c4v)
 C4v  |     1E      2C4      1C2    2sigma_v 2sigma_d
  A1  |     1        1        1        1        1    
  A2  |     1        1        1        -1       -1   
  B1  |     1        -1       1        1        -1   
  B2  |     1        -1       1        -1       1    
  E   |     2        0        -2       0        0
>>> c4v.ordre
>>> c4v.reduce(rep)
1 A1 + 1 B1 + 1 E

Je n’ai pas entré tous les groupes ponctuels de symétrie mais uniquement ceux dont j’ai eu besoin pour le moment. Les groupes disponnibles sont :

  • C2v
  • C3v
  • C4v
  • D3h
  • D4h

vasptools : a package for vasp post treatments

Since may 2014, I did not continue the development of vasptools. I strongly recommend you tu use pymatgen instead.

vasptools is a package wrote in python in order to do pre or post treatments of a VASP calculations. This package contains :

  • python modules : vasptools, crystal, myxml, adsorption
  • several script using vasptools module

Scripts and functions read the data into the vasprun.xml file because it contains both input parameters and the results of a calculations. The main features are :

  • extract or plot density of state
  • extract or plot bands
  • get structural data
  • control convergence
  • a tools to put a molecule at a given position on a slab
  • some simple operation on CHGCAR file (split, sum)

You can find the whole documentation here : vasptools documentation.

vasptools.tar.gz (version 58 : 20/03/2013)

If you want to contribute, please contact me.

Relations entre les coordonnées cartésiennes et les coordonnées réduites

Voici un document pdf (et le fichier tex source) qui donne les relations entre les coordonnées cartésiennes d’un repère orthonormé (Oijk sur la figure) et les coordonnées réduites dans le repère cristallin (Oabc). Ces relations sont assez utiles, en pratique, pour passer des coordonnées réduites aux coordonnées cartésiennes.

Coordonnées réduites et cartésiennes


Fichier sources si vous souhaitez l’adapter : coord_abc_xyz.tex

How To VMD : Visual Molecular Dynamics

VMD est un programme de visualisation moléculaire particulièrement adapté pour visualiser, faire des animations et analyser des systèmes biomoléculaires de grandes tailles. C’est un programme gratuit et disponnible sous Mac, Linux et windows.

site officiel (en)

Vous pouvez télécharger ci-dessous un tutorial en français qui se présente sous la forme de questions/réponses permettant de débuter avec VMD. Ce document est loin d’être complet et il est donc
fortement conseillé de consulter le manuel officiel. Toutes les remarques, suggestions et ou contributions sont les bienvenues.

Tutorial VMD

Cargol : un code de dynamique moléculaire classique

Logo cargol

Cargol est un code séquentiel de dynamique moléculaire écrit en C. Ce code se limite à la simulation de fluides ou de solides composés de particules identiques à un seul centre de force et dont les interactions sont modélisées par un potentiel Lenard Jones. Beaucoup de codes de simulation moléculaire plus complet et bien plus efficace existent et ce code n’a pas d’intérêt dans la production de résultats scientifiques.

Le seul avantage de Cargol est sa simplicité. L’ensemble du code contient seulement une vingtaine de fonctions. On peut alors facilement soit découvrir le contenu minimum d’un code de simulation de dynamique moléculaire classique de fluides simples (conditions périodiques, listes de verlet, calcul des forces de paires, algorithme de verlet), soit utiliser le code pour développer et tester de nouvelles méthodes de simulations ou algorithme avant de les porter dans un code plus abouti. Par ailleurs il n’est pas garantie sans bugs.

Pour l’instant il n’y a pas vraiment de documentation, ça viendra peut être plus tard. Lisez le fichier README dans l’archive ci-dessous qui contient également des fichiers d’input. Toutes remarques, suggestions, conseils et retour de bugs sont les bienvenus.

Sources du code cargol (02/03/2010)

Principe de fonctionnement d’une batterie lithium ion

Ce document présente, de façon vulgarisée, le fonctionnement d’une batterie lithium ion. Il s’agit de diapositives que j’ai utilisées à l’occasion d’un séminaire à l’attention d’élève du lycée. La première partie est un bref historique au sujet des batteries. La deuxième partie concerne quelques rappels en électricité et sur les piles ou batteries en général. La troisième partie traite des batteries lithium ion.


Présentation du fonctionnement d’une batterie lithium ion.

Sources :

  • Science et vie 1076, mai 2007
  • La recherche 435, Novembre 2009

Ma thèse en quelques mots

Étude théorique de processus photophysiques dans des protéines fluorescentes

Intensité de fluorescence

Cette thèse présente une étude théorique de protéines de la famille de la Green Fluorescent Protein, GFP. Ces protéines permettent grâce à leur propriétés de fluorescence d’explorer un nombre croissant de processus biologiques in vivo. Les approches numériques, complémentaires aux études expérimentales, peuvent apporter une compréhension microscopique des processus mis en jeu et contribuer à l’interprétation des propriétés photophysiques de ces protéines.

La première partie de ce manuscrit présente l’étude par simulation moléculaire de l’effet du changement de pH sur la structure de la Cerulean et sur son spectre d’absorption. Ces calculs nous ont permis d’établir que le décalage du spectre d’absorption, observé expérimentalement en fonction du pH, est dû à une isomérisation du chromophore liée au changement de l’orientation de la chaîne latérale d’un acide aminé proche.


La deuxième partie de ce manuscrit aborde l’étude d’un mécanisme de désactivation de la fluorescence dans la GFP. Nous avons proposé une approche, combinant des simulations de dynamique moléculaire biaisée et de dynamique brownienne, afin de déterminer la cinétique d’un mécanisme de désactivation de la fluorescence lié à une torsion du chromophore. Nous avons pu obtenir des distributions de temps de nème passage aux géométries critiques et en déduire des informations quantitatives sur le déclin de fluorescence.

Les outils développés et leurs futurs développements permettront de progresser dans la compréhension de la relation entre l’isomérisation du chromophore, le pH et le déclin de la fluorescence qui sont étroitement liés dans les protéines fluorescentes.

Manuscrit de thèse

Version imprimable du manuscrit de thèse (liens non colorés).

Ces travaux ont été réalisés en utilisant différentes méthodes de simulations numériques : Simulations de dynamiques moléculaires (AMBER), calculs de chimie quantique (Gaussian), codes personnels (Fortran 77/90).