CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
Template_Algorithms.hh
Go to the documentation of this file.
1 #ifndef TEMPLATE_ALGORITHMS_HH
2 #define TEMPLATE_ALGORITHMS_HH
3 
4 #include <cmath>
5 
6 //#include "casm/../CASM_global_definitions.cc"
7 
8 namespace CASM {
9 
10  /*
11  template<class Container, class T>
12  class GaussJordan {
13  public:
14  static void eliminate(Array<Container> &rows, double elim_tol = TOL) {
15  if(rows.size() == 0) return;
16 
17 
18  int i, j, nc, nr, min_row_num = 0;
19  Container trow;
20 
21  //Loop over columns
22  for(nc = 0; nc < rows[0].size(); nc++) {
23 
24  //Loop over rows
25  for(nr = min_row_num; nr < rows.size(); nr++) {
26  if(std::abs(rows[nr][nc]) < TOL) {
27  rows[nr][nc] = 0;
28  continue;
29  }
30 
31  trow = rows[nr];
32  rows[nr] = rows[min_row_num];
33  rows[min_row_num] = trow;
34 
35  rows[min_row_num] /= rows[min_row_num][nc];
36  break;
37  }
38 
39  if(nr >= rows.size()) continue;
40 
41  for(i = 0; i < rows.size(); i++) {
42  if(i != min_row_num && elim_tol < std::abs(rows[i][nc]))
43  rows[i] -= rows[i][nc] * rows[min_row_num];
44 
45  }
46 
47  min_row_num++;
48  }
49 
50  for(nr = rows.size() - 1; nr >= 0; nr--) {
51  for(nc = 0; nc < rows[nr].size(); nc++) {
52  if(elim_tol < std::abs(rows[nr][nc]))
53  break;
54  rows[nr][nc] = 0;
55  }
56  if(nc == rows[nr].size())
57  rows.pop_back();
58  }
59  return;
60  };
61 
62  };
63  */
64  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
65  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
66  /*
67  template<class Container, class T>
68  class GaussElim {
69  public:
70  static void eliminate(Array<Container> &rows, double elim_tol = TOL) {
71  if(rows.size() == 0) return;
72 
73 
74  int i, j, nc, nr, min_row_num = 0;
75  Container trow;
76  for(nc = 0; nc < rows[0].size(); nc++) {
77 
78  for(nr = min_row_num; nr < rows.size(); nr++) {
79  if(std::abs(rows[nr][nc]) < TOL) {
80  rows[nr][nc] = 0;
81  continue;
82  }
83 
84  trow = rows[nr];
85  rows[nr] = rows[min_row_num];
86  rows[min_row_num] = trow;
87 
88  rows[min_row_num] /= rows[min_row_num][nc];
89  break;
90  }
91 
92  if(nr >= rows.size()) continue;
93 
94  for(i = min_row_num + 1; i < rows.size(); i++) {
95  if(elim_tol < std::abs(rows[i][nc]))
96  rows[i] -= rows[i][nc] * rows[min_row_num];
97 
98  }
99 
100  min_row_num++;
101  }
102 
103  for(nr = rows.size() - 1; nr >= 0; nr--) {
104  for(nc = 0; nc < rows[nr].size(); nc++) {
105  if(elim_tol < std::abs(rows[nr][nc]))
106  break;
107  rows[nr][nc] = 0;
108  }
109  if(nc == rows[nr].size())
110  rows.pop_back();
111  }
112  return;
113  };
114 
115 
116  };
117  */
118  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
119  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
120 
121  template<class Container, class T>
122  class GramSchmidt {
123  public:
124  static void orthogonalize(Array<Container> &rows) {
125 
126  Index i, j;
127  T tcoeff;
128  for(i = 0; i < rows.size(); i++) {
129  for(j = 0; j < i; j++)
130  rows[i] -= dot(rows[i], rows[j]) * rows[j];
131 
132  tcoeff = norm(rows[i]);
133  if(TOL < tcoeff)
134  rows[i] /= tcoeff;
135 
136  else {
137  rows.remove(i);
138  i--;
139  }
140 
141  }
142  return;
143  }
144  };
145 
146 
147 };
148 #endif /* TEMPLATE_ALGORITHMS_HPP */
Index size() const
Definition: Array.hh:145
static void orthogonalize(Array< Container > &rows)
Main CASM namespace.
Definition: complete.cpp:8
const double TOL
T norm(const Tensor< T > &ttens)
Definition: Tensor.hh:968
EigenIndex Index
For long integer indexing:
T dot(const Tensor< T > &LHS, const Tensor< T > &RHS)
Definition: Tensor.hh:961
Basic std::vector like container (deprecated)
void remove(Index ind)
Definition: Array.hh:546