C PLACN     SOURCE    PV        17/12/05    21:17:01     9646           
       subroutine placn(itab,iel,iplace,invLis,numlis)
c
c
c   ajoute un element (de valeur iel) dans un segment extensible
c    s il n y est deja a la place iplace.
C   Sort en erreur si l'element etait deja present
c   et renseigne le segment invLis pour aller plus vite
c   numlis indique s'il faut maintenir une liste inverse ou non
c
      integer nlisse
      integer invPGD
      integer iel,iplace,ilis,ntab
      integer numlis


-INC PPARAM
-INC CCOPTIO
-INC TMCOLAC
      segment TABSEG
        integer  leau(nTab)
      endsegment
      pointeur invLis.ILISSE
      pointeur itab.TABSEG
      nlisse = invLis.iliseg(/1)
      invPGD = invLis.npgcd
      if(numlis.eq.1) then
         if((iel-1)/invPGD.gt.nlisse) then
            nlisse = (iel-1)/invPGD*1.2
            segadj invLis
         endif
         ilis= invLis.iliseg((iel-1)/invPGD)
         if(ilis.eq.0) then
C           l'element n est pas encore dans le tableau
            nTab=itab.leau(/1)
            if(iplace.gt.nTab) then
               nTab=iplace
               segadj itab
            endif
            itab.leau(iplace)=iel
            invLis.iliseg((iel-1)/invPGD)=iplace
         else
*  verif que c'est la bonne pile
            if (itab.leau(ilis).ne.iel) then
               write (6,*) ' incoherence placn ',itab,iel,ilis,nlisse,
     &                                       numlis,itab.leau(ilis)
            else
               write(6,*) 'PLACN Probleme:'
               write(6,*) 'l element est dans deja dans la liste'
            endif
            moterr(1:8)='ajoun'
            interr(1)=iel
            call erreur(861)
            return
         endif
      else
         nTab=itab.leau(/1)
         do ilis=1,nTab
            if(itab.leau(ilis).eq.iel) then
               write(6,*) 'PLACN Probleme:'
               write(6,*) 'l element est dans deja dans la liste'
               call erreur(861)
               return
            endif
         enddo
         if(iplace.gt.nTab) then
            nTab=iplace
            segadj itab
         endif
         itab.leau(iplace)=iel
      endif
      return
      end

 
 
