[Pw_forum] STS spectra

Guido Fratesi fratesi at mater.unimib.it
Mon Sep 8 15:18:17 CEST 2008


Dear Daniele,

I'm sorry to reply only now to your message which dates two months ago, 
and I guess you could have probably found a convenient solution to get the 
LDOS by now.

Sometime ago I was also interested in computing the LDOS at fixed 
coordinate, r, and at variance with the energy, E.  I added a few bits to 
the code (3.1.1 at the time) which might be useful to you as well, but 
this never come to a stage sufficiently refined to be distributed and 
eventually got obsolete.

I attach here a few lines of the algorithm which I was adding into 
projwfc.f90, as you might be curious about that. Only the simplest, 
norm-conserving, collinear case was implemented. The basic idea is the 
following (possibly not the most efficient one), and closely follows the 
one for computing the projected DOS:

* given regions where to integrate the LDOS
* define "theta" arrays (dimension nrxx) which evaluate 1 inside and 0
  outside these regions --> thetathisproc(1:nrxx,ibox)
* for each band, each kpoint --> proj(ibox,ibnd,ik)
  - get the |wfc^2| (array of dimension nrxx)
  - multiply times the "theta" array and sum over space
  (this step is analogous to performing the
  projection over the atomic orbitals)
* sum over kpoints and bands --> ldosbox(ie,ibox,current_spin)

I would be interested to know if you find this way of proceeding 
convenient to your case (and in case I can send a sort-of-working example) 
or if you have spotted a better way to proceed, in the while.

Regards,
Guido

---------------------- compunting proj

  k_loop: DO ik = 1, nks
     !
     IF ( lsda ) current_spin = isk(ik)
     CALL gk_sort (xk (1, ik), ngm, g, ecutwfc / tpiba2, npw, igk, g2kin)
     CALL davcio (evc, nwordwfc, iunwfc, ik, - 1)
     !
     bnd_loop: DO ibnd = 1, nbnd
        !
        IF (noncolin) THEN
           !
           CALL errore( 'projwfc', 'boxes and noncolin not implemented', 1 )
           !
        ELSE
           !
           caux(1:nrxx) = (0._DP,0._DP)
           DO ig = 1, npw
              caux (nl (igk (ig) ) ) = evc (ig, ibnd)
           ENDDO
           IF (gamma_only) THEN
              DO ig = 1, npw
                 caux (nlm(igk (ig) ) ) = CONJG(evc (ig, ibnd))
              ENDDO
           END IF
           CALL cft3 (caux, nr1, nr2, nr3, nrx1, nrx2, nrx3, 1)
           !
           raux(:) = DBLE( caux(:) )**2 + AIMAG( caux(:) )**2
           !
        END IF
        !
        ! The contribution of this wavefunction to the LDOS
        ! integrated in the volume is the projection of the
        ! squared wfc on a function =1 in the volume itself:
        !
        DO ibox = iboxmin, n_proj_boxes
           proj(ibox,ibnd,ik) = DDOT(nrxx,raux(:),1,thetathisproc(:,ibox),1) &
                &               / (nrx1*nrx2*nrx3)
        END DO
        !
     END DO bnd_loop
     !
     CALL reduce ((n_proj_boxes-iboxmin+1)*nbnd , proj(iboxmin,1,ik))
     !
  END DO k_loop

---------------------- summing over kp and bands

  DO ik = 1,nkstot
     IF ( nspin == 2 ) current_spin = isk ( ik )
     DO ibnd = 1, nbnd
        etev = et(ibnd,ik)
        ie_mid = NINT( (etev-Emin)/DeltaE )
        DO ie = MAX(ie_mid-ie_delta, 0), MIN(ie_mid+ie_delta, ne)
           delta = w0gauss((Emin+DeltaE*ie-etev)/degauss,ngauss) &
                 / degauss / rytoev
           !
           DO ibox = iboxmin, n_proj_boxes
              ldosbox(ie,ibox,current_spin)                = &
                   ldosbox(ie,ibox,current_spin)           + &
                   wk(ik) * delta * proj (ibox, ibnd, ik)
           END DO
           !
           ! dostot(:,ns) = total DOS (states/eV) for spin "ns"
           !
           dostot(ie,current_spin) = dostot(ie,current_spin) + &
                wk(ik) * delta
        END DO
     END DO
  END DO

----------------------



On Tue, 8 Jul 2008, Daniele Passerone wrote:

 | 
Dear Pwscf users and developers,

The postprocessing facilities of espresso allow to extract stm images, 
that correspond in Tersoff-Hamann approximation to the localized density 
of states integrated between Efermi and a given (positive or negative) 
bias. The more convenient way to analyze this quantity is in my opinion by 
generating a 3d grid and visualizing it with xcrysden, which incidentally 
can also show planes parallel to the cell sides.

The ILDOS option of pp.x (plot_num=10) somewhat extends this, allowing to 
compute the LDOS integrated between emin and emax. STS (scanning tunneling 
spectroscopy) experiments sample the local density of states at a surface: 
one obtains a profile of dI/dV at a certain point on the surface, and this 
gives valuable information about the local conductivity and presence of 
peaks in the DOS etc.

The question is: what is the more convenient and fast way to get the LDOS 
profile from Emin to Emax, on a certain plane (let us say, 2 Angstrom 
above the surface)? I thought one could make several jobs of pp.x : from 
Emin to Emin+DeltaE, from Emin + Delta E to Emin + 2*Delta E.... and so 
on... but maybe there are much better ways to do that.

Thank you in advance for any advice,
Daniele


-- 
Guido Fratesi

Dipartimento di Scienza dei Materiali
Universita` degli Studi di Milano-Bicocca



More information about the users mailing list