cv2cml
C CV2CML SOURCE GOUNAND 24/11/06 21:15:04 12073 $ MYFALS, $ MCHELM, $ IMPR,IRET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : CV2CML C DESCRIPTION : Transforme un MCHAEL en MCHAML pour peu que C MYDISC = QUAF ou QUAI ou LINE => MCHAML AUX noeuds C MYDISC = CSTE => MCHAML AUX noeuds du QUAF constant par C éléments C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DES/ISAS/DM2S/SEMT/LTA) C mél : gounand@semt2.smts.cea.fr C*********************************************************************** C APPELES : C APPELE PAR : PRLIN2 C*********************************************************************** C ENTREES : * CGEOME (type MELEME) : maillage de QUAFs C partitionné. C * MYDISC (type CH*(4)) : nom d'espace de C discrétisation (cf. NOMFA dans l'include C SFALRF) C * MYFALS (type FALRFS) : segment de description C des familles d'éléments de références. C SORTIES : * MYMCHA (type MCHAEL) : champ par éléments de C la grandeur tensorielle (degrés de liberté de C la grandeur). C ENTREES/SORTIES : - C TRAVAIL : C (1, nb. ddl, NCOMPD, NCOMPP, 1, nb. élément) C C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 21/05/21, version initiale basée sur CV2CP9 C HISTORIQUE : v1, 21/05/21, 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 CCGEOME -INC SMCHAML -INC SMELEME POINTEUR CGEOMQ.MELEME POINTEUR SOUMAI.MELEME POINTEUR SOUMAQ.MELEME -INC SMLENTI POINTEUR MPQUAF.MLENTI POINTEUR IORDO.MLENTI -INC SMLMOTS POINTEUR MYLMOT.MLMOTS * * Includes persos * -INC TNLIN *-INC SMCHAEL POINTEUR MYMCHA.MCHAEL POINTEUR MZMCHA.MCHEVA *-INC SFALRF POINTEUR MYFALS.FALRFS *-INC SELREF POINTEUR MYLRF.ELREF * CHARACTER*(4) MYDISC PARAMETER (NDISC=4) CHARACTER*(4) DISCS(NDISC) LOGICAL LCROI INTEGER IMPR,IRET * DATA DISCS/'CSTE','LINE','QUAI','QUAF'/ * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans cv2cml' * * Cas particulier MYDISC='CSTE' IF (IDISC.EQ.1) THEN SEGACT MYMCHA NSOUS=MYMCHA.JMACHE(/1) SEGACT CGEOMQ * L1=8 N1=NSOUS N3=6 SEGINI MCHELM TITCHE='NLIN ' IFOCHE=IFOUR SEGACT MYLMOT IF (NNCOMP.NE.1) THEN WRITE(IOIMP,*) 'Programming Error 1' GOTO 9999 ENDIF DO ISOUS=1,NSOUS SOUMAI=CGEOMQ.LISREF(ISOUS) IF (SOUMAI.EQ.0) THEN SOUMAI=CGEOMQ.LISOUS(ISOUS) ENDIF SEGACT SOUMAI MZMCHA=MYMCHA.ICHEVA(ISOUS) SEGACT,MZMCHA * Petits tests NDLIG=MZMCHA.WELCHE(/1) NDCOL=MZMCHA.WELCHE(/2) N2DLIG=MZMCHA.WELCHE(/3) N2DCOL=MZMCHA.WELCHE(/4) NDNOEU=MZMCHA.WELCHE(/5) NDELM=MZMCHA.WELCHE(/6) IF (.NOT.(NDLIG.EQ.1 $ .AND.NDCOL.EQ.1 $ .AND.N2DLIG.EQ.1 $ .AND.N2DCOL.EQ.1.AND.NDNOEU.EQ.1 WRITE(IOIMP,*) 'Erreur dims MZMCHA' write(ioimp,*) 'NDLIG,NDCOL=',NDLIG,NDCOL write(ioimp,*) 'N2DLIG,N2DCOL=',N2DLIG,N2DCOL GOTO 9999 ENDIF N2=1 SEGINI MCHAML TYPCHE(1)='REAL*8 ' N1PTEL=1 N1EL=NDELM N2PTEL=0 N2EL=0 SEGINI MELVAL DO IDELM=1,NDELM VELCHE(1,IDELM)=MZMCHA.WELCHE(1,1,1,1,1,IDELM) ENDDO IELVAL(1)=MELVAL CONCHE(ISOUS)=' ' ICHAML(ISOUS)=MCHAML IMACHE(ISOUS)=SOUMAI INFCHE(ISOUS,1)=0 INFCHE(ISOUS,2)=0 INFCHE(ISOUS,3)=NIFOUR INFCHE(ISOUS,4)=0 INFCHE(ISOUS,5)=0 INFCHE(ISOUS,6)=1 ENDDO * Cas MYDISC='LINE','QUAI','QUAF' ELSEIF (IDISC.GT.1.AND.IDISC.LE.NDISC) THEN SEGACT MYMCHA NSOUS=MYMCHA.JMACHE(/1) SEGACT CGEOMQ L1=8 N1=NSOUS N3=6 SEGINI MCHELM TITCHE='NLIN ' IFOCHE=IFOUR SEGACT MYLMOT IF (NNCOMP.NE.1) THEN WRITE(IOIMP,*) 'Programming Error 2' GOTO 9999 ENDIF DO ISOUS=1,NSOUS SOUMAQ=CGEOMQ.LISOUS(ISOUS) SEGACT SOUMAQ SOUMAI=CGEOMQ.LISREF(ISOUS) IF (SOUMAI.EQ.0) THEN SOUMAI=SOUMAQ ELSE SEGACT SOUMAI ENDIF MZMCHA=MYMCHA.ICHEVA(ISOUS) SEGACT,MZMCHA NBNN=SOUMAI.NUM(/1) ITQUAF=SOUMAQ.ITYPEL * On cherche l'élément fini correspondant au QUAF $ MYFALS, $ MYLRF, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 SEGACT MYLRF NDDL=MYLRF.NPQUAF(/1) IF (NDDL.NE.NBNN) THEN WRITE(IOIMP,*) 'Programming error 3' write(ioimp,*) 'MYDISC=',MYDISC write(ioimp,*) 'NBNN,NDDL=',NBNN,NDDL GOTO 9999 ENDIF * Petits tests NDLIG=MZMCHA.WELCHE(/1) NDCOL=MZMCHA.WELCHE(/2) N2DLIG=MZMCHA.WELCHE(/3) N2DCOL=MZMCHA.WELCHE(/4) NDNOEU=MZMCHA.WELCHE(/5) NDELM=MZMCHA.WELCHE(/6) IF (.NOT.( (NDLIG.EQ.1.AND.NDCOL.EQ.NDDL) $ .OR. (NDLIG.EQ.NDDL.AND.NDCOL.EQ.1)) $ .AND.N2DLIG.NE.1 $ .AND.N2DCOL.NE.1.AND.NDNOEU.NE.1 WRITE(IOIMP,*) 'Erreur dims MZMCHA' GOTO 9999 ENDIF N2=1 SEGINI MCHAML TYPCHE(1)='REAL*8 ' N1PTEL=NDDL N1EL=NDELM N2PTEL=0 N2EL=0 SEGINI MELVAL * Construisons le segment qui permet de parcourir les ddl dans * l'ordre croissant des points du quaf * Implicitement, on utilise le fait que les maillages LINE et QUAD * parcourent les points du QUAF en croissant aussi. * On utilise le tri par insertion car les listes sont petites JG=NDDL SEGINI MPQUAF SEGINI IORDO DO IG=1,JG MPQUAF.LECT(IG)=MYLRF.NPQUAF(IG) IORDO.LECT(IG)=IG ENDDO LCROI=.TRUE. * DO IDELM=1,NDELM DO IDDL=1,NDDL JDDL=IORDO.LECT(IDDL) IF (NDLIG.EQ.1) THEN ILIG=1 ICOL=JDDL ELSE ILIG=JDDL ICOL=1 ENDIF VELCHE(IDDL,IDELM)=MZMCHA.WELCHE(ILIG,ICOL,1,1,1 $ ,IDELM) ENDDO ENDDO SEGSUP IORDO SEGSUP MPQUAF IELVAL(1)=MELVAL CONCHE(ISOUS)=' ' ICHAML(ISOUS)=MCHAML IMACHE(ISOUS)=SOUMAI INFCHE(ISOUS,1)=0 INFCHE(ISOUS,2)=0 INFCHE(ISOUS,3)=NIFOUR INFCHE(ISOUS,4)=0 INFCHE(ISOUS,5)=0 INFCHE(ISOUS,6)=1 ENDDO ELSE WRITE(IOIMP,*) 'CHAM keyword incompatible with discretization ' $ ,MYDISC GOTO 9999 ENDIF * IMPR=6 IF (IMPR.GT.3) THEN CALL PRLIST ENDIF * IMPR=0 * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine cv2cml' RETURN * * End of subroutine CV2CML * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales