In [3]:
%%HTML
<link rel="stylesheet" type="text/css" href="custom.css">
In [4]:
# Import potrzebnych modułów
from ase.build import bulk, graphene_nanoribbon, nanotube, surface
from ase.spacegroup import crystal
from ase import units
import ase.io
from IPython.core.display import Image
import nglview
Wszelkiego rodzaju wizualizacje są niezwykle ważnym elaementem pracy badawczej.
Niestety także:
Poniższe ćwiczenia prezentują proste techniki tworzenia struktur atomowych (klastrów, kryształów, powierzchni) oraz wizualizacji uzyskanych układów. Istnieją liczne narzędzia służące do tego celu. Wiele z nich pozwala tworzyć wyrafinowane i piękne wizualizacje. Tutaj przedstawione są jedynie techniki możliwe do zastosowania w środowisku Jupyter na obecnym etapie jego rozwoju. Dokumentacja środowiska Jupyter, języka Python, jego powłoki IPython oraz podstawowych używanych tutaj bibliotek znajduje się w menu Help powyżej oraz na stronach internetowych projektów. Funkcje dotyczące obliczeniowej fizyki materiałowej zawarte są w bibliotece ASE - jej obszerna dokumentacja znajduje się na stronie projektu.
In [5]:
diament=bulk(name='C', crystalstructure='diamond', a=4, cubic=True)
In [6]:
ase.io.write('diament.png', # Nazwa pliku
diament, # obiekt zawierający definicję struktury
show_unit_cell=2, # Rysowanie komórki elementarnej
rotation='115y,15x', # Obrót 115st wokół osi Y i 15st wokół osi X
scale=30) # Skala
In [7]:
Image(filename='diament.png')
Out[7]:
In [22]:
view = nglview.show_ase(diament)
view.add_unitcell(); view.camera='orthographic';
view.add_spacefill(); view.center(); view
In [19]:
view.update_spacefill(radiusType='covalent', scale=1.0)
view.parameters=dict(clipDist=-100);
In [20]:
view.update_spacefill(radiusType='covalent', scale=1.0, assembly='SUPERCELL')
In [21]:
view.clear_representations(); view.add_unitcell(); view.add_ball_and_stick()
view.update_ball_and_stick(radiusType='covalent', scale=0.4, assembly='UNITCELL')
In [12]:
a=4.3596 # Stała sieci w Angstromach
SiC = crystal(['Si', 'C'], # Lista pierwiastków w krysztale
[(0, 0, 0), (0.25, 0.25, 0.25)], # Pozycje atomów (jako ułamki stałych sieci)
spacegroup=216, # Numer grupy symetrii (216 = Blenda Cynkowa = F-43m)
cellpar=[a, a, a, 90, 90, 90]) # Komórka elementarna (a, b, c, alpha, beta, gamma)
In [13]:
# Narysujmy większy fragment struktury
# Tym razem wyświetlony z użyciem zewnętrznego programu povray
bSiC=SiC.repeat(3)
ase.io.write('bSiC.pov', bSiC, show_unit_cell=2, rotation='115y,15x', run_povray=True)
Image(filename='bSiC.png')
Out[13]:
Biblioteka ASE udostępnia także funkcje wspomagające konstrukcję bardziej złożonych struktur: nanotaśm, nanorurek, powierzchni i wielu innych. Można także łatwo tworzyć struktury przy pomocy własnych procedur.
Aby sobie ułatwić życie zdefiniujemy własną funkcję wyświetlającą struktury:
In [14]:
def show_cryst(struct, uc=True):
view = nglview.show_ase(struct)
view.parameters=dict(clipDist=-100)
if uc : view.add_unitcell()
view.camera='orthographic'
view.add_spacefill(radiusType='covalent', scale=0.5)
view.center()
return view
In [15]:
# Nanotaśma grafitowa
gnr = graphene_nanoribbon(4, 12, type='zigzag', saturated=True)
show_cryst(gnr, uc=False)
In [16]:
# Nanorurka
cnt = nanotube(6, 7, length=12, bond=1.4)
show_cryst(cnt,uc=False)
In [17]:
# Powierzchnia (1,0,0) molibdenu
Mo = bulk('Mo', 'bcc', a=3.16, cubic=True)
s = surface(Mo, (1, 0, 0),3, vacuum=10)
show_cryst(s.repeat((5,5,1)))
In [ ]: