Part 2: Static approaches


Note: The machine-learned force fields (MLFF) used in this tutorial can be downloaded from here. The mlff directory should be placed in the transition_states directory.


5 Vibrational analysis

By the end of this tutorial, you will be able to:

  • perform a vibrational analysis on a trial transition state (TS)
  • find a trial unstable direction for TS relaxation

5.1 Task

Perform vibrational analysis on a trial transition state for the carbonylation of methylated acidic chabazite during ethanol synthesis from syngas

In part 1, the nudged elastic band (NEB), improved dimer method (IDM), and intrinsic reaction coordinate (IRC) have been covered for separate reactions. A real system, such as a zeolite-catalyzed reaction [Nat. Rev. Mater. 6, 1156 (2021)], is studied by using a combination of these methods. A model reaction is that of the conversion of syngas (CO and H2) to ethanol (CH3CH2OH), catalyzed by chabazite. Chabazite is a type of zeolite Z:

No description has been provided for this image

The structure of the zeolite chabazite, with O atoms in red, Si in blue, and Al in cyan. Zeolites have cavities that create a large internal surface for reactions to occur on.

The conversion of syngas to ethanol CH3CH2OH proceeds via six elementary steps:

  1. CO + 2H2 → CH3OH
  2. CH3OH + H-Z → H2O + CH3-Z
  3. CO + CH3-Z → CH3CO+ + Z-
  4. CH3CO+ + Z- → CH3CO-Z
  5. CH3OH + CH3CO-Z → CH3COOCH3 + H-Z
  6. CH3COOCH3 + 2H2CH3CH2OH + CH3OH

The rate-determining step (RDS) for this reaction is step 3, the carbonylation of the methylated chabazite CH3-Z [PCCP 13, 2603 (2011)]. During the RDS, a free acetyl cation CH3-C=O+ is created as a product. Depending on the thermodynamic conditions, the acetyl cation attaches to the zeolite framework and forms CH3-C=O-Z, or transforms into a free CH2-C=O+ cation via protonation of the zeolite [J. Catalysis 396, 166 (2021)]. We shall focus on calculating the free energy of activation $\Delta A_{R\rightarrow P}^{\ddagger}$ for the forward RDS, meaning that the state of the product after the carbonylation is not relevant. Note that $\ddagger$ denotes the TS.

In the first exercise, an initial guess for the transition state of the carbonylation step has been made based on the geometry of the reactant and the expected product. The planar methyl CH3 group is assumed to lie halfway between the O on the zeolite and the C in the CO molecule. Both distances have been arbitrarily chosen and set at 2.1 Å. If the initial guess is close to a saddle point, then it will have only one imaginary frequency. If there are multiple imaginary frequencies, then the strongest imaginary frequency can be chosen as a trial direction for IDM.

5.2 Input

The input files to run this example are prepared at $TUTORIALS/transition_states/e05_Static_Vib_analysis.

POSCAR


Click here to see the POSCAR!
Trial TS structure
1.0
   7.948754845851   -0.000049967724   4.901433149086
   -3.974564067268   6.883894310696   4.901254785119
   -3.974438768620   -6.883777142027   4.901245706606
Al C H O Si
1 2 3 25 11
Direct
   0.62848612   0.39020196   0.33941230
   0.36288164   0.94589396   0.59231366
   0.42758700   0.08606810   0.44090475
   0.38521995   0.16746240   0.50939566
   0.35387699   0.01396078   0.36712590
   0.53394788   0.05555254   0.46943474
   0.23383670   0.75907096   0.99926471
   0.17582313   0.47557306   0.95376242
   0.25143428   0.62492408   0.73841260
   0.51763691   0.75477069   0.73236766
   0.02106794   0.34175363   0.14047271
   0.35804237   0.65514737   0.49107130
   0.24853205   0.51747545   0.24123557
   0.40287652   0.76921155   0.25065278
   0.46403989   0.47054569   0.66761133
   0.75864353   0.75765792   0.91311194
   0.32386156   0.85942886   0.68905833
   0.58499859   0.24499254   0.74979789
   0.51845405   0.83441880   0.01369959
   0.27664375   0.26778763   0.08842135
   0.74293017   0.50117935   0.76502281
   0.53321230   0.53566626   0.30950861
   0.79243426   0.25040725   0.96486076
   0.66218192   0.35287152   0.51459701
   0.48986783   0.22401662   0.28665802
   0.65940134   0.00054233   0.84406385
   0.99725337   0.65154960   0.83499460
   0.33973023   0.00395889   0.13856936
   0.51860538   0.17877751   0.00498267
   0.76337083   0.36476411   0.23182904
   0.85543558   0.53458809   0.03798978
   0.16449753   0.62721478   0.88098785
   0.39854648   0.62563842   0.65745894
   0.61309740   0.83529930   0.87512616
   0.37427231   0.83711848   0.09872232
   0.38977842   0.61630578   0.32395651
   0.18006949   0.40397070   0.10694487
   0.61556880   0.39365097   0.67253106
   0.83798928   0.61036800   0.88777481
   0.64096697   0.16866303   0.89047296
   0.40196983   0.16620429   0.11945109
   0.85497734   0.37373749   0.09656525

INCAR


! Vibrational analysis
IBRION = 5          ! Finite differences
NFREE = 2           ! Number of displacements
POTIM = 0.01        ! Width of displacement
NSW=1               ! Number of ionic steps

! Machine learning
ML_LMLFF = T        ! Enables the use of MLFF
ML_MODE = run       ! Prediction-only mode

KPOINTS


K-Points
 0
Gamma
 1  1  1
 0  0  0

POTCAR


Pseudopotentials of Al, C, H, O, and Si.


Check the tags set in the INCAR file!

The first four tags are for calculating the vibrational frequencies. IBRION = 5 sets up a finite differences calculation, with a displacement of POTIM and NFREE number of displacements. NSW usually sets the number of ionic steps; for IBRION = 5, it just has to be positive which is then reset by VASP to three times the number of ions in the cell.

The remaining two tags turn on the machine learning force field (MLFF). Notice that there are no additional tags for the electronic structure, as we are using MLFF. ML_LMLFF enables the use of MLFF, while ML_MODE = run sets the ML to run only, as opposed to additional training.

The KPOINTS are set to the Γ-point. POTCAR defines the pseudopotentials used. The POSCAR file defines the transition state inside the chabazite.

The settings used in this tutorial are sufficient to run quickly within the allotted time. To obtain higher-quality results, calculations may be run without an MLFF. However, this will increase the time significantly.

5.3 Calculation

Open a terminal, navigate to this example's directory, and create a symbolic link to the machine-learned force field (MLFF). Set up the directory to calculate the vibrational (phonon) frequencies of the trial transition state structure and run the calculation with the following:

cd $TUTORIALS/transition_states/e05_*
ln -s $TUTORIALS/transition_states/mlff/MLFF_e05-12/ML_FFN ML_FF
mpirun -np 4 vasp_gam

The calculation runs quickly, within a few seconds. If this were done ab initio, it would take several hours.

Let's take a look at the vibrational modes. vibFreq.py extracts the vibrational frequencies and prepares files to visualize them. Run it using the following:

cd $TUTORIALS/transition_states/e05_*
python3 ../scripts/vibFreq/vibFreq.py 0.0 0.2 0.0 > freq.dat

There are 126 different frequency modes calculated. Run the following to look at the first eight:

grep cm-1 $TUTORIALS/transition_states/e05_*/freq.dat | head -n 8
In [2]:
%%bash
grep cm-1 e05_*/freq.dat | head -n 8
1 f/i = 	 504.22896034835185 cm-1 	 94.97918045055742 2PiTHz 	 15.116406059523326 THz 	 62.516531957339026 meV
2 f/i = 	 184.2755887458046 cm-1 	 34.71110501869787 2PiTHz 	 5.524443943907663 THz 	 22.847300807208022 meV
3 f/i = 	 158.8821118405696 cm-1 	 29.927858091383094 2PiTHz 	 4.763166551396396 THz 	 19.698905464430943 meV
4 f/i = 	 33.65015419407238 cm-1 	 6.338517456791549 2PiTHz 	 1.008806385122644 THz 	 4.17209463452824 meV
5 f = 	 3.324424412950496e-06 cm-1 	 6.262058133148949e-07 2PiTHz 	 9.966375058194614e-08 THz 	 4.12176811320784e-07 meV
6 f = 	 4.502854171719616e-06 cm-1 	 8.481809506198084e-07 2PiTHz 	 1.349921909275253e-07 THz 	 5.582837339034783e-07 meV
7 f = 	 1.1118678865864833e-05 cm-1 	 2.0943719806240344e-06 2PiTHz 	 3.3332965338947834e-07 THz 	 1.3785428789354165e-06 meV
8 f = 	 42.749775261818826 cm-1 	 8.052569245542617 2PiTHz 	 1.2816062000178818 THz 	 5.300305816385847 meV

Alternatively, you can obtain similar results with py4vasp

In [3]:
from py4vasp import Calculation
calculation = Calculation.from_path("e05_Static_Vib_analysis")
calculation.phonon.mode.print()
 Eigenvalues of the dynamical matrix
 -----------------------------------
   1 f  =   65.048011 THz   408.708709 2PiTHz 2169.785895 cm-1   269.016948 meV
   2 f  =   63.938798 THz   401.739315 2PiTHz 2132.786209 cm-1   264.429609 meV
   3 f  =   55.241439 THz   347.092199 2PiTHz 1842.671175 cm-1   228.460225 meV
   4 f  =   36.267893 THz   227.877892 2PiTHz 1209.776607 cm-1   149.991947 meV
   5 f  =   35.935607 THz   225.790080 2PiTHz 1198.692665 cm-1   148.617724 meV
   6 f  =   35.535153 THz   223.273949 2PiTHz 1185.334823 cm-1   146.961577 meV
   7 f  =   35.262697 THz   221.562060 2PiTHz 1176.246606 cm-1   145.834791 meV
   8 f  =   34.949572 THz   219.594640 2PiTHz 1165.801807 cm-1   144.539811 meV
   9 f  =   34.898497 THz   219.273724 2PiTHz 1164.098105 cm-1   144.328581 meV
  10 f  =   34.723875 THz   218.176538 2PiTHz 1158.273275 cm-1   143.606400 meV
  11 f  =   34.303481 THz   215.535129 2PiTHz 1144.250348 cm-1   141.867793 meV
  12 f  =   34.185082 THz   214.791205 2PiTHz 1140.300944 cm-1   141.378133 meV
  13 f  =   34.002095 THz   213.641461 2PiTHz 1134.197088 cm-1   140.621358 meV
  14 f  =   33.570362 THz   210.928804 2PiTHz 1119.795919 cm-1   138.835855 meV
  15 f  =   32.779650 THz   205.960614 2PiTHz 1093.420385 cm-1   135.565733 meV
  16 f  =   32.493136 THz   204.160395 2PiTHz 1083.863239 cm-1   134.380807 meV
  17 f  =   32.298406 THz   202.936871 2PiTHz 1077.367697 cm-1   133.575469 meV
  18 f  =   32.285705 THz   202.857069 2PiTHz 1076.944036 cm-1   133.522942 meV
  19 f  =   32.035859 THz   201.287239 2PiTHz 1068.609995 cm-1   132.489662 meV
  20 f  =   31.838575 THz   200.047665 2PiTHz 1062.029247 cm-1   131.673760 meV
  21 f  =   31.591325 THz   198.494146 2PiTHz 1053.781798 cm-1   130.651215 meV
  22 f  =   31.425290 THz   197.450923 2PiTHz 1048.243450 cm-1   129.964553 meV
  23 f  =   31.195703 THz   196.008384 2PiTHz 1040.585180 cm-1   129.015056 meV
  24 f  =   31.166945 THz   195.827692 2PiTHz 1039.625909 cm-1   128.896123 meV
  25 f  =   30.959740 THz   194.525781 2PiTHz 1032.714221 cm-1   128.039189 meV
  26 f  =   30.757074 THz   193.252393 2PiTHz 1025.953954 cm-1   127.201030 meV
  27 f  =   24.752108 THz   155.522084 2PiTHz  825.648233 cm-1   102.366491 meV
  28 f  =   24.365433 THz   153.092531 2PiTHz  812.750027 cm-1   100.767330 meV
  29 f  =   24.316188 THz   152.783117 2PiTHz  811.107387 cm-1   100.563670 meV
  30 f  =   24.135311 THz   151.646629 2PiTHz  805.073908 cm-1    99.815620 meV
  31 f  =   23.680726 THz   148.790389 2PiTHz  789.910465 cm-1    97.935609 meV
  32 f  =   23.534777 THz   147.873363 2PiTHz  785.042088 cm-1    97.332012 meV
  33 f  =   23.335364 THz   146.620418 2PiTHz  778.390351 cm-1    96.507308 meV
  34 f  =   23.304028 THz   146.423523 2PiTHz  777.345060 cm-1    96.377710 meV
  35 f  =   23.061943 THz   144.902464 2PiTHz  769.269935 cm-1    95.376530 meV
  36 f  =   22.846352 THz   143.547860 2PiTHz  762.078506 cm-1    94.484914 meV
  37 f  =   22.824496 THz   143.410538 2PiTHz  761.349478 cm-1    94.394527 meV
  38 f  =   22.752765 THz   142.959839 2PiTHz  758.956772 cm-1    94.097871 meV
  39 f  =   22.649513 THz   142.311086 2PiTHz  755.512616 cm-1    93.670854 meV
  40 f  =   22.596074 THz   141.975322 2PiTHz  753.730088 cm-1    93.449851 meV
  41 f  =   22.426920 THz   140.912494 2PiTHz  748.087663 cm-1    92.750285 meV
  42 f  =   22.198804 THz   139.479197 2PiTHz  740.478456 cm-1    91.806871 meV
  43 f  =   21.749381 THz   136.655393 2PiTHz  725.487219 cm-1    89.948210 meV
  44 f  =   19.999796 THz   125.662422 2PiTHz  667.126843 cm-1    82.712505 meV
  45 f  =   19.854018 THz   124.746473 2PiTHz  662.264181 cm-1    82.109617 meV
  46 f  =   19.469466 THz   122.330260 2PiTHz  649.436789 cm-1    80.519236 meV
  47 f  =   18.485996 THz   116.150936 2PiTHz  616.631495 cm-1    76.451931 meV
  48 f  =   18.052348 THz   113.426247 2PiTHz  602.166447 cm-1    74.658509 meV
  49 f  =   17.842435 THz   112.107325 2PiTHz  595.164448 cm-1    73.790379 meV
  50 f  =   17.314277 THz   108.788812 2PiTHz  577.546853 cm-1    71.606093 meV
  51 f  =   16.921349 THz   106.319972 2PiTHz  564.440080 cm-1    69.981074 meV
  52 f  =   16.492919 THz   103.628064 2PiTHz  550.149060 cm-1    68.209228 meV
  53 f  =   16.004743 THz   100.560763 2PiTHz  533.865125 cm-1    66.190294 meV
  54 f  =   15.598402 THz    98.007650 2PiTHz  520.310951 cm-1    64.509804 meV
  55 f  =   15.414380 THz    96.851405 2PiTHz  514.172580 cm-1    63.748750 meV
  56 f  =   14.579176 THz    91.603662 2PiTHz  486.312940 cm-1    60.294623 meV
  57 f  =   14.109093 THz    88.650047 2PiTHz  470.632551 cm-1    58.350519 meV
  58 f  =   14.008708 THz    88.019306 2PiTHz  467.284022 cm-1    57.935357 meV
  59 f  =   13.787873 THz    86.631759 2PiTHz  459.917699 cm-1    57.022057 meV
  60 f  =   13.698513 THz    86.070295 2PiTHz  456.936950 cm-1    56.652495 meV
  61 f  =   13.615646 THz    85.549624 2PiTHz  454.172774 cm-1    56.309783 meV
  62 f  =   13.529235 THz    85.006689 2PiTHz  451.290392 cm-1    55.952416 meV
  63 f  =   13.432158 THz    84.396735 2PiTHz  448.052222 cm-1    55.550938 meV
  64 f  =   13.050982 THz    82.001735 2PiTHz  435.337454 cm-1    53.974520 meV
  65 f  =   12.844691 THz    80.705573 2PiTHz  428.456283 cm-1    53.121371 meV
  66 f  =   12.581523 THz    79.052042 2PiTHz  419.677884 cm-1    52.032997 meV
  67 f  =   12.533078 THz    78.747653 2PiTHz  418.061917 cm-1    51.832644 meV
  68 f  =   12.220936 THz    76.786405 2PiTHz  407.649888 cm-1    50.541728 meV
  69 f  =   11.978126 THz    75.260786 2PiTHz  399.550555 cm-1    49.537547 meV
  70 f  =   11.941441 THz    75.030290 2PiTHz  398.326879 cm-1    49.385832 meV
  71 f  =   11.752849 THz    73.845328 2PiTHz  392.036060 cm-1    48.605876 meV
  72 f  =   11.651365 THz    73.207685 2PiTHz  388.650888 cm-1    48.186172 meV
  73 f  =   11.518226 THz    72.371148 2PiTHz  384.209811 cm-1    47.635553 meV
  74 f  =   11.276310 THz    70.851142 2PiTHz  376.140282 cm-1    46.635067 meV
  75 f  =   11.143762 THz    70.018319 2PiTHz  371.718921 cm-1    46.086893 meV
  76 f  =   11.010198 THz    69.179115 2PiTHz  367.263687 cm-1    45.534518 meV
  77 f  =   10.919595 THz    68.609836 2PiTHz  364.241455 cm-1    45.159813 meV
  78 f  =   10.309281 THz    64.775120 2PiTHz  343.883402 cm-1    42.635756 meV
  79 f  =    9.969698 THz    62.641461 2PiTHz  332.556061 cm-1    41.231357 meV
  80 f  =    9.723318 THz    61.093410 2PiTHz  324.337644 cm-1    40.212411 meV
  81 f  =    9.636293 THz    60.546614 2PiTHz  321.434770 cm-1    39.852504 meV
  82 f  =    9.510703 THz    59.757509 2PiTHz  317.245506 cm-1    39.333105 meV
  83 f  =    9.273015 THz    58.264073 2PiTHz  309.317028 cm-1    38.350108 meV
  84 f  =    9.138925 THz    57.421560 2PiTHz  304.844227 cm-1    37.795556 meV
  85 f  =    8.967516 THz    56.344563 2PiTHz  299.126578 cm-1    37.086663 meV
  86 f  =    8.877467 THz    55.778772 2PiTHz  296.122862 cm-1    36.714253 meV
  87 f  =    8.816703 THz    55.396981 2PiTHz  294.095981 cm-1    36.462954 meV
  88 f  =    8.634057 THz    54.249381 2PiTHz  288.003507 cm-1    35.707590 meV
  89 f  =    8.542176 THz    53.672077 2PiTHz  284.938668 cm-1    35.327601 meV
  90 f  =    8.352374 THz    52.479513 2PiTHz  278.607487 cm-1    34.542641 meV
  91 f  =    8.242470 THz    51.788969 2PiTHz  274.941472 cm-1    34.088117 meV
  92 f  =    8.135993 THz    51.119950 2PiTHz  271.389732 cm-1    33.647761 meV
  93 f  =    7.859536 THz    49.382919 2PiTHz  262.168040 cm-1    32.504426 meV
  94 f  =    7.561498 THz    47.510292 2PiTHz  252.226487 cm-1    31.271841 meV
  95 f  =    7.306036 THz    45.905177 2PiTHz  243.705123 cm-1    30.215335 meV
  96 f  =    6.835997 THz    42.951836 2PiTHz  228.026185 cm-1    28.271411 meV
  97 f  =    6.743861 THz    42.372928 2PiTHz  224.952834 cm-1    27.890367 meV
  98 f  =    6.573569 THz    41.302951 2PiTHz  219.272453 cm-1    27.186095 meV
  99 f  =    6.443726 THz    40.487122 2PiTHz  214.941311 cm-1    26.649106 meV
 100 f  =    6.056560 THz    38.054486 2PiTHz  202.026738 cm-1    25.047917 meV
 101 f  =    5.545597 THz    34.844012 2PiTHz  184.982711 cm-1    22.934744 meV
 102 f  =    5.297138 THz    33.282901 2PiTHz  176.694961 cm-1    21.907203 meV
 103 f  =    5.164164 THz    32.447398 2PiTHz  172.259376 cm-1    21.357265 meV
 104 f  =    5.002465 THz    31.431418 2PiTHz  166.865655 cm-1    20.688534 meV
 105 f  =    4.819914 THz    30.284414 2PiTHz  160.776348 cm-1    19.933562 meV
 106 f  =    4.612349 THz    28.980242 2PiTHz  153.852658 cm-1    19.075141 meV
 107 f  =    4.417087 THz    27.753378 2PiTHz  147.339383 cm-1    18.267605 meV
 108 f  =    4.317692 THz    27.128857 2PiTHz  144.023876 cm-1    17.856538 meV
 109 f  =    4.085471 THz    25.669774 2PiTHz  136.277777 cm-1    16.896152 meV
 110 f  =    3.989336 THz    25.065740 2PiTHz  133.071032 cm-1    16.498569 meV
 111 f  =    3.715618 THz    23.345916 2PiTHz  123.940692 cm-1    15.366561 meV
 112 f  =    3.476667 THz    21.844543 2PiTHz  115.970081 cm-1    14.378339 meV
 113 f  =    3.286137 THz    20.647405 2PiTHz  109.614616 cm-1    13.590368 meV
 114 f  =    2.770115 THz    17.405144 2PiTHz   92.401838 cm-1    11.456273 meV
 115 f  =    2.549458 THz    16.018716 2PiTHz   85.041458 cm-1    10.543710 meV
 116 f  =    1.992791 THz    12.521073 2PiTHz   66.472885 cm-1     8.241519 meV
 117 f  =    1.914108 THz    12.026693 2PiTHz   63.848284 cm-1     7.916113 meV
 118 f  =    1.717698 THz    10.792615 2PiTHz   57.296708 cm-1     7.103828 meV
 119 f  =    1.281511 THz     8.051968 2PiTHz   42.746942 cm-1     5.299902 meV
 120 f/i=    0.000765 THz     0.004809 2PiTHz    0.025530 cm-1     0.003165 meV
 121 f/i=    0.000818 THz     0.005141 2PiTHz    0.027293 cm-1     0.003384 meV
 122 f/i=    0.001051 THz     0.006603 2PiTHz    0.035052 cm-1     0.004346 meV
 123 f/i=    1.008676 THz     6.337698 2PiTHz   33.646082 cm-1     4.171548 meV
 124 f/i=    4.763014 THz    29.926902 2PiTHz  158.878362 cm-1    19.698244 meV
 125 f/i=    5.524211 THz    34.709640 2PiTHz  184.269350 cm-1    22.846299 meV
 126 f/i=   15.116368 THz    94.978939 2PiTHz  504.231882 cm-1    62.516270 meV

The f/i at the start of the first five modes indicates that these are imaginary frequencies, i.e. our structure is not a minimum. The structure has been chosen to approximate the expected transition state but still contains some imaginary frequency modes.

To visualize the vibrational modes with JMol or molden you can use py4vasp or the hesseModes_shifted.molden file generated by vibFreq.py.

In [4]:
from py4vasp import Calculation
calculation = Calculation.from_path("e05_Static_Vib_analysis")
with open("e05_Static_Vib_analysis/transition_state.molden", "w") as file:
    file.write(calculation.force_constant.to_molden())

In the next exercise, you will relax the transition state using the results from the frequency calculation, reducing the number of imaginary frequencies from five to one.

5.4 Questions

  1. Why are there imaginary frequencies?
  2. How many imaginary frequencies should there be in the transition state?

6 Optimizing transition state

By the end of this tutorial, you will be able to:

  • optimize a guess structure of the transition state
  • compare the new transition state's geometry to the initial guess

6.1 Task

Relax the transition state structure along the hardest imaginary frequency for carbonylation of methylated chabazite using the improved dimer method

The transition state is optimized by following the direction along the hardest imaginary frequency mode using the improved dimer method (IDM) [J. Chem. Phys. 111 (1999) 7010]. IDM is a local saddle-point search algorithm using forces, as opposed to the more computationally demanding Hessian. It has been described in detail in Example 2, so will only be briefly reviewed here. From the initial trial structure, two points, one point forward and the other backward, are defined along a dimer axis N. The dimer is then rotated on the potential energy surface (PES) about the midpoint to find the direction with the lowest curvature λ on the PES. After rotation, the forces f along the dimer axis are calculated, and the midpoint of the dimer is translated in the reverse direction toward the saddle point. Each IDM step takes approximately four ionic steps and is repeated iteratively until convergence is reached and the transition state is obtained.

You have already encountered this approach in an earlier exercise. In this exericse, you will optimize the transition state for the rate-determining step, the carbonylation of a methyl group in chabazite, using IDM.

6.2 Input

The input files to run this example are prepared at $TUTORIALS/transition_states/e06_Static_TS_Opt.

POSCAR.init


Click here to reveal the POSCAR file!
Trial TS structure
1.0
   7.948754845851   -0.000049967724   4.901433149086
   -3.974564067268   6.883894310696   4.901254785119
   -3.974438768620   -6.883777142027   4.901245706606
Al C H O Si
1 2 3 25 11
Direct
   0.62848612   0.39020196   0.33941230
   0.36288164   0.94589396   0.59231366
   0.42758700   0.08606810   0.44090475
   0.38521995   0.16746240   0.50939566
   0.35387699   0.01396078   0.36712590
   0.53394788   0.05555254   0.46943474
   0.23383670   0.75907096   0.99926471
   0.17582313   0.47557306   0.95376242
   0.25143428   0.62492408   0.73841260
   0.51763691   0.75477069   0.73236766
   0.02106794   0.34175363   0.14047271
   0.35804237   0.65514737   0.49107130
   0.24853205   0.51747545   0.24123557
   0.40287652   0.76921155   0.25065278
   0.46403989   0.47054569   0.66761133
   0.75864353   0.75765792   0.91311194
   0.32386156   0.85942886   0.68905833
   0.58499859   0.24499254   0.74979789
   0.51845405   0.83441880   0.01369959
   0.27664375   0.26778763   0.08842135
   0.74293017   0.50117935   0.76502281
   0.53321230   0.53566626   0.30950861
   0.79243426   0.25040725   0.96486076
   0.66218192   0.35287152   0.51459701
   0.48986783   0.22401662   0.28665802
   0.65940134   0.00054233   0.84406385
   0.99725337   0.65154960   0.83499460
   0.33973023   0.00395889   0.13856936
   0.51860538   0.17877751   0.00498267
   0.76337083   0.36476411   0.23182904
   0.85543558   0.53458809   0.03798978
   0.16449753   0.62721478   0.88098785
   0.39854648   0.62563842   0.65745894
   0.61309740   0.83529930   0.87512616
   0.37427231   0.83711848   0.09872232
   0.38977842   0.61630578   0.32395651
   0.18006949   0.40397070   0.10694487
   0.61556880   0.39365097   0.67253106
   0.83798928   0.61036800   0.88777481
   0.64096697   0.16866303   0.89047296
   0.40196983   0.16620429   0.11945109
   0.85497734   0.37373749   0.09656525
1 f  =  -11.656880025272354 eV/A^2
 -0.003479 -0.000154 -0.071385
 0.198313 0.189240 0.024508
 -0.230294 -0.821940 -0.116528
 -0.057661 -0.023041 0.015731
 0.007894 -0.001845 -0.087772
 0.033910 -0.040434 0.024005
 -0.001020 0.004827 0.005196
 -0.002863 0.005201 0.001563
 -0.014190 0.027443 0.015277
 -0.038084 0.044912 0.005268
 0.002526 0.005067 0.001345
 -0.033048 0.043260 0.032444
 -0.000214 -0.001082 0.000813
 -0.015209 0.002622 0.007661
 -0.011088 0.019041 0.009966
 -0.003106 0.003992 -0.007329
 0.104476 0.047465 -0.010943
 0.009181 0.009746 -0.022807
 -0.000116 -0.001618 0.002201
 -0.001211 0.013858 -0.041936
 -0.001139 -0.001120 0.001266
 -0.008478 0.015654 0.038834
 0.002254 0.004035 -0.000964
 -0.001452 0.009314 0.005405
 0.072678 0.329333 0.048268
 0.001941 0.014120 -0.013819
 -0.000743 0.001393 0.001505
 -0.011640 -0.010003 0.040838
 0.017790 0.024851 -0.061398
 0.010982 0.006181 0.034219
 0.002596 0.003796 0.001566
 -0.000052 0.003052 0.004344
 -0.019100 0.033341 0.014489
 -0.007872 0.006197 -0.001482
 -0.010095 0.011718 0.013034
 0.003427 -0.001429 0.003368
 0.014367 -0.005886 -0.002331
 -0.000096 0.012640 0.000489
 -0.000033 -0.000137 0.000440
 -0.006826 0.004068 -0.000523
 -0.000259 0.014785 0.081331
 -0.002964 -0.002463 0.003843

INCAR


! Vibrational analysis
NSW=5000            ! Number of ionic steps
EDIFFG = -0.005     ! Break condition for structure optimization
IBRION = 44         ! Improved dimer method

! Machine learning
ML_LMLFF = T        ! Enables the use of MLFF
ML_MODE = run       ! Prediction-only mode

KPOINTS


K-Points
 0
Gamma
 1  1  1
 0  0  0

POTCAR


Pseudopotentials of Al, C, H, O, and Si.


The KPOINTS and POTCAR files remain as in Example 5. The POSCAR.init file is identical to the POSCAR in Example 5, except for the addition of the forces from the strongest imaginary frequency, which is followed toward the transition state. The forces are taken from the hesseModes.dat file that was produced by vibFreq.py in the previous exercise.

Most of the INCAR tags are the same as in Example 5. The IDM calculation is defined using NSW where it now specifies the number of ionic steps in the structure relaxation and IBRION is set to 44, which means that the improved dimer method (IDM) is used. There is one new tag: EDIFFG, which defines the break condition for structure optimization; when negative, it means that the forces are used to achieve convergence, set in terms of eV Å$^{-1}$.

6.3 Calculation

Open a terminal and navigate to this example's directory. Prepare your own POSCAR file, using the vibrational mode for the hardest negative frequency that you calculated in Example 5. The initial forces associated with the hardest negative frequency are taken from hesseModes.dat generated by vibFreq.py in the previous exercise. These forces are then added to the end of the POSCAR file using the following script:

cd $TUTORIALS/transition_states/e06_*
ln -s $TUTORIALS/transition_states/mlff/MLFF_e05-12/ML_FFN ML_FF
cp ../e05_*/POSCAR .
head -43 ../e05_*/hesseModes.dat >> POSCAR
In [5]:
from py4vasp import Calculation
calculation = Calculation.from_path("e05_Static_Vib_analysis")
with open("e06_Static_TS_Opt/POSCAR", "w") as file:
    initial_forces = "\n".join(
        " ".join(f"{x:12.8f}" for x in displ)
        for displ in calculation.force_constant.eigenvectors()[0]
    )
    file.write(f"""\
{calculation.structure.to_POSCAR()})
initial forces
{initial_forces}""")

Run the IDM calculation using the following:

mpirun -np 4 vasp_gam

During the transition state relaxation, the hardest imaginary mode is followed to the transition state. Let us take a look at how the maximum gradient of the PES changes during the relaxation. First, take the gradient from the OUTCAR file using the following:

cd $TUTORIALS/transition_states/e06_*
grep grad OUTCAR | awk '{print $4}' > grad

In most structure relaxations, it is the forces, i.e. the gradient, that is minimized to achieve convergence. It is easier to see how the gradient changes by plotting it:

In [6]:
import numpy as np
import py4vasp

grad = np.loadtxt("./e06_Static_TS_Opt/grad")
step = np.arange(len(grad))

py4vasp.plot(step, grad, xlabel="Ionic step", ylabel="Max. gradient in eV/Å", label="Gradient")

The gradient rapidly decreases in the first 100 steps. It oscillates as it converges, with little change after 200 ionic steps. As the calcualtion goes on for 800 steps, this raises the question as to why. Using the following, you can find how the curvature λ of the PES changes. The curvature is only calculated every four steps, after which the gradient changes significantly. At the TS, the curvature should be minimised. First, find the curvature in the OUTCAR file using the following:

cd $TUTORIALS/transition_states/e06_*
grep -A 10 curvature OUTCAR > out
grep curvature out | awk '{print $6}' > curv
grep Ionic out | awk '{print $4}' > steps

Then plot the curvature with the following script:

In [7]:
import numpy as np
import py4vasp

grad = np.loadtxt("./e06_Static_TS_Opt/grad")
step = np.arange(len(grad))
curv = np.loadtxt("./e06_Static_TS_Opt/curv")
step2 = np.loadtxt("./e06_Static_TS_Opt/steps")

py4vasp.plot(step, grad, y2=True, y2label="Max. gradient in eV Å<sup>-1</sup>", label="Gradient")\
+ py4vasp.plot(step2, curv, xlabel="Ionic step", ylabel="Curvature of PES in eV Å<sup>-2</sup>", label="Curvature") 

In contrast to the gradient, the curvature increases in the first few updates. The oscillation of the curvature coincides with the oscillation of the gradient. However, while the gradient rapidly decreases, the curvature takes many more steps. The large number of steps required to converge the curvature explains why the calculation continues to ~600 steps, even though the forces rapidly converge within 200 steps. The curvature is the limiting factor. Eventually, the curvature plateaus and the calculation converges.

Congratulations! You have converged the transition state. Take a look at the converged transition state structure using py4vasp, and then compare to the initial guess:

In [8]:
import py4vasp

mycalc = py4vasp.Calculation.from_path("./e05_Static_Vib_analysis/")

mycalc.structure.plot(supercell=(2,2,1))
In [9]:
import py4vasp

mycalc = py4vasp.Calculation.from_path("./e06_Static_TS_Opt/")

mycalc.structure.plot(supercell=(2,2,1))

By converging the transition state, you have confirmed that the initial guess was a reasonable one. Note that, using the Hessian, instead of performing IDM, would have required a frequency calculation at every step and vastly increased the calculation time. IDM, on the other hand, only requires a few single point calculations per step, making it far more efficient.

Visually, there is only a small difference between the initial and converged structures. Calculate the C-C and C-O distances to make the difference clearer:

In [10]:
from ase.io.vasp import read_vasp
from ase import geometry

def bond_length(POSCAR):
    cell = POSCAR.get_cell()
    c1 = (POSCAR.get_positions()[1])
    c2 = (POSCAR.get_positions()[2])
    o = (POSCAR.get_positions()[24])
    return(geometry.get_distances(c1, c2, cell=cell, pbc=True), geometry.get_distances(c2, o, cell=cell, pbc=True))

#P = read_vasp("./e05_Static_Vib_analysis/CONTCAR") # Read the structure to POSCAR
calc = py4vasp.Calculation.from_path("./e05_Static_Vib_analysis")
P = calc.structure.to_ase()
cc_P, co_P = bond_length(P)
print("The C-C bond length in the initial structure is: " + str("{:.2f}".format(cc_P[1][0][0])) + " Å")
print("The C-O bond length in the initial structure is: " + str("{:.2f}".format(co_P[1][0][0])) + " Å")

#C = read_vasp(loc + "/e06_Static_TS_Opt/CONTCAR") # Read the structure to POSCAR
calc = py4vasp.Calculation.from_path("./e06_Static_TS_Opt")
C = calc.structure.to_ase()
cc_C, co_C = bond_length(C)
print("The C-C bond length in the converged structure is: " + str("{:.2f}".format(cc_C[1][0][0])) + " Å")
print("The C-O bond length in the converged structure is: " + str("{:.2f}".format(co_C[1][0][0])) + " Å")
The C-C bond length in the initial structure is: 2.10 Å
The C-O bond length in the initial structure is: 2.10 Å
The C-C bond length in the converged structure is: 2.00 Å
The C-O bond length in the converged structure is: 1.99 Å

The bond lengths both contract from ~2.1 Å to ~2.0 Å. The contraction brings the reactants closer together in the transition state.

In the next exercise, you will check that your converged structure is a transition state, which should contain only one imaginary vibrational mode, by running a frequency calculation, as in Example 5.

6.4 Questions

  1. How many ionic steps does it take before the curvature is updated?
  2. What advantage does IDM have over recalculating the Hessian each time?

7 Saddle point

By the end of this tutorial, you will be able to:

  • check that the relaxed structure is a transition state
  • calculate an unstable trial direction for calculating an intrinsic reaction coordinate (IRC)
  • calculate the free energy of the transition state

7.1 Task

Perform vibrational analysis on a relaxed transition state for the carbonylation of methylated acidic chabazite to check for a first-order saddle point and calculate the free energy of the transition state at 440 K

A first-order saddle point should contain only one imaginary mode, excluding vanishing translational modes. The imaginary mode may then be used as an unstable trial direction for finding the intrinsic reaction coordinate (IRC). To this end, vibrational analysis must be performed. Additionally, the total energy, including the vibrational contribution, is then calculated, which is important for comparison to experiment. One important thermodynamic property will be calculated, the zero-point vibrational energy $E_{ZPV}$:

$$\tag{7.1} E_{ZPV} = \sum_{i}\frac{\hbar}{2}\nu_i $$

where $\nu_i$ is the frequency of vibrational mode $i$.

Other important vibrational properties are also calculated, including the vibrational enthalpy $H_{vib}$ at temperature $T$, and the vibrational free energy $A_{vib}$. Note that, here, the free energy is Helmholtz, not Gibbs, as a canonical (NVT) ensemble is used so the temperature is constant. The canonical ensemble also fixes the number of particles $N$ and the volume $V$, alongside the temperature $T$. These thermodynamic properties will be calculated and added to the total energy $E_{tot}$ to obtain the total Helmholtz free energy of the transition state $A_{tot}$, which is required later for calculating the rate constant.

In this task, the optimized structure from IDM in Example 6 will be tested to see if it is truly a transition state. This is done by performing vibrational analysis, as in Example 5. There should be only one imaginary mode, which will be used to calculate the intrinsic reaction coordinate (IRC) in the next exercise. Several thermodynamic properties, including the Helmholtz free energy will also be calculated.

7.2 Input

The input files to run this example are prepared at $TUTORIALS/transition_states/e07_Static_Saddle_point.

POSCAR.init


Click here to see the POSCAR file!
Trial TS structure
   1.00000000000000
     7.9487548458510000   -0.0000499677240000    4.9014331490860004
    -3.9745640672680000    6.8838943106960002    4.9012547851189998
    -3.9744387686199998   -6.8837771420270002    4.9012457066059998
  Al              C               H               O               Si
     1     2     3    25    11
Direct
  0.6207250673754521  0.3699890231127426  0.3368050128480131
  0.3518672888673914  0.0092222881033168  0.6127479085897781
  0.4287803573375186  0.1041848337269776  0.4472913878224521
  0.3728475189445214  0.1963560296615889  0.4842470059654446
  0.3742489080687871  0.0172358644669198  0.3715904391464536
  0.5405873763029050  0.1000472131776645  0.4890137942784961
  0.2393597916469515  0.7434406779337375  0.9997950787522755
  0.1771256833804921  0.4606038234744174  0.9514145657813884
  0.2554573625922323  0.6124761433147156  0.7381789652423850
  0.5186279850644584  0.7491539604912466  0.7299961558202187
  0.0187253486587985  0.3357869103147398  0.1404148732436977
  0.3555496783712448  0.6531039250594723  0.4900712904111116
  0.2454726650308809  0.5143872754641907  0.2388682553068515
  0.4078382092232326  0.7625878423429384  0.2511057532749806
  0.4674618342053629  0.4632347070226297  0.6576694642513465
  0.7651963406602207  0.7555455130890456  0.9072880305638334
  0.2818667830153339  0.9842650615926847  0.7032369301338822
  0.5839152254814785  0.2388916071603572  0.7463975085851604
  0.5238099343981981  0.8220041275022747  0.0127693448356100
  0.2739768288373348  0.2566915598560014  0.0966914094606334
  0.7425425164389633  0.4961346350681660  0.7673974125174176
  0.5289314853972662  0.5218894548799863  0.3146372581307010
  0.7907409470183825  0.2474051672494902  0.9621552251444515
  0.6739299377530010  0.3480019031201989  0.5147975285743343
  0.4933925128976741  0.2108488740121813  0.2854916803184149
  0.6561358360120118  0.9958149671152241  0.8423207084968691
  0.0015282256971498  0.6413780847725588  0.8343363134240118
  0.3407926216169423  0.9934575600094236  0.1284113709199748
  0.5138647351344992  0.1752869986704866  0.0007349453151985
  0.7596335668804375  0.3598422121023206  0.2295632966832555
  0.8564433162545910  0.5312341698323186  0.0385841279427200
  0.1680717732208178  0.6135308418499742  0.8808418438404609
  0.4007141979740237  0.6181451829996698  0.6544318079249416
  0.6161521377862831  0.8288877685613528  0.8732754990082748
  0.3786252380728058  0.8275249542157562  0.0966907180338860
  0.3893340994836090  0.6081040192621107  0.3231393064146926
  0.1797122314228319  0.3940255391973485  0.1081099497353717
  0.6206017430523201  0.3880399602702920  0.6692452820262623
  0.8413953207637753  0.6051396022864584  0.8873054337114012
  0.6387159188343304  0.1647709620108561  0.8906870003945679
  0.4063202519763102  0.1602970653458495  0.1262618622144166
  0.8530290947887168  0.3694224373307244  0.0965837819449348

INCAR


! Vibrational analysis
IBRION = 5          ! Finite differences
NFREE = 2           ! Number of displacements
POTIM = 0.01        ! Width of displacement
NSW=1               ! Number of ionic steps

! Machine learning
ML_LMLFF = T        ! Enables the use of MLFF
ML_MODE = run       ! Prediction-only mode

KPOINTS


K-Points
 0
Gamma
 1  1  1
 0  0  0

POTCAR


Pseudopotentials of Al, C, H, O, and Si.


The KPOINTS, POTCAR, and INCAR files remain as in Example 5. The POSCAR.init file is the relaxed transition state structure from Example 6.

7.3 Calculation

Open a terminal and navigate to this example's directory. Copy the transition state structure that you relaxed in Example 6.

cd $TUTORIALS/transition_states/e07_*
ln -s $TUTORIALS/transition_states/mlff/MLFF_e05-12/ML_FFN ML_FF
cp ../e06_*/CONTCAR POSCAR

The vibrational analysis is performed identically to Example 5. Run it using the following:

mpirun -np 4 vasp_gam

The following script extracts the frequencies from the output and then determines the Hessian and dynamical matrices. The Hessian and dynamical matrices' corresponding eigenvalues and eigenfunctions are written in several different formats. Process the frequencies using the following script:

cd $TUTORIALS/transition_states/e07_*
python3 ../scripts/vibFreq/vibFreq.py 0.0 0.2 0.0 > freq.dat

As in Example 5, take a look at the first eight and compare to Example 5:

echo "Frequencies before IDM:"
grep cm-1 ./e05*/freq.dat | head -n 8 
echo " "
echo "Frequencies after IDM:"
grep cm-1 ./e07*/freq.dat | head -n 8
In [11]:
%%bash
echo "Frequencies before IDM:"
grep cm-1 ./e05*/freq.dat | head -n 8 
echo " "
echo "Frequencies after IDM:"
grep cm-1 ./e07*/freq.dat | head -n 8
Frequencies before IDM:
1 f/i = 	 504.22896034835185 cm-1 	 94.97918045055742 2PiTHz 	 15.116406059523326 THz 	 62.516531957339026 meV
2 f/i = 	 184.2755887458046 cm-1 	 34.71110501869787 2PiTHz 	 5.524443943907663 THz 	 22.847300807208022 meV
3 f/i = 	 158.8821118405696 cm-1 	 29.927858091383094 2PiTHz 	 4.763166551396396 THz 	 19.698905464430943 meV
4 f/i = 	 33.65015419407238 cm-1 	 6.338517456791549 2PiTHz 	 1.008806385122644 THz 	 4.17209463452824 meV
5 f = 	 3.324424412950496e-06 cm-1 	 6.262058133148949e-07 2PiTHz 	 9.966375058194614e-08 THz 	 4.12176811320784e-07 meV
6 f = 	 4.502854171719616e-06 cm-1 	 8.481809506198084e-07 2PiTHz 	 1.349921909275253e-07 THz 	 5.582837339034783e-07 meV
7 f = 	 1.1118678865864833e-05 cm-1 	 2.0943719806240344e-06 2PiTHz 	 3.3332965338947834e-07 THz 	 1.3785428789354165e-06 meV
8 f = 	 42.749775261818826 cm-1 	 8.052569245542617 2PiTHz 	 1.2816062000178818 THz 	 5.300305816385847 meV
 
Frequencies after IDM:
1 f/i = 	 522.1344887925576 cm-1 	 98.35195859481534 2PiTHz 	 15.653200373134284 THz 	 64.73653840128047 meV
2 f/i = 	 9.242866796394181e-06 cm-1 	 1.7410342966589944e-06 2PiTHz 	 2.770942144058003e-07 THz 	 1.1459714195214084e-06 meV
3 f/i = 	 7.783323158258552e-06 cm-1 	 1.4661070919895605e-06 2PiTHz 	 2.3333819079222269e-07 THz 	 9.650107574570973e-07 meV
4 f/i = 	 3.912013509554915e-06 cm-1 	 7.368871410962565e-07 2PiTHz 	 1.1727923100632416e-07 THz 	 4.850287008875316e-07 meV
5 f = 	 49.885770017771065 cm-1 	 9.396742204492803 2PiTHz 	 1.4955379708052632 THz 	 6.185057941491249 meV
6 f = 	 56.706793384516985 cm-1 	 10.681585520037496 2PiTHz 	 1.7000271355727812 THz 	 7.030758523612369 meV
7 f = 	 60.05511856444464 cm-1 	 11.312293405700755 2PiTHz 	 1.800407413223127 THz 	 7.445898657510856 meV
8 f = 	 61.59211069356104 cm-1 	 11.60180920955617 2PiTHz 	 1.8464852845099395 THz 	 7.636461725311841 meV

If you look at the imaginary modes, there are now fewer. There were three imaginary modes above 100 cm-1 before the IDM and two additional smaller ones. After the IDM, there is only one imaginary mode above 100 cm-1 and a few below 10 cm-1. These final remaining modes are vanishing frequencies, due to translations. The translational modes should be removed manually before calculating vibrational thermodynamic properties. However, first let us take a look at the remaining vibrational modes. vibFreq.py also extracted the vibrational frequencies and prepared files to visualize them. One of these files is the hesseModes_shifted.molden. It contains the information to visualize the vibrational modes. Alternatively, look at the vibrational frequencies and prepare molden files using py4vasp:

In [12]:
from py4vasp import Calculation
calculation = Calculation.from_path("e07_Static_Saddle_point")
calculation.phonon.mode.print()
 Eigenvalues of the dynamical matrix
 -----------------------------------
   1 f  =   63.576686 THz   399.464097 2PiTHz 2120.707348 cm-1   262.932033 meV
   2 f  =   62.381808 THz   391.956459 2PiTHz 2080.850193 cm-1   257.990417 meV
   3 f  =   61.939699 THz   389.178606 2PiTHz 2066.102903 cm-1   256.162001 meV
   4 f  =   52.717577 THz   331.234303 2PiTHz 1758.483491 cm-1   218.022369 meV
   5 f  =   36.040999 THz   226.452272 2PiTHz 1202.208163 cm-1   149.053587 meV
   6 f  =   35.607146 THz   223.726298 2PiTHz 1187.736289 cm-1   147.259318 meV
   7 f  =   35.276347 THz   221.647827 2PiTHz 1176.701933 cm-1   145.891243 meV
   8 f  =   35.028250 THz   220.088986 2PiTHz 1168.426231 cm-1   144.865196 meV
   9 f  =   34.954198 THz   219.623706 2PiTHz 1165.956116 cm-1   144.558943 meV
  10 f  =   34.813941 THz   218.742443 2PiTHz 1161.277597 cm-1   143.978885 meV
  11 f  =   34.419118 THz   216.261697 2PiTHz 1148.107611 cm-1   142.346029 meV
  12 f  =   34.188802 THz   214.814580 2PiTHz 1140.425042 cm-1   141.393519 meV
  13 f  =   33.989351 THz   213.561393 2PiTHz 1133.772019 cm-1   140.568656 meV
  14 f  =   33.774278 THz   212.210046 2PiTHz 1126.597879 cm-1   139.679184 meV
  15 f  =   33.371457 THz   209.679047 2PiTHz 1113.161107 cm-1   138.013250 meV
  16 f  =   32.443883 THz   203.850926 2PiTHz 1082.220305 cm-1   134.177111 meV
  17 f  =   32.307312 THz   202.992831 2PiTHz 1077.664782 cm-1   133.612303 meV
  18 f  =   32.128021 THz   201.866309 2PiTHz 1071.684209 cm-1   132.870812 meV
  19 f  =   31.867249 THz   200.227830 2PiTHz 1062.985717 cm-1   131.792346 meV
  20 f  =   31.745179 THz   199.460843 2PiTHz 1058.913877 cm-1   131.287506 meV
  21 f  =   31.640096 THz   198.800587 2PiTHz 1055.408655 cm-1   130.852918 meV
  22 f  =   31.107115 THz   195.451769 2PiTHz 1037.630179 cm-1   128.648686 meV
  23 f  =   31.038554 THz   195.020985 2PiTHz 1035.343201 cm-1   128.365139 meV
  24 f  =   30.954886 THz   194.495287 2PiTHz 1032.552334 cm-1   128.019118 meV
  25 f  =   30.877778 THz   194.010803 2PiTHz 1029.980261 cm-1   127.700224 meV
  26 f  =   30.532712 THz   191.842686 2PiTHz 1018.469989 cm-1   126.273144 meV
  27 f  =   30.295774 THz   190.353962 2PiTHz 1010.566531 cm-1   125.293249 meV
  28 f  =   27.912089 THz   175.376827 2PiTHz  931.054700 cm-1   115.435119 meV
  29 f  =   25.003685 THz   157.102786 2PiTHz  834.039993 cm-1   103.406928 meV
  30 f  =   24.441756 THz   153.572085 2PiTHz  815.295921 cm-1   101.082978 meV
  31 f  =   24.180140 THz   151.928303 2PiTHz  806.569279 cm-1   100.001021 meV
  32 f  =   23.589410 THz   148.216634 2PiTHz  786.864471 cm-1    97.557957 meV
  33 f  =   23.414749 THz   147.119208 2PiTHz  781.038364 cm-1    96.835617 meV
  34 f  =   23.307362 THz   146.444477 2PiTHz  777.456299 cm-1    96.391501 meV
  35 f  =   23.205748 THz   145.806012 2PiTHz  774.066767 cm-1    95.971257 meV
  36 f  =   22.931872 THz   144.085203 2PiTHz  764.931193 cm-1    94.838599 meV
  37 f  =   22.763895 THz   143.029770 2PiTHz  759.328026 cm-1    94.143901 meV
  38 f  =   22.660280 THz   142.378741 2PiTHz  755.871791 cm-1    93.715386 meV
  39 f  =   22.576387 THz   141.851623 2PiTHz  753.073383 cm-1    93.368430 meV
  40 f  =   22.372269 THz   140.569112 2PiTHz  746.264684 cm-1    92.524266 meV
  41 f  =   22.170329 THz   139.300284 2PiTHz  739.528628 cm-1    91.689108 meV
  42 f  =   22.113567 THz   138.943640 2PiTHz  737.635250 cm-1    91.454361 meV
  43 f  =   21.867889 THz   137.399998 2PiTHz  729.440237 cm-1    90.438318 meV
  44 f  =   20.058670 THz   126.032344 2PiTHz  669.090713 cm-1    82.955992 meV
  45 f  =   19.932549 THz   125.239900 2PiTHz  664.883724 cm-1    82.434396 meV
  46 f  =   19.587221 THz   123.070137 2PiTHz  653.364711 cm-1    81.006232 meV
  47 f  =   19.332362 THz   121.468816 2PiTHz  644.863485 cm-1    79.952223 meV
  48 f  =   18.786392 THz   118.038385 2PiTHz  626.651739 cm-1    77.694273 meV
  49 f  =   18.423719 THz   115.759643 2PiTHz  614.554168 cm-1    76.194378 meV
  50 f  =   17.969831 THz   112.907775 2PiTHz  599.413941 cm-1    74.317244 meV
  51 f  =   17.746173 THz   111.502495 2PiTHz  591.953475 cm-1    73.392272 meV
  52 f  =   17.001531 THz   106.823768 2PiTHz  567.114673 cm-1    70.312679 meV
  53 f  =   16.753403 THz   105.264738 2PiTHz  558.837966 cm-1    69.286506 meV
  54 f  =   15.631004 THz    98.212494 2PiTHz  521.398443 cm-1    64.644635 meV
  55 f  =   15.460073 THz    97.138506 2PiTHz  515.696766 cm-1    63.937723 meV
  56 f  =   15.251398 THz    95.827363 2PiTHz  508.736063 cm-1    63.074713 meV
  57 f  =   13.931091 THz    87.531624 2PiTHz  464.694973 cm-1    57.614359 meV
  58 f  =   13.775656 THz    86.555001 2PiTHz  459.510199 cm-1    56.971534 meV
  59 f  =   13.616978 THz    85.557999 2PiTHz  454.217233 cm-1    56.315295 meV
  60 f  =   13.552810 THz    85.154819 2PiTHz  452.076797 cm-1    56.049917 meV
  61 f  =   13.245412 THz    83.223380 2PiTHz  441.823017 cm-1    54.778621 meV
  62 f  =   13.222495 THz    83.079388 2PiTHz  441.058581 cm-1    54.683844 meV
  63 f  =   12.861611 THz    80.811884 2PiTHz  429.020676 cm-1    53.191346 meV
  64 f  =   12.705187 THz    79.829047 2PiTHz  423.802912 cm-1    52.544431 meV
  65 f  =   12.525969 THz    78.702983 2PiTHz  417.824771 cm-1    51.803242 meV
  66 f  =   12.216281 THz    76.757156 2PiTHz  407.494607 cm-1    50.522476 meV
  67 f  =   11.989643 THz    75.333146 2PiTHz  399.934707 cm-1    49.585175 meV
  68 f  =   11.866161 THz    74.557288 2PiTHz  395.815767 cm-1    49.074496 meV
  69 f  =   11.746360 THz    73.804558 2PiTHz  391.819616 cm-1    48.579041 meV
  70 f  =   11.652330 THz    73.213748 2PiTHz  388.683075 cm-1    48.190162 meV
  71 f  =   11.522522 THz    72.398141 2PiTHz  384.353113 cm-1    47.653320 meV
  72 f  =   11.432168 THz    71.830429 2PiTHz  381.339197 cm-1    47.279645 meV
  73 f  =   11.246089 THz    70.661260 2PiTHz  375.132218 cm-1    46.510084 meV
  74 f  =   11.228706 THz    70.552043 2PiTHz  374.552398 cm-1    46.438196 meV
  75 f  =   10.669461 THz    67.038203 2PiTHz  355.897841 cm-1    44.125345 meV
  76 f  =   10.485859 THz    65.884596 2PiTHz  349.773478 cm-1    43.366027 meV
  77 f  =   10.108558 THz    63.513941 2PiTHz  337.187955 cm-1    41.805634 meV
  78 f  =    9.883051 THz    62.097040 2PiTHz  329.665797 cm-1    40.873013 meV
  79 f  =    9.785486 THz    61.484021 2PiTHz  326.411352 cm-1    40.469516 meV
  80 f  =    9.660753 THz    60.700303 2PiTHz  322.250683 cm-1    39.953663 meV
  81 f  =    9.472675 THz    59.518571 2PiTHz  315.977008 cm-1    39.175833 meV
  82 f  =    9.314532 THz    58.524930 2PiTHz  310.701890 cm-1    38.521807 meV
  83 f  =    9.266229 THz    58.221437 2PiTHz  309.090677 cm-1    38.322044 meV
  84 f  =    9.081891 THz    57.063201 2PiTHz  302.941744 cm-1    37.559680 meV
  85 f  =    8.793669 THz    55.252250 2PiTHz  293.327617 cm-1    36.367690 meV
  86 f  =    8.763283 THz    55.061328 2PiTHz  292.314038 cm-1    36.242023 meV
  87 f  =    8.668244 THz    54.464184 2PiTHz  289.143873 cm-1    35.848976 meV
  88 f  =    8.493774 THz    53.367954 2PiTHz  283.324118 cm-1    35.127424 meV
  89 f  =    8.477947 THz    53.268511 2PiTHz  282.796187 cm-1    35.061970 meV
  90 f  =    8.239742 THz    51.771827 2PiTHz  274.850467 cm-1    34.076834 meV
  91 f  =    7.978652 THz    50.131348 2PiTHz  266.141362 cm-1    32.997051 meV
  92 f  =    7.595182 THz    47.721939 2PiTHz  253.350092 cm-1    31.411149 meV
  93 f  =    7.373019 THz    46.326042 2PiTHz  245.939444 cm-1    30.492354 meV
  94 f  =    7.338355 THz    46.108247 2PiTHz  244.783197 cm-1    30.348998 meV
  95 f  =    6.877289 THz    43.211284 2PiTHz  229.403563 cm-1    28.442182 meV
  96 f  =    6.745142 THz    42.380978 2PiTHz  224.995567 cm-1    27.895665 meV
  97 f  =    6.707541 THz    42.144724 2PiTHz  223.741326 cm-1    27.740160 meV
  98 f  =    6.161428 THz    38.713397 2PiTHz  205.524815 cm-1    25.481619 meV
  99 f  =    5.960619 THz    37.451677 2PiTHz  198.826493 cm-1    24.651140 meV
 100 f  =    5.417797 THz    34.041021 2PiTHz  180.719728 cm-1    22.406206 meV
 101 f  =    5.200433 THz    32.675287 2PiTHz  173.469211 cm-1    21.507264 meV
 102 f  =    4.973187 THz    31.247458 2PiTHz  165.889035 cm-1    20.567449 meV
 103 f  =    4.927795 THz    30.962250 2PiTHz  164.374898 cm-1    20.379722 meV
 104 f  =    4.820861 THz    30.290365 2PiTHz  160.807943 cm-1    19.937480 meV
 105 f  =    4.655527 THz    29.251540 2PiTHz  155.292943 cm-1    19.253712 meV
 106 f  =    4.506865 THz    28.317466 2PiTHz  150.334055 cm-1    18.638894 meV
 107 f  =    4.297322 THz    27.000868 2PiTHz  143.344396 cm-1    17.772294 meV
 108 f  =    4.097225 THz    25.743623 2PiTHz  136.669829 cm-1    16.944760 meV
 109 f  =    3.831109 THz    24.071567 2PiTHz  127.793084 cm-1    15.844193 meV
 110 f  =    3.787356 THz    23.796663 2PiTHz  126.333650 cm-1    15.663247 meV
 111 f  =    3.562013 THz    22.380788 2PiTHz  118.816938 cm-1    14.731301 meV
 112 f  =    3.212137 THz    20.182451 2PiTHz  107.146228 cm-1    13.284330 meV
 113 f  =    3.077921 THz    19.339148 2PiTHz  102.669234 cm-1    12.729258 meV
 114 f  =    2.986962 THz    18.767635 2PiTHz   99.635142 cm-1    12.353081 meV
 115 f  =    2.688254 THz    16.890800 2PiTHz   89.671247 cm-1    11.117726 meV
 116 f  =    2.527737 THz    15.882237 2PiTHz   84.316906 cm-1    10.453878 meV
 117 f  =    2.434687 THz    15.297591 2PiTHz   81.213088 cm-1    10.069057 meV
 118 f  =    1.961701 THz    12.325733 2PiTHz   65.435848 cm-1     8.112944 meV
 119 f  =    1.846448 THz    11.601576 2PiTHz   61.591385 cm-1     7.636296 meV
 120 f  =    1.800346 THz    11.311909 2PiTHz   60.053578 cm-1     7.445633 meV
 121 f  =    1.700105 THz    10.682073 2PiTHz   56.709857 cm-1     7.031068 meV
 122 f  =    1.495655 THz     9.397478 2PiTHz   49.890095 cm-1     6.185532 meV
 123 f/i=    0.000859 THz     0.005400 2PiTHz    0.028668 cm-1     0.003554 meV
 124 f/i=    0.000917 THz     0.005760 2PiTHz    0.030581 cm-1     0.003792 meV
 125 f/i=    0.001004 THz     0.006309 2PiTHz    0.033493 cm-1     0.004153 meV
 126 f/i=   15.653175 THz    98.351802 2PiTHz  522.138012 cm-1    64.736329 meV

In [13]:
from py4vasp import Calculation
calculation = Calculation.from_path("e07_Static_Saddle_point")
with open("e07_Static_Saddle_point/transition_state.molden", "w") as file:
    file.write(calculation.force_constant.to_molden())

Visualize it in JMol or molden once downloaded. A recording of hesseModes_shift.molden.xyz is given below:

Click here to watch a video of the imaginary vibrational mode!

You can see that the vibrational mode is along the O-C-C axis.

Now let us consider the thermodynamics properties. The script vibpartition_eV.py removes the translational modes and calculates the harmonic vibrational contributions to the enthalpy, entropy, and free energy at 440 K (close to experiment):

cd $TUTORIALS/transition_states/e07_*
python3 ../scripts/thermo/vibpartition_eV.py 440. freq.dat > thermo.dat

Take a look at thermo.dat to see the calculated theromdynamic properties:

cat $TUTORIALS/transition_states/e07_*/thermo.dat
In [14]:
%%bash
cat ./e07_*/thermo.dat
freq.dat
nDOF: 126
nVIB: 122
4.9512429514590365e-29

T [K] ZPE [eV] Hvib-ZPE [eV] Hvib [eV] Svib [eV/K] Gvib [eV]
440.0 4.38693530959643 2.0005371051727625 6.387472414769192 0.008900615078934266 2.471201780038115

The file format of thermo.dat is as follows:

tag meaning
nDOF Degrees of freedom. This is three times the number of atoms
nVIB The number of vibrational modes, once the imaginary frequencies have been removed.
line beneath nVIB The vibrational partition function Q_vib is shown in scientific notation without being explicitly labeled.
T The temperature in K
ZPV The zero-point vibrational energy
Hvib - ZPV The thermal contribution to the vibrational energy, i.e. how the vibrational energy changes due to vibrational modes above the ground state being populated at temperature.
Hvib The vibrational enthalpy
Svib The vibrational entropy
Gvib The vibrational Helmholtz free energy

These thermodynamic contributions can also be calculated using the thermochemistry module in ASE:

In [15]:
from ase.thermochemistry import HarmonicThermo
from ase.units import invcm

def parse_frequencies_cm1(filepath):
    frequencies = []
    a = 0
    with open(filepath, 'r') as f:
        for line in f:
            a += 1
            if 'f =' in line:
                try:
                    parts = line.split()
                    cm1 = float(parts[3])  # 4th column: cm⁻¹
                    if cm1 > 10**(-3):  # skip imaginary and vanishing modes
                        frequencies.append(cm1)     
                except (ValueError, IndexError):
                    continue
    return frequencies, a

# Step 1: Read frequencies in cm⁻¹
freq_cm1, n = parse_frequencies_cm1("./e07_Static_Saddle_point/freq.dat")

# Step 2: Convert cm⁻¹ to eV
freq_eV = [f * invcm for f in freq_cm1]

# Step 3: Use ASE to compute vibrational free energy
thermo = HarmonicThermo(freq_eV)
T=440.0
F_vib = thermo.get_helmholtz_energy(temperature=T)
ZPE = thermo.get_ZPE_correction()
U = thermo.get_internal_energy(temperature=T)
S = thermo.get_entropy(temperature=T)

# Result
print("\nResults in 'thermo.dat' style:")
print("nDOF: " +str(n))
print("nDOF: " +str(len(freq_cm1)))
print("N/A\n")

print("T [K] ZPE [eV] Hvib-ZPE [eV] Hvib [eV] Svib [eV/K] Gvib [eV]")
print(str(T) + " " + str(ZPE) + " " + str(U-ZPE) + " " + str(U) + " " + str(S) + " " + str(F_vib))
Internal energy components at T = 440.00 K:
===============================
E_pot                  0.000 eV
E_ZPE                  4.387 eV
Cv_harm (0->T)         2.001 eV
-------------------------------
U                      6.387 eV
===============================

Entropy components at T = 440.00 K:
=================================================
                           S               T*S
S_harm             0.0089006 eV/K        3.916 eV
-------------------------------------------------
S                  0.0089006 eV/K        3.916 eV
=================================================

Free energy components at T = 440.00 K:
=======================
    U          6.387 eV
 -T*S         -3.916 eV
-----------------------
    F          2.471 eV
=======================
Internal energy components at T = 440.00 K:
===============================
E_pot                  0.000 eV
E_ZPE                  4.387 eV
Cv_harm (0->T)         2.001 eV
-------------------------------
U                      6.387 eV
===============================
Entropy components at T = 440.00 K:
=================================================
                           S               T*S
S_harm             0.0089006 eV/K        3.916 eV
-------------------------------------------------
S                  0.0089006 eV/K        3.916 eV
=================================================

Results in 'thermo.dat' style:
nDOF: 126
nDOF: 122
N/A

T [K] ZPE [eV] Hvib-ZPE [eV] Hvib [eV] Svib [eV/K] Gvib [eV]
440.0 4.3869373533793246 2.000539938919422 6.387477292298747 0.00890062858491266 2.4712007149371757

Gvib is the vibrational free energy. Combining the vibrational free energy with the total energy from the OUTCAR gives the Helmholtz free energy of the transition state $\Delta A_{R\rightarrow P}^{\ddagger}$, calculated using the following script:

In [16]:
import py4vasp

def thermo(path, state, data):
    i = 0
    A_vib = 0.0
    
    with open(path + data) as f:
        for line in f:
            pass
        A_vib = float(line.split()[5])

    calc = py4vasp.Calculation.from_path(path)
    E_tot = float(calc.energy.read()["free energy    TOTEN"])
    A_tot = E_tot + A_vib
    print("Total energy of " + str(state) +": " + str("{:.3f}".format(E_tot)) + " eV")
    print("Vibrational free energy of " + str(state) +": " + str("{:.3f}".format(A_vib)) + " eV")
    print("Helmholtz free energy of " + str(state) +": " + str("{:.3f}".format(A_tot)) + " eV")
    return(A_vib, E_tot, A_tot)

A_tot_TS =  thermo("./e07_Static_Saddle_point/", "TS", "thermo.dat") # TS
Total energy of TS: -319.263 eV
Vibrational free energy of TS: 2.471 eV
Helmholtz free energy of TS: -316.792 eV

Congratulations! You have successfully calculated the free energy for the transition state. Free energy in isolation is useful but is not measured in experiment. Instead, the free energy of the transition state is needed to calculate an energy difference, the free energy of activation, which can be measured experimentally.

7.4 Questions

  1. What type of mode are the remaining vanishing vibrational modes?
  2. How is the zero-point vibrational energy calculated?

8 Reaction pathway

By the end of this tutorial, you will be able to:

  • follow an unstable trial direction along the intrinsic reaction coordinate (IRC)
  • find and visualize the reactant and product states

8.1 Task

Follow the imaginary vibrational mode of the transition state during carbonylation step in chabazite as a trial vector toward the reactants and products to produce the intrinsic reaction coordinate

The transition state sits in-between the reactants and products. The saddle point contains only one imaginary frequency, a single unstable vibrational mode. The TS structure can be propagated along this unstable mode to generate the intrinsic reaction coordinate (IRC). Following the unstable vibrational mode forward leads to the product and backward to the reactant. This effectively checks if the transition state connects our expected reactant and product. A damped-velocity Verlet algorithm is used to propagate along the unstable mode [J. Chem. Phys. A 106, 165 (2002)]. More detail about IRC is given in Example 4.

In this exercise, you will produce the IRC for the carbonylation reaction in chabazite from Example 7. By checking that the reactants and products are what we expect, the transition state is found to link the acetyl cation & Z-, and CO & CH3-Z.

8.2 Input

The input files to run this example are prepared at $TUTORIALS/transition_states/e08_Static_Reaction_pathway.

POSCAR.init


Click here to reveal the POSCAR file!
Trial TS structure
   1.00000000000000
     7.9487548458510000   -0.0000499677240000    4.9014331490860004
    -3.9745640672680000    6.8838943106960002    4.9012547851189998
    -3.9744387686199998   -6.8837771420270002    4.9012457066059998
  Al              C               H               O               Si
     1     2     3    25    11
Direct
  0.6207250673754521  0.3699890231127426  0.3368050128480131
  0.3518672888673914  0.0092222881033168  0.6127479085897781
  0.4287803573375186  0.1041848337269776  0.4472913878224521
  0.3728475189445214  0.1963560296615889  0.4842470059654446
  0.3742489080687871  0.0172358644669198  0.3715904391464536
  0.5405873763029050  0.1000472131776645  0.4890137942784961
  0.2393597916469515  0.7434406779337375  0.9997950787522755
  0.1771256833804921  0.4606038234744174  0.9514145657813884
  0.2554573625922323  0.6124761433147156  0.7381789652423850
  0.5186279850644584  0.7491539604912466  0.7299961558202187
  0.0187253486587985  0.3357869103147398  0.1404148732436977
  0.3555496783712448  0.6531039250594723  0.4900712904111116
  0.2454726650308809  0.5143872754641907  0.2388682553068515
  0.4078382092232326  0.7625878423429384  0.2511057532749806
  0.4674618342053629  0.4632347070226297  0.6576694642513465
  0.7651963406602207  0.7555455130890456  0.9072880305638334
  0.2818667830153339  0.9842650615926847  0.7032369301338822
  0.5839152254814785  0.2388916071603572  0.7463975085851604
  0.5238099343981981  0.8220041275022747  0.0127693448356100
  0.2739768288373348  0.2566915598560014  0.0966914094606334
  0.7425425164389633  0.4961346350681660  0.7673974125174176
  0.5289314853972662  0.5218894548799863  0.3146372581307010
  0.7907409470183825  0.2474051672494902  0.9621552251444515
  0.6739299377530010  0.3480019031201989  0.5147975285743343
  0.4933925128976741  0.2108488740121813  0.2854916803184149
  0.6561358360120118  0.9958149671152241  0.8423207084968691
  0.0015282256971498  0.6413780847725588  0.8343363134240118
  0.3407926216169423  0.9934575600094236  0.1284113709199748
  0.5138647351344992  0.1752869986704866  0.0007349453151985
  0.7596335668804375  0.3598422121023206  0.2295632966832555
  0.8564433162545910  0.5312341698323186  0.0385841279427200
  0.1680717732208178  0.6135308418499742  0.8808418438404609
  0.4007141979740237  0.6181451829996698  0.6544318079249416
  0.6161521377862831  0.8288877685613528  0.8732754990082748
  0.3786252380728058  0.8275249542157562  0.0966907180338860
  0.3893340994836090  0.6081040192621107  0.3231393064146926
  0.1797122314228319  0.3940255391973485  0.1081099497353717
  0.6206017430523201  0.3880399602702920  0.6692452820262623
  0.8413953207637753  0.6051396022864584  0.8873054337114012
  0.6387159188343304  0.1647709620108561  0.8906870003945679
  0.4063202519763102  0.1602970653458495  0.1262618622144166
  0.8530290947887168  0.3694224373307244  0.0965837819449348

 -0.39544783E-03 -0.31588388E-02 -0.62676293E-01
  0.69700337E-01  0.31046523E+00  0.51024466E-01
 -0.32033798E+00 -0.79704463E+00 -0.30556313E-01
 -0.24372420E-02 -0.37441346E-02 -0.79073743E-02
 -0.14900716E-02 -0.16413596E-01 -0.28841066E-01
 -0.16790196E-01 -0.46140567E-01  0.13350218E-02
  0.98888602E-03  0.55323617E-02  0.29823640E-02
 -0.21022934E-02  0.37726453E-02 -0.71679080E-03
 -0.59507096E-02  0.13858925E-01  0.74783275E-02
 -0.76190413E-02  0.12542317E-01  0.99451166E-03
  0.20372207E-02  0.43807918E-02  0.96260335E-03
 -0.11590822E-01  0.12467761E-01  0.10392734E-01
 -0.83560198E-03 -0.75644598E-03 -0.54237396E-03
 -0.95769089E-02 -0.10495125E-02  0.12904105E-02
 -0.24540580E-02 -0.25671757E-02  0.10883893E-03
  0.14890613E-02  0.10163308E-02 -0.41785947E-03
  0.19613558E+00  0.16751863E+00  0.11594418E-01
  0.57738947E-02  0.40463377E-02 -0.21835018E-01
  0.11751591E-02 -0.16283564E-02 -0.11283298E-02
 -0.99130142E-04  0.15902318E-01 -0.42495500E-01
 -0.13635877E-02 -0.11271898E-02  0.67467050E-03
 -0.25995086E-02  0.13308049E-01  0.35478105E-01
  0.33858715E-02  0.49288244E-02 -0.18371861E-02
  0.43203675E-04  0.28468862E-03 -0.36608873E-02
  0.64540177E-01  0.24578122E+00  0.20915201E-01
  0.23777336E-02  0.90000794E-02 -0.12908098E-01
  0.76893028E-03  0.28983856E-02  0.15231467E-02
 -0.77832548E-02 -0.61445446E-02  0.22289668E-01
  0.14253429E-01  0.30174731E-01 -0.68771139E-01
  0.91471680E-02  0.55764505E-02  0.33381680E-01
  0.37034454E-02  0.32814988E-02  0.97077706E-03
 -0.52749231E-03 -0.14345845E-02  0.29907403E-02
  0.22117960E-02  0.74846929E-03 -0.62356316E-04
 -0.30623346E-03 -0.33004676E-02  0.28001697E-02
 -0.83263851E-02  0.78906662E-02  0.10928800E-01
  0.10125808E-01 -0.28894395E-02 -0.19362441E-02
  0.11978396E-01 -0.53758879E-02 -0.21288116E-02
  0.66990984E-02  0.83533895E-02  0.67978420E-03
  0.16413788E-02 -0.47433499E-03  0.10692095E-02
 -0.46741496E-02 -0.12486586E-02  0.27702860E-03
  0.21378568E-02  0.14270053E-01  0.63286845E-01
 -0.30542756E-02 -0.35017912E-02  0.29921201E-02

INCAR


! IRC calculation
NSW=5000            ! Number of ionic steps
IBRION = 40         ! IRC 
IRC_VNORM0 = 0.0005 ! constant velocity vector in IRC
IRC_DIRECTION = -1  ! negative initial direction of movement

! Machine learning
ML_LMLFF = T        ! Enables the use of MLFF
ML_MODE = run       ! Prediction-only mode

KPOINTS


K-Points
 0
Gamma
 1  1  1
 0  0  0

POTCAR


Pseudopotentials of Al, C, H, O, and Si.


The KPOINTS and POTCAR files remain as in Example 5. The POSCAR.init file is taken from an IDM relaxation, equivalent to Example 6. The INCAR file is similar to that used in Example 6, with the change to IBRION = 40, which sets the calculation to follow the energy profile along the IRC from the transition state using a damped-velocity Verlet algorithm.

There is one new tag: IRC_VNORM0, which defines the constant value that the velocity vector is rescaled to, thereby providing the damping. IRC_DIRECTION defines whether the unstable mode is followed forward to the product (IRC_DIRECTION = 1) or backward to the reactant (IRC_DIRECTION = -1).

8.3 Calculation

Open a terminal and navigate to this example's directory. Copy the POSCAR file from Example 7.

cd $TUTORIALS/transition_states/e08_*
cp ../e07_*/POSCAR .

Starting from the transition state, the intrinsic reaction coordinate (IRC) models the reaction pathway. It is calculated by following a trial unstable mode, taken from Example 7. The unstable mode is followed in two directions, forward to the product (plus, in the p directory) and backward to the reactant (minus, in the m directory). A separate calculation is required for each, the reactant is calculated in m (minus) and the product in p (plus). First, run the calculation for the reactant with the following in your terminal:

mkdir m
cp POSCAR POTCAR KPOINTS INCAR m
cd ./m
ln -s $TUTORIALS/transition_states/mlff/MLFF_e05-12/ML_FFN ML_FF
mpirun -np 4 vasp_gam

Second, calculate the product in the same manner, using the following:

cd $TUTORIALS/transition_states/e08_*
mkdir p
cp POSCAR POTCAR KPOINTS INCAR p
cd ./p
sed -i 's/IRC_DIRECTION = -1/IRC_DIRECTION = 1/g' INCAR
ln -s $TUTORIALS/transition_states/mlff/ML_FFN ML_FF
mpirun -np 4 vasp_gam

You have succeeded in calculating the IRC! Let us extract this potential profile using the ircShift.sh script. This script extracts the IRC coordinate in Å IRC (A): from the OUTCAR files in the m and p directories and merges them to get the entire reaction profile. Extract the IRC using the following:

cd $TUTORIALS/transition_states/e08_*
../scripts/bashScripts/ircShift.sh

ircShift.sh outputs ircShift.dat with all of the IRC points. Extract the IRC data and plot it with:

In [17]:
import py4vasp
import numpy as np

irc = np.genfromtxt("./e08_Static_Reaction_pathway/ircShift.dat",unpack=True,usecols=range(2))

py4vasp.plot(irc[0], irc[1], xlabel="Intrinsic reaction coordinate in Å", ylabel="Energy in eV", label="IRC")
Can you label the different parts of the profile?

At the beginning, ~-3 Å, is the reactant with the initial CO and CH${3}$-Z. As the CO comes closer and the CH${3}$ inverts, the energy increases to a maximum, at 0 Å, the transition state. The free acetyl cation forms before the energy rapidly decreases to the product, ~4 Å.

The reaction profile is made clearer by visualizing the structures of the reactant, transition state, and product. You can use py4vasp to look at each of the structures:

In [18]:
import py4vasp

R = py4vasp.Calculation.from_path("./e08_Static_Reaction_pathway/m/")
TS = py4vasp.Calculation.from_path("./e06_Static_TS_Opt/")
P = py4vasp.Calculation.from_path("./e08_Static_Reaction_pathway/p/")

# Take a look at the structure that your interested in by unhashing the relevant line
#R.structure.plot(supercell=(2,2,1)) # Reactant
#TS.structure.plot(supercell=(2,2,1)) # Transition state
R.structure.plot(supercell=(2,2,1)) # Product
In [19]:
import py4vasp

R = py4vasp.Calculation.from_path("./e08_Static_Reaction_pathway/m/")
TS = py4vasp.Calculation.from_path("./e06_Static_TS_Opt/")
P = py4vasp.Calculation.from_path("./e08_Static_Reaction_pathway/p/")

TS.structure.plot(supercell=(2,2,1)) # Product
In [20]:
import py4vasp

R = py4vasp.Calculation.from_path("./e08_Static_Reaction_pathway/m/")
TS = py4vasp.Calculation.from_path("./e06_Static_TS_Opt/")
P = py4vasp.Calculation.from_path("./e08_Static_Reaction_pathway/p/")

P.structure.plot(supercell=(2,2,1)) # Product

The scripts pos2xyzAnim_rev.py and pos2xyzAnim_for.py extract the IRC coordinate every 10 steps for the backward and forward reaction, respectively. These scripts create a video of the reaction. Run them one after the other and stick them together using the following:

cd $TUTORIALS/transition_states/e08_*
python3 ../scripts/pos2xyzNVT/pos2xyzAnim_rev.py m/XDATCAR 10 0 0.2 0 > anim.xyz
python3 ../scripts/pos2xyzNVT/pos2xyzAnim_for.py p/XDATCAR 10 0 0.2 0 >> anim.xyz

You can view the animated the reaction using the anim.xyz file in JMol. A recording of anim.xyz is given below:

Click here to watch a video of the reaction from reactant to transition state to product!

In the case of both the reactant and product, the IRC calculation terminates once the energy monotonously increases in a sequence of IRC_STOP number of steps. IRC_STOP is set to 20 by default, so the 20th structure from the end of the calculation is the closest to the potential energy minimum. We can extract these from XDATCAR, where they are stored, using the following pickMin_irc.sh:

cd $TUTORIALS/transition_states/e08_*/m
../../scripts/bashScripts/pickMin_irc.sh 20
cd ../p
../../scripts/bashScripts/pickMin_irc.sh 20

This creates the POSCAR.pick files in the m and p directories. Due to the small IRC_VNORM0 value used in our calculation, 0.0005 eV Å-1, this lies very close to the minimum and so no further relaxation is needed. In the next exercise, you will calculate the free energy of the reactant state and the activation free energy of the reaction.

8.4 Questions

  1. What structures are given at the endpoints of IRC_DIRECTION = 1 and IRC_DIRECTION = -1?

9 Reaction thermodynamics - static

By the end of this tutorial, you will be able to:

  • do vibrational analysis on the reactant structure from an IRC calculation
  • compare the harmonic to semi-classical approaches
  • calculate the free energy of the reaction
  • calculate the rate constant

9.1 Task

Perform vibrational analysis on the reactant (methylated chabazite and CO) and calculate the corresponding activation free energy and rate constant for the carbonylation reaction

Total energies are calculated ab initio. The free energy, or another thermodynamic property, is measured by experiment. The comparison of the two requires the inclusion of a few different thermodynamic terms that can be calculated from the vibrational frequencies. The thermodynamic terms including the zero-point vibrational energy, the thermal contributions to the vibrational energy, and the entropic terms must be accounted for. The free energy difference between the reactant and transition states, i.e. the free energy of reaction $\Delta A_{R\rightarrow P}^{\ddagger}$, is a commonly measured property. If $\Delta A_{R\rightarrow P}^{\ddagger}$ is inserted into the Eyring equation, then a common descriptor of a reaction is found, the rate constant $k_{R\rightarrow P}$:

$$\tag{9.1} \large k_{R\rightarrow P} = \frac{k_{B}T}{h}e^{-\left(\Delta A_{R\rightarrow P}^{\ddagger} / k_B T \right)} $$

where $k_{B}$ is the Boltzmann constant, $h$ is the Planck constant, and $T$ the temperature

In this exercise, you will perform a vibrational analysis on the final structure from the backward propagation in Example 8 to check for imaginary modes. If there are no imaginary modes, then the final structure is a minimum and therefore the reactant. Once the reactant has been confirmed, the thermodynamic properties of the reaction will then be calculated, including the free energy of activation and the rate constant.

9.2 Input

The input files to run this example are prepared at $TUTORIALS/transition_states/e09_Static_Thermodynamics.

POSCAR.init


Click here to see the POSCAR!
Reactant
           1
     7.948755   -0.000050    4.901433
    -3.974564    6.883894    4.901255
    -3.974439   -6.883777    4.901246
   Al   C    H    O    Si
     1     2     3    25    11
Direct configuration=  1886
   0.62952771  0.37745230  0.33739735
   0.25191620  0.96168432  0.64117336
   0.39172183  0.18563249  0.40461206
   0.33338056  0.28035823  0.43170585
   0.31736040  0.08893041  0.36882835
   0.46548653  0.16358203  0.49640954
   0.23530815  0.74715842  0.00005085
   0.17906592  0.46352972  0.95104251
   0.25856085  0.61712179  0.73953578
   0.52467333  0.74540501  0.72744140
   0.02313926  0.33701354  0.14234199
   0.35773985  0.64394317  0.48891507
   0.25821808  0.50115223  0.23828089
   0.40429114  0.75927752  0.24917835
   0.46806931  0.46075972  0.66268681
   0.76729001  0.75405826  0.90906636
   0.29012599  0.96936993  0.76193801
   0.58983685  0.23821733  0.74827852
   0.52208925  0.81114731  0.00984135
   0.27114317  0.24921266  0.08195343
   0.74486799  0.49531144  0.76650684
   0.54082448  0.52953054  0.31392885
   0.80009719  0.24362299  0.95949031
   0.67299378  0.34901524  0.51407640
   0.48225178  0.21962111  0.28622622
   0.65496241  0.99357097  0.84772717
   0.00200725  0.64029850  0.83182829
   0.35054171  0.99285230  0.12607265
   0.52908697  0.18468256  0.01096371
   0.76107650  0.35158722  0.22556486
   0.85797485  0.52866751  0.03797078
   0.16890258  0.61623378  0.88027912
   0.40347826  0.61670822  0.65521549
   0.61715759  0.82524264  0.87300247
   0.37898630  0.82422021  0.09494387
   0.39467014  0.60632644  0.32261103
   0.18296570  0.39105114  0.10384741
   0.62162725  0.38679851  0.67049796
   0.84289471  0.60395996  0.88703743
   0.64523535  0.16388889  0.89087957
   0.40586901  0.15890126  0.11699808
   0.85715870  0.36630157  0.09419744

INCAR


! Vibrational analysis
IBRION = 5          ! Finite differences
NFREE = 2           ! Number of displacements
POTIM = 0.01        ! Width of displacement
NSW = 1             ! Number of ionic steps

! Machine learning
ML_LMLFF = T        ! Enables the use of MLFF
ML_MODE = run       ! Prediction-only mode

KPOINTS


K-Points
 0
Gamma
 1  1  1
 0  0  0

POTCAR


Pseudopotentials of Al, C, H, O, and Si.


The KPOINTS, INCAR, and POTCAR files remain as in Example 5. The POSCAR.init file is taken from m/POSCAR.pick generated in previous Example 8.

9.3 Calculation

Open a terminal and navigate to this example's directory. Copy the POSCAR.pick file that that you calculated in Example 8:

cd $TUTORIALS/transition_states/e09_*
ln -s $TUTORIALS/transition_states/mlff/MLFF_e05-12/ML_FFN ML_FF
cp ../e08_*/m/POSCAR.pick POSCAR

With the calculation prepared, you can now check that m/POSCAR.pick is an energetic minimum by running the following:

mpirun -np 4 vasp_gam

Once the calculation has finished, vibFreq.py extracts the frequencies from the output and then determines the Hessian and dynamical matrices. The matrices' corresponding eigenvalues and eigenfunctions are written out in several different formats. Process and view the frequencies using the following script:

cd $TUTORIALS/transition_states/e09_*
python3 ../scripts/vibFreq/vibFreq.py 0. 0.2 0. > freq.dat
echo "Frequencies of reactant:"
grep cm-1 freq.dat | head -n 5
In [21]:
%%bash
echo "Frequencies of reactant:"
grep cm-1 ./e09_*/freq.dat | head -n 5
Frequencies of reactant:
1 f/i = 	 8.927543848885688e-06 cm-1 	 1.6816384319095354e-06 2PiTHz 	 2.676410689317062e-07 THz 	 1.1068762887871912e-06 meV
2 f/i = 	 5.744261578225274e-06 cm-1 	 1.0820188840730982e-06 2PiTHz 	 1.7220865391901006e-07 THz 	 7.121989032092469e-07 meV
3 f = 	 2.7628119155393056e-06 cm-1 	 5.204175723974076e-07 2PiTHz 	 8.282702911893173e-08 THz 	 3.42545615171734e-07 meV
4 f = 	 43.586416898444725 cm-1 	 8.210163400631691 2PiTHz 	 1.3066880888026988 THz 	 5.404036339077024 meV
5 f = 	 53.02954641590353 cm-1 	 9.988920221416187 2PiTHz 	 1.589786029388976 THz 	 6.574837214630969 meV

Except for vanishing imaginary frequencies corresponding to translations, there are only positive frequencies, so this is, in fact, an energetic minimum! Congratulations on finding the reactant!

Using the same procedure to extract the energies as in Example 7, vibpartition_eV.py calculates the harmonic vibrational contributions to the enthalpy, entropy, and free energy. These properties are calculated at 440 K, which lies close to the experiment using the following script:

cd $TUTORIALS/transition_states/e09_*
python3 ../scripts/thermo/vibpartition_eV.py 440. freq.dat > thermo.dat
cat thermo.dat
In [22]:
%%bash
cat e09_*/thermo.dat
freq.dat
nDOF: 126
nVIB: 123
6.928760943550942e-29

T [K] ZPE [eV] Hvib-ZPE [eV] Hvib [eV] Svib [eV/K] Gvib [eV]
440.0 4.439568358212884 2.020437514041463 6.460005872254347 0.00909442169444779 2.4584603266973195

These thermodynamic contributions can also be calculated using the thermochemistry module in ASE:

In [23]:
from ase.thermochemistry import HarmonicThermo
from ase.units import invcm

def parse_frequencies_cm1(filepath):
    frequencies = []
    a = 0
    with open(filepath, 'r') as f:
        for line in f:
            a += 1
            if 'f =' in line:
                try:
                    parts = line.split()
                    cm1 = float(parts[3])  # 4th column: cm⁻¹
                    if cm1 > 10**(-3):  # skip imaginary and vanishing modes
                        frequencies.append(cm1)     
                except (ValueError, IndexError):
                    continue
    return frequencies, a

# Step 1: Read frequencies in cm⁻¹
freq_cm1, n = parse_frequencies_cm1("./e09_Static_Thermodynamics/freq.dat")

# Step 2: Convert cm⁻¹ to eV
freq_eV = [f * invcm for f in freq_cm1]

# Step 3: Use ASE to compute vibrational free energy
thermo = HarmonicThermo(freq_eV)
T=440.0
F_vib = thermo.get_helmholtz_energy(temperature=T)
ZPE = thermo.get_ZPE_correction()
U = thermo.get_internal_energy(temperature=T)
S = thermo.get_entropy(temperature=T)

# Result
print("\nResults in 'thermo.dat' style:")
print("nDOF: " +str(n))
print("nDOF: " +str(len(freq_cm1)))
print("N/A\n")

print("T [K] ZPE [eV] Hvib-ZPE [eV] Hvib [eV] Svib [eV/K] Gvib [eV]")
print(str(T) + " " + str(ZPE) + " " + str(U-ZPE) + " " + str(U) + " " + str(S) + " " + str(F_vib))
Internal energy components at T = 440.00 K:
===============================
E_pot                  0.000 eV
E_ZPE                  4.440 eV
Cv_harm (0->T)         2.020 eV
-------------------------------
U                      6.460 eV
===============================

Entropy components at T = 440.00 K:
=================================================
                           S               T*S
S_harm             0.0090944 eV/K        4.002 eV
-------------------------------------------------
S                  0.0090944 eV/K        4.002 eV
=================================================

Free energy components at T = 440.00 K:
=======================
    U          6.460 eV
 -T*S         -4.002 eV
-----------------------
    F          2.458 eV
=======================
Internal energy components at T = 440.00 K:
===============================
E_pot                  0.000 eV
E_ZPE                  4.440 eV
Cv_harm (0->T)         2.020 eV
-------------------------------
U                      6.460 eV
===============================
Entropy components at T = 440.00 K:
=================================================
                           S               T*S
S_harm             0.0090944 eV/K        4.002 eV
-------------------------------------------------
S                  0.0090944 eV/K        4.002 eV
=================================================

Results in 'thermo.dat' style:
nDOF: 126
nDOF: 123
N/A

T [K] ZPE [eV] Hvib-ZPE [eV] Hvib [eV] Svib [eV/K] Gvib [eV]
440.0 4.4395704265164335 2.020440364014159 6.460010790530593 0.00909443541676948 2.4584592071520213

The file format of thermo.dat is as follows:

tag meaning
nDOF Degrees of freedom. This is three times the number of atoms
nVIB The number of vibrational modes, once the imaginary frequencies have been removed.
line beneath nVIB The vibrational partition function Q_vib is shown without an introduction.
T The temperature in K
ZPV The zero-point vibrational energy
Hvib - ZPV The thermal contribution to the vibrational energy, i.e. how the vibrational energy changes due to vibrational modes above the ground state being populated at temperatire.
Hvib The vibrational enthalpy
Svib The vibrational entropy
Gvib The vibrational Helmholtz free energy

Gvib is the vibrational free energy. Recalling from thermodynamics that the Helmholtz free energy $A$ is defined from the partition function $Q$:

$$\tag{9.2} A = - k_B T \ln{Q} $$

The quantum-mechanical vibrational partition functional is defined as:

$$\tag{9.3} Q_{\mu,vib} = \prod_{i=a}^{N_{vib}} \Large{\frac{e^{(-h \nu_i)/(2 k_B T)}}{1 - e^{(-h \nu_i)/(k_B T)}}} $$

Combining the vibrational free energy with the total energy from the OUTCAR gives the Helmholtz free energy of the transition state $\Delta A_{R\rightarrow P}^{\ddagger}$. This is calculated using the following script:

In [24]:
import py4vasp

def thermo(path, state, data):
    i = 0
    A_vib = 0.0
    with open(path + data) as f:
        for line in f:
            pass
        A_vib = float(line.split()[5])

    calc = py4vasp.Calculation.from_path(path)
    E_tot = float(calc.energy.read()["free energy    TOTEN"])
    A_tot = E_tot + A_vib
    print("Total energy of " + str(state) +": " + str("{:.3f}".format(E_tot)) + " eV")
    print("Vibrational free energy of " + str(state) +": " + str("{:.3f}".format(A_vib)) + " eV")
    print("Helmholtz free energy of " + str(state) +": " + str("{:.3f}".format(A_tot)) + " eV")
    return(A_vib, E_tot, A_tot)

A_tot_TS_QM =  thermo("./e07_Static_Saddle_point/", "TS", "thermo.dat") # TS
print(" ")
A_tot_R_QM = thermo("./e09_Static_Thermodynamics/", "reactant", "thermo.dat") # reactant
Total energy of TS: -319.263 eV
Vibrational free energy of TS: 2.471 eV
Helmholtz free energy of TS: -316.792 eV
 
Total energy of reactant: -320.301 eV
Vibrational free energy of reactant: 2.458 eV
Helmholtz free energy of reactant: -317.843 eV

The free energy of activation for the reaction from reactant to transition state $\Delta A_{R\rightarrow P}^{\ddagger}$ is the difference between the free energy of the TS and the reactant $A_{TS} - A_{R}$:

In [25]:
delta_A_QM = A_tot_TS_QM[2] - A_tot_R_QM[2]
print("ΔA^‡ is: " + str(delta_A_QM) + " eV")
ΔA^‡ is: 1.0505988140172349 eV

Congratulations! You have calculated the free energy of activation for the carbonylation of methylated chabazite!

$\Delta A_{R\rightarrow P}^{\ddagger}$ was calculated assuming the quantum behavior of harmonic oscillators. The semi-classical vibrational partition function is defined as:

$$\tag{9.4} Q_{\mu,vib}^{SC} = \prod_{i=a}^{N_{vib}} \frac{h \nu_i}{2 k_B T} $$

By inputting $Q_{\mu,vib}^{SC}$ into $A = - k_B T \ln{Q}$, the semi-classical vibrational free energy for each structure can be calculated. The free energy difference for the reaction can then be found and the difference between the semi-classical and the quantum mechanical contributions calculated. The semi-classical vibrational free energy is calculated using the above equation implemented using vibpartitionClassic_eV.py:

cd $TUTORIALS/transition_states
echo "Reactant: "
cd ./e09_*
python3 ../scripts/thermo/vibpartitionClassic_eV.py 440. freq.dat > thermo2.dat
cat thermo2.dat
cd ..
echo " "

echo "TS: "
cd ./e07_*
python3 ../scripts/thermo/vibpartitionClassic_eV.py 440. freq.dat > thermo2.dat
cat thermo2.dat
In [26]:
%%bash
echo "Reactant: "
cd ./e09_*
python3 ../scripts/thermo/vibpartitionClassic_eV.py 440. freq.dat > thermo2.dat
cat thermo2.dat
cd ..
echo " "
echo "TS: "
cd ./e07_*
python3 ../scripts/thermo/vibpartitionClassic_eV.py 440. freq.dat > thermo2.dat
cat thermo2.dat
cd ..
Reactant: 
freq.dat
nDOF: 126
nVIB: 123

T [K] ZPE [eV] Hvib-ZPE [eV] Hvib [eV] Svib [eV/K] Gvib [eV]
440.0 0.0 4.663694341459761 4.663694341459761 0.007249141431952022 1.474072111400872
 
TS: 
freq.dat
nDOF: 126
nVIB: 122

T [K] ZPE [eV] Hvib-ZPE [eV] Hvib [eV] Svib [eV/K] Gvib [eV]
440.0 0.0 4.625778127301551 4.625778127301551 0.00709277921257734 1.504955273767522

Bringing these thermodynamic terms together, $\Delta A_{R\rightarrow P}^{\ddagger}$ is calculated for the quantum-mechanical and semi-classical approximations, alongside their difference with the following script:

In [27]:
print("Semi-classical approximation:")
A_tot_TS_SC =  thermo("./e07_Static_Saddle_point/", "TS", "thermo2.dat") # TS
print("The difference in A_tot for TS is: " + str("{:.3f}".format(A_tot_TS_QM[2] - A_tot_TS_SC[2])) + " eV")
print(" ")
A_tot_R_SC = thermo("./e09_Static_Thermodynamics/", "reactant", "thermo2.dat") # reactant
print("The difference in A_tot for reactant is: " + str("{:.3f}".format(A_tot_R_QM[2] - A_tot_R_SC[2])) + " eV")
print(" ")
delta_A_SC = A_tot_TS_SC[2] - A_tot_R_SC[2]
print("The ΔA^‡ quantum mechanically is: " + str("{:.3f}".format(delta_A_QM)) + " eV")
print("The ΔA^‡ semi-classically is: " + str("{:.3f}".format(delta_A_SC)) + " eV")
print("The difference in ΔA^‡ is: " + str("{:.3f}".format(delta_A_SC - delta_A_QM)) + " eV")
Semi-classical approximation:
Total energy of TS: -319.263 eV
Vibrational free energy of TS: 1.505 eV
Helmholtz free energy of TS: -317.758 eV
The difference in A_tot for TS is: 0.966 eV
 
Total energy of reactant: -320.301 eV
Vibrational free energy of reactant: 1.474 eV
Helmholtz free energy of reactant: -318.827 eV
The difference in A_tot for reactant is: 0.984 eV
 
The ΔA^‡ quantum mechanically is: 1.051 eV
The ΔA^‡ semi-classically is: 1.069 eV
The difference in ΔA^‡ is: 0.018 eV

The difference between the semi-classical and quantum mechanical Helmholtz free energies is ~1 eV. Considering this, the difference between the semi-classical and quantum mechanical $\Delta A_{R\rightarrow P}^{\ddagger}$ at ~0.02 eV is extremely small.

What does this suggest about the importance of quantum effects here?

They are small in magnitude, so for the conditions tested, a semi-classical approach is valid. This is an important validation for using molecular dynamics (MD), which uses a semi-classical approach for calculating the forces, failing to include zero-point vibrational contributions to the energy.


Now that the $\Delta A_{R\rightarrow P}^{\ddagger}$ is calculated, the rate constant can be calculated using the Eyring equation:

In [28]:
import scipy 
import math
from decimal import Decimal

def eyring(T, delta_A):
    k_b = 8.617333262E-5
    h = 4.1356692E-15
    
    A = k_b * T / h
    B = math.exp(-delta_A/(k_b * T))
    return A*B

k_SC = eyring(440., delta_A_SC)
k_QM = eyring(440., delta_A_QM)

print("Semi-classical rate constant: " + str("{:.3f}".format(k_SC)) + " s^-1")
print("Static QM rate constant: " + str("{:.3f}".format(k_QM)) + " s^-1")
Semi-classical rate constant: 5.259 s^-1
Static QM rate constant: 8.486 s^-1

Congratulations on calculating the rate constant! You can see that the difference between the vibrational energies makes a ~40% reduction to the rate constant. Small energy differences, when exponentiated, result in big changes in measurable properties.

You could also calculate the rate constant from the products to the transition state by calculating the vibrational frequencies for the products and following the procedure through again.

9.4 Questions

  1. How important are vibrational quantum effects for calculating $\Delta A_{R\rightarrow P}^{\ddagger}$?
  2. How big a difference does this make in calculating the rate constant?

Good job! You have finished Part 2!