ergo
grid_matrix.h
Go to the documentation of this file.
1 /* Ergo, version 3.4, a program for linear scaling electronic structure
2  * calculations.
3  * Copyright (C) 2014 Elias Rudberg, Emanuel H. Rubensson, and Pawel Salek.
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * Primary academic reference:
19  * Kohn−Sham Density Functional Theory Electronic Structure Calculations
20  * with Linearly Scaling Computational Time and Memory Usage,
21  * Elias Rudberg, Emanuel H. Rubensson, and Pawel Salek,
22  * J. Chem. Theory Comput. 7, 340 (2011),
23  * <http://dx.doi.org/10.1021/ct100611z>
24  *
25  * For further information about Ergo, see <http://www.ergoscf.org>.
26  */
27 #if !defined(_GRID_MATRIX_H_)
28 #define _GRID_MATRIX_H_ 1
29 
30 #include "sparse_matrix.h"
31 
32 namespace Dft {
35  class Matrix {
36  public:
37  virtual ergo_real at(int row, int col) const = 0;
38  virtual bool isSparse() const = 0;
39  virtual const SparseMatrix* asSparse() const = 0;
40  virtual const ergo_real* asFull() const = 0;
41  virtual ~Matrix() {}
42  };
43 
44  class FullMatrix {
45  public:
47  int nbast;
48  bool owned;
49  explicit FullMatrix(int nbast_)
50  : mat(new ergo_real[nbast_*nbast_]), nbast(nbast_), owned(true)
51  {
52  for(int i= nbast*nbast-1; i >=0; --i) mat[i] = 0.0;
53  }
54  FullMatrix(ergo_real *m, int nbast_)
55  : mat(m), nbast(nbast_), owned(false)
56  {
57  }
59  FullMatrix(const ergo_real *m, int nbast_)
60  : mat( (ergo_real*)(m)), nbast(nbast_), owned(false)
61  {
62  }
63 
64  ~FullMatrix() { if (owned && mat) delete []mat; }
65  void add(int row, int col, ergo_real val)
66  {
67  mat[row + col*nbast] += val;
68  }
69  ergo_real at(int row, int col) const
70  {
71  return mat[row + col*nbast];
72  }
73  };
74 
75 };
76 
77 #endif /* _GRID_MATRIX_H_ */
~FullMatrix()
Definition: grid_matrix.h:64
double ergo_real
Definition: realtype.h:53
virtual const SparseMatrix * asSparse() const =0
Declares a sparse matrix optimized for the XC code.
bool owned
Definition: grid_matrix.h:48
int nbast
Definition: grid_matrix.h:47
virtual const ergo_real * asFull() const =0
Generic matrix interface.
Definition: grid_matrix.h:35
FullMatrix(int nbast_)
Definition: grid_matrix.h:49
virtual bool isSparse() const =0
virtual ~Matrix()
Definition: grid_matrix.h:41
Sparse matrix structure optimized for XC data access pattern.
Definition: sparse_matrix.h:54
FullMatrix(ergo_real *m, int nbast_)
Definition: grid_matrix.h:54
ergo_real at(int row, int col) const
Definition: grid_matrix.h:69
ergo_real * mat
Definition: grid_matrix.h:46
Definition: grid_matrix.h:44
void add(int row, int col, ergo_real val)
Definition: grid_matrix.h:65
virtual ergo_real at(int row, int col) const =0
FullMatrix(const ergo_real *m, int nbast_)
ugly-hack constructor.
Definition: grid_matrix.h:59
Definition: grid_matrix.h:32