C CUPCFG    SOURCE    PV090527  26/03/12    08:44:56     12495          
      subroutine cupcfg(bu,bufPos,pConfi)
C=======================================================================
C  Sous-programme cupcfg (COLlaborateur UnPAquettage ConFiGuration)
C  Lit la configuration dans le buffer et l'integre a la configuration
C  pConfi si elle existe (pConfi different de 0 ou en alloue une en
C  copiant la config actuelle si pConfi=0
C=======================================================================
      integer i
      integer bufPos
      integer nNoCo,iNoCo
      integer lonBuf
      integer iDiDis,bkidim
      integer posAv,posAp

-INC PPARAM
-INC CCOPTIO
-INC TMCOLAC
-INC SMCOORD
      segment BUFFER
         character ffer(lonBuf)
      endsegment
      pointeur bu.BUFFER
      pointeur pConfi.MCOORD

C      write(ioimp,*) 'Entree dans CUPCFG'
C      write(ioimp,*)'Pointeur recu',pConfi

      nNoCo=0
      iDiDis=0
C     Paquettage de la configration tronquée et reordonnée selon la
C     liste de noeud listNoe
      lonBuf=bu.ffer(/2)
      call mpiupI( nNoCo,1, bu,bufPos)
      call mpiupI( iDiDis,1, bu,bufPos)
      bkidim=IDIM
      IDIM=iDiDis
      nbpts=nNoCo
      if(pConfi .eq. 0) then
         segini pConfi
      else
C       Attention, l'objet configuration sera completement ecrase
        if(pConfi.eq.mcoord) then
C          Ce n'est pas une bonne idee d'appeler cette fonction avec la
C          configuration actuelle
           segdes pConfi
        endif
        segact pConfi*mod
        if(pConfi.xcoor(/1).lt.(nNoCo*(iDiDis+1))) then
           segadj pConfi
        endif
      endif
      IDIM=bkidim
      call mpiupR( pConfi.xcoor(1),(iDiDis+1)*nNoCo, bu,bufPos)
C     Prise en compte des differences de dimensions
      if(IDIM.ne.iDiDis) then
         if(IDIM.lt.iDiDis) then
C        Compression
            do iNoCo=1,nNoCo
               posAv=(iDiDis+1)*(iNoCo-1)
               posAp=(  IDIM+1)*(iNoCo-1)
               do i=1,IDIM
                  pConfi.xcoor(posAp+i)=pConfi.xcoor(posAv+i)
               enddo
               pConfi.xcoor(posAp+IDIM+1)=pConfi.xcoor(posAv+iDiDis+1)
            enddo
            segadj pConfi
         else
C        Dilatation
            segadj pConfi
            do iNoCo=nNoCo,1,-1
               posAv=(iDiDis+1)*(iNoCo-1)
               posAp=(  IDIM+1)*(iNoCo-1)
               pConfi.xcoor(posAp+IDIM+1)=pConfi.xcoor(posAv+iDiDis+1)
               do i=IDIM,iDiDis+1,-1
                  pConfi.xcoor(posAp+i)=0
               enddo
               do i=iDiDis,1,-1
                  pConfi.xcoor(posAp+i)=pConfi.xcoor(posAv+i)
               enddo
            enddo
         endif
      endif
      segdes pConfi
      if(pConfi.eq.mcoord) then
         segact pConfi
      endif
C      write(ioimp,*) 'Sortie de CUPCFG'
      end


 
 
 
 
 
