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