Zainteresował mnie w pewnej chwili następujący problem. Jak narysować nanorurkę? W sieci znajduje się ogromna liczba wspaniałych wizualizacji nanorurek. Chciałem zrobić podobny obrazek, który byłby edytowalny za pomocą popularnych programów do grafiki molekularnej.
Początkowo myślałem, że najłatwiej będzie stworzyć zbiór współrzędnych atomów węgla z wykorzystaniem macierzy Z, czyli zbioru współrzędnych wewnętrznych. Pierwsze próby pokazały, że nie jest to takie proste, jak mi się wydawało. Miałem nie tylko problem z ustaleniem kątów dwuściennych, które organizują skręcenie się płaszczyzny grafenu w rurkę. Nie umiałem zautomatyzować dobudowywania kolejnych elementów nanorurki. Następny pomysł był szczęśliwszy. Zastanawiając układami współrzędnych, wymyśliłem, że nanorurki ładnie można opisać za pomocą walcowego układu współrzędnych. Poszedłem w tym kierunku i po kilku godzinach miałem program, który liczył współrzędne atomów węgla nanorurki. Algorytm napisany w VBA ma postać:
Sub rurka()
Pi = 3.14159265358979
ro = 1.984638463 'dla dziesięciokąta promień nanorurki
'ro = 3.21414489359589 'dla szesnastokąta
'ro = 4.538637648 'dla dwudziestokąta
lat_w_warstwie = 10 'liczba atomów w warstwie
krokfi = 2 * Pi / lat_w_warstwie 'krok zmiany kąta we współrzednych walcowych
l_warstw = 20 'liczba warstw
lat = lat_w_warstwie * l_warstw 'całkowita liczba atomów tworząctych nanorurkę
h = 0.71 'różnica współrzędnej z w warstwie
fi = 0 'początkowy kąt wsp. walcowych
Cells(1, 1) = lat 'zapis liczby atomów w arkuszu
przesuniecie = h + 1.42
a = 0
For J = 1 To l_warstw
fi = a * krokfi
z_warstwa = a * przesuniecie
For i = 1 To lat_w_warstwie
x = ro * Cos(fi)
y = ro * Sin(fi)
If Int(i / 2) <> i / 2 Then 'rysowanie "zygzaka" w warstwie
Z = z_warstwa + h
Else
Z = z_warstwa
End If
Cells(i + a * lat_w_warstwie + 2, 1) = "C" 'zapis symboli w i współrzędnych do arkusza
Cells(i + a * lat_w_warstwie + 2, 2) = x
Cells(i + a * lat_w_warstwie + 2, 3) = y
Cells(i + a * lat_w_warstwie + 2, 4) = Z
fi = fi + krokfi
Next i
a = a + 1
Next J
End Sub
Sub rurka()
Pi = 3.14159265358979
ro = 1.984638463 'dla dziesięciokąta promień nanorurki
'ro = 3.21414489359589 'dla szesnastokąta
'ro = 4.538637648 'dla dwudziestokąta
lat_w_warstwie = 10 'liczba atomów w warstwie
krokfi = 2 * Pi / lat_w_warstwie 'krok zmiany kąta we współrzednych walcowych
l_warstw = 20 'liczba warstw
lat = lat_w_warstwie * l_warstw 'całkowita liczba atomów tworząctych nanorurkę
h = 0.71 'różnica współrzędnej z w warstwie
fi = 0 'początkowy kąt wsp. walcowych
Cells(1, 1) = lat 'zapis liczby atomów w arkuszu
przesuniecie = h + 1.42
a = 0
For J = 1 To l_warstw
fi = a * krokfi
z_warstwa = a * przesuniecie
For i = 1 To lat_w_warstwie
x = ro * Cos(fi)
y = ro * Sin(fi)
If Int(i / 2) <> i / 2 Then 'rysowanie "zygzaka" w warstwie
Z = z_warstwa + h
Else
Z = z_warstwa
End If
Cells(i + a * lat_w_warstwie + 2, 1) = "C" 'zapis symboli w i współrzędnych do arkusza
Cells(i + a * lat_w_warstwie + 2, 2) = x
Cells(i + a * lat_w_warstwie + 2, 3) = y
Cells(i + a * lat_w_warstwie + 2, 4) = Z
fi = fi + krokfi
Next i
a = a + 1
Next J
End Sub
W arkuszu pojawiają się się wyniki zapisane we współrzędnych xyz. Wystarczy je skopiować do pliku tekstowego i zapisać na dysku. Plik można otworzyć w programie do grafiki molekularnej, który obsługuje format xyz. Ustawienia programu dają współrzędne dla rurki, która na obwodzie ma 10 atomów węgla.
![]() |
Obraz wygenerowany za pomocą programu Jmol |
Poniżej przedstawiam jeszcze rurkę z dwudziestoma atomami węgla na obwodzie:
Brak komentarzy:
Prześlij komentarz