sorfer
C SORFER SOURCE CB215821 23/01/25 21:15:35 11573 SUBROUTINE SORFER CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C But : Sortie d'un maillage et de CHPOINTs au format FER (ASCII) C C D'après : Michel Bulik (soravs) C : Stephane Gounand (sortcp) C Adaptations : Gregory TURBELIN C Octobre 1994 - Novembre 2002 C C Appelé par : PRSORT C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC PARAMETER(NBMCLE=3) CHARACTER*4 MTSCLE(NBMCLE) -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMELEME -INC SMLCHPO -INC SMCHPOI -INC SMLMOTS POINTEUR MAPOIN.MELEME, MAELEM.MELEME POINTEUR IPT10.MELEME, IPT11.MELEME POINTEUR NCMCHA.MLMOTS, NCCHPO.MLMOTS CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C SEGMENT VALCHP REAL*8 RVACHP(NBCCHP,NBNMAP) END SEGMENT C C Segment : VALeurs du CHPoint C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SEGMENT IEQUIV INTEGER LEQUIV(IECART) END SEGMENT SEGMENT VALV INTEGER IVALV(NBVALV) END SEGMENT CHARACTER*8 MTYP,NOMTOT CHARACTER*(LOCOMP) MOCOMP C !! CHARACTER*(LOCOMP) pour NUX NUY NUZ => JGN=LOCOMP (dans MLMOTS) CHARACTER*(LOCOMP) NUX CHARACTER*(LOCOMP) NUY CHARACTER*(LOCOMP) NUZ REAL*8 VALTEM INTEGER NBCHPO LOGICAL SORMAI, SORCHP, EXISEL, CNDTN LOGICAL CMPINT EXTERNAL CMPINT PARAMETER(LENTIT=40) CHARACTER*(LENTIT) TITHED DATA MTSCLE/'TITR','SUIT','TEMP'/ C Initialisation du titre par défaut TITHED(1:LENTIT)='Sortie CAST3M -> FERView ' NCCHPO=0 NCMCHA=0 VALCHP=0 IEQUIV=0 SORMAI=.FALSE. SORCHP=.FALSE. C ... Recherche des objets à sortir ... IF(IRETOU.EQ.1) THEN MELEME=IVAL SORMAI=.TRUE. MAELEM=MELEME EXISEL=.TRUE. MAPOIN=MAELEM C ... Attention ! MAPOIN est déjà actif (voir CHANGE) ... ENDIF C ... Initialisation de la pile N1 =0 SEGINI MLCHPO IF(.NOT.SORMAI) THEN GOTO 9996 ELSE 09 CONTINUE IF(IRETOU.EQ.1) THEN ICHPOI(**)=IVAL GOTO 09 ENDIF NBCHPO=ICHPOI(/1) IF(NBCHPO.NE.0) THEN SORCHP=.TRUE. ENDIF ENDIF C ... Lecture des mots clés éventuels ... NBCGLO=0 INOREW=0 NENR=0 NBSUIT=1 NREW=1 VALTEM=0.D0 C 'TITR' IF (IRAN.EQ.1) THEN IF (LCHAR.EQ.0) GOTO 9999 C 'SUIT' ELSEIF(IRAN.EQ.2) THEN INOREW=1 IF(IRETOU.EQ.0) THEN NBSUIT = NBSUIT + 1 ENDIF C 'TEMP' ELSEIF(IRAN.EQ.3) THEN NBCGLO=1 IF(IRETOU.EQ.0) GOTO 9999 ENDIF IF(IRAN.NE.0) GOTO 10 IF(INOREW.EQ.1.AND.VALTEM.EQ.0.D0) GOTO 9997 C ... NELMAI = Nombre d'ÉLéments du MAIllage ... IF(EXISEL) THEN CALL NBEL IF(IERR.NE.0) GOTO 9999 ELSE NELMAI=0 ENDIF C ... NBNMAP = NomBre de Noeuds du MAPoin ... CALL NBNO IF(IERR.NE.0) GOTO 9999 C ... Si le MAILLAGE et des CHPOINTs sont présents, on vérifiera que C le MAILLAGE et le support du CHPOINT ont une partie commune ... IF(SORMAI.AND.SORCHP) THEN DO 20 ICH=1,NBCHPO MCHPOI=ICHPOI(ICH) C ... IPT3 = support du CHPOINT ... CALL EXTRAI IF(IERR.NE.0) GOTO 9999 C ... NNSCHP = Nombre de Noeuds du Support du CHPoint ... CALL NBNO IF(IERR.NE.0) GOTO 9999 C ... Pour les explications de cette partie voir la partie C équivalente dans SORTAVS.eso, au niveau du traitement du MCHAML ... IF(NBNMAP.EQ.NNSCHP) THEN SEGACT MAPOIN SEGACT IPT3 NBEL1=MAPOIN.NUM(/2) NBEL2= IPT3.NUM(/2) IF(NBEL1.EQ.NBEL2 .AND. NBEL1.GT.0) THEN C ... Le cas où les deux maillages sont simples ... NBNN1=MAPOIN.NUM(/1) NBNN2= IPT3.NUM(/1) IF((NBNN1.EQ.NBNN2).AND.(MAPOIN.ITYPEL.EQ.IPT3.ITYPEL)) & THEN ILONG=NBEL1*NBNN1 ELSE CNDTN=.FALSE. ENDIF ELSE IF(NBEL1.EQ.NBEL2 .AND. NBEL1.EQ.0) THEN C ... Le cas où les deux maillages sont composés ... NBS1=MAPOIN.LISOUS(/1) NBS2= IPT3.LISOUS(/1) IF(NBS1.EQ.NBS2) THEN CNDTN=.TRUE. DO 1200 I=1,NBS1 IPT10=MAPOIN.LISOUS(I) IPT11= IPT3.LISOUS(I) SEGACT IPT10 SEGACT IPT11 IF((IPT10.NUM(/1).EQ.IPT11.NUM(/1)) .AND. & (IPT10.NUM(/2).EQ.IPT11.NUM(/2)) .AND. & (IPT10.ITYPEL .EQ.IPT11.ITYPEL) ) THEN ILONG=IPT10.NUM(/1)*IPT10.NUM(/2) & IPT11.NUM(1,1),ILONG) ELSE CNDTN=.FALSE. ENDIF 1200 CONTINUE ELSE CNDTN=.FALSE. ENDIF ELSE C ... Dans le cas où NBEL1 n'est pas egal à NBEL2 il est peu C probable quoique pas exclu que les deux maillages soient C égaux, on met donc CoNDiTioN à FAUX ... CNDTN=.FALSE. ENDIF ELSE CNDTN=.FALSE. ENDIF IF(CNDTN) THEN NNDS=0 ELSE C ... IPT4 = ici à la différence symétrique du MAPOIN et du support du CHPOINT ... CALL PRDIFF IF(IERR.NE.0) GOTO 9999 CALL NBNO IF(IERR.NE.0) GOTO 9999 ENDIF C ... IPT4 = intersection du MAPOIN et du support du CHPOINT ... IF(NNDS.EQ.NBNMAP+NNSCHP) THEN IPT4=0 NBNIN4=0 ELSE CALL INTERS IF(IERR.NE.0) GOTO 9999 C ... NBNIN4 = NomBre de Noeuds de l'INtersection ipt4 ... CALL NBNO IF(IERR.NE.0) GOTO 9999 ENDIF IF(NBNIN4.EQ.0) THEN C ... Quand NBNIN4=0 -> cas No 1 ... SORCHP=.FALSE. ELSE IF(NBNIN4.EQ.NBNMAP) THEN C ... Si NBNIN4=NBNMAP (cas 2), il faut réduire le CHPOINT sur le maillage ... IF(IRETOU.EQ.0) THEN GOTO 9999 ELSE ICHPOI(ICH)=IRETOU ENDIF ELSE IF (NBNIN4.EQ.NNSCHP) THEN C ... Cas No 4 - le support du CHPOINT est entièrement contenu dans le C maillage, donc on ne fait rien ... ELSE C ... Sinon, c'est le cas 3, il faut donc "aggrandir" le CHPOINT, C en fait on va le réduire sur l'intersection IPT4, ceci pour C éliminer les composantes dont le support est en dehors du maillage ... IF(IRETOU.EQ.0) THEN GOTO 9999 ELSE ICHPOI(ICH)=IRETOU ENDIF ENDIF 20 CONTINUE ENDIF C ... Puisqu'on ne sort que certains noeuds il faut transformer les C connectivités, pour ceci on se servira du SEGMENT IEQUIV ... C ... Recherche des numéros maxi et mini des noeuds dont on a besoin ... SEGACT MAPOIN NBELEM=MAPOIN.NUM(/2) NBNN=MAPOIN.NUM(/1) IF(NBELEM.EQ.NBNMAP) THEN IF(NBNN.NE.1) GOTO 9999 IPTMIN=MAPOIN.NUM(1,1) IPTMAX=MAPOIN.NUM(1,1) DO 1500 I=1,NBELEM IF(MAPOIN.NUM(1,I).LT.IPTMIN) IPTMIN=MAPOIN.NUM(1,I) IF(MAPOIN.NUM(1,I).GT.IPTMAX) IPTMAX=MAPOIN.NUM(1,I) 1500 CONTINUE ELSE IF(NBELEM.EQ.0) THEN NBSOUS=MAPOIN.LISOUS(/1) DO 1505 I=1,NBSOUS IPT5=LISOUS(I) SEGACT IPT5 NBNTMP=IPT5.NUM(/1) NBETMP=IPT5.NUM(/2) IF(NBNTMP.NE.1) GOTO 9999 IF(I.EQ.1) THEN IPTMIN=IPT5.NUM(1,1) IPTMAX=IPT5.NUM(1,1) ENDIF DO 1506 J=1,NBETMP IF(IPT5.NUM(1,J).LT.IPTMIN) IPTMIN=IPT5.NUM(1,J) IF(IPT5.NUM(1,J).GT.IPTMAX) IPTMAX=IPT5.NUM(1,J) 1506 CONTINUE 1505 CONTINUE ENDIF C ... Initialisation du segment IEQUIV ... IECART=IPTMAX-IPTMIN+1 SEGINI IEQUIV C ... et son remplissage ... IF(NBELEM.EQ.NBNMAP) THEN DO 1510 I=1,NBELEM LEQUIV(MAPOIN.NUM(1,I)-IPTMIN+1)=I 1510 CONTINUE ELSE IF(NBELEM.EQ.0) THEN NBSOUS=MAPOIN.LISOUS(/1) K=0 DO 1515 I=1,NBSOUS IPT5=LISOUS(I) SEGACT IPT5 NBNTMP=IPT5.NUM(/1) NBETMP=IPT5.NUM(/2) IF(NBNTMP.NE.1) GOTO 9999 DO 1516 J=1,NBETMP K=K+1 C ... Ici je suppose que chaque point n'est représenté qu'une C seule fois dans MAPOIN. En conséquence, dans la ligne en dessous C je n'ai pas mis de test si LEQUIV(IPT5.NUM(1,J)-IPTMIN+1) est C différent de zéro ... LEQUIV(IPT5.NUM(1,J)-IPTMIN+1)=K 1516 CONTINUE 1515 CONTINUE ENDIF C ... Préparation de la première ligne du fichier, on connaît déjà C les nombres de noeuds et d'éléments, il manque les nombres de composantes C de tous les CHPOINTs (s'ils sont présents) ... NBVAR=0 IF(SORCHP) THEN DO 30 ICH=1,NBCHPO MCHPOI=ICHPOI(ICH) IF(IERR.NE.0) GOTO 9999 30 CONTINUE C ... Maintenant on va remplir des segments contenant toutes les valeurs C des CHPOINTs en un seul morceau ... NBCCHP=NBVAR kk= 0 SEGINI VALCHP cC .. Boucle sur tous les CHPOINTs DO 40 ICH=1,NBCHPO MCHPOI=ICHPOI(ICH) SEGACT NCCHPO C ... Remplissage des valeurs du CHPOINT ... DO 1700 I=1,NCC DO 1700 J=1,NBNMAP RVACHP(I+kk,J)=0.D0 1700 CONTINUE SEGACT MCHPOI NSOUPO=IPCHP(/1) C ... IDECNP = DECalage des Numéros de Points ... C inutile IDECNP=0 C ... Boucle sur les sous-zones du CHPOINT dont chacune est définie par ... DO 1710 I=1,NSOUPO C ... un segment MSOUPO ... C !! CDEBUG WRITE(IOIMP,*) 'Sous-zone No ',I MSOUPO=IPCHP(I) SEGACT MSOUPO NC=NOHARM(/1) C ... son support géométrique ... IPT7=IGEOC CALL NBNO IF(IERR.NE.0) GOTO 9999 SEGACT IPT7 CDEBUG WRITE(IOIMP,*) ' -> ',NPOSCH,' noeuds' CDEBUG WRITE(IOIMP,*) 'IPT7 : ITYPEL = ',IPT7.ITYPEL CDEBUG WRITE(IOIMP,*) 'IPT7 : NBELEM = ',IPT7.NUM(/2) C ... et ses valeurs ... MPOVAL=IPOVAL SEGACT MPOVAL N=VPOCHA(/1) IF(N.NE.NPOSCH) THEN MOTERR(1:8)='CHPOINT ' GOTO 10000 ENDIF C ... Boucle sur les composantes du CHPOINT ... DO 1720 J=1,NC C ... dont on cherche la place dans NCCHPO ... MOCOMP=NOCOMP(J) DO 1730 K=1,NCC 1730 CONTINUE 1740 CONTINUE C ... Maintenant K pointe le NOCOMP(J) dans NCCHPO ... CDEBUG WRITE(IOIMP,*) 'Composante No',J,' correspond à K = ',K C ... Maintenant il faut parcourir les noeuds du support du CHPOINT ... C ... Si ce support est un maillage élémentaire, ceci est simple ... IF(IPT7.NUM(/2).GT.0) THEN CDEBUG WRITE(IOIMP,*) 'Support = Maillage élémentaire' DO 1750 L=1,N C ... ça ne marchera pas dans le cas général, car l'ordre des n'est pas C forcément le meme dans le MAPOIN et dans le support du CHPOINT ... C RVACHP(K+kk,L+IDECNP)=VPOCHA(L,J) ... C ... il faut chercher la position du noeud ... NNSCHP=IPT7.NUM(1,L) IF(NNSCHP.GE.IPTMIN.AND.NNSCHP.LE.IPTMAX) THEN NNMAPO=LEQUIV(NNSCHP-IPTMIN+1) ELSE NNMAPO=0 ENDIF CDEBUG WRITE(IOIMP,*) 'Noeud ',L,' = ',NNSCHP,' -> NNMAPO = ',NNMAPO IF(NNMAPO.NE.0) RVACHP(K+kk,NNMAPO)=VPOCHA(L,J) 1750 CONTINUE C ... Sinon on va s'amuser ... ELSE CDEBUG WRITE(IOIMP,*) 'Support = Maillage composé' L=0 NBSOUS=IPT7.LISOUS(/1) DO 1765 M=1,NBSOUS IPT8=IPT7.LISOUS(M) SEGACT IPT8 NBELEM=IPT8.NUM(/2) CDEBUG WRITE(IOIMP,*) 'IPT8 : ITYPEL = ',IPT8.ITYPEL CDEBUG WRITE(IOIMP,*) 'IPT8 : NBELEM = ',NBELEM DO 1770 MM=1,NBELEM L=L+1 NNSCHP=IPT8.NUM(1,MM) IF(NNSCHP.GE.IPTMIN.AND.NNSCHP.LE.IPTMAX) THEN NNMAPO=LEQUIV(NNSCHP-IPTMIN+1) ELSE NNMAPO=0 ENDIF CDEBUG WRITE(IOIMP,*) 'Noeud ',L,' = ',NNSCHP,' -> NNMAPO = ',NNMAPO IF(NNMAPO.NE.0) RVACHP(K+kk,NNMAPO)=VPOCHA(L,J) 1770 CONTINUE 1765 CONTINUE ENDIF 1720 CONTINUE C inutile IDECNP=IDECNP+NPOSCH 1710 CONTINUE kk=kk+NCC IF(kk.GT.NBCCHP) GOTO 9999 40 CONTINUE ENDIF CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C ... Sortie au format FER ... CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C ... On écrase un éventuel contenu du fichier No IOPER ... IF(INOREW.EQ.0) THEN REWIND IOPER C ... On écrit le titre WRITE(IOPER,4001) TITHED(1:LTH) C ... Ligne de tete ... WRITE(IOPER,4000) NBNMAP,IDIM C ... Les noeuds ... SEGACT,MCOORD DO 2000 I=1,NBNMAP SEGACT MAPOIN NUMNO=MAPOIN.NUM(1,I) IF(IDIM.EQ.2) THEN WRITE(IOPER,4010) I,XCOOR((NUMNO-1)*(IDIM+1)+1), & XCOOR((NUMNO-1)*(IDIM+1)+2) ELSE WRITE(IOPER,4010) I,XCOOR((NUMNO-1)*(IDIM+1)+1), & XCOOR((NUMNO-1)*(IDIM+1)+2), & XCOOR((NUMNO-1)*(IDIM+1)+3) ENDIF 2000 CONTINUE SEGDES,MCOORD C ... Le maillage ... WRITE(IOPER,4000) NELMAI IDECAL=0 IF(EXISEL) THEN SEGACT MAELEM NBELEM=MAELEM.NUM(/2) IF(NBELEM.GT.0) THEN ELSE NBSOUS=MAELEM.LISOUS(/1) DO 2100 I=1,NBSOUS LESOUS=MAELEM.LISOUS(I) 2100 CONTINUE ENDIF ENDIF ENDIF C ... Les CHPOINTs ... IF(SORCHP) THEN C ... On commence par les noms des composantes ... C Il faut récupérer les noms des variables JGN=LOCOMP JGM=NBVAR JCPT=1 SEGINI MLMOTS DO 60 INBCH=1,NBCHPO MCHPOI=ICHPOI(INBCH) SEGACT MCHPOI MSOUPO=IPCHP(1) SEGACT MSOUPO NC=NOCOMP(/2) DO 602 INC=1,NC LNC=LEN(NOCOMP(INC)) DO 604 ILNC=1,LNC 604 CONTINUE JCPT=JCPT+1 602 CONTINUE 60 CONTINUE C ... Pour tracer les déformées, FERVIEW utilise les 3 C ... premiers champs, il faut donc que se soient UX, UY, UZ WRITE(NUX,'(A4)') ' UX ' WRITE(NUY,'(A4)') ' UY ' WRITE(NUZ,'(A4)') ' UZ ' C ... Boucles pour trouver les No de UX UY UZ respectivement NBVALV=NBVAR SEGINI VALV I=1 DO 5030 J=1,NBVAR IVALV(I) = J I=I+1 ENDIF 5030 CONTINUE DO 5040 J=1,NBVAR IVALV(I) = J I=I+1 ENDIF 5040 CONTINUE DO 5050 J=1,NBVAR IVALV(I) = J I=I+1 ENDIF 5050 CONTINUE DO 5070 J=1,NBVAR IVALV(I) = J I=I+1 ENDIF 5070 CONTINUE C ... IVALV(1,2,3 ...) contient respectivement les places de UX UY UZ ... CDEBUG DO 5000 J=1,NBVAR CDEBUG WRITE(6,*) 'MOTS(J) =',MOTS(J) CDEBUG WRITE(6,*) 'MOTS(IVALV(J))=',MOTS(IVALV(J)) CDEBUG 5000 CONTINUE IF(INOREW.EQ.0) THEN SEGSUP MLMOTS ENDIF SEGSUP NCCHPO C ... INFO SUR LE TPS WRITE(IOPER,4020)NBSUIT,VALTEM C ... Et ensuite leurs valeurs ... DO 2200 I=1,NBNMAP WRITE(IOPER,4050) I,(RVACHP((IVALV(K)),I),K=1,NBVAR) 2200 CONTINUE SEGSUP VALCHP SEGSUP VALV ENDIF C ... Le ménage ... SEGSUP IEQUIV SEGSUP MLCHPO C ... Il n'y a pas de champ global, donc ... RETURN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C ... Fin de la partie où tout se passe bien ... CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 9996 CONTINUE WRITE(IOIMP,*)'Pas d''objet de type MAILLAGE spécifié' GOTO 9999 9997 CONTINUE WRITE(IOIMP,*)'Pour l''instant, chaque enregistrement doit' WRITE(IOIMP,*)'être associé à un instant précis (mot clé TEMP)' GOTO 9999 9999 CONTINUE WRITE(IOIMP,*)'An error was detected in subroutine sorfer' 10000 CONTINUE IF(NCCHPO.NE.0) THEN SEGSUP NCCHPO ENDIF IF(NCMCHA.NE.0) THEN SEGSUP NCMCHA ENDIF IF(VALCHP.NE.0) THEN SEGSUP VALCHP ENDIF IF(IEQUIV.NE.0) THEN SEGSUP IEQUIV ENDIF RETURN 4000 FORMAT(2I6) 4001 FORMAT(A) 4010 FORMAT(I5,3(1X,1P,1E14.7)) 4015 FORMAT (99(A,1X)) 4020 FORMAT(I6,E14.7) 4030 FORMAT(I5,2X, 99A) 4050 FORMAT(I6,12(1X,1P,E14.7)) END
© Cast3M 2003 - Tous droits réservés.
Mentions légales