Klaster Wydziału Chemii UJ

Prof. dr hab. Jacek Korchowiec

Uniwersytet Jagielloński
Wydział Chemii
Zakład Chemii Teoretycznej im. prof. Kazimierza Gumińskiego
ul. Gronostajowa 2
tel: +48-12-6862379
e-mail: korchow@chemia.uj.edu.pl
p. C3-05






CZŁONKOWIE GRUPY



Obliczenia

GAMESS

GAMESS jest pakietem do obliczeń kwantowo-chemicznych. Jest od dziesiątków lat dostępny dla społeczności akademickiej. Licencja na pakiet obliczeniowy GAMESS jest bezpłatna, tak dla użytkowników akademickich, jak i przemysłowych. GAMESS jest rozwijany przez grupę Gordona, która posiada wyłączność na dystrybucję programu. W trakcie pobierania GAMESS’a przyjmujesz ogólne warunki umowy licencyjnej. Nazwa pakietu to skrót złożony z pierwszych liter następującego wyrażenia „the General Atomic and Molecular Electronic Structure System”. Pakiet posiada wiele funkcjonalności: metody półempiryczne, metody ab initio, wśród nich metoda Hartree-Focka (HF), metody post-HF, metoda Kohna-Shama, szereg metod fragmentacyjnych, modele ciągłego ośrodka, etc. Zachęcam do przejrzenia pełnej dokumentacja. Warto zwrócić uwagę na te metody, które są rozwijane ośrodku głównego dewelopera oprogramowania.

Od ponad 10 lat oprogramowanie GAMESS jest używane na Wydziale Chemii w zajęciach z modelowania molekularnego. Profesor Artur Michalak opracował szereg ćwiczeń, które są przerabiane na laboratoriach komputerowych z Podstaw Chemii Kwantowej i Modelowania molekularnego metodami chemii kwantowej. Dostęp do tych ćwiczeń ma każdy student w trakcie wymienionych kursów laboratoryjnych. Z myślą o studentach, których interesuje ten rodzaj aktywności naukowej, zamieszczam kilka przydatnych rad, które pozwolą podjąć pierwsze próby przeniesienia własnych pomysłów naukowych (wydajniejsze algorytmy, własności molekularne, etc.) do środowiska GAMESS. Potrzebna jest do tego znajomość języka FORTRAN 77. Na końcu zamieściłem też informację jak zainstalować GAMESS’a pod systemem Windows, dla tych studentów, którzy są zainteresowani wykonaniem ćwiczeń laboratoryjnych w domu. Osobiście rekomenduję instalację pod systemem LINUX, mamy wtedy dostęp do kodów źródłowych i można poznać bardziej praktyczne strony chemii kwantowej. Zakładam, że przystąpisz do tej czynności po zaznajomieniu się z teorią.



Jak zdefiniować wektory i macierze w procedurze, którą chcemy dołączyć do pakietu GAMESS?

Zdecydowana większość procedur w pakiecie GAMESS napisana jest w Fortran77. Można użyć znanych reguł tego języka aby zadeklarować statycznie macierze i wektory na potrzeby pisanej przez nas procedury. Bardziej efektywne jest użycie obszaru pamięci roboczej, który został zadeklarowany przez pakiet GAMESS na etapie inicjalizacji obliczeń kwantowo-chemicznych. Poniżej znajduje się wyjaśnienie jak to zrobić.

  • W pisanej procedurze deklarujemy blok wspólny

                  COMMON /FMCOM / XX(1)

    Upewnij się, że zmienna tablicowa XX jest zadeklarowana w podwójnej precyzji. [np. IMPLICIT DOUBLE PRECISION(A-H,O-Z)]. Oczywiście zmienną tablicową możemy nazwać jak nam się podoba, niemniej, w większości procedur GAMESS’a używana jest nazwa X lub XX. FMCOM to nazwa bloku wspólnego, tej nazwy nie możemy modyfikować.
  • Sprawdź pozycję od której możesz wykorzystać przestrzeń XX. Przestrzeń XX zapisywana jest sekwencyjnie. Stosowną informację uzyskasz wywołując procedure “VALFM”.

                  LOADFM = 0
                  CALL VALFM(LOADFM)

    Procedura wraca ostatnią zapisaną pozycję (liczba typu całkowitego) w obszarze roboczym .Następna pozycja jest już do naszej dyspozycji.
  • Przydzielenia pamięci: załóżmy, że chcesz zadeklarować macierz trójkątną D (macierz symetryczna), macierz kwadratową C i wektor V. Wymiar liniowy wszystkich obiektów jest równy liczbie funkcji bazy (NUM). Obliczamy ile elementów obszaru roboczego musimy zażądać:

                  LL1 = (NUM +1)*NUM/2
                  LL2 = NUM*NUM
                  LL3 = NUM
  • Ustawiamy wskaźniki dla każdego z obiektów (wygodnie jest użyć w nazwie wskaźnika nazwy obiektu),

                  LD      = LOADFM + 1
                  LC      = LD + LL1
                  LV      = LC + LL2
                  LAST = LV + LL3

    Zmienne typu całkowitego: LL1 - wymiar macierzy trójkątnej, LL2 – wymiar macierzy kwadratowej, LL3 – wymiar wektora. Jeżeli robisz modyfikację istniejącej procedury, musimy się upewnić, że nazwy wskaźników (LD, LC i LV) nie były już gdzieś używane.
  • Obliczamy nasze zapotrzebowanie:

                  NEED = LAST – LOADFM - 1
  • Sprawdzenie dostępności i rezerwacja pamięci na potrzeby naszej procedury:

                  CALL GETFM(NEED)

    Teraz możemy używać macierze XX(LC), XX(LD) I XX(LV) w naszej procedurze. Zauważmy, że wszystkie są traktowane jako obiekty liniowe. Musimy pamiętać o konwencji zapisu macierzy w języku FORTRAN. W przypadku, gdy zażądamy większego przydziału pamięci niż zadeklarowano na początku obliczeń program zostanie przerwany, a w pliku wynikowym pojawi się informacja: “ERROR: MEMORY REQUEST EXCEEDS AVAILABLE MEMORY”. Musisz wtedy skorygować plik „inputowy” (słowo kluczowe MEMORY w grupie $SYSTEM $END).
  • Zwolnienie pamięci: na końcu musimy zwolnić pamięć, wywołując procedurę „RETFM”.

                  CALL RETFM(NEED)

    Jeżeli tego nie zrobimy to w pliku wynikowym pojawi się informacja “LEAK OF MEMORY”. Najczęściej obliczenia zostaną zakończone, niemniej musimy skorygować naszą procedurę.

    Jak zdefiniować własną grupę (ewentualnie przedefiniować istniejącą, wprowadzając nowe słowa kluczowe)?

    Jeżeli napisałeś już fragment kodu, to warto się zastanowić czy nie zdefiniować grupy. Aby to zrobić musisz poznać procedurę „NAMEIO” (SUBROUTINE NAMEIO). Znajduje się ona w pliku nameio.src. Procedura pozwala zdefiniować grupę zawierającą do 64 słów kluczowych. Każde ze słów kluczowych może być wektorem. Jako przykład przeanalizujmy grupę “$ELG $END”.


                  CALL NAMEIO(IR,JRET,ELG,NNAM,ELGNAM,KELGNM,
                *           NELONG,NATM,NASPIN,NCT,NBNDAB,NTMLB,IPRI,LDOS,I2EA,
                *           SKPCUT,ATOB,NSPACE, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
                *           0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0)

    Znaczenie zmiennych:

    IR – numer urządzenia, z którego będą czytane dane
    JRET – zmienna informująca o przebiegu wykonania procedury, tzw. „error code”. Wartość zmiennej informuje o przebiegu wykonania procedury: JRET=0 oznacza normalny przebieg wykonania procedury, JRET=1 oznacza brak danych, JRET=2 oznacza błąd składni.
    ELG – nazwa grupy w formacie H (double precision)
    NNAM – liczba słów kluczowych w grupie grupie
    ELGNAM – macierz z nazwami słów kluczowych. Wszystkie nazwy w formacie H (double precision).
    KELGNM – macierz typu integer zawierająca informacje o każdym słowie kluczowym: 0 – LOGICAL; 1 – INTEGER; 2 – REAL*4 (SINGLE PRECISION); 3 – REAL*8 (DOUBLE PRECISION); 4 – 4 literowy łańcuch znaków (SINGLE PRECISN); 5 – 8 literowy łańcuch znaków (DOUBLE PRECISN)

    Sześć parametrów z pierwszej linijki zawiera informację o całej grupie, pozostałe 64 elementy mogą być użyte jako słowa kluczowe. Grupa “ELG” używa 12 elementów: NELONG, NATM, NASPIN, NCT, NBNDAB, NTMLB, IPRI, LDOS, I2EA, SKPCUT, ATOB, and NSPACE. Nieużywane element są wypełnione zerami (“0”).

    Aby napisać własny fragment kodu do GAMESS'a musisz znać zawartość dwóch bloków wspólnych: pierwszy o nazwie INFOA, a drugi o nazwie IOFILE. Blok wspólny INFOA ma postać:

                  COMMON /INFOA / NAT,ICH,MUL,NUM,NQMT,NE,NA,NB,
                * ZAN(MXATM),C(3,MXATM),IAN(MXATM)

    NAT – liczba atomów w układzie
    ICH – ładunek całkowity układu
    MUL – multipletowość układu
    NUM – liczba orbitali atomowych (wymiar bazy funkcyjnej)
    NQMT – liczba orbitali molekularnych
    NA – liczba elektronów alfa
    NB – liczba elektronów beta
    ZAN(MXATM) – Macierz z liczbami atomowymi, zadeklarowana jako real*8, parametr MXATM to maksymalna dopuszczalna liczba atomów. Część macierzy w GAMESSie jest zadeklarowana statycznie, niekiedy aby przeprowadzić obliczenia dla dużych układów molekularnych należy przedefiniować statyczne wymiary macierzy (Znajdują się w dyrektywie parameter). Istnieje skrypt aby zmienić je automatycznie, trzeba tylko sprawdzić, czy nie przekroczyło się 72 kolumny.
    C(3,MXATM) – współrzędne kartezjańskie atomów układu molekularnego
    IAN(MXATM) – liczba atomowa jako liczba typu integer


    Zawartość bloku wspólnego IOFILE przedstawiono poniżej:

                  COMMON /IOFILE/ IR,IW,IP,IS,IPK,IDAF,NAV,IODA(950)

    Blok zawiera numery urządzeń. Najważniejszy to IR – standardowe urządzenie wejścia (plik wsadowy z rozszerzeniem "inp"), IW – standardowe urządzenie wyjścia (w zasadzie ekran monitora lub plik na który przekierowujesz strumień w linii wywołującej GAMESS’a). Bardzo ważne są tu dwie zmienne IDAF i IODA(950). Aby czytać dane z pliku bezpośredniego dostępu (DAF, direct access file) musisz mieć ten common blok w swojej procedurze. Daje on dostęp do wszystkich wcześniej wyznaczanych macierzy np.:

                  CALL DAREAD(IDAF,IODA,X(LD),LL1,16,0)

    Wywołując procedurę DAREAD wczytujemy macierz gęstości (XD I LL1 wyjaśniono wcześniej, 16 to numer rekordu gdzie przechowywana jest macierz gęstości elektronów alfa. Pełen opis wszystkich rekordów znajdziesz w rozdziale piątym pełnej dokumentacji GAMESS'a (Section 5 - Programmer's Reference). Znajdziesz tam też pełen opis wszystkich plików zakładanych przez GAMESS’a. Część z tych plików jest wyrzucanych po zakończeniu obliczeń. Na DAF możesz także zapisywać, musisz być wtedy pewnien tego co robisz, wywołując procedurę:

                  CALL DAWRIT(IDAF,IODA,X(LD),LL1,16,0)

    zapisujesz wyznaczoną przez siebie macierz gęstości elektronów alfa do DAF.







  • GAUSSIAN

    AIMALL

    TERACHEM

    NAMD



    Grafika

    VMD

    MOLDEN

    GABEDIT

    GAUSS VIEW/h2>

    CHEM3D

    AVOGADRO