      subroutine syspin0
      use module
C     use mod_dav
      use mod_gen
      IMPLICIT REAL(8)(A-H,O-X,Z),logical(1)(y)
 
 
 
 
        return
 
 
 
      yw=.false.
      ysysp=.true.
      print*,'syspin0 ndet',ndet
      allocate (isyspi(ndet))
      isyspi=0
      iadr=0
      !
      ! Boucle sur le nombre de classes du CAS
      !
      do iclc=1,nclasc
         if(.not.exist_clasc(iclc)) cycle
         !
         ! Boucle sur les distances
         !
         do idist=0,2
            !
            ! Boucle sur les det du CAS de la classe
            !
               ideb=idebc(iclc)
               ifin=ifinc(iclc)
            do kc=ideb,ifin
               !
               ! Lecture du string CAS
               !
               bb=' '
               i=ibinc(kc)
               ! remplissage de l'inverse de spin
               do k=1,noac
                  yc(k+noac)=(i==ibset(i,k-1))
                  yc(k)=(i==ibset(i,k+16-1))
               enddo
               if(yw)print*,'yc',yc(1:noac+noac)
               !
               ! Calcul selectionne : distance du string CAS
               !
               if(sel==2) jdist=icaldist(kc,ibin,ibinc,noac)
               if(sel==2.and.yw)print*,'jdist',jdist,yc(1:noac+noac)
               !
               ! Boucle sur les classes TP correspondant au CAS
               !
               do jcltp=1,nc_tp(iclc)
                  i=ic_tp(jcltp,iclc)
                  nta=icltp1(1,i)
                  ntb=icltp1(2,i)
                  npa=icltp1(3,i)
                  npb=icltp1(4,i)
                  ! generation des parties d'espace
                  nt=nta+ntb
                  np=npa+npb
                  if(sel==2) then
                     call lim_sel(nt,np,jdist,ibon)
                     if(ibon==0) cycle
                  endif
                  ntnp=nt+np
                  if(ntnp==0) then
                     call gen_0
                  else if(ntnp==1) then
                     if(nt==1) then
                        call gen_t
                     else
                        call gen_p
                     endif
                  else if(ntnp==2) then
                     if(nt==1) then
                        call gen_tp
                     else if(nt==0) then
                        call gen_pp
                     else if(nt==2) then
                        call gen_tt
                     endif
                  else if(ntnp==3) then
                     if(nt==1) then
                        call gen_tpp
                     else
                        call gen_ttp
                     endif
                  else if(ntnp==4) then
                     call gen_ttpp
                  endif
               enddo
            enddo
            ! si calcul non SEL, on ne fait qu'une fois la
            ! boucle sur la distance :
            if(sel/=1) exit
         enddo
      enddo
      ysysp=.false.
      open(19,file='SYSP',form='unformatted',status='unknown')
      write(19) isyspi
      if(yw) then
         do k=1,ndet
            print*,'k,isyspi(k)',k,isyspi(k)
         enddo
      endif
      deallocate(isyspi)
      return
      end
       subroutine syspin1(nt1,np1,it1,ip1)
      use module
C     use mod_dav
      use mod_gen
      IMPLICIT REAL(8)(A-H,O-X,Z),logical(1)(y)
      dimension it1(2),ip1(2)
 
 
 
       return
 
 
 
 
 
      yw=.false.
      ! on inverse les spins de it et ip
      if(isyspi(iadr)/=0) return
      if(yw)print*,'av it1,ip1',it1(1:nt1),'   ',ip1(1:np1)
      it1=-it1
      ip1=-ip1
      if(nt1==2.and.it1(1)<0.and.it1(2)>0) then
         i=it1(1)
         it1(1)=it1(2)
         it1(2)=i
      endif
      if(np1==2.and.ip1(1)<0.and.ip1(2)>0) then
         i=ip1(1)
         ip1(1)=ip1(2)
         ip1(2)=i
      endif
      call adrdet(yc,nt1,it1,np1,ip1,iadr1)
      isyspi(iadr)=iadr1
      isyspi(iadr1)=iadr
      if(yw)print*,'iadr',iadr,iadr1
      if(yw)print*,'it1,ip1',it1(1:nt1),'   ',ip1(1:np1)
      return
      end
       subroutine syspin2(v0)
      use module
      IMPLICIT REAL(8)(A-H,O-X,Z),logical(1)(y)
      dimension v0(ndet)
      allocatable isyspi(:)
 
 
 
       return
 
 
 
 
 
      if(.not.allocated(isyspi))allocate (isyspi(ndet))
      if(syspin=='+') then
          isp=1
       else if(syspin=='-') then
          isp=-1
       else
          return
       endif
      rewind 19
      read(19) isyspi
      do k=1,ndet
         if(k>isyspi(k)) cycle
         vv1=v0(k)
         vv2=v0(isyspi(k))
         v0(k)=(vv1+isp*vv2)/2
         v0(isyspi(k))=(vv2+isp*vv1)/2
      enddo
      deallocate (isyspi)
      return
      end
