module load CP2K/xas_tdp_libint2
To make sure you are using the proper version, type ''module unload CP2K/6.1-foss-2017b'' before launching any calculation.
===== Part 1: the standard workflow =====
The first step to all atomistic simulations is to get hold of the molecule/material structure. The latter can come from different sources: a careful geometry optimization, frames of a molecular dynamics run or experiments. In order to keep the focus on XANES, a geometry optimization was run ahead of time and the structure stored in the following ''geometry.xyz'' file:
26
Trimethylaluminium structure
Al 4.2675935634 5.5407111338 4.7089610588
Al 6.4608798572 4.2997143768 5.3967873091
C 5.1793535458 3.8631556857 3.7238051743
H 5.6698412406 4.2214449576 2.8092452108
H 4.1254815388 3.6491894229 3.4661776259
C 5.5489970130 5.9771338270 6.3820518382
H 5.1739704174 6.9992805163 6.1899010533
H 5.0579905439 5.6189992181 7.2963828304
H 5.5549255131 2.8411776275 3.9158135330
H 6.6028509125 6.1906122100 6.6401744970
C 8.1577533120 4.8462637633 4.5673348260
H 8.0626764249 5.7568375257 3.9554443238
H 8.5548879421 4.0566420550 3.9092516157
H 8.9349946502 5.0418279813 5.3241717501
C 6.3493279327 2.8490785738 6.7195500278
H 5.3140757011 2.6112574534 7.0097068947
H 6.8924547937 3.1044799443 7.6434085417
H 6.8018718123 1.9194670696 6.3386170476
C 4.3795530867 6.9915820838 3.3864761343
H 5.4149333409 7.2291739602 3.0966185981
H 3.9272669851 7.9212012690 3.7677052718
H 3.8365057581 6.7367174672 2.4624343308
C 2.5706506209 4.9941975061 5.5382826840
H 2.6657281632 4.0834902522 6.1499880352
H 1.7933806464 4.7988174956 4.7814409011
H 2.1735548094 5.7836967331 6.1965426058
Download/copy the above file in your working directory. This is a XYZ file, which structure is quite simple: the first line states the number of atoms in the structure, the second line is reserved for a description and the rest contains the Cartesian coordinates in Angstroms.
==== Making a XAS_TDP compatible ground state calculation ====
To accurately describe the core states from which electrons are excited in XAS, all electron calculations are required. In CP2K, this means using the GAPW method. The following ''part1_gs.inp'' input file contains all required keywords for such a calculation. Pay attention to the comments (starting with exclamation marks) explaining what is going on.
!This input file is meant for a ground state calculation of Al2(CH3)6 before XAS_TDP
&GLOBAL
PROJECT part1 !project name, useful to keep track of produced files
RUN_TYPE ENERGY
&END GLOBAL
&FORCE_EVAL
METHOD QS
&DFT
!where to find all-electron basis sets and potentials
BASIS_SET_FILE_NAME EMSL_BASIS_SETS
POTENTIAL_FILE_NAME POTENTIAL
&QS
METHOD GAPW !GAPW for all-electron
&END QS
&POISSON !Necessary to define POISSON section in non-perdiodic
PERIODIC NONE !boudary conditions as the default assumes PBCs
POISSON_SOLVER MT
&END POISSON
&SCF
MAX_SCF 50
EPS_SCF 1.0E-08 !high quality ground state required for XAS_TDP
SCF_GUESS RESTART !to avoid recomputing when we can
&END SCF
&MGRID
CUTOFF 600
&END
&XC
&XC_FUNCTIONAL !the stendard PBE functional, the LIBXC way
&LIBXC
FUNCTIONAL GGA_C_PBE
&END LIBXC
&LIBXC
FUNCTIONAL GGA_X_PBE
&END LIBXC
&END XC_FUNCTIONAL
&END XC
&END DFT
&SUBSYS
&CELL
ABC 10.0 10.0 10.0 !Big enough cell, we don't want density to spread out of it
PERIODIC NONE !Need to specify non-periodicity here too
&END CELL
&TOPOLOGY
!define the structure externally => reuse the same file all the way
COORD_FILE_NAME geometry.xyz
COORD_FILE_FORMAT xyz
&CENTER_COORDINATES
&END CENTER_COORDINATES
&END TOPOLOGY
&KIND H
BASIS_SET Ahlrichs-pVDZ !Kinds are described by all-electron potentials and
POTENTIAL ALL !double-zeta quality all-electron basis sets
&END KIND
&KIND C
BASIS_SET Ahlrichs-pVDZ
POTENTIAL ALL
&END
&KIND Al
BASIS_SET Ahlrichs-pVDZ
POTENTIAL ALL
&END
&END SUBSYS
&END FORCE_EVAL
Download this input and place it into your working directory. Make sure that the ''geometry.xyz'' file is also there. Because it is a relatively small system, we do not need to run CP2K in parallel. To launch the calculation, write in the terminal (after modifying the paths in the ''cp2k.sh'' file):
sbatch cp2k.sh
Where ''cp2k.sopt'' is the serial version of CP2K, the ''-i'' flag indicates the input file and the ''-o'' flag the output. You can follow the progress of your calculation by typing the following in the terminal (press ''ctrl''+''C'' to stop):
tail -f part1_gs.out
Once the calculation finishes, you will notice that a new file named ''part1-RESTART.wfn'' was created. This file contains information about the converged ground state wave function, such that further calculation sharing the same project name will be able to skip the SCF convergence step and be much faster.
Note that in principle, you should make sure your ground state calculation is converged. For this exercise, we assume that it has been done ahead of time.
==== Checking the core donor states ====
The next step in the workflow consists in verifying that we can find the proper donor core states, which are 2 Aluminium 1s in our case. To do that, we need to trigger a XAS_TDP calculation on top of our previously computed ground state with the ''CHECK_ONLY'' keyword. The latter makes sure that the programs only analyzes the potential donor molecular orbitals (MOs) and stops before doing any expensive operation. The next input file does just that:
&GLOBAL
PROJECT part1 !This is important to keep the same project name to be able to RESTART
RUN_TYPE ENERGY
&END GLOBAL
&FORCE_EVAL
METHOD QS
&DFT
BASIS_SET_FILE_NAME EMSL_BASIS_SETS
POTENTIAL_FILE_NAME POTENTIAL
&QS
METHOD GAPW
&END QS
&POISSON
PERIODIC NONE
POISSON_SOLVER MT
&END POISSON
&SCF
MAX_SCF 50
EPS_SCF 1.0E-08
SCF_GUESS RESTART
&END SCF
&MGRID
CUTOFF 600
&END
&XC
&XC_FUNCTIONAL
&LIBXC
FUNCTIONAL GGA_C_PBE
&END LIBXC
&LIBXC
FUNCTIONAL GGA_X_PBE
&END LIBXC
&END XC_FUNCTIONAL
&END XC
!The section controlling the XAS calculations
&XAS_TDP
CHECK_ONLY !in order to verify our donor MOs
&DONOR_STATES
DEFINE_EXCITED BY_KIND
KIND_LIST Al
STATE_TYPES 1s
N_SEARCH 2 !We know that Al 1s are the 2 MOs with the lowest energy
#LOCALIZE !rmove the # to uncomment LOCALIZE
&END DONOR_STATES
&END XAS_TDP
&END DFT
&SUBSYS
&CELL
ABC 10.0 10.0 10.0
PERIODIC NONE
&END CELL
&TOPOLOGY
COORD_FILE_NAME geometry.xyz
COORD_FILE_FORMAT xyz
&CENTER_COORDINATES
&END CENTER_COORDINATES
&END TOPOLOGY
&KIND H
BASIS_SET Ahlrichs-pVDZ
POTENTIAL ALL
&END KIND
&KIND C
BASIS_SET Ahlrichs-pVDZ
POTENTIAL ALL
&END
&KIND Al
BASIS_SET Ahlrichs-pVDZ
POTENTIAL ALL
&END
&END SUBSYS
&END FORCE_EVAL
You can download/copy the above file in your working directory. Note that the project name is the same as in ''part1_gs.inp''; this ensure that we can restart and skip the ground state calculation. Only a minimal &XAS_TDP section was added, with the CHECK_ONLY keyword and the &DONOR_STATES subsection. Note that the LOCALIZE keyword is commented for now. Adapt the paths in ''cp2k.sh'' and run this input.
Once the calculation is over, open ''part1_check.out'' and look for ''XAS_TDP''. This will lead you to the relevant part of the output file, in which you can check the quality of the donor MOs. **Remember**: for the theory to apply correctly, the donor states need to be local in space and of 1s character. Look at the ''overlap'' and ''charge'' indicators, are we good to proceed ?
**No**, we are not, because the Aluminium atoms are equivalent under symmetry and the 2 lowest energy MOs will be arbitrary linear combinations of the 1s states. To get the needed donor state quality, uncomment the LOCALIZE keyword in the input file and rerun.
==== Computing the XANES spectrum ====
Now that we have a proper ground state and we know that the donor MOs are of good quality, we can do an actual XANES calculation on top. To do so, we, have to complete the &XAS_TDP section to include information about the integration grid, the dipole form and most importantly the kernel:
&GLOBAL
PROJECT part1
RUN_TYPE ENERGY
&END GLOBAL
&FORCE_EVAL
METHOD QS
&DFT
BASIS_SET_FILE_NAME EMSL_BASIS_SETS
POTENTIAL_FILE_NAME POTENTIAL
AUTO_BASIS RI_XAS MEDIUM !automatically generates an RI basis
&QS
METHOD GAPW
&END QS
&POISSON
PERIODIC NONE
POISSON_SOLVER MT
&END POISSON
&SCF
MAX_SCF 50
EPS_SCF 1.0E-08
SCF_GUESS RESTART
&END SCF
&MGRID
CUTOFF 600
&END
&XC
&XC_FUNCTIONAL
&LIBXC
FUNCTIONAL GGA_C_PBE
&END LIBXC
&LIBXC
FUNCTIONAL GGA_X_PBE
&END LIBXC
&END XC_FUNCTIONAL
&END XC
!The section controlling the XAS calculations
&XAS_TDP
CHECK_ONLY F !set CHECK_ONLY to false for actual computation
&DONOR_STATES
DEFINE_EXCITED BY_KIND
KIND_LIST Al
STATE_TYPES 1s
N_SEARCH 2
LOCALIZE
&END DONOR_STATES
TAMM_DANCOFF !For a full-TDDFT calculation, set TAMM_DANCOFF F
DIPOLE_FORM LENGTH !LENGTH or VELOCITY, it does not really matter
GRID Al 100 100 !100x100 grid rather small but enough here
&KERNEL
&XC_FUNCTIONAL !In principle, one could use a
&LIBXC !different functional for the
FUNCTIONAL GGA_C_PBE !kernel, but to be consistent
&END LIBXC !one usually uses the same as
&LIBXC !for the ground state. Only
FUNCTIONAL GGA_X_PBE !LIBXC functionals are available
&END LIBXC
&END XC_FUNCTIONAL
&END KERNEL
&END XAS_TDP
&END DFT
&SUBSYS
&CELL
ABC 10.0 10.0 10.0
PERIODIC NONE
&END CELL
&TOPOLOGY
COORD_FILE_NAME geometry.xyz
COORD_FILE_FORMAT xyz
&CENTER_COORDINATES
&END CENTER_COORDINATES
&END TOPOLOGY
&KIND H
BASIS_SET Ahlrichs-pVDZ
POTENTIAL ALL
&END KIND
&KIND C
BASIS_SET Ahlrichs-pVDZ
POTENTIAL ALL
&END
&KIND Al
BASIS_SET Ahlrichs-pVDZ
POTENTIAL ALL
&END
&END SUBSYS
&END FORCE_EVAL
You can run this XAS calculation the usual way.
Note that again, the program reuses the previous ground state calculation. The spectral data can be found in the ''part1.spectrum'' file. The excitation energies are given in eV and the oscillator strength are within the dipole approximation (arbitrary units). There are two blocks of data, one for each Al 1s. Note that the values are practically the same since the Al atoms are indistinguishable.
If you wish, you can plot the XANES spectrum using this [[https://raw.githubusercontent.com/abussy/CONEXS/master/plot_spectrum.py | python script]]. Make sure the script is located in the same directory as your ''part1.spectrum'' file and type: **Note: ** before using this script, you have to load a proper python installation by typing: ''module load Anaconda3/''
python plot_spectrum.py part1.spectrum Al 1s 1.0 1500 1525 1000
Where ''Al'' and ''1s'' tell the script which data to read in ''part1.spectrum'', ''1.0'' is the width for the gaussian broadening, 1500 and 1525 are the x-axis (energy) bounds and 1000 is for the resolution (1000 points). You can read the first few lines of the script for documentaion. **Remember** that TDDFT results usually need to be shifted to match experiments (either by an empirical amount or by a ΔSCF calculation)
** If you have time, feel free to: **
&GLOBAL
PROJECT hybrid
RUN_TYPE ENERGY
&END GLOBAL
&FORCE_EVAL
METHOD QS
&DFT
BASIS_SET_FILE_NAME EMSL_BASIS_SETS
POTENTIAL_FILE_NAME POTENTIAL
AUTO_BASIS RI_XAS LARGE !want high precision
&QS
METHOD GAPW
&END QS
&POISSON
PERIODIC NONE
POISSON_SOLVER MT
&END POISSON
&SCF
MAX_SCF 50
EPS_SCF 1.0E-08
SCF_GUESS RESTART
&END SCF
&MGRID
CUTOFF 600
&END
&XC
&XC_FUNCTIONAL !The BHandHLYP functional, popular with XAS TDDFT
&LIBXC
FUNCTIONAL HYB_GGA_XC_BHandHLYP
&END LIBXC
&END XC_FUNCTIONAL
&HF
FRACTION 0.5 !the functional requires 50% of exact exchange
&END HF
&END XC
!The section controlling the XAS calculations
&XAS_TDP
&DONOR_STATES
DEFINE_EXCITED BY_KIND
KIND_LIST Al
STATE_TYPES 1s
N_SEARCH 2
LOCALIZE
&END DONOR_STATES
TAMM_DANCOFF
DIPOLE_FORM LENGTH
GRID Al 300 300 !Denser grid for integration
&KERNEL
NPROCS_GRID 4 !Use 4 procs per grid, ignored if serial run
RI_RADIUS 3.0 !Use also neighbor's RI basis functions for density projection
&XC_FUNCTIONAL
&LIBXC
FUNCTIONAL HYB_GGA_XC_BHandHLYP
&END LIBXC
&END XC_FUNCTIONAL
&EXACT_EXCHANGE
SCALE 0.5
&END EXACT_EXCHANGE
&END KERNEL
&END XAS_TDP
&END DFT
&SUBSYS
&CELL
ABC 10.0 10.0 10.0
PERIODIC NONE
&END CELL
&TOPOLOGY
COORD_FILE_NAME geometry.xyz
COORD_FILE_FORMAT xyz
&CENTER_COORDINATES
&END CENTER_COORDINATES
&END TOPOLOGY
&KIND H
BASIS_SET Ahlrichs-def2-TZVP !moved to higher quality triple zeta basis sets
POTENTIAL ALL
&END KIND
&KIND C
BASIS_SET Ahlrichs-def2-TZVP
POTENTIAL ALL
&END
&KIND Al
BASIS_SET Ahlrichs-def2-TZVP
POTENTIAL ALL
&END
&END SUBSYS
&END FORCE_EVAL
Create a new directory for this part of the exercise and download the above input file into it. Make also sure that you copy the ''gemoetry.xyz'' file from the previous part in there. Have a look at the changes made in the input and their corresponding comments.
In particular, notice how the new keyword RI_RADIUS was added in the &KERNEL subsection. This defines a sphere around the excited atoms in which all RI basis functions contribute to the projection of the density. Remeber:
$$
n(\mathbf{r}) \approx \sum_{pq}\sum_{\mu\nu} P_{pq} \ \big(\varphi_p \varphi_q \chi_\mu \big) \ S_{\mu\nu}^{-1} \ \chi_\nu(\mathbf{r})
$$
where $P_{pq}$ is the density matrix, $\varphi_p,\varphi_q$ are atomic orbitals and $\chi_\mu, \chi_\nu$ are RI basis functions. Extending RI_RADIUS allows for a greater number of RI basis and a higher quality projection of the density, to which hybrid kernels have shown to be very sensitive.
With the keyword NPROCS_GRID set to 4, you can run the calculation on 8 cores and have simultaneous integration of the XC kernel for both Al atoms using all available resources. cp2k.popt -i hybrid.inp -o hybrid.out &
If you copy the ''plot_spectrum.py'' script from part one in your working directory, you can use it the same way to plot the XANES spetrum:
python plot_spectrum.py hybrid.spectrum Al 1s 1.0 1545 1570 1000
**If you have time, feel free to:**
&DONOR_STATES
DEFINE_EXCITED BY_KIND
KIND_LIST Al
STATE_TYPES 2s !Note that the STATE_TYPES keyword can be used multiple times such
STATE_TYPES 2p !that both 2s and 2p excitations are done in a single calculation
N_SEARCH -1 !We do not know exactly where are the 2s/2p states in terms of
LOCALIZE !energy => N_SEARCH -1 will look among all occupied MOs
&END DONOR_STATES
Once you have copied the above in your input file, you can launch your calculation as usual. Make sure that the ''gemoetry.xyz'' file is present in the same directory too. The ''plot_spectrum.py'' script can be used again.
Note that if you chose to do the hybrid calculation, you might have to increase the integration grid density and the RI_RADIUS even further to obtain converged results.