From e740e9833af386db91521c8120163fdc95277b3a Mon Sep 17 00:00:00 2001 From: Yu Liu Date: Wed, 28 Apr 2021 12:00:54 +0800 Subject: [PATCH] (1)delete DM_pool; (2)change DM to matrix --- .../source/src_io/istate_charge.cpp | 3 +- ABACUS.develop/source/src_io/read_dm.cpp | 6 ++- ABACUS.develop/source/src_io/write_dm.cpp | 6 ++- ABACUS.develop/source/src_lcao/DM_gamma.cpp | 49 +++++++++++-------- .../source/src_lcao/gint_gamma_mull.cpp | 3 +- .../source/src_lcao/gint_gamma_rho.cpp | 24 +++++++-- .../source/src_lcao/local_orbital_charge.cpp | 34 ++++++------- .../source/src_lcao/local_orbital_charge.h | 11 ++++- .../exx_abfs-parallel-communicate-dm.cpp | 6 ++- ABACUS.develop/source/src_ri/exx_lcao.cpp | 3 +- 10 files changed, 93 insertions(+), 52 deletions(-) diff --git a/ABACUS.develop/source/src_io/istate_charge.cpp b/ABACUS.develop/source/src_io/istate_charge.cpp index 03b45f0503..96731511e8 100644 --- a/ABACUS.develop/source/src_io/istate_charge.cpp +++ b/ABACUS.develop/source/src_io/istate_charge.cpp @@ -156,7 +156,8 @@ void IState_Charge::idmatrix(const int &ib) if ( mu_local >= 0) { // set a pointer. - double *alpha = LOC.DM[is][mu_local]; + //double *alpha = LOC.DM[is][mu_local]; + double *alpha = &LOC.DM[is](mu_local,0); for (int j=i; j> DM[is][i][j]; + //ifs >> DM[is][i][j]; + ifs >> DM[is](i,j); } } } @@ -164,7 +165,8 @@ void Local_Orbital_Charge::read_dm(const int &is, const string &fn) const int nu = GridT.trace_lo[j]; if(nu >= 0) { - DM[is][mu][nu] = tmp[j]; + //DM[is][mu][nu] = tmp[j]; + DM[is](mu,nu) = tmp[j]; } } } diff --git a/ABACUS.develop/source/src_io/write_dm.cpp b/ABACUS.develop/source/src_io/write_dm.cpp index c354c8a0cf..1bafe5b4b2 100644 --- a/ABACUS.develop/source/src_io/write_dm.cpp +++ b/ABACUS.develop/source/src_io/write_dm.cpp @@ -130,7 +130,8 @@ void Local_Orbital_Charge::write_dm( for(int j=0; jDM[is][i][j]; + //ofs << " " << this->DM[is][i][j]; + ofs << " " << this->DM[is](i,j); } } } @@ -178,7 +179,8 @@ void Local_Orbital_Charge::write_dm( const int nu = GridT.trace_lo[j]; if (nu >=0) { - tmp[j] = DM[is][mu][nu]; + //tmp[j] = DM[is][mu][nu]; + tmp[j] = DM[is](mu,nu); //ofs_running << " dmi=" << i << " j=" << j << " " << DM[is][mu][nu] << endl; } } diff --git a/ABACUS.develop/source/src_lcao/DM_gamma.cpp b/ABACUS.develop/source/src_lcao/DM_gamma.cpp index 81a89fe62d..04c4856dbf 100644 --- a/ABACUS.develop/source/src_lcao/DM_gamma.cpp +++ b/ABACUS.develop/source/src_lcao/DM_gamma.cpp @@ -220,13 +220,13 @@ void Local_Orbital_Charge::allocate_gamma(const Grid_Technique >) if(this->init_DM) { assert(lgd_last > 0); - for (int is=0; is 0) { - this->DM = new double**[NSPIN]; - this->DM_pool = new double *[NSPIN]; + this->DM = new matrix [NSPIN]; + //this->DM_pool = new double *[NSPIN]; for(int is=0; isDM_pool[is]=new double [lgd_now*lgd_now]; - ZEROS(DM_pool[is], lgd_now*lgd_now); - this->DM[is] = new double*[lgd_now]; + //this->DM_pool[is]=new double [lgd_now*lgd_now]; + //ZEROS(DM_pool[is], lgd_now*lgd_now); + this->DM[is].create(lgd_now, lgd_now); + this->DM[is].zero_out(); - for (int i=0; iinit_DM = true; @@ -343,7 +344,8 @@ void Local_Orbital_Charge::cal_dk_gamma_from_2D(void) const int idx=receiver_local_index[i]; const int icol=idx%lgd_now; const int irow=(idx-icol)/lgd_now; - DM[is][irow][icol]=receiver_buffer[i]; + DM[is](irow,icol)=receiver_buffer[i]; + //DM[is][irow][icol]=receiver_buffer[i]; //DM[is][icol][irow]=receiver_buffer[i]; if(receiver_buffer[i]!=0) ++nNONZERO; } @@ -380,7 +382,8 @@ void Local_Orbital_Charge::cal_dk_gamma_from_2D(void) { int jj=GridT.trace_lo[j]; if(jj<0) continue; - ofs_running<DM[is][i], lgd_now); - } + }*/ + this->DM[is].zero_out(); } // initialize @@ -538,7 +542,8 @@ void Local_Orbital_Charge::cal_dk_gamma(void) const int col_index = col_count*300 + i_col; const int col_nu = GridT.trace_lo[col_index]; if(col_nu<0) continue; - this->DM[is][row_mu][col_nu] = rho_row_col(i_row,i_col); + //this->DM[is][row_mu][col_nu] = rho_row_col(i_row,i_col); + this->DM[is](row_mu,col_nu) = rho_row_col(i_row,i_col); } } } @@ -561,16 +566,20 @@ void Local_Orbital_Charge::cal_dk_gamma(void) if(idx0>=0) { - ofs_running<<"DM(0,0)"<=0 && idx1>=0) { - ofs_running<<"DM(0,1)"<=0) { - ofs_running<<"DM(1,1)"<nw; diff --git a/ABACUS.develop/source/src_lcao/gint_gamma_rho.cpp b/ABACUS.develop/source/src_lcao/gint_gamma_rho.cpp index 2b373b4bd4..d2e486dd72 100644 --- a/ABACUS.develop/source/src_lcao/gint_gamma_rho.cpp +++ b/ABACUS.develop/source/src_lcao/gint_gamma_rho.cpp @@ -190,9 +190,13 @@ void Gint_Gamma::cal_band_rho( // if enough cal_flag is nonzero if(cal_num>ib_length/4) { - dsymm_(&side, &uplo, &bsize[ia1], &ib_length, + /*dsymm_(&side, &uplo, &bsize[ia1], &ib_length, &alpha_symm, &LOC.DM[is][iw1_lo][iw1_lo], &GridT.lgd, &psir_ylm[first_ib][colidx[ia1]], &LD_pool, + &beta, &psir_DM[first_ib][colidx[ia1]], &LD_pool);*/ + dsymm_(&side, &uplo, &bsize[ia1], &ib_length, + &alpha_symm, &LOC.DM[is](iw1_lo,iw1_lo), &GridT.lgd, + &psir_ylm[first_ib][colidx[ia1]], &LD_pool, &beta, &psir_DM[first_ib][colidx[ia1]], &LD_pool); } else @@ -202,9 +206,13 @@ void Gint_Gamma::cal_band_rho( { if(cal_flag[ib][ia1]>0) { - dsymv_(&uplo, &bsize[ia1], + /*dsymv_(&uplo, &bsize[ia1], &alpha_symm, &LOC.DM[is][iw1_lo][iw1_lo], &GridT.lgd, &psir_ylm[ib][colidx[ia1]], &inc, + &beta, &psir_DM[ib][colidx[ia1]], &inc);*/ + dsymv_(&uplo, &bsize[ia1], + &alpha_symm, &LOC.DM[is](iw1_lo,iw1_lo), &GridT.lgd, + &psir_ylm[ib][colidx[ia1]], &inc, &beta, &psir_DM[ib][colidx[ia1]], &inc); } } @@ -241,9 +249,13 @@ void Gint_Gamma::cal_band_rho( int iw2_lo=block_iw[ia2]; if(cal_pair_num>ib_length/4) { - dgemm_(&transa, &transb, &bsize[ia2], &ib_length, &bsize[ia1], + /*dgemm_(&transa, &transb, &bsize[ia2], &ib_length, &bsize[ia1], &alpha_gemm, &LOC.DM[is][iw1_lo][iw2_lo], &GridT.lgd, &psir_ylm[first_ib][colidx[ia1]], &LD_pool, + &beta, &psir_DM[first_ib][colidx[ia2]], &LD_pool);*/ + dgemm_(&transa, &transb, &bsize[ia2], &ib_length, &bsize[ia1], + &alpha_gemm, &LOC.DM[is](iw1_lo,iw2_lo), &GridT.lgd, + &psir_ylm[first_ib][colidx[ia1]], &LD_pool, &beta, &psir_DM[first_ib][colidx[ia2]], &LD_pool); } else @@ -252,9 +264,13 @@ void Gint_Gamma::cal_band_rho( { if(cal_flag[ib][ia1]>0 && cal_flag[ib][ia2]>0) { - dgemv_(&transa, &bsize[ia2], &bsize[ia1], + /*dgemv_(&transa, &bsize[ia2], &bsize[ia1], &alpha_gemm, &LOC.DM[is][iw1_lo][iw2_lo], &GridT.lgd, &psir_ylm[ib][colidx[ia1]], &inc, + &beta, &psir_DM[ib][colidx[ia2]], &inc);*/ + dgemv_(&transa, &bsize[ia2], &bsize[ia1], + &alpha_gemm, &LOC.DM[is](iw1_lo,iw2_lo), &GridT.lgd, + &psir_ylm[ib][colidx[ia1]], &inc, &beta, &psir_DM[ib][colidx[ia2]], &inc); } } diff --git a/ABACUS.develop/source/src_lcao/local_orbital_charge.cpp b/ABACUS.develop/source/src_lcao/local_orbital_charge.cpp index 92d35c2a7f..a5ce340ea1 100644 --- a/ABACUS.develop/source/src_lcao/local_orbital_charge.cpp +++ b/ABACUS.develop/source/src_lcao/local_orbital_charge.cpp @@ -44,23 +44,23 @@ Local_Orbital_Charge::Local_Orbital_Charge() Local_Orbital_Charge::~Local_Orbital_Charge() { // with gamma point only - if (this->init_DM) - { - for (int is=0; isinit_DM) + { + /*for (int is=0; isinit_DM_R) diff --git a/ABACUS.develop/source/src_lcao/local_orbital_charge.h b/ABACUS.develop/source/src_lcao/local_orbital_charge.h index bdc16b4d19..18bd934f10 100644 --- a/ABACUS.develop/source/src_lcao/local_orbital_charge.h +++ b/ABACUS.develop/source/src_lcao/local_orbital_charge.h @@ -1,6 +1,7 @@ #ifndef LOCAL_ORBITAL_CHARGE #define LOCAL_ORBITAL_CHARGE +#include "src_global/matrix.h" #include "src_pw/tools.h" #include "src_lcao/grid_technique.h" #include "src_lcao/wfc_dm_2d.h" @@ -33,7 +34,11 @@ class Local_Orbital_Charge // liaochen modify on 2010-3-23 // change its state from private to public - double*** DM; + //double** DM; + + // liuyu modify 2021-04-28 + // change it to matrix to get rid of DM_pool + matrix *DM; double** DM_R; // whether to printout density matrix @@ -66,7 +71,9 @@ class Local_Orbital_Charge // add by yshen on 9/22/2014 // these variables are memory pool for DM series matrixes, // so that these matrixes will be storaged continuously in the memory. - double **DM_pool; + + // liuyu delete 2021-04-28 + //double **DM_pool; // Buffer parameters for tranforming 2D block-cyclic distributed DM matrix // to grid distributed DM matrix diff --git a/ABACUS.develop/source/src_ri/exx_abfs-parallel-communicate-dm.cpp b/ABACUS.develop/source/src_ri/exx_abfs-parallel-communicate-dm.cpp index 1090133487..9ca14a33e6 100644 --- a/ABACUS.develop/source/src_ri/exx_abfs-parallel-communicate-dm.cpp +++ b/ABACUS.develop/source/src_ri/exx_abfs-parallel-communicate-dm.cpp @@ -177,7 +177,8 @@ Exx_Abfs::Parallel::Communicate::DM::LOC_to_grid( for( int i1=0; i1!=GridT.lgd; ++i1 ) { for( int i2=0; i2!=GridT.lgd; ++i2 ) - ofs<= threshold ) diff --git a/ABACUS.develop/source/src_ri/exx_lcao.cpp b/ABACUS.develop/source/src_ri/exx_lcao.cpp index 78f6b55085..3ff378c1c3 100644 --- a/ABACUS.develop/source/src_ri/exx_lcao.cpp +++ b/ABACUS.develop/source/src_ri/exx_lcao.cpp @@ -999,7 +999,8 @@ ofs_mpi.close(); for( size_t iw1=0; iw1!=ucell.atoms[it1].nw; ++iw1 ) { for( size_t iw2=0; iw2!=ucell.atoms[it2].nw; ++iw2 ) - ofs<