def testCalculation(self): """ Test a calculation with the on-the-fly MSD analysis. """ # Setup a system, a periodic 10 atoms long 1D chain. 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 diffusion process to the left. 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) interactions = KMCInteractions(processes=[p0, p1, p2, p3, p4, p5], implicit_wildcards=True) model = KMCLatticeModel(configuration=config, interactions=interactions) # Setup the analysis. msd = OnTheFlyMSD(history_steps=400, n_bins=10, t_max=25.0, track_type="B") # Setup the control parameters. control_parameters = KMCControlParameters(number_of_steps=4000, dump_interval=100, analysis_interval=1, seed=2013) # Run the model. model.run(control_parameters=control_parameters, analysis=[msd]) # Get the results out. results = msd.results() time_steps = msd.timeSteps() std_dev = msd.stdDev() bin_counters = msd.binCounters() # Compare against references. ref_results = numpy.array([[ 2.77712331 , 8.22333156 , 14.21578638 , 21.11949845 , 27.57598537, 33.81520414, 40.5640313 , 47.35067074, 54.83134718, 63.0006103 ], [ 2.80810946 , 8.48503234 , 13.7997313 , 17.62812205 , 22.37202018, 29.12157221, 35.40750463, 41.44944591, 48.94392653, 56.67111894], [ 2.98786918 , 8.65022668 , 14.01808716 , 18.62678885 , 22.65708384, 26.03107861, 30.03937616, 35.1483 , 40.68319007, 47.21074474], [ 5.58523277 , 16.70836389 , 28.01551768 , 38.74762049 , 49.94800555, 62.93677636, 75.97153593, 88.80011665, 103.77527371, 119.67172924], [ 5.76499249 , 16.87355824 , 28.23387354 , 39.7462873 , 50.23306921, 59.84628275, 70.60340745, 82.49897073, 95.51453725, 110.21135504], [ 5.79597864 , 17.13525902 , 27.81781846 , 36.2549109 , 45.02910402, 55.15265082, 65.44688079, 76.59774591, 89.62711659, 103.88186368], [ 8.57310195 , 25.35859057 , 42.03360484 , 57.37440934 , 72.60508939, 88.96785497, 106.01091209, 123.94841665, 144.45846377, 166.88247398]]) diff = numpy.linalg.norm(ref_results - results) self.assertAlmostEqual(diff, 0.0, 6) ref_time_steps = numpy.array([ 1.25, 3.75, 6.25, 8.75, 11.25, 13.75, 16.25, 18.75, 21.25, 23.75]) diff = numpy.linalg.norm(ref_time_steps - time_steps) self.assertAlmostEqual(diff, 0.0, 8) ref_std_dev = numpy.array( [[ 0.14837207, 0.7305895 , 1.61912818, 2.84016862, 4.19935234, 5.69504607, 7.43238623, 9.31932103, 11.49445671, 13.97165319], [ 0.15002755, 0.75383991, 1.57174096, 2.37064526, 3.40687718, 4.90455993, 6.48757634, 8.15787162, 10.26025939, 12.5679611 ], [ 0.15963149, 0.76851636, 1.59661093, 2.50494685, 3.45028752, 4.38406911, 5.5039955 , 6.91771175, 8.52853689, 10.46993274], [ 0.21100039, 1.04965011, 2.25628521, 3.68460183, 5.37841647, 7.49505328, 9.84289993, 12.35824143, 15.38290727, 18.76634124], [ 0.2177914 , 1.06002792, 2.27387093, 3.77956739, 5.40911222, 7.12701069, 9.14740325, 11.48131598, 14.15839455, 17.28281115], [ 0.218962 , 1.07646844, 2.24036311, 3.44756425, 4.84874766, 6.56805258, 8.47932177, 10.66004723, 13.28568526, 16.29025096], [ 0.26444438, 1.30073885, 2.76405291, 4.45469653, 6.38348309, 8.65082886, 11.21442742, 14.08440462, 17.48404426, 21.36747194]]) diff = numpy.linalg.norm(ref_std_dev - std_dev) self.assertAlmostEqual(diff, 0.0, 6) ref_bin_counters = (59930, 59996, 59545, 59256, 59064, 59076, 58284, 58294, 57817, 57349) self.assertEqual(bin_counters, ref_bin_counters)
def testCalculationNonOrthogonal(self): """ Test a calculation with the on-the-fly MSD analysis. """ # Setup a system, a periodic 10 atoms long 1D chain. unit_cell = KMCUnitCell(cell_vectors=numpy.array([[2.0,1.0,0.0], [0.0,1.0,0.0], [0.0,2.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 diffusion process to the left. 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) interactions = KMCInteractions(processes=[p0, p1, p2, p3, p4, p5], implicit_wildcards=True) model = KMCLatticeModel(configuration=config, interactions=interactions) # Setup the analysis. msd = OnTheFlyMSD(history_steps=400, n_bins=10, t_max=25.0, track_type="B") # Setup the control parameters. control_parameters = KMCControlParameters(number_of_steps=4000, dump_interval=100, analysis_interval=1, seed=2013) # Run the model. model.run(control_parameters=control_parameters, analysis=[msd]) # Get the results out. results = msd.results() time_steps = msd.timeSteps() std_dev = msd.stdDev() bin_counters = msd.binCounters() # Compare against references. ref_results = numpy.array([[ 11.10849324 , 32.89332622 , 56.86314552 , 84.47799379 , 110.30394149, 135.26081658, 162.25612518, 189.40268295, 219.32538873, 252.00244119], [ 17.33153679 , 50.69982999 , 82.74958435 , 111.33382274 , 136.44824258, 164.84499628, 193.94367236, 234.25340515, 272.64453361, 302.94924061], [ 2.98786918 , 8.65022668 , 14.01808716 , 18.62678885 , 22.65708384, 26.03107861, 30.03937616, 35.1483 , 40.68319007, 47.21074474], [ 28.44003004 , 83.59315621 , 139.61272987 , 195.81181652 , 246.75218407, 300.10581285, 356.19979754, 423.65608811, 491.96992234, 554.95168181], [ 14.09636242 , 41.5435529 , 70.88123268 , 103.10478264 , 132.96102533, 161.29189519, 192.29550134, 224.55098295, 260.00857879, 299.21318593], [ 20.31940597 , 59.35005667 , 96.76767151 , 129.96061158 , 159.10532643, 190.87607489, 223.98304852, 269.40170515, 313.32772368, 350.15998535], [ 31.42789922 , 92.24338289 , 153.63081703 , 214.43860537 , 269.40926791, 326.13689146, 386.2391737 , 458.8043881 , 532.65311241, 602.16242655]]) diff = numpy.linalg.norm(ref_results - results) self.assertAlmostEqual(diff, 0.0, 6) ref_time_steps = numpy.array([ 1.25, 3.75, 6.25, 8.75, 11.25, 13.75, 16.25, 18.75, 21.25, 23.75]) diff = numpy.linalg.norm(ref_time_steps - time_steps) self.assertAlmostEqual(diff, 0.0, 8) ref_std_dev = numpy.array([[ 0.59348826 , 2.92235801 , 6.47651272 , 11.36067446 , 16.79740936, 22.78018427, 29.72954492, 37.27728411, 45.97782684, 55.88661276], [ 0.92596389 , 4.50435001 , 9.42488725 , 14.97226982 , 20.7787406, 27.76265504, 35.53552825, 46.10457783, 57.15527613, 67.18509081], [ 0.15963149 , 0.76851636 , 1.59661093 , 2.50494685 , 3.45028752, 4.38406911 , 5.5039955 , 6.91771175 , 8.52853689 , 10.46993274], [ 1.07441492 , 5.2514756 , 11.24398775 , 18.62020347 , 26.57035045, 35.73918442, 46.14937581, 58.95988 , 72.92611647, 87.02483617], [ 0.53253608 , 2.60984229 , 5.70856048 , 9.80447485 , 14.31728377, 19.20802777, 24.91387536, 31.25058126, 38.54181941, 46.9211633 ], [ 0.76763185 , 3.72847956 , 7.7933761 , 12.35825842 , 17.13251009, 22.73116664, 29.01932554, 37.49242051, 46.4454696 , 54.91039375], [ 0.96941939 , 4.731515 , 10.1024813 , 16.6495642 , 23.68662473, 31.71206536, 40.85854085, 52.13448317, 64.46787783, 77.10029967]]) diff = numpy.linalg.norm(ref_std_dev - std_dev) self.assertAlmostEqual(diff, 0.0, 6) ref_bin_counters = (59930, 59996, 59545, 59256, 59064, 59076, 58284, 58294, 57817, 57349) self.assertEqual(bin_counters, ref_bin_counters)
def testCalculation(self): """ Test a calculation with the on-the-fly MSD analysis. """ # Setup a system, a periodic 10 atoms long 1D chain. 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 diffusion process to the left. 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) interactions = KMCInteractions(processes=[p0, p1, p2, p3, p4, p5], implicit_wildcards=True) model = KMCLatticeModel(configuration=config, interactions=interactions) # Setup the analysis. msd = OnTheFlyMSD(history_steps=400, n_bins=10, t_max=25.0, track_type="B") # Setup the control parameters. control_parameters = KMCControlParameters(number_of_steps=4000, dump_interval=100, analysis_interval=1, seed=2013) # Run the model. model.run(control_parameters=control_parameters, analysis=[msd]) # Get the results out. results = msd.results() time_steps = msd.timeSteps() std_dev = msd.stdDev() bin_counters = msd.binCounters() # Compare against references. ref_results = numpy.array([[ 2.59214168 , 7.09292512 , 11.09571441 , 14.73593561 , 18.02780434, 21.25579701, 24.64588125, 28.81831092, 31.62393358, 34.6177501 ], [ 2.65374493 , 7.10317609 , 10.90626886 , 14.87948705 , 18.25169973, 21.00603548, 22.97611332, 25.57822115, 28.87848128, 32.2240879 ], [ 2.59976568 , 7.35085681 , 11.8568078 , 16.56678774 , 21.77700882, 26.34223625, 30.40786814, 35.09199292, 40.24434182, 46.48414664], [ 5.24588661 , 14.19610121 , 22.00198327 , 29.61542266 , 36.27950408, 42.2618325 , 47.62199456, 54.39653208, 60.50241486, 66.841838 ], [ 5.19190736 , 14.44378193 , 22.9525222 , 31.30272335 , 39.80481316, 47.59803326, 55.05374939, 63.91030384, 71.8682754 , 81.10189674], [ 5.2535106 , 14.45403291 , 22.76307666 , 31.44627479 , 40.02870855, 47.34827174, 53.38398146, 60.67021407, 69.1228231 , 78.70823454], [ 7.84565228 , 21.54695802 , 33.85879107 , 46.1822104 , 58.05651289, 68.60406875, 78.02986271, 89.48852499, 100.74675668, 113.32598464]]) diff = numpy.linalg.norm(ref_results - results) self.assertAlmostEqual(diff, 0.0, 6) ref_time_steps = numpy.array([ 1.25, 3.75, 6.25, 8.75, 11.25, 13.75, 16.25, 18.75, 21.25, 23.75]) diff = numpy.linalg.norm(ref_time_steps - time_steps) self.assertAlmostEqual(diff, 0.0, 8) ref_std_dev = numpy.array([[ 0.13765582, 0.62432398, 1.24701335, 1.95661619, 2.7137435, 3.53476554, 4.45846845, 5.60517366, 6.55120574, 7.58912539], [ 0.14092726, 0.62522628, 1.22572215, 1.97567674, 2.7474467, 3.49323106, 4.1564055 , 4.97497483, 5.98245856, 7.06437139], [ 0.13806069, 0.6470273 , 1.33255031, 2.19971409, 3.27811502, 4.38062279, 5.50081855, 6.82540746, 8.33700723, 10.19055301], [ 0.19698798, 0.88356546, 1.74848804, 2.780551 , 3.86164462, 4.96954405, 6.09163579, 7.48129474, 8.86263902, 10.36158694], [ 0.19496101, 0.89898111, 1.82402696, 2.93896933, 4.23688379, 5.59702476, 7.04227937, 8.7897482 , 10.52755635, 12.57213116], [ 0.19727427, 0.89961913, 1.8089718 , 2.95244717, 4.26071555, 5.56765545, 6.82868861, 8.34413034, 10.12539137, 12.20107405], [ 0.24054939, 1.09498957, 2.19698279, 3.54031591, 5.04564022, 6.58676948, 8.14969886, 10.04910241, 12.04968783, 14.34371883]]) diff = numpy.linalg.norm(ref_std_dev - std_dev) self.assertAlmostEqual(diff, 0.0, 6) ref_bin_counters = (58893, 58531, 57985, 58641, 57509, 57659, 57396, 57037, 56732, 56518) self.assertEqual(bin_counters, ref_bin_counters)
def testCalculationNonOrthogonal(self): """ Test a calculation with the on-the-fly MSD analysis. """ # Setup a system, a periodic 10 atoms long 1D chain. unit_cell = KMCUnitCell(cell_vectors=numpy.array([[2.0,1.0,0.0], [0.0,1.0,0.0], [0.0,2.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 diffusion process to the left. 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) interactions = KMCInteractions(processes=[p0, p1, p2, p3, p4, p5], implicit_wildcards=True) model = KMCLatticeModel(configuration=config, interactions=interactions) # Setup the analysis. msd = OnTheFlyMSD(history_steps=400, n_bins=10, t_max=25.0, track_type="B") # Setup the control parameters. control_parameters = KMCControlParameters(number_of_steps=4000, dump_interval=100, analysis_interval=1, seed=2013) # Run the model. model.run(control_parameters=control_parameters, analysis=[msd]) # Get the results out. results = msd.results() time_steps = msd.timeSteps() std_dev = msd.stdDev() bin_counters = msd.binCounters() # Compare against references. ref_results = numpy.array([[ 10.36856672 , 28.37170047 , 44.38285764 , 58.94374243 , 72.11121737, 85.02318805 , 98.58352498 , 115.27324368 , 126.49573433 , 138.47100039], [ 16.05138132 , 44.90792913 , 68.59720617 , 93.35093194 , 123.68147594, 148.63693439, 172.54794759, 203.0082052 , 232.5195128 , 267.73366007], [ 2.59976568 , 7.35085681 , 11.8568078 , 16.56678774 , 21.77700882, 26.34223625, 30.40786814, 35.09199292, 40.24434182, 46.48414664], [ 26.41994804 , 73.2796296 , 112.98006381 , 152.29467437 , 195.79269332, 233.66012244, 271.13147258, 318.28144888, 359.01524713, 406.20466046], [ 12.9683324 , 35.72255728 , 56.23966543 , 75.51053018 , 93.88822619, 111.3654243 , 128.99139313, 150.3652366 , 166.74007615, 184.95514703], [ 18.651147 , 52.25878594 , 80.45401397 , 109.91771968 , 145.45848476, 174.97917064, 202.95581574, 238.10019812, 272.76385461, 314.21780672], [ 29.01971372 , 80.63048641 , 124.8368716 , 168.86146212 , 217.56970213, 260.0023587 , 301.53934072, 353.3734418 , 399.25958894, 452.68880711]]) diff = numpy.linalg.norm(ref_results - results) self.assertAlmostEqual(diff, 0.0, 6) ref_time_steps = numpy.array([ 1.25, 3.75, 6.25, 8.75, 11.25, 13.75, 16.25, 18.75, 21.25, 23.75]) diff = numpy.linalg.norm(ref_time_steps - time_steps) self.assertAlmostEqual(diff, 0.0, 8) ref_std_dev = numpy.array([[ 0.55062327 , 2.49729593 , 4.98805342 , 7.82646477 , 10.85497401, 14.13906215, 17.83387379, 22.42069464, 26.20482295, 30.35650154], [ 0.85240944 , 3.95282576 , 7.70942988 , 12.39500157 , 18.61789684, 24.71780818, 31.21412347, 39.48518175, 48.16868093, 58.69429153], [ 0.13806069 , 0.6470273 , 1.33255031 , 2.19971409 , 3.27811502, 4.38062279 , 5.50081855 , 6.82540746 , 8.33700723 , 10.19055301], [ 0.99209394 , 4.56092478 , 8.97847654 , 14.29873598 , 20.84046684, 27.47595651, 34.68217147, 43.77406499, 52.59000894, 62.96841965], [ 0.4869731 , 2.22337228 , 4.46934176 , 7.08957906 , 9.99360309, 13.09539481, 16.50011919, 20.68011712, 24.42476236, 28.67109723], [ 0.70036814 , 3.25258729 , 6.3936455 , 10.32002241 , 15.48281847, 20.57569786, 25.96138447, 32.74653167, 39.95555528, 48.70894069], [ 0.88975069 , 4.09754088 , 8.10024368 , 12.94487456 , 18.90879051, 24.96317829, 31.49377349, 39.68202523, 47.75293586, 57.29701788]]) diff = numpy.linalg.norm(ref_std_dev - std_dev) self.assertAlmostEqual(diff, 0.0, 6) ref_bin_counters = (58893, 58531, 57985, 58641, 57509, 57659, 57396, 57037, 56732, 56518) self.assertEqual(bin_counters, ref_bin_counters)
def testCalculationNonOrthogonal(self): """ Test a calculation with the on-the-fly MSD analysis. """ # Setup a system, a periodic 10 atoms long 1D chain. unit_cell = KMCUnitCell(cell_vectors=numpy.array([[2.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 2.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 diffusion process to the left. 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) interactions = KMCInteractions(processes=[p0, p1, p2, p3, p4, p5], implicit_wildcards=True) model = KMCLatticeModel(configuration=config, interactions=interactions) # Setup the analysis. msd = OnTheFlyMSD(history_steps=400, n_bins=10, t_max=25.0, track_type="B") # Setup the control parameters. control_parameters = KMCControlParameters(number_of_steps=4000, dump_interval=100, analysis_interval=1, seed=2013) # Run the model. model.run(control_parameters=control_parameters, analysis=[msd]) # Get the results out. results = msd.results() time_steps = msd.timeSteps() std_dev = msd.stdDev() bin_counters = msd.binCounters() # Compare against references. ref_results = numpy.array( [[ 10.36856672, 28.37170047, 44.38285764, 58.94374243, 72.11121737, 85.02318805, 98.58352498, 115.27324368, 126.49573433, 138.47100039 ], [ 16.05138132, 44.90792913, 68.59720617, 93.35093194, 123.68147594, 148.63693439, 172.54794759, 203.0082052, 232.5195128, 267.73366007 ], [ 2.59976568, 7.35085681, 11.8568078, 16.56678774, 21.77700882, 26.34223625, 30.40786814, 35.09199292, 40.24434182, 46.48414664 ], [ 26.41994804, 73.2796296, 112.98006381, 152.29467437, 195.79269332, 233.66012244, 271.13147258, 318.28144888, 359.01524713, 406.20466046 ], [ 12.9683324, 35.72255728, 56.23966543, 75.51053018, 93.88822619, 111.3654243, 128.99139313, 150.3652366, 166.74007615, 184.95514703 ], [ 18.651147, 52.25878594, 80.45401397, 109.91771968, 145.45848476, 174.97917064, 202.95581574, 238.10019812, 272.76385461, 314.21780672 ], [ 29.01971372, 80.63048641, 124.8368716, 168.86146212, 217.56970213, 260.0023587, 301.53934072, 353.3734418, 399.25958894, 452.68880711 ]]) diff = numpy.linalg.norm(ref_results - results) self.assertAlmostEqual(diff, 0.0, 6) ref_time_steps = numpy.array( [1.25, 3.75, 6.25, 8.75, 11.25, 13.75, 16.25, 18.75, 21.25, 23.75]) diff = numpy.linalg.norm(ref_time_steps - time_steps) self.assertAlmostEqual(diff, 0.0, 8) ref_std_dev = numpy.array([ [ 0.55062327, 2.49729593, 4.98805342, 7.82646477, 10.85497401, 14.13906215, 17.83387379, 22.42069464, 26.20482295, 30.35650154 ], [ 0.85240944, 3.95282576, 7.70942988, 12.39500157, 18.61789684, 24.71780818, 31.21412347, 39.48518175, 48.16868093, 58.69429153 ], [ 0.13806069, 0.6470273, 1.33255031, 2.19971409, 3.27811502, 4.38062279, 5.50081855, 6.82540746, 8.33700723, 10.19055301 ], [ 0.99209394, 4.56092478, 8.97847654, 14.29873598, 20.84046684, 27.47595651, 34.68217147, 43.77406499, 52.59000894, 62.96841965 ], [ 0.4869731, 2.22337228, 4.46934176, 7.08957906, 9.99360309, 13.09539481, 16.50011919, 20.68011712, 24.42476236, 28.67109723 ], [ 0.70036814, 3.25258729, 6.3936455, 10.32002241, 15.48281847, 20.57569786, 25.96138447, 32.74653167, 39.95555528, 48.70894069 ], [ 0.88975069, 4.09754088, 8.10024368, 12.94487456, 18.90879051, 24.96317829, 31.49377349, 39.68202523, 47.75293586, 57.29701788 ] ]) diff = numpy.linalg.norm(ref_std_dev - std_dev) self.assertAlmostEqual(diff, 0.0, 6) ref_bin_counters = (58893, 58531, 57985, 58641, 57509, 57659, 57396, 57037, 56732, 56518) self.assertEqual(bin_counters, ref_bin_counters)
def testCalculation(self): """ Test a calculation with the on-the-fly MSD analysis. """ # Setup a system, a periodic 10 atoms long 1D chain. 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 diffusion process to the left. 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) 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=1.0) interactions = KMCInteractions(processes=[p0, p1, p2, p3, p4, p5], implicit_wildcards=True) model = KMCLatticeModel(configuration=config, interactions=interactions) # Setup the analysis. msd = OnTheFlyMSD(history_steps=400, n_bins=10, t_max=25.0, track_type="B") # Setup the control parameters. control_parameters = KMCControlParameters(number_of_steps=4000, dump_interval=100, analysis_interval=1, seed=2013) # Run the model. model.run(control_parameters=control_parameters, analysis=[msd]) # Get the results out. results = msd.results() time_steps = msd.timeSteps() std_dev = msd.stdDev() bin_counters = msd.binCounters() # Compare against references. ref_results = numpy.array([ [ 2.59214168, 7.09292512, 11.09571441, 14.73593561, 18.02780434, 21.25579701, 24.64588125, 28.81831092, 31.62393358, 34.6177501 ], [ 2.65374493, 7.10317609, 10.90626886, 14.87948705, 18.25169973, 21.00603548, 22.97611332, 25.57822115, 28.87848128, 32.2240879 ], [ 2.59976568, 7.35085681, 11.8568078, 16.56678774, 21.77700882, 26.34223625, 30.40786814, 35.09199292, 40.24434182, 46.48414664 ], [ 5.24588661, 14.19610121, 22.00198327, 29.61542266, 36.27950408, 42.2618325, 47.62199456, 54.39653208, 60.50241486, 66.841838 ], [ 5.19190736, 14.44378193, 22.9525222, 31.30272335, 39.80481316, 47.59803326, 55.05374939, 63.91030384, 71.8682754, 81.10189674 ], [ 5.2535106, 14.45403291, 22.76307666, 31.44627479, 40.02870855, 47.34827174, 53.38398146, 60.67021407, 69.1228231, 78.70823454 ], [ 7.84565228, 21.54695802, 33.85879107, 46.1822104, 58.05651289, 68.60406875, 78.02986271, 89.48852499, 100.74675668, 113.32598464 ] ]) diff = numpy.linalg.norm(ref_results - results) self.assertAlmostEqual(diff, 0.0, 6) ref_time_steps = numpy.array( [1.25, 3.75, 6.25, 8.75, 11.25, 13.75, 16.25, 18.75, 21.25, 23.75]) diff = numpy.linalg.norm(ref_time_steps - time_steps) self.assertAlmostEqual(diff, 0.0, 8) ref_std_dev = numpy.array( [[ 0.13765582, 0.62432398, 1.24701335, 1.95661619, 2.7137435, 3.53476554, 4.45846845, 5.60517366, 6.55120574, 7.58912539 ], [ 0.14092726, 0.62522628, 1.22572215, 1.97567674, 2.7474467, 3.49323106, 4.1564055, 4.97497483, 5.98245856, 7.06437139 ], [ 0.13806069, 0.6470273, 1.33255031, 2.19971409, 3.27811502, 4.38062279, 5.50081855, 6.82540746, 8.33700723, 10.19055301 ], [ 0.19698798, 0.88356546, 1.74848804, 2.780551, 3.86164462, 4.96954405, 6.09163579, 7.48129474, 8.86263902, 10.36158694 ], [ 0.19496101, 0.89898111, 1.82402696, 2.93896933, 4.23688379, 5.59702476, 7.04227937, 8.7897482, 10.52755635, 12.57213116 ], [ 0.19727427, 0.89961913, 1.8089718, 2.95244717, 4.26071555, 5.56765545, 6.82868861, 8.34413034, 10.12539137, 12.20107405 ], [ 0.24054939, 1.09498957, 2.19698279, 3.54031591, 5.04564022, 6.58676948, 8.14969886, 10.04910241, 12.04968783, 14.34371883 ]]) diff = numpy.linalg.norm(ref_std_dev - std_dev) self.assertAlmostEqual(diff, 0.0, 6) ref_bin_counters = (58893, 58531, 57985, 58641, 57509, 57659, 57396, 57037, 56732, 56518) self.assertEqual(bin_counters, ref_bin_counters)