File: SizesAndBlocks.h

package info (click to toggle)
ergo 3.8-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 17,396 kB
  • sloc: cpp: 94,740; ansic: 17,015; sh: 7,559; makefile: 1,402; yacc: 127; lex: 110; awk: 23
file content (120 lines) | stat: -rw-r--r-- 4,361 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* Ergo, version 3.8, a program for linear scaling electronic structure
 * calculations.
 * Copyright (C) 2019 Elias Rudberg, Emanuel H. Rubensson, Pawel Salek,
 * and Anastasia Kruchinina.
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * Primary academic reference:
 * Ergo: An open-source program for linear-scaling electronic structure
 * calculations,
 * Elias Rudberg, Emanuel H. Rubensson, Pawel Salek, and Anastasia
 * Kruchinina,
 * SoftwareX 7, 107 (2018),
 * <http://dx.doi.org/10.1016/j.softx.2018.03.005>
 * 
 * For further information about Ergo, see <http://www.ergoscf.org>.
 */

/** @file SizesAndBlocks.h

    \brief Class used to keep track of the block sizes used at
    different levels in the hierarchical matrix data structure.
*/

#ifndef MAT_SIZESANDBLOCKS
#define MAT_SIZESANDBLOCKS
#include "matInclude.h"
namespace mat{

  /** Describes dimensions of matrix and its blocks on all levels.
      The key ability is to provide the count and size of blocks, and
      their offset in the entire matrix.  It can generate a
      corresponding object for lower-level blocks. */
  class SizesAndBlocks { 
  public:
    /** Default constructor. */
    SizesAndBlocks()
      :nBlocks(0), nScalars(0), offset(0), nTotalScalars(0) {}
    /** Copy constructor. */
    SizesAndBlocks(SizesAndBlocks const & other);
    /** Constructor used for explicit calls. 
     *  For sizes and blocks at the highest level.
     *  nScalarsInp is the number of total scalar rows/columns in this case.
     */
  SizesAndBlocks(std::vector<int> const & blockSizesInp, 
		 int const nScalarsInp)
    : nBlocks(0), 
      nScalars(nScalarsInp), offset(0), nTotalScalars(nScalarsInp) {
      setup(blockSizesInp);
    }
    /** Assignment operator. */
    SizesAndBlocks& operator=
      (SizesAndBlocks const & other);
    
    bool operator==(SizesAndBlocks const & other) const;
    
    SizesAndBlocks 
      getSizesAndBlocksForLowerLevel(int const blockNumber) const;
    
    inline bool is_empty() const {return blockSizes.empty();}
    inline int const & getNBlocks() const {return nBlocks;}
    inline int const & getNScalars() const {return nScalars;}
    void getBlockSizeVector(std::vector<int> & blockSizesCopy) const;
    /** Returns the blocknumber (between 0 and nBlocks-1) 
     *  that contains elements with the given global index.
     *    
     */
    inline int whichBlock(int const globalIndex) const {
      return (globalIndex - offset) / blockSizes[0]; /* Integer division */
    }
    
    inline int getOffset() const {return offset;}
    inline int getNTotalScalars() const {return nTotalScalars;}
    ~SizesAndBlocks() {}
  protected:
    std::vector<int> blockSizes;
    /**< This is the number of scalars in each block,
     * (not the number of blocks in each block) for 
     * each level starting with the highest level.
     * It should be 1 at the lowest level.
     * Example: [1000 100 10 1]
     * Length is level() + 1
     */
    int nBlocks;          /**< This is the number of blocks in the current 
			   * block.
			   *
			   * == nScalars at lowest level */
      
    int nScalars;      /**< Number of scalars in the current block.  */
    int offset;        /**< Offset in entire system. */
    int nTotalScalars; /**< Total number of scalars in entire system. */
      
  SizesAndBlocks(std::vector<int> const & blockSizesInp, 
		 int const nScalarsInp,
		 int const offsetInp,
		 int const nTotalScalarsInp) 
    : nBlocks(0),
      nScalars(nScalarsInp), offset(offsetInp), 
      nTotalScalars(nTotalScalarsInp) {
	setup(blockSizesInp);
      }
    
    void setup(std::vector<int> const & blockSizesInp);
    
  private:
  }; /* end of class SizesAndBlocks */
  
} /* end namespace mat */
#endif