sym-ildl  1.2
Incomplete LDL' factorizations of indefinite symmetric and skew-symmetric matrices.
lilc_matrix_sym_equil.h
1 //-*- mode: c++ -*-
2 #ifndef _LIL_MATRIX_SYM_EQUIL_H_
3 #define _LIL_MATRIX_SYM_EQUIL_H_
4 
5 using std::abs;
6 
7 template<class el_type>
9 
10  //find termination points for loops with binary search later.
11  int i, ncols = n_cols();
12  // this is required since we do S[i] = max(S[i], ...)
13  S.resize(ncols, 0);
14 
15  std::pair<idx_it, elt_it> elem_its;
16  for (i = 0; i < ncols; i++) {
17  //assumes diag elem is always in 0th pos. if possible.
18  if (!m_idx[i].empty() && m_idx[i][0] == i)
19  S[i] = sqrt(abs(m_x[i][0]));
20 
21  //assumes indices are ordered. since this procedure is run
22  //before factorization pivots matrix, this is a fair assumption
23  //for most matrix market matrices.
24  for (idx_it it = list[i].begin(); it != list[i].end(); it++) {
25  S[i] = std::max(S[i], abs(coeff(i, *it)));
26  }
27 
28  //S[i] > 0 since its the square root of a +ve number
29  if (S[i] > eps) {
30  for (idx_it it = list[i].begin(); it != list[i].end(); it++) {
31  coeffRef(i, *it, elem_its);
32 
33  //can use bin. search on coeff since no reordering is done yet.
34  *(elem_its.second) /= S[i];
35  }
36 
37  if (!m_idx[i].empty() && (m_idx[i][0] == i) )
38  m_x[i][0] /= S[i];
39  for (elt_it it = m_x[i].begin(); it != m_x[i].end(); it++) {
40  *it /= S[i];
41  }
42  }
43  }
44 
45  for (i = 0; i < ncols; i++) {
46  if (S[i] < eps) {
47  for (elt_it it = m_x[i].begin(); it != m_x[i].end(); it++) {
48  S[i] = std::max(S[i], abs(*it));
49  }
50 
51  if (S[i] < eps) {
52  std::cerr << "Error: Matrix has a null column/row." << std::endl;
53  return;
54  }
55 
56  for (elt_it it = m_x[i].begin(); it != m_x[i].end(); it++) {
57  *it /= S[i];
58  }
59  }
60  }
61 
62  for (i = 0; i < ncols; i++) {
63  S[i] = 1.0/S[i];
64  }
65 }
66 
67 #endif // _LIL_MATRIX_SYM_EQUIL_H_
void sym_equil()
The symmetric matrix A is equilibrated and the symmetric equilibrated matrix SAS is stored in A...
Definition: lilc_matrix_sym_equil.h:8