shape12.f90 Source File


Source Code

!=====================================================================
      SUBROUTINE SHAPE(NPOI8,AFACE8,BFACE8,CFACE8,DFACE8, &
                       TOLVDIST, & ! Max. tolerance for distance of two 
                       TOLEULER, & ! Used in calculation of Euler angles
                       NMIN,     & ! Min. number of points in panel
                       NVERTICES8,XVERT8,YVERT8,ZVERT8,NFACE8,LMAX8, &
                       DLT8,KEYPAN8,NM8,ICLUSTER, &
                       NCELL_S,  & ! number of cell
                       SCALE_S,  & ! scaling factor
                       NPAN_S,   & ! panels for the shape
                       MESHN_S,  & ! number of mesh points
                       NM_S,     & ! array, mesh for each panel
                       XRN_S,    & ! radial mesh
                       DRN_S,    & ! drdi for radial mesh
                       NFUN_S,   & ! number of nonzero shapefunctions
                       LMIFUN_S, & ! lm of the IFun shapefunction
                       THETAS_S)   ! Thetas(r,ifun)
      implicit none
!#@# KKRtags: VORONOI radial-grid initialization shape-functions
!----------------------------------------------------------------------
!
!                       S H A P E   P R O G R A M 
!
!        F O R  A R B I T R A R Y  V O R O N O I  P O L Y H E D R A
!
!
!                                                           N.Stefanou
!----------------------------------------------------------------------
!     In order to improve the efficency of the code and to
!     check more, this program was changed in summer 1998 by N.Stefanou
!     ATTENTION: BUG is removed! 
!                In the old version IPAN=-1 is wrong and has to be
!                set to IPAN=0. 
!
!     THIS PROGRAM CALCULATES THE ANGULAR MOMENTUM COMPONENTS OF THE 
!     SHAPEFUNCTION FOR AN ARBITRARY VORONOI POLYHEDRON.
!     A REAL SPHERICAL HARMONIC BASIS IS USED FOR THE DECOMPOSITION.
!     ON INPUT WE GIVE :
!
!        LMAX          :  MAXIMUM ANGULAR MOMENTUM
!
!        DLT           :  DEFINES THE STEP FOR GAUSS-LEGENDRE CALC.
!  TIME (DEC)  DLT    TOTAL ENERGY (BCC-TEST CdSb in Ge 12 Shells)
!  1104S      0.002  -.59583341\
!   315S      0.005  -.59583341 \
!    51S      0.050  -.59583341  --> NO CHANGES ALSO IN
!    40S      0.100  -.59583341 /    CHARGES OR FORCES
!    38S      0.200  -.59583341/
!    38S      0.300  -.59583354---> CHARGES DIFFER IN 10NTH DIGIT
!    35S      0.400  -.59583673---> CHARGES DIFFER IN 7NNTH DIGIT
!                                   FORCES DIFFER IN 5TH DIGIT
!    --->TO BE AT THE SAVE SIDE USE 0.05 OR 0.1 (SHOULD BE QUITE GOOD)
!        SIMILAR RESULTS WERE HELD FOR Cu in Fe NN relaxation.
!
!
!        NFACE         :  NUMBER OF FACES OF THE POLYHEDRON
!        KEYPAN        :  KEY TO DEFINE  THE  RADIAL  MESH.  IF KEYPAN=
!                         THE DEFAULT  RADIAL  DIVISION  OF PANNELS GIVE
!                         IN DATA STATEMENT IS USED.OTHERWISE THE  NUMBE
!                         OF  RADIAL  MESH  POINTS PER PANNEL  (NM(IPAN)
!                         IS READ IN INPUT
!                      ** IN THIS VERSION THE MESH IS DETERMINED
!                         BY SUBROUTINE MESH0.
!        Z(I)          :  COEFFICIENTS OF THE EQUATION OF A FACE
!                         Z(1)*X + Z(2)*Y + Z(3)*Z  =  1
!        NVERT         :  NUMBER OF VERTICES OF A FACE
!        V(I,IVERT)    :  COORDINATES OF THE VERTICES OF A FACE
!        NEWSCH(IFACE) :  INTEGER   PARAMETER TO CALCULATE   (=1)
!                         THE CONTRIBUTION OF THE CORRESPONDING
!                         PYRAMID TO THE SHAPEFUNCTIONS  .  IF
!                         NEWSCH.NE.1 THE CONTRIBUTION IS TAKEN
!                         EQUAL TO THAT OF THE PREVIOUS PYRAMID
!
!
!     IN ORDER TO SAVE MEMORY WE STORE IN LOCAL TEMPORARY FILES IN  UNIT
!     30+1 , 30+2 , ... , 30+NFACE THE TRANSFORMATION MATRICES ASSOCIATE
!     WITH THE ROTATION OF EACH PYRAMID. THE TEMPORARY DIRECT ACCESS FIL
!     IN UNIT 10 CONTAINS THE CALCULATED COMPONENTS OF THE SHAPEFUNCTIO
!
!                  ...........I N P U T  C A R D...(Bcc/fcc)
!
!                                       IF not (Bcc/fcc) change main prg
! bcc                          <----- Gives the lattice parameters
!    16    1   0.05000                lmax,nkey,division
!                                     LMAX=4*LMAX(KKR), 
!                                     NKEY is not used, 
!                                     DIVISION is DLT      
!   125    0                          number of mesh points,keypan
!                                     Number of mesh points 
!                                     used for the radial mesh (Depends
!                                     on the number of pannels).
!                                     IF keypan is 1, 
!                                     then the radial mesh division is 
!                                     taken from the input
!   -3.30000 -3.30000  -3.30000      relaxation percent
!
!    63   32   30    7   21   15   15   15   15   15 \     
!    15   17   15   15   23   15   15    0    0    0  \ This is the
!     0   17   15   15   23   15   15    0    0    0  / radial mesh info
!     0    0    0    0    0    0    0    0    0    0 /
!                  .........................................
!
!
!     THE DEFINITION OF REAL SPHERICAL HARMONICS IS NOT THE STANDARD  ON
!     REFERED IN THE PAPER:
!     N.STEFANOU,H.AKAI AND R.ZELLER,COMPUTER PHYS.COMMUN. 60 (1990) 231
!     IF YOU WANT TO HAVE ANGULAR MOMENTUM COMPONENTS IN THE STANDARD BA
!     SIS CHANGE THE FOLLOWING STATEMENTS IN THE ROUTINES :
!     IN CCOEF      ISI=1                        ---->    ISI=1-2*MOD(M,
!     IN DREAL      IF(MOD(M+MP),2).EQ.0) D=-D   ---->    DELETE THE LIN
!
!
!-----------------------------------------------------------------------
!
!
!     .. PARAMETER STATEMENTS ..
!
      include 'inc.geometry'
      INTEGER    ICD,ICED,IBMAXD,ISUMD,MESHND
      INTEGER    NVTOTD
      PARAMETER (ICD=3500,ICED=((LMAXD1+1)*(LMAXD1+2))/2)
!
!     PARAMETER (IBMAXD=(LMAXD1+1)*(LMAXD1+1),ISUMD=23426)
!
      PARAMETER (IBMAXD=(LMAXD1+1)*(LMAXD1+1),ISUMD=100000)
      PARAMETER (MESHND=IRID)
      PARAMETER (NVTOTD=NFACED*NVERTD)
!
!     .. SCALAR VARIABLES ..
!
      INTEGER     ICE,IFACE,IMAX,IP,IPAN,IPMAX,IREC,IS,ISU,ISUM,IS0
      INTEGER     ITEMP,ITET,IV,IVERT,IVTOT,K,KEYPAN,K0,L,LMAX,M,MESHN
      INTEGER     NFUN,LM0,NCELL,NPOI,NMIN
      INTEGER    MO,MP,N,NFACE,NPAN,NTET,NVERT,NVTOT,I,IB,IBM,IBMAX,IC
      REAL*8      ARG1,ARG2,DLT,FK,FL,FPISQ,R,RAP,RDOWN,SQ3O3,COA
      REAL*8      SCALE,A1,A2,A3,A4
      REAL*8      TOLVDIST,TOLEULER
      LOGICAL    KHCP
!
!     .. ARRAY VARIABLES ..
!
      INTEGER   ISW(IBMAXD),NM(NPAND),LOFM(IBMAXD),MOFM(IBMAXD)
      INTEGER   NEWSCH(NFACED)
      INTEGER   NVERTICES(NFACED)
      REAL*8     CL(ICD)
      REAL*8     V(3,NVERTD),Z(3),CRT(NPAND),DMATL(ISUMD)
      REAL*8     XRN(MESHND),DRN(MESHND),BB(MESHND),C(ICED),B(IBMAXD)
      REAL*8     S3(-LMAXD1:LMAXD1,0:LMAXD1),RUPSQ(NVTOTD)
      REAL*8     S(-LMAXD1:LMAXD1,0:LMAXD1),SUM(0:LMAXD1,2)
      REAL*8     S1(-LMAXD1:LMAXD1,0:LMAXD1),S2(-LMAXD1:LMAXD1,0:LMAXD1)
      REAL*8    AFACE(NFACED),BFACE(NFACED),CFACE(NFACED),DFACE(NFACED)
      REAL*8    XVERT(NVERTD,NFACED),YVERT(NVERTD,NFACED),&
     &          ZVERT(NVERTD,NFACED)
 
      integer NPOI8,NVERTICES8(NFACED),NFACE8,LMAX8,KEYPAN8,NM8(NPAND)
      integer ICLUSTER,icount
      REAL*8           AFACE8(NFACED),BFACE8(NFACED),CFACE8(NFACED),&
     &                 DFACE8(NFACED)
      REAL*8           XVERT8(NVERTD,NFACED),YVERT8(NVERTD,NFACED),&
     &          ZVERT8(NVERTD,NFACED)
      REAL*8           dlt8
      integer j,i1
      logical test
!
!  Basic output
!
      integer NCELL_S,NPAN_S,MESHN_S,NFUN_S 
      integer NM_S(NPAND),LMIFUN_S(IBMAXD)
      REAL*8           XRN_S(MESHND),DRN_S(MESHND),&
     &                 THETAS_S(MESHND,IBMAXD) 
      REAL*8           scale_s
!
!     .. SCALARS IN COMMON ..
!
      REAL*8       PI
!
!     .. ARRAYS IN COMMON ..
!
      INTEGER     ISIGNU(NVTOTD),NTT(NFACED)
      REAL*8      ALPHA(NFACED),BETA(NFACED),GAMMA(NFACED),R0(NFACED)
      REAL*8      FA(NVTOTD),FB(NVTOTD),FD(NVTOTD),RD(NVTOTD)
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC ABS,ACOS,DMAX1,DMIN1,ATAN,DFLOAT,SQRT
!
!     .. EXTERNAL ROUTINES ..
!
      EXTERNAL CCOEF,CRIT,DREAL,MESH,PINTG,TEST
!
!     .. COMMON BLOCKS ..
!
      COMMON /ANGLES/ PI,ALPHA,BETA,GAMMA
      COMMON /TETRA/  FA,FB,FD,R0,RD,ISIGNU,NTT
!
!     .. DATA STATEMENTS ..
!
!$      DATA NM/NPAND*25/
!-----------------------------------------------------------------------
      PI=4.D0*DATAN(1.D0)
      FPISQ=DSQRT(4.D0*PI)
      KHCP=.false.
!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
      
      NPOI = NPOI8
      do i=1,nfaced
         NVERTICES(i) = NVERTICES8(i) !(NFACED)
      end do
      NFACE = NFACE8
      LMAX = LMAX8
      KEYPAN = KEYPAN8
      do i=1,npand
         NM(i) = NM8(i)         ! (NPAND)
      end do
      do i=1,nfaced 
         AFACE(i) = AFACE8(i)   ! (NFACED)
         BFACE(i) = BFACE8(i)   ! (NFACED)
         CFACE(i) = CFACE8(i)   ! (NFACED)
         DFACE(i) = DFACE8(i)   ! (NFACED)
         do i1=1,nvertd
            
            XVERT(i1,i) = XVERT8(i1,i) ! (NVERTD,NFACED)
            YVERT(i1,i) = YVERT8(i1,i) ! (NVERTD,NFACED)
            ZVERT(i1,i) = ZVERT8(i1,i) ! (NVERTD,NFACED)
         end do
      end do 
      DLT = dlt8

!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
!-----------------------------------------
!  THIS CALL DOES SOME GEOMETRICAL TESTS (N.STEFANOU 98)
      CALL POLCHK(NFACE,NVERTICES,XVERT,YVERT,ZVERT,TOLVDIST)
!**********   FOR HCP CASE ONLY    *********
      IF (khcp) then
      COA  =SQRT(8.D0/3.D0)
      COA  =2.D0
      SQ3O3=SQRT(3.D0)/3.D0
      end IF
!**********   FOR HCP CASE  ONLY   *********
!$      READ(7,104) NFACE,LMAX,KEYPAN,DLT
      IBMAX=(LMAX+1)*(LMAX+1)
      ISUM=0
      DO 19 L=0,LMAX
      IS0=(2*L+1)*(2*L+1)
   19 ISUM=ISUM+IS0
      IF(ISUM.GT.ISUMD .OR. LMAX.GT.LMAXD1) GO TO 200
      IPAN=0 
      IVTOT=0
!.......................................................................
!     S TO R A G E            I N    C O M M O N        B L O C K S
!     C A L C U L A T I O N    O F    R O T A T I O N    M A T R I C E S
!.......................................................................
      DO 1 IFACE=1,NFACE
      ITEMP=30+IFACE
!$      READ(7,103) A1,A2,A3,A4,NVERT,NEWSCH(IFACE)       !1.3.2000
      A1 = AFACE(IFACE)
      A2 = BFACE(IFACE)
      A3 = CFACE(IFACE)
      A4 = DFACE(IFACE)
      NVERT = NVERTICES(IFACE)
      NEWSCH(IFACE) = 1         ! THIS is ALWAYS ONE!
! -----------------
      Z(1)=A1/A4
      Z(2)=A2/A4
      Z(3)=A3/A4

!************    FOR HCP CASE ONLY (TO REMOVE OTHERWISE)   ************
      IF (khcp) then
      Z(1)=Z(1)*SQ3O3
      Z(3)=Z(3)*8.D0/COA/3.D0
      end IF
!************    FOR HCP CASE ONLY (TO REMOVE OTHERWISE)   ************

      DO 2 IVERT=1,NVERT
!$      READ(7,100) (V(I,IVERT),I=1,3)           ! 1.3.2000
        
        V(1,IVERT) = XVERT(IVERT,IFACE)  
        V(2,IVERT) = YVERT(IVERT,IFACE)        
        V(3,IVERT) = ZVERT(IVERT,IFACE)

!************    FOR HCP CASE ONLY (TO REMOVE OTHERWISE)   ************
      IF (khcp) then
      V(1,IVERT)=V(1,IVERT)*SQ3O3
      V(3,IVERT)=V(3,IVERT)*COA
      end IF
!************    FOR HCP CASE ONLY (TO REMOVE OTHERWISE)   ************

    2 CONTINUE
      CALL CRIT(IFACE,NVERT,V,Z,IPAN,IVTOT,TOLEULER,TOLVDIST,CRT)
      IF  (TEST('verb0   ')) THEN
         WRITE(6,105) IFACE,NTT(IFACE)
         IF(NEWSCH(IFACE).EQ.0) WRITE(6,110)
      ENDIF
      CALL DREAL(LMAX,ALPHA(IFACE),BETA(IFACE),GAMMA(IFACE),ITEMP)
      REWIND ITEMP
    1 CONTINUE

!.......................................................................
!     D E F I N I T I O N    O F    T H E    S U I T A B L E    M E S H
!.......................................................................
      NVTOT=IVTOT
      NPAN=IPAN
!$      IF(KEYPAN.NE.0) THEN 
!$      READ(7,106) (NM(IPAN),IPAN=1,NPAN-1)
!$      IF (NM(NPAN-1).LT.6) THEN
!$      WRITE(6,*) 'Check number of points for each panel'
!$      STOP
!$      END IF
!$      END IF
      CALL MESH(CRT,NPAN,NM,XRN,DRN,MESHN,NPOI,KEYPAN,NMIN)
      IF (TEST('verb0   ')) THEN 
      WRITE(6,102)
      DO 3 IV=1,NVTOT
      WRITE(6,101) IV,FA(IV)/PI,FB(IV)/PI,FD(IV)/PI,RD(IV),ISIGNU(IV)
    3 CONTINUE
      END IF
!.......................................................................
!     E X P A N S I O N    C O E F F I C I E N T S
!.......................................................................
      CALL CCOEF(LMAX,CL,C)
      IVTOT=0
      DO 21 IFACE=1,NFACE
      NTET=NTT(IFACE)
      DO 21 ITET=1,NTET
      IVTOT=IVTOT+1
      RUPSQ(IVTOT)=SQRT((RD(IVTOT)-R0(IFACE))*(RD(IVTOT)+R0(IFACE)))
   21 CONTINUE
      DO 27 IBM=1,IBMAX
   27 ISW(IBM)=0
      OPEN(11,STATUS='SCRATCH',ACCESS='DIRECT',&
     &        FORM='UNFORMATTED',RECL=80)
!.......................................................................
!     L O O P    O V E R    R A D I A L    M E S H    P O I N T S
!.......................................................................
      DO 12 N=1,MESHN
      R=XRN(N)
      DO 9 IBM=1,IBMAX
    9 B(IBM)=0.D0
      IVTOT=0
!.......................................................................
!     L O O P    O V E R    P Y R A M I D S
!.......................................................................
      DO 13 IFACE=1,NFACE
      NTET=NTT(IFACE)
      ITEMP=30+IFACE
      IF(R.GT.R0(IFACE))  GO TO 31
      IVTOT=IVTOT+NTET
      DO 33 I=0,LMAX
   33 S(0,I) =0.D0
      DO 34 M=1,LMAX
      DO 34 I=0,LMAX-M
      S(-M,I)=0.D0
   34 S( M,I)=0.D0
      GO TO 13
   31 IF(NEWSCH(IFACE).EQ.1) GO TO 35
      IVTOT=IVTOT+NTET
      GO TO 32
   35 ARG1=R0(IFACE)/R
      RDOWN=SQRT((R-R0(IFACE))*(R+R0(IFACE)))
      DO 18 I=0,LMAX
   18 S(0,I) =0.D0
      DO 4 M=1,LMAX
      DO 4 I=0,LMAX-M
      S(-M,I)=0.D0
    4 S( M,I)=0.D0
!.......................................................................
!     L O O P     O V E R     T E T R A H E D R A
!.......................................................................
      DO 14 ITET=1,NTET
      IVTOT=IVTOT+1
      IF(R.LE.RD(IVTOT)) THEN
      CALL PINTG(FA(IVTOT),FB(IVTOT),DLT,S1,LMAX,ISIGNU(IVTOT),&
     &           ARG1,FD(IVTOT),0)
      DO 22 I=0,LMAX
   22 S(0,I)=S(0,I)+S1(0,I)
      DO 10 M=1,LMAX
      DO 10 I=0,LMAX-M
      S(-M,I)=S(-M,I)+S1(-M,I)
   10 S( M,I)=S( M,I)+S1( M,I)
                              ELSE
      RAP =RUPSQ(IVTOT)/RDOWN
      ARG2=RUPSQ(IVTOT)/R0(IFACE)
      FK=FD(IVTOT)-ACOS(RAP)
      FL=FD(IVTOT)+ACOS(RAP)
! CRAY AMAX1
      FK=DMAX1(FA(IVTOT),FK)
      FL=DMAX1(FA(IVTOT),FL)
      FK=DMIN1(FB(IVTOT),FK)
      FL=DMIN1(FB(IVTOT),FL)
      CALL PINTG(FA(IVTOT),FK,DLT,S1,LMAX,ISIGNU(IVTOT),&
     &           ARG1,FD(IVTOT),0)
      CALL PINTG(FK       ,FL,DLT,S2,LMAX,ISIGNU(IVTOT),&
     &           ARG2,FD(IVTOT),1)
      CALL PINTG(FL,FB(IVTOT),DLT,S3,LMAX,ISIGNU(IVTOT),&
     &           ARG1,FD(IVTOT),0)
      DO 23 I=0,LMAX
   23 S(0,I)=S(0,I)+S1(0,I)+S2(0,I)+S3(0,I)
      DO 20 M=1,LMAX
      DO 20 I=0,LMAX-M
      S(-M,I)=S(-M,I)+S1(-M,I)+S2(-M,I)+S3(-M,I)
   20 S( M,I)=S( M,I)+S1( M,I)+S2( M,I)+S3( M,I)
                              END   IF
   14 CONTINUE
!.......................................................................
!     I N T E G R A L   E X P A N S I O N        B A C K - R O T A T I O
!.......................................................................
   32 CONTINUE
      IB=0
      IC=0
      ICE=0
      READ(ITEMP) (DMATL(ISU),ISU=1,ISUM)
      ISU=0
      DO 5 L=0,LMAX
      IB=IB+L+1
      DO 6 MP=L,1,-1
      SUM(MP,1)=0.D0
      SUM(MP,2)=0.D0
      ICE=ICE+1
      K0=(L+MP+1)/2
      DO 7 K=L,K0,-1
      IS=2*K-L-MP
      IC=IC+1
! CRAY FLOAT
      SUM(MP,2)=SUM(MP,2)+CL(IC)*S(-MP,IS)
    7 SUM(MP,1)=SUM(MP,1)+CL(IC)*S( MP,IS)
      SUM(MP,2)=SUM(MP,2)*C(ICE)
      SUM(MP,1)=SUM(MP,1)*C(ICE)
    6 CONTINUE
      SUM(0,1)=0.D0
      ICE=ICE+1
      K0=(L+1)/2
      DO 24 K=L,K0,-1
      IS=2*K-L
      IC=IC+1
! CRAY FLOAT
   24 SUM(0,1)=SUM(0,1)+CL(IC)*S(0,IS)
      SUM(0,1)=SUM(0,1)*C(ICE)
      IMAX=1
      M=0
    8 CONTINUE
      DO 11 I=1,IMAX
      MO=(3-2*I)*M
      IBM=IB+MO
      LOFM(IBM)=L
      MOFM(IBM)=MO
      IPMAX=1
      MP=0
   16 CONTINUE
      DO 17 IP=1,IPMAX
      ISU=ISU+1
      B(IBM)=B(IBM)+SUM(MP,IP)*DMATL(ISU)
   17 CONTINUE
      IPMAX=2
      MP=MP+1
      IF(MP.LE.L) GO TO 16
   11 CONTINUE
      IMAX=2
      M=M+1
      IF(M.LE.L) GO TO 8
      IB=IB+L
    5 CONTINUE
      REWIND ITEMP
   13 CONTINUE
!.......................................................................
!     D E F I N E S   A N D    S A V E S   S H A P E    F U N C T I O N
!.......................................................................
      B(1)=FPISQ-B(1)/FPISQ
      DO 15 IBM=2,IBMAX
      B(IBM)=-B(IBM)/FPISQ
   15 CONTINUE
      DO 25 IBM=1,IBMAX
!     write(6,*) ibm,b(ibm)
      IF(ABS(B(IBM)).GT.1.D-6) ISW(IBM)=1
      IREC=(IBM-1)*MESHN+N
      WRITE(11,REC=IREC) B(IBM)
   25 CONTINUE
   12 CONTINUE
      NFUN=0
      DO 36 IBM=1,IBMAX
      IF(ISW(IBM).EQ.1)  NFUN=NFUN+1
   36 CONTINUE
! THIS IS FOR DIFFERENT SHELLS...
        NCELL=1
        SCALE=1.d0
!
        WRITE(9,106) NCELL
        WRITE(9,111) SCALE
        WRITE(9,106) NPAN-1,MESHN
        WRITE(9,106) (NM(IPAN),IPAN=1,NPAN-1)
        WRITE(9,111) (XRN(N),DRN(N),N=1,MESHN)
        WRITE(9,106) NFUN
        NCELL_S = NCELL
        SCALE_S = SCALE
        NPAN_S = NPAN-1
        MESHN_S = MESHN
        DO IPAN=1,NPAN-1
        NM_S(IPAN) = NM(IPAN)
        END DO
        DO N=1,MESHN
        XRN_S(N) = XRN(N)
        DRN_S(N) = DRN(N)
        END DO
        NFUN_S = NFUN 
        
!     WRITE(9,106) MESHN,NFUN
!     WRITE(9,108) (XRN(N),N=1,MESHN)
      ICOUNT = 0 
      DO 28 IBM=1,IBMAX
! here is;l;lsd

      IF(ISW(IBM).EQ.0) GO TO 28
 
      ICOUNT = ICOUNT + 1
!      WRITE(6,109) LOFM(IBM),MOFM(IBM)
        LM0=LOFM(IBM)*LOFM(IBM)+LOFM(IBM)+MOFM(IBM)+1
        WRITE(9,106)LM0
        LMIFUN_S(ICOUNT) = LM0
      DO 29 N=1,MESHN
      IREC=(IBM-1)*MESHN+N
      READ(11,REC=IREC) BB(N)
      THETAS_S(N,ICOUNT) = BB(N)
   29 CONTINUE
        
        WRITE(9,111)(BB(N),N=1,MESHN)
!      WRITE(6,108) (BB(N),N=1,MESHN)
   28 CONTINUE
      CLOSE(11)
      RETURN
!     STOP
  200 WRITE(6,107) ISUM,ISUMD,LMAX,LMAXD1
      STOP
  100 FORMAT(4F16.8)
  101 FORMAT(I10,4F10.4,I10)
  102 FORMAT(//15X,'FA/PI',5X,'FB/PI',5X,'FD/PI',6X,'RD',8X,'ISIGNU'/)
  103 FORMAT(4F16.8,2I5)
  104 FORMAT(3I5,F10.5)
  105 FORMAT(/10X,I3,'-TH PYRAMID SUBDIVIDED IN ',I3,' TETRAHEDRA')
  106 FORMAT(16I5)
  107 FORMAT(23X,'FROM MAIN : ISUM=',I7,'  GREATER THAN DIMENSIONED',I7/&
     &       23X,'       OR   LMAX=',I7,'  GREATER THAN DIMENSIONED',I7)
  108 FORMAT(5D14.7)
  109 FORMAT(/3X,'ANGULAR MOMENTUM : (',I3,',',I4,')'/3X,29('-')/)
  110 FORMAT(11X,'BUT IS IDENTICAL TO A PREVIOUS ONE.')
  111 FORMAT(4D20.12)
      END

      SUBROUTINE ROTATE(V,VZ,IFACE,NVERT)
      implicit none
!#@# KKRtags: VORONOI geometry
!-----------------------------------------------------------------------
!     THIS ROUTINE PERFORMS THE ROTATION OF NVERT VECTORS THROUGH THE
!     EULER ANGLES: ALPHA(IFACE),BETA(IFACE),GAMMA(IFACE).
!     V (I,IVERT) : INPUT   VECTORS
!     VZ(I,IVERT) : ROTATED VECTORS
!-----------------------------------------------------------------------
!
!     .. PARAMETER STATEMENTS ..
!
      include 'inc.geometry'
!     INTEGER NFACED,NVERTD
!     PARAMETER(NFACED=200,NVERTD=250)
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   IFACE,NVERT
!
!     .. ARRAY ARGUMENTS ..
!
      REAL*8 V(3,NVERTD),VZ(3,NVERTD)
!
!     .. LOCAL SCALARS ..
!
      INTEGER   I,J,IVERT
      REAL*8    SA,SB,SG,CA,CB,CG
!
!     .. LOCAL ARRAYS ..
!
      REAL*8 A(3,3)
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC COS,SIN
!
!     .. SCALARS IN COMMON ..
!
      REAL*8 PI
!
!     .. ARRAYS IN COMMON ..
!
      REAL*8 ALPHA(NFACED),BETA(NFACED),GAMMA(NFACED)
!
!     .. COMMON BLOCKS ..
!
       COMMON /ANGLES/ PI,ALPHA,BETA,GAMMA
!-----------------------------------------------------------------------
      CA=DCOS(ALPHA(IFACE))
      SA=DSIN(ALPHA(IFACE))
      CB=DCOS(BETA(IFACE))
      SB=DSIN(BETA(IFACE))
      CG=DCOS(GAMMA(IFACE))
      SG=DSIN(GAMMA(IFACE))
      A(1,1)=CA*CB*CG-SA*SG
      A(2,1)=SA*CB*CG+CA*SG
      A(3,1)=-SB*CG
      A(1,2)=-CA*CB*SG-SA*CG
      A(2,2)=-SA*CB*SG+CA*CG
      A(3,2)=SB*SG
      A(1,3)=CA*SB
      A(2,3)=SA*SB
      A(3,3)=CB
      DO 1 IVERT=1,NVERT
      DO 2 I=1,3
      VZ(I,IVERT)=0D0
      DO 2 J=1,3
    2 VZ(I,IVERT)=VZ(I,IVERT)+A(I,J)*V(J,IVERT)
    1 CONTINUE
      RETURN
      END

      SUBROUTINE EULER(Z,XX,IFACE,TOLEULER)
      implicit none
!#@# KKRtags: VORONOI geometry
!-----------------------------------------------------------------------
!     GIVEN TWO DISTINCT POINTS (Z(1),Z(2),Z(3)) AND (XX(1),XX(2),XX(3))
!     THIS ROUTINE DEFINES  A LOCAL COORDINATE  SYSTEM WITH THE  Z- AXIS
!     PASSING THROUGH (Z(1),Z(2),Z(3))  AND THE X- AXIS PARALLEL TO  THE
!     VECTOR : (XX(1)-Z(1),XX(2)-Z(2),XX(3)-Z(3)).
!     THE EULER ANGLES ROTATING THIS LOCAL COORDINATE SYSTEM BACK TO THE
!     ORIGINAL FRAME OF REFERENCE ARE CALCULATED  AND STORED  IN COMMON.
!-----------------------------------------------------------------------
!
!     .. PARAMETER STATEMENTS ..
!
      include 'inc.geometry'
!     INTEGER NFACED
!     PARAMETER(NFACED=200)
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   IFACE
!
!     .. ARRAY ARGUMENTS ..
!
      REAL*8    XX(3),Z(3)
!
!     .. LOCAL SCALARS ..
!
      INTEGER   I
      REAL*8    RX,RZ,S,P,RZP,SA,CA,SG,CG
      REAL*8    TOLEULER   ! introduced by Phivos (05.2008) to account for inaccuracies.
      ! Earlier, 1.D-5 was hard-coded at the places in this subr. where TOL is used
!     DATA TOLEULER /1.D-10/
!
!     .. LOCAL ARRAYS ..
!
      REAL*8    X(3),Y(3)
!
!     .. SCALARS IN COMMON ..
!
      REAL*8    PI
!
!     .. ARRAYS IN COMMON ..
!
      REAL*8    ALPHA(NFACED),BETA(NFACED),GAMMA(NFACED)
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC SQRT,ACOS,ABS,ATAN2
!
!     .. COMMON BLOCKS ..
!
      COMMON /ANGLES/ PI,ALPHA,BETA,GAMMA
!-----------------------------------------------------------------------
      IF(IFACE.GT.NFACED) GO TO 20
      DO 4 I=1,3
    4 X(I)=XX(I)-Z(I)
      RX=DSQRT(X(1)*X(1)+X(2)*X(2)+X(3)*X(3))
      RZ=DSQRT(Z(1)*Z(1)+Z(2)*Z(2)+Z(3)*Z(3))
      IF (RX.LT.1D-6 .OR. RZ.LT.1D-6)  GO TO 30
      S=X(1)*Z(1)+X(2)*Z(2)+X(3)*Z(3)
      IF (S.GT.1D-6)                    GO TO 30
      P=DSQRT(Z(1)*Z(1)+Z(2)*Z(2))
      DO 1 I=1,3
      X(I)=X(I)/RX
    1 Z(I)=Z(I)/RZ
      ALPHA(IFACE)=0D0
      BETA(IFACE) =DACOS(Z(3))
      IF (P .LT. TOLEULER) GO TO 10
      RZP=RZ/P
      Y(1)=Z(2)*X(3)-Z(3)*X(2)
      Y(2)=Z(3)*X(1)-Z(1)*X(3)
      Y(3)=Z(1)*X(2)-Z(2)*X(1)
      SA=Y(3)*RZP
      CA=X(3)*RZP
      IF(DABS(SA).LT.TOLEULER .AND. DABS(CA+1.D0).LT.TOLEULER)  THEN
      ALPHA(IFACE)=PI
                                                      ELSE
      ALPHA(IFACE)=2D0*DATAN2(SA,CA+1D0)
                                                      END    IF
      SG= Z(2)*RZP
      CG=-Z(1)*RZP
      IF(DABS(SG).LT.TOLEULER .AND. DABS(CG+1D0).LT.TOLEULER)  THEN
      GAMMA(IFACE)=PI
                                                      ELSE
      GAMMA(IFACE)=2D0*DATAN2(SG,CG+1D0)
                                                      END    IF
      DO 2 I=1,3
    2 Z(I)=Z(I)*RZ
      RETURN
   10 SG=-Z(3)*X(2)
      CG= Z(3)*X(1)
      IF(DABS(SG).LT.TOLEULER .AND. DABS(CG+1D0).LT.TOLEULER)  THEN
      GAMMA(IFACE)=PI
                                                      ELSE
      GAMMA(IFACE)=2D0*DATAN2(SG,CG+1D0)
                                                      END    IF
      DO 3 I=1,3
    3 Z(I)=Z(I)*RZ
      RETURN
   20 WRITE(6,100) IFACE,NFACED
      STOP
   30 WRITE(6,101) (X(I),I=1,3),(Z(I),I=1,3)
      STOP
  100 FORMAT(//13X,'NUMBER OF FACES:',I5,' GREATER THAN DIMENSIONED',I5)
  101 FORMAT(/13X,'FROM EULER,ILLEGAL VECTORS:'/13X,2(' (',3E13.6,' )'))
      END

      SUBROUTINE PERP(R0,R1,R2,RD,TOLVDIST,INSIDE)
      implicit none
!#@# KKRtags: VORONOI geometry
!-----------------------------------------------------------------------
!     GIVEN  TWO  DISTINCT  POINTS   R1 , R2, THIS  ROUTINE CALCULATES
!     THE COORDINATES  OF THE FOOT OF  THE  PERPENDICULAR FROM A POINT
!     R0 TO THE LINE JOINING R1   AND  R2. THE LOGICAL VARIABLE INSIDE
!     GIVES THE ADDITIONAL INFORMATION WHETHER THE FOOT OF THE PERPEN-
!     DICULAR LIES WITHIN THE SEGMENT OR NOT.
!-----------------------------------------------------------------------
!
!     .. ARRAY ARGUMENTS ..
!
      REAL*8 R0(3),R1(3),R2(3),RD(3)
      REAL*8 TOLVDIST
!
!     .. LOGICAL ARGUMENTS ..
!
      LOGICAL INSIDE
!
!     .. LOCAL SCALARS ..
!
      INTEGER   I
      REAL*8    DX,DY,DZ,S,D,DA,DB,DC,D1,D2,CO
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC DMAX1
!---------------------------------------------------------------------
      DX=R2(1)-R1(1)
      DY=R2(2)-R1(2)
      DZ=R2(3)-R1(3)
      S=R0(1)*DX+R0(2)*DY+R0(3)*DZ
      D=DX*DX+DY*DY+DZ*DZ
      IF(SQRT(D).LT.TOLVDIST) GO TO 100
      DA=S*DX+DY*(R1(1)*R2(2)-R1(2)*R2(1))+DZ*(R1(1)*R2(3)-R1(3)*R2(1))
      DB=S*DY+DZ*(R1(2)*R2(3)-R1(3)*R2(2))+DX*(R1(2)*R2(1)-R1(1)*R2(2))
      DC=S*DZ+DX*(R1(3)*R2(1)-R1(1)*R2(3))+DY*(R1(3)*R2(2)-R1(2)*R2(3))
      RD(1)=DA/D
      RD(2)=DB/D
      RD(3)=DC/D
      D1=(RD(1)-R1(1))**2+(RD(2)-R1(2))**2+(RD(3)-R1(3))**2
      D2=(RD(1)-R2(1))**2+(RD(2)-R2(2))**2+(RD(3)-R2(3))**2
! CRAY AMAX1
      CO=D-DMAX1(D1,D2)
      INSIDE=.FALSE.
      IF ( CO.GT.TOLVDIST)  INSIDE=.TRUE.
      RETURN
  100 WRITE(6,200) (R1(I),I=1,3),(R2(I),I=1,3)
      STOP
  200 FORMAT(///33X,'FROM PERP:   IDENTICAL POINTS'/33X,2('(',3E14.6,')'&
     &,3X))
      END

      SUBROUTINE CRIT(IFACE,NVERT,V,Z,IPAN,IVTOT,TOLEULER,TOLVDIST,CRT)
      implicit none
!#@# KKRtags: VORONOI geometry radial-grid
!-----------------------------------------------------------------------
!     THIS ROUTINE CALCULATES THE CRITICAL POINTS 'CRT' OF THE SHAPE
!     FUNCTIONS DUE TO THE FACE: Z(1)*X + Z(2)*Y + Z(3)*Z = 1
!     THE FACE IS ROTATED THROUGH THE APPROPRIATE EULER ANGLES TO BE
!     PERPENDICULAR TO THE Z-AXIS. A FURTHER SUBDIVISION OF THE CEN-
!     TRAL PYRAMID INTO ELEMENTARY TETRAHEDRA IS PERFORMED. THE  NE-
!     CESSARY QUANTITIES FOR THE CALCULATION ARE STORED IN COMMON.
!-----------------------------------------------------------------------
!
!     .. PARAMETER STATEMENTS ..
!
      include 'inc.geometry'
      INTEGER NVTOTD
!     PARAMETER (NVERTD=250,NFACED=200)
      PARAMETER (NVTOTD=NFACED*NVERTD)
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   IFACE,NVERT,IPAN,IVTOT
      REAL*8 TOLEULER,TOLVDIST
!
!     .. ARRAY ARGUMENTS ..
!
      REAL*8 V(3,NVERTD),Z(3),CRT(NPAND)
!
!     .. LOCAL SCALARS ..
!
      INTEGER   I,IX,ICORN,IVERT,INEW,IP,IVERTP,IVERT1,IBACK
      REAL*8    ARG,A1,A2,A3,CF1,CF2,CF3,CO,CRRT,DD,DOWN,D1,D2
      REAL*8    FF,F1,F2,OMEGA,RDD,S,SF1,SF2,SF3,UP,XJ,YJ,ZMOD2
      REAL*8    ZVMOD
!
!     .. LOCAL ARRAYS ..
!
      INTEGER   IN(NVERTD)
      REAL*8    VZ(3,NVERTD),RDV(3),ORIGIN(3)
!
!     .. LOCAL LOGICAL ..
!
      LOGICAL INSIDE,TEST
!
!     .. SCALARS IN COMMON ..
!
      REAL*8 PI
!
!     .. ARRAYS IN COMMON ..
!
      INTEGER   ISIGNU(NVTOTD),NTT(NFACED)
      REAL*8    RD(NVTOTD),R0(NFACED),FA(NVTOTD),FB(NVTOTD),FD(NVTOTD)
      REAL*8    ALPHA(NFACED),BETA(NFACED),GAMMA(NFACED)
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC ABS,ACOS,DMAX1,DMIN1,ATAN2,SIGN,SQRT
!
!     .. EXTERNAL ROUTINES ..
!
      EXTERNAL EULER,PERP,ROTATE
!
!     .. COMMON BLOCKS ..
!
      COMMON/ANGLES/  PI,ALPHA,BETA,GAMMA
      COMMON/TETRA/ FA,FB,FD,R0,RD,ISIGNU,NTT
!
!     .. DATA STATEMENTS ..
!
      DATA ORIGIN/3*0.D0/
      PI=4.D0*DATAN(1.D0)  ! added 1.3.2012, fivos
!-----------------------------------------------------------------------
      NTT(IFACE)=0
      IF (TEST('verb0   ')) WRITE(6,203) IFACE,(Z(I),I=1,3)
      ZMOD2=Z(1)*Z(1)+Z(2)*Z(2)+Z(3)*Z(3)
      IF(ZMOD2.LE.1D-6) GO TO 100
      S=2D0*PI
      DO 1 I=1,3
    1 Z(I)=Z(I)/ZMOD2
      IX=1
      ZVMOD=DSQRT((V(1,1)-Z(1))**2+(V(2,1)-Z(2))**2+(V(3,1)-Z(3))**2)
      IF(ZVMOD.LT.1D-6)  IX=2 
      CALL EULER(Z,V(1,IX),IFACE,TOLEULER)
      IF (TEST('verb0   '))&
     &     WRITE(6,204) ALPHA(IFACE)/PI,BETA(IFACE)/PI,GAMMA(IFACE)/PI
      CALL ROTATE(V,VZ,IFACE,NVERT)
      R0(IFACE)=1D0/DSQRT(ZMOD2)
      ICORN=0
      IF (TEST('verb0   ')) WRITE(6,207)
      DO 2 IVERT =1,NVERT
      IF(DABS(R0(IFACE)-VZ(3,IVERT)).GT.1D-6) GO TO 101
!.......................................................................
!     D I S T A N C E S   O F   V E R T I C E S   F R O M   C E N T E R
!.......................................................................
      CRRT=DSQRT(VZ(1,IVERT)**2+VZ(2,IVERT)**2+VZ(3,IVERT)**2)
      INEW=1
      DO 3 IP=1,IPAN
      IF(DABS(CRRT-CRT(IP)).LT.1D-6) INEW=0
    3 CONTINUE
      IF(INEW.EQ.1)          THEN
      IPAN=IPAN+1
      IF(IPAN.GT.NPAND) GO TO 102
      CRT(IPAN)=CRRT
                             END   IF
      IVERTP=IVERT+1
      IF(IVERT.EQ.NVERT) IVERTP=1
!.......................................................................
!     D I S T A N C E S   O F   E D G E S   F R O M   C E N T E R
!.......................................................................
      CALL PERP(ORIGIN,VZ(1,IVERT),VZ(1,IVERTP),RDV,TOLVDIST,INSIDE)
      RDD=DSQRT(RDV(1)*RDV(1)+RDV(2)*RDV(2)+RDV(3)*RDV(3))
      IF(INSIDE)             THEN
      INEW=1
      DO 4 IP=1,IPAN
      IF(DABS(RDD-CRT(IP)).LT.1D-4) INEW=0
    4 CONTINUE
      IF(INEW.EQ.1)          THEN
      IPAN=IPAN+1
      IF(IPAN.GT.NPAND) GO TO 102
      CRT(IPAN)=RDD
                             END   IF
                             END    IF
      A1=DSQRT(VZ(1,IVERT )*VZ(1,IVERT )+VZ(2,IVERT )*VZ(2,IVERT ))
      A2=DSQRT(VZ(1,IVERTP)*VZ(1,IVERTP)+VZ(2,IVERTP)*VZ(2,IVERTP))
      DOWN=A1*A2
      UP=VZ(1,IVERT)*VZ(1,IVERTP)+VZ(2,IVERT)*VZ(2,IVERTP)
      IF(DOWN.GT.1D-6)      THEN
      ARG=UP/DOWN
      IF(DABS(ARG).GE.1D0) ARG=SIGN(1D0,ARG)
      OMEGA=DACOS(ARG)
      S=S-OMEGA
      IF(DABS(OMEGA-PI).GT.1D-6)                 THEN
!.......................................................................
!     S U B D I V I S I O N    I N TO    T E T R A H E D R A
!.......................................................................
      NTT(IFACE)=NTT(IFACE)+1
      IVTOT=IVTOT+1
      IF (TEST('verb0   ')) WRITE(6,205) IVTOT,IVERT,(VZ(I,IVERT),I=1,3)
      IF (TEST('verb0   ')) WRITE(6,206)     IVERTP,(VZ(I,IVERTP),I=1,3)
      A3=DSQRT(RDV(1)*RDV(1)+RDV(2)*RDV(2))
      RD    (IVTOT)=RDD
      ISIGNU(IVTOT)=1
      CF1=VZ(1,IVERT )/A1
      CF2=VZ(1,IVERTP)/A2
      SF1=VZ(2,IVERT )/A1
      SF2=VZ(2,IVERTP)/A2
      CF3=RDV(1)/A3
      SF3=RDV(2)/A3
      IF(DABS(SF1).LT.TOLEULER .AND. DABS(CF1+1D0).LT.TOLEULER)  THEN
      F1=PI
                                                           ELSE
      F1=2D0*DATAN2(SF1,CF1+1D0)
                                                           END    IF
      IF(DABS(SF2).LT.TOLEULER .AND. DABS(CF2+1D0).LT.TOLEULER)  THEN
      F2=PI
                                                           ELSE
      F2=2D0*DATAN2(SF2,CF2+1D0)
                                                           END    IF
      IF(DABS(SF3).LT.TOLEULER .AND. DABS(CF3+1D0).LT.TOLEULER)  THEN
      FD(IVTOT)=PI
                                                           ELSE
      FD(IVTOT)=2D0*DATAN2(SF3,CF3+1D0)
                                                           END    IF
! CRAY AMIN1
      FA(IVTOT)=DMIN1(F1,F2)
      FB(IVTOT)=DMAX1(F1,F2)
      IF((FB(IVTOT)-FA(IVTOT)).GT.PI)                 THEN
      FF=FA(IVTOT)+2D0*PI
      FA(IVTOT)=FB(IVTOT)
      FB(IVTOT)=FF
                                                      END   IF
      IF((FA(IVTOT)-FD(IVTOT)).GT.PI)  FD(IVTOT)= 2D0*PI+FD(IVTOT)
      IF((FD(IVTOT)-FA(IVTOT)).GT.PI)  FD(IVTOT)=-2D0*PI+FD(IVTOT)
                                                 END    IF
                             ELSE
      ICORN=1
                             END    IF
    2 CONTINUE
!.......................................................................
!     F O O T   O F   T H E    P E R P END I C U L A R   TO    T H E
!     F A C E   O U T S I D E   O R  I N S I D E   T H E   P O L Y GO N
!.......................................................................
      IF(S.LT.1D-06.OR.ICORN.EQ.1)               THEN
      INEW=1
      DO 5 IP=1,IPAN
      IF(DABS(R0(IFACE)-CRT(IP)).LT.1D-4) INEW=0
    5 CONTINUE
      IF(INEW.EQ.1)          THEN
      IPAN=IPAN+1
      IF(IPAN.GT.NPAND) GO TO 102
      CRT(IPAN)=R0(IFACE)
                             END   IF
                                                 ELSE
      DO 6 IVERT1=1,NVERT
      IN(IVERT1)=0
      DO 7 IVERT=1,NVERT
      IVERTP=IVERT+1
      IF(IVERT.EQ.NVERT) IVERTP=1
      IF(IVERT.EQ.IVERT1.OR.IVERTP.EQ.IVERT1)    GO TO 7
      DOWN=VZ(2,IVERT1)*(VZ(1,IVERTP)-VZ(1,IVERT))&
     &    -VZ(1,IVERT1)*(VZ(2,IVERTP)-VZ(2,IVERT))
      IF(DABS(DOWN).LE.1D-06)                     GO TO 7
      UP  =VZ(1,IVERT1)*(VZ(2,IVERT)*(VZ(1,IVERTP)+VZ(1,IVERT))&
     &    -              VZ(1,IVERT)*(VZ(2,IVERTP)+VZ(2,IVERT)))
      XJ=UP/DOWN
      YJ=XJ*VZ(2,IVERT1)/VZ(1,IVERT1)
      DD=(VZ(1,IVERTP)-VZ(1,IVERT))**2+(VZ(2,IVERTP)-VZ(2,IVERT))**2
      D1=(XJ-VZ(1,IVERT ))**2+(YJ-VZ(2,IVERT ))**2
      D2=(XJ-VZ(1,IVERTP))**2+(YJ-VZ(2,IVERTP))**2
! CRAY AMAX1
      CO=DD-DMAX1(D1,D2)
      IF(CO.GT.1D-06)        THEN
      IN(IVERT1)=1
      GO TO 6
                             END   IF
    7 CONTINUE
    6 CONTINUE
      IBACK=IVTOT-NVERT
      DO 8 IVERT=1,NVERT
      IBACK=IBACK+1
      IVERTP=IVERT+1
      IF(IVERT.EQ.NVERT) IVERTP=1
      IF(IN(IVERT).EQ.0.AND.IN(IVERTP).EQ.0)     ISIGNU(IBACK)=-1
    8 CONTINUE
                                                 END   IF
      RETURN
  100 WRITE(6,200) IFACE,(Z(I),I=1,3)
      STOP
  101 WRITE(6,201) IFACE,R0(IFACE),((VZ(I,IVERT),I=1,3),IVERT=1,NVERT)
      STOP
  102 WRITE(6,202) IPAN,NPAND
      STOP
  200 FORMAT(//13X,'FATAL ERROR FROM CRIT: THE',I3,'-TH FACE OF THE POLY&
     &HEDRON PASSES THROUGH THE CENTER'/13X,'(',3E14.7,' )')
  201 FORMAT(//13X,'FATAL ERROR FROM CRIT: THE VERTICES OF THE',I3,'-TH&
     &ROTATED POLYGON DO NOT LIE ON THE PLANE:',E13.6,' *Z = 1'/30(/13X,&
     &3E13.6))
  202 FORMAT(//13X,'ERROR FROM CRIT: NUMBER OF PANNELS=',I5,' GREATER TH&
     &AN DIMENSIONED=',I5)
  203 FORMAT(//80('*')/3X,'FACE:',I3,' EQUATION:',F10.4,'*X +',F10.4,&
     &'*Y +',F10.4,'*Z  =  1')
  204 FORMAT(3X,'ROTATION ANGLES  :',3(F10.4,4X)/)
  205 FORMAT(I5,'       VZ(',I2,')  =  (',3F10.4,' )')
  206 FORMAT(5X,'       VZ(',I2,')  =  (',3F10.4,' )')
  207 FORMAT(/'TETRAHEDRON',14X,'COORDINATES'/11('*'),14X,11('*')/)
      END

      SUBROUTINE MESH(CRT,NPAN,NM,XRN,DRN,MESHN,NPOI,KEYPAN,NMIN)
      implicit none
!#@# KKRtags: VORONOI radial-grid
!-----------------------------------------------------------------------
!     THIS ROUTINE DEFINES A UNIQUE SUITABLE RADIAL MESH 'XRN,DRN' OF
!     'MESHN' POINTS,DISTRIBUTED INTO 'NPAN' PANNELS  DEFINED  BY THE
!     CRITICAL POINTS 'CRT'
!-----------------------------------------------------------------------
!
!     .. PARAMETER STATEMENTS ..
!
      include 'inc.geometry'
!      INTEGER NPAND,MESHND
!      PARAMETER (NPAND=80,MESHND=1000)
       INTEGER MESHND
       PARAMETER (MESHND=IRID)
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   NPAN,MESHN,NPOI,KEYPAN,NMIN
!
!     .. ARRAY ARGUMENTS ..
!
      INTEGER   NM(NPAND)
      REAL*8    CRT(NPAND),XRN(MESHND),DRN(MESHND)
!
!     .. LOCAL SCALARS ..
!
      INTEGER   IORD,IPAN,N1,N2,K
      REAL*8    C,D
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC DFLOAT
!-----------------------------------------------------------------------
      DO 10 IORD=1,NPAN
      C=CRT(IORD)
      DO 20 IPAN=NPAN,IORD,-1
      IF(CRT(IPAN).GT.C)   GO TO 20
      C=CRT(IPAN)
      CRT(IPAN)=CRT(IORD)
      CRT(IORD)=C
   20 CONTINUE
   10 CONTINUE
!
!     CALCULATE AN APPROPRIATE MESH
!
      IF (KEYPAN.EQ.0) THEN
      CALL MESH0(CRT,NM,NPAN,NPOI,NMIN)
      END IF
!
      WRITE(6,103)
      N2=0
      DO 50 IPAN = 1,NPAN-1
      WRITE(6,104) IPAN,CRT(IPAN),CRT(IPAN+1),NM(IPAN)
      N1 = N2 + 1
      N2 = N2 + NM(IPAN)
      IF (MESHND.GE.N2)      THEN
! CRAY FLOAT
      C = (CRT(IPAN+1)-CRT(IPAN))/DFLOAT(N2-N1)
      D = CRT(IPAN) - C*DFLOAT(N1)
      DO 60 K = N1,N2
      XRN(K) = C*DFLOAT(K) + D
      DRN(K) = C
   60 CONTINUE
                             ELSE
      GO TO 70
                             END    IF
   50 CONTINUE
      WRITE(6,105)
      MESHN = N2
!      WRITE(6,101)(K,DRN(K),XRN(K),K=1,MESHN)
      RETURN
   70 WRITE (6,102) MESHND
      STOP
  101 FORMAT (/'    NEW MESH  K,DRN,XRN'/(1H ,I3,2F12.7))
  102 FORMAT ('   *** FROM MESH  :    NXR=',I4,' IS TOO SMALL')
  103 FORMAT(/50('-')/'I',13X,'SUITABLE RADIAL MESH',15X,'I'/'I',13X,&
     &20('*'),15X,'I'/'I',3X,'IPAN',7X,'FROM',7X,'TO',13X,'POINTS  I'/&
     &'I',48X,'I')
  104 FORMAT('I',2X,I5,2E24.16,I10,'   I')
  105 FORMAT(50('-'))
      END

      SUBROUTINE PINTG(X1,X2,DLT,S,LMAX,ISI,ARG,FD,ITYPE)
      implicit none
!#@# KKRtags: VORONOI numerical-tools radial-grid
!-----------------------------------------------------------------------
!     THIS ROUTINE  ACCOMPLISHES THE  FI-INTEGRATION  OF REAL  SPHERICAL
!     HARMONICS BY THE REPEATED SIMPSON'S METHOD , OR ANALYTICALLY ACCOR
!     DING TO THE VALUE OF ITYPE. THE OBTAINED RESULTS HAVE TO BE MULTI-
!     PLIED BY THE APPROPRIATE EXPANSION COEFFICIENTS.
!-----------------------------------------------------------------------
!
!     .. PARAMETER STATEMENTS ..
!
      include 'inc.geometry'
!      INTEGER LMAXD,NDIM
!      PARAMETER (LMAXD=25,NDIM=1000)
      INTEGER NDIM
      PARAMETER (NDIM=1000)
!
!     .. SCALAR ARGUMENTS ..
!
      REAL*8 X1,X2,DLT,ARG,FD
      INTEGER   LMAX,ISI,ITYPE
!
!     .. ARRAY ARGUMENTS ..
!
      REAL*8 S(-LMAXD1:LMAXD1,0:LMAXD1)
!
!     .. LOCAL SCALARS ..
!
      INTEGER   I,M,N,K
      REAL*8    X,THETA,W
!
!     .. LOCAL ARRAYS ..
!
      REAL*8    XX(NDIM),WW(NDIM)
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC DFLOAT,ACOS,ATAN,COS,IABS
!
!     .. EXTERNAL ROUTINE ..
!
      EXTERNAL RECUR,RECUR0,GAULEG
!-----------------------------------------------------------------------
      IF(LMAX.LE.LMAXD1) GO TO 1
      WRITE(6,200)LMAX,LMAXD1
  200 FORMAT(3X,'FROM PINTG: LMAX=',I4,' GREATER THAN DIMENSIONED',I4)
      STOP
    1 CONTINUE
      DO 6 I=0,LMAX
    6 S( 0,I)=0.D0
      DO 5 M=1,LMAX
      DO 5 I=0,LMAX-M
      S(-M,I)=0.D0
    5 S( M,I)=0.D0
      IF(ITYPE.NE.0)      GO TO 10
      THETA=ACOS(ARG)
      CALL RECUR0(LMAX,X1,THETA,-DFLOAT(ISI),S)
      CALL RECUR0(LMAX,X2,THETA, DFLOAT(ISI),S)
      RETURN
!                         END    IF
   10 CONTINUE
      N=(X2-X1)/DLT+3
      IF(N.GT.NDIM) STOP 'INCREASE NDIM'
      CALL GAULEG(X1,X2,XX,WW,N)
      DO 2 K=1,N
      X=XX(K)
      W=DFLOAT(ISI)*WW(K)
      THETA=ATAN(ARG/COS(X-FD))
      CALL RECUR(LMAX,X,THETA,W,S)
    2 CONTINUE
      RETURN
      END

      SUBROUTINE GAULEG(X1,X2,X,W,N)
      IMPLICIT NONE
!#@# KKRtags: VORONOI special-functions
!     ----------------------------------------------------------------
!     GINEN THE LOWER AND UPPER LIMITS OF INTEGRATION  X1 AND X2, AND
!     GIVEN N, THIS SUBROUTINE RETURNS THE  ARRAYS X(1:N) AND  W(1:N)
!     OF LENGTH N, CONTAINING THE ABSCISSAS AND WEIGHTS OF THE  GAUSS
!     LEGENDRE N-POINT QUADRATURE FORMULA (NUMERICAL RECIPES,2ND ED.).
!     ----------------------------------------------------------------
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   N
      REAL*8    X1,X2
!
!     .. ARRAY ARGUMENTS ..
!
      REAL*8    X(1),W(1)
!
!     .. LOCAL SCALARS ..
!
      INTEGER   I,J,M
      REAL*8    P1,P2,P3,PP,XL,XM,Z,Z1,PI314
!     ----------------------------------------------------------------
      PI314 = 4.D0*DATAN(1.D0)

      M=(N+1)/2
      XM=0.5D0*(X2+X1)
      XL=0.5D0*(X2-X1)
      DO 12 I=1,M
      Z=DCOS(PI314*(I-.25D0)/(N+.5D0))
    1 CONTINUE
      P1=1.D0
      P2=0.D0
      DO 11 J=1,N
      P3=P2
      P2=P1
      P1=((2.D0*J-1.D0)*Z*P2-(J-1.D0)*P3)/J
   11 CONTINUE
      PP=N*(Z*P1-P2)/(Z*Z-1.D0)
      Z1=Z
      Z=Z1-P1/PP
      IF(ABS(Z-Z1).GT.3.D-14) GO TO 1
      X(I)=XM-XL*Z
      X(N+1-I)=XM+XL*Z
      W(I)=2.D0*XL/((1.D0-Z*Z)*PP*PP)
      W(N+1-I)=W(I)
   12 CONTINUE
      RETURN
      END

      SUBROUTINE RECUR(LMAX,X,THETA,FAC,S)
      implicit none
!#@# KKRtags: VORONOI special-functions
!-----------------------------------------------------------------------
!     THIS ROUTINE IS USED TO PERFORM THE FI-INTEGRATION OF REAL SPHE-
!     RICAL HARMONICS .THE THETA-INTEGRATION IS PERFORMED ANALYTICALLY
!     USING RECURRENCE RELATIONS.
!-----------------------------------------------------------------------
!
!     .. PARAMETER STATEMENTS ..
!
       include 'inc.geometry'
!      INTEGER LMAXD
!      PARAMETER (LMAXD=25)
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   LMAX
      REAL*8 X,THETA,FAC
!
!     .. ARRAY ARGUMENTS ..
!
      REAL*8 S(-LMAXD1:LMAXD1,0:LMAXD1)
!
!     .. LOCAL SCALARS ..
!
      INTEGER   M,I
      REAL*8 OL0,OL,EL0,EL,C1,C2,SS,CC
      REAL*8 C01(LMAXD1),C02(LMAXD1),SSA(LMAXD1+2),CCA(LMAXD1+2)
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC COS,SIN,DFLOAT
!-----------------------------------------------------------------------
      SS=SIN(THETA)
      CC=COS(THETA)
      DO 13 I=1,LMAX
      C01(I)=FAC*SIN(DFLOAT(I)*X)
   13 C02(I)=FAC*COS(DFLOAT(I)*X)
      DO 11 I=1,LMAX+2
      SSA(I)=SS**I
      CCA(I)=CC**I
   11 CONTINUE
      OL0=(THETA-SS*CC)/2.D0
      EL0=0D0
      DO 1 M=1,LMAX,2
      OL=OL0
      EL=EL0
      C1=C01(M)
      C2=C02(M)
      DO 2 I=0,LMAX-M,2
      S(-M,I)=S(-M,I)+C1*(OL-EL)
      S( M,I)=S( M,I)+C2*(OL-EL)
      EL= DFLOAT(I+1)*EL/DFLOAT(I+M+3)
    2 OL=(DFLOAT(I+1)*OL+(SSA(M+2))*(CCA(I+1)))/DFLOAT(I+M+3)
      EL0= DFLOAT(M+2)*EL0/DFLOAT(M+3)
      OL0=(DFLOAT(M+2)*OL0-(SSA(M+2))*CC)/DFLOAT(M+3)
    1 CONTINUE
      OL0=SSA(3)/3.D0
      EL0=0D0
      DO 3 M=1,LMAX,2
      OL=OL0
      EL=EL0
      C1=C01(M)
      C2=C02(M)
      DO 4 I=1,LMAX-M,2
      S(-M,I)=S(-M,I)+C1*(OL-EL)
      S( M,I)=S( M,I)+C2*(OL-EL)
      OL=(DFLOAT(I+1)*OL+SSA(M+2)*CCA(I+1))/DFLOAT(I+M+3)
    4 EL= DFLOAT(I+1)*EL/DFLOAT(I+M+3)
      OL0=(DFLOAT(M+2)*OL0-(SSA(M+2))*CCA(2))/DFLOAT(M+4)
      EL0= DFLOAT(M+2)*EL0/DFLOAT(M+4)
    3 CONTINUE
      OL0=-CC
      EL0=-1D0
      OL=OL0
      EL=EL0
      C2=FAC
      DO 9 I=0,LMAX,2
      S(0,I)=S(0,I)+C2*(OL-EL)
      OL=(DFLOAT(I+1)*OL+SSA(2)*CCA(I+1))/DFLOAT(I+3)
    9 EL= DFLOAT(I+1)*EL/DFLOAT(I+3)
      OL0=(2.D0*OL0-SSA(2)*CC)/3.D0
      EL0= 2.D0*EL0/3.D0
      DO 5 M=2,LMAX,2
      OL=OL0
      EL=EL0
      C1=C01(M)
      C2=C02(M)
      DO 6 I=0,LMAX-M,2
      S(-M,I)=S(-M,I)+C1*(OL-EL)
      S( M,I)=S( M,I)+C2*(OL-EL)
      OL=(DFLOAT(I+1)*OL+SSA(M+2)*CCA(I+1))/DFLOAT(I+M+3)
    6 EL= DFLOAT(I+1)*EL/DFLOAT(I+M+3)
      OL0=(DFLOAT(M+2)*OL0-SSA(M+2)*CC)/DFLOAT(M+3)
      EL0= DFLOAT(M+2)*EL0/DFLOAT(M+3)
    5 CONTINUE
      OL0=-CCA(2)/2D0
      EL0=-0.5D0
      OL=OL0
      EL=EL0
      C2=FAC
      DO 10 I=1,LMAX,2
      S(0,I)=S(0,I)+C2*(OL-EL)
      OL=(DFLOAT(I+1)*OL+SS*SS*CCA(I+1))/DFLOAT(I+3)
   10 EL= DFLOAT(I+1)*EL/DFLOAT(I+3)
      OL0=(2.D0*OL0-SSA(2)*CCA(2))/4.D0
      EL0= 2.D0*EL0/4.D0
      DO 7 M=2,LMAX,2
      OL=OL0
      EL=EL0
      C1=C01(M)
      C2=C02(M)
      DO 8 I=1,LMAX-M,2
      S(-M,I)=S(-M,I)+C1*(OL-EL)
      S( M,I)=S( M,I)+C2*(OL-EL)
      OL=(DFLOAT(I+1)*OL+SSA(M+2)*CCA(I+1))/DFLOAT(I+M+3)
    8 EL= DFLOAT(I+1)*EL/DFLOAT(I+M+3)
      OL0=(DFLOAT(M+2)*OL0-SSA(M+2)*CCA(2))/DFLOAT(M+4)
      EL0= DFLOAT(M+2)*EL0/DFLOAT(M+4)
    7 CONTINUE
      RETURN
      END

      SUBROUTINE RECUR0(LMAX,X,THETA,FAC,S)
      implicit none
!#@# KKRtags: VORONOI special-functions
!-----------------------------------------------------------------------
!     THIS ROUTINE IS USED TO PERFORM  THE  FI - INTEGRATION  OF REAL SP
!     RICAL HARMONICS ANALYTICALLY.  THE  THETA-INTEGRATION  IS   PERFOR
!     ALSO ANALYTICALLY USING RECURRENCE RELATIONS.(THETA IS FI-INDEPEND
!-----------------------------------------------------------------------
!
!     .. PARAMETER STATEMENTS ..
!
       include 'inc.geometry'
!      INTEGER LMAXD
!      PARAMETER (LMAXD=25)
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   LMAX
      REAL*8 X,THETA,FAC
!
!     .. ARRAY ARGUMENTS ..
!
      REAL*8 S(-LMAXD1:LMAXD1,0:LMAXD1)
!
!     .. LOCAL SCALARS ..
!
      INTEGER   M,I
      REAL*8 OL0,OL,EL0,EL,C1,C2,SS,CC
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC COS,SIN,DFLOAT
!-----------------------------------------------------------------------
      SS=SIN(THETA)
      CC=COS(THETA)
      OL0=(THETA-SS*CC)/2D0
      EL0=0D0
      DO 1 M=1,LMAX,2
      OL=OL0
      EL=EL0
      C1=-FAC*COS(DFLOAT(M)*X)/DFLOAT(M)
      C2= FAC*SIN(DFLOAT(M)*X)/DFLOAT(M)
      DO 2 I=0,LMAX-M,2
      S(-M,I)=S(-M,I)+C1*(OL-EL)
      S( M,I)=S( M,I)+C2*(OL-EL)
      EL= DFLOAT(I+1)*EL/DFLOAT(I+M+3)
    2 OL=(DFLOAT(I+1)*OL+(SS**(M+2))*(CC**(I+1)))/DFLOAT(I+M+3)
      EL0= DFLOAT(M+2)*EL0/DFLOAT(M+3)
      OL0=(DFLOAT(M+2)*OL0-(SS**(M+2))*CC)/DFLOAT(M+3)
    1 CONTINUE
      OL0=SS*SS*SS/3D0
      EL0=0D0
      DO 3 M=1,LMAX,2
      OL=OL0
      EL=EL0
      C1=-FAC*COS(DFLOAT(M)*X)/DFLOAT(M)
      C2= FAC*SIN(DFLOAT(M)*X)/DFLOAT(M)
      DO 4 I=1,LMAX-M,2
      S(-M,I)=S(-M,I)+C1*(OL-EL)
      S( M,I)=S( M,I)+C2*(OL-EL)
      OL=(DFLOAT(I+1)*OL+(SS**(M+2))*(CC**(I+1)))/DFLOAT(I+M+3)
    4 EL= DFLOAT(I+1)*EL/DFLOAT(I+M+3)
      OL0=(DFLOAT(M+2)*OL0-(SS**(M+2))*CC*CC)/DFLOAT(M+4)
      EL0= DFLOAT(M+2)*EL0/DFLOAT(M+4)
    3 CONTINUE
      OL0=-CC
      EL0=-1D0
      OL=OL0
      EL=EL0
      C2=FAC*X
      DO 9 I=0,LMAX,2
      S(0,I)=S(0,I)+C2*(OL-EL)
      OL=(DFLOAT(I+1)*OL+SS*SS*(CC**(I+1)))/DFLOAT(I+3)
    9 EL= DFLOAT(I+1)*EL/DFLOAT(I+3)
      OL0=(2.D0*OL0-SS*SS*CC)/3.D0
      EL0= 2.D0*EL0/3.D0
      DO 5 M=2,LMAX,2
      OL=OL0
      EL=EL0
      C1=-FAC*COS(DFLOAT(M)*X)/DFLOAT(M)
      C2 =FAC*SIN(DFLOAT(M)*X)/DFLOAT(M)
      DO 6 I=0,LMAX-M,2
      S(-M,I)=S(-M,I)+C1*(OL-EL)
      S( M,I)=S( M,I)+C2*(OL-EL)
      OL=(DFLOAT(I+1)*OL+(SS**(M+2))*(CC**(I+1)))/DFLOAT(I+M+3)
    6 EL= DFLOAT(I+1)*EL/DFLOAT(I+M+3)
      OL0=(DFLOAT(M+2)*OL0-(SS**(M+2))*CC)/DFLOAT(M+3)
      EL0= DFLOAT(M+2)*EL0/DFLOAT(M+3)
    5 CONTINUE
      OL0=-CC*CC/2D0
      EL0=-0.5D0
      OL=OL0
      EL=EL0
      C2=FAC*X
      DO 10 I=1,LMAX,2
      S(0,I)=S(0,I)+C2*(OL-EL)
      OL=(DFLOAT(I+1)*OL+SS*SS*(CC**(I+1)))/DFLOAT(I+3)
   10 EL= DFLOAT(I+1)*EL/DFLOAT(I+3)
      OL0=(2.D0*OL0-SS*SS*CC*CC)/4.D0
      EL0= 2.D0*EL0/4.D0
      DO 7 M=2,LMAX,2
      OL=OL0
      EL=EL0
      C1=-FAC*COS(DFLOAT(M)*X)/DFLOAT(M)
      C2= FAC*SIN(DFLOAT(M)*X)/DFLOAT(M)
      DO 8 I=1,LMAX-M,2
      S(-M,I)=S(-M,I)+C1*(OL-EL)
      S( M,I)=S( M,I)+C2*(OL-EL)
      OL=(DFLOAT(I+1)*OL+(SS**(M+2))*(CC**(I+1)))/DFLOAT(I+M+3)
    8 EL= DFLOAT(I+1)*EL/DFLOAT(I+M+3)
      OL0=(DFLOAT(M+2)*OL0-(SS**(M+2))*CC*CC)/DFLOAT(M+4)
      EL0= DFLOAT(M+2)*EL0/DFLOAT(M+4)
    7 CONTINUE
      RETURN
      END

      SUBROUTINE REDUCE(NMBR,IFMX,IFI,IEXP)
      implicit none
!#@# KKRtags: VORONOI
!#@# KKRmerge: integer factorization is performed here
!-----------------------------------------------------------------------
!     THIS ROUTINE REDUCES A POSITIVE INTEGER   INPUT NUMBER 'NMBR'
!     TO A PRODUCT  OF  FIRST  NUMBERS 'IFI' , AT POWERS  'IEXP'.
!-----------------------------------------------------------------------
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   NMBR,IFMX
!
!     .. ARRAY  ARGUMENTS ..
!
      INTEGER   IEXP(1),IFI(1)
!
!     .. LOCAL SCALARS ..
!
      INTEGER   I,NMB
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC MOD
!-----------------------------------------------------------------------
      IF(NMBR.LE.0) GO TO 4
      DO 5 I=1,IFMX
    5 IEXP(I)=0
      IF(NMBR.EQ.1) RETURN
      NMB=NMBR
      DO 1 I=1,IFMX
      IEXP(I)=0
    2 IF(MOD(NMB,IFI(I)).NE.0) GO TO 3
      NMB=NMB/IFI(I)
      IEXP(I)=IEXP(I)+1
      GO TO 2
    3 CONTINUE
      IF(NMB.EQ.1) RETURN
    1 CONTINUE
      WRITE(6,100) NMBR
      STOP
    4 WRITE(6,101) NMBR
      STOP
  100 FORMAT(3X,I15,'  CANNOT BE REDUCED IN THE BASIS OF FIRST NUMBERS G&
     &IVEN'/20X,'INCREASE THE BASIS OF FIRST NUMBERS')
  101 FORMAT(3X,I15,'  NON POSITIVE NUMBER')
      END

      SUBROUTINE CCOEF(LMAX,CL,COE)
      implicit none
!#@# KKRtags: VORONOI special-functions
!-----------------------------------------------------------------------
!     THIS ROUTINE CALCULATES THE COEFFICIENTS OF A POLYNOMIAL EXPANSION
!     OF RENORMALIZED LEGENDRE FUNCTIONS IN POWERS OF COSINES.
!     THE POSSIBILITY OF OVERFLOW (HIGH LMAX) IS AVOIDED BY USING FACTO-
!     RIZED FORMS FOR THE NUMBERS.
!-----------------------------------------------------------------------
!
!     .. PARAMETER STATEMENTS ..
!
      include 'inc.geometry'
      INTEGER ICD,ICED,IFMX,LMA2D
      PARAMETER (ICD=3500,ICED=((LMAXD1+1)*(LMAXD1+2))/2)
      PARAMETER (IFMX=25,LMA2D=LMAXD1/2+1)
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   LMAX
!
!     .. ARRAY ARGUMENTS ..
!
      REAL*8    CL(ICD),COE(ICED)
!
!     .. LOCAL SCALARS ..
!
      INTEGER   ICMAX,L,LI,ICE,IC,I1,L2P,M,K,K0,ISI,IRE,IR,IC1,IC2
      INTEGER   LA,LB,IEUPSQ,IEINT,IEMOD
      REAL*8    UP,DOWN,UPSQ
!
!     .. LOCAL ARRAYS ..
!
      INTEGER   IE(IFMX,LMA2D),IED(IFMX),IFI(IFMX)
      INTEGER   L1ST(IFMX),L2ST(IFMX),L1(IFMX),L2(IFMX),JM0(IFMX)
      INTEGER   IEA(IFMX),IEB(IFMX),IL2P(IFMX)
      logical test
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC MOD,SQRT,DFLOAT
!
!     .. EXTERNAL ROUTINES ..
!
      EXTERNAL REDUCE,TEST
!
!     .. DATA STATEMENTS ..
!
      DATA IFI/2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,&
     &         61,67,71,73,79,83,89,97/
!-----------------------------------------------------------------------
      ICMAX=0
      DO 9 L=0,LMAX
      LI=L/2+1
    9 ICMAX=ICMAX+(LMAX+1-L)*LI
      IF(LMAX.GT.LMAXD1.OR.ICMAX.GT.ICD) GO TO 100
      IF (TEST('verb0   ')) WRITE(6,203) ICMAX
      ICE=0
      IC=1
      L=0
      DO 11 I1=1,IFMX
      L1ST(I1)=0
   11 L2ST(I1)=0
    1 CONTINUE
      L2P=2*L+1
      CALL REDUCE(L2P,IFMX,IFI,IL2P)
      IL2P(1)=IL2P(1)+1
      M=L
      DO 12 I1=1,IFMX
      L1(I1)=L1ST(I1)
      L2(I1)=L2ST(I1)
   12 JM0(I1)=0
    2 CONTINUE
      ICE=ICE+1
      ISI=1
!  THIS IS CHANGED
!     ISI=1-2*MOD(M,2)
!
      K0=(L+M+1)/2
      K=L
      IRE=1
      IC1=IC
      DO 13 I1=1,IFMX
   13 IE(I1,IRE)=JM0(I1)
    3 CONTINUE
      IF((K-1).LT.K0)  GO TO 30
      IRE=IRE+1
      IC=IC+1
      LA=(2*K-L-M)*(2*K-L-M-1)
      LB=2*(2*K-1)*(L-K+1)
      CALL REDUCE(LA,IFMX,IFI,IEA)
      CALL REDUCE(LB,IFMX,IFI,IEB)
      DO 14 I1=1,IFMX
   14 IE(I1,IRE)=IE(I1,IRE-1)+IEA(I1)-IEB(I1)
      K=K-1
      GO TO 3
   30 CONTINUE
      IC2=IC
      DO 4 I1=1,IFMX
      IED(I1)=IE(I1,1)
      DO 5 IR=2,IRE
      IF(IE(I1,IR).LT.IED(I1))  IED(I1)=IE(I1,IR)
    5 CONTINUE
      DO 6 IR=1,IRE
    6 IE(I1,IR)=IE(I1,IR)-IED(I1)
    4 CONTINUE
      IR=0
      DO 7 IC=IC1,IC2
      IR=IR+1
      CL(IC)=1.D0
      DO 8 I1=1,IFMX
    8 CL(IC)=CL(IC)*IFI(I1)**IE(I1,IR)
      CL(IC)=ISI*CL(IC)
      ISI=-ISI
    7 CONTINUE
      IF(M.EQ.0) IL2P(1)=IL2P(1)-1
      UP  =1.D0
      UPSQ=1.D0
      DOWN=1.D0
      DO 17 I1=1,IFMX
      IEUPSQ=2*IED(I1)+IL2P(I1)+L1(I1)
      IEINT =IEUPSQ/2-L2(I1)
      IEMOD =MOD(IEUPSQ,2)
      UPSQ =UPSQ*IFI(I1) **IEMOD
      IF(IEINT.GE.0)                   THEN
      UP   =UP  *IFI(I1) **IEINT
                                       ELSE
      DOWN =DOWN*IFI(I1) **(-IEINT)
                                       END    IF
   17 CONTINUE
      COE(ICE)=SQRT(UPSQ)* UP / DOWN
      IF (TEST('SHAPE   ')) &
     &      WRITE(6,201) L,M,UP,UPSQ,DOWN,(CL(IC),IC=IC1,IC2)
      IF(M.EQ.0)  GO TO 20
      LA=L+M
      LB=L-M+1
      CALL REDUCE(LA,IFMX,IFI,IEA)
      CALL REDUCE(LB,IFMX,IFI,IEB)
      DO 15 I1=1,IFMX
      JM0(I1)=JM0(I1)+IEA(I1)-IEB(I1)
   15 L1 (I1)=L1 (I1)-IEA(I1)+IEB(I1)
      M=M-1
      GO TO 2
   20 CONTINUE
      IF (TEST('SHAPE   ')) WRITE(6,202)
      IF(L.EQ.LMAX)   GO TO 10
      LA=(2*L+1)*(2*L+2)
      LB=(L+1)*2
      CALL REDUCE(LA,IFMX,IFI,IEA)
      CALL REDUCE(LB,IFMX,IFI,IEB)
      DO 16 I1=1,IFMX
      L1ST(I1)=L1ST(I1)+IEA(I1)
   16 L2ST(I1)=L2ST(I1)+IEB(I1)
      L=L+1
      GO TO 1
   10 CONTINUE
      RETURN
  100 WRITE(6,204) LMAX,LMAXD1,ICMAX,ICD
      STOP
  201 FORMAT(2X,'L=',I2,' M=',I2,F10.3,' *SQRT(',F16.2,')/',F10.3/&
     &       2X,'CL  :',6F14.2)
  202 FORMAT(80('*'))
  203 FORMAT(13X,'THERE ARE',I5,'  COEFFICIENTS'/)
  204 FORMAT(13X,'FROM CCOEF: INCONSISTENCY DATA-DIMENSION'/&
     &       14X,'LMAX:',2I5/13X,'ICMAX:',2I5)
      END

      SUBROUTINE DREAL(LMAX,ALPHA,BETA,GAMMA,ITEMP)
      implicit none
!#@# KKRtags: VORONOI special-functions
!------------------------------------------------------------------
!     THIS ROUTINE COMPUTES TRANSFORMATION MATRICES ASSOCIATED TO
!     THE ROTATION THROUGH THE EULER ANGLES ALPHA,BETA,GAMMA  FOR
!     REAL SPHERICAL HARMONICS UP TO QUANTUM NUMBER LMAX. THE RE-
!     SULTS ARE STORED IN THE TEMPORARY FILE IN UNIT ITEMP.
!------------------------------------------------------------------
!
!     .. PARAMETER STATEMENTS ..
!
      include 'inc.geometry'
!      INTEGER LMAXD,ISUMD
!     PARAMETER (LMAXD=25,ISUMD=23426)
!      PARAMETER (LMAXD=25,ISUMD=100000)
      INTEGER ISUMD
      PARAMETER (ISUMD=100000)
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   LMAX,ITEMP
      REAL*8    ALPHA,BETA,GAMMA
!
!     .. LOCAL SCALARS ..
!
      INTEGER   L,M,MP,I,IMAX,IP,IPMAX,ISU,ISUM
      REAL*8    SQR2,FAC,FAC1,FAC2,D,D1,D2
!
!     .. LOCAL ARRAYS ..
!
      REAL*8 DMN(LMAXD1+1,LMAXD1+1),DPL(LMAXD1+1,LMAXD1+1),DMATL(ISUMD)
!
!     .. EXTERNAL ROUTINES ..
!
      REAL*8 DROT
      EXTERNAL DROT
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC COS,SIN,MOD,SQRT
!-----------------------------------------------------------------------
      SQR2=SQRT(2.D0)
      ISU=0
      DO 2 L=0,LMAX
      FAC2=1.D0
      M=0
    1 FAC1=1.D0
      MP=0
    3 CONTINUE
      FAC=FAC1*FAC2/2.D0
      D1=DROT(L,MP ,M,BETA)
      D2=DROT(L,MP,-M,BETA)
      IF ( MOD( M , 2       ).ne. 0 )  D2 = - D2
      DPL(MP+1,M+1)=(D1+D2)*FAC
      DMN(MP+1,M+1)=(D1-D2)*FAC
      IF ( MOD ( M + MP , 2 ).ne. 0 )  GO  TO  4
      DPL(M+1,MP+1)=DPL(MP+1,M+1)
      DMN(M+1,MP+1)=DMN(MP+1,M+1)
                                             GO  TO  5
    4 DMN(M+1,MP+1)=-DMN(MP+1,M+1)
      DPL(M+1,MP+1)=-DPL(MP+1,M+1)
    5 CONTINUE
      FAC1=SQR2
      MP=1+MP
      IF (MP .LE. M) GO TO 3
      FAC2=SQR2
      M=1+M
      IF (M .LE. L) GO TO 1
      IMAX=1
      M=0
   12 CONTINUE
      DO 13 I=1,IMAX
      IPMAX=1
      MP=0
   11 CONTINUE
      DO 6 IP=1,IPMAX
      IF ( I  .eq.2 )                      GO  TO   7
      IF ( IP.eq.2 )                      GO  TO  10
      D= COS(MP*ALPHA)*COS(M*GAMMA)*DPL(MP+1,M+1)&
     &  -SIN(MP*ALPHA)*SIN(M*GAMMA)*DMN(MP+1,M+1)
                                                 GO  TO   9
    7 IF ( IP.eq.2 )                      GO  TO   8
      D=-COS(MP*ALPHA)*SIN(M*GAMMA)*DPL(MP+1,M+1)&
     &  -SIN(MP*ALPHA)*COS(M*GAMMA)*DMN(MP+1,M+1)
                                                 GO  TO   9
    8 D=-SIN(MP*ALPHA)*SIN(M*GAMMA)*DPL(MP+1,M+1)&
     &  +COS(MP*ALPHA)*COS(M*GAMMA)*DMN(MP+1,M+1)
                                                 GO  TO   9
   10 D= SIN(MP*ALPHA)*COS(M*GAMMA)*DPL(MP+1,M+1)&
     &  +COS(MP*ALPHA)*SIN(M*GAMMA)*DMN(MP+1,M+1)
    9 CONTINUE
! THIS IS CHANGED
      IF(MOD(M+MP,2).ne.0)  D=-D
!
      ISU=ISU+1
      DMATL(ISU)=D
    6 CONTINUE
      IPMAX=2
      MP=MP+1
      IF(MP.LE.L) GO TO 11
   13 CONTINUE
      IMAX=2
      M=M+1
      IF(M .LE.L) GO TO 12
    2 CONTINUE
      ISUM=ISU
      WRITE(ITEMP) (DMATL(ISU),ISU=1,ISUM)
      RETURN
      END
      FUNCTION DROT(L,MP,M,BETA)
      implicit none
!#@# KKRtags: VORONOI special-functions
!-----------------------------------------------------------------------
!     CALCULATION OF D COEFFICIENT ACCORDING TO ROSE, ELEMENTARY THEORY
!     ANGULAR MOMENTUM,J.WILEY & SONS ,1957 , EQ. (4.13).
!-----------------------------------------------------------------------
!
!     .. SCALAR ARGUMENTS ..
!
      INTEGER   L,M,MP
      REAL*8    BETA,DROT
!
!     .. LOCAL SCALARS ..
!
      INTEGER   L0,M0,MP0,N1,N2,N3,N4,NN,I,KMIN,KMAX,LTRM,N,K
      REAL*8    SINB,TERM,FF,BETA2,COSB
!
!     .. LOCAL ARRAYS ..
!
      INTEGER        NF(4)
      EQUIVALENCE (N1,NF(1)),(N2,NF(2)),(N3,NF(3)),(N4,NF(4))
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC IABS,ABS,SQRT,COS,SIN,MOD,MIN0,MAX0
!-----------------------------------------------------------------------
      DATA L0,M0,MP0/-1,1,1/
         L0=-1
         M0=1
         MP0=1
   10 IF(L.NE.L0) GO TO 2
                           WRITE(6,300) L0,M0,MP0
  300                      FORMAT(3X,'L0,M0,MP0=',3I3)
      IF((IABS(M ).EQ.IABS(M0).AND.IABS(MP).EQ.IABS(MP0)).OR.&
     &   (IABS(MP).EQ.IABS(M0).AND.IABS(M ).EQ.IABS(MP0))) GO TO 1
    2 FF=1.D0
      IF(IABS(M).LE.L.AND.IABS(MP).LE.L) GO TO 3
      WRITE(6,100) L,M,MP
  100 FORMAT('     L=',I5,'    M=',I5,'    MP =',I5)
      RETURN
    3 N1   =L+M
      N2   =L-M
      N3   =L+MP
      N4   =L-MP
      L0=L
      M0=M
      MP0=MP
      DO 4 N=1,4
      NN=NF(N)
      IF(NN.EQ.0) GO TO 4
      DO 5 I=1,NN
    5 FF=FF*I
    4 CONTINUE
      FF=SQRT(FF)
    1 BETA2=BETA/2.D0
      COSB= COS(BETA2)
      SINB=-SIN(BETA2)
      IF(ABS(COSB).LT.1.E-4) GO TO 9
      IF(ABS(SINB).LT.1.E-4) GO TO 11
      KMAX=MIN0(L-MP,L+M)
      KMIN=MAX0(M-MP,0)
      TERM=COSB**(2*L+M-MP-2*KMIN)*SINB**(MP-M+2*KMIN)*FF
      GO TO 12
    9 LTRM=L
      TERM=FF
      IF(SINB.LT.0.D0.AND.MOD(MP-M,2).NE.0) TERM=-TERM
      GO TO 14
   11 LTRM=0
      TERM=FF
      IF(COSB.LT.0.D0.AND.MOD(MP-M,2).NE.0) TERM=-TERM
   14 KMAX=M-MP
      IF(MOD(KMAX,2).NE.0) GO TO 13
      KMAX=LTRM+KMAX/2
      IF(KMAX.LT.MAX0(M-MP,0)) GO TO 13
      IF(KMAX.GT.MIN0(L-MP,L+M)) GO TO 13
      KMIN=KMAX
   12 IF(MOD(KMIN,2).NE.0) TERM=-TERM
      N1   =L-MP-KMIN
      N2   =L+M-KMIN
      N3   =KMIN+MP-M
      N4   =KMIN
      DO 6 N=1,4
      NN=NF(N)
      IF(NN.EQ.0) GO TO 6
      DO 7 I=1,NN
    7 TERM=TERM/I
    6 CONTINUE
      DROT=TERM
      IF(KMIN.EQ.KMAX) RETURN
      KMIN=KMIN+1
      COSB=COSB**2
      SINB=SINB**2
      N3=N3   +1
      DO 8 K=KMIN,KMAX
      TERM=-N1*N2*TERM*SINB/(COSB*K*N3)
      DROT=DROT+TERM
      N1=N1-1
      N2=N2-1
    8 N3=N3+1
      RETURN
   13 DROT=0.D0
      RETURN
      END

      SUBROUTINE INTSIM(FD,RATIO,X1,X2,DLT,XEL)
!#@# KKRtags: VORONOI undefined
      implicit none
      REAL*8 FD,RATIO,X1,X2,DLT
      REAL*8 H,X
      INTEGER   I,INC,INB,N,K
      REAL*8 FFF
      EXTERNAL FFF
      REAL*8 XEL(5)
      INTRINSIC DFLOAT

      DO 1 I=1,5
    1 XEL(I)=0.D0
      N=(X2-X1)/DLT + 1
      INC=2*N
      INB=INC-1
      H=(X2-X1)/DFLOAT(INC)
      DO 2 K=1,INB,2
      X=DFLOAT(K)*H+X1
      DO 12 I=1,5
   12 XEL(I)=XEL(I)+4.D0*FFF(I,X,FD,RATIO)
    2 CONTINUE
      DO 3 K=2,INB,2
      X=DFLOAT(K)*H+X1
      DO 13 I=1,5
   13 XEL(I)=XEL(I)+2.D0*FFF(I,X,FD,RATIO)
    3 CONTINUE
      DO 14 I=1,5
   14 XEL(I)=XEL(I)+FFF(I,X1,FD,RATIO)+FFF(I,X2,FD,RATIO)
      DO 15 I=1,5
   15 XEL(I)=H*XEL(I)/3.D0
      RETURN
      END

      REAL*8 FUNCTION FFF(I,X,FD,RATIO)
!#@# KKRtags: VORONOI undefined
      implicit none
      REAL*8 X,FD,RATIO
      REAL*8 AEXP,A1,A2,A,C1,C2,C,B1,B
      INTEGER   I
      INTRINSIC SIN,COS,SQRT

      AEXP=3.D0/2.D0
      A1=RATIO*COS(X-FD)*(1.D0-RATIO*RATIO)
      A2=(1.D0-RATIO*RATIO*SIN(X-FD)*SIN(X-FD))**AEXP
      A=A1/A2
      C1=RATIO*COS(X-FD)
      C2=RATIO*RATIO*(1+2.D0*SIN(X-FD)*SIN(X-FD))-3.D0
      C=2.D0+C1*C2/A2
      B1=(1.D0-RATIO*RATIO)**AEXP
      B=B1/A2
      IF(I.EQ.1) FFF=SQRT(15.D0     )*SIN(2.D0*X)*C/6.D0
      IF(I.EQ.2) FFF=-SQRT(5.D0/3.D0)*SIN(     X)*B
      IF(I.EQ.3) FFF=SQRT( 5.D0     )            *A/2.D0
      IF(I.EQ.4) FFF=-SQRT(5.D0/3.D0)*COS(     X)*B
      IF(I.EQ.5) FFF=SQRT(15.D0     )*COS(2.D0*X)*C/6.D0
      RETURN
      END

      SUBROUTINE MESH0(CRT,NM,NPAN,NAPROX,NMIN)
      IMPLICIT NONE
!#@# KKRtags: VORONOI radial-grid initialization
! ***********************************************************
! *  THIS SUBROUTINE CALCULATES AN APPROPRIATE MESH FOR
! *  THE SHAPE FUNCTIONS. MORE THAN NMIN POINTS BETWEEN TWO
! *  CRITICAL POINTS
! *  In case of more dense mesh increase NMIN 
! *
! ***********************************************************
!      INTEGER NPAND,MESHND
!      PARAMETER (NPAND=80,MESHND=1000)
       include 'inc.geometry'
       INTEGER MESHND
       PARAMETER (MESHND=IRID)
!
!
      REAL*8 CRT(NPAND)
      REAL*8 DIST,D1
      INTEGER   NM(NPAND)
      INTEGER   NAPROX,NPAN,NMIN,N,NTOT,I,NT,NA
      INTRINSIC DFLOAT
!     DATA NMIN/3/  ! 7
      IF ((NPAN-1)*NMIN.GE.NAPROX) THEN
      WRITE(6,*) NPAN,NMIN,NAPROX
      STOP ' INCREASE NUMBER OF POINTS'
      END IF
      DIST=ABS(CRT(1)-CRT(NPAN))
      DO 1 I=1,NPAN-1
      D1=ABS(CRT(I)-CRT(I+1))
      NM(I)=NAPROX*D1/DIST
      IF (NM(I).LT.NMIN) THEN
      NM(I)=NMIN
      END IF
    1 CONTINUE
      N = NMIN*(NPAN-1)
      N = NAPROX -N
      IF (N.LE.0) THEN
         WRITE(*,*) NAPROX,NMIN*(NPAN-1),N
         STOP '*** INCREASE NUMBER OF MESH POINTS ***'
      ENDIF
      D1=DFLOAT(N)/DFLOAT(NAPROX)
      NTOT=N
      DO 3 I=1,NPAN-1
      NA = NINT(D1*FLOAT(NM(I)))
      IF (NM(I).GT.NMIN.AND.(NTOT-NA).GT.0) THEN
      NM(I)=NMIN+NA
      NTOT=NTOT-NA
      END IF
  3   CONTINUE
      NM(1) = NM(1) + NTOT 
      RETURN
      END
!=====================================================================

      SUBROUTINE POLCHK(NFACE,NVERTICES,XVERT,YVERT,ZVERT,TOLVDIST)
      IMPLICIT NONE
!#@# KKRtags: VORONOI unit-test sanity-check
!     ----------------------------------------------------------------
!     THIS SUBROUTINE READS THE COORDINATES OF THE VERTICES OF EACH
!     (POLYGON)  FACE OF  A CONVEX POLYHEDRON AND  CHECKS  IF THESE 
!     VERTICES ARRANGED  CONSECUTIVELY DEFINE A  POLYGON. THEN  THE 
!     SUBROUTINE  DETERMINES  THE  VERTICES  AND  THE  EDGES OF THE 
!     POLYHEDRON AND CHECKS IF  THE  NUMBER  OF  VERTICES  PLUS THE  
!     NUMBER OF FACES EQUALS THE NUMBER OF EDGES PLUS 2.
!
!     DATA ARE READ FROM FILE IN UNIT 7, WHICH WE FINALLY REWIND
!     ----------------------------------------------------------------
!
!     .. PARAMETER STATEMENTS ..
!
      include 'inc.geometry'

      INTEGER NVRTD,NEDGED
      PARAMETER (NVRTD=500,NEDGED=NVRTD+NFACED-2)
!
!     ...Arrays ......
!
      INTEGER   NVERTICES(NFACED)
      REAL*8    XVERT(NVERTD,NFACED),YVERT(NVERTD,NFACED),&
     &          ZVERT(NVERTD,NFACED)
!     ...Scalars....
      REAL*8 TOLVDIST
!
!     .. LOCAL SCALARS ..
!
      INTEGER   IVERT,INEW,IVERTP,IVERTM,IVRT,IEDGE,NVRT,NEDGE
      INTEGER   IFACE,NFACE,NVERT,I
      REAL*8    ARG,A1,A2,DOWN,UP,FISUM,T
      REAL*8    VRTX,VRTY,VRTZ,VRTPX,VRTPY,VRTPZ,VRTMX,VRTMY,VRTMZ
      REAL*8    PI314
!
!     .. LOCAL ARRAYS ..
!
      REAL*8    V1(3,NEDGED),V2(3,NEDGED),V(3,NVERTD),VRT(3,NVRTD)
!
!     .. INTRINSIC FUNCTIONS ..
!
      INTRINSIC ABS,ACOS,SIGN,SQRT
!     ----------------------------------------------------------------
!$      READ(7,100) NFACE,LDUM,KDUM,DDUM
      PI314 = 4.D0*DATAN(1.D0)

      NVRT=0
      NEDGE=0
      DO 10 IFACE=1,NFACE
!$      READ(7,101) DUM1,DUM2,DUM3,DUM4,NVERT
      NVERT = NVERTICES(IFACE)
      FISUM=(NVERT-2)*PI314
      !write(6,*) 'starting ',fisum
      DO 25 IVERT=1,NVERT
!$      READ(7,102) (V(I,IVERT),I=1,3)
        V(1,IVERT) = XVERT(IVERT,IFACE)
        V(2,IVERT) = YVERT(IVERT,IFACE)
        V(3,IVERT) = ZVERT(IVERT,IFACE)
   25 CONTINUE
!
!------> T R E A T M E N T   O F   V E R T I C E S
!
      DO 2 IVERT =1,NVERT
      VRTX=V(1,IVERT)
      VRTY=V(2,IVERT)
      VRTZ=V(3,IVERT)
      INEW=1                          ! Save all different vertices
      DO IVRT=1,NVRT
        T=(VRTX-VRT(1,IVRT))**2+(VRTY-VRT(2,IVRT))**2&
     &   +(VRTZ-VRT(3,IVRT))**2
        IF(T.LT.TOLVDIST) INEW=0
      END DO
   

      IF(INEW.EQ.1) THEN
        NVRT=NVRT+1
        IF(NVRT.GT.NVRTD) STOP 'INCREASE NVRTD'
        VRT(1,NVRT)=V(1,IVERT)
        VRT(2,NVRT)=V(2,IVERT)
        VRT(3,NVRT)=V(3,IVERT)
      END IF

      IVERTP=IVERT+1                  
      IF(IVERT.EQ.NVERT) IVERTP=1
      VRTPX=V(1,IVERTP)
      VRTPY=V(2,IVERTP)
      VRTPZ=V(3,IVERTP)

      IVERTM=IVERT-1
      IF(IVERT.EQ.1) IVERTM=NVERT
      VRTMX=V(1,IVERTM)
      VRTMY=V(2,IVERTM)               ! Check IF the  consecutive
      VRTMZ=V(3,IVERTM)               ! vertices define a polygon

      A1=SQRT((VRTPX-VRTX)**2+(VRTPY-VRTY)**2+(VRTPZ-VRTZ)**2)
      A2=SQRT((VRTMX-VRTX)**2+(VRTMY-VRTY)**2+(VRTMZ-VRTZ)**2)
      DOWN=A1*A2
      UP=(VRTPX-VRTX)*(VRTMX-VRTX)+(VRTPY-VRTY)*(VRTMY-VRTY)+&
     &   (VRTPZ-VRTZ)*(VRTMZ-VRTZ)
      ! write(6,*)
      ! write(6,*) VRTX,VRTY,VRTZ
      ! write(6,*) VRTMX,VRTMY,VRTMZ
      ! write(6,*) VRTPX,VRTPY,VRTPZ
      ! write(6,*) 'fisum ',ivert,a1,a2,up,arg,ACOS(ARG)
      IF(DOWN.GE.TOLVDIST) THEN
        ARG=UP/DOWN
        IF(ABS(ARG).GE.1.D0) ARG=SIGN(1.D0,ARG)
        FISUM=FISUM-ACOS(ARG)
      ELSE
        write(*,*) 'ivert:', IVERT, IVERTP, IVERTM, NVERT
        write(*,*) 'a1', VRTPX, VRTX, VRTPY, VRTY, VRTPZ, VRTZ
        write(*,*) 'diffs:', VRTPX-VRTX, VRTPY-VRTY, VRTPZ-VRTZ
        write(*,*) 'a2', VRTMX, VRTX, VRTMY, VRTY, VRTMZ, VRTZ
        write(*,*) 'diffs:', VRTMX-VRTX, VRTMY-VRTY, VRTMZ-VRTZ
        write(*,*) DOWN, TOLVDIST
        stop 'IDENTICAL CONSECUTIVE VERTICES'
      END IF
!
!------> T R E A T M E N T   O F   E D G E S 
!
      INEW=1                          ! Save all different edges
      DO 14 IEDGE=1,NEDGE
      T=(VRTX-V1(1,IEDGE))**2+(VRTY-V1(2,IEDGE))**2 &
     & +(VRTZ-V1(3,IEDGE))**2
      IF(T.LT.TOLVDIST)         THEN
      T=(VRTPX-V2(1,IEDGE))**2+(VRTPY-V2(2,IEDGE))**2 &
     & +(VRTPZ-V2(3,IEDGE))**2
      IF(T.LT.TOLVDIST) INEW=0
                             ELSE
      T=(VRTX-V2(1,IEDGE))**2+(VRTY-V2(2,IEDGE))**2 &
     & +(VRTZ-V2(3,IEDGE))**2
      IF(T.LT.TOLVDIST) THEN
      T=(VRTPX-V1(1,IEDGE))**2+(VRTPY-V1(2,IEDGE))**2 &
     & +(VRTPZ-V1(3,IEDGE))**2
      IF(T.LT.TOLVDIST) INEW=0
                     END IF
                             END IF
   14 CONTINUE
      IF(INEW.EQ.1)                THEN
      NEDGE=NEDGE+1
      IF(NEDGE.GT.NEDGED) STOP 'INSUFFICIENT NEDGED'
      V1(1,NEDGE)=V(1,IVERT )
      V1(2,NEDGE)=V(2,IVERT )
      V1(3,NEDGE)=V(3,IVERT )
      V2(1,NEDGE)=V(1,IVERTP)
      V2(2,NEDGE)=V(2,IVERTP)
      V2(3,NEDGE)=V(3,IVERTP)
                                   END   IF
    2 CONTINUE
      IF(FISUM.GT.1.D-6) THEN
      write(6,*) 'fisum =',fisum
      STOP 'NOT CONSECUTIVE VERTICES OF A POLYGON'
      END IF
   10 CONTINUE
      IF((NVRT+NFACE).NE.(NEDGE+2)) THEN
       WRITE(6,*) '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'
       WRITE(6,*) '            WARNING FROM SHAPE      '
!      WRITE(6,*) '   >>  STOP ILLEGAL POLYHEDRON      '
       WRITE(6,*) 'NVRT=',NVRT,' ; NFACE=',NFACE,' ; NEDGE=',NEDGE
! changed 6.10.2000
!       IF((NVRT+NFACE).NE.(NEDGE+2)) STOP 'ILLEGAL POLYHEDRON'
      END IF 
      REWIND 7 
      RETURN
  100 FORMAT(3I5,F10.5)
  101 FORMAT(4F16.8,2I5)
  102 FORMAT(4F16.8)
      END