An efficient harmonic oscillator term (Python part) — MMTK User Guide 2.7.7 documentation

### Navigation

- index
- modules |
- MMTK User Guide 2.7.7 documentation »

# An efficient harmonic oscillator term (Python part)

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    # Harmonic potential with respect to a fixed point in space

    from MMTK.ForceFields.ForceField import ForceField
    from MMTK_harmonic_oscillator import HarmonicOscillatorTerm

    class HarmonicOscillatorForceField(ForceField):

        """
        Harmonic potential with respect to a fixed point in space
        """

        def __init__(self, atom, center, force_constant):
            """
            @param atom: the atom on which the force field acts
            @type atom: L{MMTK.ChemicalObjects.Atom}
            @param center: the point to which the atom is attached by
                           the harmonic potential
            @type center: L{Scientific.Geometry.Vector}
            @param force_constant: the force constant of the harmonic potential
            @type force_constant: C{float}
            """
            # Get the internal index of the atom if the argument is an
            # atom object. It is the index that is stored internally,
            # and when the force field is recreated from a specification
            # in a trajectory file, it is the index that is passed instead
            # of the atom object itself. Calling this method takes care
            # of all the necessary checks and conversions.
            self.atom_index = self.getAtomParameterIndices([atom])[0]
            # Store arguments that recreate the force field from a pickled
            # universe or from a trajectory.
            self.arguments = (self.atom_index, center, force_constant)
            # Initialize the ForceField class, giving a name to this one.
            ForceField.__init__(self, 'harmonic_oscillator')
            # Store the parameters for later use.
            self.center = center
            self.force_constant = force_constant

        # The following method is called by the energy evaluation engine
        # to inquire if this force field term has all the parameters it
        # requires. This is necessary for interdependent force field
        # terms. In our case, we just say "yes" immediately.
        def ready(self, global_data):
            return True

        # The following method is called by the energy evaluation engine
        # to obtain a list of the low-level evaluator objects (the C routines)
        # that handle the calculations.
        def evaluatorTerms(self, universe, subset1, subset2, global_data):
            # The subset evaluation mechanism does not make much sense for
            # this force field, so we just signal an error if someone
            # uses it by accident.
            if subset1 is not None or subset2 is not None:
                raise ValueError("sorry, no subsets here")
            # Here we pass all the parameters to the Cython code
            # that handles energy calculations.
            return [HarmonicOscillatorTerm(universe,
                                           self.atom_index,
                                           self.center,
                                           self.force_constant)]

### Navigation

- index
- modules |
- MMTK User Guide 2.7.7 documentation »