The crystal orbital overlap analysis (COOP) is a method to clarify the bonding mechanism of molecules on the surface. In short, the wave functions of the total system is expanded in terms of the wave functions of the subsystem, and the densities of states weighted by overlap populations are calculated.
Let us use a CO molecule on a Pt(111) surface as an example. In the following, how to calculate COOP is described step by step.
For the COOP calculation, we need the wave functions and eigenvalues for the combined system and wave functions for the subsystems. Here the subsystems are CO and Pt(111). In the following we use the directories named CO, Pt, and Total for isolated CO, isolated Pt(111), and combined system, respectively, and Pt_pbe1s, C_pbe3, and O_pbe3 are used as pseudopotentials.
Input file for the SCF calculations of the combined system (Total/nfinp_scf) is as follows:
1 0 0 0 0 0 : Pt(111)(sqrt(3)xsqrt(3)) surface: 3-layer slab + 6-layer vacuum 5.0000 15.0000 3 11 11 : gmax, gmaxp, ktyp, katm, katm2 1 0 : num_space_group, type Cartesian 7.914328000000 4.569339400000 0.000000000000 0.000000000000 9.138678810000 0.000000000000 0.000000000000 0.000000000000 38.772130530000 06 06 01 1 1 1 : K_mesh 1 0 : ncord,ninv : iwei,imdtyp,ityp -0.000000528145 -0.000042365186 3.767311679169 1 1 2 0.000000053537 0.000002980474 5.986347591545 1 1 3 0.000001949062 -0.000004500424 0.304140905344 1 1 1 2.638113295845 4.569319798127 -0.057416250996 1 1 1 5.276215081326 9.138653655057 -0.057417190317 1 1 1 0.000000331528 3.046226811762 -4.302993798176 1 0 1 2.638108391790 7.615566096905 -4.302992958162 1 0 1 5.276218871886 12.184904590329 -4.302994638057 1 0 1 0.000000000000 -3.046226270000 -8.616029010000 1 0 1 2.638109330000 1.523113130000 -8.616029010000 1 0 1 5.276218670000 6.092452540000 -8.616029010000 1 0 1 78.00 0.50 15.9994 1 1 0.0 : iatomn,alfa,amion,iloc,ivan,zeta1 6.00 0.15 15.9994 3 1 0.0 : iatomn,alfa,amion,iloc,ivan,zeta1 8.00 0.15 15.9994 3 1 0.0 : iatomn,alfa,amion,iloc,ivan,zeta1 0 0 0 0 0 : icond, inipos, inivel, ininos, iniacc 0 1 : ipre, ipri 1000 1000 0 60000.00 0 : nmd1,nmd2,last_iter,cpumax,ifstop 6 1 : way_mix mix_what 0 30 0.60 : iter_start, KBXMIX, MIX_ALPHA 0.20 0.30 0.20 0.20 0.20 : dtim1,dtim2,dtim3,dtim4,dtim 400.00 4 1 5.00D-12 : dtio ,imdalg, iexpl, edelta -0.0020 1.00D+03 0 : width,forccr,istress ggapbe 1 : xctype,kspin 1.00 : destm 101 : nbztyp 4 4 4 : dummy 4 4 4 : dummy 64 : keg 1 : nextst 0 : dummy 2 : imsd 0 : evaluate_eko_diff 0 : npdosao 0 0.0
Input file for CO and Pt(111) are the followings.
CO (CO/nfinp_scf):
1 0 0 0 0 0 : CO molecule 5.0000 15.0000 3 2 2 : gmax, gmaxp, ktyp, katm, katm2 1 0 : num_space_group, type Cartesian 7.914328000000 4.569339400000 0.000000000000 0.000000000000 9.138678810000 0.000000000000 0.000000000000 0.000000000000 38.772130530000 06 06 01 1 1 1 : K_mesh 1 0 : ncord,ninv : iwei,imdtyp,ityp -0.000000528145 -0.000042365186 3.767311679169 1 1 2 0.000000053537 0.000002980474 5.986347591545 1 1 3 78.00 0.50 15.9994 1 1 0.0 : iatomn,alfa,amion,iloc,ivan,zeta1 6.00 0.15 15.9994 3 1 0.0 : iatomn,alfa,amion,iloc,ivan,zeta1 8.00 0.15 15.9994 3 1 0.0 : iatomn,alfa,amion,iloc,ivan,zeta1 0 0 0 0 0 : icond, inipos, inivel, ininos, iniacc 0 1 : ipre, ipri 1000 1000 0 60000.00 0 : nmd1,nmd2,last_iter,cpumax,ifstop 6 1 : way_mix mix_what 0 30 0.60 : iter_start, KBXMIX, MIX_ALPHA 0.20 0.30 0.20 0.20 0.20 : dtim1,dtim2,dtim3,dtim4,dtim 400.00 4 1 5.00D-12 : dtio ,imdalg, iexpl, edelta -0.0020 1.00D+03 0 : width,forccr,istress ggapbe 1 : xctype,kspin 1.00 : destm 101 : nbztyp 4 4 4 : dummy 4 4 4 : dummy 8 : keg 1 : nextst 0 : dummy 2 : imsd 0 : evaluate_eko_diff 0 : npdosao 0 0.0
Pt (Pt/nfinp_scf):
1 0 0 0 0 0 : Pt(111)(sqrt(3)xsqrt(3)) surface 5.0000 15.0000 3 9 9 : gmax, gmaxp, ktyp, katm, katm2 1 0 : num_space_group, type Cartesian 7.914328000000 4.569339400000 0.000000000000 0.000000000000 9.138678810000 0.000000000000 0.000000000000 0.000000000000 38.772130530000 06 06 01 1 1 1 : K_mesh 1 0 : ncord,ninv : iwei,imdtyp,ityp 0.000001949062 -0.000004500424 0.304140905344 1 1 1 2.638113295845 4.569319798127 -0.057416250996 1 1 1 5.276215081326 9.138653655057 -0.057417190317 1 1 1 0.000000331528 3.046226811762 -4.302993798176 1 0 1 2.638108391790 7.615566096905 -4.302992958162 1 0 1 5.276218871886 12.184904590329 -4.302994638057 1 0 1 0.000000000000 -3.046226270000 -8.616029010000 1 0 1 2.638109330000 1.523113130000 -8.616029010000 1 0 1 5.276218670000 6.092452540000 -8.616029010000 1 0 1 78.00 0.50 15.9994 1 1 0.0 : iatomn,alfa,amion,iloc,ivan,zeta1 6.00 0.15 15.9994 3 1 0.0 : iatomn,alfa,amion,iloc,ivan,zeta1 8.00 0.15 15.9994 3 1 0.0 : iatomn,alfa,amion,iloc,ivan,zeta1 0 0 0 0 0 : icond, inipos, inivel, ininos, iniacc 0 1 : ipre, ipri 1000 1000 0 60000.00 0 : nmd1,nmd2,last_iter,cpumax,ifstop 6 1 : way_mix mix_what 0 30 0.60 : iter_start, KBXMIX, MIX_ALPHA 0.20 0.30 0.20 0.20 0.20 : dtim1,dtim2,dtim3,dtim4,dtim 400.00 4 1 5.00D-12 : dtio ,imdalg, iexpl, edelta -0.0020 1.00D+03 0 : width,forccr,istress ggapbe 1 : xctype,kspin 1.00 : destm 101 : nbztyp 4 4 4 : dummy 4 4 4 : dummy 56 : keg 1 : nextst 0 : dummy 2 : imsd 0 : evaluate_eko_diff 0 : npdosao 0 0.0
In each subdirectories, perform SCF calculations to get CO/zaj.data, Pt/zaj.data, and Total/zaj.data. Then in the Total/directory, create symbolic links to subsytem wave functions as
ln -s ../CO/zaj.data zak1.data
ln -s ../Pt/zaj.data zak3.data
Then create a file called nfcoop.data, which looks like
1 : KSPIN 20 : KNV3 8 8 2 14 : NPDOSMO1 KPDOSMO1 KATM1 KLMTA1 0 0 0 0 : NPDOSMO2 KPDOSMO2 KATM2 KLMTA2 56 56 9 180 : NPDOSMO3 KPDOSMO3 KATM3 KLMTA3 -15.0 5.0 0.1 2001 : EMIN EMAX EDELTA NPDOSE
Description of the variables:
KLMTA* can be found in the STATE output files. Use grep to extract the parameter.
Having prepared zak1.data, zak3.data, and nfcoop.data, execute STATE by setting ICOND=17 (see Total/nfinp_coop) to get coop_bij.data and coop_sij.data.
Further, use state2eg.pl (or state2eigen.pl) to extract the eigenvalues for the density of states calculation, for e.g.
state2eg.pl nfout_scf > eko.data
in the directory Total/. The eigevalue file should be always "eko.data" for the COOP program.
Finally, we use the program "coop_analysis" in the directory Total/ as
coop_analysis > coop.out
We get the densities of states projected onto the molecular orbitals (PDOS), gross population (GPOP), and COOP in the file "coop.out." PDOS can be extracted by executing
grep PDOS\: coop.out | awk -F\: '{print $2}' > pdos.dat
for GPOP and COOP
grep GPOP\: coop.out | awk -F\: '{print $2}' > gpop.dat
grep COOP\: coop.out | awk -F\: '{print $2}' > coop.dat
The format for PDOS, GPOP, and COOP is as follows
[Energy wrt Fermi level] [PDOS(MO#1)] [PDOS(MO#2)] [PDOS(MO#3)] ...
Note that one always has to use the reciprocal space formulation for the nonlocal pseudopotential (NEXTST=1) for the COOP analysis, as only the reciprocal space formulation is implemented in the overlap calculation.