Computing Green functions

Green functions, in both the time domain and energy domain, are our major interest of investigation.
Finding the poles in the energy domain

In ET literature, there are some Green functions plots. While these things might not be very useful, the same technique acutally presents a conventional method of obtaining the electron density of states (DOS), which might be useful for studying molecular conductance.

Poles are also important indications of physics. Poles of a Floquet Hamiltonian represent dynamical resonance. Poles of certain part of Hamiltonian also indicate the singularities in the nonadiabatic coupling matrix elements.

Larsson's equation for superexchange coupling
In the nonorthogonal basis, superexchange coupling is calculated as follows:
c---> initialize the arrays

	do i = 1 , ndim
	   do j = 1 , ndim
	      ovb(i,j)=0.0
	      hmb(j,i)=0.0
	   enddo
	enddo

c---> define the bridge subhamiltonian
		   
	if(idon.gt.iacc) then
	   id=iacc
	   ia=idon
	else
	   id=idon
	   ia=iacc
	endif
	do i = 1 , nb
	   do j = 1 , nb
	      ovb(i,j)=ovlp(iold(i),jold(j))
	      hmb(i,j)=hami(iold(i),jold(j))
	   enddo
	enddo
	
	if(write) then      
	   write(iout,*) ' The bridge subH is a ',nb,'*',nb,'matrix .'
	   do i = 1 , nb
	      write(iout,'(500f10.5)') (hmb(i,j),j=1,nb)
	   enddo	   	   	   
	endif

c---> build 'ES-H'

	do i = 1 , nb
	   do j = 1 , nb
	      hmes(i,j)=e*ovb(i,j)-hmb(i,j)
	      hinv(i,j)=0.d0
	   enddo
	enddo
	
	if(write) then
	   do i = 1 , nb
	      write(iout,'(500f10.5)') (hmes(i,j),j=1,nb)
	   enddo
	endif

c---> invert (ES-H)
	
	do i = 1 , nb
	   do j = 1 , nb
	      hinv(i,j)=0.d0
	   enddo
	   hinv(i,i)=1.d0
	enddo

	call ludcmp(hmes,nb,nb,indx,d)

	do j = 1 , nb
	   call lubksb(hmes,nb,nb,indx,hinv(1,j))
	enddo

	if(write) then
	   write(iout,*) 
	   write(iout,*) 'The inverse of bridge Hamiltonian matrix '
	   write(iout,*)
	   do i = 1 , nb
	      write(iout,'(500f8.3)') (hinv(i,j),j=1,nb)
	   enddo
	endif

c---> test the matrix inversion routine	by reversal
	
	if(.not.test) go to 300
	do i = 1 , nb
	   do j = 1 , nb
	      hmes(i,j)=hinv(i,j)
	   enddo
	enddo
	do i = 1 , nb
	   do j = 1 , nb
	      hinv(i,j)=0.d0
	   enddo
	   hinv(i,i)=1.d0
	enddo
	call ludcmp(hmes,nb,nb,indx,d)

	do j = 1 , nb
	   call lubksb(hmes,nb,nb,indx,hinv(1,j))
	enddo
	write(iout,*)
	write(iout,*) ' testing matrix inversion routine '
	sum=0.0
	do i = 1 , nb
	   do j = 1 , nb
	      sum=sum+dabs(e*ovb(i,j)-hmb(i,j)-hinv(i,j))
	   enddo
	enddo
	write(iout,*) ' Accumulating error = ', sum
	if(sum.gt.1.d-8) stop ' Error in LU matrix inversion ! '
300     continue


c---> reorder the coupling between D, A and HB

	do i = 1 , nb
	   if(idon.lt.iacc) then
	      vd(i)=hami(id,iold(i))-e*ovlp(id,iold(i))
	      va(i)=hami(ia,iold(i))-e*ovlp(ia,iold(i))
	   else
	      vd(i)=hami(ia,iold(i))-e*ovlp(ia,iold(i))
	      va(i)=hami(id,iold(i))-e*ovlp(id,iold(i))
	   endif
	enddo

	tda=hami(idon,iacc)
	hdd=hami(idon,idon)
	haa=hami(iacc,iacc)
	
c	write(*,'(10f8.3)')(vd(i),i=1,nb)
c	write(*,'(10f8.3)')(va(i),i=1,nb)

c---> Larsson's formula
	
	do i = 1 , nb
	   do j = 1 , nb
	      tda=tda+vd(i)*hinv(i,j)*va(j)
	      hdd=hdd+vd(i)*hinv(i,j)*vd(j)
	      haa=haa+va(i)*hinv(i,j)*va(j)
	   enddo
	enddo

     	write(iout,'(a5,1x,f10.5,1x,a4,1x,f20.10)')' TDA(',e,') = ',tda
	write(iout,*)
	write(iout,'(a)') ' Two-State Approximation'
	write(iout,'(2f20.10)') hdd,tda
	write(iout,'(2f20.10)') tda,haa
	write(iungf,'(4f20.10)') e,tda,hdd,haa


	return
	end

The above subroutine can be found here.

Back to the Index Page

© 2000, Qian Xie