Professional Documents
Culture Documents
w Lublinie
WYDZIAŁ CHEMII
Michał Żukowski
SYMULACYJNE WYZNACZANIE
ENERGETYCZNEJ GĘSTOŚCI STANÓW
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
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
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.
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)
b)
1 2 3 ....
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.
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.
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.
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 i1= 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
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
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ą:
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
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ść=−1bit 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
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ń.
13
1) mnożenie log e x∗y=log e xlog 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
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 xz ' | :e x
otrzymując
1e y− x =e z '
z tego wynika, że
z =xlog1e 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.
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
16
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ść.
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
19
ln[g(E)]
20
Rysunek 7: Zależność energii od temperatury
21
Rysunek 8: Zależność energii od temperatury w otoczeniu punktu krytycznego
22
TC
23
TC
24
TC
25
TC
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:
29
KOD ŹRÓDŁOWY OBLICZENIOWEJ CZĘŚCI PROGRAMU
/*********************************************************
Funkcja oblicza sume dwoch liczb x i y w postaci
logarytmicznej
**********************************************************/
{
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]);
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])));
// 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;
32