cv2ma9
C CV2MA9 SOURCE GOUNAND 24/11/12 21:15:04 12076 $ IMTLS9, $ MYFALS, $ MATLS9, $ IMPR,IRET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : CV2MA9 C DESCRIPTION : Transforme un MCHAEL (mon champ par éléments) C représentant un ensemble de matrices élémentaires en C RIGIDITE... 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 : PRLS92 C*********************************************************************** C ENTREES : C ENTREES/SORTIES : - C SORTIES : C TRAVAIL : * MYMEL (type MELEME) : maillage élémentaire. C * JMTLS9 (type MCHEVA) : valeurs du champ IMTLS9 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, 26/09/03, version initiale C HISTORIQUE : v1, 26/09/03, création C HISTORIQUE : 25/10/2024 : au lieu de creer de nouveaux MELEME C on utilise celui fourni en entrée de NLIN. 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 CCGEOME -INC CCHAMP -INC SMLMOTS POINTEUR NCVARP.MLMOTS POINTEUR NCVARD.MLMOTS -INC SMELEME POINTEUR CGEOMQ.MELEME POINTEUR MELEMQ.MELEME -INC SMLENTI POINTEUR IGEO.MLENTI -INC SMRIGID POINTEUR MATLS9.MRIGID POINTEUR MYDSCR.DESCR POINTEUR MYIMAT.IMATRI POINTEUR MYXMAT.XMATRI * * Includes persos * -INC TNLIN *-INC SMCHAEL POINTEUR IMTLS9.MCHAEL POINTEUR JMTLS9.MCHEVA INTEGER NBLIG,NBCOL,N2LIG,N2COL,NBPOI,NBELM *-INC SFALRF POINTEUR MYFALS.FALRFS *-INC SELREF POINTEUR LRFPRI.ELREF POINTEUR LRFDUA.ELREF POINTEUR LRFGEO.ELREF * CHARACTER*(LOCHPO) NOMINP,NOMIND CHARACTER*4 MDISCP,MDISCD,MDISCG INTEGER IMPR,IRET * INTEGER ITQUAF,NDDLPR,NDDLDU INTEGER IDDLPR,IDDLDU INTEGER NSOUS,NPOQUF INTEGER ISOUS INTEGER ILIGRP,ILIGRD,IELRIG,ICMPP,ICMPD LOGICAL LQUAF,LSYM * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans cv2ma9' NRIGEL=0 SEGINI,MATLS9 MATLS9.MTYMAT='LEASTSQU' MATLS9.IFORIG=IFOUR * On prend le mode de calcul courant (on pourrait s'appuyer sur * celui du champ ?) *Test LSYM=.FALSE. LSYM=MDISCP.EQ.MDISCD * * Remplissage de MRIGID * SEGACT NCVARP SEGACT NCVARD * IF (LSYM) THEN do ivar=1,nvar if (lsym) then if (idx.eq.0) then else nomind=nomdu(idx) endif lsym=lsym.and.(nominp.eq.nomind) else goto 11 endif enddo 11 continue ENDIF SEGACT IMTLS9 NSOUS=IMTLS9.JMACHE(/1) SEGACT CGEOMQ DO ISOUS=1,NSOUS JMTLS9=IMTLS9.ICHEVA(ISOUS) IF (JMTLS9.NE.0) THEN MELEMQ=CGEOMQ.LISOUS(ISOUS) SEGACT MELEMQ ITQUAF=MELEMQ.ITYPEL LQUAF=(CGEOMQ.LISREF(ISOUS).EQ.0) IF (LQUAF) THEN MELEME=MELEMQ ELSE MELEME=CGEOMQ.LISREF(ISOUS) SEGACT MELEME CALL IDQUDI(ITYPEL,ITQUA2,MDISCG) IF (IERR.NE.0) GOTO 9999 IF (ITQUA2.NE.ITQUAF) THEN WRITE(IOIMP,*) 'ITQUA2=',ITQUA2 WRITE(IOIMP,*) 'ITQUAF=',ITQUAF GOTO 9999 ENDIF $ LRFGEO,IMPR,IRET) IF (IRET.NE.0) GOTO 9999 SEGACT LRFGEO * Tableau de correspondance Noeud du QUAF -> Noeud de l'element * GEOmetrique JG=NBNNE(ITQUAF) SEGINI IGEO NDDLGE=LRFGEO.NPQUAF(/1) DO IDDLGE=1,NDDLGE IGEO.LECT(LRFGEO.NPQUAF(IDDLGE))=IDDLGE ENDDO ENDIF * $ 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) * * remplissage du segment DISCR * * 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é NLIGRP=NDDLPR NLIGRD=NDDLDU SEGINI MYDSCR DO ILIGRP=1,NLIGRP ICMPP=LRFPRI.NUMCMP(ILIGRP) IPQUAF=LRFPRI.NPQUAF(ILIGRP) IF (LQUAF) THEN MYDSCR.NOELEP(ILIGRP)=IPQUAF ELSE IPGEO=IGEO.LECT(IPQUAF) IF (IPGEO.EQ.0) THEN WRITE(IOIMP,*) 'A discretization space ',MDISCP, $ ' is incompatible with the given mesh' WRITE(IOIMP,*) 'Check its element type please' GOTO 9999 ELSE MYDSCR.NOELEP(ILIGRP)=IPGEO ENDIF ENDIF ENDDO DO ILIGRD=1,NLIGRD ICMPD=LRFDUA.NUMCMP(ILIGRD) IPQUAF=LRFDUA.NPQUAF(ILIGRD) IF (LQUAF) THEN MYDSCR.NOELED(ILIGRD)=IPQUAF ELSE IPGEO=IGEO.LECT(IPQUAF) IF (IPGEO.EQ.0) THEN WRITE(IOIMP,*) 'A discretization space ',MDISCD, $ ' is incompatible with the given mesh' WRITE(IOIMP,*) 'Check its element type please' GOTO 9999 ELSE MYDSCR.NOELED(ILIGRD)=IPGEO ENDIF ENDIF ENDDO SEGDES MYDSCR SEGDES LRFDUA SEGDES LRFPRI IF (.NOT.LQUAF) THEN SEGSUP IGEO SEGDES LRFGEO ENDIF * * remplissage des matrices élémentaires * SEGACT JMTLS9 NBLIG=JMTLS9.WELCHE(/1) NBCOL=JMTLS9.WELCHE(/2) N2LIG=JMTLS9.WELCHE(/3) N2COL=JMTLS9.WELCHE(/4) NBPOI=JMTLS9.WELCHE(/5) NBELM=JMTLS9.WELCHE(/6) IF (NBLIG.NE.NDDLDU.OR.NBCOL.NE.NDDLPR.OR.N2LIG.NE.1 $ .OR.N2COL.NE.1.OR.NBPOI.NE.1) THEN WRITE(IOIMP,*) 'Erreur dims JMTLS9' GOTO 9999 ENDIF NELRIG=NBELM nligrp=nddlpr nligrd=nddldu SEGINI MYxMAT DO IELRIG=1,NELRIG * NLIGRP=NDDLPR * NLIGRD=NDDLDU * SEGINI MYXMAT DO ILIGRP=1,NLIGRP DO ILIGRD=1,NLIGRD MYXMAT.RE(ILIGRD,ILIGRP,ielrig)= $ JMTLS9.WELCHE(ILIGRD,ILIGRP,1,1,1,IELRIG) ENDDO ENDDO * SEGDES MYXMAT * MYIMAT.IMATTT(IELRIG)=MYXMAT ENDDO if (lsym) then call versy2(MYXMAT.RE,nligrd,nligrp,nelrig,0,kerre) lsym=lsym.and.kerre.eq.0 endif SEGDES JMTLS9 * * remplissage du chapeau * NRIGEL=MATLS9.IRIGEL(/2)+1 SEGADJ,MATLS9 MATLS9.COERIG(NRIGEL)=1.D0 MATLS9.IRIGEL(1,NRIGEL)=MELEME MATLS9.IRIGEL(2,NRIGEL)=0 MATLS9.IRIGEL(3,NRIGEL)=MYDSCR MATLS9.IRIGEL(4,NRIGEL)=MYxMAT MATLS9.IRIGEL(5,NRIGEL)=0 MATLS9.IRIGEL(6,NRIGEL)=0 * * la matrice ne possède pas de symétries (a priori...) * MATLS9.IRIGEL(8,NRIGEL)=0 if (.not.lsym) then MATLS9.IRIGEL(7,NRIGEL)=2 myxmat.symre = 2 else if (impr.gt.1) then endif MATLS9.IRIGEL(7,NRIGEL)=0 myxmat.symre = 0 myxmat.symver = 1 endif SEGDES MYxMAT ENDIF ENDDO SEGDES IMTLS9 SEGDES NCVARD SEGDES NCVARP SEGDES MATLS9 IF (IMPR.GT.3) THEN WRITE(IOIMP,*) 'On a créé MATLS9=',MATLS9 CALL PRLIST ENDIF * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine cv2ma9' RETURN * * End of subroutine CV2MA9 * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales