diff --git a/src/MGmol.h b/src/MGmol.h index 07e0278e..3d183f19 100644 --- a/src/MGmol.h +++ b/src/MGmol.h @@ -236,24 +236,10 @@ class MGmol : public MGmolInterface const KBPsiMatrixSparse* const kbpsi_j, MatrixType& mat, const bool consolidate); -#ifdef MGMOL_USE_SCALAPACK - void computeHij_private(OrbitalsType& orbitals_i, OrbitalsType& orbitals_j, - const Ions& ions, const KBPsiMatrixSparse* const kbpsi_i, - const KBPsiMatrixSparse* const kbpsi_j, - dist_matrix::DistMatrix& mat); - + template void computeHij(OrbitalsType& orbitals_i, OrbitalsType& orbitals_j, - const Ions& ions, const KBPsiMatrixSparse* const kbpsi, - dist_matrix::DistMatrix& mat, const bool consolidate); - - void computeHij_private(OrbitalsType& orbitals_i, OrbitalsType& orbitals_j, const Ions& ions, const KBPsiMatrixSparse* const kbpsi_i, - dist_matrix::DistMatrix& mat); -#endif - - void computeHij(OrbitalsType& orbitals_i, OrbitalsType& orbitals_j, - const Ions& ions, const KBPsiMatrixSparse* const kbpsi, - VariableSizeMatrix& mat, const bool consolidate); + MatrixType& mat, const bool consolidate); void computeHij(OrbitalsType& orbitals_i, OrbitalsType& orbitals_j, const Ions& ions, const KBPsiMatrixSparse* const kbpsi, diff --git a/src/computeHij.cc b/src/computeHij.cc index 0de557e0..e529ef19 100644 --- a/src/computeHij.cc +++ b/src/computeHij.cc @@ -11,20 +11,15 @@ #include #include "Control.h" -#include "Energy.h" #include "GridFuncVector.h" #include "Hamiltonian.h" #include "Ions.h" #include "KBPsiMatrixSparse.h" -#include "Lap.h" #include "MGmol.h" #include "MGmol_MPI.h" -#include "MGmol_blas1.h" #include "Mesh.h" #include "Potentials.h" #include "ProjectedMatricesInterface.h" -#include "ProjectedMatricesSparse.h" -#include "ReplicatedMatrix.h" #ifdef MGMOL_USE_SCALAPACK #include "DistMatrix.h" @@ -75,6 +70,7 @@ void MGmol>::computeHij( } } +template <> template <> void MGmol>::computeHij( LocGridOrbitals& orbitals_i, @@ -113,14 +109,7 @@ void MGmol>::computeHij( // sparsify matrix rows according to pattern/ clear rows corresponding // to non-centered data - std::vector pattern(mat.n(), 0); - for (std::vector::iterator it = locfcns.begin(); - it != locfcns.end(); ++it) - { - const int* rindex = (int*)mat.getTableValue(*it); - pattern[*rindex] = 1; - } - mat.sparsify(pattern); + mat.sparsify(locfcns); DataDistribution distributor( "Hij", 2 * (*lrs_).max_radii(), myPEenv, domain); @@ -128,86 +117,44 @@ void MGmol>::computeHij( } } -#ifdef MGMOL_USE_SCALAPACK template -void MGmol::computeHij_private(OrbitalsType& orbitals_i, +template +void MGmol::computeHij(OrbitalsType& orbitals_i, OrbitalsType& orbitals_j, const Ions& ions, const KBPsiMatrixSparse* const kbpsi_i, - const KBPsiMatrixSparse* const kbpsi_j, - dist_matrix::DistMatrix& hij) + const KBPsiMatrixSparse* const kbpsi_j, MatrixType& hij, + const bool consolidate) { + (void)consolidate; + #ifdef PRINT_OPERATIONS if (onpe0) os_ << "computeHij() at line " << __LINE__ << std::endl; #endif - hij.clear(); - - SquareSubMatrix submat(kbpsi_i->computeHvnlMatrix(kbpsi_j, ions)); - - SquareSubMatrix2DistMatrix* ss2dm = SquareSubMatrix2DistMatrix::instance(); - ss2dm->accumulate(submat, hij, 0.); + kbpsi_i->computeHvnlMatrix(kbpsi_j, ions, hij); // add local Hamiltonian part to phi^T*H*phi hamiltonian_->addHlocal2matrix(orbitals_i, orbitals_j, hij, true); } -template <> -template <> -void MGmol>::computeHij( - LocGridOrbitals& orbitals_i, - LocGridOrbitals& orbitals_j, const Ions& ions, - const KBPsiMatrixSparse* const kbpsi, - const KBPsiMatrixSparse* const kbpsi_j, - dist_matrix::DistMatrix& hij, const bool consolidate) -{ - (void)consolidate; - - computeHij_private(orbitals_i, orbitals_j, ions, kbpsi, kbpsi_j, hij); -} - -template <> -template <> -void MGmol>::computeHij( - ExtendedGridOrbitals& orbitals_i, - ExtendedGridOrbitals& orbitals_j, const Ions& ions, - const KBPsiMatrixSparse* const kbpsi, - const KBPsiMatrixSparse* const kbpsi_j, - dist_matrix::DistMatrix& hij, const bool consolidate) -{ - (void)consolidate; - - computeHij_private(orbitals_i, orbitals_j, ions, kbpsi, kbpsi_j, hij); -} - template +template void MGmol::computeHij(OrbitalsType& orbitals_i, OrbitalsType& orbitals_j, const Ions& ions, - const KBPsiMatrixSparse* const kbpsi, dist_matrix::DistMatrix& hij, + const KBPsiMatrixSparse* const kbpsi, MatrixType& hij, const bool consolidate) { (void)consolidate; - computeHij_private(orbitals_i, orbitals_j, ions, kbpsi, hij); -} - -template -void MGmol::computeHij_private(OrbitalsType& orbitals_i, - OrbitalsType& orbitals_j, const Ions& ions, - const KBPsiMatrixSparse* const kbpsi, dist_matrix::DistMatrix& hij) -{ #ifdef PRINT_OPERATIONS if (onpe0) os_ << "computeHij() at line" << __LINE__ << std::endl; #endif - SquareSubMatrix submat(kbpsi->computeHvnlMatrix(ions)); - - SquareSubMatrix2DistMatrix* ss2dm = SquareSubMatrix2DistMatrix::instance(); - ss2dm->accumulate(submat, hij, 0.); + kbpsi->computeHvnlMatrix(kbpsi, ions, hij); // add local Hamiltonian part to phi^T*H*phi hamiltonian_->addHlocal2matrix(orbitals_i, orbitals_j, hij, false); } -#endif template void MGmol::computeHij(OrbitalsType& orbitals_i, @@ -396,3 +343,31 @@ void MGmol::getHpsiAndTheta(Ions& ions, OrbitalsType& phi, template class MGmol>; template class MGmol>; + +#ifdef MGMOL_USE_SCALAPACK +template void +MGmol>::computeHij>( + LocGridOrbitals& orbitals_i, + LocGridOrbitals& orbitals_j, const Ions& ions, + const KBPsiMatrixSparse* const kbpsi_i, + const KBPsiMatrixSparse* const kbpsi_j, + dist_matrix::DistMatrix& mat, const bool consolidate); +template void +MGmol>::computeHij>( + LocGridOrbitals& orbitals_i, + LocGridOrbitals& orbitals_j, const Ions& ions, + const KBPsiMatrixSparse* const kbpsi, dist_matrix::DistMatrix& mat, + const bool consolidate); + +template void MGmol>::computeHij< + dist_matrix::DistMatrix>(ExtendedGridOrbitals& orbitals_i, + ExtendedGridOrbitals& orbitals_j, const Ions& ions, + const KBPsiMatrixSparse* const kbpsi_i, + const KBPsiMatrixSparse* const kbpsi_j, + dist_matrix::DistMatrix& mat, const bool consolidate); +template void MGmol>::computeHij< + dist_matrix::DistMatrix>(ExtendedGridOrbitals& orbitals_i, + ExtendedGridOrbitals& orbitals_j, const Ions& ions, + const KBPsiMatrixSparse* const kbpsi, dist_matrix::DistMatrix& mat, + const bool consolidate); +#endif