Changeset 2910

Show
Ignore:
Timestamp:
05/14/07 15:48:34 (20 months ago)
Author:
xavier
Message:

Added the posibility of using non-local operators with the Sternheimer
equation, this is done by passing a set of ground state wavefunctions
with the operator applied to them instead of the local potential.
There is still the posibility of passing a local potential, to avoid
the memory cost of storing another set of wavefunctions.

Location:
trunk/src
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/em_resp.F90

    r2908 r2910  
    246246              call zsternheimer_solve(sh, sys, h, em_vars%lr(dir, :, ifactor), 2 , & 
    247247                   em_vars%freq_factor(ifactor)*em_vars%omega(iomega) + M_zI * em_vars%eta, & 
    248                    sys%gr%m%x(:, dir), RESTART_DIR,& 
     248                   RESTART_DIR,& 
    249249                   em_rho_tag(em_vars%freq_factor(ifactor)*em_vars%omega(iomega), dir),& 
    250                    em_wfs_tag(dir, ifactor), have_restart_rho=(ierr==0)) 
     250                   em_wfs_tag(dir, ifactor), have_restart_rho=(ierr==0),& 
     251                   vext = sys%gr%m%x(:, dir)) 
    251252            else 
    252253              call dsternheimer_solve(sh, sys, h, em_vars%lr(dir, :, ifactor), 2 , & 
    253254                   em_vars%freq_factor(ifactor)*em_vars%omega(iomega), & 
    254                    sys%gr%m%x(:, dir), RESTART_DIR,& 
     255                   RESTART_DIR,& 
    255256                   em_rho_tag(em_vars%freq_factor(ifactor)*em_vars%omega(iomega), dir),& 
    256                    em_wfs_tag(dir, ifactor), have_restart_rho=(ierr==0)) 
     257                   em_wfs_tag(dir, ifactor), have_restart_rho=(ierr==0), & 
     258                   vext = sys%gr%m%x(:, dir)) 
    257259            end if 
    258260             
  • trunk/src/em_resp_calc_inc.F90

    r2806 r2910  
    329329    do idir = 1, ndim 
    330330      do idim = 1, sys%st%d%dim 
    331          
    332         call X(sternheimer_calc_hvar)(sh, sys, h, lr(idir, :, ifreq), 2, sys%gr%m%x(:, idir), & 
    333              hvar(:, :, :, idim, idir, ifreq)) 
     331 
     332        do isigma = 1, 2 
     333          do ispin = 1, sys%st%d%nspin 
     334            hvar(1:np, ispin, isigma, idim, idir, ifreq) = sys%gr%m%x(1:np, idir) 
     335          end do 
     336        end do 
     337 
     338        call X(sternheimer_calc_hvar)(sh, sys, h, lr(idir, :, ifreq), 2, hvar(:, :, :, idim, idir, ifreq)) 
    334339         
    335340      end do !idim 
  • trunk/src/math.F90

    r2903 r2910  
    5959    set_app_threshold,          & 
    6060    operator(.app.),            & 
     61    math_xor,                   & 
    6162    ddelta 
    6263 
     
    750751  end function ddelta 
    751752 
     753  logical function math_xor(a, b) 
     754    logical, intent(in) :: a 
     755    logical, intent(in) :: b 
     756     
     757    math_xor = ( a .or. b ) 
     758    if ( a .and. b ) math_xor = .false. 
     759     
     760  end function math_xor 
     761 
    752762#include "undef.F90" 
    753763#include "complex.F90" 
  • trunk/src/phonons_lr.F90

    r2908 r2910  
    120120      do idir = 1, sys%NDIM 
    121121 
    122         call dsternheimer_solve(sh, sys, h, lr, 1, M_ZERO, dv(1:sys%NP, idir, iatom), & 
    123              RESTART_DIR, phn_rho_tag(iatom, idir), phn_wfs_tag(iatom, idir)) 
     122        call dsternheimer_solve(sh, sys, h, lr, 1, M_ZERO, RESTART_DIR, phn_rho_tag(iatom, idir), phn_wfs_tag(iatom, idir), & 
     123             vext= dv(1:sys%NP, idir, iatom)) 
    124124 
    125125        do jatom = 1, sys%geo%natoms 
  • trunk/src/sternheimer_inc.F90

    r2781 r2910  
    2626 
    2727subroutine X(sternheimer_solve)(& 
    28      this, sys, h, lr, nsigma, omega, vext, &  
     28     this, sys, h, lr, nsigma, omega, &  
    2929     restart_dir, rho_tag, wfs_tag, & 
    30      have_restart_rho) 
     30     have_restart_rho, vext, vext_psi) 
    3131  type(sternheimer_t),    intent(inout) :: this 
    3232  type(system_t), target, intent(inout) :: sys 
     
    3535  integer,                intent(in)    :: nsigma  
    3636  R_TYPE,                 intent(in)    :: omega 
    37   FLOAT,                  intent(in)    :: vext(:) 
    3837  character(len=*),       intent(in)    :: restart_dir 
    3938  character(len=*),       intent(in)    :: rho_tag 
    4039  character(len=*),       intent(in)    :: wfs_tag 
     40  FLOAT,  optional,       intent(in)    :: vext(:) 
     41  R_TYPE, optional,       intent(in)    :: vext_psi(:,:,:,:) 
    4142  logical,      optional, intent(in)    :: have_restart_rho 
    4243 
     
    6162 
    6263  ASSERT( nsigma==1 .or. nsigma ==2 ) 
    63    
     64  ASSERT( math_xor(present(vext), present(vext_psi)) ) 
     65 
    6466  m => sys%gr%m 
    6567  st => sys%st 
     
    106108    dl_rhoin(1:m%np, 1:st%d%nspin, 1) = lr(1)%X(dl_rho)(1:m%np, 1:st%d%nspin) 
    107109 
    108     call X(sternheimer_calc_hvar)(this, sys, h, lr, nsigma, vext, hvar) 
     110    do sigma = 1, nsigma 
     111      do ik = 1, st%d%nspin 
     112        if(present(vext)) then  
     113          hvar(1:m%np, ik, sigma) = vext(1:m%np) 
     114        else 
     115          hvar(1:m%np, ik, sigma) = M_ZERO 
     116        end if 
     117      end do 
     118    end do 
     119 
     120    call X(sternheimer_calc_hvar)(this, sys, h, lr, nsigma, hvar) 
    109121 
    110122    do ik = 1, st%d%nspin 
     
    116128          !calculate the RHS of the Sternheimer eq 
    117129          Y(1:m%np, 1, sigma) = -hvar(1:m%np, ik, sigma)*st%X(psi)(1:m%np, 1, ist, ik) 
     130 
     131          if(present(vext_psi)) then 
     132            Y(1:m%np, 1, sigma) = Y(1:m%np, 1, sigma) - vext_psi(1:m%np, 1, ist, ik) 
     133          end if 
    118134 
    119135          !and project it into the unoccupied states 
     
    236252end subroutine X(sternheimer_solve) 
    237253 
    238 subroutine X(sternheimer_calc_hvar)(this, sys, h, lr, nsigma, vext, hvar) 
     254subroutine X(sternheimer_calc_hvar)(this, sys, h, lr, nsigma, hvar) 
    239255  type(sternheimer_t),    intent(inout) :: this 
    240256  type(system_t), target, intent(inout) :: sys 
     
    242258  type(lr_t),             intent(inout) :: lr(:)  
    243259  integer,                intent(in)    :: nsigma  
    244   FLOAT,                  intent(in)    :: vext(:) 
    245260  R_TYPE,                 intent(out)   :: hvar(:,:,:) 
    246261 
     
    268283  do ik = 1, sys%st%d%nspin 
    269284     
    270     !* Vext 
    271     hvar(1:np, ik, 1) = vext(1:np) 
    272      
    273285    !* hartree 
    274     if (this%add_hartree) hvar(1:np, ik, 1) = hvar(1:np, ik, 1) & 
    275          + hartree(1:np) 
     286    if (this%add_hartree) hvar(1:np, ik, 1) = hvar(1:np, ik, 1) + hartree(1:np) 
    276287     
    277288    !* fxc 
     
    279290      if(.not. this%oep_kernel) then  
    280291        do ik2 = 1, sys%st%d%nspin 
    281           hvar(1:np, ik, 1) = hvar(1:np, ik, 1) + & 
    282                this%fxc(1:np, ik, ik2)*lr(1)%X(dl_rho)(1:np, ik2) 
     292          hvar(1:np, ik, 1) = hvar(1:np, ik, 1) + this%fxc(1:np, ik, ik2)*lr(1)%X(dl_rho)(1:np, ik2) 
    283293        end do 
    284294      else 
  • trunk/src/vdW.F90

    r2799 r2910  
    243243        call write_info(1)    
    244244 
    245         call zsternheimer_solve(sh, sys, h, lr(dir, :), 1,  omega, sys%gr%m%x(:,dir), & 
    246              RESTART_DIR, em_rho_tag(real(omega),dir), em_wfs_tag(dir,1)) 
     245        call zsternheimer_solve(sh, sys, h, lr(dir, :), 1,  omega, & 
     246             RESTART_DIR, em_rho_tag(real(omega),dir), em_wfs_tag(dir,1), vext=sys%gr%m%x(:,dir)) 
    247247      end do 
    248248