KodHTML

poniedziałek, 27 stycznia 2020

Algorytm rysowania nanorurek o zadanej średnicy oraz długości (wrzesień 2016)

    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


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:


Obraz wygenerowany za pomocą programu Gabedit

Brak komentarzy:

Prześlij komentarz