You are on page 1of 32

UNIWERSYTET MARII CURIE-SKŁODOWSKIEJ

w Lublinie
WYDZIAŁ CHEMII

Michał Żukowski

SYMULACYJNE WYZNACZANIE
ENERGETYCZNEJ GĘSTOŚCI STANÓW

Praca licencjacka wykonana w


Zakładzie Modelowania Procesów Fizykochemicznych
pod kierunkiem
prof. dr hab. Małgorzaty Borówko

LUBLIN 2008
Składam najserdeczniejsze podziękowania
Pani prof. dr hab. Małgorzacie Borówko oraz
Panu dr Wojciechowi Rżysko
za wszystkie cenne uwagi oraz wskazówki, które
przyczyniły się do ulepszenia ostatecznego
kształtu pracy

Spis Treści

Rozdział 1. Wstęp ............................................................................................ 4

2
Rozdział 2. Model Isinga ................................................................................ 5
Rozdział 3. Wyznaczanie energetycznej gęstości stanów ............................ 7
3.1. Definicja energetycznej gęstości stanów .............................................. 7
3.2. Opis algorytmu Wanga-Landau'a .......................................................... 7
3.3. Wielości termodynamiczne możliwe do otrzymania w wyniku
działania algorytmu............................................................................... 11
Rozdział 4. Sposób implementacji algorytmu .............................................. 12
4.1. Wybór formatu liczb ............................................................................. 12
4.2. Wykorzystanie reprezentacji loge .......................................................... 13
4.3. Sposób korzystania z programu ............................................................ 15
Rozdział 5. Zastosowanie metoda do dwuwymiarowego modelu Isinga
na sieci kwadratowej jako test programu ................................. 18
Bibliografia ...................................................................................................... 28
Dodatki ............................................................................................................. 29
Kod źródłowy części programu odpowiedzialnej za obliczenia ................. 30

1. Wstęp

Symulacje komputerowe stały się od pewnego czasu ważnym narzędziem

3
badania skomplikowanych układów. Znalazły zastosowanie w chemii, fizyce, biochemii
oraz wielu innych dziedzinach. Jedną z najczęściej stosowanych metod symulacyjnych
jest metoda Monte-Carlo. Metodę tą zaproponowali John von Neumann wraz
z Stanisławem Ulamem [1] do badania procesu spowalniania neutronów, w trakcie prac
nad projektem Manhattan mającym na celu zbudowanie bomby atomowej. Zaskakująca
nazwa metody wiąże się z wykorzystywanymi w trakcie jej stosowania licznymi
losowaniami, co kojarzy się z grą w ruletkę i kasynami. Zastosowania tej metody
w fizyce opierają się na zasadach termodynamiki statystycznej. Opracowano szereg
schematów prowadzenia procesów symulacyjnych, które pozwalają otrzymać poprawne
wartości potrzebnych wielkości fizycznych.

Jedną z bardzo potrzebnych w dalszych obliczeniach wielkości jest


tzw. energetyczna gęstość stanów. Jej wyznaczeni jest trudne i wymaga stosowania
zaawansowanych i kosztownych obliczeniowo metod symulacyjnych. W tej pracy
przedstawiam metodą opracowaną przez F. Wanga oraz D.P. Landau'a. Opiszę sposób
implementacji tego algorytmu i przykłady jego zastosowania do opisu modelu Isinga

2. Model Isinga
Jednym z najważniejszych modeli termodynamicznych jest bez wątpienia model
Isinga [2-4]. Stworzony został do badań ferromagnetyków. Można go jednak
zastosować do wielu innych układów. Model zakłada istnienie periodycznej

4
D-wymiarowej sieci, w której węzłach umieszczone są spiny o dwóch możliwych
dyskretnych wartościach (+1, -1). Sama sieć nie ma z góry narzuconej budowy.
W poniższej pracy wykorzystano sieć dwuwymiarową o strukturze kwadratowej.
Budowę sieci można opisać podaniem wymiaru D oraz parametru κ określającego ilość
najbliższych sąsiadów dowolnego węzła w sieci. Dla κ = 4 oraz D = 2 otrzymujemy
sieć kwadratową (regularną). Sieć trójkątną (heksagonalną) otrzymujemy dla κ = 6.
Poniżej przedstawiono przykłady siatek używanych w modelu Isinga.

a)

1 2 3 4 N-3 N-2 N-1 N

b)
1 2 3 ....

.... N-2 N-1 N


Rysunek 1: Przykłady siatek

a) jednowymiarowej (D = 1)

b) dwuwymiarowej dla κ = 4 i D = 2
(kwadratowej)

Dodatkowo założono, iż całkowita ilość węzłów sieci jest tak dużą, że warunki
brzegowe nie wpływają na własności fizyczne rozpatrywanych modeli. Hamiltonian dla
modelu Isinga możemy opisać wzorem

5
E=− ∑ J ij s i s j B ∑ S i (2.1)
〈i , j 〉 i

gdzie Jij jest energią oddziaływania między spinami. Dla uproszczenia przyjmuje się,
że oddziaływania są izotropowe tzn. Jij = Jconst dla całej sieci. B oznacza pole zewnętrzne
zaś si, sj reprezentują wartości spinów. Pierwsze sumowanie we wzorze (2.1) przebiega
po wszystkich parach najbliższych sąsiadów, drugie po wszystkich miejscach
sieciowych.

Model Isinga został rozwiązany dla jednowymiarowego przypadku przez Ernsta


Isinga w jego pracy doktorskiej [2] z 1925 roku. Dla modelu jednowymiarowego nie
występuje przejście fazowe. Dla dwuwymiarowego rozwiązanie zostało podane dla
zerowego pola zewnętrznego (gdzie B = 0) przez Larsa Onsagera w 1944 roku [5],
który jednocześnie zauważył istnienie przejścia fazowego dla modelu 2D. Rozwiązanie
dla dwuwymiarowego modelu Isinga z polem zewnętrznym podał Zamolodchikov [6].
Badano również model Isinga dla sieci skończonych, dla których ścisłe rozwiązanie
podał Beale [7]. Prace nad ścisłym rozwiązaniem dla modelu trójwymiarowego ciągle
trwają [8].

3. Wyznaczanie energetycznej gęstości stanów


3.1 Definicja energetycznej gęstości stanów

6
Gęstością stanów nazywamy ilość wolnych stanów energetycznych w jednostce
objętości i w jednostkowym przedziale energii od E do E+ΔE.

3.2 Opis algorytmu Wanga-Landau'a

Fizyka statystyczna daje ścisłą receptę dzięki, której można opisać stan
dowolnego układu. Wymaga ona jednak znajomości wszystkich mikrostanów,
w których znaleźć się może się ten układ co w praktyce okazuje się niewykonalne. Dla
układów izolowanych o stałej energii liczbę możliwych mikrostanów określa
mikrokanoniczna suma stanów Ω. W przypadku układów o stałej liczbie cząstek
będącej w równowadze termicznej z otoczeniem wielkością taką jest kanoniczna suma
stanów (funkcja rozdziału) zdefiniowana jako

Z =∑ E g  E e− β E (3.1)

gdzie g  E =Ω E  jest gęstością energetyczną stanów zaś β=1/ kT przy czym
k jest stałą Bolzmanna a T temperaturą bezwzględną. Dla układów otwartych taką rolę
pełni wielka kanoniczna suma stanów Ξ. Wielkości Ω, Z, Ξ są ściśle powiązane
ze wszystkimi wielkościami termodynamicznymi charakteryzującymi układ. Obliczenie
ich stanowi więc klucz do rozwiązania każdego problemu. Niestety, dokładne obliczenie
sumy stanów jest możliwe tylko dla kilku najprostszych układów. W większości
przypadków konieczne jest wprowadzanie poważnych przybliżeń. Aby ominąć ten
problem opracowano metodę Monte Carlo, w której generuje się kolejne stany układu
zgodnie z rozkładem prawdopodobieństwa charakterystycznym dla danego zespołu
statystycznego i oblicza średnie wartości potrzebnych wielkości fizycznych. Metoda
taka nie wymaga bezpośredniego obliczania sumy stanów. Najczęściej w takich
symulacjach stosuje się schemat opracowany przez Metropolisa i współpracowników
[9]. Podczas symulacji prowadzonej dla jednego zestawu parametrów
termodynamicznych wyznaczyć można tylko te wielkości, które są średnimi w danym
zespole statystycznym np. energię, gęstości lokalne, parametry strukturalne. Niestety,
tak ważne funkcje termodynamiczne jak energia swobodna i entropia nie są takimi
wielkościami i nie można ich wyznaczyć podczas pojedynczej symulacji. Wykonuję się
serię symulacji dla różnych temperatur lub różnych potencjałów chemicznych i stosuje
się tzw. całkowanie termodynamiczne [10]. Do wyznaczenia tych wielkości przydatna

7
byłaby znajomość energetycznej gęstości stanów. W tym kontekście możliwość
wyznaczenia gęstości stanów ma duże znaczenie. Wang oraz Landau zaproponowali
metodę, którą opisze poniżej.

Rozważny układ N spinów opisywanych hamiltonianie (2.1). Niech pojedynczy


krok Monte Carlo polega na zmianie stanu losowo wybranego spinu. Zmieniając stan
tegoż spinu zmieniamy jednocześnie energię układu. Można powiedzieć, że błądzimy
przypadkowo w przestrzeni energii. Algorytm Wanda i Landau'a [11, 12] opiera się
na spostrzeżeniu, iż błądząc przypadkowo w przestrzeni energii
z prawdopodobieństwem proporcjonalnym do odwrotności energetycznej gęstości
stanów 1/g(E) generujemy płaski histogram rozkładu energii. Histogram ten wskazuje
ile razy podczas podczas symulacji układ znalazł się w stanie o danej energii. Inaczej
mówiąc, ile razy był odwiedzany poziom energetyczny E. Opracowano więc
samouzgadniający się schemat znajdowania g(E) tak by otrzymać w efekcie płaski
histogram. Na samym początku przeprowadzania symulacji gęstość stanów jest przyjęta
jako niewiadoma, w algorytmie wszystkie pozycje ustalane są na g(E) = 1 dla
wszystkich możliwych energii. Następnie rozpoczyna się proces błądzenia
przypadkowego, w którym zamieniamy spiny w losowy sposób akceptując zmianę
z prawdopodobieństwem
p  E 1  E 2 =min
[ g  E 1
g  E 2 ]
,1 , (3.2)

przy czym E1 oraz E2 oznaczają energię przed i po zmianie. Podczas każdego


odwiedzenia danego poziomu energii E modyfikowane jest bieżąca gęstość stanów
za pomocą modyfikującego współczynnika f >1 np.
g  E   g  E ∗ f (3.3)

ewentualnie tak jak jak to zostało użyte przez autorów algorytmu:


ln [g  E] ln[ g  E ]ln  f  (3.4)

Równocześnie rejestrujemy histogram.


Jeśli algorytm błądzenia przypadkowego nie jest w stanie wykonać następnego
ruchu i pozostaje na tym samym poziomie energii także modyfikowana jest gęstość
stanów poprzez współczynnik. Podczas prac nad algorytmem wybrano współczynnik
f = f0 = e1 = 2.71828... , który pozwala na osiągnięcie wszystkich możliwych poziomów

8
energii z dobrą wydajnością nawet dla układów o dosyć dużej wielkości. Jeśli f0 jest
zbyt małe algorytm błądzenia przypadkowego musi poświęcić dużo czasu by osiągnąć
wszystkie poziomy energii. Z drugiej strony zbyt duże wartości współczynnika f0
powodują znaczące błędy statystyczne. W przedstawionym algorytmie histogramy były
sprawdzane co 10000 kroków Monte Carlo. Sensownym wyborem jest taki wybór f0
by (f0) 10000 miało ten sam rząd wielkości co całkowita liczba stanów układu.

Kiedy histogram jest już płaski w badanym zakresie energii wiadomo, iż gęstość
stanów osiągnęła wartości prawidłowe z dokładnością proporcjonalną
do współczynnika modyfikacji ln(f). Następnie współczynnik jest zmieniany zgodnie
z równaniem f 1= f 0 , a histogram jest zerowany i rozpoczyna się nowy proces
błądzenia przypadkowego, w którym modyfikujemy gęstość stanów już z nowym
współczynnikiem f1 w każdym kroku. Przerywamy błądzenie przypadkowe gdy
histogram jest znów płaski i znów zmniejszamy współczynnik modyfikacyjny według
wzoru f i1= f i a następnie rozpoczynamy cały proces raz jeszcze. Działanie
algorytmu jest przerywane kiedy obliczony współczynnik modyfikacji jest mniejszy niż
wcześniej zdefiniowana wartość (np. fkoncowe = exp(10 -8) = 1.00000001 jak przykładowo
podają autorzy algorytmu). Jak widać po powyższych rozważaniach współczynnik f jest
ważnym elementem wpływającym na dokładność obliczania gęstości stanów oraz na
to jaka liczba kroków Monte Carlo jest wymagana do przeprowadzenia symulacji.
Dokładność obliczania gęstości stanów zależy nie tylko od ostatecznej wartości fkoncowe
lecz także od innych parametrów takich jak, wielkość oraz złożoność układu, kryterium
płaskości histogramu oraz sposobu implementacji algorytmu (dokładność
wykorzystywanego formatu liczb w komputerze). Otrzymanie całkowicie płaskiego
histogramu jest praktycznie niemożliwe więc termin „płaski histogram” jest używany
w znaczeniu histogram, w którym H(E) dla wszystkich możliwych energii jest nie
mniejszy niż odpowiedni procent ze średniego histogramu <H(E)>. Wybiera się
odpowiedni procent odchylenia biorąc pod uwagę złożoność układu, jego wielkość oraz
potrzebną dokładność gęstości stanów. Dla prostych modeli (L=32, Ising) autorzy
sugerują procent równy 95% ale dla większych układów takie kryterium płaskości może
być trudne do spełnienia i algorytm może wpaść w pętlę nieskonczoną. Tushar S. Jain
oraz Juan J. De Pablo w swojej pracy [12] sugerują wartość 80%.

9
Sposób implementacji musi zapewnić zbieganie się gęstości stanów do
poprawnej wartości. Dokładność obliczonych gęstości stanów jest proporcjonalna do
ln(f). Jednak fkoncowe nie może być dowolnie małe gdyż pojawiają się problemy związane
z dokładnością notacji liczb zmiennoprzecinkowych stosowanych podczas obliczeń co
powoduje albo silne wydłużenie czasu działania algorytmu albo brak jakejkolwiek
poprawy wartości danych co skutkuje pętlą nieskończoną.
Autorzy algorytmu wybrali funkcję pierwiastkową jako funkcję zmniejszającą
współczynnik f. W ogólności można użyć dowolnej funkcji, która w nieskończoności
dąży monotonicznie do wartości 1.0. Taką właśnie przykładową funkcją jest

f i1= f 1i /n , gdzie n1 (3.5)

Wartość n określająca typ funkcji pierwiastkowej może być wybrana dowolnie


biorąc pod uwagę zapotrzebowanie na moc obliczeniową lub dokładność
przeprowadzonej symulacji. Dla typowych układów pierwiastek drugiego stopnia
(n = 2) jest w zupełności wystarczający dla przeprowadzonych symulacji i zapewnia
dobrą dokładność przy względnie krótkim czasie obliczeń. Gdy współczynnik
modyfikacji f osiągnie wartość bliską 1.0 i algorytm błądzenia przypadkowego
generuje jednorodny rozkład w przestrzeni energii gęstość stanów powinna osiągnąć
wartości prawidłowe dla rozpatrywanego układu.

3.3 Wielości termodynamiczne możliwe do otrzymania w wyniku działania


algorytmu

Z tego, że gęstość stanów nie zależy od temperatury wynika, iż znając gęstość

10
stanów możemy obliczyć wielkości termodynamiczne dla każdej temperatury. Dla
przykładu energię średnią możemy obliczyć korzystając z wzoru:

∑ E∗g  E ∗e−βE
E
〈 E 〉= (3.6)
∑ g  E ∗e− βE
E

a sumowanie odbywa się po wszystkich wartościach energii.


Podobnie, korzystając z wzoru:
〈 E 2 〉−〈 E 〉 2
Cv T = (3.7)
T2

możemy obliczyć ciepła właściwe Cv(T) przy danej temperaturze T. Dodatkowo prócz
typowych wielkości, które można obliczyć przy wykorzystaniu standardowych
symulacji Monte Carlo możemy także obliczyć energię swobodną i entropię. Energia
swobodna jest obliczana przy wykorzystaniu wzoru na sumę statystyczną:

Z= ∑ e− βE=∑ g  E ∗e− βE (3.8)


konfiguracje E

oraz wzoru
F =−kT ∗log Z  (3.9)

Podobnie entropia może być obliczona dla danej temperatury przy wykorzystaniu
wzoru:
〈 E 〉−F
S T = (3.10)
T

4. Sposób implementacji algorytmu Wanga – Landau'a


4.1 Wybór formatu liczb

11
Podczas tworzenia oprogramowania wykorzystano język ANSI C wraz
z rozszerzeniami wprowadzonymi w standardzie C99. Dane liczbowe przechowywane
zostały w standardowym dla obliczeniowych programów komputerowych formacie
zmiennoprzecinkowym umożliwiającym reprezentacje liczb rzeczywistych. Dla
platform innych niż x86/x64 wykorzystany został typ danych long double. Dla
pozostałych maszyn (PowerPC, UltraSparc), na których testowano oprogramowanie
wykorzystano standardowy typ zmiennoprzecinkowy o rozszerzonej precyzji double.
Wartość liczby zmiennoprzecinkowej jest obliczana według wzoru:
wartość=−1bit znaku∗Mantysa∗2Wykładnik (4.1)

Typ double jest zapisywany w notacji opisanej w dokumencie IEEE-854 [13]. Dla tego
typu wprowadzone są następujące parametry:
całkowita ilość bitów: 64
ilość bitów znaku: 1
ilość bitów mantysy: 52 (+1)
ilość bitów wykładnika: 11

By nie wprowadzać dodatkowych oznaczeń dla znaku wykładnika


przechowywany jest on bez znaku z przesunięciem o pewną stałą (BIAS), a podczas
obliczeń ta stała jest od niego odejmowana. Maksymalną wartością dla typu double jest
liczba o wynosząca około 1.79769313486E+308. Analizując wzory (2.1) oraz (2.3)
można łatwo zauważyć, że występujący w nich exponens przekracza zakres formatu
double dla wykładnika większego niż około 709. Jednym z rozwiązań jest skorzystanie
z formatu long double, który umożliwia zapisanie reprezentacji danych
zmiennoprzecinkowych na 80 bitach co zapewnia większą dokładność (mantysa
zapisana na 64 bitach) oraz zakres (wykładnik zapisany na 15 bitach). Największą
liczbą, którą można zapisać przy użyciu formatu long double jest
1.18973149535723176502E+4932 co jest znaczącym rozszerzeniem jeśli chodzi
o użycie w opisywanych algorytmach lecz ogranicza wykorzystanie do platform
opartych o procesory serii Intel x86/x64. W celu zapewnienia przenośności kodu
wybrano podczas projektowania oprogramowania reprezentację loge dla obliczania
liczb. Umożliwia ona operacje na dużych liczbach ze znaczną prędkością chociaż
następuje zmniejszenie precyzji zapisu. Inny sposobem rozszerzenia dokładności

12
przeprowadzonych obliczeń (nie zaimplementowanym w tej pracy) jest wykorzystanie
jednej z bibliotek oferujących możliwość posłużenia się liczbami o rozszerzonej
precyzji takich jak GNU Multi-Precision Library (http://gmplib.org/) czy biblioteki
Class Library for Numbers (http://www.ginac.de/CLN/). Dodatkowym atutem tych
bibliotek jest obsługa jednostek wektorowych SIMD znacznie skracających czas
obliczeń.

Dodatkowo elementem, który odgrywa znaczną rolę w otrzymaniu poprawnego wyniku


działa algorytmów Monte Carlo są własciwości statystyczne użytego generatora liczb
pseudolosowych (rozkładu oraz okresu powtarzania się zwracanych wartości). Dla
algorytmów wykorzystywanych w niniejszej pracy wystarczającą siłę posiada generator
liczb dołączany do biblioteki standardowej języka C opierający się (tak jak większość
prostych generatorów) o operację modulo. Jego cechą jest także rozkład jednorodny
potrzebny w przeprowadzanych symulacjach. Jeśli wykorzystywany generator miałby
inny niż jednorodny rozkład to w większości zastosowań (prócz specjalnych
przypadków) mogłoby dojść do pominięcia części przestrzeni fazowej podczas
modelowania powodując błędy w otrzymywanych wynikach.

4.2 Wykorzystanie reprezentacji loge

Korzystanie z reprezentacji liczb w postaci ich logarytmu naturalnego wymaga


zdefiniowania podstawowych operacji matematycznych. Dodatkowo należy wziąć pod
uwagę to, że funkcja logarytmiczna zdefiniowana jest tylko dla liczb dodatnich.
Podczas operacji na liczbach ujemnych w opisywanych obliczeniach zastosowano
zabieg rozdzielenia danych na część dodatnią i ujemną i tak dla przykładu wzór (3.1)
został przekształcony w następujące równanie:

∑ ∣E∣∗g  E ∗e− βE − ∑ ∣E∣∗g  E∗e− βE


〈 E 〉= E dodatnie E ujemne
(4.2)
∑ g  E ∗e − βE

gdzie obliczenia przeprowadzone są w postaci logarytmicznej z modułu wartości


energii, a następnie po konwersji na postać dziesiętną człon reprezentujący energię
ujemną jest odejmowany od członu reprezentującego energię dodatnią.
Przy implementacji wykorzystane zostały następujące własności postaci logarytmicznej:

13
1) mnożenie log e x∗y=log e xlog e y
x
3) dzielenie log e =log e x−log e y
y
4) potęgowanie log e x y = y∗log e x
5) f. wykładnicza exp log e x =x
6) dodawanie

Podczas dodawania wykorzystujemy następujące przekształcenia:


przyjmując, że liczby x oraz y są w postaci logarytmicznej chcemy znaleźć takie z,
którego wartością będzie suma liczb x oraz y w postaci logarytmicznej

e x e y =e z
Następnie przekształcamy powyższy wzór do podanej poniżej postaci oraz dzielimy
stronami przez ex :

e x e y =e xz ' | :e x
otrzymując
1e y− x =e z '
z tego wynika, że
z =xlog1e y−x  (4.3)

Jak widać po wzorze (3.3) krytycznym dla zakresu danych reprezentowanym przez typ
double jest wyrażenie exp(y-x). Dla uproszczenia przyjmujemy, że jeśli różnica
pomiędzy dodawanymi liczbami x i y jest większa niż 709 (czyli około 308 cyfr
znaczących w zapisie dziesiętnym) to ich suma równa się większej z tych liczb.
Umożliwia to zabezpieczenie się przed przepełnieniem zakresu podczas dodawania
liczb praktycznie nie wpływających na wynik dodawania.

4.3 Sposób korzystania z programu

Program po rozpoczęciu pracy wczytuje dane otrzymane z symulacji.

14
Obsługiwany jest następujący format pliku:
kolumna pierwsza: wartości energii
kolumna ostatnia: wartości gęstości stanów (w postaci logarytmicznej)
Program sam rozpoznaje ile kolumn z danymi posiada plik tekstowy i podczas
wczytywania wybiera odpowiednią kolumnę. Po wczytaniu danych do pamięci
przeprowadzana jest normalizacja gęstości stanów do wartości 2 (a praktycznie do log e2
gdyż korzystamy z reprezentacji logarytmicznej) razem z uśrednianiem biorąc pod
uwagę, że docelowo g(E) powinno wynosić tyle co g(-E). Jeśli nie wystąpią błędy
podczas wczytywania to przygotowane dane są wprowadzane do funkcji obliczającej
średnią energię, energię swobodną, entropię, oraz ciepło właściwe według odpowiednio
wzorów (4.2), (3.4), (3.5), (3.2).

Program został wykonany w dwóch wersjach. Pierwsza jest zgodna z ANSI C i jest
wersją przenośną pomiędzy systemami operacyjnymi oraz różnymi platformami
sprzętowymi natomiast druga, korzystająca z tych samym źródeł jeśli chodzi
o obliczenia posiada dodatkowo graficzny interfejs użytkownika oparty o framework
MUI dla systemu operacyjnego MorphOS1. Umożliwia ona wczytanie plików
wejściowych, dokonanie obliczeń a także wizualizacje wyników w postaci wykresu
widocznego na rysunku 2. Dodatkowo, można w prosty sposób przejrzeć otrzymane
wyniki korzystając z odpowiedniej zakładki (rysunek 3). By uprościć korzystanie
i przeprowadzanie obliczeń można także ustawić zakres temperatur, dla których ma
działać algorytm i zmienić kolory tła oraz linii wykresu (rysunek 4) ewentualnie pod
menu dostępnym pod prawym przyciskiem myszki można ustawić widoczność
elementów wykresu (osi, opisu oraz siatki). Źródła programu wraz z komentarzami w
kodzie źródłowym zostały dołączone do pracy licencjackiej.

1 http://morphos.net

15
Rysunek 2: Zrzut ekranu oprogramowania - reprezentacja wykresu

Rysunek 3: Zrzut ekranu oprogramowania - wyniki

16

Rysunek 4: Zrzut ekranu oprogramowania - okno preferencji


5. Zastosowanie metody do dwuwymiarowego modelu Isinga
na sieci kwadratowej jako test programu

Omawiany program zastosowano opisu modelu Isinga. Znana jest dokładna


postać gęstości stanów dla skończonego dwuwymiarowego modelu Isinga. Na rysunku
5 porównano wyniki otrzymane metodą Wanga-Landau'a z wynikami dokładnymi. Jak
widać zgodność jest w pełni zadowalająca. Obliczenia te stanowią test metody.
Następnie wykonano serię obliczeń różnych wielkości fizycznych dla różnych
rozmiarów układu (L = 10, 20, 40, 60, 120, 240). Rysunek 6 przedstawia wykres
zależności gęstości stanów od unormowanej energii. Zgodnie z przewidywaniami
maksymalna wartość gęstości rośnie z rozmiarem układu. Rysunek 7 oraz 8
przedstawiają zależność średniej energii od temperatury w zakresie od 0,3 K do 8.0 K
dla układów o różnych rozmiarach. Wyraźnie widać, że rozmiar wpływa na wartość
średniej energii w sposób znaczący jedynie w pobliżu punktu krytycznego TC. Rysunki
9 i 10 przedstawiają zależność entropii od wzrostu temperatury. Wpływ rozmiaru
układu był analogiczny jak w poprzednim przypadku. Ponadto zgodnie
z przewidywaniami entropia dąży do 0 gdy temperatura dąży do 0 oraz dąży do ln(2)
kiedy temperatura dąży do nieskończoności. Rysunki 11 i 12 pokazują energię

17
swobodną. Także w tym wypadku znaczące różnice pomiędzy wartościami obliczonymi
dla różnych L występują tylko w pobliżu punktu krytycznego.
Na rysunku 13 pokazano zależność pojemności cieplnej od temperatury.
Maksymalna wartość Cv bardzo zależy od rozmiarów układu. Temperatura, dla której
osiągane jest maksimum również zależy od rozmiarów układu. Wszystkie wartości
temperatur w maksimach pojemności cieplnej są przesunięte od TC o pewną odległość.

Podsumowując stwierdzam, że wyniki są zgodne z oczekiwaniami co dowodzi


poprawności zaimplementowanego algorytmu a także samego programu.

18
40000 80
500
-500
70

60

50
ln[g(E)]

40

30

20

10

0
-2,5 -2 -1,5 -1 -0,5 0 0,5 1 1,5 2 2,5

Wyniki
dokladne
Wyniki
obliczone

Rysunek 5: Porównanie obliczonych wartość gestości stanów z wartościami


rzeczywistymi

19
ln[g(E)]

Rysunek 6: Zależność logarytmu gęstości stanów od unormowanej enegii

20
Rysunek 7: Zależność energii od temperatury

21
Rysunek 8: Zależność energii od temperatury w otoczeniu punktu krytycznego

22
TC

Rysunek 9: Zależność entropii od temperatury

23
TC

Rysunek 10: Zależność entropii od temperatury w otoczeniu punktu krytycznego

24
TC

Rysunek 12: Zależność energii swobodnej od temperatury

25
TC

Rysunek 11: Zależność energii swobodnej od temperatury w otoczeniu punktu


krytycznego

26
Rysunek 13: Zależność pojemności cieplnej od temperatury

27
BIBLIOGRAFIA:

[1] Ulam S. M., von Neumann J.. Random ergodic theorems, Bull. Amer. Math.
Soc. 51, 660, 1945
[2] Ising E., Beitrag zur Theorie des Ferromagnetismus, Zeitschrift für Physik 31,
253-258, 1925
[3] Gonczarek Ryszard, Teoria przejść fazowych - wybrane zagadnienia, Oficyna
Wydawnicza Politechniki Wrocławskiej, Wrocław 2004
[4] Huang Kerson, Podstawy fizyki statystycznej, Wydawnictwo Naukowe PWN,
Warszawa 2006
[5] Onsager L., Crystal Statistics. I. A Two-Dimensional Model with a Order-
Disorder Transition Phys. Rev. 65, 117-149, 1944.
[6] Zamolodchikov A. B., Integrals Of Motion And S-Matrix Of The (Scales) T=Tc
Ising Model With Magnetic Field, International Journal of Modern Physics A
4/16, 4235 - 4248 October 10, 1989
[7] Beale Paul D., Exact Distribution of Energies in the Two-Dimensional Ising
Model, Phys. Rev. Lett. 76, 78 - 81 (1996)
[8] Zhang Z-D, Conjectures on the exact solution of three-dimensional (3D) simple
orthorhombic Ising lattices, Philosophical Magazine 87/34, December 2007
[9] Metropolis N., Rosenbluth A. W., Rosenbluth M. N., Teller A. H., Equation of
State Calculations by Fast Computing Machines, J. Chem. phys. 21, 1087,
March 1953
[10] Patrykiejew A., Wprowadzenie do metody Monte Carlo, Wyd. UMCS, Lublin
1993
[11] Wang Fuago, D.P. Landau, Determining the density of states for classical
statistical models: A random walk algorith to produce a flat histogram, Physical
Review E, Volume 64, 2001
[12] Jain Tushar S., De Pablo Juan J., A biased Monte Carlo technique for
calculation of the density of states of polymer films, Journal of Chemical
Physics, Volume 116, Number 16, January 2002
[13] Kahan W., IEEE Standard 754 for Binary Floating-Point Arithmetic, Lecture
Notes on the Status of IEEE 754, October 1997

28
DODATKI

Używane symbole:

CV - ciepło właściwe
S - entropia
F - energia swobodna
Z - suma statystyczna
<E> - energia średnia
E - energia
kB - czynnik Bolzmanna
g(E) - gęstość stanów

Używane skróty:

IEEE - Institute of Electrical and Electronics Engineers


SIMD - Single Instruction, Multiple Data

29
KOD ŹRÓDŁOWY OBLICZENIOWEJ CZĘŚCI PROGRAMU
/*********************************************************
Funkcja oblicza sume dwoch liczb x i y w postaci
logarytmicznej
**********************************************************/

double Sum2e(double x, double y)

{
double wynik, roznica;
double logarytm, tmp;

wynik = x;
logarytm = y;

// przyjmujemy dla ulatwienia ze nasza suma czyli wynik dla kazdego ciagu
// jest wieksza niz podany element, jesli nie to zamieniamy wartosci
if(logarytm<wynik)
{
tmp = wynik;
wynik = logarytm;
logarytm = tmp;
}
// obliczamy roznice logarytmow (a konkretnie roznice wykladnikow x-y gdy liczbe
// zapiszemy w postaci e^x + e^y)
if((roznica = logarytm-wynik)<708)
{
// obliczamy sume korzystajac z wzoru
// e^x + e^y = e^z, gdzie
// z = x + log( 1 + e^(y-x) )
wynik += log(1+exp(roznica));
}
else
// jesli roznica wykladnikow jest wieksza niz okolo 708 to exp zwróciloby
// niepoprawna wartosc, w takim wypadku nie bierzemy pod uwage 1 we wzorze i
// przeksztalcamy wzor do postaci z = x + roznica
{
wynik += roznica;
}
return wynik;
}

30
/*********************************************************************************
Funkcja zwraca srednia energię w oparciu o energie E, gestosc stanow G,
temperature T, zwracając przez wskaznik wartosc wolnej energii free_energy oraz
wolna pojemnosc cieplna Cv, dodatkowo: n - wielkosci tablic, zero – index zera
*********************************************************************************/
double E_average(double *E, double *G, double T, int n, double *free_energy, int zero,
double *Cv)
{
double licznik=0, mianownik, licznik2, licznik3, tmp3;
double Beta, E_average;
int i;

Beta = -1./T;
// dla energii ujemnej
mianownik = Beta*E[0] + G[0];
licznik = mianownik + log(-E[0]);
licznik3= mianownik + log(E[0] * E[0]);

for (i=1; i<zero; i++)


{
tmp3 = Beta*E[i] + G[i];
mianownik = Sum2e(mianownik, tmp3);

licznik = Sum2e(licznik, (tmp3 + log(-E[i])));


licznik3= Sum2e(licznik3,(tmp3 + log(E[i] * E[i])));
}

tmp3 = G[zero];
mianownik = Sum2e(mianownik, tmp3);
// dla energii dodatniej
for (i=zero+1; i<n; i++)
{
tmp3 = Beta*E[i] + G[i];
mianownik = Sum2e(mianownik, tmp3);
if (i == zero+1)
licznik2 = tmp3 + log(E[i]);
else
licznik2 = Sum2e(licznik2, (tmp3 + log(E[i])));

licznik3 = Sum2e(licznik3,(tmp3 + log(E[i] * E[i])));


}

// wolna energia
*free_energy = -mianownik*T;
//energia srednia
E_average = (-exp(licznik-mianownik )+( exp(licznik2 - mianownik )));
// pojemność cieplna
*Cv = ( exp(licznik3 - mianownik ) - E_average*E_average ) * Beta*Beta ;

return E_average;
}

31
/*********************************************************
* Funkcja oblicza entropię w oparciu o energię srednia
* wolna energie dla podanej temperatury
**********************************************************/
double entrophy(double E_aver, double F, double T)
{
return (E_aver-F)/(T);
}

/*********************************************************
* Funkcja uśrednia wartości gestosci stanow
**********************************************************/
void usrednianie(double *G, int n)
{
int i;
double odejmowanie;

odejmowanie = (G[0]+G[n-1])/2.0 - log(2.0);

for (i=0; i<n; i++)


{
// usredniamy
G[i] -= odejmowanie;
}
}

32

You might also like