forked from uyras/partsEngine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwanglandau.h
More file actions
57 lines (42 loc) · 2.05 KB
/
wanglandau.h
File metadata and controls
57 lines (42 loc) · 2.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#ifndef WANGLANDAU_H
#define WANGLANDAU_H
#include <QDebug>
#include <cmath>
#include <iostream>
#include <sstream>
#include "PartArray.h"
#include "StateMachineFree.h"
#include "dos2.h"
using namespace std;
class WangLandau
{
public:
WangLandau(PartArray *sys, unsigned intervals, double accuracy=0.8, double fmin=1.0001);
virtual ~WangLandau();
void run(unsigned steps=10000);
/**
* @brief save сохранить гистограммы в файл
* @param filename Имя файла для сохранения. По умолчанию сохраняет в формате g_<number_of_parts>_<intervals>.dat.
*/
void saveG(const std::string filename="") const;
void saveH(const std::string filename="") const;
Dos2<double> g; ///g - логарифм плотности состояний (энтропия), h - вспомогательная гистограмма, которая должна быть плоской
Dos2<unsigned> h;
bool showMessages;
unsigned saveEach; ///каждые сколько шагов сохранять данные в файл. если 0 то не сохранять.
private:
PartArray *sys;
unsigned int intervals; //число интервалов в плотности состояний
double accuracy; //величина погрешности для степени плоскости гистограммы
double fMin,f;
double average; //подсчитывает среднее число для h
unsigned hCount; //количество ненулевых элементов h, нужно для подсчета среднего
bool isFlat(); //критерий плоскости гистограммы
void updateGH(double E=0.0);
void resetH();
void normalizeG();
inline void msg(std::string str){if (showMessages) cout<<str<<endl;}
inline void msg(std::string str,double val){if (showMessages) cout<<str<<val<<endl;}
inline void msg(std::string str,int val){if (showMessages) cout<<str<<val<<endl;}
};
#endif // WANGLANDAU_H