[Pw_forum] spin polarized lowdin charges

Cyrille Barreteau cbarreteau at cea.fr
Thu Apr 29 16:42:25 CEST 2004


Dear Francesco

thank you very much for helping in adapting the code.
I have implemented it and it works fine. I just made minor changes.
Here are the lines of code for those interested:

define totcharge_up and totcharge_down
define charges_up(:,:), charges_down(:,:) (instead of charges(:,:))
and put the following lines in projwfc.f90 instead of the previous non spin 
polarized analysis:

      allocate ( charges_up (nat, 0:lmax_wfc ) )
      allocate ( charges_down (nat, 0:lmax_wfc ) )
      charges_up=0.0
      charges_down=0.0
      do ik = 1, nkstot
         do ibnd = 1, nbnd
            do nwfc = 1, natomwfc
               na= nlmchi(nwfc)%na
               l = nlmchi(nwfc)%l
               if((.not.(lsda)).or.((lsda).and.(ik.le.(nkstot/2)))) then
                  charges_up(na,l) = charges_up(na,l) + wg (ibnd,ik) * &
                       proj (nwfc, ibnd, ik)
               else
                  charges_down(na,l) = charges_down(na,l) + wg (ibnd,ik)* &
                       proj (nwfc, ibnd, ik)
               end if
               enddo
         end do
      end do
      !
      write (stdout, '(/"Lowdin Charges: "/)')
      !
      psum = 0.0
      do na = 1, nat
         totcharge_up = 0.d0
         totcharge_down = 0.d0
         do l = 0, lmax_wfc
            totcharge_up = totcharge_up + charges_up(na,l)
            totcharge_down = totcharge_down + charges_down(na,l)
         end do
         psum = psum + totcharge_up+totcharge_down
         if(.not.(lsda)) then
         write (stdout,2000) na, totcharge_up, ( charges_up(na,l), l= 
0,lmax_wfc)	
      else
         write (stdout,2001) na, totcharge_up, ( charges_up(na,l), l= 0,lmax_wfc)
         write (stdout,2002) na, totcharge_down, ( charges_down(na,l), l= 
0,lmax_wfc)	
         write (stdout,2003) na, totcharge_up-totcharge_down, &
              ( charges_up(na,l)-charges_down(na,l), l= 0,lmax_wfc)
      end if
      end do
2000  FORMAT(5x,"Atom # ",i3,": local charge           = ",f8.4 ,", s, p, d, f 
= ",4f8.4)
2001  FORMAT(5x,"Atom # ",i3,": local charge spin up   = ",f8.4 ,", s, p, d, f 
= ",4f8.4)
2002  FORMAT(5x,"Atom # ",i3,": local charge spin down = ",f8.4 ,", s, p, d, f 
= ",4f8.4)
2003  FORMAT(5x,"Atom # ",i3,": local magnetic moment  = ",f8.4 ,", s, p, d, f 
= ",4f8.4)

      psum = psum / nelec
      write (stdout, '(5x,"Spilling Parameter: ",f8.4)') 1.0 - psum
      !
      ! Sanchez-Portal et al., Sol. State Commun.  95, 685 (1995).
      ! The spilling parameter measures the ability of the basis provided by
      ! the pseudo-atomic wfc to represent the PW eigenstates,
      ! by measuring how much of the subspace of the Hamiltonian
      ! eigenstates falls outside the subspace spanned by the atomic basis
      !
      deallocate (charges_up,charges_down)





Francesco Antoniella wrote:
> Il gio, 2004-04-29 alle 08:07, Cyrille Barreteau ha scritto:
> 
>>Dear pwscf users,
>>
>>I am doing a calculation of a magnetic Fe (cuboctahedron) cluster and I would 
>>like to get the magnetic decomposition on  each atomic site of the cluster.
>> From projwfc.x I am able to get the total Lowdin charge decomposition
>>(see below) but I would also like the up and down spin charge decomposition.
>>How can I obtain this information?
>>
>>  thanks,
>>
>>      cyrille
>>
>>Lowdin Charges:
>>
>>   Atom #   1: total charge =   7.4091, s, p, d, f =   0.8321  0.0000  6.5770
>>   Atom #   2: total charge =   7.9526, s, p, d, f =   0.8952  0.0000  7.0574
>>   Atom #   3: total charge =   7.9526, s, p, d, f =   0.8952  0.0000  7.0574
>>   Atom #   4: total charge =   7.9526, s, p, d, f =   0.8952  0.0000  7.0574
>>   Atom #   5: total charge =   7.9526, s, p, d, f =   0.8952  0.0000  7.0574
>>   Atom #   6: total charge =   7.9526, s, p, d, f =   0.8952  0.0000  7.0574
>>   Atom #   7: total     !
> 
> 
> 
> 
> This is the modification of the code 
> ---->put this in the variables declaration
>  charges_up(:,:), charges_down(:,:) 
> in place of :
> charges(:,:)
> 
> ---->put this in the lowdin charges calc
>      allocate ( charges_up (nat, 0:lmax_wfc ) )
>      allocate ( charges_down (nat, 0:lmax_wfc ) )
>      charges_up=0.0
>      charges_down=0.0
>      do ik = 1, nkstot  
>         do ibnd = 1, nbnd
>            do nwfc = 1, natomwfc
>               na= nlmchi(nwfc)%na
>               l = nlmchi(nwfc)%l
>               if((.not.(lsda)).or.((lsda).and.(ik.le.(nkstot/2)))) then
>                  charges_up(na,l) = charges_up(na,l) + wg (ibnd,ik) * &
>                       proj (nwfc, ibnd, ik)
>               else 
>                  charges_down(na,l) = charges_down(na,l) + wg (ibnd,ik)
> * &
>                       proj (nwfc, ibnd, ik)
>               end if
>               enddo
>         end do
>      end do
>      !
>      write (4, '(/"Lowdin Charges: "/)')
>      !
>      psum = 0.0
>      do na = 1, nat
>         totcharge_up = 0.d0
>         totcharge_down = 0.d0
>         do l = 0, lmax_wfc
>            totcharge_up = totcharge_up + charges_up(na,l)
>            totcharge_down = totcharge_down + charges_down(na,l)
>         end do
>         psum = psum + totcharge_up+totcharge_down
>         if(.not.(lsda)) then
>         write (4, '(5x,"Atom # ",i3,": total charge = ",f8.4, &
>              &                ", s, p, d = ",4f8.4    )') &
>              na, totcharge_up, ( charges_up(na,l), l= 0,lmax_wfc)
>      else 
>         write (4, '(5x,"Atom # ",i3,": total charge spin up   = ",f8.4,
> &
>              &                ", s, p, d = ",4f8.4    )') &
>              na, totcharge_up, ( charges_up(na,l), l= 0,lmax_wfc)
>         write (4, '(5x,"       ",i3,": total charge spin down = ",f8.4,
> &
>              &                ", s, p, d = ",4f8.4    )') &
>              na, totcharge_down, ( charges_down(na,l), l= 0,lmax_wfc)
>         write (4, '(5x,"       ",i3,": total pol.  (up-down)  = ",f8.4,
> &
>              &                ", s, p, d = ",4f8.4    )') &
>              na, totcharge_up-totcharge_down,&
>              ( charges_up(na,l)-charges_down(na,l), l= 0,lmax_wfc)
>      end if
>      end do
>      psum = psum / nelec
>      write (4, '(5x,"Spilling Parameter: ",f8.4)') 1.0 - psum  
> 
> 
> _______________________________________________
> Pw_forum mailing list
> Pw_forum at pwscf.org
> http://www.democritos.it/mailman/listinfo/pw_forum


-- 
     ============================================================
    | Cyrille Barreteau           |  phone:+33 (0)1 69 08 29 51  |
    | CEA Saclay                  |                              |
    | DSM/DRECAM/SPCSI            |  fax : +33 (0)1 69 08 84 46  |
    | Batiment 462                |                              |
    | 91191 Gif sur Yvette Cedex  |  email: cbarreteau at cea.fr    |
    | FRANCE                      |                              |
    |             ~~~~~~~~~~~~~~~~~~~~~~~~                       |
    |    web : http://www-drecam.cea.fr/spcsi/groupe1.htm        |
     ============================================================




More information about the users mailing list