Normal mode analysis provides an analytic description of the dynamics of a system near a minimum using an harmonic approximation to the potential. Before a normal mode analysis can be started, the system must be brought to a local minimum of the potential energy by energy minimization, except when special force fields designed only for normal mode analysis are used (e.g. MMTK.ForceFields.DeformationForceField). See also the normal mode examples.
A standard normal mode analysis is performed by creating a normal mode object, implemented in class MMTK.NormalModes.NormalModes. A normal mode object behaves like a sequence of MMTK.NormalModes.Mode objects which store the atomic displacement vectors corresponding to each mode and its vibrational frequency.
For short-ranged potentials, it is advantageous to store the second derivatives of the potential in a sparse-matrix form and to use an iterative method to determine some or all modes. This permits the treatments of larger systems that would normally require huge amounts of memory. A sparse-matrix method is implemented in class MMTK.NormalModes.SparseMatrixNormalModes.
Another approach to deal with large systems is the restriction to low-frequency modes which are supposed to be well representable by linear combinations of a given set of basis vectors. The basis vectors can be obtained from a basis for the full Cartesian space by elimination of known fast degrees of freedom (e.g. bonds); the module MMTK.Subspace contains support classes for this approach. It is also possible to construct a suitable basis vector set from small-deformation vector fields (e.g. MMTK.FourierBasis.FourierBasis). The normal mode analysis for a given set of basis vectors is performed by the class MMTK.NormalModes.SubspaceNormalModes. There is also a variant using finite difference differentiation (MMTK.NormalModes.FiniteDifferenceSubspaceNormalModes) and another one using a sparse-matrix representation of the second derivatives (MMTK.NormalModes.SparseMatrixSubspaceNormalModes).