li2mas
C LI2MAS SOURCE PV 20/09/26 21:18:37 10724 $ LMPCDB,LMDCDB,LMACDB, $ MPCDB,MDCDB,IMTCDB, $ IMPR,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C*********************************************************************** C NOM : LI2MAS C DESCRIPTION : Transformation des listes indexées résultats en C maillages et en matrices. 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 : - C APPELE PAR : PROMAT C*********************************************************************** C ENTREES : ICPCDB, ICDCDB, ICOGLO, LMPCDB, LMDCDB, LMACDB C SORTIES : MPCDB, MDCDB, IMTCDB C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 16/02/2000, version initiale C HISTORIQUE : v1, 16/02/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 SMELEME INTEGER NBNN,NBELEM,NBSOUS,NBREF POINTEUR MPCDB.MELEME POINTEUR MDCDB.MELEME POINTEUR SMPCDB.MELEME POINTEUR SMDCDB.MELEME -INC SMMATRIK INTEGER NBME POINTEUR IMTCDB.IMATRI INTEGER NBEL,NP,MP POINTEUR SMTCDB.IZAFM -INC SMLMOTS POINTEUR ICOGLO.MLMOTS -INC SMLENTI POINTEUR ICPCDB.MLENTI POINTEUR NPLPRI.MLENTI POINTEUR NPLDUA.MLENTI INTEGER JG POINTEUR KCPLPD.MLENTI * Includes persos * Segment LSTIND (liste séquentielle indexée) SEGMENT LSTIND INTEGER IDX(NBM+1) INTEGER IVAL(NBTVAL) ENDSEGMENT *-INC SLSTIND POINTEUR ICDCDB.LSTIND POINTEUR LMPCDB.LSTIND POINTEUR LMDCDB.LSTIND INTEGER NBM,NBTVAL POINTEUR CPLEL.LSTIND SEGMENT LSRIND INTEGER IDXX(NBM+1) REAL*8 XVAL(NBTVAL) ENDSEGMENT POINTEUR SMACDB.LSRIND SEGMENT LLI POINTEUR LISLI(NBME).LSRIND ENDSEGMENT POINTEUR LMACDB.LLI * INTEGER IMPR,IRET * INTEGER IBCLPD,ILCDB,IIPRI,IMP,INP INTEGER NBCLPD,NLCDB,NIPRI INTEGER IVPLEL,IVSTRT,IVSTOP INTEGER IBME,IBSTRT,IBSTOP INTEGER JVPCDB,JVSTRT,JVSTOP INTEGER JVDCDB,JVPLEL INTEGER KVSTRT INTEGER NUEL,NUEL1,KICPD INTEGER ICPD,NPPCDB,NPDCDB,NTCLPD INTEGER MXPCDB,MXDCDB * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans li2mas.eso' * SEGPRT,ICPCDB * SEGPRT,ICDCDB * SEGPRT,ICOGLO * SEGPRT,LMPCDB * SEGPRT,LMDCDB * SEGPRT,LMACDB * SEGACT LMACDB * LSRIND=LMACDB.LISLI(1) * SEGPRT,LSRIND * * Il faut construire une partition de la matrice LMACDB * dont les supports primaux et duaux sont LMPCDB et LMDCDB * * Comptons le nb max. de points de LMPCDB et de LMDCDB pour * dimensionnement du tableau de repérage dans la partition : * On crée aussi les tableaux de nb. de points par éléments (plus * pratiques) SEGACT LMPCDB SEGACT LMDCDB NLCDB=LMPCDB.IDX(/1)-1 * D'abord, on crée les tableaux de nb. de points par éléments (plus * pratiques) JG=NLCDB SEGINI NPLPRI SEGINI NPLDUA MXPCDB=0 MXDCDB=0 DO 1 ILCDB=1,NLCDB NPPCDB=LMPCDB.IDX(ILCDB+1)-LMPCDB.IDX(ILCDB) NPLPRI.LECT(ILCDB)=NPPCDB MXPCDB=MAX(MXPCDB,NPPCDB) NPDCDB=LMDCDB.IDX(ILCDB+1)-LMDCDB.IDX(ILCDB) NPLDUA.LECT(ILCDB)=NPDCDB MXDCDB=MAX(MXDCDB,NPDCDB) 1 CONTINUE SEGDES LMDCDB SEGDES LMPCDB * SEGPRT,NPLPRI * SEGPRT,NPLDUA * WRITE(IOIMP,*) 'MXPCDB=',MXPCDB * WRITE(IOIMP,*) 'MXDCDB=',MXDCDB * Dimension de l'espace des couples (nb. points primaux, nb. points * duaux) NTCLPD=MXPCDB*MXDCDB JG=NTCLPD SEGINI KCPLPD * Nb. de couples distincts et segment de repérage sur ces couples IBCLPD=0 DO 2 ILCDB=1,NLCDB ICPD=((NPLPRI.LECT(ILCDB)-1)*MXDCDB) $ +NPLDUA.LECT(ILCDB) IF (KCPLPD.LECT(ICPD).EQ.0) THEN IBCLPD=IBCLPD+1 KCPLPD.LECT(ICPD)=IBCLPD ENDIF 2 CONTINUE NBCLPD=IBCLPD * Création d'une liste indexée : * A chaque couple repéré par son numéro d'ordre, on associe * les numéros d'éléments ILCDB * Dimensionnement de CPLEL * Pour l'instant CPLEL.IDX(IBCLPD+1)=nombre d'éléments associés au * IBCLPDème couple. NBM=NBCLPD NBTVAL=0 SEGINI CPLEL DO 3 ILCDB=1,NLCDB ICPD=((NPLPRI.LECT(ILCDB)-1)*MXDCDB) $ +NPLDUA.LECT(ILCDB) KICPD=KCPLPD.LECT(ICPD) CPLEL.IDX(KICPD+1)=CPLEL.IDX(KICPD+1)+1 3 CONTINUE * CPLEL.IDX est transformé en la liste d'indexation sur CPLEL.IVAL CPLEL.IDX(1)=1 DO 4 IBCLPD=1,NBCLPD CPLEL.IDX(IBCLPD+1)=CPLEL.IDX(IBCLPD+1)+CPLEL.IDX(IBCLPD) 4 CONTINUE NBM=NBCLPD NBTVAL=CPLEL.IDX(NBCLPD+1)-1 SEGADJ,CPLEL * CPLEL.IDX est désormais la liste des index courants sur * CPLEL.IVAL que l'on remplit. DO 5 ILCDB=1,NLCDB ICPD=((NPLPRI.LECT(ILCDB)-1)*MXDCDB) $ +NPLDUA.LECT(ILCDB) KICPD=KCPLPD.LECT(ICPD) CPLEL.IVAL(CPLEL.IDX(KICPD))=ILCDB CPLEL.IDX(KICPD)=CPLEL.IDX(KICPD)+1 5 CONTINUE * On restaure les valeurs de CPLEL.IDX DO 6 IBCLPD=NBCLPD,2,-1 CPLEL.IDX(IBCLPD)=CPLEL.IDX(IBCLPD-1) 6 CONTINUE CPLEL.IDX(1)=1 * * Création et remplissage de MPCDB * SEGACT LMPCDB NBNN=0 NBELEM=0 NBSOUS=NBCLPD NBREF=0 C SEGINI MPCDB SEGINI MPCDB DO 7 IBCLPD=1,NBCLPD IVSTRT=CPLEL.IDX(IBCLPD) IVSTOP=CPLEL.IDX(IBCLPD+1)-1 NUEL1=CPLEL.IVAL(IVSTRT) NBNN=NPLPRI.LECT(NUEL1) NBELEM=IVSTOP-IVSTRT+1 NBSOUS=0 NBREF=0 SEGINI SMPCDB * Type d'élément : POLY (cf. bdata.eso) SMPCDB.ITYPEL=32 DO 72 IVPLEL=IVSTRT,IVSTOP NUEL=CPLEL.IVAL(IVPLEL) JVSTRT=LMPCDB.IDX(NUEL) JVSTOP=LMPCDB.IDX(NUEL+1)-1 DO 722 JVPCDB=JVSTRT,JVSTOP SMPCDB.NUM(JVPCDB-JVSTRT+1,IVPLEL-IVSTRT+1)= $ LMPCDB.IVAL(JVPCDB) 722 CONTINUE 72 CONTINUE SEGDES SMPCDB MPCDB.LISOUS(IBCLPD)=SMPCDB 7 CONTINUE IF (NBCLPD.EQ.1) THEN SMPCDB=MPCDB.LISOUS(1) SEGSUP MPCDB MPCDB=SMPCDB ELSE SEGDES MPCDB ENDIF SEGDES LMPCDB * * Création et remplissage de MDCDB * SEGACT LMDCDB NBNN=0 NBELEM=0 NBSOUS=NBCLPD NBREF=0 C SEGINI MDCDB SEGINI MDCDB DO 8 IBCLPD=1,NBCLPD IVSTRT=CPLEL.IDX(IBCLPD) IVSTOP=CPLEL.IDX(IBCLPD+1)-1 NUEL1=CPLEL.IVAL(IVSTRT) NBNN=NPLDUA.LECT(NUEL1) NBELEM=IVSTOP-IVSTRT+1 NBSOUS=0 NBREF=0 SEGINI SMDCDB * Type d'élément : POLY (cf. bdata.eso) SMDCDB.ITYPEL=32 DO 82 IVPLEL=IVSTRT,IVSTOP NUEL=CPLEL.IVAL(IVPLEL) JVSTRT=LMDCDB.IDX(NUEL) JVSTOP=LMDCDB.IDX(NUEL+1)-1 DO 822 JVDCDB=JVSTRT,JVSTOP SMDCDB.NUM(JVDCDB-JVSTRT+1,IVPLEL-IVSTRT+1)= $ LMDCDB.IVAL(JVDCDB) 822 CONTINUE 82 CONTINUE SEGDES SMDCDB MDCDB.LISOUS(IBCLPD)=SMDCDB 8 CONTINUE IF (NBCLPD.EQ.1) THEN SMDCDB=MDCDB.LISOUS(1) SEGSUP MDCDB MDCDB=SMDCDB ELSE SEGDES MDCDB ENDIF SEGDES LMDCDB * * Création et remplissage de IMTCDB * SEGACT ICOGLO SEGACT ICPCDB SEGACT ICDCDB SEGACT LMPCDB SEGACT LMDCDB SEGACT LMACDB NBME=ICDCDB.IVAL(/1) NBSOUS=NBCLPD SEGINI IMTCDB NIPRI=ICPCDB.LECT(/1) DO 9 IIPRI=1,NIPRI IBSTRT=ICDCDB.IDX(IIPRI) IBSTOP=ICDCDB.IDX(IIPRI+1)-1 DO 92 IBME=IBSTRT,IBSTOP SMACDB=LMACDB.LISLI(IBME) SEGACT SMACDB DO 922 IBCLPD=1,NBCLPD JVSTRT=CPLEL.IDX(IBCLPD) JVSTOP=CPLEL.IDX(IBCLPD+1)-1 NUEL1=CPLEL.IVAL(JVSTRT) NP=NPLPRI.LECT(NUEL1) MP=NPLDUA.LECT(NUEL1) SEGINI SMTCDB DO 9222 JVPLEL=JVSTRT,JVSTOP NUEL=CPLEL.IVAL(JVPLEL) KVSTRT=SMACDB.IDXX(NUEL) DO 92222 IMP=1,MP DO 92224 INP=1,NP SMTCDB.AM(JVPLEL-JVSTRT+1,INP,IMP)= $ SMACDB.XVAL(KVSTRT) KVSTRT=KVSTRT+1 92224 CONTINUE 92222 CONTINUE 9222 CONTINUE SEGDES SMTCDB IMTCDB.LIZAFM(IBCLPD,IBME)=SMTCDB 922 CONTINUE SEGDES SMACDB 92 CONTINUE 9 CONTINUE SEGDES IMTCDB SEGDES LMACDB SEGDES LMDCDB SEGDES LMPCDB SEGDES ICDCDB SEGDES ICPCDB SEGDES ICOGLO SEGSUP CPLEL SEGSUP KCPLPD SEGSUP NPLDUA SEGSUP NPLPRI * SEGPRT,MPCDB * SEGPRT,MDCDB * SEGPRT,IMTCDB * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine li2mas' RETURN * * End of subroutine LI2MAS * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales