Sentons-nous comme un chercheur de matériaux avec python [Introduction à pymatgen]

Bonjour.

Dans l'article précédent, j'ai présenté une recherche matérielle sur le thème de l'apprentissage automatique. Sentons-nous comme un chercheur de matériaux avec l'apprentissage automatique

Cette fois, je présenterai pymatgen </ b> (Python Materials Genomics), qui est une bibliothèque python open source, pour ma propre étude. J'aimerais que vous soyez en contact avec la recherche matérielle.

Lecteur supposé

  • Je suis programmeur. Des personnes un peu intéressées par la physique et les matériaux ――Personnes qui font des matériaux mais veulent rendre leurs recherches plus efficaces «Je fais du matériel. Les gens qui veulent participer au programme
  • Materials informatics Personnes intéressées

En passant, j'ai créé un groupe Facebook appelé Materials Informatics Young People's Association. Il n'y a encore que quelques personnes, mais si vous êtes intéressé, n'hésitez pas à me contacter (fb ou email posté sur votre compte Qiita). J'aimerais partager des informations sur l'informatique des matériaux et organiser des sessions d'étude.

alors, commençons.

table des matières

  • [Qu'est-ce que la recherche matérielle en premier lieu? (Citation de ce qui précède)](#Qu'est-ce que la recherche matérielle en premier lieu)
  • [Qu'est-ce que pymatgen](Qu'est-ce que #pymatgen)
  • [Fonction de base](# fonction de base)
  • [Lien avec d'autres outils](#Linkage avec d'autres outils)
  • [Installer pymatgen](Installer #pymatgen)
  • [Déplaçons réellement](# Analysons réellement)

Si vous voulez vous sentir tout de suite comme un chercheur en matériaux, vous pouvez passer directement à l'installation. Les bases sont basées sur le document officiel de pymatgen, donc si vous n'avez pas de mal à lire l'anglais, vous pouvez le comprendre comme si vous lisiez ceci. alors, commençons.

Qu'est-ce que la recherche matérielle en premier lieu?

Ceci est une citation de ce qui précède. Si vous le lisez, veuillez l'ignorer. </ b> → [Qu'est-ce que pymatgen](Qu'est-ce que #pymatgen)

Tout d'abord, je pense que la recherche matérielle est quelque chose comme quel genre de matériel il s'agit. Comme vous l'avez dit, il existe divers matériaux tels que la céramique, les polymères et les métaux.

Par exemple iPhone iphone.jpg

Il contient des centaines de ces petits condensateurs céramiques.

0206_img0002.jpg

Et afin de fabriquer un condensateur haute performance choisi par Apple,

・ Quels types d'éléments doivent être combinés? ・ Quel genre de processus devriez-vous faire?

Cela résoudra le problème difficile. Voici un exemple de la façon de le résoudre.

  1. Pour le moment, voulez-vous changer celui des grands hommes du passé?
  2. De manière inattendue ... je me demande s'il vaut mieux augmenter le temps de mélange (optimisation du processus)
  3. C'est fait! Mesurer et observer diverses choses (mesure)
  4. Je vois, c'est très performant avec un tel phénomène physique (théorie, analyse)
  5. La tendance a été trouvée par la théorie et l'analyse, donc la prochaine fois je voudrais la faire avec de tels éléments ... (recherche)

C'est comme ça. Ceci n'est qu'un exemple, mais qu'est-ce que la recherche matérielle?

Fabriquer de bons matériaux en utilisant pleinement l'optimisation des processus, la mesure, la théorie, l'analyse, l'exploration, etc.

C'est désordonné, mais ça ressemble à ça.

Qu'est-ce que pymatgen

En termes simples, c'est un outil utile pour analyser les matériaux.

Tout d'abord, jetez un œil au diagramme ci-dessous pour avoir une idée approximative de l'analyse des matériaux. スクリーンショット 2017-05-17 午後0.19.07.png De Wikipedia

Comme je pense l'avoir fait au lycée, les substances sont composées d'atomes, et chacune a une grande variété de structures. Le but de l'analyse des matériaux est Quel type d'atome a quel type de structure et quel type de propriété? </ b> La solution est d'utiliser la physique.

Le sujet principal est donc pymatgen,

(1) De nombreux outils utiles pour visualiser les matériaux et utiliser les données d'analyse ② Facilité de liaison avec les outils actuellement utilisés pour l'analyse des matériaux

C'est une bibliothèque python open source </ b> qui présente l'avantage de. Veuillez noter que ce n'est pas un logiciel d'analyse qui fonctionne sur l'interface graphique.

En tant que fonction spécifique

  1. Expression flexible des types, positions et structures des éléments contenus dans les matériaux avec des classes python
  2. Prend en charge divers formats de données souvent utilisés dans la recherche de matériaux
  3. Outils d'analyse abondants utiles pour produire des diagrammes de phase et des diagrammes de pH potentiel, et analyser les réactions chimiques et la diffusion
  4. L'analyse de la structure électronique telle que la structure de bande et la densité d'état est possible
  5. Peut être lié à l'API REST de Materials Project

Est répertorié dans la documentation officielle.

À partir de là, sentons-nous comme un chercheur en matériaux en utilisant réellement pymatgen.

Fonction basique

Représentation des atomes et des structures par classe

Référence: http://pymatgen.org/pymatgen.core.html#module-pymatgen.core Tout d'abord, regardons les modules fournis par pymatgen pour exprimer les atomes et les structures.

pymatgen.core.periodic_table module Un tableau périodique est un tableau périodique </ b> que vous connaissez tous. Présentation de la classe Element, Specie class </ b> de ce module. La classe Element hérite de la classe Enum et permet de définir les atomes correspondant au tableau périodique.

class Element(Enum):
    def __init__(self, symbol):
        self.symbol = "%s" % symbol
        d = _pt_data[symbol]
        ...

Puisque Periodic_table.json dans la bibliothèque pymatgen est chargé dans _pt_data lorsque le module est importé,

>>> fe = Element("Fe")
>>> fe.data
{'Superconduction temperature': 'no data K', 'Molar volume': '7.09 cm<sup>3</sup>', 'Ionic radii hs': {'2': 0.92, '3': 0.785}, 'Melting point': '1811 K', 'Atomic radius': 1.4, 'Mineral hardness': '4.0', 'Electrical resistivity': '10 10<sup>-8</sup> &Omega; m', 'Vickers hardness': '608 MN m<sup>-2</sup>', 'Brinell hardness': '490 MN m<sup>-2</sup>', 'Youngs modulus': '211 GPa', 'Ionic radii': {'2': 0.92, '3': 0.785}, 'Atomic no': 26, 'Mendeleev no': 61, 'Thermal conductivity': '80 W m<sup>-1</sup> K<sup>-1</sup>', 'Reflectivity': '65 %', 'Liquid range': '1323 K', 'Ionic radii ls': {'2': 0.75, '6': 0.39, '3': 0.69, '4': 0.725}, 'Rigidity modulus': '82 GPa', 'X': 1.83, 'Critical temperature': 'no data K', 'Poissons ratio': '0.29', 'Oxidation states': [-2, -1, 1, 2, 3, 4, 5, 6], 'Van der waals radius': 'no data', 'Velocity of sound': '4910 m s<sup>-1</sup>', 'Coefficient of linear thermal expansion': '11.8 x10<sup>-6</sup>K<sup>-1</sup>', 'Bulk modulus': '170 GPa', 'Common oxidation states': [2, 3], 'Name': 'Iron', 'Atomic mass': 55.845, 'Electronic structure': '[Ar].3d<sup>6</sup>.4s<sup>2</sup>', 'Density of solid': '7874 kg m<sup>-3</sup>', 'Refractive index': 'no data', 'Atomic radius calculated': 1.56, 'Boiling point': '3134 K'}

Vous pouvez facilement créer un objet avec diverses informations telles que le rayon de l'ion, le point de fusion, la résistance, la masse et la structure électronique de l'atome. Si vous souhaitez accéder à chacun, spécifiez les attributs comme indiqué ci-dessous et récupérez-les. Vous pouvez également voir la liste des attributs en regardant la source ou le document.

ionic_radii_fe = fe.ionic_radii

Ensuite, jetons un œil à la classe Specie. Dans la classe Specie, les atomes peuvent être exprimés en tenant compte du nombre d'oxydation.

supported_properties = ("spin",)

class Specie(symbol, oxidation_state, properties=None):
    def __init__(self, symbol, oxidation_state, properties=None):
        self._el = Element(symbol)
        self._oxi_state = oxidation_state
        self._properties = properties if properties else {}
        for k in self._properties.keys():
            if k not in Specie.supported_properties:
                raise ValueError("{} is not a supported property".format(k))

Les éléments peuvent recevoir des indices d'oxydation et des propriétés. Vous pouvez simplement le considérer comme une version étendue d'Element. Il est recommandé que l'objet Specie ait des nombres et des caractéristiques d'oxydation idéaux, et que l'objet Site décrit plus loin puisse exprimer l'état d'oxydation et l'état de spin des éléments de la structure cristalline, donc enregistrez les résultats de la simulation. Pour ce faire, utilisez l'objet Site.

pymatgen.core.composition http://pymatgen.org/pymatgen.core.composition.html#module-pymatgen.core.composition Ce module est un module qui exprime la composition de substances telles que H2O et NaCl </ b>. Voici les classes de classe de composition les plus couramment utilisées.

class Composition(collections.Hashable, collections.Mapping, MSONable):
    def __init__(self, *args, **kwargs):
        self.allow_negative = kwargs.pop('allow_negative', False)
        # it's much faster to recognize a composition and use the elmap than
        # to pass the composition to dict()
        if len(args) == 1 and isinstance(args[0], Composition):
            elmap = args[0]
        elif len(args) == 1 and isinstance(args[0], six.string_types):
            elmap = self._parse_formula(args[0])
        else:
            elmap = dict(*args, **kwargs)
        elamt = {}
        self._natoms = 0
        for k, v in elmap.items():
        ...

C'est difficile à comprendre même en un coup d'œil et c'est difficile à expliquer, alors voyons simplement comment l'utiliser. .. ..

>>> #Facile à définir avec des chaînes comme NaCl et H2O
>>> comp = Composition("LiFePO4")
>>> #Comptage atomique
>>> comp.num_atoms
7.0
>>> #Numéro de chaque atome
>>> comp.formula
'Li1 Fe1 P1 O4'
>>> #Rapport de composition(Nombre d'atomes/全Nombre d'atomes)
>>> comp.get_atomic_fraction(Element("Li"))
0.14285714285714285

Il est facile à définir et vous pouvez créer un objet de composition pratique. Il existe de nombreuses autres fonctions, veuillez donc vous référer à la Documentation.

pymatgen.core.lattice

http://pymatgen.org/pymatgen.core.lattice.html#module-pymatgen.core.lattice Lattice signifie treillis, et je pense que beaucoup de gens se souviennent du treillis unitaire qu'ils apprennent même au lycée. Capture d'écran 2017-05-18 Après-midi 6.17.54.png Depuis wikipedia

Vecteur défini ici

R = {n}_1{a}_1+{n}_2{a}_2+{n}_3{a}_3

Représente le vecteur de réseau. Ce vecteur tridimensionnel est défini par le tableau multidimensionnel suivant.

R = [[10,0,0], [20,10,0], [0,0,30]]

Dans pymatgen, l'utilisation de la classe lattice le rend encore plus pratique.

class Lattice(MSONable):
    
    def __init__(self, matrix):
        m = np.array(matrix, dtype=np.float64).reshape((3, 3))
        lengths = np.sqrt(np.sum(m ** 2, axis=1))
        angles = np.zeros(3)

        for i in range(3):
            j = (i + 1) % 3
            k = (i + 2) % 3
            angles[i] = abs_cap(dot(m[j], m[k]) / (lengths[j] * lengths[k]))

        self._angles = np.arccos(angles) * 180. / pi
        self._lengths = lengths
        self._matrix = m
        self._inv_matrix = None
        self._metric_tensor = None
        self._diags = None
        self._lll_matrix_mappings = {}
        self._lll_inverse = None
        self.is_orthogonal = all([abs(a - 90) < 1e-5 for a in self._angles])
        ...

La matrice d'arguments correspond au format ou tableau numpy suivant.

#Liste multidimensionnelle
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
#liste
[1, 0, 0 , 0, 1, 0, 0, 0, 1]
#Taple
(1, 0, 0, 0, 1, 0, 0, 0, 1)

Ci-dessus, un simple cube.

>>> l = Lattice([1,0,0,0,1,0,0,0,1])
>>> l._angles
array([ 90.,  90.,  90.])
>>> l.is_orthogonal
True
>>> l._lengths
array([ 1.,  1.,  1.])
>>> l._matrix
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

De cette manière, vous pouvez utiliser l'objet Lattice pour accéder à des éléments tels que l'angle et la longueur. Nous vous recommandons de lire la documentation car elle possède d'autres fonctionnalités utiles. http://pymatgen.org/pymatgen.core.lattice.html

pymatgen.core.structure http://pymatgen.org/pymatgen.core.structure.html Ce module fournit des fonctionnalités qui permettent la représentation de la structure cristalline </ b>. Nous examinerons ici la classe IStructure, qui fournit les fonctionnalités les plus élémentaires.

class IStructure(SiteCollection, MSONable):

    def __init__(self, lattice, species, coords, validate_proximity=False,
                 to_unit_cell=False, coords_are_cartesian=False,
                 site_properties=None):
    ...

Cela prend divers arguments, alors jetons un coup d'œil à chacun d'eux.

  • lattice

Vous pouvez également utiliser la classe pymatgen.core.lattice.Lattice.

  • species

C'est le type d'atome. Il prend en charge différents formats comme suit.

#Liste des atomes
["Li", "Fe2+", "P", ...]
#Numéro atomique
(3, 56, ...)
#Liste avec taux d'occupation
[{"Fe" : 0.5, "Mn":0.5}, ...] 
  • coords

Cela spécifie les coordonnées de chaque atome.

#Au moment du NaCl
coords = [[0, 0, 0], [0.5, 0.5, 0.5]]

Dans cet esprit, la structure peut être définie comme ceci:

from pymatgen import Lattice, IStructure
#Structure CsCl
a = 4.209 #Å
latt = Lattice.cubic(a)
structure = IStructure(latt, ["Cs", "Cl"], [[0, 0, 0], [0.5, 0.5, 0.5]])
>>> structure.density
3.7492744897576538
>>> structure.distance_matrix
array([[ 0.        ,  3.64510092],
       [ 3.64510092,  0.        ]])
>>> structure.get_distance
<bound method IStructure.get_distance of Structure Summary
Lattice
    abc : 4.2089999999999996 4.2089999999999996 4.2089999999999996
 angles : 90.0 90.0 90.0
 volume : 74.565301328999979
      A : 4.2089999999999996 0.0 0.0
      B : 0.0 4.2089999999999996 0.0
      C : 0.0 0.0 4.2089999999999996
PeriodicSite: Cs (0.0000, 0.0000, 0.0000) [0.0000, 0.0000, 0.0000]
PeriodicSite: Cl (2.1045, 2.1045, 2.1045) [0.5000, 0.5000, 0.5000]>

De cette manière, vous aurez accès aux distances, aux relations de position, aux densités, etc. dans la structure. Voyons ensuite quel type de fonction d'analyse est disponible.

Liste des modules d'analyse

Je vais brièvement présenter les types de modules disponibles. Je vais en ramasser quelques-uns et essayer de les déplacer. Le côté droit de cette image est la fonction d'analyse fournie par pymatgen.

スクリーンショット 2017-05-18 午後6.56.09.png

  • Sortie de diagramme de phase --Calcul de réaction
  • Analyse et visualisation de la structure électronique
  • Analyse des caractéristiques d'application telles que les caractéristiques de la batterie
  • Visualisation structurelle

etc. .. ..

Par exemple, dans le cas d'une analyse de structure électronique, une analyse de structure de bande peut être effectuée. スクリーンショット 2017-05-18 午後6.48.53.png

Vous pouvez également générer un diagramme de phase. スクリーンショット 2017-05-18 午後6.52.02.png

J'écrirai des articles qui présentent les fonctions en détail à partir de la source s'il y a une demande et si j'en ai envie, alors veuillez commenter si vous avez des demandes.

Coopération avec d'autres outils

Fondamentalement, d'autres logiciels sont utilisés pour les simulations avec une grande quantité de calcul, mais l'efficacité augmentera si pymatgen est utilisé pour l'analyse et la visualisation qui combinent ces données. Sur le côté gauche de cette image se trouve le lien avec les formats de données et les outils couramment utilisés. スクリーンショット 2017-05-18 午後6.56.09.png

  • L'entrée et la sortie VASP peuvent être importées
  • Les fichiers Cif utilisés dans Material Studio, etc. peuvent également être gérés
  • Prend en charge le format babel ouvert
  • Peut être lié à l'API de repos de Materials Project

Etc. Si vous utilisez les fichiers ou logiciels ci-dessus pour les calculs des premiers principes, veuillez les introduire.

En ce qui concerne l'api de repos de Materials Project, j'ai écrit comment l'utiliser dans Article précédent, veuillez donc vous y référer. Si vous l'utilisez, le projet Matériaux publiera une grande quantité de données et vous pourrez collecter librement des données de martèlement, c'est donc essentiel si vous souhaitez faire du machine learning.

Cela fait longtemps, mais utilisons tous pymatgen!

Installez pymatgen

Le flux de base de l'installation est

  1. Environnement où python peut être utilisé (la série 3 est recommandée)
  2. Installez conda
  3. Installez pymatgen avec conda

est. Veuillez vous référer aux articles suivants jusqu'à ce que vous installiez conda. Création d'un environnement python pour ceux qui souhaitent devenir des data scientists 2016

Quand tu as fait aussi loin

conda install --channel matsci pymatgen

Après vérification du fonctionnement, l'installation est terminée.

>>> import pymatgen
>>> pymatgen.__version__
'4.5.4'

Maintenant que vous êtes prêt, essayons-le!

Déplaçons-le réellement

Analyse de la structure des bandes

La structure de bande représente la dispersion des électrons dans la structure périodique du cristal. Pour illustrer la structure de bande, l'axe vertical est l'énergie, mais l'axe horizontal est le point de l'espace de réseau inverse, ce qui est assez difficile à comprendre. Donc, si vous n'êtes pas intéressé, comprenez dans la mesure où vous pouvez comprendre comment les électrons sont dispersés.

Avec pymatgen, vous pouvez visualiser la structure de bande analysée et la traiter sous forme de données. Tout d'abord, importez les bibliothèques requises.

#module d'utilisation de l'API REST du projet de matériaux
from pymatgen.matproj.rest import MPRester
#Pour tracer les structures de bande
%matplotlib inline
from pymatgen.electronic_structure.plotter import BSPlotter

Ensuite, récupérez la structure de bande analysée. Dans la vraie recherche, le fichier analysé par votre propre logiciel d'analyse (VASP, etc.) est converti en objet de pymatgen, mais cette fois, l'objet analysé est téléchargé à partir de la base de données de Materials Project </ b>. .. Lors de l'utilisation du projet de matériaux, l'enregistrement et l'acquisition de la clé API sont nécessaires, veuillez donc obtenir la clé API sur la page officielle.

#Spécifiez votre clé API
a = MPRester("Ma clé API")
#Spécifiez l'identifiant du matériel que vous souhaitez et obtenez-le par communication http. CuAlO2(mp-Obtenir 3784)
bs = a.get_bandstructure_by_material_id("mp-3748")

Ceci achève l'acquisition de la structure de bande! J'ai obtenu un objet Structure de bande directement à partir du projet de matériaux. http://pymatgen.org/_modules/pymatgen/electronic_structure/bandstructure.html#BandStructure

En passant, vous pouvez obtenir les informations matérielles comme celle-ci sur le projet de matériaux. スクリーンショット 2017-05-19 午後10.35.28.png

Nous traiterons ces informations sur python.

>>> bs.is_metal()
False

Ça ne ressemble pas au métal.

>>> bs.get_band_gap()
{'energy': 1.7978000000000005, 'direct': False, 'transition': '(0.591,0.409,0.000)-\\Gamma'}

La bande interdite est de 1,977 eV

>>> bs.get_direct_band_gap()
18.0201

La bande interdite pour la transition directe est de 18,021 eV. Maintenant, traçons le diagramme de bande.

%matplotlib inline
from pymatgen.electronic_structure.plotter import BSPlotter
plotter = BSPlotter(bs)
plotter.get_plot().show()

スクリーンショット 2017-05-19 午後10.42.15.png

Il s'agit des données sur le projet de matériaux, mais vous pouvez générer les résultats de simulation des matériaux que vous étudiez habituellement.

Donc, je serais heureux si je pouvais progressivement comprendre que l'objet pymatgen semble être utile pour la comparaison avec d'autres matériaux, l'apprentissage automatique, l'exploration, etc.

Il y a encore beaucoup de choses que nous pouvons faire, mais cette fois nous allons nous arrêter ici. (C'était long···) Je voudrais organiser une session d'étude pymatgen, une session d'étude de projet de matériaux, une session d'étude vasp, ou Association des jeunes en informatique des matériaux, donc si vous êtes intéressé, veuillez le faire Veuillez entrer ~

La prochaine fois, j'écrirai un article sur l'informatique des matériaux. Merci pour votre lecture attentive ~

Recommended Posts