Ejemplo n.º 1
0
    def testFinalizeAndQuery(self):
        """ Test the finalization and query functions. """
        tsd = TimeStepDistribution()

        # Set the member data.
        histogram = numpy.array(numpy.random.rand(12) * 34, dtype=int)
        normalized_histogram = histogram / float(numpy.sum(histogram))
        binsize = 2.13
        tsd._TimeStepDistribution__binsize = binsize
        tsd._TimeStepDistribution__histogram = histogram

        # Call the finalize function.
        tsd.finalize()

        # We now have the normalized histogram and timesteps on the class.
        ret_histogram = tsd.histogram()
        ret_norm_histogram = tsd.normalizedHistogram()
        ret_time_steps = tsd.timeSteps()

        # Check the histograms.
        self.assertAlmostEqual(numpy.linalg.norm(ret_histogram - histogram),
                               0.0, 12)
        self.assertAlmostEqual(
            numpy.linalg.norm(ret_norm_histogram - normalized_histogram), 0.0,
            12)

        # Check the time steps.
        time_steps = (numpy.arange(12) + 1) * binsize - binsize / 2.0
        self.assertAlmostEqual(numpy.linalg.norm(ret_time_steps - time_steps),
                               0.0, 12)
Ejemplo n.º 2
0
    def testFinalizeAndQuery(self):
        """ Test the finalization and query functions. """
        tsd = TimeStepDistribution()

        # Set the member data.
        histogram = numpy.array(numpy.random.rand(12)*34, dtype=int)
        normalized_histogram = histogram / float(numpy.sum(histogram))
        binsize = 2.13
        tsd._TimeStepDistribution__binsize   = binsize
        tsd._TimeStepDistribution__histogram = histogram

        # Call the finalize function.
        tsd.finalize()

        # We now have the normalized histogram and timesteps on the class.
        ret_histogram      = tsd.histogram()
        ret_norm_histogram = tsd.normalizedHistogram()
        ret_time_steps     = tsd.timeSteps()

        # Check the histograms.
        self.assertAlmostEqual(numpy.linalg.norm(ret_histogram - histogram), 0.0, 12)
        self.assertAlmostEqual(numpy.linalg.norm(ret_norm_histogram - normalized_histogram), 0.0, 12)

        # Check the time steps.
        time_steps = (numpy.arange(12)+1)*binsize - binsize/2.0
        self.assertAlmostEqual(numpy.linalg.norm(ret_time_steps - time_steps), 0.0, 12)
Ejemplo n.º 3
0
    def testTimeStepDistribution(self):
        """ Test the distribution for a system with only one moving particle. """
        # Setup a system, a periodic 10x10x10 atoms long 3D block.
        unit_cell = KMCUnitCell(cell_vectors=numpy.array([[1.0,0.0,0.0],
                                                          [0.0,1.0,0.0],
                                                          [0.0,0.0,1.0]]),
                                basis_points=[[0.0,0.0,0.0]])

        # And a lattice.
        lattice = KMCLattice(unit_cell=unit_cell,
                             repetitions=(10,10,10),
                             periodic=(True,True,True))

        # Setup an initial configuration with one B in a sea of A:s.
        types = ["A"]*10*10*10
        types[5] = "B"

        config = KMCConfiguration(lattice=lattice,
                                  types=types,
                                  possible_types=["A","B"])

        # Setup a all diffusion processes.
        coordinates_p0 = [[0.0, 0.0, 0.0],[-1.0, 0.0, 0.0]]
        p0 = KMCProcess(coordinates=coordinates_p0,
                        elements_before=["B","A"],
                        elements_after=["A","B"],
                        move_vectors=None,
                        basis_sites=[0],
                        rate_constant=0.1)

        coordinates_p1 = [[0.0, 0.0, 0.0],[1.0, 0.0, 0.0]]
        p1 = KMCProcess(coordinates=coordinates_p1,
                        elements_before=["B","A"],
                        elements_after=["A","B"],
                        move_vectors=None,
                        basis_sites=[0],
                        rate_constant=0.2)

        coordinates_p2 = [[0.0, 0.0, 0.0],[0.0,-1.0, 0.0]]
        p2 = KMCProcess(coordinates=coordinates_p2,
                        elements_before=["B","A"],
                        elements_after=["A","B"],
                        move_vectors=None,
                        basis_sites=[0],
                        rate_constant=0.3)

        coordinates_p3 = [[0.0, 0.0, 0.0],[0.0, 1.0, 0.0]]
        p3 = KMCProcess(coordinates=coordinates_p3,
                        elements_before=["B","A"],
                        elements_after=["A","B"],
                        move_vectors=None,
                        basis_sites=[0],
                        rate_constant=0.4)

        coordinates_p4 = [[0.0, 0.0, 0.0],[0.0, 0.0,-1.0]]
        p4 = KMCProcess(coordinates=coordinates_p4,
                        elements_before=["B","A"],
                        elements_after=["A","B"],
                        move_vectors=None,
                        basis_sites=[0],
                        rate_constant=0.5)

        coordinates_p5 = [[0.0, 0.0, 0.0],[0.0, 0.0, 1.0]]
        p5 = KMCProcess(coordinates=coordinates_p5,
                        elements_before=["B","A"],
                        elements_after=["A","B"],
                        move_vectors=None,
                        basis_sites=[0],
                        rate_constant=0.6)

        interactions = KMCInteractions(processes=[p0, p1, p2, p3, p4, p5],
                                       implicit_wildcards=True)

        model = KMCLatticeModel(configuration=config,
                                interactions=interactions)

        # Setup the analysis.
        tsd = TimeStepDistribution(binsize=0.001)

        # Setup the control parameters.
        control_parameters = KMCControlParameters(number_of_steps=1000000,
                                                  dump_interval=10000,
                                                  analysis_interval=1)
        # Run the model.
        model.run(control_parameters=control_parameters,
                  analysis=[tsd])

        # Define the analytical reference function.
        # The exponent is the total rate and the coefficient is
        # chosen to normalize to one.
        total_rate = 2.1
        def ref(dt):
            return total_rate*0.001*numpy.exp(-total_rate * dt)

        hst  = tsd.normalizedHistogram()
        time = tsd.timeSteps()

        sum_diff = 0.0
        for t, h in zip(time, hst):
            sum_diff += numpy.abs(ref(t) - h)

        # Make sure the relative error is less than five percent.
        self.assertTrue( sum_diff*100.0 < 5.0 )