.. _tutorial1-tddftCH4-pyscf:
Tutorial 1: calculate the polarizability of CH4 molecule with PySCF
===================================================================
In this first tutorial, we will learn how to calculate the
polarizability of a molecule using time dependent density functional
theory (TDDFT). In this tutorial, `PySCF `_ will be
used to perform the ground state calculations.
**Requirements:** have PyNAO and PySCF installed
Run DFT via PySCF
-----------------
We assume that you already were able to install PyNAO and therefore
PySCF program (since PySCF is required to use PyNAO).
Before to run DFT calculations, we need to run first DFT calculations,
in this tutorial, we will use PySCF
**Notes:** Siesta can be used as well to run DFT calculations, but it
must be installed first. Runing PyNAO for Siesta DFT calculations
will be covered in tutorial 2
The first step is to define the geometry, PySCF requires to enter the
greometry in a string of the form
::
Symbol x, y, z;
You can easily create such string in Python.
.. code:: ipython3
CH4_geometry = """C 0.00000000, 0.00000000, 0.00000000;
H 0.62911800, 0.62911800, 0.62911800;
H -0.62911800, -0.62911800, 0.62911800;
H 0.62911800, -0.62911800, -0.62911800;
H -0.62911800, 0.62911800, -0.62911800;"""
We can now launch DFT calculation with PySCF via the following lines
.. code:: ipython3
from pyscf import gto, scf
mol = gto.M(atom=CH4_geometry, basis='ccpvdz', spin=0)
gto_mf = scf.UHF(mol)
gto_mf.kernel()
.. parsed-literal::
converged SCF energy = -40.1987085424816 = 3.2329694e-13 2S+1 = 1
.. parsed-literal::
-40.198708542481626
Run TDDFT with PyNAO
--------------------
Now that DFT calculations are terminated we can start to launch TDDFT
calculations. The first step is to initialize the system and calculate
the kernel by calling ``tddft_iter``.
This method takes the DFT inputs, in this case the varaibles ``gto_mf``
and ``mol`` obtained from PySCF calculations.
.. code:: ipython3
from pynao import tddft_iter
td = tddft_iter(mf=gto_mf, gto=mol)
Once the kernel has been calculated, we can calculate the polarizability
of the molecule by calling the method ``comp_polariz_inter_Edir``.
This method tkes two main inputs:
- ``freq``: the frequencies at which to calculate the polarizability.
It must be a complex number, the real part is the actual frequencies
points, while the imaginary part is the actual broadening of the
polarizability. In general it will be ``tddft_iter.eps``. The
frequencies must be given in Hartree.
- ``Edir``: the direction of the external electric field
.. code:: ipython3
import numpy as np
import scipy.constants as cte
Ha = cte.physical_constants["Hartree energy in eV"][0]
freq = np.arange(0.0, 25.0, 0.05)/Ha + 1j * td.eps
p_mat = td.comp_polariz_inter_Edir(freq, Eext=np.array([1.0, 1.0, 1.0]))
.. parsed-literal::
Total number of iterations: 9918
.. code:: ipython3
import matplotlib.pyplot as plt
h = 7
w = 4*h/3
ft = 20
fig = plt.figure(1, figsize=(w, h))
ax = fig.add_subplot(111)
ax.plot(freq.real*Ha, -p_mat[0,0, :].imag, linewidth=3)
ax.set_xlabel(r"Energy (eV)", fontsize=ft)
ax.set_ylabel(r"$P_{xx}$ (a.u.)", fontsize=ft)
fig.tight_layout()
.. image:: tuto1-pic1.png