C CONDU     SOURCE    CB215821  24/04/12    21:15:27     11897          

      SUBROUTINE CONDU

      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8 (A-H,O-Z)


-INC PPARAM
-INC CCOPTIO
-INC SMCHAML
-INC SMMODEL
      POINTEUR MODTHR.MMODEL,MODRAY.MMODEL,MODCNV.MMODEL,MODTHM.MMODEL
      POINTEUR MOELEC.MMODEL,MODIFF.MMODEL
-INC SMRIGID
-INC SMCOORD

      CHARACTER*(LOCOMP) MOCOMP

      segact mcoord
      IPRIGI = 0
      IPMODR = 0
      IPMODC = 0

C =========================================
C  1- LECTURE DES ARGUMENTS DE L'OPERATEUR
C =========================================
C  1.1 - Lecture OBLIGATOIRE du modele (MODORI)
C =====
      MOTERR(1:8)=' MODELE '
      CALL MESLIR(-137)
      CALL LIROBJ('MMODEL  ',MODORI,1,IRet)
      CALL ACTOBJ('MMODEL  ',MODORI,1)
      IF (IERR.NE.0) RETURN
C =====
C  1.2 - Lecture OBLIGATOIRE du champ de caracteristiques (MCHORI)
C =====
      CALL MESLIR(-135)
      CALL LIROBJ('MCHAML  ',IPIN,1,IRet)
      CALL ACTOBJ('MCHAML  ',IPIN,1)
      IF (IERR.NE.0) RETURN
      CALL REDUAF(IPIN,MODORI,MCHORI,0,IR,KER)
      IF(IR   .NE. 1) CALL ERREUR(KER)
      IF(IERR .NE. 0) RETURN

C =========================================
C  2- QUELQUES VERIFICATIONS DES ARGUMENTS
C =========================================
C  2.1 - Verification du type du champ (MCHORI)
C =====
      MCHELM = MCHORI
      SEGACT,MCHELM
      IF (TITCHE(1:8).NE.'CARACTER') THEN
        MOTERR(1:16) = 'CARACTERISTIQUES'
        CALL ERREUR(291)
        RETURN
      ENDIF
C =====
C  2.2 - Verification du contenu du modele (MODORI)
C        Separation des formulations DIFFUSION & ELECTROSTATIQUE
C                et des formulations THERMIQUE & THERMOHYDRIQUE
C =====
      MMODEL = MODORI
      SEGACT,MMODEL
      NSOUS = KMODEL(/1)
      N1 = NSOUS
      SEGINI,MOELEC,MODTHM,MODRAY,MODCNV,MODTHR,MODIFF
      IELEC = 0
      ITHEM = 0
      IRAYE = 0
      ICONV = 0
      ITHER = 0
      IDIFF = 0

      DO isous = 1, NSOUS
        IMODEL = KMODEL(isous)
        SEGACT,IMODEL
        IF      (FORMOD(1).EQ.'ELECTROSTATIQUE ') THEN
          IELEC = IELEC + 1
          MOELEC.KMODEL(IELEC) = IMODEL
        ELSE IF (FORMOD(1).EQ.'THERMOHYDRIQUE  ') THEN
          ITHEM = ITHEM + 1
          MODTHM.KMODEL(ITHEM) = IMODEL
        ELSE IF (FORMOD(1).EQ.'DIFFUSION       ') THEN
          IDIFF = IDIFF + 1
          MODIFF.KMODEL(IDIFF) = IMODEL
        ELSE IF (FORMOD(1).EQ.'THERMIQUE       ') then
          NMAT = MATMOD(/2)
          CALL PLACE(MATMOD,NMAT,ipl,'RAYONNEMENT')
          IF (ipl.NE.0) THEN
            IRAYE = IRAYE + 1
            MODRAY.KMODEL(IRAYE) = IMODEL
          ELSE
            CALL PLACE(MATMOD,NMAT,ipl,'CONVECTION')
            IF (ipl.NE.0) THEN
              ICONV = ICONV + 1
              MODCNV.KMODEL(ICONV) = IMODEL
            ELSE
              ITHER = ITHER + 1
              MODTHR.KMODEL(ITHER) = IMODEL
            ENDIF
          ENDIF
        ELSE
          N1 = N1 - 1
        ENDIF
      ENDDO
C  Verification que le modele MODORI contient au moins un sous-modele
C  dont la formulation est traitee ici !
      IF (N1.LE.0) THEN
        MOTERR(1:8) = 'MMODEL  '
        INTERR(1) = MODORI
        CALL ERREUR(356)
        GOTO 9991
      ENDIF

      IF (IELEC.GT.0) THEN
C =======================================================
C  3-    CONSTRUCTION DE LA MATRICE DE CONDUCTIVITE
C     POUR LA FORMULATION ELECTROSTATIQUE
C =======================================================
C  Modele contenant uniquement des formulations DIFFUSION et ELECTROSTATIQUE
        N1 = IELEC
        SEGADJ,MOELEC
        IPMODR = MOELEC
C  Calcul de la matrice : tout est fait dans RIGI1
        ipch = 0
        imat = 1
        noer=0
        CALL RIGI1(IPMODR,MCHORI,ipch,imat,IPRIGI,IRET,noer)
        IF (IRET.NE.1) GOTO 9991
        MRIGID = IPRIGI
      ENDIF

      NSOUS = ITHEM + IRAYE + ICONV + ITHER + IDIFF
      IF (NSOUS.GT.0) THEN
C ================================================================
C  4-    CONSTRUCTION DE LA MATRICE DE CONDUCTIVITE
C     POUR LES FORMULATIONS THERMIQUE, DIFFUSION ET THERMOHYDRIQUE
C ================================================================
C  4.1 - Initialisation de la matrice si necessaire
C =====
        IF (IPRIGI.EQ.0) THEN
          NRIGEL = 0
          SEGINI,MRIGID
          MTYMAT = 'RIGIDITE'
          ICHOLE = 0
          IMGEO1 = 0
          IMGEO2 = 0
          IFORIG = IFOUR
          ISUPEQ = 0
          IPRIGI = MRIGID
        ELSE
          MRIGID = IPRIGI
          SEGACT,MRIGID*MOD
        ENDIF
C =====
C  4.2 - Modele avec uniquement les formulations THERMIQUE, DIFFUSION et THERMOHYDRIQUE
C =====
        N1 = NSOUS
        SEGINI,MMODEL
        isous = 0
        IF (ITHEM.GT.0) THEN
          DO i = 1, ITHEM
            isous = isous + 1
            KMODEL(isous) = MODTHM.KMODEL(i)
          ENDDO
        ENDIF
        IF (IRAYE.GT.0) THEN
          DO i = 1, IRAYE
            isous = isous + 1
            KMODEL(isous) = MODRAY.KMODEL(i)
          ENDDO
        ENDIF
        IF (ICONV.GT.0) THEN
          DO i = 1, ICONV
            isous = isous + 1
            KMODEL(isous) = MODCNV.KMODEL(i)
          ENDDO
        ENDIF
        IF (ITHER.GT.0) THEN
          DO i = 1, ITHER
            isous = isous + 1
            KMODEL(isous) = MODTHR.KMODEL(i)
          ENDDO
        ENDIF
        IF (IDIFF.GT.0) THEN
          DO i = 1, IDIFF
            isous = isous + 1
            KMODEL(isous) = MODIFF.KMODEL(i)
          ENDDO
        ENDIF
        IPMODC = MMODEL

C =====
C  4.3 - Reduction du champ au modele precedemment reduit
C =====
        MCHELM = MCHORI
        CALL REDUAF(MCHORI,IPMODC,IPCHEC,0,IRET,KERRE)
        IF (IRET.NE.1) THEN
          CALL ERREUR(KERRE)
          GOTO 9990
        ENDIF
        ISUPCH = 0
        CALL QUESUP(IPMODC,IPCHEC,6,0,ISUPCH,IRET)
        IF (ISUPCH.GT.1) GOTO 9990
C NB : La verification du support est effectuee ici pour l'instant,
C      car tous les formulations considerees ici s'appuient sur le
C      meme support (IRET = 1, 2 ou 6).

C =====
C  4.4 - Remplissage de la matrice pour chaque modele concerne
C =====
c Formulation thermohydrique
        IF (ITHEM.GT.0) THEN
          DO i = 1, ITHEM
            IMODEL = MODTHM.KMODEL(i)
            SEGACT,IMODEL
            CALL THCOND(IMODEL,IPCHEC,ISUPCH, IPRIGI)
            IF (IERR.NE.0) GOTO 9990
          ENDDO
        ENDIF

c Formulation rayonnement
        IF (IRAYE.GT.0) THEN
          MCHELM = IPCHEC
          DO i = 1, IRAYE
            IMODEL = MODRAY.KMODEL(i)
            SEGACT,IMODEL
* on accepte le sous-modele de rayonnement que si le mchaml
* correspondant contient une composante H !
            SEGACT,MCHELM
            imaray = IMACHE(/1)
            MOCOMP ='H'
            DO j = 1, imaray
              IF (imache(j).eq.IMAMOD .AND. conche(j).eq.CONMOD) then
                mchaml = ichaml(j)
                SEGACT,mchaml
                CALL PLACE(nomche,nomche(/2),ipl,MOCOMP)
                IF (ipl.NE.0) then
                  CALL TCONVE(IMODEL,IPCHEC,ISUPCH, IPRIGI)
                  IF (IERR.NE.0) GOTO 9990
                  GOTO 4420
                ENDIF
              ENDIF
            ENDDO
 4420       CONTINUE
          ENDDO
        ENDIF

c Formulation convection
        IF (ICONV.GT.0) THEN
          DO i = 1, ICONV
            IMODEL = MODCNV.KMODEL(i)
            SEGACT,IMODEL
            CALL TCONVE(IMODEL,IPCHEC,ISUPCH, IPRIGI)
            IF (IERR.NE.0) GOTO 9990
          ENDDO
        ENDIF
        
c Formulation conduction
        IF (ITHER.GT.0) THEN
          DO i = 1, ITHER
            IMODEL = MODTHR.KMODEL(i)
            SEGACT,IMODEL
            CALL TCONDU(IMODEL,IPCHEC,ISUPCH, IPRIGI)
            IF (IERR.NE.0) GOTO 9990
          ENDDO
        ENDIF
        
c Formulation diffusion
        IF (IDIFF.GT.0) THEN
          DO i = 1, IDIFF
            IMODEL = MODIFF.KMODEL(i)
            SEGACT,IMODEL
            CALL TCONDU(IMODEL,IPCHEC,ISUPCH, IPRIGI)
            IF (IERR.NE.0) GOTO 9990
          ENDDO
        ENDIF
      ENDIF

      NRIGEL = IRIGEL(/2)
      IF (NRIGEL.EQ.0) THEN
        CALL ERREUR(19)
      ENDIF

 9990 CONTINUE
      IF (IERR.NE.0) THEN
        SEGSUP,MRIGID
      ELSE
        SEGDES,MRIGID
        CALL ECROBJ('RIGIDITE',IPRIGI)
      ENDIF
 9991 CONTINUE
C      SEGSUP,MOELEC,MODTHR,MODTHM,MODRAY,MODCNV,MODIFF

      END

 
 
 
 
 
