HubbardGPU
Hubbard diagonalisation on the GPU (and CPU)
Main Page
Classes
Files
File List
File Members
HubbardGPU
Classes
Files
File List
bare-ham.cpp
bare-ham.h
ham-mom.cpp
ham-mom.h
ham-spin.cpp
ham-spin.h
ham.cpp
ham.h
ham2D.cpp
ham2D.h
hamgpu.cu
hamgpu.h
hamsparse.cpp
hamsparse.h
hamsparse2D.cpp
hamsparse2D.h
hamsparse2D_CSR.cpp
hamsparse2D_CSR.h
helpers.cpp
helpers.h
lanczos.cpp
main.cpp
main2D.cpp
nonp-ham.cpp
nonp-ham.h
SparseMatrix_CCS.cpp
SparseMatrix_CCS.h
File Members
•
All
Classes
Files
Functions
Variables
Typedefs
Friends
Macros
ham.cpp
Go to the documentation of this file.
1
/* Copyright (C) 2012 Ward Poelmans
2
3
This file is part of Hubbard-GPU.
4
5
Hubbard-GPU is free software: you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
9
10
Hubbard-GPU is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
14
15
You should have received a copy of the GNU General Public License
16
along with Hubbard-GPU. If not, see <http://www.gnu.org/licenses/>.
17
*/
18
19
#include <iostream>
20
#include <cstdlib>
21
#include <cmath>
22
#include "
ham.h
"
23
32
Hamiltonian::Hamiltonian
(
int
L,
int
Nu,
int
Nd,
double
J,
double
U) :
BareHamiltonian
(L,Nu,Nd,J,U)
33
{
34
}
35
39
Hamiltonian::~Hamiltonian
()
40
{
41
}
42
46
void
Hamiltonian::BuildFullHam
()
47
{
48
if
( !
baseUp
.size() || !
baseDown
.size() )
49
{
50
std::cerr <<
"Build base before building Hamiltonian"
<< std::endl;
51
return
;
52
}
53
54
ham
=
new
double
[
dim
*
dim
];
55
56
int
NumDown =
CalcDim
(
L
,
Nd
);
57
58
int
upjumpsign, downjumpsign;
59
60
if
(
Nu
% 2 == 0)
61
upjumpsign = -1;
62
else
63
upjumpsign = 1;
64
65
if
(
Nd
% 2 == 0)
66
downjumpsign = -1;
67
else
68
downjumpsign = 1;
69
70
for
(
unsigned
int
a=0;a<
baseUp
.size();a++)
71
for
(
unsigned
int
b=0;b<
baseDown
.size();b++)
72
{
73
int
i = a * NumDown + b;
74
75
for
(
unsigned
int
c=a;c<
baseUp
.size();c++)
76
for
(
unsigned
int
d=0;d<
baseDown
.size();d++)
77
{
78
int
j = c * NumDown + d;
79
80
ham
[j+
dim
*i] = 0;
81
82
if
(b == d)
83
ham
[j+
dim
*i] +=
J
*
hopping
(
baseUp
[a],
baseUp
[c],upjumpsign);
84
85
if
(a == c)
86
ham
[j+
dim
*i] +=
J
*
hopping
(
baseDown
[b],
baseDown
[d],downjumpsign);
87
88
ham
[i+
dim
*j] =
ham
[j+
dim
*i];
89
}
90
91
// count number of double occupied states
92
ham
[i+
dim
*i] =
U
*
CountBits
(
baseUp
[a] &
baseDown
[b]);
93
}
94
}
95
105
int
Hamiltonian::hopping
(
myint
a,
myint
b,
int
jumpsign)
const
106
{
107
int
result = 0;
108
int
sign;
109
myint
cur = a;
110
// move all electrons one site to the right
111
cur <<= 1;
112
113
// periodic boundary condition
114
if
( cur &
Hb
)
115
cur ^= Hb + 0x1;
// flip highest bit and lowest bit
116
117
// find places where a electron can jump into
118
cur &= ~a;
119
120
while
(cur)
121
{
122
// isolate the rightmost 1 bit
123
myint
hop = cur & (~cur + 1);
124
125
cur ^= hop;
126
127
sign = 1;
128
129
if
(hop & 0x1)
130
{
131
hop += Hb>>1;
132
sign = jumpsign;
133
}
134
else
135
hop += hop>>1;
136
137
if
( (a ^ hop) == b )
138
{
139
result -= sign;
140
break
;
141
}
142
}
143
144
cur = a;
145
// move all electrons one site to the left
146
cur >>= 1;
147
148
// periodic boundary condition
149
if
( a & 0x1 )
150
cur ^= Hb>>1;
// flip highest bit
151
152
// find places where a electron can jump into
153
cur &= ~a;
154
155
while
(cur)
156
{
157
// isolate the rightmost 1 bit
158
myint
hop = cur & (~cur + 1);
159
160
cur ^= hop;
161
162
sign = 1;
163
164
if
(hop & Hb>>1)
165
{
166
hop += 0x1;
167
sign = jumpsign;
168
}
169
else
170
hop += hop<<1;
171
172
if
( (a ^ hop) == b )
173
{
174
result -= sign;
175
break
;
176
}
177
}
178
179
return
result;
180
}
181
188
void
Hamiltonian::mvprod
(
double
*x,
double
*y,
double
alpha)
const
189
{
190
double
beta = 1;
191
int
incx = 1;
192
char
uplo =
'U'
;
193
194
dsymv_
(&uplo,&
dim
,&beta,
ham
,&
dim
,x,&incx,&alpha,y,&incx);
195
}
196
197
/* vim: set ts=8 sw=4 tw=0 expandtab :*/
ham.cpp
Generated on Fri Mar 7 2014 14:52:13 for HubbardGPU by
1.8.3.1