From d616e9c566ff589b661bad57d49dad5def5a2e45 Mon Sep 17 00:00:00 2001 From: Emmanuel Giner Date: Wed, 27 Mar 2019 18:29:08 +0100 Subject: [PATCH] add normalize_dm --- src/density_for_dft/EZFIO.cfg | 7 ++++++ src/density_for_dft/density_for_dft.irp.f | 27 +++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/density_for_dft/EZFIO.cfg b/src/density_for_dft/EZFIO.cfg index d4d40546..86bbaeb1 100644 --- a/src/density_for_dft/EZFIO.cfg +++ b/src/density_for_dft/EZFIO.cfg @@ -16,3 +16,10 @@ doc: Type of density doc: if [no_core_dm] then all elements of the density matrix involving at least one orbital set as core are set to zero interface: ezfio, provider, ocaml default: full_density + +[normalize_dm] +type: logical +doc: Type of density +doc: if .True., then you normalize the no_core_dm to elec_alpha_num - n_core_orb and elec_beta_num - n_core_orb +interface: ezfio, provider, ocaml +default: True diff --git a/src/density_for_dft/density_for_dft.irp.f b/src/density_for_dft/density_for_dft.irp.f index 84f3d349..2c6aa46e 100644 --- a/src/density_for_dft/density_for_dft.irp.f +++ b/src/density_for_dft/density_for_dft.irp.f @@ -29,6 +29,20 @@ BEGIN_PROVIDER [double precision, one_e_dm_mo_alpha_for_dft, (mo_num,mo_num, N_s one_e_dm_mo_alpha_for_dft(i,j,:) = 0.d0 enddo enddo + if(normalize_dm)then + double precision :: elec_alpha_frozen_num, elec_alpha_valence(N_states) + elec_alpha_frozen_num = elec_alpha_num - n_core_orb + elec_alpha_valence = 0.d0 + integer :: istate + do istate = 1, N_states + do i = 1, mo_num + elec_alpha_valence(istate) += one_e_dm_mo_alpha_for_dft(i,i,istate) + enddo + elec_alpha_valence(istate) = elec_alpha_frozen_num/elec_alpha_valence(istate) + one_e_dm_mo_alpha_for_dft(:,:,istate) = one_e_dm_mo_alpha_for_dft(:,:,istate) * elec_alpha_valence(istate) + enddo + + endif endif END_PROVIDER @@ -64,6 +78,19 @@ BEGIN_PROVIDER [double precision, one_e_dm_mo_beta_for_dft, (mo_num,mo_num, N_st one_e_dm_mo_beta_for_dft(i,j,:) = 0.d0 enddo enddo + if(normalize_dm)then + double precision :: elec_beta_valence(N_states),elec_beta_frozen_num + elec_beta_frozen_num = elec_beta_num - n_core_orb + elec_beta_valence = 0.d0 + integer :: istate + do istate = 1, N_states + do i = 1, mo_num + elec_beta_valence(istate) += one_e_dm_mo_beta_for_dft(i,i,istate) + enddo + elec_beta_valence(istate) = elec_beta_frozen_num/elec_beta_valence(istate) + one_e_dm_mo_beta_for_dft(:,:,istate) = one_e_dm_mo_beta_for_dft(:,:,istate) * elec_beta_valence(istate) + enddo + endif endif END_PROVIDER