C KCHA0     SOURCE    CB215821  20/11/25    13:30:51     10792          
      SUBROUTINE KCHA0(ICHP1,IPSG,NBCOMP,NOMTOT,MTRAV,ICCPR)
C-----------------------------------------------------------------------
C  Création du segment de travail MTRAV (et du segment de redirection)
C  associé au champoint ICHP1 sur le maillage de référence IPSG.
C  Le segment de travail contient au plus les composantes contenues
C  dans le tableau NOMTOT (si NBCOMP est différent de 0) .
C-----------------------------------------------------------------------
C
C---------------------------
C Parametres Entree/Sortie :
C---------------------------
C
C E/  ICHP1  : Champoint
C E/  IPSG   : Maillage de référence, en général de type POI1
C E/  NBCOMP : Nombre de composantes à extraire (toutes  NBCOMP = 0)
C E/  NOMTOT : Tableau des noms des composantes à extraire
C S/  MTRAV  : Segment de travail
C S/  ICCPR  : Segment de redirection (ICPR inverse de IGEO dans MTRAV)
C
C-------------------------------------
C Tableaux du segment de redirection :
C-------------------------------------
C
C  ICPR(I)=J : Le noeud I a le numero J dans le MELEME des faces
C  NNGOT     : Nombre de noeuds total du domaine
C
C-----------------------------------------------------------------------
C
C Langage : ESOPE + FORTRAN77
C
C Auteurs : L. DADA
C
C-----------------------------------------------------------------------
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8 (A-H,O-Z)
      CHARACTER*(*) NOMTOT(*)
C

-INC PPARAM
-INC CCOPTIO
-INC SMELEME
-INC SMCHPOI
-INC SMCOORD
-INC TMTRAV
C
      SEGMENT ICCPR
         INTEGER ICPR(NNGOT)
      ENDSEGMENT
C
C- Transforme le maillage en POI1 si maillage quelconque
C- Le maillage POI1 de pointeur IPT1 est actif au retour de CHANGE
C
      IPT1 = IPSG
      SEGACT IPT1
C PPw NBSOUS = LISOUS(/1)
      NBSOUS = IPT1.LISOUS(/1)
C PPw IF ((NBSOUS.NE.0).OR.(ITYPEL.NE.1)) THEN
      IF ((NBSOUS.NE.0).OR.(IPT1.ITYPEL.NE.1)) THEN

         CALL CHANGE(IPT1,1)
         IF (IERR.NE.0) RETURN
      ENDIF
C
C - Création du tableau ICPR pour le maillage IPT1
C
      NNGOT  = nbpts
      SEGINI ICCPR
C
      NNNOE = IPT1.NUM(/2)
      IK    = 0
      DO 10 I2=1,NNNOE
         K = IPT1.NUM(1,I2)
         IF (ICPR(K).EQ.0) THEN
            IK      = IK + 1
            ICPR(K) = IK
         ENDIF
 10   CONTINUE
      SEGDES IPT1
C
C - Récupération du nombre de composantes de ICHP1
C
      MCHPOI = ICHP1
      SEGACT MCHPOI
      NSOUPO = IPCHP(/1)
      NNIN   = 0
      DO 20 I=1,NSOUPO
         MSOUPO = IPCHP(I)
         SEGACT MSOUPO
         NNIN   = NNIN + NOCOMP(/2)
 20   CONTINUE

C - Création et remplissage de MTRAV
C - Balayage des partitions de ICHP1, utilisation du tableau ICPR
C - Extraction des composantes uniquement contenues dans NOMTOT
C - si NBCOMP.NE.0

      SEGINI MTRAV
C
C - Nombre de composantes véritablement dans MTRAV :
C
      NBIN = 0
C
      DO 30 I=1,NSOUPO
         MSOUPO = IPCHP(I)
         NC     = NOCOMP(/2)
         MPOVAL = IPOVAL
         SEGACT MPOVAL
         MELEME = IGEOC
         SEGACT MELEME
         NBELEM = NUM(/2)
         DO 50 ICOMP=1,NC
           IF (NBCOMP.NE.0) THEN
              CALL PLACE(NOMTOT,NBCOMP,IPEXT,NOCOMP(ICOMP))
           ENDIF
           IF ((NBCOMP.EQ.0).OR.(IPEXT.NE.0)) THEN
              CALL PLACE(INCO,NBIN,IPOS,NOCOMP(ICOMP))
              
C             Obligatoire de séparer les 2 cas sinon plantage en evaluant NHAR(IPOS) lorsque IPOS=0
              NEWONE=0
              IF(IPOS.EQ.0)THEN
                NEWONE=1                 
              ELSEIF(NHAR(IPOS).NE.NOHARM(ICOMP))THEN
                NEWONE=1
              ENDIF
              
              IF(NEWONE .EQ. 1)THEN
                NBIN       = NBIN + 1
                INCO(NBIN) = NOCOMP(ICOMP)
                NHAR(NBIN) = NOHARM(ICOMP)
                IPOS = NBIN
              ENDIF
              
              DO 40 J=1,NBELEM
                 K  = NUM(1,J)
                 IK = ICPR(K)
                 IF (IK.NE.0) THEN
                    IGEO(IK) = K
                    IBIN(IPOS,IK) = 1
                    BB(IPOS,IK)   = VPOCHA(J,ICOMP)
                 ENDIF
 40           CONTINUE
            ENDIF

 50      CONTINUE
         SEGDES MELEME
         SEGDES MPOVAL
         SEGDES MSOUPO
 30   CONTINUE
      SEGDES MCHPOI

C
      NNIN = NBIN
      SEGADJ MTRAV
C
C - Test si toutes les composantes que l'on voulait extraire sont
C - bien dans le segment de travail
C
      DO 60 I=1,NBCOMP
         CALL PLACE(INCO,NNIN,IPEXT,NOMTOT(I))
         IF (IPEXT.EQ.0) THEN
            MOTERR(1:4) = NOMTOT(I)
            CALL ERREUR(197)
            SEGDES MTRAV,ICCPR
            RETURN
         ENDIF
 60   CONTINUE

      SEGDES MTRAV
      SEGDES ICCPR
C
      END



 
 
