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