3
3
#include " IsingWindow.hpp"
4
4
5
5
IsingWindow::IsingWindow (unsigned M, unsigned N, double J,
6
- double beta, QWidget *parent) : QMainWindow(parent) {
6
+ double beta, QWidget *parent)
7
+ : QMainWindow(parent) {
7
8
8
9
simwid = new IsingWidget (M, N, J, beta, parent);
9
10
grid = new QGridLayout;
@@ -14,22 +15,29 @@ IsingWindow::IsingWindow(unsigned M, unsigned N, double J,
14
15
lne_b = new QLineEdit ( QString (std::to_string (beta).c_str ()) );
15
16
16
17
form = new QFormLayout;
17
- form->addRow (" Jparam :" , lne_J);
18
- form->addRow (" bparam :" , lne_b);
18
+ form->addRow (" J :" , lne_J);
19
+ form->addRow (" 1/T :" , lne_b);
19
20
20
- connect (lne_J, SIGNAL (returnPressed ()), this , SLOT (set_J ()));
21
- connect (lne_b, SIGNAL (returnPressed ()), this , SLOT (set_b ()));
21
+ connect (lne_J, SIGNAL (returnPressed ()), this , SLOT (set_J ()) );
22
+ connect (lne_b, SIGNAL (returnPressed ()), this , SLOT (set_b ()) );
22
23
23
- grid->addLayout (form, 0 , 1 );
24
- grid->addWidget (simwid, 0 , 0 );
24
+ btn_start = new QPushButton (" Start" , this );
25
+ btn_start->setCheckable (true );
26
+ connect (btn_start, SIGNAL (toggled (bool )), this , SLOT (toggle_simulation (bool )) );
27
+
28
+ grid->addLayout (form, 0 , 2 );
29
+ grid->addWidget (simwid, 0 , 0 , 2 , 2 );
30
+ grid->addWidget (btn_start, 1 , 2 );
25
31
26
32
centralWidget ()->setLayout (grid);
27
33
28
34
}
29
35
30
36
IsingWindow::~IsingWindow () {
37
+ toggle_simulation (false ); // XXX FIXME (data races)
31
38
delete lne_J;
32
39
delete lne_b;
40
+ delete btn_start;
33
41
delete form;
34
42
delete simwid;
35
43
delete grid;
@@ -40,16 +48,19 @@ void IsingWindow::set_J() {
40
48
double val = lne_J->text ().toDouble (&status);
41
49
if (!status) return ;
42
50
simwid->SetJ (val);
43
- std::cout << " J is now set to: " << val << std::endl;
44
-
45
51
}
46
52
47
53
void IsingWindow::set_b () {
48
54
bool status;
49
55
double val = lne_b->text ().toDouble (&status);
50
56
if (!status) return ;
51
57
simwid->SetBeta (val);
52
- std::cout << " beta is now set to: " << val << std::endl;
58
+ }
59
+
60
+ void IsingWindow::toggle_simulation (bool sstate) {
61
+ if (sstate) { btn_start->setText (" Stop" ); }
62
+ else { btn_start->setText (" Start" ); }
63
+ simwid->ToggleSimulation (sstate);
53
64
}
54
65
55
66
@@ -62,6 +73,8 @@ IsingWidget::IsingWidget (unsigned M, unsigned N, double J,
62
73
: running(false ) {
63
74
64
75
Q_UNUSED (parent);
76
+
77
+ iterations = 100 ;
65
78
imc = new IsingMC (M, N, J, beta);
66
79
setFixedWidth (M);
67
80
setFixedHeight (N);
@@ -75,14 +88,11 @@ IsingWidget::~IsingWidget () {
75
88
void IsingWidget::paintEvent (QPaintEvent *e) {
76
89
77
90
Q_UNUSED (e);
78
- return ;
79
91
80
92
QPainter qp (this );
81
- unsigned PenSize = 2 ;
93
+ unsigned PenSize = 1 ;
82
94
unsigned offset = PenSize ? PenSize : 1 ;
83
95
84
- for (unsigned i = 0 ; i < 100 // imc->XSize() * imc->YSize()
85
- ;i++) imc->Step ();
86
96
// std::cout << imc->Energy() << std::endl;
87
97
88
98
// std::cout << "Energy: " << imc->Energy()
@@ -105,18 +115,31 @@ void IsingWidget::paintEvent (QPaintEvent *e) {
105
115
106
116
void IsingWidget::SetJ (double val) { imc->SetJ (val); }
107
117
void IsingWidget::SetBeta (double val) { imc->SetBeta (val); }
108
- double IsingWidget::Energy () { return imc->Energy (val ); }
109
- double IsingWidget::Magnetization () { return imc->Magnetization (val ); }
118
+ double IsingWidget::Energy () { return imc->Energy (); }
119
+ double IsingWidget::Magnetization () { return imc->Magnetization (); }
110
120
111
121
void IsingWidget::simulationThread (unsigned num) {
112
- while (true ) {
122
+ while (running ) {
113
123
for (unsigned i = 0 ; i < num; i++) {
114
- mtx.lock ();
115
- if (running) {
116
- imc->Step ();
117
- }
118
- mtx.unlock ();
124
+ imc->Step ();
119
125
}
120
- emit paintEvent (0 );
126
+ // emit paintEvent(0);
127
+ update ();
121
128
}
122
129
}
130
+
131
+ void IsingWidget::ToggleSimulation (bool sstate) {
132
+ std::cout << " state of simulation before changing: " << running << std::endl;
133
+ if (sstate) { startSimulation (); }
134
+ else { stopSimulation (); }
135
+ }
136
+
137
+ void IsingWidget::startSimulation () {
138
+ if (running) return ;
139
+ std::thread (&IsingWidget::simulationThread, this , iterations).detach ();
140
+ running = true ;
141
+ }
142
+
143
+ void IsingWidget::stopSimulation () {
144
+ running = false ;
145
+ }
0 commit comments