Mode Tracking vs. Full Normal Modes with ADF¶
Displacements of the selected C=O mode.¶
Requires: AMS2026 or later
Related documentation
Related tutorials
Introduction¶
Mode tracking calculates one chosen normal mode without building the complete molecular Hessian. It starts from a physically motivated displacement and iteratively improves that vector until it is an eigenvector of the target-method Hessian. This report tests whether that focused calculation reproduces the PBE/DZ analytical normal mode for the non-ring C=O stretch of dydrogesterone, and measures the time saved against a full normal-mode calculation.
Dydrogesterone was built from its stereochemical SMILES. Bond data identified atom 3 as the O double-bonded to non-ring atom 2 C. These two atoms form region CO. The geometry was preoptimized with GFN1-xTB and normal modes, then optimized with ADF/PBE/DZ, large frozen core, and NumericalQuality Normal. The DFT optimization used the GFN1-xTB Hessian as its initial Hessian. Every subsequent calculation used the final DFT geometry without further optimization.
Tracked structure and displacement¶
The translucent region marks the selected carbonyl atoms. The outer structures show equal negative and positive displacements along the converged tracked mode.
Spectra¶
Partial Hessian¶
Mode tracking¶
Full normal modes¶
Selected-mode accuracy¶
Calculation |
Mode number |
Frequency (cm^-1) |
IR intensity (km/mol) |
Overlap with tracked mode |
|---|---|---|---|---|
Partial Hessian guess |
153 |
1556.5220 |
106.7533 |
nan |
Mode tracking |
1 |
1580.7417 |
81.0010 |
1.0000 |
Full normal modes |
118 |
1578.4632 |
81.0663 |
0.9977 |
The full-spectrum mode was matched by normal-mode overlap, not frequency proximity. Its absolute overlap with the tracked vector is 0.997713. Mode tracking differs from the full calculation by 2.2785 cm^-1 in frequency, or 0.144%, and 0.0653 km/mol in IR intensity, or 0.081%.
Timings¶
Job |
Elapsed time (s) |
Elapsed time (min) |
|---|---|---|
DFTB preoptimization + modes |
29.610 |
0.494 |
DFT geometry optimization |
230.328 |
3.839 |
DFT partial Hessian |
123.386 |
2.056 |
DFTB Hessian guess |
26.915 |
0.449 |
DFT mode tracking |
154.543 |
2.576 |
DFT full normal modes |
1952.166 |
32.536 |
DFT partial Hessian + DFT mode tracking |
277.929 |
4.632 |
Full DFT normal modes |
1952.166 |
32.536 |
The two DFT steps specific to the focused route, partial Hessian plus mode tracking, took 277.929 s. The full analytical normal-mode job took 1952.166 s, so the DFT-only focused route was 7.02x faster. Including the 26.915 s GFN1-xTB Hessian-guess job gives a focused-route time of 304.843 s and a 6.40x speedup. Geometry optimization timings are excluded from both comparisons because both vibrational routes use the same optimized geometry.
Conclusion¶
For this carbonyl mode, mode tracking reproduced the full-Hessian reference with a frequency error of 2.2785 cm^-1, an intensity error of 0.0653 km/mol, and a mode-vector overlap of 0.997713. The full calculation had no imaginary frequencies. The DFT partial-Hessian plus mode-tracking steps were 7.02x faster than the full analytical Hessian, or 6.40x faster after including the DFTB Hessian guess.
Calculation provenance and inputs¶
Jobs were loaded directly from 01-run_workdir.
DFTB preoptimization + modes¶
GFN1-xTB preoptimization and initial Hessian for the DFT optimization.
Properties
NormalModes yes
End
Task GeometryOptimization
System
Atoms
C -4.5753007624 2.4335757077 -0.3051238140
C -4.1654044269 1.4231319749 0.7300567028 region=CO
O -4.4674968841 1.6330354323 1.8950202972 region=CO
C -3.4249194595 0.1349544347 0.3858899036
C -3.3192691179 -0.1859566386 -1.1125546573
C -2.0693702052 -1.0486415561 -1.2804430380
C -1.3924473893 -1.1266345242 0.0973200504
C -1.9726158255 0.0491246723 0.9254402220
C -1.1997086852 1.3730512519 0.6537656577
C 0.3222386059 1.2194765553 0.7371377451
C 0.8338420837 0.1739848117 -0.2850518607
C 0.1597751178 -1.1965994917 0.0065967194
C 0.7603192912 -1.8095625610 1.2512107198
C 2.0788335458 -1.8018448697 1.4263619842
C 2.9391408645 -1.1699416326 0.4132904296
C 4.1328084585 -1.7217137353 0.1453610078
C 4.9015536137 -1.3363797622 -1.0501572441
O 6.0660755057 -1.7889615227 -1.2081132259
C 4.3173352277 -0.4223716682 -2.0919404215
C 2.8083777155 -0.1913471249 -1.8811425169
C 2.4223452480 0.0318179121 -0.3877414796
C 3.1524503365 1.2995573959 0.1344050991
C -1.9750236367 -0.2703983542 2.4407161276
H -5.2374058363 1.9570953870 -1.0578338512
H -3.6770724868 2.8518506737 -0.8043078900
H -5.1308577997 3.2722925799 0.1664734311
H -4.0167277510 -0.6968517270 0.8346116809
H -3.1923349535 0.7292849107 -1.7274037391
H -4.2265497822 -0.7238688541 -1.4649990443
H -1.4024495612 -0.5921318180 -2.0431039754
H -2.3440017427 -2.0668804766 -1.6343452623
H -1.7508120077 -2.0825689555 0.5474413253
H -1.4447604627 1.7617058398 -0.3585794330
H -1.5182697896 2.1543818490 1.3782845605
H 0.7454608423 2.2195687215 0.5081281572
H 0.6300684955 0.9484578987 1.7688376311
H 0.4645801947 0.5269992359 -1.2733759104
H 0.4129277678 -1.8847911774 -0.8310984850
H 0.1367904154 -2.3082919568 1.9827164786
H 2.5127169465 -2.3283090113 2.2680463583
H 4.4996337377 -2.5454953282 0.7474026720
H 4.8575609769 0.5477101379 -2.0691281882
H 4.4765118113 -0.8661087541 -3.0983229054
H 2.4950166965 0.6819829426 -2.4946876398
H 2.2624511353 -1.0792067427 -2.2710233174
H 2.8637673384 2.1918824411 -0.4610878495
H 4.2554742135 1.1973245897 0.0771896657
H 2.9244125570 1.4787509336 1.2061068447
H -2.4612486216 0.5441744889 3.0152424596
H -2.5221771041 -1.2147790409 2.6483217466
H -0.9462444517 -0.3755354951 2.8356480095
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
Engine dftb
Model GFN1-xTB
EndEngine
DFT geometry optimization¶
Reference PBE/DZ geometry and ADF engine restart data.
GeometryOptimization
InitialHessian
File /home/ubuntu/work/01-run_workdir/01_dftb_preopt/dftb.rkf
Type FromFile
End
End
Task GeometryOptimization
System
Atoms
C -5.2635718170 1.9648547176 -0.0681789075
C -4.0439754295 1.5941151849 0.7474148234 region=CO
O -3.7044014479 2.2519419727 1.6951402611 region=CO
C -3.3276550073 0.3268153713 0.3204009087
C -3.2176707540 0.1191069084 -1.2012182637
C -1.9649380483 -0.7484007906 -1.4133915693
C -1.3598772476 -0.9954286465 -0.0172481657
C -1.8866946860 0.1564450444 0.8672525818
C -1.0606973256 1.4334805767 0.6456681895
C 0.4465457228 1.1928215636 0.7570255757
C 0.9052227532 0.1789583428 -0.3004423277
C 0.1679177058 -1.1546192613 -0.0546444997
C 0.7021027328 -1.7909186635 1.1988314342
C 2.0142638254 -1.7789107480 1.4448037025
C 2.9169483370 -1.2137119227 0.4580502991
C 4.1305496660 -1.7541732250 0.2300712944
C 4.9833084353 -1.3830305690 -0.9017572107
O 6.1403142415 -1.7251931433 -0.9880124294
C 4.3292882735 -0.5808838122 -2.0194096644
C 2.8275189545 -0.3509264722 -1.8434925795
C 2.4453239409 -0.0420232349 -0.3788278604
C 3.2179964604 1.2035303736 0.1011402690
C -1.9220890561 -0.2072323192 2.3545440406
H -5.8581849037 1.0862479633 -0.3094805194
H -4.9344443950 2.4261273143 -0.9992373211
H -5.8631904390 2.6843691301 0.4859616321
H -3.9408764161 -0.4878020034 0.7332742136
H -3.1023895554 1.0777140206 -1.7136207065
H -4.1117242860 -0.3683362491 -1.5958332577
H -1.2554719948 -0.2278168589 -2.0614413153
H -2.2172586142 -1.6972116988 -1.8925465542
H -1.7795047433 -1.9353201608 0.3681083193
H -1.2766125702 1.8434479135 -0.3467549410
H -1.3513786133 2.1849994779 1.3833973030
H 0.9390965468 2.1545269181 0.5976402313
H 0.7058392720 0.8413421469 1.7598561916
H 0.5899399635 0.5702556699 -1.2776102501
H 0.3973551446 -1.8310234528 -0.8926644337
H 0.0090433685 -2.2978772616 1.8598192177
H 2.4405847751 -2.2859335923 2.3033455736
H 4.5067019605 -2.5584127053 0.8535476837
H 4.8637191615 0.3707478453 -2.0882483703
H 4.5202697299 -1.1140452915 -2.9546068861
H 2.5116450830 0.4749029771 -2.4879265899
H 2.2851229702 -1.2477954572 -2.1614197145
H 2.9388664294 2.0772295293 -0.4876150056
H 4.2899469568 1.0437238179 -0.0023811800
H 3.0160027766 1.3992689572 1.1530539068
H -2.4244954455 0.5810312223 2.9143080284
H -2.4606059928 -1.1430678946 2.5091058616
H -0.9137263987 -0.3179095254 2.7517069196
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
Engine adf
Basis
Core Large
Type DZ
End
NumericalQuality Normal
XC
GGA PBE
End
EndEngine
DFT partial Hessian¶
Two-atom CO partial Hessian used to construct the tracked-mode guess.
EngineRestart /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
LoadEngine /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
Properties
NormalModes yes
SelectedRegionForHessian CO
End
Task SinglePoint
System
Atoms
C -5.5272702836 1.7383362856 0.0582569671
C -4.1685168218 1.5794986849 0.7215959954 region=CO
O -3.7738054138 2.4062279095 1.5807198590 region=CO
C -3.3492755853 0.3693323239 0.3005236493
C -3.2200033078 0.2069590175 -1.2485626587
C -1.9658951634 -0.7030021370 -1.4454143318
C -1.3643012691 -0.9399535601 -0.0226345679
C -1.8953008505 0.2432122596 0.8513331893
C -1.0523937563 1.5151903380 0.5643006145
C 0.4672044135 1.2663845151 0.6986431056
C 0.9475399655 0.1968378578 -0.3093237635
C 0.1718837451 -1.1308785250 -0.0381903285
C 0.7046271611 -1.7674667959 1.2305357331
C 2.0390934856 -1.8180847112 1.4510129547
C 2.9443661126 -1.2863928887 0.4345990398
C 4.1332273770 -1.9056016869 0.1644207305
C 4.9773230598 -1.5652844813 -0.9797350199
O 6.1148350071 -2.1049902516 -1.1434458560
C 4.4356054071 -0.5733864669 -2.0045972197
C 2.9271150329 -0.2885453311 -1.8516186580
C 2.5106858508 -0.0488066215 -0.3693139467
C 3.3041110912 1.1604381115 0.2075515121
C -1.9135464039 -0.0711638036 2.3623275318
H -6.0747496156 0.7819576090 0.0347114338
H -5.4000524410 2.0793314586 -0.9840203771
H -6.1078420136 2.4919895674 0.6093185440
H -3.9100052907 -0.5149291198 0.6768433131
H -3.0659919108 1.1925320325 -1.7196342644
H -4.1280195239 -0.2358669101 -1.6887264871
H -1.2332484026 -0.2079855012 -2.1035001561
H -2.2327948171 -1.6640683575 -1.9163765522
H -1.8105076210 -1.8717559662 0.3805686025
H -1.2548909320 1.8737526759 -0.4629964858
H -1.3677999012 2.3157905998 1.2524073535
H 0.9844983116 2.2224307518 0.5154260491
H 0.7139489870 0.9547493811 1.7286849039
H 0.6604843338 0.5588961238 -1.3151404423
H 0.3977490997 -1.8372831200 -0.8675966541
H 0.0074180033 -2.2541508917 1.9191317095
H 2.4589042416 -2.3590713012 2.3047569954
H 4.4770029396 -2.7487577793 0.7708457423
H 5.0245330270 0.3576057816 -1.9136610432
H 4.6627744958 -0.9848378819 -3.0032885010
H 2.6492616781 0.5940998054 -2.4552691215
H 2.3566244969 -1.1552545388 -2.2345909144
H 3.0850569827 2.0782462989 -0.3645264663
H 4.3866832153 0.9663480951 0.1619594535
H 3.0473793396 1.3281479486 1.2651725786
H -2.4246752406 0.7430327650 2.9022373158
H -2.4531817527 -1.0160759641 2.5574704220
H -0.8958685428 -0.1677336054 2.7722664559
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
DFTB Hessian guess¶
GFN1-xTB full Hessian at the DFT geometry, used as the mode-tracking preconditioner.
Properties
NormalModes yes
End
Task SinglePoint
System
Atoms
C -5.5272702836 1.7383362856 0.0582569671
C -4.1685168218 1.5794986849 0.7215959954 region=CO
O -3.7738054138 2.4062279095 1.5807198590 region=CO
C -3.3492755853 0.3693323239 0.3005236493
C -3.2200033078 0.2069590175 -1.2485626587
C -1.9658951634 -0.7030021370 -1.4454143318
C -1.3643012691 -0.9399535601 -0.0226345679
C -1.8953008505 0.2432122596 0.8513331893
C -1.0523937563 1.5151903380 0.5643006145
C 0.4672044135 1.2663845151 0.6986431056
C 0.9475399655 0.1968378578 -0.3093237635
C 0.1718837451 -1.1308785250 -0.0381903285
C 0.7046271611 -1.7674667959 1.2305357331
C 2.0390934856 -1.8180847112 1.4510129547
C 2.9443661126 -1.2863928887 0.4345990398
C 4.1332273770 -1.9056016869 0.1644207305
C 4.9773230598 -1.5652844813 -0.9797350199
O 6.1148350071 -2.1049902516 -1.1434458560
C 4.4356054071 -0.5733864669 -2.0045972197
C 2.9271150329 -0.2885453311 -1.8516186580
C 2.5106858508 -0.0488066215 -0.3693139467
C 3.3041110912 1.1604381115 0.2075515121
C -1.9135464039 -0.0711638036 2.3623275318
H -6.0747496156 0.7819576090 0.0347114338
H -5.4000524410 2.0793314586 -0.9840203771
H -6.1078420136 2.4919895674 0.6093185440
H -3.9100052907 -0.5149291198 0.6768433131
H -3.0659919108 1.1925320325 -1.7196342644
H -4.1280195239 -0.2358669101 -1.6887264871
H -1.2332484026 -0.2079855012 -2.1035001561
H -2.2327948171 -1.6640683575 -1.9163765522
H -1.8105076210 -1.8717559662 0.3805686025
H -1.2548909320 1.8737526759 -0.4629964858
H -1.3677999012 2.3157905998 1.2524073535
H 0.9844983116 2.2224307518 0.5154260491
H 0.7139489870 0.9547493811 1.7286849039
H 0.6604843338 0.5588961238 -1.3151404423
H 0.3977490997 -1.8372831200 -0.8675966541
H 0.0074180033 -2.2541508917 1.9191317095
H 2.4589042416 -2.3590713012 2.3047569954
H 4.4770029396 -2.7487577793 0.7708457423
H 5.0245330270 0.3576057816 -1.9136610432
H 4.6627744958 -0.9848378819 -3.0032885010
H 2.6492616781 0.5940998054 -2.4552691215
H 2.3566244969 -1.1552545388 -2.2345909144
H 3.0850569827 2.0782462989 -0.3645264663
H 4.3866832153 0.9663480951 0.1619594535
H 3.0473793396 1.3281479486 1.2651725786
H -2.4246752406 0.7430327650 2.9022373158
H -2.4531817527 -1.0160759641 2.5574704220
H -0.8958685428 -0.1677336054 2.7722664559
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
Engine dftb
Model GFN1-xTB
EndEngine
DFT mode tracking¶
PBE/DZ mode-tracking result for the selected CO-stretch guess.
EngineRestart /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
LoadEngine /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
Task VibrationalAnalysis
VibrationalAnalysis
ModeTracking
HessianGuess File
HessianPath /home/ubuntu/work/01-run_workdir/04_dftb_hessian_guess/dftb.rkf
End
NormalModes
ModeFile /home/ubuntu/work/01-run_workdir/03_dft_partial_hessian/adf.rkf
ModeInputFormat File
ModeSelect
ModeNumber 153
End
End
Type ModeTracking
End
System
Atoms
C -5.5272702836 1.7383362856 0.0582569671
C -4.1685168218 1.5794986849 0.7215959954 region=CO
O -3.7738054138 2.4062279095 1.5807198590 region=CO
C -3.3492755853 0.3693323239 0.3005236493
C -3.2200033078 0.2069590175 -1.2485626587
C -1.9658951634 -0.7030021370 -1.4454143318
C -1.3643012691 -0.9399535601 -0.0226345679
C -1.8953008505 0.2432122596 0.8513331893
C -1.0523937563 1.5151903380 0.5643006145
C 0.4672044135 1.2663845151 0.6986431056
C 0.9475399655 0.1968378578 -0.3093237635
C 0.1718837451 -1.1308785250 -0.0381903285
C 0.7046271611 -1.7674667959 1.2305357331
C 2.0390934856 -1.8180847112 1.4510129547
C 2.9443661126 -1.2863928887 0.4345990398
C 4.1332273770 -1.9056016869 0.1644207305
C 4.9773230598 -1.5652844813 -0.9797350199
O 6.1148350071 -2.1049902516 -1.1434458560
C 4.4356054071 -0.5733864669 -2.0045972197
C 2.9271150329 -0.2885453311 -1.8516186580
C 2.5106858508 -0.0488066215 -0.3693139467
C 3.3041110912 1.1604381115 0.2075515121
C -1.9135464039 -0.0711638036 2.3623275318
H -6.0747496156 0.7819576090 0.0347114338
H -5.4000524410 2.0793314586 -0.9840203771
H -6.1078420136 2.4919895674 0.6093185440
H -3.9100052907 -0.5149291198 0.6768433131
H -3.0659919108 1.1925320325 -1.7196342644
H -4.1280195239 -0.2358669101 -1.6887264871
H -1.2332484026 -0.2079855012 -2.1035001561
H -2.2327948171 -1.6640683575 -1.9163765522
H -1.8105076210 -1.8717559662 0.3805686025
H -1.2548909320 1.8737526759 -0.4629964858
H -1.3677999012 2.3157905998 1.2524073535
H 0.9844983116 2.2224307518 0.5154260491
H 0.7139489870 0.9547493811 1.7286849039
H 0.6604843338 0.5588961238 -1.3151404423
H 0.3977490997 -1.8372831200 -0.8675966541
H 0.0074180033 -2.2541508917 1.9191317095
H 2.4589042416 -2.3590713012 2.3047569954
H 4.4770029396 -2.7487577793 0.7708457423
H 5.0245330270 0.3576057816 -1.9136610432
H 4.6627744958 -0.9848378819 -3.0032885010
H 2.6492616781 0.5940998054 -2.4552691215
H 2.3566244969 -1.1552545388 -2.2345909144
H 3.0850569827 2.0782462989 -0.3645264663
H 4.3866832153 0.9663480951 0.1619594535
H 3.0473793396 1.3281479486 1.2651725786
H -2.4246752406 0.7430327650 2.9022373158
H -2.4531817527 -1.0160759641 2.5574704220
H -0.8958685428 -0.1677336054 2.7722664559
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
DFT full normal modes¶
PBE/DZ analytical full-Hessian reference calculation.
EngineRestart /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
LoadEngine /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
Properties
NormalModes yes
End
Task SinglePoint
System
Atoms
C -5.5272702836 1.7383362856 0.0582569671
C -4.1685168218 1.5794986849 0.7215959954 region=CO
O -3.7738054138 2.4062279095 1.5807198590 region=CO
C -3.3492755853 0.3693323239 0.3005236493
C -3.2200033078 0.2069590175 -1.2485626587
C -1.9658951634 -0.7030021370 -1.4454143318
C -1.3643012691 -0.9399535601 -0.0226345679
C -1.8953008505 0.2432122596 0.8513331893
C -1.0523937563 1.5151903380 0.5643006145
C 0.4672044135 1.2663845151 0.6986431056
C 0.9475399655 0.1968378578 -0.3093237635
C 0.1718837451 -1.1308785250 -0.0381903285
C 0.7046271611 -1.7674667959 1.2305357331
C 2.0390934856 -1.8180847112 1.4510129547
C 2.9443661126 -1.2863928887 0.4345990398
C 4.1332273770 -1.9056016869 0.1644207305
C 4.9773230598 -1.5652844813 -0.9797350199
O 6.1148350071 -2.1049902516 -1.1434458560
C 4.4356054071 -0.5733864669 -2.0045972197
C 2.9271150329 -0.2885453311 -1.8516186580
C 2.5106858508 -0.0488066215 -0.3693139467
C 3.3041110912 1.1604381115 0.2075515121
C -1.9135464039 -0.0711638036 2.3623275318
H -6.0747496156 0.7819576090 0.0347114338
H -5.4000524410 2.0793314586 -0.9840203771
H -6.1078420136 2.4919895674 0.6093185440
H -3.9100052907 -0.5149291198 0.6768433131
H -3.0659919108 1.1925320325 -1.7196342644
H -4.1280195239 -0.2358669101 -1.6887264871
H -1.2332484026 -0.2079855012 -2.1035001561
H -2.2327948171 -1.6640683575 -1.9163765522
H -1.8105076210 -1.8717559662 0.3805686025
H -1.2548909320 1.8737526759 -0.4629964858
H -1.3677999012 2.3157905998 1.2524073535
H 0.9844983116 2.2224307518 0.5154260491
H 0.7139489870 0.9547493811 1.7286849039
H 0.6604843338 0.5588961238 -1.3151404423
H 0.3977490997 -1.8372831200 -0.8675966541
H 0.0074180033 -2.2541508917 1.9191317095
H 2.4589042416 -2.3590713012 2.3047569954
H 4.4770029396 -2.7487577793 0.7708457423
H 5.0245330270 0.3576057816 -1.9136610432
H 4.6627744958 -0.9848378819 -3.0032885010
H 2.6492616781 0.5940998054 -2.4552691215
H 2.3566244969 -1.1552545388 -2.2345909144
H 3.0850569827 2.0782462989 -0.3645264663
H 4.3866832153 0.9663480951 0.1619594535
H 3.0473793396 1.3281479486 1.2651725786
H -2.4246752406 0.7430327650 2.9022373158
H -2.4531817527 -1.0160759641 2.5574704220
H -0.8958685428 -0.1677336054 2.7722664559
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
References¶
Amsterdam Modeling Suite 2026 documentation,
Doc/text/Tutorials/VibrationalSpectroscopy/ModeTracking.txt, and the AMS Vibrational Spectroscopy manual.Luber, J. Neugebauer, and M. Reiher, “Intensity tracking for theoretical infrared spectroscopy of large molecules,” Journal of Chemical Physics 130, 064105 (2009).
Sleijpen and H. A. van der Vorst, “A Jacobi-Davidson iteration method for linear eigenvalue problems,” SIAM Journal on Matrix Analysis and Applications 17, 401 (1996).
Prompts and Python scripts¶
Prompt (instruction for AI agent)
Use $ams2026
Compare how fast and accurate mode-tracking is to full normal-modes calculations.
Method: DFT ADF/PBE/DZ, large core, NumericalQuality Normal
1. Construct dydrogesterone: SMILES `CC(=O)[C@H]1CC[C@@H]2[C@@]1(CC[C@@H]3[C@H]2C=CC4=CC(=O)CC[C@@]34C)C`
Identify the O that is double-bonded to a C and which is not in a ring using ChemicalSystem bonds methods. Add the C and O to the "CO" region.
2. Get the DFT-optimized geometry. Use normal convergence for the geometry optimizations.
- Pre-optimize the geometry with DFTB GFN1-xTB with normal modes.
- Continue the optimization with the DFT method and use the initial hessian from the previous job to speed up the optimization.
From now on, all calculations must be single-points on the DFT-optimized geometry.
3. Get the mode to track with partial hessian calculation.
- DFT: Use the CO region for the hessian, and EngineRestart from geo opt job. Get the number of the mode that most purely corresponds to a C=O stretch (which has the biggest displacements for those atoms).
4. Run the mode tracking on the mode from the previous step to get the pure correct normal mode.
- DFTB: single-point on the DFT-optimized geometry with normal modes.
- DFT: Run the mode tracking calculation supplying
- the correct mode from the partial hessian calculation
- DFTB-calculated hessian on the current geometry as the hessian guess
- EngineRestart from the DFT geo opt
5. Verification calculation: full normal-modes calculation on the optimized geometry. Use the default analytical Hessian implemented in ADF and use EngineRestart.
Report:
Introduction: Include a basic recap of the purpose of mode tracking and what the current report will show.
Picture: `plot_image_grid` mode-displaced-negative, optimized geometry, mode-displaced-positive. Show the region as well.
Picture: Spectrum from partial hessian calculation
Picture: Spectrum from mode tracking
Picture: Full spectrum
Table: Frequency and intensity of the selected mode.
Table: Timings of individual jobs. Especially compare the partialhessian+modetracking vs. full normal modes.
References: See $AMSHOME/Doc/text/Tutorials/VibrationalSpectroscopy/ModeTracking.txt
The calculations may take an hour to finish. Run all the calculations and generate the report.
01-run.py
#!/usr/bin/env amspython
from __future__ import annotations
import numpy as np
from scm.base import ChemicalSystem, InputParser
from scm.plams import AMSJob, Settings, init
SMILES = "CC(=O)[C@H]1CC[C@@H]2[C@@]1(CC[C@@H]3[C@H]2C=CC4=CC(=O)CC[C@@]34C)C"
def identify_nonring_carbonyl(system: ChemicalSystem) -> tuple[int, int]:
"""Return zero-based C and O indices for the non-ring carbonyl."""
matches: list[tuple[int, int]] = []
for oxygen_index, oxygen in enumerate(system.atoms):
if oxygen.symbol != "O":
continue
for carbon_index in system.bonds.get_bonded_atoms(oxygen_index):
if system.atoms[carbon_index].symbol != "C":
continue
bonds = list(system.bonds.get_bonds_between_atoms(oxygen_index, carbon_index))
if any(abs(bond.order - 2.0) < 1.0e-8 for _, _, bond in bonds):
if not system.atom_is_in_ring(carbon_index):
matches.append((carbon_index, oxygen_index))
if len(matches) != 1:
raise RuntimeError(f"Expected one non-ring carbonyl, found {matches}")
return matches[0]
def dft_settings() -> Settings:
settings = Settings()
settings.input.adf.XC.GGA = "PBE"
settings.input.adf.Basis.Type = "DZ"
settings.input.adf.Basis.Core = "Large"
settings.input.adf.NumericalQuality = "Normal"
return settings
def validate(job: AMSJob) -> None:
InputParser().to_dict("ams", job.get_input())
def run_checked(job: AMSJob) -> AMSJob:
validate(job)
print(f"\nValidated input for {job.name}\n", flush=True)
result = job.run()
if not result.ok():
raise RuntimeError(f"AMS job failed: {job.name}")
timings = job.results.get_timings()
print(f"Completed {job.name}; timings={timings}", flush=True)
return job
def restarted_adf_settings(engine_path: str) -> Settings:
settings = Settings()
settings.input.ams.LoadEngine = engine_path
settings.input.ams.EngineRestart = engine_path
return settings
def stretch_score(
mode: np.ndarray, coords: np.ndarray, carbon_index: int, oxygen_index: int
) -> float:
bond_vector = coords[oxygen_index] - coords[carbon_index]
bond_unit = bond_vector / np.linalg.norm(bond_vector)
relative_displacement = mode[oxygen_index] - mode[carbon_index]
denominator = np.linalg.norm(mode[[carbon_index, oxygen_index]])
if denominator < 1.0e-14:
return 0.0
return abs(float(np.dot(relative_displacement, bond_unit))) / denominator
def main() -> None:
init(folder="01-run_workdir")
system = ChemicalSystem.from_smiles(SMILES)
carbon_index, oxygen_index = identify_nonring_carbonyl(system)
system.set_atoms_in_region(np.array([carbon_index, oxygen_index]), "CO")
print(
f"Non-ring carbonyl: C atom {carbon_index + 1}, O atom {oxygen_index + 1}; "
"both assigned to region CO",
flush=True,
)
preopt_settings = Settings()
preopt_settings.input.ams.Task = "GeometryOptimization"
preopt_settings.input.ams.Properties.NormalModes = "Yes"
preopt_settings.input.dftb.Model = "GFN1-xTB"
preopt = run_checked(
AMSJob(molecule=system, settings=preopt_settings, name="01_dftb_preopt")
)
preoptimized = preopt.results.get_main_system()
dft_opt_settings = dft_settings()
dft_opt_settings.input.ams.Task = "GeometryOptimization"
dft_opt_settings.input.ams.GeometryOptimization.InitialHessian.Type = "FromFile"
dft_opt_settings.input.ams.GeometryOptimization.InitialHessian.File = preopt.results.rkfpath(
file="engine"
)
dft_opt = run_checked(
AMSJob(molecule=preoptimized, settings=dft_opt_settings, name="02_dft_opt")
)
optimized = dft_opt.results.get_main_system()
dft_engine_path = dft_opt.results.rkfpath(file="engine")
partial_settings = restarted_adf_settings(dft_engine_path)
partial_settings.input.ams.Task = "SinglePoint"
partial_settings.input.ams.Properties.NormalModes = "Yes"
partial_settings.input.ams.Properties.SelectedRegionForHessian = "CO"
partial = run_checked(
AMSJob(molecule=optimized, settings=partial_settings, name="03_dft_partial_hessian")
)
partial_modes = np.asarray(partial.results.get_normal_modes())
partial_frequencies = np.asarray(partial.results.get_frequencies(unit="cm^-1"))
coords = np.asarray(optimized.coords)
scores = np.array(
[
stretch_score(mode, coords, carbon_index, oxygen_index)
for mode in partial_modes
]
)
mode_index = int(np.argmax(scores))
mode_number = mode_index + 1
print(
f"Selected partial-Hessian mode {mode_number}: "
f"frequency={partial_frequencies[mode_index]:.6f} cm^-1, "
f"normalized C=O stretch score={scores[mode_index]:.8f}",
flush=True,
)
top = np.argsort(scores)[-10:][::-1]
for idx in top:
print(
f" candidate mode {idx + 1:3d}: {partial_frequencies[idx]:12.5f} cm^-1, "
f"score={scores[idx]:.8f}",
flush=True,
)
dftb_freq_settings = Settings()
dftb_freq_settings.input.ams.Task = "SinglePoint"
dftb_freq_settings.input.ams.Properties.NormalModes = "Yes"
dftb_freq_settings.input.dftb.Model = "GFN1-xTB"
dftb_freq = run_checked(
AMSJob(molecule=optimized, settings=dftb_freq_settings, name="04_dftb_hessian_guess")
)
tracking_settings = restarted_adf_settings(dft_engine_path)
tracking_settings.input.ams.Task = "VibrationalAnalysis"
tracking_settings.input.ams.VibrationalAnalysis.Type = "ModeTracking"
tracking_settings.input.ams.VibrationalAnalysis.NormalModes.ModeInputFormat = "File"
tracking_settings.input.ams.VibrationalAnalysis.NormalModes.ModeFile = partial.results.rkfpath(
file="engine"
)
tracking_settings.input.ams.VibrationalAnalysis.NormalModes.ModeSelect.ModeNumber = str(
mode_number
)
tracking_settings.input.ams.VibrationalAnalysis.ModeTracking.HessianGuess = "File"
tracking_settings.input.ams.VibrationalAnalysis.ModeTracking.HessianPath = (
dftb_freq.results.rkfpath(file="engine")
)
tracking = run_checked(
AMSJob(molecule=optimized, settings=tracking_settings, name="05_dft_mode_tracking")
)
full_settings = restarted_adf_settings(dft_engine_path)
full_settings.input.ams.Task = "SinglePoint"
full_settings.input.ams.Properties.NormalModes = "Yes"
run_checked(AMSJob(molecule=optimized, settings=full_settings, name="06_dft_full_modes"))
print("All calculations completed successfully.", flush=True)
if __name__ == "__main__":
main()
report.py
#!/usr/bin/env amspython
from __future__ import annotations
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from scm.plams import AMSJob, plot_image_grid, view
ROOT = Path(__file__).resolve().parent
JOB_NAMES = [
"01_dftb_preopt",
"02_dft_opt",
"03_dft_partial_hessian",
"04_dftb_hessian_guess",
"05_dft_mode_tracking",
"06_dft_full_modes",
]
JUSTIFICATIONS = {
"01_dftb_preopt": "GFN1-xTB preoptimization and initial Hessian for the DFT optimization.",
"02_dft_opt": "Reference PBE/DZ geometry and ADF engine restart data.",
"03_dft_partial_hessian": "Two-atom CO partial Hessian used to construct the tracked-mode guess.",
"04_dftb_hessian_guess": "GFN1-xTB full Hessian at the DFT geometry, used as the mode-tracking preconditioner.",
"05_dft_mode_tracking": "PBE/DZ mode-tracking result for the selected CO-stretch guess.",
"06_dft_full_modes": "PBE/DZ analytical full-Hessian reference calculation.",
}
def latest_complete_workdir() -> Path:
candidates = sorted(
ROOT.glob("01-run_workdir*"), key=lambda path: path.stat().st_mtime, reverse=True
)
for candidate in candidates:
if all((candidate / name).is_dir() for name in JOB_NAMES):
return candidate
raise FileNotFoundError("No complete 01-run_workdir job set found")
def load_jobs(workdir: Path) -> dict[str, AMSJob]:
jobs: dict[str, AMSJob] = {}
for name in JOB_NAMES:
# Each load is paired with JUSTIFICATIONS[name] in the rendered provenance section.
jobs[name] = AMSJob.load_external(str(workdir / name))
return jobs
def selected_partial_mode(partial: AMSJob, carbon_index: int, oxygen_index: int) -> int:
modes = np.asarray(partial.results.get_normal_modes())
coords = np.asarray(partial.results.get_main_system().coords)
bond = coords[oxygen_index] - coords[carbon_index]
bond /= np.linalg.norm(bond)
scores: list[float] = []
for mode in modes:
denominator = np.linalg.norm(mode[[carbon_index, oxygen_index]])
relative = mode[oxygen_index] - mode[carbon_index]
score = 0.0 if denominator < 1.0e-14 else abs(float(relative @ bond)) / denominator
scores.append(score)
return int(np.argmax(scores))
def normalized_overlap(left: np.ndarray, right: np.ndarray) -> float:
left_flat = left.reshape(-1)
right_flat = right.reshape(-1)
return abs(float(left_flat @ right_flat)) / (
float(np.linalg.norm(left_flat)) * float(np.linalg.norm(right_flat))
)
def spectrum_figure(job: AMSJob, title: str, path: Path, engine: str | None = None) -> None:
x_values, y_values = job.results.get_ir_spectrum(
engine=engine,
broadening_type="gaussian",
broadening_width=20,
min_x=0,
max_x=4000,
x_spacing=1.0,
)
fig, axis = plt.subplots(figsize=(9, 4.2))
axis.plot(x_values, y_values, color="#204a87", linewidth=1.2)
axis.set(xlabel="Wavenumber (cm$^{-1}$)", ylabel="IR intensity (km mol$^{-1}$)", title=title)
axis.set_xlim(4000, 0)
axis.grid(alpha=0.2)
fig.tight_layout()
fig.savefig(path, dpi=180)
plt.close(fig)
def elapsed_seconds(job: AMSJob) -> float:
timings = job.results.get_timings()
lowered = {str(key).lower(): float(value) for key, value in timings.items()}
for key in ("elapsed", "wall", "total"):
if key in lowered:
return lowered[key]
return max(lowered.values())
def main() -> None:
workdir = latest_complete_workdir()
jobs = load_jobs(workdir)
figures = ROOT / "figures"
tables = ROOT / "tables"
figures.mkdir(exist_ok=True)
tables.mkdir(exist_ok=True)
optimized = jobs["02_dft_opt"].results.get_main_system()
carbon_index, oxygen_index = tuple(
int(index) for index in optimized.get_atoms_in_region("CO")
)
if optimized.atoms[carbon_index].symbol == "O":
carbon_index, oxygen_index = oxygen_index, carbon_index
partial = jobs["03_dft_partial_hessian"]
tracking = jobs["05_dft_mode_tracking"]
full = jobs["06_dft_full_modes"]
partial_index = selected_partial_mode(partial, carbon_index, oxygen_index)
partial_frequencies = np.asarray(partial.results.get_frequencies(unit="cm^-1"))
partial_intensities = np.asarray(partial.results.get_ir_intensities())
tracking_frequencies = np.asarray(
tracking.results.get_frequencies(unit="cm^-1", engine="ams")
)
tracking_intensities = np.asarray(tracking.results.get_ir_intensities(engine="ams"))
tracking_modes = np.asarray(
tracking.results.readrkf("Vibrations", "NoWeightNormalMode(1)", file="ams")
).reshape(1, -1, 3)
full_frequencies = np.asarray(full.results.get_frequencies(unit="cm^-1"))
full_intensities = np.asarray(full.results.get_ir_intensities())
full_modes = np.asarray(full.results.get_normal_modes())
tracked_mode = tracking_modes[0]
overlaps = np.array([normalized_overlap(tracked_mode, mode) for mode in full_modes])
full_index = int(np.argmax(overlaps))
mode_table = pd.DataFrame(
[
{
"Calculation": "Partial Hessian guess",
"Mode number": partial_index + 1,
"Frequency (cm^-1)": partial_frequencies[partial_index],
"IR intensity (km/mol)": partial_intensities[partial_index],
"Overlap with tracked mode": np.nan,
},
{
"Calculation": "Mode tracking",
"Mode number": 1,
"Frequency (cm^-1)": tracking_frequencies[0],
"IR intensity (km/mol)": tracking_intensities[0],
"Overlap with tracked mode": 1.0,
},
{
"Calculation": "Full normal modes",
"Mode number": full_index + 1,
"Frequency (cm^-1)": full_frequencies[full_index],
"IR intensity (km/mol)": full_intensities[full_index],
"Overlap with tracked mode": overlaps[full_index],
},
]
)
mode_table.to_csv(tables / "selected_mode.csv", index=False)
timing_rows = []
labels = {
"01_dftb_preopt": "DFTB preoptimization + modes",
"02_dft_opt": "DFT geometry optimization",
"03_dft_partial_hessian": "DFT partial Hessian",
"04_dftb_hessian_guess": "DFTB Hessian guess",
"05_dft_mode_tracking": "DFT mode tracking",
"06_dft_full_modes": "DFT full normal modes",
}
for name in JOB_NAMES:
timing_rows.append({"Job": labels[name], "Elapsed time (s)": elapsed_seconds(jobs[name])})
partial_tracking_time = elapsed_seconds(partial) + elapsed_seconds(tracking)
full_time = elapsed_seconds(full)
timing_rows.extend(
[
{"Job": "DFT partial Hessian + DFT mode tracking", "Elapsed time (s)": partial_tracking_time},
{"Job": "Full DFT normal modes", "Elapsed time (s)": full_time},
]
)
timing_table = pd.DataFrame(timing_rows)
timing_table["Elapsed time (min)"] = timing_table["Elapsed time (s)"] / 60.0
timing_table.to_csv(tables / "timings.csv", index=False)
spectrum_figure(partial, "Partial-Hessian IR spectrum", figures / "partial_hessian_spectrum.png")
spectrum_figure(
tracking,
"Mode-tracking IR spectrum",
figures / "mode_tracking_spectrum.png",
engine="ams",
)
spectrum_figure(full, "Full analytical-Hessian IR spectrum", figures / "full_spectrum.png")
scale = 0.55 / float(np.max(np.linalg.norm(tracked_mode, axis=1)))
negative = optimized.copy()
positive = optimized.copy()
negative.coords = np.asarray(optimized.coords) - scale * tracked_mode
positive.coords = np.asarray(optimized.coords) + scale * tracked_mode
images = {
"Mode displaced, negative": view(
negative,
guess_bonds=len(negative.bonds) == 0,
direction="along_pca3",
show_regions=True,
width=500,
height=420,
picture_path=str(figures / "mode_negative.png"),
),
"Optimized geometry": view(
optimized,
guess_bonds=len(optimized.bonds) == 0,
direction="along_pca3",
show_regions=True,
width=500,
height=420,
picture_path=str(figures / "optimized_geometry.png"),
),
"Mode displaced, positive": view(
positive,
guess_bonds=len(positive.bonds) == 0,
direction="along_pca3",
show_regions=True,
width=500,
height=420,
picture_path=str(figures / "mode_positive.png"),
),
}
plot_image_grid(images, rows=1, save_path=str(figures / "mode_displacement_grid.png"))
frequency_error = abs(float(tracking_frequencies[0] - full_frequencies[full_index]))
frequency_relative_error = 100.0 * frequency_error / abs(float(full_frequencies[full_index]))
intensity_error = abs(float(tracking_intensities[0] - full_intensities[full_index]))
intensity_relative_error = (
100.0 * intensity_error / abs(float(full_intensities[full_index]))
if abs(float(full_intensities[full_index])) > 1.0e-14
else float("nan")
)
speedup = full_time / partial_tracking_time
focused_with_guess_time = partial_tracking_time + elapsed_seconds(jobs["04_dftb_hessian_guess"])
inclusive_speedup = full_time / focused_with_guess_time
lines = [
"# Mode tracking versus a full normal-mode calculation",
"",
"## Introduction",
"",
"Mode tracking calculates one chosen normal mode without building the complete molecular Hessian. It starts from a physically motivated displacement and iteratively improves that vector until it is an eigenvector of the target-method Hessian. This report tests whether that focused calculation reproduces the PBE/DZ analytical normal mode for the non-ring C=O stretch of dydrogesterone, and measures the time saved against a full normal-mode calculation.",
"",
"Dydrogesterone was built from its stereochemical SMILES. Bond data identified atom " + str(oxygen_index + 1) + " as the O double-bonded to non-ring atom " + str(carbon_index + 1) + " C. These two atoms form region `CO`. The geometry was preoptimized with GFN1-xTB and normal modes, then optimized with ADF/PBE/DZ, large frozen core, and NumericalQuality Normal. The DFT optimization used the GFN1-xTB Hessian as its initial Hessian. Every subsequent calculation used the final DFT geometry without further optimization.",
"",
"## Tracked structure and displacement",
"",
"The translucent region marks the selected carbonyl atoms. The outer structures show equal negative and positive displacements along the converged tracked mode.",
"",
"",
"",
"## Spectra",
"",
"### Partial Hessian",
"",
"",
"",
"### Mode tracking",
"",
"",
"",
"### Full normal modes",
"",
"",
"",
"## Selected-mode accuracy",
"",
mode_table.to_markdown(index=False, floatfmt=".4f"),
"",
f"The full-spectrum mode was matched by normal-mode overlap, not frequency proximity. Its absolute overlap with the tracked vector is {overlaps[full_index]:.6f}. Mode tracking differs from the full calculation by {frequency_error:.4f} cm^-1 in frequency, or {frequency_relative_error:.3f}%, and {intensity_error:.4f} km/mol in IR intensity, or {intensity_relative_error:.3f}%.",
"",
"## Timings",
"",
timing_table.to_markdown(index=False, floatfmt=".3f"),
"",
f"The two DFT steps specific to the focused route, partial Hessian plus mode tracking, took {partial_tracking_time:.3f} s. The full analytical normal-mode job took {full_time:.3f} s, so the DFT-only focused route was {speedup:.2f}x faster. Including the {elapsed_seconds(jobs['04_dftb_hessian_guess']):.3f} s GFN1-xTB Hessian-guess job gives a focused-route time of {focused_with_guess_time:.3f} s and a {inclusive_speedup:.2f}x speedup. Geometry optimization timings are excluded from both comparisons because both vibrational routes use the same optimized geometry.",
"",
"## Conclusion",
"",
f"For this carbonyl mode, mode tracking reproduced the full-Hessian reference with a frequency error of {frequency_error:.4f} cm^-1, an intensity error of {intensity_error:.4f} km/mol, and a mode-vector overlap of {overlaps[full_index]:.6f}. The full calculation had no imaginary frequencies. The DFT partial-Hessian plus mode-tracking steps were {speedup:.2f}x faster than the full analytical Hessian, or {inclusive_speedup:.2f}x faster after including the DFTB Hessian guess.",
"",
"## Calculation provenance and inputs",
"",
f"Jobs were loaded directly from `{workdir.name}`.",
"",
]
for name in JOB_NAMES:
lines.extend(
[
f"### {labels[name]}",
"",
JUSTIFICATIONS[name],
"",
"```ams",
jobs[name].get_input().rstrip(),
"```",
"",
]
)
lines.extend(
[
"## References",
"",
"- Amsterdam Modeling Suite 2026 documentation, `Doc/text/Tutorials/VibrationalSpectroscopy/ModeTracking.txt`, and the AMS Vibrational Spectroscopy manual.",
"",
"- S. Luber, J. Neugebauer, and M. Reiher, \"Intensity tracking for theoretical infrared spectroscopy of large molecules,\" *Journal of Chemical Physics* **130**, 064105 (2009).",
"",
"- G. L. G. Sleijpen and H. A. van der Vorst, \"A Jacobi-Davidson iteration method for linear eigenvalue problems,\" *SIAM Journal on Matrix Analysis and Applications* **17**, 401 (1996).",
"",
]
)
(ROOT / "report.md").write_text("\n".join(lines), encoding="utf-8")
print(f"Wrote {ROOT / 'report.md'}")
if __name__ == "__main__":
main()
Original Markdown report
# Mode tracking versus a full normal-mode calculation
## Introduction
Mode tracking calculates one chosen normal mode without building the complete molecular Hessian. It starts from a physically motivated displacement and iteratively improves that vector until it is an eigenvector of the target-method Hessian. This report tests whether that focused calculation reproduces the PBE/DZ analytical normal mode for the non-ring C=O stretch of dydrogesterone, and measures the time saved against a full normal-mode calculation.
Dydrogesterone was built from its stereochemical SMILES. Bond data identified atom 3 as the O double-bonded to non-ring atom 2 C. These two atoms form region `CO`. The geometry was preoptimized with GFN1-xTB and normal modes, then optimized with ADF/PBE/DZ, large frozen core, and NumericalQuality Normal. The DFT optimization used the GFN1-xTB Hessian as its initial Hessian. Every subsequent calculation used the final DFT geometry without further optimization.
## Tracked structure and displacement
The translucent region marks the selected carbonyl atoms. The outer structures show equal negative and positive displacements along the converged tracked mode.

## Spectra
### Partial Hessian

### Mode tracking

### Full normal modes

## Selected-mode accuracy
| Calculation | Mode number | Frequency (cm^-1) | IR intensity (km/mol) | Overlap with tracked mode |
|:----------------------|--------------:|--------------------:|------------------------:|----------------------------:|
| Partial Hessian guess | 153 | 1556.5220 | 106.7533 | nan |
| Mode tracking | 1 | 1580.7417 | 81.0010 | 1.0000 |
| Full normal modes | 118 | 1578.4632 | 81.0663 | 0.9977 |
The full-spectrum mode was matched by normal-mode overlap, not frequency proximity. Its absolute overlap with the tracked vector is 0.997713. Mode tracking differs from the full calculation by 2.2785 cm^-1 in frequency, or 0.144%, and 0.0653 km/mol in IR intensity, or 0.081%.
## Timings
| Job | Elapsed time (s) | Elapsed time (min) |
|:----------------------------------------|-------------------:|---------------------:|
| DFTB preoptimization + modes | 29.610 | 0.494 |
| DFT geometry optimization | 230.328 | 3.839 |
| DFT partial Hessian | 123.386 | 2.056 |
| DFTB Hessian guess | 26.915 | 0.449 |
| DFT mode tracking | 154.543 | 2.576 |
| DFT full normal modes | 1952.166 | 32.536 |
| DFT partial Hessian + DFT mode tracking | 277.929 | 4.632 |
| Full DFT normal modes | 1952.166 | 32.536 |
The two DFT steps specific to the focused route, partial Hessian plus mode tracking, took 277.929 s. The full analytical normal-mode job took 1952.166 s, so the DFT-only focused route was 7.02x faster. Including the 26.915 s GFN1-xTB Hessian-guess job gives a focused-route time of 304.843 s and a 6.40x speedup. Geometry optimization timings are excluded from both comparisons because both vibrational routes use the same optimized geometry.
## Conclusion
For this carbonyl mode, mode tracking reproduced the full-Hessian reference with a frequency error of 2.2785 cm^-1, an intensity error of 0.0653 km/mol, and a mode-vector overlap of 0.997713. The full calculation had no imaginary frequencies. The DFT partial-Hessian plus mode-tracking steps were 7.02x faster than the full analytical Hessian, or 6.40x faster after including the DFTB Hessian guess.
## Calculation provenance and inputs
Jobs were loaded directly from `01-run_workdir`.
### DFTB preoptimization + modes
GFN1-xTB preoptimization and initial Hessian for the DFT optimization.
```ams
Properties
NormalModes yes
End
Task GeometryOptimization
System
Atoms
C -4.5753007624 2.4335757077 -0.3051238140
C -4.1654044269 1.4231319749 0.7300567028 region=CO
O -4.4674968841 1.6330354323 1.8950202972 region=CO
C -3.4249194595 0.1349544347 0.3858899036
C -3.3192691179 -0.1859566386 -1.1125546573
C -2.0693702052 -1.0486415561 -1.2804430380
C -1.3924473893 -1.1266345242 0.0973200504
C -1.9726158255 0.0491246723 0.9254402220
C -1.1997086852 1.3730512519 0.6537656577
C 0.3222386059 1.2194765553 0.7371377451
C 0.8338420837 0.1739848117 -0.2850518607
C 0.1597751178 -1.1965994917 0.0065967194
C 0.7603192912 -1.8095625610 1.2512107198
C 2.0788335458 -1.8018448697 1.4263619842
C 2.9391408645 -1.1699416326 0.4132904296
C 4.1328084585 -1.7217137353 0.1453610078
C 4.9015536137 -1.3363797622 -1.0501572441
O 6.0660755057 -1.7889615227 -1.2081132259
C 4.3173352277 -0.4223716682 -2.0919404215
C 2.8083777155 -0.1913471249 -1.8811425169
C 2.4223452480 0.0318179121 -0.3877414796
C 3.1524503365 1.2995573959 0.1344050991
C -1.9750236367 -0.2703983542 2.4407161276
H -5.2374058363 1.9570953870 -1.0578338512
H -3.6770724868 2.8518506737 -0.8043078900
H -5.1308577997 3.2722925799 0.1664734311
H -4.0167277510 -0.6968517270 0.8346116809
H -3.1923349535 0.7292849107 -1.7274037391
H -4.2265497822 -0.7238688541 -1.4649990443
H -1.4024495612 -0.5921318180 -2.0431039754
H -2.3440017427 -2.0668804766 -1.6343452623
H -1.7508120077 -2.0825689555 0.5474413253
H -1.4447604627 1.7617058398 -0.3585794330
H -1.5182697896 2.1543818490 1.3782845605
H 0.7454608423 2.2195687215 0.5081281572
H 0.6300684955 0.9484578987 1.7688376311
H 0.4645801947 0.5269992359 -1.2733759104
H 0.4129277678 -1.8847911774 -0.8310984850
H 0.1367904154 -2.3082919568 1.9827164786
H 2.5127169465 -2.3283090113 2.2680463583
H 4.4996337377 -2.5454953282 0.7474026720
H 4.8575609769 0.5477101379 -2.0691281882
H 4.4765118113 -0.8661087541 -3.0983229054
H 2.4950166965 0.6819829426 -2.4946876398
H 2.2624511353 -1.0792067427 -2.2710233174
H 2.8637673384 2.1918824411 -0.4610878495
H 4.2554742135 1.1973245897 0.0771896657
H 2.9244125570 1.4787509336 1.2061068447
H -2.4612486216 0.5441744889 3.0152424596
H -2.5221771041 -1.2147790409 2.6483217466
H -0.9462444517 -0.3755354951 2.8356480095
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
Engine dftb
Model GFN1-xTB
EndEngine
```
### DFT geometry optimization
Reference PBE/DZ geometry and ADF engine restart data.
```ams
GeometryOptimization
InitialHessian
File /home/ubuntu/work/01-run_workdir/01_dftb_preopt/dftb.rkf
Type FromFile
End
End
Task GeometryOptimization
System
Atoms
C -5.2635718170 1.9648547176 -0.0681789075
C -4.0439754295 1.5941151849 0.7474148234 region=CO
O -3.7044014479 2.2519419727 1.6951402611 region=CO
C -3.3276550073 0.3268153713 0.3204009087
C -3.2176707540 0.1191069084 -1.2012182637
C -1.9649380483 -0.7484007906 -1.4133915693
C -1.3598772476 -0.9954286465 -0.0172481657
C -1.8866946860 0.1564450444 0.8672525818
C -1.0606973256 1.4334805767 0.6456681895
C 0.4465457228 1.1928215636 0.7570255757
C 0.9052227532 0.1789583428 -0.3004423277
C 0.1679177058 -1.1546192613 -0.0546444997
C 0.7021027328 -1.7909186635 1.1988314342
C 2.0142638254 -1.7789107480 1.4448037025
C 2.9169483370 -1.2137119227 0.4580502991
C 4.1305496660 -1.7541732250 0.2300712944
C 4.9833084353 -1.3830305690 -0.9017572107
O 6.1403142415 -1.7251931433 -0.9880124294
C 4.3292882735 -0.5808838122 -2.0194096644
C 2.8275189545 -0.3509264722 -1.8434925795
C 2.4453239409 -0.0420232349 -0.3788278604
C 3.2179964604 1.2035303736 0.1011402690
C -1.9220890561 -0.2072323192 2.3545440406
H -5.8581849037 1.0862479633 -0.3094805194
H -4.9344443950 2.4261273143 -0.9992373211
H -5.8631904390 2.6843691301 0.4859616321
H -3.9408764161 -0.4878020034 0.7332742136
H -3.1023895554 1.0777140206 -1.7136207065
H -4.1117242860 -0.3683362491 -1.5958332577
H -1.2554719948 -0.2278168589 -2.0614413153
H -2.2172586142 -1.6972116988 -1.8925465542
H -1.7795047433 -1.9353201608 0.3681083193
H -1.2766125702 1.8434479135 -0.3467549410
H -1.3513786133 2.1849994779 1.3833973030
H 0.9390965468 2.1545269181 0.5976402313
H 0.7058392720 0.8413421469 1.7598561916
H 0.5899399635 0.5702556699 -1.2776102501
H 0.3973551446 -1.8310234528 -0.8926644337
H 0.0090433685 -2.2978772616 1.8598192177
H 2.4405847751 -2.2859335923 2.3033455736
H 4.5067019605 -2.5584127053 0.8535476837
H 4.8637191615 0.3707478453 -2.0882483703
H 4.5202697299 -1.1140452915 -2.9546068861
H 2.5116450830 0.4749029771 -2.4879265899
H 2.2851229702 -1.2477954572 -2.1614197145
H 2.9388664294 2.0772295293 -0.4876150056
H 4.2899469568 1.0437238179 -0.0023811800
H 3.0160027766 1.3992689572 1.1530539068
H -2.4244954455 0.5810312223 2.9143080284
H -2.4606059928 -1.1430678946 2.5091058616
H -0.9137263987 -0.3179095254 2.7517069196
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
Engine adf
Basis
Core Large
Type DZ
End
NumericalQuality Normal
XC
GGA PBE
End
EndEngine
```
### DFT partial Hessian
Two-atom CO partial Hessian used to construct the tracked-mode guess.
```ams
EngineRestart /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
LoadEngine /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
Properties
NormalModes yes
SelectedRegionForHessian CO
End
Task SinglePoint
System
Atoms
C -5.5272702836 1.7383362856 0.0582569671
C -4.1685168218 1.5794986849 0.7215959954 region=CO
O -3.7738054138 2.4062279095 1.5807198590 region=CO
C -3.3492755853 0.3693323239 0.3005236493
C -3.2200033078 0.2069590175 -1.2485626587
C -1.9658951634 -0.7030021370 -1.4454143318
C -1.3643012691 -0.9399535601 -0.0226345679
C -1.8953008505 0.2432122596 0.8513331893
C -1.0523937563 1.5151903380 0.5643006145
C 0.4672044135 1.2663845151 0.6986431056
C 0.9475399655 0.1968378578 -0.3093237635
C 0.1718837451 -1.1308785250 -0.0381903285
C 0.7046271611 -1.7674667959 1.2305357331
C 2.0390934856 -1.8180847112 1.4510129547
C 2.9443661126 -1.2863928887 0.4345990398
C 4.1332273770 -1.9056016869 0.1644207305
C 4.9773230598 -1.5652844813 -0.9797350199
O 6.1148350071 -2.1049902516 -1.1434458560
C 4.4356054071 -0.5733864669 -2.0045972197
C 2.9271150329 -0.2885453311 -1.8516186580
C 2.5106858508 -0.0488066215 -0.3693139467
C 3.3041110912 1.1604381115 0.2075515121
C -1.9135464039 -0.0711638036 2.3623275318
H -6.0747496156 0.7819576090 0.0347114338
H -5.4000524410 2.0793314586 -0.9840203771
H -6.1078420136 2.4919895674 0.6093185440
H -3.9100052907 -0.5149291198 0.6768433131
H -3.0659919108 1.1925320325 -1.7196342644
H -4.1280195239 -0.2358669101 -1.6887264871
H -1.2332484026 -0.2079855012 -2.1035001561
H -2.2327948171 -1.6640683575 -1.9163765522
H -1.8105076210 -1.8717559662 0.3805686025
H -1.2548909320 1.8737526759 -0.4629964858
H -1.3677999012 2.3157905998 1.2524073535
H 0.9844983116 2.2224307518 0.5154260491
H 0.7139489870 0.9547493811 1.7286849039
H 0.6604843338 0.5588961238 -1.3151404423
H 0.3977490997 -1.8372831200 -0.8675966541
H 0.0074180033 -2.2541508917 1.9191317095
H 2.4589042416 -2.3590713012 2.3047569954
H 4.4770029396 -2.7487577793 0.7708457423
H 5.0245330270 0.3576057816 -1.9136610432
H 4.6627744958 -0.9848378819 -3.0032885010
H 2.6492616781 0.5940998054 -2.4552691215
H 2.3566244969 -1.1552545388 -2.2345909144
H 3.0850569827 2.0782462989 -0.3645264663
H 4.3866832153 0.9663480951 0.1619594535
H 3.0473793396 1.3281479486 1.2651725786
H -2.4246752406 0.7430327650 2.9022373158
H -2.4531817527 -1.0160759641 2.5574704220
H -0.8958685428 -0.1677336054 2.7722664559
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
```
### DFTB Hessian guess
GFN1-xTB full Hessian at the DFT geometry, used as the mode-tracking preconditioner.
```ams
Properties
NormalModes yes
End
Task SinglePoint
System
Atoms
C -5.5272702836 1.7383362856 0.0582569671
C -4.1685168218 1.5794986849 0.7215959954 region=CO
O -3.7738054138 2.4062279095 1.5807198590 region=CO
C -3.3492755853 0.3693323239 0.3005236493
C -3.2200033078 0.2069590175 -1.2485626587
C -1.9658951634 -0.7030021370 -1.4454143318
C -1.3643012691 -0.9399535601 -0.0226345679
C -1.8953008505 0.2432122596 0.8513331893
C -1.0523937563 1.5151903380 0.5643006145
C 0.4672044135 1.2663845151 0.6986431056
C 0.9475399655 0.1968378578 -0.3093237635
C 0.1718837451 -1.1308785250 -0.0381903285
C 0.7046271611 -1.7674667959 1.2305357331
C 2.0390934856 -1.8180847112 1.4510129547
C 2.9443661126 -1.2863928887 0.4345990398
C 4.1332273770 -1.9056016869 0.1644207305
C 4.9773230598 -1.5652844813 -0.9797350199
O 6.1148350071 -2.1049902516 -1.1434458560
C 4.4356054071 -0.5733864669 -2.0045972197
C 2.9271150329 -0.2885453311 -1.8516186580
C 2.5106858508 -0.0488066215 -0.3693139467
C 3.3041110912 1.1604381115 0.2075515121
C -1.9135464039 -0.0711638036 2.3623275318
H -6.0747496156 0.7819576090 0.0347114338
H -5.4000524410 2.0793314586 -0.9840203771
H -6.1078420136 2.4919895674 0.6093185440
H -3.9100052907 -0.5149291198 0.6768433131
H -3.0659919108 1.1925320325 -1.7196342644
H -4.1280195239 -0.2358669101 -1.6887264871
H -1.2332484026 -0.2079855012 -2.1035001561
H -2.2327948171 -1.6640683575 -1.9163765522
H -1.8105076210 -1.8717559662 0.3805686025
H -1.2548909320 1.8737526759 -0.4629964858
H -1.3677999012 2.3157905998 1.2524073535
H 0.9844983116 2.2224307518 0.5154260491
H 0.7139489870 0.9547493811 1.7286849039
H 0.6604843338 0.5588961238 -1.3151404423
H 0.3977490997 -1.8372831200 -0.8675966541
H 0.0074180033 -2.2541508917 1.9191317095
H 2.4589042416 -2.3590713012 2.3047569954
H 4.4770029396 -2.7487577793 0.7708457423
H 5.0245330270 0.3576057816 -1.9136610432
H 4.6627744958 -0.9848378819 -3.0032885010
H 2.6492616781 0.5940998054 -2.4552691215
H 2.3566244969 -1.1552545388 -2.2345909144
H 3.0850569827 2.0782462989 -0.3645264663
H 4.3866832153 0.9663480951 0.1619594535
H 3.0473793396 1.3281479486 1.2651725786
H -2.4246752406 0.7430327650 2.9022373158
H -2.4531817527 -1.0160759641 2.5574704220
H -0.8958685428 -0.1677336054 2.7722664559
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
Engine dftb
Model GFN1-xTB
EndEngine
```
### DFT mode tracking
PBE/DZ mode-tracking result for the selected CO-stretch guess.
```ams
EngineRestart /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
LoadEngine /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
Task VibrationalAnalysis
VibrationalAnalysis
ModeTracking
HessianGuess File
HessianPath /home/ubuntu/work/01-run_workdir/04_dftb_hessian_guess/dftb.rkf
End
NormalModes
ModeFile /home/ubuntu/work/01-run_workdir/03_dft_partial_hessian/adf.rkf
ModeInputFormat File
ModeSelect
ModeNumber 153
End
End
Type ModeTracking
End
System
Atoms
C -5.5272702836 1.7383362856 0.0582569671
C -4.1685168218 1.5794986849 0.7215959954 region=CO
O -3.7738054138 2.4062279095 1.5807198590 region=CO
C -3.3492755853 0.3693323239 0.3005236493
C -3.2200033078 0.2069590175 -1.2485626587
C -1.9658951634 -0.7030021370 -1.4454143318
C -1.3643012691 -0.9399535601 -0.0226345679
C -1.8953008505 0.2432122596 0.8513331893
C -1.0523937563 1.5151903380 0.5643006145
C 0.4672044135 1.2663845151 0.6986431056
C 0.9475399655 0.1968378578 -0.3093237635
C 0.1718837451 -1.1308785250 -0.0381903285
C 0.7046271611 -1.7674667959 1.2305357331
C 2.0390934856 -1.8180847112 1.4510129547
C 2.9443661126 -1.2863928887 0.4345990398
C 4.1332273770 -1.9056016869 0.1644207305
C 4.9773230598 -1.5652844813 -0.9797350199
O 6.1148350071 -2.1049902516 -1.1434458560
C 4.4356054071 -0.5733864669 -2.0045972197
C 2.9271150329 -0.2885453311 -1.8516186580
C 2.5106858508 -0.0488066215 -0.3693139467
C 3.3041110912 1.1604381115 0.2075515121
C -1.9135464039 -0.0711638036 2.3623275318
H -6.0747496156 0.7819576090 0.0347114338
H -5.4000524410 2.0793314586 -0.9840203771
H -6.1078420136 2.4919895674 0.6093185440
H -3.9100052907 -0.5149291198 0.6768433131
H -3.0659919108 1.1925320325 -1.7196342644
H -4.1280195239 -0.2358669101 -1.6887264871
H -1.2332484026 -0.2079855012 -2.1035001561
H -2.2327948171 -1.6640683575 -1.9163765522
H -1.8105076210 -1.8717559662 0.3805686025
H -1.2548909320 1.8737526759 -0.4629964858
H -1.3677999012 2.3157905998 1.2524073535
H 0.9844983116 2.2224307518 0.5154260491
H 0.7139489870 0.9547493811 1.7286849039
H 0.6604843338 0.5588961238 -1.3151404423
H 0.3977490997 -1.8372831200 -0.8675966541
H 0.0074180033 -2.2541508917 1.9191317095
H 2.4589042416 -2.3590713012 2.3047569954
H 4.4770029396 -2.7487577793 0.7708457423
H 5.0245330270 0.3576057816 -1.9136610432
H 4.6627744958 -0.9848378819 -3.0032885010
H 2.6492616781 0.5940998054 -2.4552691215
H 2.3566244969 -1.1552545388 -2.2345909144
H 3.0850569827 2.0782462989 -0.3645264663
H 4.3866832153 0.9663480951 0.1619594535
H 3.0473793396 1.3281479486 1.2651725786
H -2.4246752406 0.7430327650 2.9022373158
H -2.4531817527 -1.0160759641 2.5574704220
H -0.8958685428 -0.1677336054 2.7722664559
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
```
### DFT full normal modes
PBE/DZ analytical full-Hessian reference calculation.
```ams
EngineRestart /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
LoadEngine /home/ubuntu/work/01-run_workdir/02_dft_opt/adf.rkf
Properties
NormalModes yes
End
Task SinglePoint
System
Atoms
C -5.5272702836 1.7383362856 0.0582569671
C -4.1685168218 1.5794986849 0.7215959954 region=CO
O -3.7738054138 2.4062279095 1.5807198590 region=CO
C -3.3492755853 0.3693323239 0.3005236493
C -3.2200033078 0.2069590175 -1.2485626587
C -1.9658951634 -0.7030021370 -1.4454143318
C -1.3643012691 -0.9399535601 -0.0226345679
C -1.8953008505 0.2432122596 0.8513331893
C -1.0523937563 1.5151903380 0.5643006145
C 0.4672044135 1.2663845151 0.6986431056
C 0.9475399655 0.1968378578 -0.3093237635
C 0.1718837451 -1.1308785250 -0.0381903285
C 0.7046271611 -1.7674667959 1.2305357331
C 2.0390934856 -1.8180847112 1.4510129547
C 2.9443661126 -1.2863928887 0.4345990398
C 4.1332273770 -1.9056016869 0.1644207305
C 4.9773230598 -1.5652844813 -0.9797350199
O 6.1148350071 -2.1049902516 -1.1434458560
C 4.4356054071 -0.5733864669 -2.0045972197
C 2.9271150329 -0.2885453311 -1.8516186580
C 2.5106858508 -0.0488066215 -0.3693139467
C 3.3041110912 1.1604381115 0.2075515121
C -1.9135464039 -0.0711638036 2.3623275318
H -6.0747496156 0.7819576090 0.0347114338
H -5.4000524410 2.0793314586 -0.9840203771
H -6.1078420136 2.4919895674 0.6093185440
H -3.9100052907 -0.5149291198 0.6768433131
H -3.0659919108 1.1925320325 -1.7196342644
H -4.1280195239 -0.2358669101 -1.6887264871
H -1.2332484026 -0.2079855012 -2.1035001561
H -2.2327948171 -1.6640683575 -1.9163765522
H -1.8105076210 -1.8717559662 0.3805686025
H -1.2548909320 1.8737526759 -0.4629964858
H -1.3677999012 2.3157905998 1.2524073535
H 0.9844983116 2.2224307518 0.5154260491
H 0.7139489870 0.9547493811 1.7286849039
H 0.6604843338 0.5588961238 -1.3151404423
H 0.3977490997 -1.8372831200 -0.8675966541
H 0.0074180033 -2.2541508917 1.9191317095
H 2.4589042416 -2.3590713012 2.3047569954
H 4.4770029396 -2.7487577793 0.7708457423
H 5.0245330270 0.3576057816 -1.9136610432
H 4.6627744958 -0.9848378819 -3.0032885010
H 2.6492616781 0.5940998054 -2.4552691215
H 2.3566244969 -1.1552545388 -2.2345909144
H 3.0850569827 2.0782462989 -0.3645264663
H 4.3866832153 0.9663480951 0.1619594535
H 3.0473793396 1.3281479486 1.2651725786
H -2.4246752406 0.7430327650 2.9022373158
H -2.4531817527 -1.0160759641 2.5574704220
H -0.8958685428 -0.1677336054 2.7722664559
End
BondOrders
1 2 1.0
1 24 1.0
1 25 1.0
1 26 1.0
2 3 2.0
2 4 1.0
4 5 1.0
4 8 1.0
4 27 1.0
5 6 1.0
5 28 1.0
5 29 1.0
6 7 1.0
6 30 1.0
6 31 1.0
7 8 1.0
7 12 1.0
7 32 1.0
8 9 1.0
8 23 1.0
9 10 1.0
9 33 1.0
9 34 1.0
10 11 1.0
10 35 1.0
10 36 1.0
11 12 1.0
11 21 1.0
11 37 1.0
12 13 1.0
12 38 1.0
13 14 2.0
13 39 1.0
14 15 1.0
14 40 1.0
15 16 2.0
15 21 1.0
16 17 1.0
16 41 1.0
17 18 2.0
17 19 1.0
19 20 1.0
19 42 1.0
19 43 1.0
20 21 1.0
20 44 1.0
20 45 1.0
21 22 1.0
22 46 1.0
22 47 1.0
22 48 1.0
23 49 1.0
23 50 1.0
23 51 1.0
End
End
```
## References
- Amsterdam Modeling Suite 2026 documentation, `Doc/text/Tutorials/VibrationalSpectroscopy/ModeTracking.txt`, and the AMS Vibrational Spectroscopy manual.
- S. Luber, J. Neugebauer, and M. Reiher, "Intensity tracking for theoretical infrared spectroscopy of large molecules," *Journal of Chemical Physics* **130**, 064105 (2009).
- G. L. G. Sleijpen and H. A. van der Vorst, "A Jacobi-Davidson iteration method for linear eigenvalue problems," *SIAM Journal on Matrix Analysis and Applications* **17**, 401 (1996).