C KECOM6    SOURCE    GOUNAND   24/11/06    21:15:11     12073          
      SUBROUTINE KECOM6(CGEOMQ,MYLMOT,MYDISC,TYPCHA,ICHAM,LCHAM,
     $     MYFALS)
      IMPLICIT REAL*8 (A-H,O-Z)
      IMPLICIT INTEGER (I-N)
C***********************************************************************
C NOM         : KECOM6
C PROJET      : Noyau linéaire NLIN
C DESCRIPTION :
C
*  On teste les noms des ddls des variables et des coefficients
*  On verifie egalement qu'il n'y a pas de noeuds à numéro nul dans CGEOMQ
*  qui pourrait etre utilises. Ces noeuds nuls sont eventuellement
*  cree par TRQUAF (cf. PRLIN2) pour permettre l'utilisation d'un
*  maillage non QUAF en entree de NLIN.
C
C LANGAGE     : ESOPE
C AUTEUR      : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
C               mél : gounand@semt2.smts.cea.fr
C***********************************************************************
C APPELES          : KEEF (recherche de l'élément fini)
C APPELE PAR       :
C***********************************************************************
C ENTREES            :
C SORTIES            :
C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
C***********************************************************************
C VERSION    : v1, 26/09/02, version initiale
C HISTORIQUE : v1, 26/09/02, création
C HISTORIQUE :
C HISTORIQUE :
C***********************************************************************
C Prière de PRENDRE LE TEMPS de compléter les commentaires
C en cas de modification de ce sous-programme afin de faciliter
C la maintenance !
C***********************************************************************

-INC PPARAM
-INC CCOPTIO
-INC SMELEME
      POINTEUR CGEOMQ.MELEME
      POINTEUR SOUGEO.MELEME
-INC SMLMOTS
      POINTEUR MYLMOT.MLMOTS
* Mes includes persos
-INC TNLIN
*-INC SFALRF
      POINTEUR MYFALS.FALRFS
*-INC SELREF
      POINTEUR MYLRF.ELREF
*
      CHARACTER*8 TYPCHA
      CHARACTER*4 MYDISC
      INTEGER IMPR,IRET
*
* Fonctions appelées
*
      INTEGER IMAX
*
      INTEGER ICOMP ,ISOUS            ,MAXISO
      INTEGER        NSOUS,NDDL,ITQUAF,MAXCMP
*
* Executable statements
*
      IMPR=0
      SEGACT CGEOMQ
      NSOUS=CGEOMQ.LISOUS(/1)
      MAXCMP=0
      DO 3 ISOUS=1,NSOUS
         SOUGEO=CGEOMQ.LISOUS(ISOUS)
         SEGACT SOUGEO
* On cherche l'élément fini correspondant au QUAF
         ITQUAF=SOUGEO.ITYPEL
         CALL KEEF(ITQUAF,MYDISC,
     $        MYFALS,
     $        MYLRF,
     $        IMPR,IRET)
         IF (IRET.NE.0) GOTO 9999
         SEGACT MYLRF
         NDDL=MYLRF.NPQUAF(/1)
         MAXISO=IMAX(MYLRF.NUMCMP,NDDL)
         MAXCMP=MAX(MAXCMP,MAXISO)
* Si le maillage donné à NLIN n'était pas QUAF au départ, il faut
* vérifier que tous les ddls peuvent s'appuyer sur les points du
* maillage donné
         IF (CGEOMQ.LISREF(ISOUS).NE.0) THEN
* Cas particulier : si l'espace élément fini est 'CSTE' :
*     on autorise les FLOTTANT en entrée
*     on n'autorise pas les CHAMELEM constant par élément en entrée : ça
*       n'a pas de sens, le CHAMELEM porte sur des éléments
*     on autorise les CHAMELEM constant par élément en sortie
            IF (MYDISC.EQ.'CSTE') THEN
               IF (ICHAM.LT.0) GOTO 33
*               IF (ICHAM.GT.0.AND.TYPCHA.EQ.'MCHAML  ') GOTO 33
               IF (ICHAM.EQ.0.AND.LCHAM.EQ.1) GOTO 33
            ENDIF
* Le test uniquement sur le 1er element doit etre suffisant
            DO IDDL=1,NDDL
               NNQUA=MYLRF.NPQUAF(IDDL)
               NNGLO=SOUGEO.NUM(NNQUA,1)
               IF (NNGLO.EQ.0) THEN
                  WRITE(IOIMP,*) 'A discretization space ',MYDISC,
     $                 ' is incompatible with the given mesh'
                  WRITE(IOIMP,*) 'Check its element type please'
                  GOTO 9999
               ENDIF
            ENDDO
 33         CONTINUE
         ENDIF
         SEGDES MYLRF
         SEGDES SOUGEO
 3    CONTINUE
      SEGACT MYLMOT
      ICOMP=MYLMOT.MOTS(/2)
      SEGDES MYLMOT
      SEGDES CGEOMQ
      IF (ICOMP.NE.MAXCMP) THEN
         WRITE(IOIMP,*) 'Une variable de ddls :'
         WRITE (IOIMP,2019) (MYLMOT.MOTS(I),I=1,MYLMOT.MOTS(/2))
 2019 FORMAT (10(2X,A8) )
*         SEGPRT,MYLMOT
         WRITE(IOIMP,*)
     $        'n''est pas compatible avec la discrétisation : ',
     $        MYDISC
         GOTO 9999
      ENDIF
*
* Normal termination
*
      RETURN
*
* Format handling
*
*
* Error handling
*
 9999 CONTINUE
      MOTERR(1:8)='kecom6  '
      CALL ERREUR(1127)
      RETURN
*
* End of subroutine KECOM6
*
      END
 
