      subroutine mulvvoodx(a,b,i,j,aa1,aa2)
      use module
      use mod_ena
      IMPLICIT REAL(8)(A-H,O-X,Z),logical(1)(y)
      integer a,b,d
      !
      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      ! Preparation des listes d'adresses du CAS et des TP
      !
      ! i,j,a,b,aa = indices et valeur de l'integrale
      ! itp1,itp2 : adresses de la partie T/P
      ! ntp       : nombre d'adresses T/P
      !  det1 : kl --> ab      det2 : non excite
      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      !
      !==========================================================
      ! on ne peut rien ajouter
      ! conditions : 2 paires doivent exister entre i,j et a,b
      !==========================================================
      !
      itest(24)=1
      call caldfc(idist,2,2)
      ybon=.false.
!      if(iter>=iterh)print*,'subr mulvvoodx classhab(2,2)'
      if (iter>=iterh) call classhab(2,2)
      !/////////////////////////////////////
      if(w)print*,'entree mulvvoodx',aa1,aa2
      !/////////////////////////////////////
      ipair1=ilp(i,a)
      if(ipair1.ne.0) then
         ipair2=ilp(j,b)
         if(ipair2.ne.0) ybon=.true.
      endif
      if(.not.ybon) then
         ipair1=ilp(i,b)
         if(ipair1.ne.0) then
            ipair2=ilp(j,a)
            if(ipair2.ne.0) ybon=.true.
         endif
      endif
      if(.not.ybon)  then
         hab=0
         return
      endif
      !
      iimax1=max(ipair2,ipair1)
      iimin1=min(ipair1,ipair2)
      ii1=iimax1*(iimax1-1)/2+iimin1
      if(ipp(ii1)==0) return
      ! signe
      isgn0=1-2*mod(nelac+num_oav(i)+num_oav(j),2)
      if(w)print*,'isgn0',isgn0
      ! Adresse de la partie tp
      itp10=abs(ipp(ii1))
      itp2(1:min(size(itp2),2))=1
      !
      ! Partie CAS
      iclc=iclasc(0,0)
      longc=ifinc(iclc)+1-idebc(iclc)
      if(sel==2) then
         lc=0
         do k=idebc(iclc),ifinc(iclc)
            if(icaldist(k,jbin,ibinc,noac)>0) cycle
            lc=lc+1
            mdetc1(lc)=idetc(k)
         enddo
      endif
      !
      !---------------
      ! partie directe
      !---------------
      jcltp1=isdimtp(icltp(1,1,1,1))
      npp=npp_pe+npp_te+npp_tepe
      !
      if(i==j) then
         if(a==b) then
            itp1(1)=itp10+jcltp1
            ! 1.  det1 : i+i- --> a+a-      det2 :
            if(w)print*,' det1 : i+i- --> a+a-      det2 :'
            if(sel==2) then
      if(lc/=0) itest(24)=1
               call ena(aa1*isgn0,lc,mdetc1(1:lc),
     *         mdetc1(1:lc),
     *         1,itp1,itp2)
            else
            if(longc/=0) itest(24)=1
               call ena(aa1*isgn0,longc,idetc(idebc(iclc):ifinc(iclc)),
     *         idetc(idebc(iclc):ifinc(iclc)),
     *         1,itp1,itp2)
            endif
         else
            itp1(1)=itp10+jcltp1+nppaaaa*3+npp
            itp1(2)=itp10+jcltp1
            ! 1.  det1 : i+i- --> a+b-      det2 :
            if(w)print*,' det1 : i+i- --> a+b-      det2 :'
            if(w)print*,' det1 : i+i- --> b+a-      det2 :'
            if(sel==2) then
      if(lc/=0) itest(24)=1
               call ena(aa2*isgn0,lc,mdetc1(1:lc),
     *         mdetc1(1:lc),
     *         2,itp1,itp2)
            else
            if(longc/=0) itest(24)=1
               call ena(aa2*isgn0,longc,idetc(idebc(iclc):ifinc(iclc)),
     *         idetc(idebc(iclc):ifinc(iclc)),
     *         2,itp1,itp2)
            endif
         endif
      else
         if(a==b) then
            itp1(1)=itp10+jcltp1+nppaaaa*3+npp
            itp1(2)=itp10+jcltp1
            ! 1.  det1 : i+j- --> a+a-      det2 :
            if(w)print*,' det1 : i+j- --> a+a-      det2 :'
            if(w)print*,' det1 : j+i- --> a+a-      det2 :'
            if(sel==2) then
      if(lc/=0) itest(24)=1
               call ena(aa2*isgn0,lc,mdetc1(1:lc),
     *         mdetc1(1:lc),
     *         2,itp1,itp2)
            else
            if(longc/=0) itest(24)=1
               call ena(aa2*isgn0,longc,idetc(idebc(iclc):ifinc(iclc)),
     *         idetc(idebc(iclc):ifinc(iclc)),
     *         2,itp1,itp2)
            endif
         else
            ! rappel : i>j , a>b
            itp1(1)=itp10+jcltp1+nppaaaa*3+npp
            itp1(2)=itp10+jcltp1
            ! 1.  det1 : i+j- --> a+b-      det2 :
            if(w)print*,' det1 : i+j- --> a+b-      det2 :'
            if(w)print*,' det1 : j+i- --> b+a-      det2 :'
            if(sel==2) then
      if(lc/=0) itest(24)=1
               call ena(aa1*isgn0,lc,mdetc1(1:lc),
     *         mdetc1(1:lc),
     *         2,itp1,itp2)
            else
            if(longc/=0) itest(24)=1
               call ena(aa1*isgn0,longc,idetc(idebc(iclc):ifinc(iclc)),
     *         idetc(idebc(iclc):ifinc(iclc)),
     *         2,itp1,itp2)
            endif
            ! 3.  det1 : i+j- --> b+a-      det2 :
            itp1(1)=itp10+jcltp1+nppaaaa*2+npp
            itp1(2)=itp10+jcltp1+nppaaaa+npp
            if(w)print*,' det1 : i+j- --> b+a-      det2 :'
            if(w)print*,' det1 : j+i- --> a+b-      det2 :'
            if(sel==2) then
      if(lc/=0) itest(24)=1
               call ena(aa2*isgn0,lc,mdetc1(1:lc),
     *         mdetc1(1:lc),
     *         2,itp1,itp2)
            else
            if(longc/=0) itest(24)=1
               call ena(aa2*isgn0,longc,idetc(idebc(iclc):ifinc(iclc)),
     *         idetc(idebc(iclc):ifinc(iclc)),
     *         2,itp1,itp2)
            endif
         endif
      endif
      if(a==b.or.i==j) then
         hab=0
         return
      endif
      !
      !-------------------------
      ! partie directe + echange
      !-------------------------
      aax=aa1-aa2
      !signe
      aax=aax*(1-2*mod(sum(num_oav((/i,j/))),2))
      !signe ... croisement ?
      if((b-a)*(j-i)>0) aax=-aax
      ! 1.  det1 : i+j+ --> a+b+      det2 :
      if(w)print*,' det1 : i+j+ --> a+b+      det2 :'
      jcltp1=isdimtp(icltp(2,0,2,0))
      itp1(1)=itp10+jcltp1
      if(sel==2) then
      if(lc/=0) itest(24)=1
         call ena(aax,lc,mdetc1(1:lc),
     *   mdetc1(1:lc),
     *   1,itp1,itp2)
      else
      if(longc/=0) itest(24)=1
         call ena(aax,longc,idetc(idebc(iclc):ifinc(iclc)),
     *   idetc(idebc(iclc):ifinc(iclc)),
     *   1,itp1,itp2)
      endif
      ! 2.  det1 : i-j- --> a-b-      det2 :
      if(w)print*,' det1 : i-j- --> a-b-      det2 :'
      jcltp1=isdimtp(icltp(0,2,0,2))
      if(w)print*,'itp1',jcltp1,itp10,itp10+jcltp1
      itp1(1)=itp10+jcltp1
      if(sel==2) then
      if(lc/=0) itest(24)=1
         call ena(aax,lc,mdetc1(1:lc),
     *   mdetc1(1:lc),
     *   1,itp1,itp2)
      else
      if(longc/=0) itest(24)=1
         call ena(aax,longc,idetc(idebc(iclc):ifinc(iclc)),
     *   idetc(idebc(iclc):ifinc(iclc)),
     *   1,itp1,itp2)
      endif
      hab=0
      return
      end
       subroutine mulvovoadd1(m,i,j,k,ktp1,ktp2,
     *jcltp_pp1,jcltp_pp2,jcltp_pp3)
      use module
      if(k>i) then
         itp1(m)=ktp1+jcltp_pp1
      else if(k==i) then
         !print*,'itp1(m)',ktp1,jcltp_pp2
         itp1(m)=ktp1+jcltp_pp2
      else
         itp1(m)=ktp1+jcltp_pp3
      endif
      if(k>j) then
         itp2(m)=ktp2+jcltp_pp1
      else if(k==j) then
         !print*,'itp1(m)',ktp2,jcltp_pp2
         itp2(m)=ktp2+jcltp_pp2
      else
         itp2(m)=ktp2+jcltp_pp3
      endif
      return
      end
       subroutine mulvovoadd2(n,a,b,d,ktp1,ktp2,
     *jcltp_mm1,jcltp_mm2)
      use module
      integer a,b,d
      if(d<b) then
         itp3(n)=ktp1+jcltp_mm1
      else
         itp3(n)=ktp1+jcltp_mm2
      endif
      if(d<a) then
         itp4(n)=ktp2+jcltp_mm1
      else
         itp4(n)=ktp2+jcltp_mm2
         !print*,'ktp2,jcltp_mm2',ktp2,jcltp_mm2
      endif
      !print'(a,10i4)','i,j,a,b,k,d,n',i,j,a,b,k,d,n
      return
      end
