← Projets
CChimie QuantiqueOrbitales MoléculairesAlgèbre LinéaireProjet Info

Localisation d'Orbitales Moléculaires (POPLOC)

2025-10-12

Projet Informatique FL05 — Chimie ParisTech PSL, octobre 2025 Réalisé avec Mattéo Fabrici

Introduction

L'étude des orbitales moléculaires constitue un outil essentiel en chimie quantique pour comprendre la structure électronique des molécules. Toutefois, les orbitales issues de la résolution de l'équation de Schrödinger sont généralement délocalisées — ce qui les rend peu interprétables chimiquement, car elles ne représentent pas directement les liaisons ou les doublets non liants.

Pour pallier cette difficulté, nous avons implémenté la méthode POPLOC (population localised orbitals), qui transforme les orbitales délocalisées en orbitales localisées (LMO) directement interprétables en termes de liaisons chimiques, sans recourir à des intégrales biélectroniques coûteuses.

Le programme, écrit en C, prend en entrée un fichier .mgf contenant les coefficients LCAO des orbitales moléculaires délocalisées, et restitue un fichier .mgf modifié avec les orbitales localisées correspondantes.

Rappel des hypothèses

Hypothèse LCAO. Chaque orbitale moléculaire s'écrit comme combinaison linéaire d'orbitales atomiques (OA) :

ψOM(r)=i=1Nciϕi(r)\psi_{\mathrm{OM}}(\mathbf{r}) = \sum_{i=1}^{N} c_i\,\phi_i(\mathbf{r})

Invariance de l'espace occupé. Les orbitales occupées peuvent subir une transformation unitaire sans modifier la densité électronique ni l'énergie totale, car elles décrivent le même espace vectoriel (déterminant de Slater). Ce n'est pas le cas des vacantes : les mélanger avec des occupées changerait la densité et l'énergie.

Nous avons appliqué cette méthode à CH₄, une petite molécule sans doublets non liants (quatre liaisons C-H à localiser).


Architecture du programme

Le projet est structuré en trois modules :

projet/
├── src/
│   ├── main.c
│   ├── gestionfichier.c
│   └── matrice.c
├── includes/
│   ├── main.h
│   ├── gestionfichier.h
│   └── matrice.h
├── data/
│   ├── CH4.mgf
│   └── liaison.csv
└── output/
    └── CH4_output.mgf
  • matrice.c — opérations matricielles (produit, transposée, diagonalisation de Jacobi, etc.)
  • gestionfichier.c — lecture/écriture du format .mgf
  • main.c — algorithme POPLOC principal

Méthode algorithmique

Principe général

L'objectif est de construire, à partir de la matrice E[OA][OM] des coefficients LCAO, une nouvelle matrice E'[OA][OM] dont les colonnes représentent les orbitales localisées.

Pour le méthane, E est une matrice 8×8 (8 OA : 1 couche s du C + 3 couche p du C + 4 × 1s des H, et 8 OM).

Pour chaque liaison C–H entre les atomes ii et jj, on construit la matrice R en conservant uniquement les lignes de EE correspondant aux OA des atomes non impliqués dans la liaison :

R=PNER = P_{\mathcal{N}}\, E

PNP_{\mathcal{N}} est le projecteur qui élimine les OA locales à la liaison. Physiquement, RR mesure la population électronique délocalisée hors de la région que l'on cherche à localiser.

On cherche ensuite le vecteur XX (combinaison linéaire des OM occupées) qui maximise la concentration électronique sur la liaison, c'est-à-dire le vecteur propre associé à la plus petite valeur propre de la matrice symétrique RRR^\top R :

RRX=λminXR^\top R\, X = \lambda_{\min}\, X

L'orbitale localisée correspondante est alors :

L=EXL = E\, X

En répétant cette procédure pour les quatre liaisons C–H et en moyennant les matrices obtenues, on construit E=EX~E' = E\,\widetilde{X}.

Structure de données Matrice

typedef struct {
    int n;          // nombre de lignes
    int m;          // nombre de colonnes
    long double** data;
} Matrice;

Cette structure auto-porteuse simplifie les entrées/sorties des fonctions et facilite le débogage (les dimensions sont toujours accessibles).

Fonctions principales

lireMGF — lecture du fichier .mgf

int lireMGF(const char *path, Matrice *E, int **aoParAtome, int *natoms_out);

Lit le fichier CH4.mgf, détermine le nombre d'atomes et d'OA selon la période de chaque élément (H → 1 OA, C/N/O/F → 4 OA), puis construit la matrice E.

ecrireMGF — réécriture du fichier .mgf

int ecrireMGF(const char *in_path, const char *out_path, const Matrice *E, int nAO);

Recopie le fichier d'entrée ligne par ligne en remplaçant les coefficients des blocs ORBITAL par les nouvelles valeurs calculées.

vpJacobi — diagonalisation par la méthode de Jacobi

void vpJacobi(Matrice a, Matrice b);

Diagonalise la matrice symétrique réelle a ; b reçoit la matrice des vecteurs propres. Implémentée à partir de l'algorithme des rotations de Jacobi (convergence garantie pour les matrices symétriques réelles).

maxVP / minVP — extraction de la valeur propre extremale

double maxVP(Matrice colVP, int *pos_out);

Renvoie la valeur propre minimale (en valeur absolue) et son indice, utilisé pour identifier le vecteur propre X associé à la plus grande localisation.


Organigramme

Organigramme du programme POPLOC
Organigramme du programme POPLOC

Résultats et analyse

À la fin de l'exécution, le programme produit CH4_output.mgf en ne modifiant que les 4 premières colonnes (OM occupées). Les 4 OM vacantes restent inchangées.

Visualisation via JMOL

Les orbitales avant et après localisation sont comparées ci-dessous (commandes JMOL utilisées : mo fill + mo translucent 0.5).

OM 1

Avant (délocalisée)Après (localisée)
OM 1 initialeOM 1 sortie

L'OM 1 initiale ressemblait à la 2s du carbone (coefficient dominant > 99 % sur la 2s_C). En sortie, elle est localisée sur la liaison C–H₁ avec une belle hybridation sp³. Cela illustre que les représentations surfaciques seules peuvent être trompeuses : les électrons occupent exclusivement le volume défini par l'OM localisée.

OM 2

AvantAprès
OM 2 initialeOM 2 sortie

Les lobes bleus englobaient déjà la liaison C–H ; après localisation, ils la recouvrent en exclusivité, avec les lobes rouges adoptant la forme sp³.

OM 3

AvantAprès
OM 3 initialeOM 3 sortie

À première vue la visualisation semble atypique, mais le lobe rouge est parfaitement localisé sur la liaison C–H, résultant d'un recouvrement sp³. Le signe des lobes n'est pas significatif physiquement.

OM 4

AvantAprès
OM 4 initialeOM 4 sortie

Même comportement cohérent que l'OM 2.

OM 5 à 8 — orbitales vacantes (non modifiées)

Les quatre OM non occupées restent intactes, confirmant que le programme respecte bien la contrainte d'invariance.

OM 5
OM 5
OM 6
OM 6
OM 7
OM 7
OM 8
OM 8

Critère de validation

La localisation est réussie si, pour chaque OM occupée :

  1. Seuls les coefficients des deux atomes de la liaison sont non négligeables (les autres doivent être < 10⁻²).
  2. La normalisation est vérifiée : i=18Ci2=1\sum_{i=1}^{8} C_i^2 = 1.

Test sur NH₃

Un test sur NH₃ a révélé un problème de dégénérescence des valeurs propres lié au doublet non liant de l'azote. Par manque de temps, ce cas n'a pas été résolu, mais il correspond exactement au cas discuté dans la publication de référence POPLOC.


Fichiers .mgf entrée/sortie

CH₄ entréeCH₄ sortie
CH4.mgfCH4_out.mgf
NH₃ entréeNH₃ sortie
NH3.mgfNH3_out.mgf

Conclusion

L'application de POPLOC sur CH₄ est concluante : les quatre OM occupées sont localisées sur les liaisons C–H avec une hybridation sp³ nette, et les quatre vacantes restent intactes.

Le principal écart par rapport à la publication est le choix de maximiser la population locale (construire R avec les OA des atomes de liaison plutôt que des autres), ce qui s'est avéré plus pratique à implémenter tout en donnant les mêmes résultats.

Perspectives : traitement des dégénérescences (cas NH₃, doublets non liants), extension aux molécules contenant des éléments de période 3, interface en ligne de commande pour passer le fichier .mgf en argument.