Mode Tracking vs. Full Normal Modes with ADF

../_images/mode_displacement_grid_0849a551.png

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.

Negative displacement, optimized geometry, and positive displacement

Spectra

Partial Hessian

Partial-Hessian spectrum

Mode tracking

Mode-tracking spectrum

Full normal modes

Full normal-mode spectrum

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.

    1. Luber, J. Neugebauer, and M. Reiher, “Intensity tracking for theoretical infrared spectroscopy of large molecules,” Journal of Chemical Physics 130, 064105 (2009).

        1. 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.",
        "",
        "![Negative displacement, optimized geometry, and positive displacement](figures/mode_displacement_grid.png)",
        "",
        "## Spectra",
        "",
        "### Partial Hessian",
        "",
        "![Partial-Hessian spectrum](figures/partial_hessian_spectrum.png)",
        "",
        "### Mode tracking",
        "",
        "![Mode-tracking spectrum](figures/mode_tracking_spectrum.png)",
        "",
        "### Full normal modes",
        "",
        "![Full normal-mode spectrum](figures/full_spectrum.png)",
        "",
        "## 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.

![Negative displacement, optimized geometry, and positive displacement](figures/mode_displacement_grid.png)

## Spectra

### Partial Hessian

![Partial-Hessian spectrum](figures/partial_hessian_spectrum.png)

### Mode tracking

![Mode-tracking spectrum](figures/mode_tracking_spectrum.png)

### Full normal modes

![Full normal-mode spectrum](figures/full_spectrum.png)

## 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).