{ "cells": [ { "cell_type": "markdown", "source": [ "# Creating supercells with pymatgen\n", "\n", "The [Pymatgen](https://pymatgen.org/) python library allows to setup\n", "solid-state calculations using a flexible set of classes as well as an API\n", "to an online data base of structures. Its `Structure` and `Lattice`\n", "objects are directly supported by the DFTK `load_atoms` and `load_lattice`\n", "functions, such that DFTK may be readily used to run calculation on systems\n", "defined in pymatgen. Using the `pymatgen_structure` function a conversion\n", "from DFTK to pymatgen structures is also possible. In the following we\n", "use this to create a silicon supercell and find its LDA ground state\n", "using direct minimisation." ], "metadata": {} }, { "cell_type": "markdown", "source": [ "First we setup the silicon lattice in DFTK." ], "metadata": {} }, { "outputs": [], "cell_type": "code", "source": [ "using DFTK\n", "\n", "a = 10.263141334305942 # Lattice constant in Bohr\n", "lattice = a / 2 .* [[0 1 1.]; [1 0 1.]; [1 1 0.]]\n", "Si = ElementPsp(:Si, psp=load_psp(\"hgh/lda/Si-q4\"))\n", "atoms = [Si => [ones(3)/8, -ones(3)/8]];" ], "metadata": {}, "execution_count": 1 }, { "cell_type": "markdown", "source": [ "Next we make a `[2, 2, 2]` supercell using pymatgen" ], "metadata": {} }, { "outputs": [], "cell_type": "code", "source": [ "pystruct = pymatgen_structure(lattice, atoms)\n", "pystruct.make_supercell([2, 2, 2])\n", "lattice = load_lattice(pystruct)\n", "atoms = [Si => [s.frac_coords for s in pystruct.sites]];" ], "metadata": {}, "execution_count": 2 }, { "cell_type": "markdown", "source": [ "Setup an LDA model and discretize using\n", "a single kpoint and a small `Ecut` of 5 Hartree." ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "PlaneWaveBasis (Ecut=5.0, 1 kpoints)" }, "metadata": {}, "execution_count": 3 } ], "cell_type": "code", "source": [ "model = model_LDA(lattice, atoms)\n", "basis = PlaneWaveBasis(model, 5, kgrid=(1, 1, 1))" ], "metadata": {}, "execution_count": 3 }, { "cell_type": "markdown", "source": [ "Find the ground state using direct minimisation (always using SCF is boring ...)" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iter Function value Gradient norm \n", " 0 1.117808e+02 1.591249e+00\n", " * time: 0.7865450382232666\n", " 1 1.035355e+01 8.078999e-01\n", " * time: 3.126711130142212\n", " 2 -1.171575e+01 9.795259e-01\n", " * time: 3.775221109390259\n", " 3 -3.390619e+01 7.183295e-01\n", " * time: 4.741167068481445\n", " 4 -4.722593e+01 5.366174e-01\n", " * time: 5.678085088729858\n", " 5 -5.681434e+01 2.068873e-01\n", " * time: 6.659291982650757\n", " 6 -5.963103e+01 2.067385e-01\n", " * time: 7.287919998168945\n", " 7 -6.081118e+01 1.143088e-01\n", " * time: 7.953727960586548\n", " 8 -6.136379e+01 3.800089e-02\n", " * time: 8.594083070755005\n", " 9 -6.164838e+01 3.106858e-02\n", " * time: 9.21233606338501\n", " 10 -6.183710e+01 2.835819e-02\n", " * time: 9.87421202659607\n", " 11 -6.198324e+01 1.982930e-02\n", " * time: 10.513626098632812\n", " 12 -6.206414e+01 1.770723e-02\n", " * time: 11.146723985671997\n", " 13 -6.210657e+01 1.326357e-02\n", " * time: 11.759362936019897\n", " 14 -6.214022e+01 1.526538e-02\n", " * time: 12.390202045440674\n", " 15 -6.215959e+01 1.409654e-02\n", " * time: 13.023843050003052\n", " 16 -6.217459e+01 1.033879e-02\n", " * time: 13.641917943954468\n", " 17 -6.218621e+01 7.473256e-03\n", " * time: 14.27443814277649\n", " 18 -6.219713e+01 7.132136e-03\n", " * time: 14.883433103561401\n", " 19 -6.220589e+01 6.768825e-03\n", " * time: 15.50546407699585\n", " 20 -6.221423e+01 7.258585e-03\n", " * time: 16.128148078918457\n", " 21 -6.222246e+01 6.904639e-03\n", " * time: 16.75717306137085\n", " 22 -6.223107e+01 6.534517e-03\n", " * time: 17.379055976867676\n", " 23 -6.223934e+01 6.995409e-03\n", " * time: 18.00904107093811\n", " 24 -6.224612e+01 5.280502e-03\n", " * time: 18.628047943115234\n", " 25 -6.225090e+01 4.236397e-03\n", " * time: 19.26680302619934\n", " 26 -6.225416e+01 3.363594e-03\n", " * time: 19.886415004730225\n", " 27 -6.225642e+01 2.944093e-03\n", " * time: 20.521027088165283\n", " 28 -6.225803e+01 2.652824e-03\n", " * time: 21.144922971725464\n", " 29 -6.225923e+01 2.081159e-03\n", " * time: 21.77125906944275\n", " 30 -6.226017e+01 1.578960e-03\n", " * time: 22.396016120910645\n", " 31 -6.226081e+01 1.304900e-03\n", " * time: 23.02215003967285\n", " 32 -6.226117e+01 1.185979e-03\n", " * time: 23.647971153259277\n", " 33 -6.226141e+01 8.746444e-04\n", " * time: 24.271350145339966\n", " 34 -6.226153e+01 7.261449e-04\n", " * time: 24.886434078216553\n", " 35 -6.226160e+01 4.518534e-04\n", " * time: 25.499990940093994\n", " 36 -6.226163e+01 2.699016e-04\n", " * time: 26.114582061767578\n", " 37 -6.226165e+01 2.261945e-04\n", " * time: 26.740800142288208\n", " 38 -6.226165e+01 1.673752e-04\n", " * time: 27.365198135375977\n", " 39 -6.226166e+01 1.514545e-04\n", " * time: 27.972344160079956\n", " 40 -6.226166e+01 1.172625e-04\n", " * time: 28.625244140625\n", " 41 -6.226166e+01 1.089467e-04\n", " * time: 29.265701055526733\n", " 42 -6.226166e+01 8.707583e-05\n", " * time: 29.902117013931274\n", " 43 -6.226167e+01 5.438479e-05\n", " * time: 30.57490301132202\n", " 44 -6.226167e+01 4.061397e-05\n", " * time: 31.20841693878174\n", " 45 -6.226167e+01 3.040673e-05\n", " * time: 31.843623161315918\n", " 46 -6.226167e+01 2.978088e-05\n", " * time: 32.46531796455383\n", " 47 -6.226167e+01 1.555779e-05\n", " * time: 33.11745500564575\n", " 48 -6.226167e+01 8.877464e-06\n", " * time: 33.74287295341492\n", " 49 -6.226167e+01 6.362570e-06\n", " * time: 34.383244037628174\n", " 50 -6.226167e+01 6.041436e-06\n", " * time: 34.993189096450806\n", " 51 -6.226167e+01 5.224231e-06\n", " * time: 35.60582995414734\n", " 52 -6.226167e+01 4.282362e-06\n", " * time: 36.230628967285156\n", " 53 -6.226167e+01 3.401168e-06\n", " * time: 36.84134912490845\n", " 54 -6.226167e+01 2.934874e-06\n", " * time: 37.46035695075989\n" ] } ], "cell_type": "code", "source": [ "scfres = direct_minimization(basis, tol=1e-5);" ], "metadata": {}, "execution_count": 4 }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "Energy breakdown:\n Kinetic 25.7671073\n AtomicLocal -18.8557639\n AtomicNonlocal 14.8522605\n Ewald -67.1831486\n PspCorrection -2.3569765\n Hartree 4.8485368 \n Xc -19.3336819\n\n total -62.261666459256\n" }, "metadata": {}, "execution_count": 5 } ], "cell_type": "code", "source": [ "scfres.energies" ], "metadata": {}, "execution_count": 5 } ], "nbformat_minor": 3, "metadata": { "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.6.1" }, "kernelspec": { "name": "julia-1.6", "display_name": "Julia 1.6.1", "language": "julia" } }, "nbformat": 4 }