lattix12.f Source File


Source Code

C ************************************************************************
      SUBROUTINE LATTIX12(LINTERFACE,ALATC,BRAVAIS,RECBV,RR,NR,VOLUC)
c#@# KKRtags: VORONOI geometry
C ************************************************************************
C LATTIX99 GENERATES THE REAL SPACE AND RECIPROCAL LATTICES.
C BRAVAIS(I,J) ARE BASIS VECTORS, WITH I=X,Y,Z AND J=A,B,C.
C RECIPROCAL SPACE VECTORS ARE IN UNITS OF 2*PI/A0.
C RR ARE THE DIRECT SPACE VECTORS.
C NR+1 IS THE NUMBER OF DIRECT SPACE VECTORS CREATED
C (STRUCTURE DEPENDENT OUTPUT). 
C ************************************************************************
C
      implicit none
      INCLUDE 'inc.geometry'
C
      LOGICAL LINTERFACE
C
      INTEGER
     +     NR,                       ! number of real space vectors
     +     I,J,IER
C
      REAL*8       
     +     VOLUC,ALATC,
     +     DET,PI,TPI,DDET33
C
      REAL*8       
     +     BRAVAIS(3,3),  ! Real space bravais vectors. Read in normalized to
c                         ! altc.
     +     RECBV(3,3),              ! RECIPROCAL BASIS IN 2*PI/A
     +     RR(3,0:NRD)
c
c
      EXTERNAL CROSPR,SPATPR,DDET33
c
c
c ------------------------------------------------------------------------
      PI = 4.D0*DATAN(1.D0)

c
c
c Generate the reciprocal lattice unit-vectors, and calculate the unit-cell
c volume in units au**3.
c Initialize:
      DO I=1,3
         DO J=1,3
            RECBV(J,I)=0.D0
         ENDDO
      ENDDO
c Calculate:
      IF (.NOT.(LINTERFACE)) THEN
c 1. 3-dimentional case
         DET=DDET33(BRAVAIS)
         IF (DET.EQ.0.D0) THEN
            WRITE(*,*) '3-d Bravais vectors are linearly dependent:'
            WRITE(*,9000) ((BRAVAIS(J,I),J=1,3),I=1,3)
            STOP 'LATTIX99: 3-d Bravais vectors are 
     +                          linearly dependent'
         END IF

         CALL CROSPR(BRAVAIS(1,2),BRAVAIS(1,3),RECBV(1,1))
         CALL CROSPR(BRAVAIS(1,3),BRAVAIS(1,1),RECBV(1,2))
         CALL CROSPR(BRAVAIS(1,1),BRAVAIS(1,2),RECBV(1,3))

         CALL SPATPR(BRAVAIS(1,2),BRAVAIS(1,3),BRAVAIS(1,1),VOLUC)
         VOLUC= ABS(VOLUC)
         DO I=1,3
            DO J=1,3
               RECBV(J,I)=RECBV(J,I)/VOLUC
            ENDDO
         ENDDO   
      ELSE
c     2. 2-dimentional case
         DET=BRAVAIS(1,1)*BRAVAIS(2,2)-BRAVAIS(1,2)*BRAVAIS(2,1)
         IF (ABS(DET).LT.1.D-8) THEN 
            WRITE(*,*)    '2-d Bravais vectors are linearly dependent:'
            WRITE(*,9000) ((BRAVAIS(J,I),J=1,3),I=1,3)
            STOP 'LATTIX99: 2-d Bravais vectors are  linearly dependent'
         ENDIF
         
         RECBV(1,1)=  BRAVAIS(2,2)/DET
         RECBV(2,1)= -BRAVAIS(1,2)/DET
         RECBV(1,2)= -BRAVAIS(2,1)/DET
         RECBV(2,2)=  BRAVAIS(1,1)/DET
         
         VOLUC= ABS(DET)
      ENDIF
      
c     Reciprocal lattice unit-vectors and unit-cell volume calculated.
c     
      write(6,*) 'True basis vectors (not normalized):'
      write(6,9000) ((BRAVAIS(J,I)*ALATC,J=1,3),I=1,3)
      write(6,*) 'Reciprocal lattice vectors, in units 2pi/a:'
      write(6,9000) ((RECBV(J,I),J=1,3),I=1,3)
c
c ---> now generate the real-space lattice vectors for the cluster generation:
c      The parameter LATT is not used in RRGEN
      CALL RRGEN(BRAVAIS,ALATC,LINTERFACE,RR,NR)
c
c ---> test on volume unit cell:
c
      IF (VOLUC.LT.1.0D-5) THEN
         WRITE(6,909) VOLUC
  909    FORMAT(//' STOP. VOLUC IN LATTIX99 IS TOO SMALL:',
     +   ' VOLUC= ',D13.4)
         STOP
      END IF
C
 1000 FORMAT(i4,3F15.10)
 1001 FORMAT( ' vol,voluc: ',2F10.4)
 9000 FORMAT(3F14.8/3F14.8/3F14.8)
 9010 FORMAT('Caution: the two-dimentional Bravais vectors have also',/,
     &     'a z-component. It will be set to zero.')
      RETURN
      END