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