mkizat
C MKIZAT SOURCE GOUNAND 24/11/06 21:15:13 12073 $ KRINCD,KRINCP,KMINCT,KRSPGT, $ PMTOT, $ IZATOT, $ IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : MKIZAT C DESCRIPTION : Matrice élémentaire + Profil Morse de la matrice C assemblée => ajout de la contribution de la transposée C de la matrice élémentaire aux valeurs de la matrice C Morse assemblée. C C Le profil Morse est supposé avoir ses colonnes C ordonnées. C C !!!!!!!! C Ce source devrait être quasiment identique à mkiza et évolué en C même temps... 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, IFIDIC, INIRPM C APPELE PAR : PRASEM C*********************************************************************** C ENTREES : MELDUA, MELPRI, IMATEL, KRINCD, KRINCP, KMINCT, C KRSPGT, PMTOT C ENTREES/SORTIES : IZATOT C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 16/12/99 C HISTORIQUE : v1, 16/12/99, création C HISTORIQUE : 05/01/00 : On ne suppose plus les maillages duaux et C primaux partitionnés de la même façon que les matrices C élémentaires. 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 MELDUA.MELEME POINTEUR ML2DUA.MELEME POINTEUR SMLDUA.MELEME POINTEUR MELPRI.MELEME POINTEUR ML2PRI.MELEME POINTEUR SMLPRI.MELEME -INC SMMATRIK POINTEUR IMATEL.IMATRI POINTEUR VMATEL.IZAFM POINTEUR KMINCT.MINC POINTEUR PMTOT.PMORS POINTEUR IZATOT.IZA -INC SMLENTI POINTEUR KRINCD.MLENTI POINTEUR KRINCP.MLENTI POINTEUR KRSPGT.MLENTI POINTEUR RPMAT.MLENTI * INTEGER IMPR,IRET * INTEGER IDX,IDXDEB INTEGER ISOUM,NBSOUM,NBSOUD,NBSOUP INTEGER ITDDLD,ITDDLP,ITIDUA,ITIPRI,ITPODU,ITPOPR INTEGER NBCMPD,NBCMPP,NELPRI INTEGER ILMAT,JDMAT,IPMAT,IMATL INTEGER NLMAT,NDMAT,NPMAT,NBMATL INTEGER LONLIG INTEGER IELEM INTEGER NUELG,OLDISM,ISOUMA,NUELOC * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans mkizat' * 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 IMATEL NBSOUM=NBSOUP NBMATL=IMATEL.LIZAFM(/2) 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 * SEGACT KRINCD NBCMPD=KRINCD.LECT(/1) SEGACT KRINCP NBCMPP=KRINCP.LECT(/1) IF (NBCMPD.NE.NBMATL.OR.NBCMPP.NE.NBMATL) THEN WRITE(IOIMP,*) 'KRINCD, KRINCP et IMATEL :' WRITE(IOIMP,*) 'nb. comp. différents...' GOTO 9999 ENDIF SEGACT KMINCT SEGACT KRSPGT SEGACT PMTOT SEGACT IZATOT*MOD * * Parcourons les matrices élémentaires par sous-domaine et * remplissons les valeurs de la matrice Morse. * DO 1 IMATL=1,NBMATL ITIDUA=KRINCD.LECT(IMATL) ITIPRI=KRINCP.LECT(IMATL) NUELG=0 OLDISM=1 VMATEL=IMATEL.LIZAFM(OLDISM,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=IMATEL.LIZAFM(ISOUMA,IMATL) SEGACT VMATEL OLDISM=ISOUMA ENDIF ILMAT=NUELOC NPMAT=VMATEL.AM(/2) NDMAT=VMATEL.AM(/3) DO 1222 JDMAT=1,NDMAT ITPODU=KRSPGT.LECT(SMLDUA.NUM(JDMAT,IELEM)) IF (ITPODU.EQ.0) THEN WRITE(IOIMP,*) 'Point dual ????' GOTO 9999 ENDIF C Test du MPOS... déjà fait dans mkpmor... ITDDLD=KMINCT.NPOS(ITPODU) $ + KMINCT.MPOS(ITPODU,ITIDUA)-1 C IPMAT parce que IDMAT est le nom d'un segment par défaut... DO 12222 IPMAT=1,NPMAT ITPOPR=KRSPGT.LECT(SMLPRI.NUM(IPMAT,IELEM)) IF (ITPOPR.EQ.0) THEN WRITE(IOIMP,*) 'Point primal ????' GOTO 9999 ENDIF ITDDLP=KMINCT.NPOS(ITPOPR) $ + KMINCT.MPOS(ITPOPR,ITIPRI)-1 IDXDEB=PMTOT.IA(ITDDLP) LONLIG=PMTOT.IA(ITDDLP+1)-IDXDEB IF (LONLIG.EQ.0) THEN WRITE(IOIMP,*) 'Ligne inex. ddl pri =',ITDDLP GOTO 9999 ENDIF $ IDX, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 IZATOT.A(IDXDEB+IDX-1)=IZATOT.A(IDXDEB+IDX-1) $ + VMATEL.AM(ILMAT,IPMAT,JDMAT) 12222 CONTINUE 1222 CONTINUE 122 CONTINUE SEGDES VMATEL 12 CONTINUE SEGDES SMLPRI SEGDES SMLDUA 1 CONTINUE SEGDES IZATOT SEGDES PMTOT SEGDES KRSPGT SEGDES KMINCT SEGDES KRINCP SEGDES KRINCD SEGSUP RPMAT SEGDES IMATEL 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 mkizat' RETURN * * End of subroutine MKIZAT * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales