mhoffman / kmos

kMC on steroids: A vigorous attempt to make lattice kinetic Monte Carlo modelling easier
http://mhoffman.github.com/kmos/
GNU General Public License v3.0
53 stars 35 forks source link

Lattice Angles and Periodic Boundaries #50

Open vpasumarthi opened 8 years ago

vpasumarthi commented 8 years ago

Hi Max,

I am working with a diffusion-only model (model._put([0,0,0,1],model.proclist.co)) in 3D hematite crystal structure.

1) How to define lattice angles in lattice configuration to implement non-orthorhombic crystal geometries?

2) When I test diffusion in a single unit cell (simulation_size=1) without PBC (pbc=np.array([False, False, False], dtype=bool)), I still see that the processes relating to diffusion across unit cells are still available (model.print_accum_rate_summation()) and executed (model.print_coverages()). How can I avoid this and constrain the diffusion at the boundaries?

Thanks, Vish.

mhoffman commented 8 years ago

1) How to define lattice angles in lattice configuration to implement non-orthorhombic crystal geometries?

There are two aspects to having orthorombic vs. non-orthorombic unit cells in kmos. The first is to make all the correct connectivities by e.g. diffusion processes. This part is entirely up to the user but as far as the resulting kinetics (coverages, rates, etc.) are concerned this is the only part which matters. The second is to give this a correct representation on screen, which is certainly nice for debugging, analysis, presentation but not relevant for the kinetics. Have you looked at this Pt(111) example?[1] It should work for 3d models just the same.

2) When I test diffusion in a single unit cell (simulation_size=1) without PBC (pbc=np.array([False, False, False], dtype=bool)), I still see that the processes relating to diffusion across unit cells are still available (model.print_accum_rate_summation()) and executed (model.print_coverages()). How can I avoid this and constrain the diffusion at the boundaries?

This PBC argument is merely a remnant because the code uses ASE Atoms[2] objects for convenient representation but it has no effect. If you want explicitly suppress periodic boundary conditions the recommend way is to introduce some new kmos species (say inactive, dead, or something like that) which does not participate in any reactions and fill up the edges with this inactive species in the kmc_settings.py/`def setup_model``. Please feel free to adapt the following snippet to your 3d system

X, Y, Z = model.lattice.system_size
for x in range(X):
    model._put([x, Y - 1, 0, 1], model.proclist.inactive)
    model._put([x, 0, 0, 1], model.proclist.inactive)

for y in range(Y):
    model._put([0, y, 0, 1], model.proclist.inactive)
    model._put([X - 1, y, 0, 1], model.proclist.inactive)
model._adjust_database()

[1] https://github.com/mhoffman/kmos/blob/master/examples/render_Pt_111.py [2] https://wiki.fysik.dtu.dk/ase/ase/atoms.html

vpasumarthi commented 8 years ago

Thanks a lot Max. That totally helped. Now, I am attempting to evaluate RMSD of the diffusing species using model.procstat, which however outputs the process counter for all species together. Is there a way I can obtain the procstat data for each individual species??