Example M1: Calculating mean square displacement — OVITO Python Reference 3.15.3-dev-HEAD-b1e9512d documentation

# Example M1: Calculating mean square displacement

This example presents a user-defined modifier function for calculating the mean square displacement (MSD) for a system of moving particles. OVITO provides the built-in Displacement Vectors modifier, which calculates the individual displacement of each particle. It stores its results in the `"Displacement Magnitude"` particle property. So all our user-defined modifier function needs to do is sum up the squared displacement magnitudes and divide by the number of particles:

    import numpy

    def modify(frame, data):
        # Access the per-particle displacement magnitudes computed by the
        # 'Displacement Vectors' modifier preceding this user-defined modifier in the
        # data pipeline:
        displacement_magnitudes = data.particles['Displacement Magnitude']

        # Compute MSD:
        msd = numpy.sum(displacement_magnitudes ** 2) / len(displacement_magnitudes)

        # Output value as a global attribute to make it available within OVITO:
        data.attributes["MSD"] = msd

When used within the graphical program, the MSD value computed by this custom modifier may be exported to a text file as a function of simulation time using OVITO’s standard file export feature (Select `Table of Global Attributes` as output format).

Alternatively, we can make use of the custom modifier function from within a non-interactive batch script, which is run with the `ovitos` interpreter. Then we have to insert the `CalculateDisplacementsModifier` programmatically:

    from ovito.io import import_file, export_file
    from ovito.modifiers import CalculateDisplacementsModifier
    import numpy

    # Load input data and create a data pipeline.
    pipeline = import_file("input/simulation.dump")

    # Calculate per-particle displacements with respect to initial simulation frame:
    pipeline.modifiers.append(CalculateDisplacementsModifier())

    # Define the custom modifier function:
    def calculate_msd(frame, data):

        # Access the per-particle displacement magnitudes computed by the
        # CalculateDisplacementsModifier that precedes this user-defined modifier in the
        # data pipeline:
        displacement_magnitudes = data.particles['Displacement Magnitude']

        # Compute MSD:
        msd = numpy.sum(displacement_magnitudes ** 2) / len(displacement_magnitudes)

        # Output MSD value as a global attribute:
        data.attributes["MSD"] = msd

    # Insert user-defined modifier function into the data pipeline.
    pipeline.modifiers.append(calculate_msd)

    # Export calculated MSD value to a text file and let OVITO's data pipeline do the rest:
    export_file(pipeline, "output/msd_data.txt",
        format = "txt/attr",
        columns = ["Timestep", "MSD"],
        multiple_frames = True)