prmcp2
C PRMCP2 SOURCE CB215821 20/11/25 13:37:06 10792 $ MSODUA, $ IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : PRMCP2 C DESCRIPTION : Produit matrices élémentaires * msoupo primal C -> msoupo 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 : PRMCP3, PRMCP4, PRMCP5, KRIPEE, KRIPME, C RPENEN, EXENEN, IUNIQ, MLUNIQ C APPELE PAR : PRDMCP C*********************************************************************** C ENTREES : MMLPRI, MMLDUA, MMATEL, MSOPRI C ENTREES/SORTIES : - C SORTIES : MSODUA 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 SMCOORD -INC SMELEME POINTEUR MMLPRI.MELEME POINTEUR MMLDUA.MELEME POINTEUR MLCPRI.MELEME POINTEUR MLCDUA.MELEME -INC SMMATRIK POINTEUR MMATEL.IMATRI -INC SMCHPOI POINTEUR MSOPRI.MSOUPO POINTEUR MSODUA.MSOUPO INTEGER N,NC POINTEUR MPOPRI.MPOVAL POINTEUR MPODUA.MPOVAL -INC SMLMOTS POINTEUR ICOGLO.MLMOTS -INC SMLENTI INTEGER JG POINTEUR ICMPRI.MLENTI POINTEUR ICMDUA.MLENTI POINTEUR ICCPRI.MLENTI POINTEUR ICCDUA.MLENTI POINTEUR ICOPRI.MLENTI POINTEUR KRIPRI.MLENTI POINTEUR KICPRI.MLENTI POINTEUR KICDUA.MLENTI POINTEUR KMCPRI.MLENTI POINTEUR KMCDUA.MLENTI POINTEUR LNBME.MLENTI * * Includes persos * INTEGER NBMEL SEGMENT MELS POINTEUR LISMEL(NBMEL).MELEME ENDSEGMENT POINTEUR GPMELS.MELS * INTEGER ICDUA INTEGER NCDUA INTEGER NBDUAL,NBDUA2,NIPRI,NIUNIQ,NTOTPO,NPODUA INTEGER IMPR,IRET * * Executable statements * IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans prmcp2.eso' * * On s'occupe d'abord des inconnues * * Repérage global des inconnues : ICOGLO (LISTMOTS) * Numéros des inconnues primales et duales de la matrice exprimées * dans ce repérage : ICMPRI, ICMDUA * Numéros des inconnues du chpoint primal : ICCPRI * i.e. * ICOGLO: MLMOTS qui contient les inconnues primales, * duales et les composantes du CHPOINT * que un seul fois * ICMPRI.LECT(i) = position de l'inconnue MMATEL.LISPRI(i) * dans ICOGLO * ICMDUA.LECT(i) = position de l'inconnue MMATEL.LISDUA(i) * dans ICOGLO * ICCPRI.LECT(i) = position de l'inconnue MSOPRI.COMP(i) * dans ICCPRI * * In PRMCP3 : SEGINI ICOGLO * In PRMCP3 : SEGINI ICMPRI * In PRMCP3 : SEGINI ICMDUA * In PRMCP3 : SEGINI ICCPRI $ ICOGLO,ICMPRI,ICMDUA,ICCPRI, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 SEGACT ICOGLO SEGDES ICOGLO * * Construction de ICOPRI (LISTENTI), liste des inconnues * appartenant à la fois à ICMPRI et ICCPRI * i.e. * ICOPRI.LECT(/1) = nombre d'inconnues communes * ICOGLO.MOTS(ICOPRI.LECT(i)) = les inconnues communes * * In PRCMP4 : SEGINI ICOPRI $ ICOPRI, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * Bien sur, si ICOPRI est vide, il n'y a pas d'inconnues * communes; donc on sort prématurément SEGACT ICOPRI NIPRI=ICOPRI.LECT(/1) SEGDES ICOPRI IF (NIPRI.EQ.0) THEN * SEGINI ICOPRI * SEGINI ICCPRI * SEGINI ICMDUA * SEGINI ICMPRI * SEGINI ICOGLO SEGSUP ICOPRI SEGSUP ICCPRI SEGSUP ICMDUA SEGSUP ICMPRI SEGSUP ICOGLO GOTO 9998 ENDIF * Sinon, on construit KRIPRI où on a repéré les inconnues de ICOPRI * dans le segment des inconnues globales * i.e. * KRIPRI.LECT(j) = 0 si ICOGLO.MOTS(j) n'est pas une inconnue * commune; sinon * KRIPRI.LECT(ICOPRI.LECT(i)) = i * * In KRIPEE : SEGINI KRIPRI $ KRIPRI, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 SEGSUP ICOPRI * On repère les inconnues de ICMPRI qui sont dans ICOPRI * i.e. * LNBME.LECT(/1) = nombre d'inconnues de MMATEL.LISPRI * qui sont dedans ICOGLO * LNBME.LECT(i) = inconnues de MMATEL.LISPRI en ICOGLO * * In RPENEN : SEGINI LNBME $ LNBME, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 SEGSUP KRIPRI * * Ceci permet de construire les inconnues du chpo. dual * * ICCDUA.LECT(/1) = LNBME.LECT(/1) * ICCDUA.LECT(i) = les inconnues duales qui correspondent * aux inconnues primales en ICOGLO * Donc on extrait de ICCDUA (i.e. de MMATEL.LISDUA) * les seules composantes qui interviennent dans la * multiplication. * * In EXENEN : SEGINI ICCDUA * $ ICCDUA, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * On y supprimme le doublons en ICCDUA SEGACT ICCDUA*MOD NBDUA2=ICCDUA.LECT(/1) $ ICCDUA.LECT,NBDUAL,IMPR,IRET) IF (IRET.NE.0) GOTO 9999 JG=NBDUAL SEGADJ ICCDUA SEGDES ICCDUA * On construit KICPRI où on a repéré les inconnues de ICCPRI * dans le segment des inconnues globales * In KRIPEE : SEGINI KICPRI $ KICPRI, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 SEGSUP ICCPRI * On construit KICDUA où on a repéré les inconnues de ICCDUA * dans le segment des inconnues globales * In KRIPEE : SEGINI KICDUA $ KICDUA, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * * On s'occupe des maillages * NTOTPO=nbpts * Le support géométrique de MSODUA sera le maillage des points * de MMLDUA NBMEL=1 SEGINI GPMELS GPMELS.LISMEL(1)=MMLDUA IF (IRET.NE.0) GOTO 9999 SEGSUP GPMELS SEGACT MSOPRI MLCPRI=MSOPRI.IGEOC MPOPRI=MSOPRI.IPOVAL * On construit KMCPRI où on a repéré les points de MLCPRI * dans le segment des points globaux * In KRIPME : SEGINI KMCPRI $ KMCPRI, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * On construit KMCDUA où on a repéré les points de MLCDUA * dans le segment des points globaux * In KRIPME : SEGINI KMCDUA $ KMCDUA, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * On initialise le chpoint dual * Inconnues SEGACT ICOGLO SEGACT ICCDUA NCDUA=ICCDUA.LECT(/1) NC=NCDUA SEGINI MSODUA DO 3 ICDUA=1,NCDUA 3 CONTINUE * SEGDES ICCDUA SEGSUP ICCDUA * SEGDES ICOGLO SEGSUP ICOGLO * Maillage SEGACT MLCDUA NPODUA=MLCDUA.NUM(/2) SEGDES MLCDUA MSODUA.IGEOC=MLCDUA NC=NCDUA N=NPODUA SEGINI MPODUA MSODUA.IPOVAL=MPODUA * * On effectue le produit (remplissage de MPODUA) * $ MPOPRI,KICPRI,KMCPRI, $ KICDUA,KMCDUA, $ MPODUA, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 SEGSUP KMCDUA SEGSUP KMCPRI SEGSUP KICDUA SEGSUP KICPRI SEGSUP LNBME SEGSUP ICMPRI SEGSUP ICMDUA * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * * Pas une erreur proprement dite, mais il n'y avait pas de composantes communes 9998 CONTINUE MSODUA=0 IRET=0 RETURN 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine prmcp2' RETURN * * End of subroutine PRMCP2 * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales