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 */
|