next up previous contents
Next: Self Interaction Term Up: Appendix A: Code Previous: Main Program   Contents


Read Input

c **********************************************************************
c     ReadInput.F
c **********************************************************************
c     ... adaptation of ReadLattice from Vernet
c **********************************************************************

      subroutine ReadInput

      use global_parameters
      use scalars
      use serial_arrays
      use pmeVar
      implicit none

      integer, dimension(48)   :: itext
      integer meshExp,sum
      integer itemp, isum, ir, ia, itrap
      character*11 fn
      real scaleFactor
      itrap = 0

c     hardwire filename
      
      fn   = 'lattice.dat'

c     ... initialize arrays

      a1     = zero
      a2     = zero
      a3     = zero
      b1     = zero
      b2     = zero
      b3     = zero
      iatnum = 0
      qatom  = zero
      atom   = zero
      numa   = 0
      itype  = 0

      if (whoami .eq. 0) then
         open(5,file=fn,status='old')
         read(5,'(48a1)') itext
         
c     get real box length (RboxL), box length is assumed to be 1 in the code
c     but this will allow numbers to be converted to actual length by
c     by multiplying by this number
         read(5,'(f16.10)') RboxL
         print *, "Box Length = ",RBoxL

c     Read rcut
         read(5,'(f16.10)') rcut
         print *, "cutoff radius = ",rcut

c     Read mesh density, convert to a power of two
          read(5,'(i2)') meshExp
          print *, 'mesh Exp =', meshExp
          meshSize = 2**meshExp
          print *, 'mesh size = ', meshSize

c     Read alpha
         read(5,'f15.10') alpha
         print *, "alpha = ",alpha

c     Read p, the order of the spline
         read(5,'i2') p
         print *, 'p ', p

c     ... read direct (a1, a2, and a3) and reciprocal (b1, b2, and b3) lattice
c         basis vectors, and total number of atoms (numa(0)).

c     get vectors defining suit direct and recpriprocal cells
         read(5,'(3f17.10)')
     &        (a1(ir),ir=1,3), (a2(ir),ir=1,3), (a3(ir),ir=1,3),
     &        (b1(ir),ir=1,3), (b2(ir),ir=1,3), (b3(ir),ir=1,3)
         scaleFactor = one/a1(1)

         read(5,'(i4)') numa(0)
         print *, "number of atoms = ",numa(0)
         if (numa(0) .gt. maxAtoms) then
           write(6,'(/,''==> Error:: numa(0) exceeds maxAtoms'')')
           write(6,'(4x,''numa(0) = '',i3)') numa(0)
           write(6,'(4x,''maxAtoms    = '',i3)') maxAtoms
           itrap = 1
         endif
      endif

c     ... each atomic position line in lattice.dat is of the following form
c         (example line from Al Sigma= 3 grain boundary file)
c
c  numt  at #   at. chg.      x                 y                 z
c   1    13      3.00     1.6662812455     8.6737885974     7.9316165296
c
c         numt is a label shared by atoms of the same type.  The value of this
c         label is stored in itype(atom #) and the total number of atoms of a
c         given type is stored in numa(<type label>).  The total number
c         of atoms overall (of any type) is stored in numa0).

      if (whoami .eq. 0) then
         qtot  = zero
         itemp = 1
         isum  = 0

         do ia = 1,numa(0)
           read(5,'(i4,i6,f10.2,3f17.10)')
     &          numt, iatnum(ia), qatom(ia), (atom(ir,ia),ir=1,3) 
           do ir =1,3
              atom(ir,ia) = atom(ir,ia)*scaleFactor
           end do
! ir (1,2,3) is the (x, y, z) coordinates of an atom, ia is the atom number

c     ... the next 'if' block assumes that all atoms of a given type
c         are grouped together in the input file.   First atoms of type
c         '1' are processed, then type '2', etc.  isum is re-initialized
c         when the next type is encountered to re-start number-of-atoms-of-
c         this-type counter.

           if (numt .gt. itemp) then
             itemp = numt
             isum = 0
           end if
           isum = isum + 1
           numa(itemp) = isum
           qtot = qtot + qatom(ia)
           itype(ia) = numt
         end do

         close(5)

         do ia = 1,numa(0)
           if (itype(ia) .gt. maxt) then
             write(6,'(/,''==> Error:: numt exceeds maxt'')')
             write(6,'(4x,''numt = '',i3)') itype(ia)
             write(6,'(4x,''maxt = '',i3)') maxt
             itrap = 1
           endif
         enddo
         sum = 0
         do ia = 1,numa(0)
            sum = sum + qatom(ia)
         end do
         if (sum .ne. 0) then
            print *, "error lattice has net charge"
            stop
         end if
      endif

c     ... given vectors a1, a2, a3, volume= a1 dotted into (a2 x a3)
      
      unitcv = abs( a1(1)*(a2(2)*a3(3) - a2(3)*a3(2))
     &            + a1(2)*(a2(3)*a3(1) - a2(1)*a3(3))
     &            + a1(3)*(a2(1)*a3(2) - a2(2)*a3(1)) )
      
      if(whoami.eq.0) then
        write(6,'(/,'' Lattice input:  '',48a1)') itext
        write(6,'(/,2x,'' primitive lattice vectors:'')')
        write(6,'(/,4x,'' a1:'',3f17.10)') (a1(ir),ir=1,3)
        write(6,'(4x,'' a2:'',3f17.10)') (a2(ir),ir=1,3)
        write(6,'(4x,'' a3:'',3f17.10)') (a3(ir),ir=1,3)
        write(6,'(/,4x,'' b1:'',3f17.10)') (b1(ir),ir=1,3)
        write(6,'(4x,'' b2:'',3f17.10)') (b2(ir),ir=1,3)
        write(6,'(4x,'' b3:'',3f17.10)') (b3(ir),ir=1,3)
        write(6,'(/,2x,'' unit cell volume:'',f17.10)') unitcv
        write(6,'(/,2x,'' atoms:'')')
        write(6,'(/,5x,''number'',5x,''atomic number'',23x,''position'')
     &')
        do ia = 1,numa(0), 1 
          write(6,'(/,6x,i3,11x,i3,5x,3f17.10)')
     &          ia, iatnum(ia), (atom(ir,ia),ir=1,3)
        end do
      endif

      if(itrap .eq. 1) then
         print *, 'error'
         stop
      end if
c     put in error handler to terminate program

      return
      end


Thomas G Dimiduk 2004-04-15