File: density_projection.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 (126 lines) | stat: -rw-r--r-- 5,171 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
121
122
123
124
125
126
/* 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 density_projection.h

    @brief Functionality for preparing a starting guess density matrix
    given a previous density matrix. The old density is read from
    file, and a projection between the basis sets is performed.

    @author: Elias Rudberg <em>responsible</em>
*/

#ifndef DENSITY_PROJECTION
#define DENSITY_PROJECTION

#include "basisinfo.h"
#include "matrix_typedefs.h"
#include "GetDensFromFock.h"

/** load_density_and_project_full loads one or two density matrices (depending
    on value of noOfDensityMatrices) from the file specified by
    densityFileName. 
    @param densityFileName Name of file to load density matrices from
    @param noOfDensityMatrices Number of density matrices to load
    @param integralInfo static helper object for
    integral evaluation. 
    @param basisInfo the basis set that the density is
    to be expanded into (if the original density was expressed with
    help of other basis set, an apriopriate projection will be
    performed). 
    @param densityMatrixList must be already allocated and have
    proper dimension. 
    @param do_purification determines whether an additional
    purification is to be run after the projection. 
    @param noOfElectronsList is an one or two element array specyfying 
    the number of total electrons (one element) 
    or alpha and beta electrons (two elements).
    @param electronic_temperature Electronic temperature
*/
int load_density_and_project_full(const char *densityFileName,
				  int noOfDensityMatrices,
				  const IntegralInfo* integralInfo,
				  const BasisInfoStruct & basisInfo,
				  ergo_real** densityMatrixList,
				  int do_purification,
				  const int* noOfElectronsList,
				  ergo_real electronic_temperature);


/** load_density_and_project_sparse loads one or two density matrices (depending
    on value of noOfDensityMatrices) from the file specified by
    densityFileName. 

    The projection is done as follows:
    First, a matrix R is computed. 
    R is the overlap matrix between the two basis sets.
    Then RT * P * R is computed, where P is the starting guess density matrix
    read from file.
    To get a final projected density one could then multiply by S_inv from
    both sides, but to prepare for purification the matrix S*D*S is needed,
    so we skip multiplication by S_inv since it will anyway be cancelled out.

    @param DensFromFock Instance of GetDensFromFock class contatining all data for computing the density matrix.
    @param densityFileName Name of file to load density matrices from
    @param noOfDensityMatrices Number of density matrices to load
    @param integralInfo static helper object for
    integral evaluation. 
    @param basisInfo the basis set that the density is
    to be expanded into (if the original density was expressed with
    help of other basis set, an apriopriate projection will be
    performed). 
    @param S_symm Overlap matrix
    @param densityMatrixList pointers to one or two empty matrices that will 
    contain the result.
    Purification is always run after the projection. 
    @param noOfElectronsList is an one or two element array specyfying 
    the number of total electrons (one element) 
    or alpha and beta electrons (two elements).
    @param matrix_size_block_info Information about HML matrix block sizes etc.
    @param matrixPermutationVec Permutation vector used when calling matrix lib.
    @param sparse_threshold Threshold used when truncating matrices.

*/
int 
load_density_and_project_sparse(GetDensFromFock &DensFromFock,
				const char *densityFileName,
				int noOfDensityMatrices,
				const IntegralInfo* integralInfo,
				const BasisInfoStruct & basisInfo,
				symmMatrix & S_symm,
				symmMatrix** densityMatrixList,
				const int* noOfElectronsList,
				mat::SizesAndBlocks matrix_size_block_info,
				std::vector<int> const & matrixPermutationVec,
				ergo_real sparse_threshold);




#endif /*  DENSITY_PROJECTION */