soraba
C SORABA SOURCE FANDEUR 22/03/10 21:15:04 11313 ************************************************************************ * NOM : soraba.eso * DESCRIPTION : Sortie d'un maillage au format .inp ABAQUS(TM) ************************************************************************ * HISTORIQUE : 8/01/2010 : FANDEUR : création de la subroutine * HISTORIQUE : 7/06/2012 : JCARDO : l'argument MOT1 devient optionnel * + ajout de l'extension .inp * HISTORIQUE : ************************************************************************ * Prière de PRENDRE LE TEMPS DE COMPLÉTER LES COMMENTAIRES * en cas de modification de ce sous-programme afin de faciliter * la maintenance ! ************************************************************************ * APPELÉ PAR : opérateur SORTir (prsort.eso) ************************************************************************ * ENTRÉES :: aucune * SORTIES :: aucune (sur fichier uniquement) ************************************************************************ * SYNTAXE (GIBIANE) : * * SORT 'ABAQ' MAIL1 * ************************************************************************ SUBROUTINE SORABA IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMELEME -INC SMINTE -INC SMLENTI SEGMENT MLISEF.MLENTI -INC TMLNOMS SEGMENT MCHAEF CHARACTER*16 LCHA16(MEF) ENDSEGMENT SEGMENT ITAB(0) POINTEUR ITAB1.ITAB SEGMENT IMAIL INTEGER I_OBJ(NBMAIL),I_MAI(NBMAIL),L_OBJ(NBMAIL) CHARACTER*16 C_OBJ(NBMAIL) ENDSEGMENT SEGMENT MWRK ENDSEGMENT EXTERNAL LONG CHARACTER*16 CHA16z,CODEEF C= Nombre d'informations par maillage elementaire dans MLISEF PARAMETER (IN_EF=3) C= Unite logique du fichier d'impression au format Abaqus(TM) PARAMETER (IUABA=66) CHARACTER*(LOCHAI) FICABA LOGICAL ZOPEN C= Base de conversion des elements MASSIFS Cast3m vers Abaqus PARAMETER (NNOMAX=20,NEFMAX=12) DIMENSION lTypEF(NEFMAX), & lInver(NNOMAX,NEFMAX),lOrdre(NNOMAX,NEFMAX) CHARACTER*6 NomAba(NEFMAX) C= Element : SEG2 SEG3 TRI3 QUA4 TRI6 C= QUA8 TET4 PRI6 CUB8 TE10 C= PR15 CU20 DATA lTypEF / 2, 3, 4, 8, 6, & 10, 23, 16, 14, 24, & 17, 15 / DATA ((lInver(j,i),j=1,NNOMAX),i=1,NEFMAX) & / 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 6, 5, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 8, 7, 6, 5, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 3, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 4, 5, 6, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 5, 6, 7, 8, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 7,10, 9, 5, 6, 2, 8, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 10,11,12,13,14,15, 7, 8, 9, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, & 13,14,15,16,17,18,19,20, 9,10,11,12, 1, 2, 3, 4, 5, 6, 7, 8 / DATA ((lOrdre(j,i),j=1,NNOMAX),i=1,NEFMAX) & / 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 3, 5, 2, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 3, 5, 7, 2, 4, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 3, 5,10, 2, 4, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, & 1, 3, 5,10,12,14, 2, 4, 6,11,13,15, 7, 8, 9, 0, 0, 0, 0, 0, & 1, 3, 5, 7,13,15,17,19, 2, 4, 6, 8,14,16,18,20, 9,10,11,12 / DATA NomAba / '____ ','____ ','C__3 ','C__4 ','C__6 ', & 'C__8 ','C3D4 ','C3D6 ','C3D8 ','C3D10 ', & 'C3D15 ','C3D20 ' / C=== C 0 - Premieres initialisations C=== idimp1=IDIM+1 C= Liste des elements MASSIFS qui sont sauvegardes (suivant IDIM) IF (IDIM.EQ.3) THEN I_DEB=7 I_FIN=12 ELSE IF (IDIM.EQ.2) THEN I_DEB=3 I_FIN=6 IF (IFOUR.EQ.-2) THEN DO i=I_DEB,I_FIN NomAba(i)(2:3)='PS' ENDDO ELSE IF (IFOUR.GE.0) THEN DO i=I_DEB,I_FIN NomAba(i)(2:3)='AX' ENDDO ELSE DO i=I_DEB,I_FIN NomAba(i)(2:3)='PE' ENDDO ENDIF ELSE IF (IDIM.EQ.1) THEN I_DEB=1 I_FIN=2 ELSE RETURN ENDIF C En cas d erreur sur le fichier de sortie (si non nul) IOS=0 C=== C 1 - Lecture des arguments (obligatoires) C=== C Lecture du maillage a sauvegarder IF (IERR.NE.0) RETURN * C Lecture du nom du fichier de sauvegarde (=> bypass de OPTI SORT) C (CONSERVE POUR COMPATIBILITE MAIS NON DOCUMENTE) IF (IRETOU.EQ.0) THEN INQUIRE(UNIT=IOPER,OPENED=ZOPEN) IF (.NOT.ZOPEN) THEN WRITE(IOIMP,*) '(via OPTI "SORT")' MOTERR(1:8)='ABAQUS ' RETURN ENDIF INQUIRE(UNIT=IOPER,NAME=FICABA) CLOSE(UNIT=IOPER,STATUS='DELETE') * * Ajout de l'extension au nom du fichier IF ((FICABA(LC-3:LC).NE.'.inp') .AND. & (FICABA(LC-3:LC).NE.'.INP') ) THEN IF (LC+4.GT.LOCHAI) THEN write(ioimp,*) 'ABAQUS File name too long with extension' RETURN ENDIF FICABA(LC+1:LC+4)='.inp' ENDIF ENDIF C= Prevoir des options supplementaires ? WRITE(IOIMP,*) C=== C 2 - Analyse de l objet MAILLAGE a sauvegarder C=== WRITE(IOIMP,500) 'Analyse du MAILLAGE a sauvegarder' C Verification du type des elements du maillage C Determination du nombre d'elements du maillage MELEME=MAIREF SEGACT,MELEME NB_OBJ=LISOUS(/1) NB_EF=MAX(1,NB_OBJ) JG=IN_EF*NB_EF SEGINI,MLISEF MEF=NB_EF SEGINI,MCHAEF CODEEF='0000000000000000' NB_ELT=0 IF (NB_OBJ.EQ.0) THEN i_z=ITYPEL DO i=I_DEB,I_FIN IF (i_z.EQ.lTypEF(i)) GOTO 1 ENDDO GOTO 900 1 CONTINUE MLISEF.LECT(1)=MELEME MLISEF.LECT(2)=i MLISEF.LECT(3)=NB_ELT MCHAEF.LCHA16(1)='EF_'//NomAba(i) CODEEF(1:1)='1' NB_ELT=NB_ELT+NUM(/2) ELSE k=1 DO j=1,NB_OBJ IPT1=LISOUS(j) SEGACT,IPT1 i_z=IPT1.ITYPEL DO i=I_DEB,I_FIN IF (i_z.EQ.lTypEF(i)) GOTO 2 ENDDO GOTO 900 2 CONTINUE MLISEF.LECT(k)=IPT1 MLISEF.LECT(k+1)=i MLISEF.LECT(k+2)=NB_ELT MCHAEF.LCHA16(j)='EF_'//NomAba(i) CODEEF(j:j)='1' NB_ELT=NB_ELT+IPT1.NUM(/2) k=k+IN_EF ENDDO ENDIF C*I WRITE(IOIMP,501) 'Type EF =',NB_EF C Appel a TASSER pour mettre les noeuds a sauvegarder en premier WRITE(IOIMP,502) 'Appel a TASSER (etape longue)' SEGINI,ITAB ITAB(**)=MAIREF MELEME=MAIREF IF (NB_OBJ.NE.0) THEN DO i=1,NB_OBJ ITAB(**)=LISOUS(i) ENDDO ENDIF ipt8=0 IF (ipt8.GT.0) SEGSUP,ipt8 IF (IERR.NE.0) THEN SEGSUP,ITAB GOTO 900 ENDIF SEGINI,ITAB1=ITAB C= ITAB a ete supprime apres l'appel a SUPPIL. ITAB=ITAB1 IF (IERR.NE.0) THEN SEGSUP,ITAB GOTO 900 ENDIF C= Suite a l'appel a TASSER, les points sont classes en commencant par C= ceux associes au MAILLAGE qui nous interesse. Il suffit de trouver C= le noeud de numero max. dans le MAILLAGE. WRITE(IOIMP,502) 'Determination du numero du noeud max.' DO i=1,NB_EF MELEME=MLISEF.LECT(IN_EF*(i-1)+1) SEGACT,MELEME nbnn=NUM(/1) DO j=1,NUM(/2) DO k=1,nbnn ENDDO ENDDO SEGDES,MELEME ENDDO C*I WRITE(IOIMP,501) 'Numero du noeud max. =',IMAX C Liste des objets MAILLAGEs eventuellement a sauvegarder (IMAIL) C= En sortie de TASSPO, ITAB a ete modifie et pointe sur tous les C= maillages references dans le MAILLAGE a sauvegarder. WRITE(IOIMP,502) 'Construction de la liste des maillages a sauver' C Rajout de tous les maillages elementaires dans ITAB non deja listes DO i=1,ITAB(/1) MELEME=ITAB(i) SEGACT,MELEME j=LISOUS(/1) IF (j.NE.0) THEN DO k=1,j IPT1=LISOUS(k) DO l=1,ITAB(/1) IF (IPT1.EQ.ITAB(l)) GOTO 3 ENDDO ITAB(**)=IPT1 3 CONTINUE ENDDO ENDIF SEGDES,MELEME ENDDO C Analyse de tous les maillages elementaires C + Determination des groupes de noeuds C= Ne sont conserves que les maillages dont le type correspond C= a ceux du MAILLAGE a sauver et les maillages de type POI1. DO i=1,ITAB(/1) MELEME=ITAB(i) SEGACT,MELEME IF (LISOUS(/1).NE.0) GOTO 11 IF (ITYPEL.EQ.1) GOTO 10 DO j=1,IN_EF*NB_EF,IN_EF IF (MELEME.EQ.MLISEF.LECT(j)) GOTO 11 IF (ITYPEL.EQ.lTypEF(MLISEF.LECT(j+1))) GOTO 10 ENDDO C*I WRITE(ioimp,*) 'Maillage',i,MELEME,'type EF pas ok',ITYPEL ITAB(i)=0 GOTO 11 10 CONTINUE nbnn=NUM(/1) DO k=1,nbnn C*I write(ioimp,*) 'Maillage avec noe > IMAX',i,MELEME ITAB(i)=0 GOTO 11 ENDIF ENDDO ENDDO IF (ITYPEL.EQ.1) ITAB(i)=-MELEME 11 CONTINUE SEGDES,MELEME ENDDO C ReAnalyse de tous les maillages complexes C= Les maillages de POI1 ne sont jamais complexes ! DO i=1,ITAB(/1) MELEME=ITAB(i) IF (MELEME.LE.0) GOTO 20 SEGACT,MELEME j=LISOUS(/1) IF (j.EQ.0) GOTO 21 DO k=1,j IPT1=LISOUS(k) DO l=1,ITAB(/1) IF (IPT1.EQ.ITAB(l)) GOTO 22 ENDDO C*I write(ioimp,*) 'Maillage complexe sousref pas OK',i,k,IPT1 ITAB(i)=0 GOTO 21 22 CONTINUE ENDDO 21 CONTINUE SEGDES,MELEME 20 CONTINUE ENDDO C Liste des objets a considerer pour la sauvegarde (IMAIL) NBMAIL=0 DO i=1,ITAB(/1) IF (ITAB(i).NE.0) NBMAIL=NBMAIL+1 ENDDO C*I WRITE(IOIMP,*) 'NBMAIL=',NBMAIL,ITAB(/1) SEGINI,IMAIL j=0 CHA16z='0000000000000000' DO i=1,ITAB(/1) k=ITAB(i) IF (k.NE.0) THEN j=j+1 I_OBJ(j)=4 IF (k.LT.0) I_OBJ(j)=1 I_MAI(j)=ABS(k) C_OBJ(j)=' ' DO l=1,NB_EF m=IN_EF*(l-1)+1 IF (k.EQ.MLISEF.LECT(m)) THEN I_OBJ(j)=2 L_OBJ(j)=-l C_OBJ(j)=MCHAEF.LCHA16(l) CHA16z(l:l)='1' ENDIF ENDDO ENDIF ENDDO SEGSUP,ITAB IF (j.NE.NBMAIL) write(ioimp,*) '=> probleme !' IF (CHA16z.NE.CODEEF) THEN WRITE(IOIMP,510) 'codage incorrect' GOTO 901 ENDIF C Poursuite de l'analyse des maillages elementaires C= Verification et remplissage de IMAIL JG=JMAX SEGINI,MLENTI i_z=0 DO i=1,NB_EF MELEME=MLISEF.LECT(i_z+1) SEGACT,MELEME nbnn=NUM(/1) DO k=1,nbnn j_z=NUM(k,j) LECT(j_z)=LECT(j_z)+1 ENDDO ENDDO LECT(j)=LECT(j)+LECT(j-1) ENDDO LECT(JMAX)=JG SEGINI,MLENT1 DO k=1,nbnn j_z=NUM(k,j) k_z=LECT(j_z) MLENT1.LECT(k_z)=j LECT(j_z)=LECT(j_z)-1 ENDDO ENDDO NumEF=MLISEF.LECT(i_z+3) DO j=1,NBMAIL IF (I_OBJ(j).LT.3) GOTO 30 IPT1=I_MAI(j) IF (IPT1.EQ.MELEME) GOTO 30 SEGACT,IPT1 IF (IPT1.ITYPEL.NE.ITYPEL) GOTO 31 nbnn=IPT1.NUM(/1) JG=nbel SEGINI,MLENT2 j_z=0 iel=IPT1.NUM(1,iel1) ideb=LECT(iel)+1 ifin=LECT(iel+1) IF (ifin.LT.ideb) GOTO 32 DO k=ideb,ifin iel=MLENT1.LECT(k) DO l=1,nbnn IF (NUM(l,iel).NE.IPT1.NUM(l,iel1)) GOTO 34 ENDDO j_z=j_z+1 MLENT2.LECT(j_z)=NumEF+iel GOTO 33 34 CONTINUE ENDDO C*I write(ioimp,*) 'elt du maillage pas ds mlisef',j,IPT1,iel1,i GOTO 32 33 CONTINUE ENDDO 32 CONTINUE I_OBJ(j)=0 SEGSUP,MLENT2 C*I write(ioimp,*) 'Mail',j,I_OBJ(j),' = non sauve' ELSE IF (j_z.EQ.NUM(/2)) THEN I_OBJ(j)=2 L_OBJ(j)=-i SEGSUP,MLENT2 C*I write(ioimp,*) 'Mail.',j,I_OBJ(j),'=Mail.EF',L_OBJ(j) ELSE I_OBJ(j)=3 L_OBJ(j)=MLENT2 SEGDES,MLENT2 C*I write(ioimp,*) 'Mail.',j,I_OBJ(j),'=Mail.elem',L_OBJ(j) ENDIF 31 CONTINUE SEGDES,IPT1 30 CONTINUE ENDDO SEGSUP,MLENT1 SEGDES,MELEME i_z=i_z+IN_EF C= Ne pas oublier de remettre a zero MLENTI pour le type EF suivant IF (NB_EF.NE.1) THEN DO j=1,JMAX LECT(j)=0 ENDDO ENDIF ENDDO SEGSUP,MLENTI C ReAnalyse de tous les maillages complexes C + Fin du remplissage de IMAIL DO i=1,NBMAIL IF (I_OBJ(i).NE.4) GOTO 40 MELEME=I_MAI(i) SEGACT,MELEME JG=LISOUS(/1) IF (JG.EQ.0) THEN C*I write(ioimp,*) 'Bizarre I_OBJ=4 et LISOUS(/1)=0 pour ITAB',i GOTO 41 ENDIF SEGINI,MLENTI L_OBJ(i)=MLENTI DO j=1,JG IPT1=LISOUS(j) DO k=1,NBMAIL IF (IPT1.EQ.I_MAI(k)) GOTO 42 ENDDO C*I write(ioimp,*) 'Maillage complexe sousref pas OK',i,k,IPT1 I_OBJ(i)=0 L_OBJ(i)=0 SEGSUP,MLENTI GOTO 41 42 CONTINUE LECT(j)=k ENDDO 41 CONTINUE C*I write(ioimp,*) 'Mail.complexe',i,I_OBJ(i),L_OBJ(i) SEGDES,MELEME 40 CONTINUE ENDDO C Recuperation des MAILLAGEs nommes i_z=0 IF (i_z.GT.0) THEN SEGACT,MLNOMS DO i=1,i_z IF (IERR.NE.0) THEN SEGSUP,MLNOMS GOTO 901 ENDIF DO j=1,NB_EF IF (IPT1.EQ.MLISEF.LECT(IN_EF*(j-1)+1)) & MCHAEF.LCHA16(j)=LINOMS(i)(1:16) ENDDO DO j=1,NBMAIL IF (IPT1.EQ.I_MAI(j)) C_OBJ(j)=LINOMS(i)(1:16) ENDDO ENDDO SEGSUP,MLNOMS ENDIF C Nom par defaut pour les maillages non nommes j=0 iel=0 DO i=1,NBMAIL IF (C_OBJ(i)(1:4).EQ.' ') THEN IF (I_OBJ(i).EQ.1) THEN j=j+1 C_OBJ(i)(1:4)='Noe_' WRITE(C_OBJ(i)(5:8),FMT='(I4.4)') j ELSE IF (I_OBJ(i).GE.3) THEN iel=iel+1 C_OBJ(i)(1:4)='Elt_' WRITE(C_OBJ(i)(5:8),FMT='(I4.4)') iel ENDIF ENDIF ENDDO C Determination du nombre de groupe de noeuds et de groupe d'elements NB_GNO=0 NB_GEL=0 DO i=1,NBMAIL IF (I_OBJ(i).EQ.1) THEN NB_GNO=NB_GNO+1 ELSE IF (I_OBJ(i).EQ.2) THEN IF (C_OBJ(i).NE.MCHAEF.LCHA16(-L_OBJ(i))) NB_GEL=NB_GEL+1 ELSE IF (I_OBJ(i).EQ.3) THEN NB_GEL=NB_GEL+1 ELSE IF (I_OBJ(i).EQ.4) THEN NB_GEL=NB_GEL+1 MLENTI=L_OBJ(i) k=0 DO j=1,LECT(/1) j_z=I_OBJ(LECT(j)) IF (j_z.EQ.2.OR.j_z.EQ.3) k=k+1 ENDDO IF (k.NE.LECT(/1)) THEN WRITE(IOIMP,510) 'ANORMALE (50)' GOTO 901 ENDIF ENDIF 50 CONTINUE ENDDO C=== C 3 - Ecriture dans le fichier de sortie au format Abaqus(R) C=== C Ouverture du fichier au format Abaqus(R) WRITE(IOIMP,500) 'Ouverture du fichier au format Abaqus(R)' IOS=1 CLOSE(UNIT=IUABA,ERR=901) IOS=0 & IOSTAT=IOS,FORM='FORMATTED') IF (IOS.NE.0) GOTO 901 C Ecriture entete (a completer) WRITE(IOIMP,502) 'Ecriture de l entete du fichier' WRITE(IUABA,800) '****' C Ecriture des noeuds du maillage WRITE(IOIMP,502) 'Ecriture des noeuds du maillage' WRITE(IUABA,800) '** DEFINITION DES NOEUDS DU MAILLAGE' WRITE(IUABA,800) '****' WRITE(IUABA,800) '*NODE, SYSTEM=R' IF (IDIM.EQ.3) THEN j=idimp1*(i-1) WRITE(IUABA,FMT=810) i,XCOOR(j+1),XCOOR(j+2),XCOOR(j+3) ENDDO ELSE IF (IDIM.EQ.2) THEN j=idimp1*(i-1) WRITE(IUABA,FMT=811) i,XCOOR(j+1),XCOOR(j+2) ENDDO ELSE j=idimp1*(i-1) WRITE(IUABA,FMT=812) i,XCOOR(j+1) ENDDO ENDIF WRITE(IUABA,800) '****' C Ecriture des points nommes (un seul noeud) C Construction de la table des points nommes existants WRITE(IOIMP,502) 'Ecriture des points nommes' I_PTS=0 IF (I_PTS.NE.0) THEN WRITE(IUABA,800) '** DEFINITION DES NOEUDS NOMMES' WRITE(IUABA,800) '****' SEGACT,MLNOMS DO i=1,I_PTS IF (IERR.NE.0) THEN SEGSUP,MLNOMS GOTO 902 ENDIF WRITE(IUABA,821) IP1 ENDIF ENDDO SEGSUP,MLNOMS WRITE(IUABA,800) '****' ENDIF WRITE(IOIMP,501) 'Nombre de noeuds nommes =',I_PTS C Ecriture des groupes de noeuds C= NSET au sens Abaqus et maillage de type POI1 au sens Cast3m WRITE(IOIMP,502) 'Ecriture des groupes de noeuds' IF (NB_GNO.NE.0) THEN WRITE(IUABA,800) '** DEFINITION DES GROUPES DE NOEUDS' WRITE(IUABA,800) '****' DO i=1,NBMAIL IF (I_OBJ(i).EQ.1) THEN MELEME=I_MAI(i) SEGACT,MELEME WRITE(IUABA,822) (NUM(1,k),k=1,NUM(/2)) SEGDES,MELEME ENDIF ENDDO WRITE(IUABA,800) '****' ENDIF WRITE(IOIMP,501) 'Nombre de groupe de noeuds =',NB_GNO C Ecriture des differents elements WRITE(IOIMP,502) 'Ecriture des elements du maillage' WRITE(IUABA,800) '** DEFINITION DES ELEMENTS' WRITE(IUABA,800) '****' DO i=1,NB_EF j=IN_EF*(i-1) MELEME=MLISEF.LECT(j+1) i_z =MLISEF.LECT(j+2) NumEF =MLISEF.LECT(j+3) CHA16z=MCHAEF.LCHA16(i) C*I WRITE(IOIMP,501) 'Orientation selon Abq ',i C Orientation des elements du maillage selon Abaqus : SEGACT,MELEME*MOD nbnn=NUM(/1) IELE=ITYPEL C Recuperation des fonctions de forme et derivees associees de C l'element fini massif de type IELE IF (IRETOU.NE.1) GOTO 60 MINTE=ISPT SEGACT,MINTE nbno=nbnn SEGINI,MWRK C Recuperation des coordonnees des noeuds de l'element C Calcul du jacobien au centre de gravite de l'element D11=0. D21=0. D12=0. D22=0. IF (IDIM.EQ.3) THEN D31=0. D32=0. D13=0. D23=0. D33=0. DO j=1,nbnn D11=D11+SHPTOT(2,j,1)*XEL(1,j) D21=D21+SHPTOT(3,j,1)*XEL(1,j) D31=D31+SHPTOT(4,j,1)*XEL(1,j) D12=D12+SHPTOT(2,j,1)*XEL(2,j) D22=D22+SHPTOT(3,j,1)*XEL(2,j) D32=D32+SHPTOT(4,j,1)*XEL(2,j) D13=D13+SHPTOT(2,j,1)*XEL(3,j) D23=D23+SHPTOT(3,j,1)*XEL(3,j) D33=D33+SHPTOT(4,j,1)*XEL(3,j) ENDDO DInv11=D22*D33-D23*D32 DInv12=D32*D13-D12*D33 DInv13=D12*D23-D22*D13 DJAC=D11*DInv11+D21*DInv12+D31*DInv13 ELSE IF (IDIM.EQ.2) THEN DO j=1,nbnn D11=D11+SHPTOT(2,j,1)*XEL(1,j) D21=D21+SHPTOT(3,j,1)*XEL(1,j) D12=D12+SHPTOT(2,j,1)*XEL(2,j) D22=D22+SHPTOT(3,j,1)*XEL(2,j) ENDDO DJAC=D11*D22-D21*D12 C* ELSE IF (IDIM.EQ.1) THEN ELSE DJAC=XEL(1,nbnn)-XEL(1,1) ENDIF C Test si le jacobien est nul (pas bon) IF (ABS(DJAC).LE.0.) THEN WRITE(IUABA,801) 'Element incorrect',NumEF+j ENDIF C Si le jacobien est negatif, on permute l'ordre des noeuds IF (DJAC.LT.0.) THEN NOEELT(k)=NUM(lInver(k,i_z),iel) ENDDO NUM(k,iel)=NOEELT(k) ENDDO ENDIF ENDDO SEGSUP,MWRK SEGDES,MINTE 60 CONTINUE IF (IERR.NE.0) THEN WRITE(IOIMP,510) 'ORIENTATION - Poursuite ecriture' WRITE(IUABA,800) '!! ERREUR ORIE - Verifier le maillage' ENDIF C*I WRITE(IOIMP,501) 'Ecriture des elements type '//NomAba(i_z) NumEF=NumEF+1 ENDDO SEGDES,MELEME ENDDO WRITE(IUABA,FMT='(A4)') '****' WRITE(IOIMP,501) 'Nb. type d elements =',NB_EF WRITE(IOIMP,501) 'Nombre d elements =',NB_ELT C Ecriture des groupes d elements WRITE(IOIMP,502) 'Ecriture des groupes d elements' IF (NB_GEL.GT.0) THEN WRITE(IUABA,800) '** DEFINITION DES GROUPES D ELEMENTS' WRITE(IUABA,800) '****' C Ecriture des groupes d elements (un seul type) k=0 DO i=1,NBMAIL IF (I_OBJ(i).EQ.3) THEN MLENTI=L_OBJ(i) SEGACT,MLENTI WRITE(IUABA,841) (LECT(j),j=1,LECT(/1)) SEGDES,MLENTI k=k+1 ENDIF ENDDO C* write(ioimp,501) 'Nb. groupe d elements un seul EF',k IF (k.NE.0) WRITE(IUABA,800) '****' k=0 DO i=1,NBMAIL IF (I_OBJ(i).EQ.2) THEN CHA16z=MCHAEF.LCHA16(-L_OBJ(i)) IF (C_OBJ(i).NE.CHA16z) THEN k=k+1 ENDIF ENDIF ENDDO C* write(ioimp,501) 'Nb. groupe d elements def elt =',k IF (k.NE.0) WRITE(IUABA,800) '****' C Ecriture des groupes d elements complexes k=0 DO i=1,NBMAIL IF (I_OBJ(i).EQ.4) THEN MLENTI=L_OBJ(i) & j=1,LECT(/1)) k=k+1 ENDIF ENDDO C* write(ioimp,501) 'Nb. groupe d elements complexe =',k IF (k.NE.0) WRITE(IUABA,800) '****' ENDIF WRITE(IOIMP,501) 'Nombre de groupe d elements =',NB_GEL C=== C 4 - Sortie du sous-programme (menage...) C=== 902 CONTINUE WRITE(IOIMP,502) 'Fermeture du fichier au format Abaqus(R)' IOS=1 CLOSE(UNIT=IUABA,ERR=901) IOS=0 901 CONTINUE DO i=1,NBMAIL MELEME=I_MAI(i) IF (MELEME.GT.0) SEGDES,MELEME MLENTI=L_OBJ(i) IF (MLENTI.GT.0) SEGSUP,MLENTI ENDDO SEGSUP,IMAIL 900 CONTINUE MELEME=MAIREF SEGACT,MELEME IF (NB_OBJ.NE.0) THEN DO i=1,NB_OBJ IPT1=LISOUS(i) SEGDES,IPT1 ENDDO ENDIF SEGDES,MELEME SEGSUP,MLISEF,MCHAEF C Traitement des erreurs d ouverture ou de fermeture du fichier IF (IOS.NE.0) THEN MOTERR(1:l)=FICABA(1:l) INTERR(1)=IOS ENDIF WRITE(IOIMP,*) C===== C 5 - Formats Fortran C===== C Formats d impression de messages 500 FORMAT('SORABA : ',A) 501 FORMAT(' ',A,I8) 502 FORMAT(' ',A) 510 FORMAT('SORABA - ERREUR : ',A) C* 511 FORMAT('SORABA - ERREUR : ',A,' ',I4,' non defini') C* 512 FORMAT('SORABA - ERREUR : ',A,' ',I4,' mal defini') C* 513 FORMAT('SORABA - ERREUR : Lecture impossible ',A,' ',I4) C* 520 FORMAT('SORABA - ATTENTION : ',A) C* 521 FORMAT('SORABA - ATTENTION : ',A,' ',I4,' non defini') C* 522 FORMAT('SORABA - ATTENTION : ',A,' ',I4,' mal defini') C* 523 FORMAT('SORABA - ATTENTION : ',A,' ',A,' ',I4) C Formats d ecriture pour le fichier de sortie Abaqus(R) 800 FORMAT(A) 801 FORMAT(A,' ',I8) 810 FORMAT(I8,', ',SP,E14.8,', ',E14.8,', ',E14.8,S) 811 FORMAT(I8,', ',SP,E14.8,', ',E14.8,S) 812 FORMAT(I8,', ',SP,E14.8,S) 820 FORMAT('*NSET, NSET=',A) 821 FORMAT(I8) 822 FORMAT(10(I8,',')) 830 FORMAT('*ELEMENT, TYPE=',A,', ELSET=',A) 831 FORMAT(I8,', ',19(I8,','),I8) 840 FORMAT('*ELSET, ELSET=',A) 841 FORMAT(16(I8,',')) 842 FORMAT(1X,16(A10,',')) RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales