mkpmor
C MKPMOR SOURCE PV 20/09/26 21:18:57 10724 $ KRSPGT,KMINCT, $ PMCOU, $ IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : MKPMOR C PROJET : Assemblage matrice élémentaire -> matrice Morse C DESCRIPTION : Matrice élémentaire + liste indexée d'entiers(popoin) => C Profil Morse de la matrice assemblée (les colonnes ne C sont pas ordonnées). 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 : CORINC C APPELE PAR : MAKPRM C*********************************************************************** C ENTREES : LPDPP, KJSPGD, KRINCP, KRINCD, KRSPGT, KMINCT C SORTIES : PMCOU C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 06/10/99, version initiale C HISTORIQUE : v1, 06/10/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*********************************************************************** * * * On peut optimiser les boucles en sortant les NPOS * * -INC PPARAM -INC CCOPTIO -INC SMELEME POINTEUR KJSPGD.MELEME -INC SMMATRIK POINTEUR KMINCT.MINC INTEGER NTT,NJA POINTEUR PMCOU.PMORS -INC SMLENTI INTEGER JG POINTEUR KRINCD.MLENTI POINTEUR KRIDUN.MLENTI POINTEUR KRINCP.MLENTI POINTEUR KRSPGT.MLENTI POINTEUR DD2DP.MLENTI * * Includes perso * *-INC SLSTIND * * 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 POINTEUR LIPUN.LSTIND POINTEUR LPDPP.LSTIND * INTEGER IMPR,IRET * LOGICAL LEXIST INTEGER IDEPA INTEGER IDUNIQ,IPUNIQ,IPDUA,IPPRI,ITTDDL INTEGER NDUNIQ,NPDUA, NTTDDL INTEGER NOPPR,NOPDU INTEGER NUTPPR,NUTPDU,NUTDPR,NUTDDU INTEGER NTOTCO,NTOTPO * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans mkpmor' C Pour chaque composante primale distincte, il faudrait déterminer C avec quels composantes duales distinctes il est relié : C Par exemple, si on a : C KRINCD = 1 1 1 2 C KRINCP = 2 2 3 4 C On a : KRIDUN = 1 2 C On veut : LIPUN = (2 3) (4) (c'est une liste indexée) C $ KRIDUN,LIPUN, $ IMPR,IRET) C - Construire la liste d'entiers suivante (DD2DP) : C * Nombre d'entiers = nb total de ddl (primaux) ; C * pour chaque ddl primal : nb. total de ddl duaux qui lui C sont reliés. SEGACT KRIDUN NDUNIQ=KRIDUN.LECT(/1) SEGACT LIPUN SEGACT KJSPGD SEGACT KRSPGT SEGACT KMINCT NTOTPO=KMINCT.NPOS(/1)-1 NTTDDL=KMINCT.NPOS(NTOTPO+1)-1 JG=NTTDDL SEGINI DD2DP SEGACT LPDPP NPDUA=KJSPGD.NUM(/2) DO 1 IPDUA=1,NPDUA NOPDU=KJSPGD.NUM(1,IPDUA) NUTPDU=KRSPGT.LECT(NOPDU) IF (NUTPDU.EQ.0) THEN WRITE(IOIMP,*) 'C''est dual grave...' GOTO 9999 ENDIF DO 12 IDUNIQ=1,NDUNIQ LEXIST=(KMINCT.MPOS(NUTPDU,KRIDUN.LECT(IDUNIQ)).NE.0) IF (.NOT.LEXIST) THEN WRITE(IOIMP,*) 'C''est comp. duale grave...' GOTO 9999 ENDIF NUTDDU=KMINCT.NPOS(NUTPDU) $ +KMINCT.MPOS(NUTPDU,KRIDUN.LECT(IDUNIQ))-1 DD2DP.LECT(NUTDDU)=(LIPUN.IDX(IDUNIQ+1)-LIPUN.IDX(IDUNIQ)) $ *(LPDPP.IDX(IPDUA+1)-LPDPP.IDX(IPDUA)) 12 CONTINUE 1 CONTINUE C C - Dimensionner le profil Morse C NTOTCO=0 DO 3 ITTDDL=1,NTTDDL NTOTCO=NTOTCO+DD2DP.LECT(ITTDDL) 3 CONTINUE NTT=NTTDDL NJA=NTOTCO SEGINI PMCOU C C - Remplissage du profil de la matrice Morse : C * Le tableau IA : PMCOU.IA(1)=1 DO 5 ITTDDL=1,NTTDDL PMCOU.IA(ITTDDL+1)=PMCOU.IA(ITTDDL) $ +DD2DP.LECT(ITTDDL) 5 CONTINUE SEGSUP DD2DP C * Le tableau JA : DO 7 IPDUA=1,NPDUA NOPDU=KJSPGD.NUM(1,IPDUA) NUTPDU=KRSPGT.LECT(NOPDU) DO 72 IDUNIQ=1,NDUNIQ NUTDDU=KMINCT.NPOS(NUTPDU) $ +KMINCT.MPOS(NUTPDU,KRIDUN.LECT(IDUNIQ))-1 IDEPA=PMCOU.IA(NUTDDU) DO 722 IPPRI=LPDPP.IDX(IPDUA),LPDPP.IDX(IPDUA+1)-1 NOPPR=LPDPP.IVAL(IPPRI) NUTPPR=KRSPGT.LECT(NOPPR) DO 7222 IPUNIQ=LIPUN.IDX(IDUNIQ),LIPUN.IDX(IDUNIQ+1)-1 NUTDPR=KMINCT.NPOS(NUTPPR) $ +KMINCT.MPOS(NUTPPR,LIPUN.IVAL(IPUNIQ))-1 PMCOU.JA(IDEPA)=NUTDPR IDEPA=IDEPA+1 7222 CONTINUE 722 CONTINUE 72 CONTINUE 7 CONTINUE SEGDES PMCOU SEGDES LPDPP SEGDES KMINCT SEGDES KRSPGT SEGDES KJSPGD SEGSUP LIPUN SEGSUP KRIDUN * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine mkpmor' RETURN * * End of subroutine MKPMOR * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales