Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fopr_CRS.cpp
Go to the documentation of this file.
1 
15 #include "fopr_CRS.h"
16 
17 #include <fstream>
18 
19 using std::valarray;
20 using std::string;
21 
22 const std::string Fopr_CRS::class_name = "Fopr_CRS";
23 
24 //====================================================================
26 {
27  const string str_vlevel = params.get_string("verbose_level");
28 
29  m_vl = vout.set_verbose_level(str_vlevel);
30 }
31 
32 
33 //====================================================================
34 void Fopr_CRS::DdagD(Field& v, const Field& w)
35 {
36  Field w2(w.nin(), w.nvol(), w.nex());
37 
38  D(w2, w);
39  Ddag(v, w2);
40 }
41 
42 
43 //====================================================================
44 void Fopr_CRS::D(Field& v, const Field& w)
45 {
46  int Nsize = w.size() / 2;
47 
48  assert(Nsize == m_Nsize);
49  int Ncolumn;
50 
51  v = 0.0;
52  for (int j = 0; j < Nsize; ++j) {
53  if (j == Nsize - 1) {
54  Ncolumn = m_Nnz - m_rowidx_nz[j];
55  } else {
56  Ncolumn = m_rowidx_nz[j + 1] - m_rowidx_nz[j];
57  }
58 
59  double vr = 0.0;
60  double vi = 0.0;
61  for (int i = 0; i < Ncolumn; ++i) {
62  int i2 = i + m_rowidx_nz[j];
63  int k = m_column_nz[i2];
64  double wr = w.cmp(2 * k);
65  double wi = w.cmp(2 * k + 1);
66  vr += m_elem_nz[2 * i2] * wr - m_elem_nz[2 * i2 + 1] * wi;
67  vi += m_elem_nz[2 * i2] * wi + m_elem_nz[2 * i2 + 1] * wr;
68  v.set(2 * j, vr);
69  v.set(2 * j + 1, vi);
70  }
71  }
72 }
73 
74 
75 //====================================================================
76 void Fopr_CRS::Ddag(Field& v, const Field& w)
77 {
78  int Nsize = w.size() / 2;
79 
80  assert(Nsize == m_Nsize);
81  int Ncolumn;
82 
83  v = 0.0;
84  double vr, vi;
85 
86  for (int j = 0; j < Nsize; ++j) {
87  if (j == Nsize - 1) {
88  Ncolumn = m_Nnz - m_rowidx_nz[j];
89  } else {
90  Ncolumn = m_rowidx_nz[j + 1] - m_rowidx_nz[j];
91  }
92 
93  double wr = w.cmp(2 * j);
94  double wi = w.cmp(2 * j + 1);
95 
96  for (int i = 0; i < Ncolumn; ++i) {
97  int i2 = i + m_rowidx_nz[j];
98  int k = m_column_nz[i2];
99  vr = m_elem_nz[2 * i2] * wr + m_elem_nz[2 * i2 + 1] * wi;
100  vi = m_elem_nz[2 * i2] * wi - m_elem_nz[2 * i2 + 1] * wr;
101  v.add(2 * k, vr);
102  v.add(2 * k + 1, vi);
103  }
104  }
105 }
106 
107 
108 //====================================================================
110 {
111  // the implementation of this function assumes that the field
112  // is complex valued.
113 
114  assert(CommonParameters::NPE() == 1);
115 
116  m_Nin = m_fopr->field_nin();
117  m_Nvol = m_fopr->field_nvol();
118  m_Nex = m_fopr->field_nex();
119 
120  m_Nsize = (m_Nin / 2) * m_Nvol * m_Nex;
121 
122  Field w(m_Nin, m_Nvol, m_Nex), v(m_Nin, m_Nvol, m_Nex);
123 
124  int Nnz1;
125  valarray<int> index_nz1(m_Nsize);
126  valarray<double> elem_nz1(2 * m_Nsize);
127 
128  vout.general(m_vl, "Setting SRC matrix format.\n");
129  vout.general(m_vl, " Nex = %4d\n", m_Nex);
130 
131  //- estimate of matrix size
132  int Nnz_tot = 0;
133 
134  {
135  int in = 0;
136  {
137  int site = 0;
138  for (int ex = 0; ex < m_Nex; ++ex) {
139  w = 0.0;
140  w.set(in, site, ex, 1.0);
141  m_fopr->mult_dag(v, w);
142  set_matrix_1row(Nnz1, index_nz1, elem_nz1, v);
143  Nnz_tot += Nnz1;
144  vout.general(m_vl, " ex = %4d Nnz1 = %d\n", ex, Nnz1);
145  }
146  }
147  }
148  Nnz_tot *= (m_Nin / 2) * m_Nvol;
149  vout.general(m_vl, " Nnz_tot = %d\n", Nnz_tot);
150 
151  //- resize data array
152  m_Nnz = Nnz_tot;
153  m_rowidx_nz.resize(m_Nsize);
154  m_column_nz.resize(m_Nnz);
155  m_elem_nz.resize(2 * m_Nnz);
156 
157  //- setting CRS matrix
158  Nnz_tot = 0;
159  for (int ex = 0; ex < m_Nex; ++ex) {
160  vout.general(m_vl, " ex = %4d starts.\n", ex);
161  for (int site = 0; site < m_Nvol; ++site) {
162  for (int in2 = 0; in2 < (m_Nin / 2); ++in2) {
163  int j = in2 + (m_Nin / 2) * (site + m_Nvol * ex);
164 
165  w = 0.0;
166  w.set(2 * in2, site, ex, 1.0);
167  m_fopr->mult_dag(v, w);
168  set_matrix_1row(Nnz1, index_nz1, elem_nz1, v);
169  if (Nnz_tot + Nnz1 > m_Nnz) {
170  vout.crucial(m_vl, "unexpected data size in fopr_CRS::set_matrx\n");
171  abort();
172  }
173 
174  m_rowidx_nz[j] = Nnz_tot;
175  for (int i = 0; i < Nnz1; ++i) {
176  m_column_nz[Nnz_tot + i] = index_nz1[i];
177  m_elem_nz[2 * (Nnz_tot + i)] = elem_nz1[2 * i];
178  m_elem_nz[2 * (Nnz_tot + i) + 1] = elem_nz1[2 * i + 1];
179  }
180  Nnz_tot += Nnz1;
181  }
182  }
183  }
184 
185  m_Nnz = Nnz_tot;
186 
187  vout.general(m_vl, " Nnz(recalc) = %d\n", m_Nnz);
188 }
189 
190 
191 //====================================================================
192 void Fopr_CRS::set_matrix_1row(int& Nnz, valarray<int>& index_nz,
193  valarray<double>& elem_nz, Field& v)
194 {
195  // the implementation of this function assumes that the field
196  // is complex valued.
197 
198  int Nsize = v.size() / 2;
199 
200  int j = 0;
201 
202  for (int i = 0; i < Nsize; ++i) {
203  if ((v.cmp(2 * i) != 0.0) || (v.cmp(2 * i + 1) != 0.0)) {
204  index_nz[j] = i;
205  elem_nz[2 * j] = v.cmp(2 * i);
206  elem_nz[2 * j + 1] = -v.cmp(2 * i + 1);
207  ++j;
208  }
209  }
210  Nnz = j;
211 }
212 
213 
214 //====================================================================
215 void Fopr_CRS::set_matrix(string fname)
216 {
217  std::fstream config;
218 
219  config.open(fname.c_str(), std::ios::in);
220  if (!config.is_open()) {
221  vout.crucial(m_vl, "Failed to open the next file. %s(%d)",
222  __FILE__, __LINE__);
223  abort();
224  }
225 
226  vout.general(m_vl, "Reading CRS matrix from %s\n", fname.c_str());
227 
228  config >> m_Nin;
229  config >> m_Nvol;
230  config >> m_Nex;
231  config >> m_Nsize;
232  config >> m_Nnz;
233 
234  m_rowidx_nz.resize(m_Nsize);
235  m_column_nz.resize(m_Nnz);
236  m_elem_nz.resize(2 * m_Nnz);
237 
238  for (int j = 0; j < m_Nsize; ++j) {
239  config >> m_rowidx_nz[j];
240  m_rowidx_nz[j] -= 1;
241  }
242 
243  for (int j = 0; j < m_Nnz; ++j) {
244  config >> m_column_nz[j];
245  m_column_nz[j] -= 1;
246  }
247 
248  for (int j = 0; j < m_Nnz; ++j) {
249  config >> m_elem_nz[2 * j];
250  config >> m_elem_nz[2 * j + 1];
251  }
252 
253  config.close();
254 
255  vout.general(m_vl, "Reading CRS matrix finished.\n");
256 }
257 
258 
259 //====================================================================
260 void Fopr_CRS::write_matrix(string fname)
261 {
262  std::fstream config;
263 
264  config.open(fname.c_str(), std::ios::out);
265  if (!config.is_open()) {
266  vout.crucial(m_vl, "Failed to open the text file. %s(%d)\n",
267  __FILE__, __LINE__);
268  abort();
269  }
270 
271  vout.general(m_vl, "Writing CRS matrix to %s\n", fname.c_str());
272 
273  config << m_Nin << std::endl;
274  config << m_Nvol << std::endl;
275  config << m_Nex << std::endl;
276  config << m_Nsize << std::endl;
277  config << m_Nnz << std::endl;
278 
279  for (int j = 0; j < m_Nsize; ++j) {
280  config << m_rowidx_nz[j] + 1 << std::endl;
281  }
282 
283  for (int j = 0; j < m_Nnz; ++j) {
284  config << m_column_nz[j] + 1 << std::endl;
285  }
286 
287  config.setf(std::ios_base::scientific, std::ios_base::floatfield);
288  config.precision(14);
289 
290  for (int j = 0; j < m_Nnz; ++j) {
291  config << m_elem_nz[2 * j] << std::endl;
292  config << m_elem_nz[2 * j + 1] << std::endl;
293  }
294 
295  config.close();
296 
297  vout.general(m_vl, "Writing CRS matrix finished.\n");
298 }
299 
300 
301 //====================================================================
302 //============================================================END=====
int m_Nin
Definition: fopr_CRS.h:44
int m_Nsize
Definition: fopr_CRS.h:45
BridgeIO vout
Definition: bridgeIO.cpp:207
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:128
int m_Nvol
Definition: fopr_CRS.h:44
virtual const Field mult_dag(const Field &)
hermitian conjugate of mult(const Field&amp;).
Definition: fopr.h:60
void general(const char *format,...)
Definition: bridgeIO.cpp:38
Container of Field-type object.
Definition: field.h:37
int nvol() const
Definition: field.h:101
double cmp(const int jin, const int site, const int jex) const
Definition: field.h:108
void Ddag(Field &, const Field &)
Definition: fopr_CRS.cpp:76
Class for parameters.
Definition: parameters.h:40
std::valarray< int > m_column_nz
Definition: fopr_CRS.h:47
int m_Nex
Definition: fopr_CRS.h:44
virtual int field_nin()=0
returns the on-site d.o.f. for which the fermion operator is defined.
std::valarray< int > m_rowidx_nz
Definition: fopr_CRS.h:46
int nin() const
Definition: field.h:100
int m_Nnz
Definition: fopr_CRS.h:45
Bridge::VerboseLevel m_vl
Definition: fopr.h:99
void write_matrix(std::string)
Definition: fopr_CRS.cpp:260
virtual int field_nex()=0
returns the external d.o.f. for which the fermion operator is defined.
int nex() const
Definition: field.h:102
void set_matrix()
Definition: fopr_CRS.cpp:109
void set_parameters(const Parameters &)
Definition: fopr_CRS.cpp:25
static const std::string class_name
Definition: fopr_CRS.h:41
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
void add(const int jin, const int site, const int jex, double v)
Definition: field.h:140
void DdagD(Field &, const Field &)
Definition: fopr_CRS.cpp:34
std::valarray< double > m_elem_nz
Definition: fopr_CRS.h:48
void set_matrix_1row(int &, std::valarray< int > &, std::valarray< double > &, Field &)
Definition: fopr_CRS.cpp:192
void D(Field &, const Field &)
Definition: fopr_CRS.cpp:44
string get_string(const string &key) const
Definition: parameters.cpp:85
virtual int field_nvol()=0
returns the volume for which the fermion operator is defined.
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191
Fopr * m_fopr
Definition: fopr_CRS.h:50
static int NPE()
int size() const
Definition: field.h:106