cv2mab
C CV2MAB SOURCE GOUNAND 24/11/06 21:15:05 12073 $ IMTLSB, $ MYFALS, $ MATLSB, $ IMPR,IRET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : CV2MAB C DESCRIPTION : Transforme un MCHAEL (mon champ par éléments) C représentant un ensemble de matrices élémentaires en C MATRIK... 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 : KEEF (recherche de l'élément fini) C APPELES (E/S) : ECROBJ, PRLIST (écriture entier, objet, C impression) C APPELE PAR : PRLSB2 C*********************************************************************** C ENTREES : C ENTREES/SORTIES : - C SORTIES : C TRAVAIL : * MYMEL (type MELEME) : maillage élémentaire. C * JMTLSB (type MCHEVA) : valeurs du champ IMTLSB C sur le maillage élémentaire. C Structure (cf.include SMCHAEL) : C (nb. ddl dual, nb. ddl primal, C nb. comp. duales, nb. comp. primales, C 1, nb. éléments) C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 22/07/09, version initiale C HISTORIQUE : v1, 22/07/09, 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 SMLMOTS POINTEUR NCVARP.MLMOTS POINTEUR NCVARD.MLMOTS -INC SMELEME POINTEUR CGEOMQ.MELEME POINTEUR MELPRI.MELEME POINTEUR MELDUA.MELEME POINTEUR MYMEL.MELEME INTEGER NBNN,NBELEM,NBSOUS,NBREF -INC SMLENTI POINTEUR LPOQFP.MLENTI POINTEUR LPOQFD.MLENTI POINTEUR KPOQFP.MLENTI POINTEUR KPOQFD.MLENTI INTEGER JG -INC SMMATRIK POINTEUR MATLSB.MATRIK * * Includes persos * -INC TNLIN *-INC SMCHAEL POINTEUR IMTLSB.MCHAEL POINTEUR JMTLSB.MCHEVA INTEGER NBLIG,NBCOL,N2LIG,N2COL,NBPOI,NBELM *-INC SFALRF POINTEUR MYFALS.FALRFS *-INC SELREF POINTEUR LRFPRI.ELREF POINTEUR LRFDUA.ELREF * CHARACTER*4 MDISCP,MDISCD INTEGER IMPR,IRET * INTEGER IBNN,IBELEM INTEGER ITQUAF,NDDLPR,NDDLDU INTEGER IDDLPR,IDDLDU INTEGER NSOUS,NPOQUF INTEGER ISOUS INTEGER ILIGRP,ILIGRD,IELRIG,ICMPP,ICMPD * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans cv2mab' NRIGE=7 NMATRI=0 NKID=9 NKMT=7 SEGINI,MATLSB * * Remplissage de MRIGID * SEGACT NCVARP SEGACT NCVARD SEGACT IMTLSB NSOUS=IMTLSB.JMACHE(/1) C SEGPRT,NCVARP C SEGPRT,NCVARD C SEGPRT,IMTLSB SEGACT CGEOMQ DO ISOUS=1,NSOUS JMTLSB=IMTLSB.ICHEVA(ISOUS) IF (JMTLSB.NE.0) THEN C SEGPRT,NCVARP C SEGPRT,NCVARD C SEGPRT,JMTLSB SEGACT JMTLSB MYMEL =CGEOMQ.LISOUS(ISOUS) SEGACT MYMEL ITQUAF=MYMEL.ITYPEL $ LRFPRI,IMPR,IRET) IF (IRET.NE.0) GOTO 9999 SEGACT LRFPRI NDDLPR=LRFPRI.NPQUAF(/1) $ LRFDUA,IMPR,IRET) IF (IRET.NE.0) GOTO 9999 SEGACT LRFDUA NDDLDU=LRFDUA.NPQUAF(/1) * Si le maillage donné à NLIN n'était pas QUAF au départ, il faut * vérifier que tous les ddls peuvent s'appuyer sur les points du * maillage donné * Le test uniquement sur le 1er element doit etre suffisant IF (CGEOMQ.LISOUS(ISOUS).NE.0) THEN DO IDDLPR=1,NDDLPR NNQUA=LRFPRI.NPQUAF(IDDLPR) NNGLO=MYMEL.NUM(NNQUA,1) IF (NNGLO.EQ.0) THEN WRITE(IOIMP,*) 'A discretization space ',MDISCP, $ ' is incompatible with the given mesh' WRITE(IOIMP,*) 'Check its element type please' GOTO 9999 ENDIF ENDDO DO IDDLDU=1,NDDLDU NNQUA=LRFDUA.NPQUAF(IDDLDU) NNGLO=MYMEL.NUM(NNQUA,1) IF (NNGLO.EQ.0) THEN WRITE(IOIMP,*) 'A discretization space ',MDISCD, $ ' is incompatible with the given mesh' WRITE(IOIMP,*) 'Check its element type please' GOTO 9999 ENDIF ENDDO ENDIF * * Construction de la liste des points du QUAF sur lesquels il y a des * ddl pour l'inconnue primale JG=0 SEGINI LPOQFP DO IDDLPR=1,NDDLPR IF (LRFPRI.NUMCMP(IDDLPR).EQ.IVARP) THEN LPOQFP.LECT(**)=LRFPRI.NPQUAF(IDDLPR) ENDIF ENDDO IF (LPOQFP.LECT(/1).EQ.0) THEN GOTO 1 ENDIF C* Suppression des doublons (pas besoin) C CALL IUNIQ(LPOQFP.LECT,LPOQFP.LECT(/1), C $ LPOQFP.LECT,NPOQFP, C $ IMPR,IRET) C IF (IRET.NE.0) GOTO 9999 C JG=NPOQFP C SEGADJ,LPOQFP * Segment de repérage dans cette liste JG=MYMEL.NUM(/1) SEGINI,KPOQFP * Construction du maillage primal NBNN=LPOQFP.LECT(/1) NBELEM = MYMEL.NUM(/2) NBSOUS = 0 NBREF=0 SEGINI,MELPRI * Type 32 POLY MELPRI.ITYPEL=32 DO IBELEM=1,NBELEM DO IBNN=1,NBNN MELPRI.NUM(IBNN,IBELEM)= $ MYMEL.NUM(LPOQFP.LECT(IBNN),IBELEM) ENDDO ENDDO SEGDES MELPRI * * Construction de la liste des points du QUAF sur lesquels il y a des * ddl pour l'inconnue duale JG=0 SEGINI LPOQFD DO IDDLDU=1,NDDLDU IF (LRFDUA.NUMCMP(IDDLDU).EQ.IVARD) THEN LPOQFD.LECT(**)=LRFDUA.NPQUAF(IDDLDU) ENDIF ENDDO IF (LPOQFD.LECT(/1).EQ.0) THEN GOTO 3 ENDIF C* Suppression des doublons C CALL IUNIQ(LPOQFD.LECT,LPOQFD.LECT(/1), C $ LPOQFD.LECT,NPOQFD, C $ IMPR,IRET) C IF (IRET.NE.0) GOTO 9999 C JG=NPOQFD C SEGADJ,LPOQFD * Segment de repérage dans cette liste JG=MYMEL.NUM(/1) SEGINI,KPOQFD * Construction du maillage dual NBNN=LPOQFD.LECT(/1) NBELEM = MYMEL.NUM(/2) NBSOUS = 0 NBREF=0 SEGINI,MELDUA * Type 32 POLY MELDUA.ITYPEL=32 DO IBELEM=1,NBELEM DO IBNN=1,NBNN MELDUA.NUM(IBNN,IBELEM)= $ MYMEL.NUM(LPOQFD.LECT(IBNN),IBELEM) ENDDO ENDDO SEGDES MELDUA * Construction du IMATRI NBME=1 NBSOUS=1 SEGINI IMATRI * Construction du IZAFM NP=LPOQFP.LECT(/1) MP=LPOQFD.LECT(/1) SEGINI IZAFM * remplissage des matrices élémentaires NBLIG=JMTLSB.WELCHE(/1) NBCOL=JMTLSB.WELCHE(/2) N2LIG=JMTLSB.WELCHE(/3) N2COL=JMTLSB.WELCHE(/4) NBPOI=JMTLSB.WELCHE(/5) NBELM=JMTLSB.WELCHE(/6) IF (NBLIG.NE.NDDLDU.OR.NBCOL.NE.NDDLPR.OR.N2LIG.NE.1 $ THEN WRITE(IOIMP,*) 'Erreur dims JMTLSB' GOTO 9999 ENDIF DO IDDLDU=1,NDDLDU IF (LRFDUA.NUMCMP(IDDLDU).EQ.IVARD) THEN IMP=KPOQFD.LECT(LRFDUA.NPQUAF(IDDLDU)) DO IDDLPR=1,NDDLPR IF (LRFPRI.NUMCMP(IDDLPR).EQ.IVARP) THEN INP=KPOQFP.LECT(LRFPRI.NPQUAF(IDDLPR)) AM(IBEL,INP,IMP)= $ JMTLSB.WELCHE(IDDLDU,IDDLPR, $ 1,1,1,IBEL) ENDDO ENDIF ENDDO ENDIF ENDDO SEGDES IZAFM LIZAFM(1,1)=IZAFM SEGDES IMATRI * * Remplissage du chapeau * NRIGE=MATLSB.IRIGEL(/1) NMATRI=MATLSB.IRIGEL(/2)+1 NKID=MATLSB.KIDMAT(/1) NKMT=MATLSB.KKMMT(/1) SEGADJ,MATLSB MATLSB.IRIGEL(1,NMATRI)=MELPRI MATLSB.IRIGEL(2,NMATRI)=MELDUA MATLSB.IRIGEL(4,NMATRI)=IMATRI MATLSB.IRIGEL(7,NMATRI)=2 SEGSUP KPOQFD 3 CONTINUE SEGSUP LPOQFD ENDDO SEGSUP KPOQFP 1 CONTINUE SEGSUP LPOQFP ENDDO SEGDES LRFDUA SEGDES LRFPRI SEGDES MYMEL SEGDES JMTLSB ENDIF ENDDO SEGDES IMTLSB SEGDES NCVARD SEGDES NCVARP SEGDES MATLSB IF (IMPR.GT.3) THEN WRITE(IOIMP,*) 'On a créé MATLSB=',MATLSB CALL PRLIST ENDIF * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine cv2mab' RETURN * * End of subroutine CV2MAB * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales