prmcp5
C PRMCP5 SOURCE GOUNAND 24/11/06 21:15:16 12073 $ MPOPRI,KICPRI,KMCPRI, $ KICDUA,KMCDUA, $ MPODUA, $ IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : PRMCP5 C DESCRIPTION : Produit matrices élémentaires * mpoval primal C -> mpoval dual. C 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 : REGMAI, INIRPM, RPELEM C APPELE PAR : PRMCP2 C*********************************************************************** C ENTREES : MLPRI, MMLDUA, MMATEL, ICMPRI, ICMDUA, LNBME, C MPOPRI, KICPRI, KMCPRI, KICDUA, KMCDUA C ENTREES/SORTIES : - C SORTIES : MPODUA 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 SMELEME POINTEUR MMLPRI.MELEME POINTEUR MMLDUA.MELEME POINTEUR ML2PRI.MELEME POINTEUR ML2DUA.MELEME POINTEUR SMLPRI.MELEME POINTEUR SMLDUA.MELEME -INC SMMATRIK POINTEUR MMATEL.IMATRI POINTEUR VMATEL.IZAFM -INC SMLENTI POINTEUR RPMAT.MLENTI POINTEUR ICMPRI.MLENTI POINTEUR ICMDUA.MLENTI POINTEUR LNBME.MLENTI POINTEUR KICPRI.MLENTI POINTEUR KICDUA.MLENTI POINTEUR KMCPRI.MLENTI POINTEUR KMCDUA.MLENTI -INC SMCHPOI POINTEUR MPOPRI.MPOVAL POINTEUR MPODUA.MPOVAL * INTEGER IMPR,IRET * INTEGER ICCPRI,ICCDUA,ILMAT,NUELG,NUELOC,ITPOPR,ITPODU INTEGER IELEM ,IMATL ,IPMAT,JDMAT, ISOUM,ISOUMA,OLDISM INTEGER NELPRI,NMATL ,NPMAT,NDMAT,NBSOUM,NBSOUP,NBSOUD * * Executable statements * IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans prmcp5.eso' * On régularise les maillage pour plus se faire chier si LISOUS(/1).EQ.0 * In REGMAI : SEGINI ML2DUA * In REGMAI : SEGINI ML2PRI * * Activons les chapeaux (Matrices et supports) * SEGACT ML2DUA NBSOUD=ML2DUA.LISOUS(/1) SEGACT ML2PRI NBSOUP=ML2PRI.LISOUS(/1) SEGACT MMATEL NBSOUM=NBSOUP IF (NBSOUD.NE.NBSOUP) THEN WRITE(IOIMP,*) 'Maillage primal, dual :' WRITE(IOIMP,*) 'partitionnment différent...' WRITE(IOIMP,*) 'NBSOUD=',NBSOUD WRITE(IOIMP,*) 'NBSOUP=',NBSOUP GOTO 9999 ENDIF * * Tableau de repérage dans la matrice * * In INIRPM : SEGINI RPMAT IF (IRET.NE.0) GOTO 9999 * * Activons les tableaux de repérage * * Matrices * Inconnues SEGACT ICMPRI SEGACT ICMDUA * Matrices élémentaires à parcourir SEGACT LNBME * Chpoints SEGACT MPOPRI SEGACT MPODUA*MOD * Inconnues SEGACT KICPRI SEGACT KICDUA * Maillages SEGACT KMCPRI SEGACT KMCDUA * * Parcourons les matrices élémentaires par sous-domaine et * remplissons les valeurs de MPODUA. * NMATL=LNBME.LECT(/1) DO 1 IMATL=1,NMATL * Numéros d'inconnues dans les chpo. primaux et duaux * pour la LNBME.LECT(IMATL)ième matrice ICCPRI=KICPRI.LECT(ICMPRI.LECT(LNBME.LECT(IMATL))) ICCDUA=KICDUA.LECT(ICMDUA.LECT(LNBME.LECT(IMATL))) NUELG=0 OLDISM=1 VMATEL=MMATEL.LIZAFM(OLDISM,LNBME.LECT(IMATL)) SEGACT VMATEL DO 12 ISOUM=1,NBSOUM SMLDUA=ML2DUA.LISOUS(ISOUM) SEGACT SMLDUA SMLPRI=ML2PRI.LISOUS(ISOUM) SEGACT SMLPRI NELPRI=SMLPRI.NUM(/2) DO 122 IELEM=1,NELPRI NUELG=NUELG+1 IF (IRET.NE.0) GOTO 9999 ISOUMA=MAX(ISOUMA,1) IF (ISOUMA.NE.OLDISM) THEN SEGDES VMATEL VMATEL=MMATEL.LIZAFM(ISOUMA,LNBME.LECT(IMATL)) SEGACT VMATEL OLDISM=ISOUMA ENDIF ILMAT=NUELOC NPMAT=VMATEL.AM(/2) NDMAT=VMATEL.AM(/3) DO 1222 JDMAT=1,NDMAT ITPODU=KMCDUA.LECT(SMLDUA.NUM(JDMAT,IELEM)) IF (ITPODU.EQ.0) THEN WRITE(IOIMP,*) 'Point dual ????' GOTO 9999 ENDIF DO 12222 IPMAT=1,NPMAT ITPOPR=KMCPRI.LECT(SMLPRI.NUM(IPMAT,IELEM)) * IF (ITPOPR.EQ.0) THEN * WRITE(IOIMP,*) 'Un point du chpo. primal ', * $ 'n''est pas dans le spg primal de la ', * $ 'matrice..' * GOTO 9999 * ENDIF IF (ITPOPR.NE.0) THEN MPODUA.VPOCHA(ITPODU,ICCDUA)= $ MPODUA.VPOCHA(ITPODU,ICCDUA)+ $ (VMATEL.AM(ILMAT,IPMAT,JDMAT) $ *MPOPRI.VPOCHA(ITPOPR,ICCPRI)) ENDIF 12222 CONTINUE 1222 CONTINUE 122 CONTINUE SEGDES SMLPRI SEGDES SMLDUA 12 CONTINUE SEGDES VMATEL 1 CONTINUE * * Désactivons les tableaux de repérage * SEGDES KMCDUA SEGDES KMCPRI SEGDES KICDUA SEGDES KICPRI SEGDES LNBME SEGDES ICMDUA SEGDES ICMPRI SEGDES RPMAT SEGDES MMATEL SEGDES ML2PRI SEGDES ML2DUA SEGSUP ML2PRI SEGSUP ML2DUA * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine prmcp5' RETURN * * End of subroutine PRMCP5 * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales