msspec_python3/doc/source/tutorials/MgO/MgO.py

69 lines
1.9 KiB
Python
Raw Normal View History

# coding: utf-8
from msspec.calculators import PED
from msspec.utils import *
from ase.build import bulk
from ase.visualize import view
from matplotlib import pyplot as plt
import sys
a0 = 4.21 # The lattice parameter in angstroms
n = 2 # An integer useful to tweak the size of
# the cluster
#all_n = (1., 1.5, 2.)
all_n = (1., 1.5)
level = '2p3/2'
if False:
for n_idx, n in enumerate(all_n):
# Create the copper cubic cell
cluster = bulk('MgO', crystalstructure = 'rocksalt', a = a0, cubic = True)
# Repeat the cell many times along x, y and z
x = int(4*n)
cluster = cluster.repeat((x, x, x))
# Put the center of the structure at the origin
center_cluster(cluster)
# Keep atoms inside a given radius
cluster = cut_sphere(cluster, radius = n*a0 + .01)
# Keep only atoms below the plane z <= 0
cluster = cut_plane(cluster, z = 0.1)
# Set the absorber (for example the deeper atom in z,
# centered in the x-y plane)
cluster.absorber = get_atom_index(cluster, 0,0,-a0)
#view(cluster)
#continue
# Create a calculator for the PhotoElectron Diffration
calc = PED(folder = 'calc' + str(n_idx))
# Set the cluster to use for the calculation
calc.set_atoms(cluster)
# Run the calculation
calc.get_theta_scan(level = level)
calc.save('data%s.msp' % str(n_idx))
#import sys
#sys.exit()
calc = PED()
ax = plt.subplot(111)
for i, n in enumerate(all_n):
calc.load('data{:d}.msp'.format(i))
x, y, _ = calc.get_results()
#y = y/max(y)
ax.plot(x, y, label = '{:d} atoms (n = {:.1f})'.format(len(calc.get_atoms()), n) )
ax.legend()
ax.grid(True)
ax.set_xlabel(r'$\theta$ ($\degree$)')
ax.set_ylabel(r'Normalized intensity')
ax.set_title(r'Polar scan of Mg({}) @ {:.2f} eV'.format(level, calc.parameters['kinetic_energy'][0]))
plt.show()