mkpmo3
C MKPMO3 SOURCE PV 20/09/26 21:18:56 10724 $ KRSPGT,KMINCT, $ LDDLDU,PMCOU, $ IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : MKPMO3 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 Basé sur mkpmo2, mais ici les lignes ne sont pas non plus C ordonnées. C 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 : 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, 09/02/2016, version initiale C HISTORIQUE : v1, 09/02/2016, 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 POINTEUR LDDLDU.MLENTI POINTEUR KDDLDU.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 mkpmo3' 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) IF (IRET.NE.0) GOTO 9999 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) nddldu=npdua*nduniq jg=nddldu segini lddldu segact lpdpp nja=0 do ipdua=1,npdua nppri=LPDPP.IDX(IPDUA+1)-LPDPP.IDX(IPDUA) do iduniq=1,nduniq npuniq=LIPUN.IDX(IDUNIQ+1)-LIPUN.IDX(IDUNIQ) nja=nja+(npuniq*nppri) enddo enddo * write(ioimp,*) 'dimensionnement' * write(ioimp,*) 'nddldu= ',nddldu * write(ioimp,*) 'nja= ',nja ntt=nddldu segini pmcou * iddldu=1 ija=1 * pmcou.ia(1)=ija do ipdua=1,npdua nutpdu=krspgt.lect(kjspgd.num(1,ipdua)) do iduniq=1,nduniq nutddu=KMINCT.NPOS(NUTPDU) $ +KMINCT.MPOS(NUTPDU,KRIDUN.LECT(IDUNIQ))-1 lddldu.lect(iddldu)=nutddu pmcou.ia(iddldu)=ija iddldu=iddldu+1 do ippri=LPDPP.IDX(IPDUA),LPDPP.IDX(IPDUA+1)-1 nutppr=krspgt.lect(lpdpp.ival(ippri)) do ipuniq=LIPUN.IDX(IDUNIQ),LIPUN.IDX(IDUNIQ+1)-1 NUTDPR=KMINCT.NPOS(NUTPPR) $ +KMINCT.MPOS(NUTPPR,LIPUN.IVAL(IPUNIQ))-1 pmcou.ja(ija)=nutdpr ija=ija+1 enddo enddo enddo enddo pmcou.ia(iddldu)=ija * write(ioimp,*) 'profil morse' * write(ioimp,*) 'iddldu= ',iddldu * write(ioimp,*) 'ija= ',ija * stop 16 SEGDES LDDLDU 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 mkpmo3' RETURN * * End of subroutine MKPMO3 * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales