C -*- Fortran -*-
C  DELCD DEBUG
C..DELCP PROJECTION FOR INDIVI
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C ORTHO - programs for ab-initio calculations in localized orbitals
C Copyright (C) 2008 Peter Reinhardt (Univ. Paris VI, France)
C
C This program is free software: you can redistribute it and/or modify
C     it under the terms of the GNU General Public License as published by
C     the Free Software Foundation, either version 3 of the License, or
C     (at your option) any later version.
C
C     This program is distributed in the hope that it will be useful,
C     but WITHOUT ANY WARRANTY; without even the implied warranty of
C     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
C     GNU General Public License for more details.
C
C     You should have received a copy of the GNU General Public License
C     along with this program.  If not, see .
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C  DELCI inverse SMILES ordering
C
C..FILE 'flow.h'
C..FILE 'common_syst.h'
C..FILE 'common_intu.h'
C
C..FILE 'common_boys.h'
C
C..FILE 'common_extreme.h'
C
C..FILE 'common_vect.h'
C
C..FILE 'common_mezey.h'
C
      PROGRAM LPMB
C
C one single molecule
C
C a posteriori localization: Boys, Pipek-Mezey, extreme
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C P.Reinhardt, 4/2003
C        statistical analysis: 6/2004
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      INCLUDE 'param.h'                                                 
C
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
      PARAMETER (NSECTM=30)                                             
      COMMON /MEZEY/ ISTRT(NATMX),NABAS(NATMX),NGRP,NUMGRP(NBASM)       
     $     ,ISTGR(NBASM),IFIGR(NBASM),IOTYP(NBASM),IATYP(4,NBASM)       
     $     ,IFRAGM(NATMX),ISMILE(NBASM)                                 
C..   INCLUDE 'common_mezey.h'                                          
      COMMON /CBOYS/ DIPOL(NBASM,NBASM,3)                               
C..   INCLUDE 'common_boys.h'                                           
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
C
      CHARACTER*8 PNAME
      CHARACTER*1 BBBB
      CHARACTER*4 COTYP(5)
      DIMENSION ISRTI(NBASM),CIN(NBASM,NBASM)
      LOGICAL LFOUND
      PNAME='L P M B '
      INCLUDE 'compiler_stamp'                                          
      WRITE(6,*) '$Id: lpmb.r,v 1.34 2008/04/29 09:10:30 reinh Exp $'
      X=CPTIME(3)
      CALL DATING(PNAME,1)
C
      DATA COTYP /'Atom','Bond','Tric','Quad','Dloc'/
 
      EPS=1.D-14
      EPSE=1.D-11
      NITMAX=50
C
      WRITE(6,*)
      WRITE(6,*) ' L P M B - Version for molecules'
      WRITE(6,*) '   a posteriori localization '
      WRITE(6,*)
      WRITE(6,*)
      WRITE(6,*) ' P.Reinhardt, Paris 4/2003 '
      WRITE(6,*)
      WRITE(6,*)
      WRITE(6,*)
C
C read flow options from File INPUT.LPB
C
      CALL RDINP
C
C print result of options scan
C
C the a posteriori (de-)localization options
C
      IF (LCAN) THEN
       WRITE(6,*)
       WRITE(6,*) ' WE WILL PRODUCE CANONICAL ORBITALS '
       WRITE(6,*)
      ELSE
       IF (LPIPM) THEN
       WRITE(6,*)
        WRITE(6,*) ' WE WILL PRODUCE PIPEK-MEZEY LOCALIZED ORBITALS '
        WRITE(6,*)
       ELSE
        IF (LBOYS) THEN
         WRITE(6,*)
         WRITE(6,*) ' WE WILL PRODUCE BOYS LOCALIZED ORBITALS '
         WRITE(6,*)
         IF (LEXTR) THEN
          WRITE(6,*)
          WRITE(6,*) ' WE WILL PRODUCE NONORTHOGONAL, '
     $         ,'EXTREMELY LOCALIZED ORBITALS '
          WRITE(6,*)
         ELSE
          WRITE(6,*) ' NOTHING SPECIFIED: please choose either '
          WRITE(6,*) ' CANONICAL, BOYS or PIPEKMEZEY in INPUT.LPB'
          WRITE(6,*)
         END IF
        END IF
       END IF
      END IF
C
      IF (LFRAGM) THEN
       WRITE(6,*) ' FRAGMENTS defined '
      ELSE
       WRITE(6,*) ' explicit definition of orbital groups '
      END IF
C
      IF (LSTAT) THEN
       WRITE(6,*) ' Statitical analysis demanded '
      ELSE
       WRITE(6,*) ' no statistical analysis requested '
      END IF
 
      IF (L6D) THEN
       WRITE(6,*)
     $      ' Orbitals will be projected onto cartesian functions '
      END IF
C
      IF (LSMILE) THEN
       WRITE(6,*)
C--SKIPCI
       WRITE(6,*) ' reordering orbital coefficients from SMILES code to 
     $'
C folded 1 (fixf $Revision: 1.3 $) 
       WRITE(6,*) ' the Dalton ordering (py,pz,px) -> (px,py,pz)'
C//ENDCI
CI     WRITE(6,*) ' reordering orbital coefficients from DALTON code to '
CI     WRITE(6,*) ' the SMILES ordering (px,py,pz) -> (py,pz,px)'
       WRITE(6,*)
      END IF
C
C read information on system
C
      IUNITR=23
      OPEN(UNIT=IUNITR,FILE='SYSTEM.ORTHO',STATUS='OLD',
     -     FORM='FORMATTED',ERR=901)
      READ(IUNITR,*) NATOM
      WRITE(6,*)
C
C MOLCAS, DALTON: first all s, then all p, then all d ...
C so read (sort has been done by GENINPUT) given basis set
C
C well, we have to recalculate the nuclear repulsion of the molecule
C
C we read the basis correctly, once and for all
C
      NBAS=1
      LMAX=0
      NSHL=0
      IPRIM=0
      DO IAT=1,NATOM
       READ(IUNITR,*) NZ(IAT),NSH(IAT),(POS(J,IAT),J=1,3)
       DO ISH=1,NSH(IAT)
        NSHL=NSHL+1
        READ(IUNITR,*) ITYPE,NPRIM(NSHL)
        IL(NSHL)=ITYPE
        LMAX=MAX(LMAX,ITYPE+1)
        DO III=1,ITYPE+ITYPE+1
C store the atomic centers of the basis functions (needed for Pipek
c -Mezey)
         IATZ(NBAS)=IAT
         IF (ITYPE.EQ.1) THEN
          IF (III.EQ.1) THEN
 
C py: 1->2
CI         ISMILE(NBAS+1)=NBAS
C pz: 2->3
CI         ISMILE(NBAS+2)=NBAS+1
C px: 3->1
CI         ISMILE(NBAS)  =NBAS+2
C just the other way round
C py: 2->1
C--SKIPCI
           ISMILE(NBAS)    = NBAS+1
C pz: 3->2
           ISMILE(NBAS+1)  = NBAS+2
C px: 1->3
           ISMILE(NBAS+2)  = NBAS
C//ENDCI
          END IF
         ELSE
          ISMILE(NBAS)=NBAS
         END IF
         IF (ITYPE.EQ.3) THEN
          IF (III.EQ.4.OR.III.EQ.7) THEN
C f0 and f+2 get a sign -1
           ISMILE(NBAS)=-NBAS
          END IF
         END IF
         WRITE(6,*) ' NBAS, ITYPE = ',NBAS,ITYPE
         NBAS=NBAS+1
        END DO
        DO III=1,NPRIM(NSHL)
         IPRIM=IPRIM+1
         READ(IUNITR,*) EXX(IPRIM),COEFF(IPRIM)
        END DO
       END DO
      END DO
      NBAS=NBAS-1
      CLOSE(IUNITR)
C
C
      IF (LSMILE) THEN
       WRITE(6,*) ' the reordering of orbitals '
       DO I=1,NBAS
C--SKIPCI
        WRITE(6,*) ' DALTON ',I,' <- SMILES ',ISMILE(I)
C//ENDCI
CI      WRITE(6,*) ' DALTON ',I,' -> SMILES ',ISMILE(I)
       END DO
      END IF
C
C again for Pipek-Mezey two auxiliary arrays
C
      IAT=1
      NABAS(IAT)=0
      ISTRT(IAT)=1
      DO I=1,NBAS
       IF (IATZ(I).EQ.IAT) THEN
        NABAS(IAT)=NABAS(IAT)+1
       ELSE
        IAT=IAT+1
        ISTRT(IAT)=I
        NABAS(IAT)=1
       END IF
      END DO
      DO IAT=1,NATOM
       NABAS(IAT)=NABAS(IAT)-1
       WRITE(6,*)
     $      ' for Pipek-Mezey: ATOM, ISTRT, NABAS ',IAT, ISTRT(IAT),
     $      NABAS(IAT)
      END DO
C
      IF (NBAS.GT.NBASM) THEN
       WRITE(6,*) 'NBAS, MAXIMUM: ',NBAS,NBASM
       STOP 'INCREASE NBASM IN param.h AND RECOMPILE'
      END IF
C
      WRITE(6,*)
      WRITE(6,*) ' SYSTEM: (and compiled maximum  dimensions)'
      WRITE(6,*) '        NATOMS ',NATOM,'(',NATMX,')'
      WRITE(6,*) '        NBAS   ',NBAS  ,'(',NBASM,')'
      WRITE(6,*) '        LMAX   ',LMAX-1,' (',NLMAX-1,')'
      WRITE(6,*)
      WRITE(6,*)
      WRITE(6,*) ' NUMBER OF SHELLS:         ',NSHL
      WRITE(6,*) ' NUMBER OF PRIMITIVES:     ',IPRIM
      WRITE(6,*) ' NUMBER OF BASIS FUNCTIONS:',NBAS
      IF (LFRAGM) THEN
       WRITE(6,*)
       WRITE(6,*) ' attribution of fragments: '
       WRITE(6,'(6(I4,4H -> ,I3))') (IAT,IFRAGM(IAT),IAT=1,NATOM)
       WRITE(6,*)
      END IF
 
      WRITE(6,*) ' calculating nuclear repulsion '
C
      EN=0.D0
      DO IAT=1,NATOM
       XINUC=DBLE(NZ(IAT))
       DO JAT=IAT+1,NATOM
        RIJ=0.D0
        DO I=1,3
         RIJ=RIJ+(POS(I,IAT)-POS(I,JAT))*(POS(I,IAT)-POS(I,JAT))
        END DO
        EN=EN+XINUC*DBLE(NZ(JAT))/SQRT(RIJ)
       END DO
      END DO
C
      WRITE(6,9301) EN
 9301 FORMAT(//,' nuclear repulsion: ',F20.12,/)
C
C read overlap matrix
C
      CALL RDMAT('OVERLAP',SAO)
      WRITE(6,9902) (I,SAO(I,I),I=1,NBAS)
 9902 FORMAT(/,' THE DIAGONAL ELEMENTS OF THE AO OVERLAP MATRIX'
     -    ,/,50(4(I5,F10.3),/))
      WRITE(6,*)
      WRITE(6,*) ' READ OVERLAP MATRIX INTEGRALS '
C
C read vector
C
      IUNITO=31
      WRITE(6,*)
      WRITE(6,*) ' READING VECTOR FROM UNIT',IUNITO,' FILE: VECTOR'
      OPEN(UNIT=IUNITO,FILE='VECTOR',FORM='FORMATTED',STATUS='OLD',ERR
     $     =902)
      READ(IUNITO,*) ((CI(I,J),I=1,NBAS),J=1,NBAS)
      READ(IUNITO,*) (IOCC(I),I=1,NBAS)
      READ(IUNITO,*) (IOCCS(I),I=1,NBAS)
      CLOSE(IUNITO)
C
c$$$      IF (LSMILE) THEN
c$$$       DO IVEC=1,NBAS
c$$$        DO IALPH=1,NBAS
c$$$         IIPOS=ABS(ISMILE(IALPH))
c$$$         IISIG=SIGN(1,ISMILE(IALPH))
c$$$         IF (IVEC.EQ.1) WRITE(6,*) ' IIPOS, IISIG = ',IIPOS,IISIG
c$$$         CIN(IALPH,IVEC)=CI(IIPOS,IVEC)*DBLE(IISIG)
c$$$        END DO
c$$$       END DO
c$$$       DO I=1,NBAS
c$$$        DO J=1,NBAS
c$$$         CI(I,J)=CIN(I,J)
c$$$        END DO
c$$$       END DO
c$$$      END IF
 
      NOCC=0
      DO I=1,NBAS
       IF (IOCCS(I).EQ.IOCC(I)) NOCC=NOCC+1
      END DO
 
      NVIRT=NBAS-NOCC
      WRITE(6,*) '        NOCC   ',NOCC
      WRITE(6,*)
C     CALL SNORM(CI,NBAS,NBAS)
C
      WRITE(6,*)
      WRITE(6,*) ' checking orthonormality: '
C
C using CIN as dummy array
C
      DO IBETA=1,NBAS
       DO IALPH=1,NBAS
        CIN(IALPH,IBETA)=SAO(IALPH,IBETA)
       END DO
      END DO
      CALL TRANS(CIN,CI,NBAS,NBAS)
      OPEN(UNIT=57,FILE='OVERLAP.MO',STATUS='UNKNOWN',
     -   FORM='FORMATTED')
      WRITE(57,'(2I5,F20.12)') ((I,J,CIN(I,J),J=1,I),I=1,NBAS)
      CLOSE(57)
C
      SONMX=0.D0
      SOGMX=0.D0
      DO I=1,NBAS
       SSY=ABS(CIN(I,I)-1.D0)
       IF (SSY.GT.SONMX) SONMX=SSY
       DO J=I+1,NBAS
        SSX=ABS(CIN(I,J))
        IF (SSX.GT.SOGMX) SOGMX=SSX
       END DO
      END DO
C
      WRITE(6,*) ' largest difference to 1 on the diagonal: ',SONMX
      WRITE(6,*) ' largest off-diagonal of S: ',SOGMX
      WRITE(6,*)
C
      XELEC=0.D0
      DO IALPH=1,NBAS
       DO IBETA=1,NBAS
        SUM=0.D0
        DO I=1,NOCC
         SUM=SUM+CI(IALPH,I)*CI(IBETA,I)
        END DO
        XELEC=XELEC+SAO(IALPH,IBETA)*SUM
       END DO
      END DO
      WRITE(6,*)
      WRITE(6,*) ' total number of electrons: ',2.D0*XELEC
      WRITE(6,*)
 
C dumping the vector in the right order on a file VECTOR.SMILE for
C transferring it to a starting vector of a Dalton calculation
C
C this is not necessary if we rest inside the Slater calculation
C
      IF (LSMILE) THEN
C dump the vector somewhere
       WRITE(6,*)
       WRITE(6,*) ' WRITING VECTOR TO  '
       WRITE(6,*)
       IUNITX=25
       OPEN(UNIT=IUNITX,FILE='VECTOR.SMILE',FORM='FORMATTED',STATUS
     $      ='UNKNOWN')
       DO J=1,NBAS
        WRITE(IUNITX,'(4E20.12)') (DBLE(SIGN(1,ISMILE(K)))
     $       *CI(ABS(ISMILE(K)),J),K=1,NBAS)
        WRITE(IUNITX,*)
       END DO
       WRITE(IUNITX,'(30I2)') (IOCC (I),I=1,NBAS)
       WRITE(IUNITX,'(30I2)') (IOCCS(I),I=1,NBAS)
       CLOSE(IUNITX)
      END IF
 
C
C read Fock matrix
C
      IUNITF=23
      OPEN(UNIT=IUNITF,FILE='FOCK',FORM='FORMATTED',STATUS='OLD',ERR
     $     =904)
      READ(IUNITF,*) IDUM1
      WRITE(6,*) ' READING FOCK MATRIX FROM UNIT',IUNITF
      WRITE(6,*)
      READ(IUNITF,*) ((FAO(I,J),I=1,NBAS),J=1,NBAS)
      READ(IUNITF,*) EDUM,EN,E1,E2
      CLOSE(IUNITF)
      go to 905
 904  continue
      write(6,*)
     $     ' no Fock matrix found, continuing without energy analysis'
      DO I=1,NBAS
       DO J=1,NBAS
        FAO(I,J)=0.D0
       END DO
      END DO
      EN=0.d0
      E1=0.d0
      E2=0.d0
 905  continue
 
      WRITE(6,*) '        E0 E1 E2 ',EN,E1,E2
      WRITE(6,*)
      WRITE(6,*) '        total energy:      ',EN+E1+E2
      WRITE(6,*)
      CALL PFUNC(CI,NBAS,NBAS)
      WRITE(6,*)
      CALL TIMING('READ')
      WRITE(6,*)
C
C we may start to work
C
      DO I=1,NBAS
       DO J=1,NBAS
        FMO(I,J)=FAO(I,J)
       END DO
      END DO
C
C F in MOs
C
      CALL TRANS(FMO,CI,NBAS,NBAS)
      WRITE(6,*)
      WRITE(6,*) ' checking Brillouin''s theorem '
      FFY=0.D0
      DO I=1,NOCC
       DO J=NOCC+1,NBAS
        IF (ABS(FMO(I,J)).GT.FFY) FFY=ABS(FMO(I,J))
       END DO
      END DO
      WRITE(6,*) ' largest occ-virt. Fock-matrix element: ',FFY
      WRITE(6,*)
C
      WRITE(6,*)
C
C write out information on grouping
C
      DO I=1,NBAS
       ORBEN(I)=FMO(I,I)
      END DO
 
C sort orbitals after their energy
 
      CALL BUBBLE(NBAS,NBAS,ORBEN,FMO,CI)
C
C calulate spread of the orbitals
C
      CALL SPREAD(CI)
C
C if fragments are defined we have to attribute the orbitals now
C
      IF (LFRAGM) THEN
C
C how many fragments were defined?
C
       IFMX=0
       DO IAT=1,NATOM
        IF (IFRAGM(IAT).GT.IFMX) IFMX=IFRAGM(IAT)
       END DO
       NGRP=IFMX*2
       WRITE(6,*) ' No of fragments: ',IFMX
       DO IORB=1,NBAS
        IF (IOTYP(IORB).EQ.1) THEN
         IF (IOCC(IORB).NE.0) THEN
          NUMGRP(IORB)=IFRAGM(IATYP(1,IORB))
         ELSE
          NUMGRP(IORB)=IFMX+IFRAGM(IATYP(1,IORB))
         END IF
        ELSE
C are multi-center orbitals on the same fragment?
         LFOUND=.TRUE.
         DO I1=1,IOTYP(IORB)-1
          IFT1=IFRAGM(IATYP(I1,IORB))
          DO I2=I1+1,IOTYP(IORB)
           IFT2=IFRAGM(IATYP(I2,IORB))
           IF (IFT2.NE.IFT1) LFOUND=.FALSE.
          END DO
         END DO
         IF (.NOT.LFOUND) THEN
          NGRP=NGRP+1
          NUMGRP(IORB)=NGRP
         ELSE
          IF (IOCC(IORB).NE.0) THEN
           NUMGRP(IORB)=IFRAGM(IATYP(1,IORB))
          ELSE
           NUMGRP(IORB)=IFMX+IFRAGM(IATYP(1,IORB))
          END IF
         END IF
        END IF
       END DO
      END IF
 
      WRITE(6,9400)
 9400 FORMAT(//,7X,'No',11X,'orb.-en.',14X,'occ.   group   type')
      DO I=1,NBAS
       IF (IOTYP(I).EQ.5) THEN
        WRITE(6,9401) I,ORBEN(I),IOCC(I),NUMGRP(I),COTYP(IOTYP(I))
       ELSE
        WRITE(6,9401) I,ORBEN(I),IOCC(I),NUMGRP(I),COTYP(IOTYP(I))
     $       ,(IATYP(J,I),J=1,IOTYP(I))
      END IF
      END DO
 9401 FORMAT(5x,I5,5x,F16.8,10X,2I5,5X,A4,5I3)
C
C we reorder for having the groups in ascending order, and within each
C group, we have the orbitals sorted by energy
C
      WRITE(6,*)
      CALL TIMING('PREP')
      WRITE(6,*)
 
      IF (NGRP.NE.0.OR.LEXTR) THEN
C
C will we mix occupied and virtuals?
C
       INDX=0
       DO IGRP=1,NGRP
CD      WRITE(6,*) ' GROUP No: ',IGRP
        ISTGR(IGRP)=INDX+1
        IF (IGRP.GE.2) IFIGR(IGRP-1)=INDX
        LFOUND=.FALSE.
        DO IORB=1,NBAS
         IF (NUMGRP(IORB).EQ.IGRP) THEN
          IF (LFOUND) THEN
           IF (IOCC(IORB).NE.IOCCC) WRITE(6,*) ' WARNING: mixing ',
     $          ' occupied and virtuals  !!'
          ELSE
           LFOUND=.TRUE.
           IOCCC=IOCC(IORB)
          END IF
          INDX=INDX+1
          ISRTI(INDX)=IORB
CD        WRITE(6,*) ' Orbital No ',IORB,' goes to place ',INDX
         END IF
        END DO
       END DO
       IFIGR(NGRP)=INDX
C
       DO IGRP=1,NGRP
        IF (ISTGR(IGRP).LE.IFIGR(IGRP)) THEN
         WRITE(6,*) ' Group No ',IGRP,' goes from ',ISTGR(IGRP),' to '
     $        ,IFIGR(IGRP)
        ELSE
         WRITE(6,*) ' No member in Group No ',IGRP
        END IF
       END DO
C
       DO IORB=1,NBAS
        IF (NUMGRP(IORB).EQ.0) THEN
         INDX=INDX+1
         ISRTI(INDX)=IORB
        END IF
       END DO
C
C we may reorder the orbitals now
       DO IORB=1,NBAS
        DO IALPH=1,NBAS
         CIN(IALPH,IORB)=CI(IALPH,ISRTI(IORB))
        END DO
       END DO
       DO IORB=1,NBAS
        DO IALPH=1,NBAS
         CI(IALPH,IORB)=CIN(IALPH,IORB)
        END DO
       END DO
C
C we have to reorder as well IOCC and IOTYP
C this is done in the same array, we add 10*new_value and divide later
C by 10
C
C for NUMGRP we do the same with a factor of 1000
C
       DO IORB=1,NBAS
        IOCC(IORB)= IOCC(IORB)+10*MOD(IOCC(ISRTI(IORB)),10)
        IOTYP(IORB)= IOTYP(IORB)+10*MOD(IOTYP(ISRTI(IORB)),10)
        NUMGRP(IORB)= NUMGRP(IORB)+1000*MOD(NUMGRP(ISRTI(IORB)),1000)
        DO J=1,4
         IATYP(J,IORB)=IATYP(J,IORB)+1000*MOD(IATYP(J,ISRTI(IORB)),1000)
        END DO
       END DO
       DO IORB=1,NBAS
        IOCC(IORB)= IOCC(IORB)/10
        IOTYP(IORB)= IOTYP(IORB)/10
        NUMGRP(IORB)= NUMGRP(IORB)/1000
        DO J=1,4
         IATYP(J,IORB)=IATYP(J,IORB)/1000
        END DO
       END DO
C
       DO IALPH=1,NBAS
        DO IBETA=1,NBAS
         FMO(IALPH,IBETA)=FAO(IALPH,IBETA)
        END DO
       END DO
       CALL TRANS(FMO,CI,NBAS,NBAS)
       DO I=1,NBAS
        ORBEN(I)=FMO(I,I)
       END DO
C rewrite the result of all the operations
       WRITE(6,9400)
       DO I=1,NBAS
        IF (IOTYP(I).NE.5) THEN
         WRITE(6,9401) I,ORBEN(I),IOCC(I),NUMGRP(I),COTYP(IOTYP(I))
     $        ,(IATYP(J,I),J=1,IOTYP(I))
        ELSE
         WRITE(6,9401) I,ORBEN(I),IOCC(I),NUMGRP(I),COTYP(IOTYP(I))
        END IF
       END DO
C
C and now we treat the groups by the defined method, LCAN, LPIPM or LBOYS
C
       IF (LCAN.OR.LPIPM.OR.LBOYS.OR.LEXTR) THEN
C//SKIPCP
cP      IF (LEXTR) THEN
cP       CALL EXTREM
cP       CALL TIMING('EXTR')
cP      ELSE
cP/ENDCP
         DO IGRP=1,NGRP
          NORBG=IFIGR(IGRP)-ISTGR(IGRP)+1
CD        WRITE(6,*) ' NORBG = ',NORBG
          IF (NORBG.NE.0) THEN
           IF (LCAN) THEN
            CALL GENCAN(FAO,FMO,CI(1,ISTGR(IGRP)),ORBEN(ISTGR(IGRP))
     -           ,NORBG)
           ELSE
            IF (LPIPM) THEN
             CALL PIPEKM(CI(1,ISTGR(IGRP)),NORBG)
            ELSE
             IF (LBOYS) THEN
              CALL BOYS(CI(1,ISTGR(IGRP)),NORBG)
             ELSE
              IF (LEXTR) THEN
               CALL EXTRP(CI(1,ISTGR(IGRP)),NORBG)
              END IF
             END IF
            END IF
           END IF
          END IF
         END DO
C//SKIPCP
cP      END IF
cP/ENDCP
       ELSE
        WRITE(6,*) ' no method specified, storing '
     $       ,'orbitals in the obtained order'
       END IF
C
C write the vector after ordering with respect to IOCC
       CALL VSRTO(CI,IOCC,IOCCS)
C normalize the orbitals
       CALL SNORM(CI,NBAS,NBAS)
C
C//SKIPCP
cP     IF (.NOT.LEXTR) THEN
cP/ENDCP
 
        DO I=1,NBAS
         DO J=1,NBAS
          FMO(I,J)=FAO(I,J)
         END DO
        END DO
        CALL TRANS(FMO,CI,NBAS,NBAS)
        DO I=1,NBAS
         ORBEN(I)=FMO(I,I)
        END DO
        CALL BUBBLE(NBAS,NBAS,ORBEN,FMO,CI)
        WRITE(6,*) ' new diagonal elements of F: '
        WRITE(6,'(6(I5,F12.6))') (I,ORBEN(I),I=1,NBAS)
C
        SOCC=0.D0
        DO I=1,NOCC
         SOCC=SOCC+ORBEN(I)
        END DO
        SVIRT=0.D0
        DO I=1+NOCC,NBAS
         SVIRT=SVIRT+ORBEN(I)
        END DO
        WRITE(6,*)
        WRITE(6,*) ' sum of orbital energies: occupied ',SOCC
        WRITE(6,*) '                          virtuals ',SVIRT
        WRITE(6,*)
C//SKIPCP
cP     END IF
cP/ENDCP
C
C write vector
 
       IF (LCAN ) CALL WVEC('CANL')
       IF (LBOYS) CALL WVEC('BOYS')
       IF (LPIPM) CALL WVEC('PIPM')
       IF (LEXTR) CALL WVEC('EXTO')
C
      ELSE
       WRITE(6,*)
       WRITE(6,*) ' no groups defined, leaving orbitals unchanged'
       WRITE(6,*)
C
C get the dipole matrix elements
C
       call baryzcal(CI,NBAS,baryz)
C
C we evaluate the Boys measure:
       CALL BOYSME(NBAS,baryz)
C
      END IF
C
      IF (LSTAT) THEN
       IF (LCAN ) THEN
        CALL STATAN('CANL')
       ELSE
        IF (LBOYS) THEN
         CALL STATAN('BOYS')
        ELSE
         IF (LPIPM) THEN
          CALL STATAN('PIPM')
         ELSE
          IF (LEXTR) THEN
           CALL STATAN('EXTO')
          ELSE
           CALL STATAN('XXXX')
          END IF
         END IF
        END IF
       END IF
      END IF
 
      IF (L6D) THEN
       WRITE(6,*) ' projection of the occupied orbitals '
     $      ,'onto cartesian Gaussians '
       CALL PROJ6D
      END IF
 
      IF (LQMC.AND..NOT.LEXTR) CALL OUTQMC
 
      CALL SPREAD(CI)
C rewrite the result of all the operations
      WRITE(6,9400)
      DO I=1,NBAS
       IF (IOTYP(I).NE.5) THEN
        WRITE(6,9401) I,ORBEN(I),IOCC(I),NUMGRP(I),COTYP(IOTYP(I))
     $       ,(IATYP(J,I),J=1,IOTYP(I))
       ELSE
        WRITE(6,9401) I,ORBEN(I),IOCC(I),NUMGRP(I),COTYP(IOTYP(I))
       END IF
      END DO
      WRITE(6,*)
      WRITE(6,*)
C
      IF (LMOLD) THEN
       CALL FFCAL
       IF (LBOYS) THEN
        CALL MOLDEN('BOYS')
       ELSE IF (LPIPM) THEN
        CALL MOLDEN('PIPM')
       ELSE IF (LEXTR) THEN
        CALL MOLDEN('EXTO')
       ELSE
        CALL MOLDEN('CANL')
       END IF
      END IF
C
      X=CPTIME(4)
      CALL DATING(PNAME,2)
      STOP
 901  CONTINUE
      WRITE(6,*) ' NO FILE  FOUND'
      STOP
 902  CONTINUE
      WRITE(6,*) ' NO FILE  FOUND'
      STOP
 6100 CONTINUE
      WRITE(6,*) ' NO FILE  as starting vector FOUND ... '
      STOP
 
      END
C
      SUBROUTINE ORTHO(CI,NOCC,NBAS)
      INCLUDE 'param.h'                                                 
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      DIMENSION CI(NBASM,NBASM)
C
      CALL SHALF(CI,NOCC,NBAS)
C
      CALL SFULL(CI,NOCC,NBAS)
C
      CALL SHALF(CI(1,NOCC+1),NBAS-NOCC,NBAS)
C
C     CALL PFUNC(CI,NBAS,NBAS)
      RETURN
      END
C
      SUBROUTINE SNORM(CI,NVECT,NBAS)
      INCLUDE 'param.h'                                                 
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      DIMENSION CI(NBASM,NVECT)
C
C  normalisation of vectors
C
      WRITE(6,*) ' norming the orbitals '
      DO I=1,NVECT
       SL=0.D0
       DO K=1,NBAS
        CNN=0.D0
        DO L=1,NBAS
         CNN=CNN+CI(L,I)*SAO(K,L)
        END DO
        SL=SL+CI(K,I)*CNN
       END DO
       SL=1.D0/SQRT(SL)
       DO J=1,NBAS
        CI(J,I)=CI(J,I)*SL
       END DO
C       WRITE(6,*) ' VECTOR: ',I,' NORM=',SL
      END DO
C
      RETURN
      END
C
      SUBROUTINE SHALF(CI,NOCC,NBAS)
      INCLUDE 'param.h'                                                 
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      DIMENSION SMOTR(NBASM*(NBASM+1)/2)
      DIMENSION CWRK(NBASM,NBASM),EW(NBASM),C3(NBASM),C4(NBASM)
      DIMENSION CWRK2(NBASM,NBASM)
      DIMENSION CI(NBASM,*)
C
      DO I=1,NBAS
       DO J=1,NBAS
        CWRK(I,J)=SAO(I,J)
       END DO
      END DO
 
      CALL TRANS(CWRK,CI,NOCC,NBAS)
 
      INDX=1
      DO I=1,NOCC
       DO J=1,I
        SMOTR(INDX)=CWRK(I,J)
        INDX=INDX+1
       END DO
      END DO
C
C     diagonalisation of SMOTR
C
      NM=NBASM
      NS=NOCC
      NV=NOCC*(NOCC+1)/2
      CALL RSP(NBASM,NOCC,NV,SMOTR,EW,1,CWRK,C3,C4,IERR)
      WRITE(6,*)
      WRITE(6,*) ' SHALF: SMALLEST EIGENVALUE',EW(1)
      WRITE(6,*)
 
C     DO I=1,NOCC
C      WRITE(6,*) ' EIGENWERT ',I,EW(I)
C      WRITE(6,'(4(I4,F12.6))') (J,CWRK(J,I),J=1,NBAS)
C     END DO
C
      IF (EW(1).LT.EPS) THEN
       WRITE(6,*) ' WE HAVE EPS = ' ,EPS,' AND EW(1) = ',EW(1)
       STOP 'SHALF: LIN DEPENDENCIES'
      END IF
C
      DO I=1,NOCC
       DO J=1,NOCC
        CWRK2(I,J)=0.D0
       END DO
      END DO
      DO L=1,NOCC
       SSS=1.D0/SQRT(EW(L))
       DO J=1,NOCC
        DO I=1,NOCC
         CWRK2(I,J)=CWRK2(I,J)+SSS*CWRK(I,L)*CWRK(J,L)
        END DO
       END DO
      END DO
C
C     WRITE(6,'(2I4,F12.6)') ((I,J,CWRK2(I,J),I=1,NOCC),J=1,NOCC)
C
C the new functions
C
      DO I=1,NOCC
       DO K=1,NBAS
        CWRK(K,I)=CI(K,I)
        CI(K,I)=0.D0
       END DO
      END DO
      DO I=1,NOCC
       DO J=1,NOCC
        CIJK=CWRK2(I,J)
        DO K=1,NBAS
         CI(K,I)=CI(K,I)+CIJK*CWRK(K,J)
        END DO
       END DO
      END DO
C
C     CALL PFUNC(CI,NOCC,NBAS)
      RETURN
      END
C
      SUBROUTINE SFULL(CI,NOCC,NBAS)
      INCLUDE 'param.h'                                                 
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
      DIMENSION SMO(NBASM,NBASM),CIJK(NBASM)
      DIMENSION CI(NBASM,NBASM)
      NVIRT=NBAS-NOCC
      DO I=1,NBAS
       DO J=1,NBAS
        SMO(I,J)=SAO(I,J)
       END DO
      END DO
      CALL TRANS(SMO,CI,NBAS,NBAS)
C
C the corrected functions
C
      ITER=0
      NOV=NOCC+1
 100  CONTINUE
      DO I=NOV,NBAS
       DO J=1,NOCC
        CIJK(J)=SMO(I,J)
       END DO
       DO K=1,NBAS
        CCC=0.D0
        DO J=1,NOCC
         CCC=CCC+CI(K,J)*CIJK(J)
        END DO
        CI(K,I)=CI(K,I)-CCC
       END DO
      END DO
C
      DO I=1,NBAS
       DO J=1,NBAS
        SMO(I,J)=SAO(I,J)
       END DO
      END DO
      CALL TRANS(SMO,CI,NBAS,NBAS)
C
C calculate new overlaps
      SSS=0.D0
      ITER=ITER+1
      DO I=NOV,NBAS
       DO J=1,NOCC
        SSS=SSS+SMO(I,J)*SMO(I,J)
       END DO
      END DO
      SSS=SQRT(SSS)/(NVIRT*NOCC)
      WRITE(6,*) ' ITERATION, SSS:',ITER,SSS
      IF (SSS.GT.EPS.AND.ITER.LE.100) GO TO 100
C
      RETURN
      END
C
      SUBROUTINE TRANS(A,CI,NOCC,NBAS)
      INCLUDE 'param.h'                                                 
      DIMENSION AJKLM(NBASM,NBASM)
      DIMENSION A(NBASM,NBASM),CI(NBASM,NBASM)
C
      DO J=1,NBAS
       DO I=1,NBAS
        AJKLM(I,J)=0.D0
       END DO
      END DO
C
      DO J=1,NOCC
       DO K=1,NBAS
        BB=0.D0
        DO L=1,NBAS
         BB=BB+CI(L,J)*A(K,L)
        END DO
        AJKLM(K,J)=AJKLM(K,J)+BB
       END DO
      END DO
C
      DO J=1,NBAS
       DO I=1,NBAS
        A(I,J)=0.D0
       END DO
      END DO
C
      DO I=1,NOCC
C only J=I..NBAS, copying is cheaper
       DO J=I,NOCC
        SSS=0.D0
        DO K=1,NBAS
         SSS=SSS+AJKLM(K,J)*CI(K,I)
        END DO
        A(I,J)=A(I,J)+SSS
       END DO
      END DO
C
C copy  A(I,J)=A(J,I)
C
      DO I=1,NOCC
       DO J=I+1,NOCC
        A(J,I)=A(I,J)
       END DO
      END DO
C
      RETURN
      END
C
      SUBROUTINE BUBBLE(NOCC,NBAS,ORBEN,F,CI)
      INCLUDE 'param.h'                                                 
      DIMENSION ORBEN(NOCC),CI(NBASM,NOCC),F(NBASM,NOCC)
C
C vectors are NBAS X NOCC
C F is NOCC X NOCC
C
      DO I=1,NOCC-1
       DO J=1,NOCC-I
        IF (ORBEN(J).GT.ORBEN(J+1)) THEN
         DO II=1,NBAS
          CDUM=CI(II,J)
          CI(II,J)=CI(II,J+1)
          CI(II,J+1)=CDUM
         END DO
         DO II=1,NOCC
          FDUM=F(II,J)
          F(II,J)=F(II,J+1)
          F(II,J+1)=FDUM
         END DO
         DO II=1,NOCC
          FDUM=F(J,II)
          F(J,II)=F(J+1,II)
          F(J+1,II)=FDUM
         END DO
         ODUM=ORBEN(J)
         ORBEN(J)=ORBEN(J+1)
         ORBEN(J+1)=ODUM
        END IF
       END DO
      END DO
      RETURN
      END
C
c$$$      SUBROUTINE DENS(CI)
c$$$      INCLUDE 'param.h'
c$$$      INCLUDE 'common_syst.h'
c$$$      INCLUDE 'common_intu.h'
c$$$      INCLUDE 'flow.h'
c$$$      DIMENSION CI(NBASM,NBASM)
c$$$C
c$$$C calculate number of electrons
c$$$C
c$$$      WRITE(6,*) 'BASIS FUNCTION     ASSIGNED NUMBER OF ELECTRONS'
c$$$      FTOT=0.D0
c$$$      DO K=1,NBAS
c$$$       FF=0.D0
c$$$       DO L=1,NBAS
c$$$        FF=FF+P(K,L)*SAO(K,L)
c$$$       END DO
c$$$       FF=FF
c$$$       FTOT=FTOT+FF
c$$$       IF (ABS(FF).GT.1.D-6) WRITE(6,'(5X,I6,15X,F13.6)') K,FF
c$$$      END DO
c$$$      WRITE(6,*)
c$$$      WRITE(6,*) 'TOTAL NUMBER OF ELECTRONS',FTOT
c$$$      WRITE(6,*)
c$$$      RETURN
c$$$      END
C
      SUBROUTINE PFUNC(CI,NVECT,NBAS)
      INCLUDE 'param.h'                                                 
      DIMENSION CI(NBASM,NBASM)
C
      DO IVEC=1,NVECT
       WRITE(6,9901) IVEC
       WRITE(6,9902) (IALPH,CI(IALPH,IVEC),IALPH=1,NBAS)
      END DO
 9901 FORMAT(' Function :',I5)
 9902 FORMAT(5(I5,F10.5))
      RETURN
      END
C
      SUBROUTINE PFUNCL(CI,NVECT,NBAS)
      INCLUDE 'param.h'                                                 
      DIMENSION CI(NBASM,NBASM)
C
      DO IVEC=1,NVECT
       WRITE(6,9901) IVEC
       WRITE(6,9902) (IALPH,CI(IALPH,IVEC),IALPH=1,NBAS)
      END DO
 9901 FORMAT('# Function :',I5)
 9902 FORMAT(I5,F23.17)
      RETURN
      END
C
      SUBROUTINE RDMAT(NAME,ARRAY)
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      DIMENSION ARRAY(NBASM,NBASM)
      CHARACTER*7 NAME
C
      DO I=1,NBAS
       DO J=1,NBAS
        ARRAY(I,J)=0.D0
       END DO
      END DO
C
      IUNITR=31
      OPEN(UNIT=IUNITR,FILE=NAME,STATUS='OLD',FORM='FORMATTED',ERR=8101)
 100  CONTINUE
      READ(IUNITR,*,IOSTAT=KK) I,J,XDUM
      IF (KK.NE.0) GO TO 101
      ARRAY(I,J)=XDUM
      ARRAY(J,I)=XDUM
      GO TO 100
 101  CONTINUE
      CLOSE(IUNITR)
      RETURN
 8101 CONTINUE
      WRITE(6,*) ' ERROR WHILE OPENING FILE <',NAME,'>!! ERROR EXIT'
      STOP ' ERROR IN RDMAT'
      END
C
      SUBROUTINE RDINP
      INCLUDE 'param.h'                                                 
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
      PARAMETER (NSECTM=30)                                             
      COMMON /MEZEY/ ISTRT(NATMX),NABAS(NATMX),NGRP,NUMGRP(NBASM)       
     $     ,ISTGR(NBASM),IFIGR(NBASM),IOTYP(NBASM),IATYP(4,NBASM)       
     $     ,IFRAGM(NATMX),ISMILE(NBASM)                                 
C..   INCLUDE 'common_mezey.h'                                          
      CHARACTER*4 KEYW(2),STR3
      CHARACTER*6 KEYOPT(15),STR6
      CHARACTER*80 LINE
      DIMENSION INGRP(NBASM)
      DATA KEYW /'*LPB','*END'/
      DATA KEYOPT /'GROUP ','CANONI','PIPEKM','BOYS  ','MOLDEN',
     -             'FRAGME','EXTREM','QMC   ','STATIS','NOVIRT',
     -             'WIDTHG','CUTORB','6 D   ','SMILES','XXXXXX'/
C
C DEFAULTS
      LCAN=.FALSE.
      LPIPM=.FALSE.
      LBOYS=.FALSE.
      LMOLD=.FALSE.
      LFRAGM=.FALSE.
      LEXTR=.FALSE.
      LQMC=.FALSE.
      NGRP=0
      LSTAT=.FALSE.
      LNOVIRT=.FALSE.
      L6D=.FALSE.
      CUTORB=1.D-8
      LSMILE=.FALSE.
      DO I=1,NBASM
       NUMGRP(I)=0
      END DO
      WIDTHG=0.5D0
C
C structure of input:
C keyword for each program
      IOINP=83
      OPEN(UNIT=IOINP,FILE='INPUT.LPB',ERR=2217,FORM='FORMATTED',
     -     STATUS='OLD')
      WRITE(6,*) ' found file INPUT.LPB'
C first, look for keyword 'LPB'
 1    CONTINUE
      READ(IOINP,'(A4)',END=2,ERR=921) STR3
      IF (STR3.EQ.KEYW(1)) THEN
C look for Keyoptions
 11    CONTINUE
       READ(IOINP,'(A6)',END=2,ERR=921) STR6
       WRITE(6,*) ' READ LINE |',STR6,'|'
       IF (STR6(1:4).EQ.KEYW(2)) GO TO 2
       IF (STR6.EQ.KEYOPT(1)) THEN
        READ(IOINP,*) NGRP
        WRITE(6,*) ' trying to read ',NGRP,' groups'
        DO IGRP=1,NGRP
         READ(IOINP,*) NGRP2
         WRITE(6,*) ' trying to read ',NGRP2,' elements for group',IGRP
         READ(IOINP,*) (INGRP(I),I=1,NGRP2)
         DO I=1,NGRP2
          NUMGRP(INGRP(I))=IGRP
         END DO
        END DO
       ELSE IF (STR6.EQ.KEYOPT(2)) THEN
        LCAN=.TRUE.
       ELSE IF (STR6.EQ.KEYOPT(3)) THEN
        LPIPM=.TRUE.
       ELSE IF (STR6.EQ.KEYOPT(4)) THEN
        LBOYS=.TRUE.
       ELSE IF (STR6.EQ.KEYOPT(5)) THEN
        LMOLD=.TRUE.
       ELSE IF (STR6.EQ.KEYOPT(6)) THEN
        LFRAGM=.TRUE.
        READ(IOINP,*) NATDUM
        READ(IOINP,*) (IFRAGM(I),I=1,NATDUM)
C extremely localized orbitals
       ELSE IF (STR6.EQ.KEYOPT(7)) THEN
        LEXTR=.TRUE.
C the QMC option
       ELSE IF (STR6.EQ.KEYOPT(8)) THEN
        LQMC=.TRUE.
C the statistical analysis
       ELSE IF (STR6.EQ.KEYOPT(9)) THEN
        LSTAT=.TRUE.
C no virtual orbitals
       ELSE IF (STR6.EQ.KEYOPT(10)) THEN
        LNOVIRT=.TRUE.
C width for Gaussian cut
       ELSE IF (STR6.EQ.KEYOPT(11)) THEN
        READ(IOINP,*) WIDTHG
C cutoff parameter for orbitals
       ELSE IF (STR6.EQ.KEYOPT(12)) THEN
        READ(IOINP,*) CUTORB
C projection on cartesian functions (1 S, 3 P, 6 D, 10 F, 15 G)
       ELSE IF (STR6.EQ.KEYOPT(13)) THEN
        L6D=.TRUE.
C reordering of oprbitals according to SMILES
       ELSE IF (STR6.EQ.KEYOPT(14)) THEN
        LSMILE=.TRUE.
       ELSE
        WRITE(6,*)
        WRITE(6,*) ' UNKNOWN OPTION: |',STR6,'|'
        WRITE(6,*)
        WRITE(6,*) ' POSSIBLE OPTIONS IN THE BLOCK *LPB ... *END ARE:'
        WRITE(6,*)
        WRITE(6,*) '              ',KEYOPT(1)
        WRITE(6,*) '              ',KEYOPT(2)
        WRITE(6,*) '              ',KEYOPT(3)
        WRITE(6,*) '              ',KEYOPT(4)
        WRITE(6,*) '              ',KEYOPT(5)
        WRITE(6,*) '              ',KEYOPT(6)
        WRITE(6,*) '              ',KEYOPT(7)
        WRITE(6,*) '              ',KEYOPT(8)
        WRITE(6,*) '              ',KEYOPT(9)
        WRITE(6,*) '              ',KEYOPT(10)
        WRITE(6,*) '              ',KEYOPT(11)
        WRITE(6,*) '              ',KEYOPT(12)
        WRITE(6,*) '              ',KEYOPT(13)
        STOP ' CHOOSE CORRECT OPTION '
       END IF
       GO TO 11
      END IF
      GO TO 1
 2    CONTINUE
      CLOSE(IOINP)
      RETURN
 921  CONTINUE
      CLOSE(IOINP)
      STOP ' ERROR IN INPUT'
 2217 CONTINUE
      WRITE(6,*) ' NO FILE , USING THE DEFAULT VALUES'
      RETURN
      END
C
      SUBROUTINE VSRTO(CI,IOCC,IOCCS)
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      DIMENSION CI(NBASM,NBASM),IOCC(NBAS),IOCCS(NBAS)
C
      IOCCZ=0
 
 1    CONTINUE
      IOCCZ=IOCCZ+1
      IF (IOCCZ.EQ.NBAS+1) RETURN
      IF (IOCC(IOCCZ).NE.IOCCS(IOCCZ)) THEN
       IVIRTZ=IOCCZ
 2     CONTINUE
       IVIRTZ=IVIRTZ+1
       IF (IVIRTZ.EQ.NBAS+1) RETURN
       IF (IOCC(IVIRTZ).EQ.IOCCS(IVIRTZ)) THEN
        IDUM=IOCC(IOCCZ)
        IOCC(IOCCZ)=IOCC(IVIRTZ)
        IOCC(IVIRTZ)=IDUM
        IDUM=IOCCS(IOCCZ)
        IOCCS(IOCCZ)=IOCCS(IVIRTZ)
        IOCCS(IVIRTZ)=IDUM
        DO J=1,NBAS
         CDUM=CI(J,IOCCZ)
         CI(J,IOCCZ)=CI(J,IVIRTZ)
         CI(J,IVIRTZ)=CDUM
        END DO
        GO TO 1
       END IF
       GO TO 2
      END IF
      GO TO 1
      END
 
      SUBROUTINE WVEC(FILEN)
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
      CHARACTER*4 FILEN
C
C output to a file
C
      WRITE(6,*)
      IUNITX=27
C
C localized orbitals by ORTHO
       WRITE(6,*) ' WRITING VECTOR TO FILE  '
       OPEN(UNIT=IUNITX,FILE='VECTOR.'//FILEN,STATUS='UNKNOWN',FORM
     $      ='FORMATTED')
      WRITE(6,*)
      DO J=1,NBAS
       WRITE(IUNITX,'(4E20.12)') (CI(K,J),K=1,NBAS)
       WRITE(IUNITX,*)
      END DO
      WRITE(IUNITX,'(30I2)') (IOCC(I),I=1,NBAS)
      WRITE(IUNITX,'(30I2)') (IOCCS(I),I=1,NBAS)
      CLOSE(IUNITX)
      RETURN
      END
C
      SUBROUTINE WVCUT(FILEN)
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
      CHARACTER*4 FILEN
C
C output to a file
C
      WRITE(6,*)
      IUNITX=27
C
C localized orbitals by ORTHO
       WRITE(6,*) ' WRITING VECTOR TO FILE  '
       OPEN(UNIT=IUNITX,FILE='VECTOR.'//FILEN//'.CUT',STATUS='UNKNOWN'
     $      ,FORM='FORMATTED')
      WRITE(6,*)
      DO J=1,NBAS
       WRITE(IUNITX,'(4E20.12)') (CI(K,J),K=1,NBAS)
       WRITE(IUNITX,*)
      END DO
      WRITE(IUNITX,'(30I2)') (IOCC(I),I=1,NBAS)
      WRITE(IUNITX,'(30I2)') (IOCCS(I),I=1,NBAS)
      CLOSE(IUNITX)
      RETURN
      END
C
      SUBROUTINE WVEXTR
C write extremely localized vector without orthogonalization
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
C
C output to a file
C
      WRITE(6,*)
      IUNITX=27
C
C localized orbitals by ORTHO
       WRITE(6,*) ' WRITING VECTOR TO FILE  '
       OPEN(UNIT=IUNITX,FILE='VECTOR.EXTREME',STATUS='UNKNOWN'
     -,FORM='FORMATTED')
      WRITE(6,*)
      DO J=1,NBAS
       WRITE(IUNITX,'(4E20.12)') (CI(K,J),K=1,NBAS)
       WRITE(IUNITX,*)
      END DO
      WRITE(IUNITX,'(30I2)') (IOCC(I),I=1,NBAS)
      WRITE(IUNITX,'(30I2)') (IOCCS(I),I=1,NBAS)
      CLOSE(IUNITX)
      RETURN
      END
C
      SUBROUTINE GENCAN(FAO,FMO,CI,ORBEN,NVECT)
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      DIMENSION FAO(NBASM,NBASM),FMO(NBASM,NBASM)
      DIMENSION CI(NBASM,NVECT),ORBEN(NVECT)
      DIMENSION CIN(NBASM,NVECT),CDUM1(NBASM),CDUM2(NBASM)
C
C here we diagonalize the Fock matrix, and store the new orbitals
C
      DO I=1,NBAS
       DO J=1,NBAS
        FMO(I,J)=FAO(I,J)
       END DO
      END DO
      CALL TRANS(FMO,CI,NVECT,NBAS)
C
      IONE=1
      CALL RS(NBASM,NVECT,FMO,ORBEN,IONE,CIN,CDUM1,CDUM2,IERR)
C
      WRITE(6,*)
      WRITE(6,*) ' ORBITAL ENERGIES OF THE CANONICAL ORBITALS'
      WRITE(6,*)
      WRITE(6,'(4(I4,E14.5))') (I,ORBEN(I),I=1,NVECT)
      WRITE(6,*)
C
C well, it should come down to a simple matrix multiplication ...
C
      DO IALPH=1,NBAS
       DO I=1,NVECT
        CDUM=0.D0
        DO J=1,NVECT
C the J components of eigenvector I
         CDUM=CDUM+CIN(J,I)*CI(IALPH,J)
        END DO
        FMO(IALPH,I)=CDUM
       END DO
      END DO
C
      DO IALPH=1,NBAS
       DO I=1,NVECT
        CI(IALPH,I)=FMO(IALPH,I)
       END DO
      END DO
C
      RETURN
      END
C
      SUBROUTINE PIPEKM(CI,NVECT)
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      PARAMETER (NSECTM=30)                                             
      COMMON /MEZEY/ ISTRT(NATMX),NABAS(NATMX),NGRP,NUMGRP(NBASM)       
     $     ,ISTGR(NBASM),IFIGR(NBASM),IOTYP(NBASM),IATYP(4,NBASM)       
     $     ,IFRAGM(NATMX),ISMILE(NBASM)                                 
C..   INCLUDE 'common_mezey.h'                                          
      DIMENSION CI(NBASM,NVECT)
      LOGICAL LSWEEP
C
C Pipek-Mezey localization, i.e. the occupied orbitals are localized,
C and as virtual orbitals the atomic orbitals are taken, and
C orthogonalized to the occupied and among themselves
C
      WRITE(6,*)
      WRITE(6,*) ' PIPEK - MEZEY LOCALIZATION : '
      WRITE(6,*)
C
      IF (NVECT.LE.1) THEN
       WRITE(6,*) ' FOR NVECT=1 THERE IS NOTHING TO OPTIMIZE '
       WRITE(6,*)
       RETURN
      END IF
      CALL MEASUR(D,CI,NVECT)
      WRITE(6,*) ' BEFORE: LOCALIZATION CRITERION D=',D
      ITER=0
 200  CONTINUE
      ITER=ITER+1
      CALL SWEEP(CI,NVECT,NBAS,NATOM,LSWEEP)
      DOLD=D
      CALL MEASUR(D,CI,NVECT)
      IF (.NOT.LSWEEP) GO TO 201
      GO TO 200
 201  CONTINUE
      WRITE(6,*) ' PIPEK-MEZEY PROCEDURE TOOK ',ITER
     $     ,' SWEEPS TO CONVERGE'
      WRITE(6,*) ' NOW:    LOCALIZATION CRITERION D=',D
      WRITE(6,*)
C
      RETURN
      END
C
      SUBROUTINE MEASUR(D,CI,NVECT)
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      PARAMETER (NSECTM=30)                                             
      COMMON /MEZEY/ ISTRT(NATMX),NABAS(NATMX),NGRP,NUMGRP(NBASM)       
     $     ,ISTGR(NBASM),IFIGR(NBASM),IOTYP(NBASM),IATYP(4,NBASM)       
     $     ,IFRAGM(NATMX),ISMILE(NBASM)                                 
C..   INCLUDE 'common_mezey.h'                                          
      DIMENSION CI(NBASM,NVECT)
C
      D=0.D0
      XDUM=0.D0
      DO I=1,NVECT
       DI=0.D0
C construct the density matrix for orbital I
       DO IAT=1,NATOM
        QIA=0.D0
        DO IALPH=ISTRT(IAT),ISTRT(IAT)+NABAS(IAT)
         CIA=CI(IALPH,I)
         DO IBETA=1,NBAS
          PAB=CIA*CI(IBETA,I)
          QIA=QIA+PAB*SAO(IBETA,IALPH)
         END DO
        END DO
        DI=DI+QIA*QIA
        XDUM=XDUM+QIA
       END DO
       D=D+DI
      END DO
      XDUM=2.D0*XDUM
C
C we should have XDUM = number of electrons
 
      IF (ABS(2*NVECT-XDUM).GT.1.D-3) THEN
       WRITE(6,*)
     $      ' MEASUR: COUNTING ELECTRONS: SHOULD ',2*NVECT,' HAVE  ',XDU
     $M
C folded 1 (fixf $Revision: 1.3 $) 
       WRITE(6,*)
      END IF
      D=0.5D0*DBLE(NVECT)/D
      RETURN
      END
C
      SUBROUTINE SWEEP(CI,NVECT,NBAS,NATOM,LSWEEP)
      INCLUDE 'param.h'                                                 
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      PARAMETER (NSECTM=30)                                             
      COMMON /MEZEY/ ISTRT(NATMX),NABAS(NATMX),NGRP,NUMGRP(NBASM)       
     $     ,ISTGR(NBASM),IFIGR(NBASM),IOTYP(NBASM),IATYP(4,NBASM)       
     $     ,IFRAGM(NATMX),ISMILE(NBASM)                                 
C..   INCLUDE 'common_mezey.h'                                          
      DIMENSION SPS(NATMX),SPT(NATMX),TPT(NATMX),CI(NBASM,NBASM)
      LOGICAL LSWEEP
C
      SUMAL=0.D0
      DO IS=1,NVECT
       DO IT=IS+1,NVECT
C
C with every calculated angle orbital S will be changed as well
C we have to recalculate SPS again and again
C
        DO IAT=1,NATOM
         SSS=0.D0
         SST=0.D0
         STT=0.D0
         DO IALPH=ISTRT(IAT),ISTRT(IAT)+NABAS(IAT)
          CIAS=CI(IALPH,IS)
          CIAT=CI(IALPH,IT)
          DO IBETA=1,NBAS
           CIBS=CI(IBETA,IS)
           CIBT=CI(IBETA,IT)
           SAOAB=SAO(IALPH,IBETA)
           SSS=SSS +  CIAS*CIBS           *SAOAB
           STT=STT +  CIAT*CIBT           *SAOAB
           SST=SST + (CIAS*CIBT+CIAT*CIBS)*SAOAB
          END DO
         END DO
         SPS(IAT)=SSS
         SPT(IAT)=SST*0.5D0
         TPT(IAT)=STT
        END DO
 
        AST=0.D0
        BST=0.D0
        DO IAT=1,NATOM
         AST=AST+SPT(IAT)*SPT(IAT)-0.25D0*(SPS(IAT)-TPT(IAT))*(SPS(IAT)
     $        -TPT(IAT))
         BST=BST+SPT(IAT)*(SPS(IAT)-TPT(IAT))
        END DO
        S4A= BST/SQRT(AST*AST+BST*BST)
        C4A=-AST/SQRT(AST*AST+BST*BST)
        FOURA=ASIN(ABS(S4A))
        PI=2.D0*ACOS(0.D0)
C which quadrant?
        IF (S4A.GT.0) THEN
C between 0 and pi/2: do nothing
         IF (C4A.LE.0) THEN
C between pi/2 and pi
          FOURA=PI-FOURA
         END IF
        ELSE
         IF (C4A.LT.0) THEN
C between pi and 3/2 pi
          FOURA=FOURA+PI
         ELSE
C between 3/2 pi and 2 pi
          FOURA=2.D0*PI-FOURA
         END IF
        END IF
        ALPHA=0.25D0*FOURA
        ALPI=4.D0*ALPHA/PI
        SUMAL=SUMAL+(NINT(ALPI)-ALPI)*(NINT(ALPI)-ALPI)
C
C there is this story about Gamma and Alpha in the paper of Pipek and
c Mezey; for BST=0 we obtain alpha=Pi/4, so it is gamma=alpha for
c localizing, thus minimizing D or maximizing P=D^-1
C
        GAMMA=ALPHA
C
C now we have to mix the two orbitals
        S=DSIN(GAMMA)
        S2=S*S
        C2=1.D0-S2
        C=DSQRT(C2)
 
        SINA=S
        COSA=C
 
c$$$        SINA=SIN(GAMMA)
c$$$        COSA=COS(GAMMA)
        DO IALPH=1,NBAS
         CSA=CI(IALPH,IS)
         CTA=CI(IALPH,IT)
         CSSA=COSA*CSA+SINA*CTA
         CTTA=COSA*CTA-SINA*CSA
         CI(IALPH,IS)=CSSA
         CI(IALPH,IT)=CTTA
        END DO
C that's it
       END DO
      END DO
      SUMAL=SQRT(SUMAL)/DBLE(NVECT*(NVECT-1)/2)
C if we need another sweep, we leave LSWEEP as true
      LSWEEP=.TRUE.
C     IF (SUMAL.LE.1.D-7) LSWEEP=.FALSE.
      WRITE(6,*) ' SWEEP: SUMAL = ',SUMAL
      IF (SUMAL.LE.2.D-9) LSWEEP=.FALSE.
C
      RETURN
      END
C
      SUBROUTINE SWEEPB(CI,NVECT,NBAS,LSWEEP)
      INCLUDE 'param.h'                                                 
      COMMON /CBOYS/ DIPOL(NBASM,NBASM,3)                               
C..   INCLUDE 'common_boys.h'                                           
      DIMENSION CI(NBASM,NBASM)
      LOGICAL LSWEEP
C
      A0=0.D0
      A1=1.D0
      A2=2.D0
      A10=10.D0
      AQU=0.25D0
      THSW=A0
      DO 110 I=2,NVECT
C
       IM1=I-1
       IP1=I+1
       DO 100 J=1,IM1
C
C     LOOP OVER I,J ROTATIONS
C     MAXIMIZE SUM(K) **2 + **2
C     LIKE IN JACOBI
C
C     GET AX , B DETERMINING THE TAN OF THE ROTATION ANGLE
C
        AX=A0
        B=A0
        DO K=1,3
         AUX1=DIPOL(J,J,K)-DIPOL(I,I,K)
         AUX2=DIPOL(I,J,K)
         AX=AX+AUX1*AUX2
         B=B+AQU*AUX1**2-AUX2**2
        END DO
C
C     ROTATION ANGLE X0
C
        IF (DABS(AX)+DABS(B).LT.1.D-12) GO TO 100
        X0=AQU*DATAN2(AX,B)
c$$$
c$$$        WRITE(6,*) ' I, J, AX, B, X0',I,J,AX,B,X0
c$$$        WRITE(6,*) DIPOL(I,I,1),DIPOL(J,J,1),DIPOL(I,J,1)
        THSW=DMAX1(THSW,DABS(X0))
        IF (DABS(X0).LT.1.D-13) GO TO 100
C
C     ROTATION
C
        IT=IT+1
C     C=DCOS(X0)
        S=DSIN(X0)
        S2=S*S
        C2=A1-S2
        C=DSQRT(C2)
C
C update of the vector
C
         DO IALPH=1,NBAS
          CSA=CI(IALPH,I)
          CTA=CI(IALPH,J)
          CI(IALPH,I)=C*CSA-S*CTA
          CI(IALPH,J)=C*CTA+S*CSA
         END DO
C
        JM1=J-1
C     C2=C*C
C     S2=S*S
        CS=C*S
        C2MS2=C2-S2
        JP1=J+1
        DO 95 K=1,3
         AUX1=DIPOL(I,I,K)
         AUX2=DIPOL(J,J,K)
         DIPOL(I,I,K)=AUX1*C2+AUX2*S2-A2*DIPOL(I,J,K)*CS
         DIPOL(J,J,K)=AUX1*S2+AUX2*C2+A2*DIPOL(I,J,K)*CS
         DIPOL(I,J,K)=CS*(AUX1-AUX2)+DIPOL(I,J,K)*C2MS2
         DIPOL(J,I,K)=DIPOL(I,J,K)
         DO L=1,JM1
          AUX1=C*DIPOL(I,L,K)-S*DIPOL(J,L,K)
          DIPOL(J,L,K)=S*DIPOL(I,L,K)+C*DIPOL(J,L,K)
          DIPOL(I,L,K)=AUX1
          DIPOL(L,I,K)=DIPOL(I,L,K)
          DIPOL(L,J,K)=DIPOL(J,L,K)
         END DO
         DO L=JP1,IM1
          AUX1=C*DIPOL(I,L,K)-S*DIPOL(J,L,K)
          DIPOL(J,L,K)=C*DIPOL(J,L,K)+S*DIPOL(I,L,K)
          DIPOL(I,L,K)=AUX1
          DIPOL(L,I,K)=DIPOL(I,L,K)
          DIPOL(L,J,K)=DIPOL(J,L,K)
         END DO
         DO L=IP1,NVECT
          AUX1=C*DIPOL(J,L,K)+S*DIPOL(I,L,K)
          DIPOL(I,L,K)=C*DIPOL(I,L,K)-S*DIPOL(J,L,K)
          DIPOL(J,L,K)=AUX1
          DIPOL(L,I,K)=DIPOL(I,L,K)
          DIPOL(L,J,K)=DIPOL(J,L,K)
         END DO
 95     CONTINUE
 100   CONTINUE
 110  CONTINUE
C
C     CHECK CONVERGENCE
C
C if we need another sweep, we leave LSWEEP as true
      LSWEEP=.TRUE.
      WRITE(6,*) ' SWEEP: GAMMAX = ',THSW
      IF (THSW.LE.1.D-9) LSWEEP=.FALSE.
C
      RETURN
      END
C
      SUBROUTINE BOYS(CI,NVECT)
C
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      PARAMETER (NSECTM=30)                                             
      COMMON /MEZEY/ ISTRT(NATMX),NABAS(NATMX),NGRP,NUMGRP(NBASM)       
     $     ,ISTGR(NBASM),IFIGR(NBASM),IOTYP(NBASM),IATYP(4,NBASM)       
     $     ,IFRAGM(NATMX),ISMILE(NBASM)                                 
C..   INCLUDE 'common_mezey.h'                                          
      COMMON /CBOYS/ DIPOL(NBASM,NBASM,3)                               
C..   INCLUDE 'common_boys.h'                                           
      DIMENSION CI(NBASM,NVECT)
      DIMENSION DIPDIA(NBASM,3)
      LOGICAL LSWEEP
      DIMENSION HDUM(NBASM,NBASM),ORD(NBASM)
C
C Boys localization, i.e. the occupied orbitals are localized,
C and as virtual orbitals the atomic orbitals are taken, and
C orthogonalized to the occupied and among themselves
C
C
C we follow the recipe of Ahlrichs from TURBOMOLE:
C condition for minimization of \sum_i**2
C is *(- = 0 for i.ne.j
C so we set up the matrix of conditions
C
      WRITE(6,*)
      WRITE(6,*) ' BOYS LOCALIZATION : '
      WRITE(6,*)
C
      IF (NVECT.LE.1) THEN
       WRITE(6,*) ' FOR NVECT=1 THERE IS NOTHING TO OPTIMIZE '
       WRITE(6,*)
       RETURN
      END IF
 
      IPRI=1
      CALL MEASUR(D,CI,NVECT)
 
      call baryzcal(CI,NVECT,DIPDIA)
C
C we evaluate the Boys measure:
      CALL BOYSME(NVECT,DIPDIA)
C
      ITER=0
 200  CONTINUE
      ITER=ITER+1
C
C eigentlich sollte eine Boys Lokalisierung nur eine andere Art eines
C SWEEP sein ....
C
      CALL SWEEPB(CI,NVECT,NBAS,LSWEEP)
C
      IF (.NOT.LSWEEP) GO TO 201
      GO TO 200
 201  CONTINUE
      WRITE(6,*) ' BOYS PROCEDURE TOOK ',ITER,' SWEEPS TO CONVERGE'
      WRITE(6,*)
 
C we evaluate the Boys measure:
      DO K=1,3
       DO I=1,NVECT
        DIPDIA(I,K)=DIPOL(I,I,K)
       END DO
      END DO
 
      CALL BOYSME(NVECT,DIPDIA)
C
      D=0.D0
      CALL MEASUR(D,CI,NVECT)
C
      RETURN
      END
C
      SUBROUTINE BOYSME(NORB,DIPDIA)
      INCLUDE 'param.h'                                                 
      COMMON /CBOYS/ DIPOL(NBASM,NBASM,3)                               
C..   INCLUDE 'common_boys.h'                                           
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
 
C we have to have the diagonal of the dipole integrals in molecular orbitals
      DIMENSION DIPDIA(NBASM,3)
 
C get the barycenter
      XC1=0.D0
      YC1=0.D0
      ZC1=0.D0
      DO I=1,NATOM
       XC1=XC1+POS(1,I)
       YC1=YC1+POS(2,I)
       ZC1=ZC1+POS(3,I)
      END DO
      XC1=XC1/DBLE(NATOM)
      YC1=YC1/DBLE(NATOM)
      ZC1=ZC1/DBLE(NATOM)
C
       WRITE(6,9771) NATOM,XC1,YC1,ZC1
 9771  FORMAT(' barycenter of the molecule (',I2,' atoms) : ',3F10.4)
C
C print the list of orbital centers
C
      WRITE(6,9909)
 9909 FORMAT(/,'  barycenters of the orbitals '
     -     ,//,5x,'No',10x,'x',15x,'y',15x,'z',/)
 
      DO I=1,NORB
       WRITE(6,9902) I,(DIPDIA(I,K),K=1,3)
 9902  FORMAT(I6,3F16.8)
      END DO
c$$$
c$$$      WRITE(6,9910)
c$$$ 9910 FORMAT(/,'  barycenters of the orbitals (simple) '
c$$$     -     ,//,5x,'No',10x,'x',15x,'y',15x,'z',/)
c$$$
c$$$      DO I=1,NORB
c$$$       xi=0.d0
c$$$       yi=0.d0
c$$$       zi=0.d0
c$$$       do ialph=1,nbas
c$$$        xalph=pos(1,iatz(ialph))
c$$$        yalph=pos(2,iatz(ialph))
c$$$        zalph=pos(3,iatz(ialph))
c$$$        c2=ci(ialph,i)*ci(ialph,i)
c$$$        xi=xi+c2*xalph
c$$$        yi=yi+c2*yalph
c$$$        zi=zi+c2*zalph
c$$$       end do
c$$$       WRITE(6,9902) I,xi,yi,zi
c$$$      END DO
c$$$
      BBB=0.D0
      DO K=1,3
       DO I=1,NORB
        DO J=I+1,NORB
         BBB=BBB
     -        +(DIPDIA(I,K)-DIPDIA(J,K))*(DIPDIA(I,K)-DIPDIA(J,K))
        END DO
       END DO
      END DO
C
      WRITE(6,*)
      WRITE(6,*) ' LOCALIZATION CRITERION =',BBB
      WRITE(6,*)
C
      RETURN
      END
C
      SUBROUTINE SPREAD(CI)
      INCLUDE 'param.h'                                                 
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      PARAMETER (NSECTM=30)                                             
      COMMON /MEZEY/ ISTRT(NATMX),NABAS(NATMX),NGRP,NUMGRP(NBASM)       
     $     ,ISTGR(NBASM),IFIGR(NBASM),IOTYP(NBASM),IATYP(4,NBASM)       
     $     ,IFRAGM(NATMX),ISMILE(NBASM)                                 
C..   INCLUDE 'common_mezey.h'                                          
      DIMENSION CI(NBASM,NBAS),OCCP(NATMX),P(NBASM,NBASM),OCCT(NATMX)
C
      DO IAT=1,NATOM
       OCCT(IAT)=0.D0
      END DO
 
      WRITE(6,9900)(I,I=1,NATOM)
      DO IORB=1,NBAS
C density matrix for each orbital
       DO IATOM=1,NATOM
        OCDUM=0.D0
        DO IALPH=ISTRT(IATOM),ISTRT(IATOM)+NABAS(IATOM)
         CIA=CI(IALPH,IORB)
         DO IBETA=1,NBAS
          OCDUM=OCDUM+CIA*CI(IBETA,IORB)*SAO(IALPH,IBETA)
         END DO
        END DO
        OCCP(IATOM)=OCDUM
       END DO
       WRITE(6,9901) IORB,(2.D0*OCCP(I),I=1,NATOM)
       IF (IORB.LE.NOCC) THEN
        DO IAT=1,NATOM
         OCCT(IAT)= OCCT(IAT) + 2.D0*OCCP(IAT)
        END DO
       END IF
C
C well, what type of orbital do we have?
       OMX=0.D0
       OMS=0.D0
       DO IATOM=1,NATOM
        OMS=OMS+OCCP(IATOM)
        IF (OCCP(IATOM).GT.OMX) THEN
         OMX=OCCP(IATOM)
         IATYP(1,IORB)=IATOM
        END IF
       END DO
C how many other occupations are at least 50% of OMX?
       IOMX=1
       DO IATOM=1,NATOM
        IF (OCCP(IATOM).GT.0.5D0*OMX.AND.IATOM.NE.IATYP(1,IORB)) THEN
         IOMX=IOMX+1
         IF (IOMX.LE.4) IATYP(IOMX,IORB)=IATOM
        END IF
       END DO
       IOTYP(IORB)=MIN(5,IOMX)
       IF (IOTYP(IORB).EQ.5) THEN
        DO I=1,4
         IATYP(I,IORB)=0
        END DO
       END IF
      END DO
 
      WRITE(6,*)
      WRITE(6,9900) (IAT,IAT=1,NATOM)
      WRITE(6,9902) (OCCT(IAT),IAT=1,NATOM)
 9900 FORMAT('  Atom',I4,19(I8))
 9901 FORMAT(I4,20(F8.4))
 9902 FORMAT(' total ',20(F8.4))
C
      RETURN
      END
C
      SUBROUTINE MOLDEN(FILEN)
C
C we try to create a MOLDEN file
C
      INCLUDE 'param.h'                                                 
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
 
      DIMENSION IORD(NBASM)
 
      CHARACTER*6 CHEXT
      CHARACTER*2 SYMBAT(0:92)
      DIMENSION NSHLT(NLMAX,NATMX),IZENTR(NSHLMX)
      CHARACTER*1 CST(10),CBUCH(0:9)
      CHARACTER*3 STRG(NBASM)
      CHARACTER*4 FILEN
      DATA CST /'S','P','D','F','G','H','I','J','K','L'/
      DATA CBUCH /'0','1','2','3','4','5','6','7','8','9'/
      DATA SYMBAT/   'XX',' H','HE','LI','BE',' B',' C',' N',
     1' O',' F','NE','NA','MG','AL','SI',' P',' S','CL','AR',
     2' K','CA','SC','TI',' V','CR','MN','FE','CO','NI','CU',
     3'ZN','GA','GE','AS','SE','BR','KR','RB','SR',' Y','ZR',
     4'NB','MO','TC','RU','RH','PD','AG','CD','IN','SN','SB',
     5'TE',' I','XE','CS','BA','LA','CE','PR','ND','PM','SM',
     6'EU','GD','TB','DY','HO','ER','TM','YB','LU','HF','TA',
     7' W','RE','OS','IR','PT','AU','HG','TL','PB','BI','PO',
     8'AT','RN','FR','RA','AC','TH','PA',' U'/
 
      WRITE(6,*)
      WRITE(6,*) '-------------------------------------------------'
      WRITE(6,*) '--- M O L D E N ----------- M O L D E N ---------'
      WRITE(6,*) '-------------------------------------------------'
C
      WRITE(6,*)
      WRITE(6,*) ' writing file ',FILEN,'.MOLDEN '
      WRITE(6,*)
C
      IOUQMC=57
      OPEN(UNIT=IOUQMC,FILE=FILEN//'.MOLDEN',FORM='FORMATTED',STATUS
     $     ='UNKNOWN')
      CLOSE(IOUQMC,STATUS='DELETE')
      OPEN(UNIT=IOUQMC,FILE=FILEN//'.MOLDEN',FORM='FORMATTED',STATUS
     $     ='NEW')
 
      WRITE(IOUQMC,8001)
 8001 FORMAT('[Molden Format]',/,'[Atoms] Angs')
C
      IUNITR=76
C
C we read the file 2 times: first the atoms, then the basis set
C
      OPEN(UNIT=IUNITR,FILE='SYSTEM.ORTHO',STATUS='OLD',
     -     FORM='FORMATTED')
C
      WRITE(6,*)
C
C the first read, concerning atoms
C
      ANTOAU=0.529177247D0
      READ(IUNITR,*) NATOM
      DO IAT=1,NATOM
       READ(IUNITR,*) NUMAT,NSHLAT,(POS(J,IAT),J=1,3)
       WRITE(IOUQMC,8002) SYMBAT(NUMAT),IAT,NUMAT,(POS(J,IAT)*ANTOAU,
     -      J=1,3)
 8002  FORMAT(A2,2I5,F21.10,2F20.10)
C
       DO ISH=1,NSHLAT
        READ(IUNITR,*) IDUM,NNPRIM
        DO III=1,NNPRIM
         READ(IUNITR,*) XDUM
        END DO
       END DO
      END DO
 
      WRITE(IOUQMC,8003)
 8003 FORMAT('[5D]',/,'[GTO]')
C
C the second read of SYSTEM.ORTHO
C
      REWIND(IUNITR)
 
      NSHL=0
      NBASY=1
      LMAX=0
      IPRIM=0
      NPRIMT=0
      IBAS=0
 
      READ(IUNITR,*) NATOM
      DO IAT=1,NATOM
       DO ITYPE=1,NLMAX
        NSHLT(ITYPE,IAT)=0
       END DO
       READ(IUNITR,*) IDUM,NSHLAT
       WRITE(IOUQMC,8013) IAT
 8013  FORMAT(I3,' 0')
C
       DO ISH=1,NSHLAT
        NSHL=NSHL+1
        IZENTR(NSHL)=IAT
        READ(IUNITR,*) ITYPE,NPRIM(NSHL)
        WRITE(IOUQMC,8004) CST(ITYPE+1),NPRIM(NSHL)
 8004   FORMAT(1X,A1,I5,' 1.00')
        NPRIMT=NPRIMT+(ITYPE+ITYPE+1)*NPRIM(NSHL)
 
        IL(NSHL)=ITYPE
        LMAX=MAX(ITYPE+1,LMAX)
        NSHLT(ITYPE+1,IAT)=NSHLT(ITYPE+1,IAT)+1
        NBASY=NBASY+ITYPE+ITYPE+1
        IPST=IPRIM+1
        DO III=1,NPRIM(NSHL)
         IPRIM=IPRIM+1
         READ(IUNITR,*) EXX(IPRIM),COEFF(IPRIM)
        END DO
C
C we have to reorder the indices of the primitives for having the MOLDEN
C ordering of m values
C
C we, i.e. DALTON:
C   s px py pz d-2 d-1 d0 d1 d2 f-3 f-2 f-1 f0 f1 f2 f3
C
C MOLDEN likes the order
C   s px py pz d0 d1 d-1 d2 d-2 f0 f1 f-1 f2 f-2 f3 f-3
C
C   1 | 1 2 3 | 1 2 3 4 5 | 1 2 3 4 5 6 7
C   1 | 3 1 2 | 3 4 2 5 1 | 4 5 3 6 2 7 1
C
        IF (ITYPE.EQ.0) THEN
C s functions
         IBAS=IBAS+1
         IORD(IBAS)=IBAS
         STRG(IBAS)='S  '
        ELSE IF (ITYPE.EQ.1) THEN
C p functions
         IORD(IBAS+1)=IBAS+1
         STRG(IBAS+1)='PX '
         IORD(IBAS+2)=IBAS+2
         STRG(IBAS+2)='PY '
         IORD(IBAS+3)=IBAS+3
         STRG(IBAS+3)='PZ '
         IBAS=IBAS+3
        ELSE IF (ITYPE.EQ.2) THEN
C d functions
         IORD(IBAS+5)=IBAS+1
         STRG(IBAS+5)='D-2'
         IORD(IBAS+3)=IBAS+2
         STRG(IBAS+3)='D-1'
         IORD(IBAS+1)=IBAS+3
         STRG(IBAS+1)='D 0'
         IORD(IBAS+2)=IBAS+4
         STRG(IBAS+2)='D 1'
         IORD(IBAS+4)=IBAS+5
         STRG(IBAS+4)='D 2'
         IBAS=IBAS+5
        ELSE IF (ITYPE.EQ.3) THEN
C f functions
         IORD(IBAS+7)=IBAS+1
         STRG(IBAS+7)='F-3'
         IORD(IBAS+5)=IBAS+2
         STRG(IBAS+5)='F-2'
         IORD(IBAS+3)=IBAS+3
         STRG(IBAS+3)='F-1'
         IORD(IBAS+1)=IBAS+4
         STRG(IBAS+1)='F 0'
         IORD(IBAS+2)=IBAS+5
         STRG(IBAS+2)='F 1'
         IORD(IBAS+4)=IBAS+6
         STRG(IBAS+4)='F 2'
         IORD(IBAS+6)=IBAS+7
         STRG(IBAS+6)='F 3'
         IBAS=IBAS+7
        ELSE
         STOP ' no functions beyond l=3 installed yet '
        END IF
C
        CALL NORMBF(NSHL,IPST)
        DO III=0,NPRIM(NSHL)-1
         WRITE(IOUQMC,'(2F18.10)') EXX(IPST+III),COEFF(IPST+III)
        END DO
       END DO
       WRITE(IOUQMC,*)
      END DO
C
      CLOSE(IUNITR)
      WRITE(IOUQMC,*)
      WRITE(IOUQMC,8005)
 8005 FORMAT('[MO]')
C
      WRITE(6,*) ' NBAS  =',NBAS
      WRITE(6,*) ' NOCC  =',NOCC
      WRITE(6,*) ' LMAX  =',LMAX
      WRITE(6,*) ' NSHL  =',NSHL
      WRITE(6,*) ' NPRIM =',(NPRIM(I),I=1,NSHL)
      WRITE(6,*) ' NPRIMT =',NPRIMT
C
C write the MOs
C
      DO I=1,NBAS
       WRITE(IOUQMC,8006) ORBEN(I),IOCC(I)
 8006  FORMAT(' Ene=',F13.4,/,' Spin= Alpha',/,' Occup=',I4,'.000000')
C well,z not correct neither
c$$$       WRITE(IOUQMC,'(I4,9H         ,A3,F15.6)') (IALPH,STRG(IALPH)
c$$$     $      ,CI(IORD(IALPH),I),IALPH=1,NBAS)
       WRITE(IOUQMC,'(I4,F15.6,3H   ,A3)') (IALPH,CI(IORD(IALPH),I)
     $      ,STRG(IALPH),IALPH=1,NBAS)
      END DO
C that's it
 
      CLOSE(IOUQMC)
      RETURN
      END
C
      SUBROUTINE NORMBF(NSHLF,IPST)
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /POLYTA/ FAC(NLMAX+NLMAX),FACC(NLMAX)
C the (2l+1)!! and the (l+|m|)!
C
C we normalize the functions x^l \sum_i c_i exp{-a_i * (r^2))} to unity
C this gives as factor:
C
C sqrt[(\pi^{3/2}*(2l-1)!! / 2^l) * \sum_{ij} c_i c_j / ((a_i + a_j)^(l+3/2))]
C
C in general this will be multiplied by
C
C sqrt[ (l+|m|)! / ((2-\delta_{m0})*(l-|m|)! ) ], a factor of 1 for m=0
C
C this is the prefactor for the solid harmonics
C
C
C well, we normalize here primitives to 1 and contractions modulo the
c individual norm of the primitives
C
      XNRM=0.D0
C 0: s, 1: p,  ...
      LVAL=IL(NSHLF)
      NPRIMM=NPRIM(NSHLF)
      EPS=1.D-9
      PI=2.0D0*ACOS(0.D0)
      XVAL=DBLE(LVAL)
      LVAL=LVAL+1
      PIF=FACC(LVAL)*(PI**1.5D0)
      PIF=(2.D0**XVAL)/PIF
CD    WRITE(6,*) 'NORMBF',LVAL,IPST,NPRIM,EXX(IPST),FACC(LVAL)
C
      IF (NPRIMM.EQ.1) THEN
CD     CCC=(2.D0*EXX(IPST))**(XVAL+1.5D0)
CD     COEFF(IPST)=SQRT(PIF*CCC)
       COEFF(IPST)=1.D0
CD     WRITE(6,*) ' a) LVAL,COEFF,EXP',IPST,LVAL-1,COEFF(IPST),EXX(IPST)
      ELSE
       CCC=0.D0
       DO IP=IPST,IPST+NPRIMM-1
        CIP=COEFF(IP)
        DIP=SQRT((2.D0*EXX(IP))**(XVAL+1.5D0))
        DO JP=IPST,IPST+NPRIMM-1
         EXXX=1.D0/(EXX(IP)+EXX(JP))
         CJP=COEFF(JP)
         DJP=SQRT((2.D0*EXX(JP))**(XVAL+1.5D0))
         CCC=CCC+CIP*CJP*DIP*DJP*(EXXX**(XVAL+1.5D0))
        END DO
       END DO
       DO IP=IPST,IPST+NPRIMM-1
        COEFF(IP)=COEFF(IP)/SQRT(CCC)
CD      WRITE(6,*) ' b) LVAL,COEFF,EXP',IP,LVAL-1,COEFF(IP),EXX(IP)
       END DO
      END IF
      RETURN
      END
C
      SUBROUTINE FFCAL
      INCLUDE 'param.h'                                                 
      COMMON /POLYTA/ FAC(NLMAX+NLMAX),FACC(NLMAX)
C
C the (2l-1)!! and the (l+|m|)!
C first the (2l-1)!!
C
      FACC(1)=1.D0
      DO L=2,NLMAX
       FACC(L)=FACC(L-1)*DBLE(L+L-3)
      END DO
C
      FAC(1)=1.D0
      FAC(2)=1.D0
      DO I=3,NLMAX+NLMAX
       XMLT=DBLE(I-1)
       FAC(I)=XMLT*FAC(I-1)
      END DO
C
CD    DO L=1,NLMAX
CD     WRITE(6,*) ' L, FAC(L), FACC(L) ',L-1,FAC(L),FACC(L)
CD    END DO
CD    DO L=1+NLMAX,NLMAX+NLMAX
CD     WRITE(6,*) ' L, FAC(L)          ',L-1,FAC(L)
CD    END DO
C
      RETURN
      END
C
      SUBROUTINE EXTREM
C
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
      COMMON /EXTRE/ CIEX(NBASM,NBASM),CITMP(NBASM,NBASM)               
C..   INCLUDE 'common_extreme.h'                                        
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      DIMENSION XLAMBD(NBASM,NBASM)
C
      WRITE(6,*)
      WRITE(6,*) ' creating projected occupied orbitals '
      WRITE(6,*)
      WRITE(6,*) ' the original orbitals '
      CALL PFUNC(CI,NOCC,NBAS)
 
C XLAMBD is a working array, the first NOCC vectors are the new orbitals
 
      OPEN(UNIT=25,FILE='PROJECTION.OCC',FORM='FORMATTED',STATUS
     $     ='UNKNOWN')
 
      CALL PROJEC(CI,NOCC,NBAS,XLAMBD)
 
      CLOSE(UNIT=25)
 
      DO I=1,NOCC
       ORBEN(I)=DBLE(I)
       DO IALPH=1,NBAS
        CI(IALPH,I)=XLAMBD(IALPH,I)
       END DO
      END DO
 
C invert notion occupied and virtual
 
      IF (.NOT.LNOVIRT) THEN
       WRITE(6,*) ' creating projected virtual orbitals '
       WRITE(6,*)
       NVIRT=NBAS-NOCC
       OPEN(UNIT=25,FILE='PROJECTION.VIRT',FORM='FORMATTED',STATUS
     $      ='UNKNOWN')
       CALL PROJEC(CI(1,NOCC+1),NVIRT,NBAS,XLAMBD)
       CLOSE(UNIT=25)
C
       DO I=NOCC+1,NBAS
        ORBEN(I)=DBLE(I)
        DO IALPH=1,NBAS
         CI(IALPH,I)=XLAMBD(IALPH,I-NOCC)
        END DO
       END DO
      END IF
C
      CALL PFUNC(CI,NBAS,NBAS)
C
      CALL WVEXTR
 
      IF (LSTAT) CALL STATAN('EXTN')
C
      IF (LMOLD) THEN
       CALL FFCAL
       CALL MOLDEN('EXTN')
      END IF
C
      IF (LQMC) THEN
       CALL OUTQMC
      ELSE
C we orthogonalize and verify if the vector spaces were well orthogonal
       WRITE(6,*) ' orthogonalizing occupied space '
       CALL SHALF(CI,NOCC,NBAS)
C
       NVIRT=NBAS-NOCC
       WRITE(6,*) ' orthogonalizing virtual space '
       CALL SHALF(CI(1,NOCC+1),NVIRT,NBAS)
C we use again the dummy array XLAMBD
       DO IALPH=1,NBAS
        DO IBETA=1,NBAS
         XLAMBD(IALPH,IBETA)=SAO(IALPH,IBETA)
        END DO
       END DO
       CALL TRANS(XLAMBD,CI,NBAS,NBAS)
C
C largest element coupling the two spaces
       SMX=0.D0
       DO I=1,NOCC
        DO J=NOCC+1,NBAS
         SSS=ABS(XLAMBD(I,J))
         IF (SSS.GT.SMX) SMX=SSS
        END DO
       END DO
       WRITE(6,*)
       WRITE(6,*) ' largest overlap coupling occupied '
     $      ,'and virtual orbital spaces: ',SMX
       WRITE(6,*)
C
C and what about the Fock matrix elements?
C
       DO IALPH=1,NBAS
        DO IBETA=1,NBAS
         FMO(IALPH,IBETA)=FAO(IALPH,IBETA)
        END DO
       END DO
C
       CALL TRANS(FMO,CI,NBAS,NBAS)
C
       FMX=0.D0
       DO I=1,NOCC
        DO J=NOCC+1,NBAS
         FFF=ABS(FMO(I,J))
         IF (FFF.GT.FMX) FMX=FFF
        END DO
       END DO
       WRITE(6,*)
       WRITE(6,*) ' largest Fock matrix element coupling occupied '
     $      ,'and virtual orbital spaces: ',FMX
       WRITE(6,*)
C
C write Fock matrix
c$$$       OPEN(UNIT=17,FILE='MATRIX',FORM='FORMATTED',STATUS='UNKNOWN')
c$$$       DO I=1,NBAS
c$$$        DO J=1,NBAS
c$$$         WRITE(17,*) I,J,FMO(I,J)
c$$$        END DO
c$$$       END DO
c$$$       CLOSE(17)
C
      END IF
C
      RETURN
      END
C
      SUBROUTINE PROJEC(CI,NOCC,NBAS,XLAMBD)
      INCLUDE 'param.h'                                                 
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      COMMON /EXTRE/ CIEX(NBASM,NBASM),CITMP(NBASM,NBASM)               
C..   INCLUDE 'common_extreme.h'                                        
C
C on input we have CI(NBAS,*), on output XLAMBD, without having
C destroyed CI
C
      DIMENSION XLAMBD(NBASM,NBASM),CI(NBASM,*)
C
C local arrays
C
      DIMENSION XSPRD(NBASM),IPERM(NBASM),PTMP(NBASM,NBASM),CDUM1(NBASM)
     $     ,CDUM2(NBASM)
      CHARACTER*3 CPF
      CPF=' | '
C
C we have to construct 
C
C \Lambda_{\alpha\beta} = \delta_|alpha\beta}
C -\sum_{\gamma}S_{\alpha\gamma} P_{\beta\gamma}
C
C with  P_{\beta\gamma} = \sum_{n\in virt} c_{\beta\,n} c_{\gamma\,n}
C
C in fact we may just think one second: P(virt) = 1 - P(occ)
C so we do not have to look at the virtuals for projecting onto the occupied
C
 
      DO IALPH=1,NBAS
       DO IBETA=1,NBAS
        PTMP(IALPH,IBETA)=0.D0
        XLAMBD(IALPH,IBETA)=0.D0
       END DO
      END DO
C
      DO N=1,NOCC
       DO IALPH=1,NBAS
        CAN=CI(IALPH,N)
        DO IBETA=1,NBAS
         PTMP(IALPH,IBETA)=PTMP(IALPH,IBETA)+CAN*CI(IBETA,N)
        END DO
       END DO
      END DO
C
      DO IALPH=1,NBAS
       DO IGAMM=1,NBAS
        SSS=SAO(IALPH,IGAMM)
        DO IBETA=1,NBAS
         XLAMBD(IBETA,IALPH)= XLAMBD(IBETA,IALPH)+SSS*PTMP(IBETA,IGAMM)
        END DO
       END DO
      END DO
C
      write(6,*)
      write(6,*) ' Projection: '
C
c$$$      CALL PFUNC(XLAMBD,NBAS,NBAS)
C
C XLAMBD(IALPH,IBETA) is not XLAMBD(IBETA,IALPH)
C
C the new orbitals are XLAMBD(IALPH,I)
C
C we may eliminate the projections with zero length, assuming that the
C AOs are not linearly dependent
C
      NPROJ=NBAS
      IVEC=1
 100  CONTINUE
C calculate norm of vector IVEC
      SSS=0.D0
      DO IALPH=1,NBAS
       SSS=SSS+XLAMBD(IALPH,IVEC)*XLAMBD(IALPH,IVEC)
      END DO
      IF (SSS.LT.1.D-12) THEN
C exchange with vector NPROJ
       WRITE(6,*) ' VECTOR No',IVEC,' has zero length '
       DO IALPH=1,NBAS
        XLAMBD(IALPH,IVEC)=XLAMBD(IALPH,NPROJ)
       END DO
       NPROJ=NPROJ-1
C test again
       IF (IVEC.LT.NPROJ) GO TO 100
      END IF
      IVEC=IVEC+1
      IF (IVEC.LE.NPROJ) GO TO 100
C
C we end up here if IVEC=NPROJ
C
c$$$      CALL PFUNC(XLAMBD,NPROJ,NBAS)
 
      WRITE(6,*)
      WRITE(6,*) ' we have ',NPROJ,' remaining non-zero projections '
      WRITE(6,*)
C
C here we have to implement the localization criterion
C
C a criterion: we divide by the largest, and sum the coefficients
C      this will be largest for 1+1 (delocalized)
C      and smallest for         1+0 (completely localized)
C
      DO I=1,NPROJ
C find the largest
       XMX=0.D0
       DO IALPH=1,NBAS
        IF (ABS(XLAMBD(IALPH,I)).GT.XMX) XMX=ABS(XLAMBD(IALPH,I))
       END DO
C
       XSP=0.D0
       DO IALPH=1,NBAS
        XLAMBD(IALPH,I)=XLAMBD(IALPH,I)/XMX
        XSP=XSP+ABS(XLAMBD(IALPH,I))
c$$$        XSP=XSP+ABS(XLAMBD(IALPH,I))**0.25D0
       END DO
       XSPRD(I)=XSP
      END DO
C
C we write the projections to file 25, already open
 
      WRITE(25,*) NPROJ,NBAS
      DO I=1,NPROJ
       WRITE(25,9543) I
 9543  FORMAT('# Function No ',I5)
       WRITE(25,'(E21.12)') (XLAMBD(IALPH,I),IALPH=1,NBAS)
       WRITE(25,*)
      END DO
 
c$$$      CALL PFUNCL(XLAMBD,NPROJ,NBAS)
C
      write(6,*) ' normalizing the projections '
      CALL SNORM(XLAMBD,NPROJ,NBAS)
 
c$$$C here we have to implement the localization criterion
c$$$      DO I=1,NPROJ
c$$$       XSP=0.D0
c$$$       DO IALPH=1,NBAS
c$$$        XSP=XSP+XLAMBD(IALPH,I)**4.D0
c$$$       END DO
c$$$       XSPRD(I)=XSP
c$$$      END DO
C
C select the NOCC most localized ones
C order the orbitals according to the spread (heapsort)
C
      CALL HPSORT(XSPRD,IPERM,NPROJ)
 
C and store them in the right order in CITMP
      WRITE(6,*) ' Spread of the projected orbitals '
      WRITE(6,*)
      WRITE(6,'(4(I4,E12.4))') (I,XSPRD(I),I=1,NPROJ)
      WRITE(6,*) ' Permutations: '
      WRITE(6,*)
      DO I=1,NPROJ,18
       WRITE(6,'(1H|,18(I3,1H|))') (INDX,INDX=I,MIN(I+17,NPROJ))
       WRITE(6,'(1H|,18(A3,1H|))') (CPF,INDX=I,MIN(I+17,NPROJ))
       WRITE(6,'(1H|,18(I3,1H|))') (IPERM(INDX),INDX=I,MIN(I+17,NPROJ))
       WRITE(6,*)
      END DO
C
      DO I=1,NPROJ
       DO IALPH=1,NBAS
c$$$        CITMP(IALPH,IPERM(I))=XLAMBD(IALPH,I)
        CITMP(IALPH,I)=XLAMBD(IALPH,IPERM(I))
       END DO
      END DO
C
C recalculate spread ....
C
      DO I=1,NPROJ
C find the largest
       XMX=0.D0
       DO IALPH=1,NBAS
        IF (ABS(CITMP(IALPH,I)).GT.XMX) XMX=ABS(CITMP(IALPH,I))
       END DO
       XSP=0.D0
C number of very small coefficients
       NSM=0
       DO IALPH=1,NBAS
        XSP=XSP+ABS(CITMP(IALPH,I))/XMX
c$$$        XSP=XSP+ABS(XLAMBD(IALPH,I))**0.25D0
        IF (ABS(CITMP(IALPH,I)).LT.1.D-6) NSM=NSM+1
       END DO
       write(6,*) ' spread of function ',I,': ',XSP,NSM
      END DO
C
      CALL PFUNC(CITMP,NPROJ,NBAS)
C
C in PTMP is the overlap matrix of the 'new' orbitals
C
C now we start with the first two vectors and add vectors as long as we
C do not have NOCC different vectors. After adding we check if the set
C is still not linearly dependent. If yes, we skip the last vector added
C and take the next one.
C
C a first threshold, if this is too tight, we may lower it and restart
C the whole procedure
C
      THRESH=1.D-6
 
 2000 CONTINUE
 
      NVEC=2
      IOFF=0
 1002 CONTINUE
C Calculate the determinant of the new overlap matrix
      DO I=1,NBAS
       DO J=1,NBAS
        PTMP(I,J)=SAO(I,J)
       END DO
      END DO
      CALL TRANS(PTMP,CITMP,NVEC,NBAS)
C
C we need only the eigenvalues, and only the smallest of the symmetric
C matrix
C the sorting array XSRT is not necessary any more, we use it for the eigenvalues
C XLAMBD becomes a dummy array
      IMATZ=0
      CALL RS(NBASM,NVEC,PTMP,XSPRD,IMATZ,XLAMBD,CDUM1,CDUM2,IERR)
C
      WRITE(6,*) ' eigenvalues: '
      WRITE(6,'(4(I4,E12.4))') (I,XSPRD(I),I=1,NVEC)
      WRITE(6,*)
 
      IF (XSPRD(1).LE.THRESH) THEN
       IOFF=IOFF+1
       IF (NVEC+IOFF.GT.NBAS) THEN
C if we ran out of vectors we have to loosen the threshold and restart
        THRESH=THRESH*0.1D0
        WRITE(6,*)
        WRITE(6,*)  ' restarting with a new threshold: ',thresh
        WRITE(6,*)
        GO TO 2000
       END IF
       WRITE(6,*) ' adding function No ',NVEC+IOFF,' for ',NVEC
       WRITE(6,*)
       DO IALPH=1,NBAS
        CDUM=CITMP(IALPH,NVEC)
        CITMP(IALPH,NVEC)=CITMP(IALPH,NVEC+IOFF)
        CITMP(IALPH,NVEC+IOFF)=CDUM
       END DO
       GO TO 1002
      ELSE
       NVEC=NVEC+1
       IF (NVEC.LE.NOCC) THEN
        WRITE(6,*) ' adding function No ',NVEC
        GO TO 1002
       END IF
      END IF
C
c$$$      WRITE(6,*)
c$$$      WRITE(6,*)
c$$$      WRITE(6,*)  ' after the reduction: '
c$$$      WRITE(6,*)
c$$$      WRITE(6,*)
c$$$      CALL PFUNC(CITMP,NOCC,NBAS)
C
C normalize them for conserving the Slater determinant
C the result is returned in XLAMBD
C
C assigning functions, we use again XLAMBD for that purpose
C
C we don''t have to change the functions, it is just sufficient to
C assure that there is a 1-to-1 assignement for the normation
C
      DO I=1,NOCC
       DO J=1,NOCC
        XLAMBD(I,J)=0.D0
       END DO
      END DO
C
      DO I=1,NOCC
       DO IALPH=1,NBAS
        CAI=CI(IALPH,I)
        DO IBETA=1,NBAS
         SAI=CAI*SAO(IALPH,IBETA)
         DO J=1,NOCC
          CBJ=CITMP(IBETA,J)
          XLAMBD(I,J)=XLAMBD(I,J)+SAI*CBJ
         END DO
        END DO
       END DO
      END DO
C
      WRITE(6,*)
      WRITE(6,*) ' the overlap matrix: horiz.: '
     $     ,'read vectors, vert.: projections '
      WRITE(6,*)
      CALL PFUNC(XLAMBD,NOCC,NOCC)
      WRITE(6,*)
C
      DO I=1,NOCC
       INDX=0
       INDXO=0
       SSS=0.D0
       DO J=I,NOCC
        IF (ABS(XLAMBD(J,I)).GT.SSS) THEN
         INDX=J
         SSS=ABS(XLAMBD(J,I))
        END IF
       END DO
 9215  FORMAT('  exchanging row ',I4,' and ',I5,': elements ',2F14.9)
C is the element negative?
       IF (XLAMBD(INDX,I).LE.0.D0) THEN
        MULT=-1
       ELSE
        MULT=1
       END IF
       XMULT=DBLE(MULT)
       IF (INDX.NE.I) THEN
C exchange row I and row INDX in HERMAT
        WRITE(6,9215) I,MULT*INDX,XLAMBD(I,I),XLAMBD(INDX,I)
        DO K=1,NOCC
         CDUM=XLAMBD(I,K)
         XLAMBD(I,K)=XLAMBD(INDX,K)*XMULT
         XLAMBD(INDX,K)=CDUM
        END DO
       ELSE
        IF (MULT.EQ.-1) THEN
         D=-D
         WRITE(6,9215) I,-I,XLAMBD(I,I),-XLAMBD(I,I)
         DO K=1,NOCC
          XLAMBD(I,K)=XMULT*XLAMBD(I,K)
         END DO
        END IF
       END IF
      END DO
C
      WRITE(6,*)
      WRITE(6,*)
     $    ' diagonal of the overlap matrix after reordering '
      WRITE(6,'(5(I4,F14.8))') (I,XLAMBD(I,I),I=1,NOCC)
      WRITE(6,*)
C
      DO I=1,NOCC
       SSS=XLAMBD(I,I)
       DO IALPH=1,NBAS
        XLAMBD(IALPH,I)=CITMP(IALPH,I)/SSS
       END DO
      END DO
C
      CALL TIMING('PROJ')
C
      RETURN
      END
C
      SUBROUTINE HPSORT(XSRT,IWRK,N)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
C sorting after criterion XSRT corresponding array of dimension N
C IWRK contains the permutation upon completion
      DIMENSION XSRT(N),IWRK(N)
C
      DO I=1,N
       IWRK(I)=I
      END DO
C
C SORT BY XSRT
      IF (N.LT.2) RETURN
      L=N/2+1
      IR=N
 10   CONTINUE
      IF (L.GT.1) THEN
       L=L-1
       IRA=IWRK(L)
       RRA=XSRT(L)
      ELSE
       IRA=IWRK(IR)
       RRA=XSRT(IR)
       XSRT(IR)=XSRT(1)
       IWRK(IR)=IWRK(1)
       IR=IR-1
       IF (IR.EQ.1) THEN
        IWRK(1)=IRA
        XSRT(1)=RRA
        RETURN
       END IF
      END IF
      I=L
      J=L+L
 20   IF(J.LE.IR)THEN
       IF(J.LT.IR)THEN
        IF(XSRT(J).LT.XSRT(J+1))J=J+1
       END IF
       IF(RRA.LT.XSRT(J))THEN
        IWRK(I)=IWRK(J)
        XSRT(I)=XSRT(J)
        I=J
        J=J+J
       ELSE
        J=IR+1
       END IF
       GOTO 20
      END IF
      XSRT(I)=RRA
      IWRK(I)=IRA
      GOTO 10
C
      END
C
      SUBROUTINE OUTQMC
      INCLUDE 'param.h'                                                 
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
C
      COMMON /POLYTA/ FAC(NLMAX+NLMAX),FACC(NLMAX)
C
      LOGICAL LI,LJ,LK,LL
      DIMENSION IVALPH(NBASM),IVBETA(NBASM)
C
      DIMENSION OWBUF(NPRIMX*(NLMAX+NLMAX+1)),
     -     IWBUF(NPRIMX*(NLMAX+NLMAX+1)),XNBUF(NPRIMX*(NLMAX+NLMAX+1))
 
      DIMENSION XNORM(NLMAX,-NLMAX:NLMAX),DNORM(NPRIMX*(NLMAX+NLMAX+1))
      DIMENSION XCOEF(NLMAX,-NLMAX:NLMAX)
 
      CHARACTER*16 CSTRI(NLMAX,-NLMAX:NLMAX)
      CHARACTER*2 SYMBAT(0:92)
      INTEGER*2 SYMLEN(0:92)
      DIMENSION NSHLT(NLMAX,NATMX),COPRIM(NPRIMX),IZENTR(NSHLMX)
      CHARACTER*1 CST(10),CBUCH(0:9)
      DATA CST /'S','P','D','F','G','H','I','J','K','L'/
      DATA CBUCH /'0','1','2','3','4','5','6','7','8','9'/
      DATA SYMBAT/   'XX','H ','HE','LI','BE','B ','C ','N ',
     1'O ','F ','NE','NA','MG','AL','SI','P ','S ','CL','AR',
     2'K ','CA','SC','TI','V ','CR','MN','FE','CO','NI','CU',
     3'ZN','GA','GE','AS','SE','BR','KR','RB','SR','Y ','ZR',
     4'NB','MO','TC','RU','RH','PD','AG','CD','IN','SN','SB',
     5'TE','I ','XE','CS','BA','LA','CE','PR','ND','PM','SM',
     6'EU','GD','TB','DY','HO','ER','TM','YB','LU','HF','TA',
     7'W ','RE','OS','IR','PT','AU','HG','TL','PB','BI','PO',
     8'AT','RN','FR','RA','AC','TH','PA','U '/
      DATA SYMLEN/   2,1,2,2,2,1,1,1,
     1     1,1,2,2,2,2,2,1,1,2,2,
     2     1,2,2,2,1,2,2,2,2,2,2,
     3     2,2,2,2,2,2,2,2,2,1,2,
     4     2,2,2,2,2,2,2,2,2,2,2,
     5     2,1,2,2,2,2,2,2,2,2,2,
     6     2,2,2,2,2,2,2,2,2,2,2,
     7     1,2,2,2,2,2,2,2,2,2,2,
     8     2,2,2,2,2,2,2,1/
 
      CSTRI(1,0)  = 'S 1             '
      CSTRI(2,-1) = 'P Y             '
      CSTRI(2,1)  = 'P X             '
      CSTRI(2,0)  = 'P Z             '
      CSTRI(3, 2) = 'D XX-YY         '
      CSTRI(3, 1) = 'D XZ            '
      CSTRI(3, 0) = 'D 3ZZ-RR        '
      CSTRI(3,-1) = 'D YZ            '
      CSTRI(3,-2) = 'D XY            '
 
      CSTRI(4, 3) = 'F X(XX-3YY)     '
      CSTRI(4, 2) = 'F Z(XX-YY)      '
      CSTRI(4, 1) = 'F X(5ZZ-RR)     '
      CSTRI(4, 0) = 'F Z(5ZZ-RR)     '
      CSTRI(4,-1) = 'F Y(5ZZ-RR)     '
      CSTRI(4,-2) = 'F XYZ           '
      CSTRI(4,-3) = 'F Y(3XX-YY)     '
 
      CSTRI(5, 4)='G X(XX-3YY)     '
      CSTRI(5, 3)='G X(XX-3YY)     '
      CSTRI(5, 2)='G Z(XX-YY)      '
      CSTRI(5, 1)='G X(5ZZ-RR)     '
      CSTRI(5, 0)='G Z(5ZZ-RR)     '
      CSTRI(5,-1)='G Y(5ZZ-RR)     '
      CSTRI(5,-2)='G XYZ           '
      CSTRI(5,-3)='G Y(3XX-YY)     '
      CSTRI(5,-4)='G X(XX-3YY)     '
 
      XCOEF(1, 0)= 1.0D0
      XCOEF(2,-1)= 1.0D0
      XCOEF(2, 0)= 1.0D0
      XCOEF(2, 1)= 1.0D0
      XCOEF(3, 2)= 3.0D0
      XCOEF(3, 1)= 3.0D0
      XCOEF(3, 0)= 0.5D0
      XCOEF(3,-1)= 3.0D0
      XCOEF(3,-2)= 6.0D0
      XCOEF(4, 3)=15.0D0
      XCOEF(4, 2)=15.0D0
      XCOEF(4, 1)= 1.5D0
      XCOEF(4, 0)= 0.5D0
      XCOEF(4,-1)= 1.5D0
      XCOEF(4,-2)=30.0D0
      XCOEF(4,-3)=15.0D0
 
      WRITE(6,*)
      WRITE(6,*) '-------------------------------------------------'
      WRITE(6,*) '--- Q M C ----------- Q M C----------------------'
      WRITE(6,*) '-------------------------------------------------'
C
C this piece of code is from ICMP.
C
C
C two files for the same information are opened:
C  QMCDETLST_???? contains all relevant data and
C
C  qmcin_???? contains the input file for the program of Michel
C
C the files are of the following structure:
C
C   QMCDETLST_????: number of atoms, positions, basis, determiniants
C
C   qmcin_????: number of atoms, positions, #determinants, Jastrows,
C      basis, determinants
C
C so we determine already here the number of determinants in the
C expansion
C
C
      IOUQMC=57
      IINQMC=59
      OPEN(UNIT=IOUQMC,FILE='QMCDETLST',FORM='FORMATTED',STATUS
     $     ='UNKNOWN')
      CLOSE(IOUQMC,STATUS='DELETE')
      OPEN(UNIT=IOUQMC,FILE='QMCDETLST',FORM='FORMATTED',STATUS
     $     ='NEW')
      OPEN(UNIT=IINQMC,FILE='qmcin',FORM='FORMATTED',STATUS
     $     ='UNKNOWN')
      CLOSE(IINQMC,STATUS='DELETE')
      OPEN(UNIT=IINQMC,FILE='qmcin',FORM='FORMATTED',STATUS
     $     ='NEW')
      WRITE(IOUQMC,*) '  Information written for a Hartree-Fock run'
      WRITE(IOUQMC,*) ' ============================================'
      WRITE(IOUQMC,*)
C
C we give the whole information to a file, i.e. basis set, position and
C kind of atoms ... for this purpose we have to reread the system input,
C normalize basis functions, break Gaussians down ....
C
      CALL FFCAL
C
C all the basis set data is present from the beginning
C
C IOUQMC is a more general file with all necessary information
      WRITE(IOUQMC,8001) NATOM
C IINQMC is the input file for the program of Michel Caffarel
      WRITE(IINQMC,8101) NATOM
 8001 FORMAT(' Number of atoms in the Molecule',/,I5)
 8101 FORMAT('************************************',/
     $     ,'Begin: Describe molecule',/
     $     ,'************************************',/,'Number of nuclei',
     $     /,I4,/,'Charge and position of nuclei')
      WRITE(6,*)
C
      NUMDET=1
      NSHL=0
      NBASY=0
      LMAX=0
      IPRIM=0
      NPRIMT=0
      DO IAT=1,NATOM
       DO ITYPE=1,NLMAX
        NSHLT(ITYPE,IAT)=0
       END DO
       NUMAT=NZ(IAT)
       WRITE(IOUQMC,8002) SYMBAT(NUMAT),NUMAT,(POS(J,IAT),J=1,3)
       WRITE(IINQMC,8102) NUMAT,(POS(J,IAT),J=1,3)
 8002  FORMAT(' Atomic Symbol :',A,' nuclear charge '/,I5,/
     $      ,' Position of this atom in a.u.',/,3(F20.12),/)
 8102 FORMAT(I4,3F20.12)
C
      WRITE(IOUQMC,8003)
 8003  FORMAT(' Original Contracted Basis of that atom,'
     $      ,' functions normalized (w.r.t. primtives)')
       DO ISH=1,NSH(IAT)
        NSHL=NSHL+1
        IZENTR(NSHL)=IAT
        ITYPE=IL(NSHL)
        NPRIMT=NPRIMT+(ITYPE+ITYPE+1)*NPRIM(NSHL)
 
        WRITE(IOUQMC,8004) ITYPE,NPRIM(NSHL),NSHL,CST(ITYPE+1)
 8004   FORMAT(2I5,'    ( contraction No',I4,' type ',A,' )')
 
        LMAX=MAX(ITYPE+1,LMAX)
        NSHLT(ITYPE+1,IAT)=NSHLT(ITYPE+1,IAT)+1
        NBASY=NBASY+ITYPE+ITYPE+1
        IPST=IPRIM+1
        CALL NORMBF(NSHL,IPST)
        DO III=0,NPRIM(NSHL)-1
         WRITE(IOUQMC,'(2F20.12)') EXX(IPST+III),COEFF(IPST+III)
        END DO
        IPRIM=IPRIM+NPRIM(NSHL)
       END DO
      END DO
 
      WRITE(IOUQMC,*)
      WRITE(IOUQMC,*) ' SPECIFIC NORMATION FACTORS: '
      WRITE(IOUQMC,*) ' L  M           FACTOR        FUNCTION '
      DO L=1,LMAX
       DO M=-L+1,L-1
        XNORM(L,M)=FAC(L-ABS(M))/FAC(L+ABS(M))
c$$$         WRITE(IOUQMC,*) ' L, M, (L-|M|)!, (L+|M|)! ',L-1,M, FAC(L-ABS(M))
c$$$     $        ,FAC(L+ABS(M))
        IF (M.NE.0) XNORM(L,M)=XNORM(L,M)*2.0D0
        XNORM(L,M)=XNORM(L,M)*XCOEF(L,M)
        WRITE(IOUQMC,8006) L-1,M,XNORM(L,M),CSTRI(L,M)
       END DO
      END DO
 8006 FORMAT(2I3,F20.12,'   ',A)
      WRITE(IOUQMC,*)
C
      WRITE(6,*) ' NBAS  =',NBASY
      WRITE(6,*) ' NOCC  =',NOCC
      WRITE(6,*) ' LMAX  =',LMAX
      WRITE(6,*) ' NSHL  =',NSHL
      WRITE(6,*) ' NPRIM =',(NPRIM(I),I=1,NSHL)
      WRITE(6,*) ' NPRIMT =',NPRIMT
C
      WRITE(IINQMC,8103) 2*NOCC,NOCC,NOCC
      WRITE(IINQMC,8104)
      WRITE(IINQMC,8105) NUMDET
 8103 FORMAT('Number of electrons',/,I4,/
     $     ,'Number of elect. alpha and beta',/,2I4)
 8104 FORMAT('************************************',/
     $     ,'Begin: Wave function',/
     $     ,'***************************************************',/
     $     ,'Simple Jast factor: enter 1; Sophis. Jast : enter 0',/,'1',
     $     /,'************************************',/
     $     ,'Pseudo: enter 1; No Pseudos : enter 0',/,'0',/
     $     ,'***************************************************')
 8105 FORMAT('Number of configurations:',/,I4,/
     $     ,'******************************************',/
     $     ,'STARTING READING PARAMETERS SIMPLE JASTROW',/
     $     ,'******************************************',/
     $     ,'Parameters of simple Jastrow function: ')
 8106 FORMAT(2I3,F10.6)
 8107 FORMAT('Number of parameters:',/,I4,/
     $     ,'END READING PARAMETERS SIMPLE JASTROW',/
     $     ,'**************************************************',/
     $     ,'BEGINNING READING PARAMETERS SOPHISTICATED JASTROW',/
     $     ,'**************************************************',/
     $     ,'Parameters of sophisticate Jastrow function:')
C
      NJASIM=4+NATOM
      NJASOF=23+5*NATOM
      IZERO=0
      ZERO=0.D0
      DO IDET=1,NUMDET
       DO IPAR=1,NJASIM
        WRITE(IINQMC,8106) IPAR,IZERO,ZERO
       END DO
      END DO
      WRITE(IINQMC,8107) NJASIM
      DO IDET=1,NUMDET
       DO IPAR=1,NJASOF
        WRITE(IINQMC,8106) IPAR,IZERO,ZERO
       END DO
      END DO
      WRITE(IINQMC,8108) NJASOF
 8108 FORMAT('Number of parameters',/,I4,/
     $     ,'END READING PARAMETERS SOPHISTICATED JASTROW',/
     $     ,'**********************************',/,'Theta',/,'0.',/
     $     ,'Atomic basis functions with or without normalization'
     $     ,' prefactor',/
     $     ,'1----> with prefactor    0-----> without prefactor',/,'0')
C
C that is all for the zeroed Jastrow
C
      WRITE(6,*)
      WRITE(IINQMC,8109) NPRIMT
 8109 FORMAT('Nombre de fonctions de base:',/,I5,/
     $     ,'Center Type Case exponent')
 8110 FORMAT(3I6,F20.12,'   ',A16)
C
C reconstruct the angular momenta of the basis functions
C
C we assume that they are ordered with respect to angular momenta
C
      WRITE(6,*) ' THE BASIS FUNCTIONS AND THEIR ANGULAR MOMENTA '
      WRITE(6,*)
      WRITE(6,*) '    IBAS  CENTER  L   M '
      WRITE(6,*) ' ============================'
      IBAS=0
      DO IAT=1,NATOM
       DO ILL=1,LMAX
         DO ILY=1,NSHLT(ILL,IAT)
          DO IKK=-ILL+1,ILL-1
           IBAS=IBAS+1
           WRITE(6,9221) IBAS,IAT,CST(ILL),IKK
          END DO
         END DO
       END DO
      END DO
      WRITE(6,*)
     $     ' ====================================================== '
      WRITE(6,*)
 9221 FORMAT(2X,I6,I7,4X,A1,I6)
      WRITE(6,*)
      WRITE(6,*)
      WRITE(6,*) 'AT THE LEVEL OF PRIMITIVES: '
      WRITE(6,*)
      WRITE(6,*) ' IPCOUNT IPRIM CENTR L  '
     $     ,'M      Exp     old Coeff       new Coeff'
      WRITE(6,*) ' ================================'
     $     ,'========================================= '
C
      WRITE(IOUQMC,*)
      WRITE(IOUQMC,*)
     $     ' IPRIM CENTER  L  M      EXPONENT           TYPE '
 
      IPRIM=0
      ISHL=0
      IPCOUNT=0
      IBAS=0
 
      DO IAT=1,NATOM
       DO ILL=1,LMAX
        DO ILY=1,NSHLT(ILL,IAT)
         ISHL=ISHL+1
         LVAL=IL(ISHL)
         NPRIML=NPRIM(ISHL)
         IPST=IPRIM
         DO IKK=-ILL+1,ILL-1
          IPRIM=IPST
          IBAS=IBAS+1
          DO III=1,NPRIML
           IPRIM=IPRIM+1
           EXPO=EXX(IPRIM)
           IPCOUNT=IPCOUNT+1
           WRITE(6,9222) IPCOUNT,IPRIM,IAT,LVAL,IKK,EXPO
     $          ,COEFF(IPRIM),COEFF(IPRIM)*XNORM(LVAL+1,IKK)
           WRITE(IOUQMC,9223) IPCOUNT,IAT,LVAL,IKK,EXPO,
     -          CSTRI(LVAL+1,IKK)
 
           WRITE(IINQMC,8110) IAT,LVAL+9,IKK,EXPO,CSTRI(LVAL+1,IKK)
 
           CALL NORM_PRIM(EXPO,LVAL,IKK,DCOEFF)
 
           XNBUF(IPCOUNT)=COEFF(IPRIM)*DCOEFF*XCOEF(LVAL+1,IKK)
           IF (ABS(XNBUF(IPCOUNT)).LE.1.D-6) WRITE(6,*) ' DOUBTFUL :'
     $          ,COEFF(IPRIM),DCOEFF,XCOEF(LVAL+1,IKK)
           IWBUF(IPCOUNT)=IBAS
          END DO
         END DO
C          WRITE(6,*) ' A LA FIN :',IPRIM,IPST+NPRIML
         IPRIM=IPST+NPRIML
        END DO
 
       END DO
      END DO
 9222 FORMAT(I6,I6,I7,I4,I3,F15.8,F12.8,' ->',F12.8)
 9223 FORMAT(I6,I7,I4,I3,F20.12,'   ',A)
 9224 FORMAT(I6,I5,I6,I5,I3,'   ',A)
C
      WRITE(6,*)
      WRITE(6,*) ' NORMALIZATION FACTORS OF THE INDIVIDUAL PRIMITIVES: '
      WRITE(6,*) ' Primitive   Basis     multiplicator '
      DO I=1,IPCOUNT
       WRITE(6,'(I10,I7,F20.12)') I,IWBUF(I),XNBUF(I)
      END DO
      WRITE(6,*)
      WRITE(6,*)
      WRITE(6,*)
     $     ' ===================================================='
      WRITE(6,*)
      WRITE(6,*) ' COUNTING M VALUES WE HAVE ',IPCOUNT,
     -     ' PRIMITIVE BASIS FUNCTIONS'	
      WRITE(6,*)
C
C we put down the list of determinants
C
      INUM=0
      IZERO=0
      ONE=1.D0
      IONE=1
      WRITE(IOUQMC,8008) IONE,(IZERO,J=1,4),ONE
      WRITE(6,8008) IONE,(IZERO,J=1,4),ONE
      WRITE(6,*)
 8008 FORMAT('   ',I8,':  (',2I5,' )  -->  (',2I5,' )  COEFF: ',F20.12)
C
      WRITE(IOUQMC,8009) EHF,ECORR,EHF+ECORR,PHP
 8009 FORMAT(' Hartree-Fock Energy: ',/,F20.12,/
     $     ,' Correlation Energy by the selected determinants: ',/,F20
     $     .12,/,' Total Energy: ',/,F20.12,/,' /: '
     $     ,/,F20.12,/)
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      WRITE(6,*)
      WRITE(6,*) ' THE REFERENCE '
      WRITE(6,*)
     $     ' ========================================================= '
      WRITE(6,*) ' ORBITALS:'
      CALL PFUNC(CI,NOCC,NBAS)
      WRITE(6,*)
      WRITE(6,*) ' EXPANDED ORBITALS:'
      DO IORB=1,NOCC
       CALL EXPNND(CI(1,IORB),OWBUF,IWBUF,XNBUF,IPCOUNT)
       WRITE(6,9901) IORB,'alpha spin',(OWBUF(IPRIM),IPRIM=1,IPCOUNT)
      END DO
      DO IORB=1,NOCC
       CALL EXPNND(CI(1,IORB),OWBUF,IWBUF,XNBUF,IPCOUNT)
       WRITE(6,9901) IORB,'beta spin ',(OWBUF(IPRIM),IPRIM=1,IPCOUNT)
      END DO
      WRITE(6,*)
 
      INUM=1
      ONE=1.D0
      WRITE(IOUQMC,9000) INUM,ONE
      WRITE(IINQMC,8111) INUM,INUM+NJASIM,IZERO,ONE
 9000 FORMAT(' Determinant ',I5,' Weight and coefficients ',/,F20.12)
C
      WRITE(6,*) ' WRITING DETERMINANT ',IDET,' ON FILE ... '
 8111 FORMAT('Determinant   ',I4,' Weight and coefficients ',/,
     -     2I4,F20.12)
C
      DO II=1,NOCC
       IVALPH(II)=II
       IVBETA(II)=II
      END DO
C
      DO IORB=1,NOCC
       CALL EXPNND(CI(1,IVALPH(IORB)),OWBUF,IWBUF,XNBUF,IPCOUNT)
       WRITE(IOUQMC,9901) IORB,'alpha spin',(OWBUF(IPRIM)
     $      ,IPRIM=1,IPCOUNT)
       WRITE(IINQMC,8112) IORB,'alpha spin',(OWBUF(IPRIM)
     $      ,IPRIM=1,IPCOUNT)
      END DO
      DO IORB=1,NOCC
       CALL EXPNND(CI(1,IVBETA(IORB)),OWBUF,IWBUF,XNBUF,IPCOUNT)
       WRITE(IOUQMC,9901) IORB,'beta spin',(OWBUF(IPRIM)
     $      ,IPRIM=1,IPCOUNT)
       WRITE(IINQMC,8112) IORB,'beta spin',(OWBUF(IPRIM)
     $      ,IPRIM=1,IPCOUNT)
      END DO
 9901 FORMAT(' Molecular orbital No ',I3,'  ',A,/,3(F20.12))
 8112 FORMAT(' Molecular orbital No ',I3,'  ',A,/,3(F23.17))
      CLOSE(IOUQMC)
      CLOSE(IINQMC)
C
      RETURN
      END
C
      SUBROUTINE EXPNND(CI,OWBUF,IWBUF,XNBUF,IPCOUNT)
      INCLUDE 'param.h'                                                 
      DIMENSION CI(*),IWBUF(IPCOUNT),XNBUF(IPCOUNT),OWBUF(IPCOUNT)
C
      DO I=1,IPCOUNT
       OWBUF(I)=CI(IWBUF(I))*XNBUF(I)
      END DO
      RETURN
      END
C
      SUBROUTINE NORM_PRIM(EXPON,LVAL,MVAL,FACTOR)
      INCLUDE 'param.h'                                                 
      COMMON /POLYTA/ FAC(NLMAX+NLMAX),FACC(NLMAX)
C
C here we normalize a primitive Gaussian function
C
C sqrt[
C l-dependent:
C         2^l*(2a)^(l+3/2)/(pi^3/2 (2l-1)!!)
C m-dependent:
C          [(l-|m|)!/(l+|m|)!] * (2-delta_m0)
C       ]
C
      PI=2.0D0*ACOS(0.D0)
      XVAL=DBLE(LVAL)
      PIF=FACC(LVAL+1)*(PI**1.5D0)
CD    WRITE(6,*) ' FACC, PI ',FACC(LVAL+1),PI
      PIF=(2.D0**XVAL)/PIF
      CCC=(2.D0*EXPON)**(XVAL+1.5D0)
      XMVAL=FAC(LVAL-ABS(MVAL)+1)/FAC(LVAL+ABS(MVAL)+1)
      IF (MVAL.NE.0) XMVAL=XMVAL*2.D0
      FACTOR=SQRT(PIF*CCC*XMVAL)
CD    WRITE(6,*) ' NORM_PRIM: L,M,EXPON,XMVAL,FACTOR ',LVAL,MVAL,EXPON
CD   $     ,XMVAL,FACTOR
      RETURN
      END
C
      subroutine baryzcal(CI,NVECT,BARYZ)
      INCLUDE 'param.h'                                                 
      COMMON /CBOYS/ DIPOL(NBASM,NBASM,3)                               
C..   INCLUDE 'common_boys.h'                                           
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
      DIMENSION CI(NBASM,NVECT),BARYZ(NBASM,3)
C
C get the dipole matrix elements
C
 
      CALL RDMAT('DIPOL_X',DIPOL(1,1,1))
      CALL RDMAT('DIPOL_Y',DIPOL(1,1,2))
      CALL RDMAT('DIPOL_Z',DIPOL(1,1,3))
      CALL TRANS(DIPOL(1,1,1),CI,NVECT,NBAS)
      CALL TRANS(DIPOL(1,1,2),CI,NVECT,NBAS)
      CALL TRANS(DIPOL(1,1,3),CI,NVECT,NBAS)
 
      DO K=1,3
       DO I=1,NVECT
        BARYZ(I,K)=DIPOL(I,I,K)
       END DO
      END DO
 
      WRITE(6,*)
      WRITE(6,*)
      WRITE(6,9909)
 9909 FORMAT(/,'  baryzcal: barycenters of the orbitals '
     -     ,//,5x,'No',10x,'x',15x,'y',15x,'z',/)
      DO I=1,NVECT
       WRITE(6,9902) I,(baryz(I,K),K=1,3)
 9902  FORMAT(I6,3F16.8)
      END DO
      WRITE(6,*)
      WRITE(6,*)
 
      return
      end
 
      SUBROUTINE STATAN(type)
      INCLUDE 'param.h'                                                 
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
      LOGICAL LCUTCI(NBASM,NBASM)
      character*4 type
 
C we have to analyze the occupied and the virtual orbitals separately
 
C save the orbitals on file
      open(unit=12,file='vtmp',status='unknown',form='unformatted')
      write(12) ((ci(ialph,i),ialph=1,nbas),i=1,nbas)
      close(12)
 
C divide by the largest
      do i=1,nbas
       xmx=0.d0
       do ialph=1,nbas
        if (abs(ci(ialph,i)).gt.xmx) xmx=abs(ci(ialph,i))
       end do
       do ialph=1,nbas
        ci(ialph,i)=ci(ialph,i)/xmx
       end do
      end do
 
      WRITE(6,*)
      WRITE(6,*) ' simple statistical analysis '
      WRITE(6,*) ' - - - - - - - - - - - - - - - - - - - '
      WRITE(6,*)
      WRITE(6,*)
C
      call statdetail
C
      write(6,*)
      write(6,*) ' statistical analysis including distances '
      write(6,*)
C renormalize the orbitals
      call snorm(ci,nbas,nbas)
C calculate the barycenters of the orbitals
      CALL BARYZCAL(ci,nbas,baryz)
 
      CUTlarge=1.d-2
C a model exponent
      expcut=widthg*widthg
      write(6,*)
      write(6,*) ' length unit is ',1.d0/widthg,' a.u.'
      write(6,*) ' Gaussian exp(-r^2/(2 sigma)) with sigma = ',0.5d0
     $     /expcut
      write(6,*)
 
C we scale every coefficient by exp(-expcut*(r-r_i)^2)
C but only if it is smaller than 10-2
 
      do i=1,nbas
 
       bx=baryz(i,1)
       by=baryz(i,2)
       bz=baryz(i,3)
C      write(6,*)  ' orbital i: bx by bz: ',i,bx,by,bz
 
       do ialph=1,nbas
        LCUTCI(IALPH,I)=.FALSE.
        if (abs(ci(ialph,i)).lt.cutlarge) then
         rx=pos(1,iatz(ialph))
         ry=pos(2,iatz(ialph))
         rz=pos(3,iatz(ialph))
         rr= (rx-bx)*(rx-bx) +  (ry-by)*(ry-by) +  (rz-bz)*(rz-bz)
         rex=expcut*rr
         if (rex.gt.25.d0) then
          ci(ialph,i)=0.d0
         else
          ci(ialph,i)=ci(ialph,i)*exp(-expcut*rr)
         end if
        end if
       end do
      end do
 
      do i=1,nbas
       do ialph=1,nbas
        if (abs(ci(ialph,i)).lt.cutorb) LCUTCI(IALPH,I)=.TRUE.
       end do
      end do
 
C divide by the largest
      do i=1,nbas
       xmx=0.d0
       do ialph=1,nbas
        if (abs(ci(ialph,i)).gt.xmx) xmx=abs(ci(ialph,i))
       end do
       do ialph=1,nbas
        ci(ialph,i)=ci(ialph,i)/xmx
       end do
      end do
 
      call statdetail
 
C  restore the orbitals
      open(unit=12,file='vtmp',status='old',form='unformatted')
      read(12) ((ci(ialph,i),ialph=1,nbas),i=1,nbas)
      close(12)
 
C put zeroes for the tails cut
      do i=1,nbas
       do ialph=1,nbas
        if (lcutci(ialph,i)) ci(ialph,i)=0.d0
       end do
      end do
      CALL WVCUT(TYPE)
 
C restore the orbitals
      open(unit=12,file='vtmp',status='old',form='unformatted')
      read(12) ((ci(ialph,i),ialph=1,nbas),i=1,nbas)
      close(12,status='delete')
 
      end
 
      subroutine statdetail
      INCLUDE 'param.h'                                                 
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
 
      PARAMETER (NCASE=20)
      DIMENSION KOCC(NCASE,NBASM)
 
      do i=1,nbas
       do icase=1,ncase
        kocc(icase,i)=0
       end do
       do ialph=1,nbas
        call getcas(ci(ialph,i),icase,ncase)
c$$$        write(6,*) ialph,i,icase,orbital(ialph,i)
        kocc(icase,i)=kocc(icase,i)+1
       end do
      end do
 
      izero=0
      write(6,'(i3,i7,19i4)') izero,(icase,icase=1,ncase)
      write(6,*) ' occupied orbitals '
      write(6,'(i4,i7,19i4)') (i,(kocc(icase,i),icase=1,ncase),i=1,nocc)
 
      do i=2,nocc
       do icase=1,ncase
        kocc(icase,1)=kocc(icase,1)+kocc(icase,i)
       end do
      end do
      write(6,*) ' sums '
C      write(6,'(i4,i7,19i5)') izero,(kocc(icase,1),icase=1,ncase)
      write(6,'(i7,i7)') (icase, kocc(icase,1),icase=1,ncase)
      write(6,*) '  '
      do icase=2,ncase
       kocc(icase,1)=kocc(icase-1,1)+kocc(icase,1)
      end do
      write(6,*) ' cumulatif '
C      write(6,'(i4,i7,19i6)') izero,(kocc(icase,1),icase=1,ncase)
      write(6,'(2i7)') (icase,kocc(icase,1),icase=1,ncase)
      write(6,*) '  '
      write(6,*) '  '
 
      IF (.not.lnovirt) then
       write(6,*) ' virtual orbitals '
       write(6,'(i4,i7,19i4)') (i,(kocc(icase,i),icase=1,ncase),i=nocc+1
     $      ,nbas)
       do icase=1,ncase
        kocc(icase,1)=0
       end do
       do i=1+nocc,nbas
        do icase=1,ncase
         kocc(icase,1)=kocc(icase,1)+kocc(icase,i)
        end do
       end do
       write(6,*) ' sums '
       write(6,'(i4,i7,19i6)') izero,(kocc(icase,1),icase=1,ncase)
       write(6,*) '  '
       do icase=2,ncase
        kocc(icase,1)=kocc(icase-1,1)+kocc(icase,1)
       end do
       write(6,*) ' cumulatif '
       write(6,'(i4,i7,19i7)') izero,(kocc(icase,1),icase=1,ncase)
       write(6,*) '  '
       write(6,*) '  '
      end if
 
      return
      end
 
      subroutine getcas(x,i,nmax)
      implicit double precision (a-h,o-z)
 
      amin=10**dble(-nmax)
      if (abs(x).lt.amin) then
       i=nmax
      else
       if (abs(x).gt.0.1d0) then
        i=1
       else
        xl10=log(10.D0)
        xl=log(abs(x))/xl10
        il=1-xl
        i=min(il,nmax)
        i=max(i,1)
       end if
      end if
      return
      end
C
      SUBROUTINE EXTRP(CIV,NVECT)
C
      INCLUDE 'param.h'                                                 
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
      COMMON /EXTRE/ CIEX(NBASM,NBASM),CITMP(NBASM,NBASM)               
C..   INCLUDE 'common_extreme.h'                                        
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
      COMMON /INTU/ SAO(NBASM,NBASM),FAO(NBASM,NBASM),FMO(NBASM,NBASM)  
     $     ,ORBEN(NBASM)                                                
C..   INCLUDE 'common_intu.h'                                           
      DIMENSION XLAMBD(NBASM,NBASM)
      DIMENSION CIV(NBASM,NVECT)
C
      WRITE(6,*)
      WRITE(6,*) ' projected orbitals '
      WRITE(6,*)
 
C XLAMBD is a working array, the first NOCC vectors are the new orbitals
 
      CALL PROJEC(CIV,NVECT,NBAS,XLAMBD)
 
C the projection is in XLAMBD
 
      DO IVECT=1,NVECT
       DO IALPH=1,NBAS
        CI(IALPH,IVECT)=XLAMBD(IALPH,IVECT)
       END DO
      END DO
C
      RETURN
      END
C
      SUBROUTINE PROJ6D
      INCLUDE 'param.h'                                                 
C                                                                       
      COMMON /FLOW/ EPS,WIDTHG,CUTORB,LCAN,LPIPM,LMOLD,LBOYS,LFRAGM     
     $     ,LEXTR,LQMC,LSTAT,LNOVIRT,L6D,LSMILE                         
      LOGICAL       LCAN,LPIPM,LMOLD,LBOYS,LFRAGM,LEXTR,LQMC,LSTAT      
     $     ,LNOVIRT,L6D,LSMILE                                          
C..   INCLUDE 'flow.h'                                                  
      COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT,POS(3,NATMX),NZ(NATMX)        
     $     ,IATZ(NBASM)                                                 
      COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),NSH(NATMX)                 
     $     ,NPRIM(NSHLMX),IL(NSHLMX),NPX(NLMAX,NATMX)                   
C..   INCLUDE 'common_syst.h'                                           
      COMMON /VECT/ CI(NBASM,NBASM),BARYZ(NBASM,3),IOCC(NBASM)          
     $     ,IOCCS(NBASM)                                                
C..   INCLUDE 'common_vect.h'                                           
 
      PARAMETER (NDIM6D=NBASM+20)
      DIMENSION VECT6D(NDIM6D,NBASM),DENS6D(NDIM6D,NDIM6D)
C
C this should become the interface routine to the Maeder-Claverie
C program MTPCOR
 
      WRITE(6,*)
      WRITE(6,*) ' projection onto cartesian functions '
      WRITE(6,*)
     $     ' preparation of input to multipole'
     $     ,' decomposition of Claverie'
      WRITE(6,*)
C
      IUNITW=13
      OPEN(UNIT=IUNITW,FILE='INPUT.MTPCOR',STATUS='UNKNOWN'
     $     ,FORM='FORMATTED')
      WRITE(IUNITW,9100) 'INTINP'
 9100 FORMAT(' &',A6,/,'  NEWSTYLE=T ',/,' &END')
C
C we add the SYSTEM.ORTHO FILE
      IPRIM=0
      NBAS6D=0
      NSHL=0
      WRITE(IUNITW,*) NATOM
      DO IAT=1,NATOM
       WRITE(IUNITW,9101) NZ(IAT),NSH(IAT),(POS(J,IAT),J=1,3)
       DO ISHL=1,NSH(IAT)
        NSHL=NSHL+1
        ILL=IL(NSHL)
        IF (ILL.EQ.0) THEN
         NBAS6D=NBAS6D+1
        ELSE IF (ILL.EQ.1) THEN
         NBAS6D=NBAS6D+3
        ELSE IF (ILL.EQ.2) THEN
         NBAS6D=NBAS6D+6
        ELSE IF (ILL.EQ.3) THEN
         NBAS6D=NBAS6D+10
        ELSE IF (ILL.EQ.4) THEN
         NBAS6D=NBAS6D+15
        ELSE
         WRITE(6,*) ' not yet beyond g functions '
        END IF
 
        WRITE(IUNITW,'(2I6)') ILL,NPRIM(NSHL)
        DO III=0,NPRIM(NSHL)-1
         IPRIM=IPRIM+1
         WRITE(IUNITW,'(F24.12,F20.12)') EXX(IPRIM),COEFF(IPRIM)
        END DO
       END DO
      END DO
 9101 FORMAT(I3,I6,3F20.12)
C
C write a dummy number for NORB in mtpcor
C
      WRITE(13,*) 123456
C
C write second namelist for mtpcor
C
      WRITE(13,9100) 'PRPINP'
C
      WRITE(6,*) ' we have ',NBAS  ,' spherical basis functions '
      WRITE(6,*) ' we have ',NBAS6D,' cartesian basis functions '
C
C do the expansion from spherical to cartesian Gaussians
C
      NSHL=0
      NBB=0
      NBB6D=0
      DO IAT=1,NATOM
       DO ISHL=1,NSH(IAT)
        NSHL=NSHL+1
        ILL=IL(NSHL)
C S
        IF (ILL.EQ.0) THEN
         NBAS6D=NBAS6D+1
         NBB=NBB+1
         NBB6D=NBB6D+1
         DO IORB=1,NOCC
          VECT6D(NBB6D,IORB)=CI(NBB,IORB)
         END DO
C P
        ELSE IF (ILL.EQ.1) THEN
C px, py, pz
         DO III=1,3
          NBB=NBB+1
          NBB6D=NBB6D+1
          DO IORB=1,NOCC
           VECT6D(NBB6D,IORB)=CI(NBB,IORB)
          END DO
         END DO
C D
        ELSE IF (ILL.EQ.2) THEN
C xy, yz, 3z2-r2, xz, x2-y2
C
C xx, yy, zz,     xy, xz,     yz
C
         DO IORB=1,NOCC
          VECT6D(NBB6D+1,IORB)=CI(NBB+5,IORB)-CI(NBB+3,IORB)
          VECT6D(NBB6D+2,IORB)=-CI(NBB+5,IORB)-CI(NBB+3,IORB)
          VECT6D(NBB6D+3,IORB)=2.D0*CI(NBB+1,IORB)
          VECT6D(NBB6D+4,IORB)=CI(NBB+1,IORB)
          VECT6D(NBB6D+5,IORB)=CI(NBB+4,IORB)
          VECT6D(NBB6D+6,IORB)=CI(NBB+2,IORB)
         END DO
         NBB=NBB+5
         NBB6D=NBB6D+6
        ELSE
         WRITE(6,*) ' projection not yet beyond f functions '
        END IF
       END DO
      END DO
 
c$$$
c$$$ DALTON output
c$$$
c$$$              +----------------------------------------------+
c$$$              ! Cartesian to spherical transformation matrix !
c$$$              +----------------------------------------------+
c$$$
c$$$                              Moment order: 2
c$$$
c$$$               Column   1     Column   2     Column   3     Column   4
c$$$       1       0.00000000     0.00000000    -1.00000000     0.00000000
c$$$       2       1.00000000     0.00000000     0.00000000     0.00000000
c$$$       3       0.00000000     0.00000000     0.00000000     1.00000000
c$$$       4       0.00000000     0.00000000    -1.00000000     0.00000000
c$$$       5       0.00000000     1.00000000     0.00000000     0.00000000
c$$$       6       0.00000000     0.00000000     2.00000000     0.00000000
c$$$
c$$$               Column   5
c$$$       1       1.00000000
c$$$       4      -1.00000000
c$$$
c$$$
c$$$              +----------------------------------------------+
c$$$              ! Cartesian to spherical transformation matrix !
c$$$              +----------------------------------------------+
c$$$
c$$$                              Moment order: 3
c$$$
c$$$               Column   1     Column   2     Column   3     Column   4
c$$$       2       3.00000000     0.00000000    -1.00000000     0.00000000
c$$$       3       0.00000000     0.00000000     0.00000000     1.00000000
c$$$       5       0.00000000     1.00000000     0.00000000     0.00000000
c$$$       7      -1.00000000     0.00000000    -1.00000000     0.00000000
c$$$       8       0.00000000     0.00000000     0.00000000     1.00000000
c$$$       9       0.00000000     0.00000000     4.00000000     0.00000000
c$$$      10       0.00000000     0.00000000     0.00000000    -0.66666667
c$$$
c$$$
c$$$
c$$$             +----------------------------------------------+
c$$$              ! Cartesian to spherical transformation matrix !
c$$$              +----------------------------------------------+
c$$$
c$$$                              Moment order: 4
c$$$
c$$$               Column   1     Column   2     Column   3     Column   4
c$$$       2     1.000000E+00   0.000000E+00  -1.000000E+00   0.000000E+00
c$$$       5     0.000000E+00   3.000000E+00   0.000000E+00  -1.000000E+00
c$$$       7    -1.000000E+00   0.000000E+00  -1.000000E+00   0.000000E+00
c$$$       9     0.000000E+00   0.000000E+00   6.000000E+00   0.000000E+00
c$$$      12     0.000000E+00  -1.000000E+00   0.000000E+00  -1.000000E+00
c$$$      14     0.000000E+00   0.000000E+00   0.000000E+00   1.333333E+00
c$$$
c$$$               Column   5     Column   6     Column   7     Column   8
c$$$       1    -1.250000E-01   0.000000E+00  -2.058292E+16   0.000000E+00
c$$$       3     0.000000E+00  -1.000000E+00   0.000000E+00  -3.333333E-01
c$$$       4    -2.500000E-01   0.000000E+00  -1.000000E+00   0.000000E+00
c$$$       6     1.000000E+00   0.000000E+00   1.234975E+17   0.000000E+00
c$$$       8     0.000000E+00  -1.000000E+00   0.000000E+00   1.000000E+00
c$$$      10     0.000000E+00   1.333333E+00   0.000000E+00   0.000000E+00
c$$$      11    -1.250000E-01   0.000000E+00   2.058292E+16   0.000000E+00
c$$$      13     1.000000E+00   0.000000E+00  -1.234975E+17   0.000000E+00
c$$$      15    -3.333333E-01   0.000000E+00   0.000000E+00   0.000000E+00
c$$$
c$$$               Column   9
c$$$       1    -1.666667E-01
c$$$       4     1.000000E+00
c$$$      11    -1.666667E-01
 
C
C create density matrix
      DO IALPH=1,NBB6D
       DO IBETA=IALPH,NBB6D
        DDD=0.D0
        DO IORB=1,NOCC
         DDD=DDD+VECT6D(IALPH,IORB)*VECT6d(IBETA,IORB)
        END DO
        DENS6D(IALPH,IBETA)=2.D0*DDD
       END DO
      END DO
 
      WRITE(IUNITW,9102) ((DENS6D(IALPH,IBETA),IBETA=IALPH,NBB6D)
     $     ,IALPH=1,NBB6D)
 9102 FORMAT(4E20.12)
C
      CLOSE(IUNITW)
C
      RETURN
      END