promat
C PROMAT SOURCE CB215821 20/11/25 13:37:23 10792 $ MPRIC,MDUAC,IMATC, $ CHPOD, $ MPCDB,MDCDB,IMTCDB, $ IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : PROMAT C DESCRIPTION : Produit de matrices élémentaires. C C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF) C mél : gounand@semt2.smts.cea.fr C*********************************************************************** C APPELES : REPICO, INCCOM, KRIPEE C MELCOM, KRIPME C RPENEN, EXINCS, RPENLE, MKNBNC, MIPCDB, MIDCDB C RPELEN, ML2LIE, RPELLE, MKLBLC, MLDCDB C CP2LR, MA2LIR, PROLIS, LI2MAS C APPELES (STAT.) : PRMSTA, INMSTA C APPELE PAR : PRCMCT C*********************************************************************** C ENTREES : MPRIB, MDUAB, IMATB, MPRIC, MDUAC, IMATC, CHPOD C SORTIES : MPCDB, MDCDB, IMTCDB C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 12/05/99, version initiale C HISTORIQUE : v1, 12/05/99, 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*********************************************************************** * * Il faudra faire les suppressions de segments en tenant * compte des exceptions. * -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMELEME POINTEUR MPRIB.MELEME POINTEUR MDUAB.MELEME POINTEUR MPRIC.MELEME POINTEUR MDUAC.MELEME POINTEUR MPCDB.MELEME POINTEUR MDCDB.MELEME POINTEUR MAIPRI.MELEME -INC SMMATRIK POINTEUR IMATB.IMATRI POINTEUR IMATC.IMATRI POINTEUR IMTCDB.IMATRI -INC SMCHPOI POINTEUR CHPOD.MCHPOI -INC SMLMOTS POINTEUR ICOGLO.MLMOTS -INC SMLENTI POINTEUR ICPRIB.MLENTI POINTEUR ICDUAB.MLENTI POINTEUR ICPRIC.MLENTI POINTEUR ICDUAC.MLENTI POINTEUR ICPRID.MLENTI POINTEUR JCPRIB.MLENTI POINTEUR JCDUAB.MLENTI POINTEUR JCPRIC.MLENTI POINTEUR JCDUAC.MLENTI POINTEUR ICOPRI.MLENTI POINTEUR KRIPRI.MLENTI POINTEUR LNBMEB.MLENTI POINTEUR LNBMEC.MLENTI POINTEUR ICPCDB.MLENTI POINTEUR KRMPRI.MLENTI POINTEUR LELEMB.MLENTI POINTEUR LELEMC.MLENTI * * Includes persos * * * Segment LSTIND (liste séquentielle indexée) * SEGMENT LSTIND INTEGER IDX(NBM+1) INTEGER IVAL(NBTVAL) ENDSEGMENT * * LISTE SEQUENTIELLE INDEXEE D'ENTIERS * * NBM : NOMBRE DE MULTIPLETS * NBTVAL : NOMBRE TOTAL DE VALEURS * IDX(I) : INDICE DE LA PREMIERE VALEUR DU IEME * MULTIPLET DANS LE TABLEAU IVAL * IVAL(IDX(I) -> IDX(I+1)-1) : VALEURS DU IEME MULTIPLET *-INC SLSTIND POINTEUR LIPNMC.LSTIND POINTEUR LINBNC.LSTIND POINTEUR ICDCDB.LSTIND POINTEUR LMDUAB.LSTIND POINTEUR LMPRIB.LSTIND POINTEUR LMPRIC.LSTIND POINTEUR LMDUAC.LSTIND POINTEUR LIPNLC.LSTIND POINTEUR LILBLC.LSTIND POINTEUR LMPCDB.LSTIND POINTEUR LMDCDB.LSTIND SEGMENT LSRIND INTEGER IDXX(NBM+1) REAL*8 XVAL(NBTVAL) ENDSEGMENT SEGMENT LLI POINTEUR LISLI(NBME).LSRIND ENDSEGMENT POINTEUR LMATRB.LLI POINTEUR LMATRC.LLI POINTEUR LMACDB.LLI -INC SMLREEL SEGMENT LLR POINTEUR LISLR(NBME).MLREEL ENDSEGMENT POINTEUR LCHPOD.LLR *STAT-INC SMSTAT *STAT POINTEUR MSTEMP.MSTAT * INTEGER IMPR,IRET * INTEGER NIUNIQ,NIPRI INTEGER NTOTPO,NPPRI,NELC * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans promat.eso' *STAT CALL INMSTA(MSTAT,0) * Repérage global des inconnues : ICOGLO (LISTMOTS) * Noms des inconnues primales et duales de B et C exprimées * dans ce repérage : IC{PRI,DUA}{B,C} * (Eventuellement, si CHPOD.NE.0) : * Noms des inconnues de CHPOD dans ce repérage * In REPICO : SEGINI ICOGLO * In REPICO : SEGINI ICPRIB * In REPICO : SEGINI ICDUAB * In REPICO : SEGINI ICPRIC * In REPICO : SEGINI ICDUAC * In REPICO : SEGINI ICPRID *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'repico' $ ICOGLO,ICPRIB,ICDUAB,ICPRIC,ICDUAC,ICPRID, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * SEGPRT,ICOGLO *STAT CALL PRMSTA(' repico',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) SEGACT ICOGLO SEGDES ICOGLO * Construction de ICOPRI (LISTENTI), liste des inconnues * appartenant à la fois à ICPRIB, ICPRIC et ICPRID * In INCCOM : SEGINI ICOPRI *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'inccom' $ ICOPRI, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * SEGPRT,ICOPRI *STAT CALL PRMSTA(' inccom',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) * Si ICOPRI est vide, on sort prématurément SEGACT ICOPRI NIPRI=ICOPRI.LECT(/1) SEGDES ICOPRI IF (NIPRI.EQ.0) THEN *! write(ioimp,*) 'pas d''inconnues communes' * SEGINI ICOPRI * SEGINI ICPRID * SEGINI ICDUAC * SEGINI ICPRIC (exception) * SEGINI ICDUAB * SEGINI ICPRIB * SEGINI ICOGLO SEGSUP ICOPRI SEGSUP ICPRID SEGSUP ICDUAC SEGSUP ICPRIC SEGSUP ICDUAB SEGSUP ICPRIB SEGSUP ICOGLO GOTO 9998 ENDIF * Sinon, on construit KRIPRI où on a repéré les inconnues de ICOPRI * dans le segment des inconnues globales * In KRIPEE : SEGINI KRIPRI *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'kripee' $ KRIPRI, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * SEGPRT,KRIPRI *STAT CALL PRMSTA(' kripee',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) *STAT CALL PRMSTA(' Inc. primales communes',MSTAT,1) SEGSUP ICOPRI * Construction du maillage des points communs au maillage * primal de B, au maillage primal de C et au maillage sous-tendant * CHPOD (si CHPOD.NE.0) NTOTPO=nbpts * In MELCOM : SEGINI MAIPRI *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'melcom' $ MAIPRI, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' melcom',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) * Si MAIPRI est vide, on sort prématurément SEGACT MAIPRI NPPRI=MAIPRI.NUM(/2) SEGDES MAIPRI IF (NPPRI.EQ.0) THEN *! write(ioimp,*) 'pas de points communs' * SEGINI MAIPRI * SEGINI KRIPRI * SEGINI ICPRID * SEGINI ICDUAC (exception) * SEGINI ICPRIC * SEGINI ICDUAB * SEGINI ICPRIB * SEGINI ICOGLO SEGSUP MAIPRI SEGSUP KRIPRI SEGSUP ICPRID SEGSUP ICDUAC SEGSUP ICPRIC SEGSUP ICDUAB SEGSUP ICPRIB SEGSUP ICOGLO GOTO 9998 ENDIF * Sinon, on construit le segment de repérage dans MAIPRI * In KRIPME : SEGINI KRMPRI *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'kripme' $ KRMPRI, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' kripme',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) *STAT CALL PRMSTA(' Points primaux communs',MSTAT,1) SEGSUP MAIPRI * * Traitement des inconnues * * On repère les éléments de ICPRIB qui sont dans ICOPRI * In RPENEN : SEGINI LNBMEB *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'rpenen1' $ LNBMEB, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * On repère les éléments de ICPRIC qui sont dans ICOPRI * In RPENEN : SEGINI LNBMEC * WRITE(IOIMP,*) 'rpenen2' $ LNBMEC, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * SEGPRT,LNBMEB * SEGPRT,LNBMEC *STAT CALL PRMSTA(' rpenen*2',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) * Extraction des inconnues qui vont servir * In EXINCS : SEGINI JCPRIB * In EXINCS : SEGINI JCDUAB * In EXINCS : SEGINI JCPRIC * In EXINCS : SEGINI JCDUAC *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'exincs' $ LNBMEB,LNBMEC, $ JCDUAB,JCPRIB,JCPRIC,JCDUAC, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' exincs',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) SEGSUP ICDUAC SEGSUP ICPRIC SEGSUP ICDUAB SEGSUP ICPRIB * On crée la liste indexée de correspondance : * une inconnue de ICOPRI -> n°s(IBMEs) matrice C tels que * JCPRIC(IBME)=ICOPRI * In RPENLE : SEGINI LIPNMC *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'rpenle' $ LIPNMC, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * SEGPRT,JCPRIC * SEGPRT,LIPNMC *STAT CALL PRMSTA(' rpenle',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) * On crée la liste indexée de correspondance : * n°(NBME) matrice B -> n°s(NBMEs) matrice C ayant la même inconnue * primale * In MKNBNC : SEGINI LINBNC *STAT CALL INMSTA(MSTEMP,0) * SEGPRT,JCPRIB * WRITE(IOIMP,*) 'mknbnc' $ LINBNC, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' mknbnc',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) * On construit la liste des inconnues primales de CD-1Bt * In MIPCDB : SEGINI ICPCDB *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'mipcdb' $ ICPCDB, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' mipcdb',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) * On construit la liste indexée à la précédente des * inconnues duales de CD-1Bt. * In MIDCDB : SEGINI ICDCDB *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'midcdb' $ ICDCDB, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' midcdb',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) *STAT CALL PRMSTA(' Traitement des inconnues',MSTAT,1) SEGSUP LINBNC * * Traitement des maillages * * Construction de la liste des éléments du maillage primal de B * qui contiennent un point de MAIPRI. * In RPELEN : SEGINI LELEMB *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'rpelen1' $ LELEMB, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * SEGPRT,LELEMB * Construction de la liste des éléments du maillage primal de C * qui contiennent un point de MAIPRI. * In RPELEN : SEGINI LELEMC * WRITE(IOIMP,*) 'rpelen2' $ LELEMC, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * SEGPRT,LELEMC *STAT CALL PRMSTA(' rpelen*2',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) * Extraction des éléments des MELEMEs qui vont servir et * transformation en listes indexées plus faciles à manipuler * In ML2LIE : SEGINI LMDUAB * In ML2LIE : SEGINI LMPRIB * In ML2LIE : SEGINI LMPRIC * In ML2LIE : SEGINI LMDUAC *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'ml2lie' $ LELEMB,LELEMC, $ LMDUAB,LMPRIB,LMPRIC,LMDUAC, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' ml2lie',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) * On crée la liste indexée de correspondance : * un point de MAIPRI -> n°s des éléments de LMPRIC qui contiennent * ce point * In REPELLE : SEGINI LIPNLC *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'rpelle' $ LIPNLC, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' rpelle',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) * On crée la liste indexée de correspondance : * n° matrice élémentaire B -> n°s matrices élémentaires C SEGACT LMPRIC NELC=LMPRIC.IDX(/1)-1 SEGDES LMPRIC * In MKLBLC : SEGINI LILBLC *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'mklblc' $ LILBLC, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' mklblc',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) SEGSUP LIPNLC * On construit la liste des éléments primaux de CD-1Bt. * C'est déjà fait, c'est LMDUAB LMPCDB=LMDUAB * On construit la liste des éléments duaux de CD-1Bt. * In MLDCDB : SEGINI LMDCDB *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'mldcdb' $ LMDCDB, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' mldcdb',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) *STAT CALL PRMSTA(' Traitement des maillages',MSTAT,1) * * Traitement (éventuel) du chpoint * * In CP2LR : SEGINI LCHPOD * In CP2LR : SEGINI LCHPOD.LISLR(*) * Attention, 2 segments supp. sont créés du fait du fonctionnement de * DTCHPO. *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'cp2lr' $ ICPRID,ICOGLO,KRIPRI,NIPRI, $ KRMPRI,NPPRI, $ LCHPOD, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' cp2lr ',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) *STAT CALL PRMSTA(' Traitement du chpoint',MSTAT,1) IF (ICPRID.NE.0) THEN SEGSUP ICPRID ENDIF * * Traitement des matrices * * Extraction des éléments des IMATRIs qui vont servir et * transformation en listes indexées plus faciles à manipuler * In MA2LIR : SEGINI LMATRB * In MA2LIR : SEGINI LMATRB.LISLI(*) * In MA2LIR : SEGINI LMATRC * In MA2LIR : SEGINI LMATRC.LISLI(*) *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'ma2lir' $ LNBMEB,LNBMEC,LELEMB,LELEMC, $ LMATRB,LMATRC, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * SEGPRT,LMATRB * SEGPRT,LMATRC *STAT CALL PRMSTA(' ma2lir',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) *STAT CALL PRMSTA(' Traitement des matrices',MSTAT,1) SEGSUP LELEMC SEGSUP LELEMB SEGSUP LNBMEC SEGSUP LNBMEB * Produit des matrices stockées sous forme de listes indexées * In MA2LIR : SEGINI LMACDB * In MA2LIR : SEGINI LMACDB.LISLI(*) *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'prolis' $ LIPNMC, KRIPRI, $ LMDUAB,LMPRIB,LMPRIC,LMDUAC, $ LILBLC,KRMPRI, $ LCHPOD,LMATRB,LMATRC, $ ICPCDB,ICDCDB,NIUNIQ, $ LMPCDB,LMDCDB,NTOTPO, $ LMACDB, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * WRITE(IOIMP,*) 'apres prolis' *STAT CALL PRMSTA(' prolis',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) *STAT CALL PRMSTA(' On effectue le produit',MSTAT,1) SEGACT LMATRC*MOD SEGSUP LMATRC.LISLI(*) * SEGDES LMATRC SEGSUP LMATRC SEGACT LMATRB*MOD SEGSUP LMATRB.LISLI(*) * SEGDES LMATRB SEGSUP LMATRB IF (LCHPOD.NE.0) THEN SEGACT LCHPOD*MOD SEGSUP LCHPOD.LISLR(*) * SEGDES LCHPOD SEGSUP LCHPOD ENDIF SEGSUP LILBLC SEGSUP LMDUAC SEGSUP LMPRIC SEGSUP LMPRIB SEGSUP LIPNMC SEGSUP JCDUAC SEGSUP JCPRIC SEGSUP JCDUAB SEGSUP JCPRIB SEGSUP KRMPRI SEGSUP KRIPRI * Transformation des listes indexées résultats en maillages et en * matrices. *STAT CALL INMSTA(MSTEMP,0) * WRITE(IOIMP,*) 'li2mas' $ LMPCDB,LMDCDB,LMACDB, $ MPCDB,MDCDB,IMTCDB, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 *STAT CALL PRMSTA(' Traitement du produit',MSTAT,1) *STAT CALL PRMSTA(' li2mas',MSTEMP,1) *STAT CALL SUMSTA(MSTEMP,0) SEGACT LMACDB*MOD SEGSUP LMACDB.LISLI(*) * SEGDES LMACDB SEGSUP LMACDB SEGSUP LMDCDB SEGSUP LMPCDB SEGSUP ICDCDB SEGSUP ICPCDB SEGSUP ICOGLO *STAT CALL SUMSTA(MSTAT,0) * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * * Pas une erreur proprement dite, mais il n'y avait rien à multiplier 9998 CONTINUE MPCDB=0 MDCDB=0 IMTCDB=0 IRET=0 RETURN 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine promat' RETURN * * End of subroutine PROMAT * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales