      subroutine maxdetca
c------------------------------------------------------------------
c    Definitions pour les sub. maxdetcas et sub_mdc
c------------------------------------------------------------------
c    Calcul du nombre de determinants par categorie du CAS
c
c    nelac : nb d'electrons actifs (= nb d'electrons du CAS)
c            max = MAXELCAS = 20
c    noac  : nb d'orbitales actives (= nb d'orbitales du CAS)
c            max = MAXORBCAS = 10
c    numac : numero des orbitales actives (= no des orb. du CAS)
c    itsym : fonction donnant la symetrie d'1 orbitale (par son numero)
c    isz0  : spin du CAS de depart
c    nelac, noac, numac, itsym, isz sont des donnees de inidet
c------------------------------------------------------------------
c    variables locales :
c    nelc  : nb d'electrons en plus ou en moins du CAS(-2,-1,0,1,2)
c            d'ou :  mnel = 5
c    nal   : nb d'electrons alpha du CAS pour 1 det. donne (=nca)
c    nbet  : nb d'electrons beta du CAS pour 1 det. donne (=ncb)
c------------------------------------------------------------------
      IMPLICIT REAL*8(A-H,O-X,Z),LOGICAL*1 (Y)
      PARAMETER (maxorb=500,maxsym=8,MNEL=5,maxorbcas=16)
      common /cs/ noac,nelac,numac(maxorbcas),itype(maxorb),is0,ms2
 
      common/sym/itsym(2*maxorb),its(maxsym,maxsym),nsym
      common/mxdetc/maxc(-2:2,maxsym,-2:2),
     *maxca(-2:2,maxsym,maxsym,-2:2)
      common/sy2/nts(maxsym),ncs(maxsym),nps(maxsym)
     *,norbs(maxsym)
      common /prep/ nca0,ncb0,ic0(maxorbcas),icamun(maxorb+maxorb)
     *,numt(maxorb),nump(maxorb),nv
     *,gener,yoc(maxorb+maxorb),yrefc(maxorbcas),yac(maxorb)
     *,ygmono,ygddci,ygddc2,ygcas,ygtous
      common/opt/ihab,calcul
      character*3 calcul
      character*4 gener
      yw=.false.
      do 3 isp=-2,2
      do 4 is=1,maxsym
      do nelc=-2,+2
         maxc(nelc,is,isp)=0
         do isa=1,maxsym
            maxca(nelc,is,isa,isp)=0
         enddo
      enddo
 4    continue
 3    continue
c     -------- (nb d'operations effectuees sur le cas) = 0 ---------
      nal=nca0
      nbet=ncb0
      call sub_mdc(nal,nbet)
 
c     -------- (nb d'operations effectuees sur le cas) = 1 ---------
c     -------- 1 electron alpha en moins
      nal=nca0-1
      nbet=ncb0
      if(nal.ge.0) call sub_mdc(nal,nbet)
c     -------- 1 electron beta en moins
      nal=nca0
      nbet=ncb0-1
      if(nbet.ge.0) call sub_mdc(nal,nbet)
c     -------- 1 electron alpha en plus
      nal=nca0+1
      nbet=ncb0
      if(nal.le.noac) call sub_mdc(nal,nbet)
c     -------- 1 electron beta en plus
      nal=nca0
      nbet=ncb0+1
      if(nbet.le.noac) call sub_mdc(nal,nbet)
c     -------- echange d'un alpha en beta (du cas)
      nal=nca0-1
      nbet=ncb0+1
      if(nal.ge.0.and.nbet.le.noac) call sub_mdc(nal,nbet)
c     -------- echange d'un beta en alpha (du cas)
      nal=nca0+1
      nbet=ncb0-1
      if(nal.le.noac.and.nbet.ge.0) call sub_mdc(nal,nbet)
 
c     -------- (nb d'operations effectuees sur le cas) = 2 ---------
c     -------- 2 electrons alpha en moins
      nal=nca0-2
      nbet=ncb0
      if(nal.ge.0) call sub_mdc(nal,nbet)
c     -------- 2 electrons beta en moins
      nal=nca0
      nbet=ncb0-2
      if(nbet.ge.0) call sub_mdc(nal,nbet)
c     -------- 2 electrons alpha en plus
      nal=nca0+2
      nbet=ncb0
      if(nal.le.noac) call sub_mdc(nal,nbet)
c     -------- 2 electrons beta en plus
      nal=nca0
      nbet=ncb0+2
      if(nbet.le.noac) call sub_mdc(nal,nbet)
c     -------- 1 electron alpha et 1 electron beta en plus
      nal=nca0+1
      nbet=ncb0+1
      if(nal.le.noac.and.nbet.le.noac) call sub_mdc(nal,nbet)
c     -------- 1 electron alpha et 1 electron beta en moins
      nal=nca0-1
      nbet=ncb0-1
      if(nal.ge.0.and.nbet.ge.0) then
         if(nal.eq.0.and.nbet.eq.0)then
            maxc(-2,1,0)=1
            maxca(-2,1,1,0)=1
         else
            call sub_mdc(nal,nbet)
         endif
      endif
 
      if(yw)write(6,*)'maxdetcas gener',gener
c     ------ cas gener.eq.'DDCI' et 'TOUS' operations supplementaires
      if(gener.eq.'DDCI'.or.gener.eq.'TOUS'.or.gener.eq.'DDC2') then
c        -------- 2 electrons alpha en moins, 1 beta en plus
         nal=nca0-2
         nbet=ncb0+1
         if(nal.ge.0.and.nbet.le.noac) call sub_mdc(nal,nbet)
c        -------- 2 electrons alpha en plus, 1 beta en moins
         nal=nca0+2
         nbet=ncb0-1
         if(nal.le.noac.and.nbet.ge.0) call sub_mdc(nal,nbet)
c        -------- 1 electron alpha en moins, 2 beta en plus
         nal=nca0-1
         nbet=ncb0+2
         if(nal.ge.0.and.nbet.le.noac) call sub_mdc(nal,nbet)
c        -------- 1 electron alpha en plus, 2 beta en moins
         nal=nca0+1
         nbet=ncb0-2
         if(nal.le.noac.and.nbet.ge.0) call sub_mdc(nal,nbet)
      endif
c     -------- cas gener.eq.'TOUS'  operations supplementaires
      if(gener.eq.'TOUS') then
c        -------- 2 electrons alpha en moins, 2 beta en plus
         nal=nca0-2
         nbet=ncb0+2
         if(nal.ge.0.and.nbet.le.noac) call sub_mdc(nal,nbet)
c        -------- 2 electrons alpha en plus, 2 beta en moins
         nal=nca0+2
         nbet=ncb0-2
         if(nal.le.noac.and.nbet.ge.0) call sub_mdc(nal,nbet)
      endif
 
 
c     -------------------------------------------------------------
      if(yw) then
         write(6,*)'maxdetcas fin'
         do i=-2,+2
            do j=1,nsym
               write(6,*)'nelc,is,isp=-1,0,1,maxc(nelc,is,isp)',i,j,
     *         (maxc(i,j,k),k=-2,2)
            enddo
         enddo
      endif
      return
      end
