C PRDMCP    SOURCE    CB215821  25/04/23    21:15:33     12247          
      SUBROUTINE PRDMCP(MATELE,MCHPRI,MCHDUA)
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8 (A-H,O-Z)
C***********************************************************************
C NOM         : PRDMCP
C DESCRIPTION : Produit matrices élémentaires * chpo. primal
C                       -> chpo. dual.
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          : PRMCP2
C APPELES (UTIL.)  : FIXMEL, ADCHPO, DTCHPO, ERREUR
C APPELE PAR       : KOPS
C***********************************************************************
C ENTREES            : MATELE, MCHPRI
C ENTREES/SORTIES    : -
C SORTIES            : MCHDUA
C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
C***********************************************************************
C VERSION    : v1, 18/04/2000, version initiale
C HISTORIQUE : v1, 18/04/2000, 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 SMMATRIK
      POINTEUR MATELE.MATRIK
      POINTEUR MMATEL.IMATEL
-INC SMCHPOI
-INC SMCOORD
      INTEGER NAT,NSOUPO
      POINTEUR MCHPRI.MCHPOI
      POINTEUR MSOPRI.MSOUPO
      POINTEUR MCHDUA.MCHPOI
      POINTEUR MCHTOT.MCHPOI
      POINTEUR MCHTMP.MCHPOI
      POINTEUR MSOTMP.MSOUPO
-INC SMELEME
      POINTEUR MELPRI.MELEME
      POINTEUR MELPR2.MELEME
      POINTEUR MMLPRI.MELEME
      POINTEUR MELDUA.MELEME
      POINTEUR MELDU2.MELEME
      POINTEUR MMLDUA.MELEME
*
      INTEGER IMPR,IRET
      INTEGER NMATE,NSOPRI
      INTEGER IMATE,ISOPRI
*
* Executable statements
*
      IMPR=IIMPI
      IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans prdmcp.eso'
* Correction des maillages (à supprimer dès que possible)
      SEGACT MATELE*MOD
      NMATE=MATELE.IRIGEL(/2)
      DO 1 IMATE=1,NMATE
         MELPRI=MATELE.IRIGEL(1,IMATE)
         MELDUA=MATELE.IRIGEL(2,IMATE)
         CALL FIXMEL(MELPRI,MELDUA,
     $        MELPR2,MELDU2,
     $        IMPR,IRET)
         IF (IRET.NE.0) GOTO 9999
         MATELE.IRIGEL(1,IMATE)=MELPR2
         MATELE.IRIGEL(2,IMATE)=MELDU2
 1    CONTINUE
      SEGDES MATELE
* Initialisation du résultat avec un chpoint vide
      NAT=2
      NSOUPO=0
      SEGINI MCHDUA
      MCHDUA.IFOPOI=IFOUR
      MCHDUA.JATTRI(1)=2
      SEGDES MCHDUA
*
* Boucle sur les matrices et les msoupo du chpoint primal
*
      SEGACT MATELE
      NMATE=MATELE.IRIGEL(/2)
      SEGACT MCHPRI
      NSOPRI=MCHPRI.IPCHP(/1)
      DO 3 IMATE=1,NMATE
         MMLPRI=MATELE.IRIGEL(1,IMATE)
         MMLDUA=MATELE.IRIGEL(2,IMATE)
         MMATEL=MATELE.IRIGEL(4,IMATE)
         DO 4 ISOPRI=1,NSOPRI
            MSOPRI=MCHPRI.IPCHP(ISOPRI)
            CALL PRMCP2(MMLPRI,MMLDUA,MMATEL,MSOPRI,
     $           MSOTMP,
     $           IMPR,IRET)
            IF (IRET.NE.0) GOTO 9999
            IF (MSOTMP.NE.0) THEN
               NAT=2
               NSOUPO=1
               SEGINI MCHTMP
               MCHTMP.IFOPOI=IFOUR
               MCHTMP.JATTRI(1)=2
               MCHTMP.IPCHP(1)=MSOTMP
               SEGDES MCHTMP
               CALL ADCHPO(MCHDUA,MCHTMP,MCHTOT,1.D0,1.D0)
               IF (MCHTOT.EQ.0) THEN
                  WRITE(IOIMP,*) 'Pas pu faire le ET des chpoints...'
                  GOTO 9999
               ENDIF
               CALL DTCHPO(MCHDUA)
               CALL DTCHPO(MCHTMP)
               MCHDUA=MCHTOT
            ENDIF
 4       CONTINUE
 3    CONTINUE
      segact mchdua*mod
      mchdua.mochde='créé par prdmcp'
      mchdua.mtypoi=' '
      SEGDES MATELE
*
* Normal termination
*
      IRET=0
      RETURN
*
* Format handling
*
*
* Error handling
*
 9999 CONTINUE
      IRET=1
      WRITE(IOIMP,*) 'An error was detected in subroutine prdmcp'
*  153 2
* Opération illicite dans ce contexte
      CALL ERREUR(153)
      RETURN
*
* End of subroutine PRDMCP
*
      END








 
 
 
 
 
 
