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